1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94#include <linux/capability.h>
95#include <linux/module.h>
96#include <linux/types.h>
97#include <linux/kernel.h>
98#include <linux/slab.h>
99#include <asm/uaccess.h>
100#include <linux/skbuff.h>
101#include <linux/netdevice.h>
102#include <linux/in.h>
103#include <linux/tcp.h>
104#include <linux/udp.h>
105#include <linux/if_arp.h>
106#include <linux/mroute.h>
107#include <linux/init.h>
108#include <linux/netfilter_ipv4.h>
109#include <linux/if_ether.h>
110
111#include <net/sock.h>
112#include <net/ip.h>
113#include <net/icmp.h>
114#include <net/ip_tunnels.h>
115#include <net/inet_ecn.h>
116#include <net/xfrm.h>
117#include <net/net_namespace.h>
118#include <net/netns/generic.h>
119
120static bool log_ecn_error = true;
121module_param(log_ecn_error, bool, 0644);
122MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
123
124static int ipip_net_id __read_mostly;
125
126static int ipip_tunnel_init(struct net_device *dev);
127static struct rtnl_link_ops ipip_link_ops __read_mostly;
128
129static int ipip_err(struct sk_buff *skb, u32 info)
130{
131
132
133
134
135
136 struct net *net = dev_net(skb->dev);
137 struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);
138 const struct iphdr *iph = (const struct iphdr *)skb->data;
139 struct ip_tunnel *t;
140 int err;
141 const int type = icmp_hdr(skb)->type;
142 const int code = icmp_hdr(skb)->code;
143
144 err = -ENOENT;
145 t = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY,
146 iph->daddr, iph->saddr, 0);
147 if (t == NULL)
148 goto out;
149
150 if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
151 ipv4_update_pmtu(skb, dev_net(skb->dev), info,
152 t->parms.link, 0, IPPROTO_IPIP, 0);
153 err = 0;
154 goto out;
155 }
156
157 if (type == ICMP_REDIRECT) {
158 ipv4_redirect(skb, dev_net(skb->dev), t->parms.link, 0,
159 IPPROTO_IPIP, 0);
160 err = 0;
161 goto out;
162 }
163
164 if (t->parms.iph.daddr == 0)
165 goto out;
166
167 err = 0;
168 if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
169 goto out;
170
171 if (time_before(jiffies, t->err_time + IPTUNNEL_ERR_TIMEO))
172 t->err_count++;
173 else
174 t->err_count = 1;
175 t->err_time = jiffies;
176
177out:
178 return err;
179}
180
181static const struct tnl_ptk_info tpi = {
182
183 .proto = htons(ETH_P_IP),
184};
185
186static int ipip_rcv(struct sk_buff *skb)
187{
188 struct net *net = dev_net(skb->dev);
189 struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);
190 struct ip_tunnel *tunnel;
191 const struct iphdr *iph;
192
193 iph = ip_hdr(skb);
194 tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY,
195 iph->saddr, iph->daddr, 0);
196 if (tunnel) {
197 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
198 goto drop;
199 if (iptunnel_pull_header(skb, 0, tpi.proto))
200 goto drop;
201 return ip_tunnel_rcv(tunnel, skb, &tpi, log_ecn_error);
202 }
203
204 return -1;
205
206drop:
207 kfree_skb(skb);
208 return 0;
209}
210
211
212
213
214
215static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
216{
217 struct ip_tunnel *tunnel = netdev_priv(dev);
218 const struct iphdr *tiph = &tunnel->parms.iph;
219
220 if (unlikely(skb->protocol != htons(ETH_P_IP)))
221 goto tx_error;
222
223 skb = iptunnel_handle_offloads(skb, false, SKB_GSO_IPIP);
224 if (IS_ERR(skb))
225 goto out;
226
227 skb_set_inner_ipproto(skb, IPPROTO_IPIP);
228
229 ip_tunnel_xmit(skb, dev, tiph, tiph->protocol);
230 return NETDEV_TX_OK;
231
232tx_error:
233 kfree_skb(skb);
234out:
235 dev->stats.tx_errors++;
236 return NETDEV_TX_OK;
237}
238
239static int
240ipip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
241{
242 int err = 0;
243 struct ip_tunnel_parm p;
244
245 if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
246 return -EFAULT;
247
248 if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
249 if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||
250 p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))
251 return -EINVAL;
252 }
253
254 p.i_key = p.o_key = p.i_flags = p.o_flags = 0;
255 if (p.iph.ttl)
256 p.iph.frag_off |= htons(IP_DF);
257
258 err = ip_tunnel_ioctl(dev, &p, cmd);
259 if (err)
260 return err;
261
262 if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
263 return -EFAULT;
264
265 return 0;
266}
267
268static const struct net_device_ops ipip_netdev_ops = {
269 .ndo_init = ipip_tunnel_init,
270 .ndo_uninit = ip_tunnel_uninit,
271 .ndo_start_xmit = ipip_tunnel_xmit,
272 .ndo_do_ioctl = ipip_tunnel_ioctl,
273 .ndo_change_mtu = ip_tunnel_change_mtu,
274 .ndo_get_stats64 = ip_tunnel_get_stats64,
275};
276
277#define IPIP_FEATURES (NETIF_F_SG | \
278 NETIF_F_FRAGLIST | \
279 NETIF_F_HIGHDMA | \
280 NETIF_F_GSO_SOFTWARE | \
281 NETIF_F_HW_CSUM)
282
283static void ipip_tunnel_setup(struct net_device *dev)
284{
285 dev->netdev_ops = &ipip_netdev_ops;
286
287 dev->type = ARPHRD_TUNNEL;
288 dev->flags = IFF_NOARP;
289 dev->iflink = 0;
290 dev->addr_len = 4;
291 dev->features |= NETIF_F_LLTX;
292 netif_keep_dst(dev);
293
294 dev->features |= IPIP_FEATURES;
295 dev->hw_features |= IPIP_FEATURES;
296 ip_tunnel_setup(dev, ipip_net_id);
297}
298
299static int ipip_tunnel_init(struct net_device *dev)
300{
301 struct ip_tunnel *tunnel = netdev_priv(dev);
302
303 memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
304 memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
305
306 tunnel->tun_hlen = 0;
307 tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
308 tunnel->parms.iph.protocol = IPPROTO_IPIP;
309 return ip_tunnel_init(dev);
310}
311
312static void ipip_netlink_parms(struct nlattr *data[],
313 struct ip_tunnel_parm *parms)
314{
315 memset(parms, 0, sizeof(*parms));
316
317 parms->iph.version = 4;
318 parms->iph.protocol = IPPROTO_IPIP;
319 parms->iph.ihl = 5;
320
321 if (!data)
322 return;
323
324 if (data[IFLA_IPTUN_LINK])
325 parms->link = nla_get_u32(data[IFLA_IPTUN_LINK]);
326
327 if (data[IFLA_IPTUN_LOCAL])
328 parms->iph.saddr = nla_get_be32(data[IFLA_IPTUN_LOCAL]);
329
330 if (data[IFLA_IPTUN_REMOTE])
331 parms->iph.daddr = nla_get_be32(data[IFLA_IPTUN_REMOTE]);
332
333 if (data[IFLA_IPTUN_TTL]) {
334 parms->iph.ttl = nla_get_u8(data[IFLA_IPTUN_TTL]);
335 if (parms->iph.ttl)
336 parms->iph.frag_off = htons(IP_DF);
337 }
338
339 if (data[IFLA_IPTUN_TOS])
340 parms->iph.tos = nla_get_u8(data[IFLA_IPTUN_TOS]);
341
342 if (!data[IFLA_IPTUN_PMTUDISC] || nla_get_u8(data[IFLA_IPTUN_PMTUDISC]))
343 parms->iph.frag_off = htons(IP_DF);
344}
345
346
347static bool ipip_netlink_encap_parms(struct nlattr *data[],
348 struct ip_tunnel_encap *ipencap)
349{
350 bool ret = false;
351
352 memset(ipencap, 0, sizeof(*ipencap));
353
354 if (!data)
355 return ret;
356
357 if (data[IFLA_IPTUN_ENCAP_TYPE]) {
358 ret = true;
359 ipencap->type = nla_get_u16(data[IFLA_IPTUN_ENCAP_TYPE]);
360 }
361
362 if (data[IFLA_IPTUN_ENCAP_FLAGS]) {
363 ret = true;
364 ipencap->flags = nla_get_u16(data[IFLA_IPTUN_ENCAP_FLAGS]);
365 }
366
367 if (data[IFLA_IPTUN_ENCAP_SPORT]) {
368 ret = true;
369 ipencap->sport = nla_get_u16(data[IFLA_IPTUN_ENCAP_SPORT]);
370 }
371
372 if (data[IFLA_IPTUN_ENCAP_DPORT]) {
373 ret = true;
374 ipencap->dport = nla_get_u16(data[IFLA_IPTUN_ENCAP_DPORT]);
375 }
376
377 return ret;
378}
379
380static int ipip_newlink(struct net *src_net, struct net_device *dev,
381 struct nlattr *tb[], struct nlattr *data[])
382{
383 struct ip_tunnel_parm p;
384 struct ip_tunnel_encap ipencap;
385
386 if (ipip_netlink_encap_parms(data, &ipencap)) {
387 struct ip_tunnel *t = netdev_priv(dev);
388 int err = ip_tunnel_encap_setup(t, &ipencap);
389
390 if (err < 0)
391 return err;
392 }
393
394 ipip_netlink_parms(data, &p);
395 return ip_tunnel_newlink(dev, tb, &p);
396}
397
398static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],
399 struct nlattr *data[])
400{
401 struct ip_tunnel_parm p;
402 struct ip_tunnel_encap ipencap;
403
404 if (ipip_netlink_encap_parms(data, &ipencap)) {
405 struct ip_tunnel *t = netdev_priv(dev);
406 int err = ip_tunnel_encap_setup(t, &ipencap);
407
408 if (err < 0)
409 return err;
410 }
411
412 ipip_netlink_parms(data, &p);
413
414 if (((dev->flags & IFF_POINTOPOINT) && !p.iph.daddr) ||
415 (!(dev->flags & IFF_POINTOPOINT) && p.iph.daddr))
416 return -EINVAL;
417
418 return ip_tunnel_changelink(dev, tb, &p);
419}
420
421static size_t ipip_get_size(const struct net_device *dev)
422{
423 return
424
425 nla_total_size(4) +
426
427 nla_total_size(4) +
428
429 nla_total_size(4) +
430
431 nla_total_size(1) +
432
433 nla_total_size(1) +
434
435 nla_total_size(1) +
436
437 nla_total_size(2) +
438
439 nla_total_size(2) +
440
441 nla_total_size(2) +
442
443 nla_total_size(2) +
444 0;
445}
446
447static int ipip_fill_info(struct sk_buff *skb, const struct net_device *dev)
448{
449 struct ip_tunnel *tunnel = netdev_priv(dev);
450 struct ip_tunnel_parm *parm = &tunnel->parms;
451
452 if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
453 nla_put_be32(skb, IFLA_IPTUN_LOCAL, parm->iph.saddr) ||
454 nla_put_be32(skb, IFLA_IPTUN_REMOTE, parm->iph.daddr) ||
455 nla_put_u8(skb, IFLA_IPTUN_TTL, parm->iph.ttl) ||
456 nla_put_u8(skb, IFLA_IPTUN_TOS, parm->iph.tos) ||
457 nla_put_u8(skb, IFLA_IPTUN_PMTUDISC,
458 !!(parm->iph.frag_off & htons(IP_DF))))
459 goto nla_put_failure;
460
461 if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE,
462 tunnel->encap.type) ||
463 nla_put_u16(skb, IFLA_IPTUN_ENCAP_SPORT,
464 tunnel->encap.sport) ||
465 nla_put_u16(skb, IFLA_IPTUN_ENCAP_DPORT,
466 tunnel->encap.dport) ||
467 nla_put_u16(skb, IFLA_IPTUN_ENCAP_FLAGS,
468 tunnel->encap.dport))
469 goto nla_put_failure;
470
471 return 0;
472
473nla_put_failure:
474 return -EMSGSIZE;
475}
476
477static const struct nla_policy ipip_policy[IFLA_IPTUN_MAX + 1] = {
478 [IFLA_IPTUN_LINK] = { .type = NLA_U32 },
479 [IFLA_IPTUN_LOCAL] = { .type = NLA_U32 },
480 [IFLA_IPTUN_REMOTE] = { .type = NLA_U32 },
481 [IFLA_IPTUN_TTL] = { .type = NLA_U8 },
482 [IFLA_IPTUN_TOS] = { .type = NLA_U8 },
483 [IFLA_IPTUN_PMTUDISC] = { .type = NLA_U8 },
484 [IFLA_IPTUN_ENCAP_TYPE] = { .type = NLA_U16 },
485 [IFLA_IPTUN_ENCAP_FLAGS] = { .type = NLA_U16 },
486 [IFLA_IPTUN_ENCAP_SPORT] = { .type = NLA_U16 },
487 [IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 },
488};
489
490static struct rtnl_link_ops ipip_link_ops __read_mostly = {
491 .kind = "ipip",
492 .maxtype = IFLA_IPTUN_MAX,
493 .policy = ipip_policy,
494 .priv_size = sizeof(struct ip_tunnel),
495 .setup = ipip_tunnel_setup,
496 .newlink = ipip_newlink,
497 .changelink = ipip_changelink,
498 .dellink = ip_tunnel_dellink,
499 .get_size = ipip_get_size,
500 .fill_info = ipip_fill_info,
501};
502
503static struct xfrm_tunnel ipip_handler __read_mostly = {
504 .handler = ipip_rcv,
505 .err_handler = ipip_err,
506 .priority = 1,
507};
508
509static int __net_init ipip_init_net(struct net *net)
510{
511 return ip_tunnel_init_net(net, ipip_net_id, &ipip_link_ops, "tunl0");
512}
513
514static void __net_exit ipip_exit_net(struct net *net)
515{
516 struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);
517 ip_tunnel_delete_net(itn, &ipip_link_ops);
518}
519
520static struct pernet_operations ipip_net_ops = {
521 .init = ipip_init_net,
522 .exit = ipip_exit_net,
523 .id = &ipip_net_id,
524 .size = sizeof(struct ip_tunnel_net),
525};
526
527static int __init ipip_init(void)
528{
529 int err;
530
531 pr_info("ipip: IPv4 over IPv4 tunneling driver\n");
532
533 err = register_pernet_device(&ipip_net_ops);
534 if (err < 0)
535 return err;
536 err = xfrm4_tunnel_register(&ipip_handler, AF_INET);
537 if (err < 0) {
538 pr_info("%s: can't register tunnel\n", __func__);
539 goto xfrm_tunnel_failed;
540 }
541 err = rtnl_link_register(&ipip_link_ops);
542 if (err < 0)
543 goto rtnl_link_failed;
544
545out:
546 return err;
547
548rtnl_link_failed:
549 xfrm4_tunnel_deregister(&ipip_handler, AF_INET);
550xfrm_tunnel_failed:
551 unregister_pernet_device(&ipip_net_ops);
552 goto out;
553}
554
555static void __exit ipip_fini(void)
556{
557 rtnl_link_unregister(&ipip_link_ops);
558 if (xfrm4_tunnel_deregister(&ipip_handler, AF_INET))
559 pr_info("%s: can't deregister tunnel\n", __func__);
560
561 unregister_pernet_device(&ipip_net_ops);
562}
563
564module_init(ipip_init);
565module_exit(ipip_fini);
566MODULE_LICENSE("GPL");
567MODULE_ALIAS_RTNL_LINK("ipip");
568MODULE_ALIAS_NETDEV("tunl0");
569