mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
Including fixes from wireless, bpf and netfilter.
Current release - regressions: - ipv6: bring NLM_DONE out to a separate recv() again Current release - new code bugs: - wifi: cfg80211: wext: set ssids=NULL for passive scans via old wext API Previous releases - regressions: - wifi: mac80211: fix monitor channel setting with chanctx emulation (probably most awaited of the fixes in this PR, tracked by Thorsten) - usb: ax88179_178a: bring back reset on init, if PHY is disconnected - bpf: fix UML x86_64 compile failure with BPF - bpf: avoid splat in pskb_pull_reason(), sanity check added can be hit with malicious BPF - eth: mvpp2: use slab_build_skb() for packets in slab, driver was missed during API refactoring - wifi: iwlwifi: add missing unlock of mvm mutex Previous releases - always broken: - ipv6: add a number of missing null-checks for in6_dev_get(), in case IPv6 disabling races with the datapath - bpf: fix reg_set_min_max corruption of fake_reg - sched: act_ct: add netns as part of the key of tcf_ct_flow_table Signed-off-by: Jakub Kicinski <kuba@kernel.org> -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE6jPA+I1ugmIBA4hXMUZtbf5SIrsFAmZ0VAAACgkQMUZtbf5S IrtMnQ//b0YNnC2PduSn6fDnDamyZW3vjqwXQ6K0DsgSzEIiAtEd6LbkPN4vAcpp k634dHseQjTuAcsTZxisIs32nC2up9q/t/+6XD8VSaQbSzKhB+rFDviUxfGJWjt4 MZRK0mDcmib2tXAEfYnMi+QjvC5S+ZSHLpemDdzTI3AyKcPynqLcM1PcC0CGS5GS 6MpvRAtEgTAkXd2rc4WAbOcmd8NLJN80f/srRDXFVqrXy8f6adaULvCvzSXSiQy8 peUaPhI6BYNBL2Tzjp3D+Nh54ks3Ol8MeqaGYsuJHtgd+/I+/YWzYc74an8BuEwR C6fszbH7i64WaQUI5ZhX/1Da0CTesNxzsPgeAFP3qEe20r53vN0NiFjRrHpO02El lew9Hrx27Zzt9k3eSdtC3GGj/S93PYjE5RRuSClQrW8fUqETZ8dFocbrNAraHGMv rDOqIT3XMg/BIBw9ADxizAgsrFC0QbBShQPs2iMuuVwmrWj9DEC0GKlt3KxyPT36 fl4w3gGRdIDz/ZTXKQZtta3Z4ckaKiTw8jbNXxteBDEHErFYYND+4XDzK/uIqHCe 0IoVWVUnhVfKOuGBIDGIFDsAvbgqTcVd+wZTB4SxZsbXISzpfYLcrM4qXf4YQNNb MeIQg0Zwjm+xdLGXVCt8wBBGmj4EK9uMa3wjYu3lGREgxyH42eI= =Lb9b -----END PGP SIGNATURE----- Merge tag 'net-6.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Jakub Kicinski: "Including fixes from wireless, bpf and netfilter. Happy summer solstice! The line count is a bit inflated by a selftest and update to a driver's FW interface header, in reality this is slightly below average for us. We are expecting one driver fix from Intel, but there are no big known issues. Current release - regressions: - ipv6: bring NLM_DONE out to a separate recv() again Current release - new code bugs: - wifi: cfg80211: wext: set ssids=NULL for passive scans via old wext API Previous releases - regressions: - wifi: mac80211: fix monitor channel setting with chanctx emulation (probably most awaited of the fixes in this PR, tracked by Thorsten) - usb: ax88179_178a: bring back reset on init, if PHY is disconnected - bpf: fix UML x86_64 compile failure with BPF - bpf: avoid splat in pskb_pull_reason(), sanity check added can be hit with malicious BPF - eth: mvpp2: use slab_build_skb() for packets in slab, driver was missed during API refactoring - wifi: iwlwifi: add missing unlock of mvm mutex Previous releases - always broken: - ipv6: add a number of missing null-checks for in6_dev_get(), in case IPv6 disabling races with the datapath - bpf: fix reg_set_min_max corruption of fake_reg - sched: act_ct: add netns as part of the key of tcf_ct_flow_table" * tag 'net-6.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (63 commits) net: usb: rtl8150 fix unintiatilzed variables in rtl8150_get_link_ksettings selftests: virtio_net: add forgotten config options bnxt_en: Restore PTP tx_avail count in case of skb_pad() error bnxt_en: Set TSO max segs on devices with limits bnxt_en: Update firmware interface to 1.10.3.44 net: stmmac: Assign configured channel value to EXTTS event net: do not leave a dangling sk pointer, when socket creation fails net/tcp_ao: Don't leak ao_info on error-path ice: Fix VSI list rule with ICE_SW_LKUP_LAST type ipv6: bring NLM_DONE out to a separate recv() again selftests: add selftest for the SRv6 End.DX6 behavior with netfilter selftests: add selftest for the SRv6 End.DX4 behavior with netfilter netfilter: move the sysctl nf_hooks_lwtunnel into the netfilter core seg6: fix parameter passing when calling NF_HOOK() in End.DX4 and End.DX6 behaviors netfilter: ipset: Fix suspicious rcu_dereference_protected() selftests: openvswitch: Set value to nla flags. octeontx2-pf: Fix linking objects into multiple modules octeontx2-pf: Add error handling to VLAN unoffload handling virtio_net: fixing XDP for fully checksummed packets handling virtio_net: checksum offloading handling fix ...
This commit is contained in:
commit
d5a7fc58da
1
.mailmap
1
.mailmap
@ -608,6 +608,7 @@ Simon Kelley <simon@thekelleys.org.uk>
|
||||
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
|
||||
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
|
||||
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
|
||||
Stanislav Fomichev <sdf@fomichev.me> <sdf@google.com>
|
||||
Stefan Wahren <wahrenst@gmx.net> <stefan.wahren@i2se.com>
|
||||
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
||||
Stephen Hemminger <stephen@networkplumber.org> <shemminger@linux-foundation.org>
|
||||
|
@ -3980,7 +3980,7 @@ R: Song Liu <song@kernel.org>
|
||||
R: Yonghong Song <yonghong.song@linux.dev>
|
||||
R: John Fastabend <john.fastabend@gmail.com>
|
||||
R: KP Singh <kpsingh@kernel.org>
|
||||
R: Stanislav Fomichev <sdf@google.com>
|
||||
R: Stanislav Fomichev <sdf@fomichev.me>
|
||||
R: Hao Luo <haoluo@google.com>
|
||||
R: Jiri Olsa <jolsa@kernel.org>
|
||||
L: bpf@vger.kernel.org
|
||||
|
@ -732,9 +732,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
tx_dma_error:
|
||||
if (BNXT_TX_PTP_IS_SET(lflags))
|
||||
atomic_inc(&bp->ptp_cfg->tx_avail);
|
||||
|
||||
last_frag = i;
|
||||
|
||||
/* start back at beginning and unmap skb */
|
||||
@ -756,6 +753,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
tx_free:
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_kick_pending:
|
||||
if (BNXT_TX_PTP_IS_SET(lflags))
|
||||
atomic_inc(&bp->ptp_cfg->tx_avail);
|
||||
if (txr->kick_pending)
|
||||
bnxt_txr_db_kick(bp, txr, txr->tx_prod);
|
||||
txr->tx_buf_ring[txr->tx_prod].skb = NULL;
|
||||
@ -8996,6 +8995,7 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
|
||||
memcpy(vf->mac_addr, resp->mac_address, ETH_ALEN);
|
||||
#endif
|
||||
}
|
||||
bp->tso_max_segs = le16_to_cpu(resp->max_tso_segs);
|
||||
|
||||
hwrm_func_qcaps_exit:
|
||||
hwrm_req_drop(bp, req);
|
||||
@ -15363,6 +15363,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
||||
if (bp->tso_max_segs)
|
||||
netif_set_tso_max_segs(dev, bp->tso_max_segs);
|
||||
|
||||
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||
NETDEV_XDP_ACT_RX_SG;
|
||||
|
@ -2318,6 +2318,7 @@ struct bnxt {
|
||||
u8 rss_hash_key_updated:1;
|
||||
|
||||
u16 max_mtu;
|
||||
u16 tso_max_segs;
|
||||
u8 max_tc;
|
||||
u8 max_lltc; /* lossless TCs */
|
||||
struct bnxt_queue_info q_info[BNXT_MAX_QUEUE];
|
||||
|
@ -2,7 +2,7 @@
|
||||
*
|
||||
* Copyright (c) 2014-2016 Broadcom Corporation
|
||||
* Copyright (c) 2014-2018 Broadcom Limited
|
||||
* Copyright (c) 2018-2023 Broadcom Inc.
|
||||
* Copyright (c) 2018-2024 Broadcom Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -500,7 +500,11 @@ struct cmd_nums {
|
||||
#define HWRM_TFC_IF_TBL_GET 0x399UL
|
||||
#define HWRM_TFC_TBL_SCOPE_CONFIG_GET 0x39aUL
|
||||
#define HWRM_TFC_RESC_USAGE_QUERY 0x39bUL
|
||||
#define HWRM_QUEUE_PFCWD_TIMEOUT_QCAPS 0x39cUL
|
||||
#define HWRM_QUEUE_PFCWD_TIMEOUT_CFG 0x39dUL
|
||||
#define HWRM_QUEUE_PFCWD_TIMEOUT_QCFG 0x39eUL
|
||||
#define HWRM_SV 0x400UL
|
||||
#define HWRM_DBG_LOG_BUFFER_FLUSH 0xff0fUL
|
||||
#define HWRM_DBG_READ_DIRECT 0xff10UL
|
||||
#define HWRM_DBG_READ_INDIRECT 0xff11UL
|
||||
#define HWRM_DBG_WRITE_DIRECT 0xff12UL
|
||||
@ -609,8 +613,8 @@ struct hwrm_err_output {
|
||||
#define HWRM_VERSION_MAJOR 1
|
||||
#define HWRM_VERSION_MINOR 10
|
||||
#define HWRM_VERSION_UPDATE 3
|
||||
#define HWRM_VERSION_RSVD 39
|
||||
#define HWRM_VERSION_STR "1.10.3.39"
|
||||
#define HWRM_VERSION_RSVD 44
|
||||
#define HWRM_VERSION_STR "1.10.3.44"
|
||||
|
||||
/* hwrm_ver_get_input (size:192b/24B) */
|
||||
struct hwrm_ver_get_input {
|
||||
@ -664,6 +668,7 @@ struct hwrm_ver_get_output {
|
||||
#define VER_GET_RESP_DEV_CAPS_CFG_CFA_TFLIB_SUPPORTED 0x2000UL
|
||||
#define VER_GET_RESP_DEV_CAPS_CFG_CFA_TRUFLOW_SUPPORTED 0x4000UL
|
||||
#define VER_GET_RESP_DEV_CAPS_CFG_SECURE_BOOT_CAPABLE 0x8000UL
|
||||
#define VER_GET_RESP_DEV_CAPS_CFG_SECURE_SOC_CAPABLE 0x10000UL
|
||||
u8 roce_fw_maj_8b;
|
||||
u8 roce_fw_min_8b;
|
||||
u8 roce_fw_bld_8b;
|
||||
@ -843,7 +848,9 @@ struct hwrm_async_event_cmpl {
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_HW_DOORBELL_RECOVERY_READ_ERROR 0x49UL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_CTX_ERROR 0x4aUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_UDCC_SESSION_CHANGE 0x4bUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_MAX_RGTR_EVENT_ID 0x4cUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_DBG_BUF_PRODUCER 0x4cUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_PEER_MMAP_CHANGE 0x4dUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_MAX_RGTR_EVENT_ID 0x4eUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_FW_TRACE_MSG 0xfeUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_HWRM_ERROR 0xffUL
|
||||
#define ASYNC_EVENT_CMPL_EVENT_ID_LAST ASYNC_EVENT_CMPL_EVENT_ID_HWRM_ERROR
|
||||
@ -1326,13 +1333,13 @@ struct hwrm_async_event_cmpl_error_report_base {
|
||||
u8 timestamp_lo;
|
||||
__le16 timestamp_hi;
|
||||
__le32 event_data1;
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_MASK 0xffUL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_SFT 0
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_RESERVED 0x0UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_PAUSE_STORM 0x1UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_INVALID_SIGNAL 0x2UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_NVM 0x3UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DOORBELL_DROP_THRESHOLD 0x4UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_MASK 0xffUL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_SFT 0
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_RESERVED 0x0UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_PAUSE_STORM 0x1UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_INVALID_SIGNAL 0x2UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_NVM 0x3UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DOORBELL_DROP_THRESHOLD 0x4UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_THERMAL_THRESHOLD 0x5UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DUAL_DATA_RATE_NOT_SUPPORTED 0x6UL
|
||||
#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_LAST ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DUAL_DATA_RATE_NOT_SUPPORTED
|
||||
@ -1814,6 +1821,9 @@ struct hwrm_func_qcaps_output {
|
||||
#define FUNC_QCAPS_RESP_FLAGS_EXT2_SW_MAX_RESOURCE_LIMITS_SUPPORTED 0x800000UL
|
||||
#define FUNC_QCAPS_RESP_FLAGS_EXT2_TF_INGRESS_NIC_FLOW_SUPPORTED 0x1000000UL
|
||||
#define FUNC_QCAPS_RESP_FLAGS_EXT2_LPBK_STATS_SUPPORTED 0x2000000UL
|
||||
#define FUNC_QCAPS_RESP_FLAGS_EXT2_TF_EGRESS_NIC_FLOW_SUPPORTED 0x4000000UL
|
||||
#define FUNC_QCAPS_RESP_FLAGS_EXT2_MULTI_LOSSLESS_QUEUES_SUPPORTED 0x8000000UL
|
||||
#define FUNC_QCAPS_RESP_FLAGS_EXT2_PEER_MMAP_SUPPORTED 0x10000000UL
|
||||
__le16 tunnel_disable_flag;
|
||||
#define FUNC_QCAPS_RESP_TUNNEL_DISABLE_FLAG_DISABLE_VXLAN 0x1UL
|
||||
#define FUNC_QCAPS_RESP_TUNNEL_DISABLE_FLAG_DISABLE_NGE 0x2UL
|
||||
@ -1828,7 +1838,7 @@ struct hwrm_func_qcaps_output {
|
||||
#define FUNC_QCAPS_RESP_XID_PARTITION_CAP_RX_CK 0x2UL
|
||||
u8 device_serial_number[8];
|
||||
__le16 ctxs_per_partition;
|
||||
u8 unused_2[2];
|
||||
__le16 max_tso_segs;
|
||||
__le32 roce_vf_max_av;
|
||||
__le32 roce_vf_max_cq;
|
||||
__le32 roce_vf_max_mrw;
|
||||
@ -2449,6 +2459,7 @@ struct hwrm_func_drv_rgtr_input {
|
||||
#define FUNC_DRV_RGTR_REQ_FLAGS_NPAR_1_2_SUPPORT 0x200UL
|
||||
#define FUNC_DRV_RGTR_REQ_FLAGS_ASYM_QUEUE_CFG_SUPPORT 0x400UL
|
||||
#define FUNC_DRV_RGTR_REQ_FLAGS_TF_INGRESS_NIC_FLOW_MODE 0x800UL
|
||||
#define FUNC_DRV_RGTR_REQ_FLAGS_TF_EGRESS_NIC_FLOW_MODE 0x1000UL
|
||||
__le32 enables;
|
||||
#define FUNC_DRV_RGTR_REQ_ENABLES_OS_TYPE 0x1UL
|
||||
#define FUNC_DRV_RGTR_REQ_ENABLES_VER 0x2UL
|
||||
@ -3660,22 +3671,24 @@ struct hwrm_func_backing_store_cfg_v2_input {
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
__le16 type;
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SQ_DB_SHADOW 0x16UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_RQ_DB_SHADOW 0x17UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SRQ_DB_SHADOW 0x18UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_CQ_DB_SHADOW 0x19UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_TX_CK 0x13UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_RX_CK 0x14UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SQ_DB_SHADOW 0x16UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_RQ_DB_SHADOW 0x17UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SRQ_DB_SHADOW 0x18UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_CQ_DB_SHADOW 0x19UL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SRT_TRACE 0x1eUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_SRT2_TRACE 0x1fUL
|
||||
#define FUNC_BACKING_STORE_CFG_V2_REQ_TYPE_CRT_TRACE 0x20UL
|
||||
@ -3772,18 +3785,20 @@ struct hwrm_func_backing_store_qcfg_v2_output {
|
||||
__le16 seq_id;
|
||||
__le16 resp_len;
|
||||
__le16 type;
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_TX_CK 0x13UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_RX_CK 0x14UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_SRT_TRACE 0x1eUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_SRT2_TRACE 0x1fUL
|
||||
#define FUNC_BACKING_STORE_QCFG_V2_RESP_TYPE_CRT_TRACE 0x20UL
|
||||
@ -3876,22 +3891,24 @@ struct hwrm_func_backing_store_qcaps_v2_input {
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
__le16 type;
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SQ_DB_SHADOW 0x16UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RQ_DB_SHADOW 0x17UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRQ_DB_SHADOW 0x18UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CQ_DB_SHADOW 0x19UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TX_CK 0x13UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RX_CK 0x14UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SQ_DB_SHADOW 0x16UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RQ_DB_SHADOW 0x17UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRQ_DB_SHADOW 0x18UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CQ_DB_SHADOW 0x19UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRT_TRACE 0x1eUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRT2_TRACE 0x1fUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CRT_TRACE 0x20UL
|
||||
@ -3911,22 +3928,24 @@ struct hwrm_func_backing_store_qcaps_v2_output {
|
||||
__le16 seq_id;
|
||||
__le16 resp_len;
|
||||
__le16 type;
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SQ_DB_SHADOW 0x16UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_RQ_DB_SHADOW 0x17UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SRQ_DB_SHADOW 0x18UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_CQ_DB_SHADOW 0x19UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_QP 0x0UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SRQ 0x1UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_CQ 0x2UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_VNIC 0x3UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_STAT 0x4UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SP_TQM_RING 0x5UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_FP_TQM_RING 0x6UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_MRAV 0xeUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_TIM 0xfUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_TX_CK 0x13UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_RX_CK 0x14UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_MP_TQM_RING 0x15UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SQ_DB_SHADOW 0x16UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_RQ_DB_SHADOW 0x17UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SRQ_DB_SHADOW 0x18UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_CQ_DB_SHADOW 0x19UL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_TBL_SCOPE 0x1cUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_XID_PARTITION 0x1dUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SRT_TRACE 0x1eUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_SRT2_TRACE 0x1fUL
|
||||
#define FUNC_BACKING_STORE_QCAPS_V2_RESP_TYPE_CRT_TRACE 0x20UL
|
||||
@ -4202,7 +4221,8 @@ struct hwrm_port_phy_cfg_input {
|
||||
#define PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_100GB_PAM4_112 0x3eaUL
|
||||
#define PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_200GB_PAM4_112 0x7d2UL
|
||||
#define PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_400GB_PAM4_112 0xfa2UL
|
||||
#define PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_LAST PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_400GB_PAM4_112
|
||||
#define PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_800GB_PAM4_112 0x1f42UL
|
||||
#define PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_LAST PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_800GB_PAM4_112
|
||||
__le16 auto_link_speeds2_mask;
|
||||
#define PORT_PHY_CFG_REQ_AUTO_LINK_SPEEDS2_MASK_1GB 0x1UL
|
||||
#define PORT_PHY_CFG_REQ_AUTO_LINK_SPEEDS2_MASK_10GB 0x2UL
|
||||
@ -4217,6 +4237,7 @@ struct hwrm_port_phy_cfg_input {
|
||||
#define PORT_PHY_CFG_REQ_AUTO_LINK_SPEEDS2_MASK_100GB_PAM4_112 0x400UL
|
||||
#define PORT_PHY_CFG_REQ_AUTO_LINK_SPEEDS2_MASK_200GB_PAM4_112 0x800UL
|
||||
#define PORT_PHY_CFG_REQ_AUTO_LINK_SPEEDS2_MASK_400GB_PAM4_112 0x1000UL
|
||||
#define PORT_PHY_CFG_REQ_AUTO_LINK_SPEEDS2_MASK_800GB_PAM4_112 0x2000UL
|
||||
u8 unused_2[6];
|
||||
};
|
||||
|
||||
@ -4292,6 +4313,7 @@ struct hwrm_port_phy_qcfg_output {
|
||||
#define PORT_PHY_QCFG_RESP_LINK_SPEED_100GB 0x3e8UL
|
||||
#define PORT_PHY_QCFG_RESP_LINK_SPEED_200GB 0x7d0UL
|
||||
#define PORT_PHY_QCFG_RESP_LINK_SPEED_400GB 0xfa0UL
|
||||
#define PORT_PHY_QCFG_RESP_LINK_SPEED_800GB 0x1f40UL
|
||||
#define PORT_PHY_QCFG_RESP_LINK_SPEED_10MB 0xffffUL
|
||||
#define PORT_PHY_QCFG_RESP_LINK_SPEED_LAST PORT_PHY_QCFG_RESP_LINK_SPEED_10MB
|
||||
u8 duplex_cfg;
|
||||
@ -4451,7 +4473,13 @@ struct hwrm_port_phy_qcfg_output {
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASESR4 0x35UL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASELR4 0x36UL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASEER4 0x37UL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_LAST PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASEER4
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASECR8 0x38UL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASESR8 0x39UL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASELR8 0x3aUL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASEER8 0x3bUL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASEFR8 0x3cUL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASEDR8 0x3dUL
|
||||
#define PORT_PHY_QCFG_RESP_PHY_TYPE_LAST PORT_PHY_QCFG_RESP_PHY_TYPE_800G_BASEDR8
|
||||
u8 media_type;
|
||||
#define PORT_PHY_QCFG_RESP_MEDIA_TYPE_UNKNOWN 0x0UL
|
||||
#define PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP 0x1UL
|
||||
@ -5049,33 +5077,43 @@ struct hwrm_port_qstats_ext_output {
|
||||
u8 valid;
|
||||
};
|
||||
|
||||
/* hwrm_port_lpbk_qstats_input (size:128b/16B) */
|
||||
/* hwrm_port_lpbk_qstats_input (size:256b/32B) */
|
||||
struct hwrm_port_lpbk_qstats_input {
|
||||
__le16 req_type;
|
||||
__le16 cmpl_ring;
|
||||
__le16 seq_id;
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
__le16 lpbk_stat_size;
|
||||
u8 flags;
|
||||
#define PORT_LPBK_QSTATS_REQ_FLAGS_COUNTER_MASK 0x1UL
|
||||
u8 unused_0[5];
|
||||
__le64 lpbk_stat_host_addr;
|
||||
};
|
||||
|
||||
/* hwrm_port_lpbk_qstats_output (size:768b/96B) */
|
||||
/* hwrm_port_lpbk_qstats_output (size:128b/16B) */
|
||||
struct hwrm_port_lpbk_qstats_output {
|
||||
__le16 error_code;
|
||||
__le16 req_type;
|
||||
__le16 seq_id;
|
||||
__le16 resp_len;
|
||||
__le16 lpbk_stat_size;
|
||||
u8 unused_0[5];
|
||||
u8 valid;
|
||||
};
|
||||
|
||||
/* port_lpbk_stats (size:640b/80B) */
|
||||
struct port_lpbk_stats {
|
||||
__le64 lpbk_ucast_frames;
|
||||
__le64 lpbk_mcast_frames;
|
||||
__le64 lpbk_bcast_frames;
|
||||
__le64 lpbk_ucast_bytes;
|
||||
__le64 lpbk_mcast_bytes;
|
||||
__le64 lpbk_bcast_bytes;
|
||||
__le64 tx_stat_discard;
|
||||
__le64 tx_stat_error;
|
||||
__le64 rx_stat_discard;
|
||||
__le64 rx_stat_error;
|
||||
u8 unused_0[7];
|
||||
u8 valid;
|
||||
__le64 lpbk_tx_discards;
|
||||
__le64 lpbk_tx_errors;
|
||||
__le64 lpbk_rx_discards;
|
||||
__le64 lpbk_rx_errors;
|
||||
};
|
||||
|
||||
/* hwrm_port_ecn_qstats_input (size:256b/32B) */
|
||||
@ -5140,13 +5178,15 @@ struct hwrm_port_clr_stats_output {
|
||||
u8 valid;
|
||||
};
|
||||
|
||||
/* hwrm_port_lpbk_clr_stats_input (size:128b/16B) */
|
||||
/* hwrm_port_lpbk_clr_stats_input (size:192b/24B) */
|
||||
struct hwrm_port_lpbk_clr_stats_input {
|
||||
__le16 req_type;
|
||||
__le16 cmpl_ring;
|
||||
__le16 seq_id;
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
__le16 port_id;
|
||||
u8 unused_0[6];
|
||||
};
|
||||
|
||||
/* hwrm_port_lpbk_clr_stats_output (size:128b/16B) */
|
||||
@ -5287,10 +5327,11 @@ struct hwrm_port_phy_qcaps_output {
|
||||
#define PORT_PHY_QCAPS_RESP_SUPPORTED_PAM4_SPEEDS_FORCE_MODE_100G 0x2UL
|
||||
#define PORT_PHY_QCAPS_RESP_SUPPORTED_PAM4_SPEEDS_FORCE_MODE_200G 0x4UL
|
||||
__le16 flags2;
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_PAUSE_UNSUPPORTED 0x1UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_PFC_UNSUPPORTED 0x2UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_BANK_ADDR_SUPPORTED 0x4UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_SPEEDS2_SUPPORTED 0x8UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_PAUSE_UNSUPPORTED 0x1UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_PFC_UNSUPPORTED 0x2UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_BANK_ADDR_SUPPORTED 0x4UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_SPEEDS2_SUPPORTED 0x8UL
|
||||
#define PORT_PHY_QCAPS_RESP_FLAGS2_REMOTE_LPBK_UNSUPPORTED 0x10UL
|
||||
u8 internal_port_cnt;
|
||||
u8 unused_0;
|
||||
__le16 supported_speeds2_force_mode;
|
||||
@ -7443,17 +7484,17 @@ struct hwrm_cfa_l2_filter_cfg_input {
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
__le32 flags;
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH 0x1UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_TX 0x0UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_RX 0x1UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_LAST CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_RX
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_DROP 0x2UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_MASK 0xcUL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_SFT 2
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_NO_ROCE_L2 (0x0UL << 2)
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_L2 (0x1UL << 2)
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_ROCE (0x2UL << 2)
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_LAST CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_ROCE
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH 0x1UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_TX 0x0UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_RX 0x1UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_LAST CFA_L2_FILTER_CFG_REQ_FLAGS_PATH_RX
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_DROP 0x2UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_MASK 0xcUL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_SFT 2
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_NO_ROCE_L2 (0x0UL << 2)
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_L2 (0x1UL << 2)
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_ROCE (0x2UL << 2)
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_LAST CFA_L2_FILTER_CFG_REQ_FLAGS_TRAFFIC_ROCE
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_REMAP_OP_MASK 0x30UL
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_REMAP_OP_SFT 4
|
||||
#define CFA_L2_FILTER_CFG_REQ_FLAGS_REMAP_OP_NO_UPDATE (0x0UL << 4)
|
||||
@ -8520,17 +8561,17 @@ struct hwrm_tunnel_dst_port_query_input {
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
u8 tunnel_type;
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN 0x1UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_GENEVE 0x5UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN_V4 0x9UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_IPGRE_V1 0xaUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_L2_ETYPE 0xbUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN_GPE_V6 0xcUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_CUSTOM_GRE 0xdUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_ECPRI 0xeUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_SRV6 0xfUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN_GPE 0x10UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_GRE 0x11UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN 0x1UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_GENEVE 0x5UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN_V4 0x9UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_IPGRE_V1 0xaUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_L2_ETYPE 0xbUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN_GPE_V6 0xcUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_CUSTOM_GRE 0xdUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_ECPRI 0xeUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_SRV6 0xfUL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_VXLAN_GPE 0x10UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_GRE 0x11UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_ULP_DYN_UPAR 0x12UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_ULP_DYN_UPAR_RES01 0x13UL
|
||||
#define TUNNEL_DST_PORT_QUERY_REQ_TUNNEL_TYPE_ULP_DYN_UPAR_RES02 0x14UL
|
||||
@ -8576,17 +8617,17 @@ struct hwrm_tunnel_dst_port_alloc_input {
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
u8 tunnel_type;
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN 0x1UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE 0x5UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_V4 0x9UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_IPGRE_V1 0xaUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_L2_ETYPE 0xbUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_GPE_V6 0xcUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_CUSTOM_GRE 0xdUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_ECPRI 0xeUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_SRV6 0xfUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_GPE 0x10UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GRE 0x11UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN 0x1UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE 0x5UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_V4 0x9UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_IPGRE_V1 0xaUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_L2_ETYPE 0xbUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_GPE_V6 0xcUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_CUSTOM_GRE 0xdUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_ECPRI 0xeUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_SRV6 0xfUL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_GPE 0x10UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GRE 0x11UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_ULP_DYN_UPAR 0x12UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_ULP_DYN_UPAR_RES01 0x13UL
|
||||
#define TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_ULP_DYN_UPAR_RES02 0x14UL
|
||||
@ -8635,17 +8676,17 @@ struct hwrm_tunnel_dst_port_free_input {
|
||||
__le16 target_id;
|
||||
__le64 resp_addr;
|
||||
u8 tunnel_type;
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN 0x1UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE 0x5UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_V4 0x9UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_IPGRE_V1 0xaUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_L2_ETYPE 0xbUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_GPE_V6 0xcUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_CUSTOM_GRE 0xdUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_ECPRI 0xeUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_SRV6 0xfUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_GPE 0x10UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GRE 0x11UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN 0x1UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE 0x5UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_V4 0x9UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_IPGRE_V1 0xaUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_L2_ETYPE 0xbUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_GPE_V6 0xcUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_CUSTOM_GRE 0xdUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_ECPRI 0xeUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_SRV6 0xfUL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_GPE 0x10UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GRE 0x11UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_ULP_DYN_UPAR 0x12UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_ULP_DYN_UPAR_RES01 0x13UL
|
||||
#define TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_ULP_DYN_UPAR_RES02 0x14UL
|
||||
@ -9109,6 +9150,7 @@ struct hwrm_struct_hdr {
|
||||
#define STRUCT_HDR_STRUCT_ID_LLDP_GENERIC 0x424UL
|
||||
#define STRUCT_HDR_STRUCT_ID_LLDP_DEVICE 0x426UL
|
||||
#define STRUCT_HDR_STRUCT_ID_POWER_BKUP 0x427UL
|
||||
#define STRUCT_HDR_STRUCT_ID_PEER_MMAP 0x429UL
|
||||
#define STRUCT_HDR_STRUCT_ID_AFM_OPAQUE 0x1UL
|
||||
#define STRUCT_HDR_STRUCT_ID_PORT_DESCRIPTION 0xaUL
|
||||
#define STRUCT_HDR_STRUCT_ID_RSS_V2 0x64UL
|
||||
@ -9758,6 +9800,9 @@ struct hwrm_dbg_coredump_initiate_input {
|
||||
__le16 instance;
|
||||
__le16 unused_0;
|
||||
u8 seg_flags;
|
||||
#define DBG_COREDUMP_INITIATE_REQ_SEG_FLAGS_LIVE_DATA 0x1UL
|
||||
#define DBG_COREDUMP_INITIATE_REQ_SEG_FLAGS_CRASH_DATA 0x2UL
|
||||
#define DBG_COREDUMP_INITIATE_REQ_SEG_FLAGS_COLLECT_CTX_L1_CACHE 0x4UL
|
||||
u8 unused_1[7];
|
||||
};
|
||||
|
||||
@ -10433,13 +10478,13 @@ struct hwrm_selftest_irq_output {
|
||||
|
||||
/* dbc_dbc (size:64b/8B) */
|
||||
struct dbc_dbc {
|
||||
u32 index;
|
||||
__le32 index;
|
||||
#define DBC_DBC_INDEX_MASK 0xffffffUL
|
||||
#define DBC_DBC_INDEX_SFT 0
|
||||
#define DBC_DBC_EPOCH 0x1000000UL
|
||||
#define DBC_DBC_TOGGLE_MASK 0x6000000UL
|
||||
#define DBC_DBC_TOGGLE_SFT 25
|
||||
u32 type_path_xid;
|
||||
__le32 type_path_xid;
|
||||
#define DBC_DBC_XID_MASK 0xfffffUL
|
||||
#define DBC_DBC_XID_SFT 0
|
||||
#define DBC_DBC_PATH_MASK 0x3000000UL
|
||||
|
@ -1339,6 +1339,7 @@ ice_dwnld_cfg_bufs_no_lock(struct ice_hw *hw, struct ice_buf *bufs, u32 start,
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
bool last = false;
|
||||
int try_cnt = 0;
|
||||
int status;
|
||||
|
||||
bh = (struct ice_buf_hdr *)(bufs + start + i);
|
||||
@ -1346,8 +1347,26 @@ ice_dwnld_cfg_bufs_no_lock(struct ice_hw *hw, struct ice_buf *bufs, u32 start,
|
||||
if (indicate_last)
|
||||
last = ice_is_last_download_buffer(bh, i, count);
|
||||
|
||||
status = ice_aq_download_pkg(hw, bh, ICE_PKG_BUF_SIZE, last,
|
||||
&offset, &info, NULL);
|
||||
while (1) {
|
||||
status = ice_aq_download_pkg(hw, bh, ICE_PKG_BUF_SIZE,
|
||||
last, &offset, &info,
|
||||
NULL);
|
||||
if (hw->adminq.sq_last_status != ICE_AQ_RC_ENOSEC &&
|
||||
hw->adminq.sq_last_status != ICE_AQ_RC_EBADSIG)
|
||||
break;
|
||||
|
||||
try_cnt++;
|
||||
|
||||
if (try_cnt == 5)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
if (try_cnt)
|
||||
dev_dbg(ice_hw_to_dev(hw),
|
||||
"ice_aq_download_pkg number of retries: %d\n",
|
||||
try_cnt);
|
||||
|
||||
/* Save AQ status from download package */
|
||||
if (status) {
|
||||
|
@ -805,6 +805,9 @@ void ice_print_link_msg(struct ice_vsi *vsi, bool isup)
|
||||
}
|
||||
|
||||
switch (vsi->port_info->phy.link_info.link_speed) {
|
||||
case ICE_AQ_LINK_SPEED_200GB:
|
||||
speed = "200 G";
|
||||
break;
|
||||
case ICE_AQ_LINK_SPEED_100GB:
|
||||
speed = "100 G";
|
||||
break;
|
||||
@ -5564,7 +5567,7 @@ static int ice_suspend(struct device *dev)
|
||||
*/
|
||||
disabled = ice_service_task_stop(pf);
|
||||
|
||||
ice_unplug_aux_dev(pf);
|
||||
ice_deinit_rdma(pf);
|
||||
|
||||
/* Already suspended?, then there is nothing to do */
|
||||
if (test_and_set_bit(ICE_SUSPENDED, pf->state)) {
|
||||
@ -5644,6 +5647,11 @@ static int ice_resume(struct device *dev)
|
||||
if (ret)
|
||||
dev_err(dev, "Cannot restore interrupt scheme: %d\n", ret);
|
||||
|
||||
ret = ice_init_rdma(pf);
|
||||
if (ret)
|
||||
dev_err(dev, "Reinitialize RDMA during resume failed: %d\n",
|
||||
ret);
|
||||
|
||||
clear_bit(ICE_DOWN, pf->state);
|
||||
/* Now perform PF reset and rebuild */
|
||||
reset_type = ICE_RESET_PFR;
|
||||
|
@ -1899,7 +1899,8 @@ ice_aq_alloc_free_vsi_list(struct ice_hw *hw, u16 *vsi_list_id,
|
||||
lkup_type == ICE_SW_LKUP_ETHERTYPE_MAC ||
|
||||
lkup_type == ICE_SW_LKUP_PROMISC ||
|
||||
lkup_type == ICE_SW_LKUP_PROMISC_VLAN ||
|
||||
lkup_type == ICE_SW_LKUP_DFLT) {
|
||||
lkup_type == ICE_SW_LKUP_DFLT ||
|
||||
lkup_type == ICE_SW_LKUP_LAST) {
|
||||
sw_buf->res_type = cpu_to_le16(ICE_AQC_RES_TYPE_VSI_LIST_REP);
|
||||
} else if (lkup_type == ICE_SW_LKUP_VLAN) {
|
||||
if (opc == ice_aqc_opc_alloc_res)
|
||||
@ -2922,7 +2923,8 @@ ice_update_vsi_list_rule(struct ice_hw *hw, u16 *vsi_handle_arr, u16 num_vsi,
|
||||
lkup_type == ICE_SW_LKUP_ETHERTYPE_MAC ||
|
||||
lkup_type == ICE_SW_LKUP_PROMISC ||
|
||||
lkup_type == ICE_SW_LKUP_PROMISC_VLAN ||
|
||||
lkup_type == ICE_SW_LKUP_DFLT)
|
||||
lkup_type == ICE_SW_LKUP_DFLT ||
|
||||
lkup_type == ICE_SW_LKUP_LAST)
|
||||
rule_type = remove ? ICE_AQC_SW_RULES_T_VSI_LIST_CLEAR :
|
||||
ICE_AQC_SW_RULES_T_VSI_LIST_SET;
|
||||
else if (lkup_type == ICE_SW_LKUP_VLAN)
|
||||
|
@ -4014,7 +4014,10 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
|
||||
}
|
||||
}
|
||||
|
||||
skb = build_skb(data, frag_size);
|
||||
if (frag_size)
|
||||
skb = build_skb(data, frag_size);
|
||||
else
|
||||
skb = slab_build_skb(data);
|
||||
if (!skb) {
|
||||
netdev_warn(port->dev, "skb build failed\n");
|
||||
goto err_drop_frame;
|
||||
|
@ -9,10 +9,9 @@ obj-$(CONFIG_OCTEONTX2_VF) += rvu_nicvf.o otx2_ptp.o
|
||||
rvu_nicpf-y := otx2_pf.o otx2_common.o otx2_txrx.o otx2_ethtool.o \
|
||||
otx2_flows.o otx2_tc.o cn10k.o otx2_dmac_flt.o \
|
||||
otx2_devlink.o qos_sq.o qos.o
|
||||
rvu_nicvf-y := otx2_vf.o otx2_devlink.o
|
||||
rvu_nicvf-y := otx2_vf.o
|
||||
|
||||
rvu_nicpf-$(CONFIG_DCB) += otx2_dcbnl.o
|
||||
rvu_nicvf-$(CONFIG_DCB) += otx2_dcbnl.o
|
||||
rvu_nicpf-$(CONFIG_MACSEC) += cn10k_macsec.o
|
||||
|
||||
ccflags-y += -I$(srctree)/drivers/net/ethernet/marvell/octeontx2/af
|
||||
|
@ -54,6 +54,7 @@ int otx2_pfc_txschq_config(struct otx2_nic *pfvf)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_pfc_txschq_config);
|
||||
|
||||
static int otx2_pfc_txschq_alloc_one(struct otx2_nic *pfvf, u8 prio)
|
||||
{
|
||||
@ -122,6 +123,7 @@ int otx2_pfc_txschq_alloc(struct otx2_nic *pfvf)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_pfc_txschq_alloc);
|
||||
|
||||
static int otx2_pfc_txschq_stop_one(struct otx2_nic *pfvf, u8 prio)
|
||||
{
|
||||
@ -260,6 +262,7 @@ int otx2_pfc_txschq_update(struct otx2_nic *pfvf)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_pfc_txschq_update);
|
||||
|
||||
int otx2_pfc_txschq_stop(struct otx2_nic *pfvf)
|
||||
{
|
||||
@ -282,6 +285,7 @@ int otx2_pfc_txschq_stop(struct otx2_nic *pfvf)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_pfc_txschq_stop);
|
||||
|
||||
int otx2_config_priority_flow_ctrl(struct otx2_nic *pfvf)
|
||||
{
|
||||
@ -321,6 +325,7 @@ int otx2_config_priority_flow_ctrl(struct otx2_nic *pfvf)
|
||||
mutex_unlock(&pfvf->mbox.lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_config_priority_flow_ctrl);
|
||||
|
||||
void otx2_update_bpid_in_rqctx(struct otx2_nic *pfvf, int vlan_prio, int qidx,
|
||||
bool pfc_enable)
|
||||
@ -385,6 +390,7 @@ void otx2_update_bpid_in_rqctx(struct otx2_nic *pfvf, int vlan_prio, int qidx,
|
||||
"Updating BPIDs in CQ and Aura contexts of RQ%d failed with err %d\n",
|
||||
qidx, err);
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_update_bpid_in_rqctx);
|
||||
|
||||
static int otx2_dcbnl_ieee_getpfc(struct net_device *dev, struct ieee_pfc *pfc)
|
||||
{
|
||||
@ -472,3 +478,4 @@ int otx2_dcbnl_set_ops(struct net_device *dev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_dcbnl_set_ops);
|
||||
|
@ -113,6 +113,7 @@ int otx2_register_dl(struct otx2_nic *pfvf)
|
||||
devlink_free(dl);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_register_dl);
|
||||
|
||||
void otx2_unregister_dl(struct otx2_nic *pfvf)
|
||||
{
|
||||
@ -124,3 +125,4 @@ void otx2_unregister_dl(struct otx2_nic *pfvf)
|
||||
ARRAY_SIZE(otx2_dl_params));
|
||||
devlink_free(dl);
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_unregister_dl);
|
||||
|
@ -1174,8 +1174,11 @@ bool otx2_sq_append_skb(struct net_device *netdev, struct otx2_snd_queue *sq,
|
||||
|
||||
if (skb_shinfo(skb)->gso_size && !is_hw_tso_supported(pfvf, skb)) {
|
||||
/* Insert vlan tag before giving pkt to tso */
|
||||
if (skb_vlan_tag_present(skb))
|
||||
if (skb_vlan_tag_present(skb)) {
|
||||
skb = __vlan_hwaccel_push_inside(skb);
|
||||
if (!skb)
|
||||
return true;
|
||||
}
|
||||
otx2_sq_append_tso(pfvf, sq, skb, qidx);
|
||||
return true;
|
||||
}
|
||||
|
@ -1127,8 +1127,12 @@ static void lan743x_ethtool_get_wol(struct net_device *netdev,
|
||||
if (netdev->phydev)
|
||||
phy_ethtool_get_wol(netdev->phydev, wol);
|
||||
|
||||
wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST |
|
||||
WAKE_MAGIC | WAKE_PHY | WAKE_ARP;
|
||||
if (wol->supported != adapter->phy_wol_supported)
|
||||
netif_warn(adapter, drv, adapter->netdev,
|
||||
"PHY changed its supported WOL! old=%x, new=%x\n",
|
||||
adapter->phy_wol_supported, wol->supported);
|
||||
|
||||
wol->supported |= MAC_SUPPORTED_WAKES;
|
||||
|
||||
if (adapter->is_pci11x1x)
|
||||
wol->supported |= WAKE_MAGICSECURE;
|
||||
@ -1143,7 +1147,39 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev,
|
||||
{
|
||||
struct lan743x_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
/* WAKE_MAGICSEGURE is a modifier of and only valid together with
|
||||
* WAKE_MAGIC
|
||||
*/
|
||||
if ((wol->wolopts & WAKE_MAGICSECURE) && !(wol->wolopts & WAKE_MAGIC))
|
||||
return -EINVAL;
|
||||
|
||||
if (netdev->phydev) {
|
||||
struct ethtool_wolinfo phy_wol;
|
||||
int ret;
|
||||
|
||||
phy_wol.wolopts = wol->wolopts & adapter->phy_wol_supported;
|
||||
|
||||
/* If WAKE_MAGICSECURE was requested, filter out WAKE_MAGIC
|
||||
* for PHYs that do not support WAKE_MAGICSECURE
|
||||
*/
|
||||
if (wol->wolopts & WAKE_MAGICSECURE &&
|
||||
!(adapter->phy_wol_supported & WAKE_MAGICSECURE))
|
||||
phy_wol.wolopts &= ~WAKE_MAGIC;
|
||||
|
||||
ret = phy_ethtool_set_wol(netdev->phydev, &phy_wol);
|
||||
if (ret && (ret != -EOPNOTSUPP))
|
||||
return ret;
|
||||
|
||||
if (ret == -EOPNOTSUPP)
|
||||
adapter->phy_wolopts = 0;
|
||||
else
|
||||
adapter->phy_wolopts = phy_wol.wolopts;
|
||||
} else {
|
||||
adapter->phy_wolopts = 0;
|
||||
}
|
||||
|
||||
adapter->wolopts = 0;
|
||||
wol->wolopts &= ~adapter->phy_wolopts;
|
||||
if (wol->wolopts & WAKE_UCAST)
|
||||
adapter->wolopts |= WAKE_UCAST;
|
||||
if (wol->wolopts & WAKE_MCAST)
|
||||
@ -1164,10 +1200,10 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev,
|
||||
memset(adapter->sopass, 0, sizeof(u8) * SOPASS_MAX);
|
||||
}
|
||||
|
||||
wol->wolopts = adapter->wolopts | adapter->phy_wolopts;
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, (bool)wol->wolopts);
|
||||
|
||||
return netdev->phydev ? phy_ethtool_set_wol(netdev->phydev, wol)
|
||||
: -ENETDOWN;
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
|
@ -3118,6 +3118,17 @@ static int lan743x_netdev_open(struct net_device *netdev)
|
||||
if (ret)
|
||||
goto close_tx;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
if (adapter->netdev->phydev) {
|
||||
struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
|
||||
|
||||
phy_ethtool_get_wol(netdev->phydev, &wol);
|
||||
adapter->phy_wol_supported = wol.supported;
|
||||
adapter->phy_wolopts = wol.wolopts;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
close_tx:
|
||||
@ -3575,7 +3586,7 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter)
|
||||
|
||||
/* clear wake settings */
|
||||
pmtctl = lan743x_csr_read(adapter, PMT_CTL);
|
||||
pmtctl |= PMT_CTL_WUPS_MASK_;
|
||||
pmtctl |= PMT_CTL_WUPS_MASK_ | PMT_CTL_RES_CLR_WKP_MASK_;
|
||||
pmtctl &= ~(PMT_CTL_GPIO_WAKEUP_EN_ | PMT_CTL_EEE_WAKEUP_EN_ |
|
||||
PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_ |
|
||||
PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_ | PMT_CTL_ETH_PHY_WAKE_EN_);
|
||||
@ -3587,10 +3598,9 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter)
|
||||
|
||||
pmtctl |= PMT_CTL_ETH_PHY_D3_COLD_OVR_ | PMT_CTL_ETH_PHY_D3_OVR_;
|
||||
|
||||
if (adapter->wolopts & WAKE_PHY) {
|
||||
pmtctl |= PMT_CTL_ETH_PHY_EDPD_PLL_CTL_;
|
||||
if (adapter->phy_wolopts)
|
||||
pmtctl |= PMT_CTL_ETH_PHY_WAKE_EN_;
|
||||
}
|
||||
|
||||
if (adapter->wolopts & WAKE_MAGIC) {
|
||||
wucsr |= MAC_WUCSR_MPEN_;
|
||||
macrx |= MAC_RX_RXEN_;
|
||||
@ -3686,7 +3696,7 @@ static int lan743x_pm_suspend(struct device *dev)
|
||||
lan743x_csr_write(adapter, MAC_WUCSR2, 0);
|
||||
lan743x_csr_write(adapter, MAC_WK_SRC, 0xFFFFFFFF);
|
||||
|
||||
if (adapter->wolopts)
|
||||
if (adapter->wolopts || adapter->phy_wolopts)
|
||||
lan743x_pm_set_wol(adapter);
|
||||
|
||||
if (adapter->is_pci11x1x) {
|
||||
@ -3710,6 +3720,7 @@ static int lan743x_pm_resume(struct device *dev)
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct lan743x_adapter *adapter = netdev_priv(netdev);
|
||||
u32 data;
|
||||
int ret;
|
||||
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
@ -3728,6 +3739,30 @@ static int lan743x_pm_resume(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = lan743x_csr_read(adapter, MAC_WK_SRC);
|
||||
netif_dbg(adapter, drv, adapter->netdev,
|
||||
"Wakeup source : 0x%08X\n", ret);
|
||||
|
||||
/* Clear the wol configuration and status bits. Note that
|
||||
* the status bits are "Write One to Clear (W1C)"
|
||||
*/
|
||||
data = MAC_WUCSR_EEE_TX_WAKE_ | MAC_WUCSR_EEE_RX_WAKE_ |
|
||||
MAC_WUCSR_RFE_WAKE_FR_ | MAC_WUCSR_PFDA_FR_ | MAC_WUCSR_WUFR_ |
|
||||
MAC_WUCSR_MPR_ | MAC_WUCSR_BCAST_FR_;
|
||||
lan743x_csr_write(adapter, MAC_WUCSR, data);
|
||||
|
||||
data = MAC_WUCSR2_NS_RCD_ | MAC_WUCSR2_ARP_RCD_ |
|
||||
MAC_WUCSR2_IPV6_TCPSYN_RCD_ | MAC_WUCSR2_IPV4_TCPSYN_RCD_;
|
||||
lan743x_csr_write(adapter, MAC_WUCSR2, data);
|
||||
|
||||
data = MAC_WK_SRC_ETH_PHY_WK_ | MAC_WK_SRC_IPV6_TCPSYN_RCD_WK_ |
|
||||
MAC_WK_SRC_IPV4_TCPSYN_RCD_WK_ | MAC_WK_SRC_EEE_TX_WK_ |
|
||||
MAC_WK_SRC_EEE_RX_WK_ | MAC_WK_SRC_RFE_FR_WK_ |
|
||||
MAC_WK_SRC_PFDA_FR_WK_ | MAC_WK_SRC_MP_FR_WK_ |
|
||||
MAC_WK_SRC_BCAST_FR_WK_ | MAC_WK_SRC_WU_FR_WK_ |
|
||||
MAC_WK_SRC_WK_FR_SAVED_;
|
||||
lan743x_csr_write(adapter, MAC_WK_SRC, data);
|
||||
|
||||
/* open netdev when netdev is at running state while resume.
|
||||
* For instance, it is true when system wakesup after pm-suspend
|
||||
* However, it is false when system wakes up after suspend GUI menu
|
||||
@ -3736,9 +3771,6 @@ static int lan743x_pm_resume(struct device *dev)
|
||||
lan743x_netdev_open(netdev);
|
||||
|
||||
netif_device_attach(netdev);
|
||||
ret = lan743x_csr_read(adapter, MAC_WK_SRC);
|
||||
netif_info(adapter, drv, adapter->netdev,
|
||||
"Wakeup source : 0x%08X\n", ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -61,6 +61,7 @@
|
||||
#define PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_ BIT(18)
|
||||
#define PMT_CTL_GPIO_WAKEUP_EN_ BIT(15)
|
||||
#define PMT_CTL_EEE_WAKEUP_EN_ BIT(13)
|
||||
#define PMT_CTL_RES_CLR_WKP_MASK_ GENMASK(9, 8)
|
||||
#define PMT_CTL_READY_ BIT(7)
|
||||
#define PMT_CTL_ETH_PHY_RST_ BIT(4)
|
||||
#define PMT_CTL_WOL_EN_ BIT(3)
|
||||
@ -227,12 +228,31 @@
|
||||
#define MAC_WUCSR (0x140)
|
||||
#define MAC_MP_SO_EN_ BIT(21)
|
||||
#define MAC_WUCSR_RFE_WAKE_EN_ BIT(14)
|
||||
#define MAC_WUCSR_EEE_TX_WAKE_ BIT(13)
|
||||
#define MAC_WUCSR_EEE_RX_WAKE_ BIT(11)
|
||||
#define MAC_WUCSR_RFE_WAKE_FR_ BIT(9)
|
||||
#define MAC_WUCSR_PFDA_FR_ BIT(7)
|
||||
#define MAC_WUCSR_WUFR_ BIT(6)
|
||||
#define MAC_WUCSR_MPR_ BIT(5)
|
||||
#define MAC_WUCSR_BCAST_FR_ BIT(4)
|
||||
#define MAC_WUCSR_PFDA_EN_ BIT(3)
|
||||
#define MAC_WUCSR_WAKE_EN_ BIT(2)
|
||||
#define MAC_WUCSR_MPEN_ BIT(1)
|
||||
#define MAC_WUCSR_BCST_EN_ BIT(0)
|
||||
|
||||
#define MAC_WK_SRC (0x144)
|
||||
#define MAC_WK_SRC_ETH_PHY_WK_ BIT(17)
|
||||
#define MAC_WK_SRC_IPV6_TCPSYN_RCD_WK_ BIT(16)
|
||||
#define MAC_WK_SRC_IPV4_TCPSYN_RCD_WK_ BIT(15)
|
||||
#define MAC_WK_SRC_EEE_TX_WK_ BIT(14)
|
||||
#define MAC_WK_SRC_EEE_RX_WK_ BIT(13)
|
||||
#define MAC_WK_SRC_RFE_FR_WK_ BIT(12)
|
||||
#define MAC_WK_SRC_PFDA_FR_WK_ BIT(11)
|
||||
#define MAC_WK_SRC_MP_FR_WK_ BIT(10)
|
||||
#define MAC_WK_SRC_BCAST_FR_WK_ BIT(9)
|
||||
#define MAC_WK_SRC_WU_FR_WK_ BIT(8)
|
||||
#define MAC_WK_SRC_WK_FR_SAVED_ BIT(7)
|
||||
|
||||
#define MAC_MP_SO_HI (0x148)
|
||||
#define MAC_MP_SO_LO (0x14C)
|
||||
|
||||
@ -295,6 +315,10 @@
|
||||
#define RFE_INDX(index) (0x580 + (index << 2))
|
||||
|
||||
#define MAC_WUCSR2 (0x600)
|
||||
#define MAC_WUCSR2_NS_RCD_ BIT(7)
|
||||
#define MAC_WUCSR2_ARP_RCD_ BIT(6)
|
||||
#define MAC_WUCSR2_IPV6_TCPSYN_RCD_ BIT(5)
|
||||
#define MAC_WUCSR2_IPV4_TCPSYN_RCD_ BIT(4)
|
||||
|
||||
#define SGMII_ACC (0x720)
|
||||
#define SGMII_ACC_SGMII_BZY_ BIT(31)
|
||||
@ -1018,6 +1042,8 @@ enum lan743x_sgmii_lsd {
|
||||
LINK_2500_SLAVE
|
||||
};
|
||||
|
||||
#define MAC_SUPPORTED_WAKES (WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | \
|
||||
WAKE_MAGIC | WAKE_ARP)
|
||||
struct lan743x_adapter {
|
||||
struct net_device *netdev;
|
||||
struct mii_bus *mdiobus;
|
||||
@ -1025,6 +1051,8 @@ struct lan743x_adapter {
|
||||
#ifdef CONFIG_PM
|
||||
u32 wolopts;
|
||||
u8 sopass[SOPASS_MAX];
|
||||
u32 phy_wolopts;
|
||||
u32 phy_wol_supported;
|
||||
#endif
|
||||
struct pci_dev *pdev;
|
||||
struct lan743x_csr csr;
|
||||
|
@ -98,10 +98,8 @@ qcaspi_info_show(struct seq_file *s, void *what)
|
||||
|
||||
seq_printf(s, "IRQ : %d\n",
|
||||
qca->spi_dev->irq);
|
||||
seq_printf(s, "INTR REQ : %u\n",
|
||||
qca->intr_req);
|
||||
seq_printf(s, "INTR SVC : %u\n",
|
||||
qca->intr_svc);
|
||||
seq_printf(s, "INTR : %lx\n",
|
||||
qca->intr);
|
||||
|
||||
seq_printf(s, "SPI max speed : %lu\n",
|
||||
(unsigned long)qca->spi_dev->max_speed_hz);
|
||||
|
@ -35,6 +35,8 @@
|
||||
|
||||
#define MAX_DMA_BURST_LEN 5000
|
||||
|
||||
#define SPI_INTR 0
|
||||
|
||||
/* Modules parameters */
|
||||
#define QCASPI_CLK_SPEED_MIN 1000000
|
||||
#define QCASPI_CLK_SPEED_MAX 16000000
|
||||
@ -579,14 +581,14 @@ qcaspi_spi_thread(void *data)
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((qca->intr_req == qca->intr_svc) &&
|
||||
if (!test_bit(SPI_INTR, &qca->intr) &&
|
||||
!qca->txr.skb[qca->txr.head])
|
||||
schedule();
|
||||
|
||||
set_current_state(TASK_RUNNING);
|
||||
|
||||
netdev_dbg(qca->net_dev, "have work to do. int: %d, tx_skb: %p\n",
|
||||
qca->intr_req - qca->intr_svc,
|
||||
netdev_dbg(qca->net_dev, "have work to do. int: %lu, tx_skb: %p\n",
|
||||
qca->intr,
|
||||
qca->txr.skb[qca->txr.head]);
|
||||
|
||||
qcaspi_qca7k_sync(qca, QCASPI_EVENT_UPDATE);
|
||||
@ -600,8 +602,7 @@ qcaspi_spi_thread(void *data)
|
||||
msleep(QCASPI_QCA7K_REBOOT_TIME_MS);
|
||||
}
|
||||
|
||||
if (qca->intr_svc != qca->intr_req) {
|
||||
qca->intr_svc = qca->intr_req;
|
||||
if (test_and_clear_bit(SPI_INTR, &qca->intr)) {
|
||||
start_spi_intr_handling(qca, &intr_cause);
|
||||
|
||||
if (intr_cause & SPI_INT_CPU_ON) {
|
||||
@ -663,7 +664,7 @@ qcaspi_intr_handler(int irq, void *data)
|
||||
{
|
||||
struct qcaspi *qca = data;
|
||||
|
||||
qca->intr_req++;
|
||||
set_bit(SPI_INTR, &qca->intr);
|
||||
if (qca->spi_thread)
|
||||
wake_up_process(qca->spi_thread);
|
||||
|
||||
@ -679,8 +680,7 @@ qcaspi_netdev_open(struct net_device *dev)
|
||||
if (!qca)
|
||||
return -EINVAL;
|
||||
|
||||
qca->intr_req = 1;
|
||||
qca->intr_svc = 0;
|
||||
set_bit(SPI_INTR, &qca->intr);
|
||||
qca->sync = QCASPI_SYNC_UNKNOWN;
|
||||
qcafrm_fsm_init_spi(&qca->frm_handle);
|
||||
|
||||
|
@ -81,8 +81,7 @@ struct qcaspi {
|
||||
struct qcafrm_handle frm_handle;
|
||||
struct sk_buff *rx_skb;
|
||||
|
||||
unsigned int intr_req;
|
||||
unsigned int intr_svc;
|
||||
unsigned long intr;
|
||||
u16 reset_count;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
@ -218,6 +218,7 @@ static void timestamp_interrupt(struct stmmac_priv *priv)
|
||||
{
|
||||
u32 num_snapshot, ts_status, tsync_int;
|
||||
struct ptp_clock_event event;
|
||||
u32 acr_value, channel;
|
||||
unsigned long flags;
|
||||
u64 ptp_time;
|
||||
int i;
|
||||
@ -243,12 +244,15 @@ static void timestamp_interrupt(struct stmmac_priv *priv)
|
||||
num_snapshot = (ts_status & GMAC_TIMESTAMP_ATSNS_MASK) >>
|
||||
GMAC_TIMESTAMP_ATSNS_SHIFT;
|
||||
|
||||
acr_value = readl(priv->ptpaddr + PTP_ACR);
|
||||
channel = ilog2(FIELD_GET(PTP_ACR_MASK, acr_value));
|
||||
|
||||
for (i = 0; i < num_snapshot; i++) {
|
||||
read_lock_irqsave(&priv->ptp_lock, flags);
|
||||
get_ptptime(priv->ptpaddr, &ptp_time);
|
||||
read_unlock_irqrestore(&priv->ptp_lock, flags);
|
||||
event.type = PTP_CLOCK_EXTTS;
|
||||
event.index = 0;
|
||||
event.index = channel;
|
||||
event.timestamp = ptp_time;
|
||||
ptp_clock_event(priv->ptp_clock, &event);
|
||||
}
|
||||
|
@ -358,24 +358,28 @@ static int tc_setup_cbs(struct stmmac_priv *priv,
|
||||
|
||||
port_transmit_rate_kbps = qopt->idleslope - qopt->sendslope;
|
||||
|
||||
/* Port Transmit Rate and Speed Divider */
|
||||
switch (div_s64(port_transmit_rate_kbps, 1000)) {
|
||||
case SPEED_10000:
|
||||
case SPEED_5000:
|
||||
ptr = 32;
|
||||
break;
|
||||
case SPEED_2500:
|
||||
case SPEED_1000:
|
||||
ptr = 8;
|
||||
break;
|
||||
case SPEED_100:
|
||||
ptr = 4;
|
||||
break;
|
||||
default:
|
||||
netdev_err(priv->dev,
|
||||
"Invalid portTransmitRate %lld (idleSlope - sendSlope)\n",
|
||||
port_transmit_rate_kbps);
|
||||
return -EINVAL;
|
||||
if (qopt->enable) {
|
||||
/* Port Transmit Rate and Speed Divider */
|
||||
switch (div_s64(port_transmit_rate_kbps, 1000)) {
|
||||
case SPEED_10000:
|
||||
case SPEED_5000:
|
||||
ptr = 32;
|
||||
break;
|
||||
case SPEED_2500:
|
||||
case SPEED_1000:
|
||||
ptr = 8;
|
||||
break;
|
||||
case SPEED_100:
|
||||
ptr = 4;
|
||||
break;
|
||||
default:
|
||||
netdev_err(priv->dev,
|
||||
"Invalid portTransmitRate %lld (idleSlope - sendSlope)\n",
|
||||
port_transmit_rate_kbps);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
ptr = 0;
|
||||
}
|
||||
|
||||
mode_to_use = priv->plat->tx_queues_cfg[queue].mode_to_use;
|
||||
|
@ -17,6 +17,11 @@
|
||||
#define DP83TG720S_PHY_RESET 0x1f
|
||||
#define DP83TG720S_HW_RESET BIT(15)
|
||||
|
||||
#define DP83TG720S_LPS_CFG3 0x18c
|
||||
/* Power modes are documented as bit fields but used as values */
|
||||
/* Power Mode 0 is Normal mode */
|
||||
#define DP83TG720S_LPS_CFG3_PWR_MODE_0 BIT(0)
|
||||
|
||||
#define DP83TG720S_RGMII_DELAY_CTRL 0x602
|
||||
/* In RGMII mode, Enable or disable the internal delay for RXD */
|
||||
#define DP83TG720S_RGMII_RX_CLK_SEL BIT(1)
|
||||
@ -31,11 +36,20 @@
|
||||
|
||||
static int dp83tg720_config_aneg(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Autoneg is not supported and this PHY supports only one speed.
|
||||
* We need to care only about master/slave configuration if it was
|
||||
* changed by user.
|
||||
*/
|
||||
return genphy_c45_pma_baset1_setup_master_slave(phydev);
|
||||
ret = genphy_c45_pma_baset1_setup_master_slave(phydev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Re-read role configuration to make changes visible even if
|
||||
* the link is in administrative down state.
|
||||
*/
|
||||
return genphy_c45_pma_baset1_read_master_slave(phydev);
|
||||
}
|
||||
|
||||
static int dp83tg720_read_status(struct phy_device *phydev)
|
||||
@ -64,6 +78,8 @@ static int dp83tg720_read_status(struct phy_device *phydev)
|
||||
return ret;
|
||||
|
||||
/* After HW reset we need to restore master/slave configuration.
|
||||
* genphy_c45_pma_baset1_read_master_slave() call will be done
|
||||
* by the dp83tg720_config_aneg() function.
|
||||
*/
|
||||
ret = dp83tg720_config_aneg(phydev);
|
||||
if (ret)
|
||||
@ -154,10 +170,24 @@ static int dp83tg720_config_init(struct phy_device *phydev)
|
||||
*/
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
if (phy_interface_is_rgmii(phydev))
|
||||
return dp83tg720_config_rgmii_delay(phydev);
|
||||
if (phy_interface_is_rgmii(phydev)) {
|
||||
ret = dp83tg720_config_rgmii_delay(phydev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
/* In case the PHY is bootstrapped in managed mode, we need to
|
||||
* wake it.
|
||||
*/
|
||||
ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_LPS_CFG3,
|
||||
DP83TG720S_LPS_CFG3_PWR_MODE_0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make role configuration visible for ethtool on init and after
|
||||
* rest.
|
||||
*/
|
||||
return genphy_c45_pma_baset1_read_master_slave(phydev);
|
||||
}
|
||||
|
||||
static struct phy_driver dp83tg720_driver[] = {
|
||||
|
@ -107,6 +107,7 @@ struct gpy_priv {
|
||||
|
||||
u8 fw_major;
|
||||
u8 fw_minor;
|
||||
u32 wolopts;
|
||||
|
||||
/* It takes 3 seconds to fully switch out of loopback mode before
|
||||
* it can safely re-enter loopback mode. Record the time when
|
||||
@ -221,6 +222,15 @@ static int gpy_hwmon_register(struct phy_device *phydev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int gpy_ack_interrupt(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Clear all pending interrupts */
|
||||
ret = phy_read(phydev, PHY_ISTAT);
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
||||
static int gpy_mbox_read(struct phy_device *phydev, u32 addr)
|
||||
{
|
||||
struct gpy_priv *priv = phydev->priv;
|
||||
@ -262,16 +272,8 @@ static int gpy_mbox_read(struct phy_device *phydev, u32 addr)
|
||||
|
||||
static int gpy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Mask all interrupts */
|
||||
ret = phy_write(phydev, PHY_IMASK, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Clear all pending interrupts */
|
||||
ret = phy_read(phydev, PHY_ISTAT);
|
||||
return ret < 0 ? ret : 0;
|
||||
/* Nothing to configure. Configuration Requirement Placeholder */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpy21x_config_init(struct phy_device *phydev)
|
||||
@ -627,11 +629,23 @@ static int gpy_read_status(struct phy_device *phydev)
|
||||
|
||||
static int gpy_config_intr(struct phy_device *phydev)
|
||||
{
|
||||
struct gpy_priv *priv = phydev->priv;
|
||||
u16 mask = 0;
|
||||
int ret;
|
||||
|
||||
ret = gpy_ack_interrupt(phydev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
|
||||
mask = PHY_IMASK_MASK;
|
||||
|
||||
if (priv->wolopts & WAKE_MAGIC)
|
||||
mask |= PHY_IMASK_WOL;
|
||||
|
||||
if (priv->wolopts & WAKE_PHY)
|
||||
mask |= PHY_IMASK_LSTC;
|
||||
|
||||
return phy_write(phydev, PHY_IMASK, mask);
|
||||
}
|
||||
|
||||
@ -678,6 +692,7 @@ static int gpy_set_wol(struct phy_device *phydev,
|
||||
struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct net_device *attach_dev = phydev->attached_dev;
|
||||
struct gpy_priv *priv = phydev->priv;
|
||||
int ret;
|
||||
|
||||
if (wol->wolopts & WAKE_MAGIC) {
|
||||
@ -725,6 +740,8 @@ static int gpy_set_wol(struct phy_device *phydev,
|
||||
ret = phy_read(phydev, PHY_ISTAT);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
priv->wolopts |= WAKE_MAGIC;
|
||||
} else {
|
||||
/* Disable magic packet matching */
|
||||
ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2,
|
||||
@ -732,6 +749,13 @@ static int gpy_set_wol(struct phy_device *phydev,
|
||||
WOL_EN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Disable the WOL interrupt */
|
||||
ret = phy_clear_bits(phydev, PHY_IMASK, PHY_IMASK_WOL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
priv->wolopts &= ~WAKE_MAGIC;
|
||||
}
|
||||
|
||||
if (wol->wolopts & WAKE_PHY) {
|
||||
@ -748,9 +772,11 @@ static int gpy_set_wol(struct phy_device *phydev,
|
||||
if (ret & (PHY_IMASK_MASK & ~PHY_IMASK_LSTC))
|
||||
phy_trigger_machine(phydev);
|
||||
|
||||
priv->wolopts |= WAKE_PHY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
priv->wolopts &= ~WAKE_PHY;
|
||||
/* Disable the link state change interrupt */
|
||||
return phy_clear_bits(phydev, PHY_IMASK, PHY_IMASK_LSTC);
|
||||
}
|
||||
@ -758,18 +784,10 @@ static int gpy_set_wol(struct phy_device *phydev,
|
||||
static void gpy_get_wol(struct phy_device *phydev,
|
||||
struct ethtool_wolinfo *wol)
|
||||
{
|
||||
int ret;
|
||||
struct gpy_priv *priv = phydev->priv;
|
||||
|
||||
wol->supported = WAKE_MAGIC | WAKE_PHY;
|
||||
wol->wolopts = 0;
|
||||
|
||||
ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, VPSPEC2_WOL_CTL);
|
||||
if (ret & WOL_EN)
|
||||
wol->wolopts |= WAKE_MAGIC;
|
||||
|
||||
ret = phy_read(phydev, PHY_IMASK);
|
||||
if (ret & PHY_IMASK_LSTC)
|
||||
wol->wolopts |= WAKE_PHY;
|
||||
wol->wolopts = priv->wolopts;
|
||||
}
|
||||
|
||||
static int gpy_loopback(struct phy_device *phydev, bool enable)
|
||||
|
@ -174,7 +174,6 @@ struct ax88179_data {
|
||||
u32 wol_supported;
|
||||
u32 wolopts;
|
||||
u8 disconnecting;
|
||||
u8 initialized;
|
||||
};
|
||||
|
||||
struct ax88179_int_data {
|
||||
@ -1678,12 +1677,21 @@ static int ax88179_reset(struct usbnet *dev)
|
||||
|
||||
static int ax88179_net_reset(struct usbnet *dev)
|
||||
{
|
||||
struct ax88179_data *ax179_data = dev->driver_priv;
|
||||
u16 tmp16;
|
||||
|
||||
if (ax179_data->initialized)
|
||||
ax88179_read_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, GMII_PHY_PHYSR,
|
||||
2, &tmp16);
|
||||
if (tmp16) {
|
||||
ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
|
||||
2, 2, &tmp16);
|
||||
if (!(tmp16 & AX_MEDIUM_RECEIVE_EN)) {
|
||||
tmp16 |= AX_MEDIUM_RECEIVE_EN;
|
||||
ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
|
||||
2, 2, &tmp16);
|
||||
}
|
||||
} else {
|
||||
ax88179_reset(dev);
|
||||
else
|
||||
ax179_data->initialized = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -778,7 +778,8 @@ static int rtl8150_get_link_ksettings(struct net_device *netdev,
|
||||
struct ethtool_link_ksettings *ecmd)
|
||||
{
|
||||
rtl8150_t *dev = netdev_priv(netdev);
|
||||
short lpa, bmcr;
|
||||
short lpa = 0;
|
||||
short bmcr = 0;
|
||||
u32 supported;
|
||||
|
||||
supported = (SUPPORTED_10baseT_Half |
|
||||
|
@ -1360,6 +1360,10 @@ static struct sk_buff *receive_small_xdp(struct net_device *dev,
|
||||
if (unlikely(hdr->hdr.gso_type))
|
||||
goto err_xdp;
|
||||
|
||||
/* Partially checksummed packets must be dropped. */
|
||||
if (unlikely(hdr->hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM))
|
||||
goto err_xdp;
|
||||
|
||||
buflen = SKB_DATA_ALIGN(GOOD_PACKET_LEN + headroom) +
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
||||
|
||||
@ -1677,6 +1681,10 @@ static void *mergeable_xdp_get_buf(struct virtnet_info *vi,
|
||||
if (unlikely(hdr->hdr.gso_type))
|
||||
return NULL;
|
||||
|
||||
/* Partially checksummed packets must be dropped. */
|
||||
if (unlikely(hdr->hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM))
|
||||
return NULL;
|
||||
|
||||
/* Now XDP core assumes frag size is PAGE_SIZE, but buffers
|
||||
* with headroom may add hole in truesize, which
|
||||
* make their length exceed PAGE_SIZE. So we disabled the
|
||||
@ -1943,6 +1951,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
|
||||
struct net_device *dev = vi->dev;
|
||||
struct sk_buff *skb;
|
||||
struct virtio_net_common_hdr *hdr;
|
||||
u8 flags;
|
||||
|
||||
if (unlikely(len < vi->hdr_len + ETH_HLEN)) {
|
||||
pr_debug("%s: short packet %i\n", dev->name, len);
|
||||
@ -1951,6 +1960,15 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
|
||||
return;
|
||||
}
|
||||
|
||||
/* 1. Save the flags early, as the XDP program might overwrite them.
|
||||
* These flags ensure packets marked as VIRTIO_NET_HDR_F_DATA_VALID
|
||||
* stay valid after XDP processing.
|
||||
* 2. XDP doesn't work with partially checksummed packets (refer to
|
||||
* virtnet_xdp_set()), so packets marked as
|
||||
* VIRTIO_NET_HDR_F_NEEDS_CSUM get dropped during XDP processing.
|
||||
*/
|
||||
flags = ((struct virtio_net_common_hdr *)buf)->hdr.flags;
|
||||
|
||||
if (vi->mergeable_rx_bufs)
|
||||
skb = receive_mergeable(dev, vi, rq, buf, ctx, len, xdp_xmit,
|
||||
stats);
|
||||
@ -1966,7 +1984,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
|
||||
if (dev->features & NETIF_F_RXHASH && vi->has_rss_hash_report)
|
||||
virtio_skb_set_hash(&hdr->hash_v1_hdr, skb);
|
||||
|
||||
if (hdr->hdr.flags & VIRTIO_NET_HDR_F_DATA_VALID)
|
||||
if (flags & VIRTIO_NET_HDR_F_DATA_VALID)
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
if (virtio_net_hdr_to_skb(skb, &hdr->hdr,
|
||||
@ -5666,8 +5684,16 @@ static int virtnet_probe(struct virtio_device *vdev)
|
||||
dev->features |= dev->hw_features & NETIF_F_ALL_TSO;
|
||||
/* (!csum && gso) case will be fixed by register_netdev() */
|
||||
}
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM))
|
||||
dev->features |= NETIF_F_RXCSUM;
|
||||
|
||||
/* 1. With VIRTIO_NET_F_GUEST_CSUM negotiation, the driver doesn't
|
||||
* need to calculate checksums for partially checksummed packets,
|
||||
* as they're considered valid by the upper layer.
|
||||
* 2. Without VIRTIO_NET_F_GUEST_CSUM negotiation, the driver only
|
||||
* receives fully checksummed packets. The device may assist in
|
||||
* validating these packets' checksums, so the driver won't have to.
|
||||
*/
|
||||
dev->features |= NETIF_F_RXCSUM;
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
|
||||
virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6))
|
||||
dev->features |= NETIF_F_GRO_HW;
|
||||
|
@ -4795,7 +4795,7 @@ static int iwl_mvm_roc_station(struct iwl_mvm *mvm,
|
||||
|
||||
if (fw_ver == IWL_FW_CMD_VER_UNKNOWN) {
|
||||
ret = iwl_mvm_send_aux_roc_cmd(mvm, channel, vif, duration);
|
||||
} else if (fw_ver == 3) {
|
||||
} else if (fw_ver >= 3) {
|
||||
ret = iwl_mvm_roc_add_cmd(mvm, channel, vif, duration,
|
||||
ROC_ACTIVITY_HOTSPOT);
|
||||
} else {
|
||||
|
@ -1830,7 +1830,7 @@ iwl_mvm_umac_scan_cfg_channels_v7_6g(struct iwl_mvm *mvm,
|
||||
*/
|
||||
if (!iwl_mvm_is_scan_fragmented(params->type)) {
|
||||
if (!cfg80211_channel_is_psc(params->channels[i]) ||
|
||||
flags & IWL_UHB_CHAN_CFG_FLAG_PSC_CHAN_NO_LISTEN) {
|
||||
psc_no_listen) {
|
||||
if (unsolicited_probe_on_chan) {
|
||||
max_s_ssids = 2;
|
||||
max_bssids = 6;
|
||||
|
@ -1238,6 +1238,7 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||
if (te_data->id >= SESSION_PROTECT_CONF_MAX_ID) {
|
||||
IWL_DEBUG_TE(mvm,
|
||||
"No remain on channel event\n");
|
||||
mutex_unlock(&mvm->mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1253,6 +1254,7 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||
te_data = iwl_mvm_get_roc_te(mvm);
|
||||
if (!te_data) {
|
||||
IWL_WARN(mvm, "No remain on channel event\n");
|
||||
mutex_unlock(&mvm->mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -296,8 +296,7 @@ static ssize_t max_vclocks_store(struct device *dev,
|
||||
if (max < ptp->n_vclocks)
|
||||
goto out;
|
||||
|
||||
size = sizeof(int) * max;
|
||||
vclock_index = kzalloc(size, GFP_KERNEL);
|
||||
vclock_index = kcalloc(max, sizeof(int), GFP_KERNEL);
|
||||
if (!vclock_index) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
|
@ -746,6 +746,8 @@ struct bpf_verifier_env {
|
||||
/* Same as scratched_regs but for stack slots */
|
||||
u64 scratched_stack_slots;
|
||||
u64 prev_log_pos, prev_insn_print_pos;
|
||||
/* buffer used to temporary hold constants as scalar registers */
|
||||
struct bpf_reg_state fake_reg[2];
|
||||
/* buffer used to generate temporary string representations,
|
||||
* e.g., in reg_type_str() to generate reg_type string
|
||||
*/
|
||||
|
@ -82,7 +82,7 @@
|
||||
* as to avoid issues such as the compiler inlining or eliding either a static
|
||||
* kfunc, or a global kfunc in an LTO build.
|
||||
*/
|
||||
#define __bpf_kfunc __used noinline
|
||||
#define __bpf_kfunc __used __retain noinline
|
||||
|
||||
#define __bpf_kfunc_start_defs() \
|
||||
__diag_push(); \
|
||||
|
@ -143,6 +143,29 @@ static inline void __chk_io_ptr(const volatile void __iomem *ptr) { }
|
||||
# define __preserve_most
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Annotating a function/variable with __retain tells the compiler to place
|
||||
* the object in its own section and set the flag SHF_GNU_RETAIN. This flag
|
||||
* instructs the linker to retain the object during garbage-cleanup or LTO
|
||||
* phases.
|
||||
*
|
||||
* Note that the __used macro is also used to prevent functions or data
|
||||
* being optimized out, but operates at the compiler/IR-level and may still
|
||||
* allow unintended removal of objects during linking.
|
||||
*
|
||||
* Optional: only supported since gcc >= 11, clang >= 13
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-retain-function-attribute
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#retain
|
||||
*/
|
||||
#if __has_attribute(__retain__) && \
|
||||
(defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) || \
|
||||
defined(CONFIG_LTO_CLANG))
|
||||
# define __retain __attribute__((__retain__))
|
||||
#else
|
||||
# define __retain
|
||||
#endif
|
||||
|
||||
/* Compiler specific macros. */
|
||||
#ifdef __clang__
|
||||
#include <linux/compiler-clang.h>
|
||||
|
@ -15,6 +15,9 @@ struct netns_nf {
|
||||
const struct nf_logger __rcu *nf_loggers[NFPROTO_NUMPROTO];
|
||||
#ifdef CONFIG_SYSCTL
|
||||
struct ctl_table_header *nf_log_dir_header;
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
struct ctl_table_header *nf_lwtnl_dir_header;
|
||||
#endif
|
||||
#endif
|
||||
struct nf_hook_entries __rcu *hooks_ipv4[NF_INET_NUMHOOKS];
|
||||
struct nf_hook_entries __rcu *hooks_ipv6[NF_INET_NUMHOOKS];
|
||||
|
@ -4549,11 +4549,12 @@ static int check_stack_write_fixed_off(struct bpf_verifier_env *env,
|
||||
state->stack[spi].spilled_ptr.id = 0;
|
||||
} else if (!reg && !(off % BPF_REG_SIZE) && is_bpf_st_mem(insn) &&
|
||||
env->bpf_capable) {
|
||||
struct bpf_reg_state fake_reg = {};
|
||||
struct bpf_reg_state *tmp_reg = &env->fake_reg[0];
|
||||
|
||||
__mark_reg_known(&fake_reg, insn->imm);
|
||||
fake_reg.type = SCALAR_VALUE;
|
||||
save_register_state(env, state, spi, &fake_reg, size);
|
||||
memset(tmp_reg, 0, sizeof(*tmp_reg));
|
||||
__mark_reg_known(tmp_reg, insn->imm);
|
||||
tmp_reg->type = SCALAR_VALUE;
|
||||
save_register_state(env, state, spi, tmp_reg, size);
|
||||
} else if (reg && is_spillable_regtype(reg->type)) {
|
||||
/* register containing pointer is being spilled into stack */
|
||||
if (size != BPF_REG_SIZE) {
|
||||
@ -15113,7 +15114,6 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
|
||||
struct bpf_reg_state *regs = this_branch->frame[this_branch->curframe]->regs;
|
||||
struct bpf_reg_state *dst_reg, *other_branch_regs, *src_reg = NULL;
|
||||
struct bpf_reg_state *eq_branch_regs;
|
||||
struct bpf_reg_state fake_reg = {};
|
||||
u8 opcode = BPF_OP(insn->code);
|
||||
bool is_jmp32;
|
||||
int pred = -1;
|
||||
@ -15179,7 +15179,8 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
|
||||
verbose(env, "BPF_JMP/JMP32 uses reserved fields\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
src_reg = &fake_reg;
|
||||
src_reg = &env->fake_reg[0];
|
||||
memset(src_reg, 0, sizeof(*src_reg));
|
||||
src_reg->type = SCALAR_VALUE;
|
||||
__mark_reg_known(src_reg, insn->imm);
|
||||
}
|
||||
@ -15239,10 +15240,16 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
|
||||
&other_branch_regs[insn->src_reg],
|
||||
dst_reg, src_reg, opcode, is_jmp32);
|
||||
} else /* BPF_SRC(insn->code) == BPF_K */ {
|
||||
/* reg_set_min_max() can mangle the fake_reg. Make a copy
|
||||
* so that these are two different memory locations. The
|
||||
* src_reg is not used beyond here in context of K.
|
||||
*/
|
||||
memcpy(&env->fake_reg[1], &env->fake_reg[0],
|
||||
sizeof(env->fake_reg[0]));
|
||||
err = reg_set_min_max(env,
|
||||
&other_branch_regs[insn->dst_reg],
|
||||
src_reg /* fake one */,
|
||||
dst_reg, src_reg /* same fake one */,
|
||||
&env->fake_reg[0],
|
||||
dst_reg, &env->fake_reg[1],
|
||||
opcode, is_jmp32);
|
||||
}
|
||||
if (err)
|
||||
@ -20313,7 +20320,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
|
||||
goto next_insn;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
|
||||
/* Implement bpf_get_smp_processor_id() inline. */
|
||||
if (insn->imm == BPF_FUNC_get_smp_processor_id &&
|
||||
prog->jit_requested && bpf_jit_supports_percpu_insn()) {
|
||||
|
@ -1665,6 +1665,11 @@ static DEFINE_PER_CPU(struct bpf_scratchpad, bpf_sp);
|
||||
static inline int __bpf_try_make_writable(struct sk_buff *skb,
|
||||
unsigned int write_len)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_NET
|
||||
/* Avoid a splat in pskb_may_pull_reason() */
|
||||
if (write_len > INT_MAX)
|
||||
return -EINVAL;
|
||||
#endif
|
||||
return skb_ensure_writable(skb, write_len);
|
||||
}
|
||||
|
||||
|
@ -693,11 +693,16 @@ EXPORT_SYMBOL_GPL(__put_net);
|
||||
* get_net_ns - increment the refcount of the network namespace
|
||||
* @ns: common namespace (net)
|
||||
*
|
||||
* Returns the net's common namespace.
|
||||
* Returns the net's common namespace or ERR_PTR() if ref is zero.
|
||||
*/
|
||||
struct ns_common *get_net_ns(struct ns_common *ns)
|
||||
{
|
||||
return &get_net(container_of(ns, struct net, ns))->ns;
|
||||
struct net *net;
|
||||
|
||||
net = maybe_get_net(container_of(ns, struct net, ns));
|
||||
if (net)
|
||||
return &net->ns;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_net_ns);
|
||||
|
||||
|
@ -59,22 +59,22 @@ XDP_METADATA_KFUNC_xxx
|
||||
nla_put_u64_64bit(rsp, NETDEV_A_DEV_XDP_RX_METADATA_FEATURES,
|
||||
xdp_rx_meta, NETDEV_A_DEV_PAD) ||
|
||||
nla_put_u64_64bit(rsp, NETDEV_A_DEV_XSK_FEATURES,
|
||||
xsk_features, NETDEV_A_DEV_PAD)) {
|
||||
genlmsg_cancel(rsp, hdr);
|
||||
return -EINVAL;
|
||||
}
|
||||
xsk_features, NETDEV_A_DEV_PAD))
|
||||
goto err_cancel_msg;
|
||||
|
||||
if (netdev->xdp_features & NETDEV_XDP_ACT_XSK_ZEROCOPY) {
|
||||
if (nla_put_u32(rsp, NETDEV_A_DEV_XDP_ZC_MAX_SEGS,
|
||||
netdev->xdp_zc_max_segs)) {
|
||||
genlmsg_cancel(rsp, hdr);
|
||||
return -EINVAL;
|
||||
}
|
||||
netdev->xdp_zc_max_segs))
|
||||
goto err_cancel_msg;
|
||||
}
|
||||
|
||||
genlmsg_end(rsp, hdr);
|
||||
|
||||
return 0;
|
||||
|
||||
err_cancel_msg:
|
||||
genlmsg_cancel(rsp, hdr);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -3742,6 +3742,9 @@ void sk_common_release(struct sock *sk)
|
||||
|
||||
sk->sk_prot->unhash(sk);
|
||||
|
||||
if (sk->sk_socket)
|
||||
sk->sk_socket->sk = NULL;
|
||||
|
||||
/*
|
||||
* In this point socket cannot receive new packets, but it is possible
|
||||
* that some packets are in flight because some CPU runs receiver and
|
||||
|
@ -1810,6 +1810,29 @@ static int cipso_v4_genopt(unsigned char *buf, u32 buf_len,
|
||||
return CIPSO_V4_HDR_LEN + ret_val;
|
||||
}
|
||||
|
||||
static int cipso_v4_get_actual_opt_len(const unsigned char *data, int len)
|
||||
{
|
||||
int iter = 0, optlen = 0;
|
||||
|
||||
/* determining the new total option length is tricky because of
|
||||
* the padding necessary, the only thing i can think to do at
|
||||
* this point is walk the options one-by-one, skipping the
|
||||
* padding at the end to determine the actual option size and
|
||||
* from there we can determine the new total option length
|
||||
*/
|
||||
while (iter < len) {
|
||||
if (data[iter] == IPOPT_END) {
|
||||
break;
|
||||
} else if (data[iter] == IPOPT_NOP) {
|
||||
iter++;
|
||||
} else {
|
||||
iter += data[iter + 1];
|
||||
optlen = iter;
|
||||
}
|
||||
}
|
||||
return optlen;
|
||||
}
|
||||
|
||||
/**
|
||||
* cipso_v4_sock_setattr - Add a CIPSO option to a socket
|
||||
* @sk: the socket
|
||||
@ -1986,7 +2009,6 @@ static int cipso_v4_delopt(struct ip_options_rcu __rcu **opt_ptr)
|
||||
u8 cipso_len;
|
||||
u8 cipso_off;
|
||||
unsigned char *cipso_ptr;
|
||||
int iter;
|
||||
int optlen_new;
|
||||
|
||||
cipso_off = opt->opt.cipso - sizeof(struct iphdr);
|
||||
@ -2006,19 +2028,8 @@ static int cipso_v4_delopt(struct ip_options_rcu __rcu **opt_ptr)
|
||||
memmove(cipso_ptr, cipso_ptr + cipso_len,
|
||||
opt->opt.optlen - cipso_off - cipso_len);
|
||||
|
||||
/* determining the new total option length is tricky because of
|
||||
* the padding necessary, the only thing i can think to do at
|
||||
* this point is walk the options one-by-one, skipping the
|
||||
* padding at the end to determine the actual option size and
|
||||
* from there we can determine the new total option length */
|
||||
iter = 0;
|
||||
optlen_new = 0;
|
||||
while (iter < opt->opt.optlen)
|
||||
if (opt->opt.__data[iter] != IPOPT_NOP) {
|
||||
iter += opt->opt.__data[iter + 1];
|
||||
optlen_new = iter;
|
||||
} else
|
||||
iter++;
|
||||
optlen_new = cipso_v4_get_actual_opt_len(opt->opt.__data,
|
||||
opt->opt.optlen);
|
||||
hdr_delta = opt->opt.optlen;
|
||||
opt->opt.optlen = (optlen_new + 3) & ~3;
|
||||
hdr_delta -= opt->opt.optlen;
|
||||
@ -2238,7 +2249,8 @@ int cipso_v4_skbuff_setattr(struct sk_buff *skb,
|
||||
*/
|
||||
int cipso_v4_skbuff_delattr(struct sk_buff *skb)
|
||||
{
|
||||
int ret_val;
|
||||
int ret_val, cipso_len, hdr_len_actual, new_hdr_len_actual, new_hdr_len,
|
||||
hdr_len_delta;
|
||||
struct iphdr *iph;
|
||||
struct ip_options *opt = &IPCB(skb)->opt;
|
||||
unsigned char *cipso_ptr;
|
||||
@ -2251,16 +2263,37 @@ int cipso_v4_skbuff_delattr(struct sk_buff *skb)
|
||||
if (ret_val < 0)
|
||||
return ret_val;
|
||||
|
||||
/* the easiest thing to do is just replace the cipso option with noop
|
||||
* options since we don't change the size of the packet, although we
|
||||
* still need to recalculate the checksum */
|
||||
|
||||
iph = ip_hdr(skb);
|
||||
cipso_ptr = (unsigned char *)iph + opt->cipso;
|
||||
memset(cipso_ptr, IPOPT_NOOP, cipso_ptr[1]);
|
||||
cipso_len = cipso_ptr[1];
|
||||
|
||||
hdr_len_actual = sizeof(struct iphdr) +
|
||||
cipso_v4_get_actual_opt_len((unsigned char *)(iph + 1),
|
||||
opt->optlen);
|
||||
new_hdr_len_actual = hdr_len_actual - cipso_len;
|
||||
new_hdr_len = (new_hdr_len_actual + 3) & ~3;
|
||||
hdr_len_delta = (iph->ihl << 2) - new_hdr_len;
|
||||
|
||||
/* 1. shift any options after CIPSO to the left */
|
||||
memmove(cipso_ptr, cipso_ptr + cipso_len,
|
||||
new_hdr_len_actual - opt->cipso);
|
||||
/* 2. move the whole IP header to its new place */
|
||||
memmove((unsigned char *)iph + hdr_len_delta, iph, new_hdr_len_actual);
|
||||
/* 3. adjust the skb layout */
|
||||
skb_pull(skb, hdr_len_delta);
|
||||
skb_reset_network_header(skb);
|
||||
iph = ip_hdr(skb);
|
||||
/* 4. re-fill new padding with IPOPT_END (may now be longer) */
|
||||
memset((unsigned char *)iph + new_hdr_len_actual, IPOPT_END,
|
||||
new_hdr_len - new_hdr_len_actual);
|
||||
|
||||
opt->optlen -= hdr_len_delta;
|
||||
opt->cipso = 0;
|
||||
opt->is_changed = 1;
|
||||
|
||||
if (hdr_len_delta != 0) {
|
||||
iph->ihl = new_hdr_len >> 2;
|
||||
iph_set_totlen(iph, skb->len);
|
||||
}
|
||||
ip_send_check(iph);
|
||||
|
||||
return 0;
|
||||
|
@ -1968,8 +1968,10 @@ static int tcp_ao_info_cmd(struct sock *sk, unsigned short int family,
|
||||
first = true;
|
||||
}
|
||||
|
||||
if (cmd.ao_required && tcp_ao_required_verify(sk))
|
||||
return -EKEYREJECTED;
|
||||
if (cmd.ao_required && tcp_ao_required_verify(sk)) {
|
||||
err = -EKEYREJECTED;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* For sockets in TCP_CLOSED it's possible set keys that aren't
|
||||
* matching the future peer (address/port/VRF/etc),
|
||||
|
@ -6296,6 +6296,7 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
||||
skb_rbtree_walk_from(data)
|
||||
tcp_mark_skb_lost(sk, data);
|
||||
tcp_xmit_retransmit_queue(sk);
|
||||
tp->retrans_stamp = 0;
|
||||
NET_INC_STATS(sock_net(sk),
|
||||
LINUX_MIB_TCPFASTOPENACTIVEFAIL);
|
||||
return true;
|
||||
|
@ -2514,7 +2514,8 @@ int __init fib6_init(void)
|
||||
goto out_kmem_cache_create;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE, NULL,
|
||||
inet6_dump_fib, RTNL_FLAG_DUMP_UNLOCKED);
|
||||
inet6_dump_fib, RTNL_FLAG_DUMP_UNLOCKED |
|
||||
RTNL_FLAG_DUMP_SPLIT_NLM_DONE);
|
||||
if (ret)
|
||||
goto out_unregister_subsys;
|
||||
|
||||
|
@ -638,6 +638,8 @@ static void rt6_probe(struct fib6_nh *fib6_nh)
|
||||
rcu_read_lock();
|
||||
last_probe = READ_ONCE(fib6_nh->last_probe);
|
||||
idev = __in6_dev_get(dev);
|
||||
if (!idev)
|
||||
goto out;
|
||||
neigh = __ipv6_neigh_lookup_noref(dev, nh_gw);
|
||||
if (neigh) {
|
||||
if (READ_ONCE(neigh->nud_state) & NUD_VALID)
|
||||
@ -3603,7 +3605,7 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
|
||||
if (!dev)
|
||||
goto out;
|
||||
|
||||
if (idev->cnf.disable_ipv6) {
|
||||
if (!idev || idev->cnf.disable_ipv6) {
|
||||
NL_SET_ERR_MSG(extack, "IPv6 is disabled on nexthop device");
|
||||
err = -EACCES;
|
||||
goto out;
|
||||
|
@ -941,8 +941,8 @@ static int input_action_end_dx6(struct sk_buff *skb,
|
||||
|
||||
if (static_branch_unlikely(&nf_hooks_lwtunnel_enabled))
|
||||
return NF_HOOK(NFPROTO_IPV6, NF_INET_PRE_ROUTING,
|
||||
dev_net(skb->dev), NULL, skb, NULL,
|
||||
skb_dst(skb)->dev, input_action_end_dx6_finish);
|
||||
dev_net(skb->dev), NULL, skb, skb->dev,
|
||||
NULL, input_action_end_dx6_finish);
|
||||
|
||||
return input_action_end_dx6_finish(dev_net(skb->dev), NULL, skb);
|
||||
drop:
|
||||
@ -991,8 +991,8 @@ static int input_action_end_dx4(struct sk_buff *skb,
|
||||
|
||||
if (static_branch_unlikely(&nf_hooks_lwtunnel_enabled))
|
||||
return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING,
|
||||
dev_net(skb->dev), NULL, skb, NULL,
|
||||
skb_dst(skb)->dev, input_action_end_dx4_finish);
|
||||
dev_net(skb->dev), NULL, skb, skb->dev,
|
||||
NULL, input_action_end_dx4_finish);
|
||||
|
||||
return input_action_end_dx4_finish(dev_net(skb->dev), NULL, skb);
|
||||
drop:
|
||||
|
@ -56,12 +56,18 @@ static int xfrm6_get_saddr(struct net *net, int oif,
|
||||
{
|
||||
struct dst_entry *dst;
|
||||
struct net_device *dev;
|
||||
struct inet6_dev *idev;
|
||||
|
||||
dst = xfrm6_dst_lookup(net, 0, oif, NULL, daddr, mark);
|
||||
if (IS_ERR(dst))
|
||||
return -EHOSTUNREACH;
|
||||
|
||||
dev = ip6_dst_idev(dst)->dev;
|
||||
idev = ip6_dst_idev(dst);
|
||||
if (!idev) {
|
||||
dst_release(dst);
|
||||
return -EHOSTUNREACH;
|
||||
}
|
||||
dev = idev->dev;
|
||||
ipv6_dev_get_saddr(dev_net(dev), dev, &daddr->in6, 0, &saddr->in6);
|
||||
dst_release(dst);
|
||||
return 0;
|
||||
|
@ -311,6 +311,18 @@ int drv_assign_vif_chanctx(struct ieee80211_local *local,
|
||||
might_sleep();
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
/*
|
||||
* We should perhaps push emulate chanctx down and only
|
||||
* make it call ->config() when the chanctx is actually
|
||||
* assigned here (and unassigned below), but that's yet
|
||||
* another change to all drivers to add assign/unassign
|
||||
* emulation callbacks. Maybe later.
|
||||
*/
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||
local->emulate_chanctx &&
|
||||
!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
return 0;
|
||||
|
||||
if (!check_sdata_in_driver(sdata))
|
||||
return -EIO;
|
||||
|
||||
@ -338,6 +350,11 @@ void drv_unassign_vif_chanctx(struct ieee80211_local *local,
|
||||
might_sleep();
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||
local->emulate_chanctx &&
|
||||
!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
return;
|
||||
|
||||
if (!check_sdata_in_driver(sdata))
|
||||
return;
|
||||
|
||||
|
@ -686,6 +686,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
|
||||
ieee80211_del_virtual_monitor(local);
|
||||
|
||||
ieee80211_recalc_idle(local);
|
||||
ieee80211_recalc_offload(local);
|
||||
|
||||
if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
|
||||
break;
|
||||
@ -1121,9 +1122,6 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
int ret;
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
return 0;
|
||||
|
||||
ASSERT_RTNL();
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
@ -1145,11 +1143,13 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
|
||||
|
||||
ieee80211_set_default_queues(sdata);
|
||||
|
||||
ret = drv_add_interface(local, sdata);
|
||||
if (WARN_ON(ret)) {
|
||||
/* ok .. stupid driver, it asked for this! */
|
||||
kfree(sdata);
|
||||
return ret;
|
||||
if (ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) {
|
||||
ret = drv_add_interface(local, sdata);
|
||||
if (WARN_ON(ret)) {
|
||||
/* ok .. stupid driver, it asked for this! */
|
||||
kfree(sdata);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
set_bit(SDATA_STATE_RUNNING, &sdata->state);
|
||||
@ -1187,9 +1187,6 @@ void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
return;
|
||||
|
||||
ASSERT_RTNL();
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
@ -1209,7 +1206,8 @@ void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
|
||||
|
||||
ieee80211_link_release_channel(&sdata->deflink);
|
||||
|
||||
drv_remove_interface(local, sdata);
|
||||
if (ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
drv_remove_interface(local, sdata);
|
||||
|
||||
kfree(sdata);
|
||||
}
|
||||
|
@ -358,7 +358,8 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_sub_if_data *sdata)
|
||||
struct cfg80211_scan_request *req;
|
||||
struct cfg80211_chan_def chandef;
|
||||
u8 bands_used = 0;
|
||||
int i, ielen, n_chans;
|
||||
int i, ielen;
|
||||
u32 *n_chans;
|
||||
u32 flags = 0;
|
||||
|
||||
req = rcu_dereference_protected(local->scan_req,
|
||||
@ -368,34 +369,34 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_sub_if_data *sdata)
|
||||
return false;
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) {
|
||||
local->hw_scan_req->req.n_channels = req->n_channels;
|
||||
|
||||
for (i = 0; i < req->n_channels; i++) {
|
||||
local->hw_scan_req->req.channels[i] = req->channels[i];
|
||||
bands_used |= BIT(req->channels[i]->band);
|
||||
}
|
||||
|
||||
n_chans = req->n_channels;
|
||||
} else {
|
||||
do {
|
||||
if (local->hw_scan_band == NUM_NL80211_BANDS)
|
||||
return false;
|
||||
|
||||
n_chans = 0;
|
||||
n_chans = &local->hw_scan_req->req.n_channels;
|
||||
*n_chans = 0;
|
||||
|
||||
for (i = 0; i < req->n_channels; i++) {
|
||||
if (req->channels[i]->band !=
|
||||
local->hw_scan_band)
|
||||
continue;
|
||||
local->hw_scan_req->req.channels[n_chans] =
|
||||
local->hw_scan_req->req.channels[(*n_chans)++] =
|
||||
req->channels[i];
|
||||
n_chans++;
|
||||
|
||||
bands_used |= BIT(req->channels[i]->band);
|
||||
}
|
||||
|
||||
local->hw_scan_band++;
|
||||
} while (!n_chans);
|
||||
} while (!*n_chans);
|
||||
}
|
||||
|
||||
local->hw_scan_req->req.n_channels = n_chans;
|
||||
ieee80211_prepare_scan_chandef(&chandef);
|
||||
|
||||
if (req->flags & NL80211_SCAN_FLAG_MIN_PREQ_CONTENT)
|
||||
|
@ -1843,7 +1843,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
|
||||
/* add interfaces */
|
||||
sdata = wiphy_dereference(local->hw.wiphy, local->monitor_sdata);
|
||||
if (sdata) {
|
||||
if (sdata && ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) {
|
||||
/* in HW restart it exists already */
|
||||
WARN_ON(local->resuming);
|
||||
res = drv_add_interface(local, sdata);
|
||||
|
@ -815,12 +815,21 @@ int __init netfilter_init(void)
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
ret = netfilter_lwtunnel_init();
|
||||
if (ret < 0)
|
||||
goto err_lwtunnel_pernet;
|
||||
#endif
|
||||
ret = netfilter_log_init();
|
||||
if (ret < 0)
|
||||
goto err_pernet;
|
||||
goto err_log_pernet;
|
||||
|
||||
return 0;
|
||||
err_pernet:
|
||||
err_log_pernet:
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
netfilter_lwtunnel_fini();
|
||||
err_lwtunnel_pernet:
|
||||
#endif
|
||||
unregister_pernet_subsys(&netfilter_net_ops);
|
||||
err:
|
||||
return ret;
|
||||
|
@ -53,12 +53,13 @@ MODULE_DESCRIPTION("core IP set support");
|
||||
MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_IPSET);
|
||||
|
||||
/* When the nfnl mutex or ip_set_ref_lock is held: */
|
||||
#define ip_set_dereference(p) \
|
||||
rcu_dereference_protected(p, \
|
||||
#define ip_set_dereference(inst) \
|
||||
rcu_dereference_protected((inst)->ip_set_list, \
|
||||
lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET) || \
|
||||
lockdep_is_held(&ip_set_ref_lock))
|
||||
lockdep_is_held(&ip_set_ref_lock) || \
|
||||
(inst)->is_deleted)
|
||||
#define ip_set(inst, id) \
|
||||
ip_set_dereference((inst)->ip_set_list)[id]
|
||||
ip_set_dereference(inst)[id]
|
||||
#define ip_set_ref_netlink(inst,id) \
|
||||
rcu_dereference_raw((inst)->ip_set_list)[id]
|
||||
#define ip_set_dereference_nfnl(p) \
|
||||
@ -1133,7 +1134,7 @@ static int ip_set_create(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
if (!list)
|
||||
goto cleanup;
|
||||
/* nfnl mutex is held, both lists are valid */
|
||||
tmp = ip_set_dereference(inst->ip_set_list);
|
||||
tmp = ip_set_dereference(inst);
|
||||
memcpy(list, tmp, sizeof(struct ip_set *) * inst->ip_set_max);
|
||||
rcu_assign_pointer(inst->ip_set_list, list);
|
||||
/* Make sure all current packets have passed through */
|
||||
|
@ -22,9 +22,6 @@
|
||||
#include <net/netfilter/nf_conntrack_acct.h>
|
||||
#include <net/netfilter/nf_conntrack_zones.h>
|
||||
#include <net/netfilter/nf_conntrack_timestamp.h>
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
#include <net/netfilter/nf_hooks_lwtunnel.h>
|
||||
#endif
|
||||
#include <linux/rculist_nulls.h>
|
||||
|
||||
static bool enable_hooks __read_mostly;
|
||||
@ -612,9 +609,6 @@ enum nf_ct_sysctl_index {
|
||||
NF_SYSCTL_CT_PROTO_TIMEOUT_GRE,
|
||||
NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM,
|
||||
#endif
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
NF_SYSCTL_CT_LWTUNNEL,
|
||||
#endif
|
||||
|
||||
NF_SYSCTL_CT_LAST_SYSCTL,
|
||||
};
|
||||
@ -946,15 +940,6 @@ static struct ctl_table nf_ct_sysctl_table[] = {
|
||||
.proc_handler = proc_dointvec_jiffies,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
[NF_SYSCTL_CT_LWTUNNEL] = {
|
||||
.procname = "nf_hooks_lwtunnel",
|
||||
.data = NULL,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = nf_hooks_lwtunnel_sysctl_handler,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct ctl_table nf_ct_netfilter_table[] = {
|
||||
|
@ -3,6 +3,9 @@
|
||||
#include <linux/sysctl.h>
|
||||
#include <net/lwtunnel.h>
|
||||
#include <net/netfilter/nf_hooks_lwtunnel.h>
|
||||
#include <linux/netfilter.h>
|
||||
|
||||
#include "nf_internals.h"
|
||||
|
||||
static inline int nf_hooks_lwtunnel_get(void)
|
||||
{
|
||||
@ -50,4 +53,68 @@ int nf_hooks_lwtunnel_sysctl_handler(struct ctl_table *table, int write,
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_hooks_lwtunnel_sysctl_handler);
|
||||
|
||||
static struct ctl_table nf_lwtunnel_sysctl_table[] = {
|
||||
{
|
||||
.procname = "nf_hooks_lwtunnel",
|
||||
.data = NULL,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = nf_hooks_lwtunnel_sysctl_handler,
|
||||
},
|
||||
};
|
||||
|
||||
static int __net_init nf_lwtunnel_net_init(struct net *net)
|
||||
{
|
||||
struct ctl_table_header *hdr;
|
||||
struct ctl_table *table;
|
||||
|
||||
table = nf_lwtunnel_sysctl_table;
|
||||
if (!net_eq(net, &init_net)) {
|
||||
table = kmemdup(nf_lwtunnel_sysctl_table,
|
||||
sizeof(nf_lwtunnel_sysctl_table),
|
||||
GFP_KERNEL);
|
||||
if (!table)
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
hdr = register_net_sysctl_sz(net, "net/netfilter", table,
|
||||
ARRAY_SIZE(nf_lwtunnel_sysctl_table));
|
||||
if (!hdr)
|
||||
goto err_reg;
|
||||
|
||||
net->nf.nf_lwtnl_dir_header = hdr;
|
||||
|
||||
return 0;
|
||||
err_reg:
|
||||
if (!net_eq(net, &init_net))
|
||||
kfree(table);
|
||||
err_alloc:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void __net_exit nf_lwtunnel_net_exit(struct net *net)
|
||||
{
|
||||
const struct ctl_table *table;
|
||||
|
||||
table = net->nf.nf_lwtnl_dir_header->ctl_table_arg;
|
||||
unregister_net_sysctl_table(net->nf.nf_lwtnl_dir_header);
|
||||
if (!net_eq(net, &init_net))
|
||||
kfree(table);
|
||||
}
|
||||
|
||||
static struct pernet_operations nf_lwtunnel_net_ops = {
|
||||
.init = nf_lwtunnel_net_init,
|
||||
.exit = nf_lwtunnel_net_exit,
|
||||
};
|
||||
|
||||
int __init netfilter_lwtunnel_init(void)
|
||||
{
|
||||
return register_pernet_subsys(&nf_lwtunnel_net_ops);
|
||||
}
|
||||
|
||||
void netfilter_lwtunnel_fini(void)
|
||||
{
|
||||
unregister_pernet_subsys(&nf_lwtunnel_net_ops);
|
||||
}
|
||||
#endif /* CONFIG_SYSCTL */
|
||||
|
@ -29,6 +29,12 @@ void nf_queue_nf_hook_drop(struct net *net);
|
||||
/* nf_log.c */
|
||||
int __init netfilter_log_init(void);
|
||||
|
||||
#ifdef CONFIG_LWTUNNEL
|
||||
/* nf_hooks_lwtunnel.c */
|
||||
int __init netfilter_lwtunnel_init(void);
|
||||
void netfilter_lwtunnel_fini(void);
|
||||
#endif
|
||||
|
||||
/* core.c */
|
||||
void nf_hook_entries_delete_raw(struct nf_hook_entries __rcu **pp,
|
||||
const struct nf_hook_ops *reg);
|
||||
|
@ -121,7 +121,8 @@ static void nr_heartbeat_expiry(struct timer_list *t)
|
||||
is accepted() it isn't 'dead' so doesn't get removed. */
|
||||
if (sock_flag(sk, SOCK_DESTROY) ||
|
||||
(sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {
|
||||
sock_hold(sk);
|
||||
if (sk->sk_state == TCP_LISTEN)
|
||||
sock_hold(sk);
|
||||
bh_unlock_sock(sk);
|
||||
nr_destroy_socket(sk);
|
||||
goto out;
|
||||
|
@ -830,7 +830,6 @@ int tcf_idr_check_alloc(struct tc_action_net *tn, u32 *index,
|
||||
u32 max;
|
||||
|
||||
if (*index) {
|
||||
again:
|
||||
rcu_read_lock();
|
||||
p = idr_find(&idrinfo->action_idr, *index);
|
||||
|
||||
@ -839,7 +838,7 @@ int tcf_idr_check_alloc(struct tc_action_net *tn, u32 *index,
|
||||
* index but did not assign the pointer yet.
|
||||
*/
|
||||
rcu_read_unlock();
|
||||
goto again;
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (!p) {
|
||||
|
@ -41,21 +41,26 @@ static struct workqueue_struct *act_ct_wq;
|
||||
static struct rhashtable zones_ht;
|
||||
static DEFINE_MUTEX(zones_mutex);
|
||||
|
||||
struct zones_ht_key {
|
||||
struct net *net;
|
||||
u16 zone;
|
||||
};
|
||||
|
||||
struct tcf_ct_flow_table {
|
||||
struct rhash_head node; /* In zones tables */
|
||||
|
||||
struct rcu_work rwork;
|
||||
struct nf_flowtable nf_ft;
|
||||
refcount_t ref;
|
||||
u16 zone;
|
||||
struct zones_ht_key key;
|
||||
|
||||
bool dying;
|
||||
};
|
||||
|
||||
static const struct rhashtable_params zones_params = {
|
||||
.head_offset = offsetof(struct tcf_ct_flow_table, node),
|
||||
.key_offset = offsetof(struct tcf_ct_flow_table, zone),
|
||||
.key_len = sizeof_field(struct tcf_ct_flow_table, zone),
|
||||
.key_offset = offsetof(struct tcf_ct_flow_table, key),
|
||||
.key_len = sizeof_field(struct tcf_ct_flow_table, key),
|
||||
.automatic_shrinking = true,
|
||||
};
|
||||
|
||||
@ -316,11 +321,12 @@ static struct nf_flowtable_type flowtable_ct = {
|
||||
|
||||
static int tcf_ct_flow_table_get(struct net *net, struct tcf_ct_params *params)
|
||||
{
|
||||
struct zones_ht_key key = { .net = net, .zone = params->zone };
|
||||
struct tcf_ct_flow_table *ct_ft;
|
||||
int err = -ENOMEM;
|
||||
|
||||
mutex_lock(&zones_mutex);
|
||||
ct_ft = rhashtable_lookup_fast(&zones_ht, ¶ms->zone, zones_params);
|
||||
ct_ft = rhashtable_lookup_fast(&zones_ht, &key, zones_params);
|
||||
if (ct_ft && refcount_inc_not_zero(&ct_ft->ref))
|
||||
goto out_unlock;
|
||||
|
||||
@ -329,7 +335,7 @@ static int tcf_ct_flow_table_get(struct net *net, struct tcf_ct_params *params)
|
||||
goto err_alloc;
|
||||
refcount_set(&ct_ft->ref, 1);
|
||||
|
||||
ct_ft->zone = params->zone;
|
||||
ct_ft->key = key;
|
||||
err = rhashtable_insert_fast(&zones_ht, &ct_ft->node, zones_params);
|
||||
if (err)
|
||||
goto err_insert;
|
||||
|
@ -2105,6 +2105,7 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
|
||||
} else {
|
||||
n = tipc_node_find_by_id(net, ehdr->id);
|
||||
}
|
||||
skb_dst_force(skb);
|
||||
tipc_crypto_rcv(net, (n) ? n->crypto_rx : NULL, &skb, b);
|
||||
if (!skb)
|
||||
return;
|
||||
|
@ -3416,10 +3416,14 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
||||
wiphy = &rdev->wiphy;
|
||||
|
||||
/* Determine number of channels, needed to allocate creq */
|
||||
if (wreq && wreq->num_channels)
|
||||
if (wreq && wreq->num_channels) {
|
||||
/* Passed from userspace so should be checked */
|
||||
if (unlikely(wreq->num_channels > IW_MAX_FREQUENCIES))
|
||||
return -EINVAL;
|
||||
n_channels = wreq->num_channels;
|
||||
else
|
||||
} else {
|
||||
n_channels = ieee80211_get_num_supported_channels(wiphy);
|
||||
}
|
||||
|
||||
creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
|
||||
n_channels * sizeof(void *),
|
||||
@ -3493,8 +3497,10 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
||||
memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len);
|
||||
creq->ssids[0].ssid_len = wreq->essid_len;
|
||||
}
|
||||
if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE)
|
||||
if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE) {
|
||||
creq->ssids = NULL;
|
||||
creq->n_ssids = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_NL80211_BANDS; i++)
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include "verifier_movsx.skel.h"
|
||||
#include "verifier_netfilter_ctx.skel.h"
|
||||
#include "verifier_netfilter_retcode.skel.h"
|
||||
#include "verifier_or_jmp32_k.skel.h"
|
||||
#include "verifier_precision.skel.h"
|
||||
#include "verifier_prevent_map_lookup.skel.h"
|
||||
#include "verifier_raw_stack.skel.h"
|
||||
@ -170,6 +171,7 @@ void test_verifier_meta_access(void) { RUN(verifier_meta_access); }
|
||||
void test_verifier_movsx(void) { RUN(verifier_movsx); }
|
||||
void test_verifier_netfilter_ctx(void) { RUN(verifier_netfilter_ctx); }
|
||||
void test_verifier_netfilter_retcode(void) { RUN(verifier_netfilter_retcode); }
|
||||
void test_verifier_or_jmp32_k(void) { RUN(verifier_or_jmp32_k); }
|
||||
void test_verifier_precision(void) { RUN(verifier_precision); }
|
||||
void test_verifier_prevent_map_lookup(void) { RUN(verifier_prevent_map_lookup); }
|
||||
void test_verifier_raw_stack(void) { RUN(verifier_raw_stack); }
|
||||
|
41
tools/testing/selftests/bpf/progs/verifier_or_jmp32_k.c
Normal file
41
tools/testing/selftests/bpf/progs/verifier_or_jmp32_k.c
Normal file
@ -0,0 +1,41 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include "bpf_misc.h"
|
||||
|
||||
SEC("socket")
|
||||
__description("or_jmp32_k: bit ops + branch on unknown value")
|
||||
__failure
|
||||
__msg("R0 invalid mem access 'scalar'")
|
||||
__naked void or_jmp32_k(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
r0 = 0xffffffff; \
|
||||
r0 /= 1; \
|
||||
r1 = 0; \
|
||||
w1 = -1; \
|
||||
w1 >>= 1; \
|
||||
w0 &= w1; \
|
||||
w0 |= 2; \
|
||||
if w0 != 0x7ffffffd goto l1; \
|
||||
r0 = 1; \
|
||||
exit; \
|
||||
l3: \
|
||||
r0 = 5; \
|
||||
*(u64*)(r0 - 8) = r0; \
|
||||
exit; \
|
||||
l2: \
|
||||
w0 -= 0xe; \
|
||||
if w0 == 1 goto l3; \
|
||||
r0 = 4; \
|
||||
exit; \
|
||||
l1: \
|
||||
w0 -= 0x7ffffff0; \
|
||||
if w0 s>= 0xe goto l2; \
|
||||
r0 = 3; \
|
||||
exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
@ -1,2 +1,8 @@
|
||||
CONFIG_VIRTIO_NET=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_CGROUP_BPF=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_NET_VRF=m
|
||||
CONFIG_VIRTIO_DEBUG=y
|
||||
CONFIG_VIRTIO_NET=y
|
||||
|
@ -43,6 +43,8 @@ TEST_PROGS += srv6_hl2encap_red_l2vpn_test.sh
|
||||
TEST_PROGS += srv6_end_next_csid_l3vpn_test.sh
|
||||
TEST_PROGS += srv6_end_x_next_csid_l3vpn_test.sh
|
||||
TEST_PROGS += srv6_end_flavors_test.sh
|
||||
TEST_PROGS += srv6_end_dx4_netfilter_test.sh
|
||||
TEST_PROGS += srv6_end_dx6_netfilter_test.sh
|
||||
TEST_PROGS += vrf_strict_mode_test.sh
|
||||
TEST_PROGS += arp_ndisc_evict_nocarrier.sh
|
||||
TEST_PROGS += ndisc_unsolicited_na_test.sh
|
||||
|
@ -101,3 +101,5 @@ CONFIG_NETFILTER_XT_MATCH_POLICY=m
|
||||
CONFIG_CRYPTO_ARIA=y
|
||||
CONFIG_XFRM_INTERFACE=m
|
||||
CONFIG_XFRM_USER=m
|
||||
CONFIG_IP_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP6_NF_MATCH_RPFILTER=m
|
||||
|
@ -160,10 +160,12 @@ make_connection()
|
||||
local is_v6=$1
|
||||
local app_port=$app4_port
|
||||
local connect_addr="10.0.1.1"
|
||||
local client_addr="10.0.1.2"
|
||||
local listen_addr="0.0.0.0"
|
||||
if [ "$is_v6" = "v6" ]
|
||||
then
|
||||
connect_addr="dead:beef:1::1"
|
||||
client_addr="dead:beef:1::2"
|
||||
listen_addr="::"
|
||||
app_port=$app6_port
|
||||
else
|
||||
@ -206,6 +208,7 @@ make_connection()
|
||||
[ "$server_serverside" = 1 ]
|
||||
then
|
||||
test_pass
|
||||
print_title "Connection info: ${client_addr}:${client_port} -> ${connect_addr}:${app_port}"
|
||||
else
|
||||
test_fail "Expected tokens (c:${client_token} - s:${server_token}) and server (c:${client_serverside} - s:${server_serverside})"
|
||||
mptcp_lib_result_print_all_tap
|
||||
@ -297,7 +300,7 @@ test_announce()
|
||||
ip netns exec "$ns2"\
|
||||
./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\
|
||||
ns2eth1
|
||||
print_test "ADD_ADDR id:${client_addr_id} 10.0.2.2 (ns2) => ns1, reuse port"
|
||||
print_test "ADD_ADDR id:client 10.0.2.2 (ns2) => ns1, reuse port"
|
||||
sleep 0.5
|
||||
verify_announce_event $server_evts $ANNOUNCED $server4_token "10.0.2.2" $client_addr_id \
|
||||
"$client4_port"
|
||||
@ -306,7 +309,7 @@ test_announce()
|
||||
:>"$server_evts"
|
||||
ip netns exec "$ns2" ./pm_nl_ctl ann\
|
||||
dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1
|
||||
print_test "ADD_ADDR6 id:${client_addr_id} dead:beef:2::2 (ns2) => ns1, reuse port"
|
||||
print_test "ADD_ADDR6 id:client dead:beef:2::2 (ns2) => ns1, reuse port"
|
||||
sleep 0.5
|
||||
verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead:beef:2::2"\
|
||||
"$client_addr_id" "$client6_port" "v6"
|
||||
@ -316,7 +319,7 @@ test_announce()
|
||||
client_addr_id=$((client_addr_id+1))
|
||||
ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\
|
||||
$client_addr_id dev ns2eth1 port $new4_port
|
||||
print_test "ADD_ADDR id:${client_addr_id} 10.0.2.2 (ns2) => ns1, new port"
|
||||
print_test "ADD_ADDR id:client+1 10.0.2.2 (ns2) => ns1, new port"
|
||||
sleep 0.5
|
||||
verify_announce_event "$server_evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\
|
||||
"$client_addr_id" "$new4_port"
|
||||
@ -327,7 +330,7 @@ test_announce()
|
||||
# ADD_ADDR from the server to client machine reusing the subflow port
|
||||
ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\
|
||||
$server_addr_id dev ns1eth2
|
||||
print_test "ADD_ADDR id:${server_addr_id} 10.0.2.1 (ns1) => ns2, reuse port"
|
||||
print_test "ADD_ADDR id:server 10.0.2.1 (ns1) => ns2, reuse port"
|
||||
sleep 0.5
|
||||
verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\
|
||||
"$server_addr_id" "$app4_port"
|
||||
@ -336,7 +339,7 @@ test_announce()
|
||||
:>"$client_evts"
|
||||
ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\
|
||||
$server_addr_id dev ns1eth2
|
||||
print_test "ADD_ADDR6 id:${server_addr_id} dead:beef:2::1 (ns1) => ns2, reuse port"
|
||||
print_test "ADD_ADDR6 id:server dead:beef:2::1 (ns1) => ns2, reuse port"
|
||||
sleep 0.5
|
||||
verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead:beef:2::1"\
|
||||
"$server_addr_id" "$app6_port" "v6"
|
||||
@ -346,7 +349,7 @@ test_announce()
|
||||
server_addr_id=$((server_addr_id+1))
|
||||
ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\
|
||||
$server_addr_id dev ns1eth2 port $new4_port
|
||||
print_test "ADD_ADDR id:${server_addr_id} 10.0.2.1 (ns1) => ns2, new port"
|
||||
print_test "ADD_ADDR id:server+1 10.0.2.1 (ns1) => ns2, new port"
|
||||
sleep 0.5
|
||||
verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\
|
||||
"$server_addr_id" "$new4_port"
|
||||
@ -380,7 +383,7 @@ test_remove()
|
||||
local invalid_token=$(( client4_token - 1 ))
|
||||
ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\
|
||||
$client_addr_id > /dev/null 2>&1
|
||||
print_test "RM_ADDR id:${client_addr_id} ns2 => ns1, invalid token"
|
||||
print_test "RM_ADDR id:client ns2 => ns1, invalid token"
|
||||
local type
|
||||
type=$(mptcp_lib_evts_get_info type "$server_evts")
|
||||
if [ "$type" = "" ]
|
||||
@ -394,7 +397,7 @@ test_remove()
|
||||
local invalid_id=$(( client_addr_id + 1 ))
|
||||
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\
|
||||
$invalid_id > /dev/null 2>&1
|
||||
print_test "RM_ADDR id:${invalid_id} ns2 => ns1, invalid id"
|
||||
print_test "RM_ADDR id:client+1 ns2 => ns1, invalid id"
|
||||
type=$(mptcp_lib_evts_get_info type "$server_evts")
|
||||
if [ "$type" = "" ]
|
||||
then
|
||||
@ -407,7 +410,7 @@ test_remove()
|
||||
:>"$server_evts"
|
||||
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\
|
||||
$client_addr_id
|
||||
print_test "RM_ADDR id:${client_addr_id} ns2 => ns1"
|
||||
print_test "RM_ADDR id:client ns2 => ns1"
|
||||
sleep 0.5
|
||||
verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id"
|
||||
|
||||
@ -416,7 +419,7 @@ test_remove()
|
||||
client_addr_id=$(( client_addr_id - 1 ))
|
||||
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\
|
||||
$client_addr_id
|
||||
print_test "RM_ADDR id:${client_addr_id} ns2 => ns1"
|
||||
print_test "RM_ADDR id:client-1 ns2 => ns1"
|
||||
sleep 0.5
|
||||
verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id"
|
||||
|
||||
@ -424,7 +427,7 @@ test_remove()
|
||||
:>"$server_evts"
|
||||
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\
|
||||
$client_addr_id
|
||||
print_test "RM_ADDR6 id:${client_addr_id} ns2 => ns1"
|
||||
print_test "RM_ADDR6 id:client-1 ns2 => ns1"
|
||||
sleep 0.5
|
||||
verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_addr_id"
|
||||
|
||||
@ -434,7 +437,7 @@ test_remove()
|
||||
# RM_ADDR from the server to client machine
|
||||
ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\
|
||||
$server_addr_id
|
||||
print_test "RM_ADDR id:${server_addr_id} ns1 => ns2"
|
||||
print_test "RM_ADDR id:server ns1 => ns2"
|
||||
sleep 0.5
|
||||
verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id"
|
||||
|
||||
@ -443,7 +446,7 @@ test_remove()
|
||||
server_addr_id=$(( server_addr_id - 1 ))
|
||||
ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\
|
||||
$server_addr_id
|
||||
print_test "RM_ADDR id:${server_addr_id} ns1 => ns2"
|
||||
print_test "RM_ADDR id:server-1 ns1 => ns2"
|
||||
sleep 0.5
|
||||
verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id"
|
||||
|
||||
@ -451,7 +454,7 @@ test_remove()
|
||||
:>"$client_evts"
|
||||
ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\
|
||||
$server_addr_id
|
||||
print_test "RM_ADDR6 id:${server_addr_id} ns1 => ns2"
|
||||
print_test "RM_ADDR6 id:server-1 ns1 => ns2"
|
||||
sleep 0.5
|
||||
verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_addr_id"
|
||||
}
|
||||
@ -479,8 +482,14 @@ verify_subflow_events()
|
||||
local locid
|
||||
local remid
|
||||
local info
|
||||
local e_dport_txt
|
||||
|
||||
info="${e_saddr} (${e_from}) => ${e_daddr}:${e_dport} (${e_to})"
|
||||
# only display the fixed ports
|
||||
if [ "${e_dport}" -ge "${app4_port}" ] && [ "${e_dport}" -le "${app6_port}" ]; then
|
||||
e_dport_txt=":${e_dport}"
|
||||
fi
|
||||
|
||||
info="${e_saddr} (${e_from}) => ${e_daddr}${e_dport_txt} (${e_to})"
|
||||
|
||||
if [ "$e_type" = "$SUB_ESTABLISHED" ]
|
||||
then
|
||||
@ -766,7 +775,7 @@ test_subflows_v4_v6_mix()
|
||||
:>"$client_evts"
|
||||
ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server6_token" id\
|
||||
$server_addr_id dev ns1eth2
|
||||
print_test "ADD_ADDR4 id:${server_addr_id} 10.0.2.1 (ns1) => ns2, reuse port"
|
||||
print_test "ADD_ADDR4 id:server 10.0.2.1 (ns1) => ns2, reuse port"
|
||||
sleep 0.5
|
||||
verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "10.0.2.1"\
|
||||
"$server_addr_id" "$app6_port"
|
||||
@ -861,7 +870,7 @@ test_listener()
|
||||
local listener_pid=$!
|
||||
|
||||
sleep 0.5
|
||||
print_test "CREATE_LISTENER 10.0.2.2:$client4_port"
|
||||
print_test "CREATE_LISTENER 10.0.2.2 (client port)"
|
||||
verify_listener_events $client_evts $LISTENER_CREATED $AF_INET 10.0.2.2 $client4_port
|
||||
|
||||
# ADD_ADDR from client to server machine reusing the subflow port
|
||||
@ -878,13 +887,14 @@ test_listener()
|
||||
mptcp_lib_kill_wait $listener_pid
|
||||
|
||||
sleep 0.5
|
||||
print_test "CLOSE_LISTENER 10.0.2.2:$client4_port"
|
||||
print_test "CLOSE_LISTENER 10.0.2.2 (client port)"
|
||||
verify_listener_events $client_evts $LISTENER_CLOSED $AF_INET 10.0.2.2 $client4_port
|
||||
}
|
||||
|
||||
print_title "Make connections"
|
||||
make_connection
|
||||
make_connection "v6"
|
||||
print_title "Will be using address IDs ${client_addr_id} (client) and ${server_addr_id} (server)"
|
||||
|
||||
test_announce
|
||||
test_remove
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# OVS kernel module self tests
|
||||
|
@ -531,7 +531,7 @@ class ovsactions(nla):
|
||||
for flat_act in parse_flat_map:
|
||||
if parse_starts_block(actstr, flat_act[0], False):
|
||||
actstr = actstr[len(flat_act[0]):]
|
||||
self["attrs"].append([flat_act[1]])
|
||||
self["attrs"].append([flat_act[1], True])
|
||||
actstr = actstr[strspn(actstr, ", ") :]
|
||||
parsed = True
|
||||
|
||||
|
335
tools/testing/selftests/net/srv6_end_dx4_netfilter_test.sh
Executable file
335
tools/testing/selftests/net/srv6_end_dx4_netfilter_test.sh
Executable file
@ -0,0 +1,335 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# author: Jianguo Wu <wujianguo@chinatelecom.cn>
|
||||
#
|
||||
# Mostly copied from tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh.
|
||||
#
|
||||
# This script is designed for testing the support of netfilter hooks for
|
||||
# SRv6 End.DX4 behavior.
|
||||
#
|
||||
# Hereafter a network diagram is shown, where one tenants (named 100) offer
|
||||
# IPv4 L3 VPN services allowing hosts to communicate with each other across
|
||||
# an IPv6 network.
|
||||
#
|
||||
# Routers rt-1 and rt-2 implement IPv4 L3 VPN services leveraging the SRv6
|
||||
# architecture. The key components for such VPNs are: a) SRv6 Encap behavior,
|
||||
# b) SRv6 End.DX4 behavior.
|
||||
#
|
||||
# To explain how an IPv4 L3 VPN based on SRv6 works, let us briefly consider an
|
||||
# example where, within the same domain of tenant 100, the host hs-1 pings
|
||||
# the host hs-2.
|
||||
#
|
||||
# First of all, L2 reachability of the host hs-2 is taken into account by
|
||||
# the router rt-1 which acts as an arp proxy.
|
||||
#
|
||||
# When the host hs-1 sends an IPv4 packet destined to hs-2, the router rt-1
|
||||
# receives the packet on the internal veth-t100 interface, rt-1 contains the
|
||||
# SRv6 Encap route for encapsulating the IPv4 packet in a IPv6 plus the Segment
|
||||
# Routing Header (SRH) packet. This packet is sent through the (IPv6) core
|
||||
# network up to the router rt-2 that receives it on veth0 interface.
|
||||
#
|
||||
# The rt-2 router uses the 'localsid' routing table to process incoming
|
||||
# IPv6+SRH packets which belong to the VPN of the tenant 100. For each of these
|
||||
# packets, the SRv6 End.DX4 behavior removes the outer IPv6+SRH headers and
|
||||
# routs the packet to the specified nexthop. Afterwards, the packet is sent to
|
||||
# the host hs-2 through the veth-t100 interface.
|
||||
#
|
||||
# The ping response follows the same processing but this time the role of rt-1
|
||||
# and rt-2 are swapped.
|
||||
#
|
||||
# And when net.netfilter.nf_hooks_lwtunnel is set to 1 in rt-1 or rt-2, and a
|
||||
# rpfilter iptables rule is added, SRv6 packets will go through netfilter PREROUTING
|
||||
# hooks.
|
||||
#
|
||||
#
|
||||
# +-------------------+ +-------------------+
|
||||
# | | | |
|
||||
# | hs-1 netns | | hs-2 netns |
|
||||
# | | | |
|
||||
# | +-------------+ | | +-------------+ |
|
||||
# | | veth0 | | | | veth0 | |
|
||||
# | | 10.0.0.1/24 | | | | 10.0.0.2/24 | |
|
||||
# | +-------------+ | | +-------------+ |
|
||||
# | . | | . |
|
||||
# +-------------------+ +-------------------+
|
||||
# . .
|
||||
# . .
|
||||
# . .
|
||||
# +-----------------------------------+ +-----------------------------------+
|
||||
# | . | | . |
|
||||
# | +---------------+ | | +---------------- |
|
||||
# | | veth-t100 | | | | veth-t100 | |
|
||||
# | | 10.0.0.11/24 | +----------+ | | +----------+ | 10.0.0.22/24 | |
|
||||
# | +-------+-------+ | route | | | | route | +-------+-------- |
|
||||
# | | table | | | | table | |
|
||||
# | +----------+ | | +----------+ |
|
||||
# | +--------------+ | | +--------------+ |
|
||||
# | | veth0 | | | | veth0 | |
|
||||
# | | 2001:11::1/64 |.|...|.| 2001:11::2/64 | |
|
||||
# | +--------------+ | | +--------------+ |
|
||||
# | | | |
|
||||
# | rt-1 netns | | rt-2 netns |
|
||||
# | | | |
|
||||
# +-----------------------------------+ +-----------------------------------+
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# | Network configuration |
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# rt-1: localsid table
|
||||
# +----------------------------------------------------------------+
|
||||
# |SID |Action |
|
||||
# +----------------------------------------------------------------+
|
||||
# |fc00:21:100::6004|apply SRv6 End.DX4 nh4 10.0.0.1 dev veth-t100 |
|
||||
# +----------------------------------------------------------------+
|
||||
#
|
||||
# rt-1: route table
|
||||
# +---------------------------------------------------+
|
||||
# |host |Action |
|
||||
# +---------------------------------------------------+
|
||||
# |10.0.0.2 |apply seg6 encap segs fc00:12:100::6004|
|
||||
# +---------------------------------------------------+
|
||||
# |10.0.0.0/24|forward to dev veth_t100 |
|
||||
# +---------------------------------------------------+
|
||||
#
|
||||
#
|
||||
# rt-2: localsid table
|
||||
# +---------------------------------------------------------------+
|
||||
# |SID |Action |
|
||||
# +---------------------------------------------------------------+
|
||||
# |fc00:12:100::6004|apply SRv6 End.DX4 nh4 10.0.0.2 dev veth-t100|
|
||||
# +---------------------------------------------------------------+
|
||||
#
|
||||
# rt-2: route table
|
||||
# +---------------------------------------------------+
|
||||
# |host |Action |
|
||||
# +---------------------------------------------------+
|
||||
# |10.0.0.1 |apply seg6 encap segs fc00:21:100::6004|
|
||||
# +---------------------------------------------------+
|
||||
# |10.0.0.0/24|forward to dev veth_t100 |
|
||||
# +---------------------------------------------------+
|
||||
#
|
||||
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
|
||||
readonly IPv6_RT_NETWORK=2001:11
|
||||
readonly IPv4_HS_NETWORK=10.0.0
|
||||
readonly SID_LOCATOR=fc00
|
||||
|
||||
PING_TIMEOUT_SEC=4
|
||||
|
||||
ret=0
|
||||
|
||||
PAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no}
|
||||
|
||||
log_test()
|
||||
{
|
||||
local rc=$1
|
||||
local expected=$2
|
||||
local msg="$3"
|
||||
|
||||
if [ ${rc} -eq ${expected} ]; then
|
||||
nsuccess=$((nsuccess+1))
|
||||
printf "\n TEST: %-60s [ OK ]\n" "${msg}"
|
||||
else
|
||||
ret=1
|
||||
nfail=$((nfail+1))
|
||||
printf "\n TEST: %-60s [FAIL]\n" "${msg}"
|
||||
if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
|
||||
echo
|
||||
echo "hit enter to continue, 'q' to quit"
|
||||
read a
|
||||
[ "$a" = "q" ] && exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
print_log_test_results()
|
||||
{
|
||||
if [ "$TESTS" != "none" ]; then
|
||||
printf "\nTests passed: %3d\n" ${nsuccess}
|
||||
printf "Tests failed: %3d\n" ${nfail}
|
||||
fi
|
||||
}
|
||||
|
||||
log_section()
|
||||
{
|
||||
echo
|
||||
echo "################################################################################"
|
||||
echo "TEST SECTION: $*"
|
||||
echo "################################################################################"
|
||||
}
|
||||
|
||||
cleanup()
|
||||
{
|
||||
ip link del veth-rt-1 2>/dev/null || true
|
||||
ip link del veth-rt-2 2>/dev/null || true
|
||||
|
||||
# destroy routers rt-* and hosts hs-*
|
||||
for ns in $(ip netns show | grep -E 'rt-*|hs-*'); do
|
||||
ip netns del ${ns} || true
|
||||
done
|
||||
}
|
||||
|
||||
# Setup the basic networking for the routers
|
||||
setup_rt_networking()
|
||||
{
|
||||
local rt=$1
|
||||
local nsname=rt-${rt}
|
||||
|
||||
ip netns add ${nsname}
|
||||
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv6.conf.all.accept_dad=0
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv6.conf.default.accept_dad=0
|
||||
|
||||
ip link set veth-rt-${rt} netns ${nsname}
|
||||
ip -netns ${nsname} link set veth-rt-${rt} name veth0
|
||||
|
||||
ip -netns ${nsname} addr add ${IPv6_RT_NETWORK}::${rt}/64 dev veth0 nodad
|
||||
ip -netns ${nsname} link set veth0 up
|
||||
ip -netns ${nsname} link set lo up
|
||||
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv4.ip_forward=1
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv6.conf.all.forwarding=1
|
||||
}
|
||||
|
||||
setup_rt_netfilter()
|
||||
{
|
||||
local rt=$1
|
||||
local nsname=rt-${rt}
|
||||
|
||||
ip netns exec ${nsname} sysctl -wq net.netfilter.nf_hooks_lwtunnel=1
|
||||
ip netns exec ${nsname} iptables -t raw -A PREROUTING -m rpfilter --invert -j DROP
|
||||
}
|
||||
|
||||
setup_hs()
|
||||
{
|
||||
local hs=$1
|
||||
local rt=$2
|
||||
local tid=$3
|
||||
local hsname=hs-${hs}
|
||||
local rtname=rt-${rt}
|
||||
local rtveth=veth-t${tid}
|
||||
|
||||
# set the networking for the host
|
||||
ip netns add ${hsname}
|
||||
|
||||
ip -netns ${hsname} link add veth0 type veth peer name ${rtveth}
|
||||
ip -netns ${hsname} link set ${rtveth} netns ${rtname}
|
||||
ip -netns ${hsname} addr add ${IPv4_HS_NETWORK}.${hs}/24 dev veth0
|
||||
ip -netns ${hsname} link set veth0 up
|
||||
ip -netns ${hsname} link set lo up
|
||||
|
||||
ip -netns ${rtname} addr add ${IPv4_HS_NETWORK}.${rt}${hs}/24 dev ${rtveth}
|
||||
ip -netns ${rtname} link set ${rtveth} up
|
||||
|
||||
ip netns exec ${rtname} sysctl -wq net.ipv4.conf.${rtveth}.proxy_arp=1
|
||||
}
|
||||
|
||||
setup_vpn_config()
|
||||
{
|
||||
local hssrc=$1
|
||||
local rtsrc=$2
|
||||
local hsdst=$3
|
||||
local rtdst=$4
|
||||
local tid=$5
|
||||
|
||||
local hssrc_name=hs-t${tid}-${hssrc}
|
||||
local hsdst_name=hs-t${tid}-${hsdst}
|
||||
local rtsrc_name=rt-${rtsrc}
|
||||
local rtdst_name=rt-${rtdst}
|
||||
local vpn_sid=${SID_LOCATOR}:${hssrc}${hsdst}:${tid}::6004
|
||||
|
||||
# set the encap route for encapsulating packets which arrive from the
|
||||
# host hssrc and destined to the access router rtsrc.
|
||||
ip -netns ${rtsrc_name} -4 route add ${IPv4_HS_NETWORK}.${hsdst}/32 \
|
||||
encap seg6 mode encap segs ${vpn_sid} dev veth0
|
||||
ip -netns ${rtsrc_name} -6 route add ${vpn_sid}/128 \
|
||||
via 2001:11::${rtdst} dev veth0
|
||||
|
||||
# set the decap route for decapsulating packets which arrive from
|
||||
# the rtdst router and destined to the hsdst host.
|
||||
ip -netns ${rtdst_name} -6 route add ${vpn_sid}/128 \
|
||||
encap seg6local action End.DX4 nh4 ${IPv4_HS_NETWORK}.${hsdst} dev veth-t${tid}
|
||||
}
|
||||
|
||||
setup()
|
||||
{
|
||||
ip link add veth-rt-1 type veth peer name veth-rt-2
|
||||
# setup the networking for router rt-1 and router rt-2
|
||||
setup_rt_networking 1
|
||||
setup_rt_networking 2
|
||||
|
||||
# setup two hosts for the tenant 100.
|
||||
# - host hs-1 is directly connected to the router rt-1;
|
||||
# - host hs-2 is directly connected to the router rt-2.
|
||||
setup_hs 1 1 100
|
||||
setup_hs 2 2 100
|
||||
|
||||
# setup the IPv4 L3 VPN which connects the host hs-1 and host hs-2.
|
||||
setup_vpn_config 1 1 2 2 100 #args: src_host src_router dst_host dst_router tenant
|
||||
setup_vpn_config 2 2 1 1 100
|
||||
}
|
||||
|
||||
check_hs_connectivity()
|
||||
{
|
||||
local hssrc=$1
|
||||
local hsdst=$2
|
||||
local tid=$3
|
||||
|
||||
ip netns exec hs-${hssrc} ping -c 1 -W ${PING_TIMEOUT_SEC} \
|
||||
${IPv4_HS_NETWORK}.${hsdst} >/dev/null 2>&1
|
||||
}
|
||||
|
||||
check_and_log_hs_connectivity()
|
||||
{
|
||||
local hssrc=$1
|
||||
local hsdst=$2
|
||||
local tid=$3
|
||||
|
||||
check_hs_connectivity ${hssrc} ${hsdst} ${tid}
|
||||
log_test $? 0 "Hosts connectivity: hs-${hssrc} -> hs-${hsdst} (tenant ${tid})"
|
||||
}
|
||||
|
||||
host_tests()
|
||||
{
|
||||
log_section "SRv6 VPN connectivity test among hosts in the same tenant"
|
||||
|
||||
check_and_log_hs_connectivity 1 2 100
|
||||
check_and_log_hs_connectivity 2 1 100
|
||||
}
|
||||
|
||||
router_netfilter_tests()
|
||||
{
|
||||
log_section "SRv6 VPN connectivity test with netfilter enabled in routers"
|
||||
setup_rt_netfilter 1
|
||||
setup_rt_netfilter 2
|
||||
|
||||
check_and_log_hs_connectivity 1 2 100
|
||||
check_and_log_hs_connectivity 2 1 100
|
||||
}
|
||||
|
||||
if [ "$(id -u)" -ne 0 ];then
|
||||
echo "SKIP: Need root privileges"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
if [ ! -x "$(command -v ip)" ]; then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
cleanup &>/dev/null
|
||||
|
||||
setup
|
||||
|
||||
host_tests
|
||||
router_netfilter_tests
|
||||
|
||||
print_log_test_results
|
||||
|
||||
cleanup &>/dev/null
|
||||
|
||||
exit ${ret}
|
340
tools/testing/selftests/net/srv6_end_dx6_netfilter_test.sh
Executable file
340
tools/testing/selftests/net/srv6_end_dx6_netfilter_test.sh
Executable file
@ -0,0 +1,340 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# author: Jianguo Wu <wujianguo@chinatelecom.cn>
|
||||
#
|
||||
# Mostly copied from tools/testing/selftests/net/srv6_end_dt6_l3vpn_test.sh.
|
||||
#
|
||||
# This script is designed for testing the support of netfilter hooks for
|
||||
# SRv6 End.DX4 behavior.
|
||||
#
|
||||
# Hereafter a network diagram is shown, where one tenants (named 100) offer
|
||||
# IPv6 L3 VPN services allowing hosts to communicate with each other across
|
||||
# an IPv6 network.
|
||||
#
|
||||
# Routers rt-1 and rt-2 implement IPv6 L3 VPN services leveraging the SRv6
|
||||
# architecture. The key components for such VPNs are: a) SRv6 Encap behavior,
|
||||
# b) SRv6 End.DX4 behavior.
|
||||
#
|
||||
# To explain how an IPv6 L3 VPN based on SRv6 works, let us briefly consider an
|
||||
# example where, within the same domain of tenant 100, the host hs-1 pings
|
||||
# the host hs-2.
|
||||
#
|
||||
# First of all, L2 reachability of the host hs-2 is taken into account by
|
||||
# the router rt-1 which acts as an arp proxy.
|
||||
#
|
||||
# When the host hs-1 sends an IPv6 packet destined to hs-2, the router rt-1
|
||||
# receives the packet on the internal veth-t100 interface, rt-1 contains the
|
||||
# SRv6 Encap route for encapsulating the IPv6 packet in a IPv6 plus the Segment
|
||||
# Routing Header (SRH) packet. This packet is sent through the (IPv6) core
|
||||
# network up to the router rt-2 that receives it on veth0 interface.
|
||||
#
|
||||
# The rt-2 router uses the 'localsid' routing table to process incoming
|
||||
# IPv6+SRH packets which belong to the VPN of the tenant 100. For each of these
|
||||
# packets, the SRv6 End.DX4 behavior removes the outer IPv6+SRH headers and
|
||||
# routs the packet to the specified nexthop. Afterwards, the packet is sent to
|
||||
# the host hs-2 through the veth-t100 interface.
|
||||
#
|
||||
# The ping response follows the same processing but this time the role of rt-1
|
||||
# and rt-2 are swapped.
|
||||
#
|
||||
# And when net.netfilter.nf_hooks_lwtunnel is set to 1 in rt-1 or rt-2, and a
|
||||
# rpfilter iptables rule is added, SRv6 packets will go through netfilter PREROUTING
|
||||
# hooks.
|
||||
#
|
||||
#
|
||||
# +-------------------+ +-------------------+
|
||||
# | | | |
|
||||
# | hs-1 netns | | hs-2 netns |
|
||||
# | | | |
|
||||
# | +-------------+ | | +-------------+ |
|
||||
# | | veth0 | | | | veth0 | |
|
||||
# | | cafe::1/64 | | | | cafe::2/64 | |
|
||||
# | +-------------+ | | +-------------+ |
|
||||
# | . | | . |
|
||||
# +-------------------+ +-------------------+
|
||||
# . .
|
||||
# . .
|
||||
# . .
|
||||
# +-----------------------------------+ +-----------------------------------+
|
||||
# | . | | . |
|
||||
# | +---------------+ | | +---------------- |
|
||||
# | | veth-t100 | | | | veth-t100 | |
|
||||
# | | cafe::11/64 | +----------+ | | +----------+ | cafe::22/64 | |
|
||||
# | +-------+-------+ | route | | | | route | +-------+-------- |
|
||||
# | | table | | | | table | |
|
||||
# | +----------+ | | +----------+ |
|
||||
# | +--------------+ | | +--------------+ |
|
||||
# | | veth0 | | | | veth0 | |
|
||||
# | | 2001:11::1/64 |.|...|.| 2001:11::2/64 | |
|
||||
# | +--------------+ | | +--------------+ |
|
||||
# | | | |
|
||||
# | rt-1 netns | | rt-2 netns |
|
||||
# | | | |
|
||||
# +-----------------------------------+ +-----------------------------------+
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# | Network configuration |
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# rt-1: localsid table
|
||||
# +----------------------------------------------------------------+
|
||||
# |SID |Action |
|
||||
# +----------------------------------------------------------------+
|
||||
# |fc00:21:100::6004|apply SRv6 End.DX6 nh6 cafe::1 dev veth-t100 |
|
||||
# +----------------------------------------------------------------+
|
||||
#
|
||||
# rt-1: route table
|
||||
# +---------------------------------------------------+
|
||||
# |host |Action |
|
||||
# +---------------------------------------------------+
|
||||
# |cafe::2 |apply seg6 encap segs fc00:12:100::6004|
|
||||
# +---------------------------------------------------+
|
||||
# |cafe::/64 |forward to dev veth_t100 |
|
||||
# +---------------------------------------------------+
|
||||
#
|
||||
#
|
||||
# rt-2: localsid table
|
||||
# +---------------------------------------------------------------+
|
||||
# |SID |Action |
|
||||
# +---------------------------------------------------------------+
|
||||
# |fc00:12:100::6004|apply SRv6 End.DX6 nh6 cafe::2 dev veth-t100 |
|
||||
# +---------------------------------------------------------------+
|
||||
#
|
||||
# rt-2: route table
|
||||
# +---------------------------------------------------+
|
||||
# |host |Action |
|
||||
# +---------------------------------------------------+
|
||||
# |cafe::1 |apply seg6 encap segs fc00:21:100::6004|
|
||||
# +---------------------------------------------------+
|
||||
# |cafe::/64 |forward to dev veth_t100 |
|
||||
# +---------------------------------------------------+
|
||||
#
|
||||
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
|
||||
readonly IPv6_RT_NETWORK=2001:11
|
||||
readonly IPv6_HS_NETWORK=cafe
|
||||
readonly SID_LOCATOR=fc00
|
||||
|
||||
PING_TIMEOUT_SEC=4
|
||||
|
||||
ret=0
|
||||
|
||||
PAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no}
|
||||
|
||||
log_test()
|
||||
{
|
||||
local rc=$1
|
||||
local expected=$2
|
||||
local msg="$3"
|
||||
|
||||
if [ ${rc} -eq ${expected} ]; then
|
||||
nsuccess=$((nsuccess+1))
|
||||
printf "\n TEST: %-60s [ OK ]\n" "${msg}"
|
||||
else
|
||||
ret=1
|
||||
nfail=$((nfail+1))
|
||||
printf "\n TEST: %-60s [FAIL]\n" "${msg}"
|
||||
if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
|
||||
echo
|
||||
echo "hit enter to continue, 'q' to quit"
|
||||
read a
|
||||
[ "$a" = "q" ] && exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
print_log_test_results()
|
||||
{
|
||||
if [ "$TESTS" != "none" ]; then
|
||||
printf "\nTests passed: %3d\n" ${nsuccess}
|
||||
printf "Tests failed: %3d\n" ${nfail}
|
||||
fi
|
||||
}
|
||||
|
||||
log_section()
|
||||
{
|
||||
echo
|
||||
echo "################################################################################"
|
||||
echo "TEST SECTION: $*"
|
||||
echo "################################################################################"
|
||||
}
|
||||
|
||||
cleanup()
|
||||
{
|
||||
ip link del veth-rt-1 2>/dev/null || true
|
||||
ip link del veth-rt-2 2>/dev/null || true
|
||||
|
||||
# destroy routers rt-* and hosts hs-*
|
||||
for ns in $(ip netns show | grep -E 'rt-*|hs-*'); do
|
||||
ip netns del ${ns} || true
|
||||
done
|
||||
}
|
||||
|
||||
# Setup the basic networking for the routers
|
||||
setup_rt_networking()
|
||||
{
|
||||
local rt=$1
|
||||
local nsname=rt-${rt}
|
||||
|
||||
ip netns add ${nsname}
|
||||
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv6.conf.all.accept_dad=0
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv6.conf.default.accept_dad=0
|
||||
|
||||
ip link set veth-rt-${rt} netns ${nsname}
|
||||
ip -netns ${nsname} link set veth-rt-${rt} name veth0
|
||||
|
||||
ip -netns ${nsname} addr add ${IPv6_RT_NETWORK}::${rt}/64 dev veth0 nodad
|
||||
ip -netns ${nsname} link set veth0 up
|
||||
ip -netns ${nsname} link set lo up
|
||||
|
||||
ip netns exec ${nsname} sysctl -wq net.ipv6.conf.all.forwarding=1
|
||||
}
|
||||
|
||||
setup_rt_netfilter()
|
||||
{
|
||||
local rt=$1
|
||||
local nsname=rt-${rt}
|
||||
|
||||
ip netns exec ${nsname} sysctl -wq net.netfilter.nf_hooks_lwtunnel=1
|
||||
ip netns exec ${nsname} ip6tables -t raw -A PREROUTING -m rpfilter --invert -j DROP
|
||||
}
|
||||
|
||||
setup_hs()
|
||||
{
|
||||
local hs=$1
|
||||
local rt=$2
|
||||
local tid=$3
|
||||
local hsname=hs-${hs}
|
||||
local rtname=rt-${rt}
|
||||
local rtveth=veth-t${tid}
|
||||
|
||||
# set the networking for the host
|
||||
ip netns add ${hsname}
|
||||
|
||||
ip -netns ${hsname} link add veth0 type veth peer name ${rtveth}
|
||||
ip -netns ${hsname} link set ${rtveth} netns ${rtname}
|
||||
ip -netns ${hsname} addr add ${IPv6_HS_NETWORK}::${hs}/64 dev veth0 nodad
|
||||
ip -netns ${hsname} link set veth0 up
|
||||
ip -netns ${hsname} link set lo up
|
||||
|
||||
ip -netns ${rtname} addr add ${IPv6_HS_NETWORK}::${rt}${hs}/64 dev ${rtveth}
|
||||
ip -netns ${rtname} link set ${rtveth} up
|
||||
|
||||
ip netns exec ${rtname} sysctl -wq net.ipv6.conf.all.accept_dad=0
|
||||
ip netns exec ${rtname} sysctl -wq net.ipv6.conf.default.accept_dad=0
|
||||
|
||||
ip netns exec ${rtname} sysctl -wq net.ipv6.conf.${rtveth}.proxy_ndp=1
|
||||
}
|
||||
|
||||
setup_vpn_config()
|
||||
{
|
||||
local hssrc=$1
|
||||
local rtsrc=$2
|
||||
local hsdst=$3
|
||||
local rtdst=$4
|
||||
local tid=$5
|
||||
|
||||
local hssrc_name=hs-t${tid}-${hssrc}
|
||||
local hsdst_name=hs-t${tid}-${hsdst}
|
||||
local rtsrc_name=rt-${rtsrc}
|
||||
local rtdst_name=rt-${rtdst}
|
||||
local rtveth=veth-t${tid}
|
||||
local vpn_sid=${SID_LOCATOR}:${hssrc}${hsdst}:${tid}::6004
|
||||
|
||||
ip -netns ${rtsrc_name} -6 neigh add proxy ${IPv6_HS_NETWORK}::${hsdst} dev ${rtveth}
|
||||
|
||||
# set the encap route for encapsulating packets which arrive from the
|
||||
# host hssrc and destined to the access router rtsrc.
|
||||
ip -netns ${rtsrc_name} -6 route add ${IPv6_HS_NETWORK}::${hsdst}/128 \
|
||||
encap seg6 mode encap segs ${vpn_sid} dev veth0
|
||||
ip -netns ${rtsrc_name} -6 route add ${vpn_sid}/128 \
|
||||
via 2001:11::${rtdst} dev veth0
|
||||
|
||||
# set the decap route for decapsulating packets which arrive from
|
||||
# the rtdst router and destined to the hsdst host.
|
||||
ip -netns ${rtdst_name} -6 route add ${vpn_sid}/128 \
|
||||
encap seg6local action End.DX6 nh6 ${IPv6_HS_NETWORK}::${hsdst} dev veth-t${tid}
|
||||
}
|
||||
|
||||
setup()
|
||||
{
|
||||
ip link add veth-rt-1 type veth peer name veth-rt-2
|
||||
# setup the networking for router rt-1 and router rt-2
|
||||
setup_rt_networking 1
|
||||
setup_rt_networking 2
|
||||
|
||||
# setup two hosts for the tenant 100.
|
||||
# - host hs-1 is directly connected to the router rt-1;
|
||||
# - host hs-2 is directly connected to the router rt-2.
|
||||
setup_hs 1 1 100
|
||||
setup_hs 2 2 100
|
||||
|
||||
# setup the IPv4 L3 VPN which connects the host hs-1 and host hs-2.
|
||||
setup_vpn_config 1 1 2 2 100 #args: src_host src_router dst_host dst_router tenant
|
||||
setup_vpn_config 2 2 1 1 100
|
||||
}
|
||||
|
||||
check_hs_connectivity()
|
||||
{
|
||||
local hssrc=$1
|
||||
local hsdst=$2
|
||||
local tid=$3
|
||||
|
||||
ip netns exec hs-${hssrc} ping -6 -c 1 -W ${PING_TIMEOUT_SEC} \
|
||||
${IPv6_HS_NETWORK}::${hsdst} >/dev/null 2>&1
|
||||
}
|
||||
|
||||
check_and_log_hs_connectivity()
|
||||
{
|
||||
local hssrc=$1
|
||||
local hsdst=$2
|
||||
local tid=$3
|
||||
|
||||
check_hs_connectivity ${hssrc} ${hsdst} ${tid}
|
||||
log_test $? 0 "Hosts connectivity: hs-${hssrc} -> hs-${hsdst} (tenant ${tid})"
|
||||
}
|
||||
|
||||
host_tests()
|
||||
{
|
||||
log_section "SRv6 VPN connectivity test among hosts in the same tenant"
|
||||
|
||||
check_and_log_hs_connectivity 1 2 100
|
||||
check_and_log_hs_connectivity 2 1 100
|
||||
}
|
||||
|
||||
router_netfilter_tests()
|
||||
{
|
||||
log_section "SRv6 VPN connectivity test with netfilter enabled in routers"
|
||||
setup_rt_netfilter 1
|
||||
setup_rt_netfilter 2
|
||||
|
||||
check_and_log_hs_connectivity 1 2 100
|
||||
check_and_log_hs_connectivity 2 1 100
|
||||
}
|
||||
|
||||
if [ "$(id -u)" -ne 0 ];then
|
||||
echo "SKIP: Need root privileges"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
if [ ! -x "$(command -v ip)" ]; then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
cleanup &>/dev/null
|
||||
|
||||
setup
|
||||
|
||||
host_tests
|
||||
router_netfilter_tests
|
||||
|
||||
print_log_test_results
|
||||
|
||||
cleanup &>/dev/null
|
||||
|
||||
exit ${ret}
|
Loading…
Reference in New Issue
Block a user