diff mbox series

[ovs-dev,v4,2/2] netdev-dummy: Add support and test for tso.

Message ID 20231219144719.1562790-2-mkp@redhat.com
State Changes Requested
Delegated to: Ilya Maximets
Headers show
Series [ovs-dev,v4,1/2] dp-packet: Set checksum flags during software TSO. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Mike Pattrick Dec. 19, 2023, 2:47 p.m. UTC
Test that netdev-dummy is able to send and receive segment offloaded
packets.

Signed-off-by: Mike Pattrick <mkp@redhat.com>
---
v2: Fix clang build error: mutex needed to access netdev_dummy members
v3: Remove use of tcpdump, hexdump, and otherwise clean up test
v4: Wrapped long lines in test
---
 lib/netdev-dummy.c   |  32 +++++++++++-
 tests/dpif-netdev.at | 122 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 153 insertions(+), 1 deletion(-)

Comments

Simon Horman Dec. 19, 2023, 6:53 p.m. UTC | #1
On Tue, Dec 19, 2023 at 09:47:19AM -0500, Mike Pattrick wrote:
> Test that netdev-dummy is able to send and receive segment offloaded
> packets.
> 
> Signed-off-by: Mike Pattrick <mkp@redhat.com>

Acked-by: Simon Horman <horms@ovn.org>
Ilya Maximets Jan. 13, 2024, 9:47 p.m. UTC | #2
On 12/19/23 15:47, Mike Pattrick wrote:
> Test that netdev-dummy is able to send and receive segment offloaded
> packets.
> 
> Signed-off-by: Mike Pattrick <mkp@redhat.com>
> ---
> v2: Fix clang build error: mutex needed to access netdev_dummy members
> v3: Remove use of tcpdump, hexdump, and otherwise clean up test
> v4: Wrapped long lines in test
> ---
>  lib/netdev-dummy.c   |  32 +++++++++++-
>  tests/dpif-netdev.at | 122 +++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 153 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
> index 8c6e6d448..9d9a28892 100644
> --- a/lib/netdev-dummy.c
> +++ b/lib/netdev-dummy.c
> @@ -44,6 +44,7 @@
>  #include "unaligned.h"
>  #include "timeval.h"
>  #include "unixctl.h"
> +#include "userspace-tso.h"
>  #include "reconnect.h"
>  
>  VLOG_DEFINE_THIS_MODULE(netdev_dummy);
> @@ -152,6 +153,8 @@ struct netdev_dummy {
>      bool ol_ip_csum OVS_GUARDED;
>      /* Flag RX packet with good csum. */
>      bool ol_ip_csum_set_good OVS_GUARDED;
> +    /* Set the segment size for netdev TSO support. */
> +    int ol_tso_segsz OVS_GUARDED;
>  };
>  
>  /* Max 'recv_queue_len' in struct netdev_dummy. */
> @@ -806,6 +809,10 @@ netdev_dummy_get_config(const struct netdev *dev, struct smap *args)
>          smap_add_format(args, "ol_ip_csum_set_good", "%s", "true");
>      }
>  
> +    if (netdev->ol_tso_segsz && userspace_tso_enabled()) {
> +        smap_add_format(args, "ol_tso_segsz", "%d", netdev->ol_tso_segsz);
> +    }
> +
>      /* 'dummy-pmd' specific config. */
>      if (!netdev_is_pmd(dev)) {
>          goto exit;
> @@ -937,6 +944,14 @@ netdev_dummy_set_config(struct netdev *netdev_, const struct smap *args,
>          netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM;
>      }
>  
> +    if (userspace_tso_enabled()) {
> +        netdev->ol_tso_segsz = smap_get_int(args, "ol_tso_segsz", 0);
> +        if (netdev->ol_tso_segsz) {
> +            netdev_->ol_flags |= (NETDEV_TX_OFFLOAD_TCP_TSO
> +                                  | NETDEV_TX_OFFLOAD_TCP_CKSUM);
> +        }
> +    }
> +
>      netdev_change_seq_changed(netdev_);
>  
>      /* 'dummy-pmd' specific config. */
> @@ -1119,6 +1134,15 @@ netdev_dummy_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch,
>          /* The netdev hardware sets the flag when the packet has good csum. */
>          dp_packet_ol_set_ip_csum_good(packet);
>      }
> +
> +    if (userspace_tso_enabled() && netdev->ol_tso_segsz) {
> +        dp_packet_set_tso_segsz(packet, netdev->ol_tso_segsz);
> +        dp_packet_hwol_set_tcp_seg(packet);
> +        dp_packet_hwol_set_tx_ip_csum(packet);
> +        dp_packet_hwol_set_tx_ipv4(packet);
> +        dp_packet_hwol_set_csum_tcp(packet);
> +    }
> +
>      ovs_mutex_unlock(&netdev->mutex);
>  
>      dp_packet_batch_init_packet(batch, packet);
> @@ -1174,6 +1198,12 @@ netdev_dummy_send(struct netdev *netdev, int qid,
>      DP_PACKET_BATCH_FOR_EACH(i, packet, batch) {
>          const void *buffer = dp_packet_data(packet);
>          size_t size = dp_packet_size(packet);
> +        bool is_tso;
> +
> +        ovs_mutex_lock(&dev->mutex);
> +        is_tso = userspace_tso_enabled() && dev->ol_tso_segsz &&
> +                 dp_packet_hwol_is_tso(packet);
> +        ovs_mutex_unlock(&dev->mutex);
>  
>          if (!dp_packet_is_eth(packet)) {
>              error = EPFNOSUPPORT;
> @@ -1194,7 +1224,7 @@ netdev_dummy_send(struct netdev *netdev, int qid,
>              if (eth->eth_type == htons(ETH_TYPE_VLAN)) {
>                  max_size += VLAN_HEADER_LEN;
>              }
> -            if (size > max_size) {
> +            if (size > max_size && !is_tso) {
>                  error = EMSGSIZE;
>                  break;
>              }
> diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
> index d0359b5ea..e0d81e7d4 100644
> --- a/tests/dpif-netdev.at
> +++ b/tests/dpif-netdev.at
> @@ -810,6 +810,128 @@ AT_CHECK_UNQUOTED([tail -n 1 p2.pcap.txt], [0], [${good_expected}
>  OVS_VSWITCHD_STOP
>  AT_CLEANUP
>  
> +AT_SETUP([userspace offload - tso])
> +OVS_VSWITCHD_START(
> +  [set Open_vSwitch . other_config:userspace-tso-enable=true -- \
> +   add-br br1 -- set bridge br1 datapath-type=dummy -- \
> +   add-port br1 p1 -- \
> +       set Interface p1 type=dummy -- \
> +   add-port br1 p2 -- \
> +       set Interface p2 type=dummy])
> +
> +dnl Simple passthrough rule.
> +AT_CHECK([ovs-ofctl add-flow br1 in_port=p1,actions=output:p2])
> +
> +flow_s="in_port(1),eth(src=8a:bf:7e:2f:05:84,dst=0a:8f:39:4f:e0:73),eth_type(0x0800), \
> +        ipv4(src=192.168.123.2,dst=192.168.123.1,proto=6,tos=1,ttl=64,frag=no), \
> +        tcp(src=54392,dst=5201),tcp_flags(ack)"
> +
> +dnl Send from tso to no-tso.
> +AT_CHECK([ovs-vsctl set Interface p2 options:tx_pcap=p2.pcap -- \
> +                    set Interface p1 options:ol_ip_csum=true -- \
> +                    set Interface p1 options:ol_ip_csum_set_good=false -- \
> +                    set Interface p1 options:ol_tso_segsz=500])
> +
> +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "${flow_s}" --len 2054])
> +
> +dnl Send from tso to tso.
> +AT_CHECK([ovs-vsctl set Interface p2 options:ol_ip_csum=true -- \
> +                    set Interface p2 options:ol_ip_csum_set_good=false -- \
> +                    set Interface p2 options:ol_tso_segsz=500])
> +
> +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "${flow_s}" --len 2054])
> +
> +dnl Check that first we have 4x 500 byte payloads, then one 2000 byte payload.
> +AT_CHECK([ovs-pcap p2.pcap], [0], [dnl
> +[0a8f394fe0738abf7e2f058408004501021c0000000040060187c0a87b02c0a87b01d47814510000000000000000501000004dc2]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000]
> +[0a8f394fe0738abf7e2f058408004501021c0001000040060186c0a87b02c0a87b01d4781451000001f400000000501000004bce]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000]
> +[0a8f394fe0738abf7e2f058408004501021c0002000040060185c0a87b02c0a87b01d4781451000003e8000000005010000049da]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000]
> +[0a8f394fe0738abf7e2f058408004501021c0003000040060184c0a87b02c0a87b01d4781451000005dc000000005010000047e6]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000]
> +[0a8f394fe0738abf7e2f05840800450107f8000000004006fbaac0a87b02c0a87b01d478145100000000000000005010000047e6]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> +[0000000000000000000000000000000000000000000000000000]
> +])

