mirror of
https://github.com/torvalds/linux.git
synced 2025-12-01 07:26:02 +07:00
Merge tag 'net-6.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni:
"Including fixes from netfilter.
Current release - regressions:
- mlx5: fix pre-2.40 binutils assembler error
Current release - new code bugs:
- net: psp: don't assume reply skbs will have a socket
- eth: fbnic: fix missing programming of the default descriptor
Previous releases - regressions:
- page_pool: fix PP_MAGIC_MASK to avoid crashing on some 32-bit arches
- tcp:
- take care of zero tp->window_clamp in tcp_set_rcvlowat()
- don't call reqsk_fastopen_remove() in tcp_conn_request()
- eth:
- ice: release xa entry on adapter allocation failure
- usb: asix: hold PM usage ref to avoid PM/MDIO + RTNL deadlock
Previous releases - always broken:
- netfilter: validate objref and objrefmap expressions
- sctp: fix a null dereference in sctp_disposition sctp_sf_do_5_1D_ce()
- eth:
- mlx4: prevent potential use after free in mlx4_en_do_uc_filter()
- mlx5: prevent tunnel mode conflicts between FDB and NIC IPsec tables
- ocelot: fix use-after-free caused by cyclic delayed work
Misc:
- add support for MediaTek PCIe 5G HP DRMR-H01"
* tag 'net-6.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (38 commits)
net: airoha: Fix loopback mode configuration for GDM2 port
selftests: drv-net: pp_alloc_fail: add necessary optoins to config
selftests: drv-net: pp_alloc_fail: lower traffic expectations
selftests: drv-net: fix linter warnings in pp_alloc_fail
eth: fbnic: fix reporting of alloc_failed qstats
selftests: drv-net: xdp: add test for interface level qstats
selftests: drv-net: xdp: rename netnl to ethnl
eth: fbnic: fix saving stats from XDP_TX rings on close
eth: fbnic: fix accounting of XDP packets
eth: fbnic: fix missing programming of the default descriptor
selftests: netfilter: query conntrack state to check for port clash resolution
selftests: netfilter: nft_fib.sh: fix spurious test failures
bridge: br_vlan_fill_forward_path_pvid: use br_vlan_group_rcu()
netfilter: nft_objref: validate objref and objrefmap expressions
net: pse-pd: tps23881: Fix current measurement scaling
net/mlx5: fix pre-2.40 binutils assembler error
net/mlx5e: Do not fail PSP init on missing caps
net/mlx5e: Prevent tunnel reformat when tunnel mode not allowed
net/mlx5: Prevent tunnel mode conflicts between FDB and NIC IPsec tables
net: usb: asix: hold PM usage ref to avoid PM/MDIO + RTNL deadlock
...
This commit is contained in:
@@ -1710,7 +1710,9 @@ static void airhoha_set_gdm2_loopback(struct airoha_gdm_port *port)
|
||||
airoha_fe_wr(eth, REG_GDM_RXCHN_EN(2), 0xffff);
|
||||
airoha_fe_rmw(eth, REG_GDM_LPBK_CFG(2),
|
||||
LPBK_CHAN_MASK | LPBK_MODE_MASK | LPBK_EN_MASK,
|
||||
FIELD_PREP(LPBK_CHAN_MASK, chan) | LPBK_EN_MASK);
|
||||
FIELD_PREP(LPBK_CHAN_MASK, chan) |
|
||||
LBK_GAP_MODE_MASK | LBK_LEN_MODE_MASK |
|
||||
LBK_CHAN_MODE_MASK | LPBK_EN_MASK);
|
||||
airoha_fe_rmw(eth, REG_GDM_LEN_CFG(2),
|
||||
GDM_SHORT_LEN_MASK | GDM_LONG_LEN_MASK,
|
||||
FIELD_PREP(GDM_SHORT_LEN_MASK, 60) |
|
||||
|
||||
@@ -151,6 +151,9 @@
|
||||
#define LPBK_LEN_MASK GENMASK(23, 10)
|
||||
#define LPBK_CHAN_MASK GENMASK(8, 4)
|
||||
#define LPBK_MODE_MASK GENMASK(3, 1)
|
||||
#define LBK_GAP_MODE_MASK BIT(3)
|
||||
#define LBK_LEN_MODE_MASK BIT(2)
|
||||
#define LBK_CHAN_MODE_MASK BIT(1)
|
||||
#define LPBK_EN_MASK BIT(0)
|
||||
|
||||
#define REG_GDM_TXCHN_EN(_n) (GDM_BASE(_n) + 0x24)
|
||||
|
||||
@@ -479,10 +479,12 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
|
||||
"missing 'reg' property in node %pOF\n",
|
||||
tbi);
|
||||
err = -EBUSY;
|
||||
of_node_put(tbi);
|
||||
goto error;
|
||||
}
|
||||
set_tbipa(*prop, pdev,
|
||||
data->get_tbipa, priv->map, &res);
|
||||
of_node_put(tbi);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -99,19 +99,21 @@ struct ice_adapter *ice_adapter_get(struct pci_dev *pdev)
|
||||
|
||||
index = ice_adapter_xa_index(pdev);
|
||||
scoped_guard(mutex, &ice_adapters_mutex) {
|
||||
err = xa_insert(&ice_adapters, index, NULL, GFP_KERNEL);
|
||||
if (err == -EBUSY) {
|
||||
adapter = xa_load(&ice_adapters, index);
|
||||
adapter = xa_load(&ice_adapters, index);
|
||||
if (adapter) {
|
||||
refcount_inc(&adapter->refcount);
|
||||
WARN_ON_ONCE(adapter->index != ice_adapter_index(pdev));
|
||||
return adapter;
|
||||
}
|
||||
err = xa_reserve(&ice_adapters, index, GFP_KERNEL);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
adapter = ice_adapter_new(pdev);
|
||||
if (!adapter)
|
||||
if (!adapter) {
|
||||
xa_release(&ice_adapters, index);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
xa_store(&ice_adapters, index, adapter, GFP_KERNEL);
|
||||
}
|
||||
return adapter;
|
||||
|
||||
@@ -1180,9 +1180,9 @@ static void mlx4_en_do_uc_filter(struct mlx4_en_priv *priv,
|
||||
mlx4_unregister_mac(mdev->dev, priv->port, mac);
|
||||
|
||||
hlist_del_rcu(&entry->hlist);
|
||||
kfree_rcu(entry, rcu);
|
||||
en_dbg(DRV, priv, "Removed MAC %pM on port:%d\n",
|
||||
entry->mac, priv->port);
|
||||
kfree_rcu(entry, rcu);
|
||||
++removed;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -772,6 +772,7 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5e_ipsec_sa_entry *sa_entry = NULL;
|
||||
bool allow_tunnel_mode = false;
|
||||
struct mlx5e_ipsec *ipsec;
|
||||
struct mlx5e_priv *priv;
|
||||
gfp_t gfp;
|
||||
@@ -803,6 +804,20 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
goto err_xfrm;
|
||||
}
|
||||
|
||||
if (mlx5_eswitch_block_mode(priv->mdev))
|
||||
goto unblock_ipsec;
|
||||
|
||||
if (x->props.mode == XFRM_MODE_TUNNEL &&
|
||||
x->xso.type == XFRM_DEV_OFFLOAD_PACKET) {
|
||||
allow_tunnel_mode = mlx5e_ipsec_fs_tunnel_allowed(sa_entry);
|
||||
if (!allow_tunnel_mode) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Packet offload tunnel mode is disabled due to encap settings");
|
||||
err = -EINVAL;
|
||||
goto unblock_mode;
|
||||
}
|
||||
}
|
||||
|
||||
/* check esn */
|
||||
if (x->props.flags & XFRM_STATE_ESN)
|
||||
mlx5e_ipsec_update_esn_state(sa_entry);
|
||||
@@ -817,7 +832,7 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
|
||||
err = mlx5_ipsec_create_work(sa_entry);
|
||||
if (err)
|
||||
goto unblock_ipsec;
|
||||
goto unblock_encap;
|
||||
|
||||
err = mlx5e_ipsec_create_dwork(sa_entry);
|
||||
if (err)
|
||||
@@ -832,14 +847,6 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
if (err)
|
||||
goto err_hw_ctx;
|
||||
|
||||
if (x->props.mode == XFRM_MODE_TUNNEL &&
|
||||
x->xso.type == XFRM_DEV_OFFLOAD_PACKET &&
|
||||
!mlx5e_ipsec_fs_tunnel_enabled(sa_entry)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Packet offload tunnel mode is disabled due to encap settings");
|
||||
err = -EINVAL;
|
||||
goto err_add_rule;
|
||||
}
|
||||
|
||||
/* We use *_bh() variant because xfrm_timer_handler(), which runs
|
||||
* in softirq context, can reach our state delete logic and we need
|
||||
* xa_erase_bh() there.
|
||||
@@ -855,8 +862,7 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
queue_delayed_work(ipsec->wq, &sa_entry->dwork->dwork,
|
||||
MLX5_IPSEC_RESCHED);
|
||||
|
||||
if (x->xso.type == XFRM_DEV_OFFLOAD_PACKET &&
|
||||
x->props.mode == XFRM_MODE_TUNNEL) {
|
||||
if (allow_tunnel_mode) {
|
||||
xa_lock_bh(&ipsec->sadb);
|
||||
__xa_set_mark(&ipsec->sadb, sa_entry->ipsec_obj_id,
|
||||
MLX5E_IPSEC_TUNNEL_SA);
|
||||
@@ -865,6 +871,11 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
|
||||
out:
|
||||
x->xso.offload_handle = (unsigned long)sa_entry;
|
||||
if (allow_tunnel_mode)
|
||||
mlx5_eswitch_unblock_encap(priv->mdev);
|
||||
|
||||
mlx5_eswitch_unblock_mode(priv->mdev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_add_rule:
|
||||
@@ -877,6 +888,11 @@ release_work:
|
||||
if (sa_entry->work)
|
||||
kfree(sa_entry->work->data);
|
||||
kfree(sa_entry->work);
|
||||
unblock_encap:
|
||||
if (allow_tunnel_mode)
|
||||
mlx5_eswitch_unblock_encap(priv->mdev);
|
||||
unblock_mode:
|
||||
mlx5_eswitch_unblock_mode(priv->mdev);
|
||||
unblock_ipsec:
|
||||
mlx5_eswitch_unblock_ipsec(priv->mdev);
|
||||
err_xfrm:
|
||||
|
||||
@@ -319,7 +319,7 @@ void mlx5e_accel_ipsec_fs_del_rule(struct mlx5e_ipsec_sa_entry *sa_entry);
|
||||
int mlx5e_accel_ipsec_fs_add_pol(struct mlx5e_ipsec_pol_entry *pol_entry);
|
||||
void mlx5e_accel_ipsec_fs_del_pol(struct mlx5e_ipsec_pol_entry *pol_entry);
|
||||
void mlx5e_accel_ipsec_fs_modify(struct mlx5e_ipsec_sa_entry *sa_entry);
|
||||
bool mlx5e_ipsec_fs_tunnel_enabled(struct mlx5e_ipsec_sa_entry *sa_entry);
|
||||
bool mlx5e_ipsec_fs_tunnel_allowed(struct mlx5e_ipsec_sa_entry *sa_entry);
|
||||
|
||||
int mlx5_ipsec_create_sa_ctx(struct mlx5e_ipsec_sa_entry *sa_entry);
|
||||
void mlx5_ipsec_free_sa_ctx(struct mlx5e_ipsec_sa_entry *sa_entry);
|
||||
|
||||
@@ -1069,7 +1069,9 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,
|
||||
|
||||
/* Create FT */
|
||||
if (mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_TUNNEL)
|
||||
rx->allow_tunnel_mode = mlx5_eswitch_block_encap(mdev);
|
||||
rx->allow_tunnel_mode =
|
||||
mlx5_eswitch_block_encap(mdev, rx == ipsec->rx_esw);
|
||||
|
||||
if (rx->allow_tunnel_mode)
|
||||
flags = MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
|
||||
ft = ipsec_ft_create(attr.ns, attr.sa_level, attr.prio, 1, 2, flags);
|
||||
@@ -1310,7 +1312,9 @@ static int tx_create(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx *tx,
|
||||
goto err_status_rule;
|
||||
|
||||
if (mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_TUNNEL)
|
||||
tx->allow_tunnel_mode = mlx5_eswitch_block_encap(mdev);
|
||||
tx->allow_tunnel_mode =
|
||||
mlx5_eswitch_block_encap(mdev, tx == ipsec->tx_esw);
|
||||
|
||||
if (tx->allow_tunnel_mode)
|
||||
flags = MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
|
||||
ft = ipsec_ft_create(tx->ns, attr.sa_level, attr.prio, 1, 4, flags);
|
||||
@@ -2846,18 +2850,24 @@ void mlx5e_accel_ipsec_fs_modify(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||
memcpy(sa_entry, &sa_entry_shadow, sizeof(*sa_entry));
|
||||
}
|
||||
|
||||
bool mlx5e_ipsec_fs_tunnel_enabled(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||
bool mlx5e_ipsec_fs_tunnel_allowed(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||
{
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs;
|
||||
struct mlx5e_ipsec_rx *rx;
|
||||
struct mlx5e_ipsec_tx *tx;
|
||||
struct mlx5e_ipsec *ipsec = sa_entry->ipsec;
|
||||
struct xfrm_state *x = sa_entry->x;
|
||||
bool from_fdb;
|
||||
|
||||
rx = ipsec_rx(sa_entry->ipsec, attrs->addrs.family, attrs->type);
|
||||
tx = ipsec_tx(sa_entry->ipsec, attrs->type);
|
||||
if (sa_entry->attrs.dir == XFRM_DEV_OFFLOAD_OUT)
|
||||
return tx->allow_tunnel_mode;
|
||||
if (x->xso.dir == XFRM_DEV_OFFLOAD_OUT) {
|
||||
struct mlx5e_ipsec_tx *tx = ipsec_tx(ipsec, x->xso.type);
|
||||
|
||||
return rx->allow_tunnel_mode;
|
||||
from_fdb = (tx == ipsec->tx_esw);
|
||||
} else {
|
||||
struct mlx5e_ipsec_rx *rx = ipsec_rx(ipsec, x->props.family,
|
||||
x->xso.type);
|
||||
|
||||
from_fdb = (rx == ipsec->rx_esw);
|
||||
}
|
||||
|
||||
return mlx5_eswitch_block_encap(ipsec->mdev, from_fdb);
|
||||
}
|
||||
|
||||
void mlx5e_ipsec_handle_mpv_event(int event, struct mlx5e_priv *slave_priv,
|
||||
|
||||
@@ -893,27 +893,27 @@ int mlx5e_psp_init(struct mlx5e_priv *priv)
|
||||
|
||||
if (!mlx5_is_psp_device(mdev)) {
|
||||
mlx5_core_dbg(mdev, "PSP offload not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!MLX5_CAP_ETH(mdev, swp)) {
|
||||
mlx5_core_dbg(mdev, "SWP not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!MLX5_CAP_ETH(mdev, swp_csum)) {
|
||||
mlx5_core_dbg(mdev, "SWP checksum not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!MLX5_CAP_ETH(mdev, swp_csum_l4_partial)) {
|
||||
mlx5_core_dbg(mdev, "SWP L4 partial checksum not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!MLX5_CAP_ETH(mdev, swp_lso)) {
|
||||
mlx5_core_dbg(mdev, "PSP LSO not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
psp = kzalloc(sizeof(*psp), GFP_KERNEL);
|
||||
|
||||
@@ -879,7 +879,7 @@ void mlx5_eswitch_offloads_single_fdb_del_one(struct mlx5_eswitch *master_esw,
|
||||
struct mlx5_eswitch *slave_esw);
|
||||
int mlx5_eswitch_reload_ib_reps(struct mlx5_eswitch *esw);
|
||||
|
||||
bool mlx5_eswitch_block_encap(struct mlx5_core_dev *dev);
|
||||
bool mlx5_eswitch_block_encap(struct mlx5_core_dev *dev, bool from_fdb);
|
||||
void mlx5_eswitch_unblock_encap(struct mlx5_core_dev *dev);
|
||||
|
||||
int mlx5_eswitch_block_mode(struct mlx5_core_dev *dev);
|
||||
@@ -974,7 +974,8 @@ mlx5_eswitch_reload_ib_reps(struct mlx5_eswitch *esw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool mlx5_eswitch_block_encap(struct mlx5_core_dev *dev)
|
||||
static inline bool
|
||||
mlx5_eswitch_block_encap(struct mlx5_core_dev *dev, bool from_fdb)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -4006,23 +4006,25 @@ int mlx5_devlink_eswitch_inline_mode_get(struct devlink *devlink, u8 *mode)
|
||||
return esw_inline_mode_to_devlink(esw->offloads.inline_mode, mode);
|
||||
}
|
||||
|
||||
bool mlx5_eswitch_block_encap(struct mlx5_core_dev *dev)
|
||||
bool mlx5_eswitch_block_encap(struct mlx5_core_dev *dev, bool from_fdb)
|
||||
{
|
||||
struct mlx5_eswitch *esw = dev->priv.eswitch;
|
||||
enum devlink_eswitch_encap_mode encap;
|
||||
bool allow_tunnel = false;
|
||||
|
||||
if (!mlx5_esw_allowed(esw))
|
||||
return true;
|
||||
|
||||
down_write(&esw->mode_lock);
|
||||
if (esw->mode != MLX5_ESWITCH_LEGACY &&
|
||||
esw->offloads.encap != DEVLINK_ESWITCH_ENCAP_MODE_NONE) {
|
||||
up_write(&esw->mode_lock);
|
||||
return false;
|
||||
encap = esw->offloads.encap;
|
||||
if (esw->mode == MLX5_ESWITCH_LEGACY ||
|
||||
(encap == DEVLINK_ESWITCH_ENCAP_MODE_NONE && !from_fdb)) {
|
||||
allow_tunnel = true;
|
||||
esw->offloads.num_block_encap++;
|
||||
}
|
||||
|
||||
esw->offloads.num_block_encap++;
|
||||
up_write(&esw->mode_lock);
|
||||
return true;
|
||||
|
||||
return allow_tunnel;
|
||||
}
|
||||
|
||||
void mlx5_eswitch_unblock_encap(struct mlx5_core_dev *dev)
|
||||
|
||||
@@ -266,7 +266,7 @@ static void mlx5_iowrite64_copy(struct mlx5_wc_sq *sq, __be32 mmio_wqe[16],
|
||||
if (cpu_has_neon()) {
|
||||
kernel_neon_begin();
|
||||
asm volatile
|
||||
(".arch_extension simd;\n\t"
|
||||
(".arch_extension simd\n\t"
|
||||
"ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [%0]\n\t"
|
||||
"st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [%1]"
|
||||
:
|
||||
|
||||
@@ -185,13 +185,13 @@ static void fbnic_aggregate_vector_counters(struct fbnic_net *fbn,
|
||||
|
||||
for (i = 0; i < nv->txt_count; i++) {
|
||||
fbnic_aggregate_ring_tx_counters(fbn, &nv->qt[i].sub0);
|
||||
fbnic_aggregate_ring_tx_counters(fbn, &nv->qt[i].sub1);
|
||||
fbnic_aggregate_ring_xdp_counters(fbn, &nv->qt[i].sub1);
|
||||
fbnic_aggregate_ring_tx_counters(fbn, &nv->qt[i].cmpl);
|
||||
}
|
||||
|
||||
for (j = 0; j < nv->rxt_count; j++, i++) {
|
||||
fbnic_aggregate_ring_rx_counters(fbn, &nv->qt[i].sub0);
|
||||
fbnic_aggregate_ring_rx_counters(fbn, &nv->qt[i].sub1);
|
||||
fbnic_aggregate_ring_bdq_counters(fbn, &nv->qt[i].sub0);
|
||||
fbnic_aggregate_ring_bdq_counters(fbn, &nv->qt[i].sub1);
|
||||
fbnic_aggregate_ring_rx_counters(fbn, &nv->qt[i].cmpl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,8 +83,16 @@ static void fbnic_mac_init_axi(struct fbnic_dev *fbd)
|
||||
|
||||
static void fbnic_mac_init_qm(struct fbnic_dev *fbd)
|
||||
{
|
||||
u64 default_meta = FIELD_PREP(FBNIC_TWD_L2_HLEN_MASK, ETH_HLEN) |
|
||||
FBNIC_TWD_FLAG_REQ_COMPLETION;
|
||||
u32 clock_freq;
|
||||
|
||||
/* Configure default TWQ Metadata descriptor */
|
||||
wr32(fbd, FBNIC_QM_TWQ_DEFAULT_META_L,
|
||||
lower_32_bits(default_meta));
|
||||
wr32(fbd, FBNIC_QM_TWQ_DEFAULT_META_H,
|
||||
upper_32_bits(default_meta));
|
||||
|
||||
/* Configure TSO behavior */
|
||||
wr32(fbd, FBNIC_QM_TQS_CTL0,
|
||||
FIELD_PREP(FBNIC_QM_TQS_CTL0_LSO_TS_MASK,
|
||||
|
||||
@@ -543,17 +543,21 @@ static const struct net_device_ops fbnic_netdev_ops = {
|
||||
static void fbnic_get_queue_stats_rx(struct net_device *dev, int idx,
|
||||
struct netdev_queue_stats_rx *rx)
|
||||
{
|
||||
u64 bytes, packets, alloc_fail, alloc_fail_bdq;
|
||||
struct fbnic_net *fbn = netdev_priv(dev);
|
||||
struct fbnic_ring *rxr = fbn->rx[idx];
|
||||
struct fbnic_dev *fbd = fbn->fbd;
|
||||
struct fbnic_queue_stats *stats;
|
||||
u64 bytes, packets, alloc_fail;
|
||||
u64 csum_complete, csum_none;
|
||||
struct fbnic_q_triad *qt;
|
||||
unsigned int start;
|
||||
|
||||
if (!rxr)
|
||||
return;
|
||||
|
||||
/* fbn->rx points to completion queues */
|
||||
qt = container_of(rxr, struct fbnic_q_triad, cmpl);
|
||||
|
||||
stats = &rxr->stats;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&stats->syncp);
|
||||
@@ -564,6 +568,20 @@ static void fbnic_get_queue_stats_rx(struct net_device *dev, int idx,
|
||||
csum_none = stats->rx.csum_none;
|
||||
} while (u64_stats_fetch_retry(&stats->syncp, start));
|
||||
|
||||
stats = &qt->sub0.stats;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&stats->syncp);
|
||||
alloc_fail_bdq = stats->bdq.alloc_failed;
|
||||
} while (u64_stats_fetch_retry(&stats->syncp, start));
|
||||
alloc_fail += alloc_fail_bdq;
|
||||
|
||||
stats = &qt->sub1.stats;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&stats->syncp);
|
||||
alloc_fail_bdq = stats->bdq.alloc_failed;
|
||||
} while (u64_stats_fetch_retry(&stats->syncp, start));
|
||||
alloc_fail += alloc_fail_bdq;
|
||||
|
||||
rx->bytes = bytes;
|
||||
rx->packets = packets;
|
||||
rx->alloc_fail = alloc_fail;
|
||||
@@ -641,7 +659,8 @@ static void fbnic_get_base_stats(struct net_device *dev,
|
||||
|
||||
rx->bytes = fbn->rx_stats.bytes;
|
||||
rx->packets = fbn->rx_stats.packets;
|
||||
rx->alloc_fail = fbn->rx_stats.rx.alloc_failed;
|
||||
rx->alloc_fail = fbn->rx_stats.rx.alloc_failed +
|
||||
fbn->bdq_stats.bdq.alloc_failed;
|
||||
rx->csum_complete = fbn->rx_stats.rx.csum_complete;
|
||||
rx->csum_none = fbn->rx_stats.rx.csum_none;
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@ struct fbnic_net {
|
||||
/* Storage for stats after ring destruction */
|
||||
struct fbnic_queue_stats tx_stats;
|
||||
struct fbnic_queue_stats rx_stats;
|
||||
struct fbnic_queue_stats bdq_stats;
|
||||
u64 link_down_events;
|
||||
|
||||
/* Time stamping filter config */
|
||||
|
||||
@@ -904,7 +904,7 @@ static void fbnic_fill_bdq(struct fbnic_ring *bdq)
|
||||
netmem = page_pool_dev_alloc_netmems(bdq->page_pool);
|
||||
if (!netmem) {
|
||||
u64_stats_update_begin(&bdq->stats.syncp);
|
||||
bdq->stats.rx.alloc_failed++;
|
||||
bdq->stats.bdq.alloc_failed++;
|
||||
u64_stats_update_end(&bdq->stats.syncp);
|
||||
|
||||
break;
|
||||
@@ -1242,6 +1242,7 @@ static int fbnic_clean_rcq(struct fbnic_napi_vector *nv,
|
||||
/* Walk the completion queue collecting the heads reported by NIC */
|
||||
while (likely(packets < budget)) {
|
||||
struct sk_buff *skb = ERR_PTR(-EINVAL);
|
||||
u32 pkt_bytes;
|
||||
u64 rcd;
|
||||
|
||||
if ((*raw_rcd & cpu_to_le64(FBNIC_RCD_DONE)) == done)
|
||||
@@ -1272,37 +1273,38 @@ static int fbnic_clean_rcq(struct fbnic_napi_vector *nv,
|
||||
/* We currently ignore the action table index */
|
||||
break;
|
||||
case FBNIC_RCD_TYPE_META:
|
||||
if (unlikely(pkt->add_frag_failed))
|
||||
skb = NULL;
|
||||
else if (likely(!fbnic_rcd_metadata_err(rcd)))
|
||||
if (likely(!fbnic_rcd_metadata_err(rcd) &&
|
||||
!pkt->add_frag_failed)) {
|
||||
pkt_bytes = xdp_get_buff_len(&pkt->buff);
|
||||
skb = fbnic_run_xdp(nv, pkt);
|
||||
}
|
||||
|
||||
/* Populate skb and invalidate XDP */
|
||||
if (!IS_ERR_OR_NULL(skb)) {
|
||||
fbnic_populate_skb_fields(nv, rcd, skb, qt,
|
||||
&csum_complete,
|
||||
&csum_none);
|
||||
|
||||
packets++;
|
||||
bytes += skb->len;
|
||||
|
||||
napi_gro_receive(&nv->napi, skb);
|
||||
} else if (skb == ERR_PTR(-FBNIC_XDP_TX)) {
|
||||
pkt_tail = nv->qt[0].sub1.tail;
|
||||
bytes += xdp_get_buff_len(&pkt->buff);
|
||||
} else if (PTR_ERR(skb) == -FBNIC_XDP_CONSUME) {
|
||||
fbnic_put_pkt_buff(qt, pkt, 1);
|
||||
} else {
|
||||
if (!skb) {
|
||||
if (!skb)
|
||||
alloc_failed++;
|
||||
dropped++;
|
||||
} else if (skb == ERR_PTR(-FBNIC_XDP_LEN_ERR)) {
|
||||
|
||||
if (skb == ERR_PTR(-FBNIC_XDP_LEN_ERR))
|
||||
length_errors++;
|
||||
} else {
|
||||
else
|
||||
dropped++;
|
||||
}
|
||||
|
||||
fbnic_put_pkt_buff(qt, pkt, 1);
|
||||
goto next_dont_count;
|
||||
}
|
||||
|
||||
packets++;
|
||||
bytes += pkt_bytes;
|
||||
next_dont_count:
|
||||
pkt->buff.data_hard_start = NULL;
|
||||
|
||||
break;
|
||||
@@ -1319,8 +1321,6 @@ static int fbnic_clean_rcq(struct fbnic_napi_vector *nv,
|
||||
u64_stats_update_begin(&rcq->stats.syncp);
|
||||
rcq->stats.packets += packets;
|
||||
rcq->stats.bytes += bytes;
|
||||
/* Re-add ethernet header length (removed in fbnic_build_skb) */
|
||||
rcq->stats.bytes += ETH_HLEN * packets;
|
||||
rcq->stats.dropped += dropped;
|
||||
rcq->stats.rx.alloc_failed += alloc_failed;
|
||||
rcq->stats.rx.csum_complete += csum_complete;
|
||||
@@ -1414,6 +1414,17 @@ void fbnic_aggregate_ring_rx_counters(struct fbnic_net *fbn,
|
||||
BUILD_BUG_ON(sizeof(fbn->rx_stats.rx) / 8 != 4);
|
||||
}
|
||||
|
||||
void fbnic_aggregate_ring_bdq_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *bdq)
|
||||
{
|
||||
struct fbnic_queue_stats *stats = &bdq->stats;
|
||||
|
||||
/* Capture stats from queues before dissasociating them */
|
||||
fbn->bdq_stats.bdq.alloc_failed += stats->bdq.alloc_failed;
|
||||
/* Remember to add new stats here */
|
||||
BUILD_BUG_ON(sizeof(fbn->rx_stats.bdq) / 8 != 1);
|
||||
}
|
||||
|
||||
void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *txr)
|
||||
{
|
||||
@@ -1433,8 +1444,8 @@ void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
|
||||
BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 6);
|
||||
}
|
||||
|
||||
static void fbnic_aggregate_ring_xdp_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *xdpr)
|
||||
void fbnic_aggregate_ring_xdp_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *xdpr)
|
||||
{
|
||||
struct fbnic_queue_stats *stats = &xdpr->stats;
|
||||
|
||||
@@ -1442,9 +1453,7 @@ static void fbnic_aggregate_ring_xdp_counters(struct fbnic_net *fbn,
|
||||
return;
|
||||
|
||||
/* Capture stats from queues before dissasociating them */
|
||||
fbn->rx_stats.bytes += stats->bytes;
|
||||
fbn->rx_stats.packets += stats->packets;
|
||||
fbn->rx_stats.dropped += stats->dropped;
|
||||
fbn->tx_stats.dropped += stats->dropped;
|
||||
fbn->tx_stats.bytes += stats->bytes;
|
||||
fbn->tx_stats.packets += stats->packets;
|
||||
}
|
||||
@@ -1488,6 +1497,15 @@ static void fbnic_remove_rx_ring(struct fbnic_net *fbn,
|
||||
fbn->rx[rxr->q_idx] = NULL;
|
||||
}
|
||||
|
||||
static void fbnic_remove_bdq_ring(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *bdq)
|
||||
{
|
||||
if (!(bdq->flags & FBNIC_RING_F_STATS))
|
||||
return;
|
||||
|
||||
fbnic_aggregate_ring_bdq_counters(fbn, bdq);
|
||||
}
|
||||
|
||||
static void fbnic_free_qt_page_pools(struct fbnic_q_triad *qt)
|
||||
{
|
||||
page_pool_destroy(qt->sub0.page_pool);
|
||||
@@ -1507,8 +1525,8 @@ static void fbnic_free_napi_vector(struct fbnic_net *fbn,
|
||||
}
|
||||
|
||||
for (j = 0; j < nv->rxt_count; j++, i++) {
|
||||
fbnic_remove_rx_ring(fbn, &nv->qt[i].sub0);
|
||||
fbnic_remove_rx_ring(fbn, &nv->qt[i].sub1);
|
||||
fbnic_remove_bdq_ring(fbn, &nv->qt[i].sub0);
|
||||
fbnic_remove_bdq_ring(fbn, &nv->qt[i].sub1);
|
||||
fbnic_remove_rx_ring(fbn, &nv->qt[i].cmpl);
|
||||
}
|
||||
|
||||
@@ -1707,11 +1725,13 @@ static int fbnic_alloc_napi_vector(struct fbnic_dev *fbd, struct fbnic_net *fbn,
|
||||
while (rxt_count) {
|
||||
/* Configure header queue */
|
||||
db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_BDQ_HPQ_TAIL];
|
||||
fbnic_ring_init(&qt->sub0, db, 0, FBNIC_RING_F_CTX);
|
||||
fbnic_ring_init(&qt->sub0, db, 0,
|
||||
FBNIC_RING_F_CTX | FBNIC_RING_F_STATS);
|
||||
|
||||
/* Configure payload queue */
|
||||
db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_BDQ_PPQ_TAIL];
|
||||
fbnic_ring_init(&qt->sub1, db, 0, FBNIC_RING_F_CTX);
|
||||
fbnic_ring_init(&qt->sub1, db, 0,
|
||||
FBNIC_RING_F_CTX | FBNIC_RING_F_STATS);
|
||||
|
||||
/* Configure Rx completion queue */
|
||||
db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_RCQ_HEAD];
|
||||
@@ -2830,8 +2850,8 @@ static int fbnic_queue_start(struct net_device *dev, void *qmem, int idx)
|
||||
real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
|
||||
nv = fbn->napi[idx % fbn->num_napi];
|
||||
|
||||
fbnic_aggregate_ring_rx_counters(fbn, &real->sub0);
|
||||
fbnic_aggregate_ring_rx_counters(fbn, &real->sub1);
|
||||
fbnic_aggregate_ring_bdq_counters(fbn, &real->sub0);
|
||||
fbnic_aggregate_ring_bdq_counters(fbn, &real->sub1);
|
||||
fbnic_aggregate_ring_rx_counters(fbn, &real->cmpl);
|
||||
|
||||
memcpy(real, qmem, sizeof(*real));
|
||||
|
||||
@@ -92,6 +92,9 @@ struct fbnic_queue_stats {
|
||||
u64 csum_none;
|
||||
u64 length_errors;
|
||||
} rx;
|
||||
struct {
|
||||
u64 alloc_failed;
|
||||
} bdq;
|
||||
};
|
||||
u64 dropped;
|
||||
struct u64_stats_sync syncp;
|
||||
@@ -165,8 +168,12 @@ fbnic_features_check(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
void fbnic_aggregate_ring_rx_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *rxr);
|
||||
void fbnic_aggregate_ring_bdq_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *rxr);
|
||||
void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *txr);
|
||||
void fbnic_aggregate_ring_xdp_counters(struct fbnic_net *fbn,
|
||||
struct fbnic_ring *xdpr);
|
||||
|
||||
int fbnic_alloc_napi_vectors(struct fbnic_net *fbn);
|
||||
void fbnic_free_napi_vectors(struct fbnic_net *fbn);
|
||||
|
||||
@@ -708,6 +708,11 @@ static int sparx5_start(struct sparx5 *sparx5)
|
||||
/* Init masks */
|
||||
sparx5_update_fwd(sparx5);
|
||||
|
||||
/* Init flood masks */
|
||||
for (int pgid = sparx5_get_pgid(sparx5, PGID_UC_FLOOD);
|
||||
pgid <= sparx5_get_pgid(sparx5, PGID_BCAST); pgid++)
|
||||
sparx5_pgid_clear(sparx5, pgid);
|
||||
|
||||
/* CPU copy CPU pgids */
|
||||
spx5_wr(ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA_SET(1), sparx5,
|
||||
ANA_AC_PGID_MISC_CFG(sparx5_get_pgid(sparx5, PGID_CPU)));
|
||||
|
||||
@@ -176,6 +176,7 @@ static int sparx5_port_bridge_join(struct sparx5_port *port,
|
||||
struct net_device *bridge,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct switchdev_brport_flags flags = {0};
|
||||
struct sparx5 *sparx5 = port->sparx5;
|
||||
struct net_device *ndev = port->ndev;
|
||||
int err;
|
||||
@@ -205,6 +206,11 @@ static int sparx5_port_bridge_join(struct sparx5_port *port,
|
||||
*/
|
||||
__dev_mc_unsync(ndev, sparx5_mc_unsync);
|
||||
|
||||
/* Enable uc/mc/bc flooding */
|
||||
flags.mask = BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
|
||||
flags.val = flags.mask;
|
||||
sparx5_port_attr_bridge_flags(port, flags);
|
||||
|
||||
return 0;
|
||||
|
||||
err_switchdev_offload:
|
||||
@@ -215,6 +221,7 @@ err_switchdev_offload:
|
||||
static void sparx5_port_bridge_leave(struct sparx5_port *port,
|
||||
struct net_device *bridge)
|
||||
{
|
||||
struct switchdev_brport_flags flags = {0};
|
||||
struct sparx5 *sparx5 = port->sparx5;
|
||||
|
||||
switchdev_bridge_port_unoffload(port->ndev, NULL, NULL, NULL);
|
||||
@@ -234,6 +241,11 @@ static void sparx5_port_bridge_leave(struct sparx5_port *port,
|
||||
|
||||
/* Port enters in host more therefore restore mc list */
|
||||
__dev_mc_sync(port->ndev, sparx5_mc_sync, sparx5_mc_unsync);
|
||||
|
||||
/* Disable uc/mc/bc flooding */
|
||||
flags.mask = BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
|
||||
flags.val = 0;
|
||||
sparx5_port_attr_bridge_flags(port, flags);
|
||||
}
|
||||
|
||||
static int sparx5_port_changeupper(struct net_device *dev,
|
||||
|
||||
@@ -167,16 +167,6 @@ void sparx5_update_fwd(struct sparx5 *sparx5)
|
||||
/* Divide up fwd mask in 32 bit words */
|
||||
bitmap_to_arr32(mask, sparx5->bridge_fwd_mask, SPX5_PORTS);
|
||||
|
||||
/* Update flood masks */
|
||||
for (port = sparx5_get_pgid(sparx5, PGID_UC_FLOOD);
|
||||
port <= sparx5_get_pgid(sparx5, PGID_BCAST); port++) {
|
||||
spx5_wr(mask[0], sparx5, ANA_AC_PGID_CFG(port));
|
||||
if (is_sparx5(sparx5)) {
|
||||
spx5_wr(mask[1], sparx5, ANA_AC_PGID_CFG1(port));
|
||||
spx5_wr(mask[2], sparx5, ANA_AC_PGID_CFG2(port));
|
||||
}
|
||||
}
|
||||
|
||||
/* Update SRC masks */
|
||||
for (port = 0; port < sparx5->data->consts->n_ports; port++) {
|
||||
if (test_bit(port, sparx5->bridge_fwd_mask)) {
|
||||
|
||||
@@ -1021,6 +1021,6 @@ int ocelot_stats_init(struct ocelot *ocelot)
|
||||
|
||||
void ocelot_stats_deinit(struct ocelot *ocelot)
|
||||
{
|
||||
cancel_delayed_work(&ocelot->stats_work);
|
||||
disable_delayed_work_sync(&ocelot->stats_work);
|
||||
destroy_workqueue(ocelot->stats_queue);
|
||||
}
|
||||
|
||||
@@ -116,17 +116,23 @@ static int smbus_byte_mii_read_default_c22(struct mii_bus *bus, int phy_id,
|
||||
if (!i2c_mii_valid_phy_id(phy_id))
|
||||
return 0;
|
||||
|
||||
ret = i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_READ, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
i2c_lock_bus(i2c, I2C_LOCK_SEGMENT);
|
||||
|
||||
ret = __i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_READ, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto unlock;
|
||||
|
||||
val = (smbus_data.byte & 0xff) << 8;
|
||||
|
||||
ret = i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_READ, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
ret = __i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_READ, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
|
||||
unlock:
|
||||
i2c_unlock_bus(i2c, I2C_LOCK_SEGMENT);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -147,17 +153,22 @@ static int smbus_byte_mii_write_default_c22(struct mii_bus *bus, int phy_id,
|
||||
|
||||
smbus_data.byte = (val & 0xff00) >> 8;
|
||||
|
||||
ret = i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_WRITE, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
i2c_lock_bus(i2c, I2C_LOCK_SEGMENT);
|
||||
|
||||
ret = __i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_WRITE, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto unlock;
|
||||
|
||||
smbus_data.byte = val & 0xff;
|
||||
|
||||
ret = i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_WRITE, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
ret = __i2c_smbus_xfer(i2c, i2c_mii_phy_addr(phy_id), 0,
|
||||
I2C_SMBUS_WRITE, reg,
|
||||
I2C_SMBUS_BYTE_DATA, &smbus_data);
|
||||
|
||||
unlock:
|
||||
i2c_unlock_bus(i2c, I2C_LOCK_SEGMENT);
|
||||
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define TPS23881_REG_SRAM_DATA 0x61
|
||||
|
||||
#define TPS23881_UV_STEP 3662
|
||||
#define TPS23881_NA_STEP 70190
|
||||
#define TPS23881_NA_STEP 89500
|
||||
#define TPS23881_MW_STEP 500
|
||||
#define TPS23881_MIN_PI_PW_LIMIT_MW 2000
|
||||
|
||||
|
||||
@@ -625,6 +625,21 @@ static void ax88772_suspend(struct usbnet *dev)
|
||||
asix_read_medium_status(dev, 1));
|
||||
}
|
||||
|
||||
/* Notes on PM callbacks and locking context:
|
||||
*
|
||||
* - asix_suspend()/asix_resume() are invoked for both runtime PM and
|
||||
* system-wide suspend/resume. For struct usb_driver the ->resume()
|
||||
* callback does not receive pm_message_t, so the resume type cannot
|
||||
* be distinguished here.
|
||||
*
|
||||
* - The MAC driver must hold RTNL when calling phylink interfaces such as
|
||||
* phylink_suspend()/resume(). Those calls will also perform MDIO I/O.
|
||||
*
|
||||
* - Taking RTNL and doing MDIO from a runtime-PM resume callback (while
|
||||
* the USB PM lock is held) is fragile. Since autosuspend brings no
|
||||
* measurable power saving here, we block it by holding a PM usage
|
||||
* reference in ax88772_bind().
|
||||
*/
|
||||
static int asix_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
{
|
||||
struct usbnet *dev = usb_get_intfdata(intf);
|
||||
@@ -919,6 +934,13 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
if (ret)
|
||||
goto initphy_err;
|
||||
|
||||
/* Keep this interface runtime-PM active by taking a usage ref.
|
||||
* Prevents runtime suspend while bound and avoids resume paths
|
||||
* that could deadlock (autoresume under RTNL while USB PM lock
|
||||
* is held, phylink/MDIO wants RTNL).
|
||||
*/
|
||||
pm_runtime_get_noresume(&intf->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
initphy_err:
|
||||
@@ -948,6 +970,8 @@ static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
phylink_destroy(priv->phylink);
|
||||
ax88772_mdio_unregister(priv);
|
||||
asix_rx_fixup_common_free(dev->driver_priv);
|
||||
/* Drop the PM usage ref taken in bind() */
|
||||
pm_runtime_put(&intf->dev);
|
||||
}
|
||||
|
||||
static void ax88178_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
@@ -1600,6 +1624,11 @@ static struct usb_driver asix_driver = {
|
||||
.resume = asix_resume,
|
||||
.reset_resume = asix_resume,
|
||||
.disconnect = usbnet_disconnect,
|
||||
/* usbnet enables autosuspend by default (supports_autosuspend=1).
|
||||
* We keep runtime-PM active for AX88772* by taking a PM usage
|
||||
* reference in ax88772_bind() (pm_runtime_get_noresume()) and
|
||||
* dropping it in unbind(), which effectively blocks autosuspend.
|
||||
*/
|
||||
.supports_autosuspend = 1,
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
};
|
||||
|
||||
@@ -1080,10 +1080,13 @@ static int lan78xx_read_raw_eeprom(struct lan78xx_net *dev, u32 offset,
|
||||
}
|
||||
|
||||
read_raw_eeprom_done:
|
||||
if (dev->chipid == ID_REV_CHIP_ID_7800_)
|
||||
return lan78xx_write_reg(dev, HW_CFG, saved);
|
||||
|
||||
return 0;
|
||||
if (dev->chipid == ID_REV_CHIP_ID_7800_) {
|
||||
int rc = lan78xx_write_reg(dev, HW_CFG, saved);
|
||||
/* If USB fails, there is nothing to do */
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int lan78xx_read_eeprom(struct lan78xx_net *dev, u32 offset,
|
||||
|
||||
@@ -939,6 +939,7 @@ static void t7xx_pci_remove(struct pci_dev *pdev)
|
||||
|
||||
static const struct pci_device_id t7xx_pci_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x4d75) },
|
||||
{ PCI_DEVICE(0x03f0, 0x09c8) }, // HP DRMR-H01
|
||||
{ PCI_DEVICE(0x14c0, 0x4d75) }, // Dell DW5933e
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -4263,14 +4263,13 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status);
|
||||
* since this value becomes part of PP_SIGNATURE; meaning we can just use the
|
||||
* space between the PP_SIGNATURE value (without POISON_POINTER_DELTA), and the
|
||||
* lowest bits of POISON_POINTER_DELTA. On arches where POISON_POINTER_DELTA is
|
||||
* 0, we make sure that we leave the two topmost bits empty, as that guarantees
|
||||
* we won't mistake a valid kernel pointer for a value we set, regardless of the
|
||||
* VMSPLIT setting.
|
||||
* 0, we use the lowest bit of PAGE_OFFSET as the boundary if that value is
|
||||
* known at compile-time.
|
||||
*
|
||||
* Altogether, this means that the number of bits available is constrained by
|
||||
* the size of an unsigned long (at the upper end, subtracting two bits per the
|
||||
* above), and the definition of PP_SIGNATURE (with or without
|
||||
* POISON_POINTER_DELTA).
|
||||
* If the value of PAGE_OFFSET is not known at compile time, or if it is too
|
||||
* small to leave at least 8 bits available above PP_SIGNATURE, we define the
|
||||
* number of bits to be 0, which turns off the DMA index tracking altogether
|
||||
* (see page_pool_register_dma_index()).
|
||||
*/
|
||||
#define PP_DMA_INDEX_SHIFT (1 + __fls(PP_SIGNATURE - POISON_POINTER_DELTA))
|
||||
#if POISON_POINTER_DELTA > 0
|
||||
@@ -4279,8 +4278,13 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status);
|
||||
*/
|
||||
#define PP_DMA_INDEX_BITS MIN(32, __ffs(POISON_POINTER_DELTA) - PP_DMA_INDEX_SHIFT)
|
||||
#else
|
||||
/* Always leave out the topmost two; see above. */
|
||||
#define PP_DMA_INDEX_BITS MIN(32, BITS_PER_LONG - PP_DMA_INDEX_SHIFT - 2)
|
||||
/* Use the lowest bit of PAGE_OFFSET if there's at least 8 bits available; see above */
|
||||
#define PP_DMA_INDEX_MIN_OFFSET (1 << (PP_DMA_INDEX_SHIFT + 8))
|
||||
#define PP_DMA_INDEX_BITS ((__builtin_constant_p(PAGE_OFFSET) && \
|
||||
PAGE_OFFSET >= PP_DMA_INDEX_MIN_OFFSET && \
|
||||
!(PAGE_OFFSET & (PP_DMA_INDEX_MIN_OFFSET - 1))) ? \
|
||||
MIN(32, __ffs(PAGE_OFFSET) - PP_DMA_INDEX_SHIFT) : 0)
|
||||
|
||||
#endif
|
||||
|
||||
#define PP_DMA_INDEX_MASK GENMASK(PP_DMA_INDEX_BITS + PP_DMA_INDEX_SHIFT - 1, \
|
||||
|
||||
@@ -297,7 +297,7 @@ static inline const char *phy_modes(phy_interface_t interface)
|
||||
*
|
||||
* Description: maps RGMII supported link speeds into the clock rates.
|
||||
* This can also be used for MII, GMII, and RMII interface modes as the
|
||||
* clock rates are indentical, but the caller must be aware that errors
|
||||
* clock rates are identical, but the caller must be aware that errors
|
||||
* for unsupported clock rates will not be signalled.
|
||||
*
|
||||
* Returns: clock rate or negative errno
|
||||
@@ -519,7 +519,7 @@ enum phy_state {
|
||||
* struct phy_c45_device_ids - 802.3-c45 Device Identifiers
|
||||
* @devices_in_package: IEEE 802.3 devices in package register value.
|
||||
* @mmds_present: bit vector of MMDs present.
|
||||
* @device_ids: The device identifer for each present device.
|
||||
* @device_ids: The device identifier for each present device.
|
||||
*/
|
||||
struct phy_c45_device_ids {
|
||||
u32 devices_in_package;
|
||||
|
||||
@@ -34,7 +34,7 @@ unsigned int psp_key_size(u32 version);
|
||||
void psp_sk_assoc_free(struct sock *sk);
|
||||
void psp_twsk_init(struct inet_timewait_sock *tw, const struct sock *sk);
|
||||
void psp_twsk_assoc_free(struct inet_timewait_sock *tw);
|
||||
void psp_reply_set_decrypted(struct sk_buff *skb);
|
||||
void psp_reply_set_decrypted(const struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
static inline struct psp_assoc *psp_sk_assoc(const struct sock *sk)
|
||||
{
|
||||
@@ -160,7 +160,7 @@ static inline void
|
||||
psp_twsk_init(struct inet_timewait_sock *tw, const struct sock *sk) { }
|
||||
static inline void psp_twsk_assoc_free(struct inet_timewait_sock *tw) { }
|
||||
static inline void
|
||||
psp_reply_set_decrypted(struct sk_buff *skb) { }
|
||||
psp_reply_set_decrypted(const struct sock *sk, struct sk_buff *skb) { }
|
||||
|
||||
static inline struct psp_assoc *psp_sk_assoc(const struct sock *sk)
|
||||
{
|
||||
|
||||
@@ -1457,7 +1457,7 @@ void br_vlan_fill_forward_path_pvid(struct net_bridge *br,
|
||||
if (!br_opt_get(br, BROPT_VLAN_ENABLED))
|
||||
return;
|
||||
|
||||
vg = br_vlan_group(br);
|
||||
vg = br_vlan_group_rcu(br);
|
||||
|
||||
if (idx >= 0 &&
|
||||
ctx->vlan[idx].proto == br->vlan_proto) {
|
||||
|
||||
@@ -468,11 +468,60 @@ page_pool_dma_sync_for_device(const struct page_pool *pool,
|
||||
}
|
||||
}
|
||||
|
||||
static int page_pool_register_dma_index(struct page_pool *pool,
|
||||
netmem_ref netmem, gfp_t gfp)
|
||||
{
|
||||
int err = 0;
|
||||
u32 id;
|
||||
|
||||
if (unlikely(!PP_DMA_INDEX_BITS))
|
||||
goto out;
|
||||
|
||||
if (in_softirq())
|
||||
err = xa_alloc(&pool->dma_mapped, &id, netmem_to_page(netmem),
|
||||
PP_DMA_INDEX_LIMIT, gfp);
|
||||
else
|
||||
err = xa_alloc_bh(&pool->dma_mapped, &id, netmem_to_page(netmem),
|
||||
PP_DMA_INDEX_LIMIT, gfp);
|
||||
if (err) {
|
||||
WARN_ONCE(err != -ENOMEM, "couldn't track DMA mapping, please report to netdev@");
|
||||
goto out;
|
||||
}
|
||||
|
||||
netmem_set_dma_index(netmem, id);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int page_pool_release_dma_index(struct page_pool *pool,
|
||||
netmem_ref netmem)
|
||||
{
|
||||
struct page *old, *page = netmem_to_page(netmem);
|
||||
unsigned long id;
|
||||
|
||||
if (unlikely(!PP_DMA_INDEX_BITS))
|
||||
return 0;
|
||||
|
||||
id = netmem_get_dma_index(netmem);
|
||||
if (!id)
|
||||
return -1;
|
||||
|
||||
if (in_softirq())
|
||||
old = xa_cmpxchg(&pool->dma_mapped, id, page, NULL, 0);
|
||||
else
|
||||
old = xa_cmpxchg_bh(&pool->dma_mapped, id, page, NULL, 0);
|
||||
if (old != page)
|
||||
return -1;
|
||||
|
||||
netmem_set_dma_index(netmem, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem, gfp_t gfp)
|
||||
{
|
||||
dma_addr_t dma;
|
||||
int err;
|
||||
u32 id;
|
||||
|
||||
/* Setup DMA mapping: use 'struct page' area for storing DMA-addr
|
||||
* since dma_addr_t can be either 32 or 64 bits and does not always fit
|
||||
@@ -491,18 +540,10 @@ static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem, gfp_t g
|
||||
goto unmap_failed;
|
||||
}
|
||||
|
||||
if (in_softirq())
|
||||
err = xa_alloc(&pool->dma_mapped, &id, netmem_to_page(netmem),
|
||||
PP_DMA_INDEX_LIMIT, gfp);
|
||||
else
|
||||
err = xa_alloc_bh(&pool->dma_mapped, &id, netmem_to_page(netmem),
|
||||
PP_DMA_INDEX_LIMIT, gfp);
|
||||
if (err) {
|
||||
WARN_ONCE(err != -ENOMEM, "couldn't track DMA mapping, please report to netdev@");
|
||||
err = page_pool_register_dma_index(pool, netmem, gfp);
|
||||
if (err)
|
||||
goto unset_failed;
|
||||
}
|
||||
|
||||
netmem_set_dma_index(netmem, id);
|
||||
page_pool_dma_sync_for_device(pool, netmem, pool->p.max_len);
|
||||
|
||||
return true;
|
||||
@@ -680,8 +721,6 @@ void page_pool_clear_pp_info(netmem_ref netmem)
|
||||
static __always_inline void __page_pool_release_netmem_dma(struct page_pool *pool,
|
||||
netmem_ref netmem)
|
||||
{
|
||||
struct page *old, *page = netmem_to_page(netmem);
|
||||
unsigned long id;
|
||||
dma_addr_t dma;
|
||||
|
||||
if (!pool->dma_map)
|
||||
@@ -690,15 +729,7 @@ static __always_inline void __page_pool_release_netmem_dma(struct page_pool *poo
|
||||
*/
|
||||
return;
|
||||
|
||||
id = netmem_get_dma_index(netmem);
|
||||
if (!id)
|
||||
return;
|
||||
|
||||
if (in_softirq())
|
||||
old = xa_cmpxchg(&pool->dma_mapped, id, page, NULL, 0);
|
||||
else
|
||||
old = xa_cmpxchg_bh(&pool->dma_mapped, id, page, NULL, 0);
|
||||
if (old != page)
|
||||
if (page_pool_release_dma_index(pool, netmem))
|
||||
return;
|
||||
|
||||
dma = page_pool_get_dma_addr_netmem(netmem);
|
||||
@@ -708,7 +739,6 @@ static __always_inline void __page_pool_release_netmem_dma(struct page_pool *poo
|
||||
PAGE_SIZE << pool->p.order, pool->p.dma_dir,
|
||||
DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING);
|
||||
page_pool_set_dma_addr_netmem(netmem, 0);
|
||||
netmem_set_dma_index(netmem, 0);
|
||||
}
|
||||
|
||||
/* Disconnects a page (from a page_pool). API users can have a need
|
||||
|
||||
@@ -1668,7 +1668,7 @@ void ip_send_unicast_reply(struct sock *sk, const struct sock *orig_sk,
|
||||
nskb->ip_summed = CHECKSUM_NONE;
|
||||
if (orig_sk) {
|
||||
skb_set_owner_edemux(nskb, (struct sock *)orig_sk);
|
||||
psp_reply_set_decrypted(nskb);
|
||||
psp_reply_set_decrypted(orig_sk, nskb);
|
||||
}
|
||||
if (transmit_time)
|
||||
nskb->tstamp_type = SKB_CLOCK_MONOTONIC;
|
||||
|
||||
@@ -1791,6 +1791,7 @@ EXPORT_IPV6_MOD(tcp_peek_len);
|
||||
/* Make sure sk_rcvbuf is big enough to satisfy SO_RCVLOWAT hint */
|
||||
int tcp_set_rcvlowat(struct sock *sk, int val)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
int space, cap;
|
||||
|
||||
if (sk->sk_userlocks & SOCK_RCVBUF_LOCK)
|
||||
@@ -1809,7 +1810,9 @@ int tcp_set_rcvlowat(struct sock *sk, int val)
|
||||
space = tcp_space_from_win(sk, val);
|
||||
if (space > sk->sk_rcvbuf) {
|
||||
WRITE_ONCE(sk->sk_rcvbuf, space);
|
||||
WRITE_ONCE(tcp_sk(sk)->window_clamp, val);
|
||||
|
||||
if (tp->window_clamp && tp->window_clamp < val)
|
||||
WRITE_ONCE(tp->window_clamp, val);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -7509,7 +7509,6 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
||||
&foc, TCP_SYNACK_FASTOPEN, skb);
|
||||
/* Add the child socket directly into the accept queue */
|
||||
if (!inet_csk_reqsk_queue_add(sk, req, fastopen_sk)) {
|
||||
reqsk_fastopen_remove(fastopen_sk, req, false);
|
||||
bh_unlock_sock(fastopen_sk);
|
||||
sock_put(fastopen_sk);
|
||||
goto drop_and_free;
|
||||
|
||||
@@ -974,7 +974,7 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32
|
||||
if (sk) {
|
||||
/* unconstify the socket only to attach it to buff with care. */
|
||||
skb_set_owner_edemux(buff, (struct sock *)sk);
|
||||
psp_reply_set_decrypted(buff);
|
||||
psp_reply_set_decrypted(sk, buff);
|
||||
|
||||
if (sk->sk_state == TCP_TIME_WAIT)
|
||||
mark = inet_twsk(sk)->tw_mark;
|
||||
|
||||
@@ -22,6 +22,35 @@ void nft_objref_eval(const struct nft_expr *expr,
|
||||
obj->ops->eval(obj, regs, pkt);
|
||||
}
|
||||
|
||||
static int nft_objref_validate_obj_type(const struct nft_ctx *ctx, u32 type)
|
||||
{
|
||||
unsigned int hooks;
|
||||
|
||||
switch (type) {
|
||||
case NFT_OBJECT_SYNPROXY:
|
||||
if (ctx->family != NFPROTO_IPV4 &&
|
||||
ctx->family != NFPROTO_IPV6 &&
|
||||
ctx->family != NFPROTO_INET)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD);
|
||||
|
||||
return nft_chain_validate_hooks(ctx->chain, hooks);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nft_objref_validate(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr)
|
||||
{
|
||||
struct nft_object *obj = nft_objref_priv(expr);
|
||||
|
||||
return nft_objref_validate_obj_type(ctx, obj->ops->type->type);
|
||||
}
|
||||
|
||||
static int nft_objref_init(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr,
|
||||
const struct nlattr * const tb[])
|
||||
@@ -93,6 +122,7 @@ static const struct nft_expr_ops nft_objref_ops = {
|
||||
.activate = nft_objref_activate,
|
||||
.deactivate = nft_objref_deactivate,
|
||||
.dump = nft_objref_dump,
|
||||
.validate = nft_objref_validate,
|
||||
.reduce = NFT_REDUCE_READONLY,
|
||||
};
|
||||
|
||||
@@ -197,6 +227,14 @@ static void nft_objref_map_destroy(const struct nft_ctx *ctx,
|
||||
nf_tables_destroy_set(ctx, priv->set);
|
||||
}
|
||||
|
||||
static int nft_objref_map_validate(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr)
|
||||
{
|
||||
const struct nft_objref_map *priv = nft_expr_priv(expr);
|
||||
|
||||
return nft_objref_validate_obj_type(ctx, priv->set->objtype);
|
||||
}
|
||||
|
||||
static const struct nft_expr_ops nft_objref_map_ops = {
|
||||
.type = &nft_objref_type,
|
||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_objref_map)),
|
||||
@@ -206,6 +244,7 @@ static const struct nft_expr_ops nft_objref_map_ops = {
|
||||
.deactivate = nft_objref_map_deactivate,
|
||||
.destroy = nft_objref_map_destroy,
|
||||
.dump = nft_objref_map_dump,
|
||||
.validate = nft_objref_map_validate,
|
||||
.reduce = NFT_REDUCE_READONLY,
|
||||
};
|
||||
|
||||
|
||||
@@ -279,12 +279,12 @@ void psp_twsk_assoc_free(struct inet_timewait_sock *tw)
|
||||
psp_assoc_put(pas);
|
||||
}
|
||||
|
||||
void psp_reply_set_decrypted(struct sk_buff *skb)
|
||||
void psp_reply_set_decrypted(const struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct psp_assoc *pas;
|
||||
|
||||
rcu_read_lock();
|
||||
pas = psp_sk_get_assoc_rcu(skb->sk);
|
||||
pas = psp_sk_get_assoc_rcu(sk);
|
||||
if (pas && pas->tx.spi)
|
||||
skb->decrypted = 1;
|
||||
rcu_read_unlock();
|
||||
|
||||
@@ -886,7 +886,8 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
|
||||
return SCTP_DISPOSITION_CONSUME;
|
||||
|
||||
nomem_authev:
|
||||
sctp_ulpevent_free(ai_ev);
|
||||
if (ai_ev)
|
||||
sctp_ulpevent_free(ai_ev);
|
||||
nomem_aiev:
|
||||
sctp_ulpevent_free(ev);
|
||||
nomem_ev:
|
||||
|
||||
@@ -1797,7 +1797,7 @@ exit:
|
||||
* @b: bearer where the message has been received
|
||||
*
|
||||
* If the decryption is successful, the decrypted skb is returned directly or
|
||||
* as the callback, the encryption header and auth tag will be trimed out
|
||||
* as the callback, the encryption header and auth tag will be trimmed out
|
||||
* before forwarding to tipc_rcv() via the tipc_crypto_rcv_complete().
|
||||
* Otherwise, the skb will be freed!
|
||||
* Note: RX key(s) can be re-aligned, or in case of no key suitable, TX
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
* @conn_idr: identifier set of connection
|
||||
* @idr_lock: protect the connection identifier set
|
||||
* @idr_in_use: amount of allocated identifier entry
|
||||
* @net: network namspace instance
|
||||
* @net: network namespace instance
|
||||
* @awork: accept work item
|
||||
* @rcv_wq: receive workqueue
|
||||
* @send_wq: send workqueue
|
||||
@@ -83,7 +83,7 @@ struct tipc_topsrv {
|
||||
* @sock: socket handler associated with connection
|
||||
* @flags: indicates connection state
|
||||
* @server: pointer to connected server
|
||||
* @sub_list: lsit to all pertaing subscriptions
|
||||
* @sub_list: list to all pertaining subscriptions
|
||||
* @sub_lock: lock protecting the subscription list
|
||||
* @rwork: receive work item
|
||||
* @outqueue: pointer to first outbound message in queue
|
||||
|
||||
@@ -10,6 +10,7 @@ TEST_GEN_FILES := \
|
||||
# end of TEST_GEN_FILES
|
||||
|
||||
TEST_PROGS := \
|
||||
hds.py \
|
||||
napi_id.py \
|
||||
napi_threaded.py \
|
||||
netcons_basic.sh \
|
||||
@@ -21,9 +22,8 @@ TEST_PROGS := \
|
||||
ping.py \
|
||||
psp.py \
|
||||
queues.py \
|
||||
stats.py \
|
||||
shaper.py \
|
||||
hds.py \
|
||||
stats.py \
|
||||
xdp.py \
|
||||
# end of TEST_PROGS
|
||||
|
||||
|
||||
@@ -4,24 +4,27 @@
|
||||
TEST_PROGS := \
|
||||
bond-arp-interval-causes-panic.sh \
|
||||
bond-break-lacpdu-tx.sh \
|
||||
bond-eth-type-change.sh \
|
||||
bond-lladdr-target.sh \
|
||||
bond_ipsec_offload.sh \
|
||||
bond_lacp_prio.sh \
|
||||
bond_macvlan_ipvlan.sh \
|
||||
bond_options.sh \
|
||||
bond_passive_lacp.sh \
|
||||
dev_addr_lists.sh \
|
||||
mode-1-recovery-updelay.sh \
|
||||
mode-2-recovery-updelay.sh \
|
||||
bond_options.sh \
|
||||
bond-eth-type-change.sh \
|
||||
bond_macvlan_ipvlan.sh \
|
||||
bond_passive_lacp.sh \
|
||||
bond_lacp_prio.sh
|
||||
bond_ipsec_offload.sh
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_FILES := \
|
||||
lag_lib.sh \
|
||||
bond_topo_2d1c.sh \
|
||||
bond_topo_3d1c.sh
|
||||
bond_topo_3d1c.sh \
|
||||
lag_lib.sh \
|
||||
# end of TEST_FILES
|
||||
|
||||
TEST_INCLUDES := \
|
||||
../../../net/lib.sh \
|
||||
../../../net/forwarding/lib.sh \
|
||||
../../../net/lib.sh
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
include ../../../lib.mk
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
CONFIG_BONDING=y
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_DUMMY=y
|
||||
CONFIG_INET_ESP=y
|
||||
CONFIG_INET_ESP_OFFLOAD=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_MACVLAN=y
|
||||
CONFIG_IPVLAN=y
|
||||
CONFIG_MACVLAN=y
|
||||
CONFIG_NET_ACT_GACT=y
|
||||
CONFIG_NET_CLS_FLOWER=y
|
||||
CONFIG_NET_CLS_MATCHALL=m
|
||||
CONFIG_NETDEVSIM=m
|
||||
CONFIG_NET_SCH_INGRESS=y
|
||||
CONFIG_NLMON=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_VLAN_8021Q=m
|
||||
CONFIG_INET_ESP=y
|
||||
CONFIG_INET_ESP_OFFLOAD=y
|
||||
CONFIG_XFRM_USER=m
|
||||
CONFIG_NETDEVSIM=m
|
||||
|
||||
@@ -3,8 +3,8 @@ CONFIG_DEBUG_INFO_BTF=y
|
||||
CONFIG_DEBUG_INFO_BTF_MODULES=n
|
||||
CONFIG_INET_PSP=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_NETDEVSIM=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_NETCONSOLE_EXTENDED_LOG=y
|
||||
CONFIG_NETDEVSIM=m
|
||||
CONFIG_XDP_SOCKETS=y
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+ OR MIT
|
||||
|
||||
TEST_PROGS = bridge_locked_port.sh \
|
||||
TEST_PROGS := \
|
||||
bridge_locked_port.sh \
|
||||
bridge_mdb.sh \
|
||||
bridge_mld.sh \
|
||||
bridge_vlan_aware.sh \
|
||||
@@ -9,11 +10,13 @@ TEST_PROGS = bridge_locked_port.sh \
|
||||
local_termination.sh \
|
||||
no_forwarding.sh \
|
||||
tc_actions.sh \
|
||||
test_bridge_fdb_stress.sh
|
||||
test_bridge_fdb_stress.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_FILES := \
|
||||
forwarding.config \
|
||||
run_net_forwarding_test.sh \
|
||||
forwarding.config
|
||||
# end of TEST_FILES
|
||||
|
||||
TEST_INCLUDES := \
|
||||
../../../net/forwarding/bridge_locked_port.sh \
|
||||
@@ -27,6 +30,7 @@ TEST_INCLUDES := \
|
||||
../../../net/forwarding/no_forwarding.sh \
|
||||
../../../net/forwarding/tc_actions.sh \
|
||||
../../../net/forwarding/tc_common.sh \
|
||||
../../../net/lib.sh
|
||||
../../../net/lib.sh \
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
include ../../../lib.mk
|
||||
|
||||
@@ -3,11 +3,12 @@
|
||||
|
||||
import errno
|
||||
import os
|
||||
import random
|
||||
from typing import Union
|
||||
from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx
|
||||
from lib.py import CmdExitFailure, EthtoolFamily, NlError
|
||||
from lib.py import NetDrvEnv
|
||||
from lib.py import defer, ethtool, ip, random
|
||||
from lib.py import defer, ethtool, ip
|
||||
|
||||
|
||||
def _get_hds_mode(cfg, netnl) -> str:
|
||||
|
||||
@@ -32,8 +32,8 @@ TEST_FILES := \
|
||||
TEST_INCLUDES := \
|
||||
$(wildcard lib/py/*.py ../lib/py/*.py) \
|
||||
../../../net/lib.sh \
|
||||
../../../net/forwarding/lib.sh \
|
||||
../../../net/forwarding/ipip_lib.sh \
|
||||
../../../net/forwarding/lib.sh \
|
||||
../../../net/forwarding/tc_common.sh \
|
||||
#
|
||||
|
||||
@@ -45,7 +45,11 @@ TEST_GEN_FILES += $(patsubst %.c,%.o,$(wildcard *.bpf.c))
|
||||
include ../../../lib.mk
|
||||
|
||||
# YNL build
|
||||
YNL_GENS := ethtool netdev
|
||||
YNL_GENS := \
|
||||
ethtool \
|
||||
netdev \
|
||||
# end of YNL_GENS
|
||||
|
||||
include ../../../net/ynl.mk
|
||||
|
||||
include ../../../net/bpf.mk
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
CONFIG_FAIL_FUNCTION=y
|
||||
CONFIG_FAULT_INJECTION=y
|
||||
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||
CONFIG_FUNCTION_ERROR_INJECTION=y
|
||||
CONFIG_IO_URING=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_GRE=y
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
"""
|
||||
Test driver resilience vs page pool allocation failures.
|
||||
"""
|
||||
|
||||
import errno
|
||||
import time
|
||||
import math
|
||||
import os
|
||||
from lib.py import ksft_run, ksft_exit, ksft_pr
|
||||
from lib.py import KsftSkipEx, KsftFailEx
|
||||
@@ -13,7 +18,8 @@ from lib.py import cmd, tool, GenerateTraffic
|
||||
|
||||
def _write_fail_config(config):
|
||||
for key, value in config.items():
|
||||
with open("/sys/kernel/debug/fail_function/" + key, "w") as fp:
|
||||
path = "/sys/kernel/debug/fail_function/"
|
||||
with open(path + key, "w", encoding='ascii') as fp:
|
||||
fp.write(str(value) + "\n")
|
||||
|
||||
|
||||
@@ -22,8 +28,7 @@ def _enable_pp_allocation_fail():
|
||||
raise KsftSkipEx("Kernel built without function error injection (or DebugFS)")
|
||||
|
||||
if not os.path.exists("/sys/kernel/debug/fail_function/page_pool_alloc_netmems"):
|
||||
with open("/sys/kernel/debug/fail_function/inject", "w") as fp:
|
||||
fp.write("page_pool_alloc_netmems\n")
|
||||
_write_fail_config({"inject": "page_pool_alloc_netmems"})
|
||||
|
||||
_write_fail_config({
|
||||
"verbose": 0,
|
||||
@@ -38,8 +43,7 @@ def _disable_pp_allocation_fail():
|
||||
return
|
||||
|
||||
if os.path.exists("/sys/kernel/debug/fail_function/page_pool_alloc_netmems"):
|
||||
with open("/sys/kernel/debug/fail_function/inject", "w") as fp:
|
||||
fp.write("\n")
|
||||
_write_fail_config({"inject": ""})
|
||||
|
||||
_write_fail_config({
|
||||
"probability": 0,
|
||||
@@ -48,6 +52,10 @@ def _disable_pp_allocation_fail():
|
||||
|
||||
|
||||
def test_pp_alloc(cfg, netdevnl):
|
||||
"""
|
||||
Configure page pool allocation fail injection while traffic is running.
|
||||
"""
|
||||
|
||||
def get_stats():
|
||||
return netdevnl.qstats_get({"ifindex": cfg.ifindex}, dump=True)[0]
|
||||
|
||||
@@ -55,7 +63,7 @@ def test_pp_alloc(cfg, netdevnl):
|
||||
stat1 = get_stats()
|
||||
time.sleep(1)
|
||||
stat2 = get_stats()
|
||||
if stat2['rx-packets'] - stat1['rx-packets'] < 15000:
|
||||
if stat2['rx-packets'] - stat1['rx-packets'] < 4000:
|
||||
raise KsftFailEx("Traffic seems low:", stat2['rx-packets'] - stat1['rx-packets'])
|
||||
|
||||
|
||||
@@ -82,11 +90,16 @@ def test_pp_alloc(cfg, netdevnl):
|
||||
time.sleep(3)
|
||||
s2 = get_stats()
|
||||
|
||||
if s2['rx-alloc-fail'] - s1['rx-alloc-fail'] < 1:
|
||||
seen_fails = s2['rx-alloc-fail'] - s1['rx-alloc-fail']
|
||||
if seen_fails < 1:
|
||||
raise KsftSkipEx("Allocation failures not increasing")
|
||||
if s2['rx-alloc-fail'] - s1['rx-alloc-fail'] < 100:
|
||||
raise KsftSkipEx("Allocation increasing too slowly", s2['rx-alloc-fail'] - s1['rx-alloc-fail'],
|
||||
"packets:", s2['rx-packets'] - s1['rx-packets'])
|
||||
pkts = s2['rx-packets'] - s1['rx-packets']
|
||||
# Expecting one failure per 512 buffers, 3.1x safety margin
|
||||
want_fails = math.floor(pkts / 512 / 3.1)
|
||||
if seen_fails < want_fails:
|
||||
raise KsftSkipEx("Allocation increasing too slowly", seen_fails,
|
||||
"packets:", pkts)
|
||||
ksft_pr(f"Seen: pkts:{pkts} fails:{seen_fails} (pass thrs:{want_fails})")
|
||||
|
||||
# Basic failures are fine, try to wobble some settings to catch extra failures
|
||||
check_traffic_flowing()
|
||||
@@ -105,7 +118,7 @@ def test_pp_alloc(cfg, netdevnl):
|
||||
else:
|
||||
ksft_pr("ethtool -G change retval: did not succeed", new_g)
|
||||
else:
|
||||
ksft_pr("ethtool -G change retval: did not try")
|
||||
ksft_pr("ethtool -G change retval: did not try")
|
||||
|
||||
time.sleep(0.1)
|
||||
check_traffic_flowing()
|
||||
@@ -119,6 +132,7 @@ def test_pp_alloc(cfg, netdevnl):
|
||||
|
||||
|
||||
def main() -> None:
|
||||
""" Ksft boiler plate main """
|
||||
netdevnl = NetdevFamily()
|
||||
with NetDrvEpEnv(__file__, nsim_test=False) as cfg:
|
||||
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
"""
|
||||
Driver test environment.
|
||||
NetDrvEnv and NetDrvEpEnv are the main environment classes.
|
||||
Former is for local host only tests, latter creates / connects
|
||||
to a remote endpoint. See NIPA wiki for more information about
|
||||
running and writing driver tests.
|
||||
"""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
@@ -8,26 +16,39 @@ KSFT_DIR = (Path(__file__).parent / "../../../..").resolve()
|
||||
try:
|
||||
sys.path.append(KSFT_DIR.as_posix())
|
||||
|
||||
from net.lib.py import *
|
||||
|
||||
# Import one by one to avoid pylint false positives
|
||||
from net.lib.py import NetNS, NetNSEnter, NetdevSimDev
|
||||
from net.lib.py import EthtoolFamily, NetdevFamily, NetshaperFamily, \
|
||||
NlError, RtnlFamily, DevlinkFamily, PSPFamily
|
||||
from net.lib.py import CmdExitFailure
|
||||
from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \
|
||||
fd_read_timeout, ip, rand_port, tool, wait_port_listen, wait_file
|
||||
from net.lib.py import fd_read_timeout
|
||||
from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx
|
||||
from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \
|
||||
ksft_setup
|
||||
from net.lib.py import ksft_eq, ksft_ge, ksft_in, ksft_is, ksft_lt, \
|
||||
ksft_ne, ksft_not_in, ksft_raises, ksft_true, ksft_gt, ksft_not_none
|
||||
except ModuleNotFoundError as e:
|
||||
ksft_pr("Failed importing `net` library from kernel sources")
|
||||
ksft_pr(str(e))
|
||||
ktap_result(True, comment="SKIP")
|
||||
sys.exit(4)
|
||||
|
||||
from .env import *
|
||||
from .load import *
|
||||
from .remote import Remote
|
||||
__all__ = ["NetNS", "NetNSEnter", "NetdevSimDev",
|
||||
"EthtoolFamily", "NetdevFamily", "NetshaperFamily",
|
||||
"NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily",
|
||||
"CmdExitFailure",
|
||||
"bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool",
|
||||
"fd_read_timeout", "ip", "rand_port", "tool",
|
||||
"wait_port_listen", "wait_file",
|
||||
"KsftSkipEx", "KsftFailEx", "KsftXfailEx",
|
||||
"ksft_disruptive", "ksft_exit", "ksft_pr", "ksft_run",
|
||||
"ksft_setup",
|
||||
"ksft_eq", "ksft_ge", "ksft_in", "ksft_is", "ksft_lt",
|
||||
"ksft_ne", "ksft_not_in", "ksft_raises", "ksft_true", "ksft_gt",
|
||||
"ksft_not_none", "ksft_not_none"]
|
||||
|
||||
from .env import NetDrvEnv, NetDrvEpEnv
|
||||
from .load import GenerateTraffic
|
||||
from .remote import Remote
|
||||
|
||||
__all__ += ["NetDrvEnv", "NetDrvEpEnv", "GenerateTraffic", "Remote"]
|
||||
except ModuleNotFoundError as e:
|
||||
print("Failed importing `net` library from kernel sources")
|
||||
print(str(e))
|
||||
sys.exit(4)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+ OR MIT
|
||||
|
||||
TEST_PROGS = devlink.sh \
|
||||
TEST_PROGS := \
|
||||
devlink.sh \
|
||||
devlink_in_netns.sh \
|
||||
devlink_trap.sh \
|
||||
ethtool-coalesce.sh \
|
||||
@@ -17,5 +18,6 @@ TEST_PROGS = devlink.sh \
|
||||
psample.sh \
|
||||
tc-mq-visibility.sh \
|
||||
udp_tunnel_nic.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
include ../../../lib.mk
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Makefile for net selftests
|
||||
|
||||
TEST_PROGS := dev_addr_lists.sh propagation.sh options.sh
|
||||
TEST_PROGS := \
|
||||
dev_addr_lists.sh \
|
||||
options.sh \
|
||||
propagation.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_INCLUDES := \
|
||||
../bonding/lag_lib.sh \
|
||||
../../../net/forwarding/lib.sh \
|
||||
../../../net/lib.sh \
|
||||
../../../net/in_netns.sh \
|
||||
../../../net/lib/sh/defer.sh
|
||||
../../../net/lib.sh \
|
||||
../../../net/lib/sh/defer.sh \
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
include ../../../lib.mk
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+ OR MIT
|
||||
|
||||
TEST_PROGS = basic_features.sh \
|
||||
#
|
||||
TEST_PROGS = basic_features.sh
|
||||
|
||||
TEST_FILES = \
|
||||
virtio_net_common.sh \
|
||||
#
|
||||
TEST_FILES = virtio_net_common.sh
|
||||
|
||||
TEST_INCLUDES = \
|
||||
../../../net/forwarding/lib.sh \
|
||||
../../../net/lib.sh \
|
||||
#
|
||||
../../../net/forwarding/lib.sh \
|
||||
../../../net/lib.sh \
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
include ../../../lib.mk
|
||||
|
||||
@@ -11,8 +11,9 @@ import string
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
|
||||
from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_ne, ksft_pr
|
||||
from lib.py import KsftFailEx, NetDrvEpEnv, EthtoolFamily, NlError
|
||||
from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_ge, ksft_ne, ksft_pr
|
||||
from lib.py import KsftFailEx, NetDrvEpEnv
|
||||
from lib.py import EthtoolFamily, NetdevFamily, NlError
|
||||
from lib.py import bkg, cmd, rand_port, wait_port_listen
|
||||
from lib.py import ip, bpftool, defer
|
||||
|
||||
@@ -541,11 +542,11 @@ def get_hds_thresh(cfg):
|
||||
The HDS threshold value. If the threshold is not supported or an error occurs,
|
||||
a default value of 1500 is returned.
|
||||
"""
|
||||
netnl = cfg.netnl
|
||||
ethnl = cfg.ethnl
|
||||
hds_thresh = 1500
|
||||
|
||||
try:
|
||||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
|
||||
rings = ethnl.rings_get({'header': {'dev-index': cfg.ifindex}})
|
||||
if 'hds-thresh' not in rings:
|
||||
ksft_pr(f'hds-thresh not supported. Using default: {hds_thresh}')
|
||||
return hds_thresh
|
||||
@@ -562,7 +563,7 @@ def _test_xdp_native_head_adjst(cfg, prog, pkt_sz_lst, offset_lst):
|
||||
|
||||
Args:
|
||||
cfg: Configuration object containing network settings.
|
||||
netnl: Network namespace or link object (not used in this function).
|
||||
ethnl: Network namespace or link object (not used in this function).
|
||||
|
||||
This function sets up the packet size and offset lists, then performs
|
||||
the head adjustment test by sending and receiving UDP packets.
|
||||
@@ -671,6 +672,88 @@ def test_xdp_native_adjst_head_shrnk_data(cfg):
|
||||
_validate_res(res, offset_lst, pkt_sz_lst)
|
||||
|
||||
|
||||
def _test_xdp_native_ifc_stats(cfg, act):
|
||||
cfg.require_cmd("socat")
|
||||
|
||||
bpf_info = BPFProgInfo("xdp_prog", "xdp_native.bpf.o", "xdp", 1500)
|
||||
prog_info = _load_xdp_prog(cfg, bpf_info)
|
||||
port = rand_port()
|
||||
|
||||
_set_xdp_map("map_xdp_setup", TestConfig.MODE.value, act.value)
|
||||
_set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port)
|
||||
|
||||
# Discard the input, but we need a listener to avoid ICMP errors
|
||||
rx_udp = f"socat -{cfg.addr_ipver} -T 2 -u UDP-RECV:{port},reuseport " + \
|
||||
"/dev/null"
|
||||
# Listener runs on "remote" in case of XDP_TX
|
||||
rx_host = cfg.remote if act == XDPAction.TX else None
|
||||
# We want to spew 2000 packets quickly, bash seems to do a good enough job
|
||||
tx_udp = f"exec 5<>/dev/udp/{cfg.addr}/{port}; " \
|
||||
"for i in `seq 2000`; do echo a >&5; done; exec 5>&-"
|
||||
|
||||
cfg.wait_hw_stats_settle()
|
||||
# Qstats have more clearly defined semantics than rtnetlink.
|
||||
# XDP is the "first layer of the stack" so XDP packets should be counted
|
||||
# as received and sent as if the decision was made in the routing layer.
|
||||
before = cfg.netnl.qstats_get({"ifindex": cfg.ifindex}, dump=True)[0]
|
||||
|
||||
with bkg(rx_udp, host=rx_host, exit_wait=True):
|
||||
wait_port_listen(port, proto="udp", host=rx_host)
|
||||
cmd(tx_udp, host=cfg.remote, shell=True)
|
||||
|
||||
cfg.wait_hw_stats_settle()
|
||||
after = cfg.netnl.qstats_get({"ifindex": cfg.ifindex}, dump=True)[0]
|
||||
|
||||
ksft_ge(after['rx-packets'] - before['rx-packets'], 2000)
|
||||
if act == XDPAction.TX:
|
||||
ksft_ge(after['tx-packets'] - before['tx-packets'], 2000)
|
||||
|
||||
expected_pkts = 2000
|
||||
stats = _get_stats(prog_info["maps"]["map_xdp_stats"])
|
||||
ksft_eq(stats[XDPStats.RX.value], expected_pkts, "XDP RX stats mismatch")
|
||||
if act == XDPAction.TX:
|
||||
ksft_eq(stats[XDPStats.TX.value], expected_pkts, "XDP TX stats mismatch")
|
||||
|
||||
# Flip the ring count back and forth to make sure the stats from XDP rings
|
||||
# don't get lost.
|
||||
chans = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})
|
||||
if chans.get('combined-count', 0) > 1:
|
||||
cfg.ethnl.channels_set({'header': {'dev-index': cfg.ifindex},
|
||||
'combined-count': 1})
|
||||
cfg.ethnl.channels_set({'header': {'dev-index': cfg.ifindex},
|
||||
'combined-count': chans['combined-count']})
|
||||
before = after
|
||||
after = cfg.netnl.qstats_get({"ifindex": cfg.ifindex}, dump=True)[0]
|
||||
|
||||
ksft_ge(after['rx-packets'], before['rx-packets'])
|
||||
if act == XDPAction.TX:
|
||||
ksft_ge(after['tx-packets'], before['tx-packets'])
|
||||
|
||||
|
||||
def test_xdp_native_qstats_pass(cfg):
|
||||
"""
|
||||
Send 2000 messages, expect XDP_PASS, make sure the packets were counted
|
||||
to interface level qstats (Rx).
|
||||
"""
|
||||
_test_xdp_native_ifc_stats(cfg, XDPAction.PASS)
|
||||
|
||||
|
||||
def test_xdp_native_qstats_drop(cfg):
|
||||
"""
|
||||
Send 2000 messages, expect XDP_DROP, make sure the packets were counted
|
||||
to interface level qstats (Rx).
|
||||
"""
|
||||
_test_xdp_native_ifc_stats(cfg, XDPAction.DROP)
|
||||
|
||||
|
||||
def test_xdp_native_qstats_tx(cfg):
|
||||
"""
|
||||
Send 2000 messages, expect XDP_TX, make sure the packets were counted
|
||||
to interface level qstats (Rx and Tx)
|
||||
"""
|
||||
_test_xdp_native_ifc_stats(cfg, XDPAction.TX)
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main function to execute the XDP tests.
|
||||
@@ -681,7 +764,8 @@ def main():
|
||||
function to execute the tests.
|
||||
"""
|
||||
with NetDrvEpEnv(__file__) as cfg:
|
||||
cfg.netnl = EthtoolFamily()
|
||||
cfg.ethnl = EthtoolFamily()
|
||||
cfg.netnl = NetdevFamily()
|
||||
ksft_run(
|
||||
[
|
||||
test_xdp_native_pass_sb,
|
||||
@@ -694,6 +778,9 @@ def main():
|
||||
test_xdp_native_adjst_tail_shrnk_data,
|
||||
test_xdp_native_adjst_head_grow_data,
|
||||
test_xdp_native_adjst_head_shrnk_data,
|
||||
test_xdp_native_qstats_pass,
|
||||
test_xdp_native_qstats_drop,
|
||||
test_xdp_native_qstats_tx,
|
||||
],
|
||||
args=(cfg,))
|
||||
ksft_exit()
|
||||
|
||||
@@ -1,128 +1,201 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Makefile for net selftests
|
||||
|
||||
CFLAGS += -Wall -Wl,--no-as-needed -O2 -g
|
||||
CFLAGS += -Wall -Wl,--no-as-needed -O2 -g
|
||||
CFLAGS += -I../../../../usr/include/ $(KHDR_INCLUDES)
|
||||
# Additional include paths needed by kselftest.h
|
||||
CFLAGS += -I../
|
||||
|
||||
TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh \
|
||||
rtnetlink.sh xfrm_policy.sh
|
||||
TEST_PROGS += fcnal-ipv4.sh fcnal-ipv6.sh fcnal-other.sh
|
||||
TEST_PROGS += fib_tests.sh fib-onlink-tests.sh pmtu.sh udpgso.sh ip_defrag.sh
|
||||
TEST_PROGS += udpgso_bench.sh fib_rule_tests.sh msg_zerocopy.sh psock_snd.sh
|
||||
TEST_PROGS += udpgro_bench.sh udpgro.sh test_vxlan_under_vrf.sh reuseport_addr_any.sh
|
||||
TEST_PROGS += test_vxlan_fdb_changelink.sh so_txtime.sh ipv6_flowlabel.sh
|
||||
TEST_PROGS += tcp_fastopen_backup_key.sh l2tp.sh traceroute.sh
|
||||
TEST_PROGS += fin_ack_lat.sh fib_nexthop_multiprefix.sh fib_nexthops.sh fib_nexthop_nongw.sh
|
||||
TEST_PROGS += altnames.sh icmp.sh icmp_redirect.sh ip6_gre_headroom.sh
|
||||
TEST_PROGS += route_localnet.sh
|
||||
TEST_PROGS += reuseaddr_ports_exhausted.sh
|
||||
TEST_PROGS += txtimestamp.sh
|
||||
TEST_PROGS += vrf-xfrm-tests.sh
|
||||
TEST_PROGS += rxtimestamp.sh
|
||||
TEST_PROGS += drop_monitor_tests.sh
|
||||
TEST_PROGS += vrf_route_leaking.sh
|
||||
TEST_PROGS += bareudp.sh
|
||||
TEST_PROGS += amt.sh
|
||||
TEST_PROGS += unicast_extensions.sh
|
||||
TEST_PROGS += udpgro_fwd.sh
|
||||
TEST_PROGS += udpgro_frglist.sh
|
||||
TEST_PROGS += nat6to4.sh
|
||||
TEST_PROGS += veth.sh
|
||||
TEST_PROGS += ioam6.sh
|
||||
TEST_PROGS += gro.sh
|
||||
TEST_PROGS += gre_gso.sh
|
||||
TEST_PROGS += gre_ipv6_lladdr.sh
|
||||
TEST_PROGS += cmsg_so_mark.sh
|
||||
TEST_PROGS += cmsg_so_priority.sh
|
||||
TEST_PROGS += test_so_rcv.sh
|
||||
TEST_PROGS += cmsg_time.sh cmsg_ip.sh
|
||||
TEST_PROGS += netns-name.sh
|
||||
TEST_PROGS += link_netns.py
|
||||
TEST_PROGS += nl_netdev.py
|
||||
TEST_PROGS += rtnetlink.py
|
||||
TEST_PROGS += rtnetlink_notification.sh
|
||||
TEST_PROGS += srv6_end_dt46_l3vpn_test.sh
|
||||
TEST_PROGS += srv6_end_dt4_l3vpn_test.sh
|
||||
TEST_PROGS += srv6_end_dt6_l3vpn_test.sh
|
||||
TEST_PROGS += srv6_hencap_red_l3vpn_test.sh
|
||||
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
|
||||
TEST_PROGS += arp_ndisc_untracked_subnets.sh
|
||||
TEST_PROGS += stress_reuseport_listen.sh
|
||||
TEST_PROGS += l2_tos_ttl_inherit.sh
|
||||
TEST_PROGS += bind_bhash.sh
|
||||
TEST_PROGS += ip_local_port_range.sh
|
||||
TEST_PROGS += rps_default_mask.sh
|
||||
TEST_PROGS += big_tcp.sh
|
||||
TEST_PROGS += netns-sysctl.sh
|
||||
TEST_PROGS += netdev-l2addr.sh
|
||||
TEST_PROGS_EXTENDED := toeplitz_client.sh toeplitz.sh xfrm_policy_add_speed.sh
|
||||
TEST_GEN_FILES = socket nettest
|
||||
TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
|
||||
TEST_GEN_FILES += tcp_mmap tcp_inq psock_snd txring_overwrite
|
||||
TEST_GEN_FILES += udpgso udpgso_bench_tx udpgso_bench_rx ip_defrag
|
||||
TEST_GEN_FILES += so_txtime ipv6_flowlabel ipv6_flowlabel_mgr so_netns_cookie
|
||||
TEST_GEN_FILES += tcp_fastopen_backup_key
|
||||
TEST_GEN_FILES += fin_ack_lat
|
||||
TEST_GEN_FILES += reuseaddr_ports_exhausted
|
||||
TEST_GEN_FILES += hwtstamp_config rxtimestamp timestamping txtimestamp
|
||||
TEST_GEN_FILES += ipsec
|
||||
TEST_GEN_FILES += ioam6_parser
|
||||
TEST_GEN_FILES += gro
|
||||
TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
|
||||
TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls tun tap epoll_busy_poll
|
||||
TEST_GEN_FILES += toeplitz
|
||||
TEST_GEN_FILES += cmsg_sender
|
||||
TEST_GEN_FILES += stress_reuseport_listen
|
||||
TEST_GEN_FILES += so_rcv_listener
|
||||
TEST_PROGS += test_vxlan_vnifiltering.sh
|
||||
TEST_GEN_FILES += io_uring_zerocopy_tx
|
||||
TEST_PROGS += io_uring_zerocopy_tx.sh
|
||||
TEST_GEN_FILES += bind_bhash
|
||||
TEST_GEN_PROGS += sk_bind_sendto_listen
|
||||
TEST_GEN_PROGS += sk_connect_zero_addr
|
||||
TEST_GEN_PROGS += sk_so_peek_off
|
||||
TEST_PROGS += test_ingress_egress_chaining.sh
|
||||
TEST_GEN_PROGS += so_incoming_cpu
|
||||
TEST_PROGS += sctp_vrf.sh
|
||||
TEST_GEN_FILES += sctp_hello
|
||||
TEST_GEN_FILES += ip_local_port_range
|
||||
TEST_GEN_PROGS += bind_wildcard
|
||||
TEST_GEN_PROGS += bind_timewait
|
||||
TEST_PROGS += test_vxlan_mdb.sh
|
||||
TEST_PROGS += test_bridge_neigh_suppress.sh
|
||||
TEST_PROGS += test_vxlan_nh.sh
|
||||
TEST_PROGS += test_vxlan_nolocalbypass.sh
|
||||
TEST_PROGS += test_bridge_backup_port.sh
|
||||
TEST_PROGS += test_neigh.sh
|
||||
TEST_PROGS += fdb_flush.sh fdb_notify.sh
|
||||
TEST_PROGS += fq_band_pktlimit.sh
|
||||
TEST_PROGS += vlan_hw_filter.sh
|
||||
TEST_PROGS += vlan_bridge_binding.sh
|
||||
TEST_PROGS += bpf_offload.py
|
||||
TEST_PROGS += ipv6_route_update_soft_lockup.sh
|
||||
TEST_PROGS += busy_poll_test.sh
|
||||
TEST_GEN_PROGS += proc_net_pktgen
|
||||
TEST_PROGS += lwt_dst_cache_ref_loop.sh
|
||||
TEST_PROGS += skf_net_off.sh
|
||||
TEST_GEN_FILES += skf_net_off
|
||||
TEST_GEN_FILES += tfo
|
||||
TEST_PROGS += tfo_passive.sh
|
||||
TEST_PROGS += broadcast_ether_dst.sh
|
||||
TEST_PROGS += broadcast_pmtu.sh
|
||||
TEST_PROGS += ipv6_force_forwarding.sh
|
||||
TEST_GEN_PROGS += ipv6_fragmentation
|
||||
TEST_PROGS += route_hint.sh
|
||||
TEST_GEN_PROGS += tcp_port_share
|
||||
TEST_PROGS := \
|
||||
altnames.sh \
|
||||
amt.sh \
|
||||
arp_ndisc_evict_nocarrier.sh \
|
||||
arp_ndisc_untracked_subnets.sh \
|
||||
bareudp.sh \
|
||||
big_tcp.sh \
|
||||
bind_bhash.sh \
|
||||
bpf_offload.py \
|
||||
broadcast_ether_dst.sh \
|
||||
broadcast_pmtu.sh \
|
||||
busy_poll_test.sh \
|
||||
cmsg_ip.sh \
|
||||
cmsg_so_mark.sh \
|
||||
cmsg_so_priority.sh \
|
||||
cmsg_time.sh \
|
||||
drop_monitor_tests.sh \
|
||||
fcnal-ipv4.sh \
|
||||
fcnal-ipv6.sh \
|
||||
fcnal-other.sh \
|
||||
fdb_flush.sh \
|
||||
fdb_notify.sh \
|
||||
fib-onlink-tests.sh \
|
||||
fib_nexthop_multiprefix.sh \
|
||||
fib_nexthop_nongw.sh \
|
||||
fib_nexthops.sh \
|
||||
fib_rule_tests.sh \
|
||||
fib_tests.sh \
|
||||
fin_ack_lat.sh \
|
||||
fq_band_pktlimit.sh \
|
||||
gre_gso.sh \
|
||||
gre_ipv6_lladdr.sh \
|
||||
gro.sh \
|
||||
icmp.sh \
|
||||
icmp_redirect.sh \
|
||||
io_uring_zerocopy_tx.sh \
|
||||
ioam6.sh \
|
||||
ip6_gre_headroom.sh \
|
||||
ip_defrag.sh \
|
||||
ip_local_port_range.sh \
|
||||
ipv6_flowlabel.sh \
|
||||
ipv6_force_forwarding.sh \
|
||||
ipv6_route_update_soft_lockup.sh \
|
||||
l2_tos_ttl_inherit.sh \
|
||||
l2tp.sh \
|
||||
link_netns.py \
|
||||
lwt_dst_cache_ref_loop.sh \
|
||||
msg_zerocopy.sh \
|
||||
nat6to4.sh \
|
||||
ndisc_unsolicited_na_test.sh \
|
||||
netdev-l2addr.sh \
|
||||
netdevice.sh \
|
||||
netns-name.sh \
|
||||
netns-sysctl.sh \
|
||||
nl_netdev.py \
|
||||
pmtu.sh \
|
||||
psock_snd.sh \
|
||||
reuseaddr_ports_exhausted.sh \
|
||||
reuseport_addr_any.sh \
|
||||
route_hint.sh \
|
||||
route_localnet.sh \
|
||||
rps_default_mask.sh \
|
||||
rtnetlink.py \
|
||||
rtnetlink.sh \
|
||||
rtnetlink_notification.sh \
|
||||
run_afpackettests \
|
||||
run_netsocktests \
|
||||
rxtimestamp.sh \
|
||||
sctp_vrf.sh \
|
||||
skf_net_off.sh \
|
||||
so_txtime.sh \
|
||||
srv6_end_dt46_l3vpn_test.sh \
|
||||
srv6_end_dt4_l3vpn_test.sh \
|
||||
srv6_end_dt6_l3vpn_test.sh \
|
||||
srv6_end_dx4_netfilter_test.sh \
|
||||
srv6_end_dx6_netfilter_test.sh \
|
||||
srv6_end_flavors_test.sh \
|
||||
srv6_end_next_csid_l3vpn_test.sh \
|
||||
srv6_end_x_next_csid_l3vpn_test.sh \
|
||||
srv6_hencap_red_l3vpn_test.sh \
|
||||
srv6_hl2encap_red_l2vpn_test.sh \
|
||||
stress_reuseport_listen.sh \
|
||||
tcp_fastopen_backup_key.sh \
|
||||
test_bpf.sh \
|
||||
test_bridge_backup_port.sh \
|
||||
test_bridge_neigh_suppress.sh \
|
||||
test_ingress_egress_chaining.sh \
|
||||
test_neigh.sh \
|
||||
test_so_rcv.sh \
|
||||
test_vxlan_fdb_changelink.sh \
|
||||
test_vxlan_mdb.sh \
|
||||
test_vxlan_nh.sh \
|
||||
test_vxlan_nolocalbypass.sh \
|
||||
test_vxlan_under_vrf.sh \
|
||||
test_vxlan_vnifiltering.sh \
|
||||
tfo_passive.sh \
|
||||
traceroute.sh \
|
||||
txtimestamp.sh \
|
||||
udpgro.sh \
|
||||
udpgro_bench.sh \
|
||||
udpgro_frglist.sh \
|
||||
udpgro_fwd.sh \
|
||||
udpgso.sh \
|
||||
udpgso_bench.sh \
|
||||
unicast_extensions.sh \
|
||||
veth.sh \
|
||||
vlan_bridge_binding.sh \
|
||||
vlan_hw_filter.sh \
|
||||
vrf-xfrm-tests.sh \
|
||||
vrf_route_leaking.sh \
|
||||
vrf_strict_mode_test.sh \
|
||||
xfrm_policy.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_PROGS_EXTENDED := \
|
||||
toeplitz.sh \
|
||||
toeplitz_client.sh \
|
||||
xfrm_policy_add_speed.sh \
|
||||
# end of TEST_PROGS_EXTENDED
|
||||
|
||||
TEST_GEN_FILES := \
|
||||
bind_bhash \
|
||||
cmsg_sender \
|
||||
fin_ack_lat \
|
||||
gro \
|
||||
hwtstamp_config \
|
||||
io_uring_zerocopy_tx \
|
||||
ioam6_parser \
|
||||
ip_defrag \
|
||||
ip_local_port_range \
|
||||
ipsec \
|
||||
ipv6_flowlabel \
|
||||
ipv6_flowlabel_mgr \
|
||||
msg_zerocopy \
|
||||
nettest \
|
||||
psock_fanout \
|
||||
psock_snd \
|
||||
psock_tpacket \
|
||||
reuseaddr_ports_exhausted \
|
||||
reuseport_addr_any \
|
||||
rxtimestamp \
|
||||
sctp_hello \
|
||||
skf_net_off \
|
||||
so_netns_cookie \
|
||||
so_rcv_listener \
|
||||
so_txtime \
|
||||
socket \
|
||||
stress_reuseport_listen \
|
||||
tcp_fastopen_backup_key \
|
||||
tcp_inq \
|
||||
tcp_mmap \
|
||||
tfo \
|
||||
timestamping \
|
||||
toeplitz \
|
||||
txring_overwrite \
|
||||
txtimestamp \
|
||||
udpgso \
|
||||
udpgso_bench_rx \
|
||||
udpgso_bench_tx \
|
||||
# end of TEST_GEN_FILES
|
||||
|
||||
TEST_GEN_PROGS := \
|
||||
bind_timewait \
|
||||
bind_wildcard \
|
||||
epoll_busy_poll \
|
||||
ipv6_fragmentation \
|
||||
proc_net_pktgen \
|
||||
reuseaddr_conflict \
|
||||
reuseport_bpf \
|
||||
reuseport_bpf_cpu \
|
||||
reuseport_bpf_numa \
|
||||
reuseport_dualstack \
|
||||
sk_bind_sendto_listen \
|
||||
sk_connect_zero_addr \
|
||||
sk_so_peek_off \
|
||||
so_incoming_cpu \
|
||||
tap \
|
||||
tcp_port_share \
|
||||
tls \
|
||||
tun \
|
||||
# end of TEST_GEN_PROGS
|
||||
|
||||
TEST_FILES := \
|
||||
fcnal-test.sh \
|
||||
in_netns.sh \
|
||||
lib.sh \
|
||||
settings \
|
||||
setup_loopback.sh \
|
||||
setup_veth.sh \
|
||||
# end of TEST_FILES
|
||||
|
||||
# YNL files, must be before "include ..lib.mk"
|
||||
YNL_GEN_FILES := busy_poller
|
||||
@@ -130,10 +203,6 @@ YNL_GEN_PROGS := netlink-dumps
|
||||
TEST_GEN_FILES += $(YNL_GEN_FILES)
|
||||
TEST_GEN_PROGS += $(YNL_GEN_PROGS)
|
||||
|
||||
TEST_FILES := settings
|
||||
TEST_FILES += fcnal-test.sh
|
||||
TEST_FILES += in_netns.sh lib.sh setup_loopback.sh setup_veth.sh
|
||||
|
||||
TEST_GEN_FILES += $(patsubst %.c,%.o,$(wildcard *.bpf.c))
|
||||
|
||||
TEST_INCLUDES := forwarding/lib.sh
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
CFLAGS += $(KHDR_INCLUDES) -Wall -Wflex-array-member-not-at-end
|
||||
TEST_GEN_PROGS := diag_uid msg_oob scm_inq scm_pidfd scm_rights unix_connect
|
||||
|
||||
TEST_GEN_PROGS := \
|
||||
diag_uid \
|
||||
msg_oob \
|
||||
scm_inq \
|
||||
scm_pidfd \
|
||||
scm_rights \
|
||||
unix_connect \
|
||||
# end of TEST_GEN_PROGS
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_UNIX_DIAG=m
|
||||
|
||||
@@ -1,130 +1,130 @@
|
||||
CONFIG_USER_NS=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_AMT=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_TEST_BPF=m
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_NET_IPVTI=y
|
||||
CONFIG_IPV6_VTI=y
|
||||
CONFIG_DUMMY=y
|
||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||
CONFIG_CAN=m
|
||||
CONFIG_CAN_DEV=m
|
||||
CONFIG_CAN_VXCAN=m
|
||||
CONFIG_CRYPTO_ARIA=y
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_SM4_GENERIC=y
|
||||
CONFIG_DEBUG_INFO_BTF=y
|
||||
CONFIG_DEBUG_INFO_BTF_MODULES=n
|
||||
CONFIG_VLAN_8021Q=y
|
||||
CONFIG_DUMMY=y
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_IFB=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_ESP=y
|
||||
CONFIG_INET_ESP_OFFLOAD=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_NET_FOU=y
|
||||
CONFIG_NET_FOU_IP_TUNNELS=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NETFILTER_ADVANCED=y
|
||||
CONFIG_NETFILTER_XTABLES_LEGACY=y
|
||||
CONFIG_NF_CONNTRACK=m
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_IPV6_SIT=y
|
||||
CONFIG_NF_NAT=m
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_IP6_NF_IPTABLES=m
|
||||
CONFIG_IP6_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IP6_NF_MANGLE=m
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_IP6_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP6_NF_NAT=m
|
||||
CONFIG_IP6_NF_RAW=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_TTL=m
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_GRE=m
|
||||
CONFIG_IPV6_ILA=m
|
||||
CONFIG_IPV6_IOAM6_LWTUNNEL=y
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_RPL_LWTUNNEL=y
|
||||
CONFIG_IPV6_SEG6_LWTUNNEL=y
|
||||
CONFIG_IPV6_SIT=y
|
||||
CONFIG_IPV6_VTI=y
|
||||
CONFIG_IPVLAN=m
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_L2TP=m
|
||||
CONFIG_L2TP_ETH=m
|
||||
CONFIG_L2TP_IP=m
|
||||
CONFIG_L2TP=m
|
||||
CONFIG_L2TP_V3=y
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_MACVLAN=y
|
||||
CONFIG_MACVTAP=y
|
||||
CONFIG_MPLS=y
|
||||
CONFIG_MPLS_IPTUNNEL=m
|
||||
CONFIG_MPLS_ROUTING=m
|
||||
CONFIG_MPTCP=y
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_IPV6=y
|
||||
CONFIG_NF_TABLES_IPV4=y
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
||||
CONFIG_NETFILTER_XT_TARGET_HL=m
|
||||
CONFIG_NETFILTER_XT_NAT=m
|
||||
CONFIG_NET_ACT_CSUM=m
|
||||
CONFIG_NET_ACT_CT=m
|
||||
CONFIG_NET_ACT_GACT=m
|
||||
CONFIG_NET_ACT_MIRRED=m
|
||||
CONFIG_NET_ACT_PEDIT=m
|
||||
CONFIG_NET_ACT_TUNNEL_KEY=m
|
||||
CONFIG_NET_CLS_BASIC=m
|
||||
CONFIG_NET_CLS_BPF=m
|
||||
CONFIG_NET_CLS_FLOWER=m
|
||||
CONFIG_NET_CLS_MATCHALL=m
|
||||
CONFIG_NET_CLS_U32=m
|
||||
CONFIG_NET_IPGRE_DEMUX=m
|
||||
CONFIG_NETDEVSIM=m
|
||||
CONFIG_NET_DROP_MONITOR=m
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NETFILTER_ADVANCED=y
|
||||
CONFIG_NETFILTER_XTABLES_LEGACY=y
|
||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
||||
CONFIG_NETFILTER_XT_MATCH_POLICY=m
|
||||
CONFIG_NETFILTER_XT_NAT=m
|
||||
CONFIG_NETFILTER_XT_TARGET_HL=m
|
||||
CONFIG_NET_FOU=y
|
||||
CONFIG_NET_FOU_IP_TUNNELS=y
|
||||
CONFIG_NET_IPGRE=m
|
||||
CONFIG_NET_IPGRE_DEMUX=m
|
||||
CONFIG_NET_IPIP=y
|
||||
CONFIG_NET_IPVTI=y
|
||||
CONFIG_NETKIT=y
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_NET_SCH_ETF=m
|
||||
CONFIG_NET_SCH_FQ=m
|
||||
CONFIG_NET_SCH_FQ_CODEL=m
|
||||
CONFIG_NET_SCH_HTB=m
|
||||
CONFIG_NET_SCH_FQ=m
|
||||
CONFIG_NET_SCH_ETF=m
|
||||
CONFIG_NET_SCH_INGRESS=m
|
||||
CONFIG_NET_SCH_NETEM=y
|
||||
CONFIG_NET_SCH_PRIO=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_NF_CONNTRACK=m
|
||||
CONFIG_NF_CONNTRACK_OVS=y
|
||||
CONFIG_NF_FLOW_TABLE=m
|
||||
CONFIG_NF_NAT=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_IPV4=y
|
||||
CONFIG_NF_TABLES_IPV6=y
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_OPENVSWITCH=m
|
||||
CONFIG_OPENVSWITCH_GENEVE=m
|
||||
CONFIG_OPENVSWITCH_GRE=m
|
||||
CONFIG_OPENVSWITCH_VXLAN=m
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_PSAMPLE=m
|
||||
CONFIG_RPS=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TCP_MD5SIG=y
|
||||
CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_TEST_BPF=m
|
||||
CONFIG_TLS=m
|
||||
CONFIG_TRACEPOINTS=y
|
||||
CONFIG_NET_DROP_MONITOR=m
|
||||
CONFIG_NETDEVSIM=m
|
||||
CONFIG_MPLS_ROUTING=m
|
||||
CONFIG_MPLS_IPTUNNEL=m
|
||||
CONFIG_NET_SCH_INGRESS=m
|
||||
CONFIG_NET_CLS_FLOWER=m
|
||||
CONFIG_NET_ACT_TUNNEL_KEY=m
|
||||
CONFIG_NET_ACT_MIRRED=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_IPV6_IOAM6_LWTUNNEL=y
|
||||
CONFIG_CRYPTO_SM4_GENERIC=y
|
||||
CONFIG_AMT=m
|
||||
CONFIG_TUN=y
|
||||
CONFIG_USER_NS=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_VLAN_8021Q=y
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_IP_SCTP=m
|
||||
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
|
||||
CONFIG_IPVLAN=m
|
||||
CONFIG_CAN=m
|
||||
CONFIG_CAN_DEV=m
|
||||
CONFIG_CAN_VXCAN=m
|
||||
CONFIG_NETKIT=y
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_IPV6_ILA=m
|
||||
CONFIG_IPV6_RPL_LWTUNNEL=y
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+ OR MIT
|
||||
|
||||
TEST_PROGS = \
|
||||
TEST_PROGS := \
|
||||
bridge_activity_notify.sh \
|
||||
bridge_fdb_learning_limit.sh \
|
||||
bridge_fdb_local_vlan_0.sh \
|
||||
bridge_igmp.sh \
|
||||
bridge_locked_port.sh \
|
||||
bridge_fdb_local_vlan_0.sh \
|
||||
bridge_mdb.sh \
|
||||
bridge_mdb_host.sh \
|
||||
bridge_mdb_max.sh \
|
||||
@@ -21,64 +21,64 @@ TEST_PROGS = \
|
||||
gre_custom_multipath_hash.sh \
|
||||
gre_inner_v4_multipath.sh \
|
||||
gre_inner_v6_multipath.sh \
|
||||
gre_multipath_nh_res.sh \
|
||||
gre_multipath_nh.sh \
|
||||
gre_multipath.sh \
|
||||
gre_multipath_nh.sh \
|
||||
gre_multipath_nh_res.sh \
|
||||
ip6_forward_instats_vrf.sh \
|
||||
ip6gre_custom_multipath_hash.sh \
|
||||
ip6gre_flat.sh \
|
||||
ip6gre_flat_key.sh \
|
||||
ip6gre_flat_keys.sh \
|
||||
ip6gre_flat.sh \
|
||||
ip6gre_hier.sh \
|
||||
ip6gre_hier_key.sh \
|
||||
ip6gre_hier_keys.sh \
|
||||
ip6gre_hier.sh \
|
||||
ip6gre_inner_v4_multipath.sh \
|
||||
ip6gre_inner_v6_multipath.sh \
|
||||
ipip_flat_gre.sh \
|
||||
ipip_flat_gre_key.sh \
|
||||
ipip_flat_gre_keys.sh \
|
||||
ipip_flat_gre.sh \
|
||||
ipip_hier_gre.sh \
|
||||
ipip_hier_gre_key.sh \
|
||||
ipip_hier_gre_keys.sh \
|
||||
ipip_hier_gre.sh \
|
||||
lib_sh_test.sh \
|
||||
local_termination.sh \
|
||||
min_max_mtu.sh \
|
||||
mirror_gre.sh \
|
||||
mirror_gre_bound.sh \
|
||||
mirror_gre_bridge_1d.sh \
|
||||
mirror_gre_bridge_1d_vlan.sh \
|
||||
mirror_gre_bridge_1q_lag.sh \
|
||||
mirror_gre_bridge_1q.sh \
|
||||
mirror_gre_bridge_1q_lag.sh \
|
||||
mirror_gre_changes.sh \
|
||||
mirror_gre_flower.sh \
|
||||
mirror_gre_lag_lacp.sh \
|
||||
mirror_gre_neigh.sh \
|
||||
mirror_gre_nh.sh \
|
||||
mirror_gre.sh \
|
||||
mirror_gre_vlan_bridge_1q.sh \
|
||||
mirror_gre_vlan.sh \
|
||||
mirror_gre_vlan_bridge_1q.sh \
|
||||
mirror_vlan.sh \
|
||||
no_forwarding.sh \
|
||||
pedit_dsfield.sh \
|
||||
pedit_ip.sh \
|
||||
pedit_l4port.sh \
|
||||
q_in_vni_ipv6.sh \
|
||||
q_in_vni.sh \
|
||||
q_in_vni_ipv6.sh \
|
||||
router.sh \
|
||||
router_bridge.sh \
|
||||
router_bridge_1d.sh \
|
||||
router_bridge_1d_lag.sh \
|
||||
router_bridge_lag.sh \
|
||||
router_bridge_pvid_vlan_upper.sh \
|
||||
router_bridge_vlan.sh \
|
||||
router_bridge_vlan_upper.sh \
|
||||
router_bridge_pvid_vlan_upper.sh \
|
||||
router_bridge_vlan_upper_pvid.sh \
|
||||
router_broadcast.sh \
|
||||
router_mpath_nh_res.sh \
|
||||
router_mpath_nh.sh \
|
||||
router_mpath_nh_res.sh \
|
||||
router_mpath_seed.sh \
|
||||
router_multicast.sh \
|
||||
router_multipath.sh \
|
||||
router_nh.sh \
|
||||
router.sh \
|
||||
router_vid_1.sh \
|
||||
sch_ets.sh \
|
||||
sch_red.sh \
|
||||
@@ -88,32 +88,34 @@ TEST_PROGS = \
|
||||
skbedit_priority.sh \
|
||||
tc_actions.sh \
|
||||
tc_chains.sh \
|
||||
tc_flower_router.sh \
|
||||
tc_flower.sh \
|
||||
tc_flower_l2_miss.sh \
|
||||
tc_flower_cfm.sh \
|
||||
tc_flower_l2_miss.sh \
|
||||
tc_flower_port_range.sh \
|
||||
tc_flower_router.sh \
|
||||
tc_mpls_l2vpn.sh \
|
||||
tc_police.sh \
|
||||
tc_shblocks.sh \
|
||||
tc_tunnel_key.sh \
|
||||
tc_vlan_modify.sh \
|
||||
vxlan_asymmetric_ipv6.sh \
|
||||
vxlan_asymmetric.sh \
|
||||
vxlan_bridge_1d_ipv6.sh \
|
||||
vxlan_bridge_1d_port_8472_ipv6.sh \
|
||||
vxlan_bridge_1d_port_8472.sh \
|
||||
vxlan_asymmetric_ipv6.sh \
|
||||
vxlan_bridge_1d.sh \
|
||||
vxlan_bridge_1d_ipv6.sh \
|
||||
vxlan_bridge_1d_port_8472.sh \
|
||||
vxlan_bridge_1d_port_8472_ipv6.sh \
|
||||
vxlan_bridge_1q.sh \
|
||||
vxlan_bridge_1q_ipv6.sh \
|
||||
vxlan_bridge_1q_mc_ul.sh \
|
||||
vxlan_bridge_1q_port_8472_ipv6.sh \
|
||||
vxlan_bridge_1q_port_8472.sh \
|
||||
vxlan_bridge_1q.sh \
|
||||
vxlan_bridge_1q_port_8472_ipv6.sh \
|
||||
vxlan_reserved.sh \
|
||||
vxlan_symmetric.sh \
|
||||
vxlan_symmetric_ipv6.sh \
|
||||
vxlan_symmetric.sh
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_FILES := devlink_lib.sh \
|
||||
TEST_FILES := \
|
||||
devlink_lib.sh \
|
||||
fib_offload_lib.sh \
|
||||
forwarding.config.sample \
|
||||
ip6gre_lib.sh \
|
||||
@@ -128,10 +130,12 @@ TEST_FILES := devlink_lib.sh \
|
||||
sch_ets_tests.sh \
|
||||
sch_tbf_core.sh \
|
||||
sch_tbf_etsprio.sh \
|
||||
tc_common.sh
|
||||
tc_common.sh \
|
||||
# end of TEST_FILES
|
||||
|
||||
TEST_INCLUDES := \
|
||||
$(wildcard ../lib/sh/*.sh) \
|
||||
../lib.sh \
|
||||
$(wildcard ../lib/sh/*.sh)
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
@@ -1,24 +1,23 @@
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_VLAN_8021Q=m
|
||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||
CONFIG_BRIDGE_IGMP_SNOOPING=y
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_NET_VRF=m
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_BRIDGE_IGMP_SNOOPING=y
|
||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||
CONFIG_CGROUP_BPF=y
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_GRE=m
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_PIMSM_V2=y
|
||||
CONFIG_IP_MROUTE=y
|
||||
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_PIMSM_V1=y
|
||||
CONFIG_IP_PIMSM_V2=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_GRE=m
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_PIMSM_V2=y
|
||||
CONFIG_MACVLAN=m
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_NET_ACT_CT=m
|
||||
CONFIG_NET_ACT_GACT=m
|
||||
CONFIG_NET_ACT_MIRRED=m
|
||||
CONFIG_NET_ACT_MPLS=m
|
||||
CONFIG_NET_ACT_PEDIT=m
|
||||
@@ -27,29 +26,30 @@ CONFIG_NET_ACT_SAMPLE=m
|
||||
CONFIG_NET_ACT_SKBEDIT=m
|
||||
CONFIG_NET_ACT_TUNNEL_KEY=m
|
||||
CONFIG_NET_ACT_VLAN=m
|
||||
CONFIG_NET_CLS_BASIC=m
|
||||
CONFIG_NET_CLS_FLOWER=m
|
||||
CONFIG_NET_CLS_MATCHALL=m
|
||||
CONFIG_NET_CLS_BASIC=m
|
||||
CONFIG_NET_EMATCH=y
|
||||
CONFIG_NET_EMATCH_META=m
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NET_IPGRE=m
|
||||
CONFIG_NET_IPGRE_DEMUX=m
|
||||
CONFIG_NET_IPIP=m
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_NET_SCH_ETS=m
|
||||
CONFIG_NET_SCH_INGRESS=m
|
||||
CONFIG_NET_ACT_GACT=m
|
||||
CONFIG_NET_SCH_PRIO=m
|
||||
CONFIG_NET_SCH_RED=m
|
||||
CONFIG_NET_SCH_TBF=m
|
||||
CONFIG_NET_TC_SKB_EXT=y
|
||||
CONFIG_NET_TEAM=y
|
||||
CONFIG_NET_TEAM_MODE_LOADBALANCE=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NET_VRF=m
|
||||
CONFIG_NF_CONNTRACK=m
|
||||
CONFIG_NF_FLOW_TABLE=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_VETH=m
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_VLAN_8021Q=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_XFRM_USER=m
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
top_srcdir = ../../../../..
|
||||
|
||||
TEST_PROGS := hsr_ping.sh hsr_redbox.sh
|
||||
TEST_PROGS := \
|
||||
hsr_ping.sh \
|
||||
hsr_redbox.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_FILES += hsr_common.sh
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_HSR=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_NET_SCH_NETEM=m
|
||||
CONFIG_HSR=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_VLAN_8021Q=m
|
||||
|
||||
@@ -5,12 +5,16 @@ CFLAGS += -I../../../../../usr/include/ $(KHDR_INCLUDES)
|
||||
# Additional include paths needed by kselftest.h
|
||||
CFLAGS += -I../../
|
||||
|
||||
TEST_FILES := ../../../../../Documentation/netlink/specs
|
||||
TEST_FILES += ../../../../net/ynl
|
||||
TEST_FILES := \
|
||||
../../../../net/ynl \
|
||||
../../../../../Documentation/netlink/specs \
|
||||
# end of TEST_FILES
|
||||
|
||||
TEST_GEN_FILES += csum
|
||||
TEST_GEN_FILES += $(patsubst %.c,%.o,$(wildcard *.bpf.c))
|
||||
TEST_GEN_FILES += xdp_helper
|
||||
TEST_GEN_FILES := \
|
||||
$(patsubst %.c,%.o,$(wildcard *.bpf.c)) \
|
||||
csum \
|
||||
xdp_helper \
|
||||
# end of TEST_GEN_FILES
|
||||
|
||||
TEST_INCLUDES := $(wildcard py/*.py sh/*.sh)
|
||||
|
||||
|
||||
@@ -4,13 +4,31 @@ top_srcdir = ../../../../..
|
||||
|
||||
CFLAGS += -Wall -Wl,--no-as-needed -O2 -g -I$(top_srcdir)/usr/include $(KHDR_INCLUDES)
|
||||
|
||||
TEST_PROGS := mptcp_connect.sh mptcp_connect_mmap.sh mptcp_connect_sendfile.sh \
|
||||
mptcp_connect_checksum.sh pm_netlink.sh mptcp_join.sh diag.sh \
|
||||
simult_flows.sh mptcp_sockopt.sh userspace_pm.sh
|
||||
TEST_PROGS := \
|
||||
diag.sh \
|
||||
mptcp_connect.sh \
|
||||
mptcp_connect_checksum.sh \
|
||||
mptcp_connect_mmap.sh \
|
||||
mptcp_connect_sendfile.sh \
|
||||
mptcp_join.sh \
|
||||
mptcp_sockopt.sh \
|
||||
pm_netlink.sh \
|
||||
simult_flows.sh \
|
||||
userspace_pm.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_GEN_FILES = mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq mptcp_diag
|
||||
TEST_GEN_FILES := \
|
||||
mptcp_connect \
|
||||
mptcp_diag \
|
||||
mptcp_inq \
|
||||
mptcp_sockopt \
|
||||
pm_nl_ctl \
|
||||
# end of TEST_GEN_FILES
|
||||
|
||||
TEST_FILES := mptcp_lib.sh settings
|
||||
TEST_FILES := \
|
||||
mptcp_lib.sh \
|
||||
settings \
|
||||
# end of TEST_FILES
|
||||
|
||||
TEST_INCLUDES := ../lib.sh $(wildcard ../lib/sh/*.sh)
|
||||
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_MPTCP=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_MPTCP_IPV6=y
|
||||
CONFIG_INET_DIAG=m
|
||||
CONFIG_INET_MPTCP_DIAG=m
|
||||
CONFIG_VETH=y
|
||||
CONFIG_NET_SCH_NETEM=m
|
||||
CONFIG_SYN_COOKIES=y
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_MPTCP=y
|
||||
CONFIG_MPTCP_IPV6=y
|
||||
CONFIG_NET_ACT_CSUM=m
|
||||
CONFIG_NET_ACT_PEDIT=m
|
||||
CONFIG_NET_CLS_ACT=y
|
||||
CONFIG_NET_CLS_FW=m
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NETFILTER_ADVANCED=y
|
||||
CONFIG_NETFILTER_NETLINK=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NETFILTER_XTABLES=m
|
||||
CONFIG_NETFILTER_XTABLES_LEGACY=y
|
||||
CONFIG_NETFILTER_XT_MATCH_BPF=m
|
||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
||||
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
|
||||
CONFIG_NETFILTER_XT_TARGET_MARK=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NFT_TPROXY=m
|
||||
CONFIG_NFT_SOCKET=m
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_NET_ACT_CSUM=m
|
||||
CONFIG_NET_ACT_PEDIT=m
|
||||
CONFIG_NET_CLS_ACT=y
|
||||
CONFIG_NET_CLS_FW=m
|
||||
CONFIG_NET_SCH_INGRESS=m
|
||||
CONFIG_NET_SCH_NETEM=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_SOCKET=m
|
||||
CONFIG_NFT_TPROXY=m
|
||||
CONFIG_SYN_COOKIES=y
|
||||
CONFIG_VETH=y
|
||||
|
||||
@@ -6,46 +6,52 @@ HOSTPKG_CONFIG := pkg-config
|
||||
MNL_CFLAGS := $(shell $(HOSTPKG_CONFIG) --cflags libmnl 2>/dev/null)
|
||||
MNL_LDLIBS := $(shell $(HOSTPKG_CONFIG) --libs libmnl 2>/dev/null || echo -lmnl)
|
||||
|
||||
TEST_PROGS := br_netfilter.sh bridge_brouter.sh
|
||||
TEST_PROGS += br_netfilter_queue.sh
|
||||
TEST_PROGS += conntrack_dump_flush.sh
|
||||
TEST_PROGS += conntrack_icmp_related.sh
|
||||
TEST_PROGS += conntrack_ipip_mtu.sh
|
||||
TEST_PROGS += conntrack_tcp_unreplied.sh
|
||||
TEST_PROGS += conntrack_resize.sh
|
||||
TEST_PROGS += conntrack_sctp_collision.sh
|
||||
TEST_PROGS += conntrack_vrf.sh
|
||||
TEST_PROGS += conntrack_clash.sh
|
||||
TEST_PROGS += conntrack_reverse_clash.sh
|
||||
TEST_PROGS += ipvs.sh
|
||||
TEST_PROGS += nf_conntrack_packetdrill.sh
|
||||
TEST_PROGS += nf_nat_edemux.sh
|
||||
TEST_PROGS += nft_audit.sh
|
||||
TEST_PROGS += nft_concat_range.sh
|
||||
TEST_PROGS += nft_conntrack_helper.sh
|
||||
TEST_PROGS += nft_fib.sh
|
||||
TEST_PROGS += nft_flowtable.sh
|
||||
TEST_PROGS += nft_interface_stress.sh
|
||||
TEST_PROGS += nft_meta.sh
|
||||
TEST_PROGS += nft_nat.sh
|
||||
TEST_PROGS += nft_nat_zones.sh
|
||||
TEST_PROGS += nft_queue.sh
|
||||
TEST_PROGS += nft_synproxy.sh
|
||||
TEST_PROGS += nft_tproxy_tcp.sh
|
||||
TEST_PROGS += nft_tproxy_udp.sh
|
||||
TEST_PROGS += nft_zones_many.sh
|
||||
TEST_PROGS += rpath.sh
|
||||
TEST_PROGS += vxlan_mtu_frag.sh
|
||||
TEST_PROGS += xt_string.sh
|
||||
TEST_PROGS := \
|
||||
br_netfilter.sh \
|
||||
br_netfilter_queue.sh \
|
||||
bridge_brouter.sh \
|
||||
conntrack_clash.sh \
|
||||
conntrack_dump_flush.sh \
|
||||
conntrack_icmp_related.sh \
|
||||
conntrack_ipip_mtu.sh \
|
||||
conntrack_resize.sh \
|
||||
conntrack_reverse_clash.sh \
|
||||
conntrack_sctp_collision.sh \
|
||||
conntrack_tcp_unreplied.sh \
|
||||
conntrack_vrf.sh \
|
||||
ipvs.sh \
|
||||
nf_conntrack_packetdrill.sh \
|
||||
nf_nat_edemux.sh \
|
||||
nft_audit.sh \
|
||||
nft_concat_range.sh \
|
||||
nft_conntrack_helper.sh \
|
||||
nft_fib.sh \
|
||||
nft_flowtable.sh \
|
||||
nft_interface_stress.sh \
|
||||
nft_meta.sh \
|
||||
nft_nat.sh \
|
||||
nft_nat_zones.sh \
|
||||
nft_queue.sh \
|
||||
nft_synproxy.sh \
|
||||
nft_tproxy_tcp.sh \
|
||||
nft_tproxy_udp.sh \
|
||||
nft_zones_many.sh \
|
||||
rpath.sh \
|
||||
vxlan_mtu_frag.sh \
|
||||
xt_string.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_PROGS_EXTENDED = nft_concat_range_perf.sh
|
||||
|
||||
TEST_GEN_FILES = audit_logread
|
||||
TEST_GEN_FILES += connect_close nf_queue
|
||||
TEST_GEN_FILES += conntrack_dump_flush
|
||||
TEST_GEN_FILES += conntrack_reverse_clash
|
||||
TEST_GEN_FILES += sctp_collision
|
||||
TEST_GEN_FILES += udpclash
|
||||
TEST_GEN_FILES = \
|
||||
audit_logread \
|
||||
connect_close \
|
||||
conntrack_dump_flush \
|
||||
conntrack_reverse_clash \
|
||||
nf_queue \
|
||||
sctp_collision \
|
||||
udpclash \
|
||||
# end of TEST_GEN_FILES
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
@@ -56,9 +62,12 @@ $(OUTPUT)/conntrack_dump_flush: CFLAGS += $(MNL_CFLAGS)
|
||||
$(OUTPUT)/conntrack_dump_flush: LDLIBS += $(MNL_LDLIBS)
|
||||
$(OUTPUT)/udpclash: LDLIBS += -lpthread
|
||||
|
||||
TEST_FILES := lib.sh
|
||||
TEST_FILES += packetdrill
|
||||
TEST_FILES := \
|
||||
lib.sh \
|
||||
packetdrill \
|
||||
# end of TEST_FILES
|
||||
|
||||
TEST_INCLUDES := \
|
||||
$(wildcard ../lib/sh/*.sh) \
|
||||
../lib.sh \
|
||||
$(wildcard ../lib/sh/*.sh)
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
@@ -1,77 +1,80 @@
|
||||
CONFIG_AUDIT=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_NETFILTER_XTABLES_LEGACY=y
|
||||
CONFIG_BRIDGE_NF_EBTABLES_LEGACY=m
|
||||
CONFIG_BRIDGE_EBT_BROUTE=m
|
||||
CONFIG_BRIDGE_EBT_IP=m
|
||||
CONFIG_BRIDGE_EBT_REDIRECT=m
|
||||
CONFIG_BRIDGE_EBT_T_FILTER=m
|
||||
CONFIG_BRIDGE_NETFILTER=m
|
||||
CONFIG_BRIDGE_NF_EBTABLES=m
|
||||
CONFIG_BRIDGE_NF_EBTABLES_LEGACY=m
|
||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||
CONFIG_CGROUP_BPF=y
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_CRYPTO_SHA1=m
|
||||
CONFIG_IP_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP6_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_INET_DIAG=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_SCTP_DIAG=m
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_IP6_NF_IPTABLES=m
|
||||
CONFIG_IP6_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP6_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP6_NF_RAW=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IP_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_VS=m
|
||||
CONFIG_IP_VS_PROTO_TCP=y
|
||||
CONFIG_IP_VS_RR=m
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_MACVLAN=m
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_NET_CLS_U32=m
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_NET_SCH_NETEM=m
|
||||
CONFIG_NET_SCH_HTB=m
|
||||
CONFIG_NET_IPIP=m
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NETFILTER_ADVANCED=y
|
||||
CONFIG_NETFILTER_NETLINK=m
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE=m
|
||||
CONFIG_NETFILTER_SYNPROXY=m
|
||||
CONFIG_NETFILTER_XTABLES=m
|
||||
CONFIG_NETFILTER_XT_NAT=m
|
||||
CONFIG_NETFILTER_XTABLES_LEGACY=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
|
||||
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
||||
CONFIG_NETFILTER_XT_MATCH_STRING=m
|
||||
CONFIG_NETFILTER_XT_NAT=m
|
||||
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
|
||||
CONFIG_NET_IPIP=m
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_NET_SCH_HTB=m
|
||||
CONFIG_NET_SCH_NETEM=m
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_NF_CONNTRACK=m
|
||||
CONFIG_NF_CONNTRACK_PROCFS=y
|
||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||
CONFIG_NF_CONNTRACK_FTP=m
|
||||
CONFIG_NF_CONNTRACK_MARK=y
|
||||
CONFIG_NF_CONNTRACK_PROCFS=y
|
||||
CONFIG_NF_CONNTRACK_ZONES=y
|
||||
CONFIG_NF_CT_NETLINK=m
|
||||
CONFIG_NF_CT_PROTO_SCTP=y
|
||||
CONFIG_NF_FLOW_TABLE=m
|
||||
CONFIG_NF_FLOW_TABLE_INET=m
|
||||
CONFIG_NF_LOG_IPV4=m
|
||||
CONFIG_NF_LOG_IPV6=m
|
||||
CONFIG_NF_NAT=m
|
||||
CONFIG_NF_NAT_REDIRECT=y
|
||||
CONFIG_NF_NAT_MASQUERADE=y
|
||||
CONFIG_NF_NAT_REDIRECT=y
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_BRIDGE=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_IPV4=y
|
||||
CONFIG_NF_TABLES_IPV6=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NF_FLOW_TABLE_INET=m
|
||||
CONFIG_NFT_BRIDGE_META=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_CT=m
|
||||
@@ -90,12 +93,9 @@ CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_SYNPROXY=m
|
||||
CONFIG_NFT_TPROXY=m
|
||||
CONFIG_TUN=m
|
||||
CONFIG_VETH=m
|
||||
CONFIG_VLAN_8021Q=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_XFRM_USER=m
|
||||
CONFIG_XFRM_STATISTICS=y
|
||||
CONFIG_NET_PKTGEN=m
|
||||
CONFIG_TUN=m
|
||||
CONFIG_INET_DIAG=m
|
||||
CONFIG_INET_SCTP_DIAG=m
|
||||
CONFIG_XFRM_USER=m
|
||||
|
||||
@@ -17,9 +17,31 @@ cleanup()
|
||||
|
||||
checktool "socat -h" "run test without socat"
|
||||
checktool "iptables --version" "run test without iptables"
|
||||
checktool "conntrack --version" "run test without conntrack"
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
connect_done()
|
||||
{
|
||||
local ns="$1"
|
||||
local port="$2"
|
||||
|
||||
ip netns exec "$ns" ss -nt -o state established "dport = :$port" | grep -q "$port"
|
||||
}
|
||||
|
||||
check_ctstate()
|
||||
{
|
||||
local ns="$1"
|
||||
local dp="$2"
|
||||
|
||||
if ! ip netns exec "$ns" conntrack --get -s 192.168.1.2 -d 192.168.1.1 -p tcp \
|
||||
--sport 10000 --dport "$dp" --state ESTABLISHED > /dev/null 2>&1;then
|
||||
echo "FAIL: Did not find expected state for dport $2"
|
||||
ip netns exec "$ns" bash -c 'conntrack -L; conntrack -S; ss -nt'
|
||||
ret=1
|
||||
fi
|
||||
}
|
||||
|
||||
setup_ns ns1 ns2
|
||||
|
||||
# Connect the namespaces using a veth pair
|
||||
@@ -44,15 +66,18 @@ socatpid=$!
|
||||
ip netns exec "$ns2" sysctl -q net.ipv4.ip_local_port_range="10000 10000"
|
||||
|
||||
# add a virtual IP using DNAT
|
||||
ip netns exec "$ns2" iptables -t nat -A OUTPUT -d 10.96.0.1/32 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.1:5201
|
||||
ip netns exec "$ns2" iptables -t nat -A OUTPUT -d 10.96.0.1/32 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.1:5201 || exit 1
|
||||
|
||||
# ... and route it to the other namespace
|
||||
ip netns exec "$ns2" ip route add 10.96.0.1 via 192.168.1.1
|
||||
|
||||
# add a persistent connection from the other namespace
|
||||
ip netns exec "$ns2" socat -t 10 - TCP:192.168.1.1:5201 > /dev/null &
|
||||
# listener should be up by now, wait if it isn't yet.
|
||||
wait_local_port_listen "$ns1" 5201 tcp
|
||||
|
||||
sleep 1
|
||||
# add a persistent connection from the other namespace
|
||||
sleep 10 | ip netns exec "$ns2" socat -t 10 - TCP:192.168.1.1:5201 > /dev/null &
|
||||
cpid0=$!
|
||||
busywait "$BUSYWAIT_TIMEOUT" connect_done "$ns2" "5201"
|
||||
|
||||
# ip daddr:dport will be rewritten to 192.168.1.1 5201
|
||||
# NAT must reallocate source port 10000 because
|
||||
@@ -71,26 +96,25 @@ fi
|
||||
ip netns exec "$ns1" iptables -t nat -A PREROUTING -p tcp --dport 5202 -j REDIRECT --to-ports 5201
|
||||
ip netns exec "$ns1" iptables -t nat -A PREROUTING -p tcp --dport 5203 -j REDIRECT --to-ports 5201
|
||||
|
||||
sleep 5 | ip netns exec "$ns2" socat -t 5 -u STDIN TCP:192.168.1.1:5202,connect-timeout=5 >/dev/null &
|
||||
sleep 5 | ip netns exec "$ns2" socat -T 5 -u STDIN TCP:192.168.1.1:5202,connect-timeout=5 >/dev/null &
|
||||
cpid1=$!
|
||||
|
||||
# if connect succeeds, client closes instantly due to EOF on stdin.
|
||||
# if connect hangs, it will time out after 5s.
|
||||
echo | ip netns exec "$ns2" socat -t 3 -u STDIN TCP:192.168.1.1:5203,connect-timeout=5 >/dev/null &
|
||||
sleep 5 | ip netns exec "$ns2" socat -T 5 -u STDIN TCP:192.168.1.1:5203,connect-timeout=5 >/dev/null &
|
||||
cpid2=$!
|
||||
|
||||
time_then=$(date +%s)
|
||||
wait $cpid2
|
||||
rv=$?
|
||||
time_now=$(date +%s)
|
||||
busywait "$BUSYWAIT_TIMEOUT" connect_done "$ns2" 5202
|
||||
busywait "$BUSYWAIT_TIMEOUT" connect_done "$ns2" 5203
|
||||
|
||||
# Check how much time has elapsed, expectation is for
|
||||
# 'cpid2' to connect and then exit (and no connect delay).
|
||||
delta=$((time_now - time_then))
|
||||
check_ctstate "$ns1" 5202
|
||||
check_ctstate "$ns1" 5203
|
||||
|
||||
if [ $delta -lt 2 ] && [ $rv -eq 0 ]; then
|
||||
kill $socatpid $cpid0 $cpid1 $cpid2
|
||||
socatpid=0
|
||||
|
||||
if [ $ret -eq 0 ]; then
|
||||
echo "PASS: could connect to service via redirected ports"
|
||||
else
|
||||
echo "FAIL: socat cannot connect to service via redirect ($delta seconds elapsed, returned $rv)"
|
||||
echo "FAIL: socat cannot connect to service via redirect"
|
||||
ret=1
|
||||
fi
|
||||
|
||||
|
||||
@@ -256,12 +256,12 @@ test_ping_unreachable() {
|
||||
local daddr4=$1
|
||||
local daddr6=$2
|
||||
|
||||
if ip netns exec "$ns1" ping -c 1 -w 1 -q "$daddr4" > /dev/null; then
|
||||
if ip netns exec "$ns1" ping -c 1 -W 0.1 -q "$daddr4" > /dev/null; then
|
||||
echo "FAIL: ${ns1} could reach $daddr4" 1>&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ip netns exec "$ns1" ping -c 1 -w 1 -q "$daddr6" > /dev/null; then
|
||||
if ip netns exec "$ns1" ping -c 1 -W 0.1 -q "$daddr6" > /dev/null; then
|
||||
echo "FAIL: ${ns1} could reach $daddr6" 1>&2
|
||||
return 1
|
||||
fi
|
||||
@@ -437,14 +437,17 @@ check_type()
|
||||
local addr="$3"
|
||||
local type="$4"
|
||||
local count="$5"
|
||||
local lret=0
|
||||
|
||||
[ -z "$count" ] && count=1
|
||||
|
||||
if ! ip netns exec "$nsrouter" nft get element inet t "$setname" { "$iifname" . "$addr" . "$type" } |grep -q "counter packets $count";then
|
||||
echo "FAIL: did not find $iifname . $addr . $type in $setname"
|
||||
echo "FAIL: did not find $iifname . $addr . $type in $setname with $count packets"
|
||||
ip netns exec "$nsrouter" nft list set inet t "$setname"
|
||||
ret=1
|
||||
return 1
|
||||
# do not fail right away, delete entry if it exists so later test that
|
||||
# checks for unwanted keys don't get confused by this *expected* key.
|
||||
lret=1
|
||||
fi
|
||||
|
||||
# delete the entry, this allows to check if anything unexpected appeared
|
||||
@@ -456,7 +459,7 @@ check_type()
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
return $lret
|
||||
}
|
||||
|
||||
check_local()
|
||||
|
||||
@@ -19,13 +19,15 @@ LDLIBS += $(VAR_LDLIBS)
|
||||
|
||||
TEST_FILES = common.sh
|
||||
|
||||
TEST_PROGS = test.sh \
|
||||
test-large-mtu.sh \
|
||||
TEST_PROGS := \
|
||||
test-chachapoly.sh \
|
||||
test-tcp.sh \
|
||||
test-float.sh \
|
||||
test-close-socket-tcp.sh \
|
||||
test-close-socket.sh \
|
||||
test-close-socket-tcp.sh
|
||||
test-float.sh \
|
||||
test-large-mtu.sh \
|
||||
test-tcp.sh \
|
||||
test.sh \
|
||||
# end of TEST_PROGS
|
||||
|
||||
TEST_GEN_FILES := ovpn-cli
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
CONFIG_NET=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_STREAM_PARSER=y
|
||||
CONFIG_NET_UDP_TUNNEL=y
|
||||
CONFIG_DST_CACHE=y
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_GCM=y
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=y
|
||||
CONFIG_CRYPTO_GCM=y
|
||||
CONFIG_DST_CACHE=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_NET_UDP_TUNNEL=y
|
||||
CONFIG_OVPN=m
|
||||
CONFIG_STREAM_PARSER=y
|
||||
|
||||
@@ -1587,6 +1587,7 @@ static int ovpn_listen_mcast(void)
|
||||
sock = nl_socket_alloc();
|
||||
if (!sock) {
|
||||
fprintf(stderr, "cannot allocate netlink socket\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
@@ -2106,6 +2107,7 @@ static int ovpn_run_cmd(struct ovpn_ctx *ovpn)
|
||||
ret = ovpn_listen_mcast();
|
||||
break;
|
||||
case CMD_INVALID:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
TEST_INCLUDES := ksft_runner.sh \
|
||||
defaults.sh \
|
||||
set_sysctls.py \
|
||||
../../kselftest/ktap_helpers.sh
|
||||
TEST_INCLUDES := \
|
||||
defaults.sh \
|
||||
ksft_runner.sh \
|
||||
set_sysctls.py \
|
||||
../../kselftest/ktap_helpers.sh \
|
||||
# end of TEST_INCLUDES
|
||||
|
||||
TEST_PROGS := $(wildcard *.pkt)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_HZ_1000=y
|
||||
CONFIG_HZ=1000
|
||||
CONFIG_HZ_1000=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_NET_SCH_FIFO=y
|
||||
CONFIG_NET_SCH_FQ=y
|
||||
|
||||
@@ -5,8 +5,14 @@ all:
|
||||
|
||||
TEST_PROGS := run.sh
|
||||
|
||||
TEST_FILES := include.sh test.py
|
||||
TEST_FILES := \
|
||||
include.sh \
|
||||
test.py \
|
||||
# end of TEST_FILES
|
||||
|
||||
EXTRA_CLEAN := /tmp/rds_logs include.sh
|
||||
EXTRA_CLEAN := \
|
||||
include.sh \
|
||||
/tmp/rds_logs \
|
||||
# end of EXTRA_CLEAN
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_RMD160=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_NET_L3_MASTER_DEV=y
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_TCP_AO=y
|
||||
|
||||
Reference in New Issue
Block a user