History

Merge tag 'net-6.6-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

Pull networking fixes from Jakub Kicinski: "Including fixes from Bluetooth, netfilter, BPF and WiFi. I didn't collect precise data but feels like we've got a lot of 6.5 fixes here. WiFi fixes are most user-awaited. Current release - regressions: - Bluetooth: fix hci_link_tx_to RCU lock usage Current release - new code bugs: - bpf: mprog: fix maximum program check on mprog attachment - eth: ti: icssg-prueth: fix signedness bug in prueth_init_tx_chns() Previous releases - regressions: - ipv6: tcp: add a missing nf_reset_ct() in 3WHS handling - vringh: don't use vringh_kiov_advance() in vringh_iov_xfer(), it doesn't handle zero length like we expected - wifi: - cfg80211: fix cqm_config access race, fix crashes with brcmfmac - iwlwifi: mvm: handle PS changes in vif_cfg_changed - mac80211: fix mesh id corruption on 32 bit systems - mt76: mt76x02: fix MT76x0 external LNA gain handling - Bluetooth: fix handling of HCI_QUIRK_STRICT_DUPLICATE_FILTER - l2tp: fix handling of transhdrlen in __ip{,6}_append_data() - dsa: mv88e6xxx: avoid EEPROM timeout when EEPROM is absent - eth: stmmac: fix the incorrect parameter after refactoring Previous releases - always broken: - net: replace calls to sock->ops->connect() with kernel_connect(), prevent address rewrite in kernel_bind(); otherwise BPF hooks may modify arguments, unexpectedly to the caller - tcp: fix delayed ACKs when reads and writes align with MSS - bpf: - verifier: unconditionally reset backtrack_state masks on global func exit - s390: let arch_prepare_bpf_trampoline return program size, fix struct_ops offsets - sockmap: fix accounting of available bytes in presence of PEEKs - sockmap: reject sk_msg egress redirects to non-TCP sockets - ipv4/fib: send netlink notify when delete source address routes - ethtool: plca: fix width of reads when parsing netlink commands - netfilter: nft_payload: rebuild vlan header on h_proto access - Bluetooth: hci_codec: fix leaking memory of local_codecs - eth: intel: ice: always add legacy 32byte RXDID in supported_rxdids - eth: stmmac: - dwmac-stm32: fix resume on STM32 MCU - remove buggy and unneeded stmmac_poll_controller, depend on NAPI - ibmveth: always recompute TCP pseudo-header checksum, fix use of the driver with Open vSwitch - wifi: - rtw88: rtw8723d: fix MAC address offset in EEPROM - mt76: fix lock dependency problem for wed_lock - mwifiex: sanity check data reported by the device - iwlwifi: ensure ack flag is properly cleared - iwlwifi: mvm: fix a memory corruption due to bad pointer arithm - iwlwifi: mvm: fix incorrect usage of scan API Misc: - wifi: mac80211: work around Cisco AP 9115 VHT MPDU length" * tag 'net-6.6-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (99 commits) MAINTAINERS: update Matthieu's email address mptcp: userspace pm allow creating id 0 subflow mptcp: fix delegated action races net: stmmac: remove unneeded stmmac_poll_controller net: lan743x: also select PHYLIB net: ethernet: mediatek: disable irq before schedule napi net: mana: Fix oversized sge0 for GSO packets net: mana: Fix the tso_bytes calculation net: mana: Fix TX CQE error handling netlink: annotate data-races around sk->sk_err sctp: update hb timer immediately after users change hb_interval sctp: update transport state when processing a dupcook packet tcp: fix delayed ACKs for MSS boundary condition tcp: fix quick-ack counting to count actual ACKs of new data page_pool: fix documentation typos tipc: fix a potential deadlock on &tx->lock net: stmmac: dwmac-stm32: fix resume on STM32 MCU ipv4: Set offload_failed flag in fibmatch results netfilter: nf_tables: nft_set_rbtree: fix spurious insertion failure netfilter: nf_tables: Deduplicate nft_register_obj audit logs ...

Linus Torvalds committed 3 years ago

Commit f2912092 parents cb84fb8 c29d984112 files · +1355 −597Browse files

Unified · Split

112 files
  1. .mailmap +1 −0
  2. MAINTAINERS +2 −10
  3. arch/s390/net/bpf_jit_comp.c +1 −1
  4. drivers/bluetooth/btusb.c +1 −0
  5. drivers/dma/ti/k3-udma-glue.c +3 −0
  6. drivers/net/dsa/mv88e6xxx/chip.c +4 −2
  7. drivers/net/dsa/mv88e6xxx/global1.c +0 −31
  8. drivers/net/dsa/mv88e6xxx/global1.h +0 −1
  9. drivers/net/dsa/mv88e6xxx/global2.c +1 −1
  10. drivers/net/dsa/mv88e6xxx/global2.h +1 −0
  11. drivers/net/ethernet/ibm/ibmveth.c +12 −13
  12. drivers/net/ethernet/intel/ice/ice_virtchnl.c +7 −5
  13. drivers/net/ethernet/marvell/sky2.h +1 −1
  14. drivers/net/ethernet/mediatek/mtk_eth_soc.c +2 −2
  15. drivers/net/ethernet/microchip/Kconfig +1 −0
  16. drivers/net/ethernet/microsoft/mana/mana_en.c +146 −65
  17. drivers/net/ethernet/qlogic/qed/qed_ll2.h +1 −1
  18. drivers/net/ethernet/renesas/rswitch.c +12 −1
  19. drivers/net/ethernet/renesas/rswitch.h +2 −0
  20. drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c +5 −2
  21. drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +0 −30
  22. drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +1 −1
  23. drivers/net/ethernet/ti/am65-cpsw-nuss.c +2 −1
  24. drivers/net/ethernet/ti/icssg/icssg_prueth.c +3 −3
  25. drivers/net/usb/smsc75xx.c +3 −1
  26. drivers/net/wan/fsl_ucc_hdlc.c +10 −2
  27. drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +7 −2
  28. drivers/net/wireless/intel/iwlwifi/fw/error-dump.h +3 −3
  29. drivers/net/wireless/intel/iwlwifi/mvm/fw.c +1 −1
  30. drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c +63 −58
  31. drivers/net/wireless/intel/iwlwifi/mvm/scan.c +1 −1
  32. drivers/net/wireless/intel/iwlwifi/mvm/tx.c +3 −0
  33. drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c +19 −3
  34. drivers/net/wireless/marvell/mwifiex/fw.h +1 −1
  35. drivers/net/wireless/marvell/mwifiex/sta_rx.c +9 −7
  36. drivers/net/wireless/mediatek/mt76/dma.c +4 −4
  37. drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.c +0 −7
  38. drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c +11 −2
  39. drivers/net/wireless/realtek/rtw88/rtw8723d.h +1 −0
  40. drivers/ptp/ptp_ocp.c +0 −1
  41. drivers/vhost/vringh.c +11 −1
  42. include/linux/bpf.h +1 −1
  43. include/linux/netfilter/nf_conntrack_sctp.h +1 −0
  44. include/net/bluetooth/hci_core.h +1 −1
  45. include/net/cfg80211.h +4 −2
  46. include/net/ip_fib.h +1 −0
  47. include/net/mana/mana.h +3 −2
  48. include/net/neighbour.h +1 −1
  49. include/net/page_pool/helpers.h +3 −3
  50. include/net/tcp.h +4 −2
  51. kernel/bpf/memalloc.c +19 −25
  52. kernel/bpf/mprog.c +3 −0
  53. kernel/bpf/verifier.c +3 −5
  54. net/bluetooth/hci_conn.c +35 −28
  55. net/bluetooth/hci_core.c +11 −3
  56. net/bluetooth/hci_event.c +1 −0
  57. net/bluetooth/hci_request.h +0 −2
  58. net/bluetooth/hci_sync.c +5 −9
  59. net/bluetooth/iso.c +6 −3
  60. net/bridge/br_netfilter_hooks.c +1 −1
  61. net/core/neighbour.c +8 −6
  62. net/core/sock_map.c +4 −0
  63. net/ethtool/plca.c +29 −16
  64. net/ipv4/fib_semantics.c +1 −0
  65. net/ipv4/fib_trie.c +4 −0
  66. net/ipv4/route.c +2 −0
  67. net/ipv4/tcp.c +2 −8
  68. net/ipv4/tcp_bpf.c +3 −1
  69. net/ipv4/tcp_input.c +13 −0
  70. net/ipv4/tcp_output.c +3 −4
  71. net/ipv6/tcp_ipv6.c +7 −3
  72. net/l2tp/l2tp_ip6.c +1 −1
  73. net/mac80211/cfg.c +5 −1
  74. net/mac80211/ibss.c +1 −1
  75. net/mac80211/ieee80211_i.h +2 −1
  76. net/mac80211/key.c +16 −6
  77. net/mac80211/mesh.c +4 −4
  78. net/mac80211/mesh_plink.c +1 −1
  79. net/mac80211/mlme.c +35 −10
  80. net/mac80211/tx.c +2 −1
  81. net/mac80211/vht.c +14 −2
  82. net/mptcp/pm_userspace.c +0 −6
  83. net/mptcp/protocol.c +14 −14
  84. net/mptcp/protocol.h +12 −23
  85. net/mptcp/subflow.c +8 −2
  86. net/netfilter/ipvs/ip_vs_sync.c +4 −4
  87. net/netfilter/nf_conntrack_proto_sctp.c +33 −10
  88. net/netfilter/nf_tables_api.c +28 −16
  89. net/netfilter/nft_payload.c +12 −1
  90. net/netfilter/nft_set_rbtree.c +29 −17
  91. net/netlink/af_netlink.c +4 −4
  92. net/nfc/llcp_core.c +2 −0
  93. net/rds/tcp_connect.c +2 −2
  94. net/rds/tcp_listen.c +1 −1
  95. net/rfkill/core.c +26 −6
  96. net/sctp/associola.c +1 −2
  97. net/sctp/socket.c +1 −0
  98. net/socket.c +29 −7
  99. net/tipc/crypto.c +2 −2
  100. net/wireless/core.c +7 −7
  101. net/wireless/core.h +5 −2
  102. net/wireless/mlme.c +2 −1
  103. net/wireless/nl80211.c +81 −33
  104. net/wireless/scan.c +4 −0
  105. tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c +2 −0
  106. tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +51 −0
  107. tools/testing/selftests/bpf/prog_tests/tc_opts.c +84 −0
  108. tools/testing/selftests/bpf/progs/bpf_cubic.c +3 −0
  109. tools/testing/selftests/netfilter/Makefile +3 −2
  110. tools/testing/selftests/netfilter/conntrack_sctp_collision.sh +89 −0
  111. tools/testing/selftests/netfilter/nft_audit.sh +101 −16
  112. tools/testing/selftests/netfilter/sctp_collision.c +99 −0
.mailmap+1−0
@@ -377,6 +377,7 @@ Matthew Wilcox <willy@infradead.org> <willy@debian.org> · 376 unmodified lines
377377 Matthew Wilcox <willy@infradead.org> <willy@linux.intel.com>
378378 Matthew Wilcox <willy@infradead.org> <willy@parisc-linux.org>
379379 Matthias Fuchs <socketcan@esd.eu> <matthias.fuchs@esd.eu>
380+Matthieu Baerts <matttbe@kernel.org> <matthieu.baerts@tessares.net>
380381 Matthieu CASTET <castet.matthieu@free.fr>
381382 Matti Vaittinen <mazziesaccount@gmail.com> <matti.vaittinen@fi.rohmeurope.com>
382383 Matt Ranostay <matt.ranostay@konsulko.com> <matt@ranostay.consulting>
MAINTAINERS+2−10
@@ -470,7 +470,6 @@ F: drivers/hwmon/adm1029.c · 469 unmodified lines
470470 ADM8211 WIRELESS DRIVER
471471 L: linux-wireless@vger.kernel.org
472472 S: Orphan
473−W: https://wireless.wiki.kernel.org/
474473 F: drivers/net/wireless/admtek/adm8211.*
475474
476475 ADP1653 FLASH CONTROLLER DRIVER
@@ -9531,10 +9530,8 @@ F: Documentation/devicetree/bindings/iio/pressure/honeywell,mprls0025pa.yaml · 9054 unmodified lines
95319530 F: drivers/iio/pressure/mprls0025pa.c
95329531
95339532 HOST AP DRIVER
9534−M: Jouni Malinen <j@w1.fi>
95359533 L: linux-wireless@vger.kernel.org
95369534 S: Obsolete
9537−W: http://w1.fi/hostap-driver.html
95389535 F: drivers/net/wireless/intersil/hostap/
95399536
95409537 HP BIOSCFG DRIVER
@@ -14947,7 +14944,7 @@ K: macsec · 5406 unmodified lines
1494714944 K: \bmdo_
1494814945
1494914946 NETWORKING [MPTCP]
14950−M: Matthieu Baerts <matthieu.baerts@tessares.net>
14947+M: Matthieu Baerts <matttbe@kernel.org>
1495114948 M: Mat Martineau <martineau@kernel.org>
1495214949 L: netdev@vger.kernel.org
1495314950 L: mptcp@lists.linux.dev
@@ -17602,6 +17599,7 @@ M: Kalle Valo <kvalo@kernel.org> · 2648 unmodified lines
1760217599 M: Jeff Johnson <quic_jjohnson@quicinc.com>
1760317600 L: ath12k@lists.infradead.org
1760417601 S: Supported
17602+W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k
1760517603 T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
1760617604 F: drivers/net/wireless/ath/ath12k/
1760717605
@@ -18132,8 +18130,6 @@ REALTEK WIRELESS DRIVER (rtlwifi family) · 524 unmodified lines
1813218130 M: Ping-Ke Shih <pkshih@realtek.com>
1813318131 L: linux-wireless@vger.kernel.org
1813418132 S: Maintained
18135−W: https://wireless.wiki.kernel.org/
18136−T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
1813718133 F: drivers/net/wireless/realtek/rtlwifi/
1813818134
1813918135 REALTEK WIRELESS DRIVER (rtw88)
@@ -18661,7 +18657,6 @@ F: drivers/media/dvb-frontends/rtl2832_sdr* · 521 unmodified lines
1866118657 RTL8180 WIRELESS DRIVER
1866218658 L: linux-wireless@vger.kernel.org
1866318659 S: Orphan
18664−W: https://wireless.wiki.kernel.org/
1866518660 F: drivers/net/wireless/realtek/rtl818x/rtl8180/
1866618661
1866718662 RTL8187 WIRELESS DRIVER
@@ -18669,14 +18664,12 @@ M: Hin-Tak Leung <hintak.leung@gmail.com> · 1 unmodified line
1866918664 M: Larry Finger <Larry.Finger@lwfinger.net>
1867018665 L: linux-wireless@vger.kernel.org
1867118666 S: Maintained
18672−W: https://wireless.wiki.kernel.org/
1867318667 F: drivers/net/wireless/realtek/rtl818x/rtl8187/
1867418668
1867518669 RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
1867618670 M: Jes Sorensen <Jes.Sorensen@gmail.com>
1867718671 L: linux-wireless@vger.kernel.org
1867818672 S: Maintained
18679−T: git git://git.kernel.org/pub/scm/linux/kernel/git/jes/linux.git rtl8xxxu-devel
1868018673 F: drivers/net/wireless/realtek/rtl8xxxu/
1868118674
1868218675 RTRS TRANSPORT DRIVERS
@@ -21658,7 +21651,6 @@ L: linux-wireless@vger.kernel.org · 2975 unmodified lines
2165821651 S: Orphan
2165921652 W: https://wireless.wiki.kernel.org/en/users/Drivers/wl12xx
2166021653 W: https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
21661−T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
2166221654 F: drivers/net/wireless/ti/
2166321655
2166421656 TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
arch/s390/net/bpf_jit_comp.c+1−1
@@ -2513,7 +2513,7 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, · 2512 unmodified lines
25132513 return -E2BIG;
25142514 }
25152515
2516− return ret;
2516+ return tjit.common.prg;
25172517 }
25182518
25192519 bool bpf_jit_supports_subprog_tailcalls(void)
drivers/bluetooth/btusb.c+1−0
@@ -4419,6 +4419,7 @@ static int btusb_probe(struct usb_interface *intf, · 4418 unmodified lines
44194419
44204420 if (id->driver_info & BTUSB_QCA_ROME) {
44214421 data->setup_on_usb = btusb_setup_qca;
4422+ hdev->shutdown = btusb_shutdown_qca;
44224423 hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
44234424 hdev->cmd_timeout = btusb_qca_cmd_timeout;
44244425 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
drivers/dma/ti/k3-udma-glue.c+3−0
@@ -558,6 +558,9 @@ int k3_udma_glue_tx_get_irq(struct k3_udma_glue_tx_channel *tx_chn) · 557 unmodified lines
558558 tx_chn->virq = k3_ringacc_get_ring_irq_num(tx_chn->ringtxcq);
559559 }
560560
561+ if (!tx_chn->virq)
562+ return -ENXIO;
563+
561564 return tx_chn->virq;
562565 }
563566 EXPORT_SYMBOL_GPL(k3_udma_glue_tx_get_irq);
drivers/net/dsa/mv88e6xxx/chip.c+4−2
@@ -2958,14 +2958,16 @@ static void mv88e6xxx_hardware_reset(struct mv88e6xxx_chip *chip) · 2957 unmodified lines
29582958 * from the wrong location resulting in the switch booting
29592959 * to wrong mode and inoperable.
29602960 */
2961− mv88e6xxx_g1_wait_eeprom_done(chip);
2961+ if (chip->info->ops->get_eeprom)
2962+ mv88e6xxx_g2_eeprom_wait(chip);
29622963
29632964 gpiod_set_value_cansleep(gpiod, 1);
29642965 usleep_range(10000, 20000);
29652966 gpiod_set_value_cansleep(gpiod, 0);
29662967 usleep_range(10000, 20000);
29672968
2968− mv88e6xxx_g1_wait_eeprom_done(chip);
2969+ if (chip->info->ops->get_eeprom)
2970+ mv88e6xxx_g2_eeprom_wait(chip);
29692971 }
29702972 }
29712973
drivers/net/dsa/mv88e6xxx/global1.c+0−31
@@ -75,37 +75,6 @@ static int mv88e6xxx_g1_wait_init_ready(struct mv88e6xxx_chip *chip) · 74 unmodified lines
7575 return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STS, bit, 1);
7676 }
7777
78−void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip)
79−{
80− const unsigned long timeout = jiffies + 1 * HZ;
81− u16 val;
82− int err;
83−
84− /* Wait up to 1 second for the switch to finish reading the
85− * EEPROM.
86− */
87− while (time_before(jiffies, timeout)) {
88− err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &val);
89− if (err) {
90− dev_err(chip->dev, "Error reading status");
91− return;
92− }
93−
94− /* If the switch is still resetting, it may not
95− * respond on the bus, and so MDIO read returns
96− * 0xffff. Differentiate between that, and waiting for
97− * the EEPROM to be done by bit 0 being set.
98− */
99− if (val != 0xffff &&
100− val & BIT(MV88E6XXX_G1_STS_IRQ_EEPROM_DONE))
101− return;
102−
103− usleep_range(1000, 2000);
104− }
105−
106− dev_err(chip->dev, "Timeout waiting for EEPROM done");
107−}
108−
10978 /* Offset 0x01: Switch MAC Address Register Bytes 0 & 1
11079 * Offset 0x02: Switch MAC Address Register Bytes 2 & 3
11180 * Offset 0x03: Switch MAC Address Register Bytes 4 & 5
drivers/net/dsa/mv88e6xxx/global1.h+0−1
@@ -282,7 +282,6 @@ int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr); · 281 unmodified lines
282282 int mv88e6185_g1_reset(struct mv88e6xxx_chip *chip);
283283 int mv88e6352_g1_reset(struct mv88e6xxx_chip *chip);
284284 int mv88e6250_g1_reset(struct mv88e6xxx_chip *chip);
285−void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip);
286285
287286 int mv88e6185_g1_ppu_enable(struct mv88e6xxx_chip *chip);
288287 int mv88e6185_g1_ppu_disable(struct mv88e6xxx_chip *chip);
drivers/net/dsa/mv88e6xxx/global2.c+1−1
@@ -340,7 +340,7 @@ int mv88e6xxx_g2_pot_clear(struct mv88e6xxx_chip *chip) · 339 unmodified lines
340340 * Offset 0x15: EEPROM Addr (for 8-bit data access)
341341 */
342342
343−static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
343+int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
344344 {
345345 int bit = __bf_shf(MV88E6XXX_G2_EEPROM_CMD_BUSY);
346346 int err;
drivers/net/dsa/mv88e6xxx/global2.h+1−0
@@ -365,6 +365,7 @@ int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip); · 364 unmodified lines
365365
366366 int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
367367 int port);
368+int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip);
368369
369370 extern const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops;
370371 extern const struct mv88e6xxx_irq_ops mv88e6250_watchdog_ops;
drivers/net/ethernet/ibm/ibmveth.c+12−13
@@ -1303,24 +1303,23 @@ static void ibmveth_rx_csum_helper(struct sk_buff *skb, · 1302 unmodified lines
13031303 * the user space for finding a flow. During this process, OVS computes
13041304 * checksum on the first packet when CHECKSUM_PARTIAL flag is set.
13051305 *
1306− * So, re-compute TCP pseudo header checksum when configured for
1307− * trunk mode.
1306+ * So, re-compute TCP pseudo header checksum.
13081307 */
1308+
13091309 if (iph_proto == IPPROTO_TCP) {
13101310 struct tcphdr *tcph = (struct tcphdr *)(skb->data + iphlen);
1311+
13111312 if (tcph->check == 0x0000) {
13121313 /* Recompute TCP pseudo header checksum */
1313− if (adapter->is_active_trunk) {
1314− tcphdrlen = skb->len - iphlen;
1315− if (skb_proto == ETH_P_IP)
1316− tcph->check =
1317− ~csum_tcpudp_magic(iph->saddr,
1318− iph->daddr, tcphdrlen, iph_proto, 0);
1319− else if (skb_proto == ETH_P_IPV6)
1320− tcph->check =
1321− ~csum_ipv6_magic(&iph6->saddr,
1322− &iph6->daddr, tcphdrlen, iph_proto, 0);
1323− }
1314+ tcphdrlen = skb->len - iphlen;
1315+ if (skb_proto == ETH_P_IP)
1316+ tcph->check =
1317+ ~csum_tcpudp_magic(iph->saddr,
1318+ iph->daddr, tcphdrlen, iph_proto, 0);
1319+ else if (skb_proto == ETH_P_IPV6)
1320+ tcph->check =
1321+ ~csum_ipv6_magic(&iph6->saddr,
1322+ &iph6->daddr, tcphdrlen, iph_proto, 0);
13241323 /* Setup SKB fields for checksum offload */
13251324 skb_partial_csum_set(skb, iphlen,
13261325 offsetof(struct tcphdr, check));
drivers/net/ethernet/intel/ice/ice_virtchnl.c+7−5
@@ -2617,12 +2617,14 @@ static int ice_vc_query_rxdid(struct ice_vf *vf) · 2616 unmodified lines
26172617 goto err;
26182618 }
26192619
2620− /* Read flexiflag registers to determine whether the
2621− * corresponding RXDID is configured and supported or not.
2622− * Since Legacy 16byte descriptor format is not supported,
2623− * start from Legacy 32byte descriptor.
2620+ /* RXDIDs supported by DDP package can be read from the register
2621+ * to get the supported RXDID bitmap. But the legacy 32byte RXDID
2622+ * is not listed in DDP package, add it in the bitmap manually.
2623+ * Legacy 16byte descriptor is not supported.
26242624 */
2625− for (i = ICE_RXDID_LEGACY_1; i < ICE_FLEX_DESC_RXDID_MAX_NUM; i++) {
2625+ rxdid->supported_rxdids |= BIT(ICE_RXDID_LEGACY_1);
2626+
2627+ for (i = ICE_RXDID_FLEX_NIC; i < ICE_FLEX_DESC_RXDID_MAX_NUM; i++) {
26262628 regval = rd32(hw, GLFLXP_RXDID_FLAGS(i, 0));
26272629 if ((regval >> GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S)
26282630 & GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_M)
drivers/net/ethernet/marvell/sky2.h+1−1
@@ -2195,7 +2195,7 @@ struct rx_ring_info { · 2194 unmodified lines
21952195 struct sk_buff *skb;
21962196 dma_addr_t data_addr;
21972197 DEFINE_DMA_UNMAP_LEN(data_size);
2198− dma_addr_t frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT];
2198+ dma_addr_t frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT ?: 1];
21992199 };
22002200
22012201 enum flow_control {
drivers/net/ethernet/mediatek/mtk_eth_soc.c+2−2
@@ -3171,8 +3171,8 @@ static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth) · 3170 unmodified lines
31713171
31723172 eth->rx_events++;
31733173 if (likely(napi_schedule_prep(&eth->rx_napi))) {
3174− __napi_schedule(&eth->rx_napi);
31753174 mtk_rx_irq_disable(eth, eth->soc->txrx.rx_irq_done_mask);
3175+ __napi_schedule(&eth->rx_napi);
31763176 }
31773177
31783178 return IRQ_HANDLED;
@@ -3184,8 +3184,8 @@ static irqreturn_t mtk_handle_irq_tx(int irq, void *_eth) · 5 unmodified lines
31843184
31853185 eth->tx_events++;
31863186 if (likely(napi_schedule_prep(&eth->tx_napi))) {
3187− __napi_schedule(&eth->tx_napi);
31883187 mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
3188+ __napi_schedule(&eth->tx_napi);
31893189 }
31903190
31913191 return IRQ_HANDLED;
drivers/net/ethernet/microchip/Kconfig+1−0
@@ -46,6 +46,7 @@ config LAN743X · 45 unmodified lines
4646 tristate "LAN743x support"
4747 depends on PCI
4848 depends on PTP_1588_CLOCK_OPTIONAL
49+ select PHYLIB
4950 select FIXED_PHY
5051 select CRC16
5152 select CRC32
drivers/net/ethernet/microsoft/mana/mana_en.c+146−65
@@ -91,63 +91,137 @@ static unsigned int mana_checksum_info(struct sk_buff *skb) · 90 unmodified lines
9191 return 0;
9292 }
9393
94+static void mana_add_sge(struct mana_tx_package *tp, struct mana_skb_head *ash,
95+ int sg_i, dma_addr_t da, int sge_len, u32 gpa_mkey)
96+{
97+ ash->dma_handle[sg_i] = da;
98+ ash->size[sg_i] = sge_len;
99+
100+ tp->wqe_req.sgl[sg_i].address = da;
101+ tp->wqe_req.sgl[sg_i].mem_key = gpa_mkey;
102+ tp->wqe_req.sgl[sg_i].size = sge_len;
103+}
104+
94105 static int mana_map_skb(struct sk_buff *skb, struct mana_port_context *apc,
95− struct mana_tx_package *tp)
106+ struct mana_tx_package *tp, int gso_hs)
96107 {
97108 struct mana_skb_head *ash = (struct mana_skb_head *)skb->head;
109+ int hsg = 1; /* num of SGEs of linear part */
98110 struct gdma_dev *gd = apc->ac->gdma_dev;
111+ int skb_hlen = skb_headlen(skb);
112+ int sge0_len, sge1_len = 0;
99113 struct gdma_context *gc;
100114 struct device *dev;
101115 skb_frag_t *frag;
102116 dma_addr_t da;
117+ int sg_i;
103118 int i;
104119
105120 gc = gd->gdma_context;
106121 dev = gc->dev;
107− da = dma_map_single(dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
108122
123+ if (gso_hs && gso_hs < skb_hlen) {
124+ sge0_len = gso_hs;
125+ sge1_len = skb_hlen - gso_hs;
126+ } else {
127+ sge0_len = skb_hlen;
128+ }
129+
130+ da = dma_map_single(dev, skb->data, sge0_len, DMA_TO_DEVICE);
109131 if (dma_mapping_error(dev, da))
110132 return -ENOMEM;
111133
112− ash->dma_handle[0] = da;
113− ash->size[0] = skb_headlen(skb);
134+ mana_add_sge(tp, ash, 0, da, sge0_len, gd->gpa_mkey);
114135
115− tp->wqe_req.sgl[0].address = ash->dma_handle[0];
116− tp->wqe_req.sgl[0].mem_key = gd->gpa_mkey;
117− tp->wqe_req.sgl[0].size = ash->size[0];
136+ if (sge1_len) {
137+ sg_i = 1;
138+ da = dma_map_single(dev, skb->data + sge0_len, sge1_len,
139+ DMA_TO_DEVICE);
140+ if (dma_mapping_error(dev, da))
141+ goto frag_err;
142+
143+ mana_add_sge(tp, ash, sg_i, da, sge1_len, gd->gpa_mkey);
144+ hsg = 2;
145+ }
118146
119147 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
148+ sg_i = hsg + i;
149+
120150 frag = &skb_shinfo(skb)->frags[i];
121151 da = skb_frag_dma_map(dev, frag, 0, skb_frag_size(frag),
122152 DMA_TO_DEVICE);
123−
124153 if (dma_mapping_error(dev, da))
125154 goto frag_err;
126155
127− ash->dma_handle[i + 1] = da;
128− ash->size[i + 1] = skb_frag_size(frag);
129−
130− tp->wqe_req.sgl[i + 1].address = ash->dma_handle[i + 1];
131− tp->wqe_req.sgl[i + 1].mem_key = gd->gpa_mkey;
132− tp->wqe_req.sgl[i + 1].size = ash->size[i + 1];
156+ mana_add_sge(tp, ash, sg_i, da, skb_frag_size(frag),
157+ gd->gpa_mkey);
133158 }
134159
135160 return 0;
136161
137162 frag_err:
138− for (i = i - 1; i >= 0; i--)
139− dma_unmap_page(dev, ash->dma_handle[i + 1], ash->size[i + 1],
163+ for (i = sg_i - 1; i >= hsg; i--)
164+ dma_unmap_page(dev, ash->dma_handle[i], ash->size[i],
140165 DMA_TO_DEVICE);
141166
142− dma_unmap_single(dev, ash->dma_handle[0], ash->size[0], DMA_TO_DEVICE);
167+ for (i = hsg - 1; i >= 0; i--)
168+ dma_unmap_single(dev, ash->dma_handle[i], ash->size[i],
169+ DMA_TO_DEVICE);
143170
144171 return -ENOMEM;
145172 }
146173
174+/* Handle the case when GSO SKB linear length is too large.
175+ * MANA NIC requires GSO packets to put only the packet header to SGE0.
176+ * So, we need 2 SGEs for the skb linear part which contains more than the
177+ * header.
178+ * Return a positive value for the number of SGEs, or a negative value
179+ * for an error.
180+ */
181+static int mana_fix_skb_head(struct net_device *ndev, struct sk_buff *skb,
182+ int gso_hs)
183+{
184+ int num_sge = 1 + skb_shinfo(skb)->nr_frags;
185+ int skb_hlen = skb_headlen(skb);
186+
187+ if (gso_hs < skb_hlen) {
188+ num_sge++;
189+ } else if (gso_hs > skb_hlen) {
190+ if (net_ratelimit())
191+ netdev_err(ndev,
192+ "TX nonlinear head: hs:%d, skb_hlen:%d\n",
193+ gso_hs, skb_hlen);
194+
195+ return -EINVAL;
196+ }
197+
198+ return num_sge;
199+}
200+
201+/* Get the GSO packet's header size */
202+static int mana_get_gso_hs(struct sk_buff *skb)
203+{
204+ int gso_hs;
205+
206+ if (skb->encapsulation) {
207+ gso_hs = skb_inner_tcp_all_headers(skb);
208+ } else {
209+ if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
210+ gso_hs = skb_transport_offset(skb) +
211+ sizeof(struct udphdr);
212+ } else {
213+ gso_hs = skb_tcp_all_headers(skb);
214+ }
215+ }
216+
217+ return gso_hs;
218+}
219+
147220 netdev_tx_t mana_start_xmit(struct sk_buff *skb, struct net_device *ndev)
148221 {
149222 enum mana_tx_pkt_format pkt_fmt = MANA_SHORT_PKT_FMT;
150223 struct mana_port_context *apc = netdev_priv(ndev);
224+ int gso_hs = 0; /* zero for non-GSO pkts */
151225 u16 txq_idx = skb_get_queue_mapping(skb);
152226 struct gdma_dev *gd = apc->ac->gdma_dev;
153227 bool ipv4 = false, ipv6 = false;
@@ -159,7 +233,6 @@ netdev_tx_t mana_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 5 unmodified lines
159233 struct mana_txq *txq;
160234 struct mana_cq *cq;
161235 int err, len;
162− u16 ihs;
163236
164237 if (unlikely(!apc->port_is_up))
165238 goto tx_drop;
@@ -209,19 +282,6 @@ netdev_tx_t mana_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 43 unmodified lines
209282 pkg.wqe_req.client_data_unit = 0;
210283
211284 pkg.wqe_req.num_sge = 1 + skb_shinfo(skb)->nr_frags;
212− WARN_ON_ONCE(pkg.wqe_req.num_sge > MAX_TX_WQE_SGL_ENTRIES);
213−
214− if (pkg.wqe_req.num_sge <= ARRAY_SIZE(pkg.sgl_array)) {
215− pkg.wqe_req.sgl = pkg.sgl_array;
216− } else {
217− pkg.sgl_ptr = kmalloc_array(pkg.wqe_req.num_sge,
218− sizeof(struct gdma_sge),
219− GFP_ATOMIC);
220− if (!pkg.sgl_ptr)
221− goto tx_drop_count;
222−
223− pkg.wqe_req.sgl = pkg.sgl_ptr;
224− }
225285
226286 if (skb->protocol == htons(ETH_P_IP))
227287 ipv4 = true;
@@ -229,6 +289,26 @@ netdev_tx_t mana_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 1 unmodified line
229289 ipv6 = true;
230290
231291 if (skb_is_gso(skb)) {
292+ int num_sge;
293+
294+ gso_hs = mana_get_gso_hs(skb);
295+
296+ num_sge = mana_fix_skb_head(ndev, skb, gso_hs);
297+ if (num_sge > 0)
298+ pkg.wqe_req.num_sge = num_sge;
299+ else
300+ goto tx_drop_count;
301+
302+ u64_stats_update_begin(&tx_stats->syncp);
303+ if (skb->encapsulation) {
304+ tx_stats->tso_inner_packets++;
305+ tx_stats->tso_inner_bytes += skb->len - gso_hs;
306+ } else {
307+ tx_stats->tso_packets++;
308+ tx_stats->tso_bytes += skb->len - gso_hs;
309+ }
310+ u64_stats_update_end(&tx_stats->syncp);
311+
232312 pkg.tx_oob.s_oob.is_outer_ipv4 = ipv4;
233313 pkg.tx_oob.s_oob.is_outer_ipv6 = ipv6;
234314
@@ -252,28 +332,6 @@ netdev_tx_t mana_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 17 unmodified lines
252332 &ipv6_hdr(skb)->daddr, 0,
253333 IPPROTO_TCP, 0);
254334 }
255−
256− if (skb->encapsulation) {
257− ihs = skb_inner_tcp_all_headers(skb);
258− u64_stats_update_begin(&tx_stats->syncp);
259− tx_stats->tso_inner_packets++;
260− tx_stats->tso_inner_bytes += skb->len - ihs;
261− u64_stats_update_end(&tx_stats->syncp);
262− } else {
263− if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
264− ihs = skb_transport_offset(skb) + sizeof(struct udphdr);
265− } else {
266− ihs = skb_tcp_all_headers(skb);
267− if (ipv6_has_hopopt_jumbo(skb))
268− ihs -= sizeof(struct hop_jumbo_hdr);
269− }
270−
271− u64_stats_update_begin(&tx_stats->syncp);
272− tx_stats->tso_packets++;
273− tx_stats->tso_bytes += skb->len - ihs;
274− u64_stats_update_end(&tx_stats->syncp);
275− }
276−
277335 } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
278336 csum_type = mana_checksum_info(skb);
279337
@@ -296,11 +354,25 @@ netdev_tx_t mana_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 16 unmodified lines
296354 } else {
297355 /* Can't do offload of this type of checksum */
298356 if (skb_checksum_help(skb))
299− goto free_sgl_ptr;
357+ goto tx_drop_count;
300358 }
301359 }
302360
303− if (mana_map_skb(skb, apc, &pkg)) {
361+ WARN_ON_ONCE(pkg.wqe_req.num_sge > MAX_TX_WQE_SGL_ENTRIES);
362+
363+ if (pkg.wqe_req.num_sge <= ARRAY_SIZE(pkg.sgl_array)) {
364+ pkg.wqe_req.sgl = pkg.sgl_array;
365+ } else {
366+ pkg.sgl_ptr = kmalloc_array(pkg.wqe_req.num_sge,
367+ sizeof(struct gdma_sge),
368+ GFP_ATOMIC);
369+ if (!pkg.sgl_ptr)
370+ goto tx_drop_count;
371+
372+ pkg.wqe_req.sgl = pkg.sgl_ptr;
373+ }
374+
375+ if (mana_map_skb(skb, apc, &pkg, gso_hs)) {
304376 u64_stats_update_begin(&tx_stats->syncp);
305377 tx_stats->mana_map_err++;
306378 u64_stats_update_end(&tx_stats->syncp);
@@ -1258,11 +1330,16 @@ static void mana_unmap_skb(struct sk_buff *skb, struct mana_port_context *apc) · 951 unmodified lines
12581330 struct mana_skb_head *ash = (struct mana_skb_head *)skb->head;
12591331 struct gdma_context *gc = apc->ac->gdma_dev->gdma_context;
12601332 struct device *dev = gc->dev;
1261− int i;
1333+ int hsg, i;
12621334
1263− dma_unmap_single(dev, ash->dma_handle[0], ash->size[0], DMA_TO_DEVICE);
1335+ /* Number of SGEs of linear part */
1336+ hsg = (skb_is_gso(skb) && skb_headlen(skb) > ash->size[0]) ? 2 : 1;
12641337
1265− for (i = 1; i < skb_shinfo(skb)->nr_frags + 1; i++)
1338+ for (i = 0; i < hsg; i++)
1339+ dma_unmap_single(dev, ash->dma_handle[i], ash->size[i],
1340+ DMA_TO_DEVICE);
1341+
1342+ for (i = hsg; i < skb_shinfo(skb)->nr_frags + hsg; i++)
12661343 dma_unmap_page(dev, ash->dma_handle[i], ash->size[i],
12671344 DMA_TO_DEVICE);
12681345 }
@@ -1317,19 +1394,23 @@ static void mana_poll_tx_cq(struct mana_cq *cq) · 48 unmodified lines
13171394 case CQE_TX_VPORT_IDX_OUT_OF_RANGE:
13181395 case CQE_TX_VPORT_DISABLED:
13191396 case CQE_TX_VLAN_TAGGING_VIOLATION:
1320− WARN_ONCE(1, "TX: CQE error %d: ignored.\n",
1321− cqe_oob->cqe_hdr.cqe_type);
1397+ if (net_ratelimit())
1398+ netdev_err(ndev, "TX: CQE error %d\n",
1399+ cqe_oob->cqe_hdr.cqe_type);
1400+
13221401 apc->eth_stats.tx_cqe_err++;
13231402 break;
13241403
13251404 default:
1326− /* If the CQE type is unexpected, log an error, assert,
1327− * and go through the error path.
1405+ /* If the CQE type is unknown, log an error,
1406+ * and still free the SKB, update tail, etc.
13281407 */
1329− WARN_ONCE(1, "TX: Unexpected CQE type %d: HW BUG?\n",
1330− cqe_oob->cqe_hdr.cqe_type);
1408+ if (net_ratelimit())
1409+ netdev_err(ndev, "TX: unknown CQE type %d\n",
1410+ cqe_oob->cqe_hdr.cqe_type);
1411+
13311412 apc->eth_stats.tx_cqe_unknown_type++;
1332− return;
1413+ break;
13331414 }
13341415
13351416 if (WARN_ON_ONCE(txq->gdma_txq_id != completions[i].wq_num))
drivers/net/ethernet/qlogic/qed/qed_ll2.h+1−1
@@ -110,9 +110,9 @@ struct qed_ll2_info { · 109 unmodified lines
110110 enum core_tx_dest tx_dest;
111111 u8 tx_stats_en;
112112 bool main_func_queue;
113+ struct qed_ll2_cbs cbs;
113114 struct qed_ll2_rx_queue rx_queue;
114115 struct qed_ll2_tx_queue tx_queue;
115− struct qed_ll2_cbs cbs;
116116 };
117117
118118 extern const struct qed_ll2_ops qed_ll2_ops_pass;
drivers/net/ethernet/renesas/rswitch.c+12−1
@@ -4,6 +4,7 @@ · 3 unmodified lines
44 * Copyright (C) 2022 Renesas Electronics Corporation
55 */
66
7+#include <linux/clk.h>
78 #include <linux/dma-mapping.h>
89 #include <linux/err.h>
910 #include <linux/etherdevice.h>
@@ -1049,7 +1050,7 @@ static void rswitch_rmac_setting(struct rswitch_etha *etha, const u8 *mac) · 1039 unmodified lines
10491050 static void rswitch_etha_enable_mii(struct rswitch_etha *etha)
10501051 {
10511052 rswitch_modify(etha->addr, MPIC, MPIC_PSMCS_MASK | MPIC_PSMHT_MASK,
1052− MPIC_PSMCS(0x05) | MPIC_PSMHT(0x06));
1053+ MPIC_PSMCS(etha->psmcs) | MPIC_PSMHT(0x06));
10531054 rswitch_modify(etha->addr, MPSM, 0, MPSM_MFF_C45);
10541055 }
10551056
@@ -1693,6 +1694,12 @@ static void rswitch_etha_init(struct rswitch_private *priv, int index) · 637 unmodified lines
16931694 etha->index = index;
16941695 etha->addr = priv->addr + RSWITCH_ETHA_OFFSET + index * RSWITCH_ETHA_SIZE;
16951696 etha->coma_addr = priv->addr;
1697+
1698+ /* MPIC.PSMCS = (clk [MHz] / (MDC frequency [MHz] * 2) - 1.
1699+ * Calculating PSMCS value as MDC frequency = 2.5MHz. So, multiply
1700+ * both the numerator and the denominator by 10.
1701+ */
1702+ etha->psmcs = clk_get_rate(priv->clk) / 100000 / (25 * 2) - 1;
16961703 }
16971704
16981705 static int rswitch_device_alloc(struct rswitch_private *priv, int index)
@@ -1900,6 +1907,10 @@ static int renesas_eth_sw_probe(struct platform_device *pdev) · 201 unmodified lines
19001907 return -ENOMEM;
19011908 spin_lock_init(&priv->lock);
19021909
1910+ priv->clk = devm_clk_get(&pdev->dev, NULL);
1911+ if (IS_ERR(priv->clk))
1912+ return PTR_ERR(priv->clk);
1913+
19031914 attr = soc_device_match(rswitch_soc_no_speed_change);
19041915 if (attr)
19051916 priv->etha_no_runtime_change = true;
drivers/net/ethernet/renesas/rswitch.h+2−0
@@ -915,6 +915,7 @@ struct rswitch_etha { · 914 unmodified lines
915915 bool external_phy;
916916 struct mii_bus *mii;
917917 phy_interface_t phy_interface;
918+ u32 psmcs;
918919 u8 mac_addr[MAX_ADDR_LEN];
919920 int link;
920921 int speed;
@@ -1012,6 +1013,7 @@ struct rswitch_private { · 91 unmodified lines
10121013 struct rswitch_mfwd mfwd;
10131014
10141015 spinlock_t lock; /* lock interrupt registers' control */
1016+ struct clk *clk;
10151017
10161018 bool etha_no_runtime_change;
10171019 bool gwca_halt;
drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c+5−2
@@ -104,6 +104,7 @@ struct stm32_ops { · 103 unmodified lines
104104 int (*parse_data)(struct stm32_dwmac *dwmac,
105105 struct device *dev);
106106 u32 syscfg_eth_mask;
107+ bool clk_rx_enable_in_suspend;
107108 };
108109
109110 static int stm32_dwmac_init(struct plat_stmmacenet_data *plat_dat)
@@ -121,7 +122,8 @@ static int stm32_dwmac_init(struct plat_stmmacenet_data *plat_dat) · 11 unmodified lines
121122 if (ret)
122123 return ret;
123124
124− if (!dwmac->dev->power.is_suspended) {
125+ if (!dwmac->ops->clk_rx_enable_in_suspend ||
126+ !dwmac->dev->power.is_suspended) {
125127 ret = clk_prepare_enable(dwmac->clk_rx);
126128 if (ret) {
127129 clk_disable_unprepare(dwmac->clk_tx);
@@ -513,7 +515,8 @@ static struct stm32_ops stm32mp1_dwmac_data = { · 385 unmodified lines
513515 .suspend = stm32mp1_suspend,
514516 .resume = stm32mp1_resume,
515517 .parse_data = stm32mp1_parse_data,
516− .syscfg_eth_mask = SYSCFG_MP1_ETH_MASK
518+ .syscfg_eth_mask = SYSCFG_MP1_ETH_MASK,
519+ .clk_rx_enable_in_suspend = true
517520 };
518521
519522 static const struct of_device_id stm32_dwmac_match[] = {
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c+0−30
@@ -6002,33 +6002,6 @@ static irqreturn_t stmmac_msi_intr_rx(int irq, void *data) · 6001 unmodified lines
60026002 return IRQ_HANDLED;
60036003 }
60046004
6005−#ifdef CONFIG_NET_POLL_CONTROLLER
6006−/* Polling receive - used by NETCONSOLE and other diagnostic tools
6007− * to allow network I/O with interrupts disabled.
6008− */
6009−static void stmmac_poll_controller(struct net_device *dev)
6010−{
6011− struct stmmac_priv *priv = netdev_priv(dev);
6012− int i;
6013−
6014− /* If adapter is down, do nothing */
6015− if (test_bit(STMMAC_DOWN, &priv->state))
6016− return;
6017−
6018− if (priv->plat->flags & STMMAC_FLAG_MULTI_MSI_EN) {
6019− for (i = 0; i < priv->plat->rx_queues_to_use; i++)
6020− stmmac_msi_intr_rx(0, &priv->dma_conf.rx_queue[i]);
6021−
6022− for (i = 0; i < priv->plat->tx_queues_to_use; i++)
6023− stmmac_msi_intr_tx(0, &priv->dma_conf.tx_queue[i]);
6024− } else {
6025− disable_irq(dev->irq);
6026− stmmac_interrupt(dev->irq, dev);
6027− enable_irq(dev->irq);
6028− }
6029−}
6030−#endif
6031−
60326005 /**
60336006 * stmmac_ioctl - Entry point for the Ioctl
60346007 * @dev: Device pointer.
@@ -6989,9 +6962,6 @@ static const struct net_device_ops stmmac_netdev_ops = { · 954 unmodified lines
69896962 .ndo_get_stats64 = stmmac_get_stats64,
69906963 .ndo_setup_tc = stmmac_setup_tc,
69916964 .ndo_select_queue = stmmac_select_queue,
6992−#ifdef CONFIG_NET_POLL_CONTROLLER
6993− .ndo_poll_controller = stmmac_poll_controller,
6994−#endif
69956965 .ndo_set_mac_address = stmmac_set_mac_address,
69966966 .ndo_vlan_rx_add_vid = stmmac_vlan_rx_add_vid,
69976967 .ndo_vlan_rx_kill_vid = stmmac_vlan_rx_kill_vid,
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c+1−1
@@ -901,7 +901,7 @@ static int __maybe_unused stmmac_pltfr_resume(struct device *dev) · 900 unmodified lines
901901 struct platform_device *pdev = to_platform_device(dev);
902902 int ret;
903903
904− ret = stmmac_pltfr_init(pdev, priv->plat->bsp_priv);
904+ ret = stmmac_pltfr_init(pdev, priv->plat);
905905 if (ret)
906906 return ret;
907907
drivers/net/ethernet/ti/am65-cpsw-nuss.c+2−1
@@ -1747,9 +1747,10 @@ static int am65_cpsw_nuss_init_tx_chns(struct am65_cpsw_common *common) · 1746 unmodified lines
17471747 }
17481748
17491749 tx_chn->irq = k3_udma_glue_tx_get_irq(tx_chn->tx_chn);
1750− if (tx_chn->irq <= 0) {
1750+ if (tx_chn->irq < 0) {
17511751 dev_err(dev, "Failed to get tx dma irq %d\n",
17521752 tx_chn->irq);
1753+ ret = tx_chn->irq;
17531754 goto err;
17541755 }
17551756
drivers/net/ethernet/ti/icssg/icssg_prueth.c+3−3
@@ -316,12 +316,12 @@ static int prueth_init_tx_chns(struct prueth_emac *emac) · 315 unmodified lines
316316 goto fail;
317317 }
318318
319− tx_chn->irq = k3_udma_glue_tx_get_irq(tx_chn->tx_chn);
320− if (tx_chn->irq <= 0) {
321− ret = -EINVAL;
319+ ret = k3_udma_glue_tx_get_irq(tx_chn->tx_chn);
320+ if (ret < 0) {
322321 netdev_err(ndev, "failed to get tx irq\n");
323322 goto fail;
324323 }
324+ tx_chn->irq = ret;
325325
326326 snprintf(tx_chn->name, sizeof(tx_chn->name), "%s-tx%d",
327327 dev_name(dev), tx_chn->id);
drivers/net/usb/smsc75xx.c+3−1
@@ -90,7 +90,9 @@ static int __must_check __smsc75xx_read_reg(struct usbnet *dev, u32 index, · 89 unmodified lines
9090 ret = fn(dev, USB_VENDOR_REQUEST_READ_REGISTER, USB_DIR_IN
9191 | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
9292 0, index, &buf, 4);
93− if (unlikely(ret < 0)) {
93+ if (unlikely(ret < 4)) {
94+ ret = ret < 0 ? ret : -ENODATA;
95+
9496 netdev_warn(dev->net, "Failed to read reg index 0x%08x: %d\n",
9597 index, ret);
9698 return ret;
drivers/net/wan/fsl_ucc_hdlc.c+10−2
@@ -34,6 +34,8 @@ · 33 unmodified lines
3434 #define TDM_PPPOHT_SLIC_MAXIN
3535 #define RX_BD_ERRORS (R_CD_S | R_OV_S | R_CR_S | R_AB_S | R_NO_S | R_LG_S)
3636
37+static int uhdlc_close(struct net_device *dev);
38+
3739 static struct ucc_tdm_info utdm_primary_info = {
3840 .uf_info = {
3941 .tsa = 0,
@@ -708,6 +710,7 @@ static int uhdlc_open(struct net_device *dev) · 668 unmodified lines
708710 hdlc_device *hdlc = dev_to_hdlc(dev);
709711 struct ucc_hdlc_private *priv = hdlc->priv;
710712 struct ucc_tdm *utdm = priv->utdm;
713+ int rc = 0;
711714
712715 if (priv->hdlc_busy != 1) {
713716 if (request_irq(priv->ut_info->uf_info.irq,
@@ -731,10 +734,13 @@ static int uhdlc_open(struct net_device *dev) · 17 unmodified lines
731734 napi_enable(&priv->napi);
732735 netdev_reset_queue(dev);
733736 netif_start_queue(dev);
734− hdlc_open(dev);
737+
738+ rc = hdlc_open(dev);
739+ if (rc)
740+ uhdlc_close(dev);
735741 }
736742
737− return 0;
743+ return rc;
738744 }
739745
740746 static void uhdlc_memclean(struct ucc_hdlc_private *priv)
@@ -824,6 +830,8 @@ static int uhdlc_close(struct net_device *dev) · 83 unmodified lines
824830 netdev_reset_queue(dev);
825831 priv->hdlc_busy = 0;
826832
833+ hdlc_close(dev);
834+
827835 return 0;
828836 }
829837
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h+7−2
@@ -442,7 +442,12 @@ struct brcmf_scan_params_v2_le { · 441 unmodified lines
442442 * fixed parameter portion is assumed, otherwise
443443 * ssid in the fixed portion is ignored
444444 */
445− __le16 channel_list[1]; /* list of chanspecs */
445+ union {
446+ __le16 padding; /* Reserve space for at least 1 entry for abort
447+ * which uses an on stack brcmf_scan_params_v2_le
448+ */
449+ DECLARE_FLEX_ARRAY(__le16, channel_list); /* chanspecs */
450+ };
446451 };
447452
448453 struct brcmf_scan_results {
@@ -702,7 +707,7 @@ struct brcmf_sta_info_le { · 253 unmodified lines
702707
703708 struct brcmf_chanspec_list {
704709 __le32 count; /* # of entries */
705− __le32 element[1]; /* variable length uint32 list */
710+ __le32 element[]; /* variable length uint32 list */
706711 };
707712
708713 /*
drivers/net/wireless/intel/iwlwifi/fw/error-dump.h+3−3
@@ -310,9 +310,9 @@ struct iwl_fw_ini_fifo_hdr { · 309 unmodified lines
310310 struct iwl_fw_ini_error_dump_range {
311311 __le32 range_data_size;
312312 union {
313− __le32 internal_base_addr;
314− __le64 dram_base_addr;
315− __le32 page_num;
313+ __le32 internal_base_addr __packed;
314+ __le64 dram_base_addr __packed;
315+ __le32 page_num __packed;
316316 struct iwl_fw_ini_fifo_hdr fifo_hdr;
317317 struct iwl_cmd_header fw_pkt_hdr;
318318 };
drivers/net/wireless/intel/iwlwifi/mvm/fw.c+1−1
@@ -802,7 +802,7 @@ out: · 801 unmodified lines
802802 mvm->nvm_data->bands[0].n_channels = 1;
803803 mvm->nvm_data->bands[0].n_bitrates = 1;
804804 mvm->nvm_data->bands[0].bitrates =
805− (void *)((u8 *)mvm->nvm_data->channels + 1);
805+ (void *)(mvm->nvm_data->channels + 1);
806806 mvm->nvm_data->bands[0].bitrates->hw_value = 10;
807807 }
808808
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c+63−58
@@ -731,73 +731,78 @@ static void iwl_mvm_mld_vif_cfg_changed_station(struct iwl_mvm *mvm, · 730 unmodified lines
731731
732732 mvmvif->associated = vif->cfg.assoc;
733733
734− if (!(changes & BSS_CHANGED_ASSOC))
735− return;
736−
737− if (vif->cfg.assoc) {
738− /* clear statistics to get clean beacon counter */
739− iwl_mvm_request_statistics(mvm, true);
740− iwl_mvm_sf_update(mvm, vif, false);
741− iwl_mvm_power_vif_assoc(mvm, vif);
742−
743− for_each_mvm_vif_valid_link(mvmvif, i) {
744− memset(&mvmvif->link[i]->beacon_stats, 0,
745− sizeof(mvmvif->link[i]->beacon_stats));
734+ if (changes & BSS_CHANGED_ASSOC) {
735+ if (vif->cfg.assoc) {
736+ /* clear statistics to get clean beacon counter */
737+ iwl_mvm_request_statistics(mvm, true);
738+ iwl_mvm_sf_update(mvm, vif, false);
739+ iwl_mvm_power_vif_assoc(mvm, vif);
740+
741+ for_each_mvm_vif_valid_link(mvmvif, i) {
742+ memset(&mvmvif->link[i]->beacon_stats, 0,
743+ sizeof(mvmvif->link[i]->beacon_stats));
744+
745+ if (vif->p2p) {
746+ iwl_mvm_update_smps(mvm, vif,
747+ IWL_MVM_SMPS_REQ_PROT,
748+ IEEE80211_SMPS_DYNAMIC, i);
749+ }
750+
751+ rcu_read_lock();
752+ link_conf = rcu_dereference(vif->link_conf[i]);
753+ if (link_conf && !link_conf->dtim_period)
754+ protect = true;
755+ rcu_read_unlock();
756+ }
746757
747− if (vif->p2p) {
748− iwl_mvm_update_smps(mvm, vif,
749− IWL_MVM_SMPS_REQ_PROT,
750− IEEE80211_SMPS_DYNAMIC, i);
758+ if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
759+ protect) {
760+ /* If we're not restarting and still haven't
761+ * heard a beacon (dtim period unknown) then
762+ * make sure we still have enough minimum time
763+ * remaining in the time event, since the auth
764+ * might actually have taken quite a while
765+ * (especially for SAE) and so the remaining
766+ * time could be small without us having heard
767+ * a beacon yet.
768+ */
769+ iwl_mvm_protect_assoc(mvm, vif, 0);
751770 }
752771
753− rcu_read_lock();
754− link_conf = rcu_dereference(vif->link_conf[i]);
755− if (link_conf && !link_conf->dtim_period)
756− protect = true;
757− rcu_read_unlock();
758− }
772+ iwl_mvm_sf_update(mvm, vif, false);
773+
774+ /* FIXME: need to decide about misbehaving AP handling */
775+ iwl_mvm_power_vif_assoc(mvm, vif);
776+ } else if (iwl_mvm_mld_vif_have_valid_ap_sta(mvmvif)) {
777+ iwl_mvm_mei_host_disassociated(mvm);
759778
760− if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
761− protect) {
762− /* If we're not restarting and still haven't
763− * heard a beacon (dtim period unknown) then
764− * make sure we still have enough minimum time
765− * remaining in the time event, since the auth
766− * might actually have taken quite a while
767− * (especially for SAE) and so the remaining
768− * time could be small without us having heard
769− * a beacon yet.
779+ /* If update fails - SF might be running in associated
780+ * mode while disassociated - which is forbidden.
770781 */
771− iwl_mvm_protect_assoc(mvm, vif, 0);
782+ ret = iwl_mvm_sf_update(mvm, vif, false);
783+ WARN_ONCE(ret &&
784+ !test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED,
785+ &mvm->status),
786+ "Failed to update SF upon disassociation\n");
787+
788+ /* If we get an assert during the connection (after the
789+ * station has been added, but before the vif is set
790+ * to associated), mac80211 will re-add the station and
791+ * then configure the vif. Since the vif is not
792+ * associated, we would remove the station here and
793+ * this would fail the recovery.
794+ */
795+ iwl_mvm_mld_vif_delete_all_stas(mvm, vif);
772796 }
773797
774− iwl_mvm_sf_update(mvm, vif, false);
775−
776− /* FIXME: need to decide about misbehaving AP handling */
777− iwl_mvm_power_vif_assoc(mvm, vif);
778− } else if (iwl_mvm_mld_vif_have_valid_ap_sta(mvmvif)) {
779− iwl_mvm_mei_host_disassociated(mvm);
780−
781− /* If update fails - SF might be running in associated
782− * mode while disassociated - which is forbidden.
783− */
784− ret = iwl_mvm_sf_update(mvm, vif, false);
785− WARN_ONCE(ret &&
786− !test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED,
787− &mvm->status),
788− "Failed to update SF upon disassociation\n");
789−
790− /* If we get an assert during the connection (after the
791− * station has been added, but before the vif is set
792− * to associated), mac80211 will re-add the station and
793− * then configure the vif. Since the vif is not
794− * associated, we would remove the station here and
795− * this would fail the recovery.
796− */
797− iwl_mvm_mld_vif_delete_all_stas(mvm, vif);
798+ iwl_mvm_bss_info_changed_station_assoc(mvm, vif, changes);
798799 }
799800
800− iwl_mvm_bss_info_changed_station_assoc(mvm, vif, changes);
801+ if (changes & BSS_CHANGED_PS) {
802+ ret = iwl_mvm_power_update_mac(mvm);
803+ if (ret)
804+ IWL_ERR(mvm, "failed to update power mode\n");
805+ }
801806 }
802807
803808 static void
drivers/net/wireless/intel/iwlwifi/mvm/scan.c+1−1
@@ -2342,7 +2342,7 @@ iwl_mvm_scan_umac_fill_general_p_v12(struct iwl_mvm *mvm, · 2341 unmodified lines
23422342 if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC2)
23432343 gp->num_of_fragments[SCAN_HB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS;
23442344
2345− if (version < 12) {
2345+ if (version < 16) {
23462346 gp->scan_start_mac_or_link_id = scan_vif->id;
23472347 } else {
23482348 struct iwl_mvm_vif_link_info *link_info;
drivers/net/wireless/intel/iwlwifi/mvm/tx.c+3−0
@@ -1612,6 +1612,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, · 1611 unmodified lines
16121612 iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]);
16131613
16141614 memset(&info->status, 0, sizeof(info->status));
1615+ info->flags &= ~(IEEE80211_TX_STAT_ACK | IEEE80211_TX_STAT_TX_FILTERED);
16151616
16161617 /* inform mac80211 about what happened with the frame */
16171618 switch (status & TX_STATUS_MSK) {
@@ -1964,6 +1965,8 @@ static void iwl_mvm_tx_reclaim(struct iwl_mvm *mvm, int sta_id, int tid, · 346 unmodified lines
19641965 */
19651966 if (!is_flush)
19661967 info->flags |= IEEE80211_TX_STAT_ACK;
1968+ else
1969+ info->flags &= ~IEEE80211_TX_STAT_ACK;
19671970 }
19681971
19691972 /*
drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c+19−3
@@ -918,9 +918,17 @@ void mwifiex_11n_rxba_sync_event(struct mwifiex_private *priv, · 917 unmodified lines
918918
919919 mwifiex_dbg_dump(priv->adapter, EVT_D, "RXBA_SYNC event:",
920920 event_buf, len);
921− while (tlv_buf_left >= sizeof(*tlv_rxba)) {
921+ while (tlv_buf_left > sizeof(*tlv_rxba)) {
922922 tlv_type = le16_to_cpu(tlv_rxba->header.type);
923923 tlv_len = le16_to_cpu(tlv_rxba->header.len);
924+ if (size_add(sizeof(tlv_rxba->header), tlv_len) > tlv_buf_left) {
925+ mwifiex_dbg(priv->adapter, WARN,
926+ "TLV size (%zu) overflows event_buf buf_left=%d\n",
927+ size_add(sizeof(tlv_rxba->header), tlv_len),
928+ tlv_buf_left);
929+ return;
930+ }
931+
924932 if (tlv_type != TLV_TYPE_RXBA_SYNC) {
925933 mwifiex_dbg(priv->adapter, ERROR,
926934 "Wrong TLV id=0x%x\n", tlv_type);
@@ -929,6 +937,14 @@ void mwifiex_11n_rxba_sync_event(struct mwifiex_private *priv, · 2 unmodified lines
929937
930938 tlv_seq_num = le16_to_cpu(tlv_rxba->seq_num);
931939 tlv_bitmap_len = le16_to_cpu(tlv_rxba->bitmap_len);
940+ if (size_add(sizeof(*tlv_rxba), tlv_bitmap_len) > tlv_buf_left) {
941+ mwifiex_dbg(priv->adapter, WARN,
942+ "TLV size (%zu) overflows event_buf buf_left=%d\n",
943+ size_add(sizeof(*tlv_rxba), tlv_bitmap_len),
944+ tlv_buf_left);
945+ return;
946+ }
947+
932948 mwifiex_dbg(priv->adapter, INFO,
933949 "%pM tid=%d seq_num=%d bitmap_len=%d\n",
934950 tlv_rxba->mac, tlv_rxba->tid, tlv_seq_num,
@@ -965,8 +981,8 @@ void mwifiex_11n_rxba_sync_event(struct mwifiex_private *priv, · 30 unmodified lines
965981 }
966982 }
967983
968− tlv_buf_left -= (sizeof(*tlv_rxba) + tlv_len);
969− tmp = (u8 *)tlv_rxba + tlv_len + sizeof(*tlv_rxba);
984+ tlv_buf_left -= (sizeof(tlv_rxba->header) + tlv_len);
985+ tmp = (u8 *)tlv_rxba + sizeof(tlv_rxba->header) + tlv_len;
970986 tlv_rxba = (struct mwifiex_ie_types_rxba_sync *)tmp;
971987 }
972988 }
drivers/net/wireless/marvell/mwifiex/fw.h+1−1
@@ -779,7 +779,7 @@ struct mwifiex_ie_types_rxba_sync { · 778 unmodified lines
779779 u8 reserved;
780780 __le16 seq_num;
781781 __le16 bitmap_len;
782− u8 bitmap[1];
782+ u8 bitmap[];
783783 } __packed;
784784
785785 struct chan_band_param_set {
drivers/net/wireless/marvell/mwifiex/sta_rx.c+9−7
@@ -86,7 +86,8 @@ int mwifiex_process_rx_packet(struct mwifiex_private *priv, · 85 unmodified lines
8686 rx_pkt_len = le16_to_cpu(local_rx_pd->rx_pkt_length);
8787 rx_pkt_hdr = (void *)local_rx_pd + rx_pkt_off;
8888
89− if (sizeof(*rx_pkt_hdr) + rx_pkt_off > skb->len) {
89+ if (sizeof(rx_pkt_hdr->eth803_hdr) + sizeof(rfc1042_header) +
90+ rx_pkt_off > skb->len) {
9091 mwifiex_dbg(priv->adapter, ERROR,
9192 "wrong rx packet offset: len=%d, rx_pkt_off=%d\n",
9293 skb->len, rx_pkt_off);
@@ -95,12 +96,13 @@ int mwifiex_process_rx_packet(struct mwifiex_private *priv, · 2 unmodified lines
9596 return -1;
9697 }
9798
98− if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
99− sizeof(bridge_tunnel_header))) ||
100− (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header,
101− sizeof(rfc1042_header)) &&
102− ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_AARP &&
103− ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_IPX)) {
99+ if (sizeof(*rx_pkt_hdr) + rx_pkt_off <= skb->len &&
100+ ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
101+ sizeof(bridge_tunnel_header))) ||
102+ (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header,
103+ sizeof(rfc1042_header)) &&
104+ ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_AARP &&
105+ ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_IPX))) {
104106 /*
105107 * Replace the 803 header and rfc1042 header (llc/snap) with an
106108 * EthernetII header, keep the src/dst and snap_type
drivers/net/wireless/mediatek/mt76/dma.c+4−4
@@ -93,13 +93,13 @@ __mt76_get_rxwi(struct mt76_dev *dev) · 92 unmodified lines
9393 {
9494 struct mt76_txwi_cache *t = NULL;
9595
96− spin_lock(&dev->wed_lock);
96+ spin_lock_bh(&dev->wed_lock);
9797 if (!list_empty(&dev->rxwi_cache)) {
9898 t = list_first_entry(&dev->rxwi_cache, struct mt76_txwi_cache,
9999 list);
100100 list_del(&t->list);
101101 }
102− spin_unlock(&dev->wed_lock);
102+ spin_unlock_bh(&dev->wed_lock);
103103
104104 return t;
105105 }
@@ -145,9 +145,9 @@ mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t) · 39 unmodified lines
145145 if (!t)
146146 return;
147147
148− spin_lock(&dev->wed_lock);
148+ spin_lock_bh(&dev->wed_lock);
149149 list_add(&t->list, &dev->rxwi_cache);
150− spin_unlock(&dev->wed_lock);
150+ spin_unlock_bh(&dev->wed_lock);
151151 }
152152 EXPORT_SYMBOL_GPL(mt76_put_rxwi);
153153
drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.c+0−7
@@ -131,15 +131,8 @@ u8 mt76x02_get_lna_gain(struct mt76x02_dev *dev, · 130 unmodified lines
131131 s8 *lna_2g, s8 *lna_5g,
132132 struct ieee80211_channel *chan)
133133 {
134− u16 val;
135134 u8 lna;
136135
137− val = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1);
138− if (val & MT_EE_NIC_CONF_1_LNA_EXT_2G)
139− *lna_2g = 0;
140− if (val & MT_EE_NIC_CONF_1_LNA_EXT_5G)
141− memset(lna_5g, 0, sizeof(s8) * 3);
142−
143136 if (chan->band == NL80211_BAND_2GHZ)
144137 lna = *lna_2g;
145138 else if (chan->hw_value <= 64)
drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c+11−2
@@ -256,7 +256,8 @@ void mt76x2_read_rx_gain(struct mt76x02_dev *dev) · 255 unmodified lines
256256 struct ieee80211_channel *chan = dev->mphy.chandef.chan;
257257 int channel = chan->hw_value;
258258 s8 lna_5g[3], lna_2g;
259− u8 lna;
259+ bool use_lna;
260+ u8 lna = 0;
260261 u16 val;
261262
262263 if (chan->band == NL80211_BAND_2GHZ)
@@ -275,7 +276,15 @@ void mt76x2_read_rx_gain(struct mt76x02_dev *dev) · 12 unmodified lines
275276 dev->cal.rx.mcu_gain |= (lna_5g[1] & 0xff) << 16;
276277 dev->cal.rx.mcu_gain |= (lna_5g[2] & 0xff) << 24;
277278
278− lna = mt76x02_get_lna_gain(dev, &lna_2g, lna_5g, chan);
279+ val = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1);
280+ if (chan->band == NL80211_BAND_2GHZ)
281+ use_lna = !(val & MT_EE_NIC_CONF_1_LNA_EXT_2G);
282+ else
283+ use_lna = !(val & MT_EE_NIC_CONF_1_LNA_EXT_5G);
284+
285+ if (use_lna)
286+ lna = mt76x02_get_lna_gain(dev, &lna_2g, lna_5g, chan);
287+
279288 dev->cal.rx.lna_gain = mt76x02_sign_extend(lna, 8);
280289 }
281290 EXPORT_SYMBOL_GPL(mt76x2_read_rx_gain);
drivers/net/wireless/realtek/rtw88/rtw8723d.h+1−0
@@ -46,6 +46,7 @@ struct rtw8723du_efuse { · 45 unmodified lines
4646 u8 vender_id[2]; /* 0x100 */
4747 u8 product_id[2]; /* 0x102 */
4848 u8 usb_option; /* 0x104 */
49+ u8 res5[2]; /* 0x105 */
4950 u8 mac_addr[ETH_ALEN]; /* 0x107 */
5051 };
5152
drivers/ptp/ptp_ocp.c+0−1
@@ -3998,7 +3998,6 @@ ptp_ocp_device_init(struct ptp_ocp *bp, struct pci_dev *pdev) · 3997 unmodified lines
39983998 return 0;
39993999
40004000 out:
4001− ptp_ocp_dev_release(&bp->dev);
40024001 put_device(&bp->dev);
40034002 return err;
40044003 }
drivers/vhost/vringh.c+11−1
@@ -123,8 +123,18 @@ static inline ssize_t vringh_iov_xfer(struct vringh *vrh, · 122 unmodified lines
123123 done += partlen;
124124 len -= partlen;
125125 ptr += partlen;
126+ iov->consumed += partlen;
127+ iov->iov[iov->i].iov_len -= partlen;
128+ iov->iov[iov->i].iov_base += partlen;
126129
127− vringh_kiov_advance(iov, partlen);
130+ if (!iov->iov[iov->i].iov_len) {
131+ /* Fix up old iov element then increment. */
132+ iov->iov[iov->i].iov_len = iov->consumed;
133+ iov->iov[iov->i].iov_base -= iov->consumed;
134+
135+ iov->consumed = 0;
136+ iov->i++;
137+ }
128138 }
129139 return done;
130140 }
include/linux/bpf.h+1−1
@@ -1307,7 +1307,7 @@ static inline int bpf_trampoline_unlink_prog(struct bpf_tramp_link *link, · 1306 unmodified lines
13071307 static inline struct bpf_trampoline *bpf_trampoline_get(u64 key,
13081308 struct bpf_attach_target_info *tgt_info)
13091309 {
1310− return ERR_PTR(-EOPNOTSUPP);
1310+ return NULL;
13111311 }
13121312 static inline void bpf_trampoline_put(struct bpf_trampoline *tr) {}
13131313 #define DEFINE_BPF_DISPATCHER(name)
include/linux/netfilter/nf_conntrack_sctp.h+1−0
@@ -9,6 +9,7 @@ struct ip_ct_sctp { · 8 unmodified lines
99 enum sctp_conntrack state;
1010
1111 __be32 vtag[IP_CT_DIR_MAX];
12+ u8 init[IP_CT_DIR_MAX];
1213 u8 last_dir;
1314 u8 flags;
1415 };
include/net/bluetooth/hci_core.h+1−1
@@ -350,7 +350,7 @@ struct hci_dev { · 349 unmodified lines
350350 struct list_head list;
351351 struct mutex lock;
352352
353− char name[8];
353+ const char *name;
354354 unsigned long flags;
355355 __u16 id;
356356 __u8 bus;
include/net/cfg80211.h+4−2
@@ -5941,6 +5941,7 @@ void wiphy_delayed_work_cancel(struct wiphy *wiphy, · 5940 unmodified lines
59415941 * @event_lock: (private) lock for event list
59425942 * @owner_nlportid: (private) owner socket port ID
59435943 * @nl_owner_dead: (private) owner socket went away
5944+ * @cqm_rssi_work: (private) CQM RSSI reporting work
59445945 * @cqm_config: (private) nl80211 RSSI monitor state
59455946 * @pmsr_list: (private) peer measurement requests
59465947 * @pmsr_lock: (private) peer measurements requests/results lock
@@ -6013,7 +6014,8 @@ struct wireless_dev { · 66 unmodified lines
60136014 } wext;
60146015 #endif
60156016
6016− struct cfg80211_cqm_config *cqm_config;
6017+ struct wiphy_work cqm_rssi_work;
6018+ struct cfg80211_cqm_config __rcu *cqm_config;
60176019
60186020 struct list_head pmsr_list;
60196021 spinlock_t pmsr_lock;
@@ -7231,7 +7233,7 @@ struct cfg80211_rx_assoc_resp { · 1211 unmodified lines
72317233 int uapsd_queues;
72327234 const u8 *ap_mld_addr;
72337235 struct {
7234− const u8 *addr;
7236+ u8 addr[ETH_ALEN] __aligned(2);
72357237 struct cfg80211_bss *bss;
72367238 u16 status;
72377239 } links[IEEE80211_MLD_MAX_NUM_LINKS];
include/net/ip_fib.h+1−0
@@ -154,6 +154,7 @@ struct fib_info { · 153 unmodified lines
154154 int fib_nhs;
155155 bool fib_nh_is_v6;
156156 bool nh_updated;
157+ bool pfsrc_removed;
157158 struct nexthop *nh;
158159 struct rcu_head rcu;
159160 struct fib_nh fib_nh[];
include/net/mana/mana.h+3−2
@@ -103,9 +103,10 @@ struct mana_txq { · 102 unmodified lines
103103
104104 /* skb data and frags dma mappings */
105105 struct mana_skb_head {
106− dma_addr_t dma_handle[MAX_SKB_FRAGS + 1];
106+ /* GSO pkts may have 2 SGEs for the linear part*/
107+ dma_addr_t dma_handle[MAX_SKB_FRAGS + 2];
107108
108− u32 size[MAX_SKB_FRAGS + 1];
109+ u32 size[MAX_SKB_FRAGS + 2];
109110 };
110111
111112 #define MANA_HEADROOM sizeof(struct mana_skb_head)
include/net/neighbour.h+1−1
@@ -539,7 +539,7 @@ static inline int neigh_output(struct neighbour *n, struct sk_buff *skb, · 538 unmodified lines
539539 READ_ONCE(hh->hh_len))
540540 return neigh_hh_output(hh, skb);
541541
542− return n->output(n, skb);
542+ return READ_ONCE(n->output)(n, skb);
543543 }
544544
545545 static inline struct neighbour *
include/net/page_pool/helpers.h+3−3
@@ -16,13 +16,13 @@ · 15 unmodified lines
1616 * page_pool_alloc_pages() call. Drivers should use
1717 * page_pool_dev_alloc_pages() replacing dev_alloc_pages().
1818 *
19− * API keeps track of in-flight pages, in order to let API user know
19+ * The API keeps track of in-flight pages, in order to let API users know
2020 * when it is safe to free a page_pool object. Thus, API users
2121 * must call page_pool_put_page() to free the page, or attach
22− * the page to a page_pool-aware objects like skbs marked with
22+ * the page to a page_pool-aware object like skbs marked with
2323 * skb_mark_for_recycle().
2424 *
25− * API user must call page_pool_put_page() once on a page, as it
25+ * API users must call page_pool_put_page() once on a page, as it
2626 * will either recycle the page, or in case of refcnt > 1, it will
2727 * release the DMA mapping and in-flight state accounting.
2828 */
include/net/tcp.h+4−2
@@ -348,12 +348,14 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos, · 347 unmodified lines
348348 struct sk_buff *tcp_stream_alloc_skb(struct sock *sk, gfp_t gfp,
349349 bool force_schedule);
350350
351−static inline void tcp_dec_quickack_mode(struct sock *sk,
352− const unsigned int pkts)
351+static inline void tcp_dec_quickack_mode(struct sock *sk)
353352 {
354353 struct inet_connection_sock *icsk = inet_csk(sk);
355354
356355 if (icsk->icsk_ack.quick) {
356+ /* How many ACKs S/ACKing new data have we sent? */
357+ const unsigned int pkts = inet_csk_ack_scheduled(sk) ? 1 : 0;
358+
357359 if (pkts >= icsk->icsk_ack.quick) {
358360 icsk->icsk_ack.quick = 0;
359361 /* Leaving quickack mode we deflate ATO. */
kernel/bpf/memalloc.c+19−25
@@ -965,37 +965,31 @@ void notrace *bpf_mem_cache_alloc_flags(struct bpf_mem_alloc *ma, gfp_t flags) · 964 unmodified lines
965965 return !ret ? NULL : ret + LLIST_NODE_SZ;
966966 }
967967
968−/* Most of the logic is taken from setup_kmalloc_cache_index_table() */
969968 static __init int bpf_mem_cache_adjust_size(void)
970969 {
971− unsigned int size, index;
970+ unsigned int size;
972971
973− /* Normally KMALLOC_MIN_SIZE is 8-bytes, but it can be
974− * up-to 256-bytes.
972+ /* Adjusting the indexes in size_index() according to the object_size
973+ * of underlying slab cache, so bpf_mem_alloc() will select a
974+ * bpf_mem_cache with unit_size equal to the object_size of
975+ * the underlying slab cache.
976+ *
977+ * The maximal value of KMALLOC_MIN_SIZE and __kmalloc_minalign() is
978+ * 256-bytes, so only do adjustment for [8-bytes, 192-bytes].
975979 */
976− size = KMALLOC_MIN_SIZE;
977− if (size <= 192)
978− index = size_index[(size - 1) / 8];
979− else
980− index = fls(size - 1) - 1;
981− for (size = 8; size < KMALLOC_MIN_SIZE && size <= 192; size += 8)
982− size_index[(size - 1) / 8] = index;
980+ for (size = 192; size >= 8; size -= 8) {
981+ unsigned int kmalloc_size, index;
983982
984− /* The minimal alignment is 64-bytes, so disable 96-bytes cache and
985− * use 128-bytes cache instead.
986− */
987− if (KMALLOC_MIN_SIZE >= 64) {
988− index = size_index[(128 - 1) / 8];
989− for (size = 64 + 8; size <= 96; size += 8)
990− size_index[(size - 1) / 8] = index;
991− }
983+ kmalloc_size = kmalloc_size_roundup(size);
984+ if (kmalloc_size == size)
985+ continue;
992986
993− /* The minimal alignment is 128-bytes, so disable 192-bytes cache and
994− * use 256-bytes cache instead.
995− */
996− if (KMALLOC_MIN_SIZE >= 128) {
997− index = fls(256 - 1) - 1;
998− for (size = 128 + 8; size <= 192; size += 8)
987+ if (kmalloc_size <= 192)
988+ index = size_index[(kmalloc_size - 1) / 8];
989+ else
990+ index = fls(kmalloc_size - 1) - 1;
991+ /* Only overwrite if necessary */
992+ if (size_index[(size - 1) / 8] != index)
999993 size_index[(size - 1) / 8] = index;
1000994 }
1001995
kernel/bpf/mprog.c+3−0
@@ -253,6 +253,9 @@ int bpf_mprog_attach(struct bpf_mprog_entry *entry, · 252 unmodified lines
253253 goto out;
254254 }
255255 idx = tidx;
256+ } else if (bpf_mprog_total(entry) == bpf_mprog_max()) {
257+ ret = -ERANGE;
258+ goto out;
256259 }
257260 if (flags & BPF_F_BEFORE) {
258261 tidx = bpf_mprog_pos_before(entry, &rtuple);
kernel/bpf/verifier.c+3−5
@@ -4047,11 +4047,9 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) · 4046 unmodified lines
40474047 bitmap_from_u64(mask, bt_reg_mask(bt));
40484048 for_each_set_bit(i, mask, 32) {
40494049 reg = &st->frame[0]->regs[i];
4050− if (reg->type != SCALAR_VALUE) {
4051− bt_clear_reg(bt, i);
4052− continue;
4053− }
4054− reg->precise = true;
4050+ bt_clear_reg(bt, i);
4051+ if (reg->type == SCALAR_VALUE)
4052+ reg->precise = true;
40554053 }
40564054 return 0;
40574055 }
net/bluetooth/hci_conn.c+35−28
@@ -2413,34 +2413,41 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type, · 2412 unmodified lines
24132413 if (!test_bit(HCI_CONN_AUTH, &conn->flags))
24142414 goto auth;
24152415
2416− /* An authenticated FIPS approved combination key has sufficient
2417− * security for security level 4. */
2418− if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256 &&
2419− sec_level == BT_SECURITY_FIPS)
2420− goto encrypt;
2421−
2422− /* An authenticated combination key has sufficient security for
2423− security level 3. */
2424− if ((conn->key_type == HCI_LK_AUTH_COMBINATION_P192 ||
2425− conn->key_type == HCI_LK_AUTH_COMBINATION_P256) &&
2426− sec_level == BT_SECURITY_HIGH)
2427− goto encrypt;
2428−
2429− /* An unauthenticated combination key has sufficient security for
2430− security level 1 and 2. */
2431− if ((conn->key_type == HCI_LK_UNAUTH_COMBINATION_P192 ||
2432− conn->key_type == HCI_LK_UNAUTH_COMBINATION_P256) &&
2433− (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW))
2434− goto encrypt;
2435−
2436− /* A combination key has always sufficient security for the security
2437− levels 1 or 2. High security level requires the combination key
2438− is generated using maximum PIN code length (16).
2439− For pre 2.1 units. */
2440− if (conn->key_type == HCI_LK_COMBINATION &&
2441− (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW ||
2442− conn->pin_length == 16))
2443− goto encrypt;
2416+ switch (conn->key_type) {
2417+ case HCI_LK_AUTH_COMBINATION_P256:
2418+ /* An authenticated FIPS approved combination key has
2419+ * sufficient security for security level 4 or lower.
2420+ */
2421+ if (sec_level <= BT_SECURITY_FIPS)
2422+ goto encrypt;
2423+ break;
2424+ case HCI_LK_AUTH_COMBINATION_P192:
2425+ /* An authenticated combination key has sufficient security for
2426+ * security level 3 or lower.
2427+ */
2428+ if (sec_level <= BT_SECURITY_HIGH)
2429+ goto encrypt;
2430+ break;
2431+ case HCI_LK_UNAUTH_COMBINATION_P192:
2432+ case HCI_LK_UNAUTH_COMBINATION_P256:
2433+ /* An unauthenticated combination key has sufficient security
2434+ * for security level 2 or lower.
2435+ */
2436+ if (sec_level <= BT_SECURITY_MEDIUM)
2437+ goto encrypt;
2438+ break;
2439+ case HCI_LK_COMBINATION:
2440+ /* A combination key has always sufficient security for the
2441+ * security levels 2 or lower. High security level requires the
2442+ * combination key is generated using maximum PIN code length
2443+ * (16). For pre 2.1 units.
2444+ */
2445+ if (sec_level <= BT_SECURITY_MEDIUM || conn->pin_length == 16)
2446+ goto encrypt;
2447+ break;
2448+ default:
2449+ break;
2450+ }
24442451
24452452 auth:
24462453 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
net/bluetooth/hci_core.c+11−3
@@ -2617,7 +2617,11 @@ int hci_register_dev(struct hci_dev *hdev) · 2616 unmodified lines
26172617 if (id < 0)
26182618 return id;
26192619
2620− snprintf(hdev->name, sizeof(hdev->name), "hci%d", id);
2620+ error = dev_set_name(&hdev->dev, "hci%u", id);
2621+ if (error)
2622+ return error;
2623+
2624+ hdev->name = dev_name(&hdev->dev);
26212625 hdev->id = id;
26222626
26232627 BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
@@ -2639,8 +2643,6 @@ int hci_register_dev(struct hci_dev *hdev) · 15 unmodified lines
26392643 if (!IS_ERR_OR_NULL(bt_debugfs))
26402644 hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
26412645
2642− dev_set_name(&hdev->dev, "%s", hdev->name);
2643−
26442646 error = device_add(&hdev->dev);
26452647 if (error < 0)
26462648 goto err_wqueue;
@@ -2784,6 +2786,7 @@ void hci_release_dev(struct hci_dev *hdev) · 137 unmodified lines
27842786 hci_conn_params_clear_all(hdev);
27852787 hci_discovery_filter_clear(hdev);
27862788 hci_blocked_keys_clear(hdev);
2789+ hci_codec_list_clear(&hdev->local_codecs);
27872790 hci_dev_unlock(hdev);
27882791
27892792 ida_simple_remove(&hci_index_ida, hdev->id);
@@ -3418,7 +3421,12 @@ static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) · 628 unmodified lines
34183421 if (c->type == type && c->sent) {
34193422 bt_dev_err(hdev, "killing stalled connection %pMR",
34203423 &c->dst);
3424+ /* hci_disconnect might sleep, so, we have to release
3425+ * the RCU read lock before calling it.
3426+ */
3427+ rcu_read_unlock();
34213428 hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
3429+ rcu_read_lock();
34223430 }
34233431 }
34243432
net/bluetooth/hci_event.c+1−0
@@ -33,6 +33,7 @@ · 32 unmodified lines
3333
3434 #include "hci_request.h"
3535 #include "hci_debugfs.h"
36+#include "hci_codec.h"
3637 #include "a2mp.h"
3738 #include "amp.h"
3839 #include "smp.h"
net/bluetooth/hci_request.h+0−2
@@ -71,7 +71,5 @@ struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode, u32 plen, · 70 unmodified lines
7171 void hci_req_add_le_scan_disable(struct hci_request *req, bool rpa_le_conn);
7272 void hci_req_add_le_passive_scan(struct hci_request *req);
7373
74−void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next);
75−
7674 void hci_request_setup(struct hci_dev *hdev);
7775 void hci_request_cancel_all(struct hci_dev *hdev);
net/bluetooth/hci_sync.c+5−9
@@ -413,11 +413,6 @@ static int hci_le_scan_restart_sync(struct hci_dev *hdev) · 412 unmodified lines
413413 LE_SCAN_FILTER_DUP_ENABLE);
414414 }
415415
416−static int le_scan_restart_sync(struct hci_dev *hdev, void *data)
417−{
418− return hci_le_scan_restart_sync(hdev);
419−}
420−
421416 static void le_scan_restart(struct work_struct *work)
422417 {
423418 struct hci_dev *hdev = container_of(work, struct hci_dev,
@@ -427,15 +422,15 @@ static void le_scan_restart(struct work_struct *work) · 3 unmodified lines
427422
428423 bt_dev_dbg(hdev, "");
429424
430− hci_dev_lock(hdev);
431−
432− status = hci_cmd_sync_queue(hdev, le_scan_restart_sync, NULL, NULL);
425+ status = hci_le_scan_restart_sync(hdev);
433426 if (status) {
434427 bt_dev_err(hdev, "failed to restart LE scan: status %d",
435428 status);
436− goto unlock;
429+ return;
437430 }
438431
432+ hci_dev_lock(hdev);
433+
439434 if (!test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks) ||
440435 !hdev->discovery.scan_start)
441436 goto unlock;
@@ -5079,6 +5074,7 @@ int hci_dev_close_sync(struct hci_dev *hdev) · 4637 unmodified lines
50795074 memset(hdev->eir, 0, sizeof(hdev->eir));
50805075 memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
50815076 bacpy(&hdev->random_addr, BDADDR_ANY);
5077+ hci_codec_list_clear(&hdev->local_codecs);
50825078
50835079 hci_dev_put(hdev);
50845080 return err;
net/bluetooth/iso.c+6−3
@@ -502,7 +502,7 @@ drop: · 501 unmodified lines
502502 }
503503
504504 /* -------- Socket interface ---------- */
505−static struct sock *__iso_get_sock_listen_by_addr(bdaddr_t *ba)
505+static struct sock *__iso_get_sock_listen_by_addr(bdaddr_t *src, bdaddr_t *dst)
506506 {
507507 struct sock *sk;
508508
@@ -510,7 +510,10 @@ static struct sock *__iso_get_sock_listen_by_addr(bdaddr_t *ba) · 1 unmodified line
510510 if (sk->sk_state != BT_LISTEN)
511511 continue;
512512
513− if (!bacmp(&iso_pi(sk)->src, ba))
513+ if (bacmp(&iso_pi(sk)->dst, dst))
514+ continue;
515+
516+ if (!bacmp(&iso_pi(sk)->src, src))
514517 return sk;
515518 }
516519
@@ -952,7 +955,7 @@ static int iso_listen_cis(struct sock *sk) · 435 unmodified lines
952955
953956 write_lock(&iso_sk_list.lock);
954957
955− if (__iso_get_sock_listen_by_addr(&iso_pi(sk)->src))
958+ if (__iso_get_sock_listen_by_addr(&iso_pi(sk)->src, &iso_pi(sk)->dst))
956959 err = -EADDRINUSE;
957960
958961 write_unlock(&iso_sk_list.lock);
net/bridge/br_netfilter_hooks.c+1−1
@@ -294,7 +294,7 @@ int br_nf_pre_routing_finish_bridge(struct net *net, struct sock *sk, struct sk_ · 293 unmodified lines
294294 /* tell br_dev_xmit to continue with forwarding */
295295 nf_bridge->bridged_dnat = 1;
296296 /* FIXME Need to refragment */
297− ret = neigh->output(neigh, skb);
297+ ret = READ_ONCE(neigh->output)(neigh, skb);
298298 }
299299 neigh_release(neigh);
300300 return ret;
net/core/neighbour.c+8−6
@@ -410,7 +410,7 @@ static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev, · 409 unmodified lines
410410 */
411411 __skb_queue_purge(&n->arp_queue);
412412 n->arp_queue_len_bytes = 0;
413− n->output = neigh_blackhole;
413+ WRITE_ONCE(n->output, neigh_blackhole);
414414 if (n->nud_state & NUD_VALID)
415415 n->nud_state = NUD_NOARP;
416416 else
@@ -920,7 +920,7 @@ static void neigh_suspect(struct neighbour *neigh) · 503 unmodified lines
920920 {
921921 neigh_dbg(2, "neigh %p is suspected\n", neigh);
922922
923− neigh->output = neigh->ops->output;
923+ WRITE_ONCE(neigh->output, neigh->ops->output);
924924 }
925925
926926 /* Neighbour state is OK;
@@ -932,7 +932,7 @@ static void neigh_connect(struct neighbour *neigh) · 5 unmodified lines
932932 {
933933 neigh_dbg(2, "neigh %p is connected\n", neigh);
934934
935− neigh->output = neigh->ops->connected_output;
935+ WRITE_ONCE(neigh->output, neigh->ops->connected_output);
936936 }
937937
938938 static void neigh_periodic_work(struct work_struct *work)
@@ -988,7 +988,9 @@ static void neigh_periodic_work(struct work_struct *work) · 49 unmodified lines
988988 (state == NUD_FAILED ||
989989 !time_in_range_open(jiffies, n->used,
990990 n->used + NEIGH_VAR(n->parms, GC_STALETIME)))) {
991− *np = n->next;
991+ rcu_assign_pointer(*np,
992+ rcu_dereference_protected(n->next,
993+ lockdep_is_held(&tbl->lock)));
992994 neigh_mark_dead(n);
993995 write_unlock(&n->lock);
994996 neigh_cleanup_and_release(n);
@@ -1447,7 +1449,7 @@ static int __neigh_update(struct neighbour *neigh, const u8 *lladdr, · 452 unmodified lines
14471449 if (n2)
14481450 n1 = n2;
14491451 }
1450− n1->output(n1, skb);
1452+ READ_ONCE(n1->output)(n1, skb);
14511453 if (n2)
14521454 neigh_release(n2);
14531455 rcu_read_unlock();
@@ -3153,7 +3155,7 @@ int neigh_xmit(int index, struct net_device *dev, · 1699 unmodified lines
31533155 rcu_read_unlock();
31543156 goto out_kfree_skb;
31553157 }
3156− err = neigh->output(neigh, skb);
3158+ err = READ_ONCE(neigh->output)(neigh, skb);
31573159 rcu_read_unlock();
31583160 }
31593161 else if (index == NEIGH_LINK_TABLE) {
net/core/sock_map.c+4−0
@@ -668,6 +668,8 @@ BPF_CALL_4(bpf_msg_redirect_map, struct sk_msg *, msg, · 667 unmodified lines
668668 sk = __sock_map_lookup_elem(map, key);
669669 if (unlikely(!sk || !sock_map_redirect_allowed(sk)))
670670 return SK_DROP;
671+ if (!(flags & BPF_F_INGRESS) && !sk_is_tcp(sk))
672+ return SK_DROP;
671673
672674 msg->flags = flags;
673675 msg->sk_redir = sk;
@@ -1267,6 +1269,8 @@ BPF_CALL_4(bpf_msg_redirect_hash, struct sk_msg *, msg, · 593 unmodified lines
12671269 sk = __sock_hash_lookup_elem(map, key);
12681270 if (unlikely(!sk || !sock_map_redirect_allowed(sk)))
12691271 return SK_DROP;
1272+ if (!(flags & BPF_F_INGRESS) && !sk_is_tcp(sk))
1273+ return SK_DROP;
12701274
12711275 msg->flags = flags;
12721276 msg->sk_redir = sk;
net/ethtool/plca.c+29−16
@@ -21,16 +21,6 @@ struct plca_reply_data { · 20 unmodified lines
2121 #define PLCA_REPDATA(__reply_base) \
2222 container_of(__reply_base, struct plca_reply_data, base)
2323
24−static void plca_update_sint(int *dst, const struct nlattr *attr,
25− bool *mod)
26−{
27− if (!attr)
28− return;
29−
30− *dst = nla_get_u32(attr);
31− *mod = true;
32−}
33−
3424 // PLCA get configuration message ------------------------------------------- //
3525
3626 const struct nla_policy ethnl_plca_get_cfg_policy[] = {
@@ -38,6 +28,29 @@ const struct nla_policy ethnl_plca_get_cfg_policy[] = { · 1 unmodified line
3828 NLA_POLICY_NESTED(ethnl_header_policy),
3929 };
4030
31+static void plca_update_sint(int *dst, struct nlattr **tb, u32 attrid,
32+ bool *mod)
33+{
34+ const struct nlattr *attr = tb[attrid];
35+
36+ if (!attr ||
37+ WARN_ON_ONCE(attrid >= ARRAY_SIZE(ethnl_plca_set_cfg_policy)))
38+ return;
39+
40+ switch (ethnl_plca_set_cfg_policy[attrid].type) {
41+ case NLA_U8:
42+ *dst = nla_get_u8(attr);
43+ break;
44+ case NLA_U32:
45+ *dst = nla_get_u32(attr);
46+ break;
47+ default:
48+ WARN_ON_ONCE(1);
49+ }
50+
51+ *mod = true;
52+}
53+
4154 static int plca_get_cfg_prepare_data(const struct ethnl_req_info *req_base,
4255 struct ethnl_reply_data *reply_base,
4356 const struct genl_info *info)
@@ -144,13 +157,13 @@ ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info) · 100 unmodified lines
144157 return -EOPNOTSUPP;
145158
146159 memset(&plca_cfg, 0xff, sizeof(plca_cfg));
147− plca_update_sint(&plca_cfg.enabled, tb[ETHTOOL_A_PLCA_ENABLED], &mod);
148− plca_update_sint(&plca_cfg.node_id, tb[ETHTOOL_A_PLCA_NODE_ID], &mod);
149− plca_update_sint(&plca_cfg.node_cnt, tb[ETHTOOL_A_PLCA_NODE_CNT], &mod);
150− plca_update_sint(&plca_cfg.to_tmr, tb[ETHTOOL_A_PLCA_TO_TMR], &mod);
151− plca_update_sint(&plca_cfg.burst_cnt, tb[ETHTOOL_A_PLCA_BURST_CNT],
160+ plca_update_sint(&plca_cfg.enabled, tb, ETHTOOL_A_PLCA_ENABLED, &mod);
161+ plca_update_sint(&plca_cfg.node_id, tb, ETHTOOL_A_PLCA_NODE_ID, &mod);
162+ plca_update_sint(&plca_cfg.node_cnt, tb, ETHTOOL_A_PLCA_NODE_CNT, &mod);
163+ plca_update_sint(&plca_cfg.to_tmr, tb, ETHTOOL_A_PLCA_TO_TMR, &mod);
164+ plca_update_sint(&plca_cfg.burst_cnt, tb, ETHTOOL_A_PLCA_BURST_CNT,
152165 &mod);
153− plca_update_sint(&plca_cfg.burst_tmr, tb[ETHTOOL_A_PLCA_BURST_TMR],
166+ plca_update_sint(&plca_cfg.burst_tmr, tb, ETHTOOL_A_PLCA_BURST_TMR,
154167 &mod);
155168 if (!mod)
156169 return 0;
net/ipv4/fib_semantics.c+1−0
@@ -1887,6 +1887,7 @@ int fib_sync_down_addr(struct net_device *dev, __be32 local) · 1886 unmodified lines
18871887 continue;
18881888 if (fi->fib_prefsrc == local) {
18891889 fi->fib_flags |= RTNH_F_DEAD;
1890+ fi->pfsrc_removed = true;
18901891 ret++;
18911892 }
18921893 }
net/ipv4/fib_trie.c+4−0
@@ -2027,6 +2027,7 @@ void fib_table_flush_external(struct fib_table *tb) · 2026 unmodified lines
20272027 int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)
20282028 {
20292029 struct trie *t = (struct trie *)tb->tb_data;
2030+ struct nl_info info = { .nl_net = net };
20302031 struct key_vector *pn = t->kv;
20312032 unsigned long cindex = 1;
20322033 struct hlist_node *tmp;
@@ -2089,6 +2090,9 @@ int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all) · 56 unmodified lines
20892090
20902091 fib_notify_alias_delete(net, n->key, &n->leaf, fa,
20912092 NULL);
2093+ if (fi->pfsrc_removed)
2094+ rtmsg_fib(RTM_DELROUTE, htonl(n->key), fa,
2095+ KEYLENGTH - fa->fa_slen, tb->tb_id, &info, 0);
20922096 hlist_del_rcu(&fa->fa_list);
20932097 fib_release_info(fa->fa_info);
20942098 alias_free_mem_rcu(fa);
net/ipv4/route.c+2−0
@@ -3417,6 +3417,8 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, · 3416 unmodified lines
34173417 fa->fa_type == fri.type) {
34183418 fri.offload = READ_ONCE(fa->offload);
34193419 fri.trap = READ_ONCE(fa->trap);
3420+ fri.offload_failed =
3421+ READ_ONCE(fa->offload_failed);
34203422 break;
34213423 }
34223424 }
net/ipv4/tcp.c+2−8
@@ -1621,16 +1621,13 @@ EXPORT_SYMBOL(tcp_read_sock); · 1620 unmodified lines
16211621
16221622 int tcp_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
16231623 {
1624− struct tcp_sock *tp = tcp_sk(sk);
1625− u32 seq = tp->copied_seq;
16261624 struct sk_buff *skb;
16271625 int copied = 0;
1628− u32 offset;
16291626
16301627 if (sk->sk_state == TCP_LISTEN)
16311628 return -ENOTCONN;
16321629
1633− while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) {
1630+ while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
16341631 u8 tcp_flags;
16351632 int used;
16361633
@@ -1643,13 +1640,10 @@ int tcp_read_skb(struct sock *sk, skb_read_actor_t recv_actor) · 6 unmodified lines
16431640 copied = used;
16441641 break;
16451642 }
1646− seq += used;
16471643 copied += used;
16481644
1649− if (tcp_flags & TCPHDR_FIN) {
1650− ++seq;
1645+ if (tcp_flags & TCPHDR_FIN)
16511646 break;
1652− }
16531647 }
16541648 return copied;
16551649 }
net/ipv4/tcp_bpf.c+3−1
@@ -222,6 +222,7 @@ static int tcp_bpf_recvmsg_parser(struct sock *sk, · 221 unmodified lines
222222 int *addr_len)
223223 {
224224 struct tcp_sock *tcp = tcp_sk(sk);
225+ int peek = flags & MSG_PEEK;
225226 u32 seq = tcp->copied_seq;
226227 struct sk_psock *psock;
227228 int copied = 0;
@@ -311,7 +312,8 @@ msg_bytes_ready: · 83 unmodified lines
311312 copied = -EAGAIN;
312313 }
313314 out:
314− WRITE_ONCE(tcp->copied_seq, seq);
315+ if (!peek)
316+ WRITE_ONCE(tcp->copied_seq, seq);
315317 tcp_rcv_space_adjust(sk);
316318 if (copied > 0)
317319 __tcp_cleanup_rbuf(sk, copied);
net/ipv4/tcp_input.c+13−0
@@ -253,6 +253,19 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb) · 252 unmodified lines
253253 if (unlikely(len > icsk->icsk_ack.rcv_mss +
254254 MAX_TCP_OPTION_SPACE))
255255 tcp_gro_dev_warn(sk, skb, len);
256+ /* If the skb has a len of exactly 1*MSS and has the PSH bit
257+ * set then it is likely the end of an application write. So
258+ * more data may not be arriving soon, and yet the data sender
259+ * may be waiting for an ACK if cwnd-bound or using TX zero
260+ * copy. So we set ICSK_ACK_PUSHED here so that
261+ * tcp_cleanup_rbuf() will send an ACK immediately if the app
262+ * reads all of the data and is not ping-pong. If len > MSS
263+ * then this logic does not matter (and does not hurt) because
264+ * tcp_cleanup_rbuf() will always ACK immediately if the app
265+ * reads data and there is more than an MSS of unACKed data.
266+ */
267+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_PSH)
268+ icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
256269 } else {
257270 /* Otherwise, we make more careful check taking into account,
258271 * that SACKs block is variable.
net/ipv4/tcp_output.c+3−4
@@ -177,8 +177,7 @@ static void tcp_event_data_sent(struct tcp_sock *tp, · 176 unmodified lines
177177 }
178178
179179 /* Account for an ACK we sent. */
180−static inline void tcp_event_ack_sent(struct sock *sk, unsigned int pkts,
181− u32 rcv_nxt)
180+static inline void tcp_event_ack_sent(struct sock *sk, u32 rcv_nxt)
182181 {
183182 struct tcp_sock *tp = tcp_sk(sk);
184183
@@ -192,7 +191,7 @@ static inline void tcp_event_ack_sent(struct sock *sk, unsigned int pkts, · 7 unmodified lines
192191
193192 if (unlikely(rcv_nxt != tp->rcv_nxt))
194193 return; /* Special ACK sent by DCTCP to reflect ECN */
195− tcp_dec_quickack_mode(sk, pkts);
194+ tcp_dec_quickack_mode(sk);
196195 inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK);
197196 }
198197
@@ -1387,7 +1386,7 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, · 1188 unmodified lines
13871386 sk, skb);
13881387
13891388 if (likely(tcb->tcp_flags & TCPHDR_ACK))
1390− tcp_event_ack_sent(sk, tcp_skb_pcount(skb), rcv_nxt);
1389+ tcp_event_ack_sent(sk, rcv_nxt);
13911390
13921391 if (skb->len != tcp_header_size) {
13931392 tcp_event_data_sent(tp, sk);
net/ipv6/tcp_ipv6.c+7−3
@@ -1640,9 +1640,12 @@ process: · 1639 unmodified lines
16401640 struct sock *nsk;
16411641
16421642 sk = req->rsk_listener;
1643− drop_reason = tcp_inbound_md5_hash(sk, skb,
1644− &hdr->saddr, &hdr->daddr,
1645− AF_INET6, dif, sdif);
1643+ if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1644+ drop_reason = SKB_DROP_REASON_XFRM_POLICY;
1645+ else
1646+ drop_reason = tcp_inbound_md5_hash(sk, skb,
1647+ &hdr->saddr, &hdr->daddr,
1648+ AF_INET6, dif, sdif);
16461649 if (drop_reason) {
16471650 sk_drops_add(sk, skb);
16481651 reqsk_put(req);
@@ -1689,6 +1692,7 @@ process: · 40 unmodified lines
16891692 }
16901693 goto discard_and_relse;
16911694 }
1695+ nf_reset_ct(skb);
16921696 if (nsk == sk) {
16931697 reqsk_put(req);
16941698 tcp_v6_restore_cb(skb);
net/l2tp/l2tp_ip6.c+1−1
@@ -507,7 +507,6 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) · 506 unmodified lines
507507 */
508508 if (len > INT_MAX - transhdrlen)
509509 return -EMSGSIZE;
510− ulen = len + transhdrlen;
511510
512511 /* Mirror BSD error message compatibility */
513512 if (msg->msg_flags & MSG_OOB)
@@ -628,6 +627,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) · 114 unmodified lines
628627
629628 back_from_confirm:
630629 lock_sock(sk);
630+ ulen = len + skb_queue_empty(&sk->sk_write_queue) ? transhdrlen : 0;
631631 err = ip6_append_data(sk, ip_generic_getfrag, msg,
632632 ulen, transhdrlen, &ipc6,
633633 &fl6, (struct rt6_info *)dst,
net/mac80211/cfg.c+5−1
@@ -566,6 +566,9 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev, · 565 unmodified lines
566566 }
567567
568568 err = ieee80211_key_link(key, link, sta);
569+ /* KRACK protection, shouldn't happen but just silently accept key */
570+ if (err == -EALREADY)
571+ err = 0;
569572
570573 out_unlock:
571574 mutex_unlock(&local->sta_mtx);
@@ -1857,7 +1860,8 @@ static int sta_link_apply_parameters(struct ieee80211_local *local, · 1285 unmodified lines
18571860 /* VHT can override some HT caps such as the A-MSDU max length */
18581861 if (params->vht_capa)
18591862 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1860− params->vht_capa, link_sta);
1863+ params->vht_capa, NULL,
1864+ link_sta);
18611865
18621866 if (params->he_capa)
18631867 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband,
net/mac80211/ibss.c+1−1
@@ -1072,7 +1072,7 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata, · 1071 unmodified lines
10721072 &chandef);
10731073 memcpy(&cap_ie, elems->vht_cap_elem, sizeof(cap_ie));
10741074 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1075− &cap_ie,
1075+ &cap_ie, NULL,
10761076 &sta->deflink);
10771077 if (memcmp(&cap, &sta->sta.deflink.vht_cap, sizeof(cap)))
10781078 rates_updated |= true;
net/mac80211/ieee80211_i.h+2−1
@@ -676,7 +676,7 @@ struct ieee80211_if_mesh { · 675 unmodified lines
676676 struct timer_list mesh_path_root_timer;
677677
678678 unsigned long wrkq_flags;
679− unsigned long mbss_changed;
679+ unsigned long mbss_changed[64 / BITS_PER_LONG];
680680
681681 bool userspace_handles_dfs;
682682
@@ -2141,6 +2141,7 @@ void · 1458 unmodified lines
21412141 ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
21422142 struct ieee80211_supported_band *sband,
21432143 const struct ieee80211_vht_cap *vht_cap_ie,
2144+ const struct ieee80211_vht_cap *vht_cap_ie2,
21442145 struct link_sta_info *link_sta);
21452146 enum ieee80211_sta_rx_bandwidth
21462147 ieee80211_sta_cap_rx_bw(struct link_sta_info *link_sta);
net/mac80211/key.c+16−6
@@ -802,6 +802,9 @@ static void ieee80211_key_destroy(struct ieee80211_key *key, · 801 unmodified lines
802802
803803 void ieee80211_key_free_unused(struct ieee80211_key *key)
804804 {
805+ if (!key)
806+ return;
807+
805808 WARN_ON(key->sdata || key->local);
806809 ieee80211_key_free_common(key);
807810 }
@@ -854,7 +857,7 @@ int ieee80211_key_link(struct ieee80211_key *key, · 46 unmodified lines
854857 * can cause warnings to appear.
855858 */
856859 bool delay_tailroom = sdata->vif.type == NL80211_IFTYPE_STATION;
857− int ret = -EOPNOTSUPP;
860+ int ret;
858861
859862 mutex_lock(&sdata->local->key_mtx);
860863
@@ -868,8 +871,10 @@ int ieee80211_key_link(struct ieee80211_key *key, · 7 unmodified lines
868871 * the same cipher. Enforce the assumption for pairwise keys.
869872 */
870873 if ((alt_key && alt_key->conf.cipher != key->conf.cipher) ||
871− (old_key && old_key->conf.cipher != key->conf.cipher))
874+ (old_key && old_key->conf.cipher != key->conf.cipher)) {
875+ ret = -EOPNOTSUPP;
872876 goto out;
877+ }
873878 } else if (sta) {
874879 struct link_sta_info *link_sta = &sta->deflink;
875880 int link_id = key->conf.link_id;
@@ -895,8 +900,10 @@ int ieee80211_key_link(struct ieee80211_key *key, · 19 unmodified lines
895900
896901 /* Non-pairwise keys must also not switch the cipher on rekey */
897902 if (!pairwise) {
898− if (old_key && old_key->conf.cipher != key->conf.cipher)
903+ if (old_key && old_key->conf.cipher != key->conf.cipher) {
904+ ret = -EOPNOTSUPP;
899905 goto out;
906+ }
900907 }
901908
902909 /*
@@ -904,9 +911,8 @@ int ieee80211_key_link(struct ieee80211_key *key, · 1 unmodified line
904911 * new version of the key to avoid nonce reuse or replay issues.
905912 */
906913 if (ieee80211_key_identical(sdata, old_key, key)) {
907− ieee80211_key_free_unused(key);
908− ret = 0;
909− goto out;
914+ ret = -EALREADY;
915+ goto unlock;
910916 }
911917
912918 key->local = sdata->local;
@@ -930,7 +936,11 @@ int ieee80211_key_link(struct ieee80211_key *key, · 17 unmodified lines
930936 ieee80211_key_free(key, delay_tailroom);
931937 }
932938
939+ key = NULL;
940+
933941 out:
942+ ieee80211_key_free_unused(key);
943+ unlock:
934944 mutex_unlock(&sdata->local->key_mtx);
935945
936946 return ret;
net/mac80211/mesh.c+4−4
@@ -1175,7 +1175,7 @@ void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata, · 1174 unmodified lines
11751175
11761176 /* if we race with running work, worst case this work becomes a noop */
11771177 for_each_set_bit(bit, &bits, sizeof(changed) * BITS_PER_BYTE)
1178− set_bit(bit, &ifmsh->mbss_changed);
1178+ set_bit(bit, ifmsh->mbss_changed);
11791179 set_bit(MESH_WORK_MBSS_CHANGED, &ifmsh->wrkq_flags);
11801180 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);
11811181 }
@@ -1257,7 +1257,7 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) · 75 unmodified lines
12571257
12581258 /* clear any mesh work (for next join) we may have accrued */
12591259 ifmsh->wrkq_flags = 0;
1260− ifmsh->mbss_changed = 0;
1260+ memset(ifmsh->mbss_changed, 0, sizeof(ifmsh->mbss_changed));
12611261
12621262 local->fif_other_bss--;
12631263 atomic_dec(&local->iff_allmultis);
@@ -1724,9 +1724,9 @@ static void mesh_bss_info_changed(struct ieee80211_sub_if_data *sdata) · 460 unmodified lines
17241724 u32 bit;
17251725 u64 changed = 0;
17261726
1727− for_each_set_bit(bit, &ifmsh->mbss_changed,
1727+ for_each_set_bit(bit, ifmsh->mbss_changed,
17281728 sizeof(changed) * BITS_PER_BYTE) {
1729− clear_bit(bit, &ifmsh->mbss_changed);
1729+ clear_bit(bit, ifmsh->mbss_changed);
17301730 changed |= BIT(bit);
17311731 }
17321732
net/mac80211/mesh_plink.c+1−1
@@ -451,7 +451,7 @@ static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata, · 450 unmodified lines
451451 changed |= IEEE80211_RC_BW_CHANGED;
452452
453453 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
454− elems->vht_cap_elem,
454+ elems->vht_cap_elem, NULL,
455455 &sta->deflink);
456456
457457 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, elems->he_cap,
net/mac80211/mlme.c+35−10
@@ -4202,10 +4202,33 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link, · 4201 unmodified lines
42024202 elems->ht_cap_elem,
42034203 link_sta);
42044204
4205− if (elems->vht_cap_elem && !(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_VHT))
4205+ if (elems->vht_cap_elem &&
4206+ !(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_VHT)) {
4207+ const struct ieee80211_vht_cap *bss_vht_cap = NULL;
4208+ const struct cfg80211_bss_ies *ies;
4209+
4210+ /*
4211+ * Cisco AP module 9115 with FW 17.3 has a bug and sends a
4212+ * too large maximum MPDU length in the association response
4213+ * (indicating 12k) that it cannot actually process ...
4214+ * Work around that.
4215+ */
4216+ rcu_read_lock();
4217+ ies = rcu_dereference(cbss->ies);
4218+ if (ies) {
4219+ const struct element *elem;
4220+
4221+ elem = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY,
4222+ ies->data, ies->len);
4223+ if (elem && elem->datalen >= sizeof(*bss_vht_cap))
4224+ bss_vht_cap = (const void *)elem->data;
4225+ }
4226+
42064227 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
42074228 elems->vht_cap_elem,
4208− link_sta);
4229+ bss_vht_cap, link_sta);
4230+ rcu_read_unlock();
4231+ }
42094232
42104233 if (elems->he_operation && !(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_HE) &&
42114234 elems->he_cap) {
@@ -5107,9 +5130,10 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, · 895 unmodified lines
51075130 continue;
51085131
51095132 valid_links |= BIT(link_id);
5110− if (assoc_data->link[link_id].disabled) {
5133+ if (assoc_data->link[link_id].disabled)
51115134 dormant_links |= BIT(link_id);
5112− } else if (link_id != assoc_data->assoc_link_id) {
5135+
5136+ if (link_id != assoc_data->assoc_link_id) {
51135137 err = ieee80211_sta_allocate_link(sta, link_id);
51145138 if (err)
51155139 goto out_err;
@@ -5124,7 +5148,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, · 8 unmodified lines
51245148 struct ieee80211_link_data *link;
51255149 struct link_sta_info *link_sta;
51265150
5127− if (!cbss || assoc_data->link[link_id].disabled)
5151+ if (!cbss)
51285152 continue;
51295153
51305154 link = sdata_dereference(sdata->link[link_id], sdata);
@@ -5429,17 +5453,18 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, · 298 unmodified lines
54295453 for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
54305454 struct ieee80211_link_data *link;
54315455
5432− link = sdata_dereference(sdata->link[link_id], sdata);
5433− if (!link)
5434− continue;
5435−
54365456 if (!assoc_data->link[link_id].bss)
54375457 continue;
54385458
54395459 resp.links[link_id].bss = assoc_data->link[link_id].bss;
5440− resp.links[link_id].addr = link->conf->addr;
5460+ ether_addr_copy(resp.links[link_id].addr,
5461+ assoc_data->link[link_id].addr);
54415462 resp.links[link_id].status = assoc_data->link[link_id].status;
54425463
5464+ link = sdata_dereference(sdata->link[link_id], sdata);
5465+ if (!link)
5466+ continue;
5467+
54435468 /* get uapsd queues configuration - same for all links */
54445469 resp.uapsd_queues = 0;
54455470 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
net/mac80211/tx.c+2−1
@@ -665,7 +665,8 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) · 664 unmodified lines
665665 }
666666
667667 if (unlikely(tx->key && tx->key->flags & KEY_FLAG_TAINTED &&
668− !ieee80211_is_deauth(hdr->frame_control)))
668+ !ieee80211_is_deauth(hdr->frame_control)) &&
669+ tx->skb->protocol != tx->sdata->control_port_protocol)
669670 return TX_DROP;
670671
671672 if (!skip_hw && tx->key &&
net/mac80211/vht.c+14−2
@@ -4,7 +4,7 @@ · 3 unmodified lines
44 *
55 * Portions of this file
66 * Copyright(c) 2015 - 2016 Intel Deutschland GmbH
7− * Copyright (C) 2018 - 2022 Intel Corporation
7+ * Copyright (C) 2018 - 2023 Intel Corporation
88 */
99
1010 #include <linux/ieee80211.h>
@@ -116,12 +116,14 @@ void · 105 unmodified lines
116116 ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
117117 struct ieee80211_supported_band *sband,
118118 const struct ieee80211_vht_cap *vht_cap_ie,
119+ const struct ieee80211_vht_cap *vht_cap_ie2,
119120 struct link_sta_info *link_sta)
120121 {
121122 struct ieee80211_sta_vht_cap *vht_cap = &link_sta->pub->vht_cap;
122123 struct ieee80211_sta_vht_cap own_cap;
123124 u32 cap_info, i;
124125 bool have_80mhz;
126+ u32 mpdu_len;
125127
126128 memset(vht_cap, 0, sizeof(*vht_cap));
127129
@@ -317,11 +319,21 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata, · 189 unmodified lines
317319
318320 link_sta->pub->bandwidth = ieee80211_sta_cur_vht_bw(link_sta);
319321
322+ /*
323+ * Work around the Cisco 9115 FW 17.3 bug by taking the min of
324+ * both reported MPDU lengths.
325+ */
326+ mpdu_len = vht_cap->cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK;
327+ if (vht_cap_ie2)
328+ mpdu_len = min_t(u32, mpdu_len,
329+ le32_get_bits(vht_cap_ie2->vht_cap_info,
330+ IEEE80211_VHT_CAP_MAX_MPDU_MASK));
331+
320332 /*
321333 * FIXME - should the amsdu len be per link? store per link
322334 * and maintain a minimum?
323335 */
324− switch (vht_cap->cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK) {
336+ switch (mpdu_len) {
325337 case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454:
326338 link_sta->pub->agg.max_amsdu_len = IEEE80211_MAX_MPDU_LEN_VHT_11454;
327339 break;
net/mptcp/pm_userspace.c+0−6
@@ -307,12 +307,6 @@ int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info) · 306 unmodified lines
307307 goto create_err;
308308 }
309309
310− if (addr_l.id == 0) {
311− NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id");
312− err = -EINVAL;
313− goto create_err;
314− }
315−
316310 err = mptcp_pm_parse_addr(raddr, info, &addr_r);
317311 if (err < 0) {
318312 NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
net/mptcp/protocol.c+14−14
@@ -3425,24 +3425,21 @@ static void schedule_3rdack_retransmission(struct sock *ssk) · 3424 unmodified lines
34253425 sk_reset_timer(ssk, &icsk->icsk_delack_timer, timeout);
34263426 }
34273427
3428−void mptcp_subflow_process_delegated(struct sock *ssk)
3428+void mptcp_subflow_process_delegated(struct sock *ssk, long status)
34293429 {
34303430 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
34313431 struct sock *sk = subflow->conn;
34323432
3433− if (test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) {
3433+ if (status & BIT(MPTCP_DELEGATE_SEND)) {
34343434 mptcp_data_lock(sk);
34353435 if (!sock_owned_by_user(sk))
34363436 __mptcp_subflow_push_pending(sk, ssk, true);
34373437 else
34383438 __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags);
34393439 mptcp_data_unlock(sk);
3440− mptcp_subflow_delegated_done(subflow, MPTCP_DELEGATE_SEND);
34413440 }
3442− if (test_bit(MPTCP_DELEGATE_ACK, &subflow->delegated_status)) {
3441+ if (status & BIT(MPTCP_DELEGATE_ACK))
34433442 schedule_3rdack_retransmission(ssk);
3444− mptcp_subflow_delegated_done(subflow, MPTCP_DELEGATE_ACK);
3445− }
34463443 }
34473444
34483445 static int mptcp_hash(struct sock *sk)
@@ -3968,14 +3965,17 @@ static int mptcp_napi_poll(struct napi_struct *napi, int budget) · 519 unmodified lines
39683965 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
39693966
39703967 bh_lock_sock_nested(ssk);
3971− if (!sock_owned_by_user(ssk) &&
3972− mptcp_subflow_has_delegated_action(subflow))
3973− mptcp_subflow_process_delegated(ssk);
3974− /* ... elsewhere tcp_release_cb_override already processed
3975− * the action or will do at next release_sock().
3976− * In both case must dequeue the subflow here - on the same
3977− * CPU that scheduled it.
3978− */
3968+ if (!sock_owned_by_user(ssk)) {
3969+ mptcp_subflow_process_delegated(ssk, xchg(&subflow->delegated_status, 0));
3970+ } else {
3971+ /* tcp_release_cb_override already processed
3972+ * the action or will do at next release_sock().
3973+ * In both case must dequeue the subflow here - on the same
3974+ * CPU that scheduled it.
3975+ */
3976+ smp_wmb();
3977+ clear_bit(MPTCP_DELEGATE_SCHEDULED, &subflow->delegated_status);
3978+ }
39793979 bh_unlock_sock(ssk);
39803980 sock_put(ssk);
39813981
net/mptcp/protocol.h+12−23
@@ -444,9 +444,11 @@ struct mptcp_delegated_action { · 443 unmodified lines
444444
445445 DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
446446
447−#define MPTCP_DELEGATE_SEND 0
448−#define MPTCP_DELEGATE_ACK 1
447+#define MPTCP_DELEGATE_SCHEDULED 0
448+#define MPTCP_DELEGATE_SEND 1
449+#define MPTCP_DELEGATE_ACK 2
449450
451+#define MPTCP_DELEGATE_ACTIONS_MASK (~BIT(MPTCP_DELEGATE_SCHEDULED))
450452 /* MPTCP subflow context */
451453 struct mptcp_subflow_context {
452454 struct list_head node;/* conn_list of subflows */
@@ -564,23 +566,24 @@ mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow) · 111 unmodified lines
564566 return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
565567 }
566568
567−void mptcp_subflow_process_delegated(struct sock *ssk);
569+void mptcp_subflow_process_delegated(struct sock *ssk, long actions);
568570
569571 static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow, int action)
570572 {
573+ long old, set_bits = BIT(MPTCP_DELEGATE_SCHEDULED) | BIT(action);
571574 struct mptcp_delegated_action *delegated;
572575 bool schedule;
573576
574577 /* the caller held the subflow bh socket lock */
575578 lockdep_assert_in_softirq();
576579
577− /* The implied barrier pairs with mptcp_subflow_delegated_done(), and
578− * ensures the below list check sees list updates done prior to status
579− * bit changes
580+ /* The implied barrier pairs with tcp_release_cb_override()
581+ * mptcp_napi_poll(), and ensures the below list check sees list
582+ * updates done prior to delegated status bits changes
580583 */
581− if (!test_and_set_bit(action, &subflow->delegated_status)) {
582− /* still on delegated list from previous scheduling */
583− if (!list_empty(&subflow->delegated_node))
584+ old = set_mask_bits(&subflow->delegated_status, 0, set_bits);
585+ if (!(old & BIT(MPTCP_DELEGATE_SCHEDULED))) {
586+ if (WARN_ON_ONCE(!list_empty(&subflow->delegated_node)))
584587 return;
585588
586589 delegated = this_cpu_ptr(&mptcp_delegated_actions);
@@ -605,20 +608,6 @@ mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated) · 18 unmodified lines
605608 return ret;
606609 }
607610
608−static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_subflow_context *subflow)
609−{
610− return !!READ_ONCE(subflow->delegated_status);
611−}
612−
613−static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *subflow, int action)
614−{
615− /* pairs with mptcp_subflow_delegate, ensures delegate_node is updated before
616− * touching the status bit
617− */
618− smp_wmb();
619− clear_bit(action, &subflow->delegated_status);
620−}
621−
622611 int mptcp_is_enabled(const struct net *net);
623612 unsigned int mptcp_get_add_addr_timeout(const struct net *net);
624613 int mptcp_is_checksum_enabled(const struct net *net);
net/mptcp/subflow.c+8−2
@@ -1956,9 +1956,15 @@ static void subflow_ulp_clone(const struct request_sock *req, · 1955 unmodified lines
19561956 static void tcp_release_cb_override(struct sock *ssk)
19571957 {
19581958 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
1959+ long status;
19591960
1960− if (mptcp_subflow_has_delegated_action(subflow))
1961− mptcp_subflow_process_delegated(ssk);
1961+ /* process and clear all the pending actions, but leave the subflow into
1962+ * the napi queue. To respect locking, only the same CPU that originated
1963+ * the action can touch the list. mptcp_napi_poll will take care of it.
1964+ */
1965+ status = set_mask_bits(&subflow->delegated_status, MPTCP_DELEGATE_ACTIONS_MASK, 0);
1966+ if (status)
1967+ mptcp_subflow_process_delegated(ssk, status);
19621968
19631969 tcp_release_cb(ssk);
19641970 }
net/netfilter/ipvs/ip_vs_sync.c+4−4
@@ -1439,7 +1439,7 @@ static int bind_mcastif_addr(struct socket *sock, struct net_device *dev) · 1438 unmodified lines
14391439 sin.sin_addr.s_addr = addr;
14401440 sin.sin_port = 0;
14411441
1442− return sock->ops->bind(sock, (struct sockaddr*)&sin, sizeof(sin));
1442+ return kernel_bind(sock, (struct sockaddr *)&sin, sizeof(sin));
14431443 }
14441444
14451445 static void get_mcast_sockaddr(union ipvs_sockaddr *sa, int *salen,
@@ -1505,8 +1505,8 @@ static int make_send_sock(struct netns_ipvs *ipvs, int id, · 59 unmodified lines
15051505 }
15061506
15071507 get_mcast_sockaddr(&mcast_addr, &salen, &ipvs->mcfg, id);
1508− result = sock->ops->connect(sock, (struct sockaddr *) &mcast_addr,
1509− salen, 0);
1508+ result = kernel_connect(sock, (struct sockaddr *)&mcast_addr,
1509+ salen, 0);
15101510 if (result < 0) {
15111511 pr_err("Error connecting to the multicast addr\n");
15121512 goto error;
@@ -1546,7 +1546,7 @@ static int make_receive_sock(struct netns_ipvs *ipvs, int id, · 33 unmodified lines
15461546
15471547 get_mcast_sockaddr(&mcast_addr, &salen, &ipvs->bcfg, id);
15481548 sock->sk->sk_bound_dev_if = dev->ifindex;
1549− result = sock->ops->bind(sock, (struct sockaddr *)&mcast_addr, salen);
1549+ result = kernel_bind(sock, (struct sockaddr *)&mcast_addr, salen);
15501550 if (result < 0) {
15511551 pr_err("Error binding to the multicast addr\n");
15521552 goto error;
net/netfilter/nf_conntrack_proto_sctp.c+33−10
@@ -112,7 +112,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { · 111 unmodified lines
112112 /* shutdown_ack */ {sSA, sCL, sCW, sCE, sES, sSA, sSA, sSA, sSA},
113113 /* error */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL},/* Can't have Stale cookie*/
114114 /* cookie_echo */ {sCL, sCL, sCE, sCE, sES, sSS, sSR, sSA, sCL},/* 5.2.4 - Big TODO */
115−/* cookie_ack */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL},/* Can't come in orig dir */
115+/* cookie_ack */ {sCL, sCL, sCW, sES, sES, sSS, sSR, sSA, sCL},/* Can't come in orig dir */
116116 /* shutdown_comp*/ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sCL, sCL},
117117 /* heartbeat */ {sHS, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS},
118118 /* heartbeat_ack*/ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS},
@@ -126,7 +126,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { · 7 unmodified lines
126126 /* shutdown */ {sIV, sCL, sCW, sCE, sSR, sSS, sSR, sSA, sIV},
127127 /* shutdown_ack */ {sIV, sCL, sCW, sCE, sES, sSA, sSA, sSA, sIV},
128128 /* error */ {sIV, sCL, sCW, sCL, sES, sSS, sSR, sSA, sIV},
129−/* cookie_echo */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV},/* Can't come in reply dir */
129+/* cookie_echo */ {sIV, sCL, sCE, sCE, sES, sSS, sSR, sSA, sIV},/* Can't come in reply dir */
130130 /* cookie_ack */ {sIV, sCL, sCW, sES, sES, sSS, sSR, sSA, sIV},
131131 /* shutdown_comp*/ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sCL, sIV},
132132 /* heartbeat */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS},
@@ -412,6 +412,9 @@ int nf_conntrack_sctp_packet(struct nf_conn *ct, · 279 unmodified lines
412412 /* (D) vtag must be same as init_vtag as found in INIT_ACK */
413413 if (sh->vtag != ct->proto.sctp.vtag[dir])
414414 goto out_unlock;
415+ } else if (sch->type == SCTP_CID_COOKIE_ACK) {
416+ ct->proto.sctp.init[dir] = 0;
417+ ct->proto.sctp.init[!dir] = 0;
415418 } else if (sch->type == SCTP_CID_HEARTBEAT) {
416419 if (ct->proto.sctp.vtag[dir] == 0) {
417420 pr_debug("Setting %d vtag %x for dir %d\n", sch->type, sh->vtag, dir);
@@ -461,16 +464,18 @@ int nf_conntrack_sctp_packet(struct nf_conn *ct, · 43 unmodified lines
461464 }
462465
463466 /* If it is an INIT or an INIT ACK note down the vtag */
464− if (sch->type == SCTP_CID_INIT ||
465− sch->type == SCTP_CID_INIT_ACK) {
466− struct sctp_inithdr _inithdr, *ih;
467+ if (sch->type == SCTP_CID_INIT) {
468+ struct sctp_inithdr _ih, *ih;
467469
468− ih = skb_header_pointer(skb, offset + sizeof(_sch),
469− sizeof(_inithdr), &_inithdr);
470− if (ih == NULL)
470+ ih = skb_header_pointer(skb, offset + sizeof(_sch), sizeof(*ih), &_ih);
471+ if (!ih)
471472 goto out_unlock;
472− pr_debug("Setting vtag %x for dir %d\n",
473− ih->init_tag, !dir);
473+
474+ if (ct->proto.sctp.init[dir] && ct->proto.sctp.init[!dir])
475+ ct->proto.sctp.init[!dir] = 0;
476+ ct->proto.sctp.init[dir] = 1;
477+
478+ pr_debug("Setting vtag %x for dir %d\n", ih->init_tag, !dir);
474479 ct->proto.sctp.vtag[!dir] = ih->init_tag;
475480
476481 /* don't renew timeout on init retransmit so
@@ -481,6 +486,24 @@ int nf_conntrack_sctp_packet(struct nf_conn *ct, · 4 unmodified lines
481486 old_state == SCTP_CONNTRACK_CLOSED &&
482487 nf_ct_is_confirmed(ct))
483488 ignore = true;
489+ } else if (sch->type == SCTP_CID_INIT_ACK) {
490+ struct sctp_inithdr _ih, *ih;
491+ __be32 vtag;
492+
493+ ih = skb_header_pointer(skb, offset + sizeof(_sch), sizeof(*ih), &_ih);
494+ if (!ih)
495+ goto out_unlock;
496+
497+ vtag = ct->proto.sctp.vtag[!dir];
498+ if (!ct->proto.sctp.init[!dir] && vtag && vtag != ih->init_tag)
499+ goto out_unlock;
500+ /* collision */
501+ if (ct->proto.sctp.init[dir] && ct->proto.sctp.init[!dir] &&
502+ vtag != ih->init_tag)
503+ goto out_unlock;
504+
505+ pr_debug("Setting vtag %x for dir %d\n", ih->init_tag, !dir);
506+ ct->proto.sctp.vtag[!dir] = ih->init_tag;
484507 }
485508
486509 ct->proto.sctp.state = new_state;
net/netfilter/nf_tables_api.c+28−16
@@ -7871,24 +7871,14 @@ static int nf_tables_delobj(struct sk_buff *skb, const struct nfnl_info *info, · 7870 unmodified lines
78717871 return nft_delobj(&ctx, obj);
78727872 }
78737873
7874−void nft_obj_notify(struct net *net, const struct nft_table *table,
7875− struct nft_object *obj, u32 portid, u32 seq, int event,
7876− u16 flags, int family, int report, gfp_t gfp)
7874+static void
7875+__nft_obj_notify(struct net *net, const struct nft_table *table,
7876+ struct nft_object *obj, u32 portid, u32 seq, int event,
7877+ u16 flags, int family, int report, gfp_t gfp)
78777878 {
78787879 struct nftables_pernet *nft_net = nft_pernet(net);
78797880 struct sk_buff *skb;
78807881 int err;
7881− char *buf = kasprintf(gfp, "%s:%u",
7882− table->name, nft_net->base_seq);
7883−
7884− audit_log_nfcfg(buf,
7885− family,
7886− obj->handle,
7887− event == NFT_MSG_NEWOBJ ?
7888− AUDIT_NFT_OP_OBJ_REGISTER :
7889− AUDIT_NFT_OP_OBJ_UNREGISTER,
7890− gfp);
7891− kfree(buf);
78927882
78937883 if (!report &&
78947884 !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
@@ -7911,13 +7901,35 @@ void nft_obj_notify(struct net *net, const struct nft_table *table, · 16 unmodified lines
79117901 err:
79127902 nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
79137903 }
7904+
7905+void nft_obj_notify(struct net *net, const struct nft_table *table,
7906+ struct nft_object *obj, u32 portid, u32 seq, int event,
7907+ u16 flags, int family, int report, gfp_t gfp)
7908+{
7909+ struct nftables_pernet *nft_net = nft_pernet(net);
7910+ char *buf = kasprintf(gfp, "%s:%u",
7911+ table->name, nft_net->base_seq);
7912+
7913+ audit_log_nfcfg(buf,
7914+ family,
7915+ obj->handle,
7916+ event == NFT_MSG_NEWOBJ ?
7917+ AUDIT_NFT_OP_OBJ_REGISTER :
7918+ AUDIT_NFT_OP_OBJ_UNREGISTER,
7919+ gfp);
7920+ kfree(buf);
7921+
7922+ __nft_obj_notify(net, table, obj, portid, seq, event,
7923+ flags, family, report, gfp);
7924+}
79147925 EXPORT_SYMBOL_GPL(nft_obj_notify);
79157926
79167927 static void nf_tables_obj_notify(const struct nft_ctx *ctx,
79177928 struct nft_object *obj, int event)
79187929 {
7919− nft_obj_notify(ctx->net, ctx->table, obj, ctx->portid, ctx->seq, event,
7920− ctx->flags, ctx->family, ctx->report, GFP_KERNEL);
7930+ __nft_obj_notify(ctx->net, ctx->table, obj, ctx->portid,
7931+ ctx->seq, event, ctx->flags, ctx->family,
7932+ ctx->report, GFP_KERNEL);
79217933 }
79227934
79237935 /*
net/netfilter/nft_payload.c+12−1
@@ -154,6 +154,17 @@ int nft_payload_inner_offset(const struct nft_pktinfo *pkt) · 153 unmodified lines
154154 return pkt->inneroff;
155155 }
156156
157+static bool nft_payload_need_vlan_copy(const struct nft_payload *priv)
158+{
159+ unsigned int len = priv->offset + priv->len;
160+
161+ /* data past ether src/dst requested, copy needed */
162+ if (len > offsetof(struct ethhdr, h_proto))
163+ return true;
164+
165+ return false;
166+}
167+
157168 void nft_payload_eval(const struct nft_expr *expr,
158169 struct nft_regs *regs,
159170 const struct nft_pktinfo *pkt)
@@ -172,7 +183,7 @@ void nft_payload_eval(const struct nft_expr *expr, · 12 unmodified lines
172183 goto err;
173184
174185 if (skb_vlan_tag_present(skb) &&
175− priv->offset >= offsetof(struct ethhdr, h_proto)) {
186+ nft_payload_need_vlan_copy(priv)) {
176187 if (!nft_payload_copy_vlan(dest, skb,
177188 priv->offset, priv->len))
178189 goto err;
net/netfilter/nft_set_rbtree.c+29−17
@@ -233,10 +233,9 @@ static void nft_rbtree_gc_remove(struct net *net, struct nft_set *set, · 232 unmodified lines
233233 rb_erase(&rbe->node, &priv->root);
234234 }
235235
236−static int nft_rbtree_gc_elem(const struct nft_set *__set,
237− struct nft_rbtree *priv,
238− struct nft_rbtree_elem *rbe,
239− u8 genmask)
236+static const struct nft_rbtree_elem *
237+nft_rbtree_gc_elem(const struct nft_set *__set, struct nft_rbtree *priv,
238+ struct nft_rbtree_elem *rbe, u8 genmask)
240239 {
241240 struct nft_set *set = (struct nft_set *)__set;
242241 struct rb_node *prev = rb_prev(&rbe->node);
@@ -246,7 +245,7 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set, · 3 unmodified lines
246245
247246 gc = nft_trans_gc_alloc(set, 0, GFP_ATOMIC);
248247 if (!gc)
249− return -ENOMEM;
248+ return ERR_PTR(-ENOMEM);
250249
251250 /* search for end interval coming before this element.
252251 * end intervals don't carry a timeout extension, they
@@ -261,6 +260,7 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set, · 8 unmodified lines
261260 prev = rb_prev(prev);
262261 }
263262
263+ rbe_prev = NULL;
264264 if (prev) {
265265 rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node);
266266 nft_rbtree_gc_remove(net, set, priv, rbe_prev);
@@ -272,7 +272,7 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set, · 5 unmodified lines
272272 */
273273 gc = nft_trans_gc_queue_sync(gc, GFP_ATOMIC);
274274 if (WARN_ON_ONCE(!gc))
275− return -ENOMEM;
275+ return ERR_PTR(-ENOMEM);
276276
277277 nft_trans_gc_elem_add(gc, rbe_prev);
278278 }
@@ -280,13 +280,13 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set, · 1 unmodified line
280280 nft_rbtree_gc_remove(net, set, priv, rbe);
281281 gc = nft_trans_gc_queue_sync(gc, GFP_ATOMIC);
282282 if (WARN_ON_ONCE(!gc))
283− return -ENOMEM;
283+ return ERR_PTR(-ENOMEM);
284284
285285 nft_trans_gc_elem_add(gc, rbe);
286286
287287 nft_trans_gc_queue_sync_done(gc);
288288
289− return 0;
289+ return rbe_prev;
290290 }
291291
292292 static bool nft_rbtree_update_first(const struct nft_set *set,
@@ -314,7 +314,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 21 unmodified lines
314314 struct nft_rbtree *priv = nft_set_priv(set);
315315 u8 cur_genmask = nft_genmask_cur(net);
316316 u8 genmask = nft_genmask_next(net);
317− int d, err;
317+ int d;
318318
319319 /* Descend the tree to search for an existing element greater than the
320320 * key value to insert that is greater than the new element. This is the
@@ -363,9 +363,14 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 42 unmodified lines
363363 */
364364 if (nft_set_elem_expired(&rbe->ext) &&
365365 nft_set_elem_active(&rbe->ext, cur_genmask)) {
366− err = nft_rbtree_gc_elem(set, priv, rbe, genmask);
367− if (err < 0)
368− return err;
366+ const struct nft_rbtree_elem *removed_end;
367+
368+ removed_end = nft_rbtree_gc_elem(set, priv, rbe, genmask);
369+ if (IS_ERR(removed_end))
370+ return PTR_ERR(removed_end);
371+
372+ if (removed_end == rbe_le || removed_end == rbe_ge)
373+ return -EAGAIN;
369374
370375 continue;
371376 }
@@ -486,11 +491,18 @@ static int nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 114 unmodified lines
486491 struct nft_rbtree_elem *rbe = elem->priv;
487492 int err;
488493
489− write_lock_bh(&priv->lock);
490− write_seqcount_begin(&priv->count);
491− err = __nft_rbtree_insert(net, set, rbe, ext);
492− write_seqcount_end(&priv->count);
493− write_unlock_bh(&priv->lock);
494+ do {
495+ if (fatal_signal_pending(current))
496+ return -EINTR;
497+
498+ cond_resched();
499+
500+ write_lock_bh(&priv->lock);
501+ write_seqcount_begin(&priv->count);
502+ err = __nft_rbtree_insert(net, set, rbe, ext);
503+ write_seqcount_end(&priv->count);
504+ write_unlock_bh(&priv->lock);
505+ } while (err == -EAGAIN);
494506
495507 return err;
496508 }
net/netlink/af_netlink.c+4−4
@@ -352,7 +352,7 @@ static void netlink_overrun(struct sock *sk) · 351 unmodified lines
352352 if (!nlk_test_bit(RECV_NO_ENOBUFS, sk)) {
353353 if (!test_and_set_bit(NETLINK_S_CONGESTED,
354354 &nlk_sk(sk)->state)) {
355− sk->sk_err = ENOBUFS;
355+ WRITE_ONCE(sk->sk_err, ENOBUFS);
356356 sk_error_report(sk);
357357 }
358358 }
@@ -1605,7 +1605,7 @@ static int do_one_set_err(struct sock *sk, struct netlink_set_err_data *p) · 1246 unmodified lines
16051605 goto out;
16061606 }
16071607
1608− sk->sk_err = p->code;
1608+ WRITE_ONCE(sk->sk_err, p->code);
16091609 sk_error_report(sk);
16101610 out:
16111611 return ret;
@@ -1991,7 +1991,7 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, · 379 unmodified lines
19911991 atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
19921992 ret = netlink_dump(sk);
19931993 if (ret) {
1994− sk->sk_err = -ret;
1994+ WRITE_ONCE(sk->sk_err, -ret);
19951995 sk_error_report(sk);
19961996 }
19971997 }
@@ -2511,7 +2511,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err, · 513 unmodified lines
25112511 err_bad_put:
25122512 nlmsg_free(skb);
25132513 err_skb:
2514− NETLINK_CB(in_skb).sk->sk_err = ENOBUFS;
2514+ WRITE_ONCE(NETLINK_CB(in_skb).sk->sk_err, ENOBUFS);
25152515 sk_error_report(NETLINK_CB(in_skb).sk);
25162516 }
25172517 EXPORT_SYMBOL(netlink_ack);
net/nfc/llcp_core.c+2−0
@@ -1636,7 +1636,9 @@ int nfc_llcp_register_device(struct nfc_dev *ndev) · 1635 unmodified lines
16361636 timer_setup(&local->sdreq_timer, nfc_llcp_sdreq_timer, 0);
16371637 INIT_WORK(&local->sdreq_timeout_work, nfc_llcp_sdreq_timeout_work);
16381638
1639+ spin_lock(&llcp_devices_lock);
16391640 list_add(&local->list, &llcp_devices);
1641+ spin_unlock(&llcp_devices_lock);
16401642
16411643 return 0;
16421644 }
net/rds/tcp_connect.c+2−2
@@ -145,7 +145,7 @@ int rds_tcp_conn_path_connect(struct rds_conn_path *cp) · 144 unmodified lines
145145 addrlen = sizeof(sin);
146146 }
147147
148− ret = sock->ops->bind(sock, addr, addrlen);
148+ ret = kernel_bind(sock, addr, addrlen);
149149 if (ret) {
150150 rdsdebug("bind failed with %d at address %pI6c\n",
151151 ret, &conn->c_laddr);
@@ -173,7 +173,7 @@ int rds_tcp_conn_path_connect(struct rds_conn_path *cp) · 21 unmodified lines
173173 * own the socket
174174 */
175175 rds_tcp_set_callbacks(sock, cp);
176− ret = sock->ops->connect(sock, addr, addrlen, O_NONBLOCK);
176+ ret = kernel_connect(sock, addr, addrlen, O_NONBLOCK);
177177
178178 rdsdebug("connect to address %pI6c returned %d\n", &conn->c_faddr, ret);
179179 if (ret == -EINPROGRESS)
net/rds/tcp_listen.c+1−1
@@ -306,7 +306,7 @@ struct socket *rds_tcp_listen_init(struct net *net, bool isv6) · 305 unmodified lines
306306 addr_len = sizeof(*sin);
307307 }
308308
309− ret = sock->ops->bind(sock, (struct sockaddr *)&ss, addr_len);
309+ ret = kernel_bind(sock, (struct sockaddr *)&ss, addr_len);
310310 if (ret < 0) {
311311 rdsdebug("could not bind %s listener socket: %d\n",
312312 isv6 ? "IPv6" : "IPv4", ret);
net/rfkill/core.c+26−6
@@ -48,6 +48,7 @@ struct rfkill { · 47 unmodified lines
4848 bool persistent;
4949 bool polling_paused;
5050 bool suspended;
51+ bool need_sync;
5152
5253 const struct rfkill_ops *ops;
5354 void *data;
@@ -368,6 +369,17 @@ static void rfkill_set_block(struct rfkill *rfkill, bool blocked) · 314 unmodified lines
368369 rfkill_event(rfkill);
369370 }
370371
372+static void rfkill_sync(struct rfkill *rfkill)
373+{
374+ lockdep_assert_held(&rfkill_global_mutex);
375+
376+ if (!rfkill->need_sync)
377+ return;
378+
379+ rfkill_set_block(rfkill, rfkill_global_states[rfkill->type].cur);
380+ rfkill->need_sync = false;
381+}
382+
371383 static void rfkill_update_global_state(enum rfkill_type type, bool blocked)
372384 {
373385 int i;
@@ -730,6 +742,10 @@ static ssize_t soft_show(struct device *dev, struct device_attribute *attr, · 356 unmodified lines
730742 {
731743 struct rfkill *rfkill = to_rfkill(dev);
732744
745+ mutex_lock(&rfkill_global_mutex);
746+ rfkill_sync(rfkill);
747+ mutex_unlock(&rfkill_global_mutex);
748+
733749 return sysfs_emit(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0);
734750 }
735751
@@ -751,6 +767,7 @@ static ssize_t soft_store(struct device *dev, struct device_attribute *attr, · 15 unmodified lines
751767 return -EINVAL;
752768
753769 mutex_lock(&rfkill_global_mutex);
770+ rfkill_sync(rfkill);
754771 rfkill_set_block(rfkill, state);
755772 mutex_unlock(&rfkill_global_mutex);
756773
@@ -783,6 +800,10 @@ static ssize_t state_show(struct device *dev, struct device_attribute *attr, · 26 unmodified lines
783800 {
784801 struct rfkill *rfkill = to_rfkill(dev);
785802
803+ mutex_lock(&rfkill_global_mutex);
804+ rfkill_sync(rfkill);
805+ mutex_unlock(&rfkill_global_mutex);
806+
786807 return sysfs_emit(buf, "%d\n", user_state_from_blocked(rfkill->state));
787808 }
788809
@@ -805,6 +826,7 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr, · 16 unmodified lines
805826 return -EINVAL;
806827
807828 mutex_lock(&rfkill_global_mutex);
829+ rfkill_sync(rfkill);
808830 rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED);
809831 mutex_unlock(&rfkill_global_mutex);
810832
@@ -1032,14 +1054,10 @@ static void rfkill_uevent_work(struct work_struct *work) · 221 unmodified lines
10321054
10331055 static void rfkill_sync_work(struct work_struct *work)
10341056 {
1035− struct rfkill *rfkill;
1036− bool cur;
1037−
1038− rfkill = container_of(work, struct rfkill, sync_work);
1057+ struct rfkill *rfkill = container_of(work, struct rfkill, sync_work);
10391058
10401059 mutex_lock(&rfkill_global_mutex);
1041− cur = rfkill_global_states[rfkill->type].cur;
1042− rfkill_set_block(rfkill, cur);
1060+ rfkill_sync(rfkill);
10431061 mutex_unlock(&rfkill_global_mutex);
10441062 }
10451063
@@ -1087,6 +1105,7 @@ int __must_check rfkill_register(struct rfkill *rfkill) · 41 unmodified lines
10871105 round_jiffies_relative(POLL_INTERVAL));
10881106
10891107 if (!rfkill->persistent || rfkill_epo_lock_active) {
1108+ rfkill->need_sync = true;
10901109 schedule_work(&rfkill->sync_work);
10911110 } else {
10921111 #ifdef CONFIG_RFKILL_INPUT
@@ -1171,6 +1190,7 @@ static int rfkill_fop_open(struct inode *inode, struct file *file) · 78 unmodified lines
11711190 ev = kzalloc(sizeof(*ev), GFP_KERNEL);
11721191 if (!ev)
11731192 goto free;
1193+ rfkill_sync(rfkill);
11741194 rfkill_fill_event(&ev->ev, rfkill, RFKILL_OP_ADD);
11751195 list_add_tail(&ev->list, &data->events);
11761196 }
net/sctp/associola.c+1−2
@@ -1159,8 +1159,7 @@ int sctp_assoc_update(struct sctp_association *asoc, · 1158 unmodified lines
11591159 /* Add any peer addresses from the new association. */
11601160 list_for_each_entry(trans, &new->peer.transport_addr_list,
11611161 transports)
1162− if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr) &&
1163− !sctp_assoc_add_peer(asoc, &trans->ipaddr,
1162+ if (!sctp_assoc_add_peer(asoc, &trans->ipaddr,
11641163 GFP_ATOMIC, trans->state))
11651164 return -ENOMEM;
11661165
net/sctp/socket.c+1−0
@@ -2450,6 +2450,7 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, · 2449 unmodified lines
24502450 if (trans) {
24512451 trans->hbinterval =
24522452 msecs_to_jiffies(params->spp_hbinterval);
2453+ sctp_transport_reset_hb_timer(trans);
24532454 } else if (asoc) {
24542455 asoc->hbinterval =
24552456 msecs_to_jiffies(params->spp_hbinterval);
net/socket.c+29−7
@@ -737,6 +737,14 @@ static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg) · 736 unmodified lines
737737 return ret;
738738 }
739739
740+static int __sock_sendmsg(struct socket *sock, struct msghdr *msg)
741+{
742+ int err = security_socket_sendmsg(sock, msg,
743+ msg_data_left(msg));
744+
745+ return err ?: sock_sendmsg_nosec(sock, msg);
746+}
747+
740748 /**
741749 * sock_sendmsg - send a message through @sock
742750 * @sock: socket
@@ -747,10 +755,19 @@ static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg) · 4 unmodified lines
747755 */
748756 int sock_sendmsg(struct socket *sock, struct msghdr *msg)
749757 {
750− int err = security_socket_sendmsg(sock, msg,
751− msg_data_left(msg));
758+ struct sockaddr_storage *save_addr = (struct sockaddr_storage *)msg->msg_name;
759+ struct sockaddr_storage address;
760+ int ret;
752761
753− return err ?: sock_sendmsg_nosec(sock, msg);
762+ if (msg->msg_name) {
763+ memcpy(&address, msg->msg_name, msg->msg_namelen);
764+ msg->msg_name = &address;
765+ }
766+
767+ ret = __sock_sendmsg(sock, msg);
768+ msg->msg_name = save_addr;
769+
770+ return ret;
754771 }
755772 EXPORT_SYMBOL(sock_sendmsg);
756773
@@ -1138,7 +1155,7 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from) · 381 unmodified lines
11381155 if (sock->type == SOCK_SEQPACKET)
11391156 msg.msg_flags |= MSG_EOR;
11401157
1141− res = sock_sendmsg(sock, &msg);
1158+ res = __sock_sendmsg(sock, &msg);
11421159 *from = msg.msg_iter;
11431160 return res;
11441161 }
@@ -2174,7 +2191,7 @@ int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags, · 1029 unmodified lines
21742191 if (sock->file->f_flags & O_NONBLOCK)
21752192 flags |= MSG_DONTWAIT;
21762193 msg.msg_flags = flags;
2177− err = sock_sendmsg(sock, &msg);
2194+ err = __sock_sendmsg(sock, &msg);
21782195
21792196 out_put:
21802197 fput_light(sock->file, fput_needed);
@@ -2538,7 +2555,7 @@ static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys, · 357 unmodified lines
25382555 err = sock_sendmsg_nosec(sock, msg_sys);
25392556 goto out_freectl;
25402557 }
2541− err = sock_sendmsg(sock, msg_sys);
2558+ err = __sock_sendmsg(sock, msg_sys);
25422559 /*
25432560 * If this is sendmmsg() and sending to current destination address was
25442561 * successful, remember it.
@@ -3499,7 +3516,12 @@ static long compat_sock_ioctl(struct file *file, unsigned int cmd, · 954 unmodified lines
34993516
35003517 int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
35013518 {
3502− return READ_ONCE(sock->ops)->bind(sock, addr, addrlen);
3519+ struct sockaddr_storage address;
3520+
3521+ memcpy(&address, addr, addrlen);
3522+
3523+ return READ_ONCE(sock->ops)->bind(sock, (struct sockaddr *)&address,
3524+ addrlen);
35033525 }
35043526 EXPORT_SYMBOL(kernel_bind);
35053527
net/tipc/crypto.c+2−2
@@ -1441,14 +1441,14 @@ static int tipc_crypto_key_revoke(struct net *net, u8 tx_key) · 1440 unmodified lines
14411441 struct tipc_crypto *tx = tipc_net(net)->crypto_tx;
14421442 struct tipc_key key;
14431443
1444− spin_lock(&tx->lock);
1444+ spin_lock_bh(&tx->lock);
14451445 key = tx->key;
14461446 WARN_ON(!key.active || tx_key != key.active);
14471447
14481448 /* Free the active key */
14491449 tipc_crypto_key_set_state(tx, key.passive, 0, key.pending);
14501450 tipc_crypto_key_detach(tx->aead[key.active], &tx->lock);
1451− spin_unlock(&tx->lock);
1451+ spin_unlock_bh(&tx->lock);
14521452
14531453 pr_warn("%s: key is revoked\n", tx->name);
14541454 return -EKEYREVOKED;
net/wireless/core.c+7−7
@@ -1181,16 +1181,11 @@ void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked, · 1180 unmodified lines
11811181 }
11821182 EXPORT_SYMBOL(wiphy_rfkill_set_hw_state_reason);
11831183
1184−void cfg80211_cqm_config_free(struct wireless_dev *wdev)
1185−{
1186− kfree(wdev->cqm_config);
1187− wdev->cqm_config = NULL;
1188−}
1189−
11901184 static void _cfg80211_unregister_wdev(struct wireless_dev *wdev,
11911185 bool unregister_netdev)
11921186 {
11931187 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1188+ struct cfg80211_cqm_config *cqm_config;
11941189 unsigned int link_id;
11951190
11961191 ASSERT_RTNL();
@@ -1227,7 +1222,10 @@ static void _cfg80211_unregister_wdev(struct wireless_dev *wdev, · 30 unmodified lines
12271222 kfree_sensitive(wdev->wext.keys);
12281223 wdev->wext.keys = NULL;
12291224 #endif
1230− cfg80211_cqm_config_free(wdev);
1225+ wiphy_work_cancel(wdev->wiphy, &wdev->cqm_rssi_work);
1226+ /* deleted from the list, so can't be found from nl80211 any more */
1227+ cqm_config = rcu_access_pointer(wdev->cqm_config);
1228+ kfree_rcu(cqm_config, rcu_head);
12311229
12321230 /*
12331231 * Ensure that all events have been processed and
@@ -1379,6 +1377,8 @@ void cfg80211_init_wdev(struct wireless_dev *wdev) · 145 unmodified lines
13791377 wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
13801378 #endif
13811379
1380+ wiphy_work_init(&wdev->cqm_rssi_work, cfg80211_cqm_rssi_notify_work);
1381+
13821382 if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
13831383 wdev->ps = true;
13841384 else
net/wireless/core.h+5−2
@@ -295,12 +295,17 @@ struct cfg80211_beacon_registration { · 294 unmodified lines
295295 };
296296
297297 struct cfg80211_cqm_config {
298+ struct rcu_head rcu_head;
298299 u32 rssi_hyst;
299300 s32 last_rssi_event_value;
301+ enum nl80211_cqm_rssi_threshold_event last_rssi_event_type;
300302 int n_rssi_thresholds;
301303 s32 rssi_thresholds[] __counted_by(n_rssi_thresholds);
302304 };
303305
306+void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy,
307+ struct wiphy_work *work);
308+
304309 void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev);
305310
306311 /* free object */
@@ -566,8 +571,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev, · 259 unmodified lines
566571 #define CFG80211_DEV_WARN_ON(cond) ({bool __r = (cond); __r; })
567572 #endif
568573
569−void cfg80211_cqm_config_free(struct wireless_dev *wdev);
570−
571574 void cfg80211_release_pmsr(struct wireless_dev *wdev, u32 portid);
572575 void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev);
573576 void cfg80211_pmsr_free_wk(struct work_struct *work);
net/wireless/mlme.c+2−1
@@ -52,7 +52,8 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, · 51 unmodified lines
5252 cr.links[link_id].bssid = data->links[link_id].bss->bssid;
5353 cr.links[link_id].addr = data->links[link_id].addr;
5454 /* need to have local link addresses for MLO connections */
55− WARN_ON(cr.ap_mld_addr && !cr.links[link_id].addr);
55+ WARN_ON(cr.ap_mld_addr &&
56+ !is_valid_ether_addr(cr.links[link_id].addr));
5657
5758 BUG_ON(!cr.links[link_id].bss->channel);
5859
net/wireless/nl80211.c+81−33
@@ -5909,6 +5909,21 @@ out: · 5908 unmodified lines
59095909 nlmsg_free(msg);
59105910 }
59115911
5912+static int nl80211_validate_ap_phy_operation(struct cfg80211_ap_settings *params)
5913+{
5914+ struct ieee80211_channel *channel = params->chandef.chan;
5915+
5916+ if ((params->he_cap || params->he_oper) &&
5917+ (channel->flags & IEEE80211_CHAN_NO_HE))
5918+ return -EOPNOTSUPP;
5919+
5920+ if ((params->eht_cap || params->eht_oper) &&
5921+ (channel->flags & IEEE80211_CHAN_NO_EHT))
5922+ return -EOPNOTSUPP;
5923+
5924+ return 0;
5925+}
5926+
59125927 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
59135928 {
59145929 struct cfg80211_registered_device *rdev = info->user_ptr[0];
@@ -6178,6 +6193,10 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) · 263 unmodified lines
61786193 if (err)
61796194 goto out_unlock;
61806195
6196+ err = nl80211_validate_ap_phy_operation(params);
6197+ if (err)
6198+ goto out_unlock;
6199+
61816200 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
61826201 params->flags = nla_get_u32(
61836202 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]);
@@ -8482,7 +8501,7 @@ static int nl80211_update_mesh_config(struct sk_buff *skb, · 2298 unmodified lines
84828501 struct cfg80211_registered_device *rdev = info->user_ptr[0];
84838502 struct net_device *dev = info->user_ptr[1];
84848503 struct wireless_dev *wdev = dev->ieee80211_ptr;
8485− struct mesh_config cfg;
8504+ struct mesh_config cfg = {};
84868505 u32 mask;
84878506 int err;
84888507
@@ -12796,7 +12815,8 @@ static int nl80211_set_cqm_txe(struct genl_info *info, · 4307 unmodified lines
1279612815 }
1279712816
1279812817 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
12799− struct net_device *dev)
12818+ struct net_device *dev,
12819+ struct cfg80211_cqm_config *cqm_config)
1280012820 {
1280112821 struct wireless_dev *wdev = dev->ieee80211_ptr;
1280212822 s32 last, low, high;
@@ -12805,7 +12825,7 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, · 2 unmodified lines
1280512825 int err;
1280612826
1280712827 /* RSSI reporting disabled? */
12808− if (!wdev->cqm_config)
12828+ if (!cqm_config)
1280912829 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
1281012830
1281112831 /*
@@ -12814,7 +12834,7 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, · 2 unmodified lines
1281412834 * connection is established and enough beacons received to calculate
1281512835 * the average.
1281612836 */
12817− if (!wdev->cqm_config->last_rssi_event_value &&
12837+ if (!cqm_config->last_rssi_event_value &&
1281812838 wdev->links[0].client.current_bss &&
1281912839 rdev->ops->get_station) {
1282012840 struct station_info sinfo = {};
@@ -12828,30 +12848,30 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, · 7 unmodified lines
1282812848
1282912849 cfg80211_sinfo_release_content(&sinfo);
1283012850 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
12831− wdev->cqm_config->last_rssi_event_value =
12851+ cqm_config->last_rssi_event_value =
1283212852 (s8) sinfo.rx_beacon_signal_avg;
1283312853 }
1283412854
12835− last = wdev->cqm_config->last_rssi_event_value;
12836− hyst = wdev->cqm_config->rssi_hyst;
12837− n = wdev->cqm_config->n_rssi_thresholds;
12855+ last = cqm_config->last_rssi_event_value;
12856+ hyst = cqm_config->rssi_hyst;
12857+ n = cqm_config->n_rssi_thresholds;
1283812858
1283912859 for (i = 0; i < n; i++) {
1284012860 i = array_index_nospec(i, n);
12841− if (last < wdev->cqm_config->rssi_thresholds[i])
12861+ if (last < cqm_config->rssi_thresholds[i])
1284212862 break;
1284312863 }
1284412864
1284512865 low_index = i - 1;
1284612866 if (low_index >= 0) {
1284712867 low_index = array_index_nospec(low_index, n);
12848− low = wdev->cqm_config->rssi_thresholds[low_index] - hyst;
12868+ low = cqm_config->rssi_thresholds[low_index] - hyst;
1284912869 } else {
1285012870 low = S32_MIN;
1285112871 }
1285212872 if (i < n) {
1285312873 i = array_index_nospec(i, n);
12854− high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1;
12874+ high = cqm_config->rssi_thresholds[i] + hyst - 1;
1285512875 } else {
1285612876 high = S32_MAX;
1285712877 }
@@ -12864,6 +12884,7 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, · 6 unmodified lines
1286412884 u32 hysteresis)
1286512885 {
1286612886 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12887+ struct cfg80211_cqm_config *cqm_config = NULL, *old;
1286712888 struct net_device *dev = info->user_ptr[1];
1286812889 struct wireless_dev *wdev = dev->ieee80211_ptr;
1286912890 int i, err;
@@ -12881,10 +12902,6 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, · 11 unmodified lines
1288112902 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
1288212903 return -EOPNOTSUPP;
1288312904
12884− wdev_lock(wdev);
12885− cfg80211_cqm_config_free(wdev);
12886− wdev_unlock(wdev);
12887−
1288812905 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
1288912906 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
1289012907 return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
@@ -12901,9 +12918,10 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, · 10 unmodified lines
1290112918 n_thresholds = 0;
1290212919
1290312920 wdev_lock(wdev);
12904− if (n_thresholds) {
12905− struct cfg80211_cqm_config *cqm_config;
12921+ old = rcu_dereference_protected(wdev->cqm_config,
12922+ lockdep_is_held(&wdev->mtx));
1290612923
12924+ if (n_thresholds) {
1290712925 cqm_config = kzalloc(struct_size(cqm_config, rssi_thresholds,
1290812926 n_thresholds),
1290912927 GFP_KERNEL);
@@ -12918,11 +12936,18 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, · 8 unmodified lines
1291812936 flex_array_size(cqm_config, rssi_thresholds,
1291912937 n_thresholds));
1292012938
12921− wdev->cqm_config = cqm_config;
12939+ rcu_assign_pointer(wdev->cqm_config, cqm_config);
12940+ } else {
12941+ RCU_INIT_POINTER(wdev->cqm_config, NULL);
1292212942 }
1292312943
12924− err = cfg80211_cqm_rssi_update(rdev, dev);
12925−
12944+ err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config);
12945+ if (err) {
12946+ rcu_assign_pointer(wdev->cqm_config, old);
12947+ kfree_rcu(cqm_config, rcu_head);
12948+ } else {
12949+ kfree_rcu(old, rcu_head);
12950+ }
1292612951 unlock:
1292712952 wdev_unlock(wdev);
1292812953
@@ -19073,9 +19098,8 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev, · 6144 unmodified lines
1907319098 enum nl80211_cqm_rssi_threshold_event rssi_event,
1907419099 s32 rssi_level, gfp_t gfp)
1907519100 {
19076− struct sk_buff *msg;
1907719101 struct wireless_dev *wdev = dev->ieee80211_ptr;
19078− struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
19102+ struct cfg80211_cqm_config *cqm_config;
1907919103
1908019104 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
1908119105
@@ -19083,18 +19107,41 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev, · 1 unmodified line
1908319107 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
1908419108 return;
1908519109
19086− if (wdev->cqm_config) {
19087− wdev->cqm_config->last_rssi_event_value = rssi_level;
19110+ rcu_read_lock();
19111+ cqm_config = rcu_dereference(wdev->cqm_config);
19112+ if (cqm_config) {
19113+ cqm_config->last_rssi_event_value = rssi_level;
19114+ cqm_config->last_rssi_event_type = rssi_event;
19115+ wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work);
19116+ }
19117+ rcu_read_unlock();
19118+}
19119+EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
1908819120
19089− cfg80211_cqm_rssi_update(rdev, dev);
19121+void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work)
19122+{
19123+ struct wireless_dev *wdev = container_of(work, struct wireless_dev,
19124+ cqm_rssi_work);
19125+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
19126+ enum nl80211_cqm_rssi_threshold_event rssi_event;
19127+ struct cfg80211_cqm_config *cqm_config;
19128+ struct sk_buff *msg;
19129+ s32 rssi_level;
1909019130
19091− if (rssi_level == 0)
19092− rssi_level = wdev->cqm_config->last_rssi_event_value;
19093− }
19131+ wdev_lock(wdev);
19132+ cqm_config = rcu_dereference_protected(wdev->cqm_config,
19133+ lockdep_is_held(&wdev->mtx));
19134+ if (!wdev->cqm_config)
19135+ goto unlock;
1909419136
19095− msg = cfg80211_prepare_cqm(dev, NULL, gfp);
19137+ cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config);
19138+
19139+ rssi_level = cqm_config->last_rssi_event_value;
19140+ rssi_event = cqm_config->last_rssi_event_type;
19141+
19142+ msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL);
1909619143 if (!msg)
19097− return;
19144+ goto unlock;
1909819145
1909919146 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
1910019147 rssi_event))
@@ -19104,14 +19151,15 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev, · 3 unmodified lines
1910419151 rssi_level))
1910519152 goto nla_put_failure;
1910619153
19107− cfg80211_send_cqm(msg, gfp);
19154+ cfg80211_send_cqm(msg, GFP_KERNEL);
1910819155
19109− return;
19156+ goto unlock;
1911019157
1911119158 nla_put_failure:
1911219159 nlmsg_free(msg);
19160+ unlock:
19161+ wdev_unlock(wdev);
1911319162 }
19114−EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
1911519163
1911619164 void cfg80211_cqm_txe_notify(struct net_device *dev,
1911719165 const u8 *peer, u32 num_packets,
net/wireless/scan.c+4−0
@@ -908,6 +908,10 @@ static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev) · 907 unmodified lines
908908 !cfg80211_find_ssid_match(ap, request))
909909 continue;
910910
911+ if (!is_broadcast_ether_addr(request->bssid) &&
912+ !ether_addr_equal(request->bssid, ap->bssid))
913+ continue;
914+
911915 if (!request->n_ssids && ap->multi_bss && !ap->transmitted_bssid)
912916 continue;
913917
tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c+2−0
@@ -185,6 +185,8 @@ static void test_cubic(void) · 184 unmodified lines
185185
186186 do_test("bpf_cubic", NULL);
187187
188+ ASSERT_EQ(cubic_skel->bss->bpf_cubic_acked_called, 1, "pkts_acked called");
189+
188190 bpf_link__destroy(link);
189191 bpf_cubic__destroy(cubic_skel);
190192 }
tools/testing/selftests/bpf/prog_tests/sockmap_basic.c+51−0
@@ -475,6 +475,55 @@ out: · 474 unmodified lines
475475 test_sockmap_drop_prog__destroy(drop);
476476 }
477477
478+static void test_sockmap_skb_verdict_peek(void)
479+{
480+ int err, map, verdict, s, c1, p1, zero = 0, sent, recvd, avail;
481+ struct test_sockmap_pass_prog *pass;
482+ char snd[256] = "0123456789";
483+ char rcv[256] = "0";
484+
485+ pass = test_sockmap_pass_prog__open_and_load();
486+ if (!ASSERT_OK_PTR(pass, "open_and_load"))
487+ return;
488+ verdict = bpf_program__fd(pass->progs.prog_skb_verdict);
489+ map = bpf_map__fd(pass->maps.sock_map_rx);
490+
491+ err = bpf_prog_attach(verdict, map, BPF_SK_SKB_STREAM_VERDICT, 0);
492+ if (!ASSERT_OK(err, "bpf_prog_attach"))
493+ goto out;
494+
495+ s = socket_loopback(AF_INET, SOCK_STREAM);
496+ if (!ASSERT_GT(s, -1, "socket_loopback(s)"))
497+ goto out;
498+
499+ err = create_pair(s, AF_INET, SOCK_STREAM, &c1, &p1);
500+ if (!ASSERT_OK(err, "create_pairs(s)"))
501+ goto out;
502+
503+ err = bpf_map_update_elem(map, &zero, &c1, BPF_NOEXIST);
504+ if (!ASSERT_OK(err, "bpf_map_update_elem(c1)"))
505+ goto out_close;
506+
507+ sent = xsend(p1, snd, sizeof(snd), 0);
508+ ASSERT_EQ(sent, sizeof(snd), "xsend(p1)");
509+ recvd = recv(c1, rcv, sizeof(rcv), MSG_PEEK);
510+ ASSERT_EQ(recvd, sizeof(rcv), "recv(c1)");
511+ err = ioctl(c1, FIONREAD, &avail);
512+ ASSERT_OK(err, "ioctl(FIONREAD) error");
513+ ASSERT_EQ(avail, sizeof(snd), "after peek ioctl(FIONREAD)");
514+ recvd = recv(c1, rcv, sizeof(rcv), 0);
515+ ASSERT_EQ(recvd, sizeof(rcv), "recv(p0)");
516+ err = ioctl(c1, FIONREAD, &avail);
517+ ASSERT_OK(err, "ioctl(FIONREAD) error");
518+ ASSERT_EQ(avail, 0, "after read ioctl(FIONREAD)");
519+
520+out_close:
521+ close(c1);
522+ close(p1);
523+out:
524+ test_sockmap_pass_prog__destroy(pass);
525+}
526+
478527 void test_sockmap_basic(void)
479528 {
480529 if (test__start_subtest("sockmap create_update_free"))
@@ -515,4 +564,6 @@ void test_sockmap_basic(void) · 34 unmodified lines
515564 test_sockmap_skb_verdict_fionread(true);
516565 if (test__start_subtest("sockmap skb_verdict fionread on drop"))
517566 test_sockmap_skb_verdict_fionread(false);
567+ if (test__start_subtest("sockmap skb_verdict msg_f_peek"))
568+ test_sockmap_skb_verdict_peek();
518569 }
tools/testing/selftests/bpf/prog_tests/tc_opts.c+84−0
@@ -2378,3 +2378,87 @@ void serial_test_tc_opts_chain_mixed(void) · 2377 unmodified lines
23782378 test_tc_chain_mixed(BPF_TCX_INGRESS);
23792379 test_tc_chain_mixed(BPF_TCX_EGRESS);
23802380 }
2381+
2382+static int generate_dummy_prog(void)
2383+{
2384+ const struct bpf_insn prog_insns[] = {
2385+ BPF_MOV64_IMM(BPF_REG_0, 0),
2386+ BPF_EXIT_INSN(),
2387+ };
2388+ const size_t prog_insn_cnt = sizeof(prog_insns) / sizeof(struct bpf_insn);
2389+ LIBBPF_OPTS(bpf_prog_load_opts, opts);
2390+ const size_t log_buf_sz = 256;
2391+ char *log_buf;
2392+ int fd = -1;
2393+
2394+ log_buf = malloc(log_buf_sz);
2395+ if (!ASSERT_OK_PTR(log_buf, "log_buf_alloc"))
2396+ return fd;
2397+ opts.log_buf = log_buf;
2398+ opts.log_size = log_buf_sz;
2399+
2400+ log_buf[0] = '\0';
2401+ opts.log_level = 0;
2402+ fd = bpf_prog_load(BPF_PROG_TYPE_SCHED_CLS, "tcx_prog", "GPL",
2403+ prog_insns, prog_insn_cnt, &opts);
2404+ ASSERT_STREQ(log_buf, "", "log_0");
2405+ ASSERT_GE(fd, 0, "prog_fd");
2406+ free(log_buf);
2407+ return fd;
2408+}
2409+
2410+static void test_tc_opts_max_target(int target, int flags, bool relative)
2411+{
2412+ int err, ifindex, i, prog_fd, last_fd = -1;
2413+ LIBBPF_OPTS(bpf_prog_attach_opts, opta);
2414+ const int max_progs = 63;
2415+
2416+ ASSERT_OK(system("ip link add dev tcx_opts1 type veth peer name tcx_opts2"), "add veth");
2417+ ifindex = if_nametoindex("tcx_opts1");
2418+ ASSERT_NEQ(ifindex, 0, "non_zero_ifindex");
2419+
2420+ assert_mprog_count_ifindex(ifindex, target, 0);
2421+
2422+ for (i = 0; i < max_progs; i++) {
2423+ prog_fd = generate_dummy_prog();
2424+ if (!ASSERT_GE(prog_fd, 0, "dummy_prog"))
2425+ goto cleanup;
2426+ err = bpf_prog_attach_opts(prog_fd, ifindex, target, &opta);
2427+ if (!ASSERT_EQ(err, 0, "prog_attach"))
2428+ goto cleanup;
2429+ assert_mprog_count_ifindex(ifindex, target, i + 1);
2430+ if (i == max_progs - 1 && relative)
2431+ last_fd = prog_fd;
2432+ else
2433+ close(prog_fd);
2434+ }
2435+
2436+ prog_fd = generate_dummy_prog();
2437+ if (!ASSERT_GE(prog_fd, 0, "dummy_prog"))
2438+ goto cleanup;
2439+ opta.flags = flags;
2440+ if (last_fd > 0)
2441+ opta.relative_fd = last_fd;
2442+ err = bpf_prog_attach_opts(prog_fd, ifindex, target, &opta);
2443+ ASSERT_EQ(err, -ERANGE, "prog_64_attach");
2444+ assert_mprog_count_ifindex(ifindex, target, max_progs);
2445+ close(prog_fd);
2446+cleanup:
2447+ if (last_fd > 0)
2448+ close(last_fd);
2449+ ASSERT_OK(system("ip link del dev tcx_opts1"), "del veth");
2450+ ASSERT_EQ(if_nametoindex("tcx_opts1"), 0, "dev1_removed");
2451+ ASSERT_EQ(if_nametoindex("tcx_opts2"), 0, "dev2_removed");
2452+}
2453+
2454+void serial_test_tc_opts_max(void)
2455+{
2456+ test_tc_opts_max_target(BPF_TCX_INGRESS, 0, false);
2457+ test_tc_opts_max_target(BPF_TCX_EGRESS, 0, false);
2458+
2459+ test_tc_opts_max_target(BPF_TCX_INGRESS, BPF_F_BEFORE, false);
2460+ test_tc_opts_max_target(BPF_TCX_EGRESS, BPF_F_BEFORE, true);
2461+
2462+ test_tc_opts_max_target(BPF_TCX_INGRESS, BPF_F_AFTER, true);
2463+ test_tc_opts_max_target(BPF_TCX_EGRESS, BPF_F_AFTER, false);
2464+}
tools/testing/selftests/bpf/progs/bpf_cubic.c+3−0
@@ -490,6 +490,8 @@ static __always_inline void hystart_update(struct sock *sk, __u32 delay) · 489 unmodified lines
490490 }
491491 }
492492
493+int bpf_cubic_acked_called = 0;
494+
493495 void BPF_STRUCT_OPS(bpf_cubic_acked, struct sock *sk,
494496 const struct ack_sample *sample)
495497 {
@@ -497,6 +499,7 @@ void BPF_STRUCT_OPS(bpf_cubic_acked, struct sock *sk, · 1 unmodified line
497499 struct bictcp *ca = inet_csk_ca(sk);
498500 __u32 delay;
499501
502+ bpf_cubic_acked_called = 1;
500503 /* Some calls are for duplicates without timetamps */
501504 if (sample->rtt_us < 0)
502505 return;
tools/testing/selftests/netfilter/Makefile+3−2
@@ -6,13 +6,14 @@ TEST_PROGS := nft_trans_stress.sh nft_fib.sh nft_nat.sh bridge_brouter.sh \ · 5 unmodified lines
66 nft_concat_range.sh nft_conntrack_helper.sh \
77 nft_queue.sh nft_meta.sh nf_nat_edemux.sh \
88 ipip-conntrack-mtu.sh conntrack_tcp_unreplied.sh \
9− conntrack_vrf.sh nft_synproxy.sh rpath.sh nft_audit.sh
9+ conntrack_vrf.sh nft_synproxy.sh rpath.sh nft_audit.sh \
10+ conntrack_sctp_collision.sh
1011
1112 HOSTPKG_CONFIG := pkg-config
1213
1314 CFLAGS += $(shell $(HOSTPKG_CONFIG) --cflags libmnl 2>/dev/null)
1415 LDLIBS += $(shell $(HOSTPKG_CONFIG) --libs libmnl 2>/dev/null || echo -lmnl)
1516
16−TEST_GEN_FILES = nf-queue connect_close audit_logread
17+TEST_GEN_FILES = nf-queue connect_close audit_logread sctp_collision
1718
1819 include ../lib.mk
tools/testing/selftests/netfilter/conntrack_sctp_collision.sh+89−0
@@ -0,0 +1,89 @@
1+#!/bin/bash
2+# SPDX-License-Identifier: GPL-2.0
3+#
4+# Testing For SCTP COLLISION SCENARIO as Below:
5+#
6+# 14:35:47.655279 IP CLIENT_IP.PORT > SERVER_IP.PORT: sctp (1) [INIT] [init tag: 2017837359]
7+# 14:35:48.353250 IP SERVER_IP.PORT > CLIENT_IP.PORT: sctp (1) [INIT] [init tag: 1187206187]
8+# 14:35:48.353275 IP CLIENT_IP.PORT > SERVER_IP.PORT: sctp (1) [INIT ACK] [init tag: 2017837359]
9+# 14:35:48.353283 IP SERVER_IP.PORT > CLIENT_IP.PORT: sctp (1) [COOKIE ECHO]
10+# 14:35:48.353977 IP CLIENT_IP.PORT > SERVER_IP.PORT: sctp (1) [COOKIE ACK]
11+# 14:35:48.855335 IP SERVER_IP.PORT > CLIENT_IP.PORT: sctp (1) [INIT ACK] [init tag: 164579970]
12+#
13+# TOPO: SERVER_NS (link0)<--->(link1) ROUTER_NS (link2)<--->(link3) CLIENT_NS
14+
15+CLIENT_NS=$(mktemp -u client-XXXXXXXX)
16+CLIENT_IP="198.51.200.1"
17+CLIENT_PORT=1234
18+
19+SERVER_NS=$(mktemp -u server-XXXXXXXX)
20+SERVER_IP="198.51.100.1"
21+SERVER_PORT=1234
22+
23+ROUTER_NS=$(mktemp -u router-XXXXXXXX)
24+CLIENT_GW="198.51.200.2"
25+SERVER_GW="198.51.100.2"
26+
27+# setup the topo
28+setup() {
29+ ip net add $CLIENT_NS
30+ ip net add $SERVER_NS
31+ ip net add $ROUTER_NS
32+ ip -n $SERVER_NS link add link0 type veth peer name link1 netns $ROUTER_NS
33+ ip -n $CLIENT_NS link add link3 type veth peer name link2 netns $ROUTER_NS
34+
35+ ip -n $SERVER_NS link set link0 up
36+ ip -n $SERVER_NS addr add $SERVER_IP/24 dev link0
37+ ip -n $SERVER_NS route add $CLIENT_IP dev link0 via $SERVER_GW
38+
39+ ip -n $ROUTER_NS link set link1 up
40+ ip -n $ROUTER_NS link set link2 up
41+ ip -n $ROUTER_NS addr add $SERVER_GW/24 dev link1
42+ ip -n $ROUTER_NS addr add $CLIENT_GW/24 dev link2
43+ ip net exec $ROUTER_NS sysctl -wq net.ipv4.ip_forward=1
44+
45+ ip -n $CLIENT_NS link set link3 up
46+ ip -n $CLIENT_NS addr add $CLIENT_IP/24 dev link3
47+ ip -n $CLIENT_NS route add $SERVER_IP dev link3 via $CLIENT_GW
48+
49+ # simulate the delay on OVS upcall by setting up a delay for INIT_ACK with
50+ # tc on $SERVER_NS side
51+ tc -n $SERVER_NS qdisc add dev link0 root handle 1: htb
52+ tc -n $SERVER_NS class add dev link0 parent 1: classid 1:1 htb rate 100mbit
53+ tc -n $SERVER_NS filter add dev link0 parent 1: protocol ip u32 match ip protocol 132 \
54+ 0xff match u8 2 0xff at 32 flowid 1:1
55+ tc -n $SERVER_NS qdisc add dev link0 parent 1:1 handle 10: netem delay 1200ms
56+
57+ # simulate the ctstate check on OVS nf_conntrack
58+ ip net exec $ROUTER_NS iptables -A FORWARD -m state --state INVALID,UNTRACKED -j DROP
59+ ip net exec $ROUTER_NS iptables -A INPUT -p sctp -j DROP
60+
61+ # use a smaller number for assoc's max_retrans to reproduce the issue
62+ modprobe sctp
63+ ip net exec $CLIENT_NS sysctl -wq net.sctp.association_max_retrans=3
64+}
65+
66+cleanup() {
67+ ip net exec $CLIENT_NS pkill sctp_collision 2>&1 >/dev/null
68+ ip net exec $SERVER_NS pkill sctp_collision 2>&1 >/dev/null
69+ ip net del "$CLIENT_NS"
70+ ip net del "$SERVER_NS"
71+ ip net del "$ROUTER_NS"
72+}
73+
74+do_test() {
75+ ip net exec $SERVER_NS ./sctp_collision server \
76+ $SERVER_IP $SERVER_PORT $CLIENT_IP $CLIENT_PORT &
77+ ip net exec $CLIENT_NS ./sctp_collision client \
78+ $CLIENT_IP $CLIENT_PORT $SERVER_IP $SERVER_PORT
79+}
80+
81+# NOTE: one way to work around the issue is set a smaller hb_interval
82+# ip net exec $CLIENT_NS sysctl -wq net.sctp.hb_interval=3500
83+
84+# run the test case
85+trap cleanup EXIT
86+setup && \
87+echo "Test for SCTP Collision in nf_conntrack:" && \
88+do_test && echo "PASS!"
89+exit $?
tools/testing/selftests/netfilter/nft_audit.sh+101−16
@@ -12,10 +12,11 @@ nft --version >/dev/null 2>&1 || { · 11 unmodified lines
1212 }
1313
1414 logfile=$(mktemp)
15+rulefile=$(mktemp)
1516 echo "logging into $logfile"
1617 ./audit_logread >"$logfile" &
1718 logread_pid=$!
18−trap 'kill $logread_pid; rm -f $logfile' EXIT
19+trap 'kill $logread_pid; rm -f $logfile $rulefile' EXIT
1920 exec 3<"$logfile"
2021
2122 do_test() { # (cmd, log)
@@ -26,12 +27,14 @@ do_test() { # (cmd, log) · 4 unmodified lines
2627 res=$(diff -a -u <(echo "$2") - <&3)
2728 [ $? -eq 0 ] && { echo "OK"; return; }
2829 echo "FAIL"
29− echo "$res"
30− ((RC++))
30+ grep -v '^\(---\|+++\|@@\)' <<< "$res"
31+ ((RC--))
3132 }
3233
3334 nft flush ruleset
3435
36+# adding tables, chains and rules
37+
3538 for table in t1 t2; do
3639 do_test "nft add table $table" \
3740 "table=$table family=2 entries=1 op=nft_register_table"
@@ -62,6 +65,48 @@ for table in t1 t2; do · 24 unmodified lines
6265 "table=$table family=2 entries=6 op=nft_register_rule"
6366 done
6467
68+for ((i = 0; i < 500; i++)); do
69+ echo "add rule t2 c3 counter accept comment \"rule $i\""
70+done >$rulefile
71+do_test "nft -f $rulefile" \
72+'table=t2 family=2 entries=500 op=nft_register_rule'
73+
74+# adding sets and elements
75+
76+settype='type inet_service; counter'
77+setelem='{ 22, 80, 443 }'
78+setblock="{ $settype; elements = $setelem; }"
79+do_test "nft add set t1 s $setblock" \
80+"table=t1 family=2 entries=4 op=nft_register_set"
81+
82+do_test "nft add set t1 s2 $setblock; add set t1 s3 { $settype; }" \
83+"table=t1 family=2 entries=5 op=nft_register_set"
84+
85+do_test "nft add element t1 s3 $setelem" \
86+"table=t1 family=2 entries=3 op=nft_register_setelem"
87+
88+# adding counters
89+
90+do_test 'nft add counter t1 c1' \
91+'table=t1 family=2 entries=1 op=nft_register_obj'
92+
93+do_test 'nft add counter t2 c1; add counter t2 c2' \
94+'table=t2 family=2 entries=2 op=nft_register_obj'
95+
96+# adding/updating quotas
97+
98+do_test 'nft add quota t1 q1 { 10 bytes }' \
99+'table=t1 family=2 entries=1 op=nft_register_obj'
100+
101+do_test 'nft add quota t2 q1 { 10 bytes }; add quota t2 q2 { 10 bytes }' \
102+'table=t2 family=2 entries=2 op=nft_register_obj'
103+
104+# changing the quota value triggers obj update path
105+do_test 'nft add quota t1 q1 { 20 bytes }' \
106+'table=t1 family=2 entries=1 op=nft_register_obj'
107+
108+# resetting rules
109+
65110 do_test 'nft reset rules t1 c2' \
66111 'table=t1 family=2 entries=3 op=nft_reset_rule'
67112
@@ -70,19 +115,6 @@ do_test 'nft reset rules table t1' \ · 2 unmodified lines
70115 table=t1 family=2 entries=3 op=nft_reset_rule
71116 table=t1 family=2 entries=3 op=nft_reset_rule'
72117
73−do_test 'nft reset rules' \
74−'table=t1 family=2 entries=3 op=nft_reset_rule
75−table=t1 family=2 entries=3 op=nft_reset_rule
76−table=t1 family=2 entries=3 op=nft_reset_rule
77−table=t2 family=2 entries=3 op=nft_reset_rule
78−table=t2 family=2 entries=3 op=nft_reset_rule
79−table=t2 family=2 entries=3 op=nft_reset_rule'
80−
81−for ((i = 0; i < 500; i++)); do
82− echo "add rule t2 c3 counter accept comment \"rule $i\""
83−done | do_test 'nft -f -' \
84−'table=t2 family=2 entries=500 op=nft_register_rule'
85−
86118 do_test 'nft reset rules t2 c3' \
87119 'table=t2 family=2 entries=189 op=nft_reset_rule
88120 table=t2 family=2 entries=188 op=nft_reset_rule
@@ -105,4 +137,57 @@ table=t2 family=2 entries=180 op=nft_reset_rule · 16 unmodified lines
105137 table=t2 family=2 entries=188 op=nft_reset_rule
106138 table=t2 family=2 entries=135 op=nft_reset_rule'
107139
140+# resetting sets and elements
141+
142+elem=(22 ,80 ,443)
143+relem=""
144+for i in {1..3}; do
145+ relem+="${elem[((i - 1))]}"
146+ do_test "nft reset element t1 s { $relem }" \
147+ "table=t1 family=2 entries=$i op=nft_reset_setelem"
148+done
149+
150+do_test 'nft reset set t1 s' \
151+'table=t1 family=2 entries=3 op=nft_reset_setelem'
152+
153+# deleting rules
154+
155+readarray -t handles < <(nft -a list chain t1 c1 | \
156+ sed -n 's/.*counter.* handle \(.*\)$/\1/p')
157+
158+do_test "nft delete rule t1 c1 handle ${handles[0]}" \
159+'table=t1 family=2 entries=1 op=nft_unregister_rule'
160+
161+cmd='delete rule t1 c1 handle'
162+do_test "nft $cmd ${handles[1]}; $cmd ${handles[2]}" \
163+'table=t1 family=2 entries=2 op=nft_unregister_rule'
164+
165+do_test 'nft flush chain t1 c2' \
166+'table=t1 family=2 entries=3 op=nft_unregister_rule'
167+
168+do_test 'nft flush table t2' \
169+'table=t2 family=2 entries=509 op=nft_unregister_rule'
170+
171+# deleting chains
172+
173+do_test 'nft delete chain t2 c2' \
174+'table=t2 family=2 entries=1 op=nft_unregister_chain'
175+
176+# deleting sets and elements
177+
178+do_test 'nft delete element t1 s { 22 }' \
179+'table=t1 family=2 entries=1 op=nft_unregister_setelem'
180+
181+do_test 'nft delete element t1 s { 80, 443 }' \
182+'table=t1 family=2 entries=2 op=nft_unregister_setelem'
183+
184+do_test 'nft flush set t1 s2' \
185+'table=t1 family=2 entries=3 op=nft_unregister_setelem'
186+
187+do_test 'nft delete set t1 s2' \
188+'table=t1 family=2 entries=1 op=nft_unregister_set'
189+
190+do_test 'nft delete set t1 s3' \
191+'table=t1 family=2 entries=1 op=nft_unregister_set'
192+
108193 exit $RC
tools/testing/selftests/netfilter/sctp_collision.c+99−0
@@ -0,0 +1,99 @@
1+// SPDX-License-Identifier: GPL-2.0
2+
3+#include <stdio.h>
4+#include <stdlib.h>
5+#include <string.h>
6+#include <unistd.h>
7+#include <arpa/inet.h>
8+
9+int main(int argc, char *argv[])
10+{
11+ struct sockaddr_in saddr = {}, daddr = {};
12+ int sd, ret, len = sizeof(daddr);
13+ struct timeval tv = {25, 0};
14+ char buf[] = "hello";
15+
16+ if (argc != 6 || (strcmp(argv[1], "server") && strcmp(argv[1], "client"))) {
17+ printf("%s <server|client> <LOCAL_IP> <LOCAL_PORT> <REMOTE_IP> <REMOTE_PORT>\n",
18+ argv[0]);
19+ return -1;
20+ }
21+
22+ sd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
23+ if (sd < 0) {
24+ printf("Failed to create sd\n");
25+ return -1;
26+ }
27+
28+ saddr.sin_family = AF_INET;
29+ saddr.sin_addr.s_addr = inet_addr(argv[2]);
30+ saddr.sin_port = htons(atoi(argv[3]));
31+
32+ ret = bind(sd, (struct sockaddr *)&saddr, sizeof(saddr));
33+ if (ret < 0) {
34+ printf("Failed to bind to address\n");
35+ goto out;
36+ }
37+
38+ ret = listen(sd, 5);
39+ if (ret < 0) {
40+ printf("Failed to listen on port\n");
41+ goto out;
42+ }
43+
44+ daddr.sin_family = AF_INET;
45+ daddr.sin_addr.s_addr = inet_addr(argv[4]);
46+ daddr.sin_port = htons(atoi(argv[5]));
47+
48+ /* make test shorter than 25s */
49+ ret = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
50+ if (ret < 0) {
51+ printf("Failed to setsockopt SO_RCVTIMEO\n");
52+ goto out;
53+ }
54+
55+ if (!strcmp(argv[1], "server")) {
56+ sleep(1); /* wait a bit for client's INIT */
57+ ret = connect(sd, (struct sockaddr *)&daddr, len);
58+ if (ret < 0) {
59+ printf("Failed to connect to peer\n");
60+ goto out;
61+ }
62+ ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len);
63+ if (ret < 0) {
64+ printf("Failed to recv msg %d\n", ret);
65+ goto out;
66+ }
67+ ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len);
68+ if (ret < 0) {
69+ printf("Failed to send msg %d\n", ret);
70+ goto out;
71+ }
72+ printf("Server: sent! %d\n", ret);
73+ }
74+
75+ if (!strcmp(argv[1], "client")) {
76+ usleep(300000); /* wait a bit for server's listening */
77+ ret = connect(sd, (struct sockaddr *)&daddr, len);
78+ if (ret < 0) {
79+ printf("Failed to connect to peer\n");
80+ goto out;
81+ }
82+ sleep(1); /* wait a bit for server's delayed INIT_ACK to reproduce the issue */
83+ ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len);
84+ if (ret < 0) {
85+ printf("Failed to send msg %d\n", ret);
86+ goto out;
87+ }
88+ ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len);
89+ if (ret < 0) {
90+ printf("Failed to recv msg %d\n", ret);
91+ goto out;
92+ }
93+ printf("Client: rcvd! %d\n", ret);
94+ }
95+ ret = 0;
96+out:
97+ close(sd);
98+ return ret;
99+}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t