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

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

Pull networking fixes from Jakub Kicinski:
"Including fixes from bpf, netfilter, and ieee802154.

Current release - regressions:

- Partially revert "net/smc: Add netlink net namespace support", fix
uABI breakage

- netfilter:
- nft_ct: fix use after free when attaching zone template
- nft_byteorder: track register operations

Previous releases - regressions:

- ipheth: fix EOVERFLOW in ipheth_rcvbulk_callback

- phy: qca8081: fix speeds lower than 2.5Gb/s

- sched: fix use-after-free in tc_new_tfilter()

Previous releases - always broken:

- tcp: fix mem under-charging with zerocopy sendmsg()

- tcp: add missing tcp_skb_can_collapse() test in
tcp_shift_skb_data()

- neigh: do not trigger immediate probes on NUD_FAILED from
neigh_managed_work, avoid a deadlock

- bpf: use VM_MAP instead of VM_ALLOC for ringbuf, avoid KASAN
false-positives

- netfilter: nft_reject_bridge: fix for missing reply from prerouting

- smc: forward wakeup to smc socket waitqueue after fallback

- ieee802154:
- return meaningful error codes from the netlink helpers
- mcr20a: fix lifs/sifs periods
- at86rf230, ca8210: stop leaking skbs on error paths

- macsec: add missing un-offload call for NETDEV_UNREGISTER of parent

- ax25: add refcount in ax25_dev to avoid UAF bugs

- eth: mlx5e:
- fix SFP module EEPROM query
- fix broken SKB allocation in HW-GRO
- IPsec offload: fix tunnel mode crypto for non-TCP/UDP flows

- eth: amd-xgbe:
- fix skb data length underflow
- ensure reset of the tx_timer_active flag, avoid Tx timeouts

- eth: stmmac: fix runtime pm use in stmmac_dvr_remove()

- eth: e1000e: handshake with CSME starts from Alder Lake platforms"

* tag 'net-5.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (69 commits)
ax25: fix reference count leaks of ax25_dev
net: stmmac: ensure PTP time register reads are consistent
net: ipa: request IPA register values be retained
dt-bindings: net: qcom,ipa: add optional qcom,qmp property
tools/resolve_btfids: Do not print any commands when building silently
bpf: Use VM_MAP instead of VM_ALLOC for ringbuf
net, neigh: Do not trigger immediate probes on NUD_FAILED from neigh_managed_work
tcp: add missing tcp_skb_can_collapse() test in tcp_shift_skb_data()
net: sparx5: do not refer to skb after passing it on
Partially revert "net/smc: Add netlink net namespace support"
net/mlx5e: Avoid field-overflowing memcpy()
net/mlx5e: Use struct_group() for memcpy() region
net/mlx5e: Avoid implicit modify hdr for decap drop rule
net/mlx5e: IPsec: Fix tunnel mode crypto offload for non TCP/UDP traffic
net/mlx5e: IPsec: Fix crypto offload for non TCP/UDP encapsulated traffic
net/mlx5e: Don't treat small ceil values as unlimited in HTB offload
net/mlx5: E-Switch, Fix uninitialized variable modact
net/mlx5e: Fix handling of wrong devices during bond netevent
net/mlx5e: Fix broken SKB allocation in HW-GRO
net/mlx5e: Fix wrong calculation of header index in HW_GRO
...

