Skip to content

Commit 6109ecb

Browse files
committed
Merge branch 'qdisc-ingress-success'
Paul Blakey says: ==================== net: Fix return value of qdisc ingress handling on success Fix patch + self-test with the currently broken scenario. v4->v3: Removed new line in self test and rebase (Paolo). v2->v3: Added DROP return to TC_ACT_SHOT case (Cong). v1->v2: Changed blamed commit Added self-test ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents e38cf36 + fd602f5 commit 6109ecb

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

net/core/dev.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5136,11 +5136,13 @@ sch_handle_ingress(struct sk_buff *skb, struct packet_type **pt_prev, int *ret,
51365136
case TC_ACT_SHOT:
51375137
mini_qdisc_qstats_cpu_drop(miniq);
51385138
kfree_skb_reason(skb, SKB_DROP_REASON_TC_INGRESS);
5139+
*ret = NET_RX_DROP;
51395140
return NULL;
51405141
case TC_ACT_STOLEN:
51415142
case TC_ACT_QUEUED:
51425143
case TC_ACT_TRAP:
51435144
consume_skb(skb);
5145+
*ret = NET_RX_SUCCESS;
51445146
return NULL;
51455147
case TC_ACT_REDIRECT:
51465148
/* skb_mac_header check was done by cls/act_bpf, so
@@ -5153,8 +5155,10 @@ sch_handle_ingress(struct sk_buff *skb, struct packet_type **pt_prev, int *ret,
51535155
*another = true;
51545156
break;
51555157
}
5158+
*ret = NET_RX_SUCCESS;
51565159
return NULL;
51575160
case TC_ACT_CONSUMED:
5161+
*ret = NET_RX_SUCCESS;
51585162
return NULL;
51595163
default:
51605164
break;

tools/testing/selftests/net/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ TEST_PROGS += io_uring_zerocopy_tx.sh
7070
TEST_GEN_FILES += bind_bhash
7171
TEST_GEN_PROGS += sk_bind_sendto_listen
7272
TEST_GEN_PROGS += sk_connect_zero_addr
73+
TEST_PROGS += test_ingress_egress_chaining.sh
7374

7475
TEST_FILES := settings
7576

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-2.0
3+
4+
# This test runs a simple ingress tc setup between two veth pairs,
5+
# and chains a single egress rule to test ingress chaining to egress.
6+
#
7+
# Kselftest framework requirement - SKIP code is 4.
8+
ksft_skip=4
9+
10+
if [ "$(id -u)" -ne 0 ];then
11+
echo "SKIP: Need root privileges"
12+
exit $ksft_skip
13+
fi
14+
15+
needed_mods="act_mirred cls_flower sch_ingress"
16+
for mod in $needed_mods; do
17+
modinfo $mod &>/dev/null || { echo "SKIP: Need act_mirred module"; exit $ksft_skip; }
18+
done
19+
20+
ns="ns$((RANDOM%899+100))"
21+
veth1="veth1$((RANDOM%899+100))"
22+
veth2="veth2$((RANDOM%899+100))"
23+
peer1="peer1$((RANDOM%899+100))"
24+
peer2="peer2$((RANDOM%899+100))"
25+
ip_peer1=198.51.100.5
26+
ip_peer2=198.51.100.6
27+
28+
function fail() {
29+
echo "FAIL: $@" >> /dev/stderr
30+
exit 1
31+
}
32+
33+
function cleanup() {
34+
killall -q -9 udpgso_bench_rx
35+
ip link del $veth1 &> /dev/null
36+
ip link del $veth2 &> /dev/null
37+
ip netns del $ns &> /dev/null
38+
}
39+
trap cleanup EXIT
40+
41+
function config() {
42+
echo "Setup veth pairs [$veth1, $peer1], and veth pair [$veth2, $peer2]"
43+
ip link add $veth1 type veth peer name $peer1
44+
ip link add $veth2 type veth peer name $peer2
45+
ip addr add $ip_peer1/24 dev $peer1
46+
ip link set $peer1 up
47+
ip netns add $ns
48+
ip link set dev $peer2 netns $ns
49+
ip netns exec $ns ip addr add $ip_peer2/24 dev $peer2
50+
ip netns exec $ns ip link set $peer2 up
51+
ip link set $veth1 up
52+
ip link set $veth2 up
53+
54+
echo "Add tc filter ingress->egress forwarding $veth1 <-> $veth2"
55+
tc qdisc add dev $veth2 ingress
56+
tc qdisc add dev $veth1 ingress
57+
tc filter add dev $veth2 ingress prio 1 proto all flower \
58+
action mirred egress redirect dev $veth1
59+
tc filter add dev $veth1 ingress prio 1 proto all flower \
60+
action mirred egress redirect dev $veth2
61+
62+
echo "Add tc filter egress->ingress forwarding $peer1 -> $veth1, bypassing the veth pipe"
63+
tc qdisc add dev $peer1 clsact
64+
tc filter add dev $peer1 egress prio 20 proto ip flower \
65+
action mirred ingress redirect dev $veth1
66+
}
67+
68+
function test_run() {
69+
echo "Run tcp traffic"
70+
./udpgso_bench_rx -t &
71+
sleep 1
72+
ip netns exec $ns timeout -k 2 10 ./udpgso_bench_tx -t -l 2 -4 -D $ip_peer1 || fail "traffic failed"
73+
echo "Test passed"
74+
}
75+
76+
config
77+
test_run
78+
trap - EXIT
79+
cleanup

0 commit comments

Comments
 (0)