datapath: Allow GRE64 to use flow based tunneling.
authorJesse Gross <jesse@nicira.com>
Tue, 6 Nov 2012 21:22:28 +0000 (13:22 -0800)
committerJesse Gross <jesse@nicira.com>
Wed, 7 Nov 2012 07:27:55 +0000 (23:27 -0800)
There's no reason why GRE64 can't be configured using flow based
tunneling.  Since that's the direction we are moving, everything
should support that.  Once this special casing is removed, it's
possible to unify the tunnel parameter parsing code since both
GRE and CAPWAP are the same.

Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Kyle Mestery <kmestery@cisco.com>
datapath/tunnel.h
datapath/vport-capwap.c
datapath/vport-gre.c

index ef09162b9ca3254145170984cd17d24e657714b7..c2680571fb6bb75dc7fc5588d7bb7fc3810a5571 100644 (file)
@@ -201,4 +201,25 @@ static inline void tnl_tun_key_init(struct ovs_key_ipv4_tunnel *tun_key,
        tun_key->tun_flags = tun_flags;
 }
 
+static inline void tnl_get_param(const struct tnl_mutable_config *mutable,
+                                const struct ovs_key_ipv4_tunnel *tun_key,
+                                u32 *flags,  __be64 *out_key)
+{
+       if (tun_key->ipv4_dst) {
+               *flags = 0;
+
+               if (tun_key->tun_flags & OVS_TNL_F_KEY)
+                       *flags = TNL_F_OUT_KEY_ACTION;
+               if (tun_key->tun_flags & OVS_TNL_F_CSUM)
+                       *flags |= TNL_F_CSUM;
+               *out_key = tun_key->tun_id;
+       } else {
+               *flags = mutable->flags;
+               if (mutable->flags & TNL_F_OUT_KEY_ACTION)
+                       *out_key = tun_key->tun_id;
+               else
+                       *out_key = mutable->out_key;
+       }
+}
+
 #endif /* tunnel.h */
index f26d3ff942a0562fe56a838255146effc17c289a..8a89180e5722f71e16e506c53879fe1fcffb1efc 100644 (file)
@@ -155,28 +155,6 @@ static struct inet_frags frag_state = {
        .secret_interval = CAPWAP_FRAG_SECRET_INTERVAL,
 };
 
