diff options
| author | Linus Torvalds <[email protected]> | 2021-11-02 06:20:58 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2021-11-02 06:20:58 -0700 | 
| commit | fc02cb2b37fe2cbf1d3334b9f0f0eab9431766c4 (patch) | |
| tree | 93b16bc48fdc3be4a1adccbf4c7de92a5e8440e1 /net/switchdev/switchdev.c | |
| parent | bfc484fe6abba4b89ec9330e0e68778e2a9856b2 (diff) | |
| parent | 84882cf72cd774cf16fd338bdbf00f69ac9f9194 (diff) | |
Merge tag 'net-next-for-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
Pull networking updates from Jakub Kicinski:
 "Core:
   - Remove socket skb caches
   - Add a SO_RESERVE_MEM socket op to forward allocate buffer space and
     avoid memory accounting overhead on each message sent
   - Introduce managed neighbor entries - added by control plane and
     resolved by the kernel for use in acceleration paths (BPF / XDP
     right now, HW offload users will benefit as well)
   - Make neighbor eviction on link down controllable by userspace to
     work around WiFi networks with bad roaming implementations
   - vrf: Rework interaction with netfilter/conntrack
   - fq_codel: implement L4S style ce_threshold_ect1 marking
   - sch: Eliminate unnecessary RCU waits in mini_qdisc_pair_swap()
  BPF:
   - Add support for new btf kind BTF_KIND_TAG, arbitrary type tagging
     as implemented in LLVM14
   - Introduce bpf_get_branch_snapshot() to capture Last Branch Records
   - Implement variadic trace_printk helper
   - Add a new Bloomfilter map type
   - Track <8-byte scalar spill and refill
   - Access hw timestamp through BPF's __sk_buff
   - Disallow unprivileged BPF by default
   - Document BPF licensing
  Netfilter:
   - Introduce egress hook for looking at raw outgoing packets
   - Allow matching on and modifying inner headers / payload data
   - Add NFT_META_IFTYPE to match on the interface type either from
     ingress or egress
  Protocols:
   - Multi-Path TCP:
      - increase default max additional subflows to 2
      - rework forward memory allocation
      - add getsockopts: MPTCP_INFO, MPTCP_TCPINFO, MPTCP_SUBFLOW_ADDRS
   - MCTP flow support allowing lower layer drivers to configure msg
     muxing as needed
   - Automatic Multicast Tunneling (AMT) driver based on RFC7450
   - HSR support the redbox supervision frames (IEC-62439-3:2018)
   - Support for the ip6ip6 encapsulation of IOAM
   - Netlink interface for CAN-FD's Transmitter Delay Compensation
   - Support SMC-Rv2 eliminating the current same-subnet restriction, by
     exploiting the UDP encapsulation feature of RoCE adapters
   - TLS: add SM4 GCM/CCM crypto support
   - Bluetooth: initial support for link quality and audio/codec offload
  Driver APIs:
   - Add a batched interface for RX buffer allocation in AF_XDP buffer
     pool
   - ethtool: Add ability to control transceiver modules' power mode
   - phy: Introduce supported interfaces bitmap to express MAC
     capabilities and simplify PHY code
   - Drop rtnl_lock from DSA .port_fdb_{add,del} callbacks
  New drivers:
   - WiFi driver for Realtek 8852AE 802.11ax devices (rtw89)
   - Ethernet driver for ASIX AX88796C SPI device (x88796c)
  Drivers:
   - Broadcom PHYs
      - support 72165, 7712 16nm PHYs
      - support IDDQ-SR for additional power savings
   - PHY support for QCA8081, QCA9561 PHYs
   - NXP DPAA2: support for IRQ coalescing
   - NXP Ethernet (enetc): support for software TCP segmentation
   - Renesas Ethernet (ravb) - support DMAC and EMAC blocks of
     Gigabit-capable IP found on RZ/G2L SoC
   - Intel 100G Ethernet
      - support for eswitch offload of TC/OvS flow API, including
        offload of GRE, VxLAN, Geneve tunneling
      - support application device queues - ability to assign Rx and Tx
        queues to application threads
      - PTP and PPS (pulse-per-second) extensions
   - Broadcom Ethernet (bnxt)
      - devlink health reporting and device reload extensions
   - Mellanox Ethernet (mlx5)
      - offload macvlan interfaces
      - support HW offload of TC rules involving OVS internal ports
      - support HW-GRO and header/data split
      - support application device queues
   - Marvell OcteonTx2:
      - add XDP support for PF
      - add PTP support for VF
   - Qualcomm Ethernet switch (qca8k): support for QCA8328
   - Realtek Ethernet DSA switch (rtl8366rb)
      - support bridge offload
      - support STP, fast aging, disabling address learning
      - support for Realtek RTL8365MB-VC, a 4+1 port 10M/100M/1GE switch
   - Mellanox Ethernet/IB switch (mlxsw)
      - multi-level qdisc hierarchy offload (e.g. RED, prio and shaping)
      - offload root TBF qdisc as port shaper
      - support multiple routing interface MAC address prefixes
      - support for IP-in-IP with IPv6 underlay
   - MediaTek WiFi (mt76)
      - mt7921 - ASPM, 6GHz, SDIO and testmode support
      - mt7915 - LED and TWT support
   - Qualcomm WiFi (ath11k)
      - include channel rx and tx time in survey dump statistics
      - support for 80P80 and 160 MHz bandwidths
      - support channel 2 in 6 GHz band
      - spectral scan support for QCN9074
      - support for rx decapsulation offload (data frames in 802.3
        format)
   - Qualcomm phone SoC WiFi (wcn36xx)
      - enable Idle Mode Power Save (IMPS) to reduce power consumption
        during idle
   - Bluetooth driver support for MediaTek MT7922 and MT7921
   - Enable support for AOSP Bluetooth extension in Qualcomm WCN399x and
     Realtek 8822C/8852A
   - Microsoft vNIC driver (mana)
      - support hibernation and kexec
   - Google vNIC driver (gve)
      - support for jumbo frames
      - implement Rx page reuse
  Refactor:
   - Make all writes to netdev->dev_addr go thru helpers, so that we can
     add this address to the address rbtree and handle the updates
   - Various TCP cleanups and optimizations including improvements to
     CPU cache use
   - Simplify the gnet_stats, Qdisc stats' handling and remove
     qdisc->running sequence counter
   - Driver changes and API updates to address devlink locking
     deficiencies"
