Add test_trunc exercising the OVS_ACTION_ATTR_TRUNC action. The test
verifies truncation in three steps: first confirm normal forwarding
works, then apply trunc(14) which truncates packets to the Ethernet
header and verify ping fails, then restore normal forwarding and
verify connectivity recovers.

The trunc action sets OVS_CB(skb)->cutlen, causing pskb_trim at
output time. With trunc(14) the IP payload is stripped, so the
receiver drops the frame and ICMP echo reply is never generated.

Signed-off-by: Minxi Hou <[email protected]>
---
 .../selftests/net/openvswitch/openvswitch.sh  | 66 +++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh 
b/tools/testing/selftests/net/openvswitch/openvswitch.sh
index 2954245129a2..fef21eb4a129 100755
--- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
+++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
@@ -32,6 +32,7 @@ tests="
        dec_ttl                                 ttl: dec_ttl decrements IP TTL
        flow_set                                flow-set: Flow modify
        action_set                              set: SET action rewrites fields
+       trunc                                   trunc: output truncation
        psample                                 psample: Sampling packets with 
psample"
 
 info() {
@@ -443,6 +444,71 @@ test_action_set() {
        return 0
 }
 
+test_trunc() {
+       sbx_add "test_trunc" || return $?
+       ovs_add_dp "test_trunc" trunctest || return 1
+
+       info "create namespaces"
+       for ns in client server; do
+               ovs_add_netns_and_veths "test_trunc" "trunctest" "$ns" \
+                       "${ns:0:1}0" "${ns:0:1}1" || return 1
+       done
+
+       ip netns exec client ip addr add 10.0.0.1/24 dev c1
+       ip netns exec client ip link set c1 up
+       ip netns exec server ip addr add 10.0.0.2/24 dev s1
+       ip netns exec server ip link set s1 up
+
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(1),eth(),eth_type(0x0806),arp()' '2' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(2),eth(),eth_type(0x0806),arp()' '1' || return 1
+
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(1),eth(),eth_type(0x0800),ipv4()' '2' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(2),eth(),eth_type(0x0800),ipv4()' '1' || return 1
+
+       info "verify connectivity without truncation"
+       ovs_sbx "test_trunc" ip netns exec client ping -c 1 -W 2 \
+               10.0.0.2 || return 1
+
+       ovs_del_flows "test_trunc" trunctest
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(1),eth(),eth_type(0x0806),arp()' '2' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(2),eth(),eth_type(0x0806),arp()' '1' || return 1
+
+       info "add truncated forwarding flow"
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(1),eth(),eth_type(0x0800),ipv4()' \
+               'trunc(14),2' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(2),eth(),eth_type(0x0800),ipv4()' '1' || return 1
+
+       info "verify ping fails with truncation"
+       ovs_sbx "test_trunc" ip netns exec client ping -c 1 -W 2 \
+               10.0.0.2 >/dev/null 2>&1 \
+               && { info "FAIL: ping should fail with trunc(14)"
+                    return 1; }
+
+       ovs_del_flows "test_trunc" trunctest
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(1),eth(),eth_type(0x0806),arp()' '2' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(2),eth(),eth_type(0x0806),arp()' '1' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(1),eth(),eth_type(0x0800),ipv4()' '2' || return 1
+       ovs_add_flow "test_trunc" trunctest \
+               'in_port(2),eth(),eth_type(0x0800),ipv4()' '1' || return 1
+
+       info "verify connectivity restored without truncation"
+       ovs_sbx "test_trunc" ip netns exec client ping -c 1 -W 2 \
+               10.0.0.2 || return 1
+
+       return 0
+}
+
 # psample test
 # - use psample to observe packets
 test_psample() {

base-commit: cef9d6804030793cf8b8796fd6936197d065dd3e
-- 
2.54.0


Reply via email to