1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/netdevice.h>
4 #include <linux/notifier.h>
5 #include <linux/rtnetlink.h>
6 #include <net/net_namespace.h>
9 #include <net/xdp_sock.h>
10 #include <net/netdev_rx_queue.h>
11 #include <net/busy_poll.h>
13 #include "netdev-genl-gen.h"
16 struct netdev_nl_dump_ctx {
17 unsigned long ifindex;
23 static struct netdev_nl_dump_ctx *netdev_dump_ctx(struct netlink_callback *cb)
25 NL_ASSERT_DUMP_CTX_FITS(struct netdev_nl_dump_ctx);
27 return (struct netdev_nl_dump_ctx *)cb->ctx;
31 netdev_nl_dev_fill(struct net_device *netdev, struct sk_buff *rsp,
32 const struct genl_info *info)
38 hdr = genlmsg_iput(rsp, info);
42 #define XDP_METADATA_KFUNC(_, flag, __, xmo) \
43 if (netdev->xdp_metadata_ops && netdev->xdp_metadata_ops->xmo) \
45 XDP_METADATA_KFUNC_xxx
46 #undef XDP_METADATA_KFUNC
48 if (netdev->xsk_tx_metadata_ops) {
49 if (netdev->xsk_tx_metadata_ops->tmo_fill_timestamp)
50 xsk_features |= NETDEV_XSK_FLAGS_TX_TIMESTAMP;
51 if (netdev->xsk_tx_metadata_ops->tmo_request_checksum)
52 xsk_features |= NETDEV_XSK_FLAGS_TX_CHECKSUM;
55 if (nla_put_u32(rsp, NETDEV_A_DEV_IFINDEX, netdev->ifindex) ||
56 nla_put_u64_64bit(rsp, NETDEV_A_DEV_XDP_FEATURES,
57 netdev->xdp_features, NETDEV_A_DEV_PAD) ||
58 nla_put_u64_64bit(rsp, NETDEV_A_DEV_XDP_RX_METADATA_FEATURES,
59 xdp_rx_meta, NETDEV_A_DEV_PAD) ||
60 nla_put_u64_64bit(rsp, NETDEV_A_DEV_XSK_FEATURES,
61 xsk_features, NETDEV_A_DEV_PAD)) {
62 genlmsg_cancel(rsp, hdr);
66 if (netdev->xdp_features & NETDEV_XDP_ACT_XSK_ZEROCOPY) {
67 if (nla_put_u32(rsp, NETDEV_A_DEV_XDP_ZC_MAX_SEGS,
68 netdev->xdp_zc_max_segs)) {
69 genlmsg_cancel(rsp, hdr);
74 genlmsg_end(rsp, hdr);
80 netdev_genl_dev_notify(struct net_device *netdev, int cmd)
82 struct genl_info info;
85 if (!genl_has_listeners(&netdev_nl_family, dev_net(netdev),
89 genl_info_init_ntf(&info, &netdev_nl_family, cmd);
91 ntf = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
95 if (netdev_nl_dev_fill(netdev, ntf, &info)) {
100 genlmsg_multicast_netns(&netdev_nl_family, dev_net(netdev), ntf,
101 0, NETDEV_NLGRP_MGMT, GFP_KERNEL);
104 int netdev_nl_dev_get_doit(struct sk_buff *skb, struct genl_info *info)
106 struct net_device *netdev;
111 if (GENL_REQ_ATTR_CHECK(info, NETDEV_A_DEV_IFINDEX))
114 ifindex = nla_get_u32(info->attrs[NETDEV_A_DEV_IFINDEX]);
116 rsp = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
122 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
124 err = netdev_nl_dev_fill(netdev, rsp, info);
133 return genlmsg_reply(rsp, info);
140 int netdev_nl_dev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
142 struct netdev_nl_dump_ctx *ctx = netdev_dump_ctx(cb);
143 struct net *net = sock_net(skb->sk);
144 struct net_device *netdev;
148 for_each_netdev_dump(net, netdev, ctx->ifindex) {
149 err = netdev_nl_dev_fill(netdev, skb, genl_info_dump(cb));
159 netdev_nl_napi_fill_one(struct sk_buff *rsp, struct napi_struct *napi,
160 const struct genl_info *info)
165 if (WARN_ON_ONCE(!napi->dev))
167 if (!(napi->dev->flags & IFF_UP))
170 hdr = genlmsg_iput(rsp, info);
174 if (napi->napi_id >= MIN_NAPI_ID &&
175 nla_put_u32(rsp, NETDEV_A_NAPI_ID, napi->napi_id))
176 goto nla_put_failure;
178 if (nla_put_u32(rsp, NETDEV_A_NAPI_IFINDEX, napi->dev->ifindex))
179 goto nla_put_failure;
181 if (napi->irq >= 0 && nla_put_u32(rsp, NETDEV_A_NAPI_IRQ, napi->irq))
182 goto nla_put_failure;
185 pid = task_pid_nr(napi->thread);
186 if (nla_put_u32(rsp, NETDEV_A_NAPI_PID, pid))
187 goto nla_put_failure;
190 genlmsg_end(rsp, hdr);
195 genlmsg_cancel(rsp, hdr);
199 int netdev_nl_napi_get_doit(struct sk_buff *skb, struct genl_info *info)
201 struct napi_struct *napi;
206 if (GENL_REQ_ATTR_CHECK(info, NETDEV_A_NAPI_ID))
209 napi_id = nla_get_u32(info->attrs[NETDEV_A_NAPI_ID]);
211 rsp = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
217 napi = napi_by_id(napi_id);
219 err = netdev_nl_napi_fill_one(rsp, napi, info);
228 return genlmsg_reply(rsp, info);
236 netdev_nl_napi_dump_one(struct net_device *netdev, struct sk_buff *rsp,
237 const struct genl_info *info,
238 struct netdev_nl_dump_ctx *ctx)
240 struct napi_struct *napi;
243 if (!(netdev->flags & IFF_UP))
246 list_for_each_entry(napi, &netdev->napi_list, dev_list) {
247 if (ctx->napi_id && napi->napi_id >= ctx->napi_id)
250 err = netdev_nl_napi_fill_one(rsp, napi, info);
253 ctx->napi_id = napi->napi_id;
258 int netdev_nl_napi_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
260 struct netdev_nl_dump_ctx *ctx = netdev_dump_ctx(cb);
261 const struct genl_info *info = genl_info_dump(cb);
262 struct net *net = sock_net(skb->sk);
263 struct net_device *netdev;
267 if (info->attrs[NETDEV_A_NAPI_IFINDEX])
268 ifindex = nla_get_u32(info->attrs[NETDEV_A_NAPI_IFINDEX]);
272 netdev = __dev_get_by_index(net, ifindex);
274 err = netdev_nl_napi_dump_one(netdev, skb, info, ctx);
278 for_each_netdev_dump(net, netdev, ctx->ifindex) {
279 err = netdev_nl_napi_dump_one(netdev, skb, info, ctx);
291 netdev_nl_queue_fill_one(struct sk_buff *rsp, struct net_device *netdev,
292 u32 q_idx, u32 q_type, const struct genl_info *info)
294 struct netdev_rx_queue *rxq;
295 struct netdev_queue *txq;
298 hdr = genlmsg_iput(rsp, info);
302 if (nla_put_u32(rsp, NETDEV_A_QUEUE_ID, q_idx) ||
303 nla_put_u32(rsp, NETDEV_A_QUEUE_TYPE, q_type) ||
304 nla_put_u32(rsp, NETDEV_A_QUEUE_IFINDEX, netdev->ifindex))
305 goto nla_put_failure;
308 case NETDEV_QUEUE_TYPE_RX:
309 rxq = __netif_get_rx_queue(netdev, q_idx);
310 if (rxq->napi && nla_put_u32(rsp, NETDEV_A_QUEUE_NAPI_ID,
312 goto nla_put_failure;
314 case NETDEV_QUEUE_TYPE_TX:
315 txq = netdev_get_tx_queue(netdev, q_idx);
316 if (txq->napi && nla_put_u32(rsp, NETDEV_A_QUEUE_NAPI_ID,
318 goto nla_put_failure;
321 genlmsg_end(rsp, hdr);
326 genlmsg_cancel(rsp, hdr);
330 static int netdev_nl_queue_validate(struct net_device *netdev, u32 q_id,
334 case NETDEV_QUEUE_TYPE_RX:
335 if (q_id >= netdev->real_num_rx_queues)
338 case NETDEV_QUEUE_TYPE_TX:
339 if (q_id >= netdev->real_num_tx_queues)
346 netdev_nl_queue_fill(struct sk_buff *rsp, struct net_device *netdev, u32 q_idx,
347 u32 q_type, const struct genl_info *info)
351 if (!(netdev->flags & IFF_UP))
354 err = netdev_nl_queue_validate(netdev, q_idx, q_type);
358 return netdev_nl_queue_fill_one(rsp, netdev, q_idx, q_type, info);
361 int netdev_nl_queue_get_doit(struct sk_buff *skb, struct genl_info *info)
363 u32 q_id, q_type, ifindex;
364 struct net_device *netdev;
368 if (GENL_REQ_ATTR_CHECK(info, NETDEV_A_QUEUE_ID) ||
369 GENL_REQ_ATTR_CHECK(info, NETDEV_A_QUEUE_TYPE) ||
370 GENL_REQ_ATTR_CHECK(info, NETDEV_A_QUEUE_IFINDEX))
373 q_id = nla_get_u32(info->attrs[NETDEV_A_QUEUE_ID]);
374 q_type = nla_get_u32(info->attrs[NETDEV_A_QUEUE_TYPE]);
375 ifindex = nla_get_u32(info->attrs[NETDEV_A_QUEUE_IFINDEX]);
377 rsp = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
383 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
385 err = netdev_nl_queue_fill(rsp, netdev, q_id, q_type, info);
394 return genlmsg_reply(rsp, info);
402 netdev_nl_queue_dump_one(struct net_device *netdev, struct sk_buff *rsp,
403 const struct genl_info *info,
404 struct netdev_nl_dump_ctx *ctx)
409 if (!(netdev->flags & IFF_UP))
412 for (i = ctx->rxq_idx; i < netdev->real_num_rx_queues;) {
413 err = netdev_nl_queue_fill_one(rsp, netdev, i,
414 NETDEV_QUEUE_TYPE_RX, info);
419 for (i = ctx->txq_idx; i < netdev->real_num_tx_queues;) {
420 err = netdev_nl_queue_fill_one(rsp, netdev, i,
421 NETDEV_QUEUE_TYPE_TX, info);
430 int netdev_nl_queue_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
432 struct netdev_nl_dump_ctx *ctx = netdev_dump_ctx(cb);
433 const struct genl_info *info = genl_info_dump(cb);
434 struct net *net = sock_net(skb->sk);
435 struct net_device *netdev;
439 if (info->attrs[NETDEV_A_QUEUE_IFINDEX])
440 ifindex = nla_get_u32(info->attrs[NETDEV_A_QUEUE_IFINDEX]);
444 netdev = __dev_get_by_index(net, ifindex);
446 err = netdev_nl_queue_dump_one(netdev, skb, info, ctx);
450 for_each_netdev_dump(net, netdev, ctx->ifindex) {
451 err = netdev_nl_queue_dump_one(netdev, skb, info, ctx);
463 static int netdev_genl_netdevice_event(struct notifier_block *nb,
464 unsigned long event, void *ptr)
466 struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
469 case NETDEV_REGISTER:
470 netdev_genl_dev_notify(netdev, NETDEV_CMD_DEV_ADD_NTF);
472 case NETDEV_UNREGISTER:
473 netdev_genl_dev_notify(netdev, NETDEV_CMD_DEV_DEL_NTF);
475 case NETDEV_XDP_FEAT_CHANGE:
476 netdev_genl_dev_notify(netdev, NETDEV_CMD_DEV_CHANGE_NTF);
483 static struct notifier_block netdev_genl_nb = {
484 .notifier_call = netdev_genl_netdevice_event,
487 static int __init netdev_genl_init(void)
491 err = register_netdevice_notifier(&netdev_genl_nb);
495 err = genl_register_family(&netdev_nl_family);
502 unregister_netdevice_notifier(&netdev_genl_nb);
506 subsys_initcall(netdev_genl_init);