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 |
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 |
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>
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.
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 --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 \
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(-)