Hi Aaron > One issue I think will happen with this patch is that the other two > in-flight patches will also collide. I'm thinking it may require > rebasing.
Note, I will not respin the acked patches unless you or a maintainer ask. > A better strategy going forward would be to bundle the new test > additions in one series. Will do for future additions. > Instead of this pattern, we can probably do an ovs_wait on the > Listening string. Good idea. v2 uses ovs_wait with grep -c to count the Ncat listening messages, since all three ncat instances share the same stderr log. I also added a kill -TERM before each respawn to avoid EADDRINUSE -- without it, the second server stays bound because it never receives a connection in the no-flows phase. v2 coming shortly. Minxi Aaron Conole <[email protected]> 于2026年7月6日周一 17:13写道: > Hi Minxi, > > Minxi Hou <[email protected]> writes: > > > Register OVS_KEY_ATTR_SCTP in the flow key parser so that sctp() > > can be used in flow specifications. The ovs_key_sctp class already > > exists (with src/dst fields matching the TCP/UDP siblings) but was > > not wired into the parser, so the token was silently dropped and the > > kernel rejected the flow. > > > > Add test_sctp_connect_v4 exercising the SCTP flow key with > > port-specific matching: sctp(dst=4443) for client-to-server and > > sctp(src=4443) for server-to-client, mirroring the SCTP four-way > > handshake direction. The test verifies connectivity with flows > > installed, confirms failure after flow removal, then reinstalls > > and verifies recovery. > > > > Signed-off-by: Minxi Hou <[email protected]> > > --- > > One issue I think will happen with this patch is that the other two > in-flight patches will also collide. I'm thinking it may require > rebasing. > > A better strategy going forward would be to bundle the new test > additions in one series. That's just for going forward, do not resubmit > the existing patches I've acked unless a maintainer asks for it. > > > .../selftests/net/openvswitch/openvswitch.sh | 92 +++++++++++++++++++ > > .../selftests/net/openvswitch/ovs-dpctl.py | 5 + > > 2 files changed, 97 insertions(+) > > > > diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh > b/tools/testing/selftests/net/openvswitch/openvswitch.sh > > index 2954245129a2..dd4d0b3bcc23 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 > > + sctp_connect_v4 sctp: SCTP flow key > matching > > psample psample: Sampling packets > with psample" > > > > info() { > > @@ -443,6 +444,97 @@ test_action_set() { > > return 0 > > } > > > > +# sctp_connect_v4 test > > +# - sctp(dst=4443) matches client-to-server INIT > > +# - sctp(src=4443) matches server-to-client INIT-ACK > > +# - remove flows and verify connection fails, reinstall and recover > > +test_sctp_connect_v4() { > > + local t="test_sctp_connect_v4" > > + which ncat >/dev/null 2>&1 || return $ksft_skip > > + modprobe -q sctp 2>/dev/null || return $ksft_skip > > + > > + sbx_add "$t" || return $? > > + ovs_add_dp "$t" sctp4 || return 1 > > + > > + info "create namespaces" > > + for ns in client server; do > > + ovs_add_netns_and_veths "$t" "sctp4" "$ns" \ > > + "${ns:0:1}0" "${ns:0:1}1" || return 1 > > + done > > + > > + ip netns exec client ip addr add 172.31.110.10/24 dev c1 > > + ip netns exec client ip link set c1 up > > + ip netns exec server ip addr add 172.31.110.20/24 dev s1 > > + ip netns exec server ip link set s1 up > > + > > + # ARP forwarding > > + ovs_add_flow "$t" sctp4 \ > > + 'in_port(1),eth(),eth_type(0x0806),arp()' \ > > + '2' || return 1 > > + ovs_add_flow "$t" sctp4 \ > > + 'in_port(2),eth(),eth_type(0x0806),arp()' \ > > + '1' || return 1 > > + > > + # SCTP port matching: dst for request, src for reply > > + ovs_add_flow "$t" sctp4 \ > > + > 'in_port(1),eth(),eth_type(0x0800),ipv4(proto=132),sctp(dst=4443)' \ > > + '2' || return 1 > > + ovs_add_flow "$t" sctp4 \ > > + > 'in_port(2),eth(),eth_type(0x0800),ipv4(proto=132),sctp(src=4443)' \ > > + '1' || return 1 > > + > > + echo "server" | \ > > + ovs_netns_spawn_daemon "$t" "server" \ > > + ncat --sctp -l 172.31.110.20 -vn 4443 > > + sleep 0.1 > > Instead of this pattern, we can probably do an ovs_wait on the Listening > string. That way we aren't relying only on the sleep, but on the actual > Ncat output. Something like > > ovs_wait sh -c > "[ \$(grep 'Ncat: Listening on ....' ${ovs_dir}/stderr) ]" || \ > return 1 > > Or you could use a count and do '-ge <number>' > > That way if the ncat spawn takes time to start up, it can be ready in > time. > > > + info "verify SCTP association with port-keyed flows" > > + ovs_sbx "$t" ip netns exec client \ > > + ncat --sctp -i 1 -zv 172.31.110.20 4443 \ > > + || return 1 > > + > > + ovs_del_flows "$t" sctp4 > > + > > + info "verify connection fails without flows" > > + ovs_add_flow "$t" sctp4 \ > > + 'in_port(1),eth(),eth_type(0x0806),arp()' \ > > + '2' || return 1 > > + ovs_add_flow "$t" sctp4 \ > > + 'in_port(2),eth(),eth_type(0x0806),arp()' \ > > + '1' || return 1 > > + > > + echo "server2" | \ > > + ovs_netns_spawn_daemon "$t" "server" \ > > + ncat --sctp -l 172.31.110.20 -vn 4443 > > + sleep 0.1 > > + > > + ovs_sbx "$t" ip netns exec client \ > > + ncat --sctp -w 2 -zv 172.31.110.20 4443 \ > > + >/dev/null 2>&1 \ > > + && { info "FAIL: connection should fail without flows" > > + return 1; } > > + > > + info "reinstall flows and verify recovery" > > + ovs_add_flow "$t" sctp4 \ > > + > 'in_port(1),eth(),eth_type(0x0800),ipv4(proto=132),sctp(dst=4443)' \ > > + '2' || return 1 > > + ovs_add_flow "$t" sctp4 \ > > + > 'in_port(2),eth(),eth_type(0x0800),ipv4(proto=132),sctp(src=4443)' \ > > + '1' || return 1 > > + > > + echo "server3" | \ > > + ovs_netns_spawn_daemon "$t" "server" \ > > + ncat --sctp -l 172.31.110.20 -vn 4443 > > + sleep 0.1 > > + > > + ovs_sbx "$t" ip netns exec client \ > > + ncat --sctp -i 1 -zv 172.31.110.20 4443 \ > > + || return 1 > > + > > + return 0 > > +} > > + > > # psample test > > # - use psample to observe packets > > test_psample() { > > diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py > b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py > > index e1ecfad2c03e..7cfc29ec7e59 100644 > > --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py > > +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py > > @@ -1982,6 +1982,11 @@ class ovskey(nla): > > "icmp", > > ovskey.ovs_key_icmp, > > ), > > + ( > > + "OVS_KEY_ATTR_SCTP", > > + "sctp", > > + ovskey.ovs_key_sctp, > > + ), > > ( > > "OVS_KEY_ATTR_TCP_FLAGS", > > "tcp_flags", > > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
