2 * Copyright (c) 2011-2015 M3S, Srl - Italy
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * Rapid Spanning Tree Protocol (IEEE 802.1D-2004) common header file.
21 * Martino Fornasa <mf@fornasa.it>
22 * Daniele Venturino <daniele.venturino@m3s.it>
23 * Carlo Andreotti <c.andreotti@m3s.it>
25 * References to IEEE 802.1D-2004 standard are enclosed in square brackets.
26 * E.g. [17.3], [Table 17-1], etc.
31 #define RSTP_COMMON_H 1
36 #include "openvswitch/hmap.h"
37 #include "openvswitch/list.h"
38 #include "ovs-atomic.h"
41 enum admin_port_state
{
42 RSTP_ADMIN_BRIDGE_PORT_STATE_DISABLED
= 0,
43 RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED
= 1
46 enum oper_p2p_mac_state
{
47 RSTP_OPER_P2P_MAC_STATE_DISABLED
= 0,
48 RSTP_OPER_P2P_MAC_STATE_ENABLED
= 1
51 /* State enumerations for state machines defined in rstp-state-machines.c */
52 enum port_receive_state_machine
{
54 PORT_RECEIVE_SM_DISCARD_EXEC
,
55 PORT_RECEIVE_SM_DISCARD
,
56 PORT_RECEIVE_SM_RECEIVE_EXEC
,
57 PORT_RECEIVE_SM_RECEIVE
59 enum port_transmit_state_machine
{
60 PORT_TRANSMIT_SM_INIT
,
61 PORT_TRANSMIT_SM_TRANSMIT_INIT_EXEC
,
62 PORT_TRANSMIT_SM_TRANSMIT_INIT
,
63 PORT_TRANSMIT_SM_TRANSMIT_PERIODIC_EXEC
,
64 PORT_TRANSMIT_SM_TRANSMIT_PERIODIC
,
65 PORT_TRANSMIT_SM_IDLE_EXEC
,
66 PORT_TRANSMIT_SM_IDLE
,
67 PORT_TRANSMIT_SM_TRANSMIT_CONFIG_EXEC
,
68 PORT_TRANSMIT_SM_TRANSMIT_CONFIG
,
69 PORT_TRANSMIT_SM_TRANSMIT_TCN_EXEC
,
70 PORT_TRANSMIT_SM_TRANSMIT_TCN
,
71 PORT_TRANSMIT_SM_TRANSMIT_RSTP_EXEC
,
72 PORT_TRANSMIT_SM_TRANSMIT_RSTP
74 enum bridge_detection_state_machine
{
75 BRIDGE_DETECTION_SM_INIT
,
76 BRIDGE_DETECTION_SM_EDGE_EXEC
,
77 BRIDGE_DETECTION_SM_EDGE
,
78 BRIDGE_DETECTION_SM_NOT_EDGE_EXEC
,
79 BRIDGE_DETECTION_SM_NOT_EDGE
81 enum port_protocol_migration_state_machine
{
82 PORT_PROTOCOL_MIGRATION_SM_INIT
,
83 PORT_PROTOCOL_MIGRATION_SM_CHECKING_RSTP_EXEC
,
84 PORT_PROTOCOL_MIGRATION_SM_CHECKING_RSTP
,
85 PORT_PROTOCOL_MIGRATION_SM_SELECTING_STP_EXEC
,
86 PORT_PROTOCOL_MIGRATION_SM_SELECTING_STP
,
87 PORT_PROTOCOL_MIGRATION_SM_SENSING_EXEC
,
88 PORT_PROTOCOL_MIGRATION_SM_SENSING
90 enum port_information_state_machine
{
91 PORT_INFORMATION_SM_INIT
,
92 PORT_INFORMATION_SM_DISABLED_EXEC
,
93 PORT_INFORMATION_SM_DISABLED
,
94 PORT_INFORMATION_SM_AGED_EXEC
,
95 PORT_INFORMATION_SM_AGED
,
96 PORT_INFORMATION_SM_UPDATE_EXEC
,
97 PORT_INFORMATION_SM_UPDATE
,
98 PORT_INFORMATION_SM_CURRENT_EXEC
,
99 PORT_INFORMATION_SM_CURRENT
,
100 PORT_INFORMATION_SM_RECEIVE_EXEC
,
101 PORT_INFORMATION_SM_RECEIVE
,
102 PORT_INFORMATION_SM_OTHER_EXEC
,
103 PORT_INFORMATION_SM_OTHER
,
104 PORT_INFORMATION_SM_NOT_DESIGNATED_EXEC
,
105 PORT_INFORMATION_SM_NOT_DESIGNATED
,
106 PORT_INFORMATION_SM_INFERIOR_DESIGNATED_EXEC
,
107 PORT_INFORMATION_SM_INFERIOR_DESIGNATED
,
108 PORT_INFORMATION_SM_REPEATED_DESIGNATED_EXEC
,
109 PORT_INFORMATION_SM_REPEATED_DESIGNATED
,
110 PORT_INFORMATION_SM_SUPERIOR_DESIGNATED_EXEC
,
111 PORT_INFORMATION_SM_SUPERIOR_DESIGNATED
113 enum port_role_selection_state_machine
{
114 PORT_ROLE_SELECTION_SM_INIT
,
115 PORT_ROLE_SELECTION_SM_INIT_BRIDGE_EXEC
,
116 PORT_ROLE_SELECTION_SM_INIT_BRIDGE
,
117 PORT_ROLE_SELECTION_SM_ROLE_SELECTION_EXEC
,
118 PORT_ROLE_SELECTION_SM_ROLE_SELECTION
120 enum port_role_transition_state_machine
{
121 PORT_ROLE_TRANSITION_SM_INIT
,
122 PORT_ROLE_TRANSITION_SM_INIT_PORT_EXEC
,
123 PORT_ROLE_TRANSITION_SM_DISABLE_PORT_EXEC
,
124 PORT_ROLE_TRANSITION_SM_DISABLE_PORT
,
125 PORT_ROLE_TRANSITION_SM_DISABLED_PORT_EXEC
,
126 PORT_ROLE_TRANSITION_SM_DISABLED_PORT
,
127 PORT_ROLE_TRANSITION_SM_ROOT_PORT_EXEC
,
128 PORT_ROLE_TRANSITION_SM_ROOT_PORT
,
129 PORT_ROLE_TRANSITION_SM_REROOT_EXEC
,
130 PORT_ROLE_TRANSITION_SM_ROOT_AGREED_EXEC
,
131 PORT_ROLE_TRANSITION_SM_ROOT_PROPOSED_EXEC
,
132 PORT_ROLE_TRANSITION_SM_ROOT_FORWARD_EXEC
,
133 PORT_ROLE_TRANSITION_SM_ROOT_LEARN_EXEC
,
134 PORT_ROLE_TRANSITION_SM_REROOTED_EXEC
,
135 PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC
,
136 PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT
,
137 PORT_ROLE_TRANSITION_SM_DESIGNATED_RETIRED_EXEC
,
138 PORT_ROLE_TRANSITION_SM_DESIGNATED_SYNCED_EXEC
,
139 PORT_ROLE_TRANSITION_SM_DESIGNATED_PROPOSE_EXEC
,
140 PORT_ROLE_TRANSITION_SM_DESIGNATED_FORWARD_EXEC
,
141 PORT_ROLE_TRANSITION_SM_DESIGNATED_LEARN_EXEC
,
142 PORT_ROLE_TRANSITION_SM_DESIGNATED_DISCARD_EXEC
,
143 PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT_EXEC
,
144 PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT
,
145 PORT_ROLE_TRANSITION_SM_ALTERNATE_AGREED_EXEC
,
146 PORT_ROLE_TRANSITION_SM_ALTERNATE_PROPOSED_EXEC
,
147 PORT_ROLE_TRANSITION_SM_BLOCK_PORT_EXEC
,
148 PORT_ROLE_TRANSITION_SM_BLOCK_PORT
,
149 PORT_ROLE_TRANSITION_SM_BACKUP_PORT_EXEC
151 enum port_state_transition_state_machine
{
152 PORT_STATE_TRANSITION_SM_INIT
,
153 PORT_STATE_TRANSITION_SM_DISCARDING_EXEC
,
154 PORT_STATE_TRANSITION_SM_DISCARDING
,
155 PORT_STATE_TRANSITION_SM_LEARNING_EXEC
,
156 PORT_STATE_TRANSITION_SM_LEARNING
,
157 PORT_STATE_TRANSITION_SM_FORWARDING_EXEC
,
158 PORT_STATE_TRANSITION_SM_FORWARDING
160 enum topology_change_state_machine
{
161 TOPOLOGY_CHANGE_SM_INIT
,
162 TOPOLOGY_CHANGE_SM_INACTIVE_EXEC
,
163 TOPOLOGY_CHANGE_SM_INACTIVE
,
164 TOPOLOGY_CHANGE_SM_LEARNING_EXEC
,
165 TOPOLOGY_CHANGE_SM_LEARNING
,
166 TOPOLOGY_CHANGE_SM_DETECTED_EXEC
,
167 TOPOLOGY_CHANGE_SM_ACTIVE_EXEC
,
168 TOPOLOGY_CHANGE_SM_ACTIVE
,
169 TOPOLOGY_CHANGE_SM_ACKNOWLEDGED_EXEC
,
170 TOPOLOGY_CHANGE_SM_PROPAGATING_EXEC
,
171 TOPOLOGY_CHANGE_SM_NOTIFIED_TC_EXEC
,
172 TOPOLOGY_CHANGE_SM_NOTIFIED_TCN_EXEC
,
176 /* [17.18.4, 17.13, Table 17-1]. */
178 /* [17.13.5 - Bridge Forward Delay] The delay (expressed in seconds) used
179 * by STP Bridges (17.4) to transition Root and Designated Ports to
180 * Forwarding (Table 17-1).
181 * Default = 15.0 s. Values in range 4.0 - 30.0
183 uint16_t forward_delay
;
185 /* [17.13.6 - Bridge Hello Time]
186 * The interval between periodic transmissions of Configuration Messages
187 * by Designated Ports (Table 17-1).
188 * Default = 2.0 s. Fixed value
192 /* [17.13.8 - Bridge Max Age]
193 * The maximum age of the information transmitted by the Bridge when it is
194 * the Root Bridge (Table 17-1).
195 * Default = 20.0 s. Values in range 6.0 - 40.0 */
198 uint16_t message_age
;
201 /* Priority vector [17.6] */
202 struct rstp_priority_vector
{
203 rstp_identifier root_bridge_id
;
204 uint32_t root_path_cost
;
205 rstp_identifier designated_bridge_id
;
206 uint16_t designated_port_id
;
207 uint16_t bridge_port_id
;
210 enum rstp_bpdu_type
{
211 CONFIGURATION_BPDU
= 0x0,
212 TOPOLOGY_CHANGE_NOTIFICATION_BPDU
= 0x80,
213 RAPID_SPANNING_TREE_BPDU
= 0x2
216 enum rstp_bpdu_flag
{
217 BPDU_FLAG_TOPCHANGE
= 0x01,
218 BPDU_FLAG_PROPOSAL
= 0x02,
219 BPDU_FLAG_LEARNING
= 0x10,
220 BPDU_FLAG_FORWARDING
= 0x20,
221 BPDU_FLAG_AGREEMENT
= 0x40,
222 BPDU_FLAG_TOPCHANGEACK
= 0x80
225 /* Rapid Spanning Tree BPDU [9.3.3] */
228 ovs_be16 protocol_identifier
;
229 uint8_t protocol_version_identifier
;
232 ovs_be64 root_bridge_id
;
233 ovs_be32 root_path_cost
;
234 ovs_be64 designated_bridge_id
;
235 ovs_be16 designated_port_id
;
236 ovs_be16 message_age
;
239 ovs_be16 forward_delay
;
240 uint8_t version1_length
;
251 enum rstp_rcvd_info
{
252 SUPERIOR_DESIGNATED_INFO
,
253 REPEATED_DESIGNATED_INFO
,
254 INFERIOR_DESIGNATED_INFO
,
255 INFERIOR_ROOT_ALTERNATE_INFO
,
260 struct ovs_refcount ref_cnt
;
262 struct rstp
*rstp
OVS_GUARDED_BY(rstp_mutex
);
263 struct hmap_node node
OVS_GUARDED_BY(rstp_mutex
); /* In rstp->ports. */
264 void *aux
OVS_GUARDED_BY(rstp_mutex
);
266 struct rstp_bpdu received_bpdu_buffer
OVS_GUARDED_BY(rstp_mutex
);
267 /*************************************************************************
268 * MAC status parameters
269 ************************************************************************/
270 /* [6.4.2 - MAC_Operational]
271 * The value of this parameter is TRUE if [...] the MAC entity can be used
272 * to transmit and/or receive frames, and its use is permitted by
275 bool mac_operational
OVS_GUARDED_BY(rstp_mutex
);
277 /* [14.8.2.2] Administrative Bridge Port State */
278 bool is_administrative_bridge_port
OVS_GUARDED_BY(rstp_mutex
);
280 /* [6.4.3 - operPointToPointMAC]
281 * a) True. The MAC is connected to a point-to-point LAN; i.e., there is
282 * at most one other system attached to the LAN.
283 * b) False. The MAC is connected to a non-point-to-point LAN; i.e.,
284 * there can be more than one other system attached to the LAN.
286 * If adminPointToPointMAC is set to ForceTrue, then operPointToPointMAC
287 * shall be set True. If adminPointToPointMAC is set to ForceFalse, then
288 * operPointToPointMAC shall be set False.
290 bool oper_point_to_point_mac
OVS_GUARDED_BY(rstp_mutex
);
292 /* [6.4.3 - adminPointToPointMAC]
293 * a) ForceTrue. The administrator requires the MAC to be treated as if it
294 * is connected to a point-to-point LAN, regardless of any indications
295 * to the contrary that are generated by the MAC entity.
296 * b) ForceFalse. The administrator requires the MAC to be treated as
297 * connected to a non-point-to-point LAN, regardless of any indications
298 * to the contrary that are generated by the MAC entity.
299 * c) Auto. The administrator requires the point-to-point status of the
300 * MAC to be determined in accordance with the specific MAC procedures
303 enum rstp_admin_point_to_point_mac_state admin_point_to_point_mac
OVS_GUARDED_BY(rstp_mutex
);
306 /*************************************************************************
307 * [17.3 - RSTP performance parameters] Set by management actions on the
309 *************************************************************************/
311 /* [17.13.1 - Admin Edge Port]
312 * The AdminEdgePort parameter for the Port (14.8.2).
314 bool admin_edge
OVS_GUARDED_BY(rstp_mutex
);
316 /* [17.13.3 - AutoEdge]
317 * The AutoEdgePort parameter for the Port (14.8.2).
319 bool auto_edge
OVS_GUARDED_BY(rstp_mutex
);
322 /*************************************************************************
323 * The following variables are set by management actions on the bridge
324 ************************************************************************/
326 /* Port number and priority
327 * >=1 (max 12 bits [9.2.7])
329 uint16_t port_number
OVS_GUARDED_BY(rstp_mutex
);
332 * Range: 0-240 in steps of 16 (table 17-2)
334 uint8_t priority
OVS_GUARDED_BY(rstp_mutex
);
336 /* [17.13.11 - PortPathCost]
337 * The Port's contribution, when it is the Root Port, to the Root Path Cost
338 * (17.3.1, 17.5, 17.6) for the Bridge.
340 uint32_t port_path_cost
OVS_GUARDED_BY(rstp_mutex
);
342 /*************************************************************************
343 * The following variables are defined in [17.17 - State machine timers]
344 ************************************************************************/
345 /* [17.17.1 - edgeDelayWhile]
346 * The Edge Delay timer. The time remaining, in the absence of a received
347 * BPDU, before this port is identified as an operEdgePort.
349 uint16_t edge_delay_while
OVS_GUARDED_BY(rstp_mutex
);
351 /* [17.17.2 - fdWhile]
352 * The Forward Delay timer. Used to delay Port State transitions until
353 * other Bridges have received spanning tree information.
355 uint16_t fd_while
OVS_GUARDED_BY(rstp_mutex
);
357 /* [17.17.3 - helloWhen]
358 * The Hello timer. Used to ensure that at least one BPDU is transmitted by
359 * a Designated Port in each HelloTime period.
361 uint16_t hello_when
OVS_GUARDED_BY(rstp_mutex
);
363 /* [17.17.4 - mdelayWhile]
364 * The Migration Delay timer. Used by the Port Protocol Migration state
365 * machine to allow time for another RSTP Bridge on the same LAN to
366 * synchronize its migration state with this Port before the receipt of a
367 * BPDU can cause this Port to change the BPDU types it transmits.
368 * Initialized to MigrateTime (17.13.9).
370 uint16_t mdelay_while
OVS_GUARDED_BY(rstp_mutex
);
372 /* [17.17.5 - rbWhile]
373 * The Recent Backup timer. Maintained at its initial value, twice
374 * HelloTime, while the Port is a Backup Port.
376 uint16_t rb_while
OVS_GUARDED_BY(rstp_mutex
);
378 /* [17.17.6 - rcvdInfoWhile]
379 * The Received Info timer. The time remaining before the spanning tree
380 * information received by this Port [portPriority (17.19.21) and portTimes
381 * (17.19.22)] is aged out if not refreshed by the receipt of a further
382 * Configuration Message.
384 uint16_t rcvd_info_while
OVS_GUARDED_BY(rstp_mutex
);
386 /* [17.17.7 - rrWhile]
387 * The Recent Root timer.
389 uint16_t rr_while
OVS_GUARDED_BY(rstp_mutex
);
391 /* [17.17.8 - tcWhile]
392 * The Topology Change timer. TCN Messages are sent while this timer is
395 uint16_t tc_while
OVS_GUARDED_BY(rstp_mutex
);
398 /*************************************************************************
399 * The following variables are defined in [17.19 - Per-Port variables]
400 ************************************************************************/
402 /* [17.19.1 - ageingTime]
403 * Filtering database entries for this Port are aged out after ageingTime
404 * has elapsed since they were first created or refreshed by the Learning
406 * The value of this parameter is normally Ageing Time (7.9.2, Table 7-5),
407 * and is changed to FwdDelay (17.20.6) for a period of FwdDelay after
408 * fdbFlush (17.19.7) is set by the topology change state machine if
409 * stpVersion (17.19.7) is TRUE.
411 uint32_t ageing_time
OVS_GUARDED_BY(rstp_mutex
);
414 * Set if synced is set for all other Ports. An RST BPDU with the Agreement
415 * flag set is transmitted and proposed is reset when agree is first set,
416 * and when proposed is set.
417 * Initialized by Port Information state machine.
419 bool agree
OVS_GUARDED_BY(rstp_mutex
);
421 /* [17.19.3 - agreed]
422 * Set when an RST BPDU is received with a Port Role of Root, Alternate, or
423 * Backup Port, the Agreement flag set, and a message priority the same or
424 * worse than the port priority. When agreed is set, the Designated Port
425 * knows that its neighbouring Bridge has confirmed that it can proceed to
426 * the Forwarding state without further delay.
427 * Initialized by Port Information state machine.
429 bool agreed
OVS_GUARDED_BY(rstp_mutex
);
431 /* [17.19.4 - designatedPriority]
432 * The first four components of the Port's designated priority vector
433 * value, as defined in 17.6. The fifth component of the designated
434 * priority vector value is portId (17.19.19).
435 * (Fifth component of the structure must not be used)
437 struct rstp_priority_vector designated_priority_vector
OVS_GUARDED_BY(rstp_mutex
);
439 /* [17.19.5 - designatedTimes]
440 * The designatedTimes variable comprises the set of timer parameter values
441 * (Message Age, Max Age, Forward Delay, and Hello Time) that used to
442 * update Port Times when updtInfo is set. Updated by the updtRolesTree()
443 * procedure (17.21.25).
445 struct rstp_times designated_times
OVS_GUARDED_BY(rstp_mutex
);
447 /* [17.19.6 - disputed] */
448 bool disputed
OVS_GUARDED_BY(rstp_mutex
);
450 /* [17.19.7 - fdbFlush]
451 * A boolean. Set by the topology change state machine to instruct the
452 * filtering database to remove all entries for this Port, immediately if
453 * rstpVersion (17.20.11) is TRUE, or by rapid ageing (17.19.1) if
454 * stpVersion (17.20.12) is TRUE. Reset by the filtering database once the
456 * removed if rstpVersion is TRUE, and immediately if stpVersion is TRUE.
458 uint8_t fdb_flush
OVS_GUARDED_BY(rstp_mutex
);
460 /* [17.19.8 - forward]
461 * Initialized by Port State Transition state machine.
463 bool forward
OVS_GUARDED_BY(rstp_mutex
);
465 /* [17.19.9 - forwarding]
466 * Initialized by Port State Transition state machine.
468 bool forwarding
OVS_GUARDED_BY(rstp_mutex
);
470 /* [17.19.10 - infoIs]
471 * A variable that takes the values Mine, Aged, Received, or Disabled, to
472 * indicate the origin/state of the Port's Spanning Tree information
473 * (portInfo) held for the Port, as follows:
474 * a) If infoIs is Received, the port has received current (not aged out)
475 * information from the Designated Bridge for the attached LAN (a
476 * point-to-point bridge link being a special case of a LAN).
477 * b) If infoIs is Mine, information for the port has been derived from
478 * the Root Port for the Bridge (with the addition of root port cost
479 * information). This includes the possibility that the Root Port is
480 * "Port 0," i.e., the bridge is the Root Bridge for the Bridged Local
482 * c) If infoIs is Aged, information from the Root Bridge has been aged
483 * out. Just as for "reselect" (see 17.19.34), the state machine does
484 * not formally allow the "Aged" state to persist. However, if there is
485 * a delay in recomputing the new root port, correct processing of a
486 * received BPDU is specified.
487 * d) Finally if the port is disabled, infoIs is Disabled.
489 enum rstp_info_is info_is
OVS_GUARDED_BY(rstp_mutex
);
491 /* [17.19.11 - learn]
492 * Initialized by Port State Transition state machine.
494 bool learn
OVS_GUARDED_BY(rstp_mutex
);
496 /* [17.19.12 - learning]
497 * Initialized by Port State Transition state machine.
499 bool learning
OVS_GUARDED_BY(rstp_mutex
);
501 /* [17.19.13 - mcheck]
502 * A boolean. May be set by management to force the Port Protocol Migration
503 * state machine to transmit RST BPDUs for a MigrateTime (17.13.9) period,
504 * to test whether all STP Bridges (17.4) on the attached LAN have been
505 * removed and the Port can continue to transmit RSTP BPDUs. Setting mcheck
506 * has no effect if stpVersion (17.20.12) is TRUE, i.e., the Bridge is
507 * operating in STP Compatibility mode.
509 bool mcheck
OVS_GUARDED_BY(rstp_mutex
);
511 /* [17.19.14 - msgPriority]
512 * The first four components of the message priority vector conveyed in a
513 * received BPDU, as defined in 17.6.
514 * (Fifth component of the structure must not be used).
516 struct rstp_priority_vector msg_priority
OVS_GUARDED_BY(rstp_mutex
);
518 /* [17.19.15 - msgTimes]
519 * The msgTimes variable comprises the timer parameter values (Message Age,
520 * Max Age, Forward Delay, and Hello Time) conveyed in a received BPDU.
522 struct rstp_times msg_times
OVS_GUARDED_BY(rstp_mutex
);
524 /* [17.19.16 - newInfo]
525 * A boolean. Set if a BPDU is to be transmitted. Reset by the Port
526 * Transmit state machine.
528 bool new_info
OVS_GUARDED_BY(rstp_mutex
);
530 /* [17.19.17 - operEdge]
531 * A boolean. The value of the operEdgePort parameter, as determined by the
532 * operation of the Bridge Detection state machine (17.25).
534 bool oper_edge
OVS_GUARDED_BY(rstp_mutex
);
536 /* [17.19.18 - portEnabled]
537 * A boolean. Set if the Bridge's MAC Relay Entity and Spanning Tree
538 * Protocol Entity can use the MAC Service provided by the Port's MAC
539 * entity to transmit and receive frames to and from the attached LAN,
540 * i.e., portEnabled is TRUE if and only if:
541 * a) MAC_Operational (6.4.2) is TRUE; and
542 * b) Administrative Bridge Port State (14.8.2.2) for the Port is
544 * c) AuthControlledPortStatus is Authorized [if the port is a network
545 * access port (IEEE Std 802.1X)].
547 bool port_enabled
OVS_GUARDED_BY(rstp_mutex
);
549 /* [17.19.19 - portId]
550 * The Port Identifier. This variable forms the fifth component of the port
551 * priority and designated priority vectors defined in 17.6.
553 uint16_t port_id
OVS_GUARDED_BY(rstp_mutex
);
555 /* [17.19.21 - portPriority]
556 * The first four components of the Port's port priority vector value, as
558 * (Fifth component of the structure must not be used)
560 struct rstp_priority_vector port_priority
OVS_GUARDED_BY(rstp_mutex
);
562 /* [17.19.22 - portTimes]
563 * The portTimes variable comprises the Port's timer parameter values
564 * (Message Age, Max Age, Forward Delay, and Hello Time). These timer
565 * values are used in BPDUs transmitted from the Port.
567 struct rstp_times port_times
OVS_GUARDED_BY(rstp_mutex
);
569 /* [17.19.23 - proposed]
570 * Set when an RST BPDU with a Designated Port role and the Proposal flag
571 * set is received. If agree is not set, proposed causes sync to be set for
572 * all other Ports.of the Bridge.
574 bool proposed
OVS_GUARDED_BY(rstp_mutex
);
576 /* [17.19.24 - proposing]
577 * Set by a Designated Port that is not Forwarding, and conveyed to the
578 * Root Port or Alternate Port of a neighboring Bridge in the Proposal flag
579 * of an RST BPDU (9.3.3).
581 bool proposing
OVS_GUARDED_BY(rstp_mutex
);
583 /* [17.19.25 - rcvdBPDU]
584 * A boolean. Set by system dependent processes, this variable notifies the
585 * Port Receive state machine (17.23) when a valid (9.3.4) Configuration,
586 * TCN, or RST BPDU (9.3.1, 9.3.2, 9.3.3) is received on the Port. Reset
587 * by the Port Receive state machine.
589 bool rcvd_bpdu
OVS_GUARDED_BY(rstp_mutex
);
591 /* [17.19.26 - rcvdInfo]
592 * Set to the result of the rcvInfo() procedure (17.21.8).
594 enum rstp_rcvd_info rcvd_info
OVS_GUARDED_BY(rstp_mutex
);
596 /* [17.19.27 - rcvdMsg] */
597 bool rcvd_msg
OVS_GUARDED_BY(rstp_mutex
);
599 /* [17.19.28 - rcvdRSTP] */
600 bool rcvd_rstp
OVS_GUARDED_BY(rstp_mutex
);
602 /* [17.19.29 - rcvdSTP] */
603 bool rcvd_stp
OVS_GUARDED_BY(rstp_mutex
);
605 /* [17.19.30 - rcvdTc] */
606 bool rcvd_tc
OVS_GUARDED_BY(rstp_mutex
);
608 /* [17.19.31 - rcvdTcAck] */
609 bool rcvd_tc_ack
OVS_GUARDED_BY(rstp_mutex
);
611 /* [17.19.32 - rcvdTcn] */
612 bool rcvd_tcn
OVS_GUARDED_BY(rstp_mutex
);
614 /* [17.19.33 - reRoot] */
615 bool re_root
OVS_GUARDED_BY(rstp_mutex
);
617 /* [17.19.34 - reselect] */
618 bool reselect
OVS_GUARDED_BY(rstp_mutex
);
621 * The assigned Port Role (17.7).
623 enum rstp_port_role role
OVS_GUARDED_BY(rstp_mutex
);
625 /* [17.19.36 - selected]
626 * A boolean. See 17.28, 17.21.16.
628 bool selected
OVS_GUARDED_BY(rstp_mutex
);
630 /* [17.19.37 - selectedRole]
631 * The newly computed role for the Port (17.7, 17.28, 17.21.25, 17.19.35).
633 enum rstp_port_role selected_role
OVS_GUARDED_BY(rstp_mutex
);
635 /* [17.19.38 - sendRSTP]
636 * A boolean. See 17.24, 17.26.
638 bool send_rstp
OVS_GUARDED_BY(rstp_mutex
);
641 * A boolean. See 17.10.
643 bool sync
OVS_GUARDED_BY(rstp_mutex
);
645 /* [17.19.40 - synced]
646 * A boolean. See 17.10.
648 bool synced
OVS_GUARDED_BY(rstp_mutex
);
650 /* [17.19.41 - tcAck]
651 * A boolean. Set if a Configuration Message with a topology change
652 * acknowledge flag set is to be transmitted.
654 bool tc_ack
OVS_GUARDED_BY(rstp_mutex
);
656 /* [17.19.42 - tcProp]
657 * A boolean. Set by the Topology Change state machine of any other Port,
658 * to indicate that a topology change should be propagated through this
661 bool tc_prop
OVS_GUARDED_BY(rstp_mutex
);
664 * A boolean. See 17.22.
666 bool tick
OVS_GUARDED_BY(rstp_mutex
);
668 /* [17.19.44 - txCount]
669 * A counter. Incremented by the Port Transmission (17.26) state machine on
670 * every BPDU transmission, and decremented used by the Port Timers state
671 * machine (17.22) once a second. Transmissions are delayed if txCount
672 * reaches TxHoldCount (17.13.12).
674 uint16_t tx_count
OVS_GUARDED_BY(rstp_mutex
);
676 /* [17.19.45 - updtInfo]
677 * A boolean. Set by the Port Role Selection state machine (17.28,
678 * 17.21.25) to tell the Port Information state machine that it should copy
679 * designatedPriority to portPriority and designatedTimes to portTimes.
681 bool updt_info
OVS_GUARDED_BY(rstp_mutex
);
683 /* Counter for RSTP received frames - for rstpd */
684 uint32_t rx_rstp_bpdu_cnt
;
686 /* Counter for bad RSTP received frames */
687 uint32_t error_count
OVS_GUARDED_BY(rstp_mutex
);
689 /* [14.8.2.1.3] Outputs
690 * a) Uptime count in seconds of the time elapsed since the Port was last
691 * reset or initialized.
693 uint32_t uptime
OVS_GUARDED_BY(rstp_mutex
);
695 enum rstp_state rstp_state
OVS_GUARDED_BY(rstp_mutex
);
696 bool state_changed
OVS_GUARDED_BY(rstp_mutex
);
698 /* Per-port state machines state */
699 enum port_receive_state_machine port_receive_sm_state
OVS_GUARDED_BY(rstp_mutex
);
700 enum port_protocol_migration_state_machine port_protocol_migration_sm_state
OVS_GUARDED_BY(rstp_mutex
);
701 enum bridge_detection_state_machine bridge_detection_sm_state
OVS_GUARDED_BY(rstp_mutex
);
702 enum port_transmit_state_machine port_transmit_sm_state
OVS_GUARDED_BY(rstp_mutex
);
703 enum port_information_state_machine port_information_sm_state
OVS_GUARDED_BY(rstp_mutex
);
704 enum port_role_transition_state_machine port_role_transition_sm_state
OVS_GUARDED_BY(rstp_mutex
);
705 enum port_state_transition_state_machine port_state_transition_sm_state
OVS_GUARDED_BY(rstp_mutex
);
706 enum topology_change_state_machine topology_change_sm_state
OVS_GUARDED_BY(rstp_mutex
);
710 struct ovs_list node
OVS_GUARDED_BY(rstp_mutex
); /* In rstp instances list */
711 char *name
; /* Bridge name. */
713 /* Changes in last SM execution. */
714 bool changes
OVS_GUARDED_BY(rstp_mutex
);
716 /* Per-bridge state machines state */
717 enum port_role_selection_state_machine port_role_selection_sm_state
OVS_GUARDED_BY(rstp_mutex
);
719 /* Bridge MAC address
720 * (stored in the least significant 48 bits of rstp_identifier).
722 rstp_identifier address
OVS_GUARDED_BY(rstp_mutex
); /* [7.12.5] */
724 /* Bridge priority */
725 uint16_t priority
OVS_GUARDED_BY(rstp_mutex
); /* Valid values: 0-61440 in steps of 4096 */
727 /*************************************************************************
728 * [17.3 - RSTP performance parameters]
729 ************************************************************************/
732 * The Spanning Tree Protocol Entity shall be reinitialized, as specified
733 * by the assertion of BEGIN (17.18.1) in the state machine specification,
734 * if the following parameters are modified:
735 * a) Force Protocol Version (17.13.4)
737 * The spanning tree priority vectors and Port Role assignments for a
738 * Bridge shall be recomputed, as specified by the operation of the Port
739 * Role Selection state machine (17.28) by clearing selected (17.19.36) and
740 * setting reselect (17.19.34) for any Port or Ports for which the
741 * following parameters are modified:
742 * b) Bridge Identifier Priority (17.13.7)
743 * c) Port Identifier Priority (17.13.10)
744 * d) Port Path Cost (17.13.11)
746 * If the Transmit Hold Count is modified the value of txCount (17.19.44)
747 * for all Ports shall be set to zero.
749 * The RSTP specification permits changes in other performance parameters
750 * without exceptional actions.
754 /* [17.13.2 - Ageing Time]
755 * The Ageing Time parameter for the Bridge (7.9.2, Table 7-5).
757 uint32_t ageing_time
OVS_GUARDED_BY(rstp_mutex
);
759 /* [17.13.4 - Force Protocol Version]
760 * The Force Protocol Version parameter for the Bridge (17.4, 14.8.1).
761 * This can take the value 0 (STP Compatibility mode) or 2 (the default,
764 enum rstp_force_protocol_version force_protocol_version
OVS_GUARDED_BY(rstp_mutex
);
766 /* [17.13.5 - Bridge Forward Delay]
767 * The delay used by STP Bridges (17.4) to transition Root and Designated
768 * Ports to Forwarding (Table 17-1).
770 uint16_t bridge_forward_delay
OVS_GUARDED_BY(rstp_mutex
);
772 /* [17.13.6 - Bridge Hello Time]
773 * The interval between periodic transmissions of Configuration Messages
774 * by Designated Ports (Table 17-1).
776 uint16_t bridge_hello_time
OVS_GUARDED_BY(rstp_mutex
);
778 /* [17.13.8 - Bridge Max Age]
779 * The maximum age of the information transmitted by the Bridge when it is
780 * the Root Bridge (Table 17-1).
782 uint16_t bridge_max_age
OVS_GUARDED_BY(rstp_mutex
);
784 /* [17.13.9 - Migrate Time]
785 * The initial value of the mdelayWhile and edgeDelayWhile timers (17.17.4,
786 * 17.17.1), fixed for all RSTP implementations conforming to this
787 * specification (Table 17-1).
789 uint16_t migrate_time
OVS_GUARDED_BY(rstp_mutex
);
791 /* [17.13.12 - Transmit Hold Count]
792 * The Transmit Hold Count (Table 17-1) used by the Port Transmit state
793 * machine to limit transmission rate.
795 uint16_t transmit_hold_count
OVS_GUARDED_BY(rstp_mutex
);
798 /*************************************************************************
799 * The following variables are defined in [17.18 - Per-Bridge variables]
800 ************************************************************************/
803 * A Boolean controlled by the system initialization (17.16). If TRUE
804 * causes all state machines, including per Port state machines, to
805 * continuously execute their initial state.
807 bool begin
OVS_GUARDED_BY(rstp_mutex
);
809 /* [17.18.2 BridgeIdentifier]
810 * The unique Bridge Identifier assigned to this Bridge, comprising two
811 * components: the Bridge Identifier Priority, which may be modified by
812 * management (see 9.2.5 and 14.8.1.2) and is the more significant when
813 * Bridge Identifiers are compared, and a component derived from the Bridge
814 * Address (7.12.5), which guarantees uniqueness of the Bridge Identifiers
815 * of different Bridges.
817 rstp_identifier bridge_identifier
OVS_GUARDED_BY(rstp_mutex
);
819 /* [17.8.3 BridgePriority]
820 * The bridge priority vector, as defined in 17.6. The first (RootBridgeID)
821 * and third (DesignatedBridgeID) components are both equal to the value
822 * of the Bridge Identifier (17.18.2). The other components are zero.
824 struct rstp_priority_vector bridge_priority
OVS_GUARDED_BY(rstp_mutex
);
826 /* [17.18.4 - BridgeTimes]
827 * BridgeTimes comprises four components: the current values of Bridge
828 * Forward Delay, Bridge Hello Time, Bridge Max Age (17.13, Table 17-1),
829 * and a Message Age of zero.
831 struct rstp_times bridge_times
OVS_GUARDED_BY(rstp_mutex
);
833 /* [17.18.6 - rootPriority]
834 * The first four components of the Bridge's root priority vector, as
837 struct rstp_priority_vector root_priority
OVS_GUARDED_BY(rstp_mutex
);
839 /* [17.18.5 - rootPortId]
840 * The Port Identifier of the Root Port. This is the fifth component of
841 * the root priority vector, as defined in 17.6.
843 uint16_t root_port_id
OVS_GUARDED_BY(rstp_mutex
);
845 /* [17.18.7 - rootTimes]
846 * The rootTimes variable comprises the Bridge's operational timer
847 * parameter values (Message Age, Max Age, Forward Delay, and Hello Time),
848 * derived from the values stored in portTimes (17.19.22) for the Root Port
849 * or from BridgeTimes (17.18.4).
851 struct rstp_times root_times
OVS_GUARDED_BY(rstp_mutex
);
853 /* 17.20 State machine conditions and parameters */
855 /* [17.20.11] rstpVersion
856 * TRUE if Force Protocol Version (17.13.4) is greater than or equal to 2.
858 bool rstp_version
OVS_GUARDED_BY(rstp_mutex
);
860 /* [17.20.12] stpVersion
861 * TRUE if Force Protocol Version (17.13.4) is less than 2.
863 bool stp_version
OVS_GUARDED_BY(rstp_mutex
);
866 struct hmap ports
OVS_GUARDED_BY(rstp_mutex
);
868 struct ovs_refcount ref_cnt
;
870 /* Interface to client. */
871 void (*send_bpdu
)(struct dp_packet
*bpdu
, void *port_aux
, void *rstp_aux
);
879 #endif /* rstp-common.h */