[ovs-dev] [PATCH 5/5] datapath: Allow GRE64 to use flow based tunneling.

Jesse Gross jesse at nicira.com
Wed Nov 7 00:50:20 UTC 2012


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 at nicira.com>
---
 datapath/tunnel.h       |   21 +++++++++++++++++++++
 datapath/vport-capwap.c |   26 ++------------------------
 datapath/vport-gre.c    |   39 +++++++--------------------------------
 3 files changed, 30 insertions(+), 56 deletions(-)

diff --git a/datapath/tunnel.h b/datapath/tunnel.h
index ef09162..c268057 100644
--- a/datapath/tunnel.h
+++ b/datapath/tunnel.h
@@ -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 */
diff --git a/datapath/vport-capwap.c b/datapath/vport-capwap.c
index f26d3ff..8a89180 100644
--- a/datapath/vport-capwap.c
+++ b/datapath/vport-capwap.c
@@ -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);
diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c
index 45e38b0..7f8bc9a 100644
--- a/datapath/vport-gre.c
+++ b/datapath/vport-gre.c
@@ -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--;
-- 
1.7.9.5




More information about the dev mailing list