]> git.proxmox.com Git - mirror_ovs.git/blame - lib/rstp.h
openflow: Table maintenance commands for Geneve options.
[mirror_ovs.git] / lib / rstp.h
CommitLineData
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
42extern struct ovs_mutex rstp_mutex;
43
9efd308e
DV
44#define RSTP_MAX_PORTS 4095
45
cf62fa4c 46struct 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 */
92typedef 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
102enum rstp_state {
103 RSTP_DISABLED,
104 RSTP_LEARNING,
105 RSTP_FORWARDING,
106 RSTP_DISCARDING
107};
108
109/* Force Protocol Version [17.13.4] */
110enum rstp_force_protocol_version {
111 FPV_STP_COMPATIBILITY = 0,
112 FPV_DEFAULT = 2
113};
114
115enum rstp_port_role {
116 ROLE_ROOT,
117 ROLE_DESIGNATED,
118 ROLE_ALTERNATE,
119 ROLE_BACKUP,
120 ROLE_DISABLED
121};
122
67e8c1ac
JR
123enum 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
129struct rstp;
130struct rstp_port;
131struct ofproto_rstp_settings;
132
133const char *rstp_state_name(enum rstp_state);
f025bcb7 134const char *rstp_port_role_name(enum rstp_port_role);
8fb76a0b
JR
135static inline bool rstp_forward_in_state(enum rstp_state);
136static inline bool rstp_learn_in_state(enum rstp_state);
137static inline bool rstp_should_manage_bpdu(enum rstp_state state);
9efd308e 138
f025bcb7
JR
139void rstp_init(void)
140 OVS_EXCLUDED(rstp_mutex);
9efd308e
DV
141
142struct 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
148struct rstp *rstp_ref(struct rstp *)
149 OVS_EXCLUDED(rstp_mutex);
150void 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
155void rstp_tick_timers(struct rstp *)
156 OVS_EXCLUDED(rstp_mutex);
157void rstp_port_received_bpdu(struct rstp_port *, const void *bpdu,
158 size_t bpdu_size)
159 OVS_EXCLUDED(rstp_mutex);
66ff280d 160void *rstp_check_and_reset_fdb_flush(struct rstp *, struct rstp_port **)
f025bcb7
JR
161 OVS_EXCLUDED(rstp_mutex);
162void *rstp_get_next_changed_port_aux(struct rstp *, struct rstp_port **)
163 OVS_EXCLUDED(rstp_mutex);
9efd308e 164void rstp_port_set_mac_operational(struct rstp_port *,
f025bcb7
JR
165 bool new_mac_operational)
166 OVS_EXCLUDED(rstp_mutex);
2372c146
JR
167bool rstp_shift_root_learned_address(struct rstp *)
168 OVS_EXCLUDED(rstp_mutex);
169void *rstp_get_old_root_aux(struct rstp *)
170 OVS_EXCLUDED(rstp_mutex);
171void *rstp_get_new_root_aux(struct rstp *)
172 OVS_EXCLUDED(rstp_mutex);
173void rstp_reset_root_changed(struct rstp *)
174 OVS_EXCLUDED(rstp_mutex);
9efd308e
DV
175
176/* Bridge setters */
f025bcb7
JR
177void rstp_set_bridge_address(struct rstp *, rstp_identifier bridge_address)
178 OVS_EXCLUDED(rstp_mutex);
179void rstp_set_bridge_priority(struct rstp *, int new_priority)
180 OVS_EXCLUDED(rstp_mutex);
181void rstp_set_bridge_ageing_time(struct rstp *, int new_ageing_time)
182 OVS_EXCLUDED(rstp_mutex);
9efd308e 183void rstp_set_bridge_force_protocol_version(struct rstp *,
f025bcb7
JR
184 enum rstp_force_protocol_version)
185 OVS_EXCLUDED(rstp_mutex);
186void rstp_set_bridge_max_age(struct rstp *, int new_max_age)
187 OVS_EXCLUDED(rstp_mutex);
188void rstp_set_bridge_forward_delay(struct rstp *, int new_forward_delay)
189 OVS_EXCLUDED(rstp_mutex);
9efd308e 190void 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
195const char * rstp_get_name(const struct rstp *)
196 OVS_EXCLUDED(rstp_mutex);
197rstp_identifier rstp_get_root_id(const struct rstp *)
198 OVS_EXCLUDED(rstp_mutex);
199rstp_identifier rstp_get_bridge_id(const struct rstp *)
200 OVS_EXCLUDED(rstp_mutex);
201rstp_identifier rstp_get_designated_id(const struct rstp *)
202 OVS_EXCLUDED(rstp_mutex);
203uint32_t rstp_get_root_path_cost(const struct rstp *)
204 OVS_EXCLUDED(rstp_mutex);
205uint16_t rstp_get_designated_port_id(const struct rstp *)
206 OVS_EXCLUDED(rstp_mutex);
207uint16_t rstp_get_bridge_port_id(const struct rstp *)
208 OVS_EXCLUDED(rstp_mutex);
209struct rstp_port * rstp_get_root_port(struct rstp *)
210 OVS_EXCLUDED(rstp_mutex);
211rstp_identifier rstp_get_designated_root(const struct rstp *)
212 OVS_EXCLUDED(rstp_mutex);
213bool rstp_is_root_bridge(const struct rstp *)
214 OVS_EXCLUDED(rstp_mutex);
215
216/* RSTP ports */
217struct rstp_port * rstp_add_port(struct rstp *)
218 OVS_EXCLUDED(rstp_mutex);
219struct rstp_port *rstp_port_ref(const struct rstp_port *)
220 OVS_EXCLUDED(rstp_mutex);
221void rstp_port_unref(struct rstp_port *)
222 OVS_EXCLUDED(rstp_mutex);
223
224uint32_t rstp_convert_speed_to_cost(unsigned int speed);
8fb76a0b 225
f025bcb7
JR
226void 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
232enum rstp_state rstp_port_get_state(const struct rstp_port *)
233 OVS_EXCLUDED(rstp_mutex);
234
235void 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
243void * 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
249void 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
255struct rstp_port *rstp_get_port(struct rstp *rstp, uint16_t port_number)
256 OVS_EXCLUDED(rstp_mutex);
257void reinitialize_port(struct rstp_port *p)
258 OVS_EXCLUDED(rstp_mutex);
259
260int rstp_port_get_number(const struct rstp_port *)
261 OVS_EXCLUDED(rstp_mutex);
262void rstp_port_set_priority(struct rstp_port *port, int priority)
263 OVS_EXCLUDED(rstp_mutex);
264void rstp_port_set_aux(struct rstp_port *p, void *aux)
265 OVS_EXCLUDED(rstp_mutex);
266void rstp_port_set_path_cost(struct rstp_port *port, uint32_t path_cost)
267 OVS_EXCLUDED(rstp_mutex);
268void 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 */
276static inline bool
277rstp_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 */
286static inline bool
287rstp_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
295static inline bool
296rstp_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 */