|
|
1.1 root 1: /*
2: * Constants and structure definitions for the bridging code
3: */
4:
5: #if !defined(One)
6: #define Zero 0
7: #define One 1
8: #endif /* !defined(One) */
9:
10: #if !defined(TRUE)
11: #define FALSE 0
12: #define TRUE 1
13: #endif /* !defined(TRUE) */
14:
15: /** port states. **/
16: #define Disabled 0 /* (4.4 5) */
17: #define Listening 1 /* (4.4.2) */
18: #define Learning 2 /* (4.4.3) */
19: #define Forwarding 3 /* (4 4 4) */
20: #define Blocking 4 /* (4.4.1) */
21:
22: #define No_of_ports 8
23: /* arbitrary choice, to allow the code below to compile */
24:
25: #define All_ports (No_of_ports + 1)
26:
27: /*
28: * We time out our entries in the FDB after this many seconds.
29: */
30: #define FDB_TIMEOUT 300
31:
32: /*
33: * the following defines are the initial values used when the
34: * bridge is booted. These may be overridden when this bridge is
35: * not the root bridge. These are the recommended default values
36: * from the 802.1d specification.
37: */
38: #define BRIDGE_MAX_AGE 20
39: #define BRIDGE_HELLO_TIME 2
40: #define BRIDGE_FORWARD_DELAY 15
41: #define HOLD_TIME 1
42:
43: #define Default_path_cost 10
44:
45: /*
46: * minimum increment possible to avoid underestimating age, allows for BPDU
47: * transmission time
48: */
49: #define Message_age_increment 1
50:
51: #define No_port 0
52: /*
53: * reserved value for Bridge's root port parameter indicating no root port,
54: * used when Bridge is the root - also used to indicate the source when
55: * a frame is being generated by a higher layer protocol on this host
56: */
57:
58: /** Configuration BPDU Parameters (4.5.1) **/
59:
60: typedef struct {
61: union {
62: struct {
63: unsigned short priority;
64: unsigned char ula[6];
65: } p_u;
66: unsigned int id[2];
67: } bi;
68: } bridge_id_t;
69:
70: #define BRIDGE_PRIORITY bi.p_u.priority
71: #define BRIDGE_ID_ULA bi.p_u.ula
72: #define BRIDGE_ID bi.id
73:
74: typedef struct {
75: unsigned short protocol_id;
76: unsigned char protocol_version_id;
77: unsigned char type;
78: unsigned char flags;
79: #define TOPOLOGY_CHANGE 0x01
80: #define TOPOLOGY_CHANGE_ACK 0x80
81: bridge_id_t root_id; /* (4.5.1.1) */
82: unsigned int root_path_cost; /* (4.5.1.2) */
83: bridge_id_t bridge_id; /* (4.5.1.3) */
84: unsigned short port_id; /* (4.5.1.4) */
85: unsigned short message_age; /* (4.5.1.5) */
86: unsigned short max_age; /* (4.5.1.6) */
87: unsigned short hello_time; /* (4.5.1.7) */
88: unsigned short forward_delay; /* (4.5.1.8) */
89: } Config_bpdu;
90:
91:
92: /** Topology Change Notification BPDU Parameters (4.5.2) **/
93:
94: typedef struct {
95: unsigned short protocol_id;
96: unsigned char protocol_version_id;
97: unsigned char type;
98: } Tcn_bpdu;
99:
100: #define BPDU_TYPE_CONFIG 0
101: #define BPDU_TYPE_TOPO_CHANGE 128
102:
103: /** Bridge Parameters (4.5.3) **/
104: typedef struct {
105: bridge_id_t designated_root; /* (4.5.3.1) */
106: unsigned int root_path_cost; /* (4.5.3.2) */
107: unsigned int root_port; /* (4.5.3.3) */
108: unsigned short max_age; /* (4.5.3.4) */
109: unsigned short hello_time; /* (4.5.3.5) */
110: unsigned short forward_delay; /* (4.5.3.6) */
111: bridge_id_t bridge_id; /* (4.5.3.7) */
112: unsigned short bridge_max_age; /* (4.5.3.8) */
113: unsigned short bridge_hello_time; /* (4.5.3.9) */
114: unsigned short bridge_forward_delay; /* (4.5.3.10) */
115: unsigned int topology_change_detected; /* (4.5.3.11) */
116: unsigned int topology_change; /* (4.5.3.12) */
117: unsigned short topology_change_time; /* (4.5.3.13) */
118: unsigned short hold_time; /* (4.5.3.14) */
119: unsigned int top_change;
120: unsigned int top_change_detected;
121: } Bridge_data;
122:
123: /** Port Parameters (4.5.5) **/
124: typedef struct {
125: unsigned short port_id; /* (4.5.5.1) */
126: unsigned int state; /* (4.5.5.2) */
127: unsigned int path_cost; /* (4.5.5.3) */
128: bridge_id_t designated_root; /* (4.5.5.4) */
129: unsigned int designated_cost; /* (4.5.5.5) */
130: bridge_id_t designated_bridge; /* (4.5.5.6) */
131: unsigned short designated_port; /* (4.5.5.7) */
132: unsigned int top_change_ack; /* (4.5.5.8) */
133: unsigned int config_pending; /* (4.5.5.9) */
134: struct device *dev;
135: struct fdb *fdb; /* head of per port fdb chain */
136: } Port_data;
137:
138:
139:
140: /** types to support timers for this pseudo-implementation. **/
141: typedef struct {
142: unsigned int active; /* timer in use. */
143: unsigned int value; /* current value of timer,
144: * counting up. */
145: } Timer;
146:
147: struct fdb {
148: unsigned char ula[6];
149: unsigned char pad[2];
150: unsigned short port;
151: unsigned int timer;
152: unsigned int flags;
153: #define FDB_ENT_VALID 0x01
154: /* AVL tree of all addresses, sorted by address */
155: short fdb_avl_height;
156: struct fdb *fdb_avl_left;
157: struct fdb *fdb_avl_right;
158: /* linked list of addresses for each port */
159: struct fdb *fdb_next;
160: };
161:
162: #define IS_BRIDGED 0x2e
163:
164: struct br_stat {
165: unsigned int flags;
166: Bridge_data bridge_data;
167: Port_data port_data[No_of_ports];
168: };
169:
170: /* defined flags for br_stat.flags */
171: #define BR_UP 0x0001 /* bridging enabled */
172: #define BR_DEBUG 0x0002 /* debugging enabled */
173:
174: struct br_cf {
175: unsigned int cmd;
176: unsigned int arg1;
177: unsigned int arg2;
178: };
179:
180: /* defined cmds */
181: #define BRCMD_BRIDGE_ENABLE 1
182: #define BRCMD_BRIDGE_DISABLE 2
183: #define BRCMD_PORT_ENABLE 3 /* arg1 = port */
184: #define BRCMD_PORT_DISABLE 4 /* arg1 = port */
185: #define BRCMD_SET_BRIDGE_PRIORITY 5 /* arg1 = priority */
186: #define BRCMD_SET_PORT_PRIORITY 6 /* arg1 = port, arg2 = priority */
187: #define BRCMD_SET_PATH_COST 7 /* arg1 = port, arg2 = cost */
188: #define BRCMD_DISPLAY_FDB 8 /* arg1 = port */
189: #define BRCMD_ENABLE_DEBUG 9
190: #define BRCMD_DISABLE_DEBUG 10
191:
192: /* prototypes of all bridging functions... */
193:
194: void transmit_config(int port_no);
195: int root_bridge(void);
196: int supersedes_port_info(int port_no, Config_bpdu *config);
197: void record_config_information(int port_no, Config_bpdu *config);
198: void record_config_timeout_values(Config_bpdu *config);
199: void config_bpdu_generation(void);
200: int designated_port(int port_no);
201: void reply(int port_no);
202: void transmit_tcn(void);
203: void configuration_update(void);
204: void root_selection(void);
205: void designated_port_selection(void);
206: void become_designated_port(int port_no);
207: void port_state_selection(void);
208: void make_forwarding(int port_no);
209: void topology_change_detection(void);
210: void topology_change_acknowledged(void);
211: void acknowledge_topology_change(int port_no);
212: void make_blocking(int port_no);
213: void set_port_state(int port_no, int state);
214: void received_config_bpdu(int port_no, Config_bpdu *config);
215: void received_tcn_bpdu(int port_no, Tcn_bpdu *tcn);
216: void hello_timer_expiry(void);
217: void message_age_timer_expiry(int port_no);
218: void forward_delay_timer_expiry(int port_no);
219: int designated_for_some_port(void);
220: void tcn_timer_expiry(void);
221: void topology_change_timer_expiry(void);
222: void hold_timer_expiry(int port_no);
223: void br_init(void);
224: void br_init_port(int port_no);
225: void enable_port(int port_no);
226: void disable_port(int port_no);
227: void set_bridge_priority(bridge_id_t *new_bridge_id);
228: void set_port_priority(int port_no, unsigned short new_port_id);
229: void set_path_cost(int port_no, unsigned short path_cost);
230: void start_hello_timer(void);
231: void stop_hello_timer(void);
232: int hello_timer_expired(void);
233: void start_tcn_timer(void);
234: void stop_tcn_timer(void);
235: int tcn_timer_expired(void);
236: void start_topology_change_timer(void);
237: void stop_topology_change_timer(void);
238: int topology_change_timer_expired(void);
239: void start_message_age_timer(int port_no, unsigned short message_age);
240: void stop_message_age_timer(int port_no);
241: int message_age_timer_expired(int port_no);
242: void start_forward_delay_timer(int port_no);
243: void stop_forward_delay_timer(int port_no);
244: int forward_delay_timer_expired(int port_no);
245: void start_hold_timer(int port_no);
246: void stop_hold_timer(int port_no);
247: int hold_timer_expired(int port_no);
248:
249: struct fdb *br_avl_find_addr(unsigned char addr[6]);
250: int br_avl_insert (struct fdb * new_node);
251: int br_avl_remove (struct fdb * node_to_delete);
252:
253: int send_tcn_bpdu(int port_no, Tcn_bpdu *bpdu);
254: int send_config_bpdu(int port_no, Config_bpdu *config_bpdu);
255: int find_port(struct device *dev);
256: int br_flood(struct sk_buff *skb, int port);
257: int br_drop(struct sk_buff *skb);
258: int br_learn(struct sk_buff *skb, int port); /* 3.8 */
259:
260: int br_receive_frame(struct sk_buff *skb); /* 3.5 */
261: int br_tx_frame(struct sk_buff *skb);
262: int br_ioctl(unsigned int cmd, void *arg);
263:
264: void free_fdb(struct fdb *);
265: struct fdb *get_fdb(void);
266:
267: /* externs */
268:
269: extern struct br_stat br_stats;
270:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.