-static void get_capwap_param(const struct tnl_mutable_config *mutable,
-                       const struct ovs_key_ipv4_tunnel *tun_key,
-                       u32 *flags,  __be64 *out_key)
-{
-       if (tun_key->ipv4_dst) {
-               *flags = 0;
-
-               if (tun_key->tun_flags & OVS_TNL_F_KEY)
-                       *flags = TNL_F_OUT_KEY_ACTION;
-               if (tun_key->tun_flags & OVS_TNL_F_CSUM)
-                       *flags |= TNL_F_CSUM;
-               *out_key = tun_key->tun_id;
-       } else {
-               *flags = mutable->flags;
-               if (mutable->flags & TNL_F_OUT_KEY_ACTION)
-                       *out_key = tun_key->tun_id;
-               else
-                       *out_key = mutable->out_key;
-
-       }
-}
-
 static int capwap_hdr_len(const struct tnl_mutable_config *mutable,
                          const struct ovs_key_ipv4_tunnel *tun_key)
 {
@@ -184,7 +162,7 @@ static int capwap_hdr_len(const struct tnl_mutable_config *mutable,
        u32 flags;
        __be64 out_key;
 
-       get_capwap_param(mutable, tun_key, &flags, &out_key);
+       tnl_get_param(mutable, tun_key, &flags, &out_key);
 
        /* CAPWAP has no checksums. */
        if (flags & TNL_F_CSUM)
@@ -211,7 +189,7 @@ static struct sk_buff *capwap_build_header(const struct vport *vport,
        u32 flags;
        __be64 out_key;
 
-       get_capwap_param(mutable, tun_key, &flags, &out_key);
+       tnl_get_param(mutable, tun_key, &flags, &out_key);
 
        udph->source = htons(CAPWAP_SRC_PORT);
        udph->dest = htons(CAPWAP_DST_PORT);
index 45e38b003b415e77a767a51b1feef96121648209..7f8bc9a70bd5685e6d99b46fc00cf274b4d3e59f 100644 (file)
@@ -45,39 +45,14 @@ struct gre_base_hdr {
        __be16 protocol;
 };
 
-static void get_gre_param(const struct tnl_mutable_config *mutable,
-                       const struct ovs_key_ipv4_tunnel *tun_key,
-                       u32 *flags, u32 *tunnel_type, __be64 *out_key)
-{
-       if (tun_key->ipv4_dst) {
-               *flags = 0;
-
-               if (tun_key->tun_flags & OVS_TNL_F_KEY)
-                       *flags = TNL_F_OUT_KEY_ACTION;
-               if (tun_key->tun_flags & OVS_TNL_F_CSUM)
-                       *flags |= TNL_F_CSUM;
-               *tunnel_type = TNL_T_PROTO_GRE;
-               *out_key = tun_key->tun_id;
-       } else {
-               *flags = mutable->flags;
-               *tunnel_type = mutable->key.tunnel_type;
-               if (mutable->flags & TNL_F_OUT_KEY_ACTION)
-                       *out_key = tun_key->tun_id;
-               else
-                       *out_key = mutable->out_key;
-
-       }
-}
-
 static int gre_hdr_len(const struct tnl_mutable_config *mutable,
                       const struct ovs_key_ipv4_tunnel *tun_key)
 {
        int len;
        u32 flags;
-       u32 tunnel_type;
        __be64 out_key;
 
-       get_gre_param(mutable, tun_key, &flags, &tunnel_type, &out_key);
+       tnl_get_param(mutable, tun_key, &flags, &out_key);
        len = GRE_HEADER_SECTION;
 
        if (flags & TNL_F_CSUM)
@@ -85,11 +60,11 @@ static int gre_hdr_len(const struct tnl_mutable_config *mutable,
 
        /* Set key for GRE64 tunnels, even when key if is zero. */
        if (out_key ||
-           tunnel_type & TNL_T_PROTO_GRE64 ||
+           mutable->key.tunnel_type & TNL_T_PROTO_GRE64 ||
            flags & TNL_F_OUT_KEY_ACTION) {
 
                len += GRE_HEADER_SECTION;
-               if (tunnel_type & TNL_T_PROTO_GRE64)
+               if (mutable->key.tunnel_type & TNL_T_PROTO_GRE64)
                        len += GRE_HEADER_SECTION;
        }
        return len;
@@ -122,22 +97,22 @@ static struct sk_buff *gre_build_header(const struct vport *vport,
                                         int tunnel_hlen)
 {
        u32 flags;
-       u32 tunnel_type;
        __be64 out_key;
        const struct ovs_key_ipv4_tunnel *tun_key = OVS_CB(skb)->tun_key;
        __be32 *options = (__be32 *)(skb_network_header(skb) + tunnel_hlen
                                               - GRE_HEADER_SECTION);
        struct gre_base_hdr *greh = (struct gre_base_hdr *) skb_transport_header(skb);
 
-       get_gre_param(mutable, tun_key, &flags, &tunnel_type, &out_key);
+       tnl_get_param(mutable, tun_key, &flags, &out_key);
 
        greh->protocol = htons(ETH_P_TEB);
        greh->flags = 0;
 
        /* Work backwards over the options so the checksum is last. */
-       if (out_key || flags & TNL_F_OUT_KEY_ACTION || tunnel_type & TNL_T_PROTO_GRE64) {
+       if (out_key || flags & TNL_F_OUT_KEY_ACTION ||
+           mutable->key.tunnel_type & TNL_T_PROTO_GRE64) {
                greh->flags |= GRE_KEY;
-               if (tunnel_type & TNL_T_PROTO_GRE64) {
+               if (mutable->key.tunnel_type & TNL_T_PROTO_GRE64) {
                        /* Set higher 32 bits to seq. */
                        *options = be64_get_high32(out_key);
                        options--;