2 * mstp.h State machines from IEEE 802.1Q-2005
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.
9 * Authors: Vitalii Demianets <dvitasgs@gmail.com>
15 #include <sys/types.h>
17 #include <libubox/list.h>
19 #include "bridge_ctl.h"
21 /* #define HMAC_MDS_TEST_FUNCTIONS */
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])))))
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 ;)
32 #define assign(x, y) ({ \
33 typeof(x) _assign1 = (x); \
34 typeof(y) _assign2 = (y); \
35 (void)(&_assign1 == &_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)
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 */
53 #define MAX_PORT_NUMBER 4095
56 #define MAX_MSTID 4094
58 /* MAX_xxx_MSTIS: CIST not counted */
59 #define MAX_STANDARD_MSTIS 64
60 #define MAX_IMPLEMENTATION_MSTIS 63
63 #define MAX_PATH_COST 200000000u
71 __u8 mac_address
[ETH_ALEN
];
72 } __attribute__((packed
)) s
;
73 } bridge_identifier_t
;
75 typedef __be16 port_identifier_t
;
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; \
85 #define CONFIGURATION_NAME_LEN 32
86 #define CONFIGURATION_DIGEST_LEN 16
89 __u8 a
[1 + CONFIGURATION_NAME_LEN
+ 2 + CONFIGURATION_DIGEST_LEN
];
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
;
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
;
113 /* not used for MSTIs, only for CIST */
122 /* see bpduFlagOffset_t enum for offsets of flag bits */
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
;
131 } __attribute__((packed
)) msti_configuration_message_t
;
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 */
144 /* TCN BPDU ends here */
145 /* see bpduFlagOffset_t enum for offsets of flag bits */
147 bridge_identifier_t cistRootID
;
148 __be32 cistExtRootPathCost
;
149 bridge_identifier_t cistRRootID
;
150 port_identifier_t cistPortID
;
154 __u8 ForwardDelay
[2];
155 /* Config BPDU ends here */
156 __u8 version1_len
; /* always zero */
157 /* RST BPDU ends here */
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
;
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))
176 SuperiorDesignatedInfo
,
177 RepeatedDesignatedInfo
,
178 InferiorDesignatedInfo
,
179 InferiorRootAlternateInfo
188 } port_info_origin_t
;
202 encodedRoleMaster
= 0,
203 encodedRoleAlternateBackup
= 1,
205 encodedRoleDesignated
= 3
206 } port_encoded_role_t
;
213 } protocol_version_t
;
226 offsetRole
= 2, /* actually, role is coded in two-bit field */
227 offsetRole1
= 3, /* second bit of two-bit role field */
229 offsetForwarding
= 5,
232 /* in MSTI Configuration Message flags bit7 is used for Master flag */
233 #define offsetMaster offsetTcAck
236 #define BPDU_FLAGS_ROLE_SET(role) (((role) & 3) << offsetRole)
237 #define BPDU_FLAGS_ROLE_GET(flags) (((flags) >> offsetRole) & 3)
247 /* 13.28 Port Receive state machine */
254 /* 13.29 Port Protocol Migration state machine */
262 /* 13.30 Bridge Detection state machine */
269 /* 13.31 Port Transmit state machine */
273 PTSM_TRANSMIT_CONFIG
,
276 PTSM_TRANSMIT_PERIODIC
,
280 /* 13.32 Port Information state machine */
281 /* #define PISM_ENABLE_LOG */
287 PISM_SUPERIOR_DESIGNATED
,
288 PISM_REPEATED_DESIGNATED
,
289 PISM_INFERIOR_DESIGNATED
,
296 /* 13.33 Port Role Selection state machine */
303 /* 13.34 Port Role Transitions state machine */
304 /* #define PRTSM_ENABLE_LOG */
307 /* Disabled Port role transitions */
311 /* MasterPort role transitions */
312 PRTSM_MASTER_PROPOSED
,
315 PRTSM_MASTER_RETIRED
,
316 PRTSM_MASTER_FORWARD
,
318 PRTSM_MASTER_DISCARD
,
320 /* RootPort role transitions */
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 */
341 PRTSM_ALTERNATE_PROPOSED
,
342 PRTSM_ALTERNATE_AGREED
,
346 /* 13.35 Port State Transition state machine */
354 /* 13.36 Topology Change state machine */
368 * Following standard-defined variables are not defined as variables.
369 * Their functionality is implemented indirectly by other means:
370 * - BEGIN, tick, ageingTime.
375 struct list_head list
; /* anchor in global list of bridges */
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)
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.
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 */
400 __u16 vid2fid
[MAX_VID
+ 1];
401 __be16 fid2mstid
[MAX_FID
+ 1];
403 /* not in standard */
406 sysdep_br_data_t sysdeps
;
411 struct list_head bridge_list
; /* anchor in bridge's list of trees */
413 __be16 MSTID
; /* 0 == CIST */
415 /* List of the per-port data structures for this tree instance */
416 struct list_head ports
;
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
;
423 /* 13.23.d This is totally calculated from BridgeIdentifier */
424 port_priority_vector_t BridgePriority
;
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
;
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
];
439 PRSSM_states_t PRSSM_state
;
445 struct list_head br_list
; /* anchor in bridge's list of ports */
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).
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)
456 /* 13.21.(a,b,c) Per-port timers */
457 unsigned int mdelayWhile
, helloWhen
, edgeDelayWhile
;
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
;
466 bool operPointToPointMAC
;
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 */
482 unsigned int rapidAgeingWhile
;
483 unsigned int brAssuRcvdInfoWhile
;
486 PRSM_states_t PRSM_state
;
487 PPMSM_states_t PPMSM_state
;
488 BDSM_states_t BDSM_state
;
489 PTSM_states_t PTSM_state
;
491 /* Copy of the received BPDU */
493 int rcvdBpduNumOfMstis
;
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
;
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 */
513 __be16 MSTID
; /* 0 == CIST */
515 int state
; /* BR_STATE_xxx */
517 /* 13.21.(d,e,f,g,h) Per-port per-tree timers */
518 unsigned int fdWhile
, rrWhile
, rbWhile
, tcWhile
, rcvdInfoWhile
;
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
;
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
;
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
;
540 /* 13.24.(ax,ay) Per-port per-MSTI variables, not applicable to CIST */
541 bool master
, mastered
;
543 /* Per-port per-tree configuration parameters */
544 __u32 InternalPortPathCost
; /* 13.22.q */
545 __u32 AdminInternalPortPathCost
; /* 0 = calculate from speed */
547 /* not in standard, used for calculation of port uptime */
548 unsigned int start_time
;
551 PISM_states_t PISM_state
;
552 PRTSM_states_t PRTSM_state
;
553 PSTSM_states_t PSTSM_state
;
554 TCSM_states_t TCSM_state
;
556 /* Auxiliary flag, helps preventing infinite recursion */
557 bool calledFromFlushRoutine
;
559 /* Pointer to the corresponding MSTI Configuration Message
560 * in the port->rcvdBpduData */
561 msti_configuration_message_t
*rcvdMstiConfig
;
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
);
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
);
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
);
592 /* Structures for communicating with user */
593 /* 12.8.1.1 Read CIST Bridge Protocol Parameters */
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
;
606 __u8 root_forward_delay
;
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
;
616 __u8 bridge_hello_time
;
619 void MSTP_IN_get_cist_bridge_status(bridge_t
*br
, CIST_BridgeStatus
*status
);
621 /* 12.8.1.2 Read MSTI Bridge Protocol Parameters */
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
;
635 void MSTP_IN_get_msti_bridge_status(tree_t
*tree
, MSTI_BridgeStatus
*status
);
637 /* 12.8.1.3 Set CIST Bridge Protocol Parameters */
641 bool set_bridge_max_age
;
643 __u8 bridge_forward_delay
;
644 bool set_bridge_forward_delay
;
646 /* Superseded by MSTP_IN_set_msti_bridge_config for the CIST.
647 * __u8 bridge_priority;
648 * bool set_bridge_priority; */
650 protocol_version_t protocol_version
;
651 bool set_protocol_version
;
653 unsigned int tx_hold_count
;
654 bool set_tx_hold_count
;
659 __u8 bridge_hello_time
;
660 bool set_bridge_hello_time
;
662 unsigned int bridge_ageing_time
;
663 bool set_bridge_ageing_time
;
666 int MSTP_IN_set_cist_bridge_config(bridge_t
*br
, CIST_BridgeConfig
*cfg
);
668 /* 12.8.1.4 Set MSTI Bridge Protocol Parameters */
669 /* No need in special structure for single parameter Bridge Priority */
671 int MSTP_IN_set_msti_bridge_config(tree_t
*tree
, __u8 bridge_priority
);
673 /* 12.8.2.1 Read CIST Port Parameters */
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 */
690 /* 802.1Q-2005 wants here MAC_Enabled & MAC_Operational. We don't know
691 * neither of these. Return portEnabled and feel happy. */
693 admin_p2p_t admin_p2p
;
695 bool restricted_role
;
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
;
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
;
723 void MSTP_IN_get_cist_port_status(port_t
*prt
, CIST_PortStatus
*status
);
725 /* 12.8.2.2 Read MSTI Port Parameters */
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 */
741 void MSTP_IN_get_msti_port_status(per_tree_port_t
*ptp
,
742 MSTI_PortStatus
*status
);
744 /* 12.8.2.3 Set CIST port parameters */
747 __u32 admin_external_port_path_cost
; /* not in standard. 0 = auto */
748 bool set_admin_external_port_path_cost
;
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;
754 * __u8 port_priority;
755 * bool set_port_priority;
758 bool admin_edge_port
;
759 bool set_admin_edge_port
;
761 bool auto_edge_port
; /* not in standard */
762 bool set_auto_edge_port
;
764 admin_p2p_t admin_p2p
;
767 bool restricted_role
;
768 bool set_restricted_role
;
771 bool set_restricted_tcn
;
773 bool bpdu_guard_port
;
774 bool set_bpdu_guard_port
;
777 bool set_network_port
;
782 bool bpdu_filter_port
;
783 bool set_bpdu_filter_port
;
786 int MSTP_IN_set_cist_port_config(port_t
*prt
, CIST_PortConfig
*cfg
);
788 /* 12.8.2.4 Set MSTI port parameters */
791 __u32 admin_internal_port_path_cost
; /* 0 = auto */
792 bool set_admin_internal_port_path_cost
;
795 bool set_port_priority
;
798 int MSTP_IN_set_msti_port_config(per_tree_port_t
*ptp
, MSTI_PortConfig
*cfg
);
800 /* 12.8.2.5 Force BPDU Migration Check */
801 int MSTP_IN_port_mcheck(port_t
*prt
);