* tag 'net-next-for-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (2122 commits)
  Revert "net: avoid double accounting for pure zerocopy skbs"
  selftests: net: add arp_ndisc_evict_nocarrier
  net: ndisc: introduce ndisc_evict_nocarrier sysctl parameter
  net: arp: introduce arp_evict_nocarrier sysctl parameter
  libbpf: Deprecate AF_XDP support
  kbuild: Unify options for BTF generation for vmlinux and modules
  selftests/bpf: Add a testcase for 64-bit bounds propagation issue.
  bpf: Fix propagation of signed bounds from 64-bit min/max into 32-bit.
  bpf: Fix propagation of bounds from 64-bit min/max into 32-bit and var_off.
  net: vmxnet3: remove multiple false checks in vmxnet3_ethtool.c
  net: avoid double accounting for pure zerocopy skbs
  tcp: rename sk_wmem_free_skb
  netdevsim: fix uninit value in nsim_drv_configure_vfs()
  selftests/bpf: Fix also no-alu32 strobemeta selftest
  bpf: Add missing map_delete_elem method to bloom filter map
  selftests/bpf: Add bloom map success test for userspace calls
  bpf: Add alignment padding for "map_extra" + consolidate holes
  bpf: Bloom filter map naming fixups
  selftests/bpf: Add test cases for struct_ops prog
  bpf: Add dummy BPF STRUCT_OPS for test purpose
  ...
Diffstat (limited to 'net/switchdev/switchdev.c')
| -rw-r--r-- | net/switchdev/switchdev.c | 156 | 
1 files changed, 25 insertions, 131 deletions
| diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 0b2c18efc079..83460470e883 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c @@ -428,17 +428,17 @@ switchdev_lower_dev_find(struct net_device *dev,  	return switchdev_priv.lower_dev;  } -static int __switchdev_handle_fdb_add_to_device(struct net_device *dev, -		const struct net_device *orig_dev, +static int __switchdev_handle_fdb_event_to_device(struct net_device *dev, +		struct net_device *orig_dev, unsigned long event,  		const struct switchdev_notifier_fdb_info *fdb_info,  		bool (*check_cb)(const struct net_device *dev),  		bool (*foreign_dev_check_cb)(const struct net_device *dev,  					     const struct net_device *foreign_dev), -		int (*add_cb)(struct net_device *dev, -			      const struct net_device *orig_dev, const void *ctx, +		int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, +			      unsigned long event, const void *ctx,  			      const struct switchdev_notifier_fdb_info *fdb_info), -		int (*lag_add_cb)(struct net_device *dev, -				  const struct net_device *orig_dev, const void *ctx, +		int (*lag_mod_cb)(struct net_device *dev, struct net_device *orig_dev, +				  unsigned long event, const void *ctx,  				  const struct switchdev_notifier_fdb_info *fdb_info))  {  	const struct switchdev_notifier_info *info = &fdb_info->info; @@ -447,17 +447,17 @@ static int __switchdev_handle_fdb_add_to_device(struct net_device *dev,  	int err = -EOPNOTSUPP;  	if (check_cb(dev)) -		return add_cb(dev, orig_dev, info->ctx, fdb_info); +		return mod_cb(dev, orig_dev, event, info->ctx, fdb_info);  	if (netif_is_lag_master(dev)) {  		if (!switchdev_lower_dev_find(dev, check_cb, foreign_dev_check_cb))  			goto maybe_bridged_with_us;  		/* This is a LAG interface that we offload */ -		if (!lag_add_cb) +		if (!lag_mod_cb)  			return -EOPNOTSUPP; -		return lag_add_cb(dev, orig_dev, info->ctx, fdb_info); +		return lag_mod_cb(dev, orig_dev, event, info->ctx, fdb_info);  	}  	/* Recurse through lower interfaces in case the FDB entry is pointing @@ -481,10 +481,10 @@ static int __switchdev_handle_fdb_add_to_device(struct net_device *dev,  						      foreign_dev_check_cb))  				continue; -			err = __switchdev_handle_fdb_add_to_device(lower_dev, orig_dev, -								   fdb_info, check_cb, -								   foreign_dev_check_cb, -								   add_cb, lag_add_cb); +			err = __switchdev_handle_fdb_event_to_device(lower_dev, orig_dev, +								     event, fdb_info, check_cb, +								     foreign_dev_check_cb, +								     mod_cb, lag_mod_cb);  			if (err && err != -EOPNOTSUPP)  				return err;  		} @@ -503,140 +503,34 @@ maybe_bridged_with_us:  	if (!switchdev_lower_dev_find(br, check_cb, foreign_dev_check_cb))  		return 0; -	return __switchdev_handle_fdb_add_to_device(br, orig_dev, fdb_info, -						    check_cb, foreign_dev_check_cb, -						    add_cb, lag_add_cb); +	return __switchdev_handle_fdb_event_to_device(br, orig_dev, event, fdb_info, +						      check_cb, foreign_dev_check_cb, +						      mod_cb, lag_mod_cb);  } -int switchdev_handle_fdb_add_to_device(struct net_device *dev, +int switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event,  		const struct switchdev_notifier_fdb_info *fdb_info,  		bool (*check_cb)(const struct net_device *dev),  		bool (*foreign_dev_check_cb)(const struct net_device *dev,  					     const struct net_device *foreign_dev), -		int (*add_cb)(struct net_device *dev, -			      const struct net_device *orig_dev, const void *ctx, +		int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, +			      unsigned long event, const void *ctx,  			      const struct switchdev_notifier_fdb_info *fdb_info), -		int (*lag_add_cb)(struct net_device *dev, -				  const struct net_device *orig_dev, const void *ctx, +		int (*lag_mod_cb)(struct net_device *dev, struct net_device *orig_dev, +				  unsigned long event, const void *ctx,  				  const struct switchdev_notifier_fdb_info *fdb_info))  {  	int err; -	err = __switchdev_handle_fdb_add_to_device(dev, dev, fdb_info, -						   check_cb, -						   foreign_dev_check_cb, -						   add_cb, lag_add_cb); +	err = __switchdev_handle_fdb_event_to_device(dev, dev, event, fdb_info, +						     check_cb, foreign_dev_check_cb, +						     mod_cb, lag_mod_cb);  	if (err == -EOPNOTSUPP)  		err = 0;  	return err;  } -EXPORT_SYMBOL_GPL(switchdev_handle_fdb_add_to_device); - -static int __switchdev_handle_fdb_del_to_device(struct net_device *dev, -		const struct net_device *orig_dev, -		const struct switchdev_notifier_fdb_info *fdb_info, -		bool (*check_cb)(const struct net_device *dev), -		bool (*foreign_dev_check_cb)(const struct net_device *dev, -					     const struct net_device *foreign_dev), -		int (*del_cb)(struct net_device *dev, -			      const struct net_device *orig_dev, const void *ctx, -			      const struct switchdev_notifier_fdb_info *fdb_info), -		int (*lag_del_cb)(struct net_device *dev, -				  const struct net_device *orig_dev, const void *ctx, -				  const struct switchdev_notifier_fdb_info *fdb_info)) -{ -	const struct switchdev_notifier_info *info = &fdb_info->info; -	struct net_device *br, *lower_dev; -	struct list_head *iter; -	int err = -EOPNOTSUPP; - -	if (check_cb(dev)) -		return del_cb(dev, orig_dev, info->ctx, fdb_info); - -	if (netif_is_lag_master(dev)) { -		if (!switchdev_lower_dev_find(dev, check_cb, foreign_dev_check_cb)) -			goto maybe_bridged_with_us; - -		/* This is a LAG interface that we offload */ -		if (!lag_del_cb) -			return -EOPNOTSUPP; - -		return lag_del_cb(dev, orig_dev, info->ctx, fdb_info); -	} - -	/* Recurse through lower interfaces in case the FDB entry is pointing -	 * towards a bridge device. -	 */ -	if (netif_is_bridge_master(dev)) { -		if (!switchdev_lower_dev_find(dev, check_cb, foreign_dev_check_cb)) -			return 0; - -		/* This is a bridge interface that we offload */ -		netdev_for_each_lower_dev(dev, lower_dev, iter) { -			/* Do not propagate FDB entries across bridges */ -			if (netif_is_bridge_master(lower_dev)) -				continue; - -			/* Bridge ports might be either us, or LAG interfaces -			 * that we offload. -			 */ -			if (!check_cb(lower_dev) && -			    !switchdev_lower_dev_find(lower_dev, check_cb, -						      foreign_dev_check_cb)) -				continue; - -			err = __switchdev_handle_fdb_del_to_device(lower_dev, orig_dev, -								   fdb_info, check_cb, -								   foreign_dev_check_cb, -								   del_cb, lag_del_cb); -			if (err && err != -EOPNOTSUPP) -				return err; -		} - -		return 0; -	} - -maybe_bridged_with_us: -	/* Event is neither on a bridge nor a LAG. Check whether it is on an -	 * interface that is in a bridge with us. -	 */ -	br = netdev_master_upper_dev_get_rcu(dev); -	if (!br || !netif_is_bridge_master(br)) -		return 0; - -	if (!switchdev_lower_dev_find(br, check_cb, foreign_dev_check_cb)) -		return 0; - -	return __switchdev_handle_fdb_del_to_device(br, orig_dev, fdb_info, -						    check_cb, foreign_dev_check_cb, -						    del_cb, lag_del_cb); -} - -int switchdev_handle_fdb_del_to_device(struct net_device *dev, -		const struct switchdev_notifier_fdb_info *fdb_info, -		bool (*check_cb)(const struct net_device *dev), -		bool (*foreign_dev_check_cb)(const struct net_device *dev, -					     const struct net_device *foreign_dev), -		int (*del_cb)(struct net_device *dev, -			      const struct net_device *orig_dev, const void *ctx, -			      const struct switchdev_notifier_fdb_info *fdb_info), -		int (*lag_del_cb)(struct net_device *dev, -				  const struct net_device *orig_dev, const void *ctx, -				  const struct switchdev_notifier_fdb_info *fdb_info)) -{ -	int err; - -	err = __switchdev_handle_fdb_del_to_device(dev, dev, fdb_info, -						   check_cb, -						   foreign_dev_check_cb, -						   del_cb, lag_del_cb); -	if (err == -EOPNOTSUPP) -		err = 0; - -	return err; -} -EXPORT_SYMBOL_GPL(switchdev_handle_fdb_del_to_device); +EXPORT_SYMBOL_GPL(switchdev_handle_fdb_event_to_device);  static int __switchdev_handle_port_obj_add(struct net_device *dev,  			struct switchdev_notifier_port_obj_info *port_obj_info, |