diff options
author | Cordell O'Leary <cordell.oleary@alliedtelesis.co.nz> | 2024-01-08 01:27:29 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2024-02-29 20:00:15 (GMT) |
commit | bf071f2b84f436b7182da925181f48d1c8a7a5a9 (patch) | |
tree | 8e3cb103ec8add04c00ae3e312ad81b34c502021 | |
parent | b76c3a5d9a0e421fe6cb0e89cceb70ae15b57695 (diff) | |
download | libnl-bf071f2b84f436b7182da925181f48d1c8a7a5a9.zip libnl-bf071f2b84f436b7182da925181f48d1c8a7a5a9.tar.gz libnl-bf071f2b84f436b7182da925181f48d1c8a7a5a9.tar.bz2 |
route: Add support to set ageing time for dynamic bridge table entries
-rw-r--r-- | include/netlink/route/link/bridge_info.h | 5 | ||||
-rw-r--r-- | lib/route/link/bridge_info.c | 58 | ||||
-rw-r--r-- | libnl-route-3.sym | 6 |
3 files changed, 69 insertions, 0 deletions
diff --git a/include/netlink/route/link/bridge_info.h b/include/netlink/route/link/bridge_info.h index 09689b3..d315486 100644 --- a/include/netlink/route/link/bridge_info.h +++ b/include/netlink/route/link/bridge_info.h @@ -13,6 +13,11 @@ extern "C" { #endif +extern void rtnl_link_bridge_set_ageing_time(struct rtnl_link *link, + uint32_t ageing_time); +extern int rtnl_link_bridge_get_ageing_time(struct rtnl_link *link, + uint32_t *ageing_time); + extern void rtnl_link_bridge_set_vlan_filtering(struct rtnl_link *link, uint8_t vlan_filtering); extern int rtnl_link_bridge_get_vlan_filtering(struct rtnl_link *link, diff --git a/lib/route/link/bridge_info.c b/lib/route/link/bridge_info.c index 61b885f..41ea670 100644 --- a/lib/route/link/bridge_info.c +++ b/lib/route/link/bridge_info.c @@ -21,15 +21,18 @@ #define BRIDGE_ATTR_VLAN_FILTERING (1 << 0) #define BRIDGE_ATTR_VLAN_PROTOCOL (1 << 1) #define BRIDGE_ATTR_VLAN_STATS_ENABLED (1 << 2) +#define BRIDGE_ATTR_AGEING_TIME (1 << 3) struct bridge_info { uint32_t ce_mask; /* to support attr macros */ + uint32_t b_ageing_time; uint16_t b_vlan_protocol; uint8_t b_vlan_filtering; uint8_t b_vlan_stats_enabled; }; static const struct nla_policy bi_attrs_policy[IFLA_BR_MAX + 1] = { + [IFLA_BR_AGEING_TIME] = { .type = NLA_U32 }, [IFLA_BR_VLAN_FILTERING] = { .type = NLA_U8 }, [IFLA_BR_VLAN_PROTOCOL] = { .type = NLA_U16 }, [IFLA_BR_VLAN_STATS_ENABLED] = { .type = NLA_U8 }, @@ -75,6 +78,11 @@ static int bridge_info_parse(struct rtnl_link *link, struct nlattr *data, bi = link->l_info; + if (tb[IFLA_BR_AGEING_TIME]) { + bi->b_ageing_time = nla_get_u32(tb[IFLA_BR_AGEING_TIME]); + bi->ce_mask |= BRIDGE_ATTR_AGEING_TIME; + } + if (tb[IFLA_BR_VLAN_FILTERING]) { bi->b_vlan_filtering = nla_get_u8(tb[IFLA_BR_VLAN_FILTERING]); bi->ce_mask |= BRIDGE_ATTR_VLAN_FILTERING; @@ -104,6 +112,9 @@ static int bridge_info_put_attrs(struct nl_msg *msg, struct rtnl_link *link) if (!data) return -NLE_MSGSIZE; + if (bi->ce_mask & BRIDGE_ATTR_AGEING_TIME) + NLA_PUT_U32(msg, IFLA_BR_AGEING_TIME, bi->b_ageing_time); + if (bi->ce_mask & BRIDGE_ATTR_VLAN_FILTERING) NLA_PUT_U8(msg, IFLA_BR_VLAN_FILTERING, bi->b_vlan_filtering); @@ -144,6 +155,53 @@ static struct rtnl_link_info_ops bridge_info_ops = { } while (0) /** + * Set ageing time for dynamic forwarding entries + * @arg link Link object of type bridge + * @arg ageing_time Interval to set. + * + * @return void + */ +void rtnl_link_bridge_set_ageing_time(struct rtnl_link *link, + uint32_t ageing_time) +{ + struct bridge_info *bi = bridge_info(link); + + IS_BRIDGE_INFO_ASSERT(link); + + bi->b_ageing_time = ageing_time; + + bi->ce_mask |= BRIDGE_ATTR_AGEING_TIME; +} + +/** + * Get ageing time for dynamic forwarding entries + * @arg link Link object of type bridge + * @arg ageing_time Output argument. + * + * @see rtnl_link_bridge_set_ageing_time() + * @return Zero on success, otherwise a negative error code. + * @retval -NLE_NOATTR + * @retval -NLE_INVAL + */ +int rtnl_link_bridge_get_ageing_time(struct rtnl_link *link, + uint32_t *ageing_time) +{ + struct bridge_info *bi = bridge_info(link); + + IS_BRIDGE_INFO_ASSERT(link); + + if (!(bi->ce_mask & BRIDGE_ATTR_AGEING_TIME)) + return -NLE_NOATTR; + + if (!ageing_time) + return -NLE_INVAL; + + *ageing_time = bi->b_ageing_time; + + return 0; +} + +/** * Set VLAN filtering flag * @arg link Link object of type bridge * @arg vlan_filtering VLAN_filtering boolean flag to set. diff --git a/libnl-route-3.sym b/libnl-route-3.sym index fa7af45..85782d8 100644 --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -1314,3 +1314,9 @@ global: rtnl_link_bond_set_min_links; rtnl_link_can_get_device_stats; } libnl_3_8; + +libnl_3_10 { +global: + rtnl_link_bridge_get_ageing_time; + rtnl_link_bridge_set_ageing_time; +} libnl_3_9; |