ip_tunnel: Add GUE support
authorTom Herbert <therbert@google.com>
Fri, 3 Oct 2014 22:48:10 +0000 (15:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 3 Oct 2014 23:53:33 +0000 (16:53 -0700)
This patch allows configuring IPIP, sit, and GRE tunnels to use GUE.
This is very similar to fou excpet that we need to insert the GUE header
in addition to the UDP header on transmit.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/if_tunnel.h
net/ipv4/ip_tunnel.c

index 7c832afdfa94091b9deab9628ce27f67243fe4e5..280d9e092283673c4ac6ef37c3b5ecec2cb406e6 100644 (file)
@@ -64,6 +64,7 @@ enum {
 enum tunnel_encap_types {
        TUNNEL_ENCAP_NONE,
        TUNNEL_ENCAP_FOU,
+       TUNNEL_ENCAP_GUE,
 };
 
 #define TUNNEL_ENCAP_FLAG_CSUM         (1<<0)
index d9c9dc4ffeaf182510327495fe68a64b043a8b70..0bb8e141eaccd66e9865385a9c71b33d1bbfc65f 100644 (file)
@@ -56,6 +56,7 @@
 #include <net/netns/generic.h>
 #include <net/rtnetlink.h>
 #include <net/udp.h>
+#include <net/gue.h>
 
 #if IS_ENABLED(CONFIG_IPV6)
 #include <net/ipv6.h>
@@ -495,6 +496,8 @@ static int ip_encap_hlen(struct ip_tunnel_encap *e)
                return 0;
        case TUNNEL_ENCAP_FOU:
                return sizeof(struct udphdr);
+       case TUNNEL_ENCAP_GUE:
+               return sizeof(struct udphdr) + sizeof(struct guehdr);
        default:
                return -EINVAL;
        }
@@ -546,6 +549,15 @@ static int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
        skb_reset_transport_header(skb);
        uh = udp_hdr(skb);
 
+       if (e->type == TUNNEL_ENCAP_GUE) {
+               struct guehdr *guehdr = (struct guehdr *)&uh[1];
+
+               guehdr->version = 0;
+               guehdr->hlen = 0;
+               guehdr->flags = 0;
+               guehdr->next_hdr = *protocol;
+       }
+
        uh->dest = e->dport;
        uh->source = sport;
        uh->len = htons(skb->len);
@@ -565,6 +577,7 @@ int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t,
        case TUNNEL_ENCAP_NONE:
                return 0;
        case TUNNEL_ENCAP_FOU:
+       case TUNNEL_ENCAP_GUE:
                return fou_build_header(skb, &t->encap, t->encap_hlen,
                                        protocol, fl4);
        default: