aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorTom Herbert <therbert@google.com>2014-10-03 18:48:10 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-03 19:53:33 -0400
commitbc1fc390e1728672b5b343b85185fcc1fe41043b (patch)
tree3433fc7ea36411d4511c776bb4bcafe2b1161e7f /net/ipv4
parent37dd0247797b168ad1cc7f5dbec825a1ee66535b (diff)
ip_tunnel: Add GUE support
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>
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/ip_tunnel.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index d9c9dc4ffeaf..0bb8e141eacc 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -56,6 +56,7 @@
56#include <net/netns/generic.h> 56#include <net/netns/generic.h>
57#include <net/rtnetlink.h> 57#include <net/rtnetlink.h>
58#include <net/udp.h> 58#include <net/udp.h>
59#include <net/gue.h>
59 60
60#if IS_ENABLED(CONFIG_IPV6) 61#if IS_ENABLED(CONFIG_IPV6)
61#include <net/ipv6.h> 62#include <net/ipv6.h>
@@ -495,6 +496,8 @@ static int ip_encap_hlen(struct ip_tunnel_encap *e)
495 return 0; 496 return 0;
496 case TUNNEL_ENCAP_FOU: 497 case TUNNEL_ENCAP_FOU:
497 return sizeof(struct udphdr); 498 return sizeof(struct udphdr);
499 case TUNNEL_ENCAP_GUE:
500 return sizeof(struct udphdr) + sizeof(struct guehdr);
498 default: 501 default:
499 return -EINVAL; 502 return -EINVAL;
500 } 503 }
@@ -546,6 +549,15 @@ static int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
546 skb_reset_transport_header(skb); 549 skb_reset_transport_header(skb);
547 uh = udp_hdr(skb); 550 uh = udp_hdr(skb);
548 551
552 if (e->type == TUNNEL_ENCAP_GUE) {
553 struct guehdr *guehdr = (struct guehdr *)&uh[1];
554
555 guehdr->version = 0;
556 guehdr->hlen = 0;
557 guehdr->flags = 0;
558 guehdr->next_hdr = *protocol;
559 }
560
549 uh->dest = e->dport; 561 uh->dest = e->dport;
550 uh->source = sport; 562 uh->source = sport;
551 uh->len = htons(skb->len); 563 uh->len = htons(skb->len);
@@ -565,6 +577,7 @@ int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t,
565 case TUNNEL_ENCAP_NONE: 577 case TUNNEL_ENCAP_NONE:
566 return 0; 578 return 0;
567 case TUNNEL_ENCAP_FOU: 579 case TUNNEL_ENCAP_FOU:
580 case TUNNEL_ENCAP_GUE:
568 return fou_build_header(skb, &t->encap, t->encap_hlen, 581 return fou_build_header(skb, &t->encap, t->encap_hlen,
569 protocol, fl4); 582 protocol, fl4);
570 default: 583 default: