[ovs-dev] [PATCH v7 2/3] userspace: L3 tunnel support for GRE and LISP
Zoltán Balogh
zoltan.balogh at ericsson.com
Fri May 26 08:45:48 UTC 2017
Hi,
Please have a look at v8:
https://mail.openvswitch.org/pipermail/ovs-dev/2017-May/332897.html
Best regards,
Zoltan
> -----Original Message-----
> From: ovs-dev-bounces at openvswitch.org [mailto:ovs-dev-bounces at openvswitch.org] On Behalf Of Zoltán Balogh
> Sent: Thursday, May 25, 2017 5:38 PM
> To: 'dev at openvswitch.org' <dev at openvswitch.org>
> Subject: [ovs-dev] [PATCH v7 2/3] userspace: L3 tunnel support for GRE and LISP
>
> From: Jan Scheurich <jan.scheurich at ericsson.com>
>
> Add a boolean "layer3" configuration option for tunnel vports.
> The layer3 option defaults to false for all ports except LISP.
> GRE ports accept both true and false for "layer3".
>
> A tunnel vport configured with layer3=true receives L3 packets.
> which are then converted to Ethernet packets by pushing a dummy
> Ethernet heder at the ingress of the OpenFlow pipeline. The
> Ethernet header of a packet is stripped before sending to a
> layer3 tunnel vport.
>
> Presently a single GRE vport cannot carry both L2 and L3 packets.
> But it is possible to create two GRE vports representing the same
> GRE tunel, one with layer3=false, the other with layer3=true.
> L2 packet from the tunnel are received on the first vport, L3
> packets on the second. The controller must send packets to the
> layer3 GRE vport to tunnel them without their Ethernet header.
>
> Units tests have been added to check the L3 tunnel handling.
>
> LISP tunnels are not yet supported by the netdev userspace datapath.
>
> Signed-off-by: Simon Horman <simon.horman at netronome.com>
> Signed-off-by: Jiri Benc <jbenc at redhat.com>
> Signed-off-by: Yi Yang <yi.y.yang at intel.com>
> Signed-off-by: Jan Scheurich <jan.scheurich at ericsson.com>
> Co-authored-by: Zoltan Balogh <zoltan.balogh at ericsson.com>
> ---
> NEWS | 6 ++++++
> lib/netdev-native-tnl.c | 28 +++++++++++++++++++++++-----
> lib/netdev-vport.c | 14 ++++++++++++--
> ofproto/tunnel.c | 14 +++++++++++---
> tests/tunnel-push-pop-ipv6.at | 16 +++++++++++-----
> tests/tunnel-push-pop.at | 33 ++++++++++++++++++++++++++++-----
> vswitchd/vswitch.xml | 13 +++++++++++++
> 7 files changed, 104 insertions(+), 20 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index 25eb477..bbed787 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -45,6 +45,12 @@ Post-v2.7.0
> - Fedora Packaging:
> * OVN services are no longer restarted automatically after upgrade.
> - Add --cleanup option to command 'ovs-appctl exit' (see ovs-vswitchd(8)).
> + - L3 tunneling:
> + * Add "layer3" options for tunnel ports that support non-Ethernet (L3)
> + payload (GRE, VXLAN-GPE).
> + * New vxlan tunnel extension "gpe" to support VXLAN-GPE tunnels.
> + * Transparently pop and push Ethernet headers at transmit/reception
> + of packets to/from L3 tunnels.
>
> v2.7.0 - 21 Feb 2017
> ---------------------
> diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
> index 2798324..0651322 100644
> --- a/lib/netdev-native-tnl.c
> +++ b/lib/netdev-native-tnl.c
> @@ -154,6 +154,10 @@ netdev_tnl_push_ip_header(struct dp_packet *packet,
> *ip_tot_size = dp_packet_size(packet) - sizeof (struct eth_header);
>
> memcpy(eth, header, size);
> + /* The encapsulated packet has type Ethernet. Adjust dp_packet. */
> + packet->packet_type = htonl(PT_ETH);
> + dp_packet_reset_offsets(packet);
> + packet->l3_ofs = sizeof (struct eth_header);
>
> if (netdev_tnl_is_header_ipv6(header)) {
> ip6 = netdev_tnl_ipv6_hdr(eth);
> @@ -345,6 +349,7 @@ parse_gre_header(struct dp_packet *packet,
> ovs_16aligned_be32 *options;
> int hlen;
> unsigned int ulen;
> + uint16_t greh_protocol;
>
> greh = netdev_tnl_ip_extract_tnl_md(packet, tnl, &ulen);
> if (!greh) {
> @@ -355,10 +360,6 @@ parse_gre_header(struct dp_packet *packet,
> return -EINVAL;
> }
>
> - if (greh->protocol != htons(ETH_TYPE_TEB)) {
> - return -EINVAL;
> - }
> -
> hlen = ulen + gre_header_len(greh->flags);
> if (hlen > dp_packet_size(packet)) {
> return -EINVAL;
> @@ -388,6 +389,17 @@ parse_gre_header(struct dp_packet *packet,
> options++;
> }
>
> + /* Set the new packet type depending on the GRE protocol field. */
> + greh_protocol = ntohs(greh->protocol);
> + if (greh_protocol == ETH_TYPE_TEB) {
> + packet->packet_type = htonl(PT_ETH);
> + } else if (greh_protocol >= ETH_TYPE_MIN) {
> + /* Allow all GRE protocol values above 0x5ff as Ethertypes. */
> + packet->packet_type = PACKET_TYPE_BE(OFPHTN_ETHERTYPE, greh_protocol);
> + } else {
> + return -EINVAL;
> + }
> +
> return hlen;
> }
>
> @@ -451,7 +463,11 @@ netdev_gre_build_header(const struct netdev *netdev,
>
> greh = netdev_tnl_ip_build_header(data, params, IPPROTO_GRE);
>
> - greh->protocol = htons(ETH_TYPE_TEB);
> + if (tnl_cfg->is_layer3) {
> + greh->protocol = params->flow->dl_type;
> + } else {
> + greh->protocol = htons(ETH_TYPE_TEB);
> + }
> greh->flags = 0;
>
> options = (ovs_16aligned_be32 *) (greh + 1);
> @@ -504,6 +520,7 @@ netdev_vxlan_pop_header(struct dp_packet *packet)
> tnl->tun_id = htonll(ntohl(get_16aligned_be32(&vxh->vx_vni)) >> 8);
> tnl->flags |= FLOW_TNL_F_KEY;
>
> + packet->packet_type = htonl(PT_ETH);
> dp_packet_reset_packet(packet, hlen + VXLAN_HLEN);
>
> return packet;
> @@ -583,6 +600,7 @@ netdev_geneve_pop_header(struct dp_packet *packet)
> tnl->metadata.present.len = opts_len;
> tnl->flags |= FLOW_TNL_F_UDPIF;
>
> + packet->packet_type = htonl(PT_ETH);
> dp_packet_reset_packet(packet, hlen);
>
> return packet;
> diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
> index 84b9be3..ba69461 100644
> --- a/lib/netdev-vport.c
> +++ b/lib/netdev-vport.c
> @@ -410,7 +410,7 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args, char **errp)
> const char *name = netdev_get_name(dev_);
> const char *type = netdev_get_type(dev_);
> struct ds errors = DS_EMPTY_INITIALIZER;
> - bool needs_dst_port, has_csum;
> + bool needs_dst_port, has_csum, optional_layer3;
> uint16_t dst_proto = 0, src_proto = 0;
> struct netdev_tunnel_config tnl_cfg;
> struct smap_node *node;
> @@ -418,6 +418,7 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args, char **errp)
>
> has_csum = strstr(type, "gre") || strstr(type, "geneve") ||
> strstr(type, "stt") || strstr(type, "vxlan");
> + optional_layer3 = !strcmp(type, "gre");
> memset(&tnl_cfg, 0, sizeof tnl_cfg);
>
> /* Add a default destination port for tunnel ports if none specified. */
> @@ -431,6 +432,7 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args, char **errp)
>
> if (!strcmp(type, "lisp")) {
> tnl_cfg.dst_port = htons(LISP_DST_PORT);
> + tnl_cfg.is_layer3 = true;
> }
>
> if (!strcmp(type, "stt")) {
> @@ -518,6 +520,10 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args, char **errp)
> } else if (!strcmp(node->key, "egress_pkt_mark")) {
> tnl_cfg.egress_pkt_mark = strtoul(node->value, NULL, 10);
> tnl_cfg.set_egress_pkt_mark = true;
> + } else if (!strcmp(node->key, "layer3") && optional_layer3) {
> + if (!strcmp(node->value, "true")) {
> + tnl_cfg.is_layer3 = true;
> + }
> } else {
> ds_put_format(&errors, "%s: unknown %s argument '%s'\n",
> name, type, node->key);
> @@ -587,6 +593,7 @@ static int
> get_tunnel_config(const struct netdev *dev, struct smap *args)
> {
> struct netdev_vport *netdev = netdev_vport_cast(dev);
> + const char *type = netdev_get_type(dev);
> struct netdev_tunnel_config tnl_cfg;
>
> ovs_mutex_lock(&netdev->mutex);
> @@ -640,7 +647,6 @@ get_tunnel_config(const struct netdev *dev, struct smap *args)
>
> if (tnl_cfg.dst_port) {
> uint16_t dst_port = ntohs(tnl_cfg.dst_port);
> - const char *type = netdev_get_type(dev);
>
> if ((!strcmp("geneve", type) && dst_port != GENEVE_DST_PORT) ||
> (!strcmp("vxlan", type) && dst_port != VXLAN_DST_PORT) ||
> @@ -654,6 +660,10 @@ get_tunnel_config(const struct netdev *dev, struct smap *args)
> smap_add(args, "csum", "true");
> }
>
> + if (tnl_cfg.is_layer3 && !strcmp("gre", type)) {
> + smap_add(args, "layer3", "true");
> + }
> +
> if (!tnl_cfg.dont_fragment) {
> smap_add(args, "df_default", "false");
> }
> diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c
> index 3d02005..0da4f42 100644
> --- a/ofproto/tunnel.c
> +++ b/ofproto/tunnel.c
> @@ -38,6 +38,7 @@
> #include "openvswitch/vlog.h"
> #include "unaligned.h"
> #include "ofproto-dpif.h"
> +#include "netdev-vport.h"
>
> VLOG_DEFINE_THIS_MODULE(tunnel);
>
> @@ -49,6 +50,7 @@ struct tnl_match {
> bool in_key_flow;
> bool ip_src_flow;
> bool ip_dst_flow;
> + bool is_layer3;
> };
>
> struct tnl_port {
> @@ -162,6 +164,7 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev,
> tnl_port->match.ip_dst_flow = cfg->ip_dst_flow;
> tnl_port->match.in_key_flow = cfg->in_key_flow;
> tnl_port->match.odp_port = odp_port;
> + tnl_port->match.is_layer3 = netdev_vport_is_layer3(netdev);
>
> map = tnl_match_map(&tnl_port->match);
> existing_port = tnl_find_exact(&tnl_port->match, *map);
> @@ -205,7 +208,8 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev,
> * Returns 0 if successful, otherwise a positive errno value. */
> int
> tnl_port_add(const struct ofport_dpif *ofport, const struct netdev *netdev,
> - odp_port_t odp_port, bool native_tnl, const char name[]) OVS_EXCLUDED(rwlock)
> + odp_port_t odp_port, bool native_tnl, const char name[])
> + OVS_EXCLUDED(rwlock)
> {
> bool ok;
>
> @@ -232,7 +236,8 @@ tnl_port_reconfigure(const struct ofport_dpif *ofport,
> fat_rwlock_wrlock(&rwlock);
> tnl_port = tnl_find_ofport(ofport);
> if (!tnl_port) {
> - changed = tnl_port_add__(ofport, netdev, odp_port, false, native_tnl, name);
> + changed = tnl_port_add__(ofport, netdev, odp_port, false, native_tnl,
> + name);
> } else if (tnl_port->netdev != netdev
> || tnl_port->match.odp_port != odp_port
> || tnl_port->change_seq != netdev_get_change_seq(tnl_port->netdev)) {
> @@ -383,7 +388,6 @@ tnl_wc_init(struct flow *flow, struct flow_wildcards *wc)
> }
> /* Match on packet_type for tunneled packets.*/
> wc->masks.packet_type = OVS_BE32_MAX;
> -
> }
> }
>
> @@ -562,6 +566,7 @@ tnl_find(const struct flow *flow) OVS_REQ_RDLOCK(rwlock)
> match.in_key_flow = in_key_flow;
> match.ip_dst_flow = ip_dst_flow;
> match.ip_src_flow = ip_src == IP_SRC_FLOW;
> + match.is_layer3 = flow->packet_type != htonl(PT_ETH);
>
> tnl_port = tnl_find_exact(&match, map);
> if (tnl_port) {
> @@ -611,6 +616,9 @@ tnl_match_fmt(const struct tnl_match *match, struct ds *ds)
> } else {
> ds_put_format(ds, ", key=%#"PRIx64, ntohll(match->in_key));
> }
> + if (match->is_layer3) {
> + ds_put_cstr(ds, ", layer3");
> + }
>
> ds_put_format(ds, ", dp port=%"PRIu32, match->odp_port);
> }
> diff --git a/tests/tunnel-push-pop-ipv6.at b/tests/tunnel-push-pop-ipv6.at
> index 12c16de..cbeb578 100644
> --- a/tests/tunnel-push-pop-ipv6.at
> +++ b/tests/tunnel-push-pop-ipv6.at
> @@ -12,6 +12,8 @@ AT_CHECK([ovs-vsctl add-port int-br t2 -- set Interface t2 type=vxlan \
> options:remote_ip=2001:cafe::93 options:out_key=flow options:csum=true ofport_request=4\
> -- add-port int-br t4 -- set Interface t4 type=geneve \
> options:remote_ip=flow options:key=123 ofport_request=5\
> + -- add-port int-br t5 -- set Interface t5 type=gre \
> + options:remote_ip=2001:cafe::92 options:key=455 options:layer3=true ofport_request=6\
> ], [0])
>
> AT_CHECK([ovs-appctl dpif/show], [0], [dnl
> @@ -25,6 +27,7 @@ dummy at ovs-dummy: hit:0 missed:0
> t2 2/4789: (vxlan: key=123, remote_ip=2001:cafe::92)
> t3 4/4789: (vxlan: csum=true, out_key=flow, remote_ip=2001:cafe::93)
> t4 5/6081: (geneve: key=123, remote_ip=flow)
> + t5 6/3: (gre: key=455, layer3=true, remote_ip=2001:cafe::92)
> ])
>
> dnl First setup dummy interface IP address, then add the route
> @@ -124,18 +127,21 @@ AT_CHECK([tail -1 stdout], [0],
>
> dnl Check decapsulation of GRE packet
> AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6486dd60000000006a2f402001cafe0000000000000000000000922001cafe0000000000000000000000882000655
> 8000001c8fe71d883724fbeb6f4e1494a080045000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010
> 000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6486dd60000000006a2f402001cafe0000000000000000000000922001cafe0000000000000000000000882000655
> 8000001c8fe71d883724fbeb6f4e1494a080045000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010
> 000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
> ovs-appctl time/warp 1000
>
> AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port 3'], [0], [dnl
> - port 3: rx pkts=1, bytes=98, drop=?, errs=?, frame=?, over=?, crc=?
> + port 3: rx pkts=2, bytes=196, drop=?, errs=?, frame=?, over=?, crc=?
> ])
>
> -dnl Check GRE only accepts encapsulated Ethernet frames
> -AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6486dd60000000006a2f402001cafe0000000000000000000000922001cafe0000000000000000000000882000080
> 0000001c8fe71d883724fbeb6f4e1494a080045000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010
> 000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +dnl Check decapsulation of L3GRE packet
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6486dd60000000005a2f402001cafe0000000000000000000000922001cafe0000000000000000000000882000080
> 0000001c745000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f2650100000000001011121314151617181
> 91a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6486dd60000000005a2f402001cafe0000000000000000000000922001cafe0000000000000000000000882000080
> 0000001c745000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f2650100000000001011121314151617181
> 91a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +ovs-appctl time/warp 1000
> ovs-appctl time/warp 1000
>
> -AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port 3'], [0], [dnl
> - port 3: rx pkts=1, bytes=98, drop=?, errs=?, frame=?, over=?, crc=?
> +AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port 6'], [0], [dnl
> + port 6: rx pkts=2, bytes=168, drop=?, errs=?, frame=?, over=?, crc=?
> ])
>
> dnl Check decapsulation of Geneve packet with options
> diff --git a/tests/tunnel-push-pop.at b/tests/tunnel-push-pop.at
> index 03fe4d8..afa345e 100644
> --- a/tests/tunnel-push-pop.at
> +++ b/tests/tunnel-push-pop.at
> @@ -14,6 +14,8 @@ AT_CHECK([ovs-vsctl add-port int-br t2 -- set Interface t2 type=vxlan \
> options:remote_ip=flow options:key=123 ofport_request=5\
> -- add-port int-br t5 -- set Interface t5 type=geneve \
> options:remote_ip=1.1.2.93 options:out_key=flow options:egress_pkt_mark=1234
> ofport_request=6\
> + -- add-port int-br t6 -- set Interface t6 type=gre \
> + options:remote_ip=1.1.2.92 options:key=456 options:layer3=true ofport_request=7\
> ], [0])
>
> AT_CHECK([ovs-appctl dpif/show], [0], [dnl
> @@ -28,6 +30,7 @@ dummy at ovs-dummy: hit:0 missed:0
> t3 4/4789: (vxlan: csum=true, out_key=flow, remote_ip=1.1.2.93)
> t4 5/6081: (geneve: key=123, remote_ip=flow)
> t5 6/6081: (geneve: egress_pkt_mark=1234, out_key=flow, remote_ip=1.1.2.93)
> + t6 7/3: (gre: key=456, layer3=true, remote_ip=1.1.2.92)
> ])
>
> dnl First setup dummy interface IP address, then add the route
> @@ -124,6 +127,13 @@ AT_CHECK([tail -1 stdout], [0],
> [Datapath actions:
> tnl_push(tnl_port(3),header(size=42,type=3,eth(dst=f8:bc:12:44:34:b6,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=
> 1.1.2.88,dst=1.1.2.92,proto=47,tos=0,ttl=64,frag=0x4000),gre((flags=0x2000,proto=0x6558),key=0x1c8)),out_port(100))
> ])
>
> +dnl Check L3GRE tunnel push
> +AT_CHECK([ovs-ofctl add-flow int-br action=7])
> +AT_CHECK([ovs-appctl ofproto/trace ovs-dummy
> 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:01),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=
> 47,tos=0,ttl=64,frag=no)'], [0], [stdout])
> +AT_CHECK([tail -1 stdout], [0],
> + [Datapath actions:
> pop_eth,tnl_push(tnl_port(3),header(size=42,type=3,eth(dst=f8:bc:12:44:34:b6,src=aa:55:aa:55:00:00,dl_type=0x0800),i
> pv4(src=1.1.2.88,dst=1.1.2.92,proto=47,tos=0,ttl=64,frag=0x4000),gre((flags=0x2000,proto=0x800),key=0x1c8)),out_port
> (100))
> +])
> +
> dnl Check Geneve tunnel push
> AT_CHECK([ovs-ofctl add-flow int-br "actions=set_field:1.1.2.92->tun_dst,5"])
> AT_CHECK([ovs-appctl ofproto/trace ovs-dummy
> 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=
> 47,tos=0,ttl=64,frag=no)'], [0], [stdout])
> @@ -148,18 +158,31 @@ AT_CHECK([tail -1 stdout], [0],
>
> dnl Check decapsulation of GRE packet
> AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007e79464000402fba550101025c0101025820006558000001c8fe71d883724fbeb6f4e1494a0800450
> 00054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1
> f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007e79464000402fba550101025c0101025820006558000001c8fe71d883724fbeb6f4e1494a0800450
> 00054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1
> f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007e79464000402fba550101025c0101025820006558000001c8fe71d883724fbeb6f4e1494a0800450
> 00054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1
> f202122232425262728292a2b2c2d2e2f3031323334353637'])
> ovs-appctl time/warp 1000
>
> AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port 3'], [0], [dnl
> - port 3: rx pkts=1, bytes=98, drop=?, errs=?, frame=?, over=?, crc=?
> + port 3: rx pkts=3, bytes=294, drop=?, errs=?, frame=?, over=?, crc=?
> ])
>
> -dnl Check GRE only accepts encapsulated Ethernet frames
> -AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007e79464000402fba550101025c0101025820000800000001c8fe71d883724fbeb6f4e1494a0800450
> 00054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1
> f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +dnl Check decapsulation of L3GRE packet
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007079464000402fba630101025c0101025820000800000001c845000054ba200000400184861e00000
> 11e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2
> d2e2f3031323334353637'])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007079464000402fba630101025c0101025820000800000001c845000054ba200000400184861e00000
> 11e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2
> d2e2f3031323334353637'])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007079464000402fba630101025c0101025820000800000001c845000054ba200000400184861e00000
> 11e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2
> d2e2f3031323334353637'])
> +ovs-appctl time/warp 1000
> ovs-appctl time/warp 1000
>
> -AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port 3'], [0], [dnl
> - port 3: rx pkts=1, bytes=98, drop=?, errs=?, frame=?, over=?, crc=?
> +AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port 7'], [0], [dnl
> + port 7: rx pkts=3, bytes=252, drop=?, errs=?, frame=?, over=?, crc=?
> +])
> +
> +dnl Check GREL3 only accepts non-fragmented packets?
> +AT_CHECK([ovs-appctl netdev-dummy/receive p0
> 'aa55aa550000001b213cab6408004500007e79464000402fba550101025c0101025820000800000001c8fe71d883724fbeb6f4e1494a0800450
> 00054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1
> f202122232425262728292a2b2c2d2e2f3031323334353637'])
> +
> +AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port [[37]]' | sort], [0], [dnl
> + port 3: rx pkts=3, bytes=294, drop=?, errs=?, frame=?, over=?, crc=?
> + port 7: rx pkts=3, bytes=252, drop=?, errs=?, frame=?, over=?, crc=?
> ])
>
> dnl Check decapsulation of Geneve packet with options
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index bb66cb5..92b2c79 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -2385,6 +2385,19 @@
>
> </group>
>
> + <group title="Tunnel Options: gre only">
> + <p>
> + <code>gre</code> interfaces support these options.
> + </p>
> +
> + <column name="options" key="layer3" type='{"type": "boolean"}'>
> + <p>
> + Optional. Packets are sent and received without an Ethernet
> + header present.
> + </p>
> + </column>
> + </group>
> +
> <group title="Tunnel Options: gre, geneve, and vxlan">
> <p>
> <code>gre</code>, <code>geneve</code>, and
> --
> 2.7.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
More information about the dev
mailing list