summaryrefslogtreecommitdiff
path: root/devlink
diff options
context:
space:
mode:
authorJiri Pirko <jiri@nvidia.com>2022-12-05 13:21:55 +0100
committerDavid Ahern <dsahern@kernel.org>2022-12-08 10:46:59 -0700
commitf04f5e1d08d9fe5bf9b4103e7d2256a917970326 (patch)
treea21b4d2b5a102b30f757e05ea898819cc9cde113 /devlink
parent3b88380b070f28920729c0f10929d81c10550344 (diff)
downloadiproute2-f04f5e1d08d9fe5bf9b4103e7d2256a917970326.tar.gz
devlink: add ifname_map_add/del() helpers
Add couple of helpers to alloc/free of map object alongside with list addition/removal. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David Ahern <dsahern@kernel.org>
Diffstat (limited to 'devlink')
-rw-r--r--devlink/devlink.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/devlink/devlink.c b/devlink/devlink.c
index e62215f8..e6cf8b0d 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -778,16 +778,35 @@ static int function_attr_cb(const struct nlattr *attr, void *data)
return MNL_CB_OK;
}
+static int ifname_map_add(struct dl *dl, const char *ifname,
+ const char *bus_name, const char *dev_name,
+ uint32_t port_index)
+{
+ struct ifname_map *ifname_map;
+
+ ifname_map = ifname_map_alloc(bus_name, dev_name, port_index, ifname);
+ if (!ifname_map)
+ return -ENOMEM;
+ list_add(&ifname_map->list, &dl->ifname_map_list);
+ return 0;
+}
+
+static void ifname_map_del(struct ifname_map *ifname_map)
+{
+ list_del(&ifname_map->list);
+ ifname_map_free(ifname_map);
+}
+
static int ifname_map_cb(const struct nlmsghdr *nlh, void *data)
{
struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
struct dl *dl = data;
- struct ifname_map *ifname_map;
const char *bus_name;
const char *dev_name;
uint32_t port_index;
const char *port_ifname;
+ int err;
mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
@@ -801,11 +820,9 @@ static int ifname_map_cb(const struct nlmsghdr *nlh, void *data)
dev_name = mnl_attr_get_str(tb[DEVLINK_ATTR_DEV_NAME]);
port_index = mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_INDEX]);
port_ifname = mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_NETDEV_NAME]);
- ifname_map = ifname_map_alloc(bus_name, dev_name,
- port_index, port_ifname);
- if (!ifname_map)
+ err = ifname_map_add(dl, port_ifname, bus_name, dev_name, port_index);
+ if (err)
return MNL_CB_ERROR;
- list_add(&ifname_map->list, &dl->ifname_map_list);
return MNL_CB_OK;
}
@@ -816,8 +833,7 @@ static void ifname_map_fini(struct dl *dl)
list_for_each_entry_safe(ifname_map, tmp,
&dl->ifname_map_list, list) {
- list_del(&ifname_map->list);
- ifname_map_free(ifname_map);
+ ifname_map_del(ifname_map);
}
}