xref: /aosp_15_r20/external/libnl/lib/route/link/bridge_info.c (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2022 MaxLinear, Inc.
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker  * @ingroup link
8*4dc78e53SAndroid Build Coastguard Worker  * @defgroup bridge Bridging
9*4dc78e53SAndroid Build Coastguard Worker  *
10*4dc78e53SAndroid Build Coastguard Worker  * @details
11*4dc78e53SAndroid Build Coastguard Worker  * @{
12*4dc78e53SAndroid Build Coastguard Worker  */
13*4dc78e53SAndroid Build Coastguard Worker 
14*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
15*4dc78e53SAndroid Build Coastguard Worker 
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/bridge_info.h>
17*4dc78e53SAndroid Build Coastguard Worker 
18*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
19*4dc78e53SAndroid Build Coastguard Worker #include "link-api.h"
20*4dc78e53SAndroid Build Coastguard Worker 
21*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_VLAN_FILTERING (1 << 0)
22*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_VLAN_PROTOCOL (1 << 1)
23*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_VLAN_STATS_ENABLED (1 << 2)
24*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_AGEING_TIME (1 << 3)
25*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_VLAN_DEFAULT_PVID (1 << 4)
26*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_NF_CALL_IPTABLES (1 << 5)
27*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_NF_CALL_IP6TABLES (1 << 6)
28*4dc78e53SAndroid Build Coastguard Worker #define BRIDGE_ATTR_NF_CALL_ARPTABLES (1 << 7)
29*4dc78e53SAndroid Build Coastguard Worker 
30*4dc78e53SAndroid Build Coastguard Worker struct bridge_info {
31*4dc78e53SAndroid Build Coastguard Worker 	uint32_t ce_mask; /* to support attr macros */
32*4dc78e53SAndroid Build Coastguard Worker 	uint32_t b_ageing_time;
33*4dc78e53SAndroid Build Coastguard Worker 	uint16_t b_vlan_protocol;
34*4dc78e53SAndroid Build Coastguard Worker 	uint16_t b_vlan_default_pvid;
35*4dc78e53SAndroid Build Coastguard Worker 	uint8_t b_vlan_filtering;
36*4dc78e53SAndroid Build Coastguard Worker 	uint8_t b_vlan_stats_enabled;
37*4dc78e53SAndroid Build Coastguard Worker 	uint8_t b_nf_call_iptables;
38*4dc78e53SAndroid Build Coastguard Worker 	uint8_t b_nf_call_ip6tables;
39*4dc78e53SAndroid Build Coastguard Worker 	uint8_t b_nf_call_arptables;
40*4dc78e53SAndroid Build Coastguard Worker };
41*4dc78e53SAndroid Build Coastguard Worker 
42*4dc78e53SAndroid Build Coastguard Worker static const struct nla_policy bi_attrs_policy[IFLA_BR_MAX + 1] = {
43*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_AGEING_TIME] = { .type = NLA_U32 },
44*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_VLAN_DEFAULT_PVID] = { .type = NLA_U16 },
45*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_VLAN_FILTERING] = { .type = NLA_U8 },
46*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_VLAN_PROTOCOL] = { .type = NLA_U16 },
47*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_VLAN_STATS_ENABLED] = { .type = NLA_U8 },
48*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_NF_CALL_IPTABLES] = { .type = NLA_U8 },
49*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_NF_CALL_IP6TABLES] = { .type = NLA_U8 },
50*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_BR_NF_CALL_ARPTABLES] = { .type = NLA_U8 },
51*4dc78e53SAndroid Build Coastguard Worker };
52*4dc78e53SAndroid Build Coastguard Worker 
bridge_info(struct rtnl_link * link)53*4dc78e53SAndroid Build Coastguard Worker static inline struct bridge_info *bridge_info(struct rtnl_link *link)
54*4dc78e53SAndroid Build Coastguard Worker {
55*4dc78e53SAndroid Build Coastguard Worker 	return link->l_info;
56*4dc78e53SAndroid Build Coastguard Worker }
57*4dc78e53SAndroid Build Coastguard Worker 
bridge_info_alloc(struct rtnl_link * link)58*4dc78e53SAndroid Build Coastguard Worker static int bridge_info_alloc(struct rtnl_link *link)
59*4dc78e53SAndroid Build Coastguard Worker {
60*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi;
61*4dc78e53SAndroid Build Coastguard Worker 
62*4dc78e53SAndroid Build Coastguard Worker 	if (link->l_info)
63*4dc78e53SAndroid Build Coastguard Worker 		memset(link->l_info, 0, sizeof(*bi));
64*4dc78e53SAndroid Build Coastguard Worker 	else {
65*4dc78e53SAndroid Build Coastguard Worker 		bi = calloc(1, sizeof(*bi));
66*4dc78e53SAndroid Build Coastguard Worker 		if (!bi)
67*4dc78e53SAndroid Build Coastguard Worker 			return -NLE_NOMEM;
68*4dc78e53SAndroid Build Coastguard Worker 
69*4dc78e53SAndroid Build Coastguard Worker 		link->l_info = bi;
70*4dc78e53SAndroid Build Coastguard Worker 	}
71*4dc78e53SAndroid Build Coastguard Worker 
72*4dc78e53SAndroid Build Coastguard Worker 	return 0;
73*4dc78e53SAndroid Build Coastguard Worker }
74*4dc78e53SAndroid Build Coastguard Worker 
bridge_info_parse(struct rtnl_link * link,struct nlattr * data,struct nlattr * xstats)75*4dc78e53SAndroid Build Coastguard Worker static int bridge_info_parse(struct rtnl_link *link, struct nlattr *data,
76*4dc78e53SAndroid Build Coastguard Worker 			     struct nlattr *xstats)
77*4dc78e53SAndroid Build Coastguard Worker {
78*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr *tb[IFLA_BR_MAX + 1];
79*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi;
80*4dc78e53SAndroid Build Coastguard Worker 	int err;
81*4dc78e53SAndroid Build Coastguard Worker 
82*4dc78e53SAndroid Build Coastguard Worker 	NL_DBG(3, "Parsing Bridge link info\n");
83*4dc78e53SAndroid Build Coastguard Worker 
84*4dc78e53SAndroid Build Coastguard Worker 	if ((err = nla_parse_nested(tb, IFLA_BR_MAX, data, bi_attrs_policy)) <
85*4dc78e53SAndroid Build Coastguard Worker 	    0)
86*4dc78e53SAndroid Build Coastguard Worker 		return err;
87*4dc78e53SAndroid Build Coastguard Worker 
88*4dc78e53SAndroid Build Coastguard Worker 	if ((err = bridge_info_alloc(link)) < 0)
89*4dc78e53SAndroid Build Coastguard Worker 		return err;
90*4dc78e53SAndroid Build Coastguard Worker 
91*4dc78e53SAndroid Build Coastguard Worker 	bi = link->l_info;
92*4dc78e53SAndroid Build Coastguard Worker 
93*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_AGEING_TIME]) {
94*4dc78e53SAndroid Build Coastguard Worker 		bi->b_ageing_time = nla_get_u32(tb[IFLA_BR_AGEING_TIME]);
95*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_AGEING_TIME;
96*4dc78e53SAndroid Build Coastguard Worker 	}
97*4dc78e53SAndroid Build Coastguard Worker 
98*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_VLAN_DEFAULT_PVID]) {
99*4dc78e53SAndroid Build Coastguard Worker 		bi->b_vlan_default_pvid =
100*4dc78e53SAndroid Build Coastguard Worker 			nla_get_u16(tb[IFLA_BR_VLAN_DEFAULT_PVID]);
101*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_VLAN_DEFAULT_PVID;
102*4dc78e53SAndroid Build Coastguard Worker 	}
103*4dc78e53SAndroid Build Coastguard Worker 
104*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_VLAN_FILTERING]) {
105*4dc78e53SAndroid Build Coastguard Worker 		bi->b_vlan_filtering = nla_get_u8(tb[IFLA_BR_VLAN_FILTERING]);
106*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_VLAN_FILTERING;
107*4dc78e53SAndroid Build Coastguard Worker 	}
108*4dc78e53SAndroid Build Coastguard Worker 
109*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_VLAN_PROTOCOL]) {
110*4dc78e53SAndroid Build Coastguard Worker 		bi->b_vlan_protocol =
111*4dc78e53SAndroid Build Coastguard Worker 			ntohs(nla_get_u16(tb[IFLA_BR_VLAN_PROTOCOL]));
112*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_VLAN_PROTOCOL;
113*4dc78e53SAndroid Build Coastguard Worker 	}
114*4dc78e53SAndroid Build Coastguard Worker 
115*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_VLAN_STATS_ENABLED]) {
116*4dc78e53SAndroid Build Coastguard Worker 		bi->b_vlan_stats_enabled =
117*4dc78e53SAndroid Build Coastguard Worker 			nla_get_u8(tb[IFLA_BR_VLAN_STATS_ENABLED]);
118*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_VLAN_STATS_ENABLED;
119*4dc78e53SAndroid Build Coastguard Worker 	}
120*4dc78e53SAndroid Build Coastguard Worker 
121*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_NF_CALL_IPTABLES]) {
122*4dc78e53SAndroid Build Coastguard Worker 		bi->b_nf_call_iptables =
123*4dc78e53SAndroid Build Coastguard Worker 			nla_get_u8(tb[IFLA_BR_NF_CALL_IPTABLES]);
124*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IPTABLES;
125*4dc78e53SAndroid Build Coastguard Worker 	}
126*4dc78e53SAndroid Build Coastguard Worker 
127*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_NF_CALL_IP6TABLES]) {
128*4dc78e53SAndroid Build Coastguard Worker 		bi->b_nf_call_ip6tables =
129*4dc78e53SAndroid Build Coastguard Worker 			nla_get_u8(tb[IFLA_BR_NF_CALL_IP6TABLES]);
130*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IP6TABLES;
131*4dc78e53SAndroid Build Coastguard Worker 	}
132*4dc78e53SAndroid Build Coastguard Worker 
133*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_BR_NF_CALL_ARPTABLES]) {
134*4dc78e53SAndroid Build Coastguard Worker 		bi->b_nf_call_arptables =
135*4dc78e53SAndroid Build Coastguard Worker 			nla_get_u8(tb[IFLA_BR_NF_CALL_ARPTABLES]);
136*4dc78e53SAndroid Build Coastguard Worker 		bi->ce_mask |= BRIDGE_ATTR_NF_CALL_ARPTABLES;
137*4dc78e53SAndroid Build Coastguard Worker 	}
138*4dc78e53SAndroid Build Coastguard Worker 
139*4dc78e53SAndroid Build Coastguard Worker 	return 0;
140*4dc78e53SAndroid Build Coastguard Worker }
141*4dc78e53SAndroid Build Coastguard Worker 
bridge_info_put_attrs(struct nl_msg * msg,struct rtnl_link * link)142*4dc78e53SAndroid Build Coastguard Worker static int bridge_info_put_attrs(struct nl_msg *msg, struct rtnl_link *link)
143*4dc78e53SAndroid Build Coastguard Worker {
144*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = link->l_info;
145*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr *data;
146*4dc78e53SAndroid Build Coastguard Worker 
147*4dc78e53SAndroid Build Coastguard Worker 	data = nla_nest_start(msg, IFLA_INFO_DATA);
148*4dc78e53SAndroid Build Coastguard Worker 	if (!data)
149*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_MSGSIZE;
150*4dc78e53SAndroid Build Coastguard Worker 
151*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_AGEING_TIME)
152*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U32(msg, IFLA_BR_AGEING_TIME, bi->b_ageing_time);
153*4dc78e53SAndroid Build Coastguard Worker 
154*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_VLAN_FILTERING)
155*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U8(msg, IFLA_BR_VLAN_FILTERING, bi->b_vlan_filtering);
156*4dc78e53SAndroid Build Coastguard Worker 
157*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_VLAN_DEFAULT_PVID)
158*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U16(msg, IFLA_BR_VLAN_DEFAULT_PVID,
159*4dc78e53SAndroid Build Coastguard Worker 			    bi->b_vlan_default_pvid);
160*4dc78e53SAndroid Build Coastguard Worker 
161*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_VLAN_PROTOCOL)
162*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U16(msg, IFLA_BR_VLAN_PROTOCOL,
163*4dc78e53SAndroid Build Coastguard Worker 			    htons(bi->b_vlan_protocol));
164*4dc78e53SAndroid Build Coastguard Worker 
165*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_VLAN_STATS_ENABLED)
166*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U8(msg, IFLA_BR_VLAN_STATS_ENABLED,
167*4dc78e53SAndroid Build Coastguard Worker 			   bi->b_vlan_stats_enabled);
168*4dc78e53SAndroid Build Coastguard Worker 
169*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_NF_CALL_IPTABLES)
170*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U8(msg, IFLA_BR_NF_CALL_IPTABLES,
171*4dc78e53SAndroid Build Coastguard Worker 			   bi->b_nf_call_iptables);
172*4dc78e53SAndroid Build Coastguard Worker 
173*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_NF_CALL_IP6TABLES)
174*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U8(msg, IFLA_BR_NF_CALL_IP6TABLES,
175*4dc78e53SAndroid Build Coastguard Worker 			   bi->b_nf_call_ip6tables);
176*4dc78e53SAndroid Build Coastguard Worker 
177*4dc78e53SAndroid Build Coastguard Worker 	if (bi->ce_mask & BRIDGE_ATTR_NF_CALL_ARPTABLES)
178*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U8(msg, IFLA_BR_NF_CALL_ARPTABLES,
179*4dc78e53SAndroid Build Coastguard Worker 			   bi->b_nf_call_arptables);
180*4dc78e53SAndroid Build Coastguard Worker 
181*4dc78e53SAndroid Build Coastguard Worker 	nla_nest_end(msg, data);
182*4dc78e53SAndroid Build Coastguard Worker 	return 0;
183*4dc78e53SAndroid Build Coastguard Worker 
184*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
185*4dc78e53SAndroid Build Coastguard Worker 	nla_nest_cancel(msg, data);
186*4dc78e53SAndroid Build Coastguard Worker 	return -NLE_MSGSIZE;
187*4dc78e53SAndroid Build Coastguard Worker }
188*4dc78e53SAndroid Build Coastguard Worker 
bridge_info_free(struct rtnl_link * link)189*4dc78e53SAndroid Build Coastguard Worker static void bridge_info_free(struct rtnl_link *link)
190*4dc78e53SAndroid Build Coastguard Worker {
191*4dc78e53SAndroid Build Coastguard Worker 	_nl_clear_free(&link->l_info);
192*4dc78e53SAndroid Build Coastguard Worker }
193*4dc78e53SAndroid Build Coastguard Worker 
194*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_link_info_ops bridge_info_ops = {
195*4dc78e53SAndroid Build Coastguard Worker 	.io_name = "bridge",
196*4dc78e53SAndroid Build Coastguard Worker 	.io_alloc = bridge_info_alloc,
197*4dc78e53SAndroid Build Coastguard Worker 	.io_parse = bridge_info_parse,
198*4dc78e53SAndroid Build Coastguard Worker 	.io_put_attrs = bridge_info_put_attrs,
199*4dc78e53SAndroid Build Coastguard Worker 	.io_free = bridge_info_free,
200*4dc78e53SAndroid Build Coastguard Worker };
201*4dc78e53SAndroid Build Coastguard Worker 
202*4dc78e53SAndroid Build Coastguard Worker #define IS_BRIDGE_INFO_ASSERT(link)                                                      \
203*4dc78e53SAndroid Build Coastguard Worker 	do {                                                                             \
204*4dc78e53SAndroid Build Coastguard Worker 		if ((link)->l_info_ops != &bridge_info_ops) {                            \
205*4dc78e53SAndroid Build Coastguard Worker 			APPBUG("Link is not a bridge link. Set type \"bridge\" first."); \
206*4dc78e53SAndroid Build Coastguard Worker 		}                                                                        \
207*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
208*4dc78e53SAndroid Build Coastguard Worker 
209*4dc78e53SAndroid Build Coastguard Worker /**
210*4dc78e53SAndroid Build Coastguard Worker  * Set ageing time for dynamic forwarding entries
211*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
212*4dc78e53SAndroid Build Coastguard Worker  * @arg ageing_time	Interval to set.
213*4dc78e53SAndroid Build Coastguard Worker  *
214*4dc78e53SAndroid Build Coastguard Worker  * @return void
215*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_ageing_time(struct rtnl_link * link,uint32_t ageing_time)216*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_ageing_time(struct rtnl_link *link,
217*4dc78e53SAndroid Build Coastguard Worker 				      uint32_t ageing_time)
218*4dc78e53SAndroid Build Coastguard Worker {
219*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
220*4dc78e53SAndroid Build Coastguard Worker 
221*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
222*4dc78e53SAndroid Build Coastguard Worker 
223*4dc78e53SAndroid Build Coastguard Worker 	bi->b_ageing_time = ageing_time;
224*4dc78e53SAndroid Build Coastguard Worker 
225*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_AGEING_TIME;
226*4dc78e53SAndroid Build Coastguard Worker }
227*4dc78e53SAndroid Build Coastguard Worker 
228*4dc78e53SAndroid Build Coastguard Worker /**
229*4dc78e53SAndroid Build Coastguard Worker  * Get ageing time for dynamic forwarding entries
230*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
231*4dc78e53SAndroid Build Coastguard Worker  * @arg ageing_time	Output argument.
232*4dc78e53SAndroid Build Coastguard Worker  *
233*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_set_ageing_time()
234*4dc78e53SAndroid Build Coastguard Worker  * @return Zero on success, otherwise a negative error code.
235*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_NOATTR
236*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_INVAL
237*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_get_ageing_time(struct rtnl_link * link,uint32_t * ageing_time)238*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_bridge_get_ageing_time(struct rtnl_link *link,
239*4dc78e53SAndroid Build Coastguard Worker 				     uint32_t *ageing_time)
240*4dc78e53SAndroid Build Coastguard Worker {
241*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
242*4dc78e53SAndroid Build Coastguard Worker 
243*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
244*4dc78e53SAndroid Build Coastguard Worker 
245*4dc78e53SAndroid Build Coastguard Worker 	if (!(bi->ce_mask & BRIDGE_ATTR_AGEING_TIME))
246*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
247*4dc78e53SAndroid Build Coastguard Worker 
248*4dc78e53SAndroid Build Coastguard Worker 	if (!ageing_time)
249*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_INVAL;
250*4dc78e53SAndroid Build Coastguard Worker 
251*4dc78e53SAndroid Build Coastguard Worker 	*ageing_time = bi->b_ageing_time;
252*4dc78e53SAndroid Build Coastguard Worker 
253*4dc78e53SAndroid Build Coastguard Worker 	return 0;
254*4dc78e53SAndroid Build Coastguard Worker }
255*4dc78e53SAndroid Build Coastguard Worker 
256*4dc78e53SAndroid Build Coastguard Worker /**
257*4dc78e53SAndroid Build Coastguard Worker  * Set VLAN filtering flag
258*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
259*4dc78e53SAndroid Build Coastguard Worker  * @arg vlan_filtering	VLAN_filtering boolean flag to set.
260*4dc78e53SAndroid Build Coastguard Worker  *
261*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_get_vlan_filtering()
262*4dc78e53SAndroid Build Coastguard Worker  *
263*4dc78e53SAndroid Build Coastguard Worker  * @return void
264*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_vlan_filtering(struct rtnl_link * link,uint8_t vlan_filtering)265*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_vlan_filtering(struct rtnl_link *link,
266*4dc78e53SAndroid Build Coastguard Worker 					 uint8_t vlan_filtering)
267*4dc78e53SAndroid Build Coastguard Worker {
268*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
269*4dc78e53SAndroid Build Coastguard Worker 
270*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
271*4dc78e53SAndroid Build Coastguard Worker 
272*4dc78e53SAndroid Build Coastguard Worker 	bi->b_vlan_filtering = vlan_filtering;
273*4dc78e53SAndroid Build Coastguard Worker 
274*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_VLAN_FILTERING;
275*4dc78e53SAndroid Build Coastguard Worker }
276*4dc78e53SAndroid Build Coastguard Worker 
277*4dc78e53SAndroid Build Coastguard Worker /**
278*4dc78e53SAndroid Build Coastguard Worker  * Get VLAN filtering flag
279*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
280*4dc78e53SAndroid Build Coastguard Worker  * @arg vlan_filtering	Output argument.
281*4dc78e53SAndroid Build Coastguard Worker  *
282*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_set_vlan_filtering()
283*4dc78e53SAndroid Build Coastguard Worker  *
284*4dc78e53SAndroid Build Coastguard Worker  * @return Zero on success, otherwise a negative error code.
285*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_NOATTR
286*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_INVAL
287*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_get_vlan_filtering(struct rtnl_link * link,uint8_t * vlan_filtering)288*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_bridge_get_vlan_filtering(struct rtnl_link *link,
289*4dc78e53SAndroid Build Coastguard Worker 					uint8_t *vlan_filtering)
290*4dc78e53SAndroid Build Coastguard Worker {
291*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
292*4dc78e53SAndroid Build Coastguard Worker 
293*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
294*4dc78e53SAndroid Build Coastguard Worker 
295*4dc78e53SAndroid Build Coastguard Worker 	if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_FILTERING))
296*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
297*4dc78e53SAndroid Build Coastguard Worker 
298*4dc78e53SAndroid Build Coastguard Worker 	if (!vlan_filtering)
299*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_INVAL;
300*4dc78e53SAndroid Build Coastguard Worker 
301*4dc78e53SAndroid Build Coastguard Worker 	*vlan_filtering = bi->b_vlan_filtering;
302*4dc78e53SAndroid Build Coastguard Worker 	return 0;
303*4dc78e53SAndroid Build Coastguard Worker }
304*4dc78e53SAndroid Build Coastguard Worker 
305*4dc78e53SAndroid Build Coastguard Worker /**
306*4dc78e53SAndroid Build Coastguard Worker  * Set VLAN protocol
307*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
308*4dc78e53SAndroid Build Coastguard Worker  * @arg vlan_protocol	VLAN protocol to set. The protocol
309*4dc78e53SAndroid Build Coastguard Worker  *   numbers is in host byte order.
310*4dc78e53SAndroid Build Coastguard Worker  *
311*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_get_vlan_protocol()
312*4dc78e53SAndroid Build Coastguard Worker  *
313*4dc78e53SAndroid Build Coastguard Worker  * @return void
314*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_vlan_protocol(struct rtnl_link * link,uint16_t vlan_protocol)315*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_vlan_protocol(struct rtnl_link *link,
316*4dc78e53SAndroid Build Coastguard Worker 					uint16_t vlan_protocol)
317*4dc78e53SAndroid Build Coastguard Worker {
318*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
319*4dc78e53SAndroid Build Coastguard Worker 
320*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
321*4dc78e53SAndroid Build Coastguard Worker 
322*4dc78e53SAndroid Build Coastguard Worker 	bi->b_vlan_protocol = vlan_protocol;
323*4dc78e53SAndroid Build Coastguard Worker 
324*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_VLAN_PROTOCOL;
325*4dc78e53SAndroid Build Coastguard Worker }
326*4dc78e53SAndroid Build Coastguard Worker 
327*4dc78e53SAndroid Build Coastguard Worker /**
328*4dc78e53SAndroid Build Coastguard Worker  * Get VLAN protocol
329*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
330*4dc78e53SAndroid Build Coastguard Worker  * @arg vlan_protocol	Output argument. The protocol number is in host byte order.
331*4dc78e53SAndroid Build Coastguard Worker  *
332*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_set_vlan_protocol()
333*4dc78e53SAndroid Build Coastguard Worker  *
334*4dc78e53SAndroid Build Coastguard Worker  * @return Zero on success, otherwise a negative error code.
335*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_NOATTR
336*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_INVAL
337*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_get_vlan_protocol(struct rtnl_link * link,uint16_t * vlan_protocol)338*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_bridge_get_vlan_protocol(struct rtnl_link *link,
339*4dc78e53SAndroid Build Coastguard Worker 				       uint16_t *vlan_protocol)
340*4dc78e53SAndroid Build Coastguard Worker {
341*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
342*4dc78e53SAndroid Build Coastguard Worker 
343*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
344*4dc78e53SAndroid Build Coastguard Worker 
345*4dc78e53SAndroid Build Coastguard Worker 	if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_PROTOCOL))
346*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
347*4dc78e53SAndroid Build Coastguard Worker 
348*4dc78e53SAndroid Build Coastguard Worker 	if (!vlan_protocol)
349*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_INVAL;
350*4dc78e53SAndroid Build Coastguard Worker 
351*4dc78e53SAndroid Build Coastguard Worker 	*vlan_protocol = bi->b_vlan_protocol;
352*4dc78e53SAndroid Build Coastguard Worker 
353*4dc78e53SAndroid Build Coastguard Worker 	return 0;
354*4dc78e53SAndroid Build Coastguard Worker }
355*4dc78e53SAndroid Build Coastguard Worker 
356*4dc78e53SAndroid Build Coastguard Worker /**
357*4dc78e53SAndroid Build Coastguard Worker  * Set VLAN default pvid
358*4dc78e53SAndroid Build Coastguard Worker  * @arg link			Link object of type bridge
359*4dc78e53SAndroid Build Coastguard Worker  * @arg default pvid	VLAN default pvid to set.
360*4dc78e53SAndroid Build Coastguard Worker  *
361*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_get_vlan_default_pvid()
362*4dc78e53SAndroid Build Coastguard Worker  *
363*4dc78e53SAndroid Build Coastguard Worker  * @return void
364*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_vlan_default_pvid(struct rtnl_link * link,uint16_t default_pvid)365*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_vlan_default_pvid(struct rtnl_link *link,
366*4dc78e53SAndroid Build Coastguard Worker 					    uint16_t default_pvid)
367*4dc78e53SAndroid Build Coastguard Worker {
368*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
369*4dc78e53SAndroid Build Coastguard Worker 
370*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
371*4dc78e53SAndroid Build Coastguard Worker 
372*4dc78e53SAndroid Build Coastguard Worker 	bi->b_vlan_default_pvid = default_pvid;
373*4dc78e53SAndroid Build Coastguard Worker 
374*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_VLAN_DEFAULT_PVID;
375*4dc78e53SAndroid Build Coastguard Worker }
376*4dc78e53SAndroid Build Coastguard Worker 
377*4dc78e53SAndroid Build Coastguard Worker /**
378*4dc78e53SAndroid Build Coastguard Worker  * Get VLAN default pvid
379*4dc78e53SAndroid Build Coastguard Worker  * @arg link			Link object of type bridge
380*4dc78e53SAndroid Build Coastguard Worker  * @arg default_pvid	Output argument.
381*4dc78e53SAndroid Build Coastguard Worker  *
382*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_set_vlan_default_pvid()
383*4dc78e53SAndroid Build Coastguard Worker  *
384*4dc78e53SAndroid Build Coastguard Worker  * @return Zero on success, otherwise a negative error code.
385*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_NOATTR
386*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_INVAL
387*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_get_vlan_default_pvid(struct rtnl_link * link,uint16_t * default_pvid)388*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_bridge_get_vlan_default_pvid(struct rtnl_link *link,
389*4dc78e53SAndroid Build Coastguard Worker 					   uint16_t *default_pvid)
390*4dc78e53SAndroid Build Coastguard Worker {
391*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
392*4dc78e53SAndroid Build Coastguard Worker 
393*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
394*4dc78e53SAndroid Build Coastguard Worker 
395*4dc78e53SAndroid Build Coastguard Worker 	if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_DEFAULT_PVID))
396*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
397*4dc78e53SAndroid Build Coastguard Worker 
398*4dc78e53SAndroid Build Coastguard Worker 	if (!default_pvid)
399*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_INVAL;
400*4dc78e53SAndroid Build Coastguard Worker 
401*4dc78e53SAndroid Build Coastguard Worker 	*default_pvid = bi->b_vlan_default_pvid;
402*4dc78e53SAndroid Build Coastguard Worker 
403*4dc78e53SAndroid Build Coastguard Worker 	return 0;
404*4dc78e53SAndroid Build Coastguard Worker }
405*4dc78e53SAndroid Build Coastguard Worker 
406*4dc78e53SAndroid Build Coastguard Worker /**
407*4dc78e53SAndroid Build Coastguard Worker  * Set VLAN stats enabled flag
408*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
409*4dc78e53SAndroid Build Coastguard Worker  * @arg vlan_stats_enabled	VLAN stats enabled flag to set
410*4dc78e53SAndroid Build Coastguard Worker  *
411*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_get_vlan_stats_enabled()
412*4dc78e53SAndroid Build Coastguard Worker  *
413*4dc78e53SAndroid Build Coastguard Worker  * @return void
414*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_vlan_stats_enabled(struct rtnl_link * link,uint8_t vlan_stats_enabled)415*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_vlan_stats_enabled(struct rtnl_link *link,
416*4dc78e53SAndroid Build Coastguard Worker 					     uint8_t vlan_stats_enabled)
417*4dc78e53SAndroid Build Coastguard Worker {
418*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
419*4dc78e53SAndroid Build Coastguard Worker 
420*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
421*4dc78e53SAndroid Build Coastguard Worker 
422*4dc78e53SAndroid Build Coastguard Worker 	bi->b_vlan_stats_enabled = vlan_stats_enabled;
423*4dc78e53SAndroid Build Coastguard Worker 
424*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_VLAN_STATS_ENABLED;
425*4dc78e53SAndroid Build Coastguard Worker }
426*4dc78e53SAndroid Build Coastguard Worker 
427*4dc78e53SAndroid Build Coastguard Worker /**
428*4dc78e53SAndroid Build Coastguard Worker  * Get VLAN stats enabled flag
429*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
430*4dc78e53SAndroid Build Coastguard Worker  * @arg vlan_stats_enabled	Output argument.
431*4dc78e53SAndroid Build Coastguard Worker  *
432*4dc78e53SAndroid Build Coastguard Worker  * @see rtnl_link_bridge_set_vlan_stats_enabled()
433*4dc78e53SAndroid Build Coastguard Worker  *
434*4dc78e53SAndroid Build Coastguard Worker  * @return Zero on success, otherwise a negative error code.
435*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_NOATTR
436*4dc78e53SAndroid Build Coastguard Worker  * @retval -NLE_INVAL
437*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_get_vlan_stats_enabled(struct rtnl_link * link,uint8_t * vlan_stats_enabled)438*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_bridge_get_vlan_stats_enabled(struct rtnl_link *link,
439*4dc78e53SAndroid Build Coastguard Worker 					    uint8_t *vlan_stats_enabled)
440*4dc78e53SAndroid Build Coastguard Worker {
441*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
442*4dc78e53SAndroid Build Coastguard Worker 
443*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
444*4dc78e53SAndroid Build Coastguard Worker 
445*4dc78e53SAndroid Build Coastguard Worker 	if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_STATS_ENABLED))
446*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
447*4dc78e53SAndroid Build Coastguard Worker 
448*4dc78e53SAndroid Build Coastguard Worker 	if (!vlan_stats_enabled)
449*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_INVAL;
450*4dc78e53SAndroid Build Coastguard Worker 
451*4dc78e53SAndroid Build Coastguard Worker 	*vlan_stats_enabled = bi->b_vlan_stats_enabled;
452*4dc78e53SAndroid Build Coastguard Worker 
453*4dc78e53SAndroid Build Coastguard Worker 	return 0;
454*4dc78e53SAndroid Build Coastguard Worker }
455*4dc78e53SAndroid Build Coastguard Worker 
456*4dc78e53SAndroid Build Coastguard Worker /**
457*4dc78e53SAndroid Build Coastguard Worker  * Set call enabled flag for passing IPv4 traffic to iptables
458*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
459*4dc78e53SAndroid Build Coastguard Worker  * @arg call_enabled	call enabled boolean flag to set.
460*4dc78e53SAndroid Build Coastguard Worker  *
461*4dc78e53SAndroid Build Coastguard Worker  * @return void
462*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_nf_call_iptables(struct rtnl_link * link,uint8_t call_enabled)463*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_nf_call_iptables(struct rtnl_link *link,
464*4dc78e53SAndroid Build Coastguard Worker 					   uint8_t call_enabled)
465*4dc78e53SAndroid Build Coastguard Worker {
466*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
467*4dc78e53SAndroid Build Coastguard Worker 
468*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
469*4dc78e53SAndroid Build Coastguard Worker 
470*4dc78e53SAndroid Build Coastguard Worker 	bi->b_nf_call_iptables = call_enabled;
471*4dc78e53SAndroid Build Coastguard Worker 
472*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IPTABLES;
473*4dc78e53SAndroid Build Coastguard Worker }
474*4dc78e53SAndroid Build Coastguard Worker 
475*4dc78e53SAndroid Build Coastguard Worker /**
476*4dc78e53SAndroid Build Coastguard Worker  * Set call enabled flag for passing IPv6 traffic to ip6tables
477*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
478*4dc78e53SAndroid Build Coastguard Worker  * @arg call_enabled	call enabled boolean flag to set.
479*4dc78e53SAndroid Build Coastguard Worker  *
480*4dc78e53SAndroid Build Coastguard Worker  * @return void
481*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_nf_call_ip6tables(struct rtnl_link * link,uint8_t call_enabled)482*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_nf_call_ip6tables(struct rtnl_link *link,
483*4dc78e53SAndroid Build Coastguard Worker 					    uint8_t call_enabled)
484*4dc78e53SAndroid Build Coastguard Worker {
485*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
486*4dc78e53SAndroid Build Coastguard Worker 
487*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
488*4dc78e53SAndroid Build Coastguard Worker 
489*4dc78e53SAndroid Build Coastguard Worker 	bi->b_nf_call_ip6tables = call_enabled;
490*4dc78e53SAndroid Build Coastguard Worker 
491*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IP6TABLES;
492*4dc78e53SAndroid Build Coastguard Worker }
493*4dc78e53SAndroid Build Coastguard Worker 
494*4dc78e53SAndroid Build Coastguard Worker /**
495*4dc78e53SAndroid Build Coastguard Worker  * Set call enabled flag for passing ARP traffic to arptables
496*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object of type bridge
497*4dc78e53SAndroid Build Coastguard Worker  * @arg call_enabled	call enabled boolean flag to set.
498*4dc78e53SAndroid Build Coastguard Worker  *
499*4dc78e53SAndroid Build Coastguard Worker  * @return void
500*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_bridge_set_nf_call_arptables(struct rtnl_link * link,uint8_t call_enabled)501*4dc78e53SAndroid Build Coastguard Worker void rtnl_link_bridge_set_nf_call_arptables(struct rtnl_link *link,
502*4dc78e53SAndroid Build Coastguard Worker 					    uint8_t call_enabled)
503*4dc78e53SAndroid Build Coastguard Worker {
504*4dc78e53SAndroid Build Coastguard Worker 	struct bridge_info *bi = bridge_info(link);
505*4dc78e53SAndroid Build Coastguard Worker 
506*4dc78e53SAndroid Build Coastguard Worker 	IS_BRIDGE_INFO_ASSERT(link);
507*4dc78e53SAndroid Build Coastguard Worker 
508*4dc78e53SAndroid Build Coastguard Worker 	bi->b_nf_call_arptables = call_enabled;
509*4dc78e53SAndroid Build Coastguard Worker 
510*4dc78e53SAndroid Build Coastguard Worker 	bi->ce_mask |= BRIDGE_ATTR_NF_CALL_ARPTABLES;
511*4dc78e53SAndroid Build Coastguard Worker }
512*4dc78e53SAndroid Build Coastguard Worker 
bridge_info_init(void)513*4dc78e53SAndroid Build Coastguard Worker static void _nl_init bridge_info_init(void)
514*4dc78e53SAndroid Build Coastguard Worker {
515*4dc78e53SAndroid Build Coastguard Worker 	rtnl_link_register_info(&bridge_info_ops);
516*4dc78e53SAndroid Build Coastguard Worker }
517*4dc78e53SAndroid Build Coastguard Worker 
bridge_info_exit(void)518*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit bridge_info_exit(void)
519*4dc78e53SAndroid Build Coastguard Worker {
520*4dc78e53SAndroid Build Coastguard Worker 	rtnl_link_unregister_info(&bridge_info_ops);
521*4dc78e53SAndroid Build Coastguard Worker }
522*4dc78e53SAndroid Build Coastguard Worker 
523*4dc78e53SAndroid Build Coastguard Worker /** @} */
524