]> git.proxmox.com Git - ovs.git/commitdiff
ip6gre: Add ip6gre vport type
authorGreg Rose <gvrose8192@gmail.com>
Fri, 4 May 2018 17:14:44 +0000 (10:14 -0700)
committerBen Pfaff <blp@ovn.org>
Tue, 22 May 2018 03:33:30 +0000 (20:33 -0700)
Add handlers for OVS_VPORT_TYPE_IP6GRE

Cc: Ben Pfaff <blp@ovn.org>
Signed-off-by: Greg Rose <gvrose8192@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: William Tu <u9012063@gmail.com>
lib/dpif-netlink-rtnl.c
lib/dpif-netlink.c
lib/netdev-native-tnl.c
lib/netdev-vport.c
lib/odp-util.c
lib/tnl-ports.c

index 817e54483deea8071a83874c1ab3b4e015b2d352..bec3fce91e386b14b0ce9d738a8c94791b009cc3 100644 (file)
@@ -104,6 +104,7 @@ vport_type_to_kind(enum ovs_vport_type type,
     case OVS_VPORT_TYPE_IP6ERSPAN:
         return "ip6erspan";
     case OVS_VPORT_TYPE_IP6GRE:
+        return "ip6gre";
     case OVS_VPORT_TYPE_NETDEV:
     case OVS_VPORT_TYPE_INTERNAL:
     case OVS_VPORT_TYPE_LISP:
@@ -349,7 +350,8 @@ dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
     nl_msg_end_nested(&request, linkinfo_off);
 
     err = nl_transact(NETLINK_ROUTE, &request, NULL);
-    if (!err && type == OVS_VPORT_TYPE_GRE) {
+    if (!err && (type == OVS_VPORT_TYPE_GRE ||
+                 type == OVS_VPORT_TYPE_IP6GRE)) {
         /* Work around a bug in kernel GRE driver, which ignores IFLA_MTU in
          * RTM_NEWLINK, by setting the MTU again.  See
          * https://bugzilla.redhat.com/show_bug.cgi?id=1488484. */
index f5ae21ed352c7eb23031c40d09f491e1485d0e1f..607b497284376a53b4980c297b81f4ee0d3ce56a 100644 (file)
@@ -791,9 +791,10 @@ get_vport_type(const struct dpif_netlink_vport *vport)
         return "erspan";
 
     case OVS_VPORT_TYPE_IP6ERSPAN:
-        return "ip6erspan";
+        return "ip6erspan"; 
+
     case OVS_VPORT_TYPE_IP6GRE:
-       return "";
+        return "ip6gre";
 
     case OVS_VPORT_TYPE_UNSPEC:
     case __OVS_VPORT_TYPE_MAX:
@@ -826,6 +827,8 @@ netdev_to_ovs_vport_type(const char *type)
         return OVS_VPORT_TYPE_ERSPAN;
     } else if (!strcmp(type, "ip6erspan")) {
         return OVS_VPORT_TYPE_IP6ERSPAN;
+    } else if (!strcmp(type, "ip6gre")) {
+        return OVS_VPORT_TYPE_IP6GRE;
     } else {
         return OVS_VPORT_TYPE_UNSPEC;
     }
index 66eb18ef9b0dae911e679ea274c2cfcd71ec5a68..c70811eaff21d14e6d2244801dc57f4273311d71 100644 (file)
@@ -513,7 +513,11 @@ netdev_gre_build_header(const struct netdev *netdev,
     hlen = (uint8_t *) options - (uint8_t *) greh;
 
     data->header_len += hlen;
-    data->tnl_type = OVS_VPORT_TYPE_GRE;
+    if (!params->is_ipv6) {
+        data->tnl_type = OVS_VPORT_TYPE_GRE;
+    } else {
+        data->tnl_type = OVS_VPORT_TYPE_IP6GRE;
+    }
     return 0;
 }
 
@@ -552,7 +556,7 @@ netdev_erspan_pop_header(struct dp_packet *packet)
     }
 
     ersh = ERSPAN_HDR(greh);
-    tnl->tun_id = be32_to_be64(be16_to_be32(htons(get_sid(ersh))));
+    tnl->tun_id = be16_to_be64(htons(get_sid(ersh)));
     tnl->erspan_ver = ersh->ver;
 
     if (ersh->ver == 1) {
index 4311d2b8843c2d56dc229874de4bfc74a5850491..805f130d4af1a846c45b62d7ea34921b24f6bcd9 100644 (file)
@@ -1042,6 +1042,10 @@ netdev_vport_tunnel_register(void)
                                                    netdev_erspan_push_header,
                                                    netdev_erspan_pop_header,
                                                    NULL),
+        TUNNEL_CLASS("ip6gre", "ip6gre_sys", netdev_gre_build_header,
+                                             netdev_gre_push_header,
+                                             netdev_gre_pop_header,
+                                             NULL),
     };
     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
 
index 9c2b2c12e066ee25a796040e43227403040175c1..105ac809073e85e498d430e652cf339ed4fdcfb4 100644 (file)
@@ -690,7 +690,8 @@ format_odp_tnl_push_header(struct ds *ds, struct ovs_action_push_tnl *data)
         }
 
         ds_put_char(ds, ')');
-    } else if (data->tnl_type == OVS_VPORT_TYPE_GRE) {
+    } else if (data->tnl_type == OVS_VPORT_TYPE_GRE ||
+               data->tnl_type == OVS_VPORT_TYPE_IP6GRE) {
         const struct gre_base_hdr *greh;
         ovs_16aligned_be32 *options;
 
@@ -1559,7 +1560,11 @@ ovs_parse_tnl_push(const char *s, struct ovs_action_push_tnl *data)
     } else if (ovs_scan_len(s, &n, "gre((flags=0x%"SCNx16",proto=0x%"SCNx16")",
                             &gre_flags, &gre_proto)){
 
-        tnl_type = OVS_VPORT_TYPE_GRE;
+        if (eth->eth_type == htons(ETH_TYPE_IP)) {
+            tnl_type = OVS_VPORT_TYPE_GRE;
+        } else {
+            tnl_type = OVS_VPORT_TYPE_IP6GRE;
+        }
         greh->flags = htons(gre_flags);
         greh->protocol = htons(gre_proto);
         ovs_16aligned_be32 *options = (ovs_16aligned_be32 *) (greh + 1);
index 57531794c969d045d39aa74390e0160feef8abf7..17353046cc6ed9a29a75683cf22041318b764117 100644 (file)
@@ -172,7 +172,7 @@ tnl_type_to_nw_proto(const char type[])
         return IPPROTO_TCP;
     }
     if (!strcmp(type, "gre") || !strcmp(type, "erspan") ||
-        !strcmp(type, "ip6erspan")) {
+        !strcmp(type, "ip6erspan") || !strcmp(type, "ip6gre")) {
         return IPPROTO_GRE;
     }
     if (!strcmp(type, "vxlan")) {