Message ID | 20241114-flow_dissector-v2-0-ee4a3be3de65@bootlin.com |
---|---|
Headers | show |
Series | selftests/bpf: migrate test_flow_dissector.sh to test_progs | expand |
On 11/14, Alexis Lothoré (eBPF Foundation) wrote: > xdp_metadata test has a small helper computing ipv checksums to allow > manually building packets. > > Move this helper to network_helpers to share it with other tests. > > Signed-off-by: Alexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com> > --- > Changes in v2: > - new patch > --- > tools/testing/selftests/bpf/network_helpers.h | 23 ++++++++++++++++++++++ > .../selftests/bpf/prog_tests/xdp_metadata.c | 19 +----------------- > 2 files changed, 24 insertions(+), 18 deletions(-) > > diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h > index c72c16e1aff825439896b38e59962ffafe92dc71..c9b72960c651ab9fb249f6eb9e153b8416b7a488 100644 > --- a/tools/testing/selftests/bpf/network_helpers.h > +++ b/tools/testing/selftests/bpf/network_helpers.h > @@ -104,6 +104,29 @@ static __u16 csum_fold(__u32 csum) > return (__u16)~csum; > } > [..] > +static unsigned long add_csum_hword(const __u16 *start, int num_u16) > +{ > + unsigned long sum = 0; > + int i; > + > + for (i = 0; i < num_u16; i++) > + sum += start[i]; > + > + return sum; > +} Sorry for nitpicking, but can we call it csum_partial? And match kernel's prototype with extra sum argument? Should be more greppable for the future test cases that might want to use it...
On 11/14, Alexis Lothoré (eBPF Foundation) wrote: > We sometimes need to compare whole structures in an assert. It is > possible to use the existing macros on each field, but when the whole > structure has to be checked, it is more convenient to simply compare the > whole structure memory > > Add a dedicated assert macro, ASSERT_MEMEQ, to allow bare memory > comparision > The output generated by this new macro looks like the following: > [...] > run_tests_skb_less:FAIL:returned flow keys unexpected memory mismatch > actual: > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 > expected: > 0E 00 3E 00 DD 86 01 01 00 06 86 DD 50 00 90 1F > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 01 00 00 00 00 00 00 00 > [...] > > Signed-off-by: Alexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com> Acked-by: Stanislav Fomichev <sdf@fomichev.me>
On 11/14, Alexis Lothoré (eBPF Foundation) wrote: > Commit a11c397c43d5 ("bpf/flow_dissector: add mode to enforce global BPF > flow dissector") is currently tested in test_flow_dissector.sh, which is > not part of test_progs. Add the corresponding test to flow_dissector.c, > which is part of test_progs. The new test reproduces the behavior > implemented in its shell script counterpart: > - attach a flow dissector program to the root net namespace, ensure > that we can not attach another flow dissector in any non-root net > namespace > - attach a flow dissector program to a non-root net namespace, ensure > that we can not attach another flow dissector in root namespace > > Since the new test is performing operations in the root net namespace, > make sure to set it as a "serial" test to make sure not to conflict with > any other test. > > Signed-off-by: Alexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com> Acked-by: Stanislav Fomichev <sdf@fomichev.me>
On 11/14, Alexis Lothoré (eBPF Foundation) wrote: > network_helpers.c provides some helpers to generate ip checksums or ip > pseudo-header checksums, but not for upper layers (eg: udp checksums) > > Add helpers for udp checksum to allow manually building udp packets. > > Signed-off-by: Alexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com> > --- > Changes in v2: > - new patch > --- > tools/testing/selftests/bpf/network_helpers.h | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h > index 6d1ae56080c56a65c437899c32566f0e4c496c33..fa82269f7a169a518ba210fa8641eba02f262333 100644 > --- a/tools/testing/selftests/bpf/network_helpers.h > +++ b/tools/testing/selftests/bpf/network_helpers.h > @@ -161,6 +161,33 @@ build_ipv6_pseudo_header_csum(const struct in6_addr *saddr, > return csum_fold((__u32)s); > } > > +static inline __sum16 build_udp_v4_csum(const struct iphdr *iph, __u8 l4_proto, > + __u16 l4_len, const void *l4_start, > + int num_words) > +{ > + unsigned long pseudo_sum; > + int num_u16 = sizeof(iph->saddr); /* halfwords: twice byte len */ > + > + pseudo_sum = add_csum_hword((void *)&iph->saddr, num_u16); > + pseudo_sum += htons(l4_proto); > + pseudo_sum += l4_len; > + pseudo_sum += add_csum_hword(l4_start, num_words); > + return csum_fold(pseudo_sum); I was expecting to see a call to csum_tcpudp_magic here. And csum_ipv6_magic down below. These build pseudo header csum, so no need to manually do it again. > +} > + > +static inline __sum16 build_udp_v6_csum(const struct ipv6hdr *ip6h, > + const void *l4_start, int num_words) > +{ > + unsigned long pseudo_sum; > + int num_u16 = sizeof(ip6h->saddr); /* halfwords: twice byte len */ > + > + pseudo_sum = add_csum_hword((void *)&ip6h->saddr, num_u16); > + pseudo_sum += htons(ip6h->nexthdr); > + pseudo_sum += ip6h->payload_len; > + pseudo_sum += add_csum_hword(l4_start, num_words); > + return csum_fold(pseudo_sum); > +} > + > struct tmonitor_ctx; > > #ifdef TRAFFIC_MONITOR > > -- > 2.47.0 >