Allow tunnel vports to be configured as tunnels over IPv6 by using
OVS_TUNNEL_ATTR_OVER_IPV6 option. For now, reject such tunnels. The support
to individual tunnel types will be added by subsequent patches.

Signed-off-by: Jiri Benc <[email protected]>
---
 include/uapi/linux/openvswitch.h | 1 +
 net/openvswitch/vport-geneve.c   | 5 +++++
 net/openvswitch/vport-gre.c      | 3 +++
 net/openvswitch/vport-vxlan.c    | 5 +++++
 4 files changed, 14 insertions(+)

diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
index 4d26da40b01f..ba7ae3b05308 100644
--- a/include/uapi/linux/openvswitch.h
+++ b/include/uapi/linux/openvswitch.h
@@ -267,6 +267,7 @@ enum {
        OVS_TUNNEL_ATTR_UNSPEC,
        OVS_TUNNEL_ATTR_DST_PORT, /* 16-bit UDP port, used by L4 tunnels. */
        OVS_TUNNEL_ATTR_EXTENSION,
+       OVS_TUNNEL_ATTR_OVER_IPV6,/* when present, tunneling over IPv6 */
        __OVS_TUNNEL_ATTR_MAX
 };
 
diff --git a/net/openvswitch/vport-geneve.c b/net/openvswitch/vport-geneve.c
index 2e5bf299ac4c..893f03b3f864 100644
--- a/net/openvswitch/vport-geneve.c
+++ b/net/openvswitch/vport-geneve.c
@@ -142,6 +142,11 @@ static struct vport *geneve_tnl_create(const struct 
vport_parms *parms)
                err = -EINVAL;
                goto error;
        }
+       a = nla_find_nested(options, OVS_TUNNEL_ATTR_OVER_IPV6);
+       if (a) {
+               err = -EAFNOSUPPORT;
+               goto error;
+       }
 
        vport = ovs_vport_alloc(sizeof(struct geneve_port),
                                &ovs_geneve_vport_ops, parms);
diff --git a/net/openvswitch/vport-gre.c b/net/openvswitch/vport-gre.c
index 715bd1bc3328..a34a2da15d43 100644
--- a/net/openvswitch/vport-gre.c
+++ b/net/openvswitch/vport-gre.c
@@ -237,10 +237,13 @@ static const char *gre_get_name(const struct vport *vport)
 static struct vport *gre_create(const struct vport_parms *parms)
 {
        struct net *net = ovs_dp_get_net(parms->dp);
+       struct nlattr *options = parms->options;
        struct ovs_net *ovs_net;
        struct vport *vport;
        int err;
 
+       if (options && nla_find_nested(options, OVS_TUNNEL_ATTR_OVER_IPV6))
+               return ERR_PTR(-EAFNOSUPPORT);
        err = gre_init();
        if (err)
                return ERR_PTR(err);
diff --git a/net/openvswitch/vport-vxlan.c b/net/openvswitch/vport-vxlan.c
index c7e5e61779d4..2a3e5a663e08 100644
--- a/net/openvswitch/vport-vxlan.c
+++ b/net/openvswitch/vport-vxlan.c
@@ -171,6 +171,11 @@ static struct vport *vxlan_tnl_create(const struct 
vport_parms *parms)
                err = -EINVAL;
                goto error;
        }
+       a = nla_find_nested(options, OVS_TUNNEL_ATTR_OVER_IPV6);
+       if (a) {
+               err = -EAFNOSUPPORT;
+               goto error;
+       }
 
        vport = ovs_vport_alloc(sizeof(struct vxlan_port),
                                &ovs_vxlan_vport_ops, parms);
-- 
1.8.3.1

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to