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 /lib | |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/route/link/bridge_info.c | 58 |
1 files changed, 58 insertions, 0 deletions
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. |