2 * GRE over IPv6 protocol decoder.
4 * Authors: Dmitry Kozlov (xeb@mail.ru)
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.
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #ifndef USE_UPSTREAM_TUNNEL
16 #include <linux/capability.h>
17 #include <linux/module.h>
18 #include <linux/types.h>
19 #include <linux/kernel.h>
20 #include <linux/slab.h>
21 #include <linux/uaccess.h>
22 #include <linux/skbuff.h>
23 #include <linux/netdevice.h>
25 #include <linux/tcp.h>
26 #include <linux/udp.h>
27 #include <linux/if_arp.h>
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>
33 #include <linux/etherdevice.h>
34 #include <linux/if_ether.h>
35 #include <linux/hash.h>
36 #include <linux/if_tunnel.h>
37 #include <linux/ip6_tunnel.h>
41 #include <net/ip_tunnels.h>
43 #include <net/protocol.h>
44 #include <net/addrconf.h>
46 #include <net/checksum.h>
47 #include <net/dsfield.h>
48 #include <net/inet_ecn.h>
50 #include <net/net_namespace.h>
51 #include <net/netns/generic.h>
52 #include <net/rtnetlink.h>
55 #include <net/ip6_fib.h>
56 #include <net/ip6_route.h>
57 #include <net/ip6_tunnel.h>
59 #include <net/erspan.h>
60 #include <net/dst_metadata.h>
62 #include "vport-netdev.h"
64 #define IP6_GRE_HASH_SIZE_SHIFT 5
65 #define IP6_GRE_HASH_SIZE (1 << IP6_GRE_HASH_SIZE_SHIFT)
67 static unsigned int ip6gre_net_id __read_mostly
;
69 struct ip6_tnl __rcu
*tunnels
[4][IP6_GRE_HASH_SIZE
];
71 struct ip6_tnl __rcu
*collect_md_tun
;
72 struct net_device
*fb_tunnel_dev
;
75 static struct rtnl_link_ops ip6gre_link_ops __read_mostly
;
76 static struct rtnl_link_ops ip6gre_tap_ops __read_mostly
;
77 static struct rtnl_link_ops ip6erspan_tap_ops __read_mostly
;
78 static int ip6gre_tunnel_init(struct net_device
*dev
);
79 static void ip6gre_tunnel_setup(struct net_device
*dev
);
80 static void ip6gre_tunnel_link(struct ip6gre_net
*ign
, struct ip6_tnl
*t
);
81 static void ip6gre_tnl_link_config(struct ip6_tnl
*t
, int set_mtu
);
82 static void ip6erspan_tnl_link_config(struct ip6_tnl
*t
, int set_mtu
);
84 #define gre_calc_hlen rpl_ip_gre_calc_hlen
85 static int rpl_ip_gre_calc_hlen(__be16 o_flags
)
89 if (o_flags
& TUNNEL_CSUM
)
91 if (o_flags
& TUNNEL_KEY
)
93 if (o_flags
& TUNNEL_SEQ
)
98 /* Tunnel hash table */
108 We require exact key match i.e. if a key is present in packet
109 it will match only tunnel with the same key; if it is not present,
110 it will match only keyless tunnel.
112 All keysless packets, if not matched configured keyless tunnels
113 will match fallback tunnel.
116 #define HASH_KEY(key) (((__force u32)key^((__force u32)key>>4))&(IP6_GRE_HASH_SIZE - 1))
117 static u32
HASH_ADDR(const struct in6_addr
*addr
)
119 u32 hash
= ipv6_addr_hash(addr
);
121 return hash_32(hash
, IP6_GRE_HASH_SIZE_SHIFT
);
124 #define tunnels_r_l tunnels[3]
125 #define tunnels_r tunnels[2]
126 #define tunnels_l tunnels[1]
127 #define tunnels_wc tunnels[0]
129 /* Given src, dst and key, find appropriate for input tunnel. */
131 static struct ip6_tnl
*ip6gre_tunnel_lookup(struct net_device
*dev
,
132 const struct in6_addr
*remote
, const struct in6_addr
*local
,
133 __be32 key
, __be16 gre_proto
)
135 struct net
*net
= dev_net(dev
);
136 int link
= dev
->ifindex
;
137 unsigned int h0
= HASH_ADDR(remote
);
138 unsigned int h1
= HASH_KEY(key
);
139 struct ip6_tnl
*t
, *cand
= NULL
;
140 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
141 int dev_type
= (gre_proto
== htons(ETH_P_TEB
) ||
142 gre_proto
== htons(ETH_P_ERSPAN
) ||
143 gre_proto
== htons(ETH_P_ERSPAN2
)) ?
144 ARPHRD_ETHER
: ARPHRD_IP6GRE
;
145 int score
, cand_score
= 4;
147 for_each_ip_tunnel_rcu(t
, ign
->tunnels_r_l
[h0
^ h1
]) {
148 if (!ipv6_addr_equal(local
, &t
->parms
.laddr
) ||
149 !ipv6_addr_equal(remote
, &t
->parms
.raddr
) ||
150 key
!= t
->parms
.i_key
||
151 !(t
->dev
->flags
& IFF_UP
))
154 if (t
->dev
->type
!= ARPHRD_IP6GRE
&&
155 t
->dev
->type
!= dev_type
)
159 if (t
->parms
.link
!= link
)
161 if (t
->dev
->type
!= dev_type
)
166 if (score
< cand_score
) {
172 for_each_ip_tunnel_rcu(t
, ign
->tunnels_r
[h0
^ h1
]) {
173 if (!ipv6_addr_equal(remote
, &t
->parms
.raddr
) ||
174 key
!= t
->parms
.i_key
||
175 !(t
->dev
->flags
& IFF_UP
))
178 if (t
->dev
->type
!= ARPHRD_IP6GRE
&&
179 t
->dev
->type
!= dev_type
)
183 if (t
->parms
.link
!= link
)
185 if (t
->dev
->type
!= dev_type
)
190 if (score
< cand_score
) {
196 for_each_ip_tunnel_rcu(t
, ign
->tunnels_l
[h1
]) {
197 if ((!ipv6_addr_equal(local
, &t
->parms
.laddr
) &&
198 (!ipv6_addr_equal(local
, &t
->parms
.raddr
) ||
199 !ipv6_addr_is_multicast(local
))) ||
200 key
!= t
->parms
.i_key
||
201 !(t
->dev
->flags
& IFF_UP
))
204 if (t
->dev
->type
!= ARPHRD_IP6GRE
&&
205 t
->dev
->type
!= dev_type
)
209 if (t
->parms
.link
!= link
)
211 if (t
->dev
->type
!= dev_type
)
216 if (score
< cand_score
) {
222 for_each_ip_tunnel_rcu(t
, ign
->tunnels_wc
[h1
]) {
223 if (t
->parms
.i_key
!= key
||
224 !(t
->dev
->flags
& IFF_UP
))
227 if (t
->dev
->type
!= ARPHRD_IP6GRE
&&
228 t
->dev
->type
!= dev_type
)
232 if (t
->parms
.link
!= link
)
234 if (t
->dev
->type
!= dev_type
)
239 if (score
< cand_score
) {
248 t
= rcu_dereference(ign
->collect_md_tun
);
249 if (t
&& t
->dev
->flags
& IFF_UP
)
252 dev
= ign
->fb_tunnel_dev
;
253 if (dev
->flags
& IFF_UP
)
254 return netdev_priv(dev
);
259 static struct ip6_tnl __rcu
**__ip6gre_bucket(struct ip6gre_net
*ign
,
260 const struct __ip6_tnl_parm
*p
)
262 const struct in6_addr
*remote
= &p
->raddr
;
263 const struct in6_addr
*local
= &p
->laddr
;
264 unsigned int h
= HASH_KEY(p
->i_key
);
267 if (!ipv6_addr_any(local
))
269 if (!ipv6_addr_any(remote
) && !ipv6_addr_is_multicast(remote
)) {
271 h
^= HASH_ADDR(remote
);
274 return &ign
->tunnels
[prio
][h
];
277 static inline struct ip6_tnl __rcu
**ip6gre_bucket(struct ip6gre_net
*ign
,
278 const struct ip6_tnl
*t
)
280 return __ip6gre_bucket(ign
, &t
->parms
);
283 static void ip6gre_tunnel_link(struct ip6gre_net
*ign
, struct ip6_tnl
*t
)
285 struct ip6_tnl __rcu
**tp
= ip6gre_bucket(ign
, t
);
287 if (t
->parms
.collect_md
)
288 rcu_assign_pointer(ign
->collect_md_tun
, t
);
290 rcu_assign_pointer(t
->next
, rtnl_dereference(*tp
));
291 rcu_assign_pointer(*tp
, t
);
294 static void ip6gre_tunnel_unlink(struct ip6gre_net
*ign
, struct ip6_tnl
*t
)
296 struct ip6_tnl __rcu
**tp
;
297 struct ip6_tnl
*iter
;
299 if (t
->parms
.collect_md
)
300 rcu_assign_pointer(ign
->collect_md_tun
, NULL
);
302 for (tp
= ip6gre_bucket(ign
, t
);
303 (iter
= rtnl_dereference(*tp
)) != NULL
;
306 rcu_assign_pointer(*tp
, t
->next
);
312 static struct ip6_tnl
*ip6gre_tunnel_find(struct net
*net
,
313 const struct __ip6_tnl_parm
*parms
,
316 const struct in6_addr
*remote
= &parms
->raddr
;
317 const struct in6_addr
*local
= &parms
->laddr
;
318 __be32 key
= parms
->i_key
;
319 int link
= parms
->link
;
321 struct ip6_tnl __rcu
**tp
;
322 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
324 for (tp
= __ip6gre_bucket(ign
, parms
);
325 (t
= rtnl_dereference(*tp
)) != NULL
;
327 if (ipv6_addr_equal(local
, &t
->parms
.laddr
) &&
328 ipv6_addr_equal(remote
, &t
->parms
.raddr
) &&
329 key
== t
->parms
.i_key
&&
330 link
== t
->parms
.link
&&
331 type
== t
->dev
->type
)
337 static struct ip6_tnl
*ip6gre_tunnel_locate(struct net
*net
,
338 const struct __ip6_tnl_parm
*parms
, int create
)
340 struct ip6_tnl
*t
, *nt
;
341 struct net_device
*dev
;
343 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
345 t
= ip6gre_tunnel_find(net
, parms
, ARPHRD_IP6GRE
);
352 strlcpy(name
, parms
->name
, IFNAMSIZ
);
354 strcpy(name
, "ip6gre%d");
356 dev
= alloc_netdev(sizeof(*t
), name
, NET_NAME_UNKNOWN
,
357 ip6gre_tunnel_setup
);
361 dev_net_set(dev
, net
);
363 nt
= netdev_priv(dev
);
365 dev
->rtnl_link_ops
= &ip6gre_link_ops
;
368 nt
->net
= dev_net(dev
);
370 if (register_netdevice(dev
) < 0)
373 ip6gre_tnl_link_config(nt
, 1);
375 /* Can use a lockless transmit, unless we generate output sequences */
376 if (!(nt
->parms
.o_flags
& TUNNEL_SEQ
))
377 dev
->features
|= NETIF_F_LLTX
;
380 ip6gre_tunnel_link(ign
, nt
);
388 static void ip6gre_tunnel_uninit(struct net_device
*dev
)
390 struct ip6_tnl
*t
= netdev_priv(dev
);
391 struct ip6gre_net
*ign
= net_generic(t
->net
, ip6gre_net_id
);
393 ip6gre_tunnel_unlink(ign
, t
);
394 dst_cache_reset(&t
->dst_cache
);
399 static void ip6gre_err(struct sk_buff
*skb
, struct inet6_skb_parm
*opt
,
400 u8 type
, u8 code
, int offset
, __be32 info
)
403 struct net
*net
= dev_net(skb
->dev
);
404 const struct gre_base_hdr
*greh
;
405 const struct ipv6hdr
*ipv6h
;
406 int grehlen
= sizeof(*greh
);
412 if (!pskb_may_pull(skb
, offset
+ grehlen
))
414 greh
= (const struct gre_base_hdr
*)(skb
->data
+ offset
);
416 if (flags
& (GRE_VERSION
| GRE_ROUTING
))
418 if (flags
& GRE_CSUM
)
420 if (flags
& GRE_KEY
) {
421 key_off
= grehlen
+ offset
;
425 if (!pskb_may_pull(skb
, offset
+ grehlen
))
427 ipv6h
= (const struct ipv6hdr
*)skb
->data
;
428 greh
= (const struct gre_base_hdr
*)(skb
->data
+ offset
);
429 key
= key_off
? *(__be32
*)(skb
->data
+ key_off
) : 0;
431 t
= ip6gre_tunnel_lookup(skb
->dev
, &ipv6h
->daddr
, &ipv6h
->saddr
,
432 key
, greh
->protocol
);
437 struct ipv6_tlv_tnl_enc_lim
*tel
;
439 case ICMPV6_DEST_UNREACH
:
440 net_dbg_ratelimited("%s: Path to destination invalid or inactive!\n",
442 if (code
!= ICMPV6_PORT_UNREACH
)
445 case ICMPV6_TIME_EXCEED
:
446 if (code
== ICMPV6_EXC_HOPLIMIT
) {
447 net_dbg_ratelimited("%s: Too small hop limit or routing loop in tunnel!\n",
452 case ICMPV6_PARAMPROB
:
454 if (code
== ICMPV6_HDR_FIELD
)
455 teli
= ip6_tnl_parse_tlv_enc_lim(skb
, skb
->data
);
457 if (teli
&& teli
== be32_to_cpu(info
) - 2) {
458 tel
= (struct ipv6_tlv_tnl_enc_lim
*) &skb
->data
[teli
];
459 if (tel
->encap_limit
== 0) {
460 net_dbg_ratelimited("%s: Too small encapsulation limit or routing loop in tunnel!\n",
464 net_dbg_ratelimited("%s: Recipient unable to parse tunneled packet!\n",
468 case ICMPV6_PKT_TOOBIG
:
469 ip6_update_pmtu(skb
, net
, info
, 0, 0, sock_net_uid(net
, NULL
));
472 ip6_redirect(skb
, net
, skb
->dev
->ifindex
, 0,
473 sock_net_uid(net
, NULL
));
477 if (time_before(jiffies
, t
->err_time
+ IP6TUNNEL_ERR_TIMEO
))
481 t
->err_time
= jiffies
;
485 static struct dst_ops md_dst_ops
= {
490 #define DST_METADATA 0x0080
493 static void rpl__metadata_dst_init(struct metadata_dst
*md_dst
,
494 enum metadata_type type
, u8 optslen
)
497 struct dst_entry
*dst
;
500 dst_init(dst
, &md_dst_ops
, NULL
, 1, DST_OBSOLETE_NONE
,
501 DST_METADATA
| DST_NOCOUNT
);
505 dst
->input
= dst_md_discard
;
506 dst
->output
= dst_md_discard_out
;
508 memset(dst
+ 1, 0, sizeof(*md_dst
) + optslen
- sizeof(*dst
));
512 static struct metadata_dst
*erspan_rpl_metadata_dst_alloc(u8 optslen
, enum metadata_type type
,
515 struct metadata_dst
*md_dst
;
517 md_dst
= kmalloc(sizeof(*md_dst
) + optslen
, flags
);
521 rpl__metadata_dst_init(md_dst
, type
, optslen
);
525 static inline struct metadata_dst
*rpl_tun_rx_dst(int md_size
)
527 struct metadata_dst
*tun_dst
;
529 tun_dst
= erspan_rpl_metadata_dst_alloc(md_size
, METADATA_IP_TUNNEL
, GFP_ATOMIC
);
533 tun_dst
->u
.tun_info
.options_len
= 0;
534 tun_dst
->u
.tun_info
.mode
= 0;
538 struct metadata_dst
*rpl__ipv6_tun_set_dst(const struct in6_addr
*saddr
,
539 const struct in6_addr
*daddr
,
547 struct metadata_dst
*tun_dst
;
548 struct ip_tunnel_info
*info
;
550 tun_dst
= rpl_tun_rx_dst(md_size
);
554 info
= &tun_dst
->u
.tun_info
;
555 info
->mode
= IP_TUNNEL_INFO_IPV6
;
556 info
->key
.tun_flags
= flags
;
557 info
->key
.tun_id
= tunnel_id
;
558 info
->key
.tp_src
= 0;
559 info
->key
.tp_dst
= tp_dst
;
561 info
->key
.u
.ipv6
.src
= *saddr
;
562 info
->key
.u
.ipv6
.dst
= *daddr
;
566 info
->key
.label
= label
;
571 static inline struct metadata_dst
*rpl_ipv6_tun_rx_dst(struct sk_buff
*skb
,
576 const struct ipv6hdr
*ip6h
= ipv6_hdr(skb
);
578 return rpl__ipv6_tun_set_dst(&ip6h
->saddr
, &ip6h
->daddr
,
579 ipv6_get_dsfield(ip6h
), ip6h
->hop_limit
,
580 0, ip6_flowlabel(ip6h
), flags
, tunnel_id
,
584 static int ip6gre_rcv(struct sk_buff
*skb
, const struct tnl_ptk_info
*tpi
)
586 const struct ipv6hdr
*ipv6h
;
587 struct ip6_tnl
*tunnel
;
589 ipv6h
= ipv6_hdr(skb
);
590 tunnel
= ip6gre_tunnel_lookup(skb
->dev
,
591 &ipv6h
->saddr
, &ipv6h
->daddr
, tpi
->key
,
594 struct metadata_dst
*tun_dst
= NULL
;
595 if (tunnel
->parms
.collect_md
) {
600 tun_id
= key32_to_tunnel_id(tpi
->key
);
602 tun_dst
= rpl_ipv6_tun_rx_dst(skb
, flags
, tun_id
, 0);
604 return PACKET_REJECT
;
608 ip6_tnl_rcv(tunnel
, skb
, tpi
, tun_dst
, false);
616 static int ip6erspan_rcv(struct sk_buff
*skb
, int gre_hdr_len
,
617 struct tnl_ptk_info
*tpi
)
619 struct erspan_base_hdr
*ershdr
;
620 struct erspan_metadata
*pkt_md
;
621 const struct ipv6hdr
*ipv6h
;
622 struct erspan_md2
*md2
;
623 struct ip6_tnl
*tunnel
;
626 if (unlikely(!pskb_may_pull(skb
, sizeof(*ershdr
))))
627 return PACKET_REJECT
;
629 ipv6h
= ipv6_hdr(skb
);
630 ershdr
= (struct erspan_base_hdr
*)skb
->data
;
632 tpi
->key
= cpu_to_be32(get_session_id(ershdr
));
634 tunnel
= ip6gre_tunnel_lookup(skb
->dev
,
635 &ipv6h
->saddr
, &ipv6h
->daddr
, 0,
638 struct metadata_dst
*tun_dst
= NULL
;
639 int len
= erspan_hdr_len(ver
);
641 if (unlikely(!pskb_may_pull(skb
, len
)))
642 return PACKET_REJECT
;
644 ershdr
= (struct erspan_base_hdr
*)skb
->data
;
645 pkt_md
= (struct erspan_metadata
*)(ershdr
+ 1);
647 if (__iptunnel_pull_header(skb
, len
,
650 return PACKET_REJECT
;
652 if (tunnel
->parms
.collect_md
) {
653 struct ip_tunnel_info
*info
;
654 struct erspan_metadata
*md
;
658 tpi
->flags
|= TUNNEL_KEY
;
660 tun_id
= key32_to_tunnel_id(tpi
->key
);
662 tun_dst
= rpl_ipv6_tun_rx_dst(skb
, flags
, tun_id
,
665 return PACKET_REJECT
;
667 info
= &tun_dst
->u
.tun_info
;
668 md
= ip_tunnel_info_opts(info
);
671 memcpy(md2
, pkt_md
, ver
== 1 ? ERSPAN_V1_MDSIZE
:
673 info
->key
.tun_flags
|= TUNNEL_ERSPAN_OPT
;
674 info
->options_len
= sizeof(*md
);
677 ip6_tnl_rcv(tunnel
, skb
, tpi
, tun_dst
, false);
686 static int gre_rcv(struct sk_buff
*skb
)
688 struct tnl_ptk_info tpi
;
689 bool csum_err
= false;
692 hdr_len
= gre_parse_header(skb
, &tpi
, &csum_err
, htons(ETH_P_IPV6
), 0);
696 if (iptunnel_pull_header(skb
, hdr_len
, tpi
.proto
, false))
699 if (unlikely(tpi
.proto
== htons(ETH_P_ERSPAN
) ||
700 tpi
.proto
== htons(ETH_P_ERSPAN2
))) {
701 if (ip6erspan_rcv(skb
, hdr_len
, &tpi
) == PACKET_RCVD
)
706 if (ip6gre_rcv(skb
, &tpi
) == PACKET_RCVD
)
710 icmpv6_send(skb
, ICMPV6_DEST_UNREACH
, ICMPV6_PORT_UNREACH
, 0);
716 #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
718 /* gre_handle_offloads() has different return type on older kernsl. */
719 static void gre_nop_fix(struct sk_buff
*skb
) { }
721 static void gre_csum_fix(struct sk_buff
*skb
)
723 struct gre_base_hdr
*greh
;
725 int gre_offset
= skb_transport_offset(skb
);
727 greh
= (struct gre_base_hdr
*)skb_transport_header(skb
);
728 options
= ((__be32
*)greh
+ 1);
731 *(__sum16
*)options
= csum_fold(skb_checksum(skb
, gre_offset
,
732 skb
->len
- gre_offset
, 0));
735 #define gre_handle_offloads rpl_gre_handle_offloads
736 static int rpl_gre_handle_offloads(struct sk_buff
*skb
, bool gre_csum
)
738 int type
= gre_csum
? SKB_GSO_GRE_CSUM
: SKB_GSO_GRE
;
739 gso_fix_segment_t fix_segment
;
742 fix_segment
= gre_csum_fix
;
744 fix_segment
= gre_nop_fix
;
746 return ovs_iptunnel_handle_offloads(skb
, type
, fix_segment
);
749 static int gre_handle_offloads(struct sk_buff
*skb
, bool csum
)
751 return iptunnel_handle_offloads(skb
,
752 csum
? SKB_GSO_GRE_CSUM
: SKB_GSO_GRE
);
756 static void prepare_ip6gre_xmit_ipv4(struct sk_buff
*skb
,
757 struct net_device
*dev
,
758 struct flowi6
*fl6
, __u8
*dsfield
,
761 const struct iphdr
*iph
= ip_hdr(skb
);
762 struct ip6_tnl
*t
= netdev_priv(dev
);
764 if (!(t
->parms
.flags
& IP6_TNL_F_IGN_ENCAP_LIMIT
))
765 *encap_limit
= t
->parms
.encap_limit
;
767 memcpy(fl6
, &t
->fl
.u
.ip6
, sizeof(*fl6
));
769 if (t
->parms
.flags
& IP6_TNL_F_USE_ORIG_TCLASS
)
770 *dsfield
= ipv4_get_dsfield(iph
);
772 *dsfield
= ip6_tclass(t
->parms
.flowinfo
);
774 #ifndef IP6_TNL_F_USE_ORIG_FWMARK
775 if (t
->parms
.flags
& IP6_TNL_F_USE_ORIG_FWMARK
)
776 fl6
->flowi6_mark
= skb
->mark
;
778 fl6
->flowi6_mark
= t
->parms
.fwmark
;
780 fl6
->flowi6_uid
= sock_net_uid(dev_net(dev
), NULL
);
784 static int prepare_ip6gre_xmit_ipv6(struct sk_buff
*skb
,
785 struct net_device
*dev
,
786 struct flowi6
*fl6
, __u8
*dsfield
,
789 struct ipv6hdr
*ipv6h
= ipv6_hdr(skb
);
790 struct ip6_tnl
*t
= netdev_priv(dev
);
793 offset
= ip6_tnl_parse_tlv_enc_lim(skb
, skb_network_header(skb
));
794 /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */
797 struct ipv6_tlv_tnl_enc_lim
*tel
;
799 tel
= (struct ipv6_tlv_tnl_enc_lim
*)&skb_network_header(skb
)[offset
];
800 if (tel
->encap_limit
== 0) {
801 icmpv6_send(skb
, ICMPV6_PARAMPROB
,
802 ICMPV6_HDR_FIELD
, offset
+ 2);
805 *encap_limit
= tel
->encap_limit
- 1;
806 } else if (!(t
->parms
.flags
& IP6_TNL_F_IGN_ENCAP_LIMIT
)) {
807 *encap_limit
= t
->parms
.encap_limit
;
810 memcpy(fl6
, &t
->fl
.u
.ip6
, sizeof(*fl6
));
812 if (t
->parms
.flags
& IP6_TNL_F_USE_ORIG_TCLASS
)
813 *dsfield
= ipv6_get_dsfield(ipv6h
);
815 *dsfield
= ip6_tclass(t
->parms
.flowinfo
);
817 if (t
->parms
.flags
& IP6_TNL_F_USE_ORIG_FLOWLABEL
)
818 fl6
->flowlabel
|= ip6_flowlabel(ipv6h
);
820 #ifndef IP6_TNL_F_USE_ORIG_FWMARK
821 if (t
->parms
.flags
& IP6_TNL_F_USE_ORIG_FWMARK
)
822 fl6
->flowi6_mark
= skb
->mark
;
824 fl6
->flowi6_mark
= t
->parms
.fwmark
;
826 fl6
->flowi6_uid
= sock_net_uid(dev_net(dev
), NULL
);
832 static netdev_tx_t
__gre6_xmit(struct sk_buff
*skb
,
833 struct net_device
*dev
, __u8 dsfield
,
834 struct flowi6
*fl6
, int encap_limit
,
835 __u32
*pmtu
, __be16 proto
)
837 struct ip6_tnl
*tunnel
= netdev_priv(dev
);
838 struct tnl_ptk_info tpi
;
841 if (dev
->type
== ARPHRD_ETHER
)
842 IPCB(skb
)->flags
= 0;
844 if (dev
->header_ops
&& dev
->type
== ARPHRD_IP6GRE
)
845 fl6
->daddr
= ((struct ipv6hdr
*)skb
->data
)->daddr
;
847 fl6
->daddr
= tunnel
->parms
.raddr
;
849 if (tunnel
->parms
.o_flags
& TUNNEL_SEQ
)
852 if (skb_cow_head(skb
, dev
->needed_headroom
?: tunnel
->hlen
))
855 /* Push GRE header. */
856 protocol
= (dev
->type
== ARPHRD_ETHER
) ? htons(ETH_P_TEB
) : proto
;
858 if (tunnel
->parms
.collect_md
) {
859 struct ip_tunnel_info
*tun_info
;
860 const struct ip_tunnel_key
*key
;
863 tun_info
= skb_tunnel_info(skb
);
864 if (unlikely(!tun_info
||
865 !(tun_info
->mode
& IP_TUNNEL_INFO_TX
) ||
866 ip_tunnel_info_af(tun_info
) != AF_INET6
))
869 key
= &tun_info
->key
;
870 memset(fl6
, 0, sizeof(*fl6
));
871 fl6
->flowi6_proto
= IPPROTO_GRE
;
872 fl6
->daddr
= key
->u
.ipv6
.dst
;
873 fl6
->flowlabel
= key
->label
;
875 // fl6->flowi6_uid = sock_net_uid(dev_net(dev), NULL);
878 flags
= key
->tun_flags
& (TUNNEL_CSUM
| TUNNEL_KEY
);
879 tunnel
->tun_hlen
= gre_calc_hlen(flags
);
882 tpi
.proto
= protocol
;
883 tpi
.key
= tunnel_id_to_key32(key
->tun_id
);
884 tpi
.seq
= htonl(tunnel
->o_seqno
++);
885 tpi
.hdr_len
= tunnel
->tun_hlen
;
887 gre_build_header(skb
, &tpi
, 8);
889 tpi
.flags
= tunnel
->parms
.o_flags
;
890 tpi
.proto
= protocol
;
891 tpi
.key
= tunnel
->parms
.o_key
;
892 tpi
.seq
= htonl(tunnel
->o_seqno
++);
893 tpi
.hdr_len
= tunnel
->tun_hlen
;
895 gre_build_header(skb
, &tpi
, 8);
898 return ip6_tnl_xmit(skb
, dev
, dsfield
, fl6
, encap_limit
, pmtu
,
902 static inline int ip6gre_xmit_ipv4(struct sk_buff
*skb
, struct net_device
*dev
)
904 struct ip6_tnl
*t
= netdev_priv(dev
);
905 int encap_limit
= -1;
911 memset(&(IPCB(skb
)->opt
), 0, sizeof(IPCB(skb
)->opt
));
913 if (!t
->parms
.collect_md
)
914 prepare_ip6gre_xmit_ipv4(skb
, dev
, &fl6
,
915 &dsfield
, &encap_limit
);
917 err
= gre_handle_offloads(skb
, !!(t
->parms
.o_flags
& TUNNEL_CSUM
));
921 err
= __gre6_xmit(skb
, dev
, dsfield
, &fl6
, encap_limit
, &mtu
,
924 /* XXX: send ICMP error even if DF is not set. */
925 if (err
== -EMSGSIZE
)
926 icmp_send(skb
, ICMP_DEST_UNREACH
, ICMP_FRAG_NEEDED
,
934 static inline int ip6gre_xmit_ipv6(struct sk_buff
*skb
, struct net_device
*dev
)
936 struct ip6_tnl
*t
= netdev_priv(dev
);
937 struct ipv6hdr
*ipv6h
= ipv6_hdr(skb
);
938 int encap_limit
= -1;
944 if (ipv6_addr_equal(&t
->parms
.raddr
, &ipv6h
->saddr
))
947 if (!t
->parms
.collect_md
&&
948 prepare_ip6gre_xmit_ipv6(skb
, dev
, &fl6
, &dsfield
, &encap_limit
))
951 if (gre_handle_offloads(skb
, !!(t
->parms
.o_flags
& TUNNEL_CSUM
)))
954 err
= __gre6_xmit(skb
, dev
, dsfield
, &fl6
, encap_limit
,
955 &mtu
, skb
->protocol
);
957 if (err
== -EMSGSIZE
)
958 icmpv6_send(skb
, ICMPV6_PKT_TOOBIG
, 0, mtu
);
966 * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
967 * @t: the outgoing tunnel device
968 * @hdr: IPv6 header from the incoming packet
971 * Avoid trivial tunneling loop by checking that tunnel exit-point
972 * doesn't match source of incoming packet.
979 static inline bool ip6gre_tnl_addr_conflict(const struct ip6_tnl
*t
,
980 const struct ipv6hdr
*hdr
)
982 return ipv6_addr_equal(&t
->parms
.raddr
, &hdr
->saddr
);
985 static int ip6gre_xmit_other(struct sk_buff
*skb
, struct net_device
*dev
)
987 struct ip6_tnl
*t
= netdev_priv(dev
);
988 int encap_limit
= -1;
993 if (!(t
->parms
.flags
& IP6_TNL_F_IGN_ENCAP_LIMIT
))
994 encap_limit
= t
->parms
.encap_limit
;
996 if (!t
->parms
.collect_md
)
997 memcpy(&fl6
, &t
->fl
.u
.ip6
, sizeof(fl6
));
999 err
= gre_handle_offloads(skb
, !!(t
->parms
.o_flags
& TUNNEL_CSUM
));
1003 err
= __gre6_xmit(skb
, dev
, 0, &fl6
, encap_limit
, &mtu
, skb
->protocol
);
1008 static netdev_tx_t
ip6gre_tunnel_xmit(struct sk_buff
*skb
,
1009 struct net_device
*dev
)
1011 struct ip6_tnl
*t
= netdev_priv(dev
);
1012 struct net_device_stats
*stats
= &t
->dev
->stats
;
1015 if (!ip6_tnl_xmit_ctl(t
, &t
->parms
.laddr
, &t
->parms
.raddr
))
1018 switch (skb
->protocol
) {
1019 case htons(ETH_P_IP
):
1020 ret
= ip6gre_xmit_ipv4(skb
, dev
);
1022 case htons(ETH_P_IPV6
):
1023 ret
= ip6gre_xmit_ipv6(skb
, dev
);
1026 ret
= ip6gre_xmit_other(skb
, dev
);
1033 return NETDEV_TX_OK
;
1037 stats
->tx_dropped
++;
1039 return NETDEV_TX_OK
;
1042 static netdev_tx_t
__ip6gre_tunnel_xmit(struct sk_buff
*skb
)
1044 return ip6gre_tunnel_xmit(skb
, skb
->dev
);
1047 static bool erspan_skb_would_panic(struct sk_buff
*skb
, int erspan_md_size
)
1049 /* check if there is enough headroom in packet, if not
1050 * drop it. Checking for 8 bytes of gre header space +
1051 * erspan base hdr and erspan type specific header.
1053 if (skb_headroom(skb
) < (8 + sizeof(struct erspan_base_hdr
) +
1060 static netdev_tx_t
ip6erspan_tunnel_xmit(struct sk_buff
*skb
,
1061 struct net_device
*dev
)
1063 struct ip6_tnl
*t
= netdev_priv(dev
);
1064 struct dst_entry
*dst
= skb_dst(skb
);
1065 struct ip_tunnel_info
*tun_info
;
1066 const struct ip_tunnel_key
*key
;
1067 struct net_device_stats
*stats
;
1068 struct erspan_metadata
*md
;
1069 struct tnl_ptk_info tpi
;
1070 bool truncate
= false;
1071 int encap_limit
= -1;
1072 __u8 dsfield
= false;
1081 /* OVS doesn't support native mode ip6 tunnel traffic so
1082 * take an early exit in that case. */
1083 if (!t
->parms
.collect_md
)
1086 if (!ip6_tnl_xmit_ctl(t
, &t
->parms
.laddr
, &t
->parms
.raddr
))
1089 if (gre_handle_offloads(skb
, false))
1092 if (skb
->len
> dev
->mtu
+ dev
->hard_header_len
) {
1093 pskb_trim(skb
, dev
->mtu
+ dev
->hard_header_len
);
1097 nhoff
= skb_network_header(skb
) - skb_mac_header(skb
);
1098 if (skb
->protocol
== htons(ETH_P_IP
) &&
1099 (ntohs(ip_hdr(skb
)->tot_len
) > skb
->len
- nhoff
))
1102 thoff
= skb_transport_header(skb
) - skb_mac_header(skb
);
1103 if (skb
->protocol
== htons(ETH_P_IPV6
) &&
1104 (ntohs(ipv6_hdr(skb
)->payload_len
) > skb
->len
- thoff
))
1107 if (skb_cow_head(skb
, dev
->needed_headroom
? : t
->hlen
))
1110 t
->parms
.o_flags
&= ~TUNNEL_KEY
;
1111 IPCB(skb
)->flags
= 0;
1113 tun_info
= ovs_skb_tunnel_info(skb
);
1114 if (unlikely(!tun_info
||
1115 !(tun_info
->mode
& IP_TUNNEL_INFO_TX
) ||
1116 ip_tunnel_info_af(tun_info
) != AF_INET6
))
1119 key
= &tun_info
->key
;
1120 memset(&fl6
, 0, sizeof(fl6
));
1121 fl6
.flowi6_proto
= IPPROTO_GRE
;
1122 fl6
.daddr
= key
->u
.ipv6
.dst
;
1123 fl6
.flowlabel
= key
->label
;
1124 // fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
1127 md
= ip_tunnel_info_opts(tun_info
);
1131 if (erspan_skb_would_panic(skb
,
1133 ERSPAN_V1_MDSIZE
: ERSPAN_V2_MDSIZE
))
1136 tun_id
= tunnel_id_to_key32(key
->tun_id
);
1137 if (md
->version
== 1) {
1138 erspan_build_header(skb
,
1140 ntohl(md
->u
.index
), truncate
,
1142 tpi
.hdr_len
= ERSPAN_V1_MDSIZE
;
1143 tpi
.proto
= htons(ETH_P_ERSPAN
);
1144 } else if (md
->version
== 2) {
1145 erspan_build_header_v2(skb
,
1148 get_hwid(&md
->u
.md2
),
1150 tpi
.hdr_len
= ERSPAN_V2_MDSIZE
;
1151 tpi
.proto
= htons(ETH_P_ERSPAN2
);
1156 tpi
.flags
= TUNNEL_SEQ
;
1158 tpi
.seq
= htonl(t
->o_seqno
++);
1160 /* Push GRE header. */
1161 gre_build_header(skb
, &tpi
, 8);
1163 /* TooBig packet may have updated dst->dev's mtu */
1164 if (!t
->parms
.collect_md
&& dst
&& dst_mtu(dst
) > dst
->dev
->mtu
)
1165 dst
->ops
->update_pmtu(dst
, NULL
, skb
, dst
->dev
->mtu
);
1167 err
= ip6_tnl_xmit(skb
, dev
, dsfield
, &fl6
, encap_limit
, &mtu
,
1172 return NETDEV_TX_OK
;
1175 stats
= &t
->dev
->stats
;
1177 stats
->tx_dropped
++;
1179 return NETDEV_TX_OK
;
1182 static netdev_tx_t
__ip6erspan_tunnel_xmit(struct sk_buff
*skb
)
1184 return ip6erspan_tunnel_xmit(skb
, skb
->dev
);
1187 static void ip6gre_tnl_link_config_common(struct ip6_tnl
*t
)
1189 struct net_device
*dev
= t
->dev
;
1190 struct __ip6_tnl_parm
*p
= &t
->parms
;
1191 struct flowi6
*fl6
= &t
->fl
.u
.ip6
;
1193 if (dev
->type
!= ARPHRD_ETHER
) {
1194 memcpy(dev
->dev_addr
, &p
->laddr
, sizeof(struct in6_addr
));
1195 memcpy(dev
->broadcast
, &p
->raddr
, sizeof(struct in6_addr
));
1198 /* Set up flowi template */
1199 fl6
->saddr
= p
->laddr
;
1200 fl6
->daddr
= p
->raddr
;
1201 fl6
->flowi6_oif
= p
->link
;
1203 fl6
->flowi6_proto
= IPPROTO_GRE
;
1205 if (!(p
->flags
&IP6_TNL_F_USE_ORIG_TCLASS
))
1206 fl6
->flowlabel
|= IPV6_TCLASS_MASK
& p
->flowinfo
;
1207 if (!(p
->flags
&IP6_TNL_F_USE_ORIG_FLOWLABEL
))
1208 fl6
->flowlabel
|= IPV6_FLOWLABEL_MASK
& p
->flowinfo
;
1210 p
->flags
&= ~(IP6_TNL_F_CAP_XMIT
|IP6_TNL_F_CAP_RCV
|IP6_TNL_F_CAP_PER_PACKET
);
1211 p
->flags
|= ip6_tnl_get_cap(t
, &p
->laddr
, &p
->raddr
);
1213 if (p
->flags
&IP6_TNL_F_CAP_XMIT
&&
1214 p
->flags
&IP6_TNL_F_CAP_RCV
&& dev
->type
!= ARPHRD_ETHER
)
1215 dev
->flags
|= IFF_POINTOPOINT
;
1217 dev
->flags
&= ~IFF_POINTOPOINT
;
1220 static void ip6gre_tnl_link_config_route(struct ip6_tnl
*t
, int set_mtu
,
1223 const struct __ip6_tnl_parm
*p
= &t
->parms
;
1224 struct net_device
*dev
= t
->dev
;
1226 if (p
->flags
& IP6_TNL_F_CAP_XMIT
) {
1227 int strict
= (ipv6_addr_type(&p
->raddr
) &
1228 (IPV6_ADDR_MULTICAST
|IPV6_ADDR_LINKLOCAL
));
1230 struct rt6_info
*rt
= rt6_lookup(t
->net
,
1231 &p
->raddr
, &p
->laddr
,
1238 dev
->hard_header_len
= rt
->dst
.dev
->hard_header_len
+
1242 dev
->mtu
= rt
->dst
.dev
->mtu
- t_hlen
;
1243 if (!(t
->parms
.flags
& IP6_TNL_F_IGN_ENCAP_LIMIT
))
1245 if (dev
->type
== ARPHRD_ETHER
)
1246 dev
->mtu
-= ETH_HLEN
;
1248 if (dev
->mtu
< IPV6_MIN_MTU
)
1249 dev
->mtu
= IPV6_MIN_MTU
;
1256 static int ip6gre_calc_hlen(struct ip6_tnl
*tunnel
)
1260 tunnel
->tun_hlen
= gre_calc_hlen(tunnel
->parms
.o_flags
);
1261 tunnel
->hlen
= tunnel
->tun_hlen
+ tunnel
->encap_hlen
;
1263 t_hlen
= tunnel
->hlen
+ sizeof(struct ipv6hdr
);
1264 tunnel
->dev
->hard_header_len
= LL_MAX_HEADER
+ t_hlen
;
1268 static void ip6gre_tnl_link_config(struct ip6_tnl
*t
, int set_mtu
)
1270 ip6gre_tnl_link_config_common(t
);
1271 ip6gre_tnl_link_config_route(t
, set_mtu
, ip6gre_calc_hlen(t
));
1274 static void ip6gre_tnl_copy_tnl_parm(struct ip6_tnl
*t
,
1275 const struct __ip6_tnl_parm
*p
)
1277 t
->parms
.laddr
= p
->laddr
;
1278 t
->parms
.raddr
= p
->raddr
;
1279 t
->parms
.flags
= p
->flags
;
1280 t
->parms
.hop_limit
= p
->hop_limit
;
1281 t
->parms
.encap_limit
= p
->encap_limit
;
1282 t
->parms
.flowinfo
= p
->flowinfo
;
1283 t
->parms
.link
= p
->link
;
1284 t
->parms
.proto
= p
->proto
;
1285 t
->parms
.i_key
= p
->i_key
;
1286 t
->parms
.o_key
= p
->o_key
;
1287 t
->parms
.i_flags
= p
->i_flags
;
1288 t
->parms
.o_flags
= p
->o_flags
;
1289 t
->parms
.fwmark
= p
->fwmark
;
1290 dst_cache_reset(&t
->dst_cache
);
1293 static int ip6gre_tnl_change(struct ip6_tnl
*t
, const struct __ip6_tnl_parm
*p
,
1296 ip6gre_tnl_copy_tnl_parm(t
, p
);
1297 ip6gre_tnl_link_config(t
, set_mtu
);
1301 static void ip6gre_tnl_parm_from_user(struct __ip6_tnl_parm
*p
,
1302 const struct ip6_tnl_parm2
*u
)
1304 p
->laddr
= u
->laddr
;
1305 p
->raddr
= u
->raddr
;
1306 p
->flags
= u
->flags
;
1307 p
->hop_limit
= u
->hop_limit
;
1308 p
->encap_limit
= u
->encap_limit
;
1309 p
->flowinfo
= u
->flowinfo
;
1311 p
->i_key
= u
->i_key
;
1312 p
->o_key
= u
->o_key
;
1313 p
->i_flags
= gre_flags_to_tnl_flags(u
->i_flags
);
1314 p
->o_flags
= gre_flags_to_tnl_flags(u
->o_flags
);
1315 memcpy(p
->name
, u
->name
, sizeof(u
->name
));
1318 static void ip6gre_tnl_parm_to_user(struct ip6_tnl_parm2
*u
,
1319 const struct __ip6_tnl_parm
*p
)
1321 u
->proto
= IPPROTO_GRE
;
1322 u
->laddr
= p
->laddr
;
1323 u
->raddr
= p
->raddr
;
1324 u
->flags
= p
->flags
;
1325 u
->hop_limit
= p
->hop_limit
;
1326 u
->encap_limit
= p
->encap_limit
;
1327 u
->flowinfo
= p
->flowinfo
;
1329 u
->i_key
= p
->i_key
;
1330 u
->o_key
= p
->o_key
;
1331 u
->i_flags
= gre_tnl_flags_to_gre_flags(p
->i_flags
);
1332 u
->o_flags
= gre_tnl_flags_to_gre_flags(p
->o_flags
);
1333 memcpy(u
->name
, p
->name
, sizeof(u
->name
));
1336 static int ip6gre_tunnel_ioctl(struct net_device
*dev
,
1337 struct ifreq
*ifr
, int cmd
)
1340 struct ip6_tnl_parm2 p
;
1341 struct __ip6_tnl_parm p1
;
1342 struct ip6_tnl
*t
= netdev_priv(dev
);
1343 struct net
*net
= t
->net
;
1344 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
1346 memset(&p1
, 0, sizeof(p1
));
1350 if (dev
== ign
->fb_tunnel_dev
) {
1351 if (copy_from_user(&p
, ifr
->ifr_ifru
.ifru_data
, sizeof(p
))) {
1355 ip6gre_tnl_parm_from_user(&p1
, &p
);
1356 t
= ip6gre_tunnel_locate(net
, &p1
, 0);
1358 t
= netdev_priv(dev
);
1360 memset(&p
, 0, sizeof(p
));
1361 ip6gre_tnl_parm_to_user(&p
, &t
->parms
);
1362 if (copy_to_user(ifr
->ifr_ifru
.ifru_data
, &p
, sizeof(p
)))
1369 if (!ns_capable(net
->user_ns
, CAP_NET_ADMIN
))
1373 if (copy_from_user(&p
, ifr
->ifr_ifru
.ifru_data
, sizeof(p
)))
1377 if ((p
.i_flags
|p
.o_flags
)&(GRE_VERSION
|GRE_ROUTING
))
1380 if (!(p
.i_flags
&GRE_KEY
))
1382 if (!(p
.o_flags
&GRE_KEY
))
1385 ip6gre_tnl_parm_from_user(&p1
, &p
);
1386 t
= ip6gre_tunnel_locate(net
, &p1
, cmd
== SIOCADDTUNNEL
);
1388 if (dev
!= ign
->fb_tunnel_dev
&& cmd
== SIOCCHGTUNNEL
) {
1390 if (t
->dev
!= dev
) {
1395 t
= netdev_priv(dev
);
1397 ip6gre_tunnel_unlink(ign
, t
);
1399 ip6gre_tnl_change(t
, &p1
, 1);
1400 ip6gre_tunnel_link(ign
, t
);
1401 netdev_state_change(dev
);
1408 memset(&p
, 0, sizeof(p
));
1409 ip6gre_tnl_parm_to_user(&p
, &t
->parms
);
1410 if (copy_to_user(ifr
->ifr_ifru
.ifru_data
, &p
, sizeof(p
)))
1413 err
= (cmd
== SIOCADDTUNNEL
? -ENOBUFS
: -ENOENT
);
1418 if (!ns_capable(net
->user_ns
, CAP_NET_ADMIN
))
1421 if (dev
== ign
->fb_tunnel_dev
) {
1423 if (copy_from_user(&p
, ifr
->ifr_ifru
.ifru_data
, sizeof(p
)))
1426 ip6gre_tnl_parm_from_user(&p1
, &p
);
1427 t
= ip6gre_tunnel_locate(net
, &p1
, 0);
1431 if (t
== netdev_priv(ign
->fb_tunnel_dev
))
1435 unregister_netdevice(dev
);
1447 static int ip6gre_header(struct sk_buff
*skb
, struct net_device
*dev
,
1448 unsigned short type
, const void *daddr
,
1449 const void *saddr
, unsigned int len
)
1451 struct ip6_tnl
*t
= netdev_priv(dev
);
1452 struct ipv6hdr
*ipv6h
;
1455 ipv6h
= (struct ipv6hdr
*)skb_push(skb
, t
->hlen
+ sizeof(*ipv6h
));
1456 ip6_flow_hdr(ipv6h
, 0, ip6_make_flowlabel(dev_net(dev
), skb
,
1457 t
->fl
.u
.ip6
.flowlabel
,
1458 true, &t
->fl
.u
.ip6
));
1459 ipv6h
->hop_limit
= t
->parms
.hop_limit
;
1460 ipv6h
->nexthdr
= NEXTHDR_GRE
;
1461 ipv6h
->saddr
= t
->parms
.laddr
;
1462 ipv6h
->daddr
= t
->parms
.raddr
;
1464 p
= (__be16
*)(ipv6h
+ 1);
1465 p
[0] = t
->parms
.o_flags
;
1469 * Set the source hardware address.
1473 memcpy(&ipv6h
->saddr
, saddr
, sizeof(struct in6_addr
));
1475 memcpy(&ipv6h
->daddr
, daddr
, sizeof(struct in6_addr
));
1476 if (!ipv6_addr_any(&ipv6h
->daddr
))
1482 static const struct header_ops ip6gre_header_ops
= {
1483 .create
= ip6gre_header
,
1486 static const struct net_device_ops ip6gre_netdev_ops
= {
1487 .ndo_init
= ip6gre_tunnel_init
,
1488 .ndo_uninit
= ip6gre_tunnel_uninit
,
1489 .ndo_start_xmit
= ip6gre_tunnel_xmit
,
1490 .ndo_do_ioctl
= ip6gre_tunnel_ioctl
,
1491 .ndo_change_mtu
= ip6_tnl_change_mtu
,
1492 .ndo_get_stats64
= rpl_ip_tunnel_get_stats64
,
1493 #ifdef HAVE_NDO_GET_IFLINK
1494 .ndo_get_iflink
= ip6_tnl_get_iflink
,
1498 #ifdef HAVE_NEEDS_FREE_NETDEV
1499 static void ip6gre_dev_free(struct net_device
*dev
)
1501 struct ip6_tnl
*t
= netdev_priv(dev
);
1503 dst_cache_destroy(&t
->dst_cache
);
1504 free_percpu(dev
->tstats
);
1508 static void ip6gre_tunnel_setup(struct net_device
*dev
)
1510 dev
->netdev_ops
= &ip6gre_netdev_ops
;
1511 #ifndef HAVE_NEEDS_FREE_NETDEV
1512 dev
->destructor
= free_netdev
;
1514 dev
->needs_free_netdev
= true;
1515 dev
->priv_destructor
= ip6gre_dev_free
;
1518 dev
->type
= ARPHRD_IP6GRE
;
1520 dev
->flags
|= IFF_NOARP
;
1521 dev
->addr_len
= sizeof(struct in6_addr
);
1522 netif_keep_dst(dev
);
1523 /* This perm addr will be used as interface identifier by IPv6 */
1524 dev
->addr_assign_type
= NET_ADDR_RANDOM
;
1525 eth_random_addr(dev
->perm_addr
);
1528 #define GRE6_FEATURES (NETIF_F_SG | \
1529 NETIF_F_FRAGLIST | \
1533 static void ip6gre_tnl_init_features(struct net_device
*dev
)
1535 struct ip6_tnl
*nt
= netdev_priv(dev
);
1537 dev
->features
|= GRE6_FEATURES
;
1538 dev
->hw_features
|= GRE6_FEATURES
;
1540 if (!(nt
->parms
.o_flags
& TUNNEL_SEQ
)) {
1541 /* TCP offload with GRE SEQ is not supported, nor
1542 * can we support 2 levels of outer headers requiring
1545 if (!(nt
->parms
.o_flags
& TUNNEL_CSUM
) ||
1546 nt
->encap
.type
== TUNNEL_ENCAP_NONE
) {
1547 dev
->features
|= NETIF_F_GSO_SOFTWARE
;
1548 dev
->hw_features
|= NETIF_F_GSO_SOFTWARE
;
1551 /* Can use a lockless transmit, unless we generate
1554 dev
->features
|= NETIF_F_LLTX
;
1558 static int ip6gre_tunnel_init_common(struct net_device
*dev
)
1560 struct ip6_tnl
*tunnel
;
1564 tunnel
= netdev_priv(dev
);
1567 tunnel
->net
= dev_net(dev
);
1568 strcpy(tunnel
->parms
.name
, dev
->name
);
1570 dev
->tstats
= netdev_alloc_pcpu_stats(struct pcpu_sw_netstats
);
1574 ret
= dst_cache_init(&tunnel
->dst_cache
, GFP_KERNEL
);
1576 free_percpu(dev
->tstats
);
1581 t_hlen
= ip6gre_calc_hlen(tunnel
);
1582 dev
->mtu
= ETH_DATA_LEN
- t_hlen
;
1583 if (dev
->type
== ARPHRD_ETHER
)
1584 dev
->mtu
-= ETH_HLEN
;
1585 if (!(tunnel
->parms
.flags
& IP6_TNL_F_IGN_ENCAP_LIMIT
))
1588 if (tunnel
->parms
.collect_md
) {
1589 dev
->features
|= NETIF_F_NETNS_LOCAL
;
1590 netif_keep_dst(dev
);
1592 ip6gre_tnl_init_features(dev
);
1597 static int ip6gre_tunnel_init(struct net_device
*dev
)
1599 struct ip6_tnl
*tunnel
;
1602 ret
= ip6gre_tunnel_init_common(dev
);
1606 tunnel
= netdev_priv(dev
);
1608 if (tunnel
->parms
.collect_md
)
1611 memcpy(dev
->dev_addr
, &tunnel
->parms
.laddr
, sizeof(struct in6_addr
));
1612 memcpy(dev
->broadcast
, &tunnel
->parms
.raddr
, sizeof(struct in6_addr
));
1614 if (ipv6_addr_any(&tunnel
->parms
.raddr
))
1615 dev
->header_ops
= &ip6gre_header_ops
;
1620 static void ip6gre_fb_tunnel_init(struct net_device
*dev
)
1622 struct ip6_tnl
*tunnel
= netdev_priv(dev
);
1625 tunnel
->net
= dev_net(dev
);
1626 strcpy(tunnel
->parms
.name
, dev
->name
);
1628 tunnel
->hlen
= sizeof(struct ipv6hdr
) + 4;
1633 static struct inet6_protocol ip6gre_protocol __read_mostly
= {
1635 .err_handler
= ip6gre_err
,
1636 .flags
= INET6_PROTO_NOPOLICY
|INET6_PROTO_FINAL
,
1639 static void ip6gre_destroy_tunnels(struct net
*net
, struct list_head
*head
)
1641 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
1642 struct net_device
*dev
, *aux
;
1645 for_each_netdev_safe(net
, dev
, aux
)
1646 if (dev
->rtnl_link_ops
== &ip6gre_link_ops
||
1647 dev
->rtnl_link_ops
== &ip6gre_tap_ops
||
1648 dev
->rtnl_link_ops
== &ip6erspan_tap_ops
)
1649 unregister_netdevice_queue(dev
, head
);
1651 for (prio
= 0; prio
< 4; prio
++) {
1653 for (h
= 0; h
< IP6_GRE_HASH_SIZE
; h
++) {
1656 t
= rtnl_dereference(ign
->tunnels
[prio
][h
]);
1659 /* If dev is in the same netns, it has already
1660 * been added to the list by the previous loop.
1662 if (!net_eq(dev_net(t
->dev
), net
))
1663 unregister_netdevice_queue(t
->dev
,
1665 t
= rtnl_dereference(t
->next
);
1671 static int __net_init
ip6gre_init_net(struct net
*net
)
1673 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
1676 ign
->fb_tunnel_dev
= alloc_netdev(sizeof(struct ip6_tnl
), "ip6gre0",
1678 ip6gre_tunnel_setup
);
1679 if (!ign
->fb_tunnel_dev
) {
1683 dev_net_set(ign
->fb_tunnel_dev
, net
);
1684 /* FB netdevice is special: we have one, and only one per netns.
1685 * Allowing to move it to another netns is clearly unsafe.
1687 ign
->fb_tunnel_dev
->features
|= NETIF_F_NETNS_LOCAL
;
1690 ip6gre_fb_tunnel_init(ign
->fb_tunnel_dev
);
1691 ign
->fb_tunnel_dev
->rtnl_link_ops
= &ip6gre_link_ops
;
1693 err
= register_netdev(ign
->fb_tunnel_dev
);
1697 rcu_assign_pointer(ign
->tunnels_wc
[0],
1698 netdev_priv(ign
->fb_tunnel_dev
));
1702 free_netdev(ign
->fb_tunnel_dev
);
1707 static void __net_exit
ip6gre_exit_batch_net(struct list_head
*net_list
)
1713 list_for_each_entry(net
, net_list
, exit_list
)
1714 ip6gre_destroy_tunnels(net
, &list
);
1715 unregister_netdevice_many(&list
);
1720 #ifndef HAVE_IFLA_GRE_ENCAP_DPORT
1721 IFLA_GRE_ENCAP_TYPE
= IFLA_GRE_FLAGS
+ 1,
1722 IFLA_GRE_ENCAP_FLAGS
,
1723 IFLA_GRE_ENCAP_SPORT
,
1724 IFLA_GRE_ENCAP_DPORT
,
1726 #ifndef HAVE_IFLA_GRE_COLLECT_METADATA
1727 IFLA_GRE_COLLECT_METADATA
= IFLA_GRE_ENCAP_DPORT
+ 1,
1729 #ifndef HAVE_IFLA_GRE_IGNORE_DF
1730 IFLA_GRE_IGNORE_DF
= IFLA_GRE_COLLECT_METADATA
+ 1,
1732 #ifndef HAVE_IFLA_GRE_FWMARK
1733 IFLA_GRE_FWMARK
= IFLA_GRE_IGNORE_DF
+ 1,
1735 #ifndef HAVE_IFLA_GRE_ERSPAN_INDEX
1736 IFLA_GRE_ERSPAN_INDEX
= IFLA_GRE_FWMARK
+ 1,
1738 #ifndef HAVE_IFLA_GRE_ERSPAN_HWID
1739 IFLA_GRE_ERSPAN_VER
= IFLA_GRE_ERSPAN_INDEX
+ 1,
1740 IFLA_GRE_ERSPAN_DIR
,
1741 IFLA_GRE_ERSPAN_HWID
,
1745 #define RPL_IFLA_GRE_MAX (IFLA_GRE_ERSPAN_HWID + 1)
1747 static struct pernet_operations ip6gre_net_ops
= {
1748 .init
= ip6gre_init_net
,
1749 .exit_batch
= ip6gre_exit_batch_net
,
1750 .id
= &ip6gre_net_id
,
1751 .size
= sizeof(struct ip6gre_net
),
1753 #ifdef HAVE_IP6GRE_EXTACK
1754 static int rpl_ip6gre_tunnel_validate(struct nlattr
*tb
[],
1755 struct nlattr
*data
[],
1756 struct netlink_ext_ack
*extack
)
1758 static int rpl_ip6gre_tunnel_validate(struct nlattr
*tb
[],
1759 struct nlattr
*data
[])
1768 if (data
[IFLA_GRE_IFLAGS
])
1769 flags
|= nla_get_be16(data
[IFLA_GRE_IFLAGS
]);
1770 if (data
[IFLA_GRE_OFLAGS
])
1771 flags
|= nla_get_be16(data
[IFLA_GRE_OFLAGS
]);
1772 if (flags
& (GRE_VERSION
|GRE_ROUTING
))
1777 #define ip6gre_tunnel_validate rpl_ip6gre_tunnel_validate
1779 #ifdef HAVE_IP6GRE_EXTACK
1780 static int rpl_ip6gre_tap_validate(struct nlattr
*tb
[], struct nlattr
*data
[],
1781 struct netlink_ext_ack
*extack
)
1783 static int rpl_ip6gre_tap_validate(struct nlattr
*tb
[], struct nlattr
*data
[])
1786 struct in6_addr daddr
;
1788 if (tb
[IFLA_ADDRESS
]) {
1789 if (nla_len(tb
[IFLA_ADDRESS
]) != ETH_ALEN
)
1791 if (!is_valid_ether_addr(nla_data(tb
[IFLA_ADDRESS
])))
1792 return -EADDRNOTAVAIL
;
1798 if (data
[IFLA_GRE_REMOTE
]) {
1799 daddr
= nla_get_in6_addr(data
[IFLA_GRE_REMOTE
]);
1800 if (ipv6_addr_any(&daddr
))
1805 #ifdef HAVE_IP6GRE_EXTACK
1806 return ip6gre_tunnel_validate(tb
, data
, extack
);
1808 return ip6gre_tunnel_validate(tb
, data
);
1811 #define ip6gre_tap_validate rpl_ip6gre_tap_validate
1813 #ifdef HAVE_IP6GRE_EXTACK
1814 static int rpl_ip6erspan_tap_validate(struct nlattr
*tb
[],
1815 struct nlattr
*data
[],
1816 struct netlink_ext_ack
*extack
)
1818 static int rpl_ip6erspan_tap_validate(struct nlattr
*tb
[],
1819 struct nlattr
*data
[])
1828 #ifdef HAVE_IP6GRE_EXTACK
1829 ret
= ip6gre_tap_validate(tb
, data
, extack
);
1831 ret
= ip6gre_tap_validate(tb
, data
);
1836 /* ERSPAN should only have GRE sequence and key flag */
1837 if (data
[IFLA_GRE_OFLAGS
])
1838 flags
|= nla_get_be16(data
[IFLA_GRE_OFLAGS
]);
1839 if (data
[IFLA_GRE_IFLAGS
])
1840 flags
|= nla_get_be16(data
[IFLA_GRE_IFLAGS
]);
1841 if (!data
[IFLA_GRE_COLLECT_METADATA
] &&
1842 flags
!= (GRE_SEQ
| GRE_KEY
))
1845 /* ERSPAN Session ID only has 10-bit. Since we reuse
1846 * 32-bit key field as ID, check it's range.
1848 if (data
[IFLA_GRE_IKEY
] &&
1849 (ntohl(nla_get_be32(data
[IFLA_GRE_IKEY
])) & ~ID_MASK
))
1852 if (data
[IFLA_GRE_OKEY
] &&
1853 (ntohl(nla_get_be32(data
[IFLA_GRE_OKEY
])) & ~ID_MASK
))
1856 if (data
[IFLA_GRE_ERSPAN_VER
]) {
1857 ver
= nla_get_u8(data
[IFLA_GRE_ERSPAN_VER
]);
1858 if (ver
!= 1 && ver
!= 2)
1863 if (data
[IFLA_GRE_ERSPAN_INDEX
]) {
1864 u32 index
= nla_get_u32(data
[IFLA_GRE_ERSPAN_INDEX
]);
1866 if (index
& ~INDEX_MASK
)
1869 } else if (ver
== 2) {
1870 if (data
[IFLA_GRE_ERSPAN_DIR
]) {
1871 u16 dir
= nla_get_u8(data
[IFLA_GRE_ERSPAN_DIR
]);
1873 if (dir
& ~(DIR_MASK
>> DIR_OFFSET
))
1877 if (data
[IFLA_GRE_ERSPAN_HWID
]) {
1878 u16 hwid
= nla_get_u16(data
[IFLA_GRE_ERSPAN_HWID
]);
1880 if (hwid
& ~(HWID_MASK
>> HWID_OFFSET
))
1887 #define ip6erspan_tap_validate rpl_ip6erspan_tap_validate
1889 static void ip6gre_netlink_parms(struct nlattr
*data
[],
1890 struct __ip6_tnl_parm
*parms
)
1893 /* Do not use in case of OVS - our vport needs to set a parm
1894 * directly and this erases it
1896 memset(parms
, 0, sizeof(*parms
));
1902 if (data
[IFLA_GRE_LINK
])
1903 parms
->link
= nla_get_u32(data
[IFLA_GRE_LINK
]);
1905 if (data
[IFLA_GRE_IFLAGS
])
1906 parms
->i_flags
= gre_flags_to_tnl_flags(
1907 nla_get_be16(data
[IFLA_GRE_IFLAGS
]));
1909 if (data
[IFLA_GRE_OFLAGS
])
1910 parms
->o_flags
= gre_flags_to_tnl_flags(
1911 nla_get_be16(data
[IFLA_GRE_OFLAGS
]));
1913 if (data
[IFLA_GRE_IKEY
])
1914 parms
->i_key
= nla_get_be32(data
[IFLA_GRE_IKEY
]);
1916 if (data
[IFLA_GRE_OKEY
])
1917 parms
->o_key
= nla_get_be32(data
[IFLA_GRE_OKEY
]);
1919 if (data
[IFLA_GRE_LOCAL
])
1920 parms
->laddr
= nla_get_in6_addr(data
[IFLA_GRE_LOCAL
]);
1922 if (data
[IFLA_GRE_REMOTE
])
1923 parms
->raddr
= nla_get_in6_addr(data
[IFLA_GRE_REMOTE
]);
1925 if (data
[IFLA_GRE_TTL
])
1926 parms
->hop_limit
= nla_get_u8(data
[IFLA_GRE_TTL
]);
1928 if (data
[IFLA_GRE_ENCAP_LIMIT
])
1929 parms
->encap_limit
= nla_get_u8(data
[IFLA_GRE_ENCAP_LIMIT
]);
1931 if (data
[IFLA_GRE_FLOWINFO
])
1932 parms
->flowinfo
= nla_get_be32(data
[IFLA_GRE_FLOWINFO
]);
1934 if (data
[IFLA_GRE_FLAGS
])
1935 parms
->flags
= nla_get_u32(data
[IFLA_GRE_FLAGS
]);
1937 if (data
[IFLA_GRE_FWMARK
])
1938 parms
->fwmark
= nla_get_u32(data
[IFLA_GRE_FWMARK
]);
1940 if (data
[IFLA_GRE_COLLECT_METADATA
])
1941 parms
->collect_md
= true;
1943 if (data
[IFLA_GRE_ERSPAN_VER
])
1944 parms
->erspan_ver
= nla_get_u8(data
[IFLA_GRE_ERSPAN_VER
]);
1946 if (parms
->erspan_ver
== 1) {
1947 if (data
[IFLA_GRE_ERSPAN_INDEX
])
1948 parms
->index
= nla_get_u32(data
[IFLA_GRE_ERSPAN_INDEX
]);
1949 } else if (parms
->erspan_ver
== 2) {
1950 if (data
[IFLA_GRE_ERSPAN_DIR
])
1951 parms
->dir
= nla_get_u8(data
[IFLA_GRE_ERSPAN_DIR
]);
1952 if (data
[IFLA_GRE_ERSPAN_HWID
])
1953 parms
->hwid
= nla_get_u16(data
[IFLA_GRE_ERSPAN_HWID
]);
1957 static int ip6gre_tap_init(struct net_device
*dev
)
1961 ret
= ip6gre_tunnel_init_common(dev
);
1965 dev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
;
1970 static const struct net_device_ops ip6gre_tap_netdev_ops
= {
1971 .ndo_init
= ip6gre_tap_init
,
1972 .ndo_uninit
= ip6gre_tunnel_uninit
,
1973 .ndo_start_xmit
= ip6gre_tunnel_xmit
,
1974 .ndo_set_mac_address
= eth_mac_addr
,
1975 .ndo_validate_addr
= eth_validate_addr
,
1976 .ndo_change_mtu
= ip6_tnl_change_mtu
,
1977 .ndo_get_stats64
= rpl_ip_tunnel_get_stats64
,
1978 #ifdef HAVE_NDO_GET_IFLINK
1979 .ndo_get_iflink
= ip6_tnl_get_iflink
,
1983 static int ip6erspan_calc_hlen(struct ip6_tnl
*tunnel
)
1987 tunnel
->tun_hlen
= 8;
1988 tunnel
->hlen
= tunnel
->tun_hlen
+ tunnel
->encap_hlen
+
1989 erspan_hdr_len(tunnel
->parms
.erspan_ver
);
1991 t_hlen
= tunnel
->hlen
+ sizeof(struct ipv6hdr
);
1992 tunnel
->dev
->hard_header_len
= LL_MAX_HEADER
+ t_hlen
;
1996 static int ip6erspan_tap_init(struct net_device
*dev
)
1998 struct ip6_tnl
*tunnel
;
2002 tunnel
= netdev_priv(dev
);
2005 tunnel
->net
= dev_net(dev
);
2006 strcpy(tunnel
->parms
.name
, dev
->name
);
2008 dev
->tstats
= netdev_alloc_pcpu_stats(struct pcpu_sw_netstats
);
2012 ret
= dst_cache_init(&tunnel
->dst_cache
, GFP_KERNEL
);
2014 free_percpu(dev
->tstats
);
2019 t_hlen
= ip6erspan_calc_hlen(tunnel
);
2020 dev
->mtu
= ETH_DATA_LEN
- t_hlen
;
2021 if (dev
->type
== ARPHRD_ETHER
)
2022 dev
->mtu
-= ETH_HLEN
;
2023 if (!(tunnel
->parms
.flags
& IP6_TNL_F_IGN_ENCAP_LIMIT
))
2026 dev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
;
2027 tunnel
= netdev_priv(dev
);
2028 ip6erspan_tnl_link_config(tunnel
, 1);
2033 static const struct net_device_ops ip6erspan_netdev_ops
= {
2034 .ndo_init
= ip6erspan_tap_init
,
2035 .ndo_uninit
= ip6gre_tunnel_uninit
,
2036 .ndo_start_xmit
= ip6erspan_tunnel_xmit
,
2037 .ndo_set_mac_address
= eth_mac_addr
,
2038 .ndo_validate_addr
= eth_validate_addr
,
2039 .ndo_change_mtu
= ip6_tnl_change_mtu
,
2040 .ndo_get_stats64
= ip_tunnel_get_stats64
,
2041 #ifdef HAVE_NDO_GET_IFLINK
2042 .ndo_get_iflink
= ip6_tnl_get_iflink
,
2046 static void ip6gre_tap_setup(struct net_device
*dev
)
2050 #ifdef HAVE_NET_DEVICE_MAX_MTU
2053 dev
->netdev_ops
= &ip6gre_tap_netdev_ops
;
2054 #ifndef HAVE_NEEDS_FREE_NETDEV
2055 dev
->destructor
= free_netdev
;
2057 dev
->needs_free_netdev
= true;
2058 dev
->priv_destructor
= ip6gre_dev_free
;
2061 dev
->features
|= NETIF_F_NETNS_LOCAL
;
2062 dev
->priv_flags
&= ~IFF_TX_SKB_SHARING
;
2063 dev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
;
2064 netif_keep_dst(dev
);
2067 static bool ip6gre_netlink_encap_parms(struct nlattr
*data
[],
2068 struct ip_tunnel_encap
*ipencap
)
2072 memset(ipencap
, 0, sizeof(*ipencap
));
2077 if (data
[IFLA_GRE_ENCAP_TYPE
]) {
2079 ipencap
->type
= nla_get_u16(data
[IFLA_GRE_ENCAP_TYPE
]);
2082 if (data
[IFLA_GRE_ENCAP_FLAGS
]) {
2084 ipencap
->flags
= nla_get_u16(data
[IFLA_GRE_ENCAP_FLAGS
]);
2087 if (data
[IFLA_GRE_ENCAP_SPORT
]) {
2089 ipencap
->sport
= nla_get_be16(data
[IFLA_GRE_ENCAP_SPORT
]);
2092 if (data
[IFLA_GRE_ENCAP_DPORT
]) {
2094 ipencap
->dport
= nla_get_be16(data
[IFLA_GRE_ENCAP_DPORT
]);
2100 #ifdef HAVE_IP6GRE_EXTACK
2101 static int rpl_ip6gre_newlink_common(struct net
*src_net
, struct net_device
*dev
,
2102 struct nlattr
*tb
[], struct nlattr
*data
[],
2103 struct netlink_ext_ack
*extack
)
2105 static int rpl_ip6gre_newlink_common(struct net
*src_net
, struct net_device
*dev
,
2106 struct nlattr
*tb
[], struct nlattr
*data
[])
2110 struct net
*net
= dev_net(dev
);
2111 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
2112 struct ip_tunnel_encap ipencap
;
2115 nt
= netdev_priv(dev
);
2117 if (ip6gre_netlink_encap_parms(data
, &ipencap
)) {
2118 int err
= ip6_tnl_encap_setup(nt
, &ipencap
);
2124 ip6gre_netlink_parms(data
, &nt
->parms
);
2126 if (nt
->parms
.collect_md
) {
2127 if (rtnl_dereference(ign
->collect_md_tun
))
2130 if (ip6gre_tunnel_find(net
, &nt
->parms
, dev
->type
))
2134 if (dev
->type
== ARPHRD_ETHER
&& !tb
[IFLA_ADDRESS
])
2135 eth_hw_addr_random(dev
);
2138 nt
->net
= dev_net(dev
);
2140 err
= register_netdevice(dev
);
2145 ip6_tnl_change_mtu(dev
, nla_get_u32(tb
[IFLA_MTU
]));
2152 #define ip6gre_newlink_common rpl_ip6gre_newlink_common
2154 #ifdef HAVE_IP6GRE_EXTACK
2155 static int rpl_ip6gre_newlink(struct net
*src_net
, struct net_device
*dev
,
2156 struct nlattr
*tb
[], struct nlattr
*data
[],
2157 struct netlink_ext_ack
*extack
)
2159 static int rpl_ip6gre_newlink(struct net
*src_net
, struct net_device
*dev
,
2160 struct nlattr
*tb
[], struct nlattr
*data
[])
2164 #ifdef HAVE_IP6GRE_EXTACK
2165 int err
= ip6gre_newlink_common(src_net
, dev
, tb
, data
, extack
);
2167 int err
= ip6gre_newlink_common(src_net
, dev
, tb
, data
);
2169 struct ip6_tnl
*nt
= netdev_priv(dev
);
2170 struct net
*net
= dev_net(dev
);
2173 ip6gre_tnl_link_config(nt
, !tb
[IFLA_MTU
]);
2174 ip6gre_tunnel_link(net_generic(net
, ip6gre_net_id
), nt
);
2179 #define ip6gre_newlink rpl_ip6gre_newlink
2181 #ifdef HAVE_IP6GRE_EXTACK
2182 static struct ip6_tnl
*
2183 rpl_ip6gre_changelink_common(struct net_device
*dev
, struct nlattr
*tb
[],
2184 struct nlattr
*data
[], struct __ip6_tnl_parm
*p_p
,
2185 struct netlink_ext_ack
*extack
)
2187 static struct ip6_tnl
*
2188 rpl_ip6gre_changelink_common(struct net_device
*dev
, struct nlattr
*tb
[],
2189 struct nlattr
*data
[], struct __ip6_tnl_parm
*p_p
)
2192 struct ip6_tnl
*t
, *nt
= netdev_priv(dev
);
2193 struct net
*net
= nt
->net
;
2194 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
2195 struct ip_tunnel_encap ipencap
;
2197 if (dev
== ign
->fb_tunnel_dev
)
2198 return ERR_PTR(-EINVAL
);
2200 if (ip6gre_netlink_encap_parms(data
, &ipencap
)) {
2201 int err
= ip6_tnl_encap_setup(nt
, &ipencap
);
2204 return ERR_PTR(err
);
2207 ip6gre_netlink_parms(data
, p_p
);
2209 t
= ip6gre_tunnel_locate(net
, p_p
, 0);
2213 return ERR_PTR(-EEXIST
);
2220 #define ip6gre_changelink_common rpl_ip6gre_changelink_common
2222 #ifdef HAVE_IP6GRE_EXTACK
2223 static int rpl_ip6gre_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
2224 struct nlattr
*data
[],
2225 struct netlink_ext_ack
*extack
)
2227 static int rpl_ip6gre_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
2228 struct nlattr
*data
[])
2231 struct ip6gre_net
*ign
= net_generic(dev_net(dev
), ip6gre_net_id
);
2232 struct __ip6_tnl_parm p
;
2235 #ifdef HAVE_IP6GRE_EXTACK
2236 t
= ip6gre_changelink_common(dev
, tb
, data
, &p
, extack
);
2238 t
= ip6gre_changelink_common(dev
, tb
, data
, &p
);
2243 ip6gre_tunnel_unlink(ign
, t
);
2244 ip6gre_tnl_change(t
, &p
, !tb
[IFLA_MTU
]);
2245 ip6gre_tunnel_link(ign
, t
);
2248 #define ip6gre_changelink rpl_ip6gre_changelink
2250 static void ip6gre_dellink(struct net_device
*dev
, struct list_head
*head
)
2252 struct net
*net
= dev_net(dev
);
2253 struct ip6gre_net
*ign
= net_generic(net
, ip6gre_net_id
);
2255 if (dev
!= ign
->fb_tunnel_dev
)
2256 unregister_netdevice_queue(dev
, head
);
2259 static size_t ip6gre_get_size(const struct net_device
*dev
)
2264 /* IFLA_GRE_IFLAGS */
2266 /* IFLA_GRE_OFLAGS */
2272 /* IFLA_GRE_LOCAL */
2273 nla_total_size(sizeof(struct in6_addr
)) +
2274 /* IFLA_GRE_REMOTE */
2275 nla_total_size(sizeof(struct in6_addr
)) +
2278 /* IFLA_GRE_ENCAP_LIMIT */
2280 /* IFLA_GRE_FLOWINFO */
2282 /* IFLA_GRE_FLAGS */
2284 /* IFLA_GRE_ENCAP_TYPE */
2286 /* IFLA_GRE_ENCAP_FLAGS */
2288 /* IFLA_GRE_ENCAP_SPORT */
2290 /* IFLA_GRE_ENCAP_DPORT */
2292 /* IFLA_GRE_COLLECT_METADATA */
2294 /* IFLA_GRE_FWMARK */
2296 /* IFLA_GRE_ERSPAN_INDEX */
2301 static int ip6gre_fill_info(struct sk_buff
*skb
, const struct net_device
*dev
)
2303 struct ip6_tnl
*t
= netdev_priv(dev
);
2304 struct __ip6_tnl_parm
*p
= &t
->parms
;
2306 if (nla_put_u32(skb
, IFLA_GRE_LINK
, p
->link
) ||
2307 nla_put_be16(skb
, IFLA_GRE_IFLAGS
,
2308 gre_tnl_flags_to_gre_flags(p
->i_flags
)) ||
2309 nla_put_be16(skb
, IFLA_GRE_OFLAGS
,
2310 gre_tnl_flags_to_gre_flags(p
->o_flags
)) ||
2311 nla_put_be32(skb
, IFLA_GRE_IKEY
, p
->i_key
) ||
2312 nla_put_be32(skb
, IFLA_GRE_OKEY
, p
->o_key
) ||
2313 nla_put_in6_addr(skb
, IFLA_GRE_LOCAL
, &p
->laddr
) ||
2314 nla_put_in6_addr(skb
, IFLA_GRE_REMOTE
, &p
->raddr
) ||
2315 nla_put_u8(skb
, IFLA_GRE_TTL
, p
->hop_limit
) ||
2316 nla_put_u8(skb
, IFLA_GRE_ENCAP_LIMIT
, p
->encap_limit
) ||
2317 nla_put_be32(skb
, IFLA_GRE_FLOWINFO
, p
->flowinfo
) ||
2318 nla_put_u32(skb
, IFLA_GRE_FLAGS
, p
->flags
) ||
2319 nla_put_u32(skb
, IFLA_GRE_FWMARK
, p
->fwmark
) ||
2320 nla_put_u32(skb
, IFLA_GRE_ERSPAN_INDEX
, p
->index
))
2321 goto nla_put_failure
;
2323 if (nla_put_u16(skb
, IFLA_GRE_ENCAP_TYPE
,
2325 nla_put_be16(skb
, IFLA_GRE_ENCAP_SPORT
,
2327 nla_put_be16(skb
, IFLA_GRE_ENCAP_DPORT
,
2329 nla_put_u16(skb
, IFLA_GRE_ENCAP_FLAGS
,
2331 goto nla_put_failure
;
2333 if (p
->collect_md
) {
2334 if (nla_put_flag(skb
, IFLA_GRE_COLLECT_METADATA
))
2335 goto nla_put_failure
;
2338 if (nla_put_u8(skb
, IFLA_GRE_ERSPAN_VER
, p
->erspan_ver
))
2339 goto nla_put_failure
;
2341 if (p
->erspan_ver
== 1) {
2342 if (nla_put_u32(skb
, IFLA_GRE_ERSPAN_INDEX
, p
->index
))
2343 goto nla_put_failure
;
2344 } else if (p
->erspan_ver
== 2) {
2345 if (nla_put_u8(skb
, IFLA_GRE_ERSPAN_DIR
, p
->dir
))
2346 goto nla_put_failure
;
2347 if (nla_put_u16(skb
, IFLA_GRE_ERSPAN_HWID
, p
->hwid
))
2348 goto nla_put_failure
;
2357 static const struct nla_policy ip6gre_policy
[RPL_IFLA_GRE_MAX
+ 1] = {
2358 [IFLA_GRE_LINK
] = { .type
= NLA_U32
},
2359 [IFLA_GRE_IFLAGS
] = { .type
= NLA_U16
},
2360 [IFLA_GRE_OFLAGS
] = { .type
= NLA_U16
},
2361 [IFLA_GRE_IKEY
] = { .type
= NLA_U32
},
2362 [IFLA_GRE_OKEY
] = { .type
= NLA_U32
},
2363 [IFLA_GRE_LOCAL
] = { .len
= FIELD_SIZEOF(struct ipv6hdr
, saddr
) },
2364 [IFLA_GRE_REMOTE
] = { .len
= FIELD_SIZEOF(struct ipv6hdr
, daddr
) },
2365 [IFLA_GRE_TTL
] = { .type
= NLA_U8
},
2366 [IFLA_GRE_ENCAP_LIMIT
] = { .type
= NLA_U8
},
2367 [IFLA_GRE_FLOWINFO
] = { .type
= NLA_U32
},
2368 [IFLA_GRE_FLAGS
] = { .type
= NLA_U32
},
2369 [IFLA_GRE_ENCAP_TYPE
] = { .type
= NLA_U16
},
2370 [IFLA_GRE_ENCAP_FLAGS
] = { .type
= NLA_U16
},
2371 [IFLA_GRE_ENCAP_SPORT
] = { .type
= NLA_U16
},
2372 [IFLA_GRE_ENCAP_DPORT
] = { .type
= NLA_U16
},
2373 [IFLA_GRE_COLLECT_METADATA
] = { .type
= NLA_FLAG
},
2374 [IFLA_GRE_FWMARK
] = { .type
= NLA_U32
},
2375 [IFLA_GRE_ERSPAN_INDEX
] = { .type
= NLA_U32
},
2376 [IFLA_GRE_ERSPAN_VER
] = { .type
= NLA_U8
},
2377 [IFLA_GRE_ERSPAN_DIR
] = { .type
= NLA_U8
},
2378 [IFLA_GRE_ERSPAN_HWID
] = { .type
= NLA_U16
},
2381 static void ip6erspan_tap_setup(struct net_device
*dev
)
2385 dev
->netdev_ops
= &ip6erspan_netdev_ops
;
2386 #ifndef HAVE_NEEDS_FREE_NETDEV
2387 dev
->destructor
= free_netdev
;
2389 dev
->needs_free_netdev
= true;
2390 dev
->priv_destructor
= ip6gre_dev_free
;
2393 dev
->features
|= NETIF_F_NETNS_LOCAL
;
2394 dev
->priv_flags
&= ~IFF_TX_SKB_SHARING
;
2395 dev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
;
2396 netif_keep_dst(dev
);
2399 #ifdef HAVE_IP6GRE_EXTACK
2400 static int rpl_ip6erspan_newlink(struct net
*src_net
, struct net_device
*dev
,
2401 struct nlattr
*tb
[], struct nlattr
*data
[],
2402 struct netlink_ext_ack
*extack
)
2404 static int rpl_ip6erspan_newlink(struct net
*src_net
, struct net_device
*dev
,
2405 struct nlattr
*tb
[], struct nlattr
*data
[])
2408 #ifdef HAVE_IP6GRE_EXTACK
2409 int err
= ip6gre_newlink_common(src_net
, dev
, tb
, data
, extack
);
2411 int err
= ip6gre_newlink_common(src_net
, dev
, tb
, data
);
2413 struct ip6_tnl
*nt
= netdev_priv(dev
);
2414 struct net
*net
= dev_net(dev
);
2417 ip6erspan_tnl_link_config(nt
, !tb
[IFLA_MTU
]);
2418 ip6gre_tunnel_link(net_generic(net
, ip6gre_net_id
), nt
);
2422 #define ip6erspan_newlink rpl_ip6erspan_newlink
2424 static void ip6erspan_tnl_link_config(struct ip6_tnl
*t
, int set_mtu
)
2426 ip6gre_tnl_link_config_common(t
);
2427 ip6gre_tnl_link_config_route(t
, set_mtu
, ip6erspan_calc_hlen(t
));
2430 static int ip6erspan_tnl_change(struct ip6_tnl
*t
,
2431 const struct __ip6_tnl_parm
*p
, int set_mtu
)
2433 ip6gre_tnl_copy_tnl_parm(t
, p
);
2434 ip6erspan_tnl_link_config(t
, set_mtu
);
2438 #ifdef HAVE_IP6GRE_EXTACK
2439 static int rpl_ip6erspan_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
2440 struct nlattr
*data
[],
2441 struct netlink_ext_ack
*extack
)
2443 static int rpl_ip6erspan_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
2444 struct nlattr
*data
[])
2447 struct ip6gre_net
*ign
= net_generic(dev_net(dev
), ip6gre_net_id
);
2448 struct __ip6_tnl_parm p
;
2450 #ifdef HAVE_IP6GRE_EXTACK
2451 t
= ip6gre_changelink_common(dev
, tb
, data
, &p
, extack
);
2453 t
= ip6gre_changelink_common(dev
, tb
, data
, &p
);
2458 ip6gre_tunnel_unlink(ign
, t
);
2459 ip6erspan_tnl_change(t
, &p
, !tb
[IFLA_MTU
]);
2460 ip6gre_tunnel_link(ign
, t
);
2463 #define ip6erspan_changelink rpl_ip6erspan_changelink
2465 static struct rtnl_link_ops ip6gre_link_ops __read_mostly
= {
2467 .maxtype
= RPL_IFLA_GRE_MAX
,
2468 .policy
= ip6gre_policy
,
2469 .priv_size
= sizeof(struct ip6_tnl
),
2470 .setup
= ip6gre_tunnel_setup
,
2471 .validate
= ip6gre_tunnel_validate
,
2472 .newlink
= ip6gre_newlink
,
2473 .changelink
= ip6gre_changelink
,
2474 .dellink
= ip6gre_dellink
,
2475 .get_size
= ip6gre_get_size
,
2476 .fill_info
= ip6gre_fill_info
,
2477 #ifdef HAVE_GET_LINK_NET
2478 .get_link_net
= ip6_tnl_get_link_net
,
2482 static struct rtnl_link_ops ip6gre_tap_ops __read_mostly
= {
2484 .maxtype
= RPL_IFLA_GRE_MAX
,
2485 .policy
= ip6gre_policy
,
2486 .priv_size
= sizeof(struct ip6_tnl
),
2487 .setup
= ip6gre_tap_setup
,
2488 .validate
= ip6gre_tap_validate
,
2489 .newlink
= ip6gre_newlink
,
2490 .changelink
= ip6gre_changelink
,
2491 .dellink
= ip6gre_dellink
,
2492 .get_size
= ip6gre_get_size
,
2493 .fill_info
= ip6gre_fill_info
,
2494 #ifdef HAVE_GET_LINK_NET
2495 .get_link_net
= ip6_tnl_get_link_net
,
2499 static struct rtnl_link_ops ip6erspan_tap_ops __read_mostly
= {
2500 .kind
= "ip6erspan",
2501 .maxtype
= RPL_IFLA_GRE_MAX
,
2502 .policy
= ip6gre_policy
,
2503 .priv_size
= sizeof(struct ip6_tnl
),
2504 .setup
= ip6erspan_tap_setup
,
2505 .validate
= ip6erspan_tap_validate
,
2506 .newlink
= ip6erspan_newlink
,
2507 .changelink
= ip6erspan_changelink
,
2508 .dellink
= ip6gre_dellink
,
2509 .get_size
= ip6gre_get_size
,
2510 .fill_info
= ip6gre_fill_info
,
2511 #ifdef HAVE_GET_LINK_NET
2512 .get_link_net
= ip6_tnl_get_link_net
,
2516 struct net_device
*ip6erspan_fb_dev_create(struct net
*net
, const char *name
,
2517 u8 name_assign_type
)
2519 struct nlattr
*tb
[IFLA_MAX
+ 1];
2520 struct net_device
*dev
;
2521 LIST_HEAD(list_kill
);
2525 memset(&tb
, 0, sizeof(tb
));
2527 dev
= rtnl_create_link(net
, (char *)name
, name_assign_type
,
2528 &ip6erspan_tap_ops
, tb
);
2532 t
= netdev_priv(dev
);
2533 t
->parms
.collect_md
= true;
2535 err
= ip6gre_newlink(net
, dev
, tb
, NULL
);
2538 return ERR_PTR(err
);
2541 /* openvswitch users expect packet sizes to be unrestricted,
2542 * so set the largest MTU we can.
2544 err
= ip6_tnl_change_mtu(dev
, 64000);
2550 ip6gre_dellink(dev
, &list_kill
);
2551 unregister_netdevice_many(&list_kill
);
2552 return ERR_PTR(err
);
2555 static struct vport_ops ovs_erspan6_vport_ops
;
2557 static struct vport
*erspan6_tnl_create(const struct vport_parms
*parms
)
2559 struct net
*net
= ovs_dp_get_net(parms
->dp
);
2560 struct net_device
*dev
;
2561 struct vport
*vport
;
2564 vport
= ovs_vport_alloc(0, &ovs_erspan6_vport_ops
, parms
);
2569 dev
= ip6erspan_fb_dev_create(net
, parms
->name
, NET_NAME_USER
);
2572 ovs_vport_free(vport
);
2573 return ERR_CAST(dev
);
2576 err
= dev_change_flags(dev
, dev
->flags
| IFF_UP
);
2578 rtnl_delete_link(dev
);
2580 ovs_vport_free(vport
);
2581 return ERR_PTR(err
);
2588 static struct vport
*erspan6_create(const struct vport_parms
*parms
)
2590 struct vport
*vport
;
2592 vport
= erspan6_tnl_create(parms
);
2596 return ovs_netdev_link(vport
, parms
->name
);
2599 #ifndef OVS_VPORT_TYPE_IP6ERSPAN
2600 /* Just until integration */
2601 #define OVS_VPORT_TYPE_IP6ERSPAN 108
2603 static struct vport_ops ovs_erspan6_vport_ops
= {
2604 .type
= OVS_VPORT_TYPE_IP6ERSPAN
,
2605 .create
= erspan6_create
,
2606 .send
= __ip6erspan_tunnel_xmit
,
2607 #ifndef USE_UPSTREAM_TUNNEL
2608 .fill_metadata_dst
= gre_fill_metadata_dst
,
2610 .destroy
= ovs_netdev_tunnel_destroy
,
2613 struct net_device
*ip6gre_fb_dev_create(struct net
*net
, const char *name
,
2614 u8 name_assign_type
)
2616 struct nlattr
*tb
[IFLA_MAX
+ 1];
2617 struct net_device
*dev
;
2618 LIST_HEAD(list_kill
);
2622 memset(&tb
, 0, sizeof(tb
));
2624 dev
= rtnl_create_link(net
, (char *)name
, name_assign_type
,
2625 &ip6gre_tap_ops
, tb
);
2629 t
= netdev_priv(dev
);
2630 t
->parms
.collect_md
= true;
2632 err
= ip6gre_newlink(net
, dev
, tb
, NULL
);
2635 return ERR_PTR(err
);
2638 /* openvswitch users expect packet sizes to be unrestricted,
2639 * so set the largest MTU we can.
2641 err
= ip6_tnl_change_mtu(dev
, 64000);
2647 ip6gre_dellink(dev
, &list_kill
);
2648 unregister_netdevice_many(&list_kill
);
2649 return ERR_PTR(err
);
2652 static struct vport_ops ovs_ip6gre_vport_ops
;
2654 static struct vport
*ip6gre_tnl_create(const struct vport_parms
*parms
)
2656 struct net
*net
= ovs_dp_get_net(parms
->dp
);
2657 struct net_device
*dev
;
2658 struct vport
*vport
;
2661 vport
= ovs_vport_alloc(0, &ovs_ip6gre_vport_ops
, parms
);
2666 dev
= ip6gre_fb_dev_create(net
, parms
->name
, NET_NAME_USER
);
2669 ovs_vport_free(vport
);
2670 return ERR_CAST(dev
);
2673 err
= dev_change_flags(dev
, dev
->flags
| IFF_UP
);
2675 rtnl_delete_link(dev
);
2677 ovs_vport_free(vport
);
2678 return ERR_PTR(err
);
2685 static struct vport
*ip6gre_create(const struct vport_parms
*parms
)
2687 struct vport
*vport
;
2689 vport
= ip6gre_tnl_create(parms
);
2693 return ovs_netdev_link(vport
, parms
->name
);
2696 static struct vport_ops ovs_ip6gre_vport_ops
= {
2697 .type
= OVS_VPORT_TYPE_IP6GRE
,
2698 .create
= ip6gre_create
,
2699 .send
= __ip6gre_tunnel_xmit
,
2700 #ifndef USE_UPSTREAM_TUNNEL
2701 .fill_metadata_dst
= gre_fill_metadata_dst
,
2703 .destroy
= ovs_netdev_tunnel_destroy
,
2708 * And now the modules code and kernel interface.
2711 int rpl_ip6gre_init(void)
2715 err
= register_pernet_device(&ip6gre_net_ops
);
2719 err
= inet6_add_protocol(&ip6gre_protocol
, IPPROTO_GRE
);
2721 pr_info("%s: can't add protocol\n", __func__
);
2722 goto add_proto_failed
;
2725 pr_info("GRE over IPv6 tunneling driver\n");
2726 ovs_vport_ops_register(&ovs_ip6gre_vport_ops
);
2727 ovs_vport_ops_register(&ovs_erspan6_vport_ops
);
2733 unregister_pernet_device(&ip6gre_net_ops
);
2737 void rpl_ip6gre_fini(void)
2739 ovs_vport_ops_unregister(&ovs_erspan6_vport_ops
);
2740 ovs_vport_ops_unregister(&ovs_ip6gre_vport_ops
);
2741 inet6_del_protocol(&ip6gre_protocol
, IPPROTO_GRE
);
2742 unregister_pernet_device(&ip6gre_net_ops
);
2744 #endif /* USE_UPSTREAM_TUNNEL */