Skip to content

Commit ded6f77

Browse files
Jiri PirkoPaolo Abeni
Jiri Pirko
authored and
Paolo Abeni
committed
devlink: extend multicast filtering by port index
Expose the previously introduced notification multicast messages filtering infrastructure and allow the user to select messages using port index. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 13b127d commit ded6f77

File tree

6 files changed

+31
-5
lines changed

6 files changed

+31
-5
lines changed

Documentation/netlink/specs/devlink.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -2264,3 +2264,4 @@ operations:
22642264
attributes:
22652265
- bus-name
22662266
- dev-name
2267+
- port-index

net/devlink/devl_internal.h

+9
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ struct devlink_obj_desc {
195195
struct rcu_head rcu;
196196
const char *bus_name;
197197
const char *dev_name;
198+
unsigned int port_index;
199+
bool port_index_valid;
198200
long data[];
199201
};
200202

@@ -206,6 +208,13 @@ static inline void devlink_nl_obj_desc_init(struct devlink_obj_desc *desc,
206208
desc->dev_name = dev_name(devlink->dev);
207209
}
208210

211+
static inline void devlink_nl_obj_desc_port_set(struct devlink_obj_desc *desc,
212+
struct devlink_port *devlink_port)
213+
{
214+
desc->port_index = devlink_port->index;
215+
desc->port_index_valid = true;
216+
}
217+
209218
int devlink_nl_notify_filter(struct sock *dsk, struct sk_buff *skb, void *data);
210219

211220
static inline void devlink_nl_notify_send_desc(struct devlink *devlink,

net/devlink/health.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter,
490490
enum devlink_command cmd)
491491
{
492492
struct devlink *devlink = reporter->devlink;
493+
struct devlink_obj_desc desc;
493494
struct sk_buff *msg;
494495
int err;
495496

@@ -509,7 +510,10 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter,
509510
return;
510511
}
511512

512-
devlink_nl_notify_send(devlink, msg);
513+
devlink_nl_obj_desc_init(&desc, devlink);
514+
if (reporter->devlink_port)
515+
devlink_nl_obj_desc_port_set(&desc, reporter->devlink_port);
516+
devlink_nl_notify_send_desc(devlink, msg, &desc);
513517
}
514518

515519
void

net/devlink/netlink.c

+9-1
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,13 @@ int devlink_nl_notify_filter_set_doit(struct sk_buff *skb,
7373
flt->dev_name = pos;
7474
}
7575

76+
if (attrs[DEVLINK_ATTR_PORT_INDEX]) {
77+
flt->port_index = nla_get_u32(attrs[DEVLINK_ATTR_PORT_INDEX]);
78+
flt->port_index_valid = true;
79+
}
80+
7681
/* Don't attach empty filter. */
77-
if (!flt->bus_name && !flt->dev_name) {
82+
if (!flt->bus_name && !flt->dev_name && !flt->port_index_valid) {
7883
kfree(flt);
7984
flt = NULL;
8085
}
@@ -101,6 +106,9 @@ static bool devlink_obj_desc_match(const struct devlink_obj_desc *desc,
101106
if (desc->dev_name && flt->dev_name &&
102107
strcmp(desc->dev_name, flt->dev_name))
103108
return false;
109+
if (desc->port_index_valid && flt->port_index_valid &&
110+
desc->port_index != flt->port_index)
111+
return false;
104112
return true;
105113
}
106114

net/devlink/netlink_gen.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,10 @@ static const struct nla_policy devlink_selftests_run_nl_policy[DEVLINK_ATTR_SELF
561561
};
562562

563563
/* DEVLINK_CMD_NOTIFY_FILTER_SET - do */
564-
static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
564+
static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
565565
[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
566566
[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
567+
[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
567568
};
568569

569570
/* Ops table for devlink */
@@ -1243,7 +1244,7 @@ const struct genl_split_ops devlink_nl_ops[74] = {
12431244
.cmd = DEVLINK_CMD_NOTIFY_FILTER_SET,
12441245
.doit = devlink_nl_notify_filter_set_doit,
12451246
.policy = devlink_notify_filter_set_nl_policy,
1246-
.maxattr = DEVLINK_ATTR_DEV_NAME,
1247+
.maxattr = DEVLINK_ATTR_PORT_INDEX,
12471248
.flags = GENL_CMD_CAP_DO,
12481249
},
12491250
};

net/devlink/port.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port,
507507
enum devlink_command cmd)
508508
{
509509
struct devlink *devlink = devlink_port->devlink;
510+
struct devlink_obj_desc desc;
510511
struct sk_buff *msg;
511512
int err;
512513

@@ -525,7 +526,9 @@ static void devlink_port_notify(struct devlink_port *devlink_port,
525526
return;
526527
}
527528

528-
devlink_nl_notify_send(devlink, msg);
529+
devlink_nl_obj_desc_init(&desc, devlink);
530+
devlink_nl_obj_desc_port_set(&desc, devlink_port);
531+
devlink_nl_notify_send_desc(devlink, msg, &desc);
529532
}
530533

531534
static void devlink_ports_notify(struct devlink *devlink,

0 commit comments

Comments
 (0)