This is a little wild. :)

We should shorten that.  For exmaple, we could do:

zero500=$(printf '0%.0s' $(seq 500))

AT_CHECK_UNQUOTED([ovs-pcap p2.pcap], [0], [dnl
[0a8f394fe0738abf7e2f058408004501021c0000000040060187c0a87b02c0a87b01]dnl
[d47814510000000000000000501000004dc200${zero500}]
[0a8f394fe0738abf7e2f058408004501021c0001000040060186c0a87b02c0a87b01]dnl
[d4781451000001f400000000501000004bce00${zero500}]
[0a8f394fe0738abf7e2f058408004501021c0002000040060185c0a87b02c0a87b01]dnl
[d4781451000003e8000000005010000049da00${zero500}]
[0a8f394fe0738abf7e2f058408004501021c0003000040060184c0a87b02c0a87b01]dnl
[d4781451000005dc000000005010000047e600${zero500}]
[0a8f394fe0738abf7e2f05840800450107f8000000004006fbaac0a87b02c0a87b01]dnl
[d478145100000000000000005010000047e600${zero500}${zero500}${zero500}${zero500}]
])

I didn't really test that, but, I think, some variation of that should work.
We do similar things in odp.at while generating large actions, for example.

BTW, we should also have a version of that test for IPv6.  I think there
is a bug in dp_packet_gso() function while calculating payload length for
IPv6 header.  It looks wrong that it is exactly the same as in IPv4 case,
even using sizeof of IPv4 header structure:

            ip6_hdr->ip6_ctlun.ip6_un1.ip6_un1_plen
                = htons(sizeof *ip_hdr + dp_packet_l4_size(seg));

That can be a separate fix though.

Best regrads, Ilya Maximets.
Mike Pattrick Jan. 16, 2024, 8:31 p.m. UTC | #3
On Sat, Jan 13, 2024 at 4:47 PM Ilya Maximets <i.maximets@ovn.org> wrote:
>
> On 12/19/23 15:47, Mike Pattrick wrote:
> > Test that netdev-dummy is able to send and receive segment offloaded
> > packets.
> >
> > Signed-off-by: Mike Pattrick <mkp@redhat.com>
> > ---
> > v2: Fix clang build error: mutex needed to access netdev_dummy members
> > v3: Remove use of tcpdump, hexdump, and otherwise clean up test
> > v4: Wrapped long lines in test
> > ---
> >  lib/netdev-dummy.c   |  32 +++++++++++-
> >  tests/dpif-netdev.at | 122 +++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 153 insertions(+), 1 deletion(-)
> >
> > diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
> > index 8c6e6d448..9d9a28892 100644
> > --- a/lib/netdev-dummy.c
> > +++ b/lib/netdev-dummy.c
> > @@ -44,6 +44,7 @@
> >  #include "unaligned.h"
> >  #include "timeval.h"
> >  #include "unixctl.h"
> > +#include "userspace-tso.h"
> >  #include "reconnect.h"
> >
> >  VLOG_DEFINE_THIS_MODULE(netdev_dummy);
> > @@ -152,6 +153,8 @@ struct netdev_dummy {
> >      bool ol_ip_csum OVS_GUARDED;
> >      /* Flag RX packet with good csum. */
> >      bool ol_ip_csum_set_good OVS_GUARDED;
> > +    /* Set the segment size for netdev TSO support. */
> > +    int ol_tso_segsz OVS_GUARDED;
> >  };
> >
> >  /* Max 'recv_queue_len' in struct netdev_dummy. */
> > @@ -806,6 +809,10 @@ netdev_dummy_get_config(const struct netdev *dev, struct smap *args)
> >          smap_add_format(args, "ol_ip_csum_set_good", "%s", "true");
> >      }
> >
> > +    if (netdev->ol_tso_segsz && userspace_tso_enabled()) {
> > +        smap_add_format(args, "ol_tso_segsz", "%d", netdev->ol_tso_segsz);
> > +    }
> > +
> >      /* 'dummy-pmd' specific config. */
> >      if (!netdev_is_pmd(dev)) {
> >          goto exit;
> > @@ -937,6 +944,14 @@ netdev_dummy_set_config(struct netdev *netdev_, const struct smap *args,
> >          netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM;
> >      }
> >
> > +    if (userspace_tso_enabled()) {
> > +        netdev->ol_tso_segsz = smap_get_int(args, "ol_tso_segsz", 0);
> > +        if (netdev->ol_tso_segsz) {
> > +            netdev_->ol_flags |= (NETDEV_TX_OFFLOAD_TCP_TSO
> > +                                  | NETDEV_TX_OFFLOAD_TCP_CKSUM);
> > +        }
> > +    }
> > +
> >      netdev_change_seq_changed(netdev_);
> >
> >      /* 'dummy-pmd' specific config. */
> > @@ -1119,6 +1134,15 @@ netdev_dummy_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch,
> >          /* The netdev hardware sets the flag when the packet has good csum. */
> >          dp_packet_ol_set_ip_csum_good(packet);
> >      }
> > +
> > +    if (userspace_tso_enabled() && netdev->ol_tso_segsz) {
> > +        dp_packet_set_tso_segsz(packet, netdev->ol_tso_segsz);
> > +        dp_packet_hwol_set_tcp_seg(packet);
> > +        dp_packet_hwol_set_tx_ip_csum(packet);
> > +        dp_packet_hwol_set_tx_ipv4(packet);
> > +        dp_packet_hwol_set_csum_tcp(packet);
> > +    }
> > +
> >      ovs_mutex_unlock(&netdev->mutex);
> >
> >      dp_packet_batch_init_packet(batch, packet);
> > @@ -1174,6 +1198,12 @@ netdev_dummy_send(struct netdev *netdev, int qid,
> >      DP_PACKET_BATCH_FOR_EACH(i, packet, batch) {
> >          const void *buffer = dp_packet_data(packet);
> >          size_t size = dp_packet_size(packet);
> > +        bool is_tso;
> > +
> > +        ovs_mutex_lock(&dev->mutex);
> > +        is_tso = userspace_tso_enabled() && dev->ol_tso_segsz &&
> > +                 dp_packet_hwol_is_tso(packet);
> > +        ovs_mutex_unlock(&dev->mutex);
> >
> >          if (!dp_packet_is_eth(packet)) {
> >              error = EPFNOSUPPORT;
> > @@ -1194,7 +1224,7 @@ netdev_dummy_send(struct netdev *netdev, int qid,
> >              if (eth->eth_type == htons(ETH_TYPE_VLAN)) {
> >                  max_size += VLAN_HEADER_LEN;
> >              }
> > -            if (size > max_size) {
> > +            if (size > max_size && !is_tso) {
> >                  error = EMSGSIZE;
> >                  break;
> >              }
> > diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
> > index d0359b5ea..e0d81e7d4 100644
> > --- a/tests/dpif-netdev.at
> > +++ b/tests/dpif-netdev.at
> > @@ -810,6 +810,128 @@ AT_CHECK_UNQUOTED([tail -n 1 p2.pcap.txt], [0], [${good_expected}
> >  OVS_VSWITCHD_STOP
> >  AT_CLEANUP
> >
> > +AT_SETUP([userspace offload - tso])
> > +OVS_VSWITCHD_START(
> > +  [set Open_vSwitch . other_config:userspace-tso-enable=true -- \
> > +   add-br br1 -- set bridge br1 datapath-type=dummy -- \
> > +   add-port br1 p1 -- \
> > +       set Interface p1 type=dummy -- \
> > +   add-port br1 p2 -- \
> > +       set Interface p2 type=dummy])
> > +
> > +dnl Simple passthrough rule.
> > +AT_CHECK([ovs-ofctl add-flow br1 in_port=p1,actions=output:p2])
> > +
> > +flow_s="in_port(1),eth(src=8a:bf:7e:2f:05:84,dst=0a:8f:39:4f:e0:73),eth_type(0x0800), \
> > +        ipv4(src=192.168.123.2,dst=192.168.123.1,proto=6,tos=1,ttl=64,frag=no), \
> > +        tcp(src=54392,dst=5201),tcp_flags(ack)"
> > +
> > +dnl Send from tso to no-tso.
> > +AT_CHECK([ovs-vsctl set Interface p2 options:tx_pcap=p2.pcap -- \
> > +                    set Interface p1 options:ol_ip_csum=true -- \
> > +                    set Interface p1 options:ol_ip_csum_set_good=false -- \
> > +                    set Interface p1 options:ol_tso_segsz=500])
> > +
> > +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "${flow_s}" --len 2054])
> > +
> > +dnl Send from tso to tso.
> > +AT_CHECK([ovs-vsctl set Interface p2 options:ol_ip_csum=true -- \
> > +                    set Interface p2 options:ol_ip_csum_set_good=false -- \
> > +                    set Interface p2 options:ol_tso_segsz=500])
> > +
> > +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "${flow_s}" --len 2054])
> > +
> > +dnl Check that first we have 4x 500 byte payloads, then one 2000 byte payload.
> > +AT_CHECK([ovs-pcap p2.pcap], [0], [dnl
> > +[0a8f394fe0738abf7e2f058408004501021c0000000040060187c0a87b02c0a87b01d47814510000000000000000501000004dc2]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000]
> > +[0a8f394fe0738abf7e2f058408004501021c0001000040060186c0a87b02c0a87b01d4781451000001f400000000501000004bce]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000]
> > +[0a8f394fe0738abf7e2f058408004501021c0002000040060185c0a87b02c0a87b01d4781451000003e8000000005010000049da]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000]
> > +[0a8f394fe0738abf7e2f058408004501021c0003000040060184c0a87b02c0a87b01d4781451000005dc000000005010000047e6]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000]
> > +[0a8f394fe0738abf7e2f05840800450107f8000000004006fbaac0a87b02c0a87b01d478145100000000000000005010000047e6]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
> > +[0000000000000000000000000000000000000000000000000000]
> > +])
>
> This is a little wild. :)
>
> We should shorten that.  For exmaple, we could do:
>
> zero500=$(printf '0%.0s' $(seq 500))
>
> AT_CHECK_UNQUOTED([ovs-pcap p2.pcap], [0], [dnl
> [0a8f394fe0738abf7e2f058408004501021c0000000040060187c0a87b02c0a87b01]dnl
> [d47814510000000000000000501000004dc200${zero500}]
> [0a8f394fe0738abf7e2f058408004501021c0001000040060186c0a87b02c0a87b01]dnl
> [d4781451000001f400000000501000004bce00${zero500}]
> [0a8f394fe0738abf7e2f058408004501021c0002000040060185c0a87b02c0a87b01]dnl
> [d4781451000003e8000000005010000049da00${zero500}]
> [0a8f394fe0738abf7e2f058408004501021c0003000040060184c0a87b02c0a87b01]dnl
> [d4781451000005dc000000005010000047e600${zero500}]
> [0a8f394fe0738abf7e2f05840800450107f8000000004006fbaac0a87b02c0a87b01]dnl
> [d478145100000000000000005010000047e600${zero500}${zero500}${zero500}${zero500}]
> ])
>
> I didn't really test that, but, I think, some variation of that should work.
> We do similar things in odp.at while generating large actions, for example.
>
> BTW, we should also have a version of that test for IPv6.  I think there
> is a bug in dp_packet_gso() function while calculating payload length for
> IPv6 header.  It looks wrong that it is exactly the same as in IPv4 case,
> even using sizeof of IPv4 header structure:
>
>             ip6_hdr->ip6_ctlun.ip6_un1.ip6_un1_plen
>                 = htons(sizeof *ip_hdr + dp_packet_l4_size(seg));
>
> That can be a separate fix though.

