mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Including fix from Andrii for the issue mentioned in our net-next PR,
the rest is unremarkable.
 
 Current release - regressions:
 
  - virtio_net: fix missed error path rtnl_unlock after control queue
    locking rework
 
 Current release - new code bugs:
 
  - bpf: fix KASAN slab-out-of-bounds in percpu_array_map_gen_lookup,
    caused by missing nested map handling
 
  - drv: dsa: correct initialization order for KSZ88x3 ports
 
 Previous releases - regressions:
 
  - af_packet: do not call packet_read_pending() from tpacket_destruct_skb()
    fix performance regression
 
  - ipv6: fix route deleting failure when metric equals 0, don't assume
    0 means not set / default in this case
 
 Previous releases - always broken:
 
  - bridge: couple of syzbot-driven fixes
 
 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE6jPA+I1ugmIBA4hXMUZtbf5SIrsFAmZHtJQACgkQMUZtbf5S
 Irsfyw//ZhCFzvXKLENNalHHMXwq7DsuXe6KWlljEOzLHH0/9QqqNC9ggYKRI5OE
 unB//YC3sqtAUczQnED+UOh553Pu4Kvq9334LTX5m4HJQTYLLq1aGM/UZplsBTHx
 3MsXUApYFth8pqCZvIcKOZcOddeViBfzEQ9jEAsgIyaqFy3XaiH4Zf6pJAAMyUbE
 19CRiK/1TYNrX01XPOeV/9vYGj9rzepo6S5zpHKsWsFZArCcRPBsea/KWYYfLjW7
 ExA2Cb+eUnPkNL4bTeH6dwgQGVL8Jo/OsKmsa/tdQffnj1pshdePXtP3TBEynMJF
 jSSwwUMq56yE+uok4karE3wIhciUEYvTwfgt5FErYVqfqDiX1+7AZGtdZVDX/mgH
 F0etKHDhX9F1zxHVMFwOMA4rLN6cvfpe7Pg+dt4B9E0o18SyNekOM1Ngdu/1ALtd
 QV41JFHweHInDRrMLdj4aWW4EYPR5SUuvg66Pec4T7x5hAAapzIJySS+RIydC+ND
 guPztYxO5cn5Q7kug1FyUBSXUXZxuCNRACb6zD4/4wbVRZhz7l3OTcd13QADCiwv
 Tr61r2bS1Bp/HZ3iIHBY85JnKMvpdwNXN2SPsYQQwVrv9FLj9iskH9kjwqVDG4ja
 W3ivZZM+CcZbnB81JynK7Ge54PT+SiPy3Nw4RIVxFl1QlzXC21E=
 =7eys
 -----END PGP SIGNATURE-----
Merge tag 'net-6.10-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
 "Current release - regressions:
   - virtio_net: fix missed error path rtnl_unlock after control queue
     locking rework
  Current release - new code bugs:
   - bpf: fix KASAN slab-out-of-bounds in percpu_array_map_gen_lookup,
     caused by missing nested map handling
   - drv: dsa: correct initialization order for KSZ88x3 ports
  Previous releases - regressions:
   - af_packet: do not call packet_read_pending() from
     tpacket_destruct_skb() fix performance regression
   - ipv6: fix route deleting failure when metric equals 0, don't assume
     0 means not set / default in this case
  Previous releases - always broken:
   - bridge: couple of syzbot-driven fixes"
* tag 'net-6.10-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (30 commits)
  selftests: net: local_termination: annotate the expected failures
  net: dsa: microchip: Correct initialization order for KSZ88x3 ports
  MAINTAINERS: net: Update reviewers for TI's Ethernet drivers
  dt-bindings: net: ti: Update maintainers list
  l2tp: fix ICMP error handling for UDP-encap sockets
  net: txgbe: fix to control VLAN strip
  net: wangxun: match VLAN CTAG and STAG features
  net: wangxun: fix to change Rx features
  af_packet: do not call packet_read_pending() from tpacket_destruct_skb()
  virtio_net: Fix missed rtnl_unlock
  netrom: fix possible dead-lock in nr_rt_ioctl()
  idpf: don't skip over ethtool tcp-data-split setting
  dt-bindings: net: qcom: ethernet: Allow dma-coherent
  bonding: fix oops during rmmod
  net/ipv6: Fix route deleting failure when metric equals 0
  selftests/net: reduce xfrm_policy test time
  selftests/bpf: Adjust btf_dump test to reflect recent change in file_operations
  selftests/bpf: Adjust test_access_variable_array after a kernel function name change
  selftests/net/lib: no need to record ns name if it already exist
  net: qrtr: ns: Fix module refcnt
  ...
			
			
This commit is contained in:
		
						commit
						f08a1e912d
					
				
					 39 changed files with 304 additions and 110 deletions
				
			
		| 
						 | 
				
			
			@ -301,8 +301,9 @@ Arithmetic instructions
 | 
			
		|||
``ALU`` uses 32-bit wide operands while ``ALU64`` uses 64-bit wide operands for
 | 
			
		||||
otherwise identical operations. ``ALU64`` instructions belong to the
 | 
			
		||||
base64 conformance group unless noted otherwise.
 | 
			
		||||
The 'code' field encodes the operation as below, where 'src' and 'dst' refer
 | 
			
		||||
to the values of the source and destination registers, respectively.
 | 
			
		||||
The 'code' field encodes the operation as below, where 'src' refers to the
 | 
			
		||||
the source operand and 'dst' refers to the value of the destination
 | 
			
		||||
register.
 | 
			
		||||
 | 
			
		||||
=====  =====  =======  ==========================================================
 | 
			
		||||
name   code   offset   description
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,6 +61,8 @@ properties:
 | 
			
		|||
  iommus:
 | 
			
		||||
    maxItems: 1
 | 
			
		||||
 | 
			
		||||
  dma-coherent: true
 | 
			
		||||
 | 
			
		||||
  phys: true
 | 
			
		||||
 | 
			
		||||
  phy-names:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,6 @@ title: TI SoC Ethernet Switch Controller (CPSW)
 | 
			
		|||
 | 
			
		||||
maintainers:
 | 
			
		||||
  - Siddharth Vadapalli <s-vadapalli@ti.com>
 | 
			
		||||
  - Ravi Gunasekaran <r-gunasekaran@ti.com>
 | 
			
		||||
  - Roger Quadros <rogerq@kernel.org>
 | 
			
		||||
 | 
			
		||||
description:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,6 @@ title: The TI AM654x/J721E/AM642x SoC Gigabit Ethernet MAC (Media Access Control
 | 
			
		|||
 | 
			
		||||
maintainers:
 | 
			
		||||
  - Siddharth Vadapalli <s-vadapalli@ti.com>
 | 
			
		||||
  - Ravi Gunasekaran <r-gunasekaran@ti.com>
 | 
			
		||||
  - Roger Quadros <rogerq@kernel.org>
 | 
			
		||||
 | 
			
		||||
description:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,6 @@ title: The TI AM654x/J721E Common Platform Time Sync (CPTS) module
 | 
			
		|||
 | 
			
		||||
maintainers:
 | 
			
		||||
  - Siddharth Vadapalli <s-vadapalli@ti.com>
 | 
			
		||||
  - Ravi Gunasekaran <r-gunasekaran@ti.com>
 | 
			
		||||
  - Roger Quadros <rogerq@kernel.org>
 | 
			
		||||
 | 
			
		||||
description: |+
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3815,7 +3815,7 @@ F:	arch/arm/net/
 | 
			
		|||
BPF JIT for ARM64
 | 
			
		||||
M:	Daniel Borkmann <daniel@iogearbox.net>
 | 
			
		||||
M:	Alexei Starovoitov <ast@kernel.org>
 | 
			
		||||
M:	Zi Shen Lim <zlim.lnx@gmail.com>
 | 
			
		||||
M:	Puranjay Mohan <puranjay@kernel.org>
 | 
			
		||||
L:	bpf@vger.kernel.org
 | 
			
		||||
S:	Supported
 | 
			
		||||
F:	arch/arm64/net/
 | 
			
		||||
| 
						 | 
				
			
			@ -22392,7 +22392,6 @@ F:	drivers/counter/ti-eqep.c
 | 
			
		|||
 | 
			
		||||
TI ETHERNET SWITCH DRIVER (CPSW)
 | 
			
		||||
R:	Siddharth Vadapalli <s-vadapalli@ti.com>
 | 
			
		||||
R:	Ravi Gunasekaran <r-gunasekaran@ti.com>
 | 
			
		||||
R:	Roger Quadros <rogerq@kernel.org>
 | 
			
		||||
L:	linux-omap@vger.kernel.org
 | 
			
		||||
L:	netdev@vger.kernel.org
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6477,16 +6477,16 @@ static int __init bonding_init(void)
 | 
			
		|||
	if (res)
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	bond_create_debugfs();
 | 
			
		||||
 | 
			
		||||
	res = register_pernet_subsys(&bond_net_ops);
 | 
			
		||||
	if (res)
 | 
			
		||||
		goto out;
 | 
			
		||||
		goto err_net_ops;
 | 
			
		||||
 | 
			
		||||
	res = bond_netlink_init();
 | 
			
		||||
	if (res)
 | 
			
		||||
		goto err_link;
 | 
			
		||||
 | 
			
		||||
	bond_create_debugfs();
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < max_bonds; i++) {
 | 
			
		||||
		res = bond_create(&init_net, NULL);
 | 
			
		||||
		if (res)
 | 
			
		||||
| 
						 | 
				
			
			@ -6501,10 +6501,11 @@ static int __init bonding_init(void)
 | 
			
		|||
out:
 | 
			
		||||
	return res;
 | 
			
		||||
err:
 | 
			
		||||
	bond_destroy_debugfs();
 | 
			
		||||
	bond_netlink_fini();
 | 
			
		||||
err_link:
 | 
			
		||||
	unregister_pernet_subsys(&bond_net_ops);
 | 
			
		||||
err_net_ops:
 | 
			
		||||
	bond_destroy_debugfs();
 | 
			
		||||
	goto out;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -6513,11 +6514,11 @@ static void __exit bonding_exit(void)
 | 
			
		|||
{
 | 
			
		||||
	unregister_netdevice_notifier(&bond_netdev_notifier);
 | 
			
		||||
 | 
			
		||||
	bond_destroy_debugfs();
 | 
			
		||||
 | 
			
		||||
	bond_netlink_fini();
 | 
			
		||||
	unregister_pernet_subsys(&bond_net_ops);
 | 
			
		||||
 | 
			
		||||
	bond_destroy_debugfs();
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_NET_POLL_CONTROLLER
 | 
			
		||||
	/* Make sure we don't have an imbalance on our netpoll blocking */
 | 
			
		||||
	WARN_ON(atomic_read(&netpoll_block_tx));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -805,5 +805,15 @@ int ksz_dcb_init(struct ksz_device *dev)
 | 
			
		|||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	/* Enable 802.1p priority control on Port 2 during switch initialization.
 | 
			
		||||
	 * This setup is critical for the apptrust functionality on Port 1, which
 | 
			
		||||
	 * relies on the priority settings of Port 2. Note: Port 1 is naturally
 | 
			
		||||
	 * configured before Port 2, necessitating this configuration order.
 | 
			
		||||
	 */
 | 
			
		||||
	if (ksz_is_ksz88x3(dev))
 | 
			
		||||
		return ksz_prmw8(dev, KSZ_PORT_2, KSZ8_REG_PORT_1_CTRL_0,
 | 
			
		||||
				 KSZ8_PORT_802_1P_ENABLE,
 | 
			
		||||
				 KSZ8_PORT_802_1P_ENABLE);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -376,7 +376,8 @@ static int idpf_set_ringparam(struct net_device *netdev,
 | 
			
		|||
			    new_tx_count);
 | 
			
		||||
 | 
			
		||||
	if (new_tx_count == vport->txq_desc_count &&
 | 
			
		||||
	    new_rx_count == vport->rxq_desc_count)
 | 
			
		||||
	    new_rx_count == vport->rxq_desc_count &&
 | 
			
		||||
	    kring->tcp_data_split == idpf_vport_get_hsplit(vport))
 | 
			
		||||
		goto unlock_mutex;
 | 
			
		||||
 | 
			
		||||
	if (!idpf_vport_set_hsplit(vport, kring->tcp_data_split)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -328,7 +328,6 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
 | 
			
		|||
{
 | 
			
		||||
	struct ks8851_net *ks = _ks;
 | 
			
		||||
	struct sk_buff_head rxq;
 | 
			
		||||
	unsigned handled = 0;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	unsigned int status;
 | 
			
		||||
	struct sk_buff *skb;
 | 
			
		||||
| 
						 | 
				
			
			@ -336,24 +335,17 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
 | 
			
		|||
	ks8851_lock(ks, &flags);
 | 
			
		||||
 | 
			
		||||
	status = ks8851_rdreg16(ks, KS_ISR);
 | 
			
		||||
	ks8851_wrreg16(ks, KS_ISR, status);
 | 
			
		||||
 | 
			
		||||
	netif_dbg(ks, intr, ks->netdev,
 | 
			
		||||
		  "%s: status 0x%04x\n", __func__, status);
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_LCI)
 | 
			
		||||
		handled |= IRQ_LCI;
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_LDI) {
 | 
			
		||||
		u16 pmecr = ks8851_rdreg16(ks, KS_PMECR);
 | 
			
		||||
		pmecr &= ~PMECR_WKEVT_MASK;
 | 
			
		||||
		ks8851_wrreg16(ks, KS_PMECR, pmecr | PMECR_WKEVT_LINK);
 | 
			
		||||
 | 
			
		||||
		handled |= IRQ_LDI;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_RXPSI)
 | 
			
		||||
		handled |= IRQ_RXPSI;
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_TXI) {
 | 
			
		||||
		unsigned short tx_space = ks8851_rdreg16(ks, KS_TXMIR);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -365,20 +357,12 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
 | 
			
		|||
		if (netif_queue_stopped(ks->netdev))
 | 
			
		||||
			netif_wake_queue(ks->netdev);
 | 
			
		||||
		spin_unlock(&ks->statelock);
 | 
			
		||||
 | 
			
		||||
		handled |= IRQ_TXI;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_RXI)
 | 
			
		||||
		handled |= IRQ_RXI;
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_SPIBEI) {
 | 
			
		||||
		netdev_err(ks->netdev, "%s: spi bus error\n", __func__);
 | 
			
		||||
		handled |= IRQ_SPIBEI;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ks8851_wrreg16(ks, KS_ISR, handled);
 | 
			
		||||
 | 
			
		||||
	if (status & IRQ_RXI) {
 | 
			
		||||
		/* the datasheet says to disable the rx interrupt during
 | 
			
		||||
		 * packet read-out, however we're masking the interrupt
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1087,8 +1087,6 @@ static int lan966x_probe(struct platform_device *pdev)
 | 
			
		|||
	platform_set_drvdata(pdev, lan966x);
 | 
			
		||||
	lan966x->dev = &pdev->dev;
 | 
			
		||||
 | 
			
		||||
	lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
 | 
			
		||||
 | 
			
		||||
	if (!device_get_mac_address(&pdev->dev, mac_addr)) {
 | 
			
		||||
		ether_addr_copy(lan966x->base_mac, mac_addr);
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -1179,6 +1177,8 @@ static int lan966x_probe(struct platform_device *pdev)
 | 
			
		|||
		return dev_err_probe(&pdev->dev, -ENODEV,
 | 
			
		||||
				     "no ethernet-ports child found\n");
 | 
			
		||||
 | 
			
		||||
	lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
 | 
			
		||||
 | 
			
		||||
	/* init switch */
 | 
			
		||||
	lan966x_init(lan966x);
 | 
			
		||||
	lan966x_stats_init(lan966x);
 | 
			
		||||
| 
						 | 
				
			
			@ -1257,6 +1257,8 @@ static int lan966x_probe(struct platform_device *pdev)
 | 
			
		|||
	destroy_workqueue(lan966x->stats_queue);
 | 
			
		||||
	mutex_destroy(&lan966x->stats_lock);
 | 
			
		||||
 | 
			
		||||
	debugfs_remove_recursive(lan966x->debugfs_root);
 | 
			
		||||
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1958,6 +1958,8 @@ int wx_sw_init(struct wx *wx)
 | 
			
		|||
		return -ENOMEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bitmap_zero(wx->state, WX_STATE_NBITS);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(wx_sw_init);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2690,15 +2690,63 @@ int wx_set_features(struct net_device *netdev, netdev_features_t features)
 | 
			
		|||
		wx->rss_enabled = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (changed &
 | 
			
		||||
	    (NETIF_F_HW_VLAN_CTAG_RX |
 | 
			
		||||
	     NETIF_F_HW_VLAN_STAG_RX))
 | 
			
		||||
	netdev->features = features;
 | 
			
		||||
 | 
			
		||||
	if (wx->mac.type == wx_mac_sp && changed & NETIF_F_HW_VLAN_CTAG_RX)
 | 
			
		||||
		wx->do_reset(netdev);
 | 
			
		||||
	else if (changed & (NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_FILTER))
 | 
			
		||||
		wx_set_rx_mode(netdev);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(wx_set_features);
 | 
			
		||||
 | 
			
		||||
#define NETIF_VLAN_STRIPPING_FEATURES	(NETIF_F_HW_VLAN_CTAG_RX | \
 | 
			
		||||
					 NETIF_F_HW_VLAN_STAG_RX)
 | 
			
		||||
 | 
			
		||||
#define NETIF_VLAN_INSERTION_FEATURES	(NETIF_F_HW_VLAN_CTAG_TX | \
 | 
			
		||||
					 NETIF_F_HW_VLAN_STAG_TX)
 | 
			
		||||
 | 
			
		||||
