Simon Horman <ho...@ovn.org> writes:

> On Mon, Sep 02, 2024 at 01:28:48PM +0200, Paolo Valerio wrote:
>> Paolo Valerio <pvale...@redhat.com> writes:
>> 
>> > Simon Horman <ho...@ovn.org> writes:
>> >
>> >> On Wed, Aug 28, 2024 at 07:14:06PM +0200, Paolo Valerio wrote:
>> >>> As Long reported, kernels built without CONFIG_NETFILTER_CONNCOUNT
>> >>> result in the unexpected failure of the following tests:
>> >>> 
>> >>> conntrack - multiple zones, local
>> >>> conntrack - multi-stage pipeline, local
>> >>> conntrack - can match and clear ct_state from outside OVS
>> >>> 
>> >>> this happens because the nf_conncount turns on connection tracking and
>> >>> the above tests rely on this side effect. However, this behavior may
>> >>> be corrected in the kernel, which could, in turn, cause the tests to
>> >>> fail.
>> >>> 
>> >>> The patch removes the assumption by adding explicit iptables rules to
>> >>> attach an nf_conn template to the skb resulting tracked once hit the
>> >>> OvS pipeline.
>> >>> 
>> >>> While at it, introduce $HAVE_IPTABLES and skip tests if iptables
>> >>> binary is not present.
>> >>> 
>> >>> Reported-by: Xin Long <lucien....@gmail.com>
>> >>> Reported-at: https://issues.redhat.com/browse/FDP-708
>> >>> Signed-off-by: Paolo Valerio <pvale...@redhat.com>
>> >>
>> >> Hi Paolo,
>> >>
>> >> I exercised this using vng with net-next compiled using
>> >> tools/testing/selftests/net/config from the upstream kernel tree [1].
>> >>
>> >> [1] 
>> >> https://github.com/linux-netdev/nipa/wiki/How-to-run-netdev-selftests-CI-style
>> >>
>> >> The resulting config does not have CONFIG_NETFILTER_CONNCOUNT set.
>> >>
>> >
>> > Hi Simon,
>> >
>> > I used vng with net-next as well, but with a different config. In my
>> > case I simply reused a previously used config which is essentially my
>> > local one updated with olddefconfig and manually (to remove/add things).
>> >
>> >> Some observations:
>> >>
>> >> * CONFIG_NETFILTER_XT_TARGET_CT is required for -j CT
>> >>
>> >>   I don't think this is a problem (other than my own problem
>> >>   of it taking me a long time to figure that out). But it seems
>> >>   worth noting (see parentheses in previous sentence:).
>> >>
>> >
>> > It's something I was thinking about right after the patch submission.
>> > Although extensions are fairly common in the main distros, maybe we may
>> > consider checking they are present.
>> >
>> > The only ways that comes to mind to reliably check whether the
>> > extensions (both kernel and user space) are present is simply by
>> > applying a rule.
>> >
>> > I guess we can (added a diff at the bottom), given the nft discussion
>> > and the potential follow-up, change things a bit in order to better
>> > accomodate a potential migration/follow-up.
>> >
>> > WDYT?
>
> Yes, I think this is a good idea.
>
> As an aside: While looking over this I noticed CHECK_CONNTRACK_TIMEOUT.  It
> seems this relies on NF_CONNTRACK_TIMEOUT being a module (not a builtin),
> and /boot/config-$(uname -r) corresponding to the running kernel. I guess
> that is ok most of the time, but it produced a false-skip when running
> tests under vng.
>
> Another aside: I'm unsure how to create an equivalent of the following with
> nft. Do you happen to know? Perhaps we can use notrack as a feature
> test instead?
>
> iptables -t raw -I OUTPUT 1 -o $1 -j CT

This should work:

nft -f - <<EOF
table ip raw {
    chain output {
        type filter hook output priority raw;
        oifname "..." ct state new
    }
}
EOF

also it seems that adding -c is enough to reliably check
that the requirement are in place.

>
>> >> * Of the tests that are updated by this patch,
>> >>   I only observed that the last one,
>> >>   "conntrack - can match and clear ct_state from outside OVS",
>> >>   fails without this patch applied.
>> >>
>> >>   I am unsure if that is something that warrants updating this
>> >>   patch or not. Or if, rather, there is an error in my testing.
>> >
>> > Thanks for testing it.
>> >
>> > Interesting.
>> > I tried the following config against net-next and it seems I can't
>> > reproduce that behaviour:
>> >
>> > vng --build --config tools/testing/selftests/net/config \
>> >   --configitem CONFIG_NF_CONNTRACK_ZONES=y \
>> >   --configitem CONFIG_NETFILTER_XT_TARGET_CT=m -v
>
> Sorry about this. I spent some time on this again.
>
> I have verified that all the conntrack tests modified
> by this patch fail without it, as expected.
>