+876 -452
+6
Documentation/devicetree/bindings/net/qcom,ipa.yaml
··· 107 107 - const: imem 108 108 - const: config 109 109 110 + qcom,qmp: 111 + $ref: /schemas/types.yaml#/definitions/phandle 112 + description: phandle to the AOSS side-channel message RAM 113 + 110 114 qcom,smem-states: 111 115 $ref: /schemas/types.yaml#/definitions/phandle-array 112 116 description: State bits used in by the AP to signal the modem. ··· 225 221 interconnect-names = "memory", 226 222 "imem", 227 223 "config"; 224 + 225 + qcom,qmp = <&aoss_qmp>; 228 226 229 227 qcom,smem-states = <&ipa_smp2p_out 0>, 230 228 <&ipa_smp2p_out 1>;
+1 -2
MAINTAINERS
··· 4157 4157 K: csky 4158 4158 4159 4159 CA8210 IEEE-802.15.4 RADIO DRIVER 4160 - M: Harry Morris <h.morris@cascoda.com> 4161 4160 L: linux-wpan@vger.kernel.org 4162 - S: Maintained 4161 + S: Orphan 4163 4162 W: https://github.com/Cascoda/ca8210-linux.git 4164 4163 F: Documentation/devicetree/bindings/net/ieee802154/ca8210.txt 4165 4164 F: drivers/net/ieee802154/ca8210.c
+1
drivers/net/dsa/Kconfig
··· 36 36 config NET_DSA_MT7530 37 37 tristate "MediaTek MT753x and MT7621 Ethernet switch support" 38 38 select NET_DSA_TAG_MTK 39 + select MEDIATEK_GE_PHY 39 40 help 40 41 This enables support for the MediaTek MT7530, MT7531, and MT7621 41 42 Ethernet switch chips.
+13 -1
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
··· 721 721 if (!channel->tx_ring) 722 722 break; 723 723 724 + /* Deactivate the Tx timer */ 724 725 del_timer_sync(&channel->tx_timer); 726 + channel->tx_timer_active = 0; 725 727 } 726 728 } 727 729 ··· 2552 2550 buf2_len = xgbe_rx_buf2_len(rdata, packet, len); 2553 2551 len += buf2_len; 2554 2552 2553 + if (buf2_len > rdata->rx.buf.dma_len) { 2554 + /* Hardware inconsistency within the descriptors 2555 + * that has resulted in a length underflow. 2556 + */ 2557 + error = 1; 2558 + goto skip_data; 2559 + } 2560 + 2555 2561 if (!skb) { 2556 2562 skb = xgbe_create_skb(pdata, napi, rdata, 2557 2563 buf1_len); ··· 2589 2579 if (!last || context_next) 2590 2580 goto read_again; 2591 2581 2592 - if (!skb) 2582 + if (!skb || error) { 2583 + dev_kfree_skb(skb); 2593 2584 goto next_packet; 2585 + } 2594 2586 2595 2587 /* Be sure we don't exceed the configured MTU */ 2596 2588 max_len = netdev->mtu + ETH_HLEN;
+1 -1
drivers/net/ethernet/google/gve/gve_adminq.c
··· 301 301 */ 302 302 static int gve_adminq_kick_and_wait(struct gve_priv *priv) 303 303 { 304 - u32 tail, head; 304 + int tail, head; 305 305 int i; 306 306 307 307 tail = ioread32be(&priv->reg_bar0->adminq_event_counter);
+3 -1
drivers/net/ethernet/intel/e1000e/e1000.h
··· 115 115 board_pch_lpt, 116 116 board_pch_spt, 117 117 board_pch_cnp, 118 - board_pch_tgp 118 + board_pch_tgp, 119 + board_pch_adp 119 120 }; 120 121 121 122 struct e1000_ps_page { ··· 503 502 extern const struct e1000_info e1000_pch_spt_info; 504 503 extern const struct e1000_info e1000_pch_cnp_info; 505 504 extern const struct e1000_info e1000_pch_tgp_info; 505 + extern const struct e1000_info e1000_pch_adp_info; 506 506 extern const struct e1000_info e1000_es2_info; 507 507 508 508 void e1000e_ptp_init(struct e1000_adapter *adapter);
+20
drivers/net/ethernet/intel/e1000e/ich8lan.c
··· 6021 6021 .phy_ops = &ich8_phy_ops, 6022 6022 .nvm_ops = &spt_nvm_ops, 6023 6023 }; 6024 + 6025 + const struct e1000_info e1000_pch_adp_info = { 6026 + .mac = e1000_pch_adp, 6027 + .flags = FLAG_IS_ICH 6028 + | FLAG_HAS_WOL 6029 + | FLAG_HAS_HW_TIMESTAMP 6030 + | FLAG_HAS_CTRLEXT_ON_LOAD 6031 + | FLAG_HAS_AMT 6032 + | FLAG_HAS_FLASH 6033 + | FLAG_HAS_JUMBO_FRAMES 6034 + | FLAG_APME_IN_WUC, 6035 + .flags2 = FLAG2_HAS_PHY_STATS 6036 + | FLAG2_HAS_EEE, 6037 + .pba = 26, 6038 + .max_hw_frame_size = 9022, 6039 + .get_variants = e1000_get_variants_ich8lan, 6040 + .mac_ops = &ich8_mac_ops, 6041 + .phy_ops = &ich8_phy_ops, 6042 + .nvm_ops = &spt_nvm_ops, 6043 + };
+21 -18
drivers/net/ethernet/intel/e1000e/netdev.c
··· 52 52 [board_pch_spt] = &e1000_pch_spt_info, 53 53 [board_pch_cnp] = &e1000_pch_cnp_info, 54 54 [board_pch_tgp] = &e1000_pch_tgp_info, 55 + [board_pch_adp] = &e1000_pch_adp_info, 55 56 }; 56 57 57 58 struct e1000_reg_info { ··· 6342 6341 u32 mac_data; 6343 6342 u16 phy_data; 6344 6343 6345 - if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) { 6344 + if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID && 6345 + hw->mac.type >= e1000_pch_adp) { 6346 6346 /* Request ME configure the device for S0ix */ 6347 6347 mac_data = er32(H2ME); 6348 6348 mac_data |= E1000_H2ME_START_DPG; ··· 6492 6490 u16 phy_data; 6493 6491 u32 i = 0; 6494 6492 6495 - if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) { 6493 + if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID && 6494 + hw->mac.type >= e1000_pch_adp) { 6496 6495 /* Request ME unconfigure the device from S0ix */ 6497 6496 mac_data = er32(H2ME); 6498 6497 mac_data &= ~E1000_H2ME_START_DPG; ··· 7901 7898 { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_TGP_I219_V14), board_pch_tgp }, 7902 7899 { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_TGP_I219_LM15), board_pch_tgp }, 7903 7900 { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_TGP_I219_V15), board_pch_tgp }, 7904 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_LM23), board_pch_tgp }, 7905 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_V23), board_pch_tgp }, 7906 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_LM16), board_pch_tgp }, 7907 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_V16), board_pch_tgp }, 7908 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_LM17), board_pch_tgp }, 7909 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_V17), board_pch_tgp }, 7910 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_LM22), board_pch_tgp }, 7911 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_V22), board_pch_tgp }, 7912 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_LM18), board_pch_tgp }, 7913 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_V18), board_pch_tgp }, 7914 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_LM19), board_pch_tgp }, 7915 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_V19), board_pch_tgp }, 7916 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_LM20), board_pch_tgp }, 7917 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_V20), board_pch_tgp }, 7918 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_LM21), board_pch_tgp }, 7919 - { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_V21), board_pch_tgp }, 7901 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_LM23), board_pch_adp }, 7902 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_V23), board_pch_adp }, 7903 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_LM16), board_pch_adp }, 7904 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_V16), board_pch_adp }, 7905 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_LM17), board_pch_adp }, 7906 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ADP_I219_V17), board_pch_adp }, 7907 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_LM22), board_pch_adp }, 7908 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_RPL_I219_V22), board_pch_adp }, 7909 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_LM18), board_pch_adp }, 7910 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_V18), board_pch_adp }, 7911 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_LM19), board_pch_adp }, 7912 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_MTP_I219_V19), board_pch_adp }, 7913 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_LM20), board_pch_adp }, 7914 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_V20), board_pch_adp }, 7915 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_LM21), board_pch_adp }, 7916 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_V21), board_pch_adp }, 7920 7917 7921 7918 { 0, 0, 0, 0, 0, 0, 0 } /* terminate list */ 7922 7919 };
+1
drivers/net/ethernet/intel/i40e/i40e.h
··· 144 144 __I40E_VIRTCHNL_OP_PENDING, 145 145 __I40E_RECOVERY_MODE, 146 146 __I40E_VF_RESETS_DISABLED, /* disable resets during i40e_remove */ 147 + __I40E_IN_REMOVE, 147 148 __I40E_VFS_RELEASING, 148 149 /* This must be last as it determines the size of the BITMAP */ 149 150 __I40E_STATE_SIZE__,
+29 -2
drivers/net/ethernet/intel/i40e/i40e_main.c
··· 5372 5372 /* There is no need to reset BW when mqprio mode is on. */ 5373 5373 if (pf->flags & I40E_FLAG_TC_MQPRIO) 5374 5374 return 0; 5375 - if (!vsi->mqprio_qopt.qopt.hw && !(pf->flags & I40E_FLAG_DCB_ENABLED)) { 5375 + 5376 + if (!vsi->mqprio_qopt.qopt.hw) { 5377 + if (pf->flags & I40E_FLAG_DCB_ENABLED) 5378 + goto skip_reset; 5379 + 5380 + if (IS_ENABLED(CONFIG_I40E_DCB) && 5381 + i40e_dcb_hw_get_num_tc(&pf->hw) == 1) 5382 + goto skip_reset; 5383 + 5376 5384 ret = i40e_set_bw_limit(vsi, vsi->seid, 0); 5377 5385 if (ret) 5378 5386 dev_info(&pf->pdev->dev, ··· 5388 5380 vsi->seid); 5389 5381 return ret; 5390 5382 } 5383 + 5384 + skip_reset: 5391 5385 memset(&bw_data, 0, sizeof(bw_data)); 5392 5386 bw_data.tc_valid_bits = enabled_tc; 5393 5387 for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) ··· 10863 10853 bool lock_acquired) 10864 10854 { 10865 10855 int ret; 10856 + 10857 + if (test_bit(__I40E_IN_REMOVE, pf->state)) 10858 + return; 10866 10859 /* Now we wait for GRST to settle out. 10867 10860 * We don't have to delete the VEBs or VSIs from the hw switch 10868 10861 * because the reset will make them disappear. ··· 12225 12212 12226 12213 vsi->req_queue_pairs = queue_count; 12227 12214 i40e_prep_for_reset(pf); 12215 + if (test_bit(__I40E_IN_REMOVE, pf->state)) 12216 + return pf->alloc_rss_size; 12228 12217 12229 12218 pf->alloc_rss_size = new_rss_size; 12230 12219 ··· 13052 13037 13053 13038 if (need_reset) 13054 13039 i40e_prep_for_reset(pf); 13040 + 13041 + /* VSI shall be deleted in a moment, just return EINVAL */ 13042 + if (test_bit(__I40E_IN_REMOVE, pf->state)) 13043 + return -EINVAL; 13055 13044 13056 13045 old_prog = xchg(&vsi->xdp_prog, prog); 13057 13046 ··· 15947 15928 i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), 0); 15948 15929 i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), 0); 15949 15930 15950 - while (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) 15931 + /* Grab __I40E_RESET_RECOVERY_PENDING and set __I40E_IN_REMOVE 15932 + * flags, once they are set, i40e_rebuild should not be called as 15933 + * i40e_prep_for_reset always returns early. 15934 + */ 15935 + while (test_and_set_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) 15951 15936 usleep_range(1000, 2000); 15937 + set_bit(__I40E_IN_REMOVE, pf->state); 15952 15938 15953 15939 if (pf->flags & I40E_FLAG_SRIOV_ENABLED) { 15954 15940 set_bit(__I40E_VF_RESETS_DISABLED, pf->state); ··· 16151 16127 static void i40e_pci_error_reset_done(struct pci_dev *pdev) 16152 16128 { 16153 16129 struct i40e_pf *pf = pci_get_drvdata(pdev); 16130 + 16131 + if (test_bit(__I40E_IN_REMOVE, pf->state)) 16132 + return; 16154 16133 16155 16134 i40e_reset_and_rebuild(pf, false, false); 16156 16135 }
+3 -3
drivers/net/ethernet/mellanox/mlx5/core/en.h
··· 224 224 struct mlx5e_tx_wqe { 225 225 struct mlx5_wqe_ctrl_seg ctrl; 226 226 struct mlx5_wqe_eth_seg eth; 227 - struct mlx5_wqe_data_seg data[0]; 227 + struct mlx5_wqe_data_seg data[]; 228 228 }; 229 229 230 230 struct mlx5e_rx_wqe_ll { ··· 241 241 struct mlx5_wqe_umr_ctrl_seg uctrl; 242 242 struct mlx5_mkey_seg mkc; 243 243 union { 244 - struct mlx5_mtt inline_mtts[0]; 245 - struct mlx5_klm inline_klms[0]; 244 + DECLARE_FLEX_ARRAY(struct mlx5_mtt, inline_mtts); 245 + DECLARE_FLEX_ARRAY(struct mlx5_klm, inline_klms); 246 246 }; 247 247 }; 248 248
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c
··· 570 570 571 571 static void mlx5e_htb_convert_ceil(struct mlx5e_priv *priv, u64 ceil, u32 *max_average_bw) 572 572 { 573 - *max_average_bw = div_u64(ceil, BYTES_IN_MBIT); 573 + /* Hardware treats 0 as "unlimited", set at least 1. */ 574 + *max_average_bw = max_t(u32, div_u64(ceil, BYTES_IN_MBIT), 1); 574 575 575 576 qos_dbg(priv->mdev, "Convert: ceil %llu -> max_average_bw %u\n", 576 577 ceil, *max_average_bw);
+14 -18
drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c
··· 183 183 184 184 static bool mlx5e_rep_is_lag_netdev(struct net_device *netdev) 185 185 { 186 - struct mlx5e_rep_priv *rpriv; 187 - struct mlx5e_priv *priv; 188 - 189 - /* A given netdev is not a representor or not a slave of LAG configuration */ 190 - if (!mlx5e_eswitch_rep(netdev) || !netif_is_lag_port(netdev)) 191 - return false; 192 - 193 - priv = netdev_priv(netdev); 194 - rpriv = priv->ppriv; 195 - 196 - /* Egress acl forward to vport is supported only non-uplink representor */ 197 - return rpriv->rep->vport != MLX5_VPORT_UPLINK; 186 + return netif_is_lag_port(netdev) && mlx5e_eswitch_vf_rep(netdev); 198 187 } 199 188 200 189 static void mlx5e_rep_changelowerstate_event(struct net_device *netdev, void *ptr) ··· 198 209 u16 acl_vport_num; 199 210 u16 fwd_vport_num; 200 211 int err; 201 - 202 - if (!mlx5e_rep_is_lag_netdev(netdev)) 203 - return; 204 212 205 213 info = ptr; 206 214 lag_info = info->lower_state_info; ··· 252 266 struct net_device *lag_dev; 253 267 struct mlx5e_priv *priv; 254 268 255 - if (!mlx5e_rep_is_lag_netdev(netdev)) 256 - return; 257 - 258 269 priv = netdev_priv(netdev); 259 270 rpriv = priv->ppriv; 260 271 lag_dev = info->upper_dev; ··· 276 293 unsigned long event, void *ptr) 277 294 { 278 295 struct net_device *netdev = netdev_notifier_info_to_dev(ptr); 296 + struct mlx5e_rep_priv *rpriv; 297 + struct mlx5e_rep_bond *bond; 298 + struct mlx5e_priv *priv; 299 + 300 + if (!mlx5e_rep_is_lag_netdev(netdev)) 301 + return NOTIFY_DONE; 302 + 303 + bond = container_of(nb, struct mlx5e_rep_bond, nb); 304 + priv = netdev_priv(netdev); 305 + rpriv = mlx5_eswitch_get_uplink_priv(priv->mdev->priv.eswitch, REP_ETH); 306 + /* Verify VF representor is on the same device of the bond handling the netevent. */ 307 + if (rpriv->uplink_priv.bond != bond) 308 + return NOTIFY_DONE; 279 309 280 310 switch (event) { 281 311 case NETDEV_CHANGELOWERSTATE:
+4 -2
drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c
··· 491 491 } 492 492 493 493 br_offloads->netdev_nb.notifier_call = mlx5_esw_bridge_switchdev_port_event; 494 - err = register_netdevice_notifier(&br_offloads->netdev_nb); 494 + err = register_netdevice_notifier_net(&init_net, &br_offloads->netdev_nb); 495 495 if (err) { 496 496 esw_warn(mdev, "Failed to register bridge offloads netdevice notifier (err=%d)\n", 497 497 err); ··· 509 509 err_register_swdev: 510 510 destroy_workqueue(br_offloads->wq); 511 511 err_alloc_wq: 512 + rtnl_lock(); 512 513 mlx5_esw_bridge_cleanup(esw); 514 + rtnl_unlock(); 513 515 } 514 516 515 517 void mlx5e_rep_bridge_cleanup(struct mlx5e_priv *priv) ··· 526 524 return; 527 525 528 526 cancel_delayed_work_sync(&br_offloads->update_work); 529 - unregister_netdevice_notifier(&br_offloads->netdev_nb); 527 + unregister_netdevice_notifier_net(&init_net, &br_offloads->netdev_nb); 530 528 unregister_switchdev_blocking_notifier(&br_offloads->nb_blk); 531 529 unregister_switchdev_notifier(&br_offloads->nb); 532 530 destroy_workqueue(br_offloads->wq);
+5
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
··· 167 167 return pi; 168 168 } 169 169 170 + static inline u16 mlx5e_shampo_get_cqe_header_index(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 171 + { 172 + return be16_to_cpu(cqe->shampo.header_entry_index) & (rq->mpwqe.shampo->hd_per_wq - 1); 173 + } 174 + 170 175 struct mlx5e_shampo_umr { 171 176 u16 len; 172 177 };
+3 -1
drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
··· 341 341 342 342 /* copy the inline part if required */ 343 343 if (sq->min_inline_mode != MLX5_INLINE_MODE_NONE) { 344 - memcpy(eseg->inline_hdr.start, xdptxd->data, MLX5E_XDP_MIN_INLINE); 344 + memcpy(eseg->inline_hdr.start, xdptxd->data, sizeof(eseg->inline_hdr.start)); 345 345 eseg->inline_hdr.sz = cpu_to_be16(MLX5E_XDP_MIN_INLINE); 346 + memcpy(dseg, xdptxd->data + sizeof(eseg->inline_hdr.start), 347 + MLX5E_XDP_MIN_INLINE - sizeof(eseg->inline_hdr.start)); 346 348 dma_len -= MLX5E_XDP_MIN_INLINE; 347 349 dma_addr += MLX5E_XDP_MIN_INLINE; 348 350 dseg++;
+11 -2
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c
··· 157 157 /* Tunnel mode */ 158 158 if (mode == XFRM_MODE_TUNNEL) { 159 159 eseg->swp_inner_l3_offset = skb_inner_network_offset(skb) / 2; 160 - eseg->swp_inner_l4_offset = skb_inner_transport_offset(skb) / 2; 161 160 if (xo->proto == IPPROTO_IPV6) 162 161 eseg->swp_flags |= MLX5_ETH_WQE_SWP_INNER_L3_IPV6; 163 - if (inner_ip_hdr(skb)->protocol == IPPROTO_UDP) 162 + 163 + switch (xo->inner_ipproto) { 164 + case IPPROTO_UDP: 164 165 eseg->swp_flags |= MLX5_ETH_WQE_SWP_INNER_L4_UDP; 166 + fallthrough; 167 + case IPPROTO_TCP: 168 + /* IP | ESP | IP | [TCP | UDP] */ 169 + eseg->swp_inner_l4_offset = skb_inner_transport_offset(skb) / 2; 170 + break; 171 + default: 172 + break; 173 + } 165 174 return; 166 175 } 167 176
+6 -3
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h
··· 131 131 mlx5e_ipsec_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, 132 132 struct mlx5_wqe_eth_seg *eseg) 133 133 { 134 - struct xfrm_offload *xo = xfrm_offload(skb); 134 + u8 inner_ipproto; 135 135 136 136 if (!mlx5e_ipsec_eseg_meta(eseg)) 137 137 return false; 138 138 139 139 eseg->cs_flags = MLX5_ETH_WQE_L3_CSUM; 140 - if (xo->inner_ipproto) { 141 - eseg->cs_flags |= MLX5_ETH_WQE_L4_INNER_CSUM | MLX5_ETH_WQE_L3_INNER_CSUM; 140 + inner_ipproto = xfrm_offload(skb)->inner_ipproto; 141 + if (inner_ipproto) { 142 + eseg->cs_flags |= MLX5_ETH_WQE_L3_INNER_CSUM; 143 + if (inner_ipproto == IPPROTO_TCP || inner_ipproto == IPPROTO_UDP) 144 + eseg->cs_flags |= MLX5_ETH_WQE_L4_INNER_CSUM; 142 145 } else if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { 143 146 eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM; 144 147 sq->stats->csum_partial_inner++;
+19 -11
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
··· 1117 1117 static void mlx5e_shampo_update_fin_psh_flags(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, 1118 1118 struct tcphdr *skb_tcp_hd) 1119 1119 { 1120 - u16 header_index = be16_to_cpu(cqe->shampo.header_entry_index); 1120 + u16 header_index = mlx5e_shampo_get_cqe_header_index(rq, cqe); 1121 1121 struct tcphdr *last_tcp_hd; 1122 1122 void *last_hd_addr; 1123 1123 ··· 1871 1871 return skb; 1872 1872 } 1873 1873 1874 - static void 1874 + static struct sk_buff * 1875 1875 mlx5e_skb_from_cqe_shampo(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, 1876 1876 struct mlx5_cqe64 *cqe, u16 header_index) 1877 1877 { ··· 1895 1895 skb = mlx5e_build_linear_skb(rq, hdr, frag_size, rx_headroom, head_size); 1896 1896 1897 1897 if (unlikely(!skb)) 1898 - return; 1898 + return NULL; 1899 1899 1900 1900 /* queue up for recycling/reuse */ 1901 1901 page_ref_inc(head->page); ··· 1907 1907 ALIGN(head_size, sizeof(long))); 1908 1908 if (unlikely(!skb)) { 1909 1909 rq->stats->buff_alloc_err++; 1910 - return; 1910 + return NULL; 1911 1911 } 1912 1912 1913 1913 prefetchw(skb->data); ··· 1918 1918 skb->tail += head_size; 1919 1919 skb->len += head_size; 1920 1920 } 1921 - rq->hw_gro_data->skb = skb; 1922 - NAPI_GRO_CB(skb)->count = 1; 1923 - skb_shinfo(skb)->gso_size = mpwrq_get_cqe_byte_cnt(cqe) - head_size; 1921 + return skb; 1924 1922 } 1925 1923 1926 1924 static void ··· 1971 1973 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 1972 1974 { 1973 1975 u16 data_bcnt = mpwrq_get_cqe_byte_cnt(cqe) - cqe->shampo.header_size; 1974 - u16 header_index = be16_to_cpu(cqe->shampo.header_entry_index); 1976 + u16 header_index = mlx5e_shampo_get_cqe_header_index(rq, cqe); 1975 1977 u32 wqe_offset = be32_to_cpu(cqe->shampo.data_offset); 1976 1978 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe); 1977 1979 u32 data_offset = wqe_offset & (PAGE_SIZE - 1); 1978 1980 u32 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe); 1979 1981 u16 wqe_id = be16_to_cpu(cqe->wqe_id); 1980 1982 u32 page_idx = wqe_offset >> PAGE_SHIFT; 1983 + u16 head_size = cqe->shampo.header_size; 1981 1984 struct sk_buff **skb = &rq->hw_gro_data->skb; 1982 1985 bool flush = cqe->shampo.flush; 1983 1986 bool match = cqe->shampo.match; ··· 2010 2011 } 2011 2012 2012 2013 if (!*skb) { 2013 - mlx5e_skb_from_cqe_shampo(rq, wi, cqe, header_index); 2014 + if (likely(head_size)) 2015 + *skb = mlx5e_skb_from_cqe_shampo(rq, wi, cqe, header_index); 2016 + else 2017 + *skb = mlx5e_skb_from_cqe_mpwrq_nonlinear(rq, wi, cqe_bcnt, data_offset, 2018 + page_idx); 2014 2019 if (unlikely(!*skb)) 2015 2020 goto free_hd_entry; 2021 + 2022 + NAPI_GRO_CB(*skb)->count = 1; 2023 + skb_shinfo(*skb)->gso_size = cqe_bcnt - head_size; 2016 2024 } else { 2017 2025 NAPI_GRO_CB(*skb)->count++; 2018 2026 if (NAPI_GRO_CB(*skb)->count == 2 && ··· 2033 2027 } 2034 2028 } 2035 2029 2036 - di = &wi->umr.dma_info[page_idx]; 2037 - mlx5e_fill_skb_data(*skb, rq, di, data_bcnt, data_offset); 2030 + if (likely(head_size)) { 2031 + di = &wi->umr.dma_info[page_idx]; 2032 + mlx5e_fill_skb_data(*skb, rq, di, data_bcnt, data_offset); 2033 + } 2038 2034 2039 2035 mlx5e_shampo_complete_rx_cqe(rq, cqe, cqe_bcnt, *skb); 2040 2036 if (flush)
+14 -1
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
··· 1414 1414 if (err) 1415 1415 goto err_out; 1416 1416 1417 - if (!attr->chain && esw_attr->int_port) { 1417 + if (!attr->chain && esw_attr->int_port && 1418 + attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) { 1418 1419 /* If decap route device is internal port, change the 1419 1420 * source vport value in reg_c0 back to uplink just in 1420 1421 * case the rule performs goto chain > 0. If we have a miss ··· 3189 3188 if (!(actions & 3190 3189 (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) { 3191 3190 NL_SET_ERR_MSG_MOD(extack, "Rule must have at least one forward/drop action"); 3191 + return false; 3192 + } 3193 + 3194 + if (!(~actions & 3195 + (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) { 3196 + NL_SET_ERR_MSG_MOD(extack, "Rule cannot support forward+drop action"); 3197 + return false; 3198 + } 3199 + 3200 + if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR && 3201 + actions & MLX5_FLOW_CONTEXT_ACTION_DROP) { 3202 + NL_SET_ERR_MSG_MOD(extack, "Drop with modify header action is not supported"); 3192 3203 return false; 3193 3204 } 3194 3205
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
··· 208 208 int cpy1_sz = 2 * ETH_ALEN; 209 209 int cpy2_sz = ihs - cpy1_sz; 210 210 211 - memcpy(vhdr, skb->data, cpy1_sz); 211 + memcpy(&vhdr->addrs, skb->data, cpy1_sz); 212 212 vhdr->h_vlan_proto = skb->vlan_proto; 213 213 vhdr->h_vlan_TCI = cpu_to_be16(skb_vlan_tag_get(skb)); 214 214 memcpy(&vhdr->h_vlan_encapsulated_proto, skb->data + cpy1_sz, cpy2_sz);
+4
drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
··· 1574 1574 { 1575 1575 struct mlx5_esw_bridge_offloads *br_offloads; 1576 1576 1577 + ASSERT_RTNL(); 1578 + 1577 1579 br_offloads = kvzalloc(sizeof(*br_offloads), GFP_KERNEL); 1578 1580 if (!br_offloads) 1579 1581 return ERR_PTR(-ENOMEM); ··· 1591 1589 void mlx5_esw_bridge_cleanup(struct mlx5_eswitch *esw) 1592 1590 { 1593 1591 struct mlx5_esw_bridge_offloads *br_offloads = esw->br_offloads; 1592 + 1593 + ASSERT_RTNL(); 1594 1594 1595 1595 if (!br_offloads) 1596 1596 return;
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/esw/diag/bridge_tracepoint.h
··· 21 21 __field(unsigned int, used) 22 22 ), 23 23 TP_fast_assign( 24 - strncpy(__entry->dev_name, 24 + strscpy(__entry->dev_name, 25 25 netdev_name(fdb->dev), 26 26 IFNAMSIZ); 27 27 memcpy(__entry->addr, fdb->key.addr, ETH_ALEN);
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
··· 132 132 { 133 133 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; 134 134 135 - del_timer(&fw_reset->timer); 135 + del_timer_sync(&fw_reset->timer); 136 136 } 137 137 138 138 static void mlx5_sync_reset_clear_reset_requested(struct mlx5_core_dev *dev, bool poll_health)
+5 -4
drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c
··· 121 121 122 122 u32 mlx5_chains_get_prio_range(struct mlx5_fs_chains *chains) 123 123 { 124 - if (!mlx5_chains_prios_supported(chains)) 125 - return 1; 126 - 127 124 if (mlx5_chains_ignore_flow_level_supported(chains)) 128 125 return UINT_MAX; 126 + 127 + if (!chains->dev->priv.eswitch || 128 + chains->dev->priv.eswitch->mode != MLX5_ESWITCH_OFFLOADS) 129 + return 1; 129 130 130 131 /* We should get here only for eswitch case */ 131 132 return FDB_TC_MAX_PRIO; ··· 212 211 create_chain_restore(struct fs_chain *chain) 213 212 { 214 213 struct mlx5_eswitch *esw = chain->chains->dev->priv.eswitch; 215 - char modact[MLX5_UN_SZ_BYTES(set_add_copy_action_in_auto)]; 214 + u8 modact[MLX5_UN_SZ_BYTES(set_add_copy_action_in_auto)] = {}; 216 215 struct mlx5_fs_chains *chains = chain->chains; 217 216 enum mlx5e_tc_attr_to_reg chain_to_reg; 218 217 struct mlx5_modify_hdr *mod_hdr;
+5 -4
drivers/net/ethernet/mellanox/mlx5/core/port.c
··· 406 406 407 407 switch (module_id) { 408 408 case MLX5_MODULE_ID_SFP: 409 - mlx5_sfp_eeprom_params_set(&query.i2c_address, &query.page, &query.offset); 409 + mlx5_sfp_eeprom_params_set(&query.i2c_address, &query.page, &offset); 410 410 break; 411 411 case MLX5_MODULE_ID_QSFP: 412 412 case MLX5_MODULE_ID_QSFP_PLUS: 413 413 case MLX5_MODULE_ID_QSFP28: 414 - mlx5_qsfp_eeprom_params_set(&query.i2c_address, &query.page, &query.offset); 414 + mlx5_qsfp_eeprom_params_set(&query.i2c_address, &query.page, &offset); 415 415 break; 416 416 default: 417 417 mlx5_core_err(dev, "Module ID not recognized: 0x%x\n", module_id); 418 418 return -EINVAL; 419 419 } 420 420 421 - if (query.offset + size > MLX5_EEPROM_PAGE_LENGTH) 421 + if (offset + size > MLX5_EEPROM_PAGE_LENGTH) 422 422 /* Cross pages read, read until offset 256 in low page */ 423 - size -= offset + size - MLX5_EEPROM_PAGE_LENGTH; 423 + size = MLX5_EEPROM_PAGE_LENGTH - offset; 424 424 425 425 query.size = size; 426 + query.offset = offset; 426 427 427 428 return mlx5_query_mcia(dev, &query, data); 428 429 }
+1 -1
drivers/net/ethernet/microchip/sparx5/sparx5_packet.c
··· 145 145 skb_put(skb, byte_cnt - ETH_FCS_LEN); 146 146 eth_skb_pad(skb); 147 147 skb->protocol = eth_type_trans(skb, netdev); 148 - netif_rx(skb); 149 148 netdev->stats.rx_bytes += skb->len; 150 149 netdev->stats.rx_packets++; 150 + netif_rx(skb); 151 151 } 152 152 153 153 static int sparx5_inject(struct sparx5 *sparx5,
+4 -4
drivers/net/ethernet/smsc/smc911x.c
··· 1648 1648 return ret; 1649 1649 if ((ret=smc911x_ethtool_read_eeprom_byte(dev, &eebuf[i]))!=0) 1650 1650 return ret; 1651 - } 1651 + } 1652 1652 memcpy(data, eebuf+eeprom->offset, eeprom->len); 1653 1653 return 0; 1654 1654 } ··· 1667 1667 return ret; 1668 1668 /* write byte */ 1669 1669 if ((ret=smc911x_ethtool_write_eeprom_byte(dev, *data))!=0) 1670 - return ret; 1670 + return ret; 1671 1671 if ((ret=smc911x_ethtool_write_eeprom_cmd(dev, E2P_CMD_EPC_CMD_WRITE_, i ))!=0) 1672 1672 return ret; 1673 - } 1674 - return 0; 1673 + } 1674 + return 0; 1675 1675 } 1676 1676 1677 1677 static int smc911x_ethtool_geteeprom_len(struct net_device *dev)
+7 -2
drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c
··· 49 49 void __iomem *reg; 50 50 u32 phy_intf_sel; 51 51 struct clk *phy_ref_clk; 52 + struct device *dev; 52 53 spinlock_t lock; /* lock to protect register update */ 53 54 }; 54 55 55 56 static void visconti_eth_fix_mac_speed(void *priv, unsigned int speed) 56 57 { 57 58 struct visconti_eth *dwmac = priv; 58 - unsigned int val, clk_sel_val; 59 + struct net_device *netdev = dev_get_drvdata(dwmac->dev); 60 + unsigned int val, clk_sel_val = 0; 59 61 unsigned long flags; 60 62 61 63 spin_lock_irqsave(&dwmac->lock, flags); ··· 87 85 break; 88 86 default: 89 87 /* No bit control */ 90 - break; 88 + netdev_err(netdev, "Unsupported speed request (%d)", speed); 89 + spin_unlock_irqrestore(&dwmac->lock, flags); 90 + return; 91 91 } 92 92 93 93 writel(val, dwmac->reg + MAC_CTRL_REG); ··· 233 229 234 230 spin_lock_init(&dwmac->lock); 235 231 dwmac->reg = stmmac_res.addr; 232 + dwmac->dev = &pdev->dev; 236 233 plat_dat->bsp_priv = dwmac; 237 234 plat_dat->fix_mac_speed = visconti_eth_fix_mac_speed; 238 235
+1
drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h
··· 150 150 151 151 #define NUM_DWMAC100_DMA_REGS 9 152 152 #define NUM_DWMAC1000_DMA_REGS 23 153 + #define NUM_DWMAC4_DMA_REGS 27 153 154 154 155 void dwmac_enable_dma_transmission(void __iomem *ioaddr); 155 156 void dwmac_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
+17 -2
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
··· 21 21 #include "dwxgmac2.h" 22 22 23 23 #define REG_SPACE_SIZE 0x1060 24 + #define GMAC4_REG_SPACE_SIZE 0x116C 24 25 #define MAC100_ETHTOOL_NAME "st_mac100" 25 26 #define GMAC_ETHTOOL_NAME "st_gmac" 26 27 #define XGMAC_ETHTOOL_NAME "st_xgmac" 28 + 29 + /* Same as DMA_CHAN_BASE_ADDR defined in dwmac4_dma.h 30 + * 31 + * It is here because dwmac_dma.h and dwmac4_dam.h can not be included at the 32 + * same time due to the conflicting macro names. 33 + */ 34 + #define GMAC4_DMA_CHAN_BASE_ADDR 0x00001100 27 35 28 36 #define ETHTOOL_DMA_OFFSET 55 29 37 ··· 442 434 443 435 if (priv->plat->has_xgmac) 444 436 return XGMAC_REGSIZE * 4; 437 + else if (priv->plat->has_gmac4) 438 + return GMAC4_REG_SPACE_SIZE; 445 439 return REG_SPACE_SIZE; 446 440 } 447 441 ··· 456 446 stmmac_dump_mac_regs(priv, priv->hw, reg_space); 457 447 stmmac_dump_dma_regs(priv, priv->ioaddr, reg_space); 458 448 459 - if (!priv->plat->has_xgmac) { 460 - /* Copy DMA registers to where ethtool expects them */ 449 + /* Copy DMA registers to where ethtool expects them */ 450 + if (priv->plat->has_gmac4) { 451 + /* GMAC4 dumps its DMA registers at its DMA_CHAN_BASE_ADDR */ 452 + memcpy(&reg_space[ETHTOOL_DMA_OFFSET], 453 + &reg_space[GMAC4_DMA_CHAN_BASE_ADDR / 4], 454 + NUM_DWMAC4_DMA_REGS * 4); 455 + } else if (!priv->plat->has_xgmac) { 461 456 memcpy(&reg_space[ETHTOOL_DMA_OFFSET], 462 457 &reg_space[DMA_BUS_MODE / 4], 463 458 NUM_DWMAC1000_DMA_REGS * 4);
+11 -6
drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
··· 145 145 146 146 static void get_systime(void __iomem *ioaddr, u64 *systime) 147 147 { 148 - u64 ns; 148 + u64 ns, sec0, sec1; 149 149 150 - /* Get the TSSS value */ 151 - ns = readl(ioaddr + PTP_STNSR); 152 - /* Get the TSS and convert sec time value to nanosecond */ 153 - ns += readl(ioaddr + PTP_STSR) * 1000000000ULL; 150 + /* Get the TSS value */ 151 + sec1 = readl_relaxed(ioaddr + PTP_STSR); 152 + do { 153 + sec0 = sec1; 154 + /* Get the TSSS value */ 155 + ns = readl_relaxed(ioaddr + PTP_STNSR); 156 + /* Get the TSS value */ 157 + sec1 = readl_relaxed(ioaddr + PTP_STSR); 158 + } while (sec0 != sec1); 154 159 155 160 if (systime) 156 - *systime = ns; 161 + *systime = ns + (sec1 * 1000000000ULL); 157 162 } 158 163 159 164 static void get_ptptime(void __iomem *ptpaddr, u64 *ptp_time)
+4 -2
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 7252 7252 7253 7253 netdev_info(priv->dev, "%s: removing driver", __func__); 7254 7254 7255 + pm_runtime_get_sync(dev); 7256 + pm_runtime_disable(dev); 7257 + pm_runtime_put_noidle(dev); 7258 + 7255 7259 stmmac_stop_all_dma(priv); 7256 7260 stmmac_mac_set(priv, priv->ioaddr, false); 7257 7261 netif_carrier_off(ndev); ··· 7274 7270 if (priv->plat->stmmac_rst) 7275 7271 reset_control_assert(priv->plat->stmmac_rst); 7276 7272 reset_control_assert(priv->plat->stmmac_ahb_rst); 7277 - pm_runtime_put(dev); 7278 - pm_runtime_disable(dev); 7279 7273 if (priv->hw->pcs != STMMAC_PCS_TBI && 7280 7274 priv->hw->pcs != STMMAC_PCS_RTBI) 7281 7275 stmmac_mdio_unregister(ndev);
+11 -2
drivers/net/ieee802154/at86rf230.c
··· 100 100 unsigned long cal_timeout; 101 101 bool is_tx; 102 102 bool is_tx_from_off; 103 + bool was_tx; 103 104 u8 tx_retry; 104 105 struct sk_buff *tx_skb; 105 106 struct at86rf230_state_change tx; ··· 344 343 if (ctx->free) 345 344 kfree(ctx); 346 345 347 - ieee802154_wake_queue(lp->hw); 346 + if (lp->was_tx) { 347 + lp->was_tx = 0; 348 + dev_kfree_skb_any(lp->tx_skb); 349 + ieee802154_wake_queue(lp->hw); 350 + } 348 351 } 349 352 350 353 static void ··· 357 352 struct at86rf230_state_change *ctx = context; 358 353 struct at86rf230_local *lp = ctx->lp; 359 354 360 - lp->is_tx = 0; 355 + if (lp->is_tx) { 356 + lp->was_tx = 1; 357 + lp->is_tx = 0; 358 + } 359 + 361 360 at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, 362 361 at86rf230_async_error_recover_complete); 363 362 }
+1
drivers/net/ieee802154/ca8210.c
··· 1771 1771 status 1772 1772 ); 1773 1773 if (status != MAC_TRANSACTION_OVERFLOW) { 1774 + dev_kfree_skb_any(priv->tx_skb); 1774 1775 ieee802154_wake_queue(priv->hw); 1775 1776 return 0; 1776 1777 }
+1
drivers/net/ieee802154/mac802154_hwsim.c
··· 786 786 goto err_pib; 787 787 } 788 788 789 + pib->channel = 13; 789 790 rcu_assign_pointer(phy->pib, pib); 790 791 phy->idx = idx; 791 792 INIT_LIST_HEAD(&phy->edges);
+2 -2
drivers/net/ieee802154/mcr20a.c
··· 976 976 dev_dbg(printdev(lp), "%s\n", __func__); 977 977 978 978 phy->symbol_duration = 16; 979 - phy->lifs_period = 40; 980 - phy->sifs_period = 12; 979 + phy->lifs_period = 40 * phy->symbol_duration; 980 + phy->sifs_period = 12 * phy->symbol_duration; 981 981 982 982 hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | 983 983 IEEE802154_HW_AFILT |
+52
drivers/net/ipa/ipa_power.c
··· 11 11 #include <linux/pm_runtime.h> 12 12 #include <linux/bitops.h> 13 13 14 + #include "linux/soc/qcom/qcom_aoss.h" 15 + 14 16 #include "ipa.h" 15 17 #include "ipa_power.h" 16 18 #include "ipa_endpoint.h" ··· 66 64 * struct ipa_power - IPA power management information 67 65 * @dev: IPA device pointer 68 66 * @core: IPA core clock 67 + * @qmp: QMP handle for AOSS communication 69 68 * @spinlock: Protects modem TX queue enable/disable 70 69 * @flags: Boolean state flags 71 70 * @interconnect_count: Number of elements in interconnect[] ··· 75 72 struct ipa_power { 76 73 struct device *dev; 77 74 struct clk *core; 75 + struct qmp *qmp; 78 76 spinlock_t spinlock; /* used with STOPPED/STARTED power flags */ 79 77 DECLARE_BITMAP(flags, IPA_POWER_FLAG_COUNT); 80 78 u32 interconnect_count; ··· 386 382 clear_bit(IPA_POWER_FLAG_STARTED, ipa->power->flags); 387 383 } 388 384 385 + static int ipa_power_retention_init(struct ipa_power *power) 386 + { 387 + struct qmp *qmp = qmp_get(power->dev); 388 + 389 + if (IS_ERR(qmp)) { 390 + if (PTR_ERR(qmp) == -EPROBE_DEFER) 391 + return -EPROBE_DEFER; 392 + 393 + /* We assume any other error means it's not defined/needed */ 394 + qmp = NULL; 395 + } 396 + power->qmp = qmp; 397 + 398 + return 0; 399 + } 400 + 401 + static void ipa_power_retention_exit(struct ipa_power *power) 402 + { 403 + qmp_put(power->qmp); 404 + power->qmp = NULL; 405 + } 406 + 407 + /* Control register retention on power collapse */ 408 + void ipa_power_retention(struct ipa *ipa, bool enable) 409 + { 410 + static const char fmt[] = "{ class: bcm, res: ipa_pc, val: %c }"; 411 + struct ipa_power *power = ipa->power; 412 + char buf[36]; /* Exactly enough for fmt[]; size a multiple of 4 */ 413 + int ret; 414 + 415 + if (!power->qmp) 416 + return; /* Not needed on this platform */ 417 + 418 + (void)snprintf(buf, sizeof(buf), fmt, enable ? '1' : '0'); 419 + 420 + ret = qmp_send(power->qmp, buf, sizeof(buf)); 421 + if (ret) 422 + dev_err(power->dev, "error %d sending QMP %sable request\n", 423 + ret, enable ? "en" : "dis"); 424 + } 425 + 389 426 int ipa_power_setup(struct ipa *ipa) 390 427 { 391 428 int ret; ··· 483 438 if (ret) 484 439 goto err_kfree; 485 440 441 + ret = ipa_power_retention_init(power); 442 + if (ret) 443 + goto err_interconnect_exit; 444 + 486 445 pm_runtime_set_autosuspend_delay(dev, IPA_AUTOSUSPEND_DELAY); 487 446 pm_runtime_use_autosuspend(dev); 488 447 pm_runtime_enable(dev); 489 448 490 449 return power; 491 450 451 + err_interconnect_exit: 452 + ipa_interconnect_exit(power); 492 453 err_kfree: 493 454 kfree(power); 494 455 err_clk_put: ··· 511 460 512 461 pm_runtime_disable(dev); 513 462 pm_runtime_dont_use_autosuspend(dev); 463 + ipa_power_retention_exit(power); 514 464 ipa_interconnect_exit(power); 515 465 kfree(power); 516 466 clk_put(clk);
+7
drivers/net/ipa/ipa_power.h
··· 41 41 void ipa_power_modem_queue_active(struct ipa *ipa); 42 42 43 43 /** 44 + * ipa_power_retention() - Control register retention on power collapse 45 + * @ipa: IPA pointer 46 + * @enable: Whether retention should be enabled or disabled 47 + */ 48 + void ipa_power_retention(struct ipa *ipa, bool enable); 49 + 50 + /** 44 51 * ipa_power_setup() - Set up IPA power management 45 52 * @ipa: IPA pointer 46 53 *
+5
drivers/net/ipa/ipa_uc.c
··· 11 11 12 12 #include "ipa.h" 13 13 #include "ipa_uc.h" 14 + #include "ipa_power.h" 14 15 15 16 /** 16 17 * DOC: The IPA embedded microcontroller ··· 155 154 case IPA_UC_RESPONSE_INIT_COMPLETED: 156 155 if (ipa->uc_powered) { 157 156 ipa->uc_loaded = true; 157 + ipa_power_retention(ipa, true); 158 158 pm_runtime_mark_last_busy(dev); 159 159 (void)pm_runtime_put_autosuspend(dev); 160 160 ipa->uc_powered = false; ··· 186 184 187 185 ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_1); 188 186 ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_0); 187 + if (ipa->uc_loaded) 188 + ipa_power_retention(ipa, false); 189 + 189 190 if (!ipa->uc_powered) 190 191 return; 191 192
+21 -12
drivers/net/macsec.c
··· 3870 3870 struct macsec_dev *macsec = macsec_priv(dev); 3871 3871 struct net_device *real_dev = macsec->real_dev; 3872 3872 3873 + /* If h/w offloading is available, propagate to the device */ 3874 + if (macsec_is_offloaded(macsec)) { 3875 + const struct macsec_ops *ops; 3876 + struct macsec_context ctx; 3877 + 3878 + ops = macsec_get_ops(netdev_priv(dev), &ctx); 3879 + if (ops) { 3880 + ctx.secy = &macsec->secy; 3881 + macsec_offload(ops->mdo_del_secy, &ctx); 3882 + } 3883 + } 3884 + 3873 3885 unregister_netdevice_queue(dev, head); 3874 3886 list_del_rcu(&macsec->secys); 3875 3887 macsec_del_dev(macsec); ··· 3895 3883 struct macsec_dev *macsec = macsec_priv(dev); 3896 3884 struct net_device *real_dev = macsec->real_dev; 3897 3885 struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev); 3898 - 3899 - /* If h/w offloading is available, propagate to the device */ 3900 - if (macsec_is_offloaded(macsec)) { 3901 - const struct macsec_ops *ops; 3902 - struct macsec_context ctx; 3903 - 3904 - ops = macsec_get_ops(netdev_priv(dev), &ctx); 3905 - if (ops) { 3906 - ctx.secy = &macsec->secy; 3907 - macsec_offload(ops->mdo_del_secy, &ctx); 3908 - } 3909 - } 3910 3886 3911 3887 macsec_common_dellink(dev, head); 3912 3888 ··· 4017 4017 if (macsec->offload != MACSEC_OFFLOAD_OFF && 4018 4018 !macsec_check_offload(macsec->offload, macsec)) 4019 4019 return -EOPNOTSUPP; 4020 + 4021 + /* send_sci must be set to true when transmit sci explicitly is set */ 4022 + if ((data && data[IFLA_MACSEC_SCI]) && 4023 + (data && data[IFLA_MACSEC_INC_SCI])) { 4024 + u8 send_sci = !!nla_get_u8(data[IFLA_MACSEC_INC_SCI]); 4025 + 4026 + if (!send_sci) 4027 + return -EINVAL; 4028 + } 4020 4029 4021 4030 if (data && data[IFLA_MACSEC_ICV_LEN]) 4022 4031 icv_len = nla_get_u8(data[IFLA_MACSEC_ICV_LEN]);
+13 -13
drivers/net/phy/at803x.c
··· 1688 1688 if (ret < 0) 1689 1689 return ret; 1690 1690 1691 - if (phydev->link && phydev->speed == SPEED_2500) 1692 - phydev->interface = PHY_INTERFACE_MODE_2500BASEX; 1693 - else 1694 - phydev->interface = PHY_INTERFACE_MODE_SMII; 1695 - 1696 - /* generate seed as a lower random value to make PHY linked as SLAVE easily, 1697 - * except for master/slave configuration fault detected. 1698 - * the reason for not putting this code into the function link_change_notify is 1699 - * the corner case where the link partner is also the qca8081 PHY and the seed 1700 - * value is configured as the same value, the link can't be up and no link change 1701 - * occurs. 1702 - */ 1703 - if (!phydev->link) { 1691 + if (phydev->link) { 1692 + if (phydev->speed == SPEED_2500) 1693 + phydev->interface = PHY_INTERFACE_MODE_2500BASEX; 1694 + else 1695 + phydev->interface = PHY_INTERFACE_MODE_SGMII; 1696 + } else { 1697 + /* generate seed as a lower random value to make PHY linked as SLAVE easily, 1698 + * except for master/slave configuration fault detected. 1699 + * the reason for not putting this code into the function link_change_notify is 1700 + * the corner case where the link partner is also the qca8081 PHY and the seed 1701 + * value is configured as the same value, the link can't be up and no link change 1702 + * occurs. 1703 + */ 1704 1704 if (phydev->master_slave_state == MASTER_SLAVE_STATE_ERR) { 1705 1705 qca808x_phy_ms_seed_enable(phydev, false); 1706 1706 } else {
+3 -3
drivers/net/usb/ipheth.c
··· 121 121 if (tx_buf == NULL) 122 122 goto free_rx_urb; 123 123 124 - rx_buf = usb_alloc_coherent(iphone->udev, IPHETH_BUF_SIZE, 124 + rx_buf = usb_alloc_coherent(iphone->udev, IPHETH_BUF_SIZE + IPHETH_IP_ALIGN, 125 125 GFP_KERNEL, &rx_urb->transfer_dma); 126 126 if (rx_buf == NULL) 127 127 goto free_tx_buf; ··· 146 146 147 147 static void ipheth_free_urbs(struct ipheth_device *iphone) 148 148 { 149 - usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, iphone->rx_buf, 149 + usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE + IPHETH_IP_ALIGN, iphone->rx_buf, 150 150 iphone->rx_urb->transfer_dma); 151 151 usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, iphone->tx_buf, 152 152 iphone->tx_urb->transfer_dma); ··· 317 317 318 318 usb_fill_bulk_urb(dev->rx_urb, udev, 319 319 usb_rcvbulkpipe(udev, dev->bulk_in), 320 - dev->rx_buf, IPHETH_BUF_SIZE, 320 + dev->rx_buf, IPHETH_BUF_SIZE + IPHETH_IP_ALIGN, 321 321 ipheth_rcvbulk_callback, 322 322 dev); 323 323 dev->rx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+4 -2
include/linux/if_vlan.h
··· 46 46 * @h_vlan_encapsulated_proto: packet type ID or len 47 47 */ 48 48 struct vlan_ethhdr { 49 - unsigned char h_dest[ETH_ALEN]; 50 - unsigned char h_source[ETH_ALEN]; 49 + struct_group(addrs, 50 + unsigned char h_dest[ETH_ALEN]; 51 + unsigned char h_source[ETH_ALEN]; 52 + ); 51 53 __be16 h_vlan_proto; 52 54 __be16 h_vlan_TCI; 53 55 __be16 h_vlan_encapsulated_proto;
+12
include/net/ax25.h
··· 239 239 #if defined(CONFIG_AX25_DAMA_SLAVE) || defined(CONFIG_AX25_DAMA_MASTER) 240 240 ax25_dama_info dama; 241 241 #endif 242 + refcount_t refcount; 242 243 } ax25_dev; 243 244 244 245 typedef struct ax25_cb { ··· 294 293 } 295 294 } 296 295 296 + static inline void ax25_dev_hold(ax25_dev *ax25_dev) 297 + { 298 + refcount_inc(&ax25_dev->refcount); 299 + } 300 + 301 + static inline void ax25_dev_put(ax25_dev *ax25_dev) 302 + { 303 + if (refcount_dec_and_test(&ax25_dev->refcount)) { 304 + kfree(ax25_dev); 305 + } 306 + } 297 307 static inline __be16 ax25_type_trans(struct sk_buff *skb, struct net_device *dev) 298 308 { 299 309 skb->dev = dev;
+13 -5
include/net/neighbour.h
··· 350 350 return __neigh_create(tbl, pkey, dev, true); 351 351 } 352 352 void neigh_destroy(struct neighbour *neigh); 353 - int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb); 353 + int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb, 354 + const bool immediate_ok); 354 355 int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, u32 flags, 355 356 u32 nlmsg_pid); 356 357 void __neigh_set_probe_once(struct neighbour *neigh); ··· 461 460 462 461 #define neigh_hold(n) refcount_inc(&(n)->refcnt) 463 462 464 - static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) 463 + static __always_inline int neigh_event_send_probe(struct neighbour *neigh, 464 + struct sk_buff *skb, 465 + const bool immediate_ok) 465 466 { 466 467 unsigned long now = jiffies; 467 - 468 + 468 469 if (READ_ONCE(neigh->used) != now) 469 470 WRITE_ONCE(neigh->used, now); 470 - if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE))) 471 - return __neigh_event_send(neigh, skb); 471 + if (!(neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE))) 472 + return __neigh_event_send(neigh, skb, immediate_ok); 472 473 return 0; 474 + } 475 + 476 + static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) 477 + { 478 + return neigh_event_send_probe(neigh, skb, true); 473 479 } 474 480 475 481 #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
+5 -6
include/uapi/linux/smc_diag.h
··· 84 84 /* SMC_DIAG_LINKINFO */ 85 85 86 86 struct smc_diag_linkinfo { 87 - __u8 link_id; /* link identifier */ 88 - __u8 ibname[IB_DEVICE_NAME_MAX]; /* name of the RDMA device */ 89 - __u8 ibport; /* RDMA device port number */ 90 - __u8 gid[40]; /* local GID */ 91 - __u8 peer_gid[40]; /* peer GID */ 92 - __aligned_u64 net_cookie; /* RDMA device net namespace */ 87 + __u8 link_id; /* link identifier */ 88 + __u8 ibname[IB_DEVICE_NAME_MAX]; /* name of the RDMA device */ 89 + __u8 ibport; /* RDMA device port number */ 90 + __u8 gid[40]; /* local GID */ 91 + __u8 peer_gid[40]; /* peer GID */ 93 92 }; 94 93 95 94 struct smc_diag_lgrinfo {
+1 -1
kernel/bpf/bpf_lsm.c
··· 207 207 208 208 BTF_ID(func, bpf_lsm_syslog) 209 209 BTF_ID(func, bpf_lsm_task_alloc) 210 - BTF_ID(func, bpf_lsm_task_getsecid_subj) 210 + BTF_ID(func, bpf_lsm_current_getsecid_subj) 211 211 BTF_ID(func, bpf_lsm_task_getsecid_obj) 212 212 BTF_ID(func, bpf_lsm_task_prctl) 213 213 BTF_ID(func, bpf_lsm_task_setscheduler)
+1 -1
kernel/bpf/ringbuf.c
··· 104 104 } 105 105 106 106 rb = vmap(pages, nr_meta_pages + 2 * nr_data_pages, 107 - VM_ALLOC | VM_USERMAP, PAGE_KERNEL); 107 + VM_MAP | VM_USERMAP, PAGE_KERNEL); 108 108 if (rb) { 109 109 kmemleak_not_leak(pages); 110 110 rb->pages = pages;
+3 -2
kernel/bpf/trampoline.c
··· 550 550 static void notrace inc_misses_counter(struct bpf_prog *prog) 551 551 { 552 552 struct bpf_prog_stats *stats; 553 + unsigned int flags; 553 554 554 555 stats = this_cpu_ptr(prog->stats); 555 - u64_stats_update_begin(&stats->syncp); 556 + flags = u64_stats_update_begin_irqsave(&stats->syncp); 556 557 u64_stats_inc(&stats->misses); 557 - u64_stats_update_end(&stats->syncp); 558 + u64_stats_update_end_irqrestore(&stats->syncp, flags); 558 559 } 559 560 560 561 /* The logic is similar to bpf_prog_run(), but with an explicit
+16 -7
net/ax25/af_ax25.c
··· 77 77 { 78 78 ax25_dev *ax25_dev; 79 79 ax25_cb *s; 80 + struct sock *sk; 80 81 81 82 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) 82 83 return; ··· 86 85 again: 87 86 ax25_for_each(s, &ax25_list) { 88 87 if (s->ax25_dev == ax25_dev) { 88 + sk = s->sk; 89 + sock_hold(sk); 89 90 spin_unlock_bh(&ax25_list_lock); 90 - lock_sock(s->sk); 91 + lock_sock(sk); 91 92 s->ax25_dev = NULL; 92 - release_sock(s->sk); 93 + ax25_dev_put(ax25_dev); 94 + release_sock(sk); 93 95 ax25_disconnect(s, ENETUNREACH); 94 96 spin_lock_bh(&ax25_list_lock); 95 - 97 + sock_put(sk); 96 98 /* The entry could have been deleted from the 97 99 * list meanwhile and thus the next pointer is 98 100 * no longer valid. Play it safe and restart ··· 359 355 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl))) 360 356 return -EFAULT; 361 357 362 - if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL) 363 - return -ENODEV; 364 - 365 358 if (ax25_ctl.digi_count > AX25_MAX_DIGIS) 366 359 return -EINVAL; 367 360 368 361 if (ax25_ctl.arg > ULONG_MAX / HZ && ax25_ctl.cmd != AX25_KILL) 369 362 return -EINVAL; 370 363 364 + ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr); 365 + if (!ax25_dev) 366 + return -ENODEV; 367 + 371 368 digi.ndigi = ax25_ctl.digi_count; 372 369 for (k = 0; k < digi.ndigi; k++) 373 370 digi.calls[k] = ax25_ctl.digi_addr[k]; 374 371 375 - if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL) 372 + ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev); 373 + if (!ax25) { 374 + ax25_dev_put(ax25_dev); 376 375 return -ENOTCONN; 376 + } 377 377 378 378 switch (ax25_ctl.cmd) { 379 379 case AX25_KILL: ··· 444 436 } 445 437 446 438 out_put: 439 + ax25_dev_put(ax25_dev); 447 440 ax25_cb_put(ax25); 448 441 return ret; 449 442
+23 -5
net/ax25/ax25_dev.c
··· 37 37 for (ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) 38 38 if (ax25cmp(addr, (const ax25_address *)ax25_dev->dev->dev_addr) == 0) { 39 39 res = ax25_dev; 40 + ax25_dev_hold(ax25_dev); 40 41 } 41 42 spin_unlock_bh(&ax25_dev_lock); 42 43 ··· 57 56 return; 58 57 } 59 58 59 + refcount_set(&ax25_dev->refcount, 1); 60 60 dev->ax25_ptr = ax25_dev; 61 61 ax25_dev->dev = dev; 62 62 dev_hold_track(dev, &ax25_dev->dev_tracker, GFP_ATOMIC); ··· 86 84 ax25_dev->next = ax25_dev_list; 87 85 ax25_dev_list = ax25_dev; 88 86 spin_unlock_bh(&ax25_dev_lock); 87 + ax25_dev_hold(ax25_dev); 89 88 90 89 ax25_register_dev_sysctl(ax25_dev); 91 90 } ··· 116 113 if ((s = ax25_dev_list) == ax25_dev) { 117 114 ax25_dev_list = s->next; 118 115 spin_unlock_bh(&ax25_dev_lock); 116 + ax25_dev_put(ax25_dev); 119 117 dev->ax25_ptr = NULL; 120 118 dev_put_track(dev, &ax25_dev->dev_tracker); 121 - kfree(ax25_dev); 119 + ax25_dev_put(ax25_dev); 122 120 return; 123 121 } 124 122 ··· 127 123 if (s->next == ax25_dev) { 128 124 s->next = ax25_dev->next; 129 125 spin_unlock_bh(&ax25_dev_lock); 126 + ax25_dev_put(ax25_dev); 130 127 dev->ax25_ptr = NULL; 131 128 dev_put_track(dev, &ax25_dev->dev_tracker); 132 - kfree(ax25_dev); 129 + ax25_dev_put(ax25_dev); 133 130 return; 134 131 } 135 132 ··· 138 133 } 139 134 spin_unlock_bh(&ax25_dev_lock); 140 135 dev->ax25_ptr = NULL; 136 + ax25_dev_put(ax25_dev); 141 137 } 142 138 143 139 int ax25_fwd_ioctl(unsigned int cmd, struct ax25_fwd_struct *fwd) ··· 150 144 151 145 switch (cmd) { 152 146 case SIOCAX25ADDFWD: 153 - if ((fwd_dev = ax25_addr_ax25dev(&fwd->port_to)) == NULL) 147 + fwd_dev = ax25_addr_ax25dev(&fwd->port_to); 148 + if (!fwd_dev) { 149 + ax25_dev_put(ax25_dev); 154 150 return -EINVAL; 155 - if (ax25_dev->forward != NULL) 151 + } 152 + if (ax25_dev->forward) { 153 + ax25_dev_put(fwd_dev); 154 + ax25_dev_put(ax25_dev); 156 155 return -EINVAL; 156 + } 157 157 ax25_dev->forward = fwd_dev->dev; 158 + ax25_dev_put(fwd_dev); 159 + ax25_dev_put(ax25_dev); 158 160 break; 159 161 160 162 case SIOCAX25DELFWD: 161 - if (ax25_dev->forward == NULL) 163 + if (!ax25_dev->forward) { 164 + ax25_dev_put(ax25_dev); 162 165 return -EINVAL; 166 + } 163 167 ax25_dev->forward = NULL; 168 + ax25_dev_put(ax25_dev); 164 169 break; 165 170 166 171 default: 172 + ax25_dev_put(ax25_dev); 167 173 return -EINVAL; 168 174 } 169 175
+11 -2
net/ax25/ax25_route.c
··· 75 75 ax25_dev *ax25_dev; 76 76 int i; 77 77 78 - if ((ax25_dev = ax25_addr_ax25dev(&route->port_addr)) == NULL) 79 - return -EINVAL; 80 78 if (route->digi_count > AX25_MAX_DIGIS) 79 + return -EINVAL; 80 + 81 + ax25_dev = ax25_addr_ax25dev(&route->port_addr); 82 + if (!ax25_dev) 81 83 return -EINVAL; 82 84 83 85 write_lock_bh(&ax25_route_lock); ··· 93 91 if (route->digi_count != 0) { 94 92 if ((ax25_rt->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) { 95 93 write_unlock_bh(&ax25_route_lock); 94 + ax25_dev_put(ax25_dev); 96 95 return -ENOMEM; 97 96 } 98 97 ax25_rt->digipeat->lastrepeat = -1; ··· 104 101 } 105 102 } 106 103 write_unlock_bh(&ax25_route_lock); 104 + ax25_dev_put(ax25_dev); 107 105 return 0; 108 106 } 109 107 ax25_rt = ax25_rt->next; ··· 112 108 113 109 if ((ax25_rt = kmalloc(sizeof(ax25_route), GFP_ATOMIC)) == NULL) { 114 110 write_unlock_bh(&ax25_route_lock); 111 + ax25_dev_put(ax25_dev); 115 112 return -ENOMEM; 116 113 } 117 114 ··· 125 120 if ((ax25_rt->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) { 126 121 write_unlock_bh(&ax25_route_lock); 127 122 kfree(ax25_rt); 123 + ax25_dev_put(ax25_dev); 128 124 return -ENOMEM; 129 125 } 130 126 ax25_rt->digipeat->lastrepeat = -1; ··· 138 132 ax25_rt->next = ax25_route_list; 139 133 ax25_route_list = ax25_rt; 140 134 write_unlock_bh(&ax25_route_lock); 135 + ax25_dev_put(ax25_dev); 141 136 142 137 return 0; 143 138 } ··· 180 173 } 181 174 } 182 175 write_unlock_bh(&ax25_route_lock); 176 + ax25_dev_put(ax25_dev); 183 177 184 178 return 0; 185 179 } ··· 223 215 224 216 out: 225 217 write_unlock_bh(&ax25_route_lock); 218 + ax25_dev_put(ax25_dev); 226 219 return err; 227 220 } 228 221
+4 -4
net/bridge/netfilter/nft_reject_bridge.c
··· 49 49 { 50 50 struct sk_buff *nskb; 51 51 52 - nskb = nf_reject_skb_v4_tcp_reset(net, oldskb, dev, hook); 52 + nskb = nf_reject_skb_v4_tcp_reset(net, oldskb, NULL, hook); 53 53 if (!nskb) 54 54 return; 55 55 ··· 65 65 { 66 66 struct sk_buff *nskb; 67 67 68 - nskb = nf_reject_skb_v4_unreach(net, oldskb, dev, hook, code); 68 + nskb = nf_reject_skb_v4_unreach(net, oldskb, NULL, hook, code); 69 69 if (!nskb) 70 70 return; 71 71 ··· 81 81 { 82 82 struct sk_buff *nskb; 83 83 84 - nskb = nf_reject_skb_v6_tcp_reset(net, oldskb, dev, hook); 84 + nskb = nf_reject_skb_v6_tcp_reset(net, oldskb, NULL, hook); 85 85 if (!nskb) 86 86 return; 87 87 ··· 98 98 { 99 99 struct sk_buff *nskb; 100 100 101 - nskb = nf_reject_skb_v6_unreach(net, oldskb, dev, hook, code); 101 + nskb = nf_reject_skb_v6_unreach(net, oldskb, NULL, hook, code); 102 102 if (!nskb) 103 103 return; 104 104
+12 -6
net/core/neighbour.c
··· 1133 1133 neigh_release(neigh); 1134 1134 } 1135 1135 1136 - int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) 1136 + int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb, 1137 + const bool immediate_ok) 1137 1138 { 1138 1139 int rc; 1139 1140 bool immediate_probe = false; ··· 1155 1154 atomic_set(&neigh->probes, 1156 1155 NEIGH_VAR(neigh->parms, UCAST_PROBES)); 1157 1156 neigh_del_timer(neigh); 1158 - neigh->nud_state = NUD_INCOMPLETE; 1157 + neigh->nud_state = NUD_INCOMPLETE; 1159 1158 neigh->updated = now; 1160 - next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), 1161 - HZ/100); 1159 + if (!immediate_ok) { 1160 + next = now + 1; 1161 + } else { 1162 + immediate_probe = true; 1163 + next = now + max(NEIGH_VAR(neigh->parms, 1164 + RETRANS_TIME), 1165 + HZ / 100); 1166 + } 1162 1167 neigh_add_timer(neigh, next); 1163 - immediate_probe = true; 1164 1168 } else { 1165 1169 neigh->nud_state = NUD_FAILED; 1166 1170 neigh->updated = jiffies; ··· 1577 1571 1578 1572 write_lock_bh(&tbl->lock); 1579 1573 list_for_each_entry(neigh, &tbl->managed_list, managed_list) 1580 - neigh_event_send(neigh, NULL); 1574 + neigh_event_send_probe(neigh, NULL, false); 1581 1575 queue_delayed_work(system_power_efficient_wq, &tbl->managed_work, 1582 1576 NEIGH_VAR(&tbl->parms, DELAY_PROBE_TIME)); 1583 1577 write_unlock_bh(&tbl->lock);
+4 -2
net/core/rtnetlink.c
··· 3275 3275 struct nlattr *slave_attr[RTNL_SLAVE_MAX_TYPE + 1]; 3276 3276 unsigned char name_assign_type = NET_NAME_USER; 3277 3277 struct nlattr *linkinfo[IFLA_INFO_MAX + 1]; 3278 - const struct rtnl_link_ops *m_ops = NULL; 3279 - struct net_device *master_dev = NULL; 3278 + const struct rtnl_link_ops *m_ops; 3279 + struct net_device *master_dev; 3280 3280 struct net *net = sock_net(skb->sk); 3281 3281 const struct rtnl_link_ops *ops; 3282 3282 struct nlattr *tb[IFLA_MAX + 1]; ··· 3314 3314 else 3315 3315 dev = NULL; 3316 3316 3317 + master_dev = NULL; 3318 + m_ops = NULL; 3317 3319 if (dev) { 3318 3320 master_dev = netdev_master_upper_dev_get(dev); 3319 3321 if (master_dev)
+4 -4
net/ieee802154/nl802154.c
··· 1441 1441 1442 1442 hdr = nl802154hdr_put(msg, portid, seq, flags, cmd); 1443 1443 if (!hdr) 1444 - return -1; 1444 + return -ENOBUFS; 1445 1445 1446 1446 if (nla_put_u32(msg, NL802154_ATTR_IFINDEX, dev->ifindex)) 1447 1447 goto nla_put_failure; ··· 1634 1634 1635 1635 hdr = nl802154hdr_put(msg, portid, seq, flags, cmd); 1636 1636 if (!hdr) 1637 - return -1; 1637 + return -ENOBUFS; 1638 1638 1639 1639 if (nla_put_u32(msg, NL802154_ATTR_IFINDEX, dev->ifindex)) 1640 1640 goto nla_put_failure; ··· 1812 1812 1813 1813 hdr = nl802154hdr_put(msg, portid, seq, flags, cmd); 1814 1814 if (!hdr) 1815 - return -1; 1815 + return -ENOBUFS; 1816 1816 1817 1817 if (nla_put_u32(msg, NL802154_ATTR_IFINDEX, dev->ifindex)) 1818 1818 goto nla_put_failure; ··· 1988 1988 1989 1989 hdr = nl802154hdr_put(msg, portid, seq, flags, cmd); 1990 1990 if (!hdr) 1991 - return -1; 1991 + return -ENOBUFS; 1992 1992 1993 1993 if (nla_put_u32(msg, NL802154_ATTR_IFINDEX, dev->ifindex)) 1994 1994 goto nla_put_failure;
-4
net/ipv4/netfilter/Kconfig
··· 58 58 59 59 endif # NF_TABLES 60 60 61 - config NF_FLOW_TABLE_IPV4 62 - tristate 63 - select NF_FLOW_TABLE_INET 64 - 65 61 config NF_DUP_IPV4 66 62 tristate "Netfilter IPv4 packet duplication to alternate destination" 67 63 depends on !NF_CONNTRACK || NF_CONNTRACK
+5 -2
net/ipv4/tcp.c
··· 1322 1322 1323 1323 /* skb changing from pure zc to mixed, must charge zc */ 1324 1324 if (unlikely(skb_zcopy_pure(skb))) { 1325 - if (!sk_wmem_schedule(sk, skb->data_len)) 1325 + u32 extra = skb->truesize - 1326 + SKB_TRUESIZE(skb_end_offset(skb)); 1327 + 1328 + if (!sk_wmem_schedule(sk, extra)) 1326 1329 goto wait_for_space; 1327 1330 1328 - sk_mem_charge(sk, skb->data_len); 1331 + sk_mem_charge(sk, extra); 1329 1332 skb_shinfo(skb)->flags &= ~SKBFL_PURE_ZEROCOPY; 1330 1333 } 1331 1334
+2
net/ipv4/tcp_input.c
··· 1660 1660 (mss != tcp_skb_seglen(skb))) 1661 1661 goto out; 1662 1662 1663 + if (!tcp_skb_can_collapse(prev, skb)) 1664 + goto out; 1663 1665 len = skb->len; 1664 1666 pcount = tcp_skb_pcount(skb); 1665 1667 if (tcp_skb_shift(prev, skb, pcount, len))
-4
net/ipv6/netfilter/Kconfig
··· 47 47 endif # NF_TABLES_IPV6 48 48 endif # NF_TABLES 49 49 50 - config NF_FLOW_TABLE_IPV6 51 - tristate 52 - select NF_FLOW_TABLE_INET 53 - 54 50 config NF_DUP_IPV6 55 51 tristate "Netfilter IPv6 packet duplication to alternate destination" 56 52 depends on !NF_CONNTRACK || NF_CONNTRACK
-3
net/ipv6/netfilter/Makefile
··· 28 28 obj-$(CONFIG_NFT_DUP_IPV6) += nft_dup_ipv6.o 29 29 obj-$(CONFIG_NFT_FIB_IPV6) += nft_fib_ipv6.o 30 30 31 - # flow table support 32 - obj-$(CONFIG_NF_FLOW_TABLE_IPV6) += nf_flow_table_ipv6.o 33 - 34 31 # matches 35 32 obj-$(CONFIG_IP6_NF_MATCH_AH) += ip6t_ah.o 36 33 obj-$(CONFIG_IP6_NF_MATCH_EUI64) += ip6t_eui64.o
net/ipv6/netfilter/nf_flow_table_ipv6.c
-1
net/netfilter/nf_tables_api.c
··· 2011 2011 2012 2012 prule = (struct nft_rule_dp *)ptr; 2013 2013 prule->is_last = 1; 2014 - ptr += offsetof(struct nft_rule_dp, data); 2015 2014 /* blob size does not include the trailer rule */ 2016 2015 } 2017 2016
+12
net/netfilter/nft_byteorder.c
··· 167 167 return -1; 168 168 } 169 169 170 + static bool nft_byteorder_reduce(struct nft_regs_track *track, 171 + const struct nft_expr *expr) 172 + { 173 + struct nft_byteorder *priv = nft_expr_priv(expr); 174 + 175 + track->regs[priv->dreg].selector = NULL; 176 + track->regs[priv->dreg].bitwise = NULL; 177 + 178 + return false; 179 + } 180 + 170 181 static const struct nft_expr_ops nft_byteorder_ops = { 171 182 .type = &nft_byteorder_type, 172 183 .size = NFT_EXPR_SIZE(sizeof(struct nft_byteorder)), 173 184 .eval = nft_byteorder_eval, 174 185 .init = nft_byteorder_init, 175 186 .dump = nft_byteorder_dump, 187 + .reduce = nft_byteorder_reduce, 176 188 }; 177 189 178 190 struct nft_expr_type nft_byteorder_type __read_mostly = {
+4 -1
net/netfilter/nft_ct.c
··· 260 260 ct = this_cpu_read(nft_ct_pcpu_template); 261 261 262 262 if (likely(refcount_read(&ct->ct_general.use) == 1)) { 263 + refcount_inc(&ct->ct_general.use); 263 264 nf_ct_zone_add(ct, &zone); 264 265 } else { 265 - /* previous skb got queued to userspace */ 266 + /* previous skb got queued to userspace, allocate temporary 267 + * one until percpu template can be reused. 268 + */ 266 269 ct = nf_ct_tmpl_alloc(nft_net(pkt), &zone, GFP_ATOMIC); 267 270 if (!ct) { 268 271 regs->verdict.code = NF_DROP;
+6 -2
net/packet/af_packet.c
··· 1789 1789 err = -ENOSPC; 1790 1790 if (refcount_read(&match->sk_ref) < match->max_num_members) { 1791 1791 __dev_remove_pack(&po->prot_hook); 1792 - po->fanout = match; 1792 + 1793 + /* Paired with packet_setsockopt(PACKET_FANOUT_DATA) */ 1794 + WRITE_ONCE(po->fanout, match); 1795 + 1793 1796 po->rollover = rollover; 1794 1797 rollover = NULL; 1795 1798 refcount_set(&match->sk_ref, refcount_read(&match->sk_ref) + 1); ··· 3937 3934 } 3938 3935 case PACKET_FANOUT_DATA: 3939 3936 { 3940 - if (!po->fanout) 3937 + /* Paired with the WRITE_ONCE() in fanout_add() */ 3938 + if (!READ_ONCE(po->fanout)) 3941 3939 return -EINVAL; 3942 3940 3943 3941 return fanout_set_data(po, optval, optlen);
+7 -4
net/sched/cls_api.c
··· 1945 1945 bool prio_allocate; 1946 1946 u32 parent; 1947 1947 u32 chain_index; 1948 - struct Qdisc *q = NULL; 1948 + struct Qdisc *q; 1949 1949 struct tcf_chain_info chain_info; 1950 - struct tcf_chain *chain = NULL; 1950 + struct tcf_chain *chain; 1951 1951 struct tcf_block *block; 1952 1952 struct tcf_proto *tp; 1953 1953 unsigned long cl; ··· 1976 1976 tp = NULL; 1977 1977 cl = 0; 1978 1978 block = NULL; 1979 + q = NULL; 1980 + chain = NULL; 1979 1981 flags = 0; 1980 1982 1981 1983 if (prio == 0) { ··· 2800 2798 struct tcmsg *t; 2801 2799 u32 parent; 2802 2800 u32 chain_index; 2803 - struct Qdisc *q = NULL; 2804 - struct tcf_chain *chain = NULL; 2801 + struct Qdisc *q; 2802 + struct tcf_chain *chain; 2805 2803 struct tcf_block *block; 2806 2804 unsigned long cl; 2807 2805 int err; ··· 2811 2809 return -EPERM; 2812 2810 2813 2811 replay: 2812 + q = NULL; 2814 2813 err = nlmsg_parse_deprecated(n, sizeof(*t), tca, TCA_MAX, 2815 2814 rtm_tca_policy, extack); 2816 2815 if (err < 0)
+118 -15
net/smc/af_smc.c
··· 566 566 mutex_unlock(&net->smc.mutex_fback_rsn); 567 567 } 568 568 569 + /* must be called under rcu read lock */ 570 + static void smc_fback_wakeup_waitqueue(struct smc_sock *smc, void *key) 571 + { 572 + struct socket_wq *wq; 573 + __poll_t flags; 574 + 575 + wq = rcu_dereference(smc->sk.sk_wq); 576 + if (!skwq_has_sleeper(wq)) 577 + return; 578 + 579 + /* wake up smc sk->sk_wq */ 580 + if (!key) { 581 + /* sk_state_change */ 582 + wake_up_interruptible_all(&wq->wait); 583 + } else { 584 + flags = key_to_poll(key); 585 + if (flags & (EPOLLIN | EPOLLOUT)) 586 + /* sk_data_ready or sk_write_space */ 587 + wake_up_interruptible_sync_poll(&wq->wait, flags); 588 + else if (flags & EPOLLERR) 589 + /* sk_error_report */ 590 + wake_up_interruptible_poll(&wq->wait, flags); 591 + } 592 + } 593 + 594 + static int smc_fback_mark_woken(wait_queue_entry_t *wait, 595 + unsigned int mode, int sync, void *key) 596 + { 597 + struct smc_mark_woken *mark = 598 + container_of(wait, struct smc_mark_woken, wait_entry); 599 + 600 + mark->woken = true; 601 + mark->key = key; 602 + return 0; 603 + } 604 + 605 + static void smc_fback_forward_wakeup(struct smc_sock *smc, struct sock *clcsk, 606 + void (*clcsock_callback)(struct sock *sk)) 607 + { 608 + struct smc_mark_woken mark = { .woken = false }; 609 + struct socket_wq *wq; 610 + 611 + init_waitqueue_func_entry(&mark.wait_entry, 612 + smc_fback_mark_woken); 613 + rcu_read_lock(); 614 + wq = rcu_dereference(clcsk->sk_wq); 615 + if (!wq) 616 + goto out; 617 + add_wait_queue(sk_sleep(clcsk), &mark.wait_entry); 618 + clcsock_callback(clcsk); 619 + remove_wait_queue(sk_sleep(clcsk), &mark.wait_entry); 620 + 621 + if (mark.woken) 622 + smc_fback_wakeup_waitqueue(smc, mark.key); 623 + out: 624 + rcu_read_unlock(); 625 + } 626 + 627 + static void smc_fback_state_change(struct sock *clcsk) 628 + { 629 + struct smc_sock *smc = 630 + smc_clcsock_user_data(clcsk); 631 + 632 + if (!smc) 633 + return; 634 + smc_fback_forward_wakeup(smc, clcsk, smc->clcsk_state_change); 635 + } 636 + 637 + static void smc_fback_data_ready(struct sock *clcsk) 638 + { 639 + struct smc_sock *smc = 640 + smc_clcsock_user_data(clcsk); 641 + 642 + if (!smc) 643 + return; 644 + smc_fback_forward_wakeup(smc, clcsk, smc->clcsk_data_ready); 645 + } 646 + 647 + static void smc_fback_write_space(struct sock *clcsk) 648 + { 649 + struct smc_sock *smc = 650 + smc_clcsock_user_data(clcsk); 651 + 652 + if (!smc) 653 + return; 654 + smc_fback_forward_wakeup(smc, clcsk, smc->clcsk_write_space); 655 + } 656 + 657 + static void smc_fback_error_report(struct sock *clcsk) 658 + { 659 + struct smc_sock *smc = 660 + smc_clcsock_user_data(clcsk); 661 + 662 + if (!smc) 663 + return; 664 + smc_fback_forward_wakeup(smc, clcsk, smc->clcsk_error_report); 665 + } 666 + 569 667 static int smc_switch_to_fallback(struct smc_sock *smc, int reason_code) 570 668 { 571 - wait_queue_head_t *smc_wait = sk_sleep(&smc->sk); 572 - wait_queue_head_t *clc_wait; 573 - unsigned long flags; 669 + struct sock *clcsk; 574 670 575 671 mutex_lock(&smc->clcsock_release_lock); 576 672 if (!smc->clcsock) { 577 673 mutex_unlock(&smc->clcsock_release_lock); 578 674 return -EBADF; 579 675 } 676 + clcsk = smc->clcsock->sk; 677 + 580 678 smc->use_fallback = true; 581 679 smc->fallback_rsn = reason_code; 582 680 smc_stat_fallback(smc); ··· 685 587 smc->clcsock->wq.fasync_list = 686 588 smc->sk.sk_socket->wq.fasync_list; 687 589 688 - /* There may be some entries remaining in 689 - * smc socket->wq, which should be removed 690 - * to clcsocket->wq during the fallback. 590 + /* There might be some wait entries remaining 591 + * in smc sk->sk_wq and they should be woken up 592 + * as clcsock's wait queue is woken up. 691 593 */ 692 - clc_wait = sk_sleep(smc->clcsock->sk); 693 - spin_lock_irqsave(&smc_wait->lock, flags); 694 - spin_lock_nested(&clc_wait->lock, SINGLE_DEPTH_NESTING); 695 - list_splice_init(&smc_wait->head, &clc_wait->head); 696 - spin_unlock(&clc_wait->lock); 697 - spin_unlock_irqrestore(&smc_wait->lock, flags); 594 + smc->clcsk_state_change = clcsk->sk_state_change; 595 + smc->clcsk_data_ready = clcsk->sk_data_ready; 596 + smc->clcsk_write_space = clcsk->sk_write_space; 597 + smc->clcsk_error_report = clcsk->sk_error_report; 598 + 599 + clcsk->sk_state_change = smc_fback_state_change; 600 + clcsk->sk_data_ready = smc_fback_data_ready; 601 + clcsk->sk_write_space = smc_fback_write_space; 602 + clcsk->sk_error_report = smc_fback_error_report; 603 + 604 + smc->clcsock->sk->sk_user_data = 605 + (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY); 698 606 } 699 607 mutex_unlock(&smc->clcsock_release_lock); 700 608 return 0; ··· 2219 2115 2220 2116 static void smc_clcsock_data_ready(struct sock *listen_clcsock) 2221 2117 { 2222 - struct smc_sock *lsmc; 2118 + struct smc_sock *lsmc = 2119 + smc_clcsock_user_data(listen_clcsock); 2223 2120 2224 - lsmc = (struct smc_sock *) 2225 - ((uintptr_t)listen_clcsock->sk_user_data & ~SK_USER_DATA_NOCOPY); 2226 2121 if (!lsmc) 2227 2122 return; 2228 2123 lsmc->clcsk_data_ready(listen_clcsock);
+19 -1
net/smc/smc.h
··· 139 139 SMC_URG_READ = 3, /* data was already read */ 140 140 }; 141 141 142 + struct smc_mark_woken { 143 + bool woken; 144 + void *key; 145 + wait_queue_entry_t wait_entry; 146 + }; 147 + 142 148 struct smc_connection { 143 149 struct rb_node alert_node; 144 150 struct smc_link_group *lgr; /* link group of connection */ ··· 234 228 struct smc_sock { /* smc sock container */ 235 229 struct sock sk; 236 230 struct socket *clcsock; /* internal tcp socket */ 231 + void (*clcsk_state_change)(struct sock *sk); 232 + /* original stat_change fct. */ 237 233 void (*clcsk_data_ready)(struct sock *sk); 238 - /* original data_ready fct. **/ 234 + /* original data_ready fct. */ 235 + void (*clcsk_write_space)(struct sock *sk); 236 + /* original write_space fct. */ 237 + void (*clcsk_error_report)(struct sock *sk); 238 + /* original error_report fct. */ 239 239 struct smc_connection conn; /* smc connection */ 240 240 struct smc_sock *listen_smc; /* listen parent */ 241 241 struct work_struct connect_work; /* handle non-blocking connect*/ ··· 274 262 static inline struct smc_sock *smc_sk(const struct sock *sk) 275 263 { 276 264 return (struct smc_sock *)sk; 265 + } 266 + 267 + static inline struct smc_sock *smc_clcsock_user_data(struct sock *clcsk) 268 + { 269 + return (struct smc_sock *) 270 + ((uintptr_t)clcsk->sk_user_data & ~SK_USER_DATA_NOCOPY); 277 271 } 278 272 279 273 extern struct workqueue_struct *smc_hs_wq; /* wq for handshake work */
-2
net/smc/smc_diag.c
··· 146 146 (req->diag_ext & (1 << (SMC_DIAG_LGRINFO - 1))) && 147 147 !list_empty(&smc->conn.lgr->list)) { 148 148 struct smc_link *link = smc->conn.lnk; 149 - struct net *net = read_pnet(&link->smcibdev->ibdev->coredev.rdma_net); 150 149 151 150 struct smc_diag_lgrinfo linfo = { 152 151 .role = smc->conn.lgr->role, 153 152 .lnk[0].ibport = link->ibport, 154 153 .lnk[0].link_id = link->link_id, 155 - .lnk[0].net_cookie = net->net_cookie, 156 154 }; 157 155 158 156 memcpy(linfo.lnk[0].ibname,
+5 -1
tools/bpf/resolve_btfids/Makefile
··· 9 9 msg = 10 10 else 11 11 Q = @ 12 - msg = @printf ' %-8s %s%s\n' "$(1)" "$(notdir $(2))" "$(if $(3), $(3))"; 12 + ifeq ($(silent),1) 13 + msg = 14 + else 15 + msg = @printf ' %-8s %s%s\n' "$(1)" "$(notdir $(2))" "$(if $(3), $(3))"; 16 + endif 13 17 MAKEFLAGS=--no-print-directory 14 18 endif 15 19
-229
tools/include/uapi/linux/lirc.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 - /* 3 - * lirc.h - linux infrared remote control header file 4 - * last modified 2010/07/13 by Jarod Wilson 5 - */ 6 - 7 - #ifndef _LINUX_LIRC_H 8 - #define _LINUX_LIRC_H 9 - 10 - #include <linux/types.h> 11 - #include <linux/ioctl.h> 12 - 13 - #define PULSE_BIT 0x01000000 14 - #define PULSE_MASK 0x00FFFFFF 15 - 16 - #define LIRC_MODE2_SPACE 0x00000000 17 - #define LIRC_MODE2_PULSE 0x01000000 18 - #define LIRC_MODE2_FREQUENCY 0x02000000 19 - #define LIRC_MODE2_TIMEOUT 0x03000000 20 - 21 - #define LIRC_VALUE_MASK 0x00FFFFFF 22 - #define LIRC_MODE2_MASK 0xFF000000 23 - 24 - #define LIRC_SPACE(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_SPACE) 25 - #define LIRC_PULSE(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_PULSE) 26 - #define LIRC_FREQUENCY(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_FREQUENCY) 27 - #define LIRC_TIMEOUT(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_TIMEOUT) 28 - 29 - #define LIRC_VALUE(val) ((val)&LIRC_VALUE_MASK) 30 - #define LIRC_MODE2(val) ((val)&LIRC_MODE2_MASK) 31 - 32 - #define LIRC_IS_SPACE(val) (LIRC_MODE2(val) == LIRC_MODE2_SPACE) 33 - #define LIRC_IS_PULSE(val) (LIRC_MODE2(val) == LIRC_MODE2_PULSE) 34 - #define LIRC_IS_FREQUENCY(val) (LIRC_MODE2(val) == LIRC_MODE2_FREQUENCY) 35 - #define LIRC_IS_TIMEOUT(val) (LIRC_MODE2(val) == LIRC_MODE2_TIMEOUT) 36 - 37 - /* used heavily by lirc userspace */ 38 - #define lirc_t int 39 - 40 - /*** lirc compatible hardware features ***/ 41 - 42 - #define LIRC_MODE2SEND(x) (x) 43 - #define LIRC_SEND2MODE(x) (x) 44 - #define LIRC_MODE2REC(x) ((x) << 16) 45 - #define LIRC_REC2MODE(x) ((x) >> 16) 46 - 47 - #define LIRC_MODE_RAW 0x00000001 48 - #define LIRC_MODE_PULSE 0x00000002 49 - #define LIRC_MODE_MODE2 0x00000004 50 - #define LIRC_MODE_SCANCODE 0x00000008 51 - #define LIRC_MODE_LIRCCODE 0x00000010 52 - 53 - 54 - #define LIRC_CAN_SEND_RAW LIRC_MODE2SEND(LIRC_MODE_RAW) 55 - #define LIRC_CAN_SEND_PULSE LIRC_MODE2SEND(LIRC_MODE_PULSE) 56 - #define LIRC_CAN_SEND_MODE2 LIRC_MODE2SEND(LIRC_MODE_MODE2) 57 - #define LIRC_CAN_SEND_LIRCCODE LIRC_MODE2SEND(LIRC_MODE_LIRCCODE) 58 - 59 - #define LIRC_CAN_SEND_MASK 0x0000003f 60 - 61 - #define LIRC_CAN_SET_SEND_CARRIER 0x00000100 62 - #define LIRC_CAN_SET_SEND_DUTY_CYCLE 0x00000200 63 - #define LIRC_CAN_SET_TRANSMITTER_MASK 0x00000400 64 - 65 - #define LIRC_CAN_REC_RAW LIRC_MODE2REC(LIRC_MODE_RAW) 66 - #define LIRC_CAN_REC_PULSE LIRC_MODE2REC(LIRC_MODE_PULSE) 67 - #define LIRC_CAN_REC_MODE2 LIRC_MODE2REC(LIRC_MODE_MODE2) 68 - #define LIRC_CAN_REC_SCANCODE LIRC_MODE2REC(LIRC_MODE_SCANCODE) 69 - #define LIRC_CAN_REC_LIRCCODE LIRC_MODE2REC(LIRC_MODE_LIRCCODE) 70 - 71 - #define LIRC_CAN_REC_MASK LIRC_MODE2REC(LIRC_CAN_SEND_MASK) 72 - 73 - #define LIRC_CAN_SET_REC_CARRIER (LIRC_CAN_SET_SEND_CARRIER << 16) 74 - #define LIRC_CAN_SET_REC_DUTY_CYCLE (LIRC_CAN_SET_SEND_DUTY_CYCLE << 16) 75 - 76 - #define LIRC_CAN_SET_REC_DUTY_CYCLE_RANGE 0x40000000 77 - #define LIRC_CAN_SET_REC_CARRIER_RANGE 0x80000000 78 - #define LIRC_CAN_GET_REC_RESOLUTION 0x20000000 79 - #define LIRC_CAN_SET_REC_TIMEOUT 0x10000000 80 - #define LIRC_CAN_SET_REC_FILTER 0x08000000 81 - 82 - #define LIRC_CAN_MEASURE_CARRIER 0x02000000 83 - #define LIRC_CAN_USE_WIDEBAND_RECEIVER 0x04000000 84 - 85 - #define LIRC_CAN_SEND(x) ((x)&LIRC_CAN_SEND_MASK) 86 - #define LIRC_CAN_REC(x) ((x)&LIRC_CAN_REC_MASK) 87 - 88 - #define LIRC_CAN_NOTIFY_DECODE 0x01000000 89 - 90 - /*** IOCTL commands for lirc driver ***/ 91 - 92 - #define LIRC_GET_FEATURES _IOR('i', 0x00000000, __u32) 93 - 94 - #define LIRC_GET_SEND_MODE _IOR('i', 0x00000001, __u32) 95 - #define LIRC_GET_REC_MODE _IOR('i', 0x00000002, __u32) 96 - #define LIRC_GET_REC_RESOLUTION _IOR('i', 0x00000007, __u32) 97 - 98 - #define LIRC_GET_MIN_TIMEOUT _IOR('i', 0x00000008, __u32) 99 - #define LIRC_GET_MAX_TIMEOUT _IOR('i', 0x00000009, __u32) 100 - 101 - /* code length in bits, currently only for LIRC_MODE_LIRCCODE */ 102 - #define LIRC_GET_LENGTH _IOR('i', 0x0000000f, __u32) 103 - 104 - #define LIRC_SET_SEND_MODE _IOW('i', 0x00000011, __u32) 105 - #define LIRC_SET_REC_MODE _IOW('i', 0x00000012, __u32) 106 - /* Note: these can reset the according pulse_width */ 107 - #define LIRC_SET_SEND_CARRIER _IOW('i', 0x00000013, __u32) 108 - #define LIRC_SET_REC_CARRIER _IOW('i', 0x00000014, __u32) 109 - #define LIRC_SET_SEND_DUTY_CYCLE _IOW('i', 0x00000015, __u32) 110 - #define LIRC_SET_TRANSMITTER_MASK _IOW('i', 0x00000017, __u32) 111 - 112 - /* 113 - * when a timeout != 0 is set the driver will send a 114 - * LIRC_MODE2_TIMEOUT data packet, otherwise LIRC_MODE2_TIMEOUT is 115 - * never sent, timeout is disabled by default 116 - */ 117 - #define LIRC_SET_REC_TIMEOUT _IOW('i', 0x00000018, __u32) 118 - 119 - /* 1 enables, 0 disables timeout reports in MODE2 */ 120 - #define LIRC_SET_REC_TIMEOUT_REPORTS _IOW('i', 0x00000019, __u32) 121 - 122 - /* 123 - * if enabled from the next key press on the driver will send 124 - * LIRC_MODE2_FREQUENCY packets 125 - */ 126 - #define LIRC_SET_MEASURE_CARRIER_MODE _IOW('i', 0x0000001d, __u32) 127 - 128 - /* 129 - * to set a range use LIRC_SET_REC_CARRIER_RANGE with the 130 - * lower bound first and later LIRC_SET_REC_CARRIER with the upper bound 131 - */ 132 - #define LIRC_SET_REC_CARRIER_RANGE _IOW('i', 0x0000001f, __u32) 133 - 134 - #define LIRC_SET_WIDEBAND_RECEIVER _IOW('i', 0x00000023, __u32) 135 - 136 - /* 137 - * Return the recording timeout, which is either set by 138 - * the ioctl LIRC_SET_REC_TIMEOUT or by the kernel after setting the protocols. 139 - */ 140 - #define LIRC_GET_REC_TIMEOUT _IOR('i', 0x00000024, __u32) 141 - 142 - /* 143 - * struct lirc_scancode - decoded scancode with protocol for use with 144 - * LIRC_MODE_SCANCODE 145 - * 146 - * @timestamp: Timestamp in nanoseconds using CLOCK_MONOTONIC when IR 147 - * was decoded. 148 - * @flags: should be 0 for transmit. When receiving scancodes, 149 - * LIRC_SCANCODE_FLAG_TOGGLE or LIRC_SCANCODE_FLAG_REPEAT can be set 150 - * depending on the protocol 151 - * @rc_proto: see enum rc_proto 152 - * @keycode: the translated keycode. Set to 0 for transmit. 153 - * @scancode: the scancode received or to be sent 154 - */ 155 - struct lirc_scancode { 156 - __u64 timestamp; 157 - __u16 flags; 158 - __u16 rc_proto; 159 - __u32 keycode; 160 - __u64 scancode; 161 - }; 162 - 163 - /* Set if the toggle bit of rc-5 or rc-6 is enabled */ 164 - #define LIRC_SCANCODE_FLAG_TOGGLE 1 165 - /* Set if this is a nec or sanyo repeat */ 166 - #define LIRC_SCANCODE_FLAG_REPEAT 2 167 - 168 - /** 169 - * enum rc_proto - the Remote Controller protocol 170 - * 171 - * @RC_PROTO_UNKNOWN: Protocol not known 172 - * @RC_PROTO_OTHER: Protocol known but proprietary 173 - * @RC_PROTO_RC5: Philips RC5 protocol 174 - * @RC_PROTO_RC5X_20: Philips RC5x 20 bit protocol 175 - * @RC_PROTO_RC5_SZ: StreamZap variant of RC5 176 - * @RC_PROTO_JVC: JVC protocol 177 - * @RC_PROTO_SONY12: Sony 12 bit protocol 178 - * @RC_PROTO_SONY15: Sony 15 bit protocol 179 - * @RC_PROTO_SONY20: Sony 20 bit protocol 180 - * @RC_PROTO_NEC: NEC protocol 181 - * @RC_PROTO_NECX: Extended NEC protocol 182 - * @RC_PROTO_NEC32: NEC 32 bit protocol 183 - * @RC_PROTO_SANYO: Sanyo protocol 184 - * @RC_PROTO_MCIR2_KBD: RC6-ish MCE keyboard 185 - * @RC_PROTO_MCIR2_MSE: RC6-ish MCE mouse 186 - * @RC_PROTO_RC6_0: Philips RC6-0-16 protocol 187 - * @RC_PROTO_RC6_6A_20: Philips RC6-6A-20 protocol 188 - * @RC_PROTO_RC6_6A_24: Philips RC6-6A-24 protocol 189 - * @RC_PROTO_RC6_6A_32: Philips RC6-6A-32 protocol 190 - * @RC_PROTO_RC6_MCE: MCE (Philips RC6-6A-32 subtype) protocol 191 - * @RC_PROTO_SHARP: Sharp protocol 192 - * @RC_PROTO_XMP: XMP protocol 193 - * @RC_PROTO_CEC: CEC protocol 194 - * @RC_PROTO_IMON: iMon Pad protocol 195 - * @RC_PROTO_RCMM12: RC-MM protocol 12 bits 196 - * @RC_PROTO_RCMM24: RC-MM protocol 24 bits 197 - * @RC_PROTO_RCMM32: RC-MM protocol 32 bits 198 - */ 199 - enum rc_proto { 200 - RC_PROTO_UNKNOWN = 0, 201 - RC_PROTO_OTHER = 1, 202 - RC_PROTO_RC5 = 2, 203 - RC_PROTO_RC5X_20 = 3, 204 - RC_PROTO_RC5_SZ = 4, 205 - RC_PROTO_JVC = 5, 206 - RC_PROTO_SONY12 = 6, 207 - RC_PROTO_SONY15 = 7, 208 - RC_PROTO_SONY20 = 8, 209 - RC_PROTO_NEC = 9, 210 - RC_PROTO_NECX = 10, 211 - RC_PROTO_NEC32 = 11, 212 - RC_PROTO_SANYO = 12, 213 - RC_PROTO_MCIR2_KBD = 13, 214 - RC_PROTO_MCIR2_MSE = 14, 215 - RC_PROTO_RC6_0 = 15, 216 - RC_PROTO_RC6_6A_20 = 16, 217 - RC_PROTO_RC6_6A_24 = 17, 218 - RC_PROTO_RC6_6A_32 = 18, 219 - RC_PROTO_RC6_MCE = 19, 220 - RC_PROTO_SHARP = 20, 221 - RC_PROTO_XMP = 21, 222 - RC_PROTO_CEC = 22, 223 - RC_PROTO_IMON = 23, 224 - RC_PROTO_RCMM12 = 24, 225 - RC_PROTO_RCMM24 = 25, 226 - RC_PROTO_RCMM32 = 26, 227 - }; 228 - 229 - #endif
+1 -1
tools/scripts/Makefile.include
··· 90 90 91 91 else ifneq ($(CROSS_COMPILE),) 92 92 CLANG_CROSS_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) 93 - GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)gcc)) 93 + GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)gcc 2>/dev/null)) 94 94 ifneq ($(GCC_TOOLCHAIN_DIR),) 95 95 CLANG_CROSS_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE)) 96 96 CLANG_CROSS_FLAGS += --sysroot=$(shell $(CROSS_COMPILE)gcc -print-sysroot)
-1
tools/testing/selftests/bpf/test_lirc_mode2_user.c
··· 28 28 // 5. We can read keycode from same /dev/lirc device 29 29 30 30 #include <linux/bpf.h> 31 - #include <linux/lirc.h> 32 31 #include <linux/input.h> 33 32 #include <errno.h> 34 33 #include <stdio.h>
+71 -1
tools/testing/selftests/netfilter/nft_concat_range.sh
··· 27 27 net6_port_net6_port net_port_mac_proto_net" 28 28 29 29 # Reported bugs, also described by TYPE_ variables below 30 - BUGS="flush_remove_add" 30 + BUGS="flush_remove_add reload" 31 31 32 32 # List of possible paths to pktgen script from kernel tree for performance tests 33 33 PKTGEN_SCRIPT_PATHS=" ··· 352 352 # display display text for test report 353 353 TYPE_flush_remove_add=" 354 354 display Add two elements, flush, re-add 355 + " 356 + 357 + TYPE_reload=" 358 + display net,mac with reload 359 + type_spec ipv4_addr . ether_addr 360 + chain_spec ip daddr . ether saddr 361 + dst addr4 362 + src mac 363 + start 1 364 + count 1 365 + src_delta 2000 366 + tools sendip nc bash 367 + proto udp 368 + 369 + race_repeat 0 370 + 371 + perf_duration 0 355 372 " 356 373 357 374 # Set template for all tests, types and rules are filled in depending on test ··· 1487 1470 nft flush set t s 2>/dev/null || return 1 1488 1471 nft add element t s ${elem2} 2>/dev/null || return 1 1489 1472 done 1473 + nft flush ruleset 1474 + } 1475 + 1476 + # - add ranged element, check that packets match it 1477 + # - reload the set, check packets still match 1478 + test_bug_reload() { 1479 + setup veth send_"${proto}" set || return ${KSELFTEST_SKIP} 1480 + rstart=${start} 1481 + 1482 + range_size=1 1483 + for i in $(seq "${start}" $((start + count))); do 1484 + end=$((start + range_size)) 1485 + 1486 + # Avoid negative or zero-sized port ranges 1487 + if [ $((end / 65534)) -gt $((start / 65534)) ]; then 1488 + start=${end} 1489 + end=$((end + 1)) 1490 + fi 1491 + srcstart=$((start + src_delta)) 1492 + srcend=$((end + src_delta)) 1493 + 1494 + add "$(format)" || return 1 1495 + range_size=$((range_size + 1)) 1496 + start=$((end + range_size)) 1497 + done 1498 + 1499 + # check kernel does allocate pcpu sctrach map 1500 + # for reload with no elemet add/delete 1501 + ( echo flush set inet filter test ; 1502 + nft list set inet filter test ) | nft -f - 1503 + 1504 + start=${rstart} 1505 + range_size=1 1506 + 1507 + for i in $(seq "${start}" $((start + count))); do 1508 + end=$((start + range_size)) 1509 + 1510 + # Avoid negative or zero-sized port ranges 1511 + if [ $((end / 65534)) -gt $((start / 65534)) ]; then 1512 + start=${end} 1513 + end=$((end + 1)) 1514 + fi 1515 + srcstart=$((start + src_delta)) 1516 + srcend=$((end + src_delta)) 1517 + 1518 + for j in $(seq ${start} $((range_size / 2 + 1)) ${end}); do 1519 + send_match "${j}" $((j + src_delta)) || return 1 1520 + done 1521 + 1522 + range_size=$((range_size + 1)) 1523 + start=$((end + range_size)) 1524 + done 1525 + 1490 1526 nft flush ruleset 1491 1527 } 1492 1528
+152
tools/testing/selftests/netfilter/nft_nat.sh
··· 899 899 ip netns exec "$ns0" nft delete table $family nat 900 900 } 901 901 902 + test_stateless_nat_ip() 903 + { 904 + local lret=0 905 + 906 + ip netns exec "$ns0" sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null 907 + ip netns exec "$ns0" sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null 908 + 909 + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 910 + if [ $? -ne 0 ] ; then 911 + echo "ERROR: cannot ping $ns1 from $ns2 before loading stateless rules" 912 + return 1 913 + fi 914 + 915 + ip netns exec "$ns0" nft -f /dev/stdin <<EOF 916 + table ip stateless { 917 + map xlate_in { 918 + typeof meta iifname . ip saddr . ip daddr : ip daddr 919 + elements = { 920 + "veth1" . 10.0.2.99 . 10.0.1.99 : 10.0.2.2, 921 + } 922 + } 923 + map xlate_out { 924 + typeof meta iifname . ip saddr . ip daddr : ip daddr 925 + elements = { 926 + "veth0" . 10.0.1.99 . 10.0.2.2 : 10.0.2.99 927 + } 928 + } 929 + 930 + chain prerouting { 931 + type filter hook prerouting priority -400; policy accept; 932 + ip saddr set meta iifname . ip saddr . ip daddr map @xlate_in 933 + ip daddr set meta iifname . ip saddr . ip daddr map @xlate_out 934 + } 935 + } 936 + EOF 937 + if [ $? -ne 0 ]; then 938 + echo "SKIP: Could not add ip statless rules" 939 + return $ksft_skip 940 + fi 941 + 942 + reset_counters 943 + 944 + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 945 + if [ $? -ne 0 ] ; then 946 + echo "ERROR: cannot ping $ns1 from $ns2 with stateless rules" 947 + lret=1 948 + fi 949 + 950 + # ns1 should have seen packets from .2.2, due to stateless rewrite. 951 + expect="packets 1 bytes 84" 952 + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0insl | grep -q "$expect") 953 + if [ $? -ne 0 ]; then 954 + bad_counter "$ns1" ns0insl "$expect" "test_stateless 1" 955 + lret=1 956 + fi 957 + 958 + for dir in "in" "out" ; do 959 + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") 960 + if [ $? -ne 0 ]; then 961 + bad_counter "$ns2" ns1$dir "$expect" "test_stateless 2" 962 + lret=1 963 + fi 964 + done 965 + 966 + # ns1 should not have seen packets from ns2, due to masquerade 967 + expect="packets 0 bytes 0" 968 + for dir in "in" "out" ; do 969 + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") 970 + if [ $? -ne 0 ]; then 971 + bad_counter "$ns1" ns0$dir "$expect" "test_stateless 3" 972 + lret=1 973 + fi 974 + 975 + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns1${dir} | grep -q "$expect") 976 + if [ $? -ne 0 ]; then 977 + bad_counter "$ns0" ns1$dir "$expect" "test_stateless 4" 978 + lret=1 979 + fi 980 + done 981 + 982 + reset_counters 983 + 984 + socat -h > /dev/null 2>&1 985 + if [ $? -ne 0 ];then 986 + echo "SKIP: Could not run stateless nat frag test without socat tool" 987 + if [ $lret -eq 0 ]; then 988 + return $ksft_skip 989 + fi 990 + 991 + ip netns exec "$ns0" nft delete table ip stateless 992 + return $lret 993 + fi 994 + 995 + local tmpfile=$(mktemp) 996 + dd if=/dev/urandom of=$tmpfile bs=4096 count=1 2>/dev/null 997 + 998 + local outfile=$(mktemp) 999 + ip netns exec "$ns1" timeout 3 socat -u UDP4-RECV:4233 OPEN:$outfile < /dev/null & 1000 + sc_r=$! 1001 + 1002 + sleep 1 1003 + # re-do with large ping -> ip fragmentation 1004 + ip netns exec "$ns2" timeout 3 socat - UDP4-SENDTO:"10.0.1.99:4233" < "$tmpfile" > /dev/null 1005 + if [ $? -ne 0 ] ; then 1006 + echo "ERROR: failed to test udp $ns1 to $ns2 with stateless ip nat" 1>&2 1007 + lret=1 1008 + fi 1009 + 1010 + wait 1011 + 1012 + cmp "$tmpfile" "$outfile" 1013 + if [ $? -ne 0 ]; then 1014 + ls -l "$tmpfile" "$outfile" 1015 + echo "ERROR: in and output file mismatch when checking udp with stateless nat" 1>&2 1016 + lret=1 1017 + fi 1018 + 1019 + rm -f "$tmpfile" "$outfile" 1020 + 1021 + # ns1 should have seen packets from 2.2, due to stateless rewrite. 1022 + expect="packets 3 bytes 4164" 1023 + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0insl | grep -q "$expect") 1024 + if [ $? -ne 0 ]; then 1025 + bad_counter "$ns1" ns0insl "$expect" "test_stateless 5" 1026 + lret=1 1027 + fi 1028 + 1029 + ip netns exec "$ns0" nft delete table ip stateless 1030 + if [ $? -ne 0 ]; then 1031 + echo "ERROR: Could not delete table ip stateless" 1>&2 1032 + lret=1 1033 + fi 1034 + 1035 + test $lret -eq 0 && echo "PASS: IP statless for $ns2" 1036 + 1037 + return $lret 1038 + } 1039 + 902 1040 # ip netns exec "$ns0" ping -c 1 -q 10.0.$i.99 903 1041 for i in 0 1 2; do 904 1042 ip netns exec ns$i-$sfx nft -f /dev/stdin <<EOF ··· 1103 965 EOF 1104 966 done 1105 967 968 + # special case for stateless nat check, counter needs to 969 + # be done before (input) ip defragmentation 970 + ip netns exec ns1-$sfx nft -f /dev/stdin <<EOF 971 + table inet filter { 972 + counter ns0insl {} 973 + 974 + chain pre { 975 + type filter hook prerouting priority -400; policy accept; 976 + ip saddr 10.0.2.2 counter name "ns0insl" 977 + } 978 + } 979 + EOF 980 + 1106 981 sleep 3 1107 982 # test basic connectivity 1108 983 for i in 1 2; do ··· 1170 1019 $test_inet_nat && test_redirect6 inet 1171 1020 1172 1021 test_port_shadowing 1022 + test_stateless_nat_ip 1173 1023 1174 1024 if [ $ret -ne 0 ];then 1175 1025 echo -n "FAIL: "
+6 -6
tools/testing/selftests/netfilter/nft_zones_many.sh
··· 9 9 # Kselftest framework requirement - SKIP code is 4. 10 10 ksft_skip=4 11 11 12 - zones=20000 12 + zones=2000 13 13 have_ct_tool=0 14 14 ret=0 15 15 ··· 75 75 76 76 while [ $i -lt $max_zones ]; do 77 77 local start=$(date +%s%3N) 78 - i=$((i + 10000)) 78 + i=$((i + 1000)) 79 79 j=$((j + 1)) 80 80 # nft rule in output places each packet in a different zone. 81 - dd if=/dev/zero of=/dev/stdout bs=8k count=10000 2>/dev/null | ip netns exec "$ns" socat STDIN UDP:127.0.0.1:12345,sourceport=12345 81 + dd if=/dev/zero of=/dev/stdout bs=8k count=1000 2>/dev/null | ip netns exec "$ns" socat STDIN UDP:127.0.0.1:12345,sourceport=12345 82 82 if [ $? -ne 0 ] ;then 83 83 ret=1 84 84 break ··· 86 86 87 87 stop=$(date +%s%3N) 88 88 local duration=$((stop-start)) 89 - echo "PASS: added 10000 entries in $duration ms (now $i total, loop $j)" 89 + echo "PASS: added 1000 entries in $duration ms (now $i total, loop $j)" 90 90 done 91 91 92 92 if [ $have_ct_tool -eq 1 ]; then ··· 128 128 break 129 129 fi 130 130 131 - if [ $((i%10000)) -eq 0 ];then 131 + if [ $((i%1000)) -eq 0 ];then 132 132 stop=$(date +%s%3N) 133 133 134 134 local duration=$((stop-start)) 135 - echo "PASS: added 10000 entries in $duration ms (now $i total)" 135 + echo "PASS: added 1000 entries in $duration ms (now $i total)" 136 136 start=$stop 137 137 fi 138 138 done