14#include "nl-default.h"
16#include <netlink/route/link/bridge_info.h>
21#define BRIDGE_ATTR_VLAN_FILTERING (1 << 0)
22#define BRIDGE_ATTR_VLAN_PROTOCOL (1 << 1)
23#define BRIDGE_ATTR_VLAN_STATS_ENABLED (1 << 2)
24#define BRIDGE_ATTR_AGEING_TIME (1 << 3)
25#define BRIDGE_ATTR_VLAN_DEFAULT_PVID (1 << 4)
26#define BRIDGE_ATTR_NF_CALL_IPTABLES (1 << 5)
27#define BRIDGE_ATTR_NF_CALL_IP6TABLES (1 << 6)
28#define BRIDGE_ATTR_NF_CALL_ARPTABLES (1 << 7)
32 uint32_t b_ageing_time;
33 uint16_t b_vlan_protocol;
34 uint16_t b_vlan_default_pvid;
35 uint8_t b_vlan_filtering;
36 uint8_t b_vlan_stats_enabled;
37 uint8_t b_nf_call_iptables;
38 uint8_t b_nf_call_ip6tables;
39 uint8_t b_nf_call_arptables;
58static int bridge_info_alloc(
struct rtnl_link *link)
63 memset(link->l_info, 0,
sizeof(*bi));
65 bi = calloc(1,
sizeof(*bi));
75static int bridge_info_parse(
struct rtnl_link *link,
struct nlattr *data,
76 struct nlattr *xstats)
78 struct nlattr *tb[IFLA_BR_MAX + 1];
82 NL_DBG(3,
"Parsing Bridge link info\n");
88 if ((err = bridge_info_alloc(link)) < 0)
93 if (tb[IFLA_BR_AGEING_TIME]) {
94 bi->b_ageing_time =
nla_get_u32(tb[IFLA_BR_AGEING_TIME]);
95 bi->ce_mask |= BRIDGE_ATTR_AGEING_TIME;
98 if (tb[IFLA_BR_VLAN_DEFAULT_PVID]) {
99 bi->b_vlan_default_pvid =
101 bi->ce_mask |= BRIDGE_ATTR_VLAN_DEFAULT_PVID;
104 if (tb[IFLA_BR_VLAN_FILTERING]) {
105 bi->b_vlan_filtering =
nla_get_u8(tb[IFLA_BR_VLAN_FILTERING]);
106 bi->ce_mask |= BRIDGE_ATTR_VLAN_FILTERING;
109 if (tb[IFLA_BR_VLAN_PROTOCOL]) {
110 bi->b_vlan_protocol =
112 bi->ce_mask |= BRIDGE_ATTR_VLAN_PROTOCOL;
115 if (tb[IFLA_BR_VLAN_STATS_ENABLED]) {
116 bi->b_vlan_stats_enabled =
118 bi->ce_mask |= BRIDGE_ATTR_VLAN_STATS_ENABLED;
121 if (tb[IFLA_BR_NF_CALL_IPTABLES]) {
122 bi->b_nf_call_iptables =
124 bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IPTABLES;
127 if (tb[IFLA_BR_NF_CALL_IP6TABLES]) {
128 bi->b_nf_call_ip6tables =
130 bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IP6TABLES;
133 if (tb[IFLA_BR_NF_CALL_ARPTABLES]) {
134 bi->b_nf_call_arptables =
136 bi->ce_mask |= BRIDGE_ATTR_NF_CALL_ARPTABLES;
142static int bridge_info_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
151 if (bi->ce_mask & BRIDGE_ATTR_AGEING_TIME)
152 NLA_PUT_U32(msg, IFLA_BR_AGEING_TIME, bi->b_ageing_time);
154 if (bi->ce_mask & BRIDGE_ATTR_VLAN_FILTERING)
155 NLA_PUT_U8(msg, IFLA_BR_VLAN_FILTERING, bi->b_vlan_filtering);
157 if (bi->ce_mask & BRIDGE_ATTR_VLAN_DEFAULT_PVID)
159 bi->b_vlan_default_pvid);
161 if (bi->ce_mask & BRIDGE_ATTR_VLAN_PROTOCOL)
163 htons(bi->b_vlan_protocol));
165 if (bi->ce_mask & BRIDGE_ATTR_VLAN_STATS_ENABLED)
167 bi->b_vlan_stats_enabled);
169 if (bi->ce_mask & BRIDGE_ATTR_NF_CALL_IPTABLES)
171 bi->b_nf_call_iptables);
173 if (bi->ce_mask & BRIDGE_ATTR_NF_CALL_IP6TABLES)
175 bi->b_nf_call_ip6tables);
177 if (bi->ce_mask & BRIDGE_ATTR_NF_CALL_ARPTABLES)
179 bi->b_nf_call_arptables);
189static void bridge_info_free(
struct rtnl_link *link)
191 _nl_clear_free(&link->l_info);
196 .io_alloc = bridge_info_alloc,
197 .io_parse = bridge_info_parse,
198 .io_put_attrs = bridge_info_put_attrs,
199 .io_free = bridge_info_free,
202#define IS_BRIDGE_INFO_ASSERT(link) \
204 if ((link)->l_info_ops != &bridge_info_ops) { \
205 APPBUG("Link is not a bridge link. Set type \"bridge\" first."); \
217 uint32_t ageing_time)
221 IS_BRIDGE_INFO_ASSERT(link);
223 bi->b_ageing_time = ageing_time;
225 bi->ce_mask |= BRIDGE_ATTR_AGEING_TIME;
239 uint32_t *ageing_time)
243 IS_BRIDGE_INFO_ASSERT(link);
245 if (!(bi->ce_mask & BRIDGE_ATTR_AGEING_TIME))
251 *ageing_time = bi->b_ageing_time;
266 uint8_t vlan_filtering)
270 IS_BRIDGE_INFO_ASSERT(link);
272 bi->b_vlan_filtering = vlan_filtering;
274 bi->ce_mask |= BRIDGE_ATTR_VLAN_FILTERING;
289 uint8_t *vlan_filtering)
293 IS_BRIDGE_INFO_ASSERT(link);
295 if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_FILTERING))
301 *vlan_filtering = bi->b_vlan_filtering;
316 uint16_t vlan_protocol)
320 IS_BRIDGE_INFO_ASSERT(link);
322 bi->b_vlan_protocol = vlan_protocol;
324 bi->ce_mask |= BRIDGE_ATTR_VLAN_PROTOCOL;
339 uint16_t *vlan_protocol)
343 IS_BRIDGE_INFO_ASSERT(link);
345 if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_PROTOCOL))
351 *vlan_protocol = bi->b_vlan_protocol;
366 uint16_t default_pvid)
370 IS_BRIDGE_INFO_ASSERT(link);
372 bi->b_vlan_default_pvid = default_pvid;
374 bi->ce_mask |= BRIDGE_ATTR_VLAN_DEFAULT_PVID;
389 uint16_t *default_pvid)
393 IS_BRIDGE_INFO_ASSERT(link);
395 if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_DEFAULT_PVID))
401 *default_pvid = bi->b_vlan_default_pvid;
416 uint8_t vlan_stats_enabled)
420 IS_BRIDGE_INFO_ASSERT(link);
422 bi->b_vlan_stats_enabled = vlan_stats_enabled;
424 bi->ce_mask |= BRIDGE_ATTR_VLAN_STATS_ENABLED;
439 uint8_t *vlan_stats_enabled)
443 IS_BRIDGE_INFO_ASSERT(link);
445 if (!(bi->ce_mask & BRIDGE_ATTR_VLAN_STATS_ENABLED))
448 if (!vlan_stats_enabled)
451 *vlan_stats_enabled = bi->b_vlan_stats_enabled;
464 uint8_t call_enabled)
468 IS_BRIDGE_INFO_ASSERT(link);
470 bi->b_nf_call_iptables = call_enabled;
472 bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IPTABLES;
483 uint8_t call_enabled)
487 IS_BRIDGE_INFO_ASSERT(link);
489 bi->b_nf_call_ip6tables = call_enabled;
491 bi->ce_mask |= BRIDGE_ATTR_NF_CALL_IP6TABLES;
502 uint8_t call_enabled)
506 IS_BRIDGE_INFO_ASSERT(link);
508 bi->b_nf_call_arptables = call_enabled;
510 bi->ce_mask |= BRIDGE_ATTR_NF_CALL_ARPTABLES;
513static void _nl_init bridge_info_init(
void)
518static void _nl_exit bridge_info_exit(
void)
uint32_t nla_get_u32(const struct nlattr *nla)
Return payload of 32 bit integer attribute.
uint16_t nla_get_u16(const struct nlattr *nla)
Return payload of 16 bit integer attribute.
#define NLA_PUT_U16(msg, attrtype, value)
Add 16 bit integer attribute to netlink message.
#define NLA_PUT_U8(msg, attrtype, value)
Add 8 bit integer attribute to netlink message.
#define NLA_PUT_U32(msg, attrtype, value)
Add 32 bit integer attribute to netlink message.
uint8_t nla_get_u8(const struct nlattr *nla)
Return value of 8 bit integer attribute.
struct nlattr * nla_nest_start(struct nl_msg *msg, int attrtype)
Start a new level of nested attributes.
int nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, const struct nla_policy *policy)
Create attribute index based on nested attribute.
void nla_nest_cancel(struct nl_msg *msg, const struct nlattr *attr)
Cancel the addition of a nested attribute.
int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
Finalize nesting of attributes.
int rtnl_link_bridge_get_vlan_default_pvid(struct rtnl_link *link, uint16_t *default_pvid)
Get VLAN default pvid.
int rtnl_link_bridge_get_vlan_protocol(struct rtnl_link *link, uint16_t *vlan_protocol)
Get VLAN protocol.
void rtnl_link_bridge_set_vlan_stats_enabled(struct rtnl_link *link, uint8_t vlan_stats_enabled)
Set VLAN stats enabled flag.
void rtnl_link_bridge_set_vlan_filtering(struct rtnl_link *link, uint8_t vlan_filtering)
Set VLAN filtering flag.
int rtnl_link_bridge_get_ageing_time(struct rtnl_link *link, uint32_t *ageing_time)
Get ageing time for dynamic forwarding entries.
int rtnl_link_bridge_get_vlan_filtering(struct rtnl_link *link, uint8_t *vlan_filtering)
Get VLAN filtering flag.
void rtnl_link_bridge_set_nf_call_iptables(struct rtnl_link *link, uint8_t call_enabled)
Set call enabled flag for passing IPv4 traffic to iptables.
void rtnl_link_bridge_set_ageing_time(struct rtnl_link *link, uint32_t ageing_time)
Set ageing time for dynamic forwarding entries.
void rtnl_link_bridge_set_nf_call_arptables(struct rtnl_link *link, uint8_t call_enabled)
Set call enabled flag for passing ARP traffic to arptables.
int rtnl_link_bridge_get_vlan_stats_enabled(struct rtnl_link *link, uint8_t *vlan_stats_enabled)
Get VLAN stats enabled flag.
void rtnl_link_bridge_set_vlan_protocol(struct rtnl_link *link, uint16_t vlan_protocol)
Set VLAN protocol.
void rtnl_link_bridge_set_nf_call_ip6tables(struct rtnl_link *link, uint8_t call_enabled)
Set call enabled flag for passing IPv6 traffic to ip6tables.
void rtnl_link_bridge_set_vlan_default_pvid(struct rtnl_link *link, uint16_t default_pvid)
Set VLAN default pvid.
int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
Register operations for a link info type.
int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
Unregister operations for a link info type.
Attribute validation policy.
uint16_t type
Type of attribute or NLA_UNSPEC.
Available operations to modules implementing a link info type.
char * io_name
Name of link info type, must match name on kernel side.