From: David Wei Implement ndo_queue_create() that adds a new rxq during the bind-queue ynl netdev operation. We allow to create queues either in single device mode or for the case of dual device mode for the netkit peer device which gets placed into the target network namespace. For dual device mode the bind against the primary device does not make sense for the targeted use cases, and therefore gets rejected. Signed-off-by: David Wei Co-developed-by: Daniel Borkmann Signed-off-by: Daniel Borkmann --- drivers/net/netkit.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c index e5dfbf7ea351..27ff84833f28 100644 --- a/drivers/net/netkit.c +++ b/drivers/net/netkit.c @@ -274,6 +274,34 @@ static const struct ethtool_ops netkit_ethtool_ops = { .get_channels = netkit_get_channels, }; +static int netkit_queue_create(struct net_device *dev) +{ + struct netkit *nk = netkit_priv(dev); + u32 rxq_count_old, rxq_count_new; + int err; + + rxq_count_old = dev->real_num_rx_queues; + rxq_count_new = rxq_count_old + 1; + + /* Only allow to bind in single device mode or to bind against + * the peer device which then ends up in the target netns. + */ + if (nk->pair == NETKIT_DEVICE_PAIR && nk->primary) + return -EOPNOTSUPP; + + if (netif_running(dev)) + netif_carrier_off(dev); + err = netif_set_real_num_rx_queues(dev, rxq_count_new); + if (netif_running(dev)) + netif_carrier_on(dev); + + return err ? err : rxq_count_new; +} + +static const struct netdev_queue_mgmt_ops netkit_queue_mgmt_ops = { + .ndo_queue_create = netkit_queue_create, +}; + static struct net_device *netkit_alloc(struct nlattr *tb[], const char *ifname, unsigned char name_assign_type, @@ -346,8 +374,9 @@ static void netkit_setup(struct net_device *dev) dev->priv_flags |= IFF_DISABLE_NETPOLL; dev->lltx = true; - dev->ethtool_ops = &netkit_ethtool_ops; - dev->netdev_ops = &netkit_netdev_ops; + dev->netdev_ops = &netkit_netdev_ops; + dev->ethtool_ops = &netkit_ethtool_ops; + dev->queue_mgmt_ops = &netkit_queue_mgmt_ops; dev->features |= netkit_features; dev->hw_features = netkit_features; -- 2.43.0