diff options
| -rw-r--r-- | include/uapi/linux/if_tunnel.h | 1 | ||||
| -rw-r--r-- | net/ipv4/ip_tunnel.c | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h index 7c832afdfa94..280d9e092283 100644 --- a/include/uapi/linux/if_tunnel.h +++ b/include/uapi/linux/if_tunnel.h | |||
| @@ -64,6 +64,7 @@ enum { | |||
| 64 | enum tunnel_encap_types { | 64 | enum tunnel_encap_types { |
| 65 | TUNNEL_ENCAP_NONE, | 65 | TUNNEL_ENCAP_NONE, |
| 66 | TUNNEL_ENCAP_FOU, | 66 | TUNNEL_ENCAP_FOU, |
| 67 | TUNNEL_ENCAP_GUE, | ||
| 67 | }; | 68 | }; |
| 68 | 69 | ||
| 69 | #define TUNNEL_ENCAP_FLAG_CSUM (1<<0) | 70 | #define TUNNEL_ENCAP_FLAG_CSUM (1<<0) |
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: |
