On Mon, Dec 6, 2021 at 11:16 PM Ilya Maximets <i.maxim...@ovn.org> wrote: > > On 11/30/21 16:00, David Marchand wrote: > > net_pcap is not always available in DPDK (like, in a dev > > environment when you forgot to install the libpcap-devel). > > On the other hand, OVS already has its own way to inject packets into a > > bridge. Let's make use of it. > > > > This solution is slower than net/pcap DPDK, so lower the number of > > expected packets so that it runs in OVS_CTL_TIMEOUT seconds. > > > > While at it, convert "known" packets from pcap to scapy so that the > > injected packets can be updated without having to read/write a pcap file. > > > > Note: this change also (avoids/) fixes a python exception in PcapWriter > > with scapy 2.4.3 that comes from EPEL. > > > > Suggested-by: Ilya Maximets <i.maxim...@ovn.org> > > Signed-off-by: David Marchand <david.march...@redhat.com> > > --- > > Changes since v2: > > - updated documentation, > > - cleaned tests/automake.mk, > > - fixed shebang in python script, > > - added missing check for scapy availability, > > > > Changes since v1: > > - renamed generator script, > > - decreased packet count for fuzzy test, > > - simplified wait expression for packet count, > > > > --- > > Documentation/topics/dpdk/bridge.rst | 7 ++-- > > tests/automake.mk | 7 +--- > > tests/genpkts.py | 56 +++++++++++++++++++++++++++ > > tests/mfex_fuzzy.py | 32 --------------- > > tests/pcap/mfex_test.pcap | Bin 416 -> 0 bytes > > tests/system-dpdk-macros.at | 4 +- > > tests/system-dpdk.at | 33 +++++++++++++--- > > 7 files changed, 89 insertions(+), 50 deletions(-) > > create mode 100755 tests/genpkts.py > > delete mode 100755 tests/mfex_fuzzy.py > > delete mode 100644 tests/pcap/mfex_test.pcap > > > > diff --git a/Documentation/topics/dpdk/bridge.rst > > b/Documentation/topics/dpdk/bridge.rst > > index f645b9ade5..648ce203eb 100644 > > --- a/Documentation/topics/dpdk/bridge.rst > > +++ b/Documentation/topics/dpdk/bridge.rst > > @@ -408,7 +408,7 @@ Fuzzy tests can also be done on miniflow extract with > > the help of > > auto-validator and Scapy. The steps below describes the steps to > > reproduce the setup with IP being fuzzed to generate packets. > > > > -Scapy is used to create fuzzy IP packets and save them into a PCAP :: > > +Scapy is used to create fuzzy IP packets (see tests/genpkts.py) :: > > > > pkt = fuzz(Ether()/IP()/TCP()) > > > > @@ -418,9 +418,8 @@ Set the miniflow extract to autovalidator using :: > > > > OVS is configured to receive the generated packets :: > > > > - $ ovs-vsctl add-port br0 pcap0 -- \ > > - set Interface pcap0 type=dpdk options:dpdk-devargs=net_pcap0 > > - "rx_pcap=fuzzy.pcap" > > + $ ovs-vsctl add-port br0 p1 -- \ > > + set Interface p1 type=dummy-pmd > > > > With this workflow, the autovalidator will ensure that all MFEX > > implementations are classifying each packet in exactly the same way. > > I'm actually getting a hard time understanding a value of this section > of the doc for the end user, who is the target audience for this doc. > > And the next section "Unit Fuzzy test with Autovalidator" is incorrectly > formatted and also almost to the word equal to the "Unit Test Miniflow > Extract" section. > > It doesn't make a lot of sense talking that functionality is covered by > unit tests. Everything should be covered by unit tests by default. > And this is definitely not something that should be part of an end-user > high-level documentation. > > It's not a problem of a current patch set, but I'd suggest to just > remove the last 3 sections of dpdk/bridge.rst. They should not be there.
I guess this comment is covered by your patch that refactors the documentation, correct? I'll still update this part in my patch (and rebase if there is a conflict once your doc patch is merged). > > > diff --git a/tests/automake.mk b/tests/automake.mk > > index 43731d0973..3bc74a5aff 100644 > > --- a/tests/automake.mk > > +++ b/tests/automake.mk > > @@ -143,11 +143,6 @@ $(srcdir)/tests/fuzz-regression-list.at: > > tests/automake.mk > > echo "TEST_FUZZ_REGRESSION([$$basename])"; \ > > done > $@.tmp && mv $@.tmp $@ > > > > -EXTRA_DIST += $(MFEX_AUTOVALIDATOR_TESTS) > > -MFEX_AUTOVALIDATOR_TESTS = \ > > - tests/pcap/mfex_test.pcap \ > > - tests/mfex_fuzzy.py > > - > > OVSDB_CLUSTER_TESTSUITE_AT = \ > > tests/ovsdb-cluster-testsuite.at \ > > tests/ovsdb-execution.at \ > > @@ -518,7 +513,7 @@ tests_test_type_props_SOURCES = tests/test-type-props.c > > CHECK_PYFILES = \ > > tests/appctl.py \ > > tests/flowgen.py \ > > - tests/mfex_fuzzy.py \ > > + tests/genpkts.py \ > > tests/ovsdb-monitor-sort.py \ > > tests/test-daemon.py \ > > tests/test-json.py \ > > diff --git a/tests/genpkts.py b/tests/genpkts.py > > new file mode 100755 > > index 0000000000..f64f786ccb > > --- /dev/null > > +++ b/tests/genpkts.py > > @@ -0,0 +1,56 @@ > > +#!/usr/bin/env python3 > > + > > +import sys > > + > > +from scapy.all import RandMAC, RandIP, RandIP6, RandShort, fuzz > > +from scapy.all import IPv6, Dot1Q, IP, Ether, UDP, TCP > > + > > +if len(sys.argv) < 2: > > + print('usage: {} packets_count [fuzz]'.format(sys.argv[0])) > > + sys.exit(1) > > + > > +tmpl = [] > > + > > +if len(sys.argv) == 2: > > + eth = Ether(dst='ff:ff:ff:ff:ff:ff') > > + vlan = eth / Dot1Q(vlan=1) > > + p = eth / IP() / TCP(sport=20, dport=80, flags='SA', window=8192) > > + tmpl += [p.build().hex()] > > + p = eth / IP() / UDP(sport=53, dport=53) > > + tmpl += [p.build().hex()] > > + p = eth / IP() / TCP(sport=20, dport=80, flags='S', window=8192) > > + tmpl += [p.build().hex()] > > + p = eth / IP() / UDP(sport=53, dport=53) > > We already have the same packet. Is it intended behavior? That's what the unit test was doing before, I translated it in python. I don't get the intention of always testing with the same packets and I see little value in it. We could even remove the loop on receiving 1k packets. > > > + tmpl += [p.build().hex()] > > + p = vlan / IP() / UDP(sport=53, dport=53) > > + tmpl += [p.build().hex()] > > + p = vlan / IP() / TCP(sport=20, dport=80, flags='S', window=8192) > > + tmpl += [p.build().hex()] > > +elif sys.argv[2] == 'fuzz': > > + # Generate random protocol bases, use a fuzz() over the combined packet > > + # for full fuzzing. > > + eth = Ether(src=RandMAC(), dst=RandMAC()) > > + vlan = Dot1Q() > > + ipv4 = IP(src=RandIP(), dst=RandIP()) > > + ipv6 = IPv6(src=RandIP6(), dst=RandIP6()) > > + udp = UDP(dport=RandShort(), sport=RandShort()) > > + tcp = TCP(dport=RandShort(), sport=RandShort()) > > + > > + # IPv4 packets with fuzzing > > + tmpl += [fuzz(eth / ipv4 / udp).build().hex()] > > + tmpl += [fuzz(eth / ipv4 / tcp).build().hex()] > > + tmpl += [fuzz(eth / vlan / ipv4 / udp).build().hex()] > > + tmpl += [fuzz(eth / vlan / ipv4 / tcp).build().hex()] > > + > > + # IPv6 packets with fuzzing > > + tmpl += [fuzz(eth / ipv6 / udp).build().hex()] > > + tmpl += [fuzz(eth / ipv6 / tcp).build().hex()] > > + tmpl += [fuzz(eth / vlan / ipv6 / udp).build().hex()] > > + tmpl += [fuzz(eth / vlan / ipv6 / tcp).build().hex()] > > + > > +i = 0 > > +count = int(sys.argv[1]) > > +while count != 0: > > + print(tmpl[i % len(tmpl)]) > > + i += 1 > > + count -= 1 > > While it's OK to reduce the number of packets for the fuzzy test > in order to seed it up, we should still generate N different > fuzzy packets. This script seems to print out the same 8 packets > again and again. Argh... yes this is a regression. > > Maybe something like this: > > def simple(): > tmpl = [] > <generate a few packets> > return tmpl > > def fuzzy(): > tmpl = [] > <generate a few fuzzy packets> > return tmpl > > while True: > for packet in simple() if len(sys.argv) == 2 else fuzzy(): > print(packet) > count -= 1 > if count == 0: > exit(0) I'll try with your suggestion. Thanks Ilya. -- David Marchand _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev