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