]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/ipv4/ip_gre.c
Merge branch 'for-4.13-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
[mirror_ubuntu-bionic-kernel.git] / net / ipv4 / ip_gre.c
CommitLineData
1da177e4 1/*
e905a9ed 2 * Linux NET3: GRE over IP protocol decoder.
1da177e4
LT
3 *
4 * Authors: Alexey Kuznetsov (kuznet@ms2.inr.ac.ru)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 *
11 */
12
afd46503
JP
13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
4fc268d2 15#include <linux/capability.h>
1da177e4
LT
16#include <linux/module.h>
17#include <linux/types.h>
1da177e4 18#include <linux/kernel.h>
5a0e3ad6 19#include <linux/slab.h>
7c0f6ba6 20#include <linux/uaccess.h>
1da177e4
LT
21#include <linux/skbuff.h>
22#include <linux/netdevice.h>
23#include <linux/in.h>
24#include <linux/tcp.h>
25#include <linux/udp.h>
26#include <linux/if_arp.h>
2e15ea39 27#include <linux/if_vlan.h>
1da177e4
LT
28#include <linux/init.h>
29#include <linux/in6.h>
30#include <linux/inetdevice.h>
31#include <linux/igmp.h>
32#include <linux/netfilter_ipv4.h>
e1a80002 33#include <linux/etherdevice.h>
46f25dff 34#include <linux/if_ether.h>
1da177e4
LT
35
36#include <net/sock.h>
37#include <net/ip.h>
38#include <net/icmp.h>
39#include <net/protocol.h>
c5441932 40#include <net/ip_tunnels.h>
1da177e4
LT
41#include <net/arp.h>
42#include <net/checksum.h>
43#include <net/dsfield.h>
44#include <net/inet_ecn.h>
45#include <net/xfrm.h>
59a4c759
PE
46#include <net/net_namespace.h>
47#include <net/netns/generic.h>
c19e654d 48#include <net/rtnetlink.h>
00959ade 49#include <net/gre.h>
2e15ea39 50#include <net/dst_metadata.h>
1da177e4 51
1da177e4
LT
52/*
53 Problems & solutions
54 --------------------
55
56 1. The most important issue is detecting local dead loops.
57 They would cause complete host lockup in transmit, which
58 would be "resolved" by stack overflow or, if queueing is enabled,
59 with infinite looping in net_bh.
60
61 We cannot track such dead loops during route installation,
62 it is infeasible task. The most general solutions would be
63 to keep skb->encapsulation counter (sort of local ttl),
6d0722a2 64 and silently drop packet when it expires. It is a good
bff52857 65 solution, but it supposes maintaining new variable in ALL
1da177e4
LT
66 skb, even if no tunneling is used.
67
6d0722a2
ED
68 Current solution: xmit_recursion breaks dead loops. This is a percpu
69 counter, since when we enter the first ndo_xmit(), cpu migration is
70 forbidden. We force an exit if this counter reaches RECURSION_LIMIT
1da177e4
LT
71
72 2. Networking dead loops would not kill routers, but would really
73 kill network. IP hop limit plays role of "t->recursion" in this case,
74 if we copy it from packet being encapsulated to upper header.
75 It is very good solution, but it introduces two problems:
76
77 - Routing protocols, using packets with ttl=1 (OSPF, RIP2),
78 do not work over tunnels.
79 - traceroute does not work. I planned to relay ICMP from tunnel,
80 so that this problem would be solved and traceroute output
81 would even more informative. This idea appeared to be wrong:
82 only Linux complies to rfc1812 now (yes, guys, Linux is the only
83 true router now :-)), all routers (at least, in neighbourhood of mine)
84 return only 8 bytes of payload. It is the end.
85
86 Hence, if we want that OSPF worked or traceroute said something reasonable,
87 we should search for another solution.
88
89 One of them is to parse packet trying to detect inner encapsulation
90 made by our node. It is difficult or even impossible, especially,
bff52857 91 taking into account fragmentation. TO be short, ttl is not solution at all.
1da177e4
LT
92
93 Current solution: The solution was UNEXPECTEDLY SIMPLE.
94 We force DF flag on tunnels with preconfigured hop limit,
95 that is ALL. :-) Well, it does not remove the problem completely,
96 but exponential growth of network traffic is changed to linear
97 (branches, that exceed pmtu are pruned) and tunnel mtu
bff52857 98 rapidly degrades to value <68, where looping stops.
1da177e4
LT
99 Yes, it is not good if there exists a router in the loop,
100 which does not force DF, even when encapsulating packets have DF set.
101 But it is not our problem! Nobody could accuse us, we made
102 all that we could make. Even if it is your gated who injected
103 fatal route to network, even if it were you who configured
104 fatal static route: you are innocent. :-)
105
1da177e4
LT
106 Alexey Kuznetsov.
107 */
108
eccc1bb8 109static bool log_ecn_error = true;
110module_param(log_ecn_error, bool, 0644);
111MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
112
c19e654d 113static struct rtnl_link_ops ipgre_link_ops __read_mostly;
1da177e4 114static int ipgre_tunnel_init(struct net_device *dev);
eb8ce741 115
c7d03a00
AD
116static unsigned int ipgre_net_id __read_mostly;
117static unsigned int gre_tap_net_id __read_mostly;
1da177e4 118
9f57c67c
PS
119static void ipgre_err(struct sk_buff *skb, u32 info,
120 const struct tnl_ptk_info *tpi)
1da177e4 121{
1da177e4 122
c5441932
PS
123 /* All the routers (except for Linux) return only
124 8 bytes of packet payload. It means, that precise relaying of
125 ICMP in the real Internet is absolutely infeasible.
1da177e4 126
c5441932
PS
127 Moreover, Cisco "wise men" put GRE key to the third word
128 in GRE header. It makes impossible maintaining even soft
129 state for keyed GRE tunnels with enabled checksum. Tell
130 them "thank you".
1da177e4 131
c5441932
PS
132 Well, I wonder, rfc1812 was written by Cisco employee,
133 what the hell these idiots break standards established
134 by themselves???
135 */
136 struct net *net = dev_net(skb->dev);
137 struct ip_tunnel_net *itn;
96f5a846 138 const struct iphdr *iph;
88c7664f
ACM
139 const int type = icmp_hdr(skb)->type;
140 const int code = icmp_hdr(skb)->code;
20e1954f 141 unsigned int data_len = 0;
1da177e4 142 struct ip_tunnel *t;
1da177e4 143
1da177e4
LT
144 switch (type) {
145 default:
146 case ICMP_PARAMETERPROB:
9f57c67c 147 return;
1da177e4
LT
148
149 case ICMP_DEST_UNREACH:
150 switch (code) {
151 case ICMP_SR_FAILED:
152 case ICMP_PORT_UNREACH:
153 /* Impossible event. */
9f57c67c 154 return;
1da177e4
LT
155 default:
156 /* All others are translated to HOST_UNREACH.
157 rfc2003 contains "deep thoughts" about NET_UNREACH,
158 I believe they are just ether pollution. --ANK
159 */
160 break;
161 }
162 break;
9f57c67c 163
1da177e4
LT
164 case ICMP_TIME_EXCEEDED:
165 if (code != ICMP_EXC_TTL)
9f57c67c 166 return;
20e1954f 167 data_len = icmp_hdr(skb)->un.reserved[1] * 4; /* RFC 4884 4.1 */
1da177e4 168 break;
55be7a9c
DM
169
170 case ICMP_REDIRECT:
171 break;
1da177e4
LT
172 }
173
bda7bb46 174 if (tpi->proto == htons(ETH_P_TEB))
c5441932
PS
175 itn = net_generic(net, gre_tap_net_id);
176 else
177 itn = net_generic(net, ipgre_net_id);
178
c0c0c50f 179 iph = (const struct iphdr *)(icmp_hdr(skb) + 1);
bda7bb46
PS
180 t = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi->flags,
181 iph->daddr, iph->saddr, tpi->key);
d2083287 182
51456b29 183 if (!t)
9f57c67c 184 return;
36393395 185
9b8c6d7b
ED
186#if IS_ENABLED(CONFIG_IPV6)
187 if (tpi->proto == htons(ETH_P_IPV6) &&
20e1954f
ED
188 !ip6_err_gen_icmpv6_unreach(skb, iph->ihl * 4 + tpi->hdr_len,
189 type, data_len))
9b8c6d7b
ED
190 return;
191#endif
192
36393395 193 if (t->parms.iph.daddr == 0 ||
f97c1e0c 194 ipv4_is_multicast(t->parms.iph.daddr))
9f57c67c 195 return;
1da177e4
LT
196
197 if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
9f57c67c 198 return;
1da177e4 199
da6185d8 200 if (time_before(jiffies, t->err_time + IPTUNNEL_ERR_TIMEO))
1da177e4
LT
201 t->err_count++;
202 else
203 t->err_count = 1;
204 t->err_time = jiffies;
9f57c67c
PS
205}
206
207static void gre_err(struct sk_buff *skb, u32 info)
208{
209 /* All the routers (except for Linux) return only
210 * 8 bytes of packet payload. It means, that precise relaying of
211 * ICMP in the real Internet is absolutely infeasible.
212 *
213 * Moreover, Cisco "wise men" put GRE key to the third word
214 * in GRE header. It makes impossible maintaining even soft
215 * state for keyed
216 * GRE tunnels with enabled checksum. Tell them "thank you".
217 *
218 * Well, I wonder, rfc1812 was written by Cisco employee,
219 * what the hell these idiots break standards established
220 * by themselves???
221 */
222
e582615a 223 const struct iphdr *iph = (struct iphdr *)skb->data;
9f57c67c
PS
224 const int type = icmp_hdr(skb)->type;
225 const int code = icmp_hdr(skb)->code;
226 struct tnl_ptk_info tpi;
227 bool csum_err = false;
228
e582615a
ED
229 if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP),
230 iph->ihl * 4) < 0) {
9f57c67c
PS
231 if (!csum_err) /* ignore csum errors. */
232 return;
233 }
234
235 if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
236 ipv4_update_pmtu(skb, dev_net(skb->dev), info,
237 skb->dev->ifindex, 0, IPPROTO_GRE, 0);
238 return;
239 }
240 if (type == ICMP_REDIRECT) {
241 ipv4_redirect(skb, dev_net(skb->dev), skb->dev->ifindex, 0,
242 IPPROTO_GRE, 0);
243 return;
244 }
245
246 ipgre_err(skb, info, &tpi);
1da177e4
LT
247}
248
125372fa
JB
249static int __ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
250 struct ip_tunnel_net *itn, int hdr_len, bool raw_proto)
1da177e4 251{
2e15ea39 252 struct metadata_dst *tun_dst = NULL;
b71d1d42 253 const struct iphdr *iph;
1da177e4 254 struct ip_tunnel *tunnel;
1da177e4 255
c5441932 256 iph = ip_hdr(skb);
bda7bb46
PS
257 tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi->flags,
258 iph->saddr, iph->daddr, tpi->key);
e1a80002 259
d2083287 260 if (tunnel) {
125372fa
JB
261 if (__iptunnel_pull_header(skb, hdr_len, tpi->proto,
262 raw_proto, false) < 0)
244a797b
JB
263 goto drop;
264
e271c7b4
JB
265 if (tunnel->dev->type != ARPHRD_NONE)
266 skb_pop_mac_header(skb);
267 else
268 skb_reset_mac_header(skb);
2e15ea39 269 if (tunnel->collect_md) {
c29a70d2
PS
270 __be16 flags;
271 __be64 tun_id;
2e15ea39 272
c29a70d2 273 flags = tpi->flags & (TUNNEL_CSUM | TUNNEL_KEY);
d817f432 274 tun_id = key32_to_tunnel_id(tpi->key);
c29a70d2 275 tun_dst = ip_tun_rx_dst(skb, flags, tun_id, 0);
2e15ea39
PS
276 if (!tun_dst)
277 return PACKET_REJECT;
2e15ea39
PS
278 }
279
280 ip_tunnel_rcv(tunnel, skb, tpi, tun_dst, log_ecn_error);
bda7bb46 281 return PACKET_RCVD;
1da177e4 282 }
125372fa 283 return PACKET_NEXT;
244a797b
JB
284
285drop:
286 kfree_skb(skb);
287 return PACKET_RCVD;
1da177e4
LT
288}
289
125372fa
JB
290static int ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
291 int hdr_len)
292{
293 struct net *net = dev_net(skb->dev);
294 struct ip_tunnel_net *itn;
295 int res;
296
297 if (tpi->proto == htons(ETH_P_TEB))
298 itn = net_generic(net, gre_tap_net_id);
299 else
300 itn = net_generic(net, ipgre_net_id);
301
302 res = __ipgre_rcv(skb, tpi, itn, hdr_len, false);
303 if (res == PACKET_NEXT && tpi->proto == htons(ETH_P_TEB)) {
304 /* ipgre tunnels in collect metadata mode should receive
305 * also ETH_P_TEB traffic.
306 */
307 itn = net_generic(net, ipgre_net_id);
308 res = __ipgre_rcv(skb, tpi, itn, hdr_len, true);
309 }
310 return res;
311}
312
9f57c67c
PS
313static int gre_rcv(struct sk_buff *skb)
314{
315 struct tnl_ptk_info tpi;
316 bool csum_err = false;
95f5c64c 317 int hdr_len;
9f57c67c
PS
318
319#ifdef CONFIG_NET_IPGRE_BROADCAST
320 if (ipv4_is_multicast(ip_hdr(skb)->daddr)) {
321 /* Looped back packet, drop it! */
322 if (rt_is_output_route(skb_rtable(skb)))
323 goto drop;
324 }
325#endif
326
e582615a 327 hdr_len = gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP), 0);
f132ae7c 328 if (hdr_len < 0)
95f5c64c
TH
329 goto drop;
330
244a797b 331 if (ipgre_rcv(skb, &tpi, hdr_len) == PACKET_RCVD)
9f57c67c
PS
332 return 0;
333
334 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
335drop:
336 kfree_skb(skb);
337 return 0;
338}
339
c5441932
PS
340static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
341 const struct iphdr *tnl_params,
342 __be16 proto)
343{
344 struct ip_tunnel *tunnel = netdev_priv(dev);
1da177e4 345
c5441932
PS
346 if (tunnel->parms.o_flags & TUNNEL_SEQ)
347 tunnel->o_seqno++;
1da177e4 348
c5441932 349 /* Push GRE header. */
182a352d
TH
350 gre_build_header(skb, tunnel->tun_hlen,
351 tunnel->parms.o_flags, proto, tunnel->parms.o_key,
352 htonl(tunnel->o_seqno));
54bc9bac 353
bf3d6a8f 354 ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
c5441932 355}
1da177e4 356
aed069df 357static int gre_handle_offloads(struct sk_buff *skb, bool csum)
b2acd1dc 358{
6fa79666 359 return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
b2acd1dc
PS
360}
361
fc4099f1
PS
362static struct rtable *gre_get_rt(struct sk_buff *skb,
363 struct net_device *dev,
364 struct flowi4 *fl,
365 const struct ip_tunnel_key *key)
366{
367 struct net *net = dev_net(dev);
368
369 memset(fl, 0, sizeof(*fl));
370 fl->daddr = key->u.ipv4.dst;
371 fl->saddr = key->u.ipv4.src;
372 fl->flowi4_tos = RT_TOS(key->tos);
373 fl->flowi4_mark = skb->mark;
374 fl->flowi4_proto = IPPROTO_GRE;
375
376 return ip_route_output_key(net, fl);
377}
378
2090714e
JB
379static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev,
380 __be16 proto)
2e15ea39
PS
381{
382 struct ip_tunnel_info *tun_info;
2e15ea39 383 const struct ip_tunnel_key *key;
db3c6139 384 struct rtable *rt = NULL;
2e15ea39 385 struct flowi4 fl;
2e15ea39
PS
386 int min_headroom;
387 int tunnel_hlen;
388 __be16 df, flags;
db3c6139 389 bool use_cache;
2e15ea39
PS
390 int err;
391
61adedf3 392 tun_info = skb_tunnel_info(skb);
7f9562a1
JB
393 if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) ||
394 ip_tunnel_info_af(tun_info) != AF_INET))
2e15ea39
PS
395 goto err_free_skb;
396
397 key = &tun_info->key;
db3c6139
DB
398 use_cache = ip_tunnel_dst_cache_usable(skb, tun_info);
399 if (use_cache)
400 rt = dst_cache_get_ip4(&tun_info->dst_cache, &fl.saddr);
3c1cb4d2
PA
401 if (!rt) {
402 rt = gre_get_rt(skb, dev, &fl, key);
403 if (IS_ERR(rt))
404 goto err_free_skb;
db3c6139 405 if (use_cache)
3c1cb4d2
PA
406 dst_cache_set_ip4(&tun_info->dst_cache, &rt->dst,
407 fl.saddr);
408 }
2e15ea39 409
95f5c64c 410 tunnel_hlen = gre_calc_hlen(key->tun_flags);
2e15ea39
PS
411
412 min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
413 + tunnel_hlen + sizeof(struct iphdr);
414 if (skb_headroom(skb) < min_headroom || skb_header_cloned(skb)) {
415 int head_delta = SKB_DATA_ALIGN(min_headroom -
416 skb_headroom(skb) +
417 16);
418 err = pskb_expand_head(skb, max_t(int, head_delta, 0),
419 0, GFP_ATOMIC);
420 if (unlikely(err))
421 goto err_free_rt;
422 }
423
424 /* Push Tunnel header. */
aed069df 425 if (gre_handle_offloads(skb, !!(tun_info->key.tun_flags & TUNNEL_CSUM)))
2e15ea39 426 goto err_free_rt;
2e15ea39
PS
427
428 flags = tun_info->key.tun_flags & (TUNNEL_CSUM | TUNNEL_KEY);
cba65321 429 gre_build_header(skb, tunnel_hlen, flags, proto,
d817f432 430 tunnel_id_to_key32(tun_info->key.tun_id), 0);
2e15ea39
PS
431
432 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
039f5062
PS
433
434 iptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,
435 key->tos, key->ttl, df, false);
2e15ea39
PS
436 return;
437
438err_free_rt:
439 ip_rt_put(rt);
440err_free_skb:
441 kfree_skb(skb);
442 dev->stats.tx_dropped++;
443}
444
fc4099f1
PS
445static int gre_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
446{
447 struct ip_tunnel_info *info = skb_tunnel_info(skb);
448 struct rtable *rt;
449 struct flowi4 fl4;
450
451 if (ip_tunnel_info_af(info) != AF_INET)
452 return -EINVAL;
453
454 rt = gre_get_rt(skb, dev, &fl4, &info->key);
455 if (IS_ERR(rt))
456 return PTR_ERR(rt);
457
458 ip_rt_put(rt);
459 info->key.u.ipv4.src = fl4.saddr;
460 return 0;
461}
462
c5441932
PS
463static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
464 struct net_device *dev)
465{
466 struct ip_tunnel *tunnel = netdev_priv(dev);
467 const struct iphdr *tnl_params;
1da177e4 468
2e15ea39 469 if (tunnel->collect_md) {
2090714e 470 gre_fb_xmit(skb, dev, skb->protocol);
2e15ea39
PS
471 return NETDEV_TX_OK;
472 }
473
c5441932
PS
474 if (dev->header_ops) {
475 /* Need space for new headers */
476 if (skb_cow_head(skb, dev->needed_headroom -
2bac7cb3 477 (tunnel->hlen + sizeof(struct iphdr))))
c5441932 478 goto free_skb;
1da177e4 479
c5441932 480 tnl_params = (const struct iphdr *)skb->data;
1da177e4 481
c5441932
PS
482 /* Pull skb since ip_tunnel_xmit() needs skb->data pointing
483 * to gre header.
484 */
485 skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
8a0033a9 486 skb_reset_mac_header(skb);
c5441932
PS
487 } else {
488 if (skb_cow_head(skb, dev->needed_headroom))
489 goto free_skb;
1da177e4 490
c5441932 491 tnl_params = &tunnel->parms.iph;
1da177e4
LT
492 }
493
aed069df
AD
494 if (gre_handle_offloads(skb, !!(tunnel->parms.o_flags & TUNNEL_CSUM)))
495 goto free_skb;
8a0033a9 496
c5441932 497 __gre_xmit(skb, dev, tnl_params, skb->protocol);
6ed10654 498 return NETDEV_TX_OK;
1da177e4 499
c5441932 500free_skb:
3acfa1e7 501 kfree_skb(skb);
c5441932 502 dev->stats.tx_dropped++;
6ed10654 503 return NETDEV_TX_OK;
1da177e4
LT
504}
505
c5441932
PS
506static netdev_tx_t gre_tap_xmit(struct sk_buff *skb,
507 struct net_device *dev)
ee34c1eb 508{
c5441932 509 struct ip_tunnel *tunnel = netdev_priv(dev);
ee34c1eb 510
2e15ea39 511 if (tunnel->collect_md) {
2090714e 512 gre_fb_xmit(skb, dev, htons(ETH_P_TEB));
2e15ea39
PS
513 return NETDEV_TX_OK;
514 }
515
aed069df
AD
516 if (gre_handle_offloads(skb, !!(tunnel->parms.o_flags & TUNNEL_CSUM)))
517 goto free_skb;
ee34c1eb 518
c5441932
PS
519 if (skb_cow_head(skb, dev->needed_headroom))
520 goto free_skb;
42aa9162 521
c5441932 522 __gre_xmit(skb, dev, &tunnel->parms.iph, htons(ETH_P_TEB));
c5441932 523 return NETDEV_TX_OK;
ee34c1eb 524
c5441932 525free_skb:
3acfa1e7 526 kfree_skb(skb);
c5441932
PS
527 dev->stats.tx_dropped++;
528 return NETDEV_TX_OK;
ee34c1eb
MS
529}
530
c5441932
PS
531static int ipgre_tunnel_ioctl(struct net_device *dev,
532 struct ifreq *ifr, int cmd)
1da177e4 533{
4565e991 534 int err;
1da177e4 535 struct ip_tunnel_parm p;
1da177e4 536
c5441932
PS
537 if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
538 return -EFAULT;
6c734fb8
CW
539 if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
540 if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE ||
541 p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) ||
542 ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING)))
543 return -EINVAL;
1da177e4 544 }
c5441932
PS
545 p.i_flags = gre_flags_to_tnl_flags(p.i_flags);
546 p.o_flags = gre_flags_to_tnl_flags(p.o_flags);
1da177e4 547
c5441932
PS
548 err = ip_tunnel_ioctl(dev, &p, cmd);
549 if (err)
550 return err;
1da177e4 551
95f5c64c
TH
552 p.i_flags = gre_tnl_flags_to_gre_flags(p.i_flags);
553 p.o_flags = gre_tnl_flags_to_gre_flags(p.o_flags);
c5441932
PS
554
555 if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
556 return -EFAULT;
1da177e4
LT
557 return 0;
558}
559
1da177e4
LT
560/* Nice toy. Unfortunately, useless in real life :-)
561 It allows to construct virtual multiprotocol broadcast "LAN"
562 over the Internet, provided multicast routing is tuned.
563
564
565 I have no idea was this bicycle invented before me,
566 so that I had to set ARPHRD_IPGRE to a random value.
567 I have an impression, that Cisco could make something similar,
568 but this feature is apparently missing in IOS<=11.2(8).
e905a9ed 569
1da177e4
LT
570 I set up 10.66.66/24 and fec0:6666:6666::0/96 as virtual networks
571 with broadcast 224.66.66.66. If you have access to mbone, play with me :-)
572
573 ping -t 255 224.66.66.66
574
575 If nobody answers, mbone does not work.
576
577 ip tunnel add Universe mode gre remote 224.66.66.66 local <Your_real_addr> ttl 255
578 ip addr add 10.66.66.<somewhat>/24 dev Universe
579 ifconfig Universe up
580 ifconfig Universe add fe80::<Your_real_addr>/10
581 ifconfig Universe add fec0:6666:6666::<Your_real_addr>/96
582 ftp 10.66.66.66
583 ...
584 ftp fec0:6666:6666::193.233.7.65
585 ...
1da177e4 586 */
3b04ddde
SH
587static int ipgre_header(struct sk_buff *skb, struct net_device *dev,
588 unsigned short type,
1507850b 589 const void *daddr, const void *saddr, unsigned int len)
1da177e4 590{
2941a486 591 struct ip_tunnel *t = netdev_priv(dev);
c5441932
PS
592 struct iphdr *iph;
593 struct gre_base_hdr *greh;
1da177e4 594
d58ff351 595 iph = skb_push(skb, t->hlen + sizeof(*iph));
c5441932 596 greh = (struct gre_base_hdr *)(iph+1);
95f5c64c 597 greh->flags = gre_tnl_flags_to_gre_flags(t->parms.o_flags);
c5441932 598 greh->protocol = htons(type);
1da177e4 599
c5441932 600 memcpy(iph, &t->parms.iph, sizeof(struct iphdr));
e905a9ed 601
c5441932 602 /* Set the source hardware address. */
1da177e4
LT
603 if (saddr)
604 memcpy(&iph->saddr, saddr, 4);
6d55cb91 605 if (daddr)
1da177e4 606 memcpy(&iph->daddr, daddr, 4);
6d55cb91 607 if (iph->daddr)
77a482bd 608 return t->hlen + sizeof(*iph);
e905a9ed 609
c5441932 610 return -(t->hlen + sizeof(*iph));
1da177e4
LT
611}
612
6a5f44d7
TT
613static int ipgre_header_parse(const struct sk_buff *skb, unsigned char *haddr)
614{
b71d1d42 615 const struct iphdr *iph = (const struct iphdr *) skb_mac_header(skb);
6a5f44d7
TT
616 memcpy(haddr, &iph->saddr, 4);
617 return 4;
618}
619
3b04ddde
SH
620static const struct header_ops ipgre_header_ops = {
621 .create = ipgre_header,
6a5f44d7 622 .parse = ipgre_header_parse,
3b04ddde
SH
623};
624
6a5f44d7 625#ifdef CONFIG_NET_IPGRE_BROADCAST
1da177e4
LT
626static int ipgre_open(struct net_device *dev)
627{
2941a486 628 struct ip_tunnel *t = netdev_priv(dev);
1da177e4 629
f97c1e0c 630 if (ipv4_is_multicast(t->parms.iph.daddr)) {
cbb1e85f
DM
631 struct flowi4 fl4;
632 struct rtable *rt;
633
b57708ad 634 rt = ip_route_output_gre(t->net, &fl4,
cbb1e85f
DM
635 t->parms.iph.daddr,
636 t->parms.iph.saddr,
637 t->parms.o_key,
638 RT_TOS(t->parms.iph.tos),
639 t->parms.link);
b23dd4fe 640 if (IS_ERR(rt))
1da177e4 641 return -EADDRNOTAVAIL;
d8d1f30b 642 dev = rt->dst.dev;
1da177e4 643 ip_rt_put(rt);
51456b29 644 if (!__in_dev_get_rtnl(dev))
1da177e4
LT
645 return -EADDRNOTAVAIL;
646 t->mlink = dev->ifindex;
e5ed6399 647 ip_mc_inc_group(__in_dev_get_rtnl(dev), t->parms.iph.daddr);
1da177e4
LT
648 }
649 return 0;
650}
651
652static int ipgre_close(struct net_device *dev)
653{
2941a486 654 struct ip_tunnel *t = netdev_priv(dev);
b8c26a33 655
f97c1e0c 656 if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) {
7fee0ca2 657 struct in_device *in_dev;
b57708ad 658 in_dev = inetdev_by_index(t->net, t->mlink);
8723e1b4 659 if (in_dev)
1da177e4 660 ip_mc_dec_group(in_dev, t->parms.iph.daddr);
1da177e4
LT
661 }
662 return 0;
663}
1da177e4
LT
664#endif
665
b8c26a33
SH
666static const struct net_device_ops ipgre_netdev_ops = {
667 .ndo_init = ipgre_tunnel_init,
c5441932 668 .ndo_uninit = ip_tunnel_uninit,
b8c26a33
SH
669#ifdef CONFIG_NET_IPGRE_BROADCAST
670 .ndo_open = ipgre_open,
671 .ndo_stop = ipgre_close,
672#endif
c5441932 673 .ndo_start_xmit = ipgre_xmit,
b8c26a33 674 .ndo_do_ioctl = ipgre_tunnel_ioctl,
c5441932
PS
675 .ndo_change_mtu = ip_tunnel_change_mtu,
676 .ndo_get_stats64 = ip_tunnel_get_stats64,
1e99584b 677 .ndo_get_iflink = ip_tunnel_get_iflink,
b8c26a33
SH
678};
679
6b78f16e
ED
680#define GRE_FEATURES (NETIF_F_SG | \
681 NETIF_F_FRAGLIST | \
682 NETIF_F_HIGHDMA | \
683 NETIF_F_HW_CSUM)
684
1da177e4
LT
685static void ipgre_tunnel_setup(struct net_device *dev)
686{
b8c26a33 687 dev->netdev_ops = &ipgre_netdev_ops;
5a455275 688 dev->type = ARPHRD_IPGRE;
c5441932
PS
689 ip_tunnel_setup(dev, ipgre_net_id);
690}
1da177e4 691
c5441932
PS
692static void __gre_tunnel_init(struct net_device *dev)
693{
694 struct ip_tunnel *tunnel;
4565e991 695 int t_hlen;
c5441932
PS
696
697 tunnel = netdev_priv(dev);
95f5c64c 698 tunnel->tun_hlen = gre_calc_hlen(tunnel->parms.o_flags);
c5441932
PS
699 tunnel->parms.iph.protocol = IPPROTO_GRE;
700
4565e991
TH
701 tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
702
703 t_hlen = tunnel->hlen + sizeof(struct iphdr);
704
705 dev->needed_headroom = LL_MAX_HEADER + t_hlen + 4;
706 dev->mtu = ETH_DATA_LEN - t_hlen - 4;
6b78f16e 707
b57708ad 708 dev->features |= GRE_FEATURES;
6b78f16e 709 dev->hw_features |= GRE_FEATURES;
c5441932
PS
710
711 if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) {
a0ca153f
AD
712 /* TCP offload with GRE SEQ is not supported, nor
713 * can we support 2 levels of outer headers requiring
714 * an update.
715 */
716 if (!(tunnel->parms.o_flags & TUNNEL_CSUM) ||
717 (tunnel->encap.type == TUNNEL_ENCAP_NONE)) {
718 dev->features |= NETIF_F_GSO_SOFTWARE;
719 dev->hw_features |= NETIF_F_GSO_SOFTWARE;
720 }
721
c5441932
PS
722 /* Can use a lockless transmit, unless we generate
723 * output sequences
724 */
725 dev->features |= NETIF_F_LLTX;
726 }
1da177e4
LT
727}
728
729static int ipgre_tunnel_init(struct net_device *dev)
730{
c5441932
PS
731 struct ip_tunnel *tunnel = netdev_priv(dev);
732 struct iphdr *iph = &tunnel->parms.iph;
1da177e4 733
c5441932 734 __gre_tunnel_init(dev);
1da177e4 735
c5441932
PS
736 memcpy(dev->dev_addr, &iph->saddr, 4);
737 memcpy(dev->broadcast, &iph->daddr, 4);
1da177e4 738
c5441932 739 dev->flags = IFF_NOARP;
02875878 740 netif_keep_dst(dev);
c5441932 741 dev->addr_len = 4;
1da177e4 742
a64b04d8 743 if (iph->daddr && !tunnel->collect_md) {
1da177e4 744#ifdef CONFIG_NET_IPGRE_BROADCAST
f97c1e0c 745 if (ipv4_is_multicast(iph->daddr)) {
1da177e4
LT
746 if (!iph->saddr)
747 return -EINVAL;
748 dev->flags = IFF_BROADCAST;
3b04ddde 749 dev->header_ops = &ipgre_header_ops;
1da177e4
LT
750 }
751#endif
a64b04d8 752 } else if (!tunnel->collect_md) {
6a5f44d7 753 dev->header_ops = &ipgre_header_ops;
a64b04d8 754 }
1da177e4 755
c5441932 756 return ip_tunnel_init(dev);
1da177e4
LT
757}
758
9f57c67c
PS
759static const struct gre_protocol ipgre_protocol = {
760 .handler = gre_rcv,
761 .err_handler = gre_err,
1da177e4
LT
762};
763
2c8c1e72 764static int __net_init ipgre_init_net(struct net *net)
59a4c759 765{
c5441932 766 return ip_tunnel_init_net(net, ipgre_net_id, &ipgre_link_ops, NULL);
59a4c759
PE
767}
768
2c8c1e72 769static void __net_exit ipgre_exit_net(struct net *net)
59a4c759 770{
c5441932 771 struct ip_tunnel_net *itn = net_generic(net, ipgre_net_id);
6c742e71 772 ip_tunnel_delete_net(itn, &ipgre_link_ops);
59a4c759
PE
773}
774
775static struct pernet_operations ipgre_net_ops = {
776 .init = ipgre_init_net,
777 .exit = ipgre_exit_net,
cfb8fbf2 778 .id = &ipgre_net_id,
c5441932 779 .size = sizeof(struct ip_tunnel_net),
59a4c759 780};
1da177e4 781
a8b8a889
MS
782static int ipgre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[],
783 struct netlink_ext_ack *extack)
c19e654d
HX
784{
785 __be16 flags;
786
787 if (!data)
788 return 0;
789
790 flags = 0;
791 if (data[IFLA_GRE_IFLAGS])
792 flags |= nla_get_be16(data[IFLA_GRE_IFLAGS]);
793 if (data[IFLA_GRE_OFLAGS])
794 flags |= nla_get_be16(data[IFLA_GRE_OFLAGS]);
795 if (flags & (GRE_VERSION|GRE_ROUTING))
796 return -EINVAL;
797
946b636f
JB
798 if (data[IFLA_GRE_COLLECT_METADATA] &&
799 data[IFLA_GRE_ENCAP_TYPE] &&
800 nla_get_u16(data[IFLA_GRE_ENCAP_TYPE]) != TUNNEL_ENCAP_NONE)
801 return -EINVAL;
802
c19e654d
HX
803 return 0;
804}
805
a8b8a889
MS
806static int ipgre_tap_validate(struct nlattr *tb[], struct nlattr *data[],
807 struct netlink_ext_ack *extack)
e1a80002
HX
808{
809 __be32 daddr;
810
811 if (tb[IFLA_ADDRESS]) {
812 if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
813 return -EINVAL;
814 if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
815 return -EADDRNOTAVAIL;
816 }
817
818 if (!data)
819 goto out;
820
821 if (data[IFLA_GRE_REMOTE]) {
822 memcpy(&daddr, nla_data(data[IFLA_GRE_REMOTE]), 4);
823 if (!daddr)
824 return -EINVAL;
825 }
826
827out:
a8b8a889 828 return ipgre_tunnel_validate(tb, data, extack);
e1a80002
HX
829}
830
22a59be8 831static int ipgre_netlink_parms(struct net_device *dev,
2e15ea39
PS
832 struct nlattr *data[],
833 struct nlattr *tb[],
9830ad4c
CG
834 struct ip_tunnel_parm *parms,
835 __u32 *fwmark)
c19e654d 836{
22a59be8
PP
837 struct ip_tunnel *t = netdev_priv(dev);
838
7bb82d92 839 memset(parms, 0, sizeof(*parms));
c19e654d
HX
840
841 parms->iph.protocol = IPPROTO_GRE;
842
843 if (!data)
22a59be8 844 return 0;
c19e654d
HX
845
846 if (data[IFLA_GRE_LINK])
847 parms->link = nla_get_u32(data[IFLA_GRE_LINK]);
848
849 if (data[IFLA_GRE_IFLAGS])
c5441932 850 parms->i_flags = gre_flags_to_tnl_flags(nla_get_be16(data[IFLA_GRE_IFLAGS]));
c19e654d
HX
851
852 if (data[IFLA_GRE_OFLAGS])
c5441932 853 parms->o_flags = gre_flags_to_tnl_flags(nla_get_be16(data[IFLA_GRE_OFLAGS]));
c19e654d
HX
854
855 if (data[IFLA_GRE_IKEY])
856 parms->i_key = nla_get_be32(data[IFLA_GRE_IKEY]);
857
858 if (data[IFLA_GRE_OKEY])
859 parms->o_key = nla_get_be32(data[IFLA_GRE_OKEY]);
860
861 if (data[IFLA_GRE_LOCAL])
67b61f6c 862 parms->iph.saddr = nla_get_in_addr(data[IFLA_GRE_LOCAL]);
c19e654d
HX
863
864 if (data[IFLA_GRE_REMOTE])
67b61f6c 865 parms->iph.daddr = nla_get_in_addr(data[IFLA_GRE_REMOTE]);
c19e654d
HX
866
867 if (data[IFLA_GRE_TTL])
868 parms->iph.ttl = nla_get_u8(data[IFLA_GRE_TTL]);
869
870 if (data[IFLA_GRE_TOS])
871 parms->iph.tos = nla_get_u8(data[IFLA_GRE_TOS]);
872
22a59be8
PP
873 if (!data[IFLA_GRE_PMTUDISC] || nla_get_u8(data[IFLA_GRE_PMTUDISC])) {
874 if (t->ignore_df)
875 return -EINVAL;
c19e654d 876 parms->iph.frag_off = htons(IP_DF);
22a59be8 877 }
2e15ea39
PS
878
879 if (data[IFLA_GRE_COLLECT_METADATA]) {
2e15ea39 880 t->collect_md = true;
e271c7b4
JB
881 if (dev->type == ARPHRD_IPGRE)
882 dev->type = ARPHRD_NONE;
2e15ea39 883 }
22a59be8
PP
884
885 if (data[IFLA_GRE_IGNORE_DF]) {
886 if (nla_get_u8(data[IFLA_GRE_IGNORE_DF])
887 && (parms->iph.frag_off & htons(IP_DF)))
888 return -EINVAL;
889 t->ignore_df = !!nla_get_u8(data[IFLA_GRE_IGNORE_DF]);
890 }
891
9830ad4c
CG
892 if (data[IFLA_GRE_FWMARK])
893 *fwmark = nla_get_u32(data[IFLA_GRE_FWMARK]);
894
22a59be8 895 return 0;
c19e654d
HX
896}
897
4565e991
TH
898/* This function returns true when ENCAP attributes are present in the nl msg */
899static bool ipgre_netlink_encap_parms(struct nlattr *data[],
900 struct ip_tunnel_encap *ipencap)
901{
902 bool ret = false;
903
904 memset(ipencap, 0, sizeof(*ipencap));
905
906 if (!data)
907 return ret;
908
909 if (data[IFLA_GRE_ENCAP_TYPE]) {
910 ret = true;
911 ipencap->type = nla_get_u16(data[IFLA_GRE_ENCAP_TYPE]);
912 }
913
914 if (data[IFLA_GRE_ENCAP_FLAGS]) {
915 ret = true;
916 ipencap->flags = nla_get_u16(data[IFLA_GRE_ENCAP_FLAGS]);
917 }
918
919 if (data[IFLA_GRE_ENCAP_SPORT]) {
920 ret = true;
3e97fa70 921 ipencap->sport = nla_get_be16(data[IFLA_GRE_ENCAP_SPORT]);
4565e991
TH
922 }
923
924 if (data[IFLA_GRE_ENCAP_DPORT]) {
925 ret = true;
3e97fa70 926 ipencap->dport = nla_get_be16(data[IFLA_GRE_ENCAP_DPORT]);
4565e991
TH
927 }
928
929 return ret;
930}
931
c5441932 932static int gre_tap_init(struct net_device *dev)
e1a80002 933{
c5441932 934 __gre_tunnel_init(dev);
bec94d43 935 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
e1a80002 936
c5441932 937 return ip_tunnel_init(dev);
e1a80002
HX
938}
939
c5441932
PS
940static const struct net_device_ops gre_tap_netdev_ops = {
941 .ndo_init = gre_tap_init,
942 .ndo_uninit = ip_tunnel_uninit,
943 .ndo_start_xmit = gre_tap_xmit,
b8c26a33
SH
944 .ndo_set_mac_address = eth_mac_addr,
945 .ndo_validate_addr = eth_validate_addr,
c5441932
PS
946 .ndo_change_mtu = ip_tunnel_change_mtu,
947 .ndo_get_stats64 = ip_tunnel_get_stats64,
1e99584b 948 .ndo_get_iflink = ip_tunnel_get_iflink,
fc4099f1 949 .ndo_fill_metadata_dst = gre_fill_metadata_dst,
b8c26a33
SH
950};
951
e1a80002
HX
952static void ipgre_tap_setup(struct net_device *dev)
953{
e1a80002 954 ether_setup(dev);
d13b161c
JB
955 dev->netdev_ops = &gre_tap_netdev_ops;
956 dev->priv_flags &= ~IFF_TX_SKB_SHARING;
957 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
c5441932 958 ip_tunnel_setup(dev, gre_tap_net_id);
e1a80002
HX
959}
960
c5441932 961static int ipgre_newlink(struct net *src_net, struct net_device *dev,
7a3f4a18
MS
962 struct nlattr *tb[], struct nlattr *data[],
963 struct netlink_ext_ack *extack)
c19e654d 964{
c5441932 965 struct ip_tunnel_parm p;
4565e991 966 struct ip_tunnel_encap ipencap;
9830ad4c 967 __u32 fwmark = 0;
22a59be8 968 int err;
4565e991
TH
969
970 if (ipgre_netlink_encap_parms(data, &ipencap)) {
971 struct ip_tunnel *t = netdev_priv(dev);
22a59be8 972 err = ip_tunnel_encap_setup(t, &ipencap);
4565e991
TH
973
974 if (err < 0)
975 return err;
976 }
c19e654d 977
9830ad4c 978 err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark);
22a59be8
PP
979 if (err < 0)
980 return err;
9830ad4c 981 return ip_tunnel_newlink(dev, tb, &p, fwmark);
c19e654d
HX
982}
983
984static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
ad744b22
MS
985 struct nlattr *data[],
986 struct netlink_ext_ack *extack)
c19e654d 987{
9830ad4c 988 struct ip_tunnel *t = netdev_priv(dev);
c19e654d 989 struct ip_tunnel_parm p;
4565e991 990 struct ip_tunnel_encap ipencap;
9830ad4c 991 __u32 fwmark = t->fwmark;
22a59be8 992 int err;
4565e991
TH
993
994 if (ipgre_netlink_encap_parms(data, &ipencap)) {
22a59be8 995 err = ip_tunnel_encap_setup(t, &ipencap);
4565e991
TH
996
997 if (err < 0)
998 return err;
999 }
c19e654d 1000
9830ad4c 1001 err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark);
22a59be8
PP
1002 if (err < 0)
1003 return err;
9830ad4c 1004 return ip_tunnel_changelink(dev, tb, &p, fwmark);
c19e654d
HX
1005}
1006
1007static size_t ipgre_get_size(const struct net_device *dev)
1008{
1009 return
1010 /* IFLA_GRE_LINK */
1011 nla_total_size(4) +
1012 /* IFLA_GRE_IFLAGS */
1013 nla_total_size(2) +
1014 /* IFLA_GRE_OFLAGS */
1015 nla_total_size(2) +
1016 /* IFLA_GRE_IKEY */
1017 nla_total_size(4) +
1018 /* IFLA_GRE_OKEY */
1019 nla_total_size(4) +
1020 /* IFLA_GRE_LOCAL */
1021 nla_total_size(4) +
1022 /* IFLA_GRE_REMOTE */
1023 nla_total_size(4) +
1024 /* IFLA_GRE_TTL */
1025 nla_total_size(1) +
1026 /* IFLA_GRE_TOS */
1027 nla_total_size(1) +
1028 /* IFLA_GRE_PMTUDISC */
1029 nla_total_size(1) +
4565e991
TH
1030 /* IFLA_GRE_ENCAP_TYPE */
1031 nla_total_size(2) +
1032 /* IFLA_GRE_ENCAP_FLAGS */
1033 nla_total_size(2) +
1034 /* IFLA_GRE_ENCAP_SPORT */
1035 nla_total_size(2) +
1036 /* IFLA_GRE_ENCAP_DPORT */
1037 nla_total_size(2) +
2e15ea39
PS
1038 /* IFLA_GRE_COLLECT_METADATA */
1039 nla_total_size(0) +
22a59be8
PP
1040 /* IFLA_GRE_IGNORE_DF */
1041 nla_total_size(1) +
9830ad4c
CG
1042 /* IFLA_GRE_FWMARK */
1043 nla_total_size(4) +
c19e654d
HX
1044 0;
1045}
1046
1047static int ipgre_fill_info(struct sk_buff *skb, const struct net_device *dev)
1048{
1049 struct ip_tunnel *t = netdev_priv(dev);
1050 struct ip_tunnel_parm *p = &t->parms;
1051
f3756b79 1052 if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) ||
95f5c64c
TH
1053 nla_put_be16(skb, IFLA_GRE_IFLAGS,
1054 gre_tnl_flags_to_gre_flags(p->i_flags)) ||
1055 nla_put_be16(skb, IFLA_GRE_OFLAGS,
1056 gre_tnl_flags_to_gre_flags(p->o_flags)) ||
f3756b79
DM
1057 nla_put_be32(skb, IFLA_GRE_IKEY, p->i_key) ||
1058 nla_put_be32(skb, IFLA_GRE_OKEY, p->o_key) ||
930345ea
JB
1059 nla_put_in_addr(skb, IFLA_GRE_LOCAL, p->iph.saddr) ||
1060 nla_put_in_addr(skb, IFLA_GRE_REMOTE, p->iph.daddr) ||
f3756b79
DM
1061 nla_put_u8(skb, IFLA_GRE_TTL, p->iph.ttl) ||
1062 nla_put_u8(skb, IFLA_GRE_TOS, p->iph.tos) ||
1063 nla_put_u8(skb, IFLA_GRE_PMTUDISC,
9830ad4c
CG
1064 !!(p->iph.frag_off & htons(IP_DF))) ||
1065 nla_put_u32(skb, IFLA_GRE_FWMARK, t->fwmark))
f3756b79 1066 goto nla_put_failure;
4565e991
TH
1067
1068 if (nla_put_u16(skb, IFLA_GRE_ENCAP_TYPE,
1069 t->encap.type) ||
3e97fa70
SD
1070 nla_put_be16(skb, IFLA_GRE_ENCAP_SPORT,
1071 t->encap.sport) ||
1072 nla_put_be16(skb, IFLA_GRE_ENCAP_DPORT,
1073 t->encap.dport) ||
4565e991 1074 nla_put_u16(skb, IFLA_GRE_ENCAP_FLAGS,
e1b2cb65 1075 t->encap.flags))
4565e991
TH
1076 goto nla_put_failure;
1077
22a59be8
PP
1078 if (nla_put_u8(skb, IFLA_GRE_IGNORE_DF, t->ignore_df))
1079 goto nla_put_failure;
1080
2e15ea39
PS
1081 if (t->collect_md) {
1082 if (nla_put_flag(skb, IFLA_GRE_COLLECT_METADATA))
1083 goto nla_put_failure;
1084 }
1085
c19e654d
HX
1086 return 0;
1087
1088nla_put_failure:
1089 return -EMSGSIZE;
1090}
1091
1092static const struct nla_policy ipgre_policy[IFLA_GRE_MAX + 1] = {
1093 [IFLA_GRE_LINK] = { .type = NLA_U32 },
1094 [IFLA_GRE_IFLAGS] = { .type = NLA_U16 },
1095 [IFLA_GRE_OFLAGS] = { .type = NLA_U16 },
1096 [IFLA_GRE_IKEY] = { .type = NLA_U32 },
1097 [IFLA_GRE_OKEY] = { .type = NLA_U32 },
4d74f8ba
PM
1098 [IFLA_GRE_LOCAL] = { .len = FIELD_SIZEOF(struct iphdr, saddr) },
1099 [IFLA_GRE_REMOTE] = { .len = FIELD_SIZEOF(struct iphdr, daddr) },
c19e654d
HX
1100 [IFLA_GRE_TTL] = { .type = NLA_U8 },
1101 [IFLA_GRE_TOS] = { .type = NLA_U8 },
1102 [IFLA_GRE_PMTUDISC] = { .type = NLA_U8 },
4565e991
TH
1103 [IFLA_GRE_ENCAP_TYPE] = { .type = NLA_U16 },
1104 [IFLA_GRE_ENCAP_FLAGS] = { .type = NLA_U16 },
1105 [IFLA_GRE_ENCAP_SPORT] = { .type = NLA_U16 },
1106 [IFLA_GRE_ENCAP_DPORT] = { .type = NLA_U16 },
2e15ea39 1107 [IFLA_GRE_COLLECT_METADATA] = { .type = NLA_FLAG },
22a59be8 1108 [IFLA_GRE_IGNORE_DF] = { .type = NLA_U8 },
9830ad4c 1109 [IFLA_GRE_FWMARK] = { .type = NLA_U32 },
c19e654d
HX
1110};
1111
1112static struct rtnl_link_ops ipgre_link_ops __read_mostly = {
1113 .kind = "gre",
1114 .maxtype = IFLA_GRE_MAX,
1115 .policy = ipgre_policy,
1116 .priv_size = sizeof(struct ip_tunnel),
1117 .setup = ipgre_tunnel_setup,
1118 .validate = ipgre_tunnel_validate,
1119 .newlink = ipgre_newlink,
1120 .changelink = ipgre_changelink,
c5441932 1121 .dellink = ip_tunnel_dellink,
c19e654d
HX
1122 .get_size = ipgre_get_size,
1123 .fill_info = ipgre_fill_info,
1728d4fa 1124 .get_link_net = ip_tunnel_get_link_net,
c19e654d
HX
1125};
1126
e1a80002
HX
1127static struct rtnl_link_ops ipgre_tap_ops __read_mostly = {
1128 .kind = "gretap",
1129 .maxtype = IFLA_GRE_MAX,
1130 .policy = ipgre_policy,
1131 .priv_size = sizeof(struct ip_tunnel),
1132 .setup = ipgre_tap_setup,
1133 .validate = ipgre_tap_validate,
1134 .newlink = ipgre_newlink,
1135 .changelink = ipgre_changelink,
c5441932 1136 .dellink = ip_tunnel_dellink,
e1a80002
HX
1137 .get_size = ipgre_get_size,
1138 .fill_info = ipgre_fill_info,
1728d4fa 1139 .get_link_net = ip_tunnel_get_link_net,
e1a80002
HX
1140};
1141
b2acd1dc
PS
1142struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1143 u8 name_assign_type)
1144{
1145 struct nlattr *tb[IFLA_MAX + 1];
1146 struct net_device *dev;
106da663 1147 LIST_HEAD(list_kill);
b2acd1dc
PS
1148 struct ip_tunnel *t;
1149 int err;
1150
1151 memset(&tb, 0, sizeof(tb));
1152
1153 dev = rtnl_create_link(net, name, name_assign_type,
1154 &ipgre_tap_ops, tb);
1155 if (IS_ERR(dev))
1156 return dev;
1157
1158 /* Configure flow based GRE device. */
1159 t = netdev_priv(dev);
1160 t->collect_md = true;
1161
7a3f4a18 1162 err = ipgre_newlink(net, dev, tb, NULL, NULL);
106da663
ND
1163 if (err < 0) {
1164 free_netdev(dev);
1165 return ERR_PTR(err);
1166 }
7e059158
DW
1167
1168 /* openvswitch users expect packet sizes to be unrestricted,
1169 * so set the largest MTU we can.
1170 */
1171 err = __ip_tunnel_change_mtu(dev, IP_MAX_MTU, false);
1172 if (err)
1173 goto out;
1174
da6f1da8
ND
1175 err = rtnl_configure_link(dev, NULL);
1176 if (err < 0)
1177 goto out;
1178
b2acd1dc
PS
1179 return dev;
1180out:
106da663
ND
1181 ip_tunnel_dellink(dev, &list_kill);
1182 unregister_netdevice_many(&list_kill);
b2acd1dc
PS
1183 return ERR_PTR(err);
1184}
1185EXPORT_SYMBOL_GPL(gretap_fb_dev_create);
1186
c5441932
PS
1187static int __net_init ipgre_tap_init_net(struct net *net)
1188{
2e15ea39 1189 return ip_tunnel_init_net(net, gre_tap_net_id, &ipgre_tap_ops, "gretap0");
c5441932
PS
1190}
1191
1192static void __net_exit ipgre_tap_exit_net(struct net *net)
1193{
1194 struct ip_tunnel_net *itn = net_generic(net, gre_tap_net_id);
6c742e71 1195 ip_tunnel_delete_net(itn, &ipgre_tap_ops);
c5441932
PS
1196}
1197
1198static struct pernet_operations ipgre_tap_net_ops = {
1199 .init = ipgre_tap_init_net,
1200 .exit = ipgre_tap_exit_net,
1201 .id = &gre_tap_net_id,
1202 .size = sizeof(struct ip_tunnel_net),
1203};
1da177e4
LT
1204
1205static int __init ipgre_init(void)
1206{
1207 int err;
1208
058bd4d2 1209 pr_info("GRE over IPv4 tunneling driver\n");
1da177e4 1210
cfb8fbf2 1211 err = register_pernet_device(&ipgre_net_ops);
59a4c759 1212 if (err < 0)
c2892f02
AD
1213 return err;
1214
c5441932
PS
1215 err = register_pernet_device(&ipgre_tap_net_ops);
1216 if (err < 0)
1217 goto pnet_tap_faied;
1218
9f57c67c 1219 err = gre_add_protocol(&ipgre_protocol, GREPROTO_CISCO);
c2892f02 1220 if (err < 0) {
058bd4d2 1221 pr_info("%s: can't add protocol\n", __func__);
c2892f02
AD
1222 goto add_proto_failed;
1223 }
7daa0004 1224
c19e654d
HX
1225 err = rtnl_link_register(&ipgre_link_ops);
1226 if (err < 0)
1227 goto rtnl_link_failed;
1228
e1a80002
HX
1229 err = rtnl_link_register(&ipgre_tap_ops);
1230 if (err < 0)
1231 goto tap_ops_failed;
1232
c5441932 1233 return 0;
c19e654d 1234
e1a80002
HX
1235tap_ops_failed:
1236 rtnl_link_unregister(&ipgre_link_ops);
c19e654d 1237rtnl_link_failed:
9f57c67c 1238 gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO);
c2892f02 1239add_proto_failed:
c5441932
PS
1240 unregister_pernet_device(&ipgre_tap_net_ops);
1241pnet_tap_faied:
c2892f02 1242 unregister_pernet_device(&ipgre_net_ops);
c5441932 1243 return err;
1da177e4
LT
1244}
1245
db44575f 1246static void __exit ipgre_fini(void)
1da177e4 1247{
e1a80002 1248 rtnl_link_unregister(&ipgre_tap_ops);
c19e654d 1249 rtnl_link_unregister(&ipgre_link_ops);
9f57c67c 1250 gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO);
c5441932 1251 unregister_pernet_device(&ipgre_tap_net_ops);
c2892f02 1252 unregister_pernet_device(&ipgre_net_ops);
1da177e4
LT
1253}
1254
1255module_init(ipgre_init);
1256module_exit(ipgre_fini);
1257MODULE_LICENSE("GPL");
4d74f8ba
PM
1258MODULE_ALIAS_RTNL_LINK("gre");
1259MODULE_ALIAS_RTNL_LINK("gretap");
8909c9ad 1260MODULE_ALIAS_NETDEV("gre0");
c5441932 1261MODULE_ALIAS_NETDEV("gretap0");