I will include a v6 test in the next version, because you're right.


Thanks,
M

>
> Best regrads, Ilya Maximets.
>
diff mbox series

Patch

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 8c6e6d448..9d9a28892 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -44,6 +44,7 @@ 
 #include "unaligned.h"
 #include "timeval.h"
 #include "unixctl.h"
+#include "userspace-tso.h"
 #include "reconnect.h"
 
 VLOG_DEFINE_THIS_MODULE(netdev_dummy);
@@ -152,6 +153,8 @@  struct netdev_dummy {
     bool ol_ip_csum OVS_GUARDED;
     /* Flag RX packet with good csum. */
     bool ol_ip_csum_set_good OVS_GUARDED;
+    /* Set the segment size for netdev TSO support. */
+    int ol_tso_segsz OVS_GUARDED;
 };
 
 /* Max 'recv_queue_len' in struct netdev_dummy. */
@@ -806,6 +809,10 @@  netdev_dummy_get_config(const struct netdev *dev, struct smap *args)
         smap_add_format(args, "ol_ip_csum_set_good", "%s", "true");
     }
 
+    if (netdev->ol_tso_segsz && userspace_tso_enabled()) {
+        smap_add_format(args, "ol_tso_segsz", "%d", netdev->ol_tso_segsz);
+    }
+
     /* 'dummy-pmd' specific config. */
     if (!netdev_is_pmd(dev)) {
         goto exit;
@@ -937,6 +944,14 @@  netdev_dummy_set_config(struct netdev *netdev_, const struct smap *args,
         netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM;
     }
 
+    if (userspace_tso_enabled()) {
+        netdev->ol_tso_segsz = smap_get_int(args, "ol_tso_segsz", 0);
+        if (netdev->ol_tso_segsz) {
+            netdev_->ol_flags |= (NETDEV_TX_OFFLOAD_TCP_TSO
+                                  | NETDEV_TX_OFFLOAD_TCP_CKSUM);
+        }
+    }
+
     netdev_change_seq_changed(netdev_);
 
     /* 'dummy-pmd' specific config. */
@@ -1119,6 +1134,15 @@  netdev_dummy_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch,
         /* The netdev hardware sets the flag when the packet has good csum. */
         dp_packet_ol_set_ip_csum_good(packet);
     }
+
+    if (userspace_tso_enabled() && netdev->ol_tso_segsz) {
+        dp_packet_set_tso_segsz(packet, netdev->ol_tso_segsz);
+        dp_packet_hwol_set_tcp_seg(packet);
+        dp_packet_hwol_set_tx_ip_csum(packet);
+        dp_packet_hwol_set_tx_ipv4(packet);
+        dp_packet_hwol_set_csum_tcp(packet);
+    }
+
     ovs_mutex_unlock(&netdev->mutex);
 
     dp_packet_batch_init_packet(batch, packet);
@@ -1174,6 +1198,12 @@  netdev_dummy_send(struct netdev *netdev, int qid,
     DP_PACKET_BATCH_FOR_EACH(i, packet, batch) {
         const void *buffer = dp_packet_data(packet);
         size_t size = dp_packet_size(packet);
+        bool is_tso;
+
+        ovs_mutex_lock(&dev->mutex);
+        is_tso = userspace_tso_enabled() && dev->ol_tso_segsz &&
+                 dp_packet_hwol_is_tso(packet);
+        ovs_mutex_unlock(&dev->mutex);
 
         if (!dp_packet_is_eth(packet)) {
             error = EPFNOSUPPORT;
@@ -1194,7 +1224,7 @@  netdev_dummy_send(struct netdev *netdev, int qid,
             if (eth->eth_type == htons(ETH_TYPE_VLAN)) {
                 max_size += VLAN_HEADER_LEN;
             }
-            if (size > max_size) {
+            if (size > max_size && !is_tso) {
                 error = EMSGSIZE;
                 break;
             }
diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
index d0359b5ea..e0d81e7d4 100644
--- a/tests/dpif-netdev.at
+++ b/tests/dpif-netdev.at
@@ -810,6 +810,128 @@  AT_CHECK_UNQUOTED([tail -n 1 p2.pcap.txt], [0], [${good_expected}
 OVS_VSWITCHD_STOP
 AT_CLEANUP
 
+AT_SETUP([userspace offload - tso])
+OVS_VSWITCHD_START(
+  [set Open_vSwitch . other_config:userspace-tso-enable=true -- \
+   add-br br1 -- set bridge br1 datapath-type=dummy -- \
+   add-port br1 p1 -- \
+       set Interface p1 type=dummy -- \
+   add-port br1 p2 -- \
+       set Interface p2 type=dummy])
+
+dnl Simple passthrough rule.
+AT_CHECK([ovs-ofctl add-flow br1 in_port=p1,actions=output:p2])
+
+flow_s="in_port(1),eth(src=8a:bf:7e:2f:05:84,dst=0a:8f:39:4f:e0:73),eth_type(0x0800), \
+        ipv4(src=192.168.123.2,dst=192.168.123.1,proto=6,tos=1,ttl=64,frag=no), \
+        tcp(src=54392,dst=5201),tcp_flags(ack)"
+
+dnl Send from tso to no-tso.
+AT_CHECK([ovs-vsctl set Interface p2 options:tx_pcap=p2.pcap -- \
+                    set Interface p1 options:ol_ip_csum=true -- \
+                    set Interface p1 options:ol_ip_csum_set_good=false -- \
+                    set Interface p1 options:ol_tso_segsz=500])
+
+AT_CHECK([ovs-appctl netdev-dummy/receive p1 "${flow_s}" --len 2054])
+
+dnl Send from tso to tso.
+AT_CHECK([ovs-vsctl set Interface p2 options:ol_ip_csum=true -- \
+                    set Interface p2 options:ol_ip_csum_set_good=false -- \
+                    set Interface p2 options:ol_tso_segsz=500])
+
+AT_CHECK([ovs-appctl netdev-dummy/receive p1 "${flow_s}" --len 2054])
+
+dnl Check that first we have 4x 500 byte payloads, then one 2000 byte payload.
+AT_CHECK([ovs-pcap p2.pcap], [0], [dnl
+[0a8f394fe0738abf7e2f058408004501021c0000000040060187c0a87b02c0a87b01d47814510000000000000000501000004dc2]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000]
+[0a8f394fe0738abf7e2f058408004501021c0001000040060186c0a87b02c0a87b01d4781451000001f400000000501000004bce]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000]
+[0a8f394fe0738abf7e2f058408004501021c0002000040060185c0a87b02c0a87b01d4781451000003e8000000005010000049da]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000]
+[0a8f394fe0738abf7e2f058408004501021c0003000040060184c0a87b02c0a87b01d4781451000005dc000000005010000047e6]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000]
+[0a8f394fe0738abf7e2f05840800450107f8000000004006fbaac0a87b02c0a87b01d478145100000000000000005010000047e6]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]dnl
+[0000000000000000000000000000000000000000000000000000]
+])
+
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
 AT_SETUP([dpif-netdev - revalidators handle dp modification fail correctly])
 OVS_VSWITCHD_START(
   [add-port br0 p1 \