From: Jesse Gross Date: Tue, 6 Nov 2012 21:22:28 +0000 (-0800) Subject: datapath: Allow GRE64 to use flow based tunneling. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8432bb09305ac380451fc1bbd39336d6e2c472eb;p=openvswitch datapath: Allow GRE64 to use flow based tunneling. 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 Acked-by: Kyle Mestery --- diff --git a/datapath/tunnel.h b/datapath/tunnel.h index ef09162b..c2680571 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 f26d3ff9..8a89180e 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 45e38b00..7f8bc9a7 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--;