Merge tag 'nf-24-03-28' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf
authorPaolo Abeni <pabeni@redhat.com>
Thu, 28 Mar 2024 09:23:02 +0000 (10:23 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 28 Mar 2024 09:23:03 +0000 (10:23 +0100)
Pablo Neira Ayuso says:

====================
Netfilter fixes for net

The following patchset contains Netfilter fixes for net:

Patch #1 reject destroy chain command to delete device hooks in netdev
         family, hence, only delchain commands are allowed.

Patch #2 reject table flag update interference with netdev basechain
 hook updates, this can leave hooks in inconsistent
 registration/unregistration state.

Patch #3 do not unregister netdev basechain hooks if table is dormant.
 Otherwise, splat with double unregistration is possible.

Patch #4 fixes Kconfig to allow to restore IP_NF_ARPTABLES,
 from Kuniyuki Iwashima.

There are a more fixes still in progress on my side that need more work.

* tag 'nf-24-03-28' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf:
  netfilter: arptables: Select NETFILTER_FAMILY_ARP when building arp_tables.c
  netfilter: nf_tables: skip netdev hook unregistration if table is dormant
  netfilter: nf_tables: reject table flag and netdev basechain updates
  netfilter: nf_tables: reject destroy command to remove basechain hooks
====================

Link: https://lore.kernel.org/r/20240328031855.2063-1-pablo@netfilter.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
74 files changed:
.mailmap
MAINTAINERS
arch/arm64/net/bpf_jit_comp.c
arch/riscv/net/bpf_jit_comp64.c
arch/s390/net/bpf_jit_comp.c
drivers/dpll/Kconfig
drivers/net/dsa/mt7530.c
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.c
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
drivers/net/ethernet/intel/ice/ice_lag.c
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_switch.c
drivers/net/ethernet/intel/ice/ice_switch.h
drivers/net/ethernet/intel/igc/igc_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
drivers/net/ethernet/xilinx/ll_temac_main.c
drivers/net/wireless/intel/iwlwifi/fw/dbg.c
drivers/net/wireless/intel/iwlwifi/mvm/d3.c
drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
drivers/net/wireless/intel/iwlwifi/mvm/link.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/rfi.c
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
drivers/net/wireless/intel/iwlwifi/queue/tx.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c
drivers/net/wwan/t7xx/t7xx_cldma.c
drivers/net/wwan/t7xx/t7xx_hif_cldma.c
drivers/net/wwan/t7xx/t7xx_pcie_mac.c
drivers/s390/net/qeth_core_main.c
include/linux/framer/framer.h
include/net/cfg80211.h
include/net/inet_connection_sock.h
include/net/sock.h
include/net/xdp_sock.h
kernel/bpf/arena.c
kernel/bpf/bloom_filter.c
kernel/bpf/helpers.c
kernel/bpf/verifier.c
net/core/sock.c
net/hsr/hsr_slave.c
net/ipv4/inet_connection_sock.c
net/ipv4/nexthop.c
net/ipv4/tcp.c
net/ipv6/addrconf.c
net/mac80211/cfg.c
net/mac80211/debug.h
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/tls/tls_sw.c
net/wireless/trace.h
net/wireless/wext-core.c
scripts/bpf_doc.py
tools/bpf/bpftool/gen.c
tools/lib/bpf/libbpf.c
tools/net/ynl/ynl-gen-c.py
tools/testing/kunit/configs/all_tests.config
tools/testing/selftests/bpf/bpf_arena_common.h
tools/testing/selftests/bpf/prog_tests/arena_htab.c
tools/testing/selftests/bpf/prog_tests/arena_list.c
tools/testing/selftests/bpf/prog_tests/bloom_filter_map.c
tools/testing/selftests/bpf/prog_tests/verifier.c
tools/testing/selftests/bpf/progs/arena_htab.c
tools/testing/selftests/bpf/progs/arena_list.c
tools/testing/selftests/bpf/progs/verifier_arena.c
tools/testing/selftests/bpf/progs/verifier_arena_large.c [new file with mode: 0644]
tools/testing/selftests/drivers/net/netdevsim/settings [new file with mode: 0644]
tools/testing/selftests/net/test_vxlan_mdb.sh
tools/testing/selftests/net/tls.c

index 2216b5d5c84e44ccb1ea8d99ec7e4ba4fa059f08..02cd23b76eda4564d51f84d0d86dda70697569db 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -497,7 +497,8 @@ Prasad Sodagudi <quic_psodagud@quicinc.com> <psodagud@codeaurora.org>
 Punit Agrawal <punitagrawal@gmail.com> <punit.agrawal@arm.com>
 Qais Yousef <qyousef@layalina.io> <qais.yousef@imgtec.com>
 Qais Yousef <qyousef@layalina.io> <qais.yousef@arm.com>
-Quentin Monnet <quentin@isovalent.com> <quentin.monnet@netronome.com>
+Quentin Monnet <qmo@kernel.org> <quentin.monnet@netronome.com>
+Quentin Monnet <qmo@kernel.org> <quentin@isovalent.com>
 Quentin Perret <qperret@qperret.net> <quentin.perret@arm.com>
 Rafael J. Wysocki <rjw@rjwysocki.net> <rjw@sisk.pl>
 Rajeev Nandan <quic_rajeevny@quicinc.com> <rajeevny@codeaurora.org>
index f736af98d7b591fa0711c7b18ad3a882748b53e1..debe23c287a060c00f7985b81ce54d82a10d393b 100644 (file)
@@ -3941,8 +3941,7 @@ F:        kernel/bpf/ringbuf.c
 
 BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF)
 M:     KP Singh <kpsingh@kernel.org>
-R:     Florent Revest <revest@chromium.org>
-R:     Brendan Jackman <jackmanb@chromium.org>
+R:     Matt Bobrowski <mattbobrowski@google.com>
 L:     bpf@vger.kernel.org
 S:     Maintained
 F:     Documentation/bpf/prog_lsm.rst
@@ -3967,7 +3966,7 @@ F:        kernel/bpf/bpf_lru*
 F:     kernel/bpf/cgroup.c
 
 BPF [TOOLING] (bpftool)
-M:     Quentin Monnet <quentin@isovalent.com>
+M:     Quentin Monnet <qmo@kernel.org>
 L:     bpf@vger.kernel.org
 S:     Maintained
 F:     kernel/bpf/disasm.*
@@ -13133,6 +13132,7 @@ F:      drivers/net/ethernet/marvell/mvpp2/
 
 MARVELL MWIFIEX WIRELESS DRIVER
 M:     Brian Norris <briannorris@chromium.org>
+R:     Francesco Dolcini <francesco@dolcini.it>
 L:     linux-wireless@vger.kernel.org
 S:     Odd Fixes
 F:     drivers/net/wireless/marvell/mwifiex/
@@ -18642,18 +18642,21 @@ REALTEK WIRELESS DRIVER (rtlwifi family)
 M:     Ping-Ke Shih <pkshih@realtek.com>
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
+T:     git https://github.com/pkshih/rtw.git
 F:     drivers/net/wireless/realtek/rtlwifi/
 
 REALTEK WIRELESS DRIVER (rtw88)
 M:     Ping-Ke Shih <pkshih@realtek.com>
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
+T:     git https://github.com/pkshih/rtw.git
 F:     drivers/net/wireless/realtek/rtw88/
 
 REALTEK WIRELESS DRIVER (rtw89)
 M:     Ping-Ke Shih <pkshih@realtek.com>
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
+T:     git https://github.com/pkshih/rtw.git
 F:     drivers/net/wireless/realtek/rtw89/
 
 REDPINE WIRELESS DRIVER
@@ -18724,13 +18727,24 @@ S:    Supported
 F:     Documentation/devicetree/bindings/i2c/renesas,iic-emev2.yaml
 F:     drivers/i2c/busses/i2c-emev2.c
 
-RENESAS ETHERNET DRIVERS
+RENESAS ETHERNET AVB DRIVER
 R:     Sergey Shtylyov <s.shtylyov@omp.ru>
 L:     netdev@vger.kernel.org
 L:     linux-renesas-soc@vger.kernel.org
-F:     Documentation/devicetree/bindings/net/renesas,*.yaml
-F:     drivers/net/ethernet/renesas/
-F:     include/linux/sh_eth.h
+F:     Documentation/devicetree/bindings/net/renesas,etheravb.yaml
+F:     drivers/net/ethernet/renesas/Kconfig
+F:     drivers/net/ethernet/renesas/Makefile
+F:     drivers/net/ethernet/renesas/ravb*
+
+RENESAS ETHERNET SWITCH DRIVER
+R:     Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+L:     netdev@vger.kernel.org
+L:     linux-renesas-soc@vger.kernel.org
+F:     Documentation/devicetree/bindings/net/renesas,*ether-switch.yaml
+F:     drivers/net/ethernet/renesas/Kconfig
+F:     drivers/net/ethernet/renesas/Makefile
+F:     drivers/net/ethernet/renesas/rcar_gen4*
+F:     drivers/net/ethernet/renesas/rswitch*
 
 RENESAS IDT821034 ASoC CODEC
 M:     Herve Codina <herve.codina@bootlin.com>
@@ -18840,6 +18854,16 @@ S:     Supported
 F:     Documentation/devicetree/bindings/i2c/renesas,rzv2m.yaml
 F:     drivers/i2c/busses/i2c-rzv2m.c
 
+RENESAS SUPERH ETHERNET DRIVER
+R:     Sergey Shtylyov <s.shtylyov@omp.ru>
+L:     netdev@vger.kernel.org
+L:     linux-renesas-soc@vger.kernel.org
+F:     Documentation/devicetree/bindings/net/renesas,ether.yaml
+F:     drivers/net/ethernet/renesas/Kconfig
+F:     drivers/net/ethernet/renesas/Makefile
+F:     drivers/net/ethernet/renesas/sh_eth*
+F:     include/linux/sh_eth.h
+
 RENESAS USB PHY DRIVER
 M:     Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
 L:     linux-renesas-soc@vger.kernel.org
@@ -19176,12 +19200,14 @@ M:    Hin-Tak Leung <hintak.leung@gmail.com>
 M:     Larry Finger <Larry.Finger@lwfinger.net>
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
+T:     git https://github.com/pkshih/rtw.git
 F:     drivers/net/wireless/realtek/rtl818x/rtl8187/
 
 RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
 M:     Jes Sorensen <Jes.Sorensen@gmail.com>
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
+T:     git https://github.com/pkshih/rtw.git
 F:     drivers/net/wireless/realtek/rtl8xxxu/
 
 RTRS TRANSPORT DRIVERS
index c5b461dda4385960437d5472cc3e3945d7f9a3fe..122021f9bdfc87c3c9634d6801edad7845b9f96e 100644 (file)
@@ -943,7 +943,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
                        emit(A64_UXTH(is64, dst, dst), ctx);
                        break;
                case 32:
-                       emit(A64_REV32(is64, dst, dst), ctx);
+                       emit(A64_REV32(0, dst, dst), ctx);
                        /* upper 32 bits already cleared */
                        break;
                case 64:
@@ -1256,7 +1256,7 @@ emit_cond_jmp:
                        } else {
                                emit_a64_mov_i(1, tmp, off, ctx);
                                if (sign_extend)
-                                       emit(A64_LDRSW(dst, src_adj, off_adj), ctx);
+                                       emit(A64_LDRSW(dst, src, tmp), ctx);
                                else
                                        emit(A64_LDR32(dst, src, tmp), ctx);
                        }
index aac190085472411f4552c54b36a802f896e72cd3..1adf2f39ce59cbb691b7f89ae9fc7a5127642ca4 100644 (file)
@@ -1463,6 +1463,22 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
                if (ret < 0)
                        return ret;
 
+               if (insn->src_reg == BPF_PSEUDO_KFUNC_CALL) {
+                       const struct btf_func_model *fm;
+                       int idx;
+
+                       fm = bpf_jit_find_kfunc_model(ctx->prog, insn);
+                       if (!fm)
+                               return -EINVAL;
+
+                       for (idx = 0; idx < fm->nr_args; idx++) {
+                               u8 reg = bpf_to_rv_reg(BPF_REG_1 + idx, ctx);
+
+                               if (fm->arg_size[idx] == sizeof(int))
+                                       emit_sextw(reg, reg, ctx);
+                       }
+               }
+
                ret = emit_call(addr, fixed_addr, ctx);
                if (ret)
                        return ret;
index b418333bb08635304780933646e26f5ab9354e8e..5af0402e94b88c07ec3772699926d19f8f18b043 100644 (file)
@@ -516,11 +516,12 @@ static void bpf_skip(struct bpf_jit *jit, int size)
  * PLT for hotpatchable calls. The calling convention is the same as for the
  * ftrace hotpatch trampolines: %r0 is return address, %r1 is clobbered.
  */
-extern const char bpf_plt[];
-extern const char bpf_plt_ret[];
-extern const char bpf_plt_target[];
-extern const char bpf_plt_end[];
-#define BPF_PLT_SIZE 32
+struct bpf_plt {
+       char code[16];
+       void *ret;
+       void *target;
+} __packed;
+extern const struct bpf_plt bpf_plt;
 asm(
        ".pushsection .rodata\n"
        "       .balign 8\n"
@@ -531,15 +532,14 @@ asm(
        "       .balign 8\n"
        "bpf_plt_ret: .quad 0\n"
        "bpf_plt_target: .quad 0\n"
-       "bpf_plt_end:\n"
        "       .popsection\n"
 );
 
-static void bpf_jit_plt(void *plt, void *ret, void *target)
+static void bpf_jit_plt(struct bpf_plt *plt, void *ret, void *target)
 {
-       memcpy(plt, bpf_plt, BPF_PLT_SIZE);
-       *(void **)((char *)plt + (bpf_plt_ret - bpf_plt)) = ret;
-       *(void **)((char *)plt + (bpf_plt_target - bpf_plt)) = target ?: ret;
+       memcpy(plt, &bpf_plt, sizeof(*plt));
+       plt->ret = ret;
+       plt->target = target;
 }
 
 /*
@@ -662,9 +662,9 @@ static void bpf_jit_epilogue(struct bpf_jit *jit, u32 stack_depth)
        jit->prg = ALIGN(jit->prg, 8);
        jit->prologue_plt = jit->prg;
        if (jit->prg_buf)
-               bpf_jit_plt(jit->prg_buf + jit->prg,
+               bpf_jit_plt((struct bpf_plt *)(jit->prg_buf + jit->prg),
                            jit->prg_buf + jit->prologue_plt_ret, NULL);
-       jit->prg += BPF_PLT_SIZE;
+       jit->prg += sizeof(struct bpf_plt);
 }
 
 static int get_probe_mem_regno(const u8 *insn)
@@ -2040,9 +2040,6 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)
        struct bpf_jit jit;
        int pass;
 
-       if (WARN_ON_ONCE(bpf_plt_end - bpf_plt != BPF_PLT_SIZE))
-               return orig_fp;
-
        if (!fp->jit_requested)
                return orig_fp;
 
@@ -2148,14 +2145,11 @@ bool bpf_jit_supports_far_kfunc_call(void)
 int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
                       void *old_addr, void *new_addr)
 {
+       struct bpf_plt expected_plt, current_plt, new_plt, *plt;
        struct {
                u16 opc;
                s32 disp;
        } __packed insn;
-       char expected_plt[BPF_PLT_SIZE];
-       char current_plt[BPF_PLT_SIZE];
-       char new_plt[BPF_PLT_SIZE];
-       char *plt;
        char *ret;
        int err;
 
@@ -2174,18 +2168,18 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
                 */
        } else {
                /* Verify the PLT. */
-               plt = (char *)ip + (insn.disp << 1);
-               err = copy_from_kernel_nofault(current_plt, plt, BPF_PLT_SIZE);
+               plt = ip + (insn.disp << 1);
+               err = copy_from_kernel_nofault(&current_plt, plt,
+                                              sizeof(current_plt));
                if (err < 0)
                        return err;
                ret = (char *)ip + 6;
-               bpf_jit_plt(expected_plt, ret, old_addr);
-               if (memcmp(current_plt, expected_plt, BPF_PLT_SIZE))
+               bpf_jit_plt(&expected_plt, ret, old_addr);
+               if (memcmp(&current_plt, &expected_plt, sizeof(current_plt)))
                        return -EINVAL;
                /* Adjust the call address. */
-               bpf_jit_plt(new_plt, ret, new_addr);
-               s390_kernel_write(plt + (bpf_plt_target - bpf_plt),
-                                 new_plt + (bpf_plt_target - bpf_plt),
+               bpf_jit_plt(&new_plt, ret, new_addr);
+               s390_kernel_write(&plt->target, &new_plt.target,
                                  sizeof(void *));
        }
 
index a4cae73f20d3d0b52f6b874fd3aa5ef069c440b2..20607ed54243581a60c792b78a5d952fbe0eaa84 100644 (file)
@@ -4,4 +4,4 @@
 #
 
 config DPLL
-  bool
+       bool
index 767f66c37f6b5cf63db379232af407b9813428a1..1035820c2377af7d73d401824734e949b7679c8d 100644 (file)
@@ -2268,8 +2268,6 @@ mt7530_setup(struct dsa_switch *ds)
                     SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST |
                     SYS_CTRL_REG_RST);
 
