/*
* Cisco router simulation platform.
* Copyright (c) 2007 Christophe Fillot (cf@utc.fr)
*
* Generic Cisco card routines and definitions.
*/
#ifndef __CISCO_CARD_H__
#define __CISCO_CARD_H__
#include <pthread.h>
#include "utils.h"
#include "net.h"
#include "net_io.h"
#include "cisco_eeprom.h"
#define CISCO_CARD_MAX_WIC 8
#define CISCO_CARD_MAX_SUBSLOTS 16
/* Card types */
enum {
CISCO_CARD_TYPE_UNDEF = 0,
CISCO_CARD_TYPE_PA,
CISCO_CARD_TYPE_NM,
CISCO_CARD_TYPE_WIC,
};
/* Card flags */
enum {
CISCO_CARD_FLAG_OVERRIDE = 1,
};
/* Forward declarations */
struct cisco_card;
struct cisco_card_driver;
/* Prototype of card driver initialization function */
typedef int (*cisco_card_init_fn)(vm_instance_t *vm,struct cisco_card *card);
/* Prototype of card driver shutdown function */
typedef int (*cisco_card_shutdown_fn)(vm_instance_t *vm,
struct cisco_card *card);
/* Prototype of card NIO get sub-slot info function */
typedef int
(*cisco_card_get_sub_info_fn)(vm_instance_t *vm,struct cisco_card *card,
u_int port_id,
struct cisco_card_driver ***drv_array,
u_int *subcard_type);
/* Prototype of card NIO set function */
typedef int (*cisco_card_set_nio_fn)(vm_instance_t *vm,struct cisco_card *card,
u_int port_id,netio_desc_t *nio);
/* Prototype of card NIO unset function */
typedef int (*cisco_card_unset_nio_fn)(vm_instance_t *vm,
struct cisco_card *card,
u_int port_id);
/* Prototype of card NIO show info function */
typedef int (*cisco_card_show_info_fn)(vm_instance_t *vm,
struct cisco_card *card);
/* Cisco NIO binding to a slot/port */
struct cisco_nio_binding {
netio_desc_t *nio;
u_int port_id,orig_port_id;
struct cisco_nio_binding *prev,*next;
};
/* Generic Cisco card driver */
struct cisco_card_driver {
char *dev_type;
int supported;
int wic_slots;
cisco_card_init_fn card_init;
cisco_card_shutdown_fn card_shutdown;
cisco_card_get_sub_info_fn card_get_sub_info;
cisco_card_set_nio_fn card_set_nio;
cisco_card_unset_nio_fn card_unset_nio;
cisco_card_show_info_fn card_show_info;
};
/* Generic Cisco card */
struct cisco_card {
char *dev_name; /* Device name */
char *dev_type; /* Device Type */
u_int card_type; /* Card type (NM,PA,WIC,...) */
u_int card_flags; /* Card flags */
u_int card_id; /* Card ID (slot or sub-slot) */
u_int slot_id,subslot_id; /* Slot and Sub-slot ID */
struct cisco_eeprom eeprom; /* EEPROM */
struct pci_bus *pci_bus; /* PCI bus */
struct cisco_card_driver *driver; /* Driver */
void *drv_info; /* Private driver info */
struct cisco_nio_binding *nio_list; /* NIO bindings to ports */
struct cisco_card *parent; /* Parent card */
struct cisco_card *sub_slots[CISCO_CARD_MAX_SUBSLOTS]; /* Sub-slots */
};
/* Set EEPROM definition for the specified Cisco card */
int cisco_card_set_eeprom(vm_instance_t *vm,struct cisco_card *card,
const struct cisco_eeprom *eeprom);
/* Unset EEPROM definition */
int cisco_card_unset_eeprom(struct cisco_card *card);
/* Check if a card has a valid EEPROM defined */
int cisco_card_check_eeprom(struct cisco_card *card);
/* Get slot info */
struct cisco_card *vm_slot_get_card_ptr(vm_instance_t *vm,u_int slot_id);
/* Check if a slot has an active card */
int vm_slot_active(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Set a flag for a card */
int vm_slot_set_flag(vm_instance_t *vm,u_int slot_id,u_int port_id,u_int flag);
/* Add a slot binding */
int vm_slot_add_binding(vm_instance_t *vm,char *dev_type,
u_int slot_id,u_int port_id);
/* Remove a slot binding */
int vm_slot_remove_binding(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Add a network IO binding */
int vm_slot_add_nio_binding(vm_instance_t *vm,u_int slot_id,u_int port_id,
char *nio_name);
/* Remove a NIO binding */
int vm_slot_remove_nio_binding(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Remove all NIO bindings for the specified slot (sub-slots included) */
int vm_slot_remove_all_nio_bindings(vm_instance_t *vm,u_int slot_id);
/* Enable a Network IO descriptor for the specified slot */
int vm_slot_enable_nio(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Disable Network IO descriptor for the specified slot */
int vm_slot_disable_nio(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Enable all NIO for the specified slot (sub-slots included) */
int vm_slot_enable_all_nio(vm_instance_t *vm,u_int slot_id);
/* Disable all NIO for the specified slot (sub-slots included) */
int vm_slot_disable_all_nio(vm_instance_t *vm,u_int slot_id);
/* Initialize the specified slot (sub-slots included) */
int vm_slot_init(vm_instance_t *vm,u_int slot_id);
/* Initialize all slots of a VM */
int vm_slot_init_all(vm_instance_t *vm);
/* Shutdown the specified slot (sub-slots included) */
int vm_slot_shutdown(vm_instance_t *vm,u_int slot_id);
/* Shutdown all slots of a VM */
int vm_slot_shutdown_all(vm_instance_t *vm);
/* Show info about the specified slot (sub-slots included) */
int vm_slot_show_info(vm_instance_t *vm,u_int slot_id);
/* Show info about all slots */
int vm_slot_show_all_info(vm_instance_t *vm);
/* Check if the specified slot has a valid EEPROM defined */
int vm_slot_check_eeprom(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Returns the EEPROM data of the specified slot */
struct cisco_eeprom *
vm_slot_get_eeprom(vm_instance_t *vm,u_int slot_id,u_int port_id);
/* Save config for the specified slot (sub-slots included) */
int vm_slot_save_config(vm_instance_t *vm,u_int slot_id,FILE *fd);
/* Save config for all slots */
int vm_slot_save_all_config(vm_instance_t *vm,FILE *fd);
/* Show slot drivers */
int vm_slot_show_drivers(vm_instance_t *vm);
/* Create a Network Module (command line) */
int vm_slot_cmd_create(vm_instance_t *vm,char *str);
/* Add a Network IO descriptor binding (command line) */
int vm_slot_cmd_add_nio(vm_instance_t *vm,char *str);
#endif