#define NETIF_VLAN_FILTERING_FEATURES	(NETIF_F_HW_VLAN_CTAG_FILTER | \
 | 
			
		||||
					 NETIF_F_HW_VLAN_STAG_FILTER)
 | 
			
		||||
 | 
			
		||||
netdev_features_t wx_fix_features(struct net_device *netdev,
 | 
			
		||||
				  netdev_features_t features)
 | 
			
		||||
{
 | 
			
		||||
	netdev_features_t changed = netdev->features ^ features;
 | 
			
		||||
	struct wx *wx = netdev_priv(netdev);
 | 
			
		||||
 | 
			
		||||
	if (changed & NETIF_VLAN_STRIPPING_FEATURES) {
 | 
			
		||||
		if ((features & NETIF_VLAN_STRIPPING_FEATURES) != NETIF_VLAN_STRIPPING_FEATURES &&
 | 
			
		||||
		    (features & NETIF_VLAN_STRIPPING_FEATURES) != 0) {
 | 
			
		||||
			features &= ~NETIF_VLAN_STRIPPING_FEATURES;
 | 
			
		||||
			features |= netdev->features & NETIF_VLAN_STRIPPING_FEATURES;
 | 
			
		||||
			wx_err(wx, "802.1Q and 802.1ad VLAN stripping must be either both on or both off.");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (changed & NETIF_VLAN_INSERTION_FEATURES) {
 | 
			
		||||
		if ((features & NETIF_VLAN_INSERTION_FEATURES) != NETIF_VLAN_INSERTION_FEATURES &&
 | 
			
		||||
		    (features & NETIF_VLAN_INSERTION_FEATURES) != 0) {
 | 
			
		||||
			features &= ~NETIF_VLAN_INSERTION_FEATURES;
 | 
			
		||||
			features |= netdev->features & NETIF_VLAN_INSERTION_FEATURES;
 | 
			
		||||
			wx_err(wx, "802.1Q and 802.1ad VLAN insertion must be either both on or both off.");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (changed & NETIF_VLAN_FILTERING_FEATURES) {
 | 
			
		||||
		if ((features & NETIF_VLAN_FILTERING_FEATURES) != NETIF_VLAN_FILTERING_FEATURES &&
 | 
			
		||||
		    (features & NETIF_VLAN_FILTERING_FEATURES) != 0) {
 | 
			
		||||
			features &= ~NETIF_VLAN_FILTERING_FEATURES;
 | 
			
		||||
			features |= netdev->features & NETIF_VLAN_FILTERING_FEATURES;
 | 
			
		||||
			wx_err(wx, "802.1Q and 802.1ad VLAN filtering must be either both on or both off.");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return features;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(wx_fix_features);
 | 
			
		||||
 | 
			
		||||
void wx_set_ring(struct wx *wx, u32 new_tx_count,
 | 
			
		||||
		 u32 new_rx_count, struct wx_ring *temp_ring)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,8 @@ int wx_setup_resources(struct wx *wx);
 | 
			
		|||
void wx_get_stats64(struct net_device *netdev,
 | 
			
		||||
		    struct rtnl_link_stats64 *stats);
 | 
			
		||||
int wx_set_features(struct net_device *netdev, netdev_features_t features);
 | 
			
		||||
netdev_features_t wx_fix_features(struct net_device *netdev,
 | 
			
		||||
				  netdev_features_t features);
 | 
			
		||||
void wx_set_ring(struct wx *wx, u32 new_tx_count,
 | 
			
		||||
		 u32 new_rx_count, struct wx_ring *temp_ring);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -982,8 +982,13 @@ struct wx_hw_stats {
 | 
			
		|||
	u64 qmprc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum wx_state {
 | 
			
		||||
	WX_STATE_RESETTING,
 | 
			
		||||
	WX_STATE_NBITS,		/* must be last */
 | 
			
		||||
};
 | 
			
		||||
struct wx {
 | 
			
		||||
	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
 | 
			
		||||
	DECLARE_BITMAP(state, WX_STATE_NBITS);
 | 
			
		||||
 | 
			
		||||
	void *priv;
 | 
			
		||||
	u8 __iomem *hw_addr;
 | 
			
		||||
| 
						 | 
				
			
			@ -1071,6 +1076,8 @@ struct wx {
 | 
			
		|||
	u64 hw_csum_rx_good;
 | 
			
		||||
	u64 hw_csum_rx_error;
 | 
			
		||||
	u64 alloc_rx_buff_failed;
 | 
			
		||||
 | 
			
		||||
	void (*do_reset)(struct net_device *netdev);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define WX_INTR_ALL (~0ULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -1131,4 +1138,19 @@ static inline struct wx *phylink_to_wx(struct phylink_config *config)
 | 
			
		|||
	return container_of(config, struct wx, phylink_config);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int wx_set_state_reset(struct wx *wx)
 | 
			
		||||
{
 | 
			
		||||
	u8 timeout = 50;
 | 
			
		||||
 | 
			
		||||
	while (test_and_set_bit(WX_STATE_RESETTING, wx->state)) {
 | 
			
		||||
		timeout--;
 | 
			
		||||
		if (!timeout)
 | 
			
		||||
			return -EBUSY;
 | 
			
		||||
 | 
			
		||||
		usleep_range(1000, 2000);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* _WX_TYPE_H_ */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ static int ngbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
	struct wx *wx = netdev_priv(netdev);
 | 
			
		||||
	u32 new_rx_count, new_tx_count;
 | 
			
		||||
	struct wx_ring *temp_ring;
 | 
			
		||||
	int i;
 | 
			
		||||
	int i, err = 0;
 | 
			
		||||
 | 
			
		||||
	new_tx_count = clamp_t(u32, ring->tx_pending, WX_MIN_TXD, WX_MAX_TXD);
 | 
			
		||||
	new_tx_count = ALIGN(new_tx_count, WX_REQ_TX_DESCRIPTOR_MULTIPLE);
 | 
			
		||||
| 
						 | 
				
			
			@ -64,6 +64,10 @@ static int ngbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
	    new_rx_count == wx->rx_ring_count)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	err = wx_set_state_reset(wx);
 | 
			
		||||
	if (err)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
	if (!netif_running(wx->netdev)) {
 | 
			
		||||
		for (i = 0; i < wx->num_tx_queues; i++)
 | 
			
		||||
			wx->tx_ring[i]->count = new_tx_count;
 | 
			
		||||
| 
						 | 
				
			
			@ -72,14 +76,16 @@ static int ngbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
		wx->tx_ring_count = new_tx_count;
 | 
			
		||||
		wx->rx_ring_count = new_rx_count;
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
		goto clear_reset;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* allocate temporary buffer to store rings in */
 | 
			
		||||
	i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
 | 
			
		||||
	temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
 | 
			
		||||
	if (!temp_ring)
 | 
			
		||||
		return -ENOMEM;
 | 
			
		||||
	if (!temp_ring) {
 | 
			
		||||
		err = -ENOMEM;
 | 
			
		||||
		goto clear_reset;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ngbe_down(wx);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +95,9 @@ static int ngbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
	wx_configure(wx);
 | 
			
		||||
	ngbe_up(wx);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
clear_reset:
 | 
			
		||||
	clear_bit(WX_STATE_RESETTING, wx->state);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ngbe_set_channels(struct net_device *dev,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -499,6 +499,7 @@ static const struct net_device_ops ngbe_netdev_ops = {
 | 
			
		|||
	.ndo_start_xmit         = wx_xmit_frame,
 | 
			
		||||
	.ndo_set_rx_mode        = wx_set_rx_mode,
 | 
			
		||||
	.ndo_set_features       = wx_set_features,
 | 
			
		||||
	.ndo_fix_features       = wx_fix_features,
 | 
			
		||||
	.ndo_validate_addr      = eth_validate_addr,
 | 
			
		||||
	.ndo_set_mac_address    = wx_set_mac,
 | 
			
		||||
	.ndo_get_stats64        = wx_get_stats64,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ static int txgbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
	struct wx *wx = netdev_priv(netdev);
 | 
			
		||||
	u32 new_rx_count, new_tx_count;
 | 
			
		||||
	struct wx_ring *temp_ring;
 | 
			
		||||
	int i;
 | 
			
		||||
	int i, err = 0;
 | 
			
		||||
 | 
			
		||||
	new_tx_count = clamp_t(u32, ring->tx_pending, WX_MIN_TXD, WX_MAX_TXD);
 | 
			
		||||
	new_tx_count = ALIGN(new_tx_count, WX_REQ_TX_DESCRIPTOR_MULTIPLE);
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +31,10 @@ static int txgbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
	    new_rx_count == wx->rx_ring_count)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	err = wx_set_state_reset(wx);
 | 
			
		||||
	if (err)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
	if (!netif_running(wx->netdev)) {
 | 
			
		||||
		for (i = 0; i < wx->num_tx_queues; i++)
 | 
			
		||||
			wx->tx_ring[i]->count = new_tx_count;
 | 
			
		||||
| 
						 | 
				
			
			@ -39,14 +43,16 @@ static int txgbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
		wx->tx_ring_count = new_tx_count;
 | 
			
		||||
		wx->rx_ring_count = new_rx_count;
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
		goto clear_reset;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* allocate temporary buffer to store rings in */
 | 
			
		||||
	i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
 | 
			
		||||
	temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
 | 
			
		||||
	if (!temp_ring)
 | 
			
		||||
		return -ENOMEM;
 | 
			
		||||
	if (!temp_ring) {
 | 
			
		||||
		err = -ENOMEM;
 | 
			
		||||
		goto clear_reset;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	txgbe_down(wx);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +61,9 @@ static int txgbe_set_ringparam(struct net_device *netdev,
 | 
			
		|||
 | 
			
		||||
	txgbe_up(wx);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
clear_reset:
 | 
			
		||||
	clear_bit(WX_STATE_RESETTING, wx->state);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int txgbe_set_channels(struct net_device *dev,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -269,6 +269,8 @@ static int txgbe_sw_init(struct wx *wx)
 | 
			
		|||
	wx->tx_work_limit = TXGBE_DEFAULT_TX_WORK;
 | 
			
		||||
	wx->rx_work_limit = TXGBE_DEFAULT_RX_WORK;
 | 
			
		||||
 | 
			
		||||
	wx->do_reset = txgbe_do_reset;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -421,6 +423,34 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void txgbe_reinit_locked(struct wx *wx)
 | 
			
		||||
{
 | 
			
		||||
	int err = 0;
 | 
			
		||||
 | 
			
		||||
	netif_trans_update(wx->netdev);
 | 
			
		||||
 | 
			
		||||
	err = wx_set_state_reset(wx);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		wx_err(wx, "wait device reset timeout\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	txgbe_down(wx);
 | 
			
		||||
	txgbe_up(wx);
 | 
			
		||||
 | 
			
		||||
	clear_bit(WX_STATE_RESETTING, wx->state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void txgbe_do_reset(struct net_device *netdev)
 | 
			
		||||
{
 | 
			
		||||
	struct wx *wx = netdev_priv(netdev);
 | 
			
		||||
 | 
			
		||||
	if (netif_running(netdev))
 | 
			
		||||
		txgbe_reinit_locked(wx);
 | 
			
		||||
	else
 | 
			
		||||
		txgbe_reset(wx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct net_device_ops txgbe_netdev_ops = {
 | 
			
		||||
	.ndo_open               = txgbe_open,
 | 
			
		||||
	.ndo_stop               = txgbe_close,
 | 
			
		||||
| 
						 | 
				
			
			@ -428,6 +458,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
 | 
			
		|||
	.ndo_start_xmit         = wx_xmit_frame,
 | 
			
		||||
	.ndo_set_rx_mode        = wx_set_rx_mode,
 | 
			
		||||
	.ndo_set_features       = wx_set_features,
 | 
			
		||||
	.ndo_fix_features       = wx_fix_features,
 | 
			
		||||
	.ndo_validate_addr      = eth_validate_addr,
 | 
			
		||||
	.ndo_set_mac_address    = wx_set_mac,
 | 
			
		||||
	.ndo_get_stats64        = wx_get_stats64,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -134,6 +134,7 @@ extern char txgbe_driver_name[];
 | 
			
		|||
void txgbe_down(struct wx *wx);
 | 
			
		||||
void txgbe_up(struct wx *wx);
 | 
			
		||||
int txgbe_setup_tc(struct net_device *dev, u8 tc);
 | 
			
		||||
void txgbe_do_reset(struct net_device *netdev);
 | 
			
		||||
 | 
			
		||||
#define NODE_PROP(_NAME, _PROP)			\
 | 
			
		||||
	(const struct software_node) {		\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2902,14 +2902,14 @@ static void virtnet_rx_mode_work(struct work_struct *work)
 | 
			
		|||
	if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	rtnl_lock();
 | 
			
		||||
 | 
			
		||||
	promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_ATOMIC);
 | 
			
		||||
	promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_KERNEL);
 | 
			
		||||
	if (!promisc_allmulti) {
 | 
			
		||||
		dev_warn(&dev->dev, "Failed to set RX mode, no memory.\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rtnl_lock();
 | 
			
		||||
 | 
			
		||||
	*promisc_allmulti = !!(dev->flags & IFF_PROMISC);
 | 
			
		||||
	sg_init_one(sg, promisc_allmulti, sizeof(*promisc_allmulti));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ struct bpf_map *bpf_map_meta_alloc(int inner_map_ufd)
 | 
			
		|||
 | 
			
		||||
	inner_map_meta_size = sizeof(*inner_map_meta);
 | 
			
		||||
	/* In some cases verifier needs to access beyond just base map. */
 | 
			
		||||
	if (inner_map->ops == &array_map_ops)
 | 
			
		||||
	if (inner_map->ops == &array_map_ops || inner_map->ops == &percpu_array_map_ops)
 | 
			
		||||
		inner_map_meta_size = sizeof(struct bpf_array);
 | 
			
		||||
 | 
			
		||||
	inner_map_meta = kzalloc(inner_map_meta_size, GFP_USER);
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ struct bpf_map *bpf_map_meta_alloc(int inner_map_ufd)
 | 
			
		|||
 | 
			
		||||
	/* Misc members not needed in bpf_map_meta_equal() check. */
 | 
			
		||||
	inner_map_meta->ops = inner_map->ops;
 | 
			
		||||
	if (inner_map->ops == &array_map_ops) {
 | 
			
		||||
	if (inner_map->ops == &array_map_ops || inner_map->ops == &percpu_array_map_ops) {
 | 
			
		||||
		struct bpf_array *inner_array_meta =
 | 
			
		||||
			container_of(inner_map_meta, struct bpf_array, map);
 | 
			
		||||
		struct bpf_array *inner_array = container_of(inner_map, struct bpf_array, map);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ EXPORT_SYMBOL_GPL(nf_br_ops);
 | 
			
		|||
/* net device transmit always called with BH disabled */
 | 
			
		||||
netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	enum skb_drop_reason reason = pskb_may_pull_reason(skb, ETH_HLEN);
 | 
			
		||||
	struct net_bridge_mcast_port *pmctx_null = NULL;
 | 
			
		||||
	struct net_bridge *br = netdev_priv(dev);
 | 
			
		||||
	struct net_bridge_mcast *brmctx = &br->multicast_ctx;
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +39,11 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 | 
			
		|||
	const unsigned char *dest;
 | 
			
		||||
	u16 vid = 0;
 | 
			
		||||
 | 
			
		||||
	if (unlikely(reason != SKB_NOT_DROPPED_YET)) {
 | 
			
		||||
		kfree_skb_reason(skb, reason);
 | 
			
		||||
		return NETDEV_TX_OK;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	memset(skb->cb, 0, sizeof(struct br_input_skb_cb));
 | 
			
		||||
	br_tc_skb_miss_set(skb, false);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ static void br_mst_vlan_set_state(struct net_bridge_port *p, struct net_bridge_v
 | 
			
		|||
{
 | 
			
		||||
	struct net_bridge_vlan_group *vg = nbp_vlan_group(p);
 | 
			
		||||
 | 
			
		||||
	if (v->state == state)
 | 
			
		||||
	if (br_vlan_get_state(v) == state)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	br_vlan_set_state(v, state);
 | 
			
		||||
| 
						 | 
				
			
			@ -100,11 +100,12 @@ int br_mst_set_state(struct net_bridge_port *p, u16 msti, u8 state,
 | 
			
		|||
	};
 | 
			
		||||
	struct net_bridge_vlan_group *vg;
 | 
			
		||||
	struct net_bridge_vlan *v;
 | 
			
		||||
	int err;
 | 
			
		||||
	int err = 0;
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
	vg = nbp_vlan_group(p);
 | 
			
		||||
	if (!vg)
 | 
			
		||||
		return 0;
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	/* MSTI 0 (CST) state changes are notified via the regular
 | 
			
		||||
	 * SWITCHDEV_ATTR_ID_PORT_STP_STATE.
 | 
			
		||||
| 
						 | 
				
			
			@ -112,17 +113,20 @@ int br_mst_set_state(struct net_bridge_port *p, u16 msti, u8 state,
 | 
			
		|||
	if (msti) {
 | 
			
		||||
		err = switchdev_port_attr_set(p->dev, &attr, extack);
 | 
			
		||||
		if (err && err != -EOPNOTSUPP)
 | 
			
		||||
			return err;
 | 
			
		||||
			goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(v, &vg->vlan_list, vlist) {
 | 
			
		||||
	err = 0;
 | 
			
		||||
	list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
 | 
			
		||||
		if (v->brvlan->msti != msti)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		br_mst_vlan_set_state(p, v, state);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void br_mst_vlan_sync_state(struct net_bridge_vlan *pv, u16 msti)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4445,7 +4445,7 @@ static void rtmsg_to_fib6_config(struct net *net,
 | 
			
		|||
		.fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
 | 
			
		||||
			 : RT6_TABLE_MAIN,
 | 
			
		||||
		.fc_ifindex = rtmsg->rtmsg_ifindex,
 | 
			
		||||
		.fc_metric = rtmsg->rtmsg_metric ? : IP6_RT_PRIO_USER,
 | 
			
		||||
		.fc_metric = rtmsg->rtmsg_metric,
 | 
			
		||||
		.fc_expires = rtmsg->rtmsg_info,
 | 
			
		||||
		.fc_dst_len = rtmsg->rtmsg_dst_len,
 | 
			
		||||
		.fc_src_len = rtmsg->rtmsg_src_len,
 | 
			
		||||
| 
						 | 
				
			
			@ -4475,6 +4475,9 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, struct in6_rtmsg *rtmsg)
 | 
			
		|||
	rtnl_lock();
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case SIOCADDRT:
 | 
			
		||||
		/* Only do the default setting of fc_metric in route adding */
 | 
			
		||||
		if (cfg.fc_metric == 0)
 | 
			
		||||
			cfg.fc_metric = IP6_RT_PRIO_USER;
 | 
			
		||||
		err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
 | 
			
		||||
		break;
 | 
			
		||||
	case SIOCDELRT:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -910,22 +910,20 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
 | 
			
		|||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* UDP encapsulation receive handler. See net/ipv4/udp.c.
 | 
			
		||||
 * Return codes:
 | 
			
		||||
 * 0 : success.
 | 
			
		||||
 * <0: error
 | 
			
		||||
 * >0: skb should be passed up to userspace as UDP.
 | 
			
		||||
/* UDP encapsulation receive and error receive handlers.
 | 
			
		||||
 * See net/ipv4/udp.c for details.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that these functions are called from inside an
 | 
			
		||||
 * RCU-protected region, but without the socket being locked.
 | 
			
		||||
 *
 | 
			
		||||
 * Hence we use rcu_dereference_sk_user_data to access the
 | 
			
		||||
 * tunnel data structure rather the usual l2tp_sk_to_tunnel
 | 
			
		||||
 * accessor function.
 | 
			
		||||
 */
 | 
			
		||||
int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 | 
			
		||||
{
 | 
			
		||||
	struct l2tp_tunnel *tunnel;
 | 
			
		||||
 | 
			
		||||
	/* Note that this is called from the encap_rcv hook inside an
 | 
			
		||||
	 * RCU-protected region, but without the socket being locked.
 | 
			
		||||
	 * Hence we use rcu_dereference_sk_user_data to access the
 | 
			
		||||
	 * tunnel data structure rather the usual l2tp_sk_to_tunnel
 | 
			
		||||
	 * accessor function.
 | 
			
		||||
	 */
 | 
			
		||||
	tunnel = rcu_dereference_sk_user_data(sk);
 | 
			
		||||
	if (!tunnel)
 | 
			
		||||
		goto pass_up;
 | 
			
		||||
| 
						 | 
				
			
			@ -942,6 +940,29 @@ int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 | 
			
		|||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(l2tp_udp_encap_recv);
 | 
			
		||||
 | 
			
		||||
static void l2tp_udp_encap_err_recv(struct sock *sk, struct sk_buff *skb, int err,
 | 
			
		||||
				    __be16 port, u32 info, u8 *payload)
 | 
			
		||||
{
 | 
			
		||||
	struct l2tp_tunnel *tunnel;
 | 
			
		||||
 | 
			
		||||
	tunnel = rcu_dereference_sk_user_data(sk);
 | 
			
		||||
	if (!tunnel || tunnel->fd < 0)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	sk->sk_err = err;
 | 
			
		||||
	sk_error_report(sk);
 | 
			
		||||
 | 
			
		||||
	if (ip_hdr(skb)->version == IPVERSION) {
 | 
			
		||||
		if (inet_test_bit(RECVERR, sk))
 | 
			
		||||
			return ip_icmp_error(sk, skb, err, port, info, payload);
 | 
			
		||||
#if IS_ENABLED(CONFIG_IPV6)
 | 
			
		||||
	} else {
 | 
			
		||||
		if (inet6_test_bit(RECVERR6, sk))
 | 
			
		||||
			return ipv6_icmp_error(sk, skb, err, port, info, payload);
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/************************************************************************
 | 
			
		||||
 * Transmit handling
 | 
			
		||||
 ***********************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -1516,6 +1537,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
 | 
			
		|||
			.sk_user_data = tunnel,
 | 
			
		||||
			.encap_type = UDP_ENCAP_L2TPINUDP,
 | 
			
		||||
			.encap_rcv = l2tp_udp_encap_recv,
 | 
			
		||||
			.encap_err_rcv = l2tp_udp_encap_err_recv,
 | 
			
		||||
			.encap_destroy = l2tp_udp_encap_destroy,
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -285,22 +285,14 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void __nr_remove_node(struct nr_node *nr_node)
 | 
			
		||||
static void nr_remove_node_locked(struct nr_node *nr_node)
 | 
			
		||||
{
 | 
			
		||||
	lockdep_assert_held(&nr_node_list_lock);
 | 
			
		||||
 | 
			
		||||
	hlist_del_init(&nr_node->node_node);
 | 
			
		||||
	nr_node_put(nr_node);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define nr_remove_node_locked(__node) \
 | 
			
		||||
	__nr_remove_node(__node)
 | 
			
		||||
 | 
			
		||||
static void nr_remove_node(struct nr_node *nr_node)
 | 
			
		||||
{
 | 
			
		||||
	spin_lock_bh(&nr_node_list_lock);
 | 
			
		||||
	__nr_remove_node(nr_node);
 | 
			
		||||
	spin_unlock_bh(&nr_node_list_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
 | 
			
		||||
{
 | 
			
		||||
	hlist_del_init(&nr_neigh->neigh_node);
 | 
			
		||||
| 
						 | 
				
			
			@ -339,6 +331,7 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
 | 
			
		|||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	spin_lock_bh(&nr_node_list_lock);
 | 
			
		||||
	nr_node_lock(nr_node);
 | 
			
		||||
	for (i = 0; i < nr_node->count; i++) {
 | 
			
		||||
		if (nr_node->routes[i].neighbour == nr_neigh) {
 | 
			
		||||
| 
						 | 
				
			
			@ -352,7 +345,7 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
 | 
			
		|||
			nr_node->count--;
 | 
			
		||||
 | 
			
		||||
			if (nr_node->count == 0) {
 | 
			
		||||
				nr_remove_node(nr_node);
 | 
			
		||||
				nr_remove_node_locked(nr_node);
 | 
			
		||||
			} else {
 | 
			
		||||
				switch (i) {
 | 
			
		||||
				case 0:
 | 
			
		||||
| 
						 | 
				
			
			@ -367,12 +360,14 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
 | 
			
		|||
				nr_node_put(nr_node);
 | 
			
		||||
			}
 | 
			
		||||
			nr_node_unlock(nr_node);
 | 
			
		||||
			spin_unlock_bh(&nr_node_list_lock);
 | 
			
		||||
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	nr_neigh_put(nr_neigh);
 | 
			
		||||
	nr_node_unlock(nr_node);
 | 
			
		||||
	spin_unlock_bh(&nr_node_list_lock);
 | 
			
		||||
	nr_node_put(nr_node);
 | 
			
		||||
 | 
			
		||||
	return -EINVAL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2522,8 +2522,7 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
 | 
			
		|||
		ts = __packet_set_timestamp(po, ph, skb);
 | 
			
		||||
		__packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts);
 | 
			
		||||
 | 
			
		||||
		if (!packet_read_pending(&po->tx_ring))
 | 
			
		||||
			complete(&po->skb_completion);
 | 
			
		||||
		complete(&po->skb_completion);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sock_wfree(skb);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -725,6 +725,24 @@ int qrtr_ns_init(void)
 | 
			
		|||
	if (ret < 0)
 | 
			
		||||
		goto err_wq;
 | 
			
		||||
 | 
			
		||||
	/* As the qrtr ns socket owner and creator is the same module, we have
 | 
			
		||||
	 * to decrease the qrtr module reference count to guarantee that it
 | 
			
		||||
	 * remains zero after the ns socket is created, otherwise, executing
 | 
			
		||||
	 * "rmmod" command is unable to make the qrtr module deleted after the
 | 
			
		||||
	 *  qrtr module is inserted successfully.
 | 
			
		||||
	 *
 | 
			
		||||
	 * However, the reference count is increased twice in
 | 
			
		||||
	 * sock_create_kern(): one is to increase the reference count of owner
 | 
			
		||||
	 * of qrtr socket's proto_ops struct; another is to increment the
 | 
			
		||||
	 * reference count of owner of qrtr proto struct. Therefore, we must
 | 
			
		||||
	 * decrement the module reference count twice to ensure that it keeps
 | 
			
		||||
	 * zero after server's listening socket is created. Of course, we
 | 
			
		||||
	 * must bump the module reference count twice as well before the socket
 | 
			
		||||
	 * is closed.
 | 
			
		||||
	 */
 | 
			
		||||
	module_put(qrtr_ns.sock->ops->owner);
 | 
			
		||||
	module_put(qrtr_ns.sock->sk->sk_prot_creator->owner);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
err_wq:
 | 
			
		||||
| 
						 | 
				
			
			@ -739,6 +757,15 @@ void qrtr_ns_remove(void)
 | 
			
		|||
{
 | 
			
		||||
	cancel_work_sync(&qrtr_ns.work);
 | 
			
		||||
	destroy_workqueue(qrtr_ns.workqueue);
 | 
			
		||||
 | 
			
		||||
	/* sock_release() expects the two references that were put during
 | 
			
		||||
	 * qrtr_ns_init(). This function is only called during module remove,
 | 
			
		||||
	 * so try_stop_module() has already set the refcnt to 0. Use
 | 
			
		||||
	 * __module_get() instead of try_module_get() to successfully take two
 | 
			
		||||
	 * references.
 | 
			
		||||
	 */
 | 
			
		||||
	__module_get(qrtr_ns.sock->ops->owner);
 | 
			
		||||
	__module_get(qrtr_ns.sock->sk->sk_prot_creator->owner);
 | 
			
		||||
	sock_release(qrtr_ns.sock);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(qrtr_ns_remove);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts)
 | 
			
		|||
 */
 | 
			
		||||
int probe_memcg_account(int token_fd)
 | 
			
		||||
{
 | 
			
		||||
	const size_t attr_sz = offsetofend(union bpf_attr, attach_btf_obj_fd);
 | 
			
		||||
	const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd);
 | 
			
		||||
	struct bpf_insn insns[] = {
 | 
			
		||||
		BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns),
 | 
			
		||||
		BPF_EXIT_INSN(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ int probe_fd(int fd)
 | 
			
		|||
 | 
			
		||||
static int probe_kern_prog_name(int token_fd)
 | 
			
		||||
{
 | 
			
		||||
	const size_t attr_sz = offsetofend(union bpf_attr, prog_name);
 | 
			
		||||
	const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd);
 | 
			
		||||
	struct bpf_insn insns[] = {
 | 
			
		||||
		BPF_MOV64_IMM(BPF_REG_0, 0),
 | 
			
		||||
		BPF_EXIT_INSN(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -653,7 +653,7 @@ static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,
 | 
			
		|||
		cmpstr =
 | 
			
		||||
"(struct file_operations){\n"
 | 
			
		||||
"	.owner = (struct module *)0xffffffffffffffff,\n"
 | 
			
		||||
"	.llseek = (loff_t (*)(struct file *, loff_t, int))0xffffffffffffffff,";
 | 
			
		||||
"	.fop_flags = (fop_flags_t)4294967295,";
 | 
			
		||||
 | 
			
		||||
		ASSERT_STRNEQ(str, cmpstr, strlen(cmpstr), "file_operations");
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -110,10 +110,14 @@ DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, array_map, array_of_array_maps);
 | 
			
		|||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, hash_map, array_of_hash_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, hash_malloc_map, array_of_hash_malloc_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, lru_hash_map, array_of_lru_hash_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, pcpu_array_map, array_of_pcpu_array_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, pcpu_hash_map, array_of_pcpu_hash_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, array_map, hash_of_array_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, hash_map, hash_of_hash_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, hash_malloc_map, hash_of_hash_malloc_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, lru_hash_map, hash_of_lru_hash_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, pcpu_array_map, hash_of_pcpu_array_maps);
 | 
			
		||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, pcpu_hash_map, hash_of_pcpu_hash_maps);
 | 
			
		||||
 | 
			
		||||
#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -204,6 +208,8 @@ int test_map_kptr(struct __sk_buff *ctx)
 | 
			
		|||
	TEST(hash_map);
 | 
			
		||||
	TEST(hash_malloc_map);
 | 
			
		||||
	TEST(lru_hash_map);
 | 
			
		||||
	TEST(pcpu_array_map);
 | 
			
		||||
	TEST(pcpu_hash_map);
 | 
			
		||||
 | 
			
		||||
#undef TEST
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -281,10 +287,14 @@ int test_map_in_map_kptr(struct __sk_buff *ctx)
 | 
			
		|||
	TEST(array_of_hash_maps);
 | 
			
		||||
	TEST(array_of_hash_malloc_maps);
 | 
			
		||||
	TEST(array_of_lru_hash_maps);
 | 
			
		||||
	TEST(array_of_pcpu_array_maps);
 | 
			
		||||
	TEST(array_of_pcpu_hash_maps);
 | 
			
		||||
	TEST(hash_of_array_maps);
 | 
			
		||||
	TEST(hash_of_hash_maps);
 | 
			
		||||
	TEST(hash_of_hash_malloc_maps);
 | 
			
		||||
	TEST(hash_of_lru_hash_maps);
 | 
			
		||||
	TEST(hash_of_pcpu_array_maps);
 | 
			
		||||
	TEST(hash_of_pcpu_hash_maps);
 | 
			
		||||
 | 
			
		||||
#undef TEST
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@
 | 
			
		|||
 | 
			
		||||
unsigned long span = 0;
 | 
			
		||||
 | 
			
		||||
SEC("fentry/load_balance")
 | 
			
		||||
SEC("fentry/sched_balance_rq")
 | 
			
		||||
int BPF_PROG(fentry_fentry, int this_cpu, struct rq *this_rq,
 | 
			
		||||
		struct sched_domain *sd)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -478,10 +478,10 @@ v3exc_timeout_test()
 | 
			
		|||
	RET=0
 | 
			
		||||
	local X=("192.0.2.20" "192.0.2.30")
 | 
			
		||||
 | 
			
		||||
	# GMI should be 3 seconds
 | 
			
		||||
	# GMI should be 5 seconds
 | 
			
		||||
	ip link set dev br0 type bridge mcast_query_interval 100 \
 | 
			
		||||
					mcast_query_response_interval 100 \
 | 
			
		||||
					mcast_membership_interval 300
 | 
			
		||||
					mcast_membership_interval 500
 | 
			
		||||
 | 
			
		||||
	v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
 | 
			
		||||
	ip link set dev br0 type bridge mcast_query_interval 500 \
 | 
			
		||||
| 
						 | 
				
			
			@ -489,7 +489,7 @@ v3exc_timeout_test()
 | 
			
		|||
					mcast_membership_interval 1500
 | 
			
		||||
 | 
			
		||||
	$MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q
 | 
			
		||||
	sleep 3
 | 
			
		||||
	sleep 5
 | 
			
		||||
	bridge -j -d -s mdb show dev br0 \
 | 
			
		||||
		| jq -e ".[].mdb[] | \
 | 
			
		||||
			 select(.grp == \"$TEST_GROUP\" and \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -478,10 +478,10 @@ mldv2exc_timeout_test()
 | 
			
		|||
	RET=0
 | 
			
		||||
	local X=("2001:db8:1::20" "2001:db8:1::30")
 | 
			
		||||
 | 
			
		||||
	# GMI should be 3 seconds
 | 
			
		||||
	# GMI should be 5 seconds
 | 
			
		||||
	ip link set dev br0 type bridge mcast_query_interval 100 \
 | 
			
		||||
					mcast_query_response_interval 100 \
 | 
			
		||||
					mcast_membership_interval 300
 | 
			
		||||
					mcast_membership_interval 500
 | 
			
		||||
 | 
			
		||||
	mldv2exclude_prepare $h1
 | 
			
		||||
	ip link set dev br0 type bridge mcast_query_interval 500 \
 | 
			
		||||
| 
						 | 
				
			
			@ -489,7 +489,7 @@ mldv2exc_timeout_test()
 | 
			
		|||
					mcast_membership_interval 1500
 | 
			
		||||
 | 
			
		||||
	$MZ $h1 -c 1 $MZPKT_ALLOW2 -q
 | 
			
		||||
	sleep 3
 | 
			
		||||
	sleep 5
 | 
			
		||||
	bridge -j -d -s mdb show dev br0 \
 | 
			
		||||
		| jq -e ".[].mdb[] | \
 | 
			
		||||
			 select(.grp == \"$TEST_GROUP\" and \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,25 +155,30 @@ run_test()
 | 
			
		|||
		"$smac > $MACVLAN_ADDR, ethertype IPv4 (0x0800)" \
 | 
			
		||||
		true
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
 | 
			
		||||
		"$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
 | 
			
		||||
		false
 | 
			
		||||
	xfail_on_veth $h1 \
 | 
			
		||||
		check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
 | 
			
		||||
			"$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
 | 
			
		||||
			false
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, promisc" \
 | 
			
		||||
		"$smac > $UNKNOWN_UC_ADDR2, ethertype IPv4 (0x0800)" \
 | 
			
		||||
		true
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, allmulti" \
 | 
			
		||||
		"$smac > $UNKNOWN_UC_ADDR3, ethertype IPv4 (0x0800)" \
 | 
			
		||||
		false
 | 
			
		||||
	xfail_on_veth $h1 \
 | 
			
		||||
		check_rcv $rcv_if_name \
 | 
			
		||||
			"Unicast IPv4 to unknown MAC address, allmulti" \
 | 
			
		||||
			"$smac > $UNKNOWN_UC_ADDR3, ethertype IPv4 (0x0800)" \
 | 
			
		||||
			false
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Multicast IPv4 to joined group" \
 | 
			
		||||
		"$smac > $JOINED_MACV4_MC_ADDR, ethertype IPv4 (0x0800)" \
 | 
			
		||||
		true
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Multicast IPv4 to unknown group" \
 | 
			
		||||
		"$smac > $UNKNOWN_MACV4_MC_ADDR1, ethertype IPv4 (0x0800)" \
 | 
			
		||||
		false
 | 
			
		||||
	xfail_on_veth $h1 \
 | 
			
		||||
		check_rcv $rcv_if_name \
 | 
			
		||||
			"Multicast IPv4 to unknown group" \
 | 
			
		||||
			"$smac > $UNKNOWN_MACV4_MC_ADDR1, ethertype IPv4 (0x0800)" \
 | 
			
		||||
			false
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Multicast IPv4 to unknown group, promisc" \
 | 
			
		||||
		"$smac > $UNKNOWN_MACV4_MC_ADDR2, ethertype IPv4 (0x0800)" \
 | 
			
		||||
| 
						 | 
				
			
			@ -187,9 +192,10 @@ run_test()
 | 
			
		|||
		"$smac > $JOINED_MACV6_MC_ADDR, ethertype IPv6 (0x86dd)" \
 | 
			
		||||
		true
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
 | 
			
		||||
		"$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
 | 
			
		||||
		false
 | 
			
		||||
	xfail_on_veth $h1 \
 | 
			
		||||
		check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
 | 
			
		||||
			"$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
 | 
			
		||||
			false
 | 
			
		||||
 | 
			
		||||
	check_rcv $rcv_if_name "Multicast IPv6 to unknown group, promisc" \
 | 
			
		||||
		"$smac > $UNKNOWN_MACV6_MC_ADDR2, ethertype IPv6 (0x86dd)" \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -127,15 +127,17 @@ setup_ns()
 | 
			
		|||
	local ns=""
 | 
			
		||||
	local ns_name=""
 | 
			
		||||
	local ns_list=""
 | 
			
		||||
	local ns_exist=
 | 
			
		||||
	for ns_name in "$@"; do
 | 
			
		||||
		# Some test may setup/remove same netns multi times
 | 
			
		||||
		if unset ${ns_name} 2> /dev/null; then
 | 
			
		||||
			ns="${ns_name,,}-$(mktemp -u XXXXXX)"
 | 
			
		||||
			eval readonly ${ns_name}="$ns"
 | 
			
		||||
			ns_exist=false
 | 
			
		||||
		else
 | 
			
		||||
			eval ns='$'${ns_name}
 | 
			
		||||
			cleanup_ns "$ns"
 | 
			
		||||
 | 
			
		||||
			ns_exist=true
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		if ! ip netns add "$ns"; then
 | 
			
		||||
| 
						 | 
				
			
			@ -144,7 +146,7 @@ setup_ns()
 | 
			
		|||
			return $ksft_skip
 | 
			
		||||
		fi
 | 
			
		||||
		ip -n "$ns" link set lo up
 | 
			
		||||
		ns_list="$ns_list $ns"
 | 
			
		||||
		! $ns_exist && ns_list="$ns_list $ns"
 | 
			
		||||
	done
 | 
			
		||||
	NS_LIST="$NS_LIST $ns_list"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -293,7 +293,7 @@ check_random_order()
 | 
			
		|||
	local ns=$1
 | 
			
		||||
	local log=$2
 | 
			
		||||
 | 
			
		||||
	for i in $(seq 100); do
 | 
			
		||||
	for i in $(seq 50); do
 | 
			
		||||
		ip -net $ns xfrm policy flush
 | 
			
		||||
		for j in $(seq 0 16 255 | sort -R); do
 | 
			
		||||
			ip -net $ns xfrm policy add dst $j.0.0.0/24 dir out priority 10 action allow
 | 
			
		||||
| 
						 | 
				
			
			@ -306,7 +306,7 @@ check_random_order()
 | 
			
		|||
		done
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	for i in $(seq 100); do
 | 
			
		||||
	for i in $(seq 50); do
 | 
			
		||||
		ip -net $ns xfrm policy flush
 | 
			
		||||
		for j in $(seq 0 16 255 | sort -R); do
 | 
			
		||||
			local addr=$(printf "e000:0000:%02x00::/56" $j)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue