Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/net/if_bridgevar.h
39477 views
1
/* $NetBSD: if_bridgevar.h,v 1.4 2003/07/08 07:13:50 itojun Exp $ */
2
3
/*
4
* SPDX-License-Identifier: BSD-4-Clause
5
*
6
* Copyright 2001 Wasabi Systems, Inc.
7
* All rights reserved.
8
*
9
* Written by Jason R. Thorpe for Wasabi Systems, Inc.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. All advertising materials mentioning features or use of this software
20
* must display the following acknowledgement:
21
* This product includes software developed for the NetBSD Project by
22
* Wasabi Systems, Inc.
23
* 4. The name of Wasabi Systems, Inc. may not be used to endorse
24
* or promote products derived from this software without specific prior
25
* written permission.
26
*
27
* THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
28
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
31
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37
* POSSIBILITY OF SUCH DAMAGE.
38
*/
39
40
/*
41
* Copyright (c) 1999, 2000 Jason L. Wright ([email protected])
42
* All rights reserved.
43
*
44
* Redistribution and use in source and binary forms, with or without
45
* modification, are permitted provided that the following conditions
46
* are met:
47
* 1. Redistributions of source code must retain the above copyright
48
* notice, this list of conditions and the following disclaimer.
49
* 2. Redistributions in binary form must reproduce the above copyright
50
* notice, this list of conditions and the following disclaimer in the
51
* documentation and/or other materials provided with the distribution.
52
* 3. All advertising materials mentioning features or use of this software
53
* must display the following acknowledgement:
54
* This product includes software developed by Jason L. Wright
55
* 4. The name of the author may not be used to endorse or promote products
56
* derived from this software without specific prior written permission.
57
*
58
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
59
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
60
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
61
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
62
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
63
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
64
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
66
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
67
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
68
* POSSIBILITY OF SUCH DAMAGE.
69
*
70
* OpenBSD: if_bridge.h,v 1.14 2001/03/22 03:48:29 jason Exp
71
*/
72
73
/*
74
* Data structure and control definitions for bridge interfaces.
75
*/
76
77
#ifndef _NET_IF_BRIDGEVAR_H_
78
#define _NET_IF_BRIDGEVAR_H_
79
80
#include <sys/types.h>
81
#include <sys/_bitset.h>
82
#include <sys/bitset.h>
83
#include <sys/callout.h>
84
#include <sys/queue.h>
85
#include <sys/condvar.h>
86
87
#include <net/ethernet.h>
88
#include <net/if.h>
89
90
/*
91
* Commands used in the SIOCSDRVSPEC ioctl. Note the lookup of the
92
* bridge interface itself is keyed off the ifdrv structure.
93
*/
94
#define BRDGADD 0 /* add bridge member (ifbreq) */
95
#define BRDGDEL 1 /* delete bridge member (ifbreq) */
96
#define BRDGGIFFLGS 2 /* get member if flags (ifbreq) */
97
#define BRDGSIFFLGS 3 /* set member if flags (ifbreq) */
98
#define BRDGSCACHE 4 /* set cache size (ifbrparam) */
99
#define BRDGGCACHE 5 /* get cache size (ifbrparam) */
100
#define BRDGGIFS 6 /* get member list (ifbifconf) */
101
#define BRDGRTS 7 /* get address list (ifbaconf) */
102
#define BRDGSADDR 8 /* set static address (ifbareq) */
103
#define BRDGSTO 9 /* set cache timeout (ifbrparam) */
104
#define BRDGGTO 10 /* get cache timeout (ifbrparam) */
105
#define BRDGDADDR 11 /* delete address (ifbareq) */
106
#define BRDGFLUSH 12 /* flush address cache (ifbreq) */
107
108
#define BRDGGPRI 13 /* get priority (ifbrparam) */
109
#define BRDGSPRI 14 /* set priority (ifbrparam) */
110
#define BRDGGHT 15 /* get hello time (ifbrparam) */
111
#define BRDGSHT 16 /* set hello time (ifbrparam) */
112
#define BRDGGFD 17 /* get forward delay (ifbrparam) */
113
#define BRDGSFD 18 /* set forward delay (ifbrparam) */
114
#define BRDGGMA 19 /* get max age (ifbrparam) */
115
#define BRDGSMA 20 /* set max age (ifbrparam) */
116
#define BRDGSIFPRIO 21 /* set if priority (ifbreq) */
117
#define BRDGSIFCOST 22 /* set if path cost (ifbreq) */
118
#define BRDGADDS 23 /* add bridge span member (ifbreq) */
119
#define BRDGDELS 24 /* delete bridge span member (ifbreq) */
120
#define BRDGPARAM 25 /* get bridge STP params (ifbropreq) */
121
#define BRDGGRTE 26 /* get cache drops (ifbrparam) */
122
#define BRDGGIFSSTP 27 /* get member STP params list
123
* (ifbpstpconf) */
124
#define BRDGSPROTO 28 /* set protocol (ifbrparam) */
125
#define BRDGSTXHC 29 /* set tx hold count (ifbrparam) */
126
#define BRDGSIFAMAX 30 /* set max interface addrs (ifbreq) */
127
#define BRDGSIFPVID 31 /* set if PVID */
128
#define BRDGSIFVLANSET 32 /* set if vlan set */
129
#define BRDGGIFVLANSET 33 /* get if vlan set */
130
#define BRDGGFLAGS 34 /* get bridge flags (ifbrparam) */
131
#define BRDGSFLAGS 35 /* set bridge flags (ifbrparam) */
132
#define BRDGGDEFPVID 36 /* get default pvid (ifbrparam) */
133
#define BRDGSDEFPVID 37 /* set default pvid (ifbrparam) */
134
#define BRDGSIFVLANPROTO 38 /* set if vlan protocol (ifbreq) */
135
136
/* BRDGSFLAGS, Bridge flags (non-interface-specific) */
137
typedef uint32_t ifbr_flags_t;
138
139
#define IFBRF_VLANFILTER (1U<<0) /* VLAN filtering enabled */
140
#define IFBRF_DEFQINQ (1U<<1) /* 802.1ad Q-in-Q allowed by default */
141
142
#define IFBRFBITS "\020\01VLANFILTER\02DEFQINQ"
143
144
/*
145
* Generic bridge control request.
146
*/
147
struct ifbreq {
148
char ifbr_ifsname[IFNAMSIZ]; /* member if name */
149
uint32_t ifbr_ifsflags; /* member if flags */
150
uint32_t ifbr_stpflags; /* member if STP flags */
151
uint32_t ifbr_path_cost; /* member if STP cost */
152
uint8_t ifbr_portno; /* member if port number */
153
uint8_t ifbr_priority; /* member if STP priority */
154
uint8_t ifbr_proto; /* member if STP protocol */
155
uint8_t ifbr_role; /* member if STP role */
156
uint8_t ifbr_state; /* member if STP state */
157
uint32_t ifbr_addrcnt; /* member if addr number */
158
uint32_t ifbr_addrmax; /* member if addr max */
159
uint32_t ifbr_addrexceeded; /* member if addr violations */
160
ether_vlanid_t ifbr_pvid; /* member if PVID */
161
uint16_t ifbr_vlanproto; /* member if VLAN protocol */
162
uint8_t pad[28];
163
};
164
165
/* BRDGGIFFLAGS, BRDGSIFFLAGS */
166
#define IFBIF_LEARNING 0x0001 /* if can learn */
167
#define IFBIF_DISCOVER 0x0002 /* if sends packets w/ unknown dest. */
168
#define IFBIF_STP 0x0004 /* if participates in spanning tree */
169
#define IFBIF_SPAN 0x0008 /* if is a span port */
170
#define IFBIF_STICKY 0x0010 /* if learned addresses stick */
171
#define IFBIF_BSTP_EDGE 0x0020 /* member stp edge port */
172
#define IFBIF_BSTP_AUTOEDGE 0x0040 /* member stp autoedge enabled */
173
#define IFBIF_BSTP_PTP 0x0080 /* member stp point to point */
174
#define IFBIF_BSTP_AUTOPTP 0x0100 /* member stp autoptp enabled */
175
#define IFBIF_BSTP_ADMEDGE 0x0200 /* member stp admin edge enabled */
176
#define IFBIF_BSTP_ADMCOST 0x0400 /* member stp admin path cost */
177
#define IFBIF_PRIVATE 0x0800 /* if is a private segment */
178
#define IFBIF_QINQ 0x1000 /* if allows 802.1ad Q-in-Q */
179
180
#define IFBIFBITS "\020\001LEARNING\002DISCOVER\003STP\004SPAN" \
181
"\005STICKY\014PRIVATE\006EDGE\007AUTOEDGE\010PTP" \
182
"\011AUTOPTP\015QINQ"
183
#define IFBIFMASK ~(IFBIF_BSTP_EDGE|IFBIF_BSTP_AUTOEDGE|IFBIF_BSTP_PTP| \
184
IFBIF_BSTP_AUTOPTP|IFBIF_BSTP_ADMEDGE| \
185
IFBIF_BSTP_ADMCOST) /* not saved */
186
187
/* BRDGFLUSH */
188
#define IFBF_FLUSHDYN 0x00 /* flush learned addresses only */
189
#define IFBF_FLUSHALL 0x01 /* flush all addresses */
190
191
/*
192
* Interface list structure.
193
*/
194
struct ifbifconf {
195
uint32_t ifbic_len; /* buffer size */
196
union {
197
caddr_t ifbicu_buf;
198
struct ifbreq *ifbicu_req;
199
} ifbic_ifbicu;
200
#define ifbic_buf ifbic_ifbicu.ifbicu_buf
201
#define ifbic_req ifbic_ifbicu.ifbicu_req
202
};
203
204
/*
205
* Bridge address request.
206
*/
207
struct ifbareq {
208
char ifba_ifsname[IFNAMSIZ]; /* member if name */
209
unsigned long ifba_expire; /* address expire time */
210
uint8_t ifba_flags; /* address flags */
211
uint8_t ifba_dst[ETHER_ADDR_LEN];/* destination address */
212
ether_vlanid_t ifba_vlan; /* vlan id */
213
};
214
215
#define IFBAF_TYPEMASK 0x03 /* address type mask */
216
#define IFBAF_DYNAMIC 0x00 /* dynamically learned address */
217
#define IFBAF_STATIC 0x01 /* static address */
218
#define IFBAF_STICKY 0x02 /* sticky address */
219
220
#define IFBAFBITS "\020\1STATIC\2STICKY"
221
222
/*
223
* Address list structure.
224
*/
225
struct ifbaconf {
226
uint32_t ifbac_len; /* buffer size */
227
union {
228
caddr_t ifbacu_buf;
229
struct ifbareq *ifbacu_req;
230
} ifbac_ifbacu;
231
#define ifbac_buf ifbac_ifbacu.ifbacu_buf
232
#define ifbac_req ifbac_ifbacu.ifbacu_req
233
};
234
235
/*
236
* Bridge parameter structure.
237
*/
238
struct ifbrparam {
239
union {
240
uint32_t ifbrpu_int32;
241
uint16_t ifbrpu_int16;
242
uint8_t ifbrpu_int8;
243
} ifbrp_ifbrpu;
244
};
245
#define ifbrp_csize ifbrp_ifbrpu.ifbrpu_int32 /* cache size */
246
#define ifbrp_ctime ifbrp_ifbrpu.ifbrpu_int32 /* cache time (sec) */
247
#define ifbrp_prio ifbrp_ifbrpu.ifbrpu_int16 /* bridge priority */
248
#define ifbrp_proto ifbrp_ifbrpu.ifbrpu_int8 /* bridge protocol */
249
#define ifbrp_txhc ifbrp_ifbrpu.ifbrpu_int8 /* bpdu tx holdcount */
250
#define ifbrp_hellotime ifbrp_ifbrpu.ifbrpu_int8 /* hello time (sec) */
251
#define ifbrp_fwddelay ifbrp_ifbrpu.ifbrpu_int8 /* fwd time (sec) */
252
#define ifbrp_maxage ifbrp_ifbrpu.ifbrpu_int8 /* max age (sec) */
253
#define ifbrp_cexceeded ifbrp_ifbrpu.ifbrpu_int32 /* # of cache dropped
254
* addresses */
255
#define ifbrp_flags ifbrp_ifbrpu.ifbrpu_int32 /* bridge flags */
256
#define ifbrp_defpvid ifbrp_ifbrpu.ifbrpu_int16 /* default pvid */
257
#define ifbrp_vlanproto ifbrp_ifbrpu.ifbrpu_int8 /* vlan protocol */
258
259
/*
260
* Bridge current operational parameters structure.
261
*/
262
struct ifbropreq {
263
uint8_t ifbop_holdcount;
264
uint8_t ifbop_maxage;
265
uint8_t ifbop_hellotime;
266
uint8_t ifbop_fwddelay;
267
uint8_t ifbop_protocol;
268
uint16_t ifbop_priority;
269
uint16_t ifbop_root_port;
270
uint32_t ifbop_root_path_cost;
271
uint64_t ifbop_bridgeid;
272
uint64_t ifbop_designated_root;
273
uint64_t ifbop_designated_bridge;
274
struct timeval ifbop_last_tc_time;
275
};
276
277
/*
278
* Bridge member operational STP params structure.
279
*/
280
struct ifbpstpreq {
281
uint8_t ifbp_portno; /* bp STP port number */
282
uint32_t ifbp_fwd_trans; /* bp STP fwd transitions */
283
uint32_t ifbp_design_cost; /* bp STP designated cost */
284
uint32_t ifbp_design_port; /* bp STP designated port */
285
uint64_t ifbp_design_bridge; /* bp STP designated bridge */
286
uint64_t ifbp_design_root; /* bp STP designated root */
287
};
288
289
/*
290
* Bridge STP ports list structure.
291
*/
292
struct ifbpstpconf {
293
uint32_t ifbpstp_len; /* buffer size */
294
union {
295
caddr_t ifbpstpu_buf;
296
struct ifbpstpreq *ifbpstpu_req;
297
} ifbpstp_ifbpstpu;
298
#define ifbpstp_buf ifbpstp_ifbpstpu.ifbpstpu_buf
299
#define ifbpstp_req ifbpstp_ifbpstpu.ifbpstpu_req
300
};
301
302
#define STP_STATES \
303
"disabled", \
304
"listening", \
305
"learning", \
306
"forwarding", \
307
"blocking", \
308
"discarding"
309
310
#define STP_PROTOS \
311
"stp", \
312
"-", \
313
"rstp"
314
315
#define STP_ROLES \
316
"disabled", \
317
"root", \
318
"designated", \
319
"alternate", \
320
"backup"
321
322
#define PV2ID(pv, epri, eaddr) do { \
323
epri = pv >> 48; \
324
eaddr[0] = pv >> 40; \
325
eaddr[1] = pv >> 32; \
326
eaddr[2] = pv >> 24; \
327
eaddr[3] = pv >> 16; \
328
eaddr[4] = pv >> 8; \
329
eaddr[5] = pv >> 0; \
330
} while (0)
331
332
/*
333
* Bridge VLAN access request.
334
*/
335
#define BRVLAN_SETSIZE 4096
336
typedef __BITSET_DEFINE(ifbvlan_set, BRVLAN_SETSIZE) ifbvlan_set_t;
337
338
#define BRVLAN_SET(set, bit) __BIT_SET(BRVLAN_SETSIZE, (bit), set)
339
#define BRVLAN_CLR(set, bit) __BIT_CLR(BRVLAN_SETSIZE, (bit), set)
340
#define BRVLAN_TEST(set, bit) __BIT_ISSET(BRVLAN_SETSIZE, (bit), set)
341
342
#define BRDG_VLAN_OP_SET 1 /* replace current vlan set */
343
#define BRDG_VLAN_OP_ADD 2 /* add vlans to current set */
344
#define BRDG_VLAN_OP_DEL 3 /* remove vlans from current set */
345
346
struct ifbif_vlan_req {
347
char bv_ifname[IFNAMSIZ];
348
uint8_t bv_op;
349
ifbvlan_set_t bv_set;
350
};
351
352
#ifdef _KERNEL
353
354
#define BRIDGE_INPUT(_ifp, _m) do { \
355
KASSERT((_ifp)->if_bridge_input != NULL, \
356
("%s: if_bridge not loaded!", __func__)); \
357
_m = (*(_ifp)->if_bridge_input)(_ifp, _m); \
358
if (_m != NULL) { \
359
_ifp = _m->m_pkthdr.rcvif; \
360
m->m_flags &= ~M_BRIDGE_INJECT; \
361
} \
362
} while (0)
363
364
#define BRIDGE_OUTPUT(_ifp, _m, _err) do { \
365
KASSERT((_ifp)->if_bridge_output != NULL, \
366
("%s: if_bridge not loaded!", __func__)); \
367
_err = (*(_ifp)->if_bridge_output)(_ifp, _m, NULL, NULL); \
368
} while (0)
369
370
extern void (*bridge_dn_p)(struct mbuf *, struct ifnet *);
371
extern bool (*bridge_same_p)(const void *, const void *);
372
extern void *(*bridge_get_softc_p)(struct ifnet *);
373
extern bool (*bridge_member_ifaddrs_p)(void);
374
375
#endif /* _KERNEL */
376
377
#endif /* _NET_IF_BRIDGEVAR_H_ */
378
379