-       mt7530_pll_setup(priv);
-
        /* Lower Tx driving for TRGMII path */
        for (i = 0; i < NUM_TRGMII_CTRL; i++)
                mt7530_write(priv, MT7530_TRGMII_TD_ODT(i),
@@ -2285,6 +2283,9 @@ mt7530_setup(struct dsa_switch *ds)
        val |= MHWTRAP_MANUAL;
        mt7530_write(priv, MT7530_MHWTRAP, val);
 
+       if ((val & HWTRAP_XTAL_MASK) == HWTRAP_XTAL_40MHZ)
+               mt7530_pll_setup(priv);
+
        mt753x_trap_frames(priv);
 
        /* Enable and reset MIB counters */
index f3c9395d8351cb31108973e1867332e00026c6ac..618f66d9586b390a4d4ec45aafa4178ec06e5a91 100644 (file)
@@ -85,7 +85,7 @@ int hclge_comm_tqps_update_stats(struct hnae3_handle *handle,
                hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_TX_STATS,
                                                true);
 
-               desc.data[0] = cpu_to_le32(tqp->index & 0x1ff);
+               desc.data[0] = cpu_to_le32(tqp->index);
                ret = hclge_comm_cmd_send(hw, &desc, 1);
                if (ret) {
                        dev_err(&hw->cmq.csq.pdev->dev,
index 999a0ee162a64494f0782b1fc5cbdfff695e83b8..941cb529d671fb2bf2fc12ceb5890fec093dc137 100644 (file)
@@ -78,6 +78,9 @@ static const struct hns3_stats hns3_rxq_stats[] = {
 #define HNS3_NIC_LB_TEST_NO_MEM_ERR    1
 #define HNS3_NIC_LB_TEST_TX_CNT_ERR    2
 #define HNS3_NIC_LB_TEST_RX_CNT_ERR    3
+#define HNS3_NIC_LB_TEST_UNEXECUTED    4
+
+static int hns3_get_sset_count(struct net_device *netdev, int stringset);
 
 static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
 {
@@ -418,18 +421,26 @@ static void hns3_do_external_lb(struct net_device *ndev,
 static void hns3_self_test(struct net_device *ndev,
                           struct ethtool_test *eth_test, u64 *data)
 {
+       int cnt = hns3_get_sset_count(ndev, ETH_SS_TEST);
        struct hns3_nic_priv *priv = netdev_priv(ndev);
        struct hnae3_handle *h = priv->ae_handle;
        int st_param[HNAE3_LOOP_NONE][2];
        bool if_running = netif_running(ndev);
+       int i;
+
+       /* initialize the loopback test result, avoid marking an unexcuted
+        * loopback test as PASS.
+        */
+       for (i = 0; i < cnt; i++)
+               data[i] = HNS3_NIC_LB_TEST_UNEXECUTED;
 
        if (hns3_nic_resetting(ndev)) {
                netdev_err(ndev, "dev resetting!");
-               return;
+               goto failure;
        }
 
        if (!(eth_test->flags & ETH_TEST_FL_OFFLINE))
-               return;
+               goto failure;
 
        if (netif_msg_ifdown(h))
                netdev_info(ndev, "self test start\n");
@@ -451,6 +462,10 @@ static void hns3_self_test(struct net_device *ndev,
 
        if (netif_msg_ifdown(h))
                netdev_info(ndev, "self test end\n");
+       return;
+
+failure:
+       eth_test->flags |= ETH_TEST_FL_FAILED;
 }
 
 static void hns3_update_limit_promisc_mode(struct net_device *netdev,
index b4afb66efe5c5c242e01670128c3ae069bdcaeda..ff6a2ed23ddb6be2c5dd132698d2fd079f5f5827 100644 (file)
@@ -11626,6 +11626,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
        if (ret)
                goto err_pci_uninit;
 
+       devl_lock(hdev->devlink);
+
        /* Firmware command queue initialize */
        ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
        if (ret)
@@ -11805,6 +11807,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
 
        hclge_task_schedule(hdev, round_jiffies_relative(HZ));
 
+       devl_unlock(hdev->devlink);
        return 0;
 
 err_mdiobus_unreg:
@@ -11817,6 +11820,7 @@ err_msi_uninit:
 err_cmd_uninit:
        hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
 err_devlink_uninit:
+       devl_unlock(hdev->devlink);
        hclge_devlink_uninit(hdev);
 err_pci_uninit:
        pcim_iounmap(pdev, hdev->hw.hw.io_base);
index 8040317c95617efaeaf9ff0ccbe6b07bc13b231a..1f3e7a6903e56e6bc0f452e58a4b3d026737f9a0 100644 (file)
@@ -593,8 +593,9 @@ struct ice_aqc_recipe_data_elem {
 struct ice_aqc_recipe_to_profile {
        __le16 profile_id;
        u8 rsvd[6];
-       DECLARE_BITMAP(recipe_assoc, ICE_MAX_NUM_RECIPES);
+       __le64 recipe_assoc;
 };
+static_assert(sizeof(struct ice_aqc_recipe_to_profile) == 16);
 
 /* Add/Update/Remove/Get switch rules (indirect 0x02A0, 0x02A1, 0x02A2, 0x02A3)
  */
index 467372d541d21f9c26416275f945b12e684079ef..a7a342809935f77a868c9f2a07cf89eb59d12b1d 100644 (file)
@@ -2041,7 +2041,7 @@ int ice_init_lag(struct ice_pf *pf)
        /* associate recipes to profiles */
        for (n = 0; n < ICE_PROFID_IPV6_GTPU_IPV6_TCP_INNER; n++) {
                err = ice_aq_get_recipe_to_profile(&pf->hw, n,
-                                                  (u8 *)&recipe_bits, NULL);
+                                                  &recipe_bits, NULL);
                if (err)
                        continue;
 
@@ -2049,7 +2049,7 @@ int ice_init_lag(struct ice_pf *pf)
                        recipe_bits |= BIT(lag->pf_recipe) |
                                       BIT(lag->lport_recipe);
                        ice_aq_map_recipe_to_profile(&pf->hw, n,
-                                                    (u8 *)&recipe_bits, NULL);
+                                                    recipe_bits, NULL);
                }
        }
 
index ee3f0d3e3f6dbd5e1906cb2ce4f03e5675105c09..558422120312ba858a55e9ed4747b1ba3d4072a2 100644 (file)
@@ -3091,7 +3091,7 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
 {
        struct ice_vsi_cfg_params params = {};
        struct ice_coalesce_stored *coalesce;
-       int prev_num_q_vectors = 0;
+       int prev_num_q_vectors;
        struct ice_pf *pf;
        int ret;
 
@@ -3105,13 +3105,6 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
        if (WARN_ON(vsi->type == ICE_VSI_VF && !vsi->vf))
                return -EINVAL;
 
-       coalesce = kcalloc(vsi->num_q_vectors,
-                          sizeof(struct ice_coalesce_stored), GFP_KERNEL);
-       if (!coalesce)
-               return -ENOMEM;
-
-       prev_num_q_vectors = ice_vsi_rebuild_get_coalesce(vsi, coalesce);
-
        ret = ice_vsi_realloc_stat_arrays(vsi);
        if (ret)
                goto err_vsi_cfg;
@@ -3121,6 +3114,13 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
        if (ret)
                goto err_vsi_cfg;
 
+       coalesce = kcalloc(vsi->num_q_vectors,
+                          sizeof(struct ice_coalesce_stored), GFP_KERNEL);
+       if (!coalesce)
+               return -ENOMEM;
+
+       prev_num_q_vectors = ice_vsi_rebuild_get_coalesce(vsi, coalesce);
+
        ret = ice_vsi_cfg_tc_lan(pf, vsi);
        if (ret) {
                if (vsi_flags & ICE_VSI_FLAG_INIT) {
@@ -3139,8 +3139,8 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
 
 err_vsi_cfg_tc_lan:
        ice_vsi_decfg(vsi);
-err_vsi_cfg:
        kfree(coalesce);
+err_vsi_cfg:
        return ret;
 }
 
index f84bab80ca42376482e2ea504aa90e3ebf6a8f98..ba0ef91e4c19c16d314783b1f22216e65becc84c 100644 (file)
@@ -2025,12 +2025,12 @@ error_out:
  * ice_aq_map_recipe_to_profile - Map recipe to packet profile
  * @hw: pointer to the HW struct
  * @profile_id: package profile ID to associate the recipe with
- * @r_bitmap: Recipe bitmap filled in and need to be returned as response
+ * @r_assoc: Recipe bitmap filled in and need to be returned as response
  * @cd: pointer to command details structure or NULL
  * Recipe to profile association (0x0291)
  */
 int
-ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 r_assoc,
                             struct ice_sq_cd *cd)
 {
        struct ice_aqc_recipe_to_profile *cmd;
@@ -2042,7 +2042,7 @@ ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
        /* Set the recipe ID bit in the bitmask to let the device know which
         * profile we are associating the recipe to
         */
-       memcpy(cmd->recipe_assoc, r_bitmap, sizeof(cmd->recipe_assoc));
+       cmd->recipe_assoc = cpu_to_le64(r_assoc);
 
        return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
 }
@@ -2051,12 +2051,12 @@ ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
  * ice_aq_get_recipe_to_profile - Map recipe to packet profile
  * @hw: pointer to the HW struct
  * @profile_id: package profile ID to associate the recipe with
- * @r_bitmap: Recipe bitmap filled in and need to be returned as response
+ * @r_assoc: Recipe bitmap filled in and need to be returned as response
  * @cd: pointer to command details structure or NULL
  * Associate profile ID with given recipe (0x0293)
  */
 int
-ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 *r_assoc,
                             struct ice_sq_cd *cd)
 {
        struct ice_aqc_recipe_to_profile *cmd;
@@ -2069,7 +2069,7 @@ ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
 
        status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
        if (!status)
-               memcpy(r_bitmap, cmd->recipe_assoc, sizeof(cmd->recipe_assoc));
+               *r_assoc = le64_to_cpu(cmd->recipe_assoc);
 
        return status;
 }
@@ -2108,6 +2108,7 @@ int ice_alloc_recipe(struct ice_hw *hw, u16 *rid)
 static void ice_get_recp_to_prof_map(struct ice_hw *hw)
 {
        DECLARE_BITMAP(r_bitmap, ICE_MAX_NUM_RECIPES);
+       u64 recp_assoc;
        u16 i;
 
        for (i = 0; i < hw->switch_info->max_used_prof_index + 1; i++) {
@@ -2115,8 +2116,9 @@ static void ice_get_recp_to_prof_map(struct ice_hw *hw)
 
                bitmap_zero(profile_to_recipe[i], ICE_MAX_NUM_RECIPES);
                bitmap_zero(r_bitmap, ICE_MAX_NUM_RECIPES);
-               if (ice_aq_get_recipe_to_profile(hw, i, (u8 *)r_bitmap, NULL))
+               if (ice_aq_get_recipe_to_profile(hw, i, &recp_assoc, NULL))
                        continue;
+               bitmap_from_arr64(r_bitmap, &recp_assoc, ICE_MAX_NUM_RECIPES);
                bitmap_copy(profile_to_recipe[i], r_bitmap,
                            ICE_MAX_NUM_RECIPES);
                for_each_set_bit(j, r_bitmap, ICE_MAX_NUM_RECIPES)
@@ -5390,22 +5392,24 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
         */
        list_for_each_entry(fvit, &rm->fv_list, list_entry) {
                DECLARE_BITMAP(r_bitmap, ICE_MAX_NUM_RECIPES);
+               u64 recp_assoc;
                u16 j;
 
                status = ice_aq_get_recipe_to_profile(hw, fvit->profile_id,
-                                                     (u8 *)r_bitmap, NULL);
+                                                     &recp_assoc, NULL);
                if (status)
                        goto err_unroll;
 
+               bitmap_from_arr64(r_bitmap, &recp_assoc, ICE_MAX_NUM_RECIPES);
                bitmap_or(r_bitmap, r_bitmap, rm->r_bitmap,
                          ICE_MAX_NUM_RECIPES);
                status = ice_acquire_change_lock(hw, ICE_RES_WRITE);
                if (status)
                        goto err_unroll;
 
+               bitmap_to_arr64(&recp_assoc, r_bitmap, ICE_MAX_NUM_RECIPES);
                status = ice_aq_map_recipe_to_profile(hw, fvit->profile_id,
-                                                     (u8 *)r_bitmap,
-                                                     NULL);
+                                                     recp_assoc, NULL);
                ice_release_change_lock(hw);
 
                if (status)
index db7e501b7e0a486fa046fc2f1afdba2e9350c113..89ffa1b51b5ad111ae6dc73ec64c8a78c38899b1 100644 (file)
@@ -424,10 +424,10 @@ int ice_aq_add_recipe(struct ice_hw *hw,
                      struct ice_aqc_recipe_data_elem *s_recipe_list,
                      u16 num_recipes, struct ice_sq_cd *cd);
 int
-ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 *r_assoc,
                             struct ice_sq_cd *cd);
 int
-ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 r_assoc,
                             struct ice_sq_cd *cd);
 
 #endif /* _ICE_SWITCH_H_ */
index 2e1cfbd82f4fd55db97e064c0a8343d95f076f6f..35ad40a803cb64a66b983b3a2103a8f15b808df5 100644 (file)
@@ -1642,10 +1642,6 @@ done:
 
        if (unlikely(test_bit(IGC_RING_FLAG_TX_HWTSTAMP, &tx_ring->flags) &&
                     skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
-               /* FIXME: add support for retrieving timestamps from
-                * the other timer registers before skipping the
-                * timestamping request.
-                */
                unsigned long flags;
                u32 tstamp_flags;
 
index 13a6fca31004a8e1c69d7b8a994b5da93ca08b3c..866024f2b9eeb380d31557b53f2c7e00fe41a15a 100644 (file)
@@ -914,7 +914,13 @@ int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
                goto err_out;
        }
 
-       xs = kzalloc(sizeof(*xs), GFP_KERNEL);
+       algo = xfrm_aead_get_byname(aes_gcm_name, IXGBE_IPSEC_AUTH_BITS, 1);
+       if (unlikely(!algo)) {
+               err = -ENOENT;
+               goto err_out;
+       }
+
+       xs = kzalloc(sizeof(*xs), GFP_ATOMIC);
        if (unlikely(!xs)) {
                err = -ENOMEM;
                goto err_out;
@@ -930,14 +936,8 @@ int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
                memcpy(&xs->id.daddr.a4, sam->addr, sizeof(xs->id.daddr.a4));
        xs->xso.dev = adapter->netdev;
 
-       algo = xfrm_aead_get_byname(aes_gcm_name, IXGBE_IPSEC_AUTH_BITS, 1);
-       if (unlikely(!algo)) {
-               err = -ENOENT;
-               goto err_xs;
-       }
-
        aead_len = sizeof(*xs->aead) + IXGBE_IPSEC_KEY_BITS / 8;
-       xs->aead = kzalloc(aead_len, GFP_KERNEL);
+       xs->aead = kzalloc(aead_len, GFP_ATOMIC);
        if (unlikely(!xs->aead)) {
                err = -ENOMEM;
                goto err_xs;
index 3d09fa54598f1abc79cb15c90d5cedbe1bb44496..77134ca929382f7ef7a989c8e636a126349f742c 100644 (file)
@@ -139,13 +139,10 @@ static int mlxbf_gige_open(struct net_device *netdev)
        control |= MLXBF_GIGE_CONTROL_PORT_EN;
        writeq(control, priv->base + MLXBF_GIGE_CONTROL);
 
-       err = mlxbf_gige_request_irqs(priv);
-       if (err)
-               return err;
        mlxbf_gige_cache_stats(priv);
        err = mlxbf_gige_clean_port(priv);
        if (err)
-               goto free_irqs;
+               return err;
 
        /* Clear driver's valid_polarity to match hardware,
         * since the above call to clean_port() resets the
@@ -157,7 +154,7 @@ static int mlxbf_gige_open(struct net_device *netdev)
 
        err = mlxbf_gige_tx_init(priv);
        if (err)
-               goto free_irqs;
+               goto phy_deinit;
        err = mlxbf_gige_rx_init(priv);
        if (err)
                goto tx_deinit;
@@ -166,6 +163,10 @@ static int mlxbf_gige_open(struct net_device *netdev)
        napi_enable(&priv->napi);
        netif_start_queue(netdev);
 
+       err = mlxbf_gige_request_irqs(priv);
+       if (err)
+               goto napi_deinit;
+
        /* Set bits in INT_EN that we care about */
        int_en = MLXBF_GIGE_INT_EN_HW_ACCESS_ERROR |
                 MLXBF_GIGE_INT_EN_TX_CHECKSUM_INPUTS |
@@ -182,11 +183,17 @@ static int mlxbf_gige_open(struct net_device *netdev)
 
        return 0;
 
+napi_deinit:
+       netif_stop_queue(netdev);
+       napi_disable(&priv->napi);
+       netif_napi_del(&priv->napi);
+       mlxbf_gige_rx_deinit(priv);
+
 tx_deinit:
        mlxbf_gige_tx_deinit(priv);
 
-free_irqs:
-       mlxbf_gige_free_irqs(priv);
+phy_deinit:
+       phy_stop(phydev);
        return err;
 }
 
index 9df39cf8b0975048cd2f53edcb1e4c2336e51f1b..1072e2210aed32dbe8dda8f9d3b045a8a7a3a7ab 100644 (file)
@@ -1443,7 +1443,7 @@ static int temac_probe(struct platform_device *pdev)
        }
 
        /* map device registers */
-       lp->regs = devm_platform_ioremap_resource_byname(pdev, 0);
+       lp->regs = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(lp->regs)) {
                dev_err(&pdev->dev, "could not map TEMAC registers\n");
                return -ENOMEM;
index db6d7013df6654434774e9ec2bb4de33be50f4d2..c3bdf433d8f7b3aea81fd0ee919ad8f7fa8f692a 100644 (file)
@@ -3081,8 +3081,6 @@ static void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt, u8 wk_idx)
        struct iwl_fw_dbg_params params = {0};
        struct iwl_fwrt_dump_data *dump_data =
                &fwrt->dump.wks[wk_idx].dump_data;
-       u32 policy;
-       u32 time_point;
        if (!test_bit(wk_idx, &fwrt->dump.active_wks))
                return;
 
@@ -3113,13 +3111,16 @@ static void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt, u8 wk_idx)
 
        iwl_fw_dbg_stop_restart_recording(fwrt, &params, false);
 
-       policy = le32_to_cpu(dump_data->trig->apply_policy);
-       time_point = le32_to_cpu(dump_data->trig->time_point);
+       if (iwl_trans_dbg_ini_valid(fwrt->trans)) {
+               u32 policy = le32_to_cpu(dump_data->trig->apply_policy);
+               u32 time_point = le32_to_cpu(dump_data->trig->time_point);
 
-       if (policy & IWL_FW_INI_APPLY_POLICY_DUMP_COMPLETE_CMD) {
-               IWL_DEBUG_FW_INFO(fwrt, "WRT: sending dump complete\n");
-               iwl_send_dbg_dump_complete_cmd(fwrt, time_point, 0);
+               if (policy & IWL_FW_INI_APPLY_POLICY_DUMP_COMPLETE_CMD) {
+                       IWL_DEBUG_FW_INFO(fwrt, "WRT: sending dump complete\n");
+                       iwl_send_dbg_dump_complete_cmd(fwrt, time_point, 0);
+               }
        }
+
        if (fwrt->trans->dbg.last_tp_resetfw == IWL_FW_INI_RESET_FW_MODE_STOP_FW_ONLY)
                iwl_force_nmi(fwrt->trans);
 
index 553c6fffc7c66ddb182f00b75953fff86391c712..52518a47554e7087ded4782c24fd62340a17384a 100644 (file)
@@ -1260,15 +1260,15 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
        if (IS_ERR_OR_NULL(vif))
                return 1;
 
-       if (ieee80211_vif_is_mld(vif) && vif->cfg.assoc) {
+       if (hweight16(vif->active_links) > 1) {
                /*
-                * Select the 'best' link. May need to revisit, it seems
-                * better to not optimize for throughput but rather range,
-                * reliability and power here - and select 2.4 GHz ...
+                * Select the 'best' link.
+                * May need to revisit, it seems better to not optimize
+                * for throughput but rather range, reliability and
+                * power here - and select 2.4 GHz ...
                 */
-               primary_link =
-                       iwl_mvm_mld_get_primary_link(mvm, vif,
-                                                    vif->active_links);
+               primary_link = iwl_mvm_mld_get_primary_link(mvm, vif,
+                                                           vif->active_links);
 
                if (WARN_ONCE(primary_link < 0, "no primary link in 0x%x\n",
                              vif->active_links))
@@ -1277,6 +1277,8 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
                ret = ieee80211_set_active_links(vif, BIT(primary_link));
                if (ret)
                        return ret;
+       } else if (vif->active_links) {
+               primary_link = __ffs(vif->active_links);
        } else {
                primary_link = 0;
        }
index 51b01f7528beec1ec99c7a772bd372051e1463d1..7fe57ecd0682b8bcdebbb7c999f655903d498785 100644 (file)
@@ -748,7 +748,9 @@ void iwl_mvm_vif_dbgfs_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
 {
        struct dentry *dbgfs_dir = vif->debugfs_dir;
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
-       char buf[100];
+       char buf[3 * 3 + 11 + (NL80211_WIPHY_NAME_MAXLEN + 1) +
+                (7 + IFNAMSIZ + 1) + 6 + 1];
+       char name[7 + IFNAMSIZ + 1];
 
        /* this will happen in monitor mode */
        if (!dbgfs_dir)
@@ -761,10 +763,11 @@ void iwl_mvm_vif_dbgfs_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
         * find
         * netdev:wlan0 -> ../../../ieee80211/phy0/netdev:wlan0/iwlmvm/
         */
-       snprintf(buf, 100, "../../../%pd3/iwlmvm", dbgfs_dir);
+       snprintf(name, sizeof(name), "%pd", dbgfs_dir);
+       snprintf(buf, sizeof(buf), "../../../%pd3/iwlmvm", dbgfs_dir);
 
-       mvmvif->dbgfs_slink = debugfs_create_symlink(dbgfs_dir->d_name.name,
-                                                    mvm->debugfs_dir, buf);
+       mvmvif->dbgfs_slink =
+               debugfs_create_symlink(name, mvm->debugfs_dir, buf);
 }
 
 void iwl_mvm_vif_dbgfs_rm_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
index f13f13e6b71af17f1b8ca3ac97a40ba3e236b838..9f69e04594e49cb59f3102071c905bd75b93f825 100644 (file)
@@ -46,6 +46,27 @@ static int iwl_mvm_link_cmd_send(struct iwl_mvm *mvm,
        return ret;
 }
 
+int iwl_mvm_set_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                            struct ieee80211_bss_conf *link_conf)
+{
+       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       struct iwl_mvm_vif_link_info *link_info =
+               mvmvif->link[link_conf->link_id];
+
+       if (link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID) {
+               link_info->fw_link_id = iwl_mvm_get_free_fw_link_id(mvm,
+                                                                   mvmvif);
+               if (link_info->fw_link_id >=
+                   ARRAY_SIZE(mvm->link_id_to_link_conf))
+                       return -EINVAL;
+
+               rcu_assign_pointer(mvm->link_id_to_link_conf[link_info->fw_link_id],
+                                  link_conf);
+       }
+
+       return 0;
+}
+
 int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                     struct ieee80211_bss_conf *link_conf)
 {
@@ -55,19 +76,14 @@ int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
        struct iwl_link_config_cmd cmd = {};
        unsigned int cmd_id = WIDE_ID(MAC_CONF_GROUP, LINK_CONFIG_CMD);
        u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 1);
+       int ret;
 
        if (WARN_ON_ONCE(!link_info))
                return -EINVAL;
 
-       if (link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID) {
-               link_info->fw_link_id = iwl_mvm_get_free_fw_link_id(mvm,
-                                                                   mvmvif);
-               if (link_info->fw_link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf))
-                       return -EINVAL;
-
-               rcu_assign_pointer(mvm->link_id_to_link_conf[link_info->fw_link_id],
-                                  link_conf);
-       }
+       ret = iwl_mvm_set_link_mapping(mvm, vif, link_conf);
+       if (ret)
+               return ret;
 
        /* Update SF - Disable if needed. if this fails, SF might still be on
         * while many macs are bound, which is forbidden - so fail the binding.
@@ -248,6 +264,24 @@ send_cmd:
        return ret;
 }
 
+int iwl_mvm_unset_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                              struct ieee80211_bss_conf *link_conf)
+{
+       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       struct iwl_mvm_vif_link_info *link_info =
+               mvmvif->link[link_conf->link_id];
+
+       /* mac80211 thought we have the link, but it was never configured */
+       if (WARN_ON(!link_info ||
+                   link_info->fw_link_id >=
+                   ARRAY_SIZE(mvm->link_id_to_link_conf)))
+               return -EINVAL;
+
+       RCU_INIT_POINTER(mvm->link_id_to_link_conf[link_info->fw_link_id],
+                        NULL);
+       return 0;
+}
+
 int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                        struct ieee80211_bss_conf *link_conf)
 {
@@ -257,13 +291,10 @@ int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
        struct iwl_link_config_cmd cmd = {};
        int ret;
 
-       /* mac80211 thought we have the link, but it was never configured */
-       if (WARN_ON(!link_info ||
-                   link_info->fw_link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf)))
+       ret = iwl_mvm_unset_link_mapping(mvm, vif, link_conf);
+       if (ret)
                return 0;
 
-       RCU_INIT_POINTER(mvm->link_id_to_link_conf[link_info->fw_link_id],
-                        NULL);
        cmd.link_id = cpu_to_le32(link_info->fw_link_id);
        iwl_mvm_release_fw_link_id(mvm, link_info->fw_link_id);
        link_info->fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
index 1935630d3def0092a15b5e0ce755cef1149cdd9f..8f4b063d6243ed98b4ddb2e51b27803bb379d015 100644 (file)
@@ -360,7 +360,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
        if (mvm->mld_api_is_used && mvm->nvm_data->sku_cap_11be_enable &&
            !iwlwifi_mod_params.disable_11ax &&
            !iwlwifi_mod_params.disable_11be)
-               hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
+               hw->wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
 
        /* With MLD FW API, it tracks timing by itself,
         * no need for any timing from the host
@@ -1577,8 +1577,14 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
        mvmvif->mvm = mvm;
 
        /* the first link always points to the default one */
+       mvmvif->deflink.fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
+       mvmvif->deflink.active = 0;
        mvmvif->link[0] = &mvmvif->deflink;
 
+       ret = iwl_mvm_set_link_mapping(mvm, vif, &vif->bss_conf);
+       if (ret)
+               goto out;
+
        /*
         * Not much to do here. The stack will not allow interface
         * types or combinations that we didn't advertise, so we
@@ -1783,6 +1789,7 @@ static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
                mvm->p2p_device_vif = NULL;
        }
 
+       iwl_mvm_unset_link_mapping(mvm, vif, &vif->bss_conf);
        iwl_mvm_mac_ctxt_remove(mvm, vif);
 
        RCU_INIT_POINTER(mvm->vif_id_to_mac[mvmvif->id], NULL);
index 1628bf55458fcb0bf7d812970d619e815a89c950..23e64a757cfe86a06626a32430dc3919c983e91f 100644 (file)
@@ -855,10 +855,15 @@ int iwl_mvm_mld_rm_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 
 int iwl_mvm_mld_rm_sta_id(struct iwl_mvm *mvm, u8 sta_id)
 {
-       int ret = iwl_mvm_mld_rm_sta_from_fw(mvm, sta_id);
+       int ret;
 
        lockdep_assert_held(&mvm->mutex);
 
+       if (WARN_ON(sta_id == IWL_MVM_INVALID_STA))
+               return 0;
+
+       ret = iwl_mvm_mld_rm_sta_from_fw(mvm, sta_id);
+
        RCU_INIT_POINTER(mvm->fw_id_to_mac_id[sta_id], NULL);
        RCU_INIT_POINTER(mvm->fw_id_to_link_sta[sta_id], NULL);
        return ret;
index 44571114fb154b39ab0e3be14aa41543241a980e..f0b24f00938bd52250a0153791040832ec203d32 100644 (file)
@@ -1916,11 +1916,15 @@ int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
 u32 iwl_mvm_get_lmac_id(struct iwl_mvm *mvm, enum nl80211_band band);
 
 /* Links */
+int iwl_mvm_set_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                            struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                     struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                         struct ieee80211_bss_conf *link_conf,
                         u32 changes, bool active);
+int iwl_mvm_unset_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                              struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                        struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_disable_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
index 2ecd32bed752ff55734d5e9f78f36efc213cb107..045c862a8fc4fc66c0e5c6cfa8333ae4fb968f28 100644 (file)
@@ -132,14 +132,18 @@ struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm)
        if (ret)
                return ERR_PTR(ret);
 
-       if (WARN_ON_ONCE(iwl_rx_packet_payload_len(cmd.resp_pkt) != resp_size))
+       if (WARN_ON_ONCE(iwl_rx_packet_payload_len(cmd.resp_pkt) !=
+                        resp_size)) {
+               iwl_free_resp(&cmd);
                return ERR_PTR(-EIO);
+       }
 
        resp = kmemdup(cmd.resp_pkt->data, resp_size, GFP_KERNEL);
+       iwl_free_resp(&cmd);
+
        if (!resp)
                return ERR_PTR(-ENOMEM);
 
-       iwl_free_resp(&cmd);
        return resp;
 }
 
index 1484eaedf45292d53b349000b274fd25e435c369..ce8d83c771a70d9c93e17a562bb8b4e1e5c7a120 100644 (file)
@@ -236,21 +236,13 @@ static void iwl_mvm_add_rtap_sniffer_config(struct iwl_mvm *mvm,
 static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
                                            struct napi_struct *napi,
                                            struct sk_buff *skb, int queue,
-                                           struct ieee80211_sta *sta,
-                                           struct ieee80211_link_sta *link_sta)
+                                           struct ieee80211_sta *sta)
 {
        if (unlikely(iwl_mvm_check_pn(mvm, skb, queue, sta))) {
                kfree_skb(skb);
                return;
        }
 
-       if (sta && sta->valid_links && link_sta) {
-               struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
-
-               rx_status->link_valid = 1;
-               rx_status->link_id = link_sta->link_id;
-       }
-
        ieee80211_rx_napi(mvm->hw, sta, skb, napi);
 }
 
