[Intel-wired-lan] [PATCH v5 net-next 07/12] net: shaper: implement introspection support
Paolo Abeni
pabeni at redhat.com
Thu Aug 29 15:17:00 UTC 2024
The netlink op is a simple wrapper around the device callback.
Extend the existing fetch_dev() helper adding an attribute argument
for the requested device. Reuse such helper in the newly implemented
operation.
Signed-off-by: Paolo Abeni <pabeni at redhat.com>
---
v4 -> v5:
- replace net_device* with binding* in most functions
- de-deplicate some code thanks to more generic helpers in previous
patches
v3 -> v4:
- another dev_put() -> netdev_put() conversion, missed in previous
iteration
RFC v2 -> v3:
- dev_put() -> netdev_put()
---
net/shaper/shaper.c | 96 +++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 93 insertions(+), 3 deletions(-)
diff --git a/net/shaper/shaper.c b/net/shaper/shaper.c
index 98e17a95f39f..b7e5a3990328 100644
--- a/net/shaper/shaper.c
+++ b/net/shaper/shaper.c
@@ -629,22 +629,29 @@ int net_shaper_nl_post_dumpit(struct netlink_callback *cb)
int net_shaper_nl_cap_pre_doit(const struct genl_split_ops *ops,
struct sk_buff *skb, struct genl_info *info)
{
- return -EOPNOTSUPP;
+ return net_shaper_generic_pre(info, NET_SHAPER_A_CAPABILITIES_IFINDEX);
}
void net_shaper_nl_cap_post_doit(const struct genl_split_ops *ops,
struct sk_buff *skb, struct genl_info *info)
{
+ net_shaper_generic_post(info);
}
int net_shaper_nl_cap_pre_dumpit(struct netlink_callback *cb)
{
- return -EOPNOTSUPP;
+ struct net_shaper_nl_ctx *ctx = (struct net_shaper_nl_ctx *)cb->ctx;
+
+ return net_shaper_ctx_init(genl_info_dump(cb),
+ NET_SHAPER_A_CAPABILITIES_IFINDEX, ctx);
}
int net_shaper_nl_cap_post_dumpit(struct netlink_callback *cb)
{
- return -EOPNOTSUPP;
+ struct net_shaper_nl_ctx *ctx = (struct net_shaper_nl_ctx *)cb->ctx;
+
+ net_shaper_ctx_cleanup(ctx);
+ return 0;
}
int net_shaper_nl_get_doit(struct sk_buff *skb, struct genl_info *info)
@@ -1196,14 +1203,97 @@ int net_shaper_nl_group_doit(struct sk_buff *skb, struct genl_info *info)
return ret;
}
+static int
+net_shaper_cap_fill_one(struct sk_buff *msg,
+ struct net_shaper_binding *binding,
+ enum net_shaper_scope scope, unsigned long flags,
+ const struct genl_info *info)
+{
+ unsigned long cur;
+ void *hdr;
+
+ hdr = genlmsg_iput(msg, info);
+ if (!hdr)
+ return -EMSGSIZE;
+
+ if (net_shaper_fill_binding(msg, binding,
+ NET_SHAPER_A_CAPABILITIES_IFINDEX) ||
+ nla_put_u32(msg, NET_SHAPER_A_CAPABILITIES_SCOPE, scope))
+ goto nla_put_failure;
+
+ for (cur = NET_SHAPER_A_CAPABILITIES_SUPPORT_METRIC_BPS;
+ cur <= NET_SHAPER_A_CAPABILITIES_MAX; ++cur) {
+ if (flags & BIT(cur) && nla_put_flag(msg, cur))
+ goto nla_put_failure;
+ }
+
+ genlmsg_end(msg, hdr);
+
+ return 0;
+
+nla_put_failure:
+ genlmsg_cancel(msg, hdr);
+ return -EMSGSIZE;
+}
+
int net_shaper_nl_cap_get_doit(struct sk_buff *skb, struct genl_info *info)
{
+ struct net_shaper_binding *binding = info->user_ptr[0];
+ const struct net_shaper_ops *ops;
+ enum net_shaper_scope scope;
+ struct sk_buff *msg;
+ unsigned long flags;
+ int ret;
+
+ if (GENL_REQ_ATTR_CHECK(info, NET_SHAPER_A_CAPABILITIES_SCOPE))
+ return -EINVAL;
+
+ scope = nla_get_u32(info->attrs[NET_SHAPER_A_CAPABILITIES_SCOPE]);
+ ops = net_shaper_binding_ops(binding);
+ ret = ops->capabilities(binding, scope, &flags);
+ if (ret)
+ return ret;
+
+ msg = genlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+ if (!msg)
+ return -ENOMEM;
+
+ ret = net_shaper_cap_fill_one(msg, binding, scope, flags, info);
+ if (ret)
+ goto free_msg;
+
+ ret = genlmsg_reply(msg, info);
+ if (ret)
+ goto free_msg;
return 0;
+
+free_msg:
+ nlmsg_free(msg);
+ return ret;
}
int net_shaper_nl_cap_get_dumpit(struct sk_buff *skb,
struct netlink_callback *cb)
{
+ const struct genl_info *info = genl_info_dump(cb);
+ struct net_shaper_binding *binding;
+ const struct net_shaper_ops *ops;
+ enum net_shaper_scope scope;
+ unsigned long flags;
+ int ret;
+
+ binding = net_shaper_binding_from_ctx(cb->ctx);
+ ops = net_shaper_binding_ops(binding);
+ for (scope = 0; scope <= NET_SHAPER_SCOPE_MAX; ++scope) {
+ if (ops->capabilities(binding, scope, &flags))
+ continue;
+
+ ret = net_shaper_cap_fill_one(skb, binding, scope, flags,
+ info);
+ if (ret)
+ return ret;
+ }
+
return 0;
}
--
2.45.2
More information about the Intel-wired-lan
mailing list