summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCordell O'Leary <cordell.oleary@alliedtelesis.co.nz>2024-01-08 01:27:29 (GMT)
committerThomas Haller <thaller@redhat.com>2024-02-29 20:00:15 (GMT)
commitbf071f2b84f436b7182da925181f48d1c8a7a5a9 (patch)
tree8e3cb103ec8add04c00ae3e312ad81b34c502021
parentb76c3a5d9a0e421fe6cb0e89cceb70ae15b57695 (diff)
downloadlibnl-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.h5
-rw-r--r--lib/route/link/bridge_info.c58
-rw-r--r--libnl-route-3.sym6
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;