@@ -588,7 +580,7 @@ static void iwl_mvm_release_frames(struct iwl_mvm *mvm,
                while ((skb = __skb_dequeue(skb_list))) {
                        iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb,
                                                        reorder_buf->queue,
-                                                       sta, NULL /* FIXME */);
+                                                       sta);
                        reorder_buf->num_stored--;
                }
        }
@@ -2213,6 +2205,11 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
                        if (IS_ERR(sta))
                                sta = NULL;
                        link_sta = rcu_dereference(mvm->fw_id_to_link_sta[id]);
+
+                       if (sta && sta->valid_links && link_sta) {
+                               rx_status->link_valid = 1;
+                               rx_status->link_id = link_sta->link_id;
+                       }
                }
        } else if (!is_multicast_ether_addr(hdr->addr2)) {
                /*
@@ -2356,8 +2353,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
                    !(desc->amsdu_info & IWL_RX_MPDU_AMSDU_LAST_SUBFRAME))
                        rx_status->flag |= RX_FLAG_AMSDU_MORE;
 
-               iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, sta,
-                                               link_sta);
+               iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, sta);
        }
 out:
        rcu_read_unlock();
index a59d264a11c52f5174fe4475c6915bf5c49760d4..ad960faceb0d8f6b05160a547b056d45f47563f2 100644 (file)
@@ -879,9 +879,8 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
        struct iwl_rx_packet *pkt = rxb_addr(rxb);
        struct iwl_mvm_session_prot_notif *notif = (void *)pkt->data;
        unsigned int ver =
-               iwl_fw_lookup_cmd_ver(mvm->fw,
-                                     WIDE_ID(MAC_CONF_GROUP,
-                                             SESSION_PROTECTION_CMD), 2);
+               iwl_fw_lookup_notif_ver(mvm->fw, MAC_CONF_GROUP,
+                                       SESSION_PROTECTION_NOTIF, 2);
        int id = le32_to_cpu(notif->mac_link_id);
        struct ieee80211_vif *vif;
        struct iwl_mvm_vif *mvmvif;
index 33973a60d0bf4165e71573807d8791cede555a3d..6229c785c8457616834cac32fc19c59b31f5c24e 100644 (file)
@@ -1589,9 +1589,9 @@ void iwl_txq_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
                return;
 
        tfd_num = iwl_txq_get_cmd_index(txq, ssn);
-       read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
 
        spin_lock_bh(&txq->lock);
+       read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
 
        if (!test_bit(txq_id, trans->txqs.queue_used)) {
                IWL_DEBUG_TX_QUEUES(trans, "Q %d inactive - ignoring idx %d\n",
index 367459bd1345742f00e600773e3613abf7e7066c..708132d5be2a6ad179a8361375e1c25f6e785919 100644 (file)
@@ -2233,7 +2233,7 @@ static void rtw8922a_btc_init_cfg(struct rtw89_dev *rtwdev)
                 * Shared-Ant && BTG-path:WL mask(0x55f), others:WL THRU(0x5ff)
                 */
                if (btc->ant_type == BTC_ANT_SHARED && btc->btg_pos == path)
-                       rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x5ff);
+                       rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x55f);
                else
                        rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x5ff);
 
