From: Jiri Pirko <[email protected]>

Extend the notification filter descriptor with devlink_index so
that userspace can filter notifications by devlink instance index
in addition to bus_name/dev_name.

Signed-off-by: Jiri Pirko <[email protected]>
---
v2->v3:
- new patch
---
 net/devlink/devl_internal.h |  4 ++++
 net/devlink/netlink.c       | 11 ++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
index 395832ed4477..f0ebfb936770 100644
--- a/net/devlink/devl_internal.h
+++ b/net/devlink/devl_internal.h
@@ -205,6 +205,8 @@ struct devlink_obj_desc {
        const char *dev_name;
        unsigned int port_index;
        bool port_index_valid;
+       unsigned int devlink_index;
+       bool devlink_index_valid;
        long data[];
 };
 
@@ -214,6 +216,8 @@ static inline void devlink_nl_obj_desc_init(struct 
devlink_obj_desc *desc,
        memset(desc, 0, sizeof(*desc));
        desc->bus_name = devlink_bus_name(devlink);
        desc->dev_name = devlink_dev_name(devlink);
+       desc->devlink_index = devlink->index;
+       desc->devlink_index_valid = true;
 }
 
 static inline void devlink_nl_obj_desc_port_set(struct devlink_obj_desc *desc,
diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c
index 5db931a0091c..1b00aa1dbcf5 100644
--- a/net/devlink/netlink.c
+++ b/net/devlink/netlink.c
@@ -73,13 +73,19 @@ int devlink_nl_notify_filter_set_doit(struct sk_buff *skb,
                flt->dev_name = pos;
        }
 
+       if (attrs[DEVLINK_ATTR_INDEX]) {
+               flt->devlink_index = nla_get_uint(attrs[DEVLINK_ATTR_INDEX]);
+               flt->devlink_index_valid = true;
+       }
+
        if (attrs[DEVLINK_ATTR_PORT_INDEX]) {
                flt->port_index = nla_get_u32(attrs[DEVLINK_ATTR_PORT_INDEX]);
                flt->port_index_valid = true;
        }
 
        /* Don't attach empty filter. */
-       if (!flt->bus_name && !flt->dev_name && !flt->port_index_valid) {
+       if (!flt->bus_name && !flt->dev_name &&
+           !flt->devlink_index_valid && !flt->port_index_valid) {
                kfree(flt);
                flt = NULL;
        }
@@ -100,6 +106,9 @@ int devlink_nl_notify_filter_set_doit(struct sk_buff *skb,
 static bool devlink_obj_desc_match(const struct devlink_obj_desc *desc,
                                   const struct devlink_obj_desc *flt)
 {
+       if (desc->devlink_index_valid && flt->devlink_index_valid &&
+           desc->devlink_index != flt->devlink_index)
+               return false;
        if (desc->bus_name && flt->bus_name &&
            strcmp(desc->bus_name, flt->bus_name))
                return false;
-- 
2.51.1


Reply via email to