Lines Matching +full:t +full:- +full:head

1 // SPDX-License-Identifier: GPL-2.0-only
65 return !test_bit(IP_TUNNEL_KEY_BIT, p->i_flags); in ip_tunnel_key_match()
67 return test_bit(IP_TUNNEL_KEY_BIT, p->i_flags) && p->i_key == key; in ip_tunnel_key_match()
86 struct ip_tunnel *t, *cand = NULL; in ip_tunnel_lookup() local
87 struct hlist_head *head; in ip_tunnel_lookup() local
92 head = &itn->tunnels[hash]; in ip_tunnel_lookup()
94 hlist_for_each_entry_rcu(t, head, hash_node) { in ip_tunnel_lookup()
95 if (local != t->parms.iph.saddr || in ip_tunnel_lookup()
96 remote != t->parms.iph.daddr || in ip_tunnel_lookup()
97 !(t->dev->flags & IFF_UP)) in ip_tunnel_lookup()
100 if (!ip_tunnel_key_match(&t->parms, flags, key)) in ip_tunnel_lookup()
103 if (READ_ONCE(t->parms.link) == link) in ip_tunnel_lookup()
104 return t; in ip_tunnel_lookup()
105 cand = t; in ip_tunnel_lookup()
108 hlist_for_each_entry_rcu(t, head, hash_node) { in ip_tunnel_lookup()
109 if (remote != t->parms.iph.daddr || in ip_tunnel_lookup()
110 t->parms.iph.saddr != 0 || in ip_tunnel_lookup()
111 !(t->dev->flags & IFF_UP)) in ip_tunnel_lookup()
114 if (!ip_tunnel_key_match(&t->parms, flags, key)) in ip_tunnel_lookup()
117 if (READ_ONCE(t->parms.link) == link) in ip_tunnel_lookup()
118 return t; in ip_tunnel_lookup()
120 cand = t; in ip_tunnel_lookup()
124 head = &itn->tunnels[hash]; in ip_tunnel_lookup()
126 hlist_for_each_entry_rcu(t, head, hash_node) { in ip_tunnel_lookup()
127 if ((local != t->parms.iph.saddr || t->parms.iph.daddr != 0) && in ip_tunnel_lookup()
128 (local != t->parms.iph.daddr || !ipv4_is_multicast(local))) in ip_tunnel_lookup()
131 if (!(t->dev->flags & IFF_UP)) in ip_tunnel_lookup()
134 if (!ip_tunnel_key_match(&t->parms, flags, key)) in ip_tunnel_lookup()
137 if (READ_ONCE(t->parms.link) == link) in ip_tunnel_lookup()
138 return t; in ip_tunnel_lookup()
140 cand = t; in ip_tunnel_lookup()
143 hlist_for_each_entry_rcu(t, head, hash_node) { in ip_tunnel_lookup()
145 t->parms.i_key != key) || in ip_tunnel_lookup()
146 t->parms.iph.saddr != 0 || in ip_tunnel_lookup()
147 t->parms.iph.daddr != 0 || in ip_tunnel_lookup()
148 !(t->dev->flags & IFF_UP)) in ip_tunnel_lookup()
151 if (READ_ONCE(t->parms.link) == link) in ip_tunnel_lookup()
152 return t; in ip_tunnel_lookup()
154 cand = t; in ip_tunnel_lookup()
160 t = rcu_dereference(itn->collect_md_tun); in ip_tunnel_lookup()
161 if (t && t->dev->flags & IFF_UP) in ip_tunnel_lookup()
162 return t; in ip_tunnel_lookup()
164 ndev = READ_ONCE(itn->fb_tunnel_dev); in ip_tunnel_lookup()
165 if (ndev && ndev->flags & IFF_UP) in ip_tunnel_lookup()
177 __be32 i_key = parms->i_key; in ip_bucket()
179 if (parms->iph.daddr && !ipv4_is_multicast(parms->iph.daddr)) in ip_bucket()
180 remote = parms->iph.daddr; in ip_bucket()
184 if (!test_bit(IP_TUNNEL_KEY_BIT, parms->i_flags) && in ip_bucket()
185 test_bit(IP_TUNNEL_VTI_BIT, parms->i_flags)) in ip_bucket()
189 return &itn->tunnels[h]; in ip_bucket()
192 static void ip_tunnel_add(struct ip_tunnel_net *itn, struct ip_tunnel *t) in ip_tunnel_add() argument
194 struct hlist_head *head = ip_bucket(itn, &t->parms); in ip_tunnel_add() local
196 if (t->collect_md) in ip_tunnel_add()
197 rcu_assign_pointer(itn->collect_md_tun, t); in ip_tunnel_add()
198 hlist_add_head_rcu(&t->hash_node, head); in ip_tunnel_add()
201 static void ip_tunnel_del(struct ip_tunnel_net *itn, struct ip_tunnel *t) in ip_tunnel_del() argument
203 if (t->collect_md) in ip_tunnel_del()
204 rcu_assign_pointer(itn->collect_md_tun, NULL); in ip_tunnel_del()
205 hlist_del_init_rcu(&t->hash_node); in ip_tunnel_del()
212 __be32 remote = parms->iph.daddr; in ip_tunnel_find()
213 __be32 local = parms->iph.saddr; in ip_tunnel_find()
215 __be32 key = parms->i_key; in ip_tunnel_find()
216 int link = parms->link; in ip_tunnel_find()
217 struct ip_tunnel *t = NULL; in ip_tunnel_find() local
218 struct hlist_head *head = ip_bucket(itn, parms); in ip_tunnel_find() local
220 ip_tunnel_flags_copy(flags, parms->i_flags); in ip_tunnel_find()
222 hlist_for_each_entry_rcu(t, head, hash_node, lockdep_rtnl_is_held()) { in ip_tunnel_find()
223 if (local == t->parms.iph.saddr && in ip_tunnel_find()
224 remote == t->parms.iph.daddr && in ip_tunnel_find()
225 link == READ_ONCE(t->parms.link) && in ip_tunnel_find()
226 type == t->dev->type && in ip_tunnel_find()
227 ip_tunnel_key_match(&t->parms, flags, key)) in ip_tunnel_find()
230 return t; in ip_tunnel_find()
242 err = -E2BIG; in __ip_tunnel_create()
243 if (parms->name[0]) { in __ip_tunnel_create()
244 if (!dev_valid_name(parms->name)) in __ip_tunnel_create()
246 strscpy(name, parms->name); in __ip_tunnel_create()
248 if (strlen(ops->kind) > (IFNAMSIZ - 3)) in __ip_tunnel_create()
250 strscpy(name, ops->kind); in __ip_tunnel_create()
255 dev = alloc_netdev(ops->priv_size, name, NET_NAME_UNKNOWN, ops->setup); in __ip_tunnel_create()
257 err = -ENOMEM; in __ip_tunnel_create()
262 dev->rtnl_link_ops = ops; in __ip_tunnel_create()
265 tunnel->parms = *parms; in __ip_tunnel_create()
266 tunnel->net = net; in __ip_tunnel_create()
287 int t_hlen = tunnel->hlen + sizeof(struct iphdr); in ip_tunnel_bind_dev()
289 iph = &tunnel->parms.iph; in ip_tunnel_bind_dev()
292 if (iph->daddr) { in ip_tunnel_bind_dev()
296 ip_tunnel_init_flow(&fl4, iph->protocol, iph->daddr, in ip_tunnel_bind_dev()
297 iph->saddr, tunnel->parms.o_key, in ip_tunnel_bind_dev()
298 iph->tos & INET_DSCP_MASK, tunnel->net, in ip_tunnel_bind_dev()
299 tunnel->parms.link, tunnel->fwmark, 0, 0); in ip_tunnel_bind_dev()
300 rt = ip_route_output_key(tunnel->net, &fl4); in ip_tunnel_bind_dev()
303 tdev = rt->dst.dev; in ip_tunnel_bind_dev()
306 if (dev->type != ARPHRD_ETHER) in ip_tunnel_bind_dev()
307 dev->flags |= IFF_POINTOPOINT; in ip_tunnel_bind_dev()
309 dst_cache_reset(&tunnel->dst_cache); in ip_tunnel_bind_dev()
312 if (!tdev && tunnel->parms.link) in ip_tunnel_bind_dev()
313 tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link); in ip_tunnel_bind_dev()
316 hlen = tdev->hard_header_len + tdev->needed_headroom; in ip_tunnel_bind_dev()
317 mtu = min(tdev->mtu, IP_MAX_MTU); in ip_tunnel_bind_dev()
320 dev->needed_headroom = t_hlen + hlen; in ip_tunnel_bind_dev()
321 mtu -= t_hlen + (dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0); in ip_tunnel_bind_dev()
339 dev = __ip_tunnel_create(net, itn->rtnl_link_ops, parms); in ip_tunnel_create()
349 t_hlen = nt->hlen + sizeof(struct iphdr); in ip_tunnel_create()
350 dev->min_mtu = ETH_MIN_MTU; in ip_tunnel_create()
351 dev->max_mtu = IP_MAX_MTU - t_hlen; in ip_tunnel_create()
352 if (dev->type == ARPHRD_ETHER) in ip_tunnel_create()
353 dev->max_mtu -= dev->hard_header_len; in ip_tunnel_create()
368 if (iph->protocol != IPPROTO_UDP) in ip_tunnel_md_udp_encap()
371 udph = (struct udphdr *)((__u8 *)iph + (iph->ihl << 2)); in ip_tunnel_md_udp_encap()
372 info->encap.sport = udph->source; in ip_tunnel_md_udp_encap()
373 info->encap.dport = udph->dest; in ip_tunnel_md_udp_encap()
385 if (ipv4_is_multicast(iph->daddr)) { in ip_tunnel_rcv()
386 DEV_STATS_INC(tunnel->dev, multicast); in ip_tunnel_rcv()
387 skb->pkt_type = PACKET_BROADCAST; in ip_tunnel_rcv()
391 if (test_bit(IP_TUNNEL_CSUM_BIT, tunnel->parms.i_flags) != in ip_tunnel_rcv()
392 test_bit(IP_TUNNEL_CSUM_BIT, tpi->flags)) { in ip_tunnel_rcv()
393 DEV_STATS_INC(tunnel->dev, rx_crc_errors); in ip_tunnel_rcv()
394 DEV_STATS_INC(tunnel->dev, rx_errors); in ip_tunnel_rcv()
398 if (test_bit(IP_TUNNEL_SEQ_BIT, tunnel->parms.i_flags)) { in ip_tunnel_rcv()
399 if (!test_bit(IP_TUNNEL_SEQ_BIT, tpi->flags) || in ip_tunnel_rcv()
400 (tunnel->i_seqno && (s32)(ntohl(tpi->seq) - tunnel->i_seqno) < 0)) { in ip_tunnel_rcv()
401 DEV_STATS_INC(tunnel->dev, rx_fifo_errors); in ip_tunnel_rcv()
402 DEV_STATS_INC(tunnel->dev, rx_errors); in ip_tunnel_rcv()
405 tunnel->i_seqno = ntohl(tpi->seq) + 1; in ip_tunnel_rcv()
408 /* Save offset of outer header relative to skb->head, in ip_tunnel_rcv()
410 * and might change skb->head. in ip_tunnel_rcv()
412 nh = skb_network_header(skb) - skb->head; in ip_tunnel_rcv()
414 skb_set_network_header(skb, (tunnel->dev->type == ARPHRD_ETHER) ? ETH_HLEN : 0); in ip_tunnel_rcv()
417 DEV_STATS_INC(tunnel->dev, rx_length_errors); in ip_tunnel_rcv()
418 DEV_STATS_INC(tunnel->dev, rx_errors); in ip_tunnel_rcv()
421 iph = (struct iphdr *)(skb->head + nh); in ip_tunnel_rcv()
426 net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n", in ip_tunnel_rcv()
427 &iph->saddr, iph->tos); in ip_tunnel_rcv()
429 DEV_STATS_INC(tunnel->dev, rx_frame_errors); in ip_tunnel_rcv()
430 DEV_STATS_INC(tunnel->dev, rx_errors); in ip_tunnel_rcv()
435 dev_sw_netstats_rx_add(tunnel->dev, skb->len); in ip_tunnel_rcv()
436 skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev))); in ip_tunnel_rcv()
438 if (tunnel->dev->type == ARPHRD_ETHER) { in ip_tunnel_rcv()
439 skb->protocol = eth_type_trans(skb, tunnel->dev); in ip_tunnel_rcv()
442 skb->dev = tunnel->dev; in ip_tunnel_rcv()
448 gro_cells_receive(&tunnel->gro_cells, skb); in ip_tunnel_rcv()
463 return -ERANGE; in ip_tunnel_encap_add_ops()
467 NULL, ops) ? 0 : -1; in ip_tunnel_encap_add_ops()
477 return -ERANGE; in ip_tunnel_encap_del_ops()
481 ops, NULL) == ops) ? 0 : -1; in ip_tunnel_encap_del_ops()
489 int ip_tunnel_encap_setup(struct ip_tunnel *t, in ip_tunnel_encap_setup() argument
494 memset(&t->encap, 0, sizeof(t->encap)); in ip_tunnel_encap_setup()
500 t->encap.type = ipencap->type; in ip_tunnel_encap_setup()
501 t->encap.sport = ipencap->sport; in ip_tunnel_encap_setup()
502 t->encap.dport = ipencap->dport; in ip_tunnel_encap_setup()
503 t->encap.flags = ipencap->flags; in ip_tunnel_encap_setup()
505 t->encap_hlen = hlen; in ip_tunnel_encap_setup()
506 t->hlen = t->encap_hlen + t->tun_hlen; in ip_tunnel_encap_setup()
521 tunnel_hlen = md ? tunnel_hlen : tunnel->hlen; in tnl_update_pmtu()
522 pkt_size = skb->len - tunnel_hlen; in tnl_update_pmtu()
523 pkt_size -= dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0; in tnl_update_pmtu()
526 mtu = dst_mtu(&rt->dst) - (sizeof(struct iphdr) + tunnel_hlen); in tnl_update_pmtu()
527 mtu -= dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0; in tnl_update_pmtu()
529 mtu = skb_valid_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; in tnl_update_pmtu()
535 if (skb->protocol == htons(ETH_P_IP)) { in tnl_update_pmtu()
537 (inner_iph->frag_off & htons(IP_DF)) && in tnl_update_pmtu()
540 return -E2BIG; in tnl_update_pmtu()
544 else if (skb->protocol == htons(ETH_P_IPV6)) { in tnl_update_pmtu()
550 daddr = md ? dst : tunnel->parms.iph.daddr; in tnl_update_pmtu()
555 rt6->rt6i_dst.plen == 128) { in tnl_update_pmtu()
556 rt6->rt6i_flags |= RTF_MODIFIED; in tnl_update_pmtu()
564 return -E2BIG; in tnl_update_pmtu()
586 if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) || in ip_md_tunnel_xmit()
589 key = &tun_info->key; in ip_md_tunnel_xmit()
590 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); in ip_md_tunnel_xmit()
592 tos = key->tos; in ip_md_tunnel_xmit()
594 if (skb->protocol == htons(ETH_P_IP)) in ip_md_tunnel_xmit()
595 tos = inner_iph->tos; in ip_md_tunnel_xmit()
596 else if (skb->protocol == htons(ETH_P_IPV6)) in ip_md_tunnel_xmit()
599 ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, in ip_md_tunnel_xmit()
600 tunnel_id_to_key32(key->tun_id), in ip_md_tunnel_xmit()
601 tos & INET_DSCP_MASK, tunnel->net, 0, skb->mark, in ip_md_tunnel_xmit()
602 skb_get_hash(skb), key->flow_flags); in ip_md_tunnel_xmit()
605 tunnel_hlen = ip_encap_hlen(&tun_info->encap); in ip_md_tunnel_xmit()
607 if (ip_tunnel_encap(skb, &tun_info->encap, &proto, &fl4) < 0) in ip_md_tunnel_xmit()
612 rt = dst_cache_get_ip4(&tun_info->dst_cache, &fl4.saddr); in ip_md_tunnel_xmit()
614 rt = ip_route_output_key(tunnel->net, &fl4); in ip_md_tunnel_xmit()
620 dst_cache_set_ip4(&tun_info->dst_cache, &rt->dst, in ip_md_tunnel_xmit()
623 if (rt->dst.dev == dev) { in ip_md_tunnel_xmit()
629 if (test_bit(IP_TUNNEL_DONT_FRAGMENT_BIT, key->tun_flags)) in ip_md_tunnel_xmit()
632 key->u.ipv4.dst, true)) { in ip_md_tunnel_xmit()
638 ttl = key->ttl; in ip_md_tunnel_xmit()
640 if (skb->protocol == htons(ETH_P_IP)) in ip_md_tunnel_xmit()
641 ttl = inner_iph->ttl; in ip_md_tunnel_xmit()
642 else if (skb->protocol == htons(ETH_P_IPV6)) in ip_md_tunnel_xmit()
643 ttl = ((const struct ipv6hdr *)inner_iph)->hop_limit; in ip_md_tunnel_xmit()
645 ttl = ip4_dst_hoplimit(&rt->dst); in ip_md_tunnel_xmit()
648 headroom += LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len; in ip_md_tunnel_xmit()
657 df, !net_eq(tunnel->net, dev_net(dev)), 0); in ip_md_tunnel_xmit()
687 connected = (tunnel->parms.iph.daddr != 0); in ip_tunnel_xmit()
690 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); in ip_tunnel_xmit()
692 dst = tnl_params->daddr; in ip_tunnel_xmit()
702 if (tun_info && (tun_info->mode & IP_TUNNEL_INFO_TX) && in ip_tunnel_xmit()
704 tun_info->key.u.ipv4.dst) { in ip_tunnel_xmit()
705 dst = tun_info->key.u.ipv4.dst; in ip_tunnel_xmit()
710 dst = rt_nexthop(rt, inner_iph->daddr); in ip_tunnel_xmit()
720 &ipv6_hdr(skb)->daddr); in ip_tunnel_xmit()
724 addr6 = (const struct in6_addr *)&neigh->primary_key; in ip_tunnel_xmit()
728 addr6 = &ipv6_hdr(skb)->daddr; in ip_tunnel_xmit()
736 dst = addr6->s6_addr32[3]; in ip_tunnel_xmit()
750 tos = tnl_params->tos; in ip_tunnel_xmit()
754 tos = inner_iph->tos; in ip_tunnel_xmit()
762 ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr, in ip_tunnel_xmit()
763 tunnel->parms.o_key, tos & INET_DSCP_MASK, in ip_tunnel_xmit()
764 tunnel->net, READ_ONCE(tunnel->parms.link), in ip_tunnel_xmit()
765 tunnel->fwmark, skb_get_hash(skb), 0); in ip_tunnel_xmit()
767 if (ip_tunnel_encap(skb, &tunnel->encap, &protocol, &fl4) < 0) in ip_tunnel_xmit()
773 rt = dst_cache_get_ip4(&tun_info->dst_cache, in ip_tunnel_xmit()
776 rt = connected ? dst_cache_get_ip4(&tunnel->dst_cache, in ip_tunnel_xmit()
781 rt = ip_route_output_key(tunnel->net, &fl4); in ip_tunnel_xmit()
788 dst_cache_set_ip4(&tun_info->dst_cache, &rt->dst, in ip_tunnel_xmit()
791 dst_cache_set_ip4(&tunnel->dst_cache, &rt->dst, in ip_tunnel_xmit()
795 if (rt->dst.dev == dev) { in ip_tunnel_xmit()
801 df = tnl_params->frag_off; in ip_tunnel_xmit()
802 if (payload_protocol == htons(ETH_P_IP) && !tunnel->ignore_df) in ip_tunnel_xmit()
803 df |= (inner_iph->frag_off & htons(IP_DF)); in ip_tunnel_xmit()
810 if (tunnel->err_count > 0) { in ip_tunnel_xmit()
812 tunnel->err_time + IPTUNNEL_ERR_TIMEO)) { in ip_tunnel_xmit()
813 tunnel->err_count--; in ip_tunnel_xmit()
817 tunnel->err_count = 0; in ip_tunnel_xmit()
821 ttl = tnl_params->ttl; in ip_tunnel_xmit()
824 ttl = inner_iph->ttl; in ip_tunnel_xmit()
827 ttl = ((const struct ipv6hdr *)inner_iph)->hop_limit; in ip_tunnel_xmit()
830 ttl = ip4_dst_hoplimit(&rt->dst); in ip_tunnel_xmit()
833 max_headroom = LL_RESERVED_SPACE(rt->dst.dev) + sizeof(struct iphdr) in ip_tunnel_xmit()
834 + rt->dst.header_len + ip_encap_hlen(&tunnel->encap); in ip_tunnel_xmit()
846 df, !net_eq(tunnel->net, dev_net(dev)), 0); in ip_tunnel_xmit()
860 struct ip_tunnel *t, in ip_tunnel_update() argument
866 ip_tunnel_del(itn, t); in ip_tunnel_update()
867 t->parms.iph.saddr = p->iph.saddr; in ip_tunnel_update()
868 t->parms.iph.daddr = p->iph.daddr; in ip_tunnel_update()
869 t->parms.i_key = p->i_key; in ip_tunnel_update()
870 t->parms.o_key = p->o_key; in ip_tunnel_update()
871 if (dev->type != ARPHRD_ETHER) { in ip_tunnel_update()
872 __dev_addr_set(dev, &p->iph.saddr, 4); in ip_tunnel_update()
873 memcpy(dev->broadcast, &p->iph.daddr, 4); in ip_tunnel_update()
875 ip_tunnel_add(itn, t); in ip_tunnel_update()
877 t->parms.iph.ttl = p->iph.ttl; in ip_tunnel_update()
878 t->parms.iph.tos = p->iph.tos; in ip_tunnel_update()
879 t->parms.iph.frag_off = p->iph.frag_off; in ip_tunnel_update()
881 if (t->parms.link != p->link || t->fwmark != fwmark) { in ip_tunnel_update()
884 WRITE_ONCE(t->parms.link, p->link); in ip_tunnel_update()
885 t->fwmark = fwmark; in ip_tunnel_update()
888 WRITE_ONCE(dev->mtu, mtu); in ip_tunnel_update()
890 dst_cache_reset(&t->dst_cache); in ip_tunnel_update()
898 struct ip_tunnel *t = netdev_priv(dev); in ip_tunnel_ctl() local
899 struct net *net = t->net; in ip_tunnel_ctl()
900 struct ip_tunnel_net *itn = net_generic(net, t->ip_tnl_net_id); in ip_tunnel_ctl()
904 if (dev == itn->fb_tunnel_dev) { in ip_tunnel_ctl()
905 t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type); in ip_tunnel_ctl()
906 if (!t) in ip_tunnel_ctl()
907 t = netdev_priv(dev); in ip_tunnel_ctl()
909 memcpy(p, &t->parms, sizeof(*p)); in ip_tunnel_ctl()
914 err = -EPERM; in ip_tunnel_ctl()
915 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_tunnel_ctl()
917 if (p->iph.ttl) in ip_tunnel_ctl()
918 p->iph.frag_off |= htons(IP_DF); in ip_tunnel_ctl()
919 if (!test_bit(IP_TUNNEL_VTI_BIT, p->i_flags)) { in ip_tunnel_ctl()
920 if (!test_bit(IP_TUNNEL_KEY_BIT, p->i_flags)) in ip_tunnel_ctl()
921 p->i_key = 0; in ip_tunnel_ctl()
922 if (!test_bit(IP_TUNNEL_KEY_BIT, p->o_flags)) in ip_tunnel_ctl()
923 p->o_key = 0; in ip_tunnel_ctl()
926 t = ip_tunnel_find(itn, p, itn->type); in ip_tunnel_ctl()
929 if (!t) { in ip_tunnel_ctl()
930 t = ip_tunnel_create(net, itn, p); in ip_tunnel_ctl()
931 err = PTR_ERR_OR_ZERO(t); in ip_tunnel_ctl()
935 err = -EEXIST; in ip_tunnel_ctl()
938 if (dev != itn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) { in ip_tunnel_ctl()
939 if (t) { in ip_tunnel_ctl()
940 if (t->dev != dev) { in ip_tunnel_ctl()
941 err = -EEXIST; in ip_tunnel_ctl()
947 if (ipv4_is_multicast(p->iph.daddr)) in ip_tunnel_ctl()
949 else if (p->iph.daddr) in ip_tunnel_ctl()
952 if ((dev->flags^nflags)&(IFF_POINTOPOINT|IFF_BROADCAST)) { in ip_tunnel_ctl()
953 err = -EINVAL; in ip_tunnel_ctl()
957 t = netdev_priv(dev); in ip_tunnel_ctl()
961 if (t) { in ip_tunnel_ctl()
963 ip_tunnel_update(itn, t, dev, p, true, 0); in ip_tunnel_ctl()
965 err = -ENOENT; in ip_tunnel_ctl()
970 err = -EPERM; in ip_tunnel_ctl()
971 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_tunnel_ctl()
974 if (dev == itn->fb_tunnel_dev) { in ip_tunnel_ctl()
975 err = -ENOENT; in ip_tunnel_ctl()
976 t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type); in ip_tunnel_ctl()
977 if (!t) in ip_tunnel_ctl()
979 err = -EPERM; in ip_tunnel_ctl()
980 if (t == netdev_priv(itn->fb_tunnel_dev)) in ip_tunnel_ctl()
982 dev = t->dev; in ip_tunnel_ctl()
989 err = -EINVAL; in ip_tunnel_ctl()
1005 strscpy(kp->name, p.name); in ip_tunnel_parm_from_user()
1006 kp->link = p.link; in ip_tunnel_parm_from_user()
1007 ip_tunnel_flags_from_be16(kp->i_flags, p.i_flags); in ip_tunnel_parm_from_user()
1008 ip_tunnel_flags_from_be16(kp->o_flags, p.o_flags); in ip_tunnel_parm_from_user()
1009 kp->i_key = p.i_key; in ip_tunnel_parm_from_user()
1010 kp->o_key = p.o_key; in ip_tunnel_parm_from_user()
1011 memcpy(&kp->iph, &p.iph, min(sizeof(kp->iph), sizeof(p.iph))); in ip_tunnel_parm_from_user()
1021 if (!ip_tunnel_flags_is_be16_compat(kp->i_flags) || in ip_tunnel_parm_to_user()
1022 !ip_tunnel_flags_is_be16_compat(kp->o_flags)) in ip_tunnel_parm_to_user()
1027 strscpy(p.name, kp->name); in ip_tunnel_parm_to_user()
1028 p.link = kp->link; in ip_tunnel_parm_to_user()
1029 p.i_flags = ip_tunnel_flags_to_be16(kp->i_flags); in ip_tunnel_parm_to_user()
1030 p.o_flags = ip_tunnel_flags_to_be16(kp->o_flags); in ip_tunnel_parm_to_user()
1031 p.i_key = kp->i_key; in ip_tunnel_parm_to_user()
1032 p.o_key = kp->o_key; in ip_tunnel_parm_to_user()
1033 memcpy(&p.iph, &kp->iph, min(sizeof(p.iph), sizeof(kp->iph))); in ip_tunnel_parm_to_user()
1046 return -EFAULT; in ip_tunnel_siocdevprivate()
1047 err = dev->netdev_ops->ndo_tunnel_ctl(dev, &p, cmd); in ip_tunnel_siocdevprivate()
1049 return -EFAULT; in ip_tunnel_siocdevprivate()
1057 int t_hlen = tunnel->hlen + sizeof(struct iphdr); in __ip_tunnel_change_mtu()
1058 int max_mtu = IP_MAX_MTU - t_hlen; in __ip_tunnel_change_mtu()
1060 if (dev->type == ARPHRD_ETHER) in __ip_tunnel_change_mtu()
1061 max_mtu -= dev->hard_header_len; in __ip_tunnel_change_mtu()
1064 return -EINVAL; in __ip_tunnel_change_mtu()
1068 return -EINVAL; in __ip_tunnel_change_mtu()
1073 WRITE_ONCE(dev->mtu, new_mtu); in __ip_tunnel_change_mtu()
1088 gro_cells_destroy(&tunnel->gro_cells); in ip_tunnel_dev_free()
1089 dst_cache_destroy(&tunnel->dst_cache); in ip_tunnel_dev_free()
1092 void ip_tunnel_dellink(struct net_device *dev, struct list_head *head) in ip_tunnel_dellink() argument
1097 itn = net_generic(tunnel->net, tunnel->ip_tnl_net_id); in ip_tunnel_dellink()
1099 if (itn->fb_tunnel_dev != dev) { in ip_tunnel_dellink()
1101 unregister_netdevice_queue(dev, head); in ip_tunnel_dellink()
1110 return READ_ONCE(tunnel->net); in ip_tunnel_get_link_net()
1118 return READ_ONCE(tunnel->parms.link); in ip_tunnel_get_iflink()
1129 itn->rtnl_link_ops = ops; in ip_tunnel_init_net()
1131 INIT_HLIST_HEAD(&itn->tunnels[i]); in ip_tunnel_init_net()
1137 itn->type = it_init_net->type; in ip_tunnel_init_net()
1138 itn->fb_tunnel_dev = NULL; in ip_tunnel_init_net()
1147 itn->fb_tunnel_dev = __ip_tunnel_create(net, ops, &parms); in ip_tunnel_init_net()
1151 if (!IS_ERR(itn->fb_tunnel_dev)) { in ip_tunnel_init_net()
1152 itn->fb_tunnel_dev->netns_immutable = true; in ip_tunnel_init_net()
1153 itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev); in ip_tunnel_init_net()
1154 ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev)); in ip_tunnel_init_net()
1155 itn->type = itn->fb_tunnel_dev->type; in ip_tunnel_init_net()
1159 return PTR_ERR_OR_ZERO(itn->fb_tunnel_dev); in ip_tunnel_init_net()
1165 struct list_head *head) in ip_tunnel_delete_net() argument
1174 if (dev->rtnl_link_ops == ops) in ip_tunnel_delete_net()
1175 unregister_netdevice_queue(dev, head); in ip_tunnel_delete_net()
1178 struct ip_tunnel *t; in ip_tunnel_delete_net() local
1180 struct hlist_head *thead = &itn->tunnels[h]; in ip_tunnel_delete_net()
1182 hlist_for_each_entry_safe(t, n, thead, hash_node) in ip_tunnel_delete_net()
1186 if (!net_eq(dev_net(t->dev), net)) in ip_tunnel_delete_net()
1187 unregister_netdevice_queue(t->dev, head); in ip_tunnel_delete_net()
1202 itn = net_generic(net, nt->ip_tnl_net_id); in ip_tunnel_newlink()
1204 if (nt->collect_md) { in ip_tunnel_newlink()
1205 if (rtnl_dereference(itn->collect_md_tun)) in ip_tunnel_newlink()
1206 return -EEXIST; in ip_tunnel_newlink()
1208 if (ip_tunnel_find(itn, p, dev->type)) in ip_tunnel_newlink()
1209 return -EEXIST; in ip_tunnel_newlink()
1212 nt->net = net; in ip_tunnel_newlink()
1213 nt->parms = *p; in ip_tunnel_newlink()
1214 nt->fwmark = fwmark; in ip_tunnel_newlink()
1219 if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS]) in ip_tunnel_newlink()
1224 unsigned int max = IP_MAX_MTU - (nt->hlen + sizeof(struct iphdr)); in ip_tunnel_newlink()
1226 if (dev->type == ARPHRD_ETHER) in ip_tunnel_newlink()
1227 max -= dev->hard_header_len; in ip_tunnel_newlink()
1229 mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, max); in ip_tunnel_newlink()
1249 struct ip_tunnel *t; in ip_tunnel_changelink() local
1251 struct net *net = tunnel->net; in ip_tunnel_changelink()
1252 struct ip_tunnel_net *itn = net_generic(net, tunnel->ip_tnl_net_id); in ip_tunnel_changelink()
1254 if (dev == itn->fb_tunnel_dev) in ip_tunnel_changelink()
1255 return -EINVAL; in ip_tunnel_changelink()
1257 t = ip_tunnel_find(itn, p, dev->type); in ip_tunnel_changelink()
1259 if (t) { in ip_tunnel_changelink()
1260 if (t->dev != dev) in ip_tunnel_changelink()
1261 return -EEXIST; in ip_tunnel_changelink()
1263 t = tunnel; in ip_tunnel_changelink()
1265 if (dev->type != ARPHRD_ETHER) { in ip_tunnel_changelink()
1268 if (ipv4_is_multicast(p->iph.daddr)) in ip_tunnel_changelink()
1270 else if (p->iph.daddr) in ip_tunnel_changelink()
1273 if ((dev->flags ^ nflags) & in ip_tunnel_changelink()
1275 return -EINVAL; in ip_tunnel_changelink()
1279 ip_tunnel_update(itn, t, dev, p, !tb[IFLA_MTU], fwmark); in ip_tunnel_changelink()
1287 struct iphdr *iph = &tunnel->parms.iph; in ip_tunnel_init()
1290 dev->needs_free_netdev = true; in ip_tunnel_init()
1291 dev->priv_destructor = ip_tunnel_dev_free; in ip_tunnel_init()
1292 dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in ip_tunnel_init()
1294 err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL); in ip_tunnel_init()
1298 err = gro_cells_init(&tunnel->gro_cells, dev); in ip_tunnel_init()
1300 dst_cache_destroy(&tunnel->dst_cache); in ip_tunnel_init()
1304 tunnel->dev = dev; in ip_tunnel_init()
1305 strscpy(tunnel->parms.name, dev->name); in ip_tunnel_init()
1306 iph->version = 4; in ip_tunnel_init()
1307 iph->ihl = 5; in ip_tunnel_init()
1309 if (tunnel->collect_md) in ip_tunnel_init()
1319 struct net *net = tunnel->net; in ip_tunnel_uninit()
1322 itn = net_generic(net, tunnel->ip_tnl_net_id); in ip_tunnel_uninit()
1324 if (itn->fb_tunnel_dev == dev) in ip_tunnel_uninit()
1325 WRITE_ONCE(itn->fb_tunnel_dev, NULL); in ip_tunnel_uninit()
1327 dst_cache_reset(&tunnel->dst_cache); in ip_tunnel_uninit()
1335 tunnel->ip_tnl_net_id = net_id; in ip_tunnel_setup()