index 9f43f256db1d063c45c17dda3d78037be4183f9c..f0a4783baf1f328ed50e629591244f3a4ccb77eb 100644 (file)
@@ -106,7 +106,7 @@ bool t7xx_cldma_tx_addr_is_set(struct t7xx_cldma_hw *hw_info, unsigned int qno)
 {
        u32 offset = REG_CLDMA_UL_START_ADDRL_0 + qno * ADDR_SIZE;
 
-       return ioread64(hw_info->ap_pdn_base + offset);
+       return ioread64_lo_hi(hw_info->ap_pdn_base + offset);
 }
 
 void t7xx_cldma_hw_set_start_addr(struct t7xx_cldma_hw *hw_info, unsigned int qno, u64 address,
@@ -117,7 +117,7 @@ void t7xx_cldma_hw_set_start_addr(struct t7xx_cldma_hw *hw_info, unsigned int qn
 
        reg = tx_rx == MTK_RX ? hw_info->ap_ao_base + REG_CLDMA_DL_START_ADDRL_0 :
                                hw_info->ap_pdn_base + REG_CLDMA_UL_START_ADDRL_0;
-       iowrite64(address, reg + offset);
+       iowrite64_lo_hi(address, reg + offset);
 }
 
 void t7xx_cldma_hw_resume_queue(struct t7xx_cldma_hw *hw_info, unsigned int qno,
index abc41a7089fa4f9e1efb1a51e3375d57321b51c6..97163e1e5783ed26cf7507bb16711dad80bbc430 100644 (file)
@@ -137,8 +137,9 @@ static int t7xx_cldma_gpd_rx_from_q(struct cldma_queue *queue, int budget, bool
                                return -ENODEV;
                        }
 
-                       gpd_addr = ioread64(hw_info->ap_pdn_base + REG_CLDMA_DL_CURRENT_ADDRL_0 +
-                                           queue->index * sizeof(u64));
+                       gpd_addr = ioread64_lo_hi(hw_info->ap_pdn_base +
+                                                 REG_CLDMA_DL_CURRENT_ADDRL_0 +
+                                                 queue->index * sizeof(u64));
                        if (req->gpd_addr == gpd_addr || hwo_polling_count++ >= 100)
                                return 0;
 
@@ -316,8 +317,8 @@ static void t7xx_cldma_txq_empty_hndl(struct cldma_queue *queue)
                struct t7xx_cldma_hw *hw_info = &md_ctrl->hw_info;
 
                /* Check current processing TGPD, 64-bit address is in a table by Q index */
-               ul_curr_addr = ioread64(hw_info->ap_pdn_base + REG_CLDMA_UL_CURRENT_ADDRL_0 +
-                                       queue->index * sizeof(u64));
+               ul_curr_addr = ioread64_lo_hi(hw_info->ap_pdn_base + REG_CLDMA_UL_CURRENT_ADDRL_0 +
+                                             queue->index * sizeof(u64));
                if (req->gpd_addr != ul_curr_addr) {
                        spin_unlock_irqrestore(&md_ctrl->cldma_lock, flags);
                        dev_err(md_ctrl->dev, "CLDMA%d queue %d is not empty\n",
index 76da4c15e3de17c11d0373a26066450b34ee9666..f071ec7ff23d50842b280fae1535863ecfd0740d 100644 (file)
@@ -75,7 +75,7 @@ static void t7xx_pcie_mac_atr_tables_dis(void __iomem *pbase, enum t7xx_atr_src_
        for (i = 0; i < ATR_TABLE_NUM_PER_ATR; i++) {
                offset = ATR_PORT_OFFSET * port + ATR_TABLE_OFFSET * i;
                reg = pbase + ATR_PCIE_WIN0_T0_ATR_PARAM_SRC_ADDR + offset;
-               iowrite64(0, reg);
+               iowrite64_lo_hi(0, reg);
        }
 }
 
@@ -112,17 +112,17 @@ static int t7xx_pcie_mac_atr_cfg(struct t7xx_pci_dev *t7xx_dev, struct t7xx_atr_
 
        reg = pbase + ATR_PCIE_WIN0_T0_TRSL_ADDR + offset;
        value = cfg->trsl_addr & ATR_PCIE_WIN0_ADDR_ALGMT;
-       iowrite64(value, reg);
+       iowrite64_lo_hi(value, reg);
 
        reg = pbase + ATR_PCIE_WIN0_T0_TRSL_PARAM + offset;
        iowrite32(cfg->trsl_id, reg);
 
        reg = pbase + ATR_PCIE_WIN0_T0_ATR_PARAM_SRC_ADDR + offset;
        value = (cfg->src_addr & ATR_PCIE_WIN0_ADDR_ALGMT) | (atr_size << 1) | BIT(0);
-       iowrite64(value, reg);
+       iowrite64_lo_hi(value, reg);
 
        /* Ensure ATR is set */
-       ioread64(reg);
+       ioread64_lo_hi(reg);
        return 0;
 }
 
index a0cce6872075d4330578065191804db4f6bd747b..f0b8b709649f29691c3d0976b8a1156da1f6bd81 100644 (file)
@@ -1179,6 +1179,20 @@ static int qeth_check_irb_error(struct qeth_card *card, struct ccw_device *cdev,
        }
 }
 
+/**
+ * qeth_irq() - qeth interrupt handler
+ * @cdev: ccw device
+ * @intparm: expect pointer to iob
+ * @irb: Interruption Response Block
+ *
+ * In the good path:
+ * corresponding qeth channel is locked with last used iob as active_cmd.
+ * But this function is also called for error interrupts.
+ *
+ * Caller ensures that:
+ * Interrupts are disabled; ccw device lock is held;
+ *
+ */
 static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
                struct irb *irb)
 {
@@ -1220,11 +1234,10 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
                iob = (struct qeth_cmd_buffer *) (addr_t)intparm;
        }
 
-       qeth_unlock_channel(card, channel);
-
        rc = qeth_check_irb_error(card, cdev, irb);
        if (rc) {
                /* IO was terminated, free its resources. */
+               qeth_unlock_channel(card, channel);
                if (iob)
                        qeth_cancel_cmd(iob, rc);
                return;
@@ -1268,6 +1281,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
                rc = qeth_get_problem(card, cdev, irb);
                if (rc) {
                        card->read_or_write_problem = 1;
+                       qeth_unlock_channel(card, channel);
                        if (iob)
                                qeth_cancel_cmd(iob, rc);
                        qeth_clear_ipacmd_list(card);
@@ -1276,6 +1290,26 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
                }
        }
 
+       if (scsw_cmd_is_valid_cc(&irb->scsw) && irb->scsw.cmd.cc == 1 && iob) {
+               /* channel command hasn't started: retry.
+                * active_cmd is still set to last iob
+                */
+               QETH_CARD_TEXT(card, 2, "irqcc1");
+               rc = ccw_device_start_timeout(cdev, __ccw_from_cmd(iob),
+                                             (addr_t)iob, 0, 0, iob->timeout);
+               if (rc) {
+                       QETH_DBF_MESSAGE(2,
+                                        "ccw retry on %x failed, rc = %i\n",
+                                        CARD_DEVID(card), rc);
+                       QETH_CARD_TEXT_(card, 2, " err%d", rc);
+                       qeth_unlock_channel(card, channel);
+                       qeth_cancel_cmd(iob, rc);
+               }
+               return;
+       }
+
+       qeth_unlock_channel(card, channel);
+
        if (iob) {
                /* sanity check: */
                if (irb->scsw.cmd.count > iob->length) {
index 9a9b88962c296fd2f45b7a7a7da760973991cf15..2b85fe9e7f9a76332f100832a72d4be99adbcdf6 100644 (file)
@@ -181,12 +181,12 @@ static inline int framer_notifier_unregister(struct framer *framer,
        return -ENOSYS;
 }
 
-struct framer *framer_get(struct device *dev, const char *con_id)
+static inline struct framer *framer_get(struct device *dev, const char *con_id)
 {
        return ERR_PTR(-ENOSYS);
 }
 
-void framer_put(struct device *dev, struct framer *framer)
+static inline void framer_put(struct device *dev, struct framer *framer)
 {
 }
 
index 2e2be4fd2bb6531dfd8965c8706a2cb33ff0e888..1e09329acc426873861d0bf5755dbba462a56b65 100644 (file)
@@ -4991,6 +4991,7 @@ struct cfg80211_ops {
  *     set this flag to update channels on beacon hints.
  * @WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY: support connection to non-primary link
  *     of an NSTR mobile AP MLD.
+ * @WIPHY_FLAG_DISABLE_WEXT: disable wireless extensions for this device
  */
 enum wiphy_flags {
        WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK         = BIT(0),
@@ -5002,6 +5003,7 @@ enum wiphy_flags {
        WIPHY_FLAG_4ADDR_STATION                = BIT(6),
        WIPHY_FLAG_CONTROL_PORT_PROTOCOL        = BIT(7),
        WIPHY_FLAG_IBSS_RSN                     = BIT(8),
+       WIPHY_FLAG_DISABLE_WEXT                 = BIT(9),
        WIPHY_FLAG_MESH_AUTH                    = BIT(10),
        WIPHY_FLAG_SUPPORTS_EXT_KCK_32          = BIT(11),
        WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY     = BIT(12),
index 9ab4bf704e864358215d2370d33d3d9668681923..ccf171f7eb60d462e0ebf49c9e876016e963ffa5 100644 (file)
@@ -175,6 +175,7 @@ void inet_csk_init_xmit_timers(struct sock *sk,
                               void (*delack_handler)(struct timer_list *),
                               void (*keepalive_handler)(struct timer_list *));
 void inet_csk_clear_xmit_timers(struct sock *sk);
+void inet_csk_clear_xmit_timers_sync(struct sock *sk);
 
 static inline void inet_csk_schedule_ack(struct sock *sk)
 {
index b5e00702acc1f037df7eb8ad085d00e0b18079a8..f57bfd8a2ad2deaedf3f351325ab9336ae040504 100644 (file)
@@ -1759,6 +1759,13 @@ static inline void sock_owned_by_me(const struct sock *sk)
 #endif
 }
 
+static inline void sock_not_owned_by_me(const struct sock *sk)
+{
+#ifdef CONFIG_LOCKDEP
+       WARN_ON_ONCE(lockdep_sock_is_held(sk) && debug_locks);
+#endif
+}
+
 static inline bool sock_owned_by_user(const struct sock *sk)
 {
        sock_owned_by_me(sk);
index 3cb4dc9bd70e44bcce5f9cb3119de61e933967ab..3d54de168a6d9d57d1f7001c648fbc25af10965a 100644 (file)
@@ -188,6 +188,8 @@ static inline void xsk_tx_metadata_complete(struct xsk_tx_metadata_compl *compl,
 {
        if (!compl)
                return;
+       if (!compl->tx_timestamp)
+               return;
 
        *compl->tx_timestamp = ops->tmo_fill_timestamp(priv);
 }
index 86571e760dd613b6f7315e02b19069ece475645d..343c3456c8ddf0e6352a5f2614627c316078077a 100644 (file)
@@ -38,7 +38,7 @@
 
 /* number of bytes addressable by LDX/STX insn with 16-bit 'off' field */
 #define GUARD_SZ (1ull << sizeof(((struct bpf_insn *)0)->off) * 8)
-#define KERN_VM_SZ ((1ull << 32) + GUARD_SZ)
+#define KERN_VM_SZ (SZ_4G + GUARD_SZ)
 
 struct bpf_arena {
        struct bpf_map map;
@@ -110,7 +110,7 @@ static struct bpf_map *arena_map_alloc(union bpf_attr *attr)
                return ERR_PTR(-EINVAL);
 
        vm_range = (u64)attr->max_entries * PAGE_SIZE;
-       if (vm_range > (1ull << 32))
+       if (vm_range > SZ_4G)
                return ERR_PTR(-E2BIG);
 
        if ((attr->map_extra >> 32) != ((attr->map_extra + vm_range - 1) >> 32))
@@ -301,7 +301,7 @@ static unsigned long arena_get_unmapped_area(struct file *filp, unsigned long ad
 
        if (pgoff)
                return -EINVAL;
-       if (len > (1ull << 32))
+       if (len > SZ_4G)
                return -E2BIG;
 
        /* if user_vm_start was specified at arena creation time */
@@ -322,7 +322,7 @@ static unsigned long arena_get_unmapped_area(struct file *filp, unsigned long ad
        if (WARN_ON_ONCE(arena->user_vm_start))
                /* checks at map creation time should prevent this */
                return -EFAULT;
-       return round_up(ret, 1ull << 32);
+       return round_up(ret, SZ_4G);
 }
 
 static int arena_map_mmap(struct bpf_map *map, struct vm_area_struct *vma)
@@ -346,7 +346,7 @@ static int arena_map_mmap(struct bpf_map *map, struct vm_area_struct *vma)
                return -EBUSY;
 
        /* Earlier checks should prevent this */
-       if (WARN_ON_ONCE(vma->vm_end - vma->vm_start > (1ull << 32) || vma->vm_pgoff))
+       if (WARN_ON_ONCE(vma->vm_end - vma->vm_start > SZ_4G || vma->vm_pgoff))
                return -EFAULT;
 
        if (remember_vma(arena, vma))
@@ -420,7 +420,7 @@ static long arena_alloc_pages(struct bpf_arena *arena, long uaddr, long page_cnt
                if (uaddr & ~PAGE_MASK)
                        return 0;
                pgoff = compute_pgoff(arena, uaddr);
-               if (pgoff + page_cnt > page_cnt_max)
+               if (pgoff > page_cnt_max - page_cnt)
                        /* requested address will be outside of user VMA */
                        return 0;
        }
@@ -447,7 +447,13 @@ static long arena_alloc_pages(struct bpf_arena *arena, long uaddr, long page_cnt
                goto out;
 
        uaddr32 = (u32)(arena->user_vm_start + pgoff * PAGE_SIZE);
-       /* Earlier checks make sure that uaddr32 + page_cnt * PAGE_SIZE will not overflow 32-bit */
+       /* Earlier checks made sure that uaddr32 + page_cnt * PAGE_SIZE - 1
+        * will not overflow 32-bit. Lower 32-bit need to represent
+        * contiguous user address range.
+        * Map these pages at kern_vm_start base.
+        * kern_vm_start + uaddr32 + page_cnt * PAGE_SIZE - 1 can overflow
+        * lower 32-bit and it's ok.
+        */
        ret = vm_area_map_pages(arena->kern_vm, kern_vm_start + uaddr32,
                                kern_vm_start + uaddr32 + page_cnt * PAGE_SIZE, pages);
        if (ret) {
@@ -510,6 +516,11 @@ static void arena_free_pages(struct bpf_arena *arena, long uaddr, long page_cnt)
                if (!page)
                        continue;
                if (page_cnt == 1 && page_mapped(page)) /* mapped by some user process */
+                       /* Optimization for the common case of page_cnt==1:
+                        * If page wasn't mapped into some user vma there
+                        * is no need to call zap_pages which is slow. When
+                        * page_cnt is big it's faster to do the batched zap.
+                        */
                        zap_pages(arena, full_uaddr, 1);
                vm_area_unmap_pages(arena->kern_vm, kaddr, kaddr + PAGE_SIZE);
                __free_page(page);
index addf3dd57b59b574653a8ad3a374d6ef0f27b51b..35e1ddca74d21067bc158436470138f0b2ad984c 100644 (file)
@@ -80,6 +80,18 @@ static int bloom_map_get_next_key(struct bpf_map *map, void *key, void *next_key
        return -EOPNOTSUPP;
 }
 
+/* Called from syscall */
+static int bloom_map_alloc_check(union bpf_attr *attr)
+{
+       if (attr->value_size > KMALLOC_MAX_SIZE)
+               /* if value_size is bigger, the user space won't be able to
+                * access the elements.
+                */
+               return -E2BIG;
+
+       return 0;
+}
+
 static struct bpf_map *bloom_map_alloc(union bpf_attr *attr)
 {
        u32 bitset_bytes, bitset_mask, nr_hash_funcs, nr_bits;
@@ -191,6 +203,7 @@ static u64 bloom_map_mem_usage(const struct bpf_map *map)
 BTF_ID_LIST_SINGLE(bpf_bloom_map_btf_ids, struct, bpf_bloom_filter)
 const struct bpf_map_ops bloom_filter_map_ops = {
        .map_meta_equal = bpf_map_meta_equal,
+       .map_alloc_check = bloom_map_alloc_check,
        .map_alloc = bloom_map_alloc,
        .map_free = bloom_map_free,
        .map_get_next_key = bloom_map_get_next_key,
index a895878595710b41c4d80e5a1d74ba9bb4ee0b73..449b9a5d3fe3f3fd0a88e945e0039f850d5225b2 100644 (file)
@@ -2548,7 +2548,7 @@ __bpf_kfunc void bpf_throw(u64 cookie)
 __bpf_kfunc_end_defs();
 
 BTF_KFUNCS_START(generic_btf_ids)
-#ifdef CONFIG_KEXEC_CORE
+#ifdef CONFIG_CRASH_DUMP
 BTF_ID_FLAGS(func, crash_kexec, KF_DESTRUCTIVE)
 #endif
 BTF_ID_FLAGS(func, bpf_obj_new_impl, KF_ACQUIRE | KF_RET_NULL)
index 63749ad5ac6b8d63f108b92690897f032c7eacb6..353985b2b6a279f0d5a1784d753b10002cfb216e 100644 (file)
@@ -5682,6 +5682,13 @@ static bool is_flow_key_reg(struct bpf_verifier_env *env, int regno)
        return reg->type == PTR_TO_FLOW_KEYS;
 }
 
+static bool is_arena_reg(struct bpf_verifier_env *env, int regno)
+{
+       const struct bpf_reg_state *reg = reg_state(env, regno);
+
+       return reg->type == PTR_TO_ARENA;
+}
+
 static u32 *reg2btf_ids[__BPF_REG_TYPE_MAX] = {
 #ifdef CONFIG_NET
        [PTR_TO_SOCKET] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK],
@@ -6694,6 +6701,11 @@ static int check_stack_access_within_bounds(
        err = check_stack_slot_within_bounds(env, min_off, state, type);
        if (!err && max_off > 0)
                err = -EINVAL; /* out of stack access into non-negative offsets */
+       if (!err && access_size < 0)
+               /* access_size should not be negative (or overflow an int); others checks
+                * along the way should have prevented such an access.
+                */
+               err = -EFAULT; /* invalid negative access size; integer overflow? */
 
        if (err) {
                if (tnum_is_const(reg->var_off)) {
@@ -7019,7 +7031,8 @@ static int check_atomic(struct bpf_verifier_env *env, int insn_idx, struct bpf_i
        if (is_ctx_reg(env, insn->dst_reg) ||
            is_pkt_reg(env, insn->dst_reg) ||
            is_flow_key_reg(env, insn->dst_reg) ||
-           is_sk_reg(env, insn->dst_reg)) {
+           is_sk_reg(env, insn->dst_reg) ||
+           is_arena_reg(env, insn->dst_reg)) {
                verbose(env, "BPF_ATOMIC stores into R%d %s is not allowed\n",
                        insn->dst_reg,
                        reg_type_str(env, reg_state(env, insn->dst_reg)->type));
@@ -14014,6 +14027,10 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
                                        verbose(env, "addr_space_cast insn can only convert between address space 1 and 0\n");
                                        return -EINVAL;
                                }
+                               if (!env->prog->aux->arena) {
+                                       verbose(env, "addr_space_cast insn can only be used in a program that has an associated arena\n");
+                                       return -EINVAL;
+                               }
                        } else {
                                if ((insn->off != 0 && insn->off != 8 && insn->off != 16 &&
                                     insn->off != 32) || insn->imm) {
@@ -14046,8 +14063,11 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
                                if (insn->imm) {
                                        /* off == BPF_ADDR_SPACE_CAST */
                                        mark_reg_unknown(env, regs, insn->dst_reg);
-                                       if (insn->imm == 1) /* cast from as(1) to as(0) */
+                                       if (insn->imm == 1) /* cast from as(1) to as(0) */
                                                dst_reg->type = PTR_TO_ARENA;
+                                               /* PTR_TO_ARENA is 32-bit */
+                                               dst_reg->subreg_def = env->insn_idx + 1;
+                                       }
                                } else if (insn->off == 0) {
                                        /* case: R1 = R2
                                         * copy register state to dest reg
@@ -19601,8 +19621,9 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
                            (((struct bpf_map *)env->prog->aux->arena)->map_flags & BPF_F_NO_USER_CONV)) {
                                /* convert to 32-bit mov that clears upper 32-bit */
                                insn->code = BPF_ALU | BPF_MOV | BPF_X;
-                               /* clear off, so it's a normal 'wX = wY' from JIT pov */
+                               /* clear off and imm, so it's a normal 'wX = wY' from JIT pov */
                                insn->off = 0;
+                               insn->imm = 0;
                        } /* cast from as(0) to as(1) should be handled by JIT */
                        goto next_insn;
                }
index 43bf3818c19e829b47d3989d36e2e1b3bf985438..0963689a59506ac3309ad9a86d06b729948ad357 100644 (file)
@@ -482,7 +482,7 @@ int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
        unsigned long flags;
        struct sk_buff_head *list = &sk->sk_receive_queue;
 
-       if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) {
+       if (atomic_read(&sk->sk_rmem_alloc) >= READ_ONCE(sk->sk_rcvbuf)) {
                atomic_inc(&sk->sk_drops);
                trace_sock_rcvqueue_full(sk, skb);
                return -ENOMEM;
@@ -552,7 +552,7 @@ int __sk_receive_skb(struct sock *sk, struct sk_buff *skb,
 
        skb->dev = NULL;
 
-       if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) {
+       if (sk_rcvqueues_full(sk, READ_ONCE(sk->sk_rcvbuf))) {
                atomic_inc(&sk->sk_drops);
                goto discard_and_relse;
        }
index e5742f2a2d522a432092216a596fe7a4ef91f1da..1b6457f357bdb274d74d696823f61306fd7429c2 100644 (file)
@@ -220,7 +220,8 @@ void hsr_del_port(struct hsr_port *port)
                netdev_update_features(master->dev);
                dev_set_mtu(master->dev, hsr_get_max_mtu(hsr));
                netdev_rx_handler_unregister(port->dev);
-               dev_set_promiscuity(port->dev, -1);
+               if (!port->hsr->fwd_offloaded)
+                       dev_set_promiscuity(port->dev, -1);
                netdev_upper_dev_unlink(port->dev, master->dev);
        }
 
index 7d8090f109ef4e794a13fb6ab5d180b16bafb59d..c038e28e2f1e66bf10c7f67ffe073e6790b2d6ce 100644 (file)
@@ -771,6 +771,20 @@ void inet_csk_clear_xmit_timers(struct sock *sk)
 }
 EXPORT_SYMBOL(inet_csk_clear_xmit_timers);
 
+void inet_csk_clear_xmit_timers_sync(struct sock *sk)
+{
+       struct inet_connection_sock *icsk = inet_csk(sk);
+
+       /* ongoing timer handlers need to acquire socket lock. */
+       sock_not_owned_by_me(sk);
+
+       icsk->icsk_pending = icsk->icsk_ack.pending = 0;
+
+       sk_stop_timer_sync(sk, &icsk->icsk_retransmit_timer);
+       sk_stop_timer_sync(sk, &icsk->icsk_delack_timer);
+       sk_stop_timer_sync(sk, &sk->sk_timer);
+}
+
 void inet_csk_delete_keepalive_timer(struct sock *sk)
 {
        sk_stop_timer(sk, &sk->sk_timer);
index 74928a9d1aa48bae5fe4f56ac05d2a32cd8d6a7e..535856b0f0edce6d8dae47126b42125c178df889 100644 (file)
@@ -768,8 +768,10 @@ static int nh_grp_hw_stats_update(struct nexthop *nh, bool *hw_stats_used)
        struct net *net = nh->net;
        int err;
 
-       if (nexthop_notifiers_is_empty(net))
+       if (nexthop_notifiers_is_empty(net)) {
+               *hw_stats_used = false;
                return 0;
+       }
 
        err = nh_notifier_grp_hw_stats_init(&info, nh);
        if (err)
index d20b62d521712ae7982b1e73fddf7d4be0df696d..e767721b3a588b5d56567ae7badf5dffcd35a76a 100644 (file)
@@ -2931,6 +2931,8 @@ void tcp_close(struct sock *sk, long timeout)
        lock_sock(sk);
        __tcp_close(sk, timeout);
        release_sock(sk);
+       if (!sk->sk_net_refcnt)
+               inet_csk_clear_xmit_timers_sync(sk);
        sock_put(sk);
 }
 EXPORT_SYMBOL(tcp_close);
index 247bd4d8ee45a66a391b99e8e5f2ca56b55ec404..92db9b474f2bdb0a2efc91ab2be6c83c8a46372d 100644 (file)
@@ -5416,10 +5416,11 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
 
                err = 0;
                if (fillargs.ifindex) {
-                       err = -ENODEV;
                        dev = dev_get_by_index_rcu(tgt_net, fillargs.ifindex);
-                       if (!dev)
+                       if (!dev) {
+                               err = -ENODEV;
                                goto done;
+                       }
                        idev = __in6_dev_get(dev);
                        if (idev)
                                err = in6_dump_addrs(idev, skb, cb,
index f03452dc716d5d9588fe5c50a09888ae78c75402..f67c1d0218121dc98b67af7201686a0c0b2ad817 100644 (file)
@@ -2199,15 +2199,14 @@ static int ieee80211_change_station(struct wiphy *wiphy,
                }
 
                if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
-                   sta->sdata->u.vlan.sta) {
-                       ieee80211_clear_fast_rx(sta);
+                   sta->sdata->u.vlan.sta)
                        RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
-               }
 
                if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
                        ieee80211_vif_dec_num_mcast(sta->sdata);
 
                sta->sdata = vlansdata;
+               ieee80211_check_fast_rx(sta);
                ieee80211_check_fast_xmit(sta);
 
                if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
index 49da401c53408b0f517425109663f507e763775e..35a8ba25fa57fdb70f111c7d80ac13df7a2a8c9b 100644 (file)
@@ -158,7 +158,7 @@ do {                                                                        \
                        _sdata_dbg(print, sdata, "[link %d] " fmt,      \
                                   link_id, ##__VA_ARGS__);             \
                else                                                    \
-                       _sdata_dbg(1, sdata, fmt, ##__VA_ARGS__);       \
+                       _sdata_dbg(print, sdata, fmt, ##__VA_ARGS__);   \
        } while (0)
 #define link_dbg(link, fmt, ...)                                       \
        _link_id_dbg(1, (link)->sdata, (link)->link_id,                 \
index b6fead612b66b51df10c52e0dad6a3ed05aaabbf..bd507d6b65e3f6b67f6b6883d049f30b0c1ae67a 100644 (file)
@@ -131,7 +131,7 @@ struct ieee80211_bss {
 };
 
 /**
- * enum ieee80211_corrupt_data_flags - BSS data corruption flags
+ * enum ieee80211_bss_corrupt_data_flags - BSS data corruption flags
  * @IEEE80211_BSS_CORRUPT_BEACON: last beacon frame received was corrupted
  * @IEEE80211_BSS_CORRUPT_PROBE_RESP: last probe response received was corrupted
  *
@@ -144,7 +144,7 @@ enum ieee80211_bss_corrupt_data_flags {
 };
 
 /**
- * enum ieee80211_valid_data_flags - BSS valid data flags
+ * enum ieee80211_bss_valid_data_flags - BSS valid data flags
  * @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
  * @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
  * @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
index 47a2cba8313f04c3d86c6ce424395a0aca2b7cc1..96b70006b7fc0b11b12f423fb74ec32a030d91af 100644 (file)
@@ -5874,6 +5874,15 @@ static int ieee80211_ttlm_set_links(struct ieee80211_sub_if_data *sdata,
        }
 
        if (sdata->vif.active_links != active_links) {
+               /* usable links are affected when active_links are changed,
+                * so notify the driver about the status change
+                */
+               changed |= BSS_CHANGED_MLD_VALID_LINKS;
+               active_links &= sdata->vif.active_links;
+               if (!active_links)
+                       active_links =
+                               BIT(__ffs(sdata->vif.valid_links &
+                                   ~dormant_links));
                ret = ieee80211_set_active_links(&sdata->vif, active_links);
                if (ret) {
                        sdata_info(sdata, "Failed to set TTLM active links\n");
@@ -5888,7 +5897,6 @@ static int ieee80211_ttlm_set_links(struct ieee80211_sub_if_data *sdata,
                goto out;
        }
 
-       changed |= BSS_CHANGED_MLD_VALID_LINKS;
        sdata->vif.suspended_links = suspended_links;
        if (sdata->vif.suspended_links)
                changed |= BSS_CHANGED_MLD_TTLM;
@@ -7652,7 +7660,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
                        sdata_info(sdata,
                                   "failed to insert STA entry for the AP (error %d)\n",
                                   err);
-                       goto out_err;
+                       goto out_release_chan;
                }
        } else
                WARN_ON_ONCE(!ether_addr_equal(link->u.mgd.bssid, cbss->bssid));
@@ -7663,8 +7671,9 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
 
        return 0;
 
+out_release_chan:
+       ieee80211_link_release_channel(link);
 out_err:
-       ieee80211_link_release_channel(&sdata->deflink);
        ieee80211_vif_set_links(sdata, 0, 0);
        return err;
 }
index 211f57164cb611fd2665f682906be96aa35463ed..b783231668c6512015070bfb090ef89ce5ca6458 100644 (file)
@@ -1976,10 +1976,10 @@ int tls_sw_recvmsg(struct sock *sk,
        if (unlikely(flags & MSG_ERRQUEUE))
                return sock_recv_errqueue(sk, msg, len, SOL_IP, IP_RECVERR);
 
-       psock = sk_psock_get(sk);
        err = tls_rx_reader_lock(sk, ctx, flags & MSG_DONTWAIT);
        if (err < 0)
                return err;
+       psock = sk_psock_get(sk);
        bpf_strp_enabled = sk_psock_strp_enabled(psock);
 
        /* If crypto failed the connection is broken */
@@ -2152,12 +2152,15 @@ recv_end:
                }
 
                /* Drain records from the rx_list & copy if required */
-               if (is_peek || is_kvec)
+               if (is_peek)
                        err = process_rx_list(ctx, msg, &control, copied + peeked,
                                              decrypted - peeked, is_peek, NULL);
                else
                        err = process_rx_list(ctx, msg, &control, 0,
                                              async_copy_bytes, is_peek, NULL);
+
+               /* we could have copied less than we wanted, and possibly nothing */
+               decrypted += max(err, 0) - async_copy_bytes;
        }
 
        copied += decrypted;
index e039e66ab37774bc45e77ef9eb0abe8bf6311ae5..cbbf347c6b2e099802b135266ca7fae59bd467f9 100644 (file)
@@ -1024,7 +1024,7 @@ TRACE_EVENT(rdev_get_mpp,
 TRACE_EVENT(rdev_dump_mpp,
        TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int _idx,
                 u8 *dst, u8 *mpp),
-       TP_ARGS(wiphy, netdev, _idx, mpp, dst),
+       TP_ARGS(wiphy, netdev, _idx, dst, mpp),
        TP_STRUCT__entry(
                WIPHY_ENTRY
                NETDEV_ENTRY
index a161c64d1765e6cb2e2a4ae08e5534b22c8aa457..838ad6541a17d8acaa531aa62a8acceb39c959ad 100644 (file)
@@ -4,6 +4,7 @@
  * Authors :   Jean Tourrilhes - HPL - <jt@hpl.hp.com>
  * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved.
  * Copyright   2009 Johannes Berg <johannes@sipsolutions.net>
+ * Copyright (C) 2024 Intel Corporation
  *
  * (As all part of the Linux kernel, this file is GPL)
  */
@@ -662,7 +663,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev)
            dev->ieee80211_ptr->wiphy->wext &&
            dev->ieee80211_ptr->wiphy->wext->get_wireless_stats) {
                wireless_warn_cfg80211_wext();
-               if (dev->ieee80211_ptr->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)
+               if (dev->ieee80211_ptr->wiphy->flags & (WIPHY_FLAG_SUPPORTS_MLO |
+                                                       WIPHY_FLAG_DISABLE_WEXT))
                        return NULL;
                return dev->ieee80211_ptr->wiphy->wext->get_wireless_stats(dev);
        }
@@ -704,7 +706,8 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd)
 #ifdef CONFIG_CFG80211_WEXT
        if (dev->ieee80211_ptr && dev->ieee80211_ptr->wiphy) {
                wireless_warn_cfg80211_wext();
-               if (dev->ieee80211_ptr->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)
+               if (dev->ieee80211_ptr->wiphy->flags & (WIPHY_FLAG_SUPPORTS_MLO |
+                                                       WIPHY_FLAG_DISABLE_WEXT))
                        return NULL;
                handlers = dev->ieee80211_ptr->wiphy->wext;
        }
index 4606944984ee2e79035084d2175ca7ae553a0c34..c55878bddfddc445a8f4548e4c763991585b1844 100755 (executable)
@@ -414,8 +414,8 @@ class PrinterRST(Printer):
             version = version.stdout.decode().rstrip()
         except:
             try:
-                version = subprocess.run(['make', 'kernelversion'], cwd=linuxRoot,
-                                         capture_output=True, check=True)
+                version = subprocess.run(['make', '-s', '--no-print-directory', 'kernelversion'],
+                                         cwd=linuxRoot, capture_output=True, check=True)
                 version = version.stdout.decode().rstrip()
             except:
                 return 'Linux'
index 4fa4ade1ce7445eadac1cc92437218db97697e33..540c0f2c4fda07cef798769e4795cfb0fb574d3e 100644 (file)
@@ -121,7 +121,7 @@ static bool get_datasec_ident(const char *sec_name, char *buf, size_t buf_sz)
        int i, n;
 
        /* recognize hard coded LLVM section name */
-       if (strcmp(sec_name, ".arena.1") == 0) {
+       if (strcmp(sec_name, ".addr_space.1") == 0) {
                /* this is the name to use in skeleton */
                snprintf(buf, buf_sz, "arena");
                return true;
index efab29b8935bd9f7027859efee6a1383046105f4..a2061fcd612d7f67d22daa1f86168104f92d11e2 100644 (file)
@@ -498,7 +498,7 @@ struct bpf_struct_ops {
 #define KSYMS_SEC ".ksyms"
 #define STRUCT_OPS_SEC ".struct_ops"
 #define STRUCT_OPS_LINK_SEC ".struct_ops.link"
-#define ARENA_SEC ".arena.1"
+#define ARENA_SEC ".addr_space.1"
 
 enum libbpf_map_type {
        LIBBPF_MAP_UNSPEC,
@@ -1650,6 +1650,10 @@ static int sys_memfd_create(const char *name, unsigned flags)
        return syscall(__NR_memfd_create, name, flags);
 }
 
+#ifndef MFD_CLOEXEC
+#define MFD_CLOEXEC 0x0001U
+#endif
+
 static int create_placeholder_fd(void)
 {
        int fd;
@@ -5352,8 +5356,8 @@ retry:
                                        goto err_out;
                        }
                        if (map->def.type == BPF_MAP_TYPE_ARENA) {
-                               map->mmaped = mmap((void *)map->map_extra, bpf_map_mmap_sz(map),
-                                                  PROT_READ | PROT_WRITE,
+                               map->mmaped = mmap((void *)(long)map->map_extra,
+                                                  bpf_map_mmap_sz(map), PROT_READ | PROT_WRITE,
                                                   map->map_extra ? MAP_SHARED | MAP_FIXED : MAP_SHARED,
                                                   map->fd, 0);
                                if (map->mmaped == MAP_FAILED) {
index 6b7eb2d2aaf188234031bc638f58704788ab8e49..a451cbfbd781d99824dc5520dc51849c7ffc9cf5 100755 (executable)
@@ -228,8 +228,11 @@ class Type(SpecAttr):
         presence = ''
         for i in range(0, len(ref)):
             presence = f"{var}->{'.'.join(ref[:i] + [''])}_present.{ref[i]}"
-            if self.presence_type() == 'bit':
-                code.append(presence + ' = 1;')
+            # Every layer below last is a nest, so we know it uses bit presence
+            # last layer is "self" and may be a complex type
+            if i == len(ref) - 1 and self.presence_type() != 'bit':
+                continue
+            code.append(presence + ' = 1;')
         code += self._setter_lines(ri, member, presence)
 
         func_name = f"{op_prefix(ri, direction, deref=deref)}_set_{'_'.join(ref)}"
index aa5ec149f96c16e1e4736264b735201f93b5a9f5..c5914f4e75e1be0613c7d9cfabd2b0fb0fddcaff 100644 (file)
@@ -28,6 +28,8 @@ CONFIG_MCTP_FLOWS=y
 CONFIG_INET=y
 CONFIG_MPTCP=y
 
+CONFIG_NETDEVICES=y
+CONFIG_WLAN=y
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
 CONFIG_WLAN_VENDOR_INTEL=y
index bcf195c64a45c186112c6aa381b62c91a9938050..567491f3e1b51b313439f7b3966da01c2faf1689 100644 (file)
@@ -32,7 +32,7 @@
  */
 #endif
 
-#if defined(__BPF_FEATURE_ARENA_CAST) && !defined(BPF_ARENA_FORCE_ASM)
+#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) && !defined(BPF_ARENA_FORCE_ASM)
 #define __arena __attribute__((address_space(1)))
 #define cast_kern(ptr) /* nop for bpf prog. emitted by LLVM */
 #define cast_user(ptr) /* nop for bpf prog. emitted by LLVM */
index 0766702de84657460995af4b791374c941d5e285..d69fd2465f5367fc2471694f5938a7ab2cf03c47 100644 (file)
@@ -3,12 +3,14 @@
 #include <test_progs.h>
 #include <sys/mman.h>
 #include <network_helpers.h>
-
+#include <sys/user.h>
+#ifndef PAGE_SIZE /* on some archs it comes in sys/user.h */
+#include <unistd.h>
+#define PAGE_SIZE getpagesize()
+#endif
 #include "arena_htab_asm.skel.h"
 #include "arena_htab.skel.h"
 
-#define PAGE_SIZE 4096
-
 #include "bpf_arena_htab.h"
 
 static void test_arena_htab_common(struct htab *htab)
index e61886debab12727a594a0c3f54163bba35e3bea..d15867cddde06ab5c49bfdca8df1c1f69d0931d9 100644 (file)
@@ -3,8 +3,11 @@
 #include <test_progs.h>
 #include <sys/mman.h>
 #include <network_helpers.h>
-
-#define PAGE_SIZE 4096
+#include <sys/user.h>
+#ifndef PAGE_SIZE /* on some archs it comes in sys/user.h */
+#include <unistd.h>
+#define PAGE_SIZE getpagesize()
+#endif
 
 #include "bpf_arena_list.h"
 #include "arena_list.skel.h"
index 053f4d6da77a48f84d86263358c5c329bb6f0beb..cc184e4420f6e35ce9215187c5131f09a32484c7 100644 (file)
@@ -2,6 +2,7 @@
 /* Copyright (c) 2021 Facebook */
 
 #include <sys/syscall.h>
+#include <limits.h>
 #include <test_progs.h>
 #include "bloom_filter_map.skel.h"
 
@@ -21,6 +22,11 @@ static void test_fail_cases(void)
        if (!ASSERT_LT(fd, 0, "bpf_map_create bloom filter invalid value size 0"))
                close(fd);
 
+       /* Invalid value size: too big */
+       fd = bpf_map_create(BPF_MAP_TYPE_BLOOM_FILTER, NULL, 0, INT32_MAX, 100, NULL);
+       if (!ASSERT_LT(fd, 0, "bpf_map_create bloom filter invalid value too large"))
+               close(fd);
+
        /* Invalid max entries size */
        fd = bpf_map_create(BPF_MAP_TYPE_BLOOM_FILTER, NULL, 0, sizeof(value), 0, NULL);
        if (!ASSERT_LT(fd, 0, "bpf_map_create bloom filter invalid max entries size"))
index 985273832f891c291a308d03d35d1469204f9708..c4f9f306646ed3e7918ae484c78bde4aa56d342e 100644 (file)
@@ -5,6 +5,7 @@
 #include "cap_helpers.h"
 #include "verifier_and.skel.h"
 #include "verifier_arena.skel.h"
+#include "verifier_arena_large.skel.h"
 #include "verifier_array_access.skel.h"
 #include "verifier_basic_stack.skel.h"
 #include "verifier_bitfield_write.skel.h"
@@ -120,6 +121,7 @@ static void run_tests_aux(const char *skel_name,
 
 void test_verifier_and(void)                  { RUN(verifier_and); }
 void test_verifier_arena(void)                { RUN(verifier_arena); }
+void test_verifier_arena_large(void)          { RUN(verifier_arena_large); }
 void test_verifier_basic_stack(void)          { RUN(verifier_basic_stack); }
 void test_verifier_bitfield_write(void)       { RUN(verifier_bitfield_write); }
 void test_verifier_bounds(void)               { RUN(verifier_bounds); }
index b7bb712cacfdccb0747286634057a641b6b3f70a..1e6ac187a6a0ced2da5294ac6805a38f81047093 100644 (file)
@@ -22,7 +22,7 @@ int zero = 0;
 SEC("syscall")
 int arena_htab_llvm(void *ctx)
 {
-#if defined(__BPF_FEATURE_ARENA_CAST) || defined(BPF_ARENA_FORCE_ASM)
+#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) || defined(BPF_ARENA_FORCE_ASM)
        struct htab __arena *htab;
        __u64 i;
 
index cd35b844843560db676c19618999a38a50979038..c0422c58cee2c56156bf886dbc50fcfd089c449e 100644 (file)
@@ -30,13 +30,13 @@ int list_sum;
 int cnt;
 bool skip = false;
 
-#ifdef __BPF_FEATURE_ARENA_CAST
+#ifdef __BPF_FEATURE_ADDR_SPACE_CAST
 long __arena arena_sum;
 int __arena test_val = 1;
 struct arena_list_head __arena global_head;
 #else
-long arena_sum SEC(".arena.1");
-int test_val SEC(".arena.1");
+long arena_sum SEC(".addr_space.1");
+int test_val SEC(".addr_space.1");
 #endif
 
 int zero;
@@ -44,7 +44,7 @@ int zero;
 SEC("syscall")
 int arena_list_add(void *ctx)
 {
-#ifdef __BPF_FEATURE_ARENA_CAST
+#ifdef __BPF_FEATURE_ADDR_SPACE_CAST
        __u64 i;
 
        list_head = &global_head;
@@ -66,7 +66,7 @@ int arena_list_add(void *ctx)
 SEC("syscall")
 int arena_list_del(void *ctx)
 {
-#ifdef __BPF_FEATURE_ARENA_CAST
+#ifdef __BPF_FEATURE_ADDR_SPACE_CAST
        struct elem __arena *n;
        int sum = 0;
 
index 5540b05ff9ee13589af00305f4427c8ebac1ced6..93144ae6df74124fb7e7bb27084dc1371483d774 100644 (file)
@@ -12,14 +12,18 @@ struct {
        __uint(type, BPF_MAP_TYPE_ARENA);
        __uint(map_flags, BPF_F_MMAPABLE);
        __uint(max_entries, 2); /* arena of two pages close to 32-bit boundary*/
-       __ulong(map_extra, (1ull << 44) | (~0u - __PAGE_SIZE * 2 + 1)); /* start of mmap() region */
+#ifdef __TARGET_ARCH_arm64
+        __ulong(map_extra, (1ull << 32) | (~0u - __PAGE_SIZE * 2 + 1)); /* start of mmap() region */
+#else
+        __ulong(map_extra, (1ull << 44) | (~0u - __PAGE_SIZE * 2 + 1)); /* start of mmap() region */
+#endif
 } arena SEC(".maps");
 
 SEC("syscall")
 __success __retval(0)
 int basic_alloc1(void *ctx)
 {
-#if defined(__BPF_FEATURE_ARENA_CAST)
+#if defined(__BPF_FEATURE_ADDR_SPACE_CAST)
        volatile int __arena *page1, *page2, *no_page, *page3;
 
        page1 = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0);
@@ -58,7 +62,7 @@ SEC("syscall")
 __success __retval(0)
 int basic_alloc2(void *ctx)
 {
-#if defined(__BPF_FEATURE_ARENA_CAST)
+#if defined(__BPF_FEATURE_ADDR_SPACE_CAST)
        volatile char __arena *page1, *page2, *page3, *page4;
 
        page1 = bpf_arena_alloc_pages(&arena, NULL, 2, NUMA_NO_NODE, 0);
diff --git a/tools/testing/selftests/bpf/progs/verifier_arena_large.c b/tools/testing/selftests/bpf/progs/verifier_arena_large.c
new file mode 100644 (file)
index 0000000..ef66ea4
--- /dev/null
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
+
+#include <vmlinux.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+#include "bpf_misc.h"
+#include "bpf_experimental.h"
+#include "bpf_arena_common.h"
+
+#define ARENA_SIZE (1ull << 32)
+
+struct {
+       __uint(type, BPF_MAP_TYPE_ARENA);
+       __uint(map_flags, BPF_F_MMAPABLE);
+       __uint(max_entries, ARENA_SIZE / PAGE_SIZE);
+} arena SEC(".maps");
+
+SEC("syscall")
+__success __retval(0)
+int big_alloc1(void *ctx)
+{
+#if defined(__BPF_FEATURE_ADDR_SPACE_CAST)
+       volatile char __arena *page1, *page2, *no_page, *page3;
+       void __arena *base;
+
+       page1 = base = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0);
+       if (!page1)
+               return 1;
+       *page1 = 1;
+       page2 = bpf_arena_alloc_pages(&arena, base + ARENA_SIZE - PAGE_SIZE,
+                                     1, NUMA_NO_NODE, 0);
+       if (!page2)
+               return 2;
+       *page2 = 2;
+       no_page = bpf_arena_alloc_pages(&arena, base + ARENA_SIZE,
+                                       1, NUMA_NO_NODE, 0);
+       if (no_page)
+               return 3;
+       if (*page1 != 1)
+               return 4;
+       if (*page2 != 2)
+               return 5;
+       bpf_arena_free_pages(&arena, (void __arena *)page1, 1);
+       if (*page2 != 2)
+               return 6;
+       if (*page1 != 0) /* use-after-free should return 0 */
+               return 7;
+       page3 = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0);
+       if (!page3)
+               return 8;
+       *page3 = 3;
+       if (page1 != page3)
+               return 9;
+       if (*page2 != 2)
+               return 10;
+       if (*(page1 + PAGE_SIZE) != 0)
+               return 11;
+       if (*(page1 - PAGE_SIZE) != 0)
+               return 12;
+       if (*(page2 + PAGE_SIZE) != 0)
+               return 13;
+       if (*(page2 - PAGE_SIZE) != 0)
+               return 14;
+#endif
+       return 0;
+}
+char _license[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/drivers/net/netdevsim/settings b/tools/testing/selftests/drivers/net/netdevsim/settings
new file mode 100644 (file)
index 0000000..a62d2fa
--- /dev/null
@@ -0,0 +1 @@
+timeout=600
index 74ff9fb2a6f0e1c2e266a3a499501a6b05fa6905..58da5de99ac451370cd60d08a0319d5927fb8831 100755 (executable)
@@ -1177,6 +1177,7 @@ encap_params_common()
        local plen=$1; shift
        local enc_ethtype=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local src=$1; shift
        local mz=$1; shift
 
@@ -1195,11 +1196,11 @@ encap_params_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep2_ip src_vni 10020"
 
        run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Destination IP - match"
 
-       run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Destination IP - no match"
 
@@ -1212,20 +1213,20 @@ encap_params_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip dst_port 1111 src_vni 10020"
 
        run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 4789 action pass"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev veth0 ingress" 101 1
        log_test $? 0 "Default destination port - match"
 
-       run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev veth0 ingress" 101 1
        log_test $? 0 "Default destination port - no match"
 
        run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 1111 action pass"
-       run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev veth0 ingress" 101 1
        log_test $? 0 "Non-default destination port - match"
 
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev veth0 ingress" 101 1
        log_test $? 0 "Non-default destination port - no match"
 
@@ -1238,11 +1239,11 @@ encap_params_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10020"
 
        run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10010 action pass"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Default destination VNI - match"
 
-       run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Default destination VNI - no match"
 
@@ -1250,11 +1251,11 @@ encap_params_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10010 src_vni 10020"
 
        run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10020 action pass"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Non-default destination VNI - match"
 
-       run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Non-default destination VNI - no match"
 
@@ -1272,6 +1273,7 @@ encap_params_ipv4_ipv4()
        local plen=32
        local enc_ethtype="ip"
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local src=192.0.2.129
 
        echo
@@ -1279,7 +1281,7 @@ encap_params_ipv4_ipv4()
        echo "------------------------------------------------------------------"
 
        encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
-               $grp $src "mausezahn"
+               $grp $grp_dmac $src "mausezahn"
 }
 
 encap_params_ipv6_ipv4()
@@ -1291,6 +1293,7 @@ encap_params_ipv6_ipv4()
        local plen=32
        local enc_ethtype="ip"
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local src=2001:db8:100::1
 
        echo
@@ -1298,7 +1301,7 @@ encap_params_ipv6_ipv4()
        echo "------------------------------------------------------------------"
 
        encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
-               $grp $src "mausezahn -6"
+               $grp $grp_dmac $src "mausezahn -6"
 }
 
 encap_params_ipv4_ipv6()
@@ -1310,6 +1313,7 @@ encap_params_ipv4_ipv6()
        local plen=128
        local enc_ethtype="ipv6"
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local src=192.0.2.129
 
        echo
@@ -1317,7 +1321,7 @@ encap_params_ipv4_ipv6()
        echo "------------------------------------------------------------------"
 
        encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
-               $grp $src "mausezahn"
+               $grp $grp_dmac $src "mausezahn"
 }
 
 encap_params_ipv6_ipv6()
@@ -1329,6 +1333,7 @@ encap_params_ipv6_ipv6()
        local plen=128
        local enc_ethtype="ipv6"
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local src=2001:db8:100::1
 
        echo
@@ -1336,7 +1341,7 @@ encap_params_ipv6_ipv6()
        echo "------------------------------------------------------------------"
 
        encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
-               $grp $src "mausezahn -6"
+               $grp $grp_dmac $src "mausezahn -6"
 }
 
 starg_exclude_ir_common()
@@ -1347,6 +1352,7 @@ starg_exclude_ir_common()
        local vtep2_ip=$1; shift
        local plen=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local valid_src=$1; shift
        local invalid_src=$1; shift
        local mz=$1; shift
@@ -1368,14 +1374,14 @@ starg_exclude_ir_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep2_ip src_vni 10010"
 
        # Check that invalid source is not forwarded to any VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 0
        log_test $? 0 "Block excluded source - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 0
        log_test $? 0 "Block excluded source - second VTEP"
 
        # Check that valid source is forwarded to both VTEPs.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Forward valid source - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
@@ -1385,14 +1391,14 @@ starg_exclude_ir_common()
        run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
 
        # Check that invalid source is not forwarded to any VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Block excluded source after removal - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
        log_test $? 0 "Block excluded source after removal - second VTEP"
 
        # Check that valid source is forwarded to the remaining VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 2
        log_test $? 0 "Forward valid source after removal - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
@@ -1407,6 +1413,7 @@ starg_exclude_ir_ipv4_ipv4()
        local vtep2_ip=198.51.100.200
        local plen=32
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1415,7 +1422,7 @@ starg_exclude_ir_ipv4_ipv4()
        echo "-------------------------------------------------------------"
 
        starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn"
+               $grp_dmac $valid_src $invalid_src "mausezahn"
 }
 
 starg_exclude_ir_ipv6_ipv4()
@@ -1426,6 +1433,7 @@ starg_exclude_ir_ipv6_ipv4()
        local vtep2_ip=198.51.100.200
        local plen=32
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1434,7 +1442,7 @@ starg_exclude_ir_ipv6_ipv4()
        echo "-------------------------------------------------------------"
 
        starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn -6"
+               $grp_dmac $valid_src $invalid_src "mausezahn -6"
 }
 
 starg_exclude_ir_ipv4_ipv6()
@@ -1445,6 +1453,7 @@ starg_exclude_ir_ipv4_ipv6()
        local vtep2_ip=2001:db8:2000::1
        local plen=128
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1453,7 +1462,7 @@ starg_exclude_ir_ipv4_ipv6()
        echo "-------------------------------------------------------------"
 
        starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn"
+               $grp_dmac $valid_src $invalid_src "mausezahn"
 }
 
 starg_exclude_ir_ipv6_ipv6()
@@ -1464,6 +1473,7 @@ starg_exclude_ir_ipv6_ipv6()
        local vtep2_ip=2001:db8:2000::1
        local plen=128
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1472,7 +1482,7 @@ starg_exclude_ir_ipv6_ipv6()
        echo "-------------------------------------------------------------"
 
        starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn -6"
+               $grp_dmac $valid_src $invalid_src "mausezahn -6"
 }
 
 starg_include_ir_common()
@@ -1483,6 +1493,7 @@ starg_include_ir_common()
        local vtep2_ip=$1; shift
        local plen=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local valid_src=$1; shift
        local invalid_src=$1; shift
        local mz=$1; shift
@@ -1504,14 +1515,14 @@ starg_include_ir_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep2_ip src_vni 10010"
 
        # Check that invalid source is not forwarded to any VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 0
        log_test $? 0 "Block excluded source - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 0
        log_test $? 0 "Block excluded source - second VTEP"
 
        # Check that valid source is forwarded to both VTEPs.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Forward valid source - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
@@ -1521,14 +1532,14 @@ starg_include_ir_common()
        run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
 
        # Check that invalid source is not forwarded to any VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Block excluded source after removal - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
        log_test $? 0 "Block excluded source after removal - second VTEP"
 
        # Check that valid source is forwarded to the remaining VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 2
        log_test $? 0 "Forward valid source after removal - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
@@ -1543,6 +1554,7 @@ starg_include_ir_ipv4_ipv4()
        local vtep2_ip=198.51.100.200
        local plen=32
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1551,7 +1563,7 @@ starg_include_ir_ipv4_ipv4()
        echo "-------------------------------------------------------------"
 
        starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn"
+               $grp_dmac $valid_src $invalid_src "mausezahn"
 }
 
 starg_include_ir_ipv6_ipv4()
@@ -1562,6 +1574,7 @@ starg_include_ir_ipv6_ipv4()
        local vtep2_ip=198.51.100.200
        local plen=32
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1570,7 +1583,7 @@ starg_include_ir_ipv6_ipv4()
        echo "-------------------------------------------------------------"
 
        starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn -6"
+               $grp_dmac $valid_src $invalid_src "mausezahn -6"
 }
 
 starg_include_ir_ipv4_ipv6()
@@ -1581,6 +1594,7 @@ starg_include_ir_ipv4_ipv6()
        local vtep2_ip=2001:db8:2000::1
        local plen=128
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1589,7 +1603,7 @@ starg_include_ir_ipv4_ipv6()
        echo "-------------------------------------------------------------"
 
        starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn"
+               $grp_dmac $valid_src $invalid_src "mausezahn"
 }
 
 starg_include_ir_ipv6_ipv6()
@@ -1600,6 +1614,7 @@ starg_include_ir_ipv6_ipv6()
        local vtep2_ip=2001:db8:2000::1
        local plen=128
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1608,7 +1623,7 @@ starg_include_ir_ipv6_ipv6()
        echo "-------------------------------------------------------------"
 
        starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
-               $valid_src $invalid_src "mausezahn -6"
+               $grp_dmac $valid_src $invalid_src "mausezahn -6"
 }
 
 starg_exclude_p2mp_common()
@@ -1618,6 +1633,7 @@ starg_exclude_p2mp_common()
        local mcast_grp=$1; shift
        local plen=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local valid_src=$1; shift
        local invalid_src=$1; shift
        local mz=$1; shift
@@ -1635,12 +1651,12 @@ starg_exclude_p2mp_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $mcast_grp src_vni 10010 via veth0"
 
        # Check that invalid source is not forwarded.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 0
        log_test $? 0 "Block excluded source"
 
        # Check that valid source is forwarded.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Forward valid source"
 
@@ -1648,7 +1664,7 @@ starg_exclude_p2mp_common()
        run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
 
        # Check that valid source is not received anymore.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Receive of valid source after removal from group"
 }
@@ -1660,6 +1676,7 @@ starg_exclude_p2mp_ipv4_ipv4()
        local mcast_grp=238.1.1.1
        local plen=32
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1667,7 +1684,7 @@ starg_exclude_p2mp_ipv4_ipv4()
        echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn"
 }
 
@@ -1678,6 +1695,7 @@ starg_exclude_p2mp_ipv6_ipv4()
        local mcast_grp=238.1.1.1
        local plen=32
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1685,7 +1703,7 @@ starg_exclude_p2mp_ipv6_ipv4()
        echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn -6"
 }
 
@@ -1696,6 +1714,7 @@ starg_exclude_p2mp_ipv4_ipv6()
        local mcast_grp=ff0e::2
        local plen=128
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1703,7 +1722,7 @@ starg_exclude_p2mp_ipv4_ipv6()
        echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn"
 }
 
@@ -1714,6 +1733,7 @@ starg_exclude_p2mp_ipv6_ipv6()
        local mcast_grp=ff0e::2
        local plen=128
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1721,7 +1741,7 @@ starg_exclude_p2mp_ipv6_ipv6()
        echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn -6"
 }
 
@@ -1732,6 +1752,7 @@ starg_include_p2mp_common()
        local mcast_grp=$1; shift
        local plen=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local valid_src=$1; shift
        local invalid_src=$1; shift
        local mz=$1; shift
@@ -1749,12 +1770,12 @@ starg_include_p2mp_common()
        run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $mcast_grp src_vni 10010 via veth0"
 
        # Check that invalid source is not forwarded.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 0
        log_test $? 0 "Block excluded source"
 
        # Check that valid source is forwarded.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Forward valid source"
 
@@ -1762,7 +1783,7 @@ starg_include_p2mp_common()
        run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
 
        # Check that valid source is not received anymore.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Receive of valid source after removal from group"
 }
@@ -1774,6 +1795,7 @@ starg_include_p2mp_ipv4_ipv4()
        local mcast_grp=238.1.1.1
        local plen=32
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1781,7 +1803,7 @@ starg_include_p2mp_ipv4_ipv4()
        echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn"
 }
 
@@ -1792,6 +1814,7 @@ starg_include_p2mp_ipv6_ipv4()
        local mcast_grp=238.1.1.1
        local plen=32
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1799,7 +1822,7 @@ starg_include_p2mp_ipv6_ipv4()
        echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn -6"
 }
 
@@ -1810,6 +1833,7 @@ starg_include_p2mp_ipv4_ipv6()
        local mcast_grp=ff0e::2
        local plen=128
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local valid_src=192.0.2.129
        local invalid_src=192.0.2.145
 
@@ -1817,7 +1841,7 @@ starg_include_p2mp_ipv4_ipv6()
        echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn"
 }
 
@@ -1828,6 +1852,7 @@ starg_include_p2mp_ipv6_ipv6()
        local mcast_grp=ff0e::2
        local plen=128
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local valid_src=2001:db8:100::1
        local invalid_src=2001:db8:200::1
 
@@ -1835,7 +1860,7 @@ starg_include_p2mp_ipv6_ipv6()
        echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
        echo "---------------------------------------------------------------"
 
-       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
+       starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
                $valid_src $invalid_src "mausezahn -6"
 }
 
@@ -1847,6 +1872,7 @@ egress_vni_translation_common()
        local plen=$1; shift
        local proto=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local src=$1; shift
        local mz=$1; shift
 
@@ -1882,20 +1908,20 @@ egress_vni_translation_common()
        # Make sure that packets sent from the first VTEP over VLAN 10 are
        # received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on
        # the second VTEP, since it is configured as PVID.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
        log_test $? 0 "Egress VNI translation - PVID configured"
 
        # Remove PVID flag from VLAN 4000 on the second VTEP and make sure
        # packets are no longer received by the SVI interface.
        run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
        log_test $? 0 "Egress VNI translation - no PVID configured"
 
        # Reconfigure the PVID and make sure packets are received again.
        run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0 pvid"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev br0.4000 ingress" 101 2
        log_test $? 0 "Egress VNI translation - PVID reconfigured"
 }
@@ -1908,6 +1934,7 @@ egress_vni_translation_ipv4_ipv4()
        local plen=32
        local proto="ipv4"
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local src=192.0.2.129
 
        echo
@@ -1915,7 +1942,7 @@ egress_vni_translation_ipv4_ipv4()
        echo "----------------------------------------------------------------"
 
        egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
-               $src "mausezahn"
+               $grp_dmac $src "mausezahn"
 }
 
 egress_vni_translation_ipv6_ipv4()
@@ -1926,6 +1953,7 @@ egress_vni_translation_ipv6_ipv4()
        local plen=32
        local proto="ipv6"
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local src=2001:db8:100::1
 
        echo
@@ -1933,7 +1961,7 @@ egress_vni_translation_ipv6_ipv4()
        echo "----------------------------------------------------------------"
 
        egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
-               $src "mausezahn -6"
+               $grp_dmac $src "mausezahn -6"
 }
 
 egress_vni_translation_ipv4_ipv6()
@@ -1944,6 +1972,7 @@ egress_vni_translation_ipv4_ipv6()
        local plen=128
        local proto="ipv4"
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local src=192.0.2.129
 
        echo
@@ -1951,7 +1980,7 @@ egress_vni_translation_ipv4_ipv6()
        echo "----------------------------------------------------------------"
 
        egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
-               $src "mausezahn"
+               $grp_dmac $src "mausezahn"
 }
 
 egress_vni_translation_ipv6_ipv6()
@@ -1962,6 +1991,7 @@ egress_vni_translation_ipv6_ipv6()
        local plen=128
        local proto="ipv6"
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local src=2001:db8:100::1
 
        echo
@@ -1969,7 +1999,7 @@ egress_vni_translation_ipv6_ipv6()
        echo "----------------------------------------------------------------"
 
        egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
-               $src "mausezahn -6"
+               $grp_dmac $src "mausezahn -6"
 }
 
 all_zeros_mdb_common()
@@ -1982,12 +2012,18 @@ all_zeros_mdb_common()
        local vtep4_ip=$1; shift
        local plen=$1; shift
        local ipv4_grp=239.1.1.1
+       local ipv4_grp_dmac=01:00:5e:01:01:01
        local ipv4_unreg_grp=239.2.2.2
+       local ipv4_unreg_grp_dmac=01:00:5e:02:02:02
        local ipv4_ll_grp=224.0.0.100
+       local ipv4_ll_grp_dmac=01:00:5e:00:00:64
        local ipv4_src=192.0.2.129
        local ipv6_grp=ff0e::1
+       local ipv6_grp_dmac=33:33:00:00:00:01
        local ipv6_unreg_grp=ff0e::2
+       local ipv6_unreg_grp_dmac=33:33:00:00:00:02
        local ipv6_ll_grp=ff02::1
+       local ipv6_ll_grp_dmac=33:33:00:00:00:01
        local ipv6_src=2001:db8:100::1
 
        # Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic
@@ -2023,7 +2059,7 @@ all_zeros_mdb_common()
 
        # Send registered IPv4 multicast and make sure it only arrives to the
        # first VTEP.
-       run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_grp_dmac -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "Registered IPv4 multicast - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 0
@@ -2031,7 +2067,7 @@ all_zeros_mdb_common()
 
        # Send unregistered IPv4 multicast that is not link-local and make sure
        # it arrives to the first and second VTEPs.
-       run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_unreg_grp_dmac -A $ipv4_src -B $ipv4_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 2
        log_test $? 0 "Unregistered IPv4 multicast - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
@@ -2039,7 +2075,7 @@ all_zeros_mdb_common()
 
        # Send IPv4 link-local multicast traffic and make sure it does not
        # arrive to any VTEP.
-       run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_ll_grp_dmac -A $ipv4_src -B $ipv4_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 2
        log_test $? 0 "Link-local IPv4 multicast - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 1
@@ -2074,7 +2110,7 @@ all_zeros_mdb_common()
 
        # Send registered IPv6 multicast and make sure it only arrives to the
        # third VTEP.
-       run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_grp_dmac -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 103 1
        log_test $? 0 "Registered IPv6 multicast - third VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 104 0
@@ -2082,7 +2118,7 @@ all_zeros_mdb_common()
 
        # Send unregistered IPv6 multicast that is not link-local and make sure
        # it arrives to the third and fourth VTEPs.
-       run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_unreg_grp_dmac -A $ipv6_src -B $ipv6_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 103 2
        log_test $? 0 "Unregistered IPv6 multicast - third VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 104 1
@@ -2090,7 +2126,7 @@ all_zeros_mdb_common()
 
        # Send IPv6 link-local multicast traffic and make sure it does not
        # arrive to any VTEP.