no problem, thanks for double checking

> And that I misunderstood the changes to the datapath tests.
> As they are separate from the conncount update I suggest
> breaking them out into a separate patch.
>

do you mean to keep the change below separate but still part of the
series?

>> > ---
>> > diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
>> > index 5203b1df8..6b5eb32fc 100644
>> > --- a/tests/system-kmod-macros.at
>> > +++ b/tests/system-kmod-macros.at
>> > @@ -267,3 +267,22 @@ m4_define([OVS_CHECK_BAREUDP],
>> >      AT_SKIP_IF([! ip link add dev ovs_bareudp0 type bareudp dstport 6635 
>> > ethertype mpls_uc 2>&1 >/dev/null])
>> >      AT_CHECK([ip link del dev ovs_bareudp0])
>> >  ])
>> > +
>> > +# CHECK_EXTERNAL_CT()
>> > +#
>> > +# Checks if packets can be tracked outside OvS.
>> > +m4_define([CHECK_EXTERNAL_CT],
>> > +[
>> > +    dnl Kernel config (CONFIG_NETFILTER_XT_TARGET_CT)
>> > +    dnl and user space extensions need to be present.
>> > +    AT_SKIP_IF([! iptables -t raw -I OUTPUT 1 -j CT])
>> > +    AT_CHECK([iptables -t raw -D OUTPUT 1])
>> > +])
>> > +
>> > +# ADD_EXTERNAL_CT()
>> > +#
>> > +# Let conntrack start tracking the packets outside OvS.
>> > +m4_define([ADD_EXTERNAL_CT],
>> > +[
>> > +    AT_CHECK([iptables -t raw -I OUTPUT 1 -o $1 -j CT])
>> > +])
>> 
>> on_exit here got lost for some reason.
>> Below the corrected diff.
>> 
>> ---
>> diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
>> index 5203b1df8..ab89ea24b 100644
>> --- a/tests/system-kmod-macros.at
>> +++ b/tests/system-kmod-macros.at
>> @@ -267,3 +267,23 @@ m4_define([OVS_CHECK_BAREUDP],
>>      AT_SKIP_IF([! ip link add dev ovs_bareudp0 type bareudp dstport 6635 
>> ethertype mpls_uc 2>&1 >/dev/null])
>>      AT_CHECK([ip link del dev ovs_bareudp0])
>>  ])
>> +
>> +# CHECK_EXTERNAL_CT()
>> +#
>> +# Checks if packets can be tracked outside OvS.
>> +m4_define([CHECK_EXTERNAL_CT],
>> +[
>> +    dnl Kernel config (CONFIG_NETFILTER_XT_TARGET_CT)
>> +    dnl and user space extensions need to be present.
>> +    AT_SKIP_IF([! iptables -t raw -I OUTPUT 1 -j CT])
>> +    AT_CHECK([iptables -t raw -D OUTPUT 1])
>> +])
>> +
>> +# ADD_EXTERNAL_CT()
>> +#
>> +# Let conntrack start tracking the packets outside OvS.
>> +m4_define([ADD_EXTERNAL_CT],
>> +[
>> +    AT_CHECK([iptables -t raw -I OUTPUT 1 -o $1 -j CT])
>> +    on_exit 'iptables -t raw -D OUTPUT 1'
>> +])
>> diff --git a/tests/system-traffic.at b/tests/system-traffic.at
>> index 46a9414d4..5435a6241 100644
>> --- a/tests/system-traffic.at
>> +++ b/tests/system-traffic.at
>> @@ -5458,12 +5458,12 @@ OVS_TRAFFIC_VSWITCHD_STOP
>>  AT_CLEANUP
>>  
>>  AT_SETUP([conntrack - multiple zones, local])
>> -AT_SKIP_IF([test $HAVE_IPTABLES = no])
>
> I think that either the above should stay,
> or be rolled into CHECK_EXTERNAL_CT.
>

that's right. Let's roll it into CHECK_EXTERNAL_CT().

>> +CHECK_EXTERNAL_CT()
>>  CHECK_CONNTRACK()
>>  CHECK_CONNTRACK_LOCAL_STACK()
>>  OVS_TRAFFIC_VSWITCHD_START()
>>  
>> -IPTABLES_CT([br0])
>> +ADD_EXTERNAL_CT([br0])
>>  ADD_NAMESPACES(at_ns0)
>>  
>>  AT_CHECK([ip addr add dev br0 "10.1.1.1/24"])
>
> ...

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to