Skip to content

Commit

Permalink
route: Add support to set ageing time for dynamic bridge table entries
Browse files Browse the repository at this point in the history
  • Loading branch information
Cordell-O authored and thom311 committed Feb 29, 2024
1 parent b76c3a5 commit bf071f2
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/netlink/route/link/bridge_info.h
Expand Up @@ -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,
Expand Down
58 changes: 58 additions & 0 deletions lib/route/link/bridge_info.c
Expand Up @@ -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 },
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -143,6 +154,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
Expand Down
6 changes: 6 additions & 0 deletions libnl-route-3.sym
Expand Up @@ -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;

0 comments on commit bf071f2

Please sign in to comment.