netif_utils: correctly close fd on read error
[project/ustp.git] / mstp.h
1 /*
2 * mstp.h State machines from IEEE 802.1Q-2005
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 *
9 * Authors: Vitalii Demianets <dvitasgs@gmail.com>
10 */
11
12 #ifndef MSTP_H
13 #define MSTP_H
14
15 #include <sys/types.h>
16 #include <stdlib.h>
17 #include <libubox/list.h>
18
19 #include "bridge_ctl.h"
20
21 /* #define HMAC_MDS_TEST_FUNCTIONS */
22
23 /* Useful macro for counting number of elements in array */
24 #define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
25
26 /*
27 * assign() and cmp() macros that also do strict type-checking. See the
28 * "unnecessary" pointer comparison.
29 * NOTE: potential double-evaluation of the first argument in assign macro!
30 * It is the price for type-safety ;)
31 */
32 #define assign(x, y) ({ \
33 typeof(x) _assign1 = (x); \
34 typeof(y) _assign2 = (y); \
35 (void)(&_assign1 == &_assign2); \
36 (x) = _assign2; })
37 #define _ncmp(x, y) ({ \
38 typeof(x) _cmp1 = (x); \
39 typeof(y) _cmp2 = (y); \
40 (void)(&_cmp1 == &_cmp2); \
41 memcmp(&_cmp1, &_cmp2, sizeof(_cmp1)); })
42 #define cmp(x, _op, y) (_ncmp((x), (y)) _op 0)
43
44 /* 13.7, Table 13-1 */
45 #define HMAC_KEY {0x13, 0xAC, 0x06, 0xA6, 0x2E, 0x47, 0xFD, 0x51, \
46 0xF9, 0x5D, 0x2B, 0xA2, 0x43, 0xCD, 0x03, 0x46}
47 extern void hmac_md5(unsigned char * text, int text_len, unsigned char * key,
48 int key_len, caddr_t digest);
49 #ifdef HMAC_MDS_TEST_FUNCTIONS
50 extern bool MD5TestSuite(void);
51 #endif /* HMAC_MDS_TEST_FUNCTIONS */
52
53 #define MAX_PORT_NUMBER 4095
54 #define MAX_VID 4094
55 #define MAX_FID 4095
56 #define MAX_MSTID 4094
57
58 /* MAX_xxx_MSTIS: CIST not counted */
59 #define MAX_STANDARD_MSTIS 64
60 #define MAX_IMPLEMENTATION_MSTIS 63
61
62 /* 13.37.1 */
63 #define MAX_PATH_COST 200000000u
64
65 typedef union
66 {
67 __u64 u;
68 struct
69 {
70 __be16 priority;
71 __u8 mac_address[ETH_ALEN];
72 } __attribute__((packed)) s;
73 } bridge_identifier_t;
74
75 typedef __be16 port_identifier_t;
76
77 /* These macros work well for both PortID and BridgeID */
78 #define GET_PRIORITY_FROM_IDENTIFIER(id) (((__u8 *)(&(id)))[0] & 0xF0)
79 #define SET_PRIORITY_IN_IDENTIFIER(pri, id) do{ \
80 __u8 *first_octet = (__u8 *)(&(id)); \
81 *first_octet &= 0x0F; \
82 *first_octet |= (pri) & 0xF0; \
83 }while(0)
84
85 #define CONFIGURATION_NAME_LEN 32
86 #define CONFIGURATION_DIGEST_LEN 16
87 typedef union
88 {
89 __u8 a[1 + CONFIGURATION_NAME_LEN + 2 + CONFIGURATION_DIGEST_LEN];
90 struct
91 {
92 __u8 selector; /* always 0 */
93 __u8 configuration_name[CONFIGURATION_NAME_LEN];
94 __be16 revision_level;
95 __u8 configuration_digest[CONFIGURATION_DIGEST_LEN];
96 } __attribute__((packed)) s;
97 } __attribute__((packed)) mst_configuration_identifier_t;
98
99 typedef struct
100 {
101 bridge_identifier_t RRootID;
102 __be32 IntRootPathCost;
103 bridge_identifier_t DesignatedBridgeID;
104 port_identifier_t DesignatedPortID;
105 /* not used for MSTIs, only for CIST */
106 bridge_identifier_t RootID;
107 __be32 ExtRootPathCost;
108 } port_priority_vector_t;
109
110 typedef struct
111 {
112 __u8 remainingHops;
113 /* not used for MSTIs, only for CIST */
114 __u8 Forward_Delay;
115 __u8 Max_Age;
116 __u8 Message_Age;
117 __u8 Hello_Time;
118 } times_t;
119
120 typedef struct
121 {
122 /* see bpduFlagOffset_t enum for offsets of flag bits */
123 __u8 flags;
124 bridge_identifier_t mstiRRootID;
125 __be32 mstiIntRootPathCost;
126 /* only bits 7..4, bits 3..0 are zero on Tx and ignored on Rx */
127 __u8 bridgeIdentifierPriority;
128 /* only bits 7..4, bits 3..0 are zero on Tx and ignored on Rx */
129 __u8 portIdentifierPriority;
130 __u8 remainingHops;
131 } __attribute__((packed)) msti_configuration_message_t;
132
133 typedef struct
134 {
135 /* always zero for the Spanning Tree BPDUs */
136 __be16 protocolIdentifier;
137 /* protoSTP for the Config and TCN
138 * protoRSTP for the RST
139 * protoMSTP for the MST
140 * (see protocol_version_t enum) */
141 __u8 protocolVersion;
142 /* values are defined in bpduType_t enum */
143 __u8 bpduType;
144 /* TCN BPDU ends here */
145 /* see bpduFlagOffset_t enum for offsets of flag bits */
146 __u8 flags;
147 bridge_identifier_t cistRootID;
148 __be32 cistExtRootPathCost;
149 bridge_identifier_t cistRRootID;
150 port_identifier_t cistPortID;
151 __u8 MessageAge[2];
152 __u8 MaxAge[2];
153 __u8 HelloTime[2];
154 __u8 ForwardDelay[2];
155 /* Config BPDU ends here */
156 __u8 version1_len; /* always zero */
157 /* RST BPDU ends here */
158 __be16 version3_len;
159 mst_configuration_identifier_t mstConfigurationIdentifier;
160 __be32 cistIntRootPathCost;
161 bridge_identifier_t cistBridgeID;
162 __u8 cistRemainingHops;
163 msti_configuration_message_t mstConfiguration[MAX_STANDARD_MSTIS];
164 } __attribute__((packed)) bpdu_t;
165
166 #define TCN_BPDU_SIZE offsetof(bpdu_t, flags)
167 #define CONFIG_BPDU_SIZE offsetof(bpdu_t, version1_len)
168 #define RST_BPDU_SIZE offsetof(bpdu_t, version3_len)
169 #define MST_BPDU_SIZE_WO_MSTI_MSGS offsetof(bpdu_t, mstConfiguration)
170 #define MST_BPDU_VER3LEN_WO_MSTI_MSGS (MST_BPDU_SIZE_WO_MSTI_MSGS \
171 - offsetof(bpdu_t, mstConfigurationIdentifier))
172
173 typedef enum
174 {
175 OtherInfo,
176 SuperiorDesignatedInfo,
177 RepeatedDesignatedInfo,
178 InferiorDesignatedInfo,
179 InferiorRootAlternateInfo
180 } port_info_t;
181
182 typedef enum
183 {
184 ioDisabled,
185 ioMine,
186 ioAged,
187 ioReceived
188 } port_info_origin_t;
189
190 typedef enum
191 {
192 roleDisabled,
193 roleRoot,
194 roleDesignated,
195 roleAlternate,
196 roleBackup,
197 roleMaster
198 } port_role_t;
199
200 typedef enum
201 {
202 encodedRoleMaster = 0,
203 encodedRoleAlternateBackup = 1,
204 encodedRoleRoot = 2,
205 encodedRoleDesignated = 3
206 } port_encoded_role_t;
207
208 typedef enum
209 {
210 protoSTP = 0,
211 protoRSTP = 2,
212 protoMSTP = 3
213 } protocol_version_t;
214
215 typedef enum
216 {
217 bpduTypeConfig = 0,
218 bpduTypeRST = 2,
219 bpduTypeTCN = 128
220 } bpduType_t;
221
222 typedef enum
223 {
224 offsetTc = 0,
225 offsetProposal = 1,
226 offsetRole = 2, /* actually, role is coded in two-bit field */
227 offsetRole1 = 3, /* second bit of two-bit role field */
228 offsetLearnig = 4,
229 offsetForwarding = 5,
230 offsetAgreement = 6,
231 offsetTcAck = 7
232 /* in MSTI Configuration Message flags bit7 is used for Master flag */
233 #define offsetMaster offsetTcAck
234 } bpduFlagOffset_t;
235
236 #define BPDU_FLAGS_ROLE_SET(role) (((role) & 3) << offsetRole)
237 #define BPDU_FLAGS_ROLE_GET(flags) (((flags) >> offsetRole) & 3)
238
239 typedef enum
240 {
241 p2pAuto,
242 p2pForceTrue,
243 p2pForceFalse
244 }
245 admin_p2p_t;
246
247 /* 13.28 Port Receive state machine */
248 typedef enum
249 {
250 PRSM_DISCARD,
251 PRSM_RECEIVE
252 } PRSM_states_t;
253
254 /* 13.29 Port Protocol Migration state machine */
255 typedef enum
256 {
257 PPMSM_CHECKING_RSTP,
258 PPMSM_SELECTING_STP,
259 PPMSM_SENSING
260 } PPMSM_states_t;
261
262 /* 13.30 Bridge Detection state machine */
263 typedef enum
264 {
265 BDSM_EDGE,
266 BDSM_NOT_EDGE
267 } BDSM_states_t;
268
269 /* 13.31 Port Transmit state machine */
270 typedef enum
271 {
272 PTSM_TRANSMIT_INIT,
273 PTSM_TRANSMIT_CONFIG,
274 PTSM_TRANSMIT_TCN,
275 PTSM_TRANSMIT_RSTP,
276 PTSM_TRANSMIT_PERIODIC,
277 PTSM_IDLE
278 } PTSM_states_t;
279
280 /* 13.32 Port Information state machine */
281 /* #define PISM_ENABLE_LOG */
282 typedef enum
283 {
284 PISM_DISABLED,
285 PISM_AGED,
286 PISM_UPDATE,
287 PISM_SUPERIOR_DESIGNATED,
288 PISM_REPEATED_DESIGNATED,
289 PISM_INFERIOR_DESIGNATED,
290 PISM_NOT_DESIGNATED,
291 PISM_OTHER,
292 PISM_CURRENT,
293 PISM_RECEIVE
294 } PISM_states_t;
295
296 /* 13.33 Port Role Selection state machine */
297 typedef enum
298 {
299 PRSSM_INIT_TREE,
300 PRSSM_ROLE_SELECTION
301 } PRSSM_states_t;
302
303 /* 13.34 Port Role Transitions state machine */
304 /* #define PRTSM_ENABLE_LOG */
305 typedef enum
306 {
307 /* Disabled Port role transitions */
308 PRTSM_INIT_PORT,
309 PRTSM_DISABLE_PORT,
310 PRTSM_DISABLED_PORT,
311 /* MasterPort role transitions */
312 PRTSM_MASTER_PROPOSED,
313 PRTSM_MASTER_AGREED,
314 PRTSM_MASTER_SYNCED,
315 PRTSM_MASTER_RETIRED,
316 PRTSM_MASTER_FORWARD,
317 PRTSM_MASTER_LEARN,
318 PRTSM_MASTER_DISCARD,
319 PRTSM_MASTER_PORT,
320 /* RootPort role transitions */
321 PRTSM_ROOT_PROPOSED,
322 PRTSM_ROOT_AGREED,
323 PRTSM_ROOT_SYNCED,
324 PRTSM_REROOT,
325 PRTSM_ROOT_FORWARD,
326 PRTSM_ROOT_LEARN,
327 PRTSM_REROOTED,
328 PRTSM_ROOT_PORT,
329 /* DesignatedPort role transitions */
330 PRTSM_DESIGNATED_PROPOSE,
331 PRTSM_DESIGNATED_AGREED,
332 PRTSM_DESIGNATED_SYNCED,
333 PRTSM_DESIGNATED_RETIRED,
334 PRTSM_DESIGNATED_FORWARD,
335 PRTSM_DESIGNATED_LEARN,
336 PRTSM_DESIGNATED_DISCARD,
337 PRTSM_DESIGNATED_PORT,
338 /* AlternatePort and BackupPort role transitions */
339 PRTSM_BLOCK_PORT,
340 PRTSM_BACKUP_PORT,
341 PRTSM_ALTERNATE_PROPOSED,
342 PRTSM_ALTERNATE_AGREED,
343 PRTSM_ALTERNATE_PORT
344 } PRTSM_states_t;
345
346 /* 13.35 Port State Transition state machine */
347 typedef enum
348 {
349 PSTSM_DISCARDING,
350 PSTSM_LEARNING,
351 PSTSM_FORWARDING
352 } PSTSM_states_t;
353
354 /* 13.36 Topology Change state machine */
355 typedef enum
356 {
357 TCSM_INACTIVE,
358 TCSM_LEARNING,
359 TCSM_DETECTED,
360 TCSM_NOTIFIED_TCN,
361 TCSM_NOTIFIED_TC,
362 TCSM_PROPAGATING,
363 TCSM_ACKNOWLEDGED,
364 TCSM_ACTIVE
365 } TCSM_states_t;
366
367 /*
368 * Following standard-defined variables are not defined as variables.
369 * Their functionality is implemented indirectly by other means:
370 * - BEGIN, tick, ageingTime.
371 */
372
373 typedef struct
374 {
375 struct list_head list; /* anchor in global list of bridges */
376
377 /* List of all ports */
378 struct list_head ports;
379 /* List of all tree instances, first in list (trees.next) is CIST */
380 struct list_head trees;
381 #define GET_CIST_TREE(br) list_entry((br)->trees.next, tree_t, bridge_list)
382
383 bool bridgeEnabled;
384
385 /* Per-bridge configuration parameters */
386 mst_configuration_identifier_t MstConfigId; /* 13.24.b */
387 protocol_version_t ForceProtocolVersion; /* 13.22.e */
388 __u8 MaxHops; /* 13.22.o */
389 __u8 Forward_Delay; /* 13.22.f */
390 __u8 Max_Age; /* 13.22.i */
391 /* The 802.1Q-2005 (13.22.j) says that this parameter is substituted by
392 * the per-port Hello Time, but we still need it for compatibility
393 * with old STP implementations.
394 */
395 __u8 Hello_Time;
396 unsigned int Transmit_Hold_Count; /* 13.22.g */
397 unsigned int Migrate_Time; /* 13.22.h */
398 unsigned int Ageing_Time; /* 8.8.3 */
399
400 __u16 vid2fid[MAX_VID + 1];
401 __be16 fid2mstid[MAX_FID + 1];
402
403 /* not in standard */
404 unsigned int uptime;
405
406 sysdep_br_data_t sysdeps;
407 } bridge_t;
408
409 typedef struct
410 {
411 struct list_head bridge_list; /* anchor in bridge's list of trees */
412 bridge_t * bridge;
413 __be16 MSTID; /* 0 == CIST */
414
415 /* List of the per-port data structures for this tree instance */
416 struct list_head ports;
417
418 /* 13.23.(c,f,g) Per-bridge per-tree variables */
419 bridge_identifier_t BridgeIdentifier;
420 port_identifier_t rootPortId;
421 port_priority_vector_t rootPriority;
422
423 /* 13.23.d This is totally calculated from BridgeIdentifier */
424 port_priority_vector_t BridgePriority;
425
426 /* 13.23.e Some waste of space here, as MSTIs only use
427 * remainingHops member of the struct times_t,
428 * but saves extra checks and improves readability */
429 times_t BridgeTimes, rootTimes;
430
431 /* 12.8.1.1.3.(b,c,d) */
432 unsigned int time_since_topology_change;
433 unsigned int topology_change_count;
434 bool topology_change;
435 char topology_change_port[IFNAMSIZ];
436 char last_topology_change_port[IFNAMSIZ];
437
438 /* State machines */
439 PRSSM_states_t PRSSM_state;
440
441 } tree_t;
442
443 typedef struct
444 {
445 struct list_head br_list; /* anchor in bridge's list of ports */
446 bridge_t * bridge;
447 __be16 port_number;
448
449 /* List of all tree instances, first in list (trees.next) is CIST.
450 * List is sorted by MSTID (by insertion procedure MSTP_IN_create_msti).
451 */
452 struct list_head trees;
453 #define GET_CIST_PTP_FROM_PORT(prt) \
454 list_entry((prt)->trees.next, per_tree_port_t, port_list)
455
456 /* 13.21.(a,b,c) Per-port timers */
457 unsigned int mdelayWhile, helloWhen, edgeDelayWhile;
458
459 /* 13.24.(b,c,e,f,g,j,k,l,m,n,o,p,q,r,aw) Per-port variables */
460 unsigned int txCount;
461 bool operEdge, portEnabled, infoInternal, rcvdInternal;
462 bool mcheck, rcvdBpdu, rcvdRSTP, rcvdSTP, rcvdTcAck, rcvdTcn, sendRSTP;
463 bool tcAck, newInfo, newInfoMsti;
464
465 /* 6.4.3 */
466 bool operPointToPointMAC;
467
468 /* Per-port configuration parameters */
469 bool restrictedRole, restrictedTcn; /* 13.24.(h,i) */
470 __u32 ExternalPortPathCost; /* 13.22.p */
471 __u32 AdminExternalPortPathCost; /* 0 = calculate from speed */
472 admin_p2p_t AdminP2P; /* 6.4.3 */
473 bool AdminEdgePort; /* 13.22.k */
474 bool AutoEdge; /* 13.22.m */
475 bool BpduGuardPort;
476 bool BpduGuardError;
477 bool NetworkPort;
478 bool BaInconsistent;
479 bool dontTxmtBpdu;
480 bool bpduFilterPort;
481
482 unsigned int rapidAgeingWhile;
483 unsigned int brAssuRcvdInfoWhile;
484
485 /* State machines */
486 PRSM_states_t PRSM_state;
487 PPMSM_states_t PPMSM_state;
488 BDSM_states_t BDSM_state;
489 PTSM_states_t PTSM_state;
490
491 /* Copy of the received BPDU */
492 bpdu_t rcvdBpduData;
493 int rcvdBpduNumOfMstis;
494
495 bool deleted;
496
497 sysdep_if_data_t sysdeps;
498 unsigned int num_rx_bpdu_filtered;
499 unsigned int num_rx_bpdu;
500 unsigned int num_rx_tcn;
501 unsigned int num_tx_bpdu;
502 unsigned int num_tx_tcn;
503 unsigned int num_trans_fwd;
504 unsigned int num_trans_blk;
505 } port_t;
506
507 typedef struct
508 {
509 struct list_head port_list; /* anchor in port's list of trees */
510 struct list_head tree_list; /* anchor in tree's list of per-port data */
511 port_t *port;
512 tree_t *tree;
513 __be16 MSTID; /* 0 == CIST */
514
515 int state; /* BR_STATE_xxx */
516
517 /* 13.21.(d,e,f,g,h) Per-port per-tree timers */
518 unsigned int fdWhile, rrWhile, rbWhile, tcWhile, rcvdInfoWhile;
519
520 /* 13.24.(s,t,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ai,aj,ak,ap,as,at,au,av)
521 * Per-port per-tree variables */
522 bool agree, agreed, disputed, forward, forwarding, learn, learning;
523 port_info_t rcvdInfo;
524 port_info_origin_t infoIs;
525 bool proposed, proposing, rcvdMsg, rcvdTc, reRoot, reselect, selected;
526 bool fdbFlush, tcProp, updtInfo, sync, synced;
527 port_identifier_t portId;
528 port_role_t role, selectedRole;
529
530 /* 13.24.(al,an,aq) Some waste of space here, as MSTIs don't use
531 * RootID and ExtRootPathCost members of the struct port_priority_vector_t,
532 * but saves extra checks and improves readability */
533 port_priority_vector_t designatedPriority, msgPriority, portPriority;
534
535 /* 13.24.(am,ao,ar) Some waste of space here, as MSTIs only use
536 * remainingHops member of the struct times_t,
537 * but saves extra checks and improves readability */
538 times_t designatedTimes, msgTimes, portTimes;
539
540 /* 13.24.(ax,ay) Per-port per-MSTI variables, not applicable to CIST */
541 bool master, mastered;
542
543 /* Per-port per-tree configuration parameters */
544 __u32 InternalPortPathCost; /* 13.22.q */
545 __u32 AdminInternalPortPathCost; /* 0 = calculate from speed */
546
547 /* not in standard, used for calculation of port uptime */
548 unsigned int start_time;
549
550 /* State machines */
551 PISM_states_t PISM_state;
552 PRTSM_states_t PRTSM_state;
553 PSTSM_states_t PSTSM_state;
554 TCSM_states_t TCSM_state;
555
556 /* Auxiliary flag, helps preventing infinite recursion */
557 bool calledFromFlushRoutine;
558
559 /* Pointer to the corresponding MSTI Configuration Message
560 * in the port->rcvdBpduData */
561 msti_configuration_message_t *rcvdMstiConfig;
562 } per_tree_port_t;
563
564 /* External events (inputs) */
565 bool MSTP_IN_bridge_create(bridge_t *br, __u8 *macaddr);
566 bool MSTP_IN_port_create_and_add_tail(port_t *prt, __u16 portno);
567 void MSTP_IN_delete_port(port_t *prt);
568 void MSTP_IN_delete_bridge(bridge_t *br);
569 void MSTP_IN_set_bridge_address(bridge_t *br, __u8 *macaddr);
570 void MSTP_IN_set_bridge_enable(bridge_t *br, bool up);
571 void MSTP_IN_set_port_enable(port_t *prt, bool up, int speed, int duplex);
572 void MSTP_IN_one_second(bridge_t *br);
573 void MSTP_IN_all_fids_flushed(per_tree_port_t *ptp);
574 void MSTP_IN_rx_bpdu(port_t *prt, bpdu_t *bpdu, int size);
575
576 bool MSTP_IN_set_vid2fid(bridge_t *br, __u16 vid, __u16 fid);
577 bool MSTP_IN_set_all_vids2fids(bridge_t *br, __u16 *vids2fids);
578 bool MSTP_IN_set_fid2mstid(bridge_t *br, __u16 fid, __u16 mstid);
579 bool MSTP_IN_set_all_fids2mstids(bridge_t *br, __u16 *fids2mstids);
580 bool MSTP_IN_get_mstilist(bridge_t *br, int *num_mstis, __u16 *mstids);
581 bool MSTP_IN_create_msti(bridge_t *br, __u16 mstid);
582 bool MSTP_IN_delete_msti(bridge_t *br, __u16 mstid);
583 void MSTP_IN_set_mst_config_id(bridge_t *br, __u16 revision, __u8 *name);
584
585 /* External actions (outputs) */
586 void MSTP_OUT_set_state(per_tree_port_t *ptp, int new_state);
587 void MSTP_OUT_flush_all_fids(per_tree_port_t *ptp);
588 void MSTP_OUT_set_ageing_time(port_t *prt, unsigned int ageingTime);
589 void MSTP_OUT_tx_bpdu(port_t *prt, bpdu_t *bpdu, int size);
590 void MSTP_OUT_shutdown_port(port_t *prt);
591
592 /* Structures for communicating with user */
593 /* 12.8.1.1 Read CIST Bridge Protocol Parameters */
594 typedef struct
595 {
596 bridge_identifier_t bridge_id;
597 unsigned int time_since_topology_change;
598 unsigned int topology_change_count;
599 bool topology_change;
600 char topology_change_port[IFNAMSIZ];
601 char last_topology_change_port[IFNAMSIZ];
602 bridge_identifier_t designated_root;
603 unsigned int root_path_cost;
604 port_identifier_t root_port_id;
605 __u8 root_max_age;
606 __u8 root_forward_delay;
607 __u8 bridge_max_age;
608 __u8 bridge_forward_delay;
609 unsigned int tx_hold_count;
610 protocol_version_t protocol_version;
611 bridge_identifier_t regional_root;
612 unsigned int internal_path_cost;
613 bool enabled; /* not in standard */
614 unsigned int Ageing_Time;
615 __u8 max_hops;
616 __u8 bridge_hello_time;
617 } CIST_BridgeStatus;
618
619 void MSTP_IN_get_cist_bridge_status(bridge_t *br, CIST_BridgeStatus *status);
620
621 /* 12.8.1.2 Read MSTI Bridge Protocol Parameters */
622 typedef struct
623 {
624 bridge_identifier_t bridge_id;
625 unsigned int time_since_topology_change;
626 unsigned int topology_change_count;
627 bool topology_change;
628 char topology_change_port[IFNAMSIZ];
629 char last_topology_change_port[IFNAMSIZ];
630 bridge_identifier_t regional_root;
631 unsigned int internal_path_cost;
632 port_identifier_t root_port_id;
633 } MSTI_BridgeStatus;
634
635 void MSTP_IN_get_msti_bridge_status(tree_t *tree, MSTI_BridgeStatus *status);
636
637 /* 12.8.1.3 Set CIST Bridge Protocol Parameters */
638 typedef struct
639 {
640 __u8 bridge_max_age;
641 bool set_bridge_max_age;
642
643 __u8 bridge_forward_delay;
644 bool set_bridge_forward_delay;
645
646 /* Superseded by MSTP_IN_set_msti_bridge_config for the CIST.
647 * __u8 bridge_priority;
648 * bool set_bridge_priority; */
649
650 protocol_version_t protocol_version;
651 bool set_protocol_version;
652
653 unsigned int tx_hold_count;
654 bool set_tx_hold_count;
655
656 __u8 max_hops;
657 bool set_max_hops;
658
659 __u8 bridge_hello_time;
660 bool set_bridge_hello_time;
661
662 unsigned int bridge_ageing_time;
663 bool set_bridge_ageing_time;
664 } CIST_BridgeConfig;
665
666 int MSTP_IN_set_cist_bridge_config(bridge_t *br, CIST_BridgeConfig *cfg);
667
668 /* 12.8.1.4 Set MSTI Bridge Protocol Parameters */
669 /* No need in special structure for single parameter Bridge Priority */
670
671 int MSTP_IN_set_msti_bridge_config(tree_t *tree, __u8 bridge_priority);
672
673 /* 12.8.2.1 Read CIST Port Parameters */
674 typedef struct
675 {
676 unsigned int uptime;
677 int state; /* BR_STATE_xxx */
678 port_identifier_t port_id;
679 __u32 admin_external_port_path_cost; /* not in standard. 0 = auto */
680 __u32 external_port_path_cost;
681 bridge_identifier_t designated_root; /* from portPriority */
682 __u32 designated_external_cost; /* from portPriority */
683 bridge_identifier_t designated_bridge; /* from portPriority */
684 port_identifier_t designated_port; /* from portPriority */
685 bool tc_ack; /* tcAck */
686 __u8 port_hello_time; /* from portTimes */
687 bool admin_edge_port;
688 bool auto_edge_port; /* not in standard */
689 bool oper_edge_port;
690 /* 802.1Q-2005 wants here MAC_Enabled & MAC_Operational. We don't know
691 * neither of these. Return portEnabled and feel happy. */
692 bool enabled;
693 admin_p2p_t admin_p2p;
694 bool oper_p2p;
695 bool restricted_role;
696 bool restricted_tcn;
697 port_role_t role;
698 bool disputed;
699 bridge_identifier_t designated_regional_root; /* from portPriority */
700 __u32 designated_internal_cost; /* from portPriority */
701 __u32 admin_internal_port_path_cost; /* not in standard. 0 = auto */
702 __u32 internal_port_path_cost; /* not in standard */
703 bool bpdu_guard_port;
704 bool bpdu_guard_error;
705 bool bpdu_filter_port;
706 bool network_port;
707 bool ba_inconsistent;
708 unsigned int num_rx_bpdu_filtered;
709 unsigned int num_rx_bpdu;
710 unsigned int num_rx_tcn;
711 unsigned int num_tx_bpdu;
712 unsigned int num_tx_tcn;
713 unsigned int num_trans_fwd;
714 unsigned int num_trans_blk;
715 bool rcvdBpdu;
716 bool rcvdRSTP;
717 bool rcvdSTP;
718 bool rcvdTcAck;
719 bool rcvdTcn;
720 bool sendRSTP;
721 } CIST_PortStatus;
722
723 void MSTP_IN_get_cist_port_status(port_t *prt, CIST_PortStatus *status);
724
725 /* 12.8.2.2 Read MSTI Port Parameters */
726 typedef struct
727 {
728 unsigned int uptime;
729 int state; /* BR_STATE_xxx */
730 port_identifier_t port_id;
731 __u32 admin_internal_port_path_cost; /* not in standard. 0 = auto */
732 __u32 internal_port_path_cost;
733 bridge_identifier_t designated_regional_root; /* from portPriority */
734 __u32 designated_internal_cost; /* from portPriority */
735 bridge_identifier_t designated_bridge; /* from portPriority */
736 port_identifier_t designated_port; /* from portPriority */
737 port_role_t role;
738 bool disputed;
739 } MSTI_PortStatus;
740
741 void MSTP_IN_get_msti_port_status(per_tree_port_t *ptp,
742 MSTI_PortStatus *status);
743
744 /* 12.8.2.3 Set CIST port parameters */
745 typedef struct
746 {
747 __u32 admin_external_port_path_cost; /* not in standard. 0 = auto */
748 bool set_admin_external_port_path_cost;
749
750 /* Superseded by MSTP_IN_set_msti_port_config for the CIST.
751 * __u32 admin_internal_port_path_cost;
752 * bool set_admin_internal_port_path_cost;
753 *
754 * __u8 port_priority;
755 * bool set_port_priority;
756 */
757
758 bool admin_edge_port;
759 bool set_admin_edge_port;
760
761 bool auto_edge_port; /* not in standard */
762 bool set_auto_edge_port;
763
764 admin_p2p_t admin_p2p;
765 bool set_admin_p2p;
766
767 bool restricted_role;
768 bool set_restricted_role;
769
770 bool restricted_tcn;
771 bool set_restricted_tcn;
772
773 bool bpdu_guard_port;
774 bool set_bpdu_guard_port;
775
776 bool network_port;
777 bool set_network_port;
778
779 bool dont_txmt;
780 bool set_dont_txmt;
781
782 bool bpdu_filter_port;
783 bool set_bpdu_filter_port;
784 } CIST_PortConfig;
785
786 int MSTP_IN_set_cist_port_config(port_t *prt, CIST_PortConfig *cfg);
787
788 /* 12.8.2.4 Set MSTI port parameters */
789 typedef struct
790 {
791 __u32 admin_internal_port_path_cost; /* 0 = auto */
792 bool set_admin_internal_port_path_cost;
793
794 __u8 port_priority;
795 bool set_port_priority;
796 } MSTI_PortConfig;
797
798 int MSTP_IN_set_msti_port_config(per_tree_port_t *ptp, MSTI_PortConfig *cfg);
799
800 /* 12.8.2.5 Force BPDU Migration Check */
801 int MSTP_IN_port_mcheck(port_t *prt);
802
803 #endif /* MSTP_H */