mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
Including fixes from bpf, WiFi and netfilter.
Current release - regressions: - ipv6: fix address dump when IPv6 is disabled on an interface Current release - new code bugs: - bpf: temporarily disable atomic operations in BPF arena - nexthop: fix uninitialized variable in nla_put_nh_group_stats() Previous releases - regressions: - bpf: protect against int overflow for stack access size - hsr: fix the promiscuous mode in offload mode - wifi: don't always use FW dump trig - tls: adjust recv return with async crypto and failed copy to userspace - tcp: properly terminate timers for kernel sockets - ice: fix memory corruption bug with suspend and rebuild - at803x: fix kernel panic with at8031_probe - qeth: handle deferred cc1 Previous releases - always broken: - bpf: fix bug in BPF_LDX_MEMSX - netfilter: reject table flag and netdev basechain updates - inet_defrag: prevent sk release while still in use - wifi: pick the version of SESSION_PROTECTION_NOTIF - wwan: t7xx: split 64bit accesses to fix alignment issues - mlxbf_gige: call request_irq() after NAPI initialized - hns3: fix kernel crash when devlink reload during pf initialization Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmYFezkSHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOkdAUP/3SYNsFNIkh0/jwQqO9qBLJfI4suFjYG +s8jOGdCiA7n7aSgzv/RgGZ7XNqOegW3mpPRHecVVZcDu5I9y9N4AOhTDQG84TM/ 65YatgWpiZJT74oVEpoA8zcnmb4CCGYdWAxJCQZUKXoLjMAMPWelU4ee6VwonxGy GJ97+a4AxTXGvmQTi3rz0HLrSHQaizA+D7YP7YD8JczkG7I7kcAIR+SUWVKLSuw0 VJnbko7RPIe3vdFFlMFypPgpZASjnO0O8g60s+eruazarEpMZE2+RqPfyz0nEg+u IK3W9zRw7r0PMkKqk9PoSaRjsIaNqIZBJR2Smh2cLMIpEB4CUvEFLi7WAshIdyUC +LBN9um3Ep3vLYh4nyuU3FzAyqdsqEo6+ayJCTRKq91xv9LrLmIN16IQpAqaRikb LJAuiaASwIpyu1FxBuTv41mLEUKtpm7ooziomHTJ7KbtzSf4QevRMBtorrB5t7VH l4yvp9ymcwHE79q8nrak1JH1JI/kCT5ZEPSqcOU5UNKSf6INjWqUTJedqZdVa5wB WiSZBixAmsc7DgZzARWKotRkgBEDyGeeHwrNLo/2kS8rS+hUCf6mSafpTZiPI/kL e+SVh+9RA8elFIF3sBV0VPcyt35G+if8o1NG1/2OTDPvZEkIz21eJhJgGyxRMHCD cpVSRBkU+np3 =HbtI -----END PGP SIGNATURE----- Merge tag 'net-6.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from bpf, WiFi and netfilter. Current release - regressions: - ipv6: fix address dump when IPv6 is disabled on an interface Current release - new code bugs: - bpf: temporarily disable atomic operations in BPF arena - nexthop: fix uninitialized variable in nla_put_nh_group_stats() Previous releases - regressions: - bpf: protect against int overflow for stack access size - hsr: fix the promiscuous mode in offload mode - wifi: don't always use FW dump trig - tls: adjust recv return with async crypto and failed copy to userspace - tcp: properly terminate timers for kernel sockets - ice: fix memory corruption bug with suspend and rebuild - at803x: fix kernel panic with at8031_probe - qeth: handle deferred cc1 Previous releases - always broken: - bpf: fix bug in BPF_LDX_MEMSX - netfilter: reject table flag and netdev basechain updates - inet_defrag: prevent sk release while still in use - wifi: pick the version of SESSION_PROTECTION_NOTIF - wwan: t7xx: split 64bit accesses to fix alignment issues - mlxbf_gige: call request_irq() after NAPI initialized - hns3: fix kernel crash when devlink reload during pf initialization" * tag 'net-6.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (81 commits) inet: inet_defrag: prevent sk release while still in use Octeontx2-af: fix pause frame configuration in GMP mode net: lan743x: Add set RFE read fifo threshold for PCI1x1x chips net: bcmasp: Remove phy_{suspend/resume} net: bcmasp: Bring up unimac after PHY link up net: phy: qcom: at803x: fix kernel panic with at8031_probe 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 bpf: update BPF LSM designated reviewer list bpf: Protect against int overflow for stack access size bpf: Check bloom filter map value size bpf: fix warning for crash_kexec selftests: netdevsim: set test timeout to 10 minutes net: wan: framer: Add missing static inline qualifiers mlxbf_gige: call request_irq() after NAPI initialized tls: get psock ref after taking rxlock to avoid leak selftests: tls: add test with a partially invalid iov tls: adjust recv return with async crypto and failed copy to userspace ...
This commit is contained in:
commit
50108c352d
3
.mailmap
3
.mailmap
@ -498,7 +498,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>
|
||||
|
40
MAINTAINERS
40
MAINTAINERS
@ -3942,8 +3942,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
|
||||
@ -3968,7 +3967,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.*
|
||||
@ -13134,6 +13133,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/
|
||||
@ -18645,18 +18645,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
|
||||
@ -18727,13 +18730,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>
|
||||
@ -18843,6 +18857,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
|
||||
@ -19179,12 +19203,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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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(¤t_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(¤t_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 *));
|
||||
}
|
||||
|
||||
|
@ -4,4 +4,4 @@
|
||||
#
|
||||
|
||||
config DPLL
|
||||
bool
|
||||
bool
|
||||
|
@ -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 */
|
||||
|
@ -392,7 +392,9 @@ static void umac_reset(struct bcmasp_intf *intf)
|
||||
umac_wl(intf, 0x0, UMC_CMD);
|
||||
umac_wl(intf, UMC_CMD_SW_RESET, UMC_CMD);
|
||||
usleep_range(10, 100);
|
||||
umac_wl(intf, 0x0, UMC_CMD);
|
||||
/* We hold the umac in reset and bring it out of
|
||||
* reset when phy link is up.
|
||||
*/
|
||||
}
|
||||
|
||||
static void umac_set_hw_addr(struct bcmasp_intf *intf,
|
||||
@ -412,6 +414,8 @@ static void umac_enable_set(struct bcmasp_intf *intf, u32 mask,
|
||||
u32 reg;
|
||||
|
||||
reg = umac_rl(intf, UMC_CMD);
|
||||
if (reg & UMC_CMD_SW_RESET)
|
||||
return;
|
||||
if (enable)
|
||||
reg |= mask;
|
||||
else
|
||||
@ -430,7 +434,6 @@ static void umac_init(struct bcmasp_intf *intf)
|
||||
umac_wl(intf, 0x800, UMC_FRM_LEN);
|
||||
umac_wl(intf, 0xffff, UMC_PAUSE_CNTRL);
|
||||
umac_wl(intf, 0x800, UMC_RX_MAX_PKT_SZ);
|
||||
umac_enable_set(intf, UMC_CMD_PROMISC, 1);
|
||||
}
|
||||
|
||||
static int bcmasp_tx_poll(struct napi_struct *napi, int budget)
|
||||
@ -658,6 +661,12 @@ static void bcmasp_adj_link(struct net_device *dev)
|
||||
UMC_CMD_HD_EN | UMC_CMD_RX_PAUSE_IGNORE |
|
||||
UMC_CMD_TX_PAUSE_IGNORE);
|
||||
reg |= cmd_bits;
|
||||
if (reg & UMC_CMD_SW_RESET) {
|
||||
reg &= ~UMC_CMD_SW_RESET;
|
||||
umac_wl(intf, reg, UMC_CMD);
|
||||
udelay(2);
|
||||
reg |= UMC_CMD_TX_EN | UMC_CMD_RX_EN | UMC_CMD_PROMISC;
|
||||
}
|
||||
umac_wl(intf, reg, UMC_CMD);
|
||||
|
||||
active = phy_init_eee(phydev, 0) >= 0;
|
||||
@ -1035,19 +1044,12 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect)
|
||||
|
||||
/* Indicate that the MAC is responsible for PHY PM */
|
||||
phydev->mac_managed_pm = true;
|
||||
} else if (!intf->wolopts) {
|
||||
ret = phy_resume(dev->phydev);
|
||||
if (ret)
|
||||
goto err_phy_disable;
|
||||
}
|
||||
|
||||
umac_reset(intf);
|
||||
|
||||
umac_init(intf);
|
||||
|
||||
/* Disable the UniMAC RX/TX */
|
||||
umac_enable_set(intf, (UMC_CMD_RX_EN | UMC_CMD_TX_EN), 0);
|
||||
|
||||
umac_set_hw_addr(intf, dev->dev_addr);
|
||||
|
||||
intf->old_duplex = -1;
|
||||
@ -1062,9 +1064,6 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect)
|
||||
netif_napi_add(intf->ndev, &intf->rx_napi, bcmasp_rx_poll);
|
||||
bcmasp_enable_rx(intf, 1);
|
||||
|
||||
/* Turn on UniMAC TX/RX */
|
||||
umac_enable_set(intf, (UMC_CMD_RX_EN | UMC_CMD_TX_EN), 1);
|
||||
|
||||
intf->crc_fwd = !!(umac_rl(intf, UMC_CMD) & UMC_CMD_CRC_FWD);
|
||||
|
||||
bcmasp_netif_start(dev);
|
||||
@ -1306,7 +1305,14 @@ static void bcmasp_suspend_to_wol(struct bcmasp_intf *intf)
|
||||
if (intf->wolopts & WAKE_FILTER)
|
||||
bcmasp_netfilt_suspend(intf);
|
||||
|
||||
/* UniMAC receive needs to be turned on */
|
||||
/* Bring UniMAC out of reset if needed and enable RX */
|
||||
reg = umac_rl(intf, UMC_CMD);
|
||||
if (reg & UMC_CMD_SW_RESET)
|
||||
reg &= ~UMC_CMD_SW_RESET;
|
||||
|
||||
reg |= UMC_CMD_RX_EN | UMC_CMD_PROMISC;
|
||||
umac_wl(intf, reg, UMC_CMD);
|
||||
|
||||
umac_enable_set(intf, UMC_CMD_RX_EN, 1);
|
||||
|
||||
if (intf->parent->wol_irq > 0) {
|
||||
@ -1324,7 +1330,6 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf)
|
||||
{
|
||||
struct device *kdev = &intf->parent->pdev->dev;
|
||||
struct net_device *dev = intf->ndev;
|
||||
int ret = 0;
|
||||
|
||||
if (!netif_running(dev))
|
||||
return 0;
|
||||
@ -1334,10 +1339,6 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf)
|
||||
bcmasp_netif_deinit(dev);
|
||||
|
||||
if (!intf->wolopts) {
|
||||
ret = phy_suspend(dev->phydev);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (intf->internal_phy)
|
||||
bcmasp_ephy_enable_set(intf, false);
|
||||
else
|
||||
@ -1354,11 +1355,7 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf)
|
||||
|
||||
clk_disable_unprepare(intf->parent->clk);
|
||||
|
||||
return ret;
|
||||
|
||||
out:
|
||||
bcmasp_netif_init(dev, false);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bcmasp_resume_from_wol(struct bcmasp_intf *intf)
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -808,6 +808,11 @@ static int cgx_lmac_enadis_pause_frm(void *cgxd, int lmac_id,
|
||||
if (!is_lmac_valid(cgx, lmac_id))
|
||||
return -ENODEV;
|
||||
|
||||
cfg = cgx_read(cgx, lmac_id, CGXX_GMP_GMI_RXX_FRM_CTL);
|
||||
cfg &= ~CGX_GMP_GMI_RXX_FRM_CTL_CTL_BCK;
|
||||
cfg |= rx_pause ? CGX_GMP_GMI_RXX_FRM_CTL_CTL_BCK : 0x0;
|
||||
cgx_write(cgx, lmac_id, CGXX_GMP_GMI_RXX_FRM_CTL, cfg);
|
||||
|
||||
cfg = cgx_read(cgx, lmac_id, CGXX_SMUX_RX_FRM_CTL);
|
||||
cfg &= ~CGX_SMUX_RX_FRM_CTL_CTL_BCK;
|
||||
cfg |= rx_pause ? CGX_SMUX_RX_FRM_CTL_CTL_BCK : 0x0;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,8 @@
|
||||
#define PCS_POWER_STATE_DOWN 0x6
|
||||
#define PCS_POWER_STATE_UP 0x4
|
||||
|
||||
#define RFE_RD_FIFO_TH_3_DWORDS 0x3
|
||||
|
||||
static void pci11x1x_strap_get_status(struct lan743x_adapter *adapter)
|
||||
{
|
||||
u32 chip_rev;
|
||||
@ -3272,6 +3274,21 @@ static void lan743x_full_cleanup(struct lan743x_adapter *adapter)
|
||||
lan743x_pci_cleanup(adapter);
|
||||
}
|
||||
|
||||
static void pci11x1x_set_rfe_rd_fifo_threshold(struct lan743x_adapter *adapter)
|
||||
{
|
||||
u16 rev = adapter->csr.id_rev & ID_REV_CHIP_REV_MASK_;
|
||||
|
||||
if (rev == ID_REV_CHIP_REV_PCI11X1X_B0_) {
|
||||
u32 misc_ctl;
|
||||
|
||||
misc_ctl = lan743x_csr_read(adapter, MISC_CTL_0);
|
||||
misc_ctl &= ~MISC_CTL_0_RFE_READ_FIFO_MASK_;
|
||||
misc_ctl |= FIELD_PREP(MISC_CTL_0_RFE_READ_FIFO_MASK_,
|
||||
RFE_RD_FIFO_TH_3_DWORDS);
|
||||
lan743x_csr_write(adapter, MISC_CTL_0, misc_ctl);
|
||||
}
|
||||
}
|
||||
|
||||
static int lan743x_hardware_init(struct lan743x_adapter *adapter,
|
||||
struct pci_dev *pdev)
|
||||
{
|
||||
@ -3287,6 +3304,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
|
||||
pci11x1x_strap_get_status(adapter);
|
||||
spin_lock_init(&adapter->eth_syslock_spinlock);
|
||||
mutex_init(&adapter->sgmii_rw_lock);
|
||||
pci11x1x_set_rfe_rd_fifo_threshold(adapter);
|
||||
} else {
|
||||
adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS;
|
||||
adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#define ID_REV_CHIP_REV_MASK_ (0x0000FFFF)
|
||||
#define ID_REV_CHIP_REV_A0_ (0x00000000)
|
||||
#define ID_REV_CHIP_REV_B0_ (0x00000010)
|
||||
#define ID_REV_CHIP_REV_PCI11X1X_B0_ (0x000000B0)
|
||||
|
||||
#define FPGA_REV (0x04)
|
||||
#define FPGA_REV_GET_MINOR_(fpga_rev) (((fpga_rev) >> 8) & 0x000000FF)
|
||||
@ -311,6 +312,9 @@
|
||||
#define SGMII_CTL_LINK_STATUS_SOURCE_ BIT(8)
|
||||
#define SGMII_CTL_SGMII_POWER_DN_ BIT(1)
|
||||
|
||||
#define MISC_CTL_0 (0x920)
|
||||
#define MISC_CTL_0_RFE_READ_FIFO_MASK_ GENMASK(6, 4)
|
||||
|
||||
/* Vendor Specific SGMII MMD details */
|
||||
#define SR_VSMMD_PCS_ID1 0x0004
|
||||
#define SR_VSMMD_PCS_ID2 0x0005
|
||||
|
@ -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;
|
||||
|
@ -797,7 +797,7 @@ static int at8031_parse_dt(struct phy_device *phydev)
|
||||
|
||||
static int at8031_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct at803x_priv *priv = phydev->priv;
|
||||
struct at803x_priv *priv;
|
||||
int mode_cfg;
|
||||
int ccr;
|
||||
int ret;
|
||||
@ -806,6 +806,8 @@ static int at8031_probe(struct phy_device *phydev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv = phydev->priv;
|
||||
|
||||
/* Only supported on AR8031/AR8033, the AR8030/AR8035 use strapping
|
||||
* options.
|
||||
*/
|
||||
|
@ -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, ¶ms, 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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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",
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -753,8 +753,6 @@ typedef unsigned char *sk_buff_data_t;
|
||||
* @list: queue head
|
||||
* @ll_node: anchor in an llist (eg socket defer_list)
|
||||
* @sk: Socket we are owned by
|
||||
* @ip_defrag_offset: (aka @sk) alternate use of @sk, used in
|
||||
* fragmentation management
|
||||
* @dev: Device we arrived on/are leaving by
|
||||
* @dev_scratch: (aka @dev) alternate use of @dev when @dev would be %NULL
|
||||
* @cb: Control buffer. Free for use by every layer. Put private vars here
|
||||
@ -875,10 +873,7 @@ struct sk_buff {
|
||||
struct llist_node ll_node;
|
||||
};
|
||||
|
||||
union {
|
||||
struct sock *sk;
|
||||
int ip_defrag_offset;
|
||||
};
|
||||
struct sock *sk;
|
||||
|
||||
union {
|
||||
ktime_t tstamp;
|
||||
|
@ -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),
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
|
||||
#include "../core/sock_destructor.h"
|
||||
|
||||
/* Use skb->cb to track consecutive/adjacent fragments coming at
|
||||
* the end of the queue. Nodes in the rb-tree queue will
|
||||
* contain "runs" of one or more adjacent fragments.
|
||||
@ -39,6 +41,7 @@ struct ipfrag_skb_cb {
|
||||
};
|
||||
struct sk_buff *next_frag;
|
||||
int frag_run_len;
|
||||
int ip_defrag_offset;
|
||||
};
|
||||
|
||||
#define FRAG_CB(skb) ((struct ipfrag_skb_cb *)((skb)->cb))
|
||||
@ -396,12 +399,12 @@ int inet_frag_queue_insert(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
*/
|
||||
if (!last)
|
||||
fragrun_create(q, skb); /* First fragment. */
|
||||
else if (last->ip_defrag_offset + last->len < end) {
|
||||
else if (FRAG_CB(last)->ip_defrag_offset + last->len < end) {
|
||||
/* This is the common case: skb goes to the end. */
|
||||
/* Detect and discard overlaps. */
|
||||
if (offset < last->ip_defrag_offset + last->len)
|
||||
if (offset < FRAG_CB(last)->ip_defrag_offset + last->len)
|
||||
return IPFRAG_OVERLAP;
|
||||
if (offset == last->ip_defrag_offset + last->len)
|
||||
if (offset == FRAG_CB(last)->ip_defrag_offset + last->len)
|
||||
fragrun_append_to_last(q, skb);
|
||||
else
|
||||
fragrun_create(q, skb);
|
||||
@ -418,13 +421,13 @@ int inet_frag_queue_insert(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
|
||||
parent = *rbn;
|
||||
curr = rb_to_skb(parent);
|
||||
curr_run_end = curr->ip_defrag_offset +
|
||||
curr_run_end = FRAG_CB(curr)->ip_defrag_offset +
|
||||
FRAG_CB(curr)->frag_run_len;
|
||||
if (end <= curr->ip_defrag_offset)
|
||||
if (end <= FRAG_CB(curr)->ip_defrag_offset)
|
||||
rbn = &parent->rb_left;
|
||||
else if (offset >= curr_run_end)
|
||||
rbn = &parent->rb_right;
|
||||
else if (offset >= curr->ip_defrag_offset &&
|
||||
else if (offset >= FRAG_CB(curr)->ip_defrag_offset &&
|
||||
end <= curr_run_end)
|
||||
return IPFRAG_DUP;
|
||||
else
|
||||
@ -438,7 +441,7 @@ int inet_frag_queue_insert(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
rb_insert_color(&skb->rbnode, &q->rb_fragments);
|
||||
}
|
||||
|
||||
skb->ip_defrag_offset = offset;
|
||||
FRAG_CB(skb)->ip_defrag_offset = offset;
|
||||
|
||||
return IPFRAG_OK;
|
||||
}
|
||||
@ -448,13 +451,28 @@ void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
struct sk_buff *parent)
|
||||
{
|
||||
struct sk_buff *fp, *head = skb_rb_first(&q->rb_fragments);
|
||||
struct sk_buff **nextp;
|
||||
void (*destructor)(struct sk_buff *);
|
||||
unsigned int orig_truesize = 0;
|
||||
struct sk_buff **nextp = NULL;
|
||||
struct sock *sk = skb->sk;
|
||||
int delta;
|
||||
|
||||
if (sk && is_skb_wmem(skb)) {
|
||||
/* TX: skb->sk might have been passed as argument to
|
||||
* dst->output and must remain valid until tx completes.
|
||||
*
|
||||
* Move sk to reassembled skb and fix up wmem accounting.
|
||||
*/
|
||||
orig_truesize = skb->truesize;
|
||||
destructor = skb->destructor;
|
||||
}
|
||||
|
||||
if (head != skb) {
|
||||
fp = skb_clone(skb, GFP_ATOMIC);
|
||||
if (!fp)
|
||||
return NULL;
|
||||
if (!fp) {
|
||||
head = skb;
|
||||
goto out_restore_sk;
|
||||
}
|
||||
FRAG_CB(fp)->next_frag = FRAG_CB(skb)->next_frag;
|
||||
if (RB_EMPTY_NODE(&skb->rbnode))
|
||||
FRAG_CB(parent)->next_frag = fp;
|
||||
@ -463,6 +481,12 @@ void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
&q->rb_fragments);
|
||||
if (q->fragments_tail == skb)
|
||||
q->fragments_tail = fp;
|
||||
|
||||
if (orig_truesize) {
|
||||
/* prevent skb_morph from releasing sk */
|
||||
skb->sk = NULL;
|
||||
skb->destructor = NULL;
|
||||
}
|
||||
skb_morph(skb, head);
|
||||
FRAG_CB(skb)->next_frag = FRAG_CB(head)->next_frag;
|
||||
rb_replace_node(&head->rbnode, &skb->rbnode,
|
||||
@ -470,13 +494,13 @@ void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
consume_skb(head);
|
||||
head = skb;
|
||||
}
|
||||
WARN_ON(head->ip_defrag_offset != 0);
|
||||
WARN_ON(FRAG_CB(head)->ip_defrag_offset != 0);
|
||||
|
||||
delta = -head->truesize;
|
||||
|
||||
/* Head of list must not be cloned. */
|
||||
if (skb_unclone(head, GFP_ATOMIC))
|
||||
return NULL;
|
||||
goto out_restore_sk;
|
||||
|
||||
delta += head->truesize;
|
||||
if (delta)
|
||||
@ -492,7 +516,7 @@ void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
|
||||
clone = alloc_skb(0, GFP_ATOMIC);
|
||||
if (!clone)
|
||||
return NULL;
|
||||
goto out_restore_sk;
|
||||
skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list;
|
||||
skb_frag_list_init(head);
|
||||
for (i = 0; i < skb_shinfo(head)->nr_frags; i++)
|
||||
@ -509,6 +533,21 @@ void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
|
||||
nextp = &skb_shinfo(head)->frag_list;
|
||||
}
|
||||
|
||||
out_restore_sk:
|
||||
if (orig_truesize) {
|
||||
int ts_delta = head->truesize - orig_truesize;
|
||||
|
||||
/* if this reassembled skb is fragmented later,
|
||||
* fraglist skbs will get skb->sk assigned from head->sk,
|
||||
* and each frag skb will be released via sock_wfree.
|
||||
*
|
||||
* Update sk_wmem_alloc.
|
||||
*/
|
||||
head->sk = sk;
|
||||
head->destructor = destructor;
|
||||
refcount_add(ts_delta, &sk->sk_wmem_alloc);
|
||||
}
|
||||
|
||||
return nextp;
|
||||
}
|
||||
EXPORT_SYMBOL(inet_frag_reasm_prepare);
|
||||
@ -516,6 +555,8 @@ EXPORT_SYMBOL(inet_frag_reasm_prepare);
|
||||
void inet_frag_reasm_finish(struct inet_frag_queue *q, struct sk_buff *head,
|
||||
void *reasm_data, bool try_coalesce)
|
||||
{
|
||||
struct sock *sk = is_skb_wmem(head) ? head->sk : NULL;
|
||||
const unsigned int head_truesize = head->truesize;
|
||||
struct sk_buff **nextp = reasm_data;
|
||||
struct rb_node *rbn;
|
||||
struct sk_buff *fp;
|
||||
@ -579,6 +620,9 @@ void inet_frag_reasm_finish(struct inet_frag_queue *q, struct sk_buff *head,
|
||||
head->prev = NULL;
|
||||
head->tstamp = q->stamp;
|
||||
head->mono_delivery_time = q->mono_delivery_time;
|
||||
|
||||
if (sk)
|
||||
refcount_add(sum_truesize - head_truesize, &sk->sk_wmem_alloc);
|
||||
}
|
||||
EXPORT_SYMBOL(inet_frag_reasm_finish);
|
||||
|
||||
|
@ -384,6 +384,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_orphan(skb);
|
||||
return -EINPROGRESS;
|
||||
|
||||
insert_error:
|
||||
@ -487,7 +488,6 @@ int ip_defrag(struct net *net, struct sk_buff *skb, u32 user)
|
||||
struct ipq *qp;
|
||||
|
||||
__IP_INC_STATS(net, IPSTATS_MIB_REASMREQDS);
|
||||
skb_orphan(skb);
|
||||
|
||||
/* Lookup (or create) queue header */
|
||||
qp = ip_find(net, ip_hdr(skb), user, vif);
|
||||
|
@ -329,6 +329,7 @@ config NFT_COMPAT_ARP
|
||||
config IP_NF_ARPFILTER
|
||||
tristate "arptables-legacy packet filtering support"
|
||||
select IP_NF_ARPTABLES
|
||||
select NETFILTER_FAMILY_ARP
|
||||
depends on NETFILTER_XTABLES
|
||||
help
|
||||
ARP packet filtering defines a table `filter', which has a series of
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -294,6 +294,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_orphan(skb);
|
||||
return -EINPROGRESS;
|
||||
|
||||
insert_error:
|
||||
@ -469,7 +470,6 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
|
||||
hdr = ipv6_hdr(skb);
|
||||
fhdr = (struct frag_hdr *)skb_transport_header(skb);
|
||||
|
||||
skb_orphan(skb);
|
||||
fq = fq_find(net, fhdr->identification, user, hdr,
|
||||
skb->dev ? skb->dev->ifindex : 0);
|
||||
if (fq == NULL) {
|
||||
|
@ -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)) {
|
||||
|
@ -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, \
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1200,6 +1200,25 @@ static void nf_tables_table_disable(struct net *net, struct nft_table *table)
|
||||
__NFT_TABLE_F_WAS_AWAKEN | \
|
||||
__NFT_TABLE_F_WAS_ORPHAN)
|
||||
|
||||
static bool nft_table_pending_update(const struct nft_ctx *ctx)
|
||||
{
|
||||
struct nftables_pernet *nft_net = nft_pernet(ctx->net);
|
||||
struct nft_trans *trans;
|
||||
|
||||
if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
|
||||
return true;
|
||||
|
||||
list_for_each_entry(trans, &nft_net->commit_list, list) {
|
||||
if ((trans->msg_type == NFT_MSG_NEWCHAIN ||
|
||||
trans->msg_type == NFT_MSG_DELCHAIN) &&
|
||||
trans->ctx.table == ctx->table &&
|
||||
nft_trans_chain_update(trans))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int nf_tables_updtable(struct nft_ctx *ctx)
|
||||
{
|
||||
struct nft_trans *trans;
|
||||
@ -1226,7 +1245,7 @@ static int nf_tables_updtable(struct nft_ctx *ctx)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* No dormant off/on/off/on games in single transaction */
|
||||
if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
|
||||
if (nft_table_pending_update(ctx))
|
||||
return -EINVAL;
|
||||
|
||||
trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE,
|
||||
@ -2631,6 +2650,13 @@ static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy,
|
||||
}
|
||||
}
|
||||
|
||||
if (table->flags & __NFT_TABLE_F_UPDATE &&
|
||||
!list_empty(&hook.list)) {
|
||||
NL_SET_BAD_ATTR(extack, attr);
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_hooks;
|
||||
}
|
||||
|
||||
if (!(table->flags & NFT_TABLE_F_DORMANT) &&
|
||||
nft_is_base_chain(chain) &&
|
||||
!list_empty(&hook.list)) {
|
||||
@ -2860,6 +2886,9 @@ static int nft_delchain_hook(struct nft_ctx *ctx,
|
||||
struct nft_trans *trans;
|
||||
int err;
|
||||
|
||||
if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = nft_chain_parse_hook(ctx->net, basechain, nla, &chain_hook,
|
||||
ctx->family, chain->flags, extack);
|
||||
if (err < 0)
|
||||
@ -2944,7 +2973,8 @@ static int nf_tables_delchain(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
|
||||
|
||||
if (nla[NFTA_CHAIN_HOOK]) {
|
||||
if (chain->flags & NFT_CHAIN_HW_OFFLOAD)
|
||||
if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYCHAIN ||
|
||||
chain->flags & NFT_CHAIN_HW_OFFLOAD)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (nft_is_base_chain(chain)) {
|
||||
@ -10182,9 +10212,11 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
|
||||
if (nft_trans_chain_update(trans)) {
|
||||
nf_tables_chain_notify(&trans->ctx, NFT_MSG_DELCHAIN,
|
||||
&nft_trans_chain_hooks(trans));
|
||||
nft_netdev_unregister_hooks(net,
|
||||
&nft_trans_chain_hooks(trans),
|
||||
true);
|
||||
if (!(trans->ctx.table->flags & NFT_TABLE_F_DORMANT)) {
|
||||
nft_netdev_unregister_hooks(net,
|
||||
&nft_trans_chain_hooks(trans),
|
||||
true);
|
||||
}
|
||||
} else {
|
||||
nft_chain_del(trans->ctx.chain);
|
||||
nf_tables_chain_notify(&trans->ctx, NFT_MSG_DELCHAIN,
|
||||
@ -10460,9 +10492,11 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
|
||||
break;
|
||||
case NFT_MSG_NEWCHAIN:
|
||||
if (nft_trans_chain_update(trans)) {
|
||||
nft_netdev_unregister_hooks(net,
|
||||
&nft_trans_chain_hooks(trans),
|
||||
true);
|
||||
if (!(trans->ctx.table->flags & NFT_TABLE_F_DORMANT)) {
|
||||
nft_netdev_unregister_hooks(net,
|
||||
&nft_trans_chain_hooks(trans),
|
||||
true);
|
||||
}
|
||||
free_percpu(nft_trans_chain_stats(trans));
|
||||
kfree(nft_trans_chain_name(trans));
|
||||
nft_trans_destroy(trans);
|
||||
|
@ -1516,6 +1516,11 @@ static void nci_rx_work(struct work_struct *work)
|
||||
nfc_send_to_raw_sock(ndev->nfc_dev, skb,
|
||||
RAW_PAYLOAD_NCI, NFC_DIRECTION_RX);
|
||||
|
||||
if (!nci_plen(skb->data)) {
|
||||
kfree_skb(skb);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Process frame */
|
||||
switch (nci_mt(skb->data)) {
|
||||
case NCI_MT_RSP_PKT:
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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'
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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)}"
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
|
@ -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"))
|
||||
|
@ -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); }
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
68
tools/testing/selftests/bpf/progs/verifier_arena_large.c
Normal file
68
tools/testing/selftests/bpf/progs/verifier_arena_large.c
Normal file
@ -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";
|
1
tools/testing/selftests/drivers/net/netdevsim/settings
Normal file
1
tools/testing/selftests/drivers/net/netdevsim/settings
Normal file
@ -0,0 +1 @@
|
||||
timeout=600
|
@ -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"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user