-       run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_ll_grp_dmac -A $ipv6_src -B $ipv6_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 103 2
        log_test $? 0 "Link-local IPv6 multicast - third VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 104 1
@@ -2165,6 +2201,7 @@ mdb_fdb_common()
        local plen=$1; shift
        local proto=$1; shift
        local grp=$1; shift
+       local grp_dmac=$1; shift
        local src=$1; shift
        local mz=$1; shift
 
@@ -2188,7 +2225,7 @@ mdb_fdb_common()
 
        # Send IP multicast traffic and make sure it is forwarded by the MDB
        # and only arrives to the first VTEP.
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "IP multicast - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 0
@@ -2205,7 +2242,7 @@ mdb_fdb_common()
        # Remove the MDB entry and make sure that IP multicast is now forwarded
        # by the FDB to the second VTEP.
        run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
-       run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
+       run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
        tc_check_packets "$ns2" "dev vx0 ingress" 101 1
        log_test $? 0 "IP multicast after removal - first VTEP"
        tc_check_packets "$ns2" "dev vx0 ingress" 102 2
@@ -2221,14 +2258,15 @@ mdb_fdb_ipv4_ipv4()
        local plen=32
        local proto="ipv4"
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local src=192.0.2.129
 
        echo
        echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"
        echo "------------------------------------------------------"
 
-       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
-               "mausezahn"
+       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
+               $grp_dmac $src "mausezahn"
 }
 
 mdb_fdb_ipv6_ipv4()
@@ -2240,14 +2278,15 @@ mdb_fdb_ipv6_ipv4()
        local plen=32
        local proto="ipv6"
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local src=2001:db8:100::1
 
        echo
        echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"
        echo "------------------------------------------------------"
 
-       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
-               "mausezahn -6"
+       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
+               $grp_dmac $src "mausezahn -6"
 }
 
 mdb_fdb_ipv4_ipv6()
@@ -2259,14 +2298,15 @@ mdb_fdb_ipv4_ipv6()
        local plen=128
        local proto="ipv4"
        local grp=239.1.1.1
+       local grp_dmac=01:00:5e:01:01:01
        local src=192.0.2.129
 
        echo
        echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"
        echo "------------------------------------------------------"
 
-       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
-               "mausezahn"
+       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
+               $grp_dmac $src "mausezahn"
 }
 
 mdb_fdb_ipv6_ipv6()
@@ -2278,14 +2318,15 @@ mdb_fdb_ipv6_ipv6()
        local plen=128
        local proto="ipv6"
        local grp=ff0e::1
+       local grp_dmac=33:33:00:00:00:01
        local src=2001:db8:100::1
 
        echo
        echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"
        echo "------------------------------------------------------"
 
-       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
-               "mausezahn -6"
+       mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
+               $grp_dmac $src "mausezahn -6"
 }
 
 mdb_grp1_loop()
@@ -2320,7 +2361,9 @@ mdb_torture_common()
        local vtep1_ip=$1; shift
        local vtep2_ip=$1; shift
        local grp1=$1; shift
+       local grp1_dmac=$1; shift
        local grp2=$1; shift
+       local grp2_dmac=$1; shift
        local src=$1; shift
        local mz=$1; shift
        local pid1
@@ -2345,9 +2388,9 @@ mdb_torture_common()
        pid1=$!
        mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &
        pid2=$!
-       ip netns exec $ns1 $mz br0.10 -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
+       ip netns exec $ns1 $mz br0.10 -a own -b $grp1_dmac -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
        pid3=$!
-       ip netns exec $ns1 $mz br0.10 -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
+       ip netns exec $ns1 $mz br0.10 -a own -b $grp2_dmac -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
        pid4=$!
 
        sleep 30
@@ -2363,15 +2406,17 @@ mdb_torture_ipv4_ipv4()
        local vtep1_ip=198.51.100.100
        local vtep2_ip=198.51.100.200
        local grp1=239.1.1.1
+       local grp1_dmac=01:00:5e:01:01:01
        local grp2=239.2.2.2
+       local grp2_dmac=01:00:5e:02:02:02
        local src=192.0.2.129
 
        echo
        echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"
        echo "----------------------------------------------------------"
 
-       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
-               "mausezahn"
+       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
+               $grp2_dmac $src "mausezahn"
 }
 
 mdb_torture_ipv6_ipv4()
@@ -2380,15 +2425,17 @@ mdb_torture_ipv6_ipv4()
        local vtep1_ip=198.51.100.100
        local vtep2_ip=198.51.100.200
        local grp1=ff0e::1
+       local grp1_dmac=33:33:00:00:00:01
        local grp2=ff0e::2
+       local grp2_dmac=33:33:00:00:00:02
        local src=2001:db8:100::1
 
        echo
        echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"
        echo "----------------------------------------------------------"
 
-       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
-               "mausezahn -6"
+       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
+               $grp2_dmac $src "mausezahn -6"
 }
 
 mdb_torture_ipv4_ipv6()
@@ -2397,15 +2444,17 @@ mdb_torture_ipv4_ipv6()
        local vtep1_ip=2001:db8:1000::1
        local vtep2_ip=2001:db8:2000::1
        local grp1=239.1.1.1
+       local grp1_dmac=01:00:5e:01:01:01
        local grp2=239.2.2.2
+       local grp2_dmac=01:00:5e:02:02:02
        local src=192.0.2.129
 
        echo
        echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"
        echo "----------------------------------------------------------"
 
-       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
-               "mausezahn"
+       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
+               $grp2_dmac $src "mausezahn"
 }
 
 mdb_torture_ipv6_ipv6()
@@ -2414,15 +2463,17 @@ mdb_torture_ipv6_ipv6()
        local vtep1_ip=2001:db8:1000::1
        local vtep2_ip=2001:db8:2000::1
        local grp1=ff0e::1
+       local grp1_dmac=33:33:00:00:00:01
        local grp2=ff0e::2
+       local grp2_dmac=33:33:00:00:00:02
        local src=2001:db8:100::1
 
        echo
        echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"
        echo "----------------------------------------------------------"
 
-       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
-               "mausezahn -6"
+       mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
+               $grp2_dmac $src "mausezahn -6"
 }
 
 ################################################################################
index c6eda21cefb6b881f9180c730485f9fe28c0e59a..f27a12d2a2c9979adba840ab1065e8af9bc44aab 100644 (file)
@@ -1615,6 +1615,40 @@ TEST_F(tls, getsockopt)
        EXPECT_EQ(errno, EINVAL);
 }
 
+TEST_F(tls, recv_efault)
+{
+       char *rec1 = "1111111111";
+       char *rec2 = "2222222222";
+       struct msghdr hdr = {};
+       struct iovec iov[2];
+       char recv_mem[12];
+       int ret;
+
+       if (self->notls)
+               SKIP(return, "no TLS support");
+
+       EXPECT_EQ(send(self->fd, rec1, 10, 0), 10);
+       EXPECT_EQ(send(self->fd, rec2, 10, 0), 10);
+
+       iov[0].iov_base = recv_mem;
+       iov[0].iov_len = sizeof(recv_mem);
+       iov[1].iov_base = NULL; /* broken iov to make process_rx_list fail */
+       iov[1].iov_len = 1;
+
+       hdr.msg_iovlen = 2;
+       hdr.msg_iov = iov;
+
+       EXPECT_EQ(recv(self->cfd, recv_mem, 1, 0), 1);
+       EXPECT_EQ(recv_mem[0], rec1[0]);
+
+       ret = recvmsg(self->cfd, &hdr, 0);
+       EXPECT_LE(ret, sizeof(recv_mem));
+       EXPECT_GE(ret, 9);
+       EXPECT_EQ(memcmp(rec1, recv_mem, 9), 0);
+       if (ret > 9)
+               EXPECT_EQ(memcmp(rec2, recv_mem + 9, ret - 9), 0);
+}
+
 FIXTURE(tls_err)
 {
        int fd, cfd;