1 |
dpavlin |
11 |
/* |
2 |
|
|
* Cisco router simulation platform. |
3 |
|
|
* Copyright (c) 2007 Christophe Fillot (cf@utc.fr) |
4 |
|
|
* |
5 |
|
|
* Generic Cisco card routines and definitions. |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
#ifndef __CISCO_CARD_H__ |
9 |
|
|
#define __CISCO_CARD_H__ |
10 |
|
|
|
11 |
|
|
#include <pthread.h> |
12 |
|
|
|
13 |
|
|
#include "utils.h" |
14 |
|
|
#include "net.h" |
15 |
|
|
#include "net_io.h" |
16 |
|
|
#include "cisco_eeprom.h" |
17 |
|
|
|
18 |
|
|
#define CISCO_CARD_MAX_WIC 8 |
19 |
|
|
#define CISCO_CARD_MAX_SUBSLOTS 16 |
20 |
|
|
|
21 |
|
|
/* Card types */ |
22 |
|
|
enum { |
23 |
|
|
CISCO_CARD_TYPE_UNDEF = 0, |
24 |
|
|
CISCO_CARD_TYPE_PA, |
25 |
|
|
CISCO_CARD_TYPE_NM, |
26 |
|
|
CISCO_CARD_TYPE_WIC, |
27 |
|
|
}; |
28 |
|
|
|
29 |
|
|
/* Card flags */ |
30 |
|
|
enum { |
31 |
|
|
CISCO_CARD_FLAG_OVERRIDE = 1, |
32 |
|
|
}; |
33 |
|
|
|
34 |
|
|
/* Forward declarations */ |
35 |
|
|
struct cisco_card; |
36 |
|
|
struct cisco_card_driver; |
37 |
|
|
|
38 |
|
|
/* Prototype of card driver initialization function */ |
39 |
|
|
typedef int (*cisco_card_init_fn)(vm_instance_t *vm,struct cisco_card *card); |
40 |
|
|
|
41 |
|
|
/* Prototype of card driver shutdown function */ |
42 |
|
|
typedef int (*cisco_card_shutdown_fn)(vm_instance_t *vm, |
43 |
|
|
struct cisco_card *card); |
44 |
|
|
|
45 |
|
|
/* Prototype of card NIO get sub-slot info function */ |
46 |
|
|
typedef int |
47 |
|
|
(*cisco_card_get_sub_info_fn)(vm_instance_t *vm,struct cisco_card *card, |
48 |
|
|
u_int port_id, |
49 |
|
|
struct cisco_card_driver ***drv_array, |
50 |
|
|
u_int *subcard_type); |
51 |
|
|
|
52 |
|
|
/* Prototype of card NIO set function */ |
53 |
|
|
typedef int (*cisco_card_set_nio_fn)(vm_instance_t *vm,struct cisco_card *card, |
54 |
|
|
u_int port_id,netio_desc_t *nio); |
55 |
|
|
|
56 |
|
|
/* Prototype of card NIO unset function */ |
57 |
|
|
typedef int (*cisco_card_unset_nio_fn)(vm_instance_t *vm, |
58 |
|
|
struct cisco_card *card, |
59 |
|
|
u_int port_id); |
60 |
|
|
|
61 |
|
|
/* Prototype of card NIO show info function */ |
62 |
|
|
typedef int (*cisco_card_show_info_fn)(vm_instance_t *vm, |
63 |
|
|
struct cisco_card *card); |
64 |
|
|
|
65 |
|
|
/* Cisco NIO binding to a slot/port */ |
66 |
|
|
struct cisco_nio_binding { |
67 |
|
|
netio_desc_t *nio; |
68 |
|
|
u_int port_id,orig_port_id; |
69 |
|
|
struct cisco_nio_binding *prev,*next; |
70 |
|
|
}; |
71 |
|
|
|
72 |
|
|
/* Generic Cisco card driver */ |
73 |
|
|
struct cisco_card_driver { |
74 |
|
|
char *dev_type; |
75 |
|
|
int supported; |
76 |
|
|
int wic_slots; |
77 |
|
|
cisco_card_init_fn card_init; |
78 |
|
|
cisco_card_shutdown_fn card_shutdown; |
79 |
|
|
cisco_card_get_sub_info_fn card_get_sub_info; |
80 |
|
|
cisco_card_set_nio_fn card_set_nio; |
81 |
|
|
cisco_card_unset_nio_fn card_unset_nio; |
82 |
|
|
cisco_card_show_info_fn card_show_info; |
83 |
|
|
}; |
84 |
|
|
|
85 |
|
|
/* Generic Cisco card */ |
86 |
|
|
struct cisco_card { |
87 |
|
|
char *dev_name; /* Device name */ |
88 |
|
|
char *dev_type; /* Device Type */ |
89 |
|
|
u_int card_type; /* Card type (NM,PA,WIC,...) */ |
90 |
|
|
u_int card_flags; /* Card flags */ |
91 |
|
|
u_int card_id; /* Card ID (slot or sub-slot) */ |
92 |
|
|
u_int slot_id,subslot_id; /* Slot and Sub-slot ID */ |
93 |
|
|
struct cisco_eeprom eeprom; /* EEPROM */ |
94 |
|
|
struct pci_bus *pci_bus; /* PCI bus */ |
95 |
|
|
struct cisco_card_driver *driver; /* Driver */ |
96 |
|
|
void *drv_info; /* Private driver info */ |
97 |
|
|
struct cisco_nio_binding *nio_list; /* NIO bindings to ports */ |
98 |
|
|
struct cisco_card *parent; /* Parent card */ |
99 |
|
|
struct cisco_card *sub_slots[CISCO_CARD_MAX_SUBSLOTS]; /* Sub-slots */ |
100 |
|
|
}; |
101 |
|
|
|
102 |
|
|
/* Set EEPROM definition for the specified Cisco card */ |
103 |
|
|
int cisco_card_set_eeprom(vm_instance_t *vm,struct cisco_card *card, |
104 |
|
|
const struct cisco_eeprom *eeprom); |
105 |
|
|
|
106 |
|
|
/* Unset EEPROM definition */ |
107 |
|
|
int cisco_card_unset_eeprom(struct cisco_card *card); |
108 |
|
|
|
109 |
|
|
/* Check if a card has a valid EEPROM defined */ |
110 |
|
|
int cisco_card_check_eeprom(struct cisco_card *card); |
111 |
|
|
|
112 |
|
|
/* Get slot info */ |
113 |
|
|
struct cisco_card *vm_slot_get_card_ptr(vm_instance_t *vm,u_int slot_id); |
114 |
|
|
|
115 |
|
|
/* Check if a slot has an active card */ |
116 |
|
|
int vm_slot_active(vm_instance_t *vm,u_int slot_id,u_int port_id); |
117 |
|
|
|
118 |
|
|
/* Set a flag for a card */ |
119 |
|
|
int vm_slot_set_flag(vm_instance_t *vm,u_int slot_id,u_int port_id,u_int flag); |
120 |
|
|
|
121 |
|
|
/* Add a slot binding */ |
122 |
|
|
int vm_slot_add_binding(vm_instance_t *vm,char *dev_type, |
123 |
|
|
u_int slot_id,u_int port_id); |
124 |
|
|
|
125 |
|
|
/* Remove a slot binding */ |
126 |
|
|
int vm_slot_remove_binding(vm_instance_t *vm,u_int slot_id,u_int port_id); |
127 |
|
|
|
128 |
|
|
/* Add a network IO binding */ |
129 |
|
|
int vm_slot_add_nio_binding(vm_instance_t *vm,u_int slot_id,u_int port_id, |
130 |
|
|
char *nio_name); |
131 |
|
|
|
132 |
|
|
/* Remove a NIO binding */ |
133 |
|
|
int vm_slot_remove_nio_binding(vm_instance_t *vm,u_int slot_id,u_int port_id); |
134 |
|
|
|
135 |
|
|
/* Remove all NIO bindings for the specified slot (sub-slots included) */ |
136 |
|
|
int vm_slot_remove_all_nio_bindings(vm_instance_t *vm,u_int slot_id); |
137 |
|
|
|
138 |
|
|
/* Enable a Network IO descriptor for the specified slot */ |
139 |
|
|
int vm_slot_enable_nio(vm_instance_t *vm,u_int slot_id,u_int port_id); |
140 |
|
|
|
141 |
|
|
/* Disable Network IO descriptor for the specified slot */ |
142 |
|
|
int vm_slot_disable_nio(vm_instance_t *vm,u_int slot_id,u_int port_id); |
143 |
|
|
|
144 |
|
|
/* Enable all NIO for the specified slot (sub-slots included) */ |
145 |
|
|
int vm_slot_enable_all_nio(vm_instance_t *vm,u_int slot_id); |
146 |
|
|
|
147 |
|
|
/* Disable all NIO for the specified slot (sub-slots included) */ |
148 |
|
|
int vm_slot_disable_all_nio(vm_instance_t *vm,u_int slot_id); |
149 |
|
|
|
150 |
|
|
/* Initialize the specified slot (sub-slots included) */ |
151 |
|
|
int vm_slot_init(vm_instance_t *vm,u_int slot_id); |
152 |
|
|
|
153 |
|
|
/* Initialize all slots of a VM */ |
154 |
|
|
int vm_slot_init_all(vm_instance_t *vm); |
155 |
|
|
|
156 |
|
|
/* Shutdown the specified slot (sub-slots included) */ |
157 |
|
|
int vm_slot_shutdown(vm_instance_t *vm,u_int slot_id); |
158 |
|
|
|
159 |
|
|
/* Shutdown all slots of a VM */ |
160 |
|
|
int vm_slot_shutdown_all(vm_instance_t *vm); |
161 |
|
|
|
162 |
|
|
/* Show info about the specified slot (sub-slots included) */ |
163 |
|
|
int vm_slot_show_info(vm_instance_t *vm,u_int slot_id); |
164 |
|
|
|
165 |
|
|
/* Show info about all slots */ |
166 |
|
|
int vm_slot_show_all_info(vm_instance_t *vm); |
167 |
|
|
|
168 |
|
|
/* Check if the specified slot has a valid EEPROM defined */ |
169 |
|
|
int vm_slot_check_eeprom(vm_instance_t *vm,u_int slot_id,u_int port_id); |
170 |
|
|
|
171 |
|
|
/* Returns the EEPROM data of the specified slot */ |
172 |
|
|
struct cisco_eeprom * |
173 |
|
|
vm_slot_get_eeprom(vm_instance_t *vm,u_int slot_id,u_int port_id); |
174 |
|
|
|
175 |
|
|
/* Save config for the specified slot (sub-slots included) */ |
176 |
|
|
int vm_slot_save_config(vm_instance_t *vm,u_int slot_id,FILE *fd); |
177 |
|
|
|
178 |
|
|
/* Save config for all slots */ |
179 |
|
|
int vm_slot_save_all_config(vm_instance_t *vm,FILE *fd); |
180 |
|
|
|
181 |
|
|
/* Show slot drivers */ |
182 |
|
|
int vm_slot_show_drivers(vm_instance_t *vm); |
183 |
|
|
|
184 |
|
|
/* Create a Network Module (command line) */ |
185 |
|
|
int vm_slot_cmd_create(vm_instance_t *vm,char *str); |
186 |
|
|
|
187 |
|
|
/* Add a Network IO descriptor binding (command line) */ |
188 |
|
|
int vm_slot_cmd_add_nio(vm_instance_t *vm,char *str); |
189 |
|
|
|
190 |
|
|
#endif |