From: Aaron Conole <aconole@redhat.com>
To: Minxi Hou <houminxi@gmail.com>
Cc: netdev@vger.kernel.org, echaudro@redhat.com,
linux-kselftest@vger.kernel.org
Subject: Re: [PATCH v3] selftests/net/openvswitch: add ICMPv6 echo type match test
Date: Wed, 01 Jul 2026 13:40:08 -0400 [thread overview]
Message-ID: <f7techm4nif.fsf@redhat.com> (raw)
In-Reply-To: <20260630102225.29733-1-houminxi@gmail.com> (Minxi Hou's message of "Tue, 30 Jun 2026 18:22:25 +0800")
Minxi Hou <houminxi@gmail.com> writes:
> Register OVS_KEY_ATTR_ICMPV6 in the flow key parser so that
> icmpv6(type=...) can be used in flow specifications. Without this
> registration the parser silently drops the token and the kernel
> rejects the flow with EINVAL because the expected ICMPv6 key
> attribute is missing.
>
> While here, add convert_int() to the ovs_key_ipv6 and ovs_key_icmp
> fields_map entries so that specifying a field value produces the
> correct wildcard mask. The IPv6 flow label uses convert_int(20) to
> produce a 20-bit mask (0x000FFFFF), matching the kernel constraint in
> flow_netlink.c that rejects masks with bits 20-31 set; byte-wide
> fields use convert_int(8). The ipv4 counterpart already does this via
> convert_int(); the ipv6 and icmp classes were simply missing the fifth
> tuple element. Existing callers that pass empty parentheses are
> unaffected because convert_int("") returns (0, 0).
>
> Add test_icmpv6 exercising the ICMPv6 echo flow key. The test uses
> static neighbour entries to bypass NDP, then verifies in three steps:
> install icmpv6(type=128) and icmpv6(type=129) flows and confirm ping
> works, remove the flows and confirm ping fails, reinstall and confirm
> recovery.
>
> Signed-off-by: Minxi Hou <houminxi@gmail.com>
> ---
Same as other, I think this should have had the 'net-next' specifier.
Also, I see that dev@openvswitch.org and Ilya weren't CC'd. Next
version should do that.
> .../selftests/net/openvswitch/openvswitch.sh | 63 +++++++++++++++++++
> .../selftests/net/openvswitch/ovs-dpctl.py | 26 +++++---
> 2 files changed, 82 insertions(+), 7 deletions(-)
>
> diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> index 2954245129a2..2de01137bb50 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
> + icmpv6 icmpv6: ICMPv6 echo type match
> psample psample: Sampling packets with psample"
>
> info() {
> @@ -443,6 +444,68 @@ test_action_set() {
> return 0
> }
>
Please document this test case
> +test_icmpv6() {
> + sbx_add "test_icmpv6" || return $?
> + ovs_add_dp "test_icmpv6" icmpv6 || return 1
> +
> + info "create namespaces"
> + for ns in client server; do
> + ovs_add_netns_and_veths "test_icmpv6" "icmpv6" \
> + "$ns" "${ns:0:1}0" "${ns:0:1}1" || return 1
> + done
> +
===
> + ip netns exec client ip addr add fd00::1/64 dev c1 nodad
> + ip netns exec client ip link set c1 up
> + ip netns exec server ip addr add fd00::2/64 dev s1 nodad
> + ip netns exec server ip link set s1 up
> +
> + local cl_mac sl_mac
> + cl_mac=$(ip netns exec client \
> + ip link show c1 | awk '/link\/ether/ {print $2}')
> + [ -z "$cl_mac" ] && \
> + { info "failed to get c1 hwaddr"; return 1; }
> + sl_mac=$(ip netns exec server \
> + ip link show s1 | awk '/link\/ether/ {print $2}')
> + [ -z "$sl_mac" ] && \
> + { info "failed to get s1 hwaddr"; return 1; }
> + ip netns exec client \
> + ip -6 neigh add fd00::2 lladdr "$sl_mac" dev c1
> + ip netns exec server \
> + ip -6 neigh add fd00::1 lladdr "$cl_mac" dev s1
===
Should there be some error detection / bailing here? I think we should
do the same as in the vlan case and set the unreachability detection to
'permanent' to prevent possible issues with racy neighbor discovery.
> +
> + ovs_add_flow "test_icmpv6" icmpv6 \
> + 'in_port(1),eth(),eth_type(0x86dd),ipv6(proto=58),icmpv6(type=128)' \
> + '2' || return 1
> + ovs_add_flow "test_icmpv6" icmpv6 \
> + 'in_port(2),eth(),eth_type(0x86dd),ipv6(proto=58),icmpv6(type=129)' \
> + '1' || return 1
> +
> + info "verify ICMPv6 echo with type-specific flows"
> + ovs_sbx "test_icmpv6" ip netns exec client \
> + ping -6 -c 1 -W 2 fd00::2 || return 1
> +
> + ovs_del_flows "test_icmpv6" icmpv6
> +
> + info "verify ping fails without echo flows"
> + ovs_sbx "test_icmpv6" ip netns exec client \
> + ping -6 -c 1 -W 2 fd00::2 >/dev/null 2>&1 \
> + && { info "FAIL: ping should fail without flows"
> + return 1; }
> +
> + ovs_add_flow "test_icmpv6" icmpv6 \
> + 'in_port(1),eth(),eth_type(0x86dd),ipv6(proto=58),icmpv6(type=128)' \
> + '2' || return 1
> + ovs_add_flow "test_icmpv6" icmpv6 \
> + 'in_port(2),eth(),eth_type(0x86dd),ipv6(proto=58),icmpv6(type=129)' \
> + '1' || return 1
> +
> + info "verify connectivity restored"
> + ovs_sbx "test_icmpv6" ip netns exec client \
> + ping -6 -c 1 -W 2 fd00::2 || 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..f3edd198223f 100644
> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> @@ -1255,11 +1255,16 @@ class ovskey(nla):
> lambda x: ipaddress.IPv6Address(x).packed if x else 0,
> convert_ipv6,
> ),
> - ("label", "label", "%d", lambda x: int(x) if x else 0),
> - ("proto", "proto", "%d", lambda x: int(x) if x else 0),
> - ("tclass", "tclass", "%d", lambda x: int(x) if x else 0),
> - ("hlimit", "hlimit", "%d", lambda x: int(x) if x else 0),
> - ("frag", "frag", "%d", lambda x: int(x) if x else 0),
> + ("label", "label", "%d", lambda x: int(x) if x else 0,
> + convert_int(20)),
> + ("proto", "proto", "%d", lambda x: int(x) if x else 0,
> + convert_int(8)),
> + ("tclass", "tclass", "%d", lambda x: int(x) if x else 0,
> + convert_int(8)),
> + ("hlimit", "hlimit", "%d", lambda x: int(x) if x else 0,
> + convert_int(8)),
> + ("frag", "frag", "%d", lambda x: int(x) if x else 0,
> + convert_int(8)),
> )
>
> def __init__(
> @@ -1344,8 +1349,10 @@ class ovskey(nla):
> )
>
> fields_map = (
> - ("type", "type", "%d", lambda x: int(x) if x else 0),
> - ("code", "code", "%d", lambda x: int(x) if x else 0),
> + ("type", "type", "%d", lambda x: int(x) if x else 0,
> + convert_int(8)),
> + ("code", "code", "%d", lambda x: int(x) if x else 0,
> + convert_int(8)),
> )
>
> def __init__(
> @@ -1982,6 +1989,11 @@ class ovskey(nla):
> "icmp",
> ovskey.ovs_key_icmp,
> ),
> + (
> + "OVS_KEY_ATTR_ICMPV6",
> + "icmpv6",
> + ovskey.ovs_key_icmpv6,
> + ),
> (
> "OVS_KEY_ATTR_TCP_FLAGS",
> "tcp_flags",
>
> base-commit: cef9d6804030793cf8b8796fd6936197d065dd3e
prev parent reply other threads:[~2026-07-01 17:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-30 10:22 [PATCH v3] selftests/net/openvswitch: add ICMPv6 echo type match test Minxi Hou
2026-07-01 17:40 ` Aaron Conole [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f7techm4nif.fsf@redhat.com \
--to=aconole@redhat.com \
--cc=echaudro@redhat.com \
--cc=houminxi@gmail.com \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox