xref: /onnv-gate/usr/src/uts/common/net/bridge_impl.h (revision 10491:8893b747ecdf)
1*10491SRishi.Srivatsavai@Sun.COM /*
2*10491SRishi.Srivatsavai@Sun.COM  * CDDL HEADER START
3*10491SRishi.Srivatsavai@Sun.COM  *
4*10491SRishi.Srivatsavai@Sun.COM  * The contents of this file are subject to the terms of the
5*10491SRishi.Srivatsavai@Sun.COM  * Common Development and Distribution License (the "License").
6*10491SRishi.Srivatsavai@Sun.COM  * You may not use this file except in compliance with the License.
7*10491SRishi.Srivatsavai@Sun.COM  *
8*10491SRishi.Srivatsavai@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10491SRishi.Srivatsavai@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10491SRishi.Srivatsavai@Sun.COM  * See the License for the specific language governing permissions
11*10491SRishi.Srivatsavai@Sun.COM  * and limitations under the License.
12*10491SRishi.Srivatsavai@Sun.COM  *
13*10491SRishi.Srivatsavai@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10491SRishi.Srivatsavai@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10491SRishi.Srivatsavai@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10491SRishi.Srivatsavai@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10491SRishi.Srivatsavai@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10491SRishi.Srivatsavai@Sun.COM  *
19*10491SRishi.Srivatsavai@Sun.COM  * CDDL HEADER END
20*10491SRishi.Srivatsavai@Sun.COM  */
21*10491SRishi.Srivatsavai@Sun.COM 
22*10491SRishi.Srivatsavai@Sun.COM /*
23*10491SRishi.Srivatsavai@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*10491SRishi.Srivatsavai@Sun.COM  * Use is subject to license terms.
25*10491SRishi.Srivatsavai@Sun.COM  */
26*10491SRishi.Srivatsavai@Sun.COM 
27*10491SRishi.Srivatsavai@Sun.COM #ifndef _BRIDGE_IMPL_H
28*10491SRishi.Srivatsavai@Sun.COM #define	_BRIDGE_IMPL_H
29*10491SRishi.Srivatsavai@Sun.COM 
30*10491SRishi.Srivatsavai@Sun.COM /*
31*10491SRishi.Srivatsavai@Sun.COM  * These are the internal data structures used by the layer-two (Ethernet)
32*10491SRishi.Srivatsavai@Sun.COM  * bridging module.
33*10491SRishi.Srivatsavai@Sun.COM  */
34*10491SRishi.Srivatsavai@Sun.COM 
35*10491SRishi.Srivatsavai@Sun.COM #ifdef __cplusplus
36*10491SRishi.Srivatsavai@Sun.COM extern "C" {
37*10491SRishi.Srivatsavai@Sun.COM #endif
38*10491SRishi.Srivatsavai@Sun.COM 
39*10491SRishi.Srivatsavai@Sun.COM #include <sys/list.h>
40*10491SRishi.Srivatsavai@Sun.COM #include <sys/sysmacros.h>
41*10491SRishi.Srivatsavai@Sun.COM #include <sys/avl.h>
42*10491SRishi.Srivatsavai@Sun.COM #include <sys/queue.h>
43*10491SRishi.Srivatsavai@Sun.COM #include <sys/kstat.h>
44*10491SRishi.Srivatsavai@Sun.COM #include <sys/ksynch.h>
45*10491SRishi.Srivatsavai@Sun.COM #include <sys/ethernet.h>
46*10491SRishi.Srivatsavai@Sun.COM #include <sys/dld.h>
47*10491SRishi.Srivatsavai@Sun.COM #include <sys/mac.h>
48*10491SRishi.Srivatsavai@Sun.COM #include <sys/mac_client.h>
49*10491SRishi.Srivatsavai@Sun.COM #include <sys/vlan.h>
50*10491SRishi.Srivatsavai@Sun.COM #include <net/bridge.h>
51*10491SRishi.Srivatsavai@Sun.COM 
52*10491SRishi.Srivatsavai@Sun.COM #define	KSINST_NAMES	"recv", "sent", "drops", \
53*10491SRishi.Srivatsavai@Sun.COM 	"forward_direct", "forward_unknown", "forward_mbcast",	\
54*10491SRishi.Srivatsavai@Sun.COM 	"learn_source", "learn_moved", "learn_expire", "learn_size"
55*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_ksinst_s {
56*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_recv;	/* packets received */
57*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_sent;	/* packets sent through */
58*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_drops;	/* packets dropped (untowardly) */
59*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_forwards;	/* packets forwarded */
60*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_unknown;	/* packets forwarded (unknown dest) */
61*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_mbcast;	/* packets forwarded (multi/bcast) */
62*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_source;	/* source addresses learned */
63*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_moved;	/* source addresses moved */
64*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_expire;	/* source addresses expired */
65*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bki_count;	/* source addresses known */
66*10491SRishi.Srivatsavai@Sun.COM } bridge_ksinst_t;
67*10491SRishi.Srivatsavai@Sun.COM 
68*10491SRishi.Srivatsavai@Sun.COM #define	KSLINK_NAMES	"recv", "xmit", "drops"
69*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_kslink_s {
70*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bkl_recv;	/* packets received */
71*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bkl_xmit;	/* packets transmitted */
72*10491SRishi.Srivatsavai@Sun.COM 	kstat_named_t	bkl_drops;	/* packets dropped */
73*10491SRishi.Srivatsavai@Sun.COM } bridge_kslink_t;
74*10491SRishi.Srivatsavai@Sun.COM 
75*10491SRishi.Srivatsavai@Sun.COM /*
76*10491SRishi.Srivatsavai@Sun.COM  * There's one instance structure and one observability mac node for each
77*10491SRishi.Srivatsavai@Sun.COM  * bridge.  Each open non-DLPI stream gets a 'stream' structure; these are used
78*10491SRishi.Srivatsavai@Sun.COM  * for bridge instance allocation and control.  Each link on the bridge has a
79*10491SRishi.Srivatsavai@Sun.COM  * link structure.  Finally, the bridge has a table of learned forwarding
80*10491SRishi.Srivatsavai@Sun.COM  * entries, each with a list of outputs, which are either links or TRILL
81*10491SRishi.Srivatsavai@Sun.COM  * nicknames.
82*10491SRishi.Srivatsavai@Sun.COM  *
83*10491SRishi.Srivatsavai@Sun.COM  * The mac structure lives as long as the dls and mac layers are busy.  It can
84*10491SRishi.Srivatsavai@Sun.COM  * outlive the bridge instance and be picked up again (by name) if the instance
85*10491SRishi.Srivatsavai@Sun.COM  * is restarted.
86*10491SRishi.Srivatsavai@Sun.COM  */
87*10491SRishi.Srivatsavai@Sun.COM 
88*10491SRishi.Srivatsavai@Sun.COM struct bridge_mac_s;
89*10491SRishi.Srivatsavai@Sun.COM struct bridge_stream_s;
90*10491SRishi.Srivatsavai@Sun.COM 
91*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_inst_s {
92*10491SRishi.Srivatsavai@Sun.COM 	list_node_t	bi_node;
93*10491SRishi.Srivatsavai@Sun.COM 	dev_t		bi_dev;
94*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bi_flags;
95*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bi_refs;
96*10491SRishi.Srivatsavai@Sun.COM 	uint32_t	bi_tablemax;
97*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bi_tshift;
98*10491SRishi.Srivatsavai@Sun.COM 	krwlock_t	bi_rwlock;
99*10491SRishi.Srivatsavai@Sun.COM 	list_t		bi_links;
100*10491SRishi.Srivatsavai@Sun.COM 	kcondvar_t	bi_linkwait;
101*10491SRishi.Srivatsavai@Sun.COM 	avl_tree_t	bi_fwd;
102*10491SRishi.Srivatsavai@Sun.COM 	kstat_t		*bi_ksp;
103*10491SRishi.Srivatsavai@Sun.COM 	struct bridge_stream_s *bi_control;
104*10491SRishi.Srivatsavai@Sun.COM 	struct bridge_mac_s *bi_mac;
105*10491SRishi.Srivatsavai@Sun.COM 	void		*bi_trilldata;
106*10491SRishi.Srivatsavai@Sun.COM 	char		bi_name[MAXLINKNAMELEN];
107*10491SRishi.Srivatsavai@Sun.COM 	bridge_ksinst_t	bi_kstats;
108*10491SRishi.Srivatsavai@Sun.COM } bridge_inst_t;
109*10491SRishi.Srivatsavai@Sun.COM 
110*10491SRishi.Srivatsavai@Sun.COM #define	BIF_SHUTDOWN	0x0001		/* control stream has closed */
111*10491SRishi.Srivatsavai@Sun.COM 
112*10491SRishi.Srivatsavai@Sun.COM /*
113*10491SRishi.Srivatsavai@Sun.COM  * The bridge MAC structure has the same lifetime as an observability node.
114*10491SRishi.Srivatsavai@Sun.COM  * It's created when a bridge instance is allocated, but is not freed when the
115*10491SRishi.Srivatsavai@Sun.COM  * instance is removed because there's no way for a MAC client to guarantee
116*10491SRishi.Srivatsavai@Sun.COM  * that all users have disappeared.
117*10491SRishi.Srivatsavai@Sun.COM  */
118*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_mac_s {
119*10491SRishi.Srivatsavai@Sun.COM 	list_node_t	bm_node;
120*10491SRishi.Srivatsavai@Sun.COM 	mac_handle_t	bm_mh;
121*10491SRishi.Srivatsavai@Sun.COM 	bridge_inst_t	*bm_inst;
122*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bm_flags;	/* BMF_* below */
123*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bm_maxsdu;
124*10491SRishi.Srivatsavai@Sun.COM 	link_state_t	bm_linkstate;
125*10491SRishi.Srivatsavai@Sun.COM 	char		bm_name[MAXLINKNAMELEN];
126*10491SRishi.Srivatsavai@Sun.COM } bridge_mac_t;
127*10491SRishi.Srivatsavai@Sun.COM 
128*10491SRishi.Srivatsavai@Sun.COM #define	BMF_DLS		0x0001		/* dls monitor node created */
129*10491SRishi.Srivatsavai@Sun.COM #define	BMF_STARTED	0x0002		/* snoop-like client is present */
130*10491SRishi.Srivatsavai@Sun.COM 
131*10491SRishi.Srivatsavai@Sun.COM /*
132*10491SRishi.Srivatsavai@Sun.COM  * Bridge streams are used only for instance allocation and control.
133*10491SRishi.Srivatsavai@Sun.COM  */
134*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_stream_s {
135*10491SRishi.Srivatsavai@Sun.COM 	bridge_inst_t	*bs_inst;
136*10491SRishi.Srivatsavai@Sun.COM 	queue_t		*bs_wq;		/* write-side queue for stream */
137*10491SRishi.Srivatsavai@Sun.COM 	minor_t		bs_minor;
138*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bs_taskq_cnt;	/* taskq references */
139*10491SRishi.Srivatsavai@Sun.COM } bridge_stream_t;
140*10491SRishi.Srivatsavai@Sun.COM 
141*10491SRishi.Srivatsavai@Sun.COM /*
142*10491SRishi.Srivatsavai@Sun.COM  * These macros are used to set and test link membership in particular VLANs.
143*10491SRishi.Srivatsavai@Sun.COM  * This membership is used to determine how to forward packets between
144*10491SRishi.Srivatsavai@Sun.COM  * interfaces.
145*10491SRishi.Srivatsavai@Sun.COM  */
146*10491SRishi.Srivatsavai@Sun.COM 
147*10491SRishi.Srivatsavai@Sun.COM #define	BRIDGE_VLAN_ARR_SIZE	\
148*10491SRishi.Srivatsavai@Sun.COM 	(P2ROUNDUP(VLAN_ID_MAX, NBBY) / NBBY)
149*10491SRishi.Srivatsavai@Sun.COM 
150*10491SRishi.Srivatsavai@Sun.COM #define	BRIDGE_VLAN_ISSET(l, v)	((l)->bl_vlans[(v) / NBBY] & \
151*10491SRishi.Srivatsavai@Sun.COM 	(1 << ((v) % NBBY)))
152*10491SRishi.Srivatsavai@Sun.COM 
153*10491SRishi.Srivatsavai@Sun.COM #define	BRIDGE_VLAN_SET(l, v)	((l)->bl_vlans[(v) / NBBY] |= \
154*10491SRishi.Srivatsavai@Sun.COM 	(1 << ((v) % NBBY)))
155*10491SRishi.Srivatsavai@Sun.COM 
156*10491SRishi.Srivatsavai@Sun.COM #define	BRIDGE_VLAN_CLR(l, v)	((l)->bl_vlans[(v) / NBBY] &= \
157*10491SRishi.Srivatsavai@Sun.COM 	~(1 << ((v) % NBBY)))
158*10491SRishi.Srivatsavai@Sun.COM 
159*10491SRishi.Srivatsavai@Sun.COM #define	BRIDGE_AF_ISSET(l, v)	((l)->bl_afs[(v) / NBBY] & \
160*10491SRishi.Srivatsavai@Sun.COM 	(1 << ((v) % NBBY)))
161*10491SRishi.Srivatsavai@Sun.COM 
162*10491SRishi.Srivatsavai@Sun.COM /*
163*10491SRishi.Srivatsavai@Sun.COM  * This structure represents a link attached to a bridge.  VLAN membership
164*10491SRishi.Srivatsavai@Sun.COM  * information is kept here; when forwarding, we must look at the membership of
165*10491SRishi.Srivatsavai@Sun.COM  * the input link and the output to determine when to update the packet
166*10491SRishi.Srivatsavai@Sun.COM  * contents and when to discard.
167*10491SRishi.Srivatsavai@Sun.COM  */
168*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_link_s {
169*10491SRishi.Srivatsavai@Sun.COM 	list_node_t	bl_node;
170*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bl_refs;
171*10491SRishi.Srivatsavai@Sun.COM 	datalink_id_t	bl_linkid;	/* allocated link ID for bridge */
172*10491SRishi.Srivatsavai@Sun.COM 	bridge_state_t	bl_state;	/* blocking/learning/forwarding */
173*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bl_pvid;	/* VLAN ID for untagged traffic */
174*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bl_flags;	/* BLF_* below */
175*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bl_learns;	/* learning limit */
176*10491SRishi.Srivatsavai@Sun.COM 	mac_handle_t	bl_mh;
177*10491SRishi.Srivatsavai@Sun.COM 	mac_client_handle_t	bl_mch;
178*10491SRishi.Srivatsavai@Sun.COM 	uint32_t	bl_margin;
179*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bl_maxsdu;
180*10491SRishi.Srivatsavai@Sun.COM 	mac_unicast_handle_t	bl_mah;
181*10491SRishi.Srivatsavai@Sun.COM 	mac_notify_handle_t	bl_mnh;
182*10491SRishi.Srivatsavai@Sun.COM 	mac_promisc_handle_t	bl_mphp;
183*10491SRishi.Srivatsavai@Sun.COM 	bridge_inst_t	*bl_inst;	/* backpointer to bridge instance */
184*10491SRishi.Srivatsavai@Sun.COM 	kstat_t		*bl_ksp;
185*10491SRishi.Srivatsavai@Sun.COM 	void		*bl_trilldata;
186*10491SRishi.Srivatsavai@Sun.COM 	mblk_t		*bl_lfailmp;	/* preallocated */
187*10491SRishi.Srivatsavai@Sun.COM 	link_state_t	bl_linkstate;
188*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bl_trillthreads;
189*10491SRishi.Srivatsavai@Sun.COM 	kcondvar_t	bl_trillwait;
190*10491SRishi.Srivatsavai@Sun.COM 	kmutex_t	bl_trilllock;
191*10491SRishi.Srivatsavai@Sun.COM 	uint8_t		bl_local_mac[ETHERADDRL];
192*10491SRishi.Srivatsavai@Sun.COM 	uint8_t		bl_vlans[BRIDGE_VLAN_ARR_SIZE];
193*10491SRishi.Srivatsavai@Sun.COM 	uint8_t		bl_afs[BRIDGE_VLAN_ARR_SIZE];
194*10491SRishi.Srivatsavai@Sun.COM 	bridge_kslink_t	bl_kstats;
195*10491SRishi.Srivatsavai@Sun.COM } bridge_link_t;
196*10491SRishi.Srivatsavai@Sun.COM 
197*10491SRishi.Srivatsavai@Sun.COM #define	BLF_DELETED		0x0001	/* waiting for last reference to go */
198*10491SRishi.Srivatsavai@Sun.COM #define	BLF_CLIENT_OPEN		0x0002	/* MAC client opened */
199*10491SRishi.Srivatsavai@Sun.COM #define	BLF_MARGIN_ADDED	0x0004	/* MAC margin added */
200*10491SRishi.Srivatsavai@Sun.COM #define	BLF_SET_BRIDGE		0x0008	/* MAC in bridging mode */
201*10491SRishi.Srivatsavai@Sun.COM #define	BLF_PROM_ADDED		0x0010	/* MAC promiscuous added */
202*10491SRishi.Srivatsavai@Sun.COM #define	BLF_FREED		0x0020	/* free has begun; debug assertion */
203*10491SRishi.Srivatsavai@Sun.COM #define	BLF_TRILLACTIVE		0x0040	/* in active forwarding use */
204*10491SRishi.Srivatsavai@Sun.COM #define	BLF_SDUFAIL		0x0080	/* has mismatched SDU */
205*10491SRishi.Srivatsavai@Sun.COM 
206*10491SRishi.Srivatsavai@Sun.COM /*
207*10491SRishi.Srivatsavai@Sun.COM  * This represents a learned forwarding entry.  These are generally created and
208*10491SRishi.Srivatsavai@Sun.COM  * refreshed on demand as we learn about nodes through source MAC addresses we
209*10491SRishi.Srivatsavai@Sun.COM  * see.  They're destroyed when they age away.  For forwarding, we look up the
210*10491SRishi.Srivatsavai@Sun.COM  * destination address in an AVL tree, and the entry found tells us where the
211*10491SRishi.Srivatsavai@Sun.COM  * that source must live.
212*10491SRishi.Srivatsavai@Sun.COM  */
213*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_fwd_s {
214*10491SRishi.Srivatsavai@Sun.COM 	avl_node_t	bf_node;
215*10491SRishi.Srivatsavai@Sun.COM 	uchar_t		bf_dest[ETHERADDRL];
216*10491SRishi.Srivatsavai@Sun.COM 	uint16_t	bf_trill_nick;	/* destination nickname */
217*10491SRishi.Srivatsavai@Sun.COM 	clock_t		bf_lastheard;	/* time we last heard from this node */
218*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bf_flags;	/* BFF_* below */
219*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bf_refs;
220*10491SRishi.Srivatsavai@Sun.COM 	uint16_t	bf_vlanid;	/* VLAN ID for IVL */
221*10491SRishi.Srivatsavai@Sun.COM 	uint16_t	bf_vcnt;	/* number of duplicates */
222*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bf_nlinks;	/* number of links in bf_links */
223*10491SRishi.Srivatsavai@Sun.COM 	uint_t		bf_maxlinks;	/* allocated size of link array */
224*10491SRishi.Srivatsavai@Sun.COM 	bridge_link_t	**bf_links;
225*10491SRishi.Srivatsavai@Sun.COM } bridge_fwd_t;
226*10491SRishi.Srivatsavai@Sun.COM 
227*10491SRishi.Srivatsavai@Sun.COM #define	BFF_INTREE	0x0001
228*10491SRishi.Srivatsavai@Sun.COM #define	BFF_LOCALADDR	0x0002		/* address is known to mac layer */
229*10491SRishi.Srivatsavai@Sun.COM #define	BFF_VLANLOCAL	0x0004		/* set if duplicate for IVL */
230*10491SRishi.Srivatsavai@Sun.COM 
231*10491SRishi.Srivatsavai@Sun.COM /* TRILL linkage */
232*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_recv_pkt_t)(void *, bridge_link_t *, mac_resource_handle_t,
233*10491SRishi.Srivatsavai@Sun.COM     mblk_t *, mac_header_info_t *);
234*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_encap_pkt_t)(void *, bridge_link_t *, mac_header_info_t *,
235*10491SRishi.Srivatsavai@Sun.COM     mblk_t *, uint16_t);
236*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_br_dstr_t)(void *, bridge_inst_t *);
237*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_ln_dstr_t)(void *, bridge_link_t *);
238*10491SRishi.Srivatsavai@Sun.COM 
239*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_register_cb(trill_recv_pkt_t, trill_encap_pkt_t,
240*10491SRishi.Srivatsavai@Sun.COM     trill_br_dstr_t, trill_ln_dstr_t);
241*10491SRishi.Srivatsavai@Sun.COM extern bridge_inst_t *bridge_trill_brref(const char *, void *);
242*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_brunref(bridge_inst_t *);
243*10491SRishi.Srivatsavai@Sun.COM extern bridge_link_t *bridge_trill_lnref(bridge_inst_t *, datalink_id_t,
244*10491SRishi.Srivatsavai@Sun.COM     void *);
245*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_lnunref(bridge_link_t *);
246*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_decaps(bridge_link_t *, mblk_t *, uint16_t);
247*10491SRishi.Srivatsavai@Sun.COM extern mblk_t *bridge_trill_output(bridge_link_t *, mblk_t *);
248*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_setvlans(bridge_link_t *, const uint8_t *);
249*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_flush(bridge_link_t *, uint16_t, boolean_t);
250*10491SRishi.Srivatsavai@Sun.COM 
251*10491SRishi.Srivatsavai@Sun.COM /* Ethernet multicast address; constant stored in bridge module */
252*10491SRishi.Srivatsavai@Sun.COM extern const uint8_t all_isis_rbridges[];
253*10491SRishi.Srivatsavai@Sun.COM extern const uint8_t bridge_group_address[];
254*10491SRishi.Srivatsavai@Sun.COM 
255*10491SRishi.Srivatsavai@Sun.COM #ifdef __cplusplus
256*10491SRishi.Srivatsavai@Sun.COM }
257*10491SRishi.Srivatsavai@Sun.COM #endif
258*10491SRishi.Srivatsavai@Sun.COM 
259*10491SRishi.Srivatsavai@Sun.COM #endif /* _BRIDGE_IMPL_H */
260