Merge remote-tracking branch 'asoc/topic/pcm5102a' into asoc-next
[linux-2.6-block.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>
84e54fe0 51#include <net/erspan.h>
1da177e4 52
1da177e4
LT
53/*
54 Problems & solutions
55 --------------------
56
57 1. The most important issue is detecting local dead loops.
58 They would cause complete host lockup in transmit, which
59 would be "resolved" by stack overflow or, if queueing is enabled,
60 with infinite looping in net_bh.
61
62 We cannot track such dead loops during route installation,
63 it is infeasible task. The most general solutions would be
64 to keep skb->encapsulation counter (sort of local ttl),
6d0722a2 65 and silently drop packet when it expires. It is a good
bff52857 66 solution, but it supposes maintaining new variable in ALL
1da177e4
LT
67 skb, even if no tunneling is used.
68
6d0722a2
ED
69 Current solution: xmit_recursion breaks dead loops. This is a percpu
70 counter, since when we enter the first ndo_xmit(), cpu migration is
71 forbidden. We force an exit if this counter reaches RECURSION_LIMIT
1da177e4
LT
72
73 2. Networking dead loops would not kill routers, but would really
74 kill network. IP hop limit plays role of "t->recursion" in this case,
75 if we copy it from packet being encapsulated to upper header.
76 It is very good solution, but it introduces two problems:
77
78 - Routing protocols, using packets with ttl=1 (OSPF, RIP2),
79 do not work over tunnels.
80 - traceroute does not work. I planned to relay ICMP from tunnel,
81 so that this problem would be solved and traceroute output
82 would even more informative. This idea appeared to be wrong:
83 only Linux complies to rfc1812 now (yes, guys, Linux is the only
84 true router now :-)), all routers (at least, in neighbourhood of mine)
85 return only 8 bytes of payload. It is the end.
86
87 Hence, if we want that OSPF worked or traceroute said something reasonable,
88 we should search for another solution.
89
90 One of them is to parse packet trying to detect inner encapsulation
91 made by our node. It is difficult or even impossible, especially,
bff52857 92 taking into account fragmentation. TO be short, ttl is not solution at all.
1da177e4
LT
93
94 Current solution: The solution was UNEXPECTEDLY SIMPLE.
95 We force DF flag on tunnels with preconfigured hop limit,
96 that is ALL. :-) Well, it does not remove the problem completely,
97 but exponential growth of network traffic is changed to linear
98 (branches, that exceed pmtu are pruned) and tunnel mtu
bff52857 99 rapidly degrades to value <68, where looping stops.
1da177e4
LT
100 Yes, it is not good if there exists a router in the loop,
101 which does not force DF, even when encapsulating packets have DF set.
102 But it is not our problem! Nobody could accuse us, we made
103 all that we could make. Even if it is your gated who injected
104 fatal route to network, even if it were you who configured
105 fatal static route: you are innocent. :-)
106
1da177e4
LT
107 Alexey Kuznetsov.
108 */
109
eccc1bb8 110static bool log_ecn_error = true;
111module_param(log_ecn_error, bool, 0644);
112MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
113
c19e654d 114static struct rtnl_link_ops ipgre_link_ops __read_mostly;
1da177e4 115static int ipgre_tunnel_init(struct net_device *dev);
1a66a836 116static void erspan_build_header(struct sk_buff *skb,
c69de58b 117 u32 id, u32 index,
a3222dc9 118 bool truncate, bool is_ipv4);
eb8ce741 119
c7d03a00
AD
120static unsigned int ipgre_net_id __read_mostly;
121static unsigned int gre_tap_net_id __read_mostly;
84e54fe0 122static unsigned int erspan_net_id __read_mostly;
1da177e4 123
9f57c67c
PS
124static void ipgre_err(struct sk_buff *skb, u32 info,
125 const struct tnl_ptk_info *tpi)
1da177e4 126{
1da177e4 127
c5441932
PS
128 /* All the routers (except for Linux) return only
129 8 bytes of packet payload. It means, that precise relaying of
130 ICMP in the real Internet is absolutely infeasible.
1da177e4 131
c5441932
PS
132 Moreover, Cisco "wise men" put GRE key to the third word
133 in GRE header. It makes impossible maintaining even soft
134 state for keyed GRE tunnels with enabled checksum. Tell
135 them "thank you".
1da177e4 136
c5441932
PS
137 Well, I wonder, rfc1812 was written by Cisco employee,
138 what the hell these idiots break standards established
139 by themselves???
140 */
141 struct net *net = dev_net(skb->dev);
142 struct ip_tunnel_net *itn;
96f5a846 143 const struct iphdr *iph;
88c7664f
ACM
144 const int type = icmp_hdr(skb)->type;
145 const int code = icmp_hdr(skb)->code;
20e1954f 146 unsigned int data_len = 0;
1da177e4 147 struct ip_tunnel *t;
1da177e4 148
1da177e4
LT
149 switch (type) {
150 default:
151 case ICMP_PARAMETERPROB:
9f57c67c 152 return;
1da177e4
LT
153
154 case ICMP_DEST_UNREACH:
155 switch (code) {
156 case ICMP_SR_FAILED:
157 case ICMP_PORT_UNREACH:
158 /* Impossible event. */
9f57c67c 159 return;
1da177e4
LT
160 default:
161 /* All others are translated to HOST_UNREACH.
162 rfc2003 contains "deep thoughts" about NET_UNREACH,
163 I believe they are just ether pollution. --ANK
164 */
165 break;
166 }
167 break;
9f57c67c 168
1da177e4
LT
169 case ICMP_TIME_EXCEEDED:
170 if (code != ICMP_EXC_TTL)
9f57c67c 171 return;
20e1954f 172 data_len = icmp_hdr(skb)->un.reserved[1] * 4; /* RFC 4884 4.1 */
1da177e4 173 break;
55be7a9c
DM
174
175 case ICMP_REDIRECT:
176 break;
1da177e4
LT
177 }
178
bda7bb46 179 if (tpi->proto == htons(ETH_P_TEB))
c5441932
PS
180 itn = net_generic(net, gre_tap_net_id);
181 else
182 itn = net_generic(net, ipgre_net_id);
183
c0c0c50f 184 iph = (const struct iphdr *)(icmp_hdr(skb) + 1);
bda7bb46
PS
185 t = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi->flags,
186 iph->daddr, iph->saddr, tpi->key);
d2083287 187
51456b29 188 if (!t)
9f57c67c 189 return;
36393395 190
9b8c6d7b
ED
191#if IS_ENABLED(CONFIG_IPV6)
192 if (tpi->proto == htons(ETH_P_IPV6) &&
20e1954f
ED
193 !ip6_err_gen_icmpv6_unreach(skb, iph->ihl * 4 + tpi->hdr_len,
194 type, data_len))
9b8c6d7b
ED
195 return;
196#endif
197
36393395 198 if (t->parms.iph.daddr == 0 ||
f97c1e0c 199 ipv4_is_multicast(t->parms.iph.daddr))
9f57c67c 200 return;
1da177e4
LT
201
202 if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
9f57c67c 203 return;
1da177e4 204
da6185d8 205 if (time_before(jiffies, t->err_time + IPTUNNEL_ERR_TIMEO))
1da177e4
LT
206 t->err_count++;
207 else
208 t->err_count = 1;
209 t->err_time = jiffies;
9f57c67c
PS
210}
211
212static void gre_err(struct sk_buff *skb, u32 info)
213{
214 /* All the routers (except for Linux) return only
215 * 8 bytes of packet payload. It means, that precise relaying of
216 * ICMP in the real Internet is absolutely infeasible.
217 *
218 * Moreover, Cisco "wise men" put GRE key to the third word
219 * in GRE header. It makes impossible maintaining even soft
220 * state for keyed
221 * GRE tunnels with enabled checksum. Tell them "thank you".
222 *
223 * Well, I wonder, rfc1812 was written by Cisco employee,
224 * what the hell these idiots break standards established
225 * by themselves???
226 */
227
e582615a 228 const struct iphdr *iph = (struct iphdr *)skb->data;
9f57c67c
PS
229 const int type = icmp_hdr(skb)->type;
230 const int code = icmp_hdr(skb)->code;
231 struct tnl_ptk_info tpi;
232 bool csum_err = false;
233
e582615a
ED
234 if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP),
235 iph->ihl * 4) < 0) {
9f57c67c
PS
236 if (!csum_err) /* ignore csum errors. */
237 return;
238 }
239
240 if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
241 ipv4_update_pmtu(skb, dev_net(skb->dev), info,
242 skb->dev->ifindex, 0, IPPROTO_GRE, 0);
243 return;
244 }
245 if (type == ICMP_REDIRECT) {
246 ipv4_redirect(skb, dev_net(skb->dev), skb->dev->ifindex, 0,
247 IPPROTO_GRE, 0);
248 return;
249 }
250
251 ipgre_err(skb, info, &tpi);
1da177e4
LT
252}
253
84e54fe0
WT
254static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,
255 int gre_hdr_len)
256{
257 struct net *net = dev_net(skb->dev);
258 struct metadata_dst *tun_dst = NULL;
1d7e2ed2
WT
259 struct erspan_base_hdr *ershdr;
260 struct erspan_metadata *pkt_md;
84e54fe0
WT
261 struct ip_tunnel_net *itn;
262 struct ip_tunnel *tunnel;
84e54fe0 263 const struct iphdr *iph;
3df19283 264 struct erspan_md2 *md2;
1d7e2ed2 265 int ver;
84e54fe0
WT
266 int len;
267
268 itn = net_generic(net, erspan_net_id);
84e54fe0
WT
269 len = gre_hdr_len + sizeof(*ershdr);
270
1d7e2ed2 271 /* Check based hdr len */
84e54fe0 272 if (unlikely(!pskb_may_pull(skb, len)))
c05fad57 273 return PACKET_REJECT;
84e54fe0
WT
274
275 iph = ip_hdr(skb);
1d7e2ed2 276 ershdr = (struct erspan_base_hdr *)(skb->data + gre_hdr_len);
c69de58b 277 ver = ershdr->ver;
84e54fe0
WT
278
279 /* The original GRE header does not have key field,
280 * Use ERSPAN 10-bit session ID as key.
281 */
c69de58b 282 tpi->key = cpu_to_be32(get_session_id(ershdr));
84e54fe0
WT
283 tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex,
284 tpi->flags | TUNNEL_KEY,
285 iph->saddr, iph->daddr, tpi->key);
286
287 if (tunnel) {
1d7e2ed2
WT
288 len = gre_hdr_len + erspan_hdr_len(ver);
289 if (unlikely(!pskb_may_pull(skb, len)))
ae3e1337 290 return PACKET_REJECT;
1d7e2ed2 291
d91e8db5
WT
292 ershdr = (struct erspan_base_hdr *)(skb->data + gre_hdr_len);
293 pkt_md = (struct erspan_metadata *)(ershdr + 1);
294
84e54fe0 295 if (__iptunnel_pull_header(skb,
1d7e2ed2 296 len,
84e54fe0
WT
297 htons(ETH_P_TEB),
298 false, false) < 0)
299 goto drop;
300
1a66a836
WT
301 if (tunnel->collect_md) {
302 struct ip_tunnel_info *info;
303 struct erspan_metadata *md;
304 __be64 tun_id;
305 __be16 flags;
306
307 tpi->flags |= TUNNEL_KEY;
308 flags = tpi->flags;
309 tun_id = key32_to_tunnel_id(tpi->key);
310
311 tun_dst = ip_tun_rx_dst(skb, flags,
312 tun_id, sizeof(*md));
313 if (!tun_dst)
314 return PACKET_REJECT;
315
316 md = ip_tunnel_info_opts(&tun_dst->u.tun_info);
f551c91d 317 md->version = ver;
3df19283
WT
318 md2 = &md->u.md2;
319 memcpy(md2, pkt_md, ver == 1 ? ERSPAN_V1_MDSIZE :
320 ERSPAN_V2_MDSIZE);
f551c91d 321
1a66a836
WT
322 info = &tun_dst->u.tun_info;
323 info->key.tun_flags |= TUNNEL_ERSPAN_OPT;
324 info->options_len = sizeof(*md);
1a66a836
WT
325 }
326
84e54fe0
WT
327 skb_reset_mac_header(skb);
328 ip_tunnel_rcv(tunnel, skb, tpi, tun_dst, log_ecn_error);
329 return PACKET_RCVD;
330 }
331drop:
332 kfree_skb(skb);
333 return PACKET_RCVD;
334}
335
125372fa
JB
336static int __ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
337 struct ip_tunnel_net *itn, int hdr_len, bool raw_proto)
1da177e4 338{
2e15ea39 339 struct metadata_dst *tun_dst = NULL;
b71d1d42 340 const struct iphdr *iph;
1da177e4 341 struct ip_tunnel *tunnel;
1da177e4 342
c5441932 343 iph = ip_hdr(skb);
bda7bb46
PS
344 tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi->flags,
345 iph->saddr, iph->daddr, tpi->key);
e1a80002 346
d2083287 347 if (tunnel) {
125372fa
JB
348 if (__iptunnel_pull_header(skb, hdr_len, tpi->proto,
349 raw_proto, false) < 0)
244a797b
JB
350 goto drop;
351
e271c7b4
JB
352 if (tunnel->dev->type != ARPHRD_NONE)
353 skb_pop_mac_header(skb);
354 else
355 skb_reset_mac_header(skb);
2e15ea39 356 if (tunnel->collect_md) {
c29a70d2
PS
357 __be16 flags;
358 __be64 tun_id;
2e15ea39 359
c29a70d2 360 flags = tpi->flags & (TUNNEL_CSUM | TUNNEL_KEY);
d817f432 361 tun_id = key32_to_tunnel_id(tpi->key);
c29a70d2 362 tun_dst = ip_tun_rx_dst(skb, flags, tun_id, 0);
2e15ea39
PS
363 if (!tun_dst)
364 return PACKET_REJECT;
2e15ea39
PS
365 }
366
367 ip_tunnel_rcv(tunnel, skb, tpi, tun_dst, log_ecn_error);
bda7bb46 368 return PACKET_RCVD;
1da177e4 369 }
125372fa 370 return PACKET_NEXT;
244a797b
JB
371
372drop:
373 kfree_skb(skb);
374 return PACKET_RCVD;
1da177e4
LT
375}
376
125372fa
JB
377static int ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
378 int hdr_len)
379{
380 struct net *net = dev_net(skb->dev);
381 struct ip_tunnel_net *itn;
382 int res;
383
384 if (tpi->proto == htons(ETH_P_TEB))
385 itn = net_generic(net, gre_tap_net_id);
386 else
387 itn = net_generic(net, ipgre_net_id);
388
389 res = __ipgre_rcv(skb, tpi, itn, hdr_len, false);
390 if (res == PACKET_NEXT && tpi->proto == htons(ETH_P_TEB)) {
391 /* ipgre tunnels in collect metadata mode should receive
392 * also ETH_P_TEB traffic.
393 */
394 itn = net_generic(net, ipgre_net_id);
395 res = __ipgre_rcv(skb, tpi, itn, hdr_len, true);
396 }
397 return res;
398}
399
9f57c67c
PS
400static int gre_rcv(struct sk_buff *skb)
401{
402 struct tnl_ptk_info tpi;
403 bool csum_err = false;
95f5c64c 404 int hdr_len;
9f57c67c
PS
405
406#ifdef CONFIG_NET_IPGRE_BROADCAST
407 if (ipv4_is_multicast(ip_hdr(skb)->daddr)) {
408 /* Looped back packet, drop it! */
409 if (rt_is_output_route(skb_rtable(skb)))
410 goto drop;
411 }
412#endif
413
e582615a 414 hdr_len = gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP), 0);
f132ae7c 415 if (hdr_len < 0)
95f5c64c
TH
416 goto drop;
417
f551c91d
WT
418 if (unlikely(tpi.proto == htons(ETH_P_ERSPAN) ||
419 tpi.proto == htons(ETH_P_ERSPAN2))) {
84e54fe0
WT
420 if (erspan_rcv(skb, &tpi, hdr_len) == PACKET_RCVD)
421 return 0;
dd8d5b8c 422 goto out;
84e54fe0
WT
423 }
424
244a797b 425 if (ipgre_rcv(skb, &tpi, hdr_len) == PACKET_RCVD)
9f57c67c
PS
426 return 0;
427
dd8d5b8c 428out:
9f57c67c
PS
429 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
430drop:
431 kfree_skb(skb);
432 return 0;
433}
434
c5441932
PS
435static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
436 const struct iphdr *tnl_params,
437 __be16 proto)
438{
439 struct ip_tunnel *tunnel = netdev_priv(dev);
1da177e4 440
c5441932
PS
441 if (tunnel->parms.o_flags & TUNNEL_SEQ)
442 tunnel->o_seqno++;
1da177e4 443
c5441932 444 /* Push GRE header. */
182a352d
TH
445 gre_build_header(skb, tunnel->tun_hlen,
446 tunnel->parms.o_flags, proto, tunnel->parms.o_key,
447 htonl(tunnel->o_seqno));
54bc9bac 448
bf3d6a8f 449 ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
c5441932 450}
1da177e4 451
aed069df 452static int gre_handle_offloads(struct sk_buff *skb, bool csum)
b2acd1dc 453{
6fa79666 454 return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
b2acd1dc
PS
455}
456
fc4099f1
PS
457static struct rtable *gre_get_rt(struct sk_buff *skb,
458 struct net_device *dev,
459 struct flowi4 *fl,
460 const struct ip_tunnel_key *key)
461{
462 struct net *net = dev_net(dev);
463
464 memset(fl, 0, sizeof(*fl));
465 fl->daddr = key->u.ipv4.dst;
466 fl->saddr = key->u.ipv4.src;
467 fl->flowi4_tos = RT_TOS(key->tos);
468 fl->flowi4_mark = skb->mark;
469 fl->flowi4_proto = IPPROTO_GRE;
470
471 return ip_route_output_key(net, fl);
472}
473
862a03c3
WT
474static struct rtable *prepare_fb_xmit(struct sk_buff *skb,
475 struct net_device *dev,
476 struct flowi4 *fl,
477 int tunnel_hlen)
2e15ea39
PS
478{
479 struct ip_tunnel_info *tun_info;
2e15ea39 480 const struct ip_tunnel_key *key;
db3c6139 481 struct rtable *rt = NULL;
2e15ea39 482 int min_headroom;
db3c6139 483 bool use_cache;
2e15ea39
PS
484 int err;
485
61adedf3 486 tun_info = skb_tunnel_info(skb);
2e15ea39 487 key = &tun_info->key;
db3c6139 488 use_cache = ip_tunnel_dst_cache_usable(skb, tun_info);
862a03c3 489
db3c6139 490 if (use_cache)
862a03c3 491 rt = dst_cache_get_ip4(&tun_info->dst_cache, &fl->saddr);
3c1cb4d2 492 if (!rt) {
862a03c3 493 rt = gre_get_rt(skb, dev, fl, key);
3c1cb4d2 494 if (IS_ERR(rt))
862a03c3 495 goto err_free_skb;
db3c6139 496 if (use_cache)
3c1cb4d2 497 dst_cache_set_ip4(&tun_info->dst_cache, &rt->dst,
862a03c3 498 fl->saddr);
3c1cb4d2 499 }
2e15ea39 500
2e15ea39
PS
501 min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
502 + tunnel_hlen + sizeof(struct iphdr);
503 if (skb_headroom(skb) < min_headroom || skb_header_cloned(skb)) {
504 int head_delta = SKB_DATA_ALIGN(min_headroom -
505 skb_headroom(skb) +
506 16);
507 err = pskb_expand_head(skb, max_t(int, head_delta, 0),
508 0, GFP_ATOMIC);
509 if (unlikely(err))
510 goto err_free_rt;
511 }
862a03c3
WT
512 return rt;
513
514err_free_rt:
515 ip_rt_put(rt);
516err_free_skb:
517 kfree_skb(skb);
518 dev->stats.tx_dropped++;
519 return NULL;
520}
521
522static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev,
523 __be16 proto)
524{
525 struct ip_tunnel_info *tun_info;
526 const struct ip_tunnel_key *key;
527 struct rtable *rt = NULL;
528 struct flowi4 fl;
529 int tunnel_hlen;
530 __be16 df, flags;
531
532 tun_info = skb_tunnel_info(skb);
533 if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) ||
534 ip_tunnel_info_af(tun_info) != AF_INET))
535 goto err_free_skb;
536
537 key = &tun_info->key;
538 tunnel_hlen = gre_calc_hlen(key->tun_flags);
539
540 rt = prepare_fb_xmit(skb, dev, &fl, tunnel_hlen);
541 if (!rt)
542 return;
2e15ea39
PS
543
544 /* Push Tunnel header. */
aed069df 545 if (gre_handle_offloads(skb, !!(tun_info->key.tun_flags & TUNNEL_CSUM)))
2e15ea39 546 goto err_free_rt;
2e15ea39
PS
547
548 flags = tun_info->key.tun_flags & (TUNNEL_CSUM | TUNNEL_KEY);
cba65321 549 gre_build_header(skb, tunnel_hlen, flags, proto,
d817f432 550 tunnel_id_to_key32(tun_info->key.tun_id), 0);
2e15ea39
PS
551
552 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
039f5062
PS
553
554 iptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,
555 key->tos, key->ttl, df, false);
2e15ea39
PS
556 return;
557
558err_free_rt:
559 ip_rt_put(rt);
560err_free_skb:
561 kfree_skb(skb);
562 dev->stats.tx_dropped++;
563}
564
1a66a836
WT
565static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev,
566 __be16 proto)
567{
568 struct ip_tunnel *tunnel = netdev_priv(dev);
569 struct ip_tunnel_info *tun_info;
570 const struct ip_tunnel_key *key;
571 struct erspan_metadata *md;
572 struct rtable *rt = NULL;
573 bool truncate = false;
574 struct flowi4 fl;
575 int tunnel_hlen;
f551c91d 576 int version;
1a66a836
WT
577 __be16 df;
578
579 tun_info = skb_tunnel_info(skb);
580 if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) ||
581 ip_tunnel_info_af(tun_info) != AF_INET))
582 goto err_free_skb;
583
584 key = &tun_info->key;
f551c91d
WT
585 md = ip_tunnel_info_opts(tun_info);
586 if (!md)
587 goto err_free_rt;
1a66a836
WT
588
589 /* ERSPAN has fixed 8 byte GRE header */
f551c91d
WT
590 version = md->version;
591 tunnel_hlen = 8 + erspan_hdr_len(version);
1a66a836
WT
592
593 rt = prepare_fb_xmit(skb, dev, &fl, tunnel_hlen);
594 if (!rt)
595 return;
596
597 if (gre_handle_offloads(skb, false))
598 goto err_free_rt;
599
f192970d
WT
600 if (skb->len > dev->mtu + dev->hard_header_len) {
601 pskb_trim(skb, dev->mtu + dev->hard_header_len);
1a66a836
WT
602 truncate = true;
603 }
604
f551c91d 605 if (version == 1) {
c69de58b 606 erspan_build_header(skb, ntohl(tunnel_id_to_key32(key->tun_id)),
f551c91d
WT
607 ntohl(md->u.index), truncate, true);
608 } else if (version == 2) {
c69de58b
WT
609 erspan_build_header_v2(skb,
610 ntohl(tunnel_id_to_key32(key->tun_id)),
611 md->u.md2.dir,
612 get_hwid(&md->u.md2),
613 truncate, true);
f551c91d
WT
614 } else {
615 goto err_free_rt;
616 }
1a66a836
WT
617
618 gre_build_header(skb, 8, TUNNEL_SEQ,
619 htons(ETH_P_ERSPAN), 0, htonl(tunnel->o_seqno++));
620
621 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
622
623 iptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,
624 key->tos, key->ttl, df, false);
625 return;
626
627err_free_rt:
628 ip_rt_put(rt);
629err_free_skb:
630 kfree_skb(skb);
631 dev->stats.tx_dropped++;
632}
633
fc4099f1
PS
634static int gre_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
635{
636 struct ip_tunnel_info *info = skb_tunnel_info(skb);
637 struct rtable *rt;
638 struct flowi4 fl4;
639
640 if (ip_tunnel_info_af(info) != AF_INET)
641 return -EINVAL;
642
643 rt = gre_get_rt(skb, dev, &fl4, &info->key);
644 if (IS_ERR(rt))
645 return PTR_ERR(rt);
646
647 ip_rt_put(rt);
648 info->key.u.ipv4.src = fl4.saddr;
649 return 0;
650}
651
c5441932
PS
652static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
653 struct net_device *dev)
654{
655 struct ip_tunnel *tunnel = netdev_priv(dev);
656 const struct iphdr *tnl_params;
1da177e4 657
2e15ea39 658 if (tunnel->collect_md) {
2090714e 659 gre_fb_xmit(skb, dev, skb->protocol);
2e15ea39
PS
660 return NETDEV_TX_OK;
661 }
662
c5441932
PS
663 if (dev->header_ops) {
664 /* Need space for new headers */
665 if (skb_cow_head(skb, dev->needed_headroom -
2bac7cb3 666 (tunnel->hlen + sizeof(struct iphdr))))
c5441932 667 goto free_skb;
1da177e4 668
c5441932 669 tnl_params = (const struct iphdr *)skb->data;
1da177e4 670
c5441932
PS
671 /* Pull skb since ip_tunnel_xmit() needs skb->data pointing
672 * to gre header.
673 */
674 skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
8a0033a9 675 skb_reset_mac_header(skb);
c5441932
PS
676 } else {
677 if (skb_cow_head(skb, dev->needed_headroom))
678 goto free_skb;
1da177e4 679
c5441932 680 tnl_params = &tunnel->parms.iph;
1da177e4
LT
681 }
682
aed069df
AD
683 if (gre_handle_offloads(skb, !!(tunnel->parms.o_flags & TUNNEL_CSUM)))
684 goto free_skb;
8a0033a9 685
c5441932 686 __gre_xmit(skb, dev, tnl_params, skb->protocol);
6ed10654 687 return NETDEV_TX_OK;
1da177e4 688
c5441932 689free_skb:
3acfa1e7 690 kfree_skb(skb);
c5441932 691 dev->stats.tx_dropped++;
6ed10654 692 return NETDEV_TX_OK;
1da177e4
LT
693}
694
84e54fe0
WT
695static netdev_tx_t erspan_xmit(struct sk_buff *skb,
696 struct net_device *dev)
697{
698 struct ip_tunnel *tunnel = netdev_priv(dev);
699 bool truncate = false;
700
1a66a836
WT
701 if (tunnel->collect_md) {
702 erspan_fb_xmit(skb, dev, skb->protocol);
703 return NETDEV_TX_OK;
704 }
705
84e54fe0
WT
706 if (gre_handle_offloads(skb, false))
707 goto free_skb;
708
709 if (skb_cow_head(skb, dev->needed_headroom))
710 goto free_skb;
711
f192970d
WT
712 if (skb->len > dev->mtu + dev->hard_header_len) {
713 pskb_trim(skb, dev->mtu + dev->hard_header_len);
84e54fe0
WT
714 truncate = true;
715 }
716
717 /* Push ERSPAN header */
f551c91d 718 if (tunnel->erspan_ver == 1)
c69de58b
WT
719 erspan_build_header(skb, ntohl(tunnel->parms.o_key),
720 tunnel->index,
f551c91d
WT
721 truncate, true);
722 else
c69de58b 723 erspan_build_header_v2(skb, ntohl(tunnel->parms.o_key),
f551c91d
WT
724 tunnel->dir, tunnel->hwid,
725 truncate, true);
726
84e54fe0
WT
727 tunnel->parms.o_flags &= ~TUNNEL_KEY;
728 __gre_xmit(skb, dev, &tunnel->parms.iph, htons(ETH_P_ERSPAN));
729 return NETDEV_TX_OK;
730
731free_skb:
732 kfree_skb(skb);
733 dev->stats.tx_dropped++;
734 return NETDEV_TX_OK;
735}
736
c5441932
PS
737static netdev_tx_t gre_tap_xmit(struct sk_buff *skb,
738 struct net_device *dev)
ee34c1eb 739{
c5441932 740 struct ip_tunnel *tunnel = netdev_priv(dev);
ee34c1eb 741
2e15ea39 742 if (tunnel->collect_md) {
2090714e 743 gre_fb_xmit(skb, dev, htons(ETH_P_TEB));
2e15ea39
PS
744 return NETDEV_TX_OK;
745 }
746
aed069df
AD
747 if (gre_handle_offloads(skb, !!(tunnel->parms.o_flags & TUNNEL_CSUM)))
748 goto free_skb;
ee34c1eb 749
c5441932
PS
750 if (skb_cow_head(skb, dev->needed_headroom))
751 goto free_skb;
42aa9162 752
c5441932 753 __gre_xmit(skb, dev, &tunnel->parms.iph, htons(ETH_P_TEB));
c5441932 754 return NETDEV_TX_OK;
ee34c1eb 755
c5441932 756free_skb:
3acfa1e7 757 kfree_skb(skb);
c5441932
PS
758 dev->stats.tx_dropped++;
759 return NETDEV_TX_OK;
ee34c1eb
MS
760}
761
dd9d598c
XL
762static void ipgre_link_update(struct net_device *dev, bool set_mtu)
763{
764 struct ip_tunnel *tunnel = netdev_priv(dev);
765 int len;
766
767 len = tunnel->tun_hlen;
768 tunnel->tun_hlen = gre_calc_hlen(tunnel->parms.o_flags);
769 len = tunnel->tun_hlen - len;
770 tunnel->hlen = tunnel->hlen + len;
771
772 dev->needed_headroom = dev->needed_headroom + len;
773 if (set_mtu)
774 dev->mtu = max_t(int, dev->mtu - len, 68);
775
776 if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) {
777 if (!(tunnel->parms.o_flags & TUNNEL_CSUM) ||
778 tunnel->encap.type == TUNNEL_ENCAP_NONE) {
779 dev->features |= NETIF_F_GSO_SOFTWARE;
780 dev->hw_features |= NETIF_F_GSO_SOFTWARE;
781 }
782 dev->features |= NETIF_F_LLTX;
783 }
784}
785
c5441932
PS
786static int ipgre_tunnel_ioctl(struct net_device *dev,
787 struct ifreq *ifr, int cmd)
1da177e4 788{
1da177e4 789 struct ip_tunnel_parm p;
a0efab67 790 int err;
1da177e4 791
c5441932
PS
792 if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
793 return -EFAULT;
a0efab67 794
6c734fb8
CW
795 if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
796 if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE ||
a0efab67
XL
797 p.iph.ihl != 5 || (p.iph.frag_off & htons(~IP_DF)) ||
798 ((p.i_flags | p.o_flags) & (GRE_VERSION | GRE_ROUTING)))
6c734fb8 799 return -EINVAL;
1da177e4 800 }
a0efab67 801
c5441932
PS
802 p.i_flags = gre_flags_to_tnl_flags(p.i_flags);
803 p.o_flags = gre_flags_to_tnl_flags(p.o_flags);
1da177e4 804
c5441932
PS
805 err = ip_tunnel_ioctl(dev, &p, cmd);
806 if (err)
807 return err;
1da177e4 808
a0efab67
XL
809 if (cmd == SIOCCHGTUNNEL) {
810 struct ip_tunnel *t = netdev_priv(dev);
811
812 t->parms.i_flags = p.i_flags;
813 t->parms.o_flags = p.o_flags;
814
815 if (strcmp(dev->rtnl_link_ops->kind, "erspan"))
816 ipgre_link_update(dev, true);
817 }
818
95f5c64c
TH
819 p.i_flags = gre_tnl_flags_to_gre_flags(p.i_flags);
820 p.o_flags = gre_tnl_flags_to_gre_flags(p.o_flags);
c5441932
PS
821
822 if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
823 return -EFAULT;
a0efab67 824
1da177e4
LT
825 return 0;
826}
827
1da177e4
LT
828/* Nice toy. Unfortunately, useless in real life :-)
829 It allows to construct virtual multiprotocol broadcast "LAN"
830 over the Internet, provided multicast routing is tuned.
831
832
833 I have no idea was this bicycle invented before me,
834 so that I had to set ARPHRD_IPGRE to a random value.
835 I have an impression, that Cisco could make something similar,
836 but this feature is apparently missing in IOS<=11.2(8).
e905a9ed 837
1da177e4
LT
838 I set up 10.66.66/24 and fec0:6666:6666::0/96 as virtual networks
839 with broadcast 224.66.66.66. If you have access to mbone, play with me :-)
840
841 ping -t 255 224.66.66.66
842
843 If nobody answers, mbone does not work.
844
845 ip tunnel add Universe mode gre remote 224.66.66.66 local <Your_real_addr> ttl 255
846 ip addr add 10.66.66.<somewhat>/24 dev Universe
847 ifconfig Universe up
848 ifconfig Universe add fe80::<Your_real_addr>/10
849 ifconfig Universe add fec0:6666:6666::<Your_real_addr>/96
850 ftp 10.66.66.66
851 ...
852 ftp fec0:6666:6666::193.233.7.65
853 ...
1da177e4 854 */
3b04ddde
SH
855static int ipgre_header(struct sk_buff *skb, struct net_device *dev,
856 unsigned short type,
1507850b 857 const void *daddr, const void *saddr, unsigned int len)
1da177e4 858{
2941a486 859 struct ip_tunnel *t = netdev_priv(dev);
c5441932
PS
860 struct iphdr *iph;
861 struct gre_base_hdr *greh;
1da177e4 862
d58ff351 863 iph = skb_push(skb, t->hlen + sizeof(*iph));
c5441932 864 greh = (struct gre_base_hdr *)(iph+1);
95f5c64c 865 greh->flags = gre_tnl_flags_to_gre_flags(t->parms.o_flags);
c5441932 866 greh->protocol = htons(type);
1da177e4 867
c5441932 868 memcpy(iph, &t->parms.iph, sizeof(struct iphdr));
e905a9ed 869
c5441932 870 /* Set the source hardware address. */
1da177e4
LT
871 if (saddr)
872 memcpy(&iph->saddr, saddr, 4);
6d55cb91 873 if (daddr)
1da177e4 874 memcpy(&iph->daddr, daddr, 4);
6d55cb91 875 if (iph->daddr)
77a482bd 876 return t->hlen + sizeof(*iph);
e905a9ed 877
c5441932 878 return -(t->hlen + sizeof(*iph));
1da177e4
LT
879}
880
6a5f44d7
TT
881static int ipgre_header_parse(const struct sk_buff *skb, unsigned char *haddr)
882{
b71d1d42 883 const struct iphdr *iph = (const struct iphdr *) skb_mac_header(skb);
6a5f44d7
TT
884 memcpy(haddr, &iph->saddr, 4);
885 return 4;
886}
887
3b04ddde
SH
888static const struct header_ops ipgre_header_ops = {
889 .create = ipgre_header,
6a5f44d7 890 .parse = ipgre_header_parse,
3b04ddde
SH
891};
892
6a5f44d7 893#ifdef CONFIG_NET_IPGRE_BROADCAST
1da177e4
LT
894static int ipgre_open(struct net_device *dev)
895{
2941a486 896 struct ip_tunnel *t = netdev_priv(dev);
1da177e4 897
f97c1e0c 898 if (ipv4_is_multicast(t->parms.iph.daddr)) {
cbb1e85f
DM
899 struct flowi4 fl4;
900 struct rtable *rt;
901
b57708ad 902 rt = ip_route_output_gre(t->net, &fl4,
cbb1e85f
DM
903 t->parms.iph.daddr,
904 t->parms.iph.saddr,
905 t->parms.o_key,
906 RT_TOS(t->parms.iph.tos),
907 t->parms.link);
b23dd4fe 908 if (IS_ERR(rt))
1da177e4 909 return -EADDRNOTAVAIL;
d8d1f30b 910 dev = rt->dst.dev;
1da177e4 911 ip_rt_put(rt);
51456b29 912 if (!__in_dev_get_rtnl(dev))
1da177e4
LT
913 return -EADDRNOTAVAIL;
914 t->mlink = dev->ifindex;
e5ed6399 915 ip_mc_inc_group(__in_dev_get_rtnl(dev), t->parms.iph.daddr);
1da177e4
LT
916 }
917 return 0;
918}
919
920static int ipgre_close(struct net_device *dev)
921{
2941a486 922 struct ip_tunnel *t = netdev_priv(dev);
b8c26a33 923
f97c1e0c 924 if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) {
7fee0ca2 925 struct in_device *in_dev;
b57708ad 926 in_dev = inetdev_by_index(t->net, t->mlink);
8723e1b4 927 if (in_dev)
1da177e4 928 ip_mc_dec_group(in_dev, t->parms.iph.daddr);
1da177e4
LT
929 }
930 return 0;
931}
1da177e4
LT
932#endif
933
b8c26a33
SH
934static const struct net_device_ops ipgre_netdev_ops = {
935 .ndo_init = ipgre_tunnel_init,
c5441932 936 .ndo_uninit = ip_tunnel_uninit,
b8c26a33
SH
937#ifdef CONFIG_NET_IPGRE_BROADCAST
938 .ndo_open = ipgre_open,
939 .ndo_stop = ipgre_close,
940#endif
c5441932 941 .ndo_start_xmit = ipgre_xmit,
b8c26a33 942 .ndo_do_ioctl = ipgre_tunnel_ioctl,
c5441932
PS
943 .ndo_change_mtu = ip_tunnel_change_mtu,
944 .ndo_get_stats64 = ip_tunnel_get_stats64,
1e99584b 945 .ndo_get_iflink = ip_tunnel_get_iflink,
b8c26a33
SH
946};
947
6b78f16e
ED
948#define GRE_FEATURES (NETIF_F_SG | \
949 NETIF_F_FRAGLIST | \
950 NETIF_F_HIGHDMA | \
951 NETIF_F_HW_CSUM)
952
1da177e4
LT
953static void ipgre_tunnel_setup(struct net_device *dev)
954{
b8c26a33 955 dev->netdev_ops = &ipgre_netdev_ops;
5a455275 956 dev->type = ARPHRD_IPGRE;
c5441932
PS
957 ip_tunnel_setup(dev, ipgre_net_id);
958}
1da177e4 959
c5441932
PS
960static void __gre_tunnel_init(struct net_device *dev)
961{
962 struct ip_tunnel *tunnel;
4565e991 963 int t_hlen;
c5441932
PS
964
965 tunnel = netdev_priv(dev);
95f5c64c 966 tunnel->tun_hlen = gre_calc_hlen(tunnel->parms.o_flags);
c5441932
PS
967 tunnel->parms.iph.protocol = IPPROTO_GRE;
968
4565e991
TH
969 tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
970
971 t_hlen = tunnel->hlen + sizeof(struct iphdr);
972
b57708ad 973 dev->features |= GRE_FEATURES;
6b78f16e 974 dev->hw_features |= GRE_FEATURES;
c5441932
PS
975
976 if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) {
a0ca153f
AD
977 /* TCP offload with GRE SEQ is not supported, nor
978 * can we support 2 levels of outer headers requiring
979 * an update.
980 */
981 if (!(tunnel->parms.o_flags & TUNNEL_CSUM) ||
982 (tunnel->encap.type == TUNNEL_ENCAP_NONE)) {
983 dev->features |= NETIF_F_GSO_SOFTWARE;
984 dev->hw_features |= NETIF_F_GSO_SOFTWARE;
985 }
986
c5441932
PS
987 /* Can use a lockless transmit, unless we generate
988 * output sequences
989 */
990 dev->features |= NETIF_F_LLTX;
991 }
1da177e4
LT
992}
993
994static int ipgre_tunnel_init(struct net_device *dev)
995{
c5441932
PS
996 struct ip_tunnel *tunnel = netdev_priv(dev);
997 struct iphdr *iph = &tunnel->parms.iph;
1da177e4 998
c5441932 999 __gre_tunnel_init(dev);
1da177e4 1000
c5441932
PS
1001 memcpy(dev->dev_addr, &iph->saddr, 4);
1002 memcpy(dev->broadcast, &iph->daddr, 4);
1da177e4 1003
c5441932 1004 dev->flags = IFF_NOARP;
02875878 1005 netif_keep_dst(dev);
c5441932 1006 dev->addr_len = 4;
1da177e4 1007
a64b04d8 1008 if (iph->daddr && !tunnel->collect_md) {
1da177e4 1009#ifdef CONFIG_NET_IPGRE_BROADCAST
f97c1e0c 1010 if (ipv4_is_multicast(iph->daddr)) {
1da177e4
LT
1011 if (!iph->saddr)
1012 return -EINVAL;
1013 dev->flags = IFF_BROADCAST;
3b04ddde 1014 dev->header_ops = &ipgre_header_ops;
1da177e4
LT
1015 }
1016#endif
a64b04d8 1017 } else if (!tunnel->collect_md) {
6a5f44d7 1018 dev->header_ops = &ipgre_header_ops;
a64b04d8 1019 }
1da177e4 1020
c5441932 1021 return ip_tunnel_init(dev);
1da177e4
LT
1022}
1023
9f57c67c
PS
1024static const struct gre_protocol ipgre_protocol = {
1025 .handler = gre_rcv,
1026 .err_handler = gre_err,
1da177e4
LT
1027};
1028
2c8c1e72 1029static int __net_init ipgre_init_net(struct net *net)
59a4c759 1030{
c5441932 1031 return ip_tunnel_init_net(net, ipgre_net_id, &ipgre_link_ops, NULL);
59a4c759
PE
1032}
1033
64bc1781 1034static void __net_exit ipgre_exit_batch_net(struct list_head *list_net)
59a4c759 1035{
64bc1781 1036 ip_tunnel_delete_nets(list_net, ipgre_net_id, &ipgre_link_ops);
59a4c759
PE
1037}
1038
1039static struct pernet_operations ipgre_net_ops = {
1040 .init = ipgre_init_net,
64bc1781 1041 .exit_batch = ipgre_exit_batch_net,
cfb8fbf2 1042 .id = &ipgre_net_id,
c5441932 1043 .size = sizeof(struct ip_tunnel_net),
59a4c759 1044};
1da177e4 1045
a8b8a889
MS
1046static int ipgre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[],
1047 struct netlink_ext_ack *extack)
c19e654d
HX
1048{
1049 __be16 flags;
1050
1051 if (!data)
1052 return 0;
1053
1054 flags = 0;
1055 if (data[IFLA_GRE_IFLAGS])
1056 flags |= nla_get_be16(data[IFLA_GRE_IFLAGS]);
1057 if (data[IFLA_GRE_OFLAGS])
1058 flags |= nla_get_be16(data[IFLA_GRE_OFLAGS]);
1059 if (flags & (GRE_VERSION|GRE_ROUTING))
1060 return -EINVAL;
1061
946b636f
JB
1062 if (data[IFLA_GRE_COLLECT_METADATA] &&
1063 data[IFLA_GRE_ENCAP_TYPE] &&
1064 nla_get_u16(data[IFLA_GRE_ENCAP_TYPE]) != TUNNEL_ENCAP_NONE)
1065 return -EINVAL;
1066
c19e654d
HX
1067 return 0;
1068}
1069
a8b8a889
MS
1070static int ipgre_tap_validate(struct nlattr *tb[], struct nlattr *data[],
1071 struct netlink_ext_ack *extack)
e1a80002
HX
1072{
1073 __be32 daddr;
1074
1075 if (tb[IFLA_ADDRESS]) {
1076 if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
1077 return -EINVAL;
1078 if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
1079 return -EADDRNOTAVAIL;
1080 }
1081
1082 if (!data)
1083 goto out;
1084
1085 if (data[IFLA_GRE_REMOTE]) {
1086 memcpy(&daddr, nla_data(data[IFLA_GRE_REMOTE]), 4);
1087 if (!daddr)
1088 return -EINVAL;
1089 }
1090
1091out:
a8b8a889 1092 return ipgre_tunnel_validate(tb, data, extack);
e1a80002
HX
1093}
1094
84e54fe0
WT
1095static int erspan_validate(struct nlattr *tb[], struct nlattr *data[],
1096 struct netlink_ext_ack *extack)
1097{
1098 __be16 flags = 0;
1099 int ret;
1100
1101 if (!data)
1102 return 0;
1103
1104 ret = ipgre_tap_validate(tb, data, extack);
1105 if (ret)
1106 return ret;
1107
1108 /* ERSPAN should only have GRE sequence and key flag */
1a66a836
WT
1109 if (data[IFLA_GRE_OFLAGS])
1110 flags |= nla_get_be16(data[IFLA_GRE_OFLAGS]);
1111 if (data[IFLA_GRE_IFLAGS])
1112 flags |= nla_get_be16(data[IFLA_GRE_IFLAGS]);
1113 if (!data[IFLA_GRE_COLLECT_METADATA] &&
1114 flags != (GRE_SEQ | GRE_KEY))
84e54fe0
WT
1115 return -EINVAL;
1116
1117 /* ERSPAN Session ID only has 10-bit. Since we reuse
1118 * 32-bit key field as ID, check it's range.
1119 */
1120 if (data[IFLA_GRE_IKEY] &&
1121 (ntohl(nla_get_be32(data[IFLA_GRE_IKEY])) & ~ID_MASK))
1122 return -EINVAL;
1123
1124 if (data[IFLA_GRE_OKEY] &&
1125 (ntohl(nla_get_be32(data[IFLA_GRE_OKEY])) & ~ID_MASK))
1126 return -EINVAL;
1127
1128 return 0;
1129}
1130
22a59be8 1131static int ipgre_netlink_parms(struct net_device *dev,
2e15ea39
PS
1132 struct nlattr *data[],
1133 struct nlattr *tb[],
9830ad4c
CG
1134 struct ip_tunnel_parm *parms,
1135 __u32 *fwmark)
c19e654d 1136{
22a59be8
PP
1137 struct ip_tunnel *t = netdev_priv(dev);
1138
7bb82d92 1139 memset(parms, 0, sizeof(*parms));
c19e654d
HX
1140
1141 parms->iph.protocol = IPPROTO_GRE;
1142
1143 if (!data)
22a59be8 1144 return 0;
c19e654d
HX
1145
1146 if (data[IFLA_GRE_LINK])
1147 parms->link = nla_get_u32(data[IFLA_GRE_LINK]);
1148
1149 if (data[IFLA_GRE_IFLAGS])
c5441932 1150 parms->i_flags = gre_flags_to_tnl_flags(nla_get_be16(data[IFLA_GRE_IFLAGS]));
c19e654d
HX
1151
1152 if (data[IFLA_GRE_OFLAGS])
c5441932 1153 parms->o_flags = gre_flags_to_tnl_flags(nla_get_be16(data[IFLA_GRE_OFLAGS]));
c19e654d
HX
1154
1155 if (data[IFLA_GRE_IKEY])
1156 parms->i_key = nla_get_be32(data[IFLA_GRE_IKEY]);
1157
1158 if (data[IFLA_GRE_OKEY])
1159 parms->o_key = nla_get_be32(data[IFLA_GRE_OKEY]);
1160
1161 if (data[IFLA_GRE_LOCAL])
67b61f6c 1162 parms->iph.saddr = nla_get_in_addr(data[IFLA_GRE_LOCAL]);
c19e654d
HX
1163
1164 if (data[IFLA_GRE_REMOTE])
67b61f6c 1165 parms->iph.daddr = nla_get_in_addr(data[IFLA_GRE_REMOTE]);
c19e654d
HX
1166
1167 if (data[IFLA_GRE_TTL])
1168 parms->iph.ttl = nla_get_u8(data[IFLA_GRE_TTL]);
1169
1170 if (data[IFLA_GRE_TOS])
1171 parms->iph.tos = nla_get_u8(data[IFLA_GRE_TOS]);
1172
22a59be8
PP
1173 if (!data[IFLA_GRE_PMTUDISC] || nla_get_u8(data[IFLA_GRE_PMTUDISC])) {
1174 if (t->ignore_df)
1175 return -EINVAL;
c19e654d 1176 parms->iph.frag_off = htons(IP_DF);
22a59be8 1177 }
2e15ea39
PS
1178
1179 if (data[IFLA_GRE_COLLECT_METADATA]) {
2e15ea39 1180 t->collect_md = true;
e271c7b4
JB
1181 if (dev->type == ARPHRD_IPGRE)
1182 dev->type = ARPHRD_NONE;
2e15ea39 1183 }
22a59be8
PP
1184
1185 if (data[IFLA_GRE_IGNORE_DF]) {
1186 if (nla_get_u8(data[IFLA_GRE_IGNORE_DF])
1187 && (parms->iph.frag_off & htons(IP_DF)))
1188 return -EINVAL;
1189 t->ignore_df = !!nla_get_u8(data[IFLA_GRE_IGNORE_DF]);
1190 }
1191
9830ad4c
CG
1192 if (data[IFLA_GRE_FWMARK])
1193 *fwmark = nla_get_u32(data[IFLA_GRE_FWMARK]);
1194
f551c91d
WT
1195 if (data[IFLA_GRE_ERSPAN_VER]) {
1196 t->erspan_ver = nla_get_u8(data[IFLA_GRE_ERSPAN_VER]);
84e54fe0 1197
f551c91d 1198 if (t->erspan_ver != 1 && t->erspan_ver != 2)
84e54fe0
WT
1199 return -EINVAL;
1200 }
1201
f551c91d
WT
1202 if (t->erspan_ver == 1) {
1203 if (data[IFLA_GRE_ERSPAN_INDEX]) {
1204 t->index = nla_get_u32(data[IFLA_GRE_ERSPAN_INDEX]);
1205 if (t->index & ~INDEX_MASK)
1206 return -EINVAL;
1207 }
1208 } else if (t->erspan_ver == 2) {
1209 if (data[IFLA_GRE_ERSPAN_DIR]) {
1210 t->dir = nla_get_u8(data[IFLA_GRE_ERSPAN_DIR]);
1211 if (t->dir & ~(DIR_MASK >> DIR_OFFSET))
1212 return -EINVAL;
1213 }
1214 if (data[IFLA_GRE_ERSPAN_HWID]) {
1215 t->hwid = nla_get_u16(data[IFLA_GRE_ERSPAN_HWID]);
1216 if (t->hwid & ~(HWID_MASK >> HWID_OFFSET))
1217 return -EINVAL;
1218 }
1219 }
1220
22a59be8 1221 return 0;
c19e654d
HX
1222}
1223
4565e991
TH
1224/* This function returns true when ENCAP attributes are present in the nl msg */
1225static bool ipgre_netlink_encap_parms(struct nlattr *data[],
1226 struct ip_tunnel_encap *ipencap)
1227{
1228 bool ret = false;
1229
1230 memset(ipencap, 0, sizeof(*ipencap));
1231
1232 if (!data)
1233 return ret;
1234
1235 if (data[IFLA_GRE_ENCAP_TYPE]) {
1236 ret = true;
1237 ipencap->type = nla_get_u16(data[IFLA_GRE_ENCAP_TYPE]);
1238 }
1239
1240 if (data[IFLA_GRE_ENCAP_FLAGS]) {
1241 ret = true;
1242 ipencap->flags = nla_get_u16(data[IFLA_GRE_ENCAP_FLAGS]);
1243 }
1244
1245 if (data[IFLA_GRE_ENCAP_SPORT]) {
1246 ret = true;
3e97fa70 1247 ipencap->sport = nla_get_be16(data[IFLA_GRE_ENCAP_SPORT]);
4565e991
TH
1248 }
1249
1250 if (data[IFLA_GRE_ENCAP_DPORT]) {
1251 ret = true;
3e97fa70 1252 ipencap->dport = nla_get_be16(data[IFLA_GRE_ENCAP_DPORT]);
4565e991
TH
1253 }
1254
1255 return ret;
1256}
1257
c5441932 1258static int gre_tap_init(struct net_device *dev)
e1a80002 1259{
c5441932 1260 __gre_tunnel_init(dev);
bec94d43 1261 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
d51711c0 1262 netif_keep_dst(dev);
e1a80002 1263
c5441932 1264 return ip_tunnel_init(dev);
e1a80002
HX
1265}
1266
c5441932
PS
1267static const struct net_device_ops gre_tap_netdev_ops = {
1268 .ndo_init = gre_tap_init,
1269 .ndo_uninit = ip_tunnel_uninit,
1270 .ndo_start_xmit = gre_tap_xmit,
b8c26a33
SH
1271 .ndo_set_mac_address = eth_mac_addr,
1272 .ndo_validate_addr = eth_validate_addr,
c5441932
PS
1273 .ndo_change_mtu = ip_tunnel_change_mtu,
1274 .ndo_get_stats64 = ip_tunnel_get_stats64,
1e99584b 1275 .ndo_get_iflink = ip_tunnel_get_iflink,
fc4099f1 1276 .ndo_fill_metadata_dst = gre_fill_metadata_dst,
b8c26a33
SH
1277};
1278
84e54fe0
WT
1279static int erspan_tunnel_init(struct net_device *dev)
1280{
1281 struct ip_tunnel *tunnel = netdev_priv(dev);
1282 int t_hlen;
1283
1284 tunnel->tun_hlen = 8;
1285 tunnel->parms.iph.protocol = IPPROTO_GRE;
c122fda2 1286 tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen +
f551c91d 1287 erspan_hdr_len(tunnel->erspan_ver);
c122fda2 1288 t_hlen = tunnel->hlen + sizeof(struct iphdr);
84e54fe0 1289
84e54fe0
WT
1290 dev->features |= GRE_FEATURES;
1291 dev->hw_features |= GRE_FEATURES;
1292 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
c84bed44 1293 netif_keep_dst(dev);
84e54fe0
WT
1294
1295 return ip_tunnel_init(dev);
1296}
1297
1298static const struct net_device_ops erspan_netdev_ops = {
1299 .ndo_init = erspan_tunnel_init,
1300 .ndo_uninit = ip_tunnel_uninit,
1301 .ndo_start_xmit = erspan_xmit,
1302 .ndo_set_mac_address = eth_mac_addr,
1303 .ndo_validate_addr = eth_validate_addr,
1304 .ndo_change_mtu = ip_tunnel_change_mtu,
1305 .ndo_get_stats64 = ip_tunnel_get_stats64,
1306 .ndo_get_iflink = ip_tunnel_get_iflink,
1307 .ndo_fill_metadata_dst = gre_fill_metadata_dst,
1308};
1309
e1a80002
HX
1310static void ipgre_tap_setup(struct net_device *dev)
1311{
e1a80002 1312 ether_setup(dev);
cfddd4c3 1313 dev->max_mtu = 0;
d13b161c
JB
1314 dev->netdev_ops = &gre_tap_netdev_ops;
1315 dev->priv_flags &= ~IFF_TX_SKB_SHARING;
1316 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
c5441932 1317 ip_tunnel_setup(dev, gre_tap_net_id);
e1a80002
HX
1318}
1319
c5441932 1320static int ipgre_newlink(struct net *src_net, struct net_device *dev,
7a3f4a18
MS
1321 struct nlattr *tb[], struct nlattr *data[],
1322 struct netlink_ext_ack *extack)
c19e654d 1323{
c5441932 1324 struct ip_tunnel_parm p;
4565e991 1325 struct ip_tunnel_encap ipencap;
9830ad4c 1326 __u32 fwmark = 0;
22a59be8 1327 int err;
4565e991
TH
1328
1329 if (ipgre_netlink_encap_parms(data, &ipencap)) {
1330 struct ip_tunnel *t = netdev_priv(dev);
22a59be8 1331 err = ip_tunnel_encap_setup(t, &ipencap);
4565e991
TH
1332
1333 if (err < 0)
1334 return err;
1335 }
c19e654d 1336
9830ad4c 1337 err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark);
22a59be8
PP
1338 if (err < 0)
1339 return err;
9830ad4c 1340 return ip_tunnel_newlink(dev, tb, &p, fwmark);
c19e654d
HX
1341}
1342
1343static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
ad744b22
MS
1344 struct nlattr *data[],
1345 struct netlink_ext_ack *extack)
c19e654d 1346{
9830ad4c 1347 struct ip_tunnel *t = netdev_priv(dev);
4565e991 1348 struct ip_tunnel_encap ipencap;
9830ad4c 1349 __u32 fwmark = t->fwmark;
dd9d598c 1350 struct ip_tunnel_parm p;
22a59be8 1351 int err;
4565e991
TH
1352
1353 if (ipgre_netlink_encap_parms(data, &ipencap)) {
22a59be8 1354 err = ip_tunnel_encap_setup(t, &ipencap);
4565e991
TH
1355
1356 if (err < 0)
1357 return err;
1358 }
c19e654d 1359
9830ad4c 1360 err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark);
22a59be8
PP
1361 if (err < 0)
1362 return err;
dd9d598c
XL
1363
1364 err = ip_tunnel_changelink(dev, tb, &p, fwmark);
1365 if (err < 0)
1366 return err;
1367
1368 t->parms.i_flags = p.i_flags;
1369 t->parms.o_flags = p.o_flags;
1370
1371 if (strcmp(dev->rtnl_link_ops->kind, "erspan"))
1372 ipgre_link_update(dev, !tb[IFLA_MTU]);
1373
1374 return 0;
c19e654d
HX
1375}
1376
1377static size_t ipgre_get_size(const struct net_device *dev)
1378{
1379 return
1380 /* IFLA_GRE_LINK */
1381 nla_total_size(4) +
1382 /* IFLA_GRE_IFLAGS */
1383 nla_total_size(2) +
1384 /* IFLA_GRE_OFLAGS */
1385 nla_total_size(2) +
1386 /* IFLA_GRE_IKEY */
1387 nla_total_size(4) +
1388 /* IFLA_GRE_OKEY */
1389 nla_total_size(4) +
1390 /* IFLA_GRE_LOCAL */
1391 nla_total_size(4) +
1392 /* IFLA_GRE_REMOTE */
1393 nla_total_size(4) +
1394 /* IFLA_GRE_TTL */
1395 nla_total_size(1) +
1396 /* IFLA_GRE_TOS */
1397 nla_total_size(1) +
1398 /* IFLA_GRE_PMTUDISC */
1399 nla_total_size(1) +
4565e991
TH
1400 /* IFLA_GRE_ENCAP_TYPE */
1401 nla_total_size(2) +
1402 /* IFLA_GRE_ENCAP_FLAGS */
1403 nla_total_size(2) +
1404 /* IFLA_GRE_ENCAP_SPORT */
1405 nla_total_size(2) +
1406 /* IFLA_GRE_ENCAP_DPORT */
1407 nla_total_size(2) +
2e15ea39
PS
1408 /* IFLA_GRE_COLLECT_METADATA */
1409 nla_total_size(0) +
22a59be8
PP
1410 /* IFLA_GRE_IGNORE_DF */
1411 nla_total_size(1) +
9830ad4c
CG
1412 /* IFLA_GRE_FWMARK */
1413 nla_total_size(4) +
84e54fe0
WT
1414 /* IFLA_GRE_ERSPAN_INDEX */
1415 nla_total_size(4) +
f551c91d
WT
1416 /* IFLA_GRE_ERSPAN_VER */
1417 nla_total_size(1) +
1418 /* IFLA_GRE_ERSPAN_DIR */
1419 nla_total_size(1) +
1420 /* IFLA_GRE_ERSPAN_HWID */
1421 nla_total_size(2) +
c19e654d
HX
1422 0;
1423}
1424
1425static int ipgre_fill_info(struct sk_buff *skb, const struct net_device *dev)
1426{
1427 struct ip_tunnel *t = netdev_priv(dev);
1428 struct ip_tunnel_parm *p = &t->parms;
1429
f3756b79 1430 if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) ||
95f5c64c
TH
1431 nla_put_be16(skb, IFLA_GRE_IFLAGS,
1432 gre_tnl_flags_to_gre_flags(p->i_flags)) ||
1433 nla_put_be16(skb, IFLA_GRE_OFLAGS,
1434 gre_tnl_flags_to_gre_flags(p->o_flags)) ||
f3756b79
DM
1435 nla_put_be32(skb, IFLA_GRE_IKEY, p->i_key) ||
1436 nla_put_be32(skb, IFLA_GRE_OKEY, p->o_key) ||
930345ea
JB
1437 nla_put_in_addr(skb, IFLA_GRE_LOCAL, p->iph.saddr) ||
1438 nla_put_in_addr(skb, IFLA_GRE_REMOTE, p->iph.daddr) ||
f3756b79
DM
1439 nla_put_u8(skb, IFLA_GRE_TTL, p->iph.ttl) ||
1440 nla_put_u8(skb, IFLA_GRE_TOS, p->iph.tos) ||
1441 nla_put_u8(skb, IFLA_GRE_PMTUDISC,
9830ad4c
CG
1442 !!(p->iph.frag_off & htons(IP_DF))) ||
1443 nla_put_u32(skb, IFLA_GRE_FWMARK, t->fwmark))
f3756b79 1444 goto nla_put_failure;
4565e991
TH
1445
1446 if (nla_put_u16(skb, IFLA_GRE_ENCAP_TYPE,
1447 t->encap.type) ||
3e97fa70
SD
1448 nla_put_be16(skb, IFLA_GRE_ENCAP_SPORT,
1449 t->encap.sport) ||
1450 nla_put_be16(skb, IFLA_GRE_ENCAP_DPORT,
1451 t->encap.dport) ||
4565e991 1452 nla_put_u16(skb, IFLA_GRE_ENCAP_FLAGS,
e1b2cb65 1453 t->encap.flags))
4565e991
TH
1454 goto nla_put_failure;
1455
22a59be8
PP
1456 if (nla_put_u8(skb, IFLA_GRE_IGNORE_DF, t->ignore_df))
1457 goto nla_put_failure;
1458
2e15ea39
PS
1459 if (t->collect_md) {
1460 if (nla_put_flag(skb, IFLA_GRE_COLLECT_METADATA))
1461 goto nla_put_failure;
1462 }
1463
f551c91d
WT
1464 if (nla_put_u8(skb, IFLA_GRE_ERSPAN_VER, t->erspan_ver))
1465 goto nla_put_failure;
1466
1467 if (t->erspan_ver == 1) {
84e54fe0
WT
1468 if (nla_put_u32(skb, IFLA_GRE_ERSPAN_INDEX, t->index))
1469 goto nla_put_failure;
f551c91d
WT
1470 } else if (t->erspan_ver == 2) {
1471 if (nla_put_u8(skb, IFLA_GRE_ERSPAN_DIR, t->dir))
1472 goto nla_put_failure;
1473 if (nla_put_u16(skb, IFLA_GRE_ERSPAN_HWID, t->hwid))
1474 goto nla_put_failure;
1475 }
84e54fe0 1476
c19e654d
HX
1477 return 0;
1478
1479nla_put_failure:
1480 return -EMSGSIZE;
1481}
1482
84e54fe0
WT
1483static void erspan_setup(struct net_device *dev)
1484{
1485 ether_setup(dev);
1486 dev->netdev_ops = &erspan_netdev_ops;
1487 dev->priv_flags &= ~IFF_TX_SKB_SHARING;
1488 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
1489 ip_tunnel_setup(dev, erspan_net_id);
1490}
1491
c19e654d
HX
1492static const struct nla_policy ipgre_policy[IFLA_GRE_MAX + 1] = {
1493 [IFLA_GRE_LINK] = { .type = NLA_U32 },
1494 [IFLA_GRE_IFLAGS] = { .type = NLA_U16 },
1495 [IFLA_GRE_OFLAGS] = { .type = NLA_U16 },
1496 [IFLA_GRE_IKEY] = { .type = NLA_U32 },
1497 [IFLA_GRE_OKEY] = { .type = NLA_U32 },
4d74f8ba
PM
1498 [IFLA_GRE_LOCAL] = { .len = FIELD_SIZEOF(struct iphdr, saddr) },
1499 [IFLA_GRE_REMOTE] = { .len = FIELD_SIZEOF(struct iphdr, daddr) },
c19e654d
HX
1500 [IFLA_GRE_TTL] = { .type = NLA_U8 },
1501 [IFLA_GRE_TOS] = { .type = NLA_U8 },
1502 [IFLA_GRE_PMTUDISC] = { .type = NLA_U8 },
4565e991
TH
1503 [IFLA_GRE_ENCAP_TYPE] = { .type = NLA_U16 },
1504 [IFLA_GRE_ENCAP_FLAGS] = { .type = NLA_U16 },
1505 [IFLA_GRE_ENCAP_SPORT] = { .type = NLA_U16 },
1506 [IFLA_GRE_ENCAP_DPORT] = { .type = NLA_U16 },
2e15ea39 1507 [IFLA_GRE_COLLECT_METADATA] = { .type = NLA_FLAG },
22a59be8 1508 [IFLA_GRE_IGNORE_DF] = { .type = NLA_U8 },
9830ad4c 1509 [IFLA_GRE_FWMARK] = { .type = NLA_U32 },
84e54fe0 1510 [IFLA_GRE_ERSPAN_INDEX] = { .type = NLA_U32 },
f551c91d
WT
1511 [IFLA_GRE_ERSPAN_VER] = { .type = NLA_U8 },
1512 [IFLA_GRE_ERSPAN_DIR] = { .type = NLA_U8 },
1513 [IFLA_GRE_ERSPAN_HWID] = { .type = NLA_U16 },
c19e654d
HX
1514};
1515
1516static struct rtnl_link_ops ipgre_link_ops __read_mostly = {
1517 .kind = "gre",
1518 .maxtype = IFLA_GRE_MAX,
1519 .policy = ipgre_policy,
1520 .priv_size = sizeof(struct ip_tunnel),
1521 .setup = ipgre_tunnel_setup,
1522 .validate = ipgre_tunnel_validate,
1523 .newlink = ipgre_newlink,
1524 .changelink = ipgre_changelink,
c5441932 1525 .dellink = ip_tunnel_dellink,
c19e654d
HX
1526 .get_size = ipgre_get_size,
1527 .fill_info = ipgre_fill_info,
1728d4fa 1528 .get_link_net = ip_tunnel_get_link_net,
c19e654d
HX
1529};
1530
e1a80002
HX
1531static struct rtnl_link_ops ipgre_tap_ops __read_mostly = {
1532 .kind = "gretap",
1533 .maxtype = IFLA_GRE_MAX,
1534 .policy = ipgre_policy,
1535 .priv_size = sizeof(struct ip_tunnel),
1536 .setup = ipgre_tap_setup,
1537 .validate = ipgre_tap_validate,
1538 .newlink = ipgre_newlink,
1539 .changelink = ipgre_changelink,
c5441932 1540 .dellink = ip_tunnel_dellink,
e1a80002
HX
1541 .get_size = ipgre_get_size,
1542 .fill_info = ipgre_fill_info,
1728d4fa 1543 .get_link_net = ip_tunnel_get_link_net,
e1a80002
HX
1544};
1545
84e54fe0
WT
1546static struct rtnl_link_ops erspan_link_ops __read_mostly = {
1547 .kind = "erspan",
1548 .maxtype = IFLA_GRE_MAX,
1549 .policy = ipgre_policy,
1550 .priv_size = sizeof(struct ip_tunnel),
1551 .setup = erspan_setup,
1552 .validate = erspan_validate,
1553 .newlink = ipgre_newlink,
1554 .changelink = ipgre_changelink,
1555 .dellink = ip_tunnel_dellink,
1556 .get_size = ipgre_get_size,
1557 .fill_info = ipgre_fill_info,
1558 .get_link_net = ip_tunnel_get_link_net,
1559};
1560
b2acd1dc
PS
1561struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1562 u8 name_assign_type)
1563{
1564 struct nlattr *tb[IFLA_MAX + 1];
1565 struct net_device *dev;
106da663 1566 LIST_HEAD(list_kill);
b2acd1dc
PS
1567 struct ip_tunnel *t;
1568 int err;
1569
1570 memset(&tb, 0, sizeof(tb));
1571
1572 dev = rtnl_create_link(net, name, name_assign_type,
1573 &ipgre_tap_ops, tb);
1574 if (IS_ERR(dev))
1575 return dev;
1576
1577 /* Configure flow based GRE device. */
1578 t = netdev_priv(dev);
1579 t->collect_md = true;
1580
7a3f4a18 1581 err = ipgre_newlink(net, dev, tb, NULL, NULL);
106da663
ND
1582 if (err < 0) {
1583 free_netdev(dev);
1584 return ERR_PTR(err);
1585 }
7e059158
DW
1586
1587 /* openvswitch users expect packet sizes to be unrestricted,
1588 * so set the largest MTU we can.
1589 */
1590 err = __ip_tunnel_change_mtu(dev, IP_MAX_MTU, false);
1591 if (err)
1592 goto out;
1593
da6f1da8
ND
1594 err = rtnl_configure_link(dev, NULL);
1595 if (err < 0)
1596 goto out;
1597
b2acd1dc
PS
1598 return dev;
1599out:
106da663
ND
1600 ip_tunnel_dellink(dev, &list_kill);
1601 unregister_netdevice_many(&list_kill);
b2acd1dc
PS
1602 return ERR_PTR(err);
1603}
1604EXPORT_SYMBOL_GPL(gretap_fb_dev_create);
1605
c5441932
PS
1606static int __net_init ipgre_tap_init_net(struct net *net)
1607{
2e15ea39 1608 return ip_tunnel_init_net(net, gre_tap_net_id, &ipgre_tap_ops, "gretap0");
c5441932
PS
1609}
1610
64bc1781 1611static void __net_exit ipgre_tap_exit_batch_net(struct list_head *list_net)
c5441932 1612{
64bc1781 1613 ip_tunnel_delete_nets(list_net, gre_tap_net_id, &ipgre_tap_ops);
c5441932
PS
1614}
1615
1616static struct pernet_operations ipgre_tap_net_ops = {
1617 .init = ipgre_tap_init_net,
64bc1781 1618 .exit_batch = ipgre_tap_exit_batch_net,
c5441932
PS
1619 .id = &gre_tap_net_id,
1620 .size = sizeof(struct ip_tunnel_net),
1621};
1da177e4 1622
84e54fe0
WT
1623static int __net_init erspan_init_net(struct net *net)
1624{
1625 return ip_tunnel_init_net(net, erspan_net_id,
1626 &erspan_link_ops, "erspan0");
1627}
1628
64bc1781 1629static void __net_exit erspan_exit_batch_net(struct list_head *net_list)
84e54fe0 1630{
64bc1781 1631 ip_tunnel_delete_nets(net_list, erspan_net_id, &erspan_link_ops);
84e54fe0
WT
1632}
1633
1634static struct pernet_operations erspan_net_ops = {
1635 .init = erspan_init_net,
64bc1781 1636 .exit_batch = erspan_exit_batch_net,
84e54fe0
WT
1637 .id = &erspan_net_id,
1638 .size = sizeof(struct ip_tunnel_net),
1639};
1640
1da177e4
LT
1641static int __init ipgre_init(void)
1642{
1643 int err;
1644
058bd4d2 1645 pr_info("GRE over IPv4 tunneling driver\n");
1da177e4 1646
cfb8fbf2 1647 err = register_pernet_device(&ipgre_net_ops);
59a4c759 1648 if (err < 0)
c2892f02
AD
1649 return err;
1650
c5441932
PS
1651 err = register_pernet_device(&ipgre_tap_net_ops);
1652 if (err < 0)
e3d0328c 1653 goto pnet_tap_failed;
c5441932 1654
84e54fe0
WT
1655 err = register_pernet_device(&erspan_net_ops);
1656 if (err < 0)
1657 goto pnet_erspan_failed;
1658
9f57c67c 1659 err = gre_add_protocol(&ipgre_protocol, GREPROTO_CISCO);
c2892f02 1660 if (err < 0) {
058bd4d2 1661 pr_info("%s: can't add protocol\n", __func__);
c2892f02
AD
1662 goto add_proto_failed;
1663 }
7daa0004 1664
c19e654d
HX
1665 err = rtnl_link_register(&ipgre_link_ops);
1666 if (err < 0)
1667 goto rtnl_link_failed;
1668
e1a80002
HX
1669 err = rtnl_link_register(&ipgre_tap_ops);
1670 if (err < 0)
1671 goto tap_ops_failed;
1672
84e54fe0
WT
1673 err = rtnl_link_register(&erspan_link_ops);
1674 if (err < 0)
1675 goto erspan_link_failed;
1676
c5441932 1677 return 0;
c19e654d 1678
84e54fe0
WT
1679erspan_link_failed:
1680 rtnl_link_unregister(&ipgre_tap_ops);
e1a80002
HX
1681tap_ops_failed:
1682 rtnl_link_unregister(&ipgre_link_ops);
c19e654d 1683rtnl_link_failed:
9f57c67c 1684 gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO);
c2892f02 1685add_proto_failed:
84e54fe0
WT
1686 unregister_pernet_device(&erspan_net_ops);
1687pnet_erspan_failed:
c5441932 1688 unregister_pernet_device(&ipgre_tap_net_ops);
e3d0328c 1689pnet_tap_failed:
c2892f02 1690 unregister_pernet_device(&ipgre_net_ops);
c5441932 1691 return err;
1da177e4
LT
1692}
1693
db44575f 1694static void __exit ipgre_fini(void)
1da177e4 1695{
e1a80002 1696 rtnl_link_unregister(&ipgre_tap_ops);
c19e654d 1697 rtnl_link_unregister(&ipgre_link_ops);
84e54fe0 1698 rtnl_link_unregister(&erspan_link_ops);
9f57c67c 1699 gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO);
c5441932 1700 unregister_pernet_device(&ipgre_tap_net_ops);
c2892f02 1701 unregister_pernet_device(&ipgre_net_ops);
84e54fe0 1702 unregister_pernet_device(&erspan_net_ops);
1da177e4
LT
1703}
1704
1705module_init(ipgre_init);
1706module_exit(ipgre_fini);
1707MODULE_LICENSE("GPL");
4d74f8ba
PM
1708MODULE_ALIAS_RTNL_LINK("gre");
1709MODULE_ALIAS_RTNL_LINK("gretap");
84e54fe0 1710MODULE_ALIAS_RTNL_LINK("erspan");
8909c9ad 1711MODULE_ALIAS_NETDEV("gre0");
c5441932 1712MODULE_ALIAS_NETDEV("gretap0");
84e54fe0 1713MODULE_ALIAS_NETDEV("erspan0");