Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netdevsim: move netdev creation/destruction to dev probe

Remove the existing way to create netdevsim over rtnetlink and move the
netdev creation/destruction to dev probe, so for every probed port,
a netdevsim-netdev instance is created.

Adjust selftests to work with new interface.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Pirko and committed by
David S. Miller
e05b2d14 794b2c05

+238 -197
+7 -6
drivers/net/netdevsim/bpf.c
··· 612 612 613 613 int nsim_bpf_init(struct netdevsim *ns) 614 614 { 615 + struct dentry *ddir = ns->nsim_dev_port->ddir; 615 616 int err; 616 617 617 618 err = bpf_offload_dev_netdev_register(ns->nsim_dev->bpf_dev, ··· 620 619 if (err) 621 620 return err; 622 621 623 - debugfs_create_u32("bpf_offloaded_id", 0400, ns->ddir, 622 + debugfs_create_u32("bpf_offloaded_id", 0400, ddir, 624 623 &ns->bpf_offloaded_id); 625 624 626 625 ns->bpf_tc_accept = true; 627 - debugfs_create_bool("bpf_tc_accept", 0600, ns->ddir, 626 + debugfs_create_bool("bpf_tc_accept", 0600, ddir, 628 627 &ns->bpf_tc_accept); 629 - debugfs_create_bool("bpf_tc_non_bound_accept", 0600, ns->ddir, 628 + debugfs_create_bool("bpf_tc_non_bound_accept", 0600, ddir, 630 629 &ns->bpf_tc_non_bound_accept); 631 630 ns->bpf_xdpdrv_accept = true; 632 - debugfs_create_bool("bpf_xdpdrv_accept", 0600, ns->ddir, 631 + debugfs_create_bool("bpf_xdpdrv_accept", 0600, ddir, 633 632 &ns->bpf_xdpdrv_accept); 634 633 ns->bpf_xdpoffload_accept = true; 635 - debugfs_create_bool("bpf_xdpoffload_accept", 0600, ns->ddir, 634 + debugfs_create_bool("bpf_xdpoffload_accept", 0600, ddir, 636 635 &ns->bpf_xdpoffload_accept); 637 636 638 637 ns->bpf_map_accept = true; 639 - debugfs_create_bool("bpf_map_accept", 0600, ns->ddir, 638 + debugfs_create_bool("bpf_map_accept", 0600, ddir, 640 639 &ns->bpf_map_accept); 641 640 642 641 return 0;
+9 -16
drivers/net/netdevsim/bus.c
··· 153 153 .release = nsim_bus_dev_release, 154 154 }; 155 155 156 + static struct nsim_bus_dev * 157 + nsim_bus_dev_new(unsigned int id, unsigned int port_count); 158 + 156 159 static ssize_t 157 160 new_device_store(struct bus_type *bus, const char *buf, size_t count) 158 161 { ··· 190 187 return count; 191 188 } 192 189 static BUS_ATTR_WO(new_device); 190 + 191 + static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev); 193 192 194 193 static ssize_t 195 194 del_device_store(struct bus_type *bus, const char *buf, size_t count) ··· 266 261 .num_vf = nsim_num_vf, 267 262 }; 268 263 269 - struct nsim_bus_dev *nsim_bus_dev_new(unsigned int id, unsigned int port_count) 264 + static struct nsim_bus_dev * 265 + nsim_bus_dev_new(unsigned int id, unsigned int port_count) 270 266 { 271 267 struct nsim_bus_dev *nsim_bus_dev; 272 268 int err; ··· 276 270 if (!nsim_bus_dev) 277 271 return ERR_PTR(-ENOMEM); 278 272 279 - err = ida_alloc_range(&nsim_bus_dev_ids, 280 - id == ~0 ? 0 : id, id, GFP_KERNEL); 273 + err = ida_alloc_range(&nsim_bus_dev_ids, id, id, GFP_KERNEL); 281 274 if (err < 0) 282 275 goto err_nsim_bus_dev_free; 283 276 nsim_bus_dev->dev.id = err; ··· 296 291 return ERR_PTR(err); 297 292 } 298 293 299 - struct nsim_bus_dev *nsim_bus_dev_new_with_ns(struct netdevsim *ns) 300 - { 301 - struct nsim_bus_dev *nsim_bus_dev; 302 - 303 - dev_hold(ns->netdev); 304 - rtnl_unlock(); 305 - nsim_bus_dev = nsim_bus_dev_new(~0, 0); 306 - rtnl_lock(); 307 - dev_put(ns->netdev); 308 - return nsim_bus_dev; 309 - } 310 - 311 - void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev) 294 + static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev) 312 295 { 313 296 device_unregister(&nsim_bus_dev->dev); 314 297 ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id);
+12 -1
drivers/net/netdevsim/dev.c
··· 278 278 return ERR_PTR(err); 279 279 } 280 280 281 - void nsim_dev_destroy(struct nsim_dev *nsim_dev) 281 + static void nsim_dev_destroy(struct nsim_dev *nsim_dev) 282 282 { 283 283 struct devlink *devlink = priv_to_devlink(nsim_dev); 284 284 ··· 317 317 if (err) 318 318 goto err_dl_port_unregister; 319 319 320 + nsim_dev_port->ns = nsim_create(nsim_dev, nsim_dev_port); 321 + if (IS_ERR(nsim_dev_port->ns)) { 322 + err = PTR_ERR(nsim_dev_port->ns); 323 + goto err_port_debugfs_exit; 324 + } 325 + 326 + devlink_port_type_eth_set(devlink_port, nsim_dev_port->ns->netdev); 320 327 list_add(&nsim_dev_port->list, &nsim_dev->port_list); 321 328 322 329 return 0; 323 330 331 + err_port_debugfs_exit: 332 + nsim_dev_port_debugfs_exit(nsim_dev_port); 324 333 err_dl_port_unregister: 325 334 devlink_port_unregister(devlink_port); 326 335 err_port_free: ··· 342 333 struct devlink_port *devlink_port = &nsim_dev_port->devlink_port; 343 334 344 335 list_del(&nsim_dev_port->list); 336 + devlink_port_type_clear(devlink_port); 337 + nsim_destroy(nsim_dev_port->ns); 345 338 nsim_dev_port_debugfs_exit(nsim_dev_port); 346 339 devlink_port_unregister(devlink_port); 347 340 kfree(nsim_dev_port);
+2 -1
drivers/net/netdevsim/ipsec.c
··· 283 283 ns->netdev->features |= NSIM_ESP_FEATURES; 284 284 ns->netdev->hw_enc_features |= NSIM_ESP_FEATURES; 285 285 286 - ns->ipsec.pfile = debugfs_create_file("ipsec", 0400, ns->ddir, ns, 286 + ns->ipsec.pfile = debugfs_create_file("ipsec", 0400, 287 + ns->nsim_dev_port->ddir, ns, 287 288 &ipsec_dbg_fops); 288 289 } 289 290
+49 -89
drivers/net/netdevsim/netdev.c
··· 25 25 26 26 #include "netdevsim.h" 27 27 28 - static int nsim_get_port_parent_id(struct net_device *dev, 29 - struct netdev_phys_item_id *ppid) 30 - { 31 - struct netdevsim *ns = netdev_priv(dev); 32 - 33 - memcpy(ppid, &ns->nsim_dev->switch_id, sizeof(*ppid)); 34 - return 0; 35 - } 36 - 37 - static int nsim_init(struct net_device *dev) 38 - { 39 - struct netdevsim *ns = netdev_priv(dev); 40 - char dev_link_name[32]; 41 - int err; 42 - 43 - ns->ddir = debugfs_create_dir("0", ns->nsim_dev->ports_ddir); 44 - if (IS_ERR_OR_NULL(ns->ddir)) 45 - return -ENOMEM; 46 - 47 - sprintf(dev_link_name, "../../../" DRV_NAME "%u", 48 - ns->nsim_dev->nsim_bus_dev->dev.id); 49 - debugfs_create_symlink("dev", ns->ddir, dev_link_name); 50 - 51 - err = nsim_bpf_init(ns); 52 - if (err) 53 - goto err_debugfs_destroy; 54 - 55 - nsim_ipsec_init(ns); 56 - 57 - return 0; 58 - 59 - err_debugfs_destroy: 60 - debugfs_remove_recursive(ns->ddir); 61 - return err; 62 - } 63 - 64 - static void nsim_uninit(struct net_device *dev) 65 - { 66 - struct netdevsim *ns = netdev_priv(dev); 67 - 68 - nsim_ipsec_teardown(ns); 69 - debugfs_remove_recursive(ns->ddir); 70 - nsim_bpf_uninit(ns); 71 - } 72 - 73 - static void nsim_free(struct net_device *dev) 74 - { 75 - struct netdevsim *ns = netdev_priv(dev); 76 - 77 - nsim_bus_dev_del(ns->nsim_bus_dev); 78 - /* netdev and vf state will be freed out of device_release() */ 79 - } 80 - 81 28 static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev) 82 29 { 83 30 struct netdevsim *ns = netdev_priv(dev); ··· 246 299 } 247 300 248 301 static const struct net_device_ops nsim_netdev_ops = { 249 - .ndo_init = nsim_init, 250 - .ndo_uninit = nsim_uninit, 251 302 .ndo_start_xmit = nsim_start_xmit, 252 303 .ndo_set_rx_mode = nsim_set_rx_mode, 253 304 .ndo_set_mac_address = eth_mac_addr, ··· 263 318 .ndo_setup_tc = nsim_setup_tc, 264 319 .ndo_set_features = nsim_set_features, 265 320 .ndo_bpf = nsim_bpf, 266 - .ndo_get_port_parent_id = nsim_get_port_parent_id, 267 321 }; 268 322 269 323 static void nsim_setup(struct net_device *dev) 270 324 { 271 325 ether_setup(dev); 272 326 eth_hw_addr_random(dev); 273 - 274 - dev->netdev_ops = &nsim_netdev_ops; 275 - dev->needs_free_netdev = true; 276 - dev->priv_destructor = nsim_free; 277 327 278 328 dev->tx_queue_len = 0; 279 329 dev->flags |= IFF_NOARP; ··· 284 344 dev->max_mtu = ETH_MAX_MTU; 285 345 } 286 346 287 - static int nsim_validate(struct nlattr *tb[], struct nlattr *data[], 288 - struct netlink_ext_ack *extack) 347 + struct netdevsim * 348 + nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port) 289 349 { 290 - if (tb[IFLA_ADDRESS]) { 291 - if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) 292 - return -EINVAL; 293 - if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) 294 - return -EADDRNOTAVAIL; 295 - } 296 - return 0; 297 - } 298 - 299 - static int nsim_newlink(struct net *src_net, struct net_device *dev, 300 - struct nlattr *tb[], struct nlattr *data[], 301 - struct netlink_ext_ack *extack) 302 - { 303 - struct netdevsim *ns = netdev_priv(dev); 350 + struct net_device *dev; 351 + struct netdevsim *ns; 304 352 int err; 305 353 354 + dev = alloc_netdev(sizeof(*ns), "eth%d", NET_NAME_UNKNOWN, nsim_setup); 355 + if (!dev) 356 + return ERR_PTR(-ENOMEM); 357 + 358 + ns = netdev_priv(dev); 306 359 ns->netdev = dev; 307 - ns->nsim_bus_dev = nsim_bus_dev_new_with_ns(ns); 308 - if (IS_ERR(ns->nsim_bus_dev)) 309 - return PTR_ERR(ns->nsim_bus_dev); 310 - 360 + ns->nsim_dev = nsim_dev; 361 + ns->nsim_dev_port = nsim_dev_port; 362 + ns->nsim_bus_dev = nsim_dev->nsim_bus_dev; 311 363 SET_NETDEV_DEV(dev, &ns->nsim_bus_dev->dev); 364 + dev->netdev_ops = &nsim_netdev_ops; 312 365 313 - ns->nsim_dev = dev_get_drvdata(&ns->nsim_bus_dev->dev); 366 + rtnl_lock(); 367 + err = nsim_bpf_init(ns); 368 + if (err) 369 + goto err_free_netdev; 370 + 371 + nsim_ipsec_init(ns); 314 372 315 373 err = register_netdevice(dev); 316 374 if (err) 317 - goto err_dev_del; 318 - return 0; 375 + goto err_ipsec_teardown; 376 + rtnl_unlock(); 319 377 320 - err_dev_del: 321 - nsim_bus_dev_del(ns->nsim_bus_dev); 322 - return err; 378 + return ns; 379 + 380 + err_ipsec_teardown: 381 + nsim_ipsec_teardown(ns); 382 + nsim_bpf_uninit(ns); 383 + rtnl_unlock(); 384 + err_free_netdev: 385 + free_netdev(dev); 386 + return ERR_PTR(err); 387 + } 388 + 389 + void nsim_destroy(struct netdevsim *ns) 390 + { 391 + struct net_device *dev = ns->netdev; 392 + 393 + rtnl_lock(); 394 + unregister_netdevice(dev); 395 + nsim_ipsec_teardown(ns); 396 + nsim_bpf_uninit(ns); 397 + rtnl_unlock(); 398 + free_netdev(dev); 399 + } 400 + 401 + static int nsim_validate(struct nlattr *tb[], struct nlattr *data[], 402 + struct netlink_ext_ack *extack) 403 + { 404 + NL_SET_ERR_MSG_MOD(extack, "Please use: echo \"[ID] [PORT_COUNT]\" > /sys/bus/netdevsim/new_device"); 405 + return -EOPNOTSUPP; 323 406 } 324 407 325 408 static struct rtnl_link_ops nsim_link_ops __read_mostly = { 326 409 .kind = DRV_NAME, 327 - .priv_size = sizeof(struct netdevsim), 328 - .setup = nsim_setup, 329 410 .validate = nsim_validate, 330 - .newlink = nsim_newlink, 331 411 }; 332 412 333 413 static int __init nsim_module_init(void)
+6 -5
drivers/net/netdevsim/netdevsim.h
··· 51 51 struct netdevsim { 52 52 struct net_device *netdev; 53 53 struct nsim_dev *nsim_dev; 54 + struct nsim_dev_port *nsim_dev_port; 54 55 55 56 u64 tx_packets; 56 57 u64 tx_bytes; 57 58 struct u64_stats_sync syncp; 58 59 59 60 struct nsim_bus_dev *nsim_bus_dev; 60 - 61 - struct dentry *ddir; 62 61 63 62 struct bpf_prog *bpf_offloaded; 64 63 u32 bpf_offloaded_id; ··· 73 74 bool bpf_map_accept; 74 75 struct nsim_ipsec ipsec; 75 76 }; 77 + 78 + struct netdevsim * 79 + nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port); 80 + void nsim_destroy(struct netdevsim *ns); 76 81 77 82 #ifdef CONFIG_BPF_SYSCALL 78 83 int nsim_bpf_dev_init(struct nsim_dev *nsim_dev); ··· 139 136 struct devlink_port devlink_port; 140 137 unsigned int port_index; 141 138 struct dentry *ddir; 139 + struct netdevsim *ns; 142 140 }; 143 141 144 142 struct nsim_dev { ··· 216 212 struct nsim_vf_config *vfconfigs; 217 213 }; 218 214 219 - struct nsim_bus_dev *nsim_bus_dev_new(unsigned int id, unsigned int port_count); 220 - struct nsim_bus_dev *nsim_bus_dev_new_with_ns(struct netdevsim *ns); 221 - void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev); 222 215 int nsim_bus_init(void); 223 216 void nsim_bus_exit(void);
+147 -76
tools/testing/selftests/bpf/test_offload.py
··· 1 1 #!/usr/bin/python3 2 2 3 3 # Copyright (C) 2017 Netronome Systems, Inc. 4 + # Copyright (c) 2019 Mellanox Technologies. All rights reserved 4 5 # 5 6 # This software is licensed under the GNU General License Version 2, 6 7 # June 1991 as shown in the file COPYING in the top-level directory of this ··· 16 15 17 16 from datetime import datetime 18 17 import argparse 18 + import errno 19 19 import json 20 20 import os 21 21 import pprint 22 22 import random 23 + import re 23 24 import string 24 25 import struct 25 26 import subprocess ··· 326 323 327 324 return dfs 328 325 326 + class NetdevSimDev: 327 + """ 328 + Class for netdevsim bus device and its attributes. 329 + """ 330 + 331 + def __init__(self, port_count=1): 332 + addr = 0 333 + while True: 334 + try: 335 + with open("/sys/bus/netdevsim/new_device", "w") as f: 336 + f.write("%u %u" % (addr, port_count)) 337 + except OSError as e: 338 + if e.errno == errno.ENOSPC: 339 + addr += 1 340 + continue 341 + raise e 342 + break 343 + self.addr = addr 344 + 345 + # As probe of netdevsim device might happen from a workqueue, 346 + # so wait here until all netdevs appear. 347 + self.wait_for_netdevs(port_count) 348 + 349 + ret, out = cmd("udevadm settle", fail=False) 350 + if ret: 351 + raise Exception("udevadm settle failed") 352 + ifnames = self.get_ifnames() 353 + 354 + devs.append(self) 355 + self.dfs_dir = "/sys/kernel/debug/netdevsim/netdevsim%u/" % addr 356 + 357 + self.nsims = [] 358 + for port_index in range(port_count): 359 + self.nsims.append(NetdevSim(self, port_index, ifnames[port_index])) 360 + 361 + def get_ifnames(self): 362 + ifnames = [] 363 + listdir = os.listdir("/sys/bus/netdevsim/devices/netdevsim%u/net/" % self.addr) 364 + for ifname in listdir: 365 + ifnames.append(ifname) 366 + ifnames.sort() 367 + return ifnames 368 + 369 + def wait_for_netdevs(self, port_count): 370 + timeout = 5 371 + timeout_start = time.time() 372 + 373 + while True: 374 + try: 375 + ifnames = self.get_ifnames() 376 + except FileNotFoundError as e: 377 + ifnames = [] 378 + if len(ifnames) == port_count: 379 + break 380 + if time.time() < timeout_start + timeout: 381 + continue 382 + raise Exception("netdevices did not appear within timeout") 383 + 384 + def dfs_num_bound_progs(self): 385 + path = os.path.join(self.dfs_dir, "bpf_bound_progs") 386 + _, progs = cmd('ls %s' % (path)) 387 + return len(progs.split()) 388 + 389 + def dfs_get_bound_progs(self, expected): 390 + progs = DebugfsDir(os.path.join(self.dfs_dir, "bpf_bound_progs")) 391 + if expected is not None: 392 + if len(progs) != expected: 393 + fail(True, "%d BPF programs bound, expected %d" % 394 + (len(progs), expected)) 395 + return progs 396 + 397 + def remove(self): 398 + with open("/sys/bus/netdevsim/del_device", "w") as f: 399 + f.write("%u" % self.addr) 400 + devs.remove(self) 401 + 402 + def remove_nsim(self, nsim): 403 + self.nsims.remove(nsim) 404 + with open("/sys/bus/netdevsim/devices/netdevsim%u/del_port" % self.addr ,"w") as f: 405 + f.write("%u" % nsim.port_index) 406 + 329 407 class NetdevSim: 330 408 """ 331 409 Class for netdevsim netdevice and its attributes. 332 410 """ 333 411 334 - def __init__(self, link=None): 335 - self.link = link 412 + def __init__(self, nsimdev, port_index, ifname): 413 + # In case udev renamed the netdev to according to new schema, 414 + # check if the name matches the port_index. 415 + nsimnamere = re.compile("eni\d+np(\d+)") 416 + match = nsimnamere.match(ifname) 417 + if match and int(match.groups()[0]) != port_index + 1: 418 + raise Exception("netdevice name mismatches the expected one") 336 419 337 - self.dev = self._netdevsim_create() 338 - devs.append(self) 339 - 420 + self.nsimdev = nsimdev 421 + self.port_index = port_index 340 422 self.ns = "" 341 - 342 - self.dfs_dir = '/sys/kernel/debug/netdevsim/netdevsim0/ports/0/' 343 - self.dev_dir = self.dfs_dir + '/dev/' 423 + self.dfs_dir = "%s/ports/%u/" % (nsimdev.dfs_dir, port_index) 344 424 self.dfs_refresh() 425 + _, [self.dev] = ip("link show dev %s" % ifname) 345 426 346 427 def __getitem__(self, key): 347 428 return self.dev[key] 348 429 349 - def _netdevsim_create(self): 350 - link = "" if self.link is None else "link " + self.link.dev['ifname'] 351 - _, old = ip("link show") 352 - ip("link add sim%d {link} type netdevsim".format(link=link)) 353 - _, new = ip("link show") 354 - 355 - for dev in new: 356 - f = filter(lambda x: x["ifname"] == dev["ifname"], old) 357 - if len(list(f)) == 0: 358 - return dev 359 - 360 - raise Exception("failed to create netdevsim device") 361 - 362 430 def remove(self): 363 - devs.remove(self) 364 - ip("link del dev %s" % (self.dev["ifname"]), ns=self.ns) 431 + self.nsimdev.remove_nsim(self) 365 432 366 433 def dfs_refresh(self): 367 434 self.dfs = DebugfsDir(self.dfs_dir) ··· 442 369 _, data = cmd('cat %s' % (path)) 443 370 return data.strip() 444 371 445 - def dfs_num_bound_progs(self): 446 - path = os.path.join(self.dev_dir, "bpf_bound_progs") 447 - _, progs = cmd('ls %s' % (path)) 448 - return len(progs.split()) 449 - 450 - def dfs_get_bound_progs(self, expected): 451 - progs = DebugfsDir(os.path.join(self.dev_dir, "bpf_bound_progs")) 452 - if expected is not None: 453 - if len(progs) != expected: 454 - fail(True, "%d BPF programs bound, expected %d" % 455 - (len(progs), expected)) 456 - return progs 457 - 458 372 def wait_for_flush(self, bound=0, total=0, n_retry=20): 459 373 for i in range(n_retry): 460 - nbound = self.dfs_num_bound_progs() 374 + nbound = self.nsimdev.dfs_num_bound_progs() 461 375 nprogs = len(bpftool_prog_list()) 462 376 if nbound == bound and nprogs == total: 463 377 return ··· 674 614 include_stderr=True) 675 615 check_no_extack(res, needle) 676 616 677 - def test_multi_prog(sim, obj, modename, modeid): 617 + def test_multi_prog(simdev, sim, obj, modename, modeid): 678 618 start_test("Test multi-attachment XDP - %s + offload..." % 679 619 (modename or "default", )) 680 620 sim.set_xdp(obj, "offload") ··· 730 670 check_multi_basic(two_xdps) 731 671 732 672 start_test("Test multi-attachment XDP - device remove...") 733 - sim.remove() 673 + simdev.remove() 734 674 735 - sim = NetdevSim() 675 + simdev = NetdevSimDev() 676 + sim, = simdev.nsims 736 677 sim.set_ethtool_tc_offloads(True) 737 - return sim 678 + return [simdev, sim] 738 679 739 680 # Parse command line 740 681 parser = argparse.ArgumentParser() ··· 792 731 bytecode = bpf_bytecode("1,6 0 0 4294967295,") 793 732 794 733 start_test("Test destruction of generic XDP...") 795 - sim = NetdevSim() 734 + simdev = NetdevSimDev() 735 + sim, = simdev.nsims 796 736 sim.set_xdp(obj, "generic") 797 - sim.remove() 737 + simdev.remove() 798 738 bpftool_prog_list_wait(expected=0) 799 739 800 - sim = NetdevSim() 740 + simdev = NetdevSimDev() 741 + sim, = simdev.nsims 801 742 sim.tc_add_ingress() 802 743 803 744 start_test("Test TC non-offloaded...") ··· 809 746 start_test("Test TC non-offloaded isn't getting bound...") 810 747 ret, _ = sim.cls_bpf_add_filter(obj, fail=False) 811 748 fail(ret != 0, "Software TC filter did not load") 812 - sim.dfs_get_bound_progs(expected=0) 749 + simdev.dfs_get_bound_progs(expected=0) 813 750 814 751 sim.tc_flush_filters() 815 752 ··· 826 763 start_test("Test TC offload by default...") 827 764 ret, _ = sim.cls_bpf_add_filter(obj, fail=False) 828 765 fail(ret != 0, "Software TC filter did not load") 829 - sim.dfs_get_bound_progs(expected=0) 766 + simdev.dfs_get_bound_progs(expected=0) 830 767 ingress = sim.tc_show_ingress(expected=1) 831 768 fltr = ingress[0] 832 769 fail(not fltr["in_hw"], "Filter not offloaded by default") ··· 836 773 start_test("Test TC cBPF bytcode tries offload by default...") 837 774 ret, _ = sim.cls_bpf_add_filter(bytecode, fail=False) 838 775 fail(ret != 0, "Software TC filter did not load") 839 - sim.dfs_get_bound_progs(expected=0) 776 + simdev.dfs_get_bound_progs(expected=0) 840 777 ingress = sim.tc_show_ingress(expected=1) 841 778 fltr = ingress[0] 842 779 fail(not fltr["in_hw"], "Bytecode not offloaded by default") ··· 904 841 check_verifier_log(err, "[netdevsim] Hello from netdevsim!") 905 842 906 843 start_test("Test TC offload basics...") 907 - dfs = sim.dfs_get_bound_progs(expected=1) 844 + dfs = simdev.dfs_get_bound_progs(expected=1) 908 845 progs = bpftool_prog_list(expected=1) 909 846 ingress = sim.tc_show_ingress(expected=1) 910 847 ··· 939 876 940 877 start_test("Test destroying device gets rid of TC filters...") 941 878 sim.cls_bpf_add_filter(obj, skip_sw=True) 942 - sim.remove() 879 + simdev.remove() 943 880 bpftool_prog_list_wait(expected=0) 944 881 945 - sim = NetdevSim() 882 + simdev = NetdevSimDev() 883 + sim, = simdev.nsims 946 884 sim.set_ethtool_tc_offloads(True) 947 885 948 886 start_test("Test destroying device gets rid of XDP...") 949 887 sim.set_xdp(obj, "offload") 950 - sim.remove() 888 + simdev.remove() 951 889 bpftool_prog_list_wait(expected=0) 952 890 953 - sim = NetdevSim() 891 + simdev = NetdevSimDev() 892 + sim, = simdev.nsims 954 893 sim.set_ethtool_tc_offloads(True) 955 894 956 895 start_test("Test XDP prog reporting...") ··· 1038 973 check_verifier_log(err, "[netdevsim] Hello from netdevsim!") 1039 974 1040 975 start_test("Test XDP offload is device bound...") 1041 - dfs = sim.dfs_get_bound_progs(expected=1) 976 + dfs = simdev.dfs_get_bound_progs(expected=1) 1042 977 dprog = dfs[0] 1043 978 1044 979 fail(prog["id"] != link_xdp["id"], "Program IDs don't match") ··· 1057 992 bpftool_prog_list_wait(expected=0) 1058 993 1059 994 start_test("Test attempt to use a program for a wrong device...") 1060 - sim2 = NetdevSim() 995 + simdev2 = NetdevSimDev() 996 + sim2, = simdev2.nsims 1061 997 sim2.set_xdp(obj, "offload") 1062 998 pin_file, pinned = pin_prog("/sys/fs/bpf/tmp") 1063 999 ··· 1066 1000 fail=False, include_stderr=True) 1067 1001 fail(ret == 0, "Pinned program loaded for a different device accepted") 1068 1002 check_extack_nsim(err, "program bound to different dev.", args) 1069 - sim2.remove() 1003 + simdev2.remove() 1070 1004 ret, _, err = sim.set_xdp(pinned, "offload", 1071 1005 fail=False, include_stderr=True) 1072 1006 fail(ret == 0, "Pinned program loaded for a removed device accepted") ··· 1074 1008 rm(pin_file) 1075 1009 bpftool_prog_list_wait(expected=0) 1076 1010 1077 - sim = test_multi_prog(sim, obj, "", 1) 1078 - sim = test_multi_prog(sim, obj, "drv", 1) 1079 - sim = test_multi_prog(sim, obj, "generic", 2) 1011 + simdev, sim = test_multi_prog(simdev, sim, obj, "", 1) 1012 + simdev, sim = test_multi_prog(simdev, sim, obj, "drv", 1) 1013 + simdev, sim = test_multi_prog(simdev, sim, obj, "generic", 2) 1080 1014 1081 1015 start_test("Test mixing of TC and XDP...") 1082 1016 sim.tc_add_ingress() ··· 1129 1063 (sim['ifname'], obj) 1130 1064 tc_proc = cmd(cmd_line, background=True, fail=False) 1131 1065 # Wait for the verifier to start 1132 - while sim.dfs_num_bound_progs() <= 2: 1066 + while simdev.dfs_num_bound_progs() <= 2: 1133 1067 pass 1134 - sim.remove() 1068 + simdev.remove() 1135 1069 end = time.time() 1136 1070 ret, _ = cmd_result(tc_proc, fail=False) 1137 1071 time_diff = end - start ··· 1146 1080 clean_up() 1147 1081 bpftool_prog_list_wait(expected=0) 1148 1082 1149 - sim = NetdevSim() 1083 + simdev = NetdevSimDev() 1084 + sim, = simdev.nsims 1150 1085 map_obj = bpf_obj("sample_map_ret0.o") 1151 1086 start_test("Test loading program with maps...") 1152 1087 sim.set_xdp(map_obj, "offload", JSON=False) # map fixup msg breaks JSON ··· 1169 1102 1170 1103 prog_file, _ = pin_prog("/sys/fs/bpf/tmp_prog") 1171 1104 map_file, _ = pin_map("/sys/fs/bpf/tmp_map", idx=1, expected=2) 1172 - sim.remove() 1105 + simdev.remove() 1173 1106 1174 1107 start_test("Test bpftool bound info reporting (removed dev)...") 1175 1108 check_dev_info_removed(prog_file=prog_file, map_file=map_file) ··· 1178 1111 clean_up() 1179 1112 bpftool_prog_list_wait(expected=0) 1180 1113 1181 - sim = NetdevSim() 1114 + simdev = NetdevSimDev() 1115 + sim, = simdev.nsims 1182 1116 1183 1117 start_test("Test map update (no flags)...") 1184 1118 sim.set_xdp(map_obj, "offload", JSON=False) # map fixup msg breaks JSON ··· 1260 1192 start_test("Test map remove...") 1261 1193 sim.unset_xdp("offload") 1262 1194 bpftool_map_list_wait(expected=0) 1263 - sim.remove() 1195 + simdev.remove() 1264 1196 1265 - sim = NetdevSim() 1197 + simdev = NetdevSimDev() 1198 + sim, = simdev.nsims 1266 1199 sim.set_xdp(map_obj, "offload", JSON=False) # map fixup msg breaks JSON 1267 - sim.remove() 1200 + simdev.remove() 1268 1201 bpftool_map_list_wait(expected=0) 1269 1202 1270 1203 start_test("Test map creation fail path...") 1271 - sim = NetdevSim() 1204 + simdev = NetdevSimDev() 1205 + sim, = simdev.nsims 1272 1206 sim.dfs["bpf_map_accept"] = "N" 1273 1207 ret, _ = sim.set_xdp(map_obj, "offload", JSON=False, fail=False) 1274 1208 fail(ret == 0, 1275 1209 "netdevsim didn't refuse to create a map with offload disabled") 1276 1210 1277 - sim.remove() 1211 + simdev.remove() 1278 1212 1279 1213 start_test("Test multi-dev ASIC program reuse...") 1280 - simA = NetdevSim() 1281 - simB1 = NetdevSim() 1282 - simB2 = NetdevSim(link=simB1) 1283 - simB3 = NetdevSim(link=simB1) 1214 + simdevA = NetdevSimDev() 1215 + simA, = simdevA.nsims 1216 + simdevB = NetdevSimDev(3) 1217 + simB1, simB2, simB3 = simdevB.nsims 1284 1218 sims = (simA, simB1, simB2, simB3) 1285 1219 simB = (simB1, simB2, simB3) 1286 1220 ··· 1294 1224 progB = bpf_pinned("/sys/fs/bpf/nsimB") 1295 1225 1296 1226 simA.set_xdp(progA, "offload", JSON=False) 1297 - for d in simB: 1227 + for d in simdevB.nsims: 1298 1228 d.set_xdp(progB, "offload", JSON=False) 1299 1229 1300 1230 start_test("Test multi-dev ASIC cross-dev replace...") 1301 1231 ret, _ = simA.set_xdp(progB, "offload", force=True, JSON=False, fail=False) 1302 1232 fail(ret == 0, "cross-ASIC program allowed") 1303 - for d in simB: 1233 + for d in simdevB.nsims: 1304 1234 ret, _ = d.set_xdp(progA, "offload", force=True, JSON=False, fail=False) 1305 1235 fail(ret == 0, "cross-ASIC program allowed") 1306 1236 ··· 1312 1242 fail=False, include_stderr=True) 1313 1243 fail(ret == 0, "cross-ASIC program allowed") 1314 1244 check_extack_nsim(err, "program bound to different dev.", args) 1315 - for d in simB: 1245 + for d in simdevB.nsims: 1316 1246 ret, _, err = d.set_xdp(progA, "offload", force=True, JSON=False, 1317 1247 fail=False, include_stderr=True) 1318 1248 fail(ret == 0, "cross-ASIC program allowed") ··· 1349 1279 start_test("Test multi-dev ASIC cross-dev destruction...") 1350 1280 bpftool_prog_list_wait(expected=2) 1351 1281 1352 - simA.remove() 1282 + simdevA.remove() 1353 1283 bpftool_prog_list_wait(expected=1) 1354 1284 1355 1285 ifnameB = bpftool("prog show %s" % (progB))[1]["dev"]["ifname"] ··· 1367 1297 fail(ifnameB != simB3['ifname'], "program not bound to remaining device") 1368 1298 1369 1299 simB3.remove() 1300 + simdevB.remove() 1370 1301 bpftool_prog_list_wait(expected=0) 1371 1302 1372 1303 start_test("Test multi-dev ASIC cross-dev destruction - orphaned...")
+6 -3
tools/testing/selftests/net/rtnetlink.sh
··· 696 696 algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128" 697 697 srcip=192.168.123.3 698 698 dstip=192.168.123.4 699 - dev=simx1 700 699 sysfsd=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/ 701 700 sysfsf=$sysfsd/ipsec 701 + sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/ 702 702 703 703 # setup netdevsim since dummydev doesn't have offload support 704 704 modprobe netdevsim ··· 708 708 return 1 709 709 fi 710 710 711 - ip link add $dev type netdevsim 711 + echo "0" > /sys/bus/netdevsim/new_device 712 + while [ ! -d $sysfsnet ] ; do :; done 713 + udevadm settle 714 + dev=`ls $sysfsnet` 715 + 712 716 ip addr add $srcip dev $dev 713 717 ip link set $dev up 714 718 if [ ! -d $sysfsd ] ; then ··· 785 781 fi 786 782 787 783 # clean up any leftovers 788 - ip link del $dev 789 784 rmmod netdevsim 790 785 791 786 if [ $ret -ne 0 ]; then