root/drivers/net/netdevsim/netdev.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nsim_start_xmit
  2. nsim_set_rx_mode
  3. nsim_change_mtu
  4. nsim_get_stats64
  5. nsim_setup_tc_block_cb
  6. nsim_set_vf_mac
  7. nsim_set_vf_vlan
  8. nsim_set_vf_rate
  9. nsim_set_vf_spoofchk
  10. nsim_set_vf_rss_query_en
  11. nsim_set_vf_trust
  12. nsim_get_vf_config
  13. nsim_set_vf_link_state
  14. nsim_setup_tc
  15. nsim_set_features
  16. nsim_get_devlink_port
  17. nsim_setup
  18. nsim_create
  19. nsim_destroy
  20. nsim_validate
  21. nsim_module_init
  22. nsim_module_exit

   1 /*
   2  * Copyright (C) 2017 Netronome Systems, Inc.
   3  *
   4  * This software is licensed under the GNU General License Version 2,
   5  * June 1991 as shown in the file COPYING in the top-level directory of this
   6  * source tree.
   7  *
   8  * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
   9  * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
  10  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  11  * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
  12  * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
  13  * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  14  */
  15 
  16 #include <linux/debugfs.h>
  17 #include <linux/etherdevice.h>
  18 #include <linux/kernel.h>
  19 #include <linux/module.h>
  20 #include <linux/netdevice.h>
  21 #include <linux/slab.h>
  22 #include <net/netlink.h>
  23 #include <net/pkt_cls.h>
  24 #include <net/rtnetlink.h>
  25 
  26 #include "netdevsim.h"
  27 
  28 static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
  29 {
  30         struct netdevsim *ns = netdev_priv(dev);
  31 
  32         if (!nsim_ipsec_tx(ns, skb))
  33                 goto out;
  34 
  35         u64_stats_update_begin(&ns->syncp);
  36         ns->tx_packets++;
  37         ns->tx_bytes += skb->len;
  38         u64_stats_update_end(&ns->syncp);
  39 
  40 out:
  41         dev_kfree_skb(skb);
  42 
  43         return NETDEV_TX_OK;
  44 }
  45 
  46 static void nsim_set_rx_mode(struct net_device *dev)
  47 {
  48 }
  49 
  50 static int nsim_change_mtu(struct net_device *dev, int new_mtu)
  51 {
  52         struct netdevsim *ns = netdev_priv(dev);
  53 
  54         if (ns->xdp.prog && new_mtu > NSIM_XDP_MAX_MTU)
  55                 return -EBUSY;
  56 
  57         dev->mtu = new_mtu;
  58 
  59         return 0;
  60 }
  61 
  62 static void
  63 nsim_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
  64 {
  65         struct netdevsim *ns = netdev_priv(dev);
  66         unsigned int start;
  67 
  68         do {
  69                 start = u64_stats_fetch_begin(&ns->syncp);
  70                 stats->tx_bytes = ns->tx_bytes;
  71                 stats->tx_packets = ns->tx_packets;
  72         } while (u64_stats_fetch_retry(&ns->syncp, start));
  73 }
  74 
  75 static int
  76 nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
  77 {
  78         return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv);
  79 }
  80 
  81 static int nsim_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
  82 {
  83         struct netdevsim *ns = netdev_priv(dev);
  84         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
  85 
  86         /* Only refuse multicast addresses, zero address can mean unset/any. */
  87         if (vf >= nsim_bus_dev->num_vfs || is_multicast_ether_addr(mac))
  88                 return -EINVAL;
  89         memcpy(nsim_bus_dev->vfconfigs[vf].vf_mac, mac, ETH_ALEN);
  90 
  91         return 0;
  92 }
  93 
  94 static int nsim_set_vf_vlan(struct net_device *dev, int vf,
  95                             u16 vlan, u8 qos, __be16 vlan_proto)
  96 {
  97         struct netdevsim *ns = netdev_priv(dev);
  98         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
  99 
 100         if (vf >= nsim_bus_dev->num_vfs || vlan > 4095 || qos > 7)
 101                 return -EINVAL;
 102 
 103         nsim_bus_dev->vfconfigs[vf].vlan = vlan;
 104         nsim_bus_dev->vfconfigs[vf].qos = qos;
 105         nsim_bus_dev->vfconfigs[vf].vlan_proto = vlan_proto;
 106 
 107         return 0;
 108 }
 109 
 110 static int nsim_set_vf_rate(struct net_device *dev, int vf, int min, int max)
 111 {
 112         struct netdevsim *ns = netdev_priv(dev);
 113         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
 114 
 115         if (vf >= nsim_bus_dev->num_vfs)
 116                 return -EINVAL;
 117 
 118         nsim_bus_dev->vfconfigs[vf].min_tx_rate = min;
 119         nsim_bus_dev->vfconfigs[vf].max_tx_rate = max;
 120 
 121         return 0;
 122 }
 123 
 124 static int nsim_set_vf_spoofchk(struct net_device *dev, int vf, bool val)
 125 {
 126         struct netdevsim *ns = netdev_priv(dev);
 127         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
 128 
 129         if (vf >= nsim_bus_dev->num_vfs)
 130                 return -EINVAL;
 131         nsim_bus_dev->vfconfigs[vf].spoofchk_enabled = val;
 132 
 133         return 0;
 134 }
 135 
 136 static int nsim_set_vf_rss_query_en(struct net_device *dev, int vf, bool val)
 137 {
 138         struct netdevsim *ns = netdev_priv(dev);
 139         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
 140 
 141         if (vf >= nsim_bus_dev->num_vfs)
 142                 return -EINVAL;
 143         nsim_bus_dev->vfconfigs[vf].rss_query_enabled = val;
 144 
 145         return 0;
 146 }
 147 
 148 static int nsim_set_vf_trust(struct net_device *dev, int vf, bool val)
 149 {
 150         struct netdevsim *ns = netdev_priv(dev);
 151         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
 152 
 153         if (vf >= nsim_bus_dev->num_vfs)
 154                 return -EINVAL;
 155         nsim_bus_dev->vfconfigs[vf].trusted = val;
 156 
 157         return 0;
 158 }
 159 
 160 static int
 161 nsim_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi)
 162 {
 163         struct netdevsim *ns = netdev_priv(dev);
 164         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
 165 
 166         if (vf >= nsim_bus_dev->num_vfs)
 167                 return -EINVAL;
 168 
 169         ivi->vf = vf;
 170         ivi->linkstate = nsim_bus_dev->vfconfigs[vf].link_state;
 171         ivi->min_tx_rate = nsim_bus_dev->vfconfigs[vf].min_tx_rate;
 172         ivi->max_tx_rate = nsim_bus_dev->vfconfigs[vf].max_tx_rate;
 173         ivi->vlan = nsim_bus_dev->vfconfigs[vf].vlan;
 174         ivi->vlan_proto = nsim_bus_dev->vfconfigs[vf].vlan_proto;
 175         ivi->qos = nsim_bus_dev->vfconfigs[vf].qos;
 176         memcpy(&ivi->mac, nsim_bus_dev->vfconfigs[vf].vf_mac, ETH_ALEN);
 177         ivi->spoofchk = nsim_bus_dev->vfconfigs[vf].spoofchk_enabled;
 178         ivi->trusted = nsim_bus_dev->vfconfigs[vf].trusted;
 179         ivi->rss_query_en = nsim_bus_dev->vfconfigs[vf].rss_query_enabled;
 180 
 181         return 0;
 182 }
 183 
 184 static int nsim_set_vf_link_state(struct net_device *dev, int vf, int state)
 185 {
 186         struct netdevsim *ns = netdev_priv(dev);
 187         struct nsim_bus_dev *nsim_bus_dev = ns->nsim_bus_dev;
 188 
 189         if (vf >= nsim_bus_dev->num_vfs)
 190                 return -EINVAL;
 191 
 192         switch (state) {
 193         case IFLA_VF_LINK_STATE_AUTO:
 194         case IFLA_VF_LINK_STATE_ENABLE:
 195         case IFLA_VF_LINK_STATE_DISABLE:
 196                 break;
 197         default:
 198                 return -EINVAL;
 199         }
 200 
 201         nsim_bus_dev->vfconfigs[vf].link_state = state;
 202 
 203         return 0;
 204 }
 205 
 206 static LIST_HEAD(nsim_block_cb_list);
 207 
 208 static int
 209 nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
 210 {
 211         struct netdevsim *ns = netdev_priv(dev);
 212 
 213         switch (type) {
 214         case TC_SETUP_BLOCK:
 215                 return flow_block_cb_setup_simple(type_data,
 216                                                   &nsim_block_cb_list,
 217                                                   nsim_setup_tc_block_cb,
 218                                                   ns, ns, true);
 219         default:
 220                 return -EOPNOTSUPP;
 221         }
 222 }
 223 
 224 static int
 225 nsim_set_features(struct net_device *dev, netdev_features_t features)
 226 {
 227         struct netdevsim *ns = netdev_priv(dev);
 228 
 229         if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC))
 230                 return nsim_bpf_disable_tc(ns);
 231 
 232         return 0;
 233 }
 234 
 235 static struct devlink_port *nsim_get_devlink_port(struct net_device *dev)
 236 {
 237         struct netdevsim *ns = netdev_priv(dev);
 238 
 239         return &ns->nsim_dev_port->devlink_port;
 240 }
 241 
 242 static const struct net_device_ops nsim_netdev_ops = {
 243         .ndo_start_xmit         = nsim_start_xmit,
 244         .ndo_set_rx_mode        = nsim_set_rx_mode,
 245         .ndo_set_mac_address    = eth_mac_addr,
 246         .ndo_validate_addr      = eth_validate_addr,
 247         .ndo_change_mtu         = nsim_change_mtu,
 248         .ndo_get_stats64        = nsim_get_stats64,
 249         .ndo_set_vf_mac         = nsim_set_vf_mac,
 250         .ndo_set_vf_vlan        = nsim_set_vf_vlan,
 251         .ndo_set_vf_rate        = nsim_set_vf_rate,
 252         .ndo_set_vf_spoofchk    = nsim_set_vf_spoofchk,
 253         .ndo_set_vf_trust       = nsim_set_vf_trust,
 254         .ndo_get_vf_config      = nsim_get_vf_config,
 255         .ndo_set_vf_link_state  = nsim_set_vf_link_state,
 256         .ndo_set_vf_rss_query_en = nsim_set_vf_rss_query_en,
 257         .ndo_setup_tc           = nsim_setup_tc,
 258         .ndo_set_features       = nsim_set_features,
 259         .ndo_bpf                = nsim_bpf,
 260         .ndo_get_devlink_port   = nsim_get_devlink_port,
 261 };
 262 
 263 static void nsim_setup(struct net_device *dev)
 264 {
 265         ether_setup(dev);
 266         eth_hw_addr_random(dev);
 267 
 268         dev->tx_queue_len = 0;
 269         dev->flags |= IFF_NOARP;
 270         dev->flags &= ~IFF_MULTICAST;
 271         dev->priv_flags |= IFF_LIVE_ADDR_CHANGE |
 272                            IFF_NO_QUEUE;
 273         dev->features |= NETIF_F_HIGHDMA |
 274                          NETIF_F_SG |
 275                          NETIF_F_FRAGLIST |
 276                          NETIF_F_HW_CSUM |
 277                          NETIF_F_TSO;
 278         dev->hw_features |= NETIF_F_HW_TC;
 279         dev->max_mtu = ETH_MAX_MTU;
 280 }
 281 
 282 struct netdevsim *
 283 nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port)
 284 {
 285         struct net_device *dev;
 286         struct netdevsim *ns;
 287         int err;
 288 
 289         dev = alloc_netdev(sizeof(*ns), "eth%d", NET_NAME_UNKNOWN, nsim_setup);
 290         if (!dev)
 291                 return ERR_PTR(-ENOMEM);
 292 
 293         ns = netdev_priv(dev);
 294         ns->netdev = dev;
 295         ns->nsim_dev = nsim_dev;
 296         ns->nsim_dev_port = nsim_dev_port;
 297         ns->nsim_bus_dev = nsim_dev->nsim_bus_dev;
 298         SET_NETDEV_DEV(dev, &ns->nsim_bus_dev->dev);
 299         dev->netdev_ops = &nsim_netdev_ops;
 300 
 301         rtnl_lock();
 302         err = nsim_bpf_init(ns);
 303         if (err)
 304                 goto err_free_netdev;
 305 
 306         nsim_ipsec_init(ns);
 307 
 308         err = register_netdevice(dev);
 309         if (err)
 310                 goto err_ipsec_teardown;
 311         rtnl_unlock();
 312 
 313         return ns;
 314 
 315 err_ipsec_teardown:
 316         nsim_ipsec_teardown(ns);
 317         nsim_bpf_uninit(ns);
 318         rtnl_unlock();
 319 err_free_netdev:
 320         free_netdev(dev);
 321         return ERR_PTR(err);
 322 }
 323 
 324 void nsim_destroy(struct netdevsim *ns)
 325 {
 326         struct net_device *dev = ns->netdev;
 327 
 328         rtnl_lock();
 329         unregister_netdevice(dev);
 330         nsim_ipsec_teardown(ns);
 331         nsim_bpf_uninit(ns);
 332         rtnl_unlock();
 333         free_netdev(dev);
 334 }
 335 
 336 static int nsim_validate(struct nlattr *tb[], struct nlattr *data[],
 337                          struct netlink_ext_ack *extack)
 338 {
 339         NL_SET_ERR_MSG_MOD(extack, "Please use: echo \"[ID] [PORT_COUNT]\" > /sys/bus/netdevsim/new_device");
 340         return -EOPNOTSUPP;
 341 }
 342 
 343 static struct rtnl_link_ops nsim_link_ops __read_mostly = {
 344         .kind           = DRV_NAME,
 345         .validate       = nsim_validate,
 346 };
 347 
 348 static int __init nsim_module_init(void)
 349 {
 350         int err;
 351 
 352         err = nsim_dev_init();
 353         if (err)
 354                 return err;
 355 
 356         err = nsim_bus_init();
 357         if (err)
 358                 goto err_dev_exit;
 359 
 360         err = nsim_fib_init();
 361         if (err)
 362                 goto err_bus_exit;
 363 
 364         err = rtnl_link_register(&nsim_link_ops);
 365         if (err)
 366                 goto err_fib_exit;
 367 
 368         return 0;
 369 
 370 err_fib_exit:
 371         nsim_fib_exit();
 372 err_bus_exit:
 373         nsim_bus_exit();
 374 err_dev_exit:
 375         nsim_dev_exit();
 376         return err;
 377 }
 378 
 379 static void __exit nsim_module_exit(void)
 380 {
 381         rtnl_link_unregister(&nsim_link_ops);
 382         nsim_fib_exit();
 383         nsim_bus_exit();
 384         nsim_dev_exit();
 385 }
 386 
 387 module_init(nsim_module_init);
 388 module_exit(nsim_module_exit);
 389 MODULE_LICENSE("GPL");
 390 MODULE_ALIAS_RTNL_LINK(DRV_NAME);

/* [<][>][^][v][top][bottom][index][help] */