mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
Notably this includes fixes for a s390 build breakage.
Including fixes from netfilter. Current release - new code bugs: - eth: fbnic: fix s390 build. - eth: airoha: fix NULL pointer dereference in airoha_qdma_cleanup_rx_queue() Previous releases - regressions: - flow_dissector: use DEBUG_NET_WARN_ON_ONCE - ipv4: fix incorrect TOS in route get reply - dsa: fix chip-wide frame size config in some drivers Previous releases - always broken: - netfilter: nf_set_pipapo: fix initial map fill - eth: gve: fix XDP TX completion handling when counters overflow Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmaafj4SHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOkSsIP/jLODokNb/RcIuOYZVlgn2C5icMeZtqv 6BIliZeE1EcnMWqOnheHaJVklq17ChAYbj/GNN8zQeOQhPA2eFCzPPLl/UpF9/ik wuvk+QQ4EM3T/SwWLKmht9UJioVi66szl3vZ+ByJ4BgGiJWORW1dK/AYzyYrsplk BMpQTs/Q/ekzWJzBtX+1Cz8izX1gl+dXhMezSdg9cW4KaBu1Hqwny954HF6keUQn h7bbAWiOAb5bhqUzgCdgF4gXp+uaWEzG1a1kY1G86NjXC5H0G03+vl37RbY/1kYh lUa/3nfH2V7Sy+MYTvjQe66obVeQeOh/PhRMlbkEVphpKs8XtHfsP433iOMZZn2D Z2Yb4yICnpNwbPmK1fyFvOrY7zGp2yZ2dSDEhowGjcyoQPO6RPnBfvArl66phIOm DWfEq79dYa0eEnCM174BLZbsjcHeeYQX2b8lagUslC0Oel+ijUG26XeMqs5W3at9 QVcMV+aPE7pibpAq4M+qqkldv49QmXRsQai0BMa0+qEPyDKLe2nnf6L+TrDfN7Zf tpiiZZZGpcctZ1cOfyuebB37z/jtHJQ94IfLCD9RzpHlpOtCFycO18adrohhI58Q TaZf7U1CqC/UREckwE5F9ypQhdiQHEH84rgvKT3zFFRYftWTQmBCAUs3JzBPbYwO RO2GDFM/htOu =Q1xF -----END PGP SIGNATURE----- Merge tag 'net-6.11-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from netfilter. Notably this includes fixes for a s390 build breakage. Current release - new code bugs: - eth: fbnic: fix s390 build - eth: airoha: fix NULL pointer dereference in airoha_qdma_cleanup_rx_queue() Previous releases - regressions: - flow_dissector: use DEBUG_NET_WARN_ON_ONCE - ipv4: fix incorrect TOS in route get reply - dsa: fix chip-wide frame size config in some drivers Previous releases - always broken: - netfilter: nf_set_pipapo: fix initial map fill - eth: gve: fix XDP TX completion handling when counters overflow" * tag 'net-6.11-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: eth: fbnic: don't build the driver when skb has more than 21 frags net: dsa: b53: Limit chip-wide jumbo frame config to CPU ports net: dsa: mv88e6xxx: Limit chip-wide frame size config to CPU ports net: airoha: Fix NULL pointer dereference in airoha_qdma_cleanup_rx_queue() net: wwan: t7xx: add support for Dell DW5933e ipv4: Fix incorrect TOS in fibmatch route get reply ipv4: Fix incorrect TOS in route get reply net: flow_dissector: use DEBUG_NET_WARN_ON_ONCE driver core: auxiliary bus: Fix documentation of auxiliary_device net: airoha: fix error branch in airoha_dev_xmit and airoha_set_gdm_ports gve: Fix XDP TX completion handling when counters overflow ipvs: properly dereference pe in ip_vs_add_service selftests: netfilter: add test case for recent mismatch bug netfilter: nf_set_pipapo: fix initial map fill netfilter: ctnetlink: use helper function to calculate expect ID eth: fbnic: fix s390 build.
This commit is contained in:
commit
d7e78951a8
@ -2256,6 +2256,9 @@ static int b53_change_mtu(struct dsa_switch *ds, int port, int mtu)
|
||||
if (is5325(dev) || is5365(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!dsa_is_cpu_port(ds, port))
|
||||
return 0;
|
||||
|
||||
enable_jumbo = (mtu >= JMS_MIN_SIZE);
|
||||
allow_10_100 = (dev->chip_id == BCM583XX_DEVICE_ID);
|
||||
|
||||
|
@ -3626,7 +3626,8 @@ static int mv88e6xxx_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
if (chip->info->ops->port_set_jumbo_size)
|
||||
ret = chip->info->ops->port_set_jumbo_size(chip, port, new_mtu);
|
||||
else if (chip->info->ops->set_max_frame_size)
|
||||
else if (chip->info->ops->set_max_frame_size &&
|
||||
dsa_is_cpu_port(ds, port))
|
||||
ret = chip->info->ops->set_max_frame_size(chip, new_mtu);
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
|
||||
|
@ -158,15 +158,16 @@ static int gve_clean_xdp_done(struct gve_priv *priv, struct gve_tx_ring *tx,
|
||||
u32 to_do)
|
||||
{
|
||||
struct gve_tx_buffer_state *info;
|
||||
u32 clean_end = tx->done + to_do;
|
||||
u64 pkts = 0, bytes = 0;
|
||||
size_t space_freed = 0;
|
||||
u32 xsk_complete = 0;
|
||||
u32 idx;
|
||||
int i;
|
||||
|
||||
for (; tx->done < clean_end; tx->done++) {
|
||||
for (i = 0; i < to_do; i++) {
|
||||
idx = tx->done & tx->mask;
|
||||
info = &tx->info[idx];
|
||||
tx->done++;
|
||||
|
||||
if (unlikely(!info->xdp.size))
|
||||
continue;
|
||||
|
@ -977,7 +977,7 @@ static int airoha_set_gdm_ports(struct airoha_eth *eth, bool enable)
|
||||
return 0;
|
||||
|
||||
error:
|
||||
for (i--; i >= 0; i++)
|
||||
for (i--; i >= 0; i--)
|
||||
airoha_set_gdm_port(eth, port_list[i], false);
|
||||
|
||||
return err;
|
||||
@ -1585,7 +1585,6 @@ static int airoha_qdma_init_rx_queue(struct airoha_eth *eth,
|
||||
|
||||
static void airoha_qdma_cleanup_rx_queue(struct airoha_queue *q)
|
||||
{
|
||||
enum dma_data_direction dir = page_pool_get_dma_dir(q->page_pool);
|
||||
struct airoha_eth *eth = q->eth;
|
||||
|
||||
while (q->queued) {
|
||||
@ -1593,7 +1592,7 @@ static void airoha_qdma_cleanup_rx_queue(struct airoha_queue *q)
|
||||
struct page *page = virt_to_head_page(e->buf);
|
||||
|
||||
dma_sync_single_for_cpu(eth->dev, e->dma_addr, e->dma_len,
|
||||
dir);
|
||||
page_pool_get_dma_dir(q->page_pool));
|
||||
page_pool_put_full_page(q->page_pool, page, false);
|
||||
q->tail = (q->tail + 1) % q->ndesc;
|
||||
q->queued--;
|
||||
@ -2431,9 +2430,11 @@ static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb,
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
error_unmap:
|
||||
for (i--; i >= 0; i++)
|
||||
dma_unmap_single(dev->dev.parent, q->entry[i].dma_addr,
|
||||
q->entry[i].dma_len, DMA_TO_DEVICE);
|
||||
for (i--; i >= 0; i--) {
|
||||
index = (q->head + i) % q->ndesc;
|
||||
dma_unmap_single(dev->dev.parent, q->entry[index].dma_addr,
|
||||
q->entry[index].dma_len, DMA_TO_DEVICE);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&q->lock);
|
||||
error:
|
||||
|
@ -20,6 +20,8 @@ if NET_VENDOR_META
|
||||
config FBNIC
|
||||
tristate "Meta Platforms Host Network Interface"
|
||||
depends on X86_64 || COMPILE_TEST
|
||||
depends on S390=n
|
||||
depends on MAX_SKB_FRAGS < 22
|
||||
depends on PCI_MSI
|
||||
select PHYLINK
|
||||
help
|
||||
|
@ -852,6 +852,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(0x14c0, 0x4d75) }, // Dell DW5933e
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, t7xx_pci_table);
|
||||
|
@ -58,9 +58,10 @@
|
||||
* in
|
||||
* @name: Match name found by the auxiliary device driver,
|
||||
* @id: unique identitier if multiple devices of the same name are exported,
|
||||
* @irqs: irqs xarray contains irq indices which are used by the device,
|
||||
* @lock: Synchronize irq sysfs creation,
|
||||
* @irq_dir_exists: whether "irqs" directory exists,
|
||||
* @sysfs: embedded struct which hold all sysfs related fields,
|
||||
* @sysfs.irqs: irqs xarray contains irq indices which are used by the device,
|
||||
* @sysfs.lock: Synchronize irq sysfs creation,
|
||||
* @sysfs.irq_dir_exists: whether "irqs" directory exists,
|
||||
*
|
||||
* An auxiliary_device represents a part of its parent device's functionality.
|
||||
* It is given a name that, combined with the registering drivers
|
||||
|
@ -173,6 +173,7 @@ struct fib_result {
|
||||
unsigned char type;
|
||||
unsigned char scope;
|
||||
u32 tclassid;
|
||||
dscp_t dscp;
|
||||
struct fib_nh_common *nhc;
|
||||
struct fib_info *fi;
|
||||
struct fib_table *table;
|
||||
|
@ -1117,7 +1117,7 @@ bool __skb_flow_dissect(const struct net *net,
|
||||
}
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!net);
|
||||
DEBUG_NET_WARN_ON_ONCE(!net);
|
||||
if (net) {
|
||||
enum netns_bpf_attach_type type = NETNS_BPF_FLOW_DISSECTOR;
|
||||
struct bpf_prog_array *run_array;
|
||||
|
@ -1629,6 +1629,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
||||
res->nhc = nhc;
|
||||
res->type = fa->fa_type;
|
||||
res->scope = fi->fib_scope;
|
||||
res->dscp = fa->fa_dscp;
|
||||
res->fi = fi;
|
||||
res->table = tb;
|
||||
res->fa_head = &n->leaf;
|
||||
|
@ -2867,9 +2867,9 @@ EXPORT_SYMBOL_GPL(ip_route_output_flow);
|
||||
|
||||
/* called with rcu_read_lock held */
|
||||
static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
||||
struct rtable *rt, u32 table_id, struct flowi4 *fl4,
|
||||
struct sk_buff *skb, u32 portid, u32 seq,
|
||||
unsigned int flags)
|
||||
struct rtable *rt, u32 table_id, dscp_t dscp,
|
||||
struct flowi4 *fl4, struct sk_buff *skb, u32 portid,
|
||||
u32 seq, unsigned int flags)
|
||||
{
|
||||
struct rtmsg *r;
|
||||
struct nlmsghdr *nlh;
|
||||
@ -2885,7 +2885,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
||||
r->rtm_family = AF_INET;
|
||||
r->rtm_dst_len = 32;
|
||||
r->rtm_src_len = 0;
|
||||
r->rtm_tos = fl4 ? fl4->flowi4_tos : 0;
|
||||
r->rtm_tos = inet_dscp_to_dsfield(dscp);
|
||||
r->rtm_table = table_id < 256 ? table_id : RT_TABLE_COMPAT;
|
||||
if (nla_put_u32(skb, RTA_TABLE, table_id))
|
||||
goto nla_put_failure;
|
||||
@ -3035,7 +3035,7 @@ static int fnhe_dump_bucket(struct net *net, struct sk_buff *skb,
|
||||
goto next;
|
||||
|
||||
err = rt_fill_info(net, fnhe->fnhe_daddr, 0, rt,
|
||||
table_id, NULL, skb,
|
||||
table_id, 0, NULL, skb,
|
||||
NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq, flags);
|
||||
if (err)
|
||||
@ -3331,7 +3331,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
fri.tb_id = table_id;
|
||||
fri.dst = res.prefix;
|
||||
fri.dst_len = res.prefixlen;
|
||||
fri.dscp = inet_dsfield_to_dscp(fl4.flowi4_tos);
|
||||
fri.dscp = res.dscp;
|
||||
fri.type = rt->rt_type;
|
||||
fri.offload = 0;
|
||||
fri.trap = 0;
|
||||
@ -3358,8 +3358,8 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
err = fib_dump_info(skb, NETLINK_CB(in_skb).portid,
|
||||
nlh->nlmsg_seq, RTM_NEWROUTE, &fri, 0);
|
||||
} else {
|
||||
err = rt_fill_info(net, dst, src, rt, table_id, &fl4, skb,
|
||||
NETLINK_CB(in_skb).portid,
|
||||
err = rt_fill_info(net, dst, src, rt, table_id, res.dscp, &fl4,
|
||||
skb, NETLINK_CB(in_skb).portid,
|
||||
nlh->nlmsg_seq, 0);
|
||||
}
|
||||
if (err < 0)
|
||||
|
@ -1459,18 +1459,18 @@ ip_vs_add_service(struct netns_ipvs *ipvs, struct ip_vs_service_user_kern *u,
|
||||
if (ret < 0)
|
||||
goto out_err;
|
||||
|
||||
/* Bind the ct retriever */
|
||||
RCU_INIT_POINTER(svc->pe, pe);
|
||||
pe = NULL;
|
||||
|
||||
/* Update the virtual service counters */
|
||||
if (svc->port == FTPPORT)
|
||||
atomic_inc(&ipvs->ftpsvc_counter);
|
||||
else if (svc->port == 0)
|
||||
atomic_inc(&ipvs->nullsvc_counter);
|
||||
if (svc->pe && svc->pe->conn_out)
|
||||
if (pe && pe->conn_out)
|
||||
atomic_inc(&ipvs->conn_out_counter);
|
||||
|
||||
/* Bind the ct retriever */
|
||||
RCU_INIT_POINTER(svc->pe, pe);
|
||||
pe = NULL;
|
||||
|
||||
/* Count only IPv4 services for old get/setsockopt interface */
|
||||
if (svc->af == AF_INET)
|
||||
ipvs->num_services++;
|
||||
|
@ -3420,7 +3420,8 @@ static int ctnetlink_del_expect(struct sk_buff *skb,
|
||||
|
||||
if (cda[CTA_EXPECT_ID]) {
|
||||
__be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
|
||||
if (ntohl(id) != (u32)(unsigned long)exp) {
|
||||
|
||||
if (id != nf_expect_get_id(exp)) {
|
||||
nf_ct_expect_put(exp);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
@ -434,7 +434,7 @@ bool nft_pipapo_lookup(const struct net *net, const struct nft_set *set,
|
||||
res_map = scratch->map + (map_index ? m->bsize_max : 0);
|
||||
fill_map = scratch->map + (map_index ? 0 : m->bsize_max);
|
||||
|
||||
memset(res_map, 0xff, m->bsize_max * sizeof(*res_map));
|
||||
pipapo_resmap_init(m, res_map);
|
||||
|
||||
nft_pipapo_for_each_field(f, i, m) {
|
||||
bool last = i == m->field_count - 1;
|
||||
@ -542,7 +542,7 @@ static struct nft_pipapo_elem *pipapo_get(const struct net *net,
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(res_map, 0xff, m->bsize_max * sizeof(*res_map));
|
||||
pipapo_resmap_init(m, res_map);
|
||||
|
||||
nft_pipapo_for_each_field(f, i, m) {
|
||||
bool last = i == m->field_count - 1;
|
||||
|
@ -278,4 +278,25 @@ static u64 pipapo_estimate_size(const struct nft_set_desc *desc)
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* pipapo_resmap_init() - Initialise result map before first use
|
||||
* @m: Matching data, including mapping table
|
||||
* @res_map: Result map
|
||||
*
|
||||
* Initialize all bits covered by the first field to one, so that after
|
||||
* the first step, only the matching bits of the first bit group remain.
|
||||
*
|
||||
* If other fields have a large bitmap, set remainder of res_map to 0.
|
||||
*/
|
||||
static inline void pipapo_resmap_init(const struct nft_pipapo_match *m, unsigned long *res_map)
|
||||
{
|
||||
const struct nft_pipapo_field *f = m->f;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < f->bsize; i++)
|
||||
res_map[i] = ULONG_MAX;
|
||||
|
||||
for (i = f->bsize; i < m->bsize_max; i++)
|
||||
res_map[i] = 0ul;
|
||||
}
|
||||
#endif /* _NFT_SET_PIPAPO_H */
|
||||
|
@ -1036,6 +1036,7 @@ static int nft_pipapo_avx2_lookup_8b_16(unsigned long *map, unsigned long *fill,
|
||||
|
||||
/**
|
||||
* nft_pipapo_avx2_lookup_slow() - Fallback function for uncommon field sizes
|
||||
* @mdata: Matching data, including mapping table
|
||||
* @map: Previous match result, used as initial bitmap
|
||||
* @fill: Destination bitmap to be filled with current match result
|
||||
* @f: Field, containing lookup and mapping tables
|
||||
@ -1051,7 +1052,8 @@ static int nft_pipapo_avx2_lookup_8b_16(unsigned long *map, unsigned long *fill,
|
||||
* Return: -1 on no match, rule index of match if @last, otherwise first long
|
||||
* word index to be checked next (i.e. first filled word).
|
||||
*/
|
||||
static int nft_pipapo_avx2_lookup_slow(unsigned long *map, unsigned long *fill,
|
||||
static int nft_pipapo_avx2_lookup_slow(const struct nft_pipapo_match *mdata,
|
||||
unsigned long *map, unsigned long *fill,
|
||||
const struct nft_pipapo_field *f,
|
||||
int offset, const u8 *pkt,
|
||||
bool first, bool last)
|
||||
@ -1060,7 +1062,7 @@ static int nft_pipapo_avx2_lookup_slow(unsigned long *map, unsigned long *fill,
|
||||
int i, ret = -1, b;
|
||||
|
||||
if (first)
|
||||
memset(map, 0xff, bsize * sizeof(*map));
|
||||
pipapo_resmap_init(mdata, map);
|
||||
|
||||
for (i = offset; i < bsize; i++) {
|
||||
if (f->bb == 8)
|
||||
@ -1186,7 +1188,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
|
||||
} else if (f->groups == 16) {
|
||||
NFT_SET_PIPAPO_AVX2_LOOKUP(8, 16);
|
||||
} else {
|
||||
ret = nft_pipapo_avx2_lookup_slow(res, fill, f,
|
||||
ret = nft_pipapo_avx2_lookup_slow(m, res, fill, f,
|
||||
ret, rp,
|
||||
first, last);
|
||||
}
|
||||
@ -1202,7 +1204,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
|
||||
} else if (f->groups == 32) {
|
||||
NFT_SET_PIPAPO_AVX2_LOOKUP(4, 32);
|
||||
} else {
|
||||
ret = nft_pipapo_avx2_lookup_slow(res, fill, f,
|
||||
ret = nft_pipapo_avx2_lookup_slow(m, res, fill, f,
|
||||
ret, rp,
|
||||
first, last);
|
||||
}
|
||||
|
@ -1737,53 +1737,53 @@ ipv4_rt_dsfield()
|
||||
|
||||
# DSCP 0x10 should match the specific route, no matter the ECN bits
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x10 | \
|
||||
grep -q "via 172.16.103.2"
|
||||
grep -q "172.16.102.0/24 tos 0x10 via 172.16.103.2"
|
||||
log_test $? 0 "IPv4 route with DSCP and ECN:Not-ECT"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x11 | \
|
||||
grep -q "via 172.16.103.2"
|
||||
grep -q "172.16.102.0/24 tos 0x10 via 172.16.103.2"
|
||||
log_test $? 0 "IPv4 route with DSCP and ECN:ECT(1)"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x12 | \
|
||||
grep -q "via 172.16.103.2"
|
||||
grep -q "172.16.102.0/24 tos 0x10 via 172.16.103.2"
|
||||
log_test $? 0 "IPv4 route with DSCP and ECN:ECT(0)"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x13 | \
|
||||
grep -q "via 172.16.103.2"
|
||||
grep -q "172.16.102.0/24 tos 0x10 via 172.16.103.2"
|
||||
log_test $? 0 "IPv4 route with DSCP and ECN:CE"
|
||||
|
||||
# Unknown DSCP should match the generic route, no matter the ECN bits
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x14 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with unknown DSCP and ECN:Not-ECT"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x15 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with unknown DSCP and ECN:ECT(1)"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x16 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with unknown DSCP and ECN:ECT(0)"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x17 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with unknown DSCP and ECN:CE"
|
||||
|
||||
# Null DSCP should match the generic route, no matter the ECN bits
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x00 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with no DSCP and ECN:Not-ECT"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x01 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with no DSCP and ECN:ECT(1)"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x02 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with no DSCP and ECN:ECT(0)"
|
||||
|
||||
$IP route get fibmatch 172.16.102.1 dsfield 0x03 | \
|
||||
grep -q "via 172.16.101.2"
|
||||
grep -q "172.16.102.0/24 via 172.16.101.2"
|
||||
log_test $? 0 "IPv4 route with no DSCP and ECN:CE"
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ TYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto
|
||||
net6_port_net6_port net_port_mac_proto_net"
|
||||
|
||||
# Reported bugs, also described by TYPE_ variables below
|
||||
BUGS="flush_remove_add reload"
|
||||
BUGS="flush_remove_add reload net_port_proto_match"
|
||||
|
||||
# List of possible paths to pktgen script from kernel tree for performance tests
|
||||
PKTGEN_SCRIPT_PATHS="
|
||||
@ -371,6 +371,22 @@ race_repeat 0
|
||||
perf_duration 0
|
||||
"
|
||||
|
||||
TYPE_net_port_proto_match="
|
||||
display net,port,proto
|
||||
type_spec ipv4_addr . inet_service . inet_proto
|
||||
chain_spec ip daddr . udp dport . meta l4proto
|
||||
dst addr4 port proto
|
||||
src
|
||||
start 1
|
||||
count 9
|
||||
src_delta 9
|
||||
tools sendip bash
|
||||
proto udp
|
||||
|
||||
race_repeat 0
|
||||
|
||||
perf_duration 0
|
||||
"
|
||||
# Set template for all tests, types and rules are filled in depending on test
|
||||
set_template='
|
||||
flush ruleset
|
||||
@ -1555,6 +1571,64 @@ test_bug_reload() {
|
||||
nft flush ruleset
|
||||
}
|
||||
|
||||
# - add ranged element, check that packets match it
|
||||
# - delete element again, check it is gone
|
||||
test_bug_net_port_proto_match() {
|
||||
setup veth send_"${proto}" set || return ${ksft_skip}
|
||||
rstart=${start}
|
||||
|
||||
range_size=1
|
||||
for i in $(seq 1 10); do
|
||||
for j in $(seq 1 20) ; do
|
||||
elem=$(printf "10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} "$((i+1))")
|
||||
|
||||
nft "add element inet filter test { $elem }" || return 1
|
||||
nft "get element inet filter test { $elem }" | grep -q "$elem"
|
||||
if [ $? -ne 0 ];then
|
||||
local got=$(nft "get element inet filter test { $elem }")
|
||||
err "post-add: should have returned $elem but got $got"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# recheck after set was filled
|
||||
for i in $(seq 1 10); do
|
||||
for j in $(seq 1 20) ; do
|
||||
elem=$(printf "10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} "$((i+1))")
|
||||
|
||||
nft "get element inet filter test { $elem }" | grep -q "$elem"
|
||||
if [ $? -ne 0 ];then
|
||||
local got=$(nft "get element inet filter test { $elem }")
|
||||
err "post-fill: should have returned $elem but got $got"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# random del and re-fetch
|
||||
for i in $(seq 1 10); do
|
||||
for j in $(seq 1 20) ; do
|
||||
local rnd=$((RANDOM%10))
|
||||
local got=""
|
||||
|
||||
elem=$(printf "10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} "$((i+1))")
|
||||
if [ $rnd -gt 0 ];then
|
||||
continue
|
||||
fi
|
||||
|
||||
nft "delete element inet filter test { $elem }"
|
||||
got=$(nft "get element inet filter test { $elem }" 2>/dev/null)
|
||||
if [ $? -eq 0 ];then
|
||||
err "post-delete: query for $elem returned $got instead of error."
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
nft flush ruleset
|
||||
}
|
||||
|
||||
test_reported_issues() {
|
||||
eval test_bug_"${subtest}"
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user