mirror of
https://github.com/torvalds/linux
synced 2024-07-21 02:23:16 +00: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
|
@ -301,8 +301,9 @@ Arithmetic instructions
|
||||||
``ALU`` uses 32-bit wide operands while ``ALU64`` uses 64-bit wide operands for
|
``ALU`` uses 32-bit wide operands while ``ALU64`` uses 64-bit wide operands for
|
||||||
otherwise identical operations. ``ALU64`` instructions belong to the
|
otherwise identical operations. ``ALU64`` instructions belong to the
|
||||||
base64 conformance group unless noted otherwise.
|
base64 conformance group unless noted otherwise.
|
||||||
The 'code' field encodes the operation as below, where 'src' and 'dst' refer
|
The 'code' field encodes the operation as below, where 'src' refers to the
|
||||||
to the values of the source and destination registers, respectively.
|
the source operand and 'dst' refers to the value of the destination
|
||||||
|
register.
|
||||||
|
|
||||||
===== ===== ======= ==========================================================
|
===== ===== ======= ==========================================================
|
||||||
name code offset description
|
name code offset description
|
||||||
|
|
|
@ -61,6 +61,8 @@ properties:
|
||||||
iommus:
|
iommus:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
dma-coherent: true
|
||||||
|
|
||||||
phys: true
|
phys: true
|
||||||
|
|
||||||
phy-names:
|
phy-names:
|
||||||
|
|
|
@ -8,7 +8,6 @@ title: TI SoC Ethernet Switch Controller (CPSW)
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||||
- Ravi Gunasekaran <r-gunasekaran@ti.com>
|
|
||||||
- Roger Quadros <rogerq@kernel.org>
|
- Roger Quadros <rogerq@kernel.org>
|
||||||
|
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -8,7 +8,6 @@ title: The TI AM654x/J721E/AM642x SoC Gigabit Ethernet MAC (Media Access Control
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||||
- Ravi Gunasekaran <r-gunasekaran@ti.com>
|
|
||||||
- Roger Quadros <rogerq@kernel.org>
|
- Roger Quadros <rogerq@kernel.org>
|
||||||
|
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -8,7 +8,6 @@ title: The TI AM654x/J721E Common Platform Time Sync (CPTS) module
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||||
- Ravi Gunasekaran <r-gunasekaran@ti.com>
|
|
||||||
- Roger Quadros <rogerq@kernel.org>
|
- Roger Quadros <rogerq@kernel.org>
|
||||||
|
|
||||||
description: |+
|
description: |+
|
||||||
|
|
|
@ -3815,7 +3815,7 @@ F: arch/arm/net/
|
||||||
BPF JIT for ARM64
|
BPF JIT for ARM64
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
M: Alexei Starovoitov <ast@kernel.org>
|
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
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arm64/net/
|
F: arch/arm64/net/
|
||||||
|
@ -22392,7 +22392,6 @@ F: drivers/counter/ti-eqep.c
|
||||||
|
|
||||||
TI ETHERNET SWITCH DRIVER (CPSW)
|
TI ETHERNET SWITCH DRIVER (CPSW)
|
||||||
R: Siddharth Vadapalli <s-vadapalli@ti.com>
|
R: Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||||
R: Ravi Gunasekaran <r-gunasekaran@ti.com>
|
|
||||||
R: Roger Quadros <rogerq@kernel.org>
|
R: Roger Quadros <rogerq@kernel.org>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
|
|
@ -6477,16 +6477,16 @@ static int __init bonding_init(void)
|
||||||
if (res)
|
if (res)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
bond_create_debugfs();
|
||||||
|
|
||||||
res = register_pernet_subsys(&bond_net_ops);
|
res = register_pernet_subsys(&bond_net_ops);
|
||||||
if (res)
|
if (res)
|
||||||
goto out;
|
goto err_net_ops;
|
||||||
|
|
||||||
res = bond_netlink_init();
|
res = bond_netlink_init();
|
||||||
if (res)
|
if (res)
|
||||||
goto err_link;
|
goto err_link;
|
||||||
|
|
||||||
bond_create_debugfs();
|
|
||||||
|
|
||||||
for (i = 0; i < max_bonds; i++) {
|
for (i = 0; i < max_bonds; i++) {
|
||||||
res = bond_create(&init_net, NULL);
|
res = bond_create(&init_net, NULL);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -6501,10 +6501,11 @@ static int __init bonding_init(void)
|
||||||
out:
|
out:
|
||||||
return res;
|
return res;
|
||||||
err:
|
err:
|
||||||
bond_destroy_debugfs();
|
|
||||||
bond_netlink_fini();
|
bond_netlink_fini();
|
||||||
err_link:
|
err_link:
|
||||||
unregister_pernet_subsys(&bond_net_ops);
|
unregister_pernet_subsys(&bond_net_ops);
|
||||||
|
err_net_ops:
|
||||||
|
bond_destroy_debugfs();
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6513,11 +6514,11 @@ static void __exit bonding_exit(void)
|
||||||
{
|
{
|
||||||
unregister_netdevice_notifier(&bond_netdev_notifier);
|
unregister_netdevice_notifier(&bond_netdev_notifier);
|
||||||
|
|
||||||
bond_destroy_debugfs();
|
|
||||||
|
|
||||||
bond_netlink_fini();
|
bond_netlink_fini();
|
||||||
unregister_pernet_subsys(&bond_net_ops);
|
unregister_pernet_subsys(&bond_net_ops);
|
||||||
|
|
||||||
|
bond_destroy_debugfs();
|
||||||
|
|
||||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
/* Make sure we don't have an imbalance on our netpoll blocking */
|
/* Make sure we don't have an imbalance on our netpoll blocking */
|
||||||
WARN_ON(atomic_read(&netpoll_block_tx));
|
WARN_ON(atomic_read(&netpoll_block_tx));
|
||||||
|
|
|
@ -805,5 +805,15 @@ int ksz_dcb_init(struct ksz_device *dev)
|
||||||
if (ret)
|
if (ret)
|
||||||
return 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,7 +376,8 @@ static int idpf_set_ringparam(struct net_device *netdev,
|
||||||
new_tx_count);
|
new_tx_count);
|
||||||
|
|
||||||
if (new_tx_count == vport->txq_desc_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;
|
goto unlock_mutex;
|
||||||
|
|
||||||
if (!idpf_vport_set_hsplit(vport, kring->tcp_data_split)) {
|
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 ks8851_net *ks = _ks;
|
||||||
struct sk_buff_head rxq;
|
struct sk_buff_head rxq;
|
||||||
unsigned handled = 0;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
@ -336,24 +335,17 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
|
||||||
ks8851_lock(ks, &flags);
|
ks8851_lock(ks, &flags);
|
||||||
|
|
||||||
status = ks8851_rdreg16(ks, KS_ISR);
|
status = ks8851_rdreg16(ks, KS_ISR);
|
||||||
|
ks8851_wrreg16(ks, KS_ISR, status);
|
||||||
|
|
||||||
netif_dbg(ks, intr, ks->netdev,
|
netif_dbg(ks, intr, ks->netdev,
|
||||||
"%s: status 0x%04x\n", __func__, status);
|
"%s: status 0x%04x\n", __func__, status);
|
||||||
|
|
||||||
if (status & IRQ_LCI)
|
|
||||||
handled |= IRQ_LCI;
|
|
||||||
|
|
||||||
if (status & IRQ_LDI) {
|
if (status & IRQ_LDI) {
|
||||||
u16 pmecr = ks8851_rdreg16(ks, KS_PMECR);
|
u16 pmecr = ks8851_rdreg16(ks, KS_PMECR);
|
||||||
pmecr &= ~PMECR_WKEVT_MASK;
|
pmecr &= ~PMECR_WKEVT_MASK;
|
||||||
ks8851_wrreg16(ks, KS_PMECR, pmecr | PMECR_WKEVT_LINK);
|
ks8851_wrreg16(ks, KS_PMECR, pmecr | PMECR_WKEVT_LINK);
|
||||||
|
|
||||||
handled |= IRQ_LDI;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & IRQ_RXPSI)
|
|
||||||
handled |= IRQ_RXPSI;
|
|
||||||
|
|
||||||
if (status & IRQ_TXI) {
|
if (status & IRQ_TXI) {
|
||||||
unsigned short tx_space = ks8851_rdreg16(ks, KS_TXMIR);
|
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))
|
if (netif_queue_stopped(ks->netdev))
|
||||||
netif_wake_queue(ks->netdev);
|
netif_wake_queue(ks->netdev);
|
||||||
spin_unlock(&ks->statelock);
|
spin_unlock(&ks->statelock);
|
||||||
|
|
||||||
handled |= IRQ_TXI;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & IRQ_RXI)
|
|
||||||
handled |= IRQ_RXI;
|
|
||||||
|
|
||||||
if (status & IRQ_SPIBEI) {
|
if (status & IRQ_SPIBEI) {
|
||||||
netdev_err(ks->netdev, "%s: spi bus error\n", __func__);
|
netdev_err(ks->netdev, "%s: spi bus error\n", __func__);
|
||||||
handled |= IRQ_SPIBEI;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ks8851_wrreg16(ks, KS_ISR, handled);
|
|
||||||
|
|
||||||
if (status & IRQ_RXI) {
|
if (status & IRQ_RXI) {
|
||||||
/* the datasheet says to disable the rx interrupt during
|
/* the datasheet says to disable the rx interrupt during
|
||||||
* packet read-out, however we're masking the interrupt
|
* 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);
|
platform_set_drvdata(pdev, lan966x);
|
||||||
lan966x->dev = &pdev->dev;
|
lan966x->dev = &pdev->dev;
|
||||||
|
|
||||||
lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
|
|
||||||
|
|
||||||
if (!device_get_mac_address(&pdev->dev, mac_addr)) {
|
if (!device_get_mac_address(&pdev->dev, mac_addr)) {
|
||||||
ether_addr_copy(lan966x->base_mac, mac_addr);
|
ether_addr_copy(lan966x->base_mac, mac_addr);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1179,6 +1177,8 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||||
return dev_err_probe(&pdev->dev, -ENODEV,
|
return dev_err_probe(&pdev->dev, -ENODEV,
|
||||||
"no ethernet-ports child found\n");
|
"no ethernet-ports child found\n");
|
||||||
|
|
||||||
|
lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
|
||||||
|
|
||||||
/* init switch */
|
/* init switch */
|
||||||
lan966x_init(lan966x);
|
lan966x_init(lan966x);
|
||||||
lan966x_stats_init(lan966x);
|
lan966x_stats_init(lan966x);
|
||||||
|
@ -1257,6 +1257,8 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||||
destroy_workqueue(lan966x->stats_queue);
|
destroy_workqueue(lan966x->stats_queue);
|
||||||
mutex_destroy(&lan966x->stats_lock);
|
mutex_destroy(&lan966x->stats_lock);
|
||||||
|
|
||||||
|
debugfs_remove_recursive(lan966x->debugfs_root);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1958,6 +1958,8 @@ int wx_sw_init(struct wx *wx)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitmap_zero(wx->state, WX_STATE_NBITS);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(wx_sw_init);
|
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;
|
wx->rss_enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed &
|
netdev->features = features;
|
||||||
(NETIF_F_HW_VLAN_CTAG_RX |
|
|
||||||
NETIF_F_HW_VLAN_STAG_RX))
|
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);
|
wx_set_rx_mode(netdev);
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(wx_set_features);
|
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,
|
void wx_set_ring(struct wx *wx, u32 new_tx_count,
|
||||||
u32 new_rx_count, struct wx_ring *temp_ring)
|
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,
|
void wx_get_stats64(struct net_device *netdev,
|
||||||
struct rtnl_link_stats64 *stats);
|
struct rtnl_link_stats64 *stats);
|
||||||
int wx_set_features(struct net_device *netdev, netdev_features_t features);
|
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,
|
void wx_set_ring(struct wx *wx, u32 new_tx_count,
|
||||||
u32 new_rx_count, struct wx_ring *temp_ring);
|
u32 new_rx_count, struct wx_ring *temp_ring);
|
||||||
|
|
||||||
|
|
|
@ -982,8 +982,13 @@ struct wx_hw_stats {
|
||||||
u64 qmprc;
|
u64 qmprc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum wx_state {
|
||||||
|
WX_STATE_RESETTING,
|
||||||
|
WX_STATE_NBITS, /* must be last */
|
||||||
|
};
|
||||||
struct wx {
|
struct wx {
|
||||||
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
||||||
|
DECLARE_BITMAP(state, WX_STATE_NBITS);
|
||||||
|
|
||||||
void *priv;
|
void *priv;
|
||||||
u8 __iomem *hw_addr;
|
u8 __iomem *hw_addr;
|
||||||
|
@ -1071,6 +1076,8 @@ struct wx {
|
||||||
u64 hw_csum_rx_good;
|
u64 hw_csum_rx_good;
|
||||||
u64 hw_csum_rx_error;
|
u64 hw_csum_rx_error;
|
||||||
u64 alloc_rx_buff_failed;
|
u64 alloc_rx_buff_failed;
|
||||||
|
|
||||||
|
void (*do_reset)(struct net_device *netdev);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WX_INTR_ALL (~0ULL)
|
#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);
|
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_ */
|
#endif /* _WX_TYPE_H_ */
|
||||||
|
|
|
@ -52,7 +52,7 @@ static int ngbe_set_ringparam(struct net_device *netdev,
|
||||||
struct wx *wx = netdev_priv(netdev);
|
struct wx *wx = netdev_priv(netdev);
|
||||||
u32 new_rx_count, new_tx_count;
|
u32 new_rx_count, new_tx_count;
|
||||||
struct wx_ring *temp_ring;
|
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 = clamp_t(u32, ring->tx_pending, WX_MIN_TXD, WX_MAX_TXD);
|
||||||
new_tx_count = ALIGN(new_tx_count, WX_REQ_TX_DESCRIPTOR_MULTIPLE);
|
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)
|
new_rx_count == wx->rx_ring_count)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err = wx_set_state_reset(wx);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (!netif_running(wx->netdev)) {
|
if (!netif_running(wx->netdev)) {
|
||||||
for (i = 0; i < wx->num_tx_queues; i++)
|
for (i = 0; i < wx->num_tx_queues; i++)
|
||||||
wx->tx_ring[i]->count = new_tx_count;
|
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->tx_ring_count = new_tx_count;
|
||||||
wx->rx_ring_count = new_rx_count;
|
wx->rx_ring_count = new_rx_count;
|
||||||
|
|
||||||
return 0;
|
goto clear_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate temporary buffer to store rings in */
|
/* allocate temporary buffer to store rings in */
|
||||||
i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
|
i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
|
||||||
temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
|
temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
|
||||||
if (!temp_ring)
|
if (!temp_ring) {
|
||||||
return -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
goto clear_reset;
|
||||||
|
}
|
||||||
|
|
||||||
ngbe_down(wx);
|
ngbe_down(wx);
|
||||||
|
|
||||||
|
@ -89,7 +95,9 @@ static int ngbe_set_ringparam(struct net_device *netdev,
|
||||||
wx_configure(wx);
|
wx_configure(wx);
|
||||||
ngbe_up(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,
|
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_start_xmit = wx_xmit_frame,
|
||||||
.ndo_set_rx_mode = wx_set_rx_mode,
|
.ndo_set_rx_mode = wx_set_rx_mode,
|
||||||
.ndo_set_features = wx_set_features,
|
.ndo_set_features = wx_set_features,
|
||||||
|
.ndo_fix_features = wx_fix_features,
|
||||||
.ndo_validate_addr = eth_validate_addr,
|
.ndo_validate_addr = eth_validate_addr,
|
||||||
.ndo_set_mac_address = wx_set_mac,
|
.ndo_set_mac_address = wx_set_mac,
|
||||||
.ndo_get_stats64 = wx_get_stats64,
|
.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);
|
struct wx *wx = netdev_priv(netdev);
|
||||||
u32 new_rx_count, new_tx_count;
|
u32 new_rx_count, new_tx_count;
|
||||||
struct wx_ring *temp_ring;
|
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 = clamp_t(u32, ring->tx_pending, WX_MIN_TXD, WX_MAX_TXD);
|
||||||
new_tx_count = ALIGN(new_tx_count, WX_REQ_TX_DESCRIPTOR_MULTIPLE);
|
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)
|
new_rx_count == wx->rx_ring_count)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err = wx_set_state_reset(wx);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (!netif_running(wx->netdev)) {
|
if (!netif_running(wx->netdev)) {
|
||||||
for (i = 0; i < wx->num_tx_queues; i++)
|
for (i = 0; i < wx->num_tx_queues; i++)
|
||||||
wx->tx_ring[i]->count = new_tx_count;
|
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->tx_ring_count = new_tx_count;
|
||||||
wx->rx_ring_count = new_rx_count;
|
wx->rx_ring_count = new_rx_count;
|
||||||
|
|
||||||
return 0;
|
goto clear_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate temporary buffer to store rings in */
|
/* allocate temporary buffer to store rings in */
|
||||||
i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
|
i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
|
||||||
temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
|
temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
|
||||||
if (!temp_ring)
|
if (!temp_ring) {
|
||||||
return -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
goto clear_reset;
|
||||||
|
}
|
||||||
|
|
||||||
txgbe_down(wx);
|
txgbe_down(wx);
|
||||||
|
|
||||||
|
@ -55,7 +61,9 @@ static int txgbe_set_ringparam(struct net_device *netdev,
|
||||||
|
|
||||||
txgbe_up(wx);
|
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,
|
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->tx_work_limit = TXGBE_DEFAULT_TX_WORK;
|
||||||
wx->rx_work_limit = TXGBE_DEFAULT_RX_WORK;
|
wx->rx_work_limit = TXGBE_DEFAULT_RX_WORK;
|
||||||
|
|
||||||
|
wx->do_reset = txgbe_do_reset;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,6 +423,34 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
|
||||||
return 0;
|
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 = {
|
static const struct net_device_ops txgbe_netdev_ops = {
|
||||||
.ndo_open = txgbe_open,
|
.ndo_open = txgbe_open,
|
||||||
.ndo_stop = txgbe_close,
|
.ndo_stop = txgbe_close,
|
||||||
|
@ -428,6 +458,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
|
||||||
.ndo_start_xmit = wx_xmit_frame,
|
.ndo_start_xmit = wx_xmit_frame,
|
||||||
.ndo_set_rx_mode = wx_set_rx_mode,
|
.ndo_set_rx_mode = wx_set_rx_mode,
|
||||||
.ndo_set_features = wx_set_features,
|
.ndo_set_features = wx_set_features,
|
||||||
|
.ndo_fix_features = wx_fix_features,
|
||||||
.ndo_validate_addr = eth_validate_addr,
|
.ndo_validate_addr = eth_validate_addr,
|
||||||
.ndo_set_mac_address = wx_set_mac,
|
.ndo_set_mac_address = wx_set_mac,
|
||||||
.ndo_get_stats64 = wx_get_stats64,
|
.ndo_get_stats64 = wx_get_stats64,
|
||||||
|
|
|
@ -134,6 +134,7 @@ extern char txgbe_driver_name[];
|
||||||
void txgbe_down(struct wx *wx);
|
void txgbe_down(struct wx *wx);
|
||||||
void txgbe_up(struct wx *wx);
|
void txgbe_up(struct wx *wx);
|
||||||
int txgbe_setup_tc(struct net_device *dev, u8 tc);
|
int txgbe_setup_tc(struct net_device *dev, u8 tc);
|
||||||
|
void txgbe_do_reset(struct net_device *netdev);
|
||||||
|
|
||||||
#define NODE_PROP(_NAME, _PROP) \
|
#define NODE_PROP(_NAME, _PROP) \
|
||||||
(const struct software_node) { \
|
(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))
|
if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rtnl_lock();
|
promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_KERNEL);
|
||||||
|
|
||||||
promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_ATOMIC);
|
|
||||||
if (!promisc_allmulti) {
|
if (!promisc_allmulti) {
|
||||||
dev_warn(&dev->dev, "Failed to set RX mode, no memory.\n");
|
dev_warn(&dev->dev, "Failed to set RX mode, no memory.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rtnl_lock();
|
||||||
|
|
||||||
*promisc_allmulti = !!(dev->flags & IFF_PROMISC);
|
*promisc_allmulti = !!(dev->flags & IFF_PROMISC);
|
||||||
sg_init_one(sg, promisc_allmulti, sizeof(*promisc_allmulti));
|
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);
|
inner_map_meta_size = sizeof(*inner_map_meta);
|
||||||
/* In some cases verifier needs to access beyond just base map. */
|
/* 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_size = sizeof(struct bpf_array);
|
||||||
|
|
||||||
inner_map_meta = kzalloc(inner_map_meta_size, GFP_USER);
|
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. */
|
/* Misc members not needed in bpf_map_meta_equal() check. */
|
||||||
inner_map_meta->ops = inner_map->ops;
|
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 =
|
struct bpf_array *inner_array_meta =
|
||||||
container_of(inner_map_meta, struct bpf_array, map);
|
container_of(inner_map_meta, struct bpf_array, map);
|
||||||
struct bpf_array *inner_array = container_of(inner_map, 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 */
|
/* net device transmit always called with BH disabled */
|
||||||
netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
|
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_mcast_port *pmctx_null = NULL;
|
||||||
struct net_bridge *br = netdev_priv(dev);
|
struct net_bridge *br = netdev_priv(dev);
|
||||||
struct net_bridge_mcast *brmctx = &br->multicast_ctx;
|
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;
|
const unsigned char *dest;
|
||||||
u16 vid = 0;
|
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));
|
memset(skb->cb, 0, sizeof(struct br_input_skb_cb));
|
||||||
br_tc_skb_miss_set(skb, false);
|
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);
|
struct net_bridge_vlan_group *vg = nbp_vlan_group(p);
|
||||||
|
|
||||||
if (v->state == state)
|
if (br_vlan_get_state(v) == state)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
br_vlan_set_state(v, state);
|
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_group *vg;
|
||||||
struct net_bridge_vlan *v;
|
struct net_bridge_vlan *v;
|
||||||
int err;
|
int err = 0;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
vg = nbp_vlan_group(p);
|
vg = nbp_vlan_group(p);
|
||||||
if (!vg)
|
if (!vg)
|
||||||
return 0;
|
goto out;
|
||||||
|
|
||||||
/* MSTI 0 (CST) state changes are notified via the regular
|
/* MSTI 0 (CST) state changes are notified via the regular
|
||||||
* SWITCHDEV_ATTR_ID_PORT_STP_STATE.
|
* 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) {
|
if (msti) {
|
||||||
err = switchdev_port_attr_set(p->dev, &attr, extack);
|
err = switchdev_port_attr_set(p->dev, &attr, extack);
|
||||||
if (err && err != -EOPNOTSUPP)
|
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)
|
if (v->brvlan->msti != msti)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
br_mst_vlan_set_state(p, v, state);
|
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)
|
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) ?
|
.fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
|
||||||
: RT6_TABLE_MAIN,
|
: RT6_TABLE_MAIN,
|
||||||
.fc_ifindex = rtmsg->rtmsg_ifindex,
|
.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_expires = rtmsg->rtmsg_info,
|
||||||
.fc_dst_len = rtmsg->rtmsg_dst_len,
|
.fc_dst_len = rtmsg->rtmsg_dst_len,
|
||||||
.fc_src_len = rtmsg->rtmsg_src_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();
|
rtnl_lock();
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SIOCADDRT:
|
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);
|
err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
|
||||||
break;
|
break;
|
||||||
case SIOCDELRT:
|
case SIOCDELRT:
|
||||||
|
|
|
@ -910,22 +910,20 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UDP encapsulation receive handler. See net/ipv4/udp.c.
|
/* UDP encapsulation receive and error receive handlers.
|
||||||
* Return codes:
|
* See net/ipv4/udp.c for details.
|
||||||
* 0 : success.
|
*
|
||||||
* <0: error
|
* Note that these functions are called from inside an
|
||||||
* >0: skb should be passed up to userspace as UDP.
|
* 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)
|
int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct l2tp_tunnel *tunnel;
|
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);
|
tunnel = rcu_dereference_sk_user_data(sk);
|
||||||
if (!tunnel)
|
if (!tunnel)
|
||||||
goto pass_up;
|
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);
|
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
|
* Transmit handling
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
@ -1516,6 +1537,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
|
||||||
.sk_user_data = tunnel,
|
.sk_user_data = tunnel,
|
||||||
.encap_type = UDP_ENCAP_L2TPINUDP,
|
.encap_type = UDP_ENCAP_L2TPINUDP,
|
||||||
.encap_rcv = l2tp_udp_encap_recv,
|
.encap_rcv = l2tp_udp_encap_recv,
|
||||||
|
.encap_err_rcv = l2tp_udp_encap_err_recv,
|
||||||
.encap_destroy = l2tp_udp_encap_destroy,
|
.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;
|
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);
|
hlist_del_init(&nr_node->node_node);
|
||||||
nr_node_put(nr_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)
|
static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
|
||||||
{
|
{
|
||||||
hlist_del_init(&nr_neigh->neigh_node);
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spin_lock_bh(&nr_node_list_lock);
|
||||||
nr_node_lock(nr_node);
|
nr_node_lock(nr_node);
|
||||||
for (i = 0; i < nr_node->count; i++) {
|
for (i = 0; i < nr_node->count; i++) {
|
||||||
if (nr_node->routes[i].neighbour == nr_neigh) {
|
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--;
|
nr_node->count--;
|
||||||
|
|
||||||
if (nr_node->count == 0) {
|
if (nr_node->count == 0) {
|
||||||
nr_remove_node(nr_node);
|
nr_remove_node_locked(nr_node);
|
||||||
} else {
|
} else {
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 0:
|
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_put(nr_node);
|
||||||
}
|
}
|
||||||
nr_node_unlock(nr_node);
|
nr_node_unlock(nr_node);
|
||||||
|
spin_unlock_bh(&nr_node_list_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nr_neigh_put(nr_neigh);
|
nr_neigh_put(nr_neigh);
|
||||||
nr_node_unlock(nr_node);
|
nr_node_unlock(nr_node);
|
||||||
|
spin_unlock_bh(&nr_node_list_lock);
|
||||||
nr_node_put(nr_node);
|
nr_node_put(nr_node);
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -2522,8 +2522,7 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
|
||||||
ts = __packet_set_timestamp(po, ph, skb);
|
ts = __packet_set_timestamp(po, ph, skb);
|
||||||
__packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts);
|
__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);
|
sock_wfree(skb);
|
||||||
|
|
|
@ -725,6 +725,24 @@ int qrtr_ns_init(void)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err_wq;
|
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;
|
return 0;
|
||||||
|
|
||||||
err_wq:
|
err_wq:
|
||||||
|
@ -739,6 +757,15 @@ void qrtr_ns_remove(void)
|
||||||
{
|
{
|
||||||
cancel_work_sync(&qrtr_ns.work);
|
cancel_work_sync(&qrtr_ns.work);
|
||||||
destroy_workqueue(qrtr_ns.workqueue);
|
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);
|
sock_release(qrtr_ns.sock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(qrtr_ns_remove);
|
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)
|
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[] = {
|
struct bpf_insn insns[] = {
|
||||||
BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns),
|
BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns),
|
||||||
BPF_EXIT_INSN(),
|
BPF_EXIT_INSN(),
|
||||||
|
|
|
@ -22,7 +22,7 @@ int probe_fd(int fd)
|
||||||
|
|
||||||
static int probe_kern_prog_name(int token_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[] = {
|
struct bpf_insn insns[] = {
|
||||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||||
BPF_EXIT_INSN(),
|
BPF_EXIT_INSN(),
|
||||||
|
|
|
@ -653,7 +653,7 @@ static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,
|
||||||
cmpstr =
|
cmpstr =
|
||||||
"(struct file_operations){\n"
|
"(struct file_operations){\n"
|
||||||
" .owner = (struct module *)0xffffffffffffffff,\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");
|
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_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, 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, 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, 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_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, 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, 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))
|
#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_map);
|
||||||
TEST(hash_malloc_map);
|
TEST(hash_malloc_map);
|
||||||
TEST(lru_hash_map);
|
TEST(lru_hash_map);
|
||||||
|
TEST(pcpu_array_map);
|
||||||
|
TEST(pcpu_hash_map);
|
||||||
|
|
||||||
#undef TEST
|
#undef TEST
|
||||||
return 0;
|
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_maps);
|
||||||
TEST(array_of_hash_malloc_maps);
|
TEST(array_of_hash_malloc_maps);
|
||||||
TEST(array_of_lru_hash_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_array_maps);
|
||||||
TEST(hash_of_hash_maps);
|
TEST(hash_of_hash_maps);
|
||||||
TEST(hash_of_hash_malloc_maps);
|
TEST(hash_of_hash_malloc_maps);
|
||||||
TEST(hash_of_lru_hash_maps);
|
TEST(hash_of_lru_hash_maps);
|
||||||
|
TEST(hash_of_pcpu_array_maps);
|
||||||
|
TEST(hash_of_pcpu_hash_maps);
|
||||||
|
|
||||||
#undef TEST
|
#undef TEST
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
unsigned long span = 0;
|
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,
|
int BPF_PROG(fentry_fentry, int this_cpu, struct rq *this_rq,
|
||||||
struct sched_domain *sd)
|
struct sched_domain *sd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -478,10 +478,10 @@ v3exc_timeout_test()
|
||||||
RET=0
|
RET=0
|
||||||
local X=("192.0.2.20" "192.0.2.30")
|
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 \
|
ip link set dev br0 type bridge mcast_query_interval 100 \
|
||||||
mcast_query_response_interval 100 \
|
mcast_query_response_interval 100 \
|
||||||
mcast_membership_interval 300
|
mcast_membership_interval 500
|
||||||
|
|
||||||
v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
|
v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
|
||||||
ip link set dev br0 type bridge mcast_query_interval 500 \
|
ip link set dev br0 type bridge mcast_query_interval 500 \
|
||||||
|
@ -489,7 +489,7 @@ v3exc_timeout_test()
|
||||||
mcast_membership_interval 1500
|
mcast_membership_interval 1500
|
||||||
|
|
||||||
$MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q
|
$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 \
|
bridge -j -d -s mdb show dev br0 \
|
||||||
| jq -e ".[].mdb[] | \
|
| jq -e ".[].mdb[] | \
|
||||||
select(.grp == \"$TEST_GROUP\" and \
|
select(.grp == \"$TEST_GROUP\" and \
|
||||||
|
|
|
@ -478,10 +478,10 @@ mldv2exc_timeout_test()
|
||||||
RET=0
|
RET=0
|
||||||
local X=("2001:db8:1::20" "2001:db8:1::30")
|
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 \
|
ip link set dev br0 type bridge mcast_query_interval 100 \
|
||||||
mcast_query_response_interval 100 \
|
mcast_query_response_interval 100 \
|
||||||
mcast_membership_interval 300
|
mcast_membership_interval 500
|
||||||
|
|
||||||
mldv2exclude_prepare $h1
|
mldv2exclude_prepare $h1
|
||||||
ip link set dev br0 type bridge mcast_query_interval 500 \
|
ip link set dev br0 type bridge mcast_query_interval 500 \
|
||||||
|
@ -489,7 +489,7 @@ mldv2exc_timeout_test()
|
||||||
mcast_membership_interval 1500
|
mcast_membership_interval 1500
|
||||||
|
|
||||||
$MZ $h1 -c 1 $MZPKT_ALLOW2 -q
|
$MZ $h1 -c 1 $MZPKT_ALLOW2 -q
|
||||||
sleep 3
|
sleep 5
|
||||||
bridge -j -d -s mdb show dev br0 \
|
bridge -j -d -s mdb show dev br0 \
|
||||||
| jq -e ".[].mdb[] | \
|
| jq -e ".[].mdb[] | \
|
||||||
select(.grp == \"$TEST_GROUP\" and \
|
select(.grp == \"$TEST_GROUP\" and \
|
||||||
|
|
|
@ -155,25 +155,30 @@ run_test()
|
||||||
"$smac > $MACVLAN_ADDR, ethertype IPv4 (0x0800)" \
|
"$smac > $MACVLAN_ADDR, ethertype IPv4 (0x0800)" \
|
||||||
true
|
true
|
||||||
|
|
||||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
|
xfail_on_veth $h1 \
|
||||||
"$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
|
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
|
||||||
false
|
"$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
|
||||||
|
false
|
||||||
|
|
||||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, promisc" \
|
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, promisc" \
|
||||||
"$smac > $UNKNOWN_UC_ADDR2, ethertype IPv4 (0x0800)" \
|
"$smac > $UNKNOWN_UC_ADDR2, ethertype IPv4 (0x0800)" \
|
||||||
true
|
true
|
||||||
|
|
||||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, allmulti" \
|
xfail_on_veth $h1 \
|
||||||
"$smac > $UNKNOWN_UC_ADDR3, ethertype IPv4 (0x0800)" \
|
check_rcv $rcv_if_name \
|
||||||
false
|
"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" \
|
check_rcv $rcv_if_name "Multicast IPv4 to joined group" \
|
||||||
"$smac > $JOINED_MACV4_MC_ADDR, ethertype IPv4 (0x0800)" \
|
"$smac > $JOINED_MACV4_MC_ADDR, ethertype IPv4 (0x0800)" \
|
||||||
true
|
true
|
||||||
|
|
||||||
check_rcv $rcv_if_name "Multicast IPv4 to unknown group" \
|
xfail_on_veth $h1 \
|
||||||
"$smac > $UNKNOWN_MACV4_MC_ADDR1, ethertype IPv4 (0x0800)" \
|
check_rcv $rcv_if_name \
|
||||||
false
|
"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" \
|
check_rcv $rcv_if_name "Multicast IPv4 to unknown group, promisc" \
|
||||||
"$smac > $UNKNOWN_MACV4_MC_ADDR2, ethertype IPv4 (0x0800)" \
|
"$smac > $UNKNOWN_MACV4_MC_ADDR2, ethertype IPv4 (0x0800)" \
|
||||||
|
@ -187,9 +192,10 @@ run_test()
|
||||||
"$smac > $JOINED_MACV6_MC_ADDR, ethertype IPv6 (0x86dd)" \
|
"$smac > $JOINED_MACV6_MC_ADDR, ethertype IPv6 (0x86dd)" \
|
||||||
true
|
true
|
||||||
|
|
||||||
check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
|
xfail_on_veth $h1 \
|
||||||
"$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
|
check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
|
||||||
false
|
"$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
|
||||||
|
false
|
||||||
|
|
||||||
check_rcv $rcv_if_name "Multicast IPv6 to unknown group, promisc" \
|
check_rcv $rcv_if_name "Multicast IPv6 to unknown group, promisc" \
|
||||||
"$smac > $UNKNOWN_MACV6_MC_ADDR2, ethertype IPv6 (0x86dd)" \
|
"$smac > $UNKNOWN_MACV6_MC_ADDR2, ethertype IPv6 (0x86dd)" \
|
||||||
|
|
|
@ -127,15 +127,17 @@ setup_ns()
|
||||||
local ns=""
|
local ns=""
|
||||||
local ns_name=""
|
local ns_name=""
|
||||||
local ns_list=""
|
local ns_list=""
|
||||||
|
local ns_exist=
|
||||||
for ns_name in "$@"; do
|
for ns_name in "$@"; do
|
||||||
# Some test may setup/remove same netns multi times
|
# Some test may setup/remove same netns multi times
|
||||||
if unset ${ns_name} 2> /dev/null; then
|
if unset ${ns_name} 2> /dev/null; then
|
||||||
ns="${ns_name,,}-$(mktemp -u XXXXXX)"
|
ns="${ns_name,,}-$(mktemp -u XXXXXX)"
|
||||||
eval readonly ${ns_name}="$ns"
|
eval readonly ${ns_name}="$ns"
|
||||||
|
ns_exist=false
|
||||||
else
|
else
|
||||||
eval ns='$'${ns_name}
|
eval ns='$'${ns_name}
|
||||||
cleanup_ns "$ns"
|
cleanup_ns "$ns"
|
||||||
|
ns_exist=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! ip netns add "$ns"; then
|
if ! ip netns add "$ns"; then
|
||||||
|
@ -144,7 +146,7 @@ setup_ns()
|
||||||
return $ksft_skip
|
return $ksft_skip
|
||||||
fi
|
fi
|
||||||
ip -n "$ns" link set lo up
|
ip -n "$ns" link set lo up
|
||||||
ns_list="$ns_list $ns"
|
! $ns_exist && ns_list="$ns_list $ns"
|
||||||
done
|
done
|
||||||
NS_LIST="$NS_LIST $ns_list"
|
NS_LIST="$NS_LIST $ns_list"
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,7 +293,7 @@ check_random_order()
|
||||||
local ns=$1
|
local ns=$1
|
||||||
local log=$2
|
local log=$2
|
||||||
|
|
||||||
for i in $(seq 100); do
|
for i in $(seq 50); do
|
||||||
ip -net $ns xfrm policy flush
|
ip -net $ns xfrm policy flush
|
||||||
for j in $(seq 0 16 255 | sort -R); do
|
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
|
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
|
||||||
done
|
done
|
||||||
|
|
||||||
for i in $(seq 100); do
|
for i in $(seq 50); do
|
||||||
ip -net $ns xfrm policy flush
|
ip -net $ns xfrm policy flush
|
||||||
for j in $(seq 0 16 255 | sort -R); do
|
for j in $(seq 0 16 255 | sort -R); do
|
||||||
local addr=$(printf "e000:0000:%02x00::/56" $j)
|
local addr=$(printf "e000:0000:%02x00::/56" $j)
|
||||||
|
|
Loading…
Reference in a new issue