This function can be used to build varius tunnel headers.

Signed-off-by: Pravin B Shelar <pshe...@ovn.org>
---
 lib/netdev-native-tnl.c | 35 +++--------------------------------
 lib/netdev-native-tnl.h | 25 +++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 32 deletions(-)

diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
index d28cfbf..9c2dc7e 100644
--- a/lib/netdev-native-tnl.c
+++ b/lib/netdev-native-tnl.c
@@ -249,27 +249,10 @@ udp_build_header(struct netdev_tunnel_config *tnl_cfg,
                  struct ovs_action_push_tnl *data,
                  unsigned int *hlen)
 {
-    struct ip_header *ip;
-    struct ovs_16aligned_ip6_hdr *ip6;
     struct udp_header *udp;
     bool is_ipv6;
 
-    *hlen = sizeof(struct eth_header);
-
-    is_ipv6 = is_header_ipv6(data->header);
-
-    if (is_ipv6) {
-        ip6 = ipv6_hdr(data->header);
-        ip6->ip6_nxt = IPPROTO_UDP;
-        udp = (struct udp_header *) (ip6 + 1);
-        *hlen += IPV6_HEADER_LEN;
-    } else {
-        ip = ip_hdr(data->header);
-        ip->ip_proto = IPPROTO_UDP;
-        udp = (struct udp_header *) (ip + 1);
-        *hlen += IP_HEADER_LEN;
-    }
-
+    udp = ip_build_header(data, IPPROTO_UDP, hlen, &is_ipv6);
     udp->udp_dst = tnl_cfg->dst_port;
 
     if (is_ipv6 || tnl_flow->tunnel.flags & FLOW_TNL_F_CSUM) {
@@ -403,28 +386,16 @@ netdev_gre_build_header(const struct netdev *netdev,
 {
     struct netdev_vport *dev = netdev_vport_cast(netdev);
     struct netdev_tunnel_config *tnl_cfg;
-    struct ip_header *ip;
-    struct ovs_16aligned_ip6_hdr *ip6;
     struct gre_base_hdr *greh;
     ovs_16aligned_be32 *options;
-    int hlen;
+    unsigned int hlen, offset;
     bool is_ipv6;
 
-    is_ipv6 = is_header_ipv6(data->header);
-
     /* XXX: RCUfy tnl_cfg. */
     ovs_mutex_lock(&dev->mutex);
     tnl_cfg = &dev->tnl_cfg;
 
-    if (is_ipv6) {
-        ip6 = ipv6_hdr(data->header);
-        ip6->ip6_nxt = IPPROTO_GRE;
-        greh = (struct gre_base_hdr *) (ip6 + 1);
-    } else {
-        ip = ip_hdr(data->header);
-        ip->ip_proto = IPPROTO_GRE;
-        greh = (struct gre_base_hdr *) (ip + 1);
-    }
+    greh = ip_build_header(data, IPPROTO_GRE, &offset, &is_ipv6);
 
     greh->protocol = htons(ETH_TYPE_TEB);
     greh->flags = 0;
diff --git a/lib/netdev-native-tnl.h b/lib/netdev-native-tnl.h
index dbe6bd0..a0dfa8c 100644
--- a/lib/netdev-native-tnl.h
+++ b/lib/netdev-native-tnl.h
@@ -82,6 +82,31 @@ ipv6_hdr(void *eth)
     return (void *)((char *)eth + sizeof (struct eth_header));
 }
 
+static inline void *
+ip_build_header(struct ovs_action_push_tnl *data,
+                uint8_t next_proto,
+                unsigned int *hlen,
+                bool *is_ipv6)
+{
+    *hlen = sizeof(struct eth_header);
+    *is_ipv6 = is_header_ipv6(data->header);
+    if (*is_ipv6) {
+        struct ovs_16aligned_ip6_hdr *ip6;
+
+        ip6 = ipv6_hdr(data->header);
+        ip6->ip6_nxt = next_proto;
+        *hlen += IPV6_HEADER_LEN;
+        return ip6 + 1;
+    } else {
+        struct ip_header *ip;
+
+        ip = ip_hdr(data->header);
+        ip->ip_proto = next_proto;
+        *hlen += IP_HEADER_LEN;
+        return ip + 1;
+    }
+}
+
 extern uint16_t tnl_udp_port_min;
 extern uint16_t tnl_udp_port_max;
 
-- 
2.5.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to