2 * Copyright (c) 2013 Nicira, Inc.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of version 2 of the GNU General Public
6 * License as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 #include <linux/capability.h>
22 #include <linux/module.h>
23 #include <linux/types.h>
24 #include <linux/kernel.h>
25 #include <linux/slab.h>
26 #include <linux/uaccess.h>
27 #include <linux/skbuff.h>
28 #include <linux/netdevice.h>
30 #include <linux/tcp.h>
31 #include <linux/udp.h>
32 #include <linux/if_arp.h>
33 #include <linux/mroute.h>
34 #include <linux/init.h>
35 #include <linux/in6.h>
36 #include <linux/inetdevice.h>
37 #include <linux/igmp.h>
38 #include <linux/netfilter_ipv4.h>
39 #include <linux/etherdevice.h>
40 #include <linux/if_ether.h>
41 #include <linux/if_vlan.h>
42 #include <linux/rculist.h>
43 #include <linux/err.h>
48 #include <net/protocol.h>
49 #include <net/ip_tunnels.h>
51 #include <net/checksum.h>
52 #include <net/dsfield.h>
53 #include <net/inet_ecn.h>
55 #include <net/net_namespace.h>
56 #include <net/netns/generic.h>
57 #include <net/rtnetlink.h>
59 #if IS_ENABLED(CONFIG_IPV6)
61 #include <net/ip6_fib.h>
62 #include <net/ip6_route.h>
65 static unsigned int ip_tunnel_hash(__be32 key
, __be32 remote
)
67 return hash_32((__force u32
)key
^ (__force u32
)remote
,
71 static void __tunnel_dst_set(struct ip_tunnel_dst
*idst
,
72 struct dst_entry
*dst
)
74 struct dst_entry
*old_dst
;
77 if (dst
->flags
& DST_NOCACHE
)
82 old_dst
= xchg((__force
struct dst_entry
**)&idst
->dst
, dst
);
86 static void tunnel_dst_set(struct ip_tunnel
*t
, struct dst_entry
*dst
)
88 __tunnel_dst_set(this_cpu_ptr(t
->dst_cache
), dst
);
91 static void tunnel_dst_reset(struct ip_tunnel
*t
)
93 tunnel_dst_set(t
, NULL
);
96 void ip_tunnel_dst_reset_all(struct ip_tunnel
*t
)
100 for_each_possible_cpu(i
)
101 __tunnel_dst_set(per_cpu_ptr(t
->dst_cache
, i
), NULL
);
103 EXPORT_SYMBOL(ip_tunnel_dst_reset_all
);
105 static struct rtable
*tunnel_rtable_get(struct ip_tunnel
*t
, u32 cookie
)
107 struct dst_entry
*dst
;
110 dst
= rcu_dereference(this_cpu_ptr(t
->dst_cache
)->dst
);
112 if (dst
->obsolete
&& dst
->ops
->check(dst
, cookie
) == NULL
) {
120 return (struct rtable
*)dst
;
123 static bool ip_tunnel_key_match(const struct ip_tunnel_parm
*p
,
124 __be16 flags
, __be32 key
)
126 if (p
->i_flags
& TUNNEL_KEY
) {
127 if (flags
& TUNNEL_KEY
)
128 return key
== p
->i_key
;
130 /* key expected, none present */
133 return !(flags
& TUNNEL_KEY
);
136 /* Fallback tunnel: no source, no destination, no key, no options
139 We require exact key match i.e. if a key is present in packet
140 it will match only tunnel with the same key; if it is not present,
141 it will match only keyless tunnel.
143 All keysless packets, if not matched configured keyless tunnels
144 will match fallback tunnel.
145 Given src, dst and key, find appropriate for input tunnel.
147 struct ip_tunnel
*ip_tunnel_lookup(struct ip_tunnel_net
*itn
,
148 int link
, __be16 flags
,
149 __be32 remote
, __be32 local
,
153 struct ip_tunnel
*t
, *cand
= NULL
;
154 struct hlist_head
*head
;
156 hash
= ip_tunnel_hash(key
, remote
);
157 head
= &itn
->tunnels
[hash
];
159 hlist_for_each_entry_rcu(t
, head
, hash_node
) {
160 if (local
!= t
->parms
.iph
.saddr
||
161 remote
!= t
->parms
.iph
.daddr
||
162 !(t
->dev
->flags
& IFF_UP
))
165 if (!ip_tunnel_key_match(&t
->parms
, flags
, key
))
168 if (t
->parms
.link
== link
)
174 hlist_for_each_entry_rcu(t
, head
, hash_node
) {
175 if (remote
!= t
->parms
.iph
.daddr
||
176 !(t
->dev
->flags
& IFF_UP
))
179 if (!ip_tunnel_key_match(&t
->parms
, flags
, key
))
182 if (t
->parms
.link
== link
)
188 hash
= ip_tunnel_hash(key
, 0);
189 head
= &itn
->tunnels
[hash
];
191 hlist_for_each_entry_rcu(t
, head
, hash_node
) {
192 if ((local
!= t
->parms
.iph
.saddr
&&
193 (local
!= t
->parms
.iph
.daddr
||
194 !ipv4_is_multicast(local
))) ||
195 !(t
->dev
->flags
& IFF_UP
))
198 if (!ip_tunnel_key_match(&t
->parms
, flags
, key
))
201 if (t
->parms
.link
== link
)
207 if (flags
& TUNNEL_NO_KEY
)
208 goto skip_key_lookup
;
210 hlist_for_each_entry_rcu(t
, head
, hash_node
) {
211 if (t
->parms
.i_key
!= key
||
212 !(t
->dev
->flags
& IFF_UP
))
215 if (t
->parms
.link
== link
)
225 if (itn
->fb_tunnel_dev
&& itn
->fb_tunnel_dev
->flags
& IFF_UP
)
226 return netdev_priv(itn
->fb_tunnel_dev
);
231 EXPORT_SYMBOL_GPL(ip_tunnel_lookup
);
233 static struct hlist_head
*ip_bucket(struct ip_tunnel_net
*itn
,
234 struct ip_tunnel_parm
*parms
)
238 __be32 i_key
= parms
->i_key
;
240 if (parms
->iph
.daddr
&& !ipv4_is_multicast(parms
->iph
.daddr
))
241 remote
= parms
->iph
.daddr
;
245 if (!(parms
->i_flags
& TUNNEL_KEY
) && (parms
->i_flags
& VTI_ISVTI
))
248 h
= ip_tunnel_hash(i_key
, remote
);
249 return &itn
->tunnels
[h
];
252 static void ip_tunnel_add(struct ip_tunnel_net
*itn
, struct ip_tunnel
*t
)
254 struct hlist_head
*head
= ip_bucket(itn
, &t
->parms
);
256 hlist_add_head_rcu(&t
->hash_node
, head
);
259 static void ip_tunnel_del(struct ip_tunnel
*t
)
261 hlist_del_init_rcu(&t
->hash_node
);
264 static struct ip_tunnel
*ip_tunnel_find(struct ip_tunnel_net
*itn
,
265 struct ip_tunnel_parm
*parms
,
268 __be32 remote
= parms
->iph
.daddr
;
269 __be32 local
= parms
->iph
.saddr
;
270 __be32 key
= parms
->i_key
;
271 __be16 flags
= parms
->i_flags
;
272 int link
= parms
->link
;
273 struct ip_tunnel
*t
= NULL
;
274 struct hlist_head
*head
= ip_bucket(itn
, parms
);
276 hlist_for_each_entry_rcu(t
, head
, hash_node
) {
277 if (local
== t
->parms
.iph
.saddr
&&
278 remote
== t
->parms
.iph
.daddr
&&
279 link
== t
->parms
.link
&&
280 type
== t
->dev
->type
&&
281 ip_tunnel_key_match(&t
->parms
, flags
, key
))
287 static struct net_device
*__ip_tunnel_create(struct net
*net
,
288 const struct rtnl_link_ops
*ops
,
289 struct ip_tunnel_parm
*parms
)
292 struct ip_tunnel
*tunnel
;
293 struct net_device
*dev
;
297 strlcpy(name
, parms
->name
, IFNAMSIZ
);
299 if (strlen(ops
->kind
) > (IFNAMSIZ
- 3)) {
303 strlcpy(name
, ops
->kind
, IFNAMSIZ
);
304 strncat(name
, "%d", 2);
308 dev
= alloc_netdev(ops
->priv_size
, name
, ops
->setup
);
313 dev_net_set(dev
, net
);
315 dev
->rtnl_link_ops
= ops
;
317 tunnel
= netdev_priv(dev
);
318 tunnel
->parms
= *parms
;
321 err
= register_netdevice(dev
);
333 static inline void init_tunnel_flow(struct flowi4
*fl4
,
335 __be32 daddr
, __be32 saddr
,
336 __be32 key
, __u8 tos
, int oif
)
338 memset(fl4
, 0, sizeof(*fl4
));
339 fl4
->flowi4_oif
= oif
;
342 fl4
->flowi4_tos
= tos
;
343 fl4
->flowi4_proto
= proto
;
344 fl4
->fl4_gre_key
= key
;
347 static int ip_tunnel_bind_dev(struct net_device
*dev
)
349 struct net_device
*tdev
= NULL
;
350 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
351 const struct iphdr
*iph
;
352 int hlen
= LL_MAX_HEADER
;
353 int mtu
= ETH_DATA_LEN
;
354 int t_hlen
= tunnel
->hlen
+ sizeof(struct iphdr
);
356 iph
= &tunnel
->parms
.iph
;
358 /* Guess output device to choose reasonable mtu and needed_headroom */
363 init_tunnel_flow(&fl4
, iph
->protocol
, iph
->daddr
,
364 iph
->saddr
, tunnel
->parms
.o_key
,
365 RT_TOS(iph
->tos
), tunnel
->parms
.link
);
366 rt
= ip_route_output_key(tunnel
->net
, &fl4
);
370 tunnel_dst_set(tunnel
, &rt
->dst
);
373 if (dev
->type
!= ARPHRD_ETHER
)
374 dev
->flags
|= IFF_POINTOPOINT
;
377 if (!tdev
&& tunnel
->parms
.link
)
378 tdev
= __dev_get_by_index(tunnel
->net
, tunnel
->parms
.link
);
381 hlen
= tdev
->hard_header_len
+ tdev
->needed_headroom
;
384 dev
->iflink
= tunnel
->parms
.link
;
386 dev
->needed_headroom
= t_hlen
+ hlen
;
387 mtu
-= (dev
->hard_header_len
+ t_hlen
);
395 static struct ip_tunnel
*ip_tunnel_create(struct net
*net
,
396 struct ip_tunnel_net
*itn
,
397 struct ip_tunnel_parm
*parms
)
399 struct ip_tunnel
*nt
, *fbt
;
400 struct net_device
*dev
;
402 BUG_ON(!itn
->fb_tunnel_dev
);
403 fbt
= netdev_priv(itn
->fb_tunnel_dev
);
404 dev
= __ip_tunnel_create(net
, itn
->fb_tunnel_dev
->rtnl_link_ops
, parms
);
406 return ERR_CAST(dev
);
408 dev
->mtu
= ip_tunnel_bind_dev(dev
);
410 nt
= netdev_priv(dev
);
411 ip_tunnel_add(itn
, nt
);
415 int ip_tunnel_rcv(struct ip_tunnel
*tunnel
, struct sk_buff
*skb
,
416 const struct tnl_ptk_info
*tpi
, bool log_ecn_error
)
418 struct pcpu_sw_netstats
*tstats
;
419 const struct iphdr
*iph
= ip_hdr(skb
);
422 #ifdef CONFIG_NET_IPGRE_BROADCAST
423 if (ipv4_is_multicast(iph
->daddr
)) {
424 tunnel
->dev
->stats
.multicast
++;
425 skb
->pkt_type
= PACKET_BROADCAST
;
429 if ((!(tpi
->flags
&TUNNEL_CSUM
) && (tunnel
->parms
.i_flags
&TUNNEL_CSUM
)) ||
430 ((tpi
->flags
&TUNNEL_CSUM
) && !(tunnel
->parms
.i_flags
&TUNNEL_CSUM
))) {
431 tunnel
->dev
->stats
.rx_crc_errors
++;
432 tunnel
->dev
->stats
.rx_errors
++;
436 if (tunnel
->parms
.i_flags
&TUNNEL_SEQ
) {
437 if (!(tpi
->flags
&TUNNEL_SEQ
) ||
438 (tunnel
->i_seqno
&& (s32
)(ntohl(tpi
->seq
) - tunnel
->i_seqno
) < 0)) {
439 tunnel
->dev
->stats
.rx_fifo_errors
++;
440 tunnel
->dev
->stats
.rx_errors
++;
443 tunnel
->i_seqno
= ntohl(tpi
->seq
) + 1;
446 skb_reset_network_header(skb
);
448 err
= IP_ECN_decapsulate(iph
, skb
);
451 net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n",
452 &iph
->saddr
, iph
->tos
);
454 ++tunnel
->dev
->stats
.rx_frame_errors
;
455 ++tunnel
->dev
->stats
.rx_errors
;
460 tstats
= this_cpu_ptr(tunnel
->dev
->tstats
);
461 u64_stats_update_begin(&tstats
->syncp
);
462 tstats
->rx_packets
++;
463 tstats
->rx_bytes
+= skb
->len
;
464 u64_stats_update_end(&tstats
->syncp
);
466 skb_scrub_packet(skb
, !net_eq(tunnel
->net
, dev_net(tunnel
->dev
)));
468 if (tunnel
->dev
->type
== ARPHRD_ETHER
) {
469 skb
->protocol
= eth_type_trans(skb
, tunnel
->dev
);
470 skb_postpull_rcsum(skb
, eth_hdr(skb
), ETH_HLEN
);
472 skb
->dev
= tunnel
->dev
;
475 gro_cells_receive(&tunnel
->gro_cells
, skb
);
482 EXPORT_SYMBOL_GPL(ip_tunnel_rcv
);
484 static int tnl_update_pmtu(struct net_device
*dev
, struct sk_buff
*skb
,
485 struct rtable
*rt
, __be16 df
)
487 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
488 int pkt_size
= skb
->len
- tunnel
->hlen
- dev
->hard_header_len
;
492 mtu
= dst_mtu(&rt
->dst
) - dev
->hard_header_len
493 - sizeof(struct iphdr
) - tunnel
->hlen
;
495 mtu
= skb_dst(skb
) ? dst_mtu(skb_dst(skb
)) : dev
->mtu
;
498 skb_dst(skb
)->ops
->update_pmtu(skb_dst(skb
), NULL
, skb
, mtu
);
500 if (skb
->protocol
== htons(ETH_P_IP
)) {
501 if (!skb_is_gso(skb
) &&
502 (df
& htons(IP_DF
)) && mtu
< pkt_size
) {
503 memset(IPCB(skb
), 0, sizeof(*IPCB(skb
)));
504 icmp_send(skb
, ICMP_DEST_UNREACH
, ICMP_FRAG_NEEDED
, htonl(mtu
));
508 #if IS_ENABLED(CONFIG_IPV6)
509 else if (skb
->protocol
== htons(ETH_P_IPV6
)) {
510 struct rt6_info
*rt6
= (struct rt6_info
*)skb_dst(skb
);
512 if (rt6
&& mtu
< dst_mtu(skb_dst(skb
)) &&
513 mtu
>= IPV6_MIN_MTU
) {
514 if ((tunnel
->parms
.iph
.daddr
&&
515 !ipv4_is_multicast(tunnel
->parms
.iph
.daddr
)) ||
516 rt6
->rt6i_dst
.plen
== 128) {
517 rt6
->rt6i_flags
|= RTF_MODIFIED
;
518 dst_metric_set(skb_dst(skb
), RTAX_MTU
, mtu
);
522 if (!skb_is_gso(skb
) && mtu
>= IPV6_MIN_MTU
&&
524 icmpv6_send(skb
, ICMPV6_PKT_TOOBIG
, 0, mtu
);
532 void ip_tunnel_xmit(struct sk_buff
*skb
, struct net_device
*dev
,
533 const struct iphdr
*tnl_params
, const u8 protocol
)
535 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
536 const struct iphdr
*inner_iph
;
540 struct rtable
*rt
; /* Route to the other host */
541 unsigned int max_headroom
; /* The extra header space needed */
546 inner_iph
= (const struct iphdr
*)skb_inner_network_header(skb
);
547 connected
= (tunnel
->parms
.iph
.daddr
!= 0);
549 dst
= tnl_params
->daddr
;
553 if (skb_dst(skb
) == NULL
) {
554 dev
->stats
.tx_fifo_errors
++;
558 if (skb
->protocol
== htons(ETH_P_IP
)) {
559 rt
= skb_rtable(skb
);
560 dst
= rt_nexthop(rt
, inner_iph
->daddr
);
562 #if IS_ENABLED(CONFIG_IPV6)
563 else if (skb
->protocol
== htons(ETH_P_IPV6
)) {
564 const struct in6_addr
*addr6
;
565 struct neighbour
*neigh
;
566 bool do_tx_error_icmp
;
569 neigh
= dst_neigh_lookup(skb_dst(skb
),
570 &ipv6_hdr(skb
)->daddr
);
574 addr6
= (const struct in6_addr
*)&neigh
->primary_key
;
575 addr_type
= ipv6_addr_type(addr6
);
577 if (addr_type
== IPV6_ADDR_ANY
) {
578 addr6
= &ipv6_hdr(skb
)->daddr
;
579 addr_type
= ipv6_addr_type(addr6
);
582 if ((addr_type
& IPV6_ADDR_COMPATv4
) == 0)
583 do_tx_error_icmp
= true;
585 do_tx_error_icmp
= false;
586 dst
= addr6
->s6_addr32
[3];
588 neigh_release(neigh
);
589 if (do_tx_error_icmp
)
599 tos
= tnl_params
->tos
;
602 if (skb
->protocol
== htons(ETH_P_IP
)) {
603 tos
= inner_iph
->tos
;
605 } else if (skb
->protocol
== htons(ETH_P_IPV6
)) {
606 tos
= ipv6_get_dsfield((const struct ipv6hdr
*)inner_iph
);
611 init_tunnel_flow(&fl4
, protocol
, dst
, tnl_params
->saddr
,
612 tunnel
->parms
.o_key
, RT_TOS(tos
), tunnel
->parms
.link
);
614 rt
= connected
? tunnel_rtable_get(tunnel
, 0) : NULL
;
617 rt
= ip_route_output_key(tunnel
->net
, &fl4
);
620 dev
->stats
.tx_carrier_errors
++;
624 tunnel_dst_set(tunnel
, &rt
->dst
);
627 if (rt
->dst
.dev
== dev
) {
629 dev
->stats
.collisions
++;
633 if (tnl_update_pmtu(dev
, skb
, rt
, tnl_params
->frag_off
)) {
638 if (tunnel
->err_count
> 0) {
639 if (time_before(jiffies
,
640 tunnel
->err_time
+ IPTUNNEL_ERR_TIMEO
)) {
643 memset(IPCB(skb
), 0, sizeof(*IPCB(skb
)));
644 dst_link_failure(skb
);
646 tunnel
->err_count
= 0;
649 tos
= ip_tunnel_ecn_encap(tos
, inner_iph
, skb
);
650 ttl
= tnl_params
->ttl
;
652 if (skb
->protocol
== htons(ETH_P_IP
))
653 ttl
= inner_iph
->ttl
;
654 #if IS_ENABLED(CONFIG_IPV6)
655 else if (skb
->protocol
== htons(ETH_P_IPV6
))
656 ttl
= ((const struct ipv6hdr
*)inner_iph
)->hop_limit
;
659 ttl
= ip4_dst_hoplimit(&rt
->dst
);
662 df
= tnl_params
->frag_off
;
663 if (skb
->protocol
== htons(ETH_P_IP
))
664 df
|= (inner_iph
->frag_off
&htons(IP_DF
));
666 max_headroom
= LL_RESERVED_SPACE(rt
->dst
.dev
) + sizeof(struct iphdr
)
667 + rt
->dst
.header_len
;
668 if (max_headroom
> dev
->needed_headroom
)
669 dev
->needed_headroom
= max_headroom
;
671 if (skb_cow_head(skb
, dev
->needed_headroom
)) {
673 dev
->stats
.tx_dropped
++;
678 err
= iptunnel_xmit(skb
->sk
, rt
, skb
, fl4
.saddr
, fl4
.daddr
, protocol
,
679 tos
, ttl
, df
, !net_eq(tunnel
->net
, dev_net(dev
)));
680 iptunnel_xmit_stats(err
, &dev
->stats
, dev
->tstats
);
684 #if IS_ENABLED(CONFIG_IPV6)
686 dst_link_failure(skb
);
689 dev
->stats
.tx_errors
++;
692 EXPORT_SYMBOL_GPL(ip_tunnel_xmit
);
694 static void ip_tunnel_update(struct ip_tunnel_net
*itn
,
696 struct net_device
*dev
,
697 struct ip_tunnel_parm
*p
,
701 t
->parms
.iph
.saddr
= p
->iph
.saddr
;
702 t
->parms
.iph
.daddr
= p
->iph
.daddr
;
703 t
->parms
.i_key
= p
->i_key
;
704 t
->parms
.o_key
= p
->o_key
;
705 if (dev
->type
!= ARPHRD_ETHER
) {
706 memcpy(dev
->dev_addr
, &p
->iph
.saddr
, 4);
707 memcpy(dev
->broadcast
, &p
->iph
.daddr
, 4);
709 ip_tunnel_add(itn
, t
);
711 t
->parms
.iph
.ttl
= p
->iph
.ttl
;
712 t
->parms
.iph
.tos
= p
->iph
.tos
;
713 t
->parms
.iph
.frag_off
= p
->iph
.frag_off
;
715 if (t
->parms
.link
!= p
->link
) {
718 t
->parms
.link
= p
->link
;
719 mtu
= ip_tunnel_bind_dev(dev
);
723 ip_tunnel_dst_reset_all(t
);
724 netdev_state_change(dev
);
727 int ip_tunnel_ioctl(struct net_device
*dev
, struct ip_tunnel_parm
*p
, int cmd
)
730 struct ip_tunnel
*t
= netdev_priv(dev
);
731 struct net
*net
= t
->net
;
732 struct ip_tunnel_net
*itn
= net_generic(net
, t
->ip_tnl_net_id
);
734 BUG_ON(!itn
->fb_tunnel_dev
);
737 if (dev
== itn
->fb_tunnel_dev
) {
738 t
= ip_tunnel_find(itn
, p
, itn
->fb_tunnel_dev
->type
);
740 t
= netdev_priv(dev
);
742 memcpy(p
, &t
->parms
, sizeof(*p
));
748 if (!ns_capable(net
->user_ns
, CAP_NET_ADMIN
))
751 p
->iph
.frag_off
|= htons(IP_DF
);
752 if (!(p
->i_flags
& VTI_ISVTI
)) {
753 if (!(p
->i_flags
& TUNNEL_KEY
))
755 if (!(p
->o_flags
& TUNNEL_KEY
))
759 t
= ip_tunnel_find(itn
, p
, itn
->fb_tunnel_dev
->type
);
761 if (!t
&& (cmd
== SIOCADDTUNNEL
)) {
762 t
= ip_tunnel_create(net
, itn
, p
);
768 if (dev
!= itn
->fb_tunnel_dev
&& cmd
== SIOCCHGTUNNEL
) {
775 unsigned int nflags
= 0;
777 if (ipv4_is_multicast(p
->iph
.daddr
))
778 nflags
= IFF_BROADCAST
;
779 else if (p
->iph
.daddr
)
780 nflags
= IFF_POINTOPOINT
;
782 if ((dev
->flags
^nflags
)&(IFF_POINTOPOINT
|IFF_BROADCAST
)) {
787 t
= netdev_priv(dev
);
793 ip_tunnel_update(itn
, t
, dev
, p
, true);
801 if (!ns_capable(net
->user_ns
, CAP_NET_ADMIN
))
804 if (dev
== itn
->fb_tunnel_dev
) {
806 t
= ip_tunnel_find(itn
, p
, itn
->fb_tunnel_dev
->type
);
810 if (t
== netdev_priv(itn
->fb_tunnel_dev
))
814 unregister_netdevice(dev
);
825 EXPORT_SYMBOL_GPL(ip_tunnel_ioctl
);
827 int ip_tunnel_change_mtu(struct net_device
*dev
, int new_mtu
)
829 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
830 int t_hlen
= tunnel
->hlen
+ sizeof(struct iphdr
);
833 new_mtu
> 0xFFF8 - dev
->hard_header_len
- t_hlen
)
838 EXPORT_SYMBOL_GPL(ip_tunnel_change_mtu
);
840 static void ip_tunnel_dev_free(struct net_device
*dev
)
842 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
844 gro_cells_destroy(&tunnel
->gro_cells
);
845 free_percpu(tunnel
->dst_cache
);
846 free_percpu(dev
->tstats
);
850 void ip_tunnel_dellink(struct net_device
*dev
, struct list_head
*head
)
852 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
853 struct ip_tunnel_net
*itn
;
855 itn
= net_generic(tunnel
->net
, tunnel
->ip_tnl_net_id
);
857 if (itn
->fb_tunnel_dev
!= dev
) {
858 ip_tunnel_del(netdev_priv(dev
));
859 unregister_netdevice_queue(dev
, head
);
862 EXPORT_SYMBOL_GPL(ip_tunnel_dellink
);
864 int ip_tunnel_init_net(struct net
*net
, int ip_tnl_net_id
,
865 struct rtnl_link_ops
*ops
, char *devname
)
867 struct ip_tunnel_net
*itn
= net_generic(net
, ip_tnl_net_id
);
868 struct ip_tunnel_parm parms
;
871 for (i
= 0; i
< IP_TNL_HASH_SIZE
; i
++)
872 INIT_HLIST_HEAD(&itn
->tunnels
[i
]);
875 itn
->fb_tunnel_dev
= NULL
;
879 memset(&parms
, 0, sizeof(parms
));
881 strlcpy(parms
.name
, devname
, IFNAMSIZ
);
884 itn
->fb_tunnel_dev
= __ip_tunnel_create(net
, ops
, &parms
);
885 /* FB netdevice is special: we have one, and only one per netns.
886 * Allowing to move it to another netns is clearly unsafe.
888 if (!IS_ERR(itn
->fb_tunnel_dev
)) {
889 itn
->fb_tunnel_dev
->features
|= NETIF_F_NETNS_LOCAL
;
890 itn
->fb_tunnel_dev
->mtu
= ip_tunnel_bind_dev(itn
->fb_tunnel_dev
);
891 ip_tunnel_add(itn
, netdev_priv(itn
->fb_tunnel_dev
));
895 return PTR_ERR_OR_ZERO(itn
->fb_tunnel_dev
);
897 EXPORT_SYMBOL_GPL(ip_tunnel_init_net
);
899 static void ip_tunnel_destroy(struct ip_tunnel_net
*itn
, struct list_head
*head
,
900 struct rtnl_link_ops
*ops
)
902 struct net
*net
= dev_net(itn
->fb_tunnel_dev
);
903 struct net_device
*dev
, *aux
;
906 for_each_netdev_safe(net
, dev
, aux
)
907 if (dev
->rtnl_link_ops
== ops
)
908 unregister_netdevice_queue(dev
, head
);
910 for (h
= 0; h
< IP_TNL_HASH_SIZE
; h
++) {
912 struct hlist_node
*n
;
913 struct hlist_head
*thead
= &itn
->tunnels
[h
];
915 hlist_for_each_entry_safe(t
, n
, thead
, hash_node
)
916 /* If dev is in the same netns, it has already
917 * been added to the list by the previous loop.
919 if (!net_eq(dev_net(t
->dev
), net
))
920 unregister_netdevice_queue(t
->dev
, head
);
924 void ip_tunnel_delete_net(struct ip_tunnel_net
*itn
, struct rtnl_link_ops
*ops
)
929 ip_tunnel_destroy(itn
, &list
, ops
);
930 unregister_netdevice_many(&list
);
933 EXPORT_SYMBOL_GPL(ip_tunnel_delete_net
);
935 int ip_tunnel_newlink(struct net_device
*dev
, struct nlattr
*tb
[],
936 struct ip_tunnel_parm
*p
)
938 struct ip_tunnel
*nt
;
939 struct net
*net
= dev_net(dev
);
940 struct ip_tunnel_net
*itn
;
944 nt
= netdev_priv(dev
);
945 itn
= net_generic(net
, nt
->ip_tnl_net_id
);
947 if (ip_tunnel_find(itn
, p
, dev
->type
))
952 err
= register_netdevice(dev
);
956 if (dev
->type
== ARPHRD_ETHER
&& !tb
[IFLA_ADDRESS
])
957 eth_hw_addr_random(dev
);
959 mtu
= ip_tunnel_bind_dev(dev
);
963 ip_tunnel_add(itn
, nt
);
968 EXPORT_SYMBOL_GPL(ip_tunnel_newlink
);
970 int ip_tunnel_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
971 struct ip_tunnel_parm
*p
)
974 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
975 struct net
*net
= tunnel
->net
;
976 struct ip_tunnel_net
*itn
= net_generic(net
, tunnel
->ip_tnl_net_id
);
978 if (dev
== itn
->fb_tunnel_dev
)
981 t
= ip_tunnel_find(itn
, p
, dev
->type
);
989 if (dev
->type
!= ARPHRD_ETHER
) {
990 unsigned int nflags
= 0;
992 if (ipv4_is_multicast(p
->iph
.daddr
))
993 nflags
= IFF_BROADCAST
;
994 else if (p
->iph
.daddr
)
995 nflags
= IFF_POINTOPOINT
;
997 if ((dev
->flags
^ nflags
) &
998 (IFF_POINTOPOINT
| IFF_BROADCAST
))
1003 ip_tunnel_update(itn
, t
, dev
, p
, !tb
[IFLA_MTU
]);
1006 EXPORT_SYMBOL_GPL(ip_tunnel_changelink
);
1008 int ip_tunnel_init(struct net_device
*dev
)
1010 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
1011 struct iphdr
*iph
= &tunnel
->parms
.iph
;
1014 dev
->destructor
= ip_tunnel_dev_free
;
1015 dev
->tstats
= netdev_alloc_pcpu_stats(struct pcpu_sw_netstats
);
1019 tunnel
->dst_cache
= alloc_percpu(struct ip_tunnel_dst
);
1020 if (!tunnel
->dst_cache
) {
1021 free_percpu(dev
->tstats
);
1025 err
= gro_cells_init(&tunnel
->gro_cells
, dev
);
1027 free_percpu(tunnel
->dst_cache
);
1028 free_percpu(dev
->tstats
);
1033 tunnel
->net
= dev_net(dev
);
1034 strcpy(tunnel
->parms
.name
, dev
->name
);
1040 EXPORT_SYMBOL_GPL(ip_tunnel_init
);
1042 void ip_tunnel_uninit(struct net_device
*dev
)
1044 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
1045 struct net
*net
= tunnel
->net
;
1046 struct ip_tunnel_net
*itn
;
1048 itn
= net_generic(net
, tunnel
->ip_tnl_net_id
);
1049 /* fb_tunnel_dev will be unregisted in net-exit call. */
1050 if (itn
->fb_tunnel_dev
!= dev
)
1051 ip_tunnel_del(netdev_priv(dev
));
1053 ip_tunnel_dst_reset_all(tunnel
);
1055 EXPORT_SYMBOL_GPL(ip_tunnel_uninit
);
1057 /* Do least required initialization, rest of init is done in tunnel_init call */
1058 void ip_tunnel_setup(struct net_device
*dev
, int net_id
)
1060 struct ip_tunnel
*tunnel
= netdev_priv(dev
);
1061 tunnel
->ip_tnl_net_id
= net_id
;
1063 EXPORT_SYMBOL_GPL(ip_tunnel_setup
);
1065 MODULE_LICENSE("GPL");
This page took 0.073234 seconds and 5 git commands to generate.