]>
Commit | Line | Data |
---|---|---|
9efd308e DV |
1 | /* |
2 | * Copyright (c) 2011-2014 M3S, Srl - Italy | |
3 | * | |
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: | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
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. | |
15 | */ | |
16 | ||
17 | /* | |
18 | * Rapid Spanning Tree Protocol (IEEE 802.1D-2004) public interface (header | |
19 | * file). | |
20 | * | |
21 | * Authors: | |
22 | * Martino Fornasa <mf@fornasa.it> | |
23 | * Daniele Venturino <daniele.venturino@m3s.it> | |
24 | * | |
25 | * References to IEEE 802.1D-2004 standard are enclosed in square brackets. | |
26 | * E.g. [17.3], [Table 17-1], etc. | |
27 | * | |
28 | */ | |
29 | ||
30 | #ifndef RSTP_H | |
31 | #define RSTP_H 1 | |
32 | ||
33 | #include <stdint.h> | |
34 | #include <stdbool.h> | |
35 | #include "compiler.h" | |
36 | #include "util.h" | |
37 | ||
f025bcb7 JR |
38 | /* Thread Safety: Callers passing in RSTP and RSTP port object |
39 | * pointers must hold a reference to the passed object to ensure that | |
40 | * the object does not become stale while it is being accessed. */ | |
41 | ||
42 | extern struct ovs_mutex rstp_mutex; | |
43 | ||
9efd308e DV |
44 | #define RSTP_MAX_PORTS 4095 |
45 | ||
cf62fa4c | 46 | struct dp_packet; |
9efd308e DV |
47 | |
48 | /* Bridge priority defaults [Table 17-2] */ | |
49 | #define RSTP_MIN_PRIORITY 0 | |
50 | #define RSTP_MAX_PRIORITY 61440 | |
51 | #define RSTP_PRIORITY_STEP 4096 | |
52 | #define RSTP_DEFAULT_PRIORITY 32768 | |
53 | ||
54 | /* Port priority defaults [Table 17-2] */ | |
55 | #define RSTP_MIN_PORT_PRIORITY 0 | |
56 | #define RSTP_MAX_PORT_PRIORITY 240 | |
57 | #define RSTP_STEP_PORT_PRIORITY 16 | |
58 | #define RSTP_DEFAULT_PORT_PRIORITY 128 | |
59 | ||
60 | /* Performance parameters defaults. [Table 7-5] and [Table 17-1] | |
61 | * These values are expressed in seconds. | |
62 | */ | |
63 | #define RSTP_DEFAULT_AGEING_TIME 300 | |
64 | #define RSTP_MIN_AGEING_TIME 10 | |
65 | #define RSTP_MAX_AGEING_TIME 1000000 | |
66 | ||
67 | #define RSTP_DEFAULT_BRIDGE_MAX_AGE 20 | |
68 | #define RSTP_MIN_BRIDGE_MAX_AGE 6 | |
69 | #define RSTP_MAX_BRIDGE_MAX_AGE 40 | |
70 | ||
71 | #define RSTP_DEFAULT_BRIDGE_FORWARD_DELAY 15 | |
72 | #define RSTP_MIN_BRIDGE_FORWARD_DELAY 4 | |
73 | #define RSTP_MAX_BRIDGE_FORWARD_DELAY 30 | |
74 | ||
75 | #define RSTP_DEFAULT_TRANSMIT_HOLD_COUNT 6 | |
76 | #define RSTP_MIN_TRANSMIT_HOLD_COUNT 1 | |
77 | #define RSTP_MAX_TRANSMIT_HOLD_COUNT 10 | |
78 | ||
79 | #define RSTP_BRIDGE_HELLO_TIME 2 /* Value is fixed [Table 17-1] */ | |
80 | ||
81 | #define RSTP_MIGRATE_TIME 3 /* Value is fixed [Table 17-1] */ | |
82 | ||
83 | /* Port path cost [Table 17-3] */ | |
84 | #define RSTP_MIN_PORT_PATH_COST 1 | |
85 | #define RSTP_MAX_PORT_PATH_COST 200000000 | |
86 | #define RSTP_DEFAULT_PORT_PATH_COST 200000 | |
87 | ||
88 | /* RSTP Bridge identifier [9.2.5]. Top four most significant bits are a | |
89 | * priority value. The next most significant twelve bits are a locally | |
90 | * assigned system ID extension. Bottom 48 bits are MAC address of bridge. | |
91 | */ | |
92 | typedef uint64_t rstp_identifier; | |
93 | ||
94 | #define RSTP_ID_FMT "%01"PRIx8".%03"PRIx16".%012"PRIx64 | |
95 | #define RSTP_ID_ARGS(rstp_id) \ | |
96 | (uint8_t)((rstp_id) >> 60), \ | |
97 | (uint16_t)(((rstp_id) & 0x0fff000000000000ULL) >> 48), \ | |
98 | (uint64_t)((rstp_id) & 0xffffffffffffULL) | |
99 | ||
100 | #define RSTP_PORT_ID_FMT "%04"PRIx16 | |
101 | ||
102 | enum rstp_state { | |
103 | RSTP_DISABLED, | |
104 | RSTP_LEARNING, | |
105 | RSTP_FORWARDING, | |
106 | RSTP_DISCARDING | |
107 | }; | |
108 | ||
109 | /* Force Protocol Version [17.13.4] */ | |
110 | enum rstp_force_protocol_version { | |
111 | FPV_STP_COMPATIBILITY = 0, | |
112 | FPV_DEFAULT = 2 | |
113 | }; | |
114 | ||
115 | enum rstp_port_role { | |
116 | ROLE_ROOT, | |
117 | ROLE_DESIGNATED, | |
118 | ROLE_ALTERNATE, | |
119 | ROLE_BACKUP, | |
120 | ROLE_DISABLED | |
121 | }; | |
122 | ||
67e8c1ac JR |
123 | enum rstp_admin_point_to_point_mac_state { |
124 | RSTP_ADMIN_P2P_MAC_FORCE_FALSE, | |
125 | RSTP_ADMIN_P2P_MAC_FORCE_TRUE, | |
126 | RSTP_ADMIN_P2P_MAC_AUTO | |
127 | }; | |
128 | ||
9efd308e DV |
129 | struct rstp; |
130 | struct rstp_port; | |
131 | struct ofproto_rstp_settings; | |
132 | ||
133 | const char *rstp_state_name(enum rstp_state); | |
f025bcb7 | 134 | const char *rstp_port_role_name(enum rstp_port_role); |
8fb76a0b JR |
135 | static inline bool rstp_forward_in_state(enum rstp_state); |
136 | static inline bool rstp_learn_in_state(enum rstp_state); | |
137 | static inline bool rstp_should_manage_bpdu(enum rstp_state state); | |
9efd308e | 138 | |
f025bcb7 JR |
139 | void rstp_init(void) |
140 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e DV |
141 | |
142 | struct rstp * rstp_create(const char *, rstp_identifier bridge_id, | |
cf62fa4c | 143 | void (*send_bpdu)(struct dp_packet *, void *port_aux, |
6b90bc57 | 144 | void *rstp_aux), |
f025bcb7 JR |
145 | void *aux) |
146 | OVS_EXCLUDED(rstp_mutex); | |
4b30ba05 | 147 | |
f025bcb7 JR |
148 | struct rstp *rstp_ref(struct rstp *) |
149 | OVS_EXCLUDED(rstp_mutex); | |
150 | void rstp_unref(struct rstp *) | |
151 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e DV |
152 | |
153 | /* Functions used outside RSTP, to call functions defined in | |
154 | rstp-state-machines.h */ | |
f025bcb7 JR |
155 | void rstp_tick_timers(struct rstp *) |
156 | OVS_EXCLUDED(rstp_mutex); | |
157 | void rstp_port_received_bpdu(struct rstp_port *, const void *bpdu, | |
158 | size_t bpdu_size) | |
159 | OVS_EXCLUDED(rstp_mutex); | |
66ff280d | 160 | void *rstp_check_and_reset_fdb_flush(struct rstp *, struct rstp_port **) |
f025bcb7 JR |
161 | OVS_EXCLUDED(rstp_mutex); |
162 | void *rstp_get_next_changed_port_aux(struct rstp *, struct rstp_port **) | |
163 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e | 164 | void rstp_port_set_mac_operational(struct rstp_port *, |
f025bcb7 JR |
165 | bool new_mac_operational) |
166 | OVS_EXCLUDED(rstp_mutex); | |
2372c146 JR |
167 | bool rstp_shift_root_learned_address(struct rstp *) |
168 | OVS_EXCLUDED(rstp_mutex); | |
169 | void *rstp_get_old_root_aux(struct rstp *) | |
170 | OVS_EXCLUDED(rstp_mutex); | |
171 | void *rstp_get_new_root_aux(struct rstp *) | |
172 | OVS_EXCLUDED(rstp_mutex); | |
173 | void rstp_reset_root_changed(struct rstp *) | |
174 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e DV |
175 | |
176 | /* Bridge setters */ | |
f025bcb7 JR |
177 | void rstp_set_bridge_address(struct rstp *, rstp_identifier bridge_address) |
178 | OVS_EXCLUDED(rstp_mutex); | |
179 | void rstp_set_bridge_priority(struct rstp *, int new_priority) | |
180 | OVS_EXCLUDED(rstp_mutex); | |
181 | void rstp_set_bridge_ageing_time(struct rstp *, int new_ageing_time) | |
182 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e | 183 | void rstp_set_bridge_force_protocol_version(struct rstp *, |
f025bcb7 JR |
184 | enum rstp_force_protocol_version) |
185 | OVS_EXCLUDED(rstp_mutex); | |
186 | void rstp_set_bridge_max_age(struct rstp *, int new_max_age) | |
187 | OVS_EXCLUDED(rstp_mutex); | |
188 | void rstp_set_bridge_forward_delay(struct rstp *, int new_forward_delay) | |
189 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e | 190 | void rstp_set_bridge_transmit_hold_count(struct rstp *, |
f025bcb7 JR |
191 | int new_transmit_hold_count) |
192 | OVS_EXCLUDED(rstp_mutex); | |
9efd308e DV |
193 | |
194 | /* Bridge getters */ | |
f025bcb7 JR |
195 | const char * rstp_get_name(const struct rstp *) |
196 | OVS_EXCLUDED(rstp_mutex); | |
197 | rstp_identifier rstp_get_root_id(const struct rstp *) | |
198 | OVS_EXCLUDED(rstp_mutex); | |
199 | rstp_identifier rstp_get_bridge_id(const struct rstp *) | |
200 | OVS_EXCLUDED(rstp_mutex); | |
201 | rstp_identifier rstp_get_designated_id(const struct rstp *) | |
202 | OVS_EXCLUDED(rstp_mutex); | |
203 | uint32_t rstp_get_root_path_cost(const struct rstp *) | |
204 | OVS_EXCLUDED(rstp_mutex); | |
205 | uint16_t rstp_get_designated_port_id(const struct rstp *) | |
206 | OVS_EXCLUDED(rstp_mutex); | |
207 | uint16_t rstp_get_bridge_port_id(const struct rstp *) | |
208 | OVS_EXCLUDED(rstp_mutex); | |
209 | struct rstp_port * rstp_get_root_port(struct rstp *) | |
210 | OVS_EXCLUDED(rstp_mutex); | |
211 | rstp_identifier rstp_get_designated_root(const struct rstp *) | |
212 | OVS_EXCLUDED(rstp_mutex); | |
213 | bool rstp_is_root_bridge(const struct rstp *) | |
214 | OVS_EXCLUDED(rstp_mutex); | |
215 | ||
216 | /* RSTP ports */ | |
217 | struct rstp_port * rstp_add_port(struct rstp *) | |
218 | OVS_EXCLUDED(rstp_mutex); | |
219 | struct rstp_port *rstp_port_ref(const struct rstp_port *) | |
220 | OVS_EXCLUDED(rstp_mutex); | |
221 | void rstp_port_unref(struct rstp_port *) | |
222 | OVS_EXCLUDED(rstp_mutex); | |
223 | ||
224 | uint32_t rstp_convert_speed_to_cost(unsigned int speed); | |
8fb76a0b | 225 | |
f025bcb7 JR |
226 | void rstp_port_set(struct rstp_port *, uint16_t port_num, int priority, |
227 | uint32_t path_cost, bool is_admin_edge, bool is_auto_edge, | |
67e8c1ac JR |
228 | enum rstp_admin_point_to_point_mac_state admin_p2p_mac_state, |
229 | bool admin_port_state, bool do_mcheck, void *aux) | |
f025bcb7 JR |
230 | OVS_EXCLUDED(rstp_mutex); |
231 | ||
232 | enum rstp_state rstp_port_get_state(const struct rstp_port *) | |
233 | OVS_EXCLUDED(rstp_mutex); | |
234 | ||
235 | void rstp_port_get_status(const struct rstp_port *, uint16_t *id, | |
236 | enum rstp_state *state, enum rstp_port_role *role, | |
9c64e6b8 JR |
237 | rstp_identifier *designated_bridge_id, |
238 | uint16_t *designated_port_id, | |
239 | uint32_t *designated_path_cost, int *tx_count, | |
240 | int *rx_count, int *error_count, int *uptime) | |
f025bcb7 JR |
241 | OVS_EXCLUDED(rstp_mutex); |
242 | ||
2372c146 JR |
243 | void * rstp_get_port_aux__(struct rstp *rstp, uint16_t port_number) |
244 | OVS_REQUIRES(rstp_mutex); | |
f025bcb7 JR |
245 | |
246 | \f | |
247 | /* Internal API for rstp-state-machines.c */ | |
248 | ||
249 | void rstp_port_set_state__(struct rstp_port *, enum rstp_state state) | |
250 | OVS_REQUIRES(rstp_mutex); | |
251 | ||
252 | \f | |
253 | /* Internal API for test-rstp.c */ | |
254 | ||
255 | struct rstp_port *rstp_get_port(struct rstp *rstp, uint16_t port_number) | |
256 | OVS_EXCLUDED(rstp_mutex); | |
257 | void reinitialize_port(struct rstp_port *p) | |
258 | OVS_EXCLUDED(rstp_mutex); | |
259 | ||
260 | int rstp_port_get_number(const struct rstp_port *) | |
261 | OVS_EXCLUDED(rstp_mutex); | |
262 | void rstp_port_set_priority(struct rstp_port *port, int priority) | |
263 | OVS_EXCLUDED(rstp_mutex); | |
264 | void rstp_port_set_aux(struct rstp_port *p, void *aux) | |
265 | OVS_EXCLUDED(rstp_mutex); | |
266 | void rstp_port_set_path_cost(struct rstp_port *port, uint32_t path_cost) | |
267 | OVS_EXCLUDED(rstp_mutex); | |
268 | void rstp_port_set_state(struct rstp_port *p, enum rstp_state state) | |
269 | OVS_EXCLUDED(rstp_mutex); | |
270 | ||
271 | \f | |
8fb76a0b JR |
272 | /* Inline functions. */ |
273 | /* Returns true if 'state' is one in which BPDU packets should be received | |
274 | * and transmitted on a port, false otherwise. | |
275 | */ | |
276 | static inline bool | |
277 | rstp_should_manage_bpdu(enum rstp_state state) | |
278 | { | |
279 | return (state == RSTP_DISCARDING || state == RSTP_LEARNING || | |
280 | state == RSTP_FORWARDING); | |
281 | } | |
282 | ||
283 | /* Returns true if 'state' is one in which packets received on a port should | |
284 | * be forwarded, false otherwise. | |
8fb76a0b JR |
285 | */ |
286 | static inline bool | |
287 | rstp_forward_in_state(enum rstp_state state) | |
288 | { | |
4b5f1996 | 289 | return (state == RSTP_FORWARDING); |
8fb76a0b JR |
290 | } |
291 | ||
292 | /* Returns true if 'state' is one in which MAC learning should be done on | |
293 | * packets received on a port, false otherwise. | |
4b5f1996 | 294 | */ |
8fb76a0b JR |
295 | static inline bool |
296 | rstp_learn_in_state(enum rstp_state state) | |
297 | { | |
4b5f1996 | 298 | return (state == RSTP_LEARNING || state == RSTP_FORWARDING); |
8fb76a0b JR |
299 | } |
300 | ||
9efd308e | 301 | #endif /* rstp.h */ |