Lines Matching +full:max +full:- +full:rt

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()
92 head = &itn->tunnels[hash]; 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()
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()
124 head = &itn->tunnels[hash]; 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()
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()
160 t = rcu_dereference(itn->collect_md_tun); in ip_tunnel_lookup()
161 if (t && t->dev->flags & IFF_UP) 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()
194 struct hlist_head *head = ip_bucket(itn, &t->parms); in ip_tunnel_add()
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()
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()
220 ip_tunnel_flags_copy(flags, parms->i_flags); 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()
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()
294 struct rtable *rt; in ip_tunnel_bind_dev() local
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()
302 if (!IS_ERR(rt)) { in ip_tunnel_bind_dev()
303 tdev = rt->dst.dev; in ip_tunnel_bind_dev()
304 ip_rt_put(rt); 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()
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()
513 struct rtable *rt, __be16 df, in tnl_update_pmtu() argument
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()
581 if (headroom > READ_ONCE(dev->needed_headroom)) in ip_tunnel_adj_headroom()
582 WRITE_ONCE(dev->needed_headroom, headroom); in ip_tunnel_adj_headroom()
593 struct rtable *rt = NULL; in ip_md_tunnel_xmit() local
600 if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) || in ip_md_tunnel_xmit()
603 key = &tun_info->key; in ip_md_tunnel_xmit()
604 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); in ip_md_tunnel_xmit()
606 tos = key->tos; in ip_md_tunnel_xmit()
608 if (skb->protocol == htons(ETH_P_IP)) in ip_md_tunnel_xmit()
609 tos = inner_iph->tos; in ip_md_tunnel_xmit()
610 else if (skb->protocol == htons(ETH_P_IPV6)) in ip_md_tunnel_xmit()
613 ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, in ip_md_tunnel_xmit()
614 tunnel_id_to_key32(key->tun_id), in ip_md_tunnel_xmit()
615 tos & INET_DSCP_MASK, tunnel->net, 0, skb->mark, in ip_md_tunnel_xmit()
616 skb_get_hash(skb), key->flow_flags); in ip_md_tunnel_xmit()
619 tunnel_hlen = ip_encap_hlen(&tun_info->encap); in ip_md_tunnel_xmit()
621 if (ip_tunnel_encap(skb, &tun_info->encap, &proto, &fl4) < 0) in ip_md_tunnel_xmit()
626 rt = dst_cache_get_ip4(&tun_info->dst_cache, &fl4.saddr); in ip_md_tunnel_xmit()
627 if (!rt) { in ip_md_tunnel_xmit()
628 rt = ip_route_output_key(tunnel->net, &fl4); in ip_md_tunnel_xmit()
629 if (IS_ERR(rt)) { in ip_md_tunnel_xmit()
634 dst_cache_set_ip4(&tun_info->dst_cache, &rt->dst, in ip_md_tunnel_xmit()
637 if (rt->dst.dev == dev) { in ip_md_tunnel_xmit()
638 ip_rt_put(rt); in ip_md_tunnel_xmit()
643 if (test_bit(IP_TUNNEL_DONT_FRAGMENT_BIT, key->tun_flags)) in ip_md_tunnel_xmit()
645 if (tnl_update_pmtu(dev, skb, rt, df, inner_iph, tunnel_hlen, in ip_md_tunnel_xmit()
646 key->u.ipv4.dst, true)) { in ip_md_tunnel_xmit()
647 ip_rt_put(rt); in ip_md_tunnel_xmit()
652 ttl = key->ttl; in ip_md_tunnel_xmit()
654 if (skb->protocol == htons(ETH_P_IP)) in ip_md_tunnel_xmit()
655 ttl = inner_iph->ttl; in ip_md_tunnel_xmit()
656 else if (skb->protocol == htons(ETH_P_IPV6)) in ip_md_tunnel_xmit()
657 ttl = ((const struct ipv6hdr *)inner_iph)->hop_limit; in ip_md_tunnel_xmit()
659 ttl = ip4_dst_hoplimit(&rt->dst); in ip_md_tunnel_xmit()
662 headroom += LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len; in ip_md_tunnel_xmit()
664 ip_rt_put(rt); in ip_md_tunnel_xmit()
670 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, proto, tos, ttl, in ip_md_tunnel_xmit()
671 df, !net_eq(tunnel->net, dev_net(dev)), 0); in ip_md_tunnel_xmit()
690 struct rtable *rt = NULL; /* Route to the other host */ in ip_tunnel_xmit() local
701 connected = (tunnel->parms.iph.daddr != 0); in ip_tunnel_xmit()
704 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); in ip_tunnel_xmit()
706 dst = tnl_params->daddr; in ip_tunnel_xmit()
716 if (tun_info && (tun_info->mode & IP_TUNNEL_INFO_TX) && in ip_tunnel_xmit()
718 tun_info->key.u.ipv4.dst) { in ip_tunnel_xmit()
719 dst = tun_info->key.u.ipv4.dst; in ip_tunnel_xmit()
723 rt = skb_rtable(skb); in ip_tunnel_xmit()
724 dst = rt_nexthop(rt, inner_iph->daddr); in ip_tunnel_xmit()
734 &ipv6_hdr(skb)->daddr); in ip_tunnel_xmit()
738 addr6 = (const struct in6_addr *)&neigh->primary_key; in ip_tunnel_xmit()
742 addr6 = &ipv6_hdr(skb)->daddr; in ip_tunnel_xmit()
750 dst = addr6->s6_addr32[3]; in ip_tunnel_xmit()
764 tos = tnl_params->tos; in ip_tunnel_xmit()
768 tos = inner_iph->tos; in ip_tunnel_xmit()
776 ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr, in ip_tunnel_xmit()
777 tunnel->parms.o_key, tos & INET_DSCP_MASK, in ip_tunnel_xmit()
778 tunnel->net, READ_ONCE(tunnel->parms.link), in ip_tunnel_xmit()
779 tunnel->fwmark, skb_get_hash(skb), 0); in ip_tunnel_xmit()
781 if (ip_tunnel_encap(skb, &tunnel->encap, &protocol, &fl4) < 0) in ip_tunnel_xmit()
787 rt = dst_cache_get_ip4(&tun_info->dst_cache, in ip_tunnel_xmit()
790 rt = connected ? dst_cache_get_ip4(&tunnel->dst_cache, in ip_tunnel_xmit()
794 if (!rt) { in ip_tunnel_xmit()
795 rt = ip_route_output_key(tunnel->net, &fl4); in ip_tunnel_xmit()
797 if (IS_ERR(rt)) { in ip_tunnel_xmit()
802 dst_cache_set_ip4(&tun_info->dst_cache, &rt->dst, in ip_tunnel_xmit()
805 dst_cache_set_ip4(&tunnel->dst_cache, &rt->dst, in ip_tunnel_xmit()
809 if (rt->dst.dev == dev) { in ip_tunnel_xmit()
810 ip_rt_put(rt); in ip_tunnel_xmit()
815 df = tnl_params->frag_off; in ip_tunnel_xmit()
816 if (payload_protocol == htons(ETH_P_IP) && !tunnel->ignore_df) in ip_tunnel_xmit()
817 df |= (inner_iph->frag_off & htons(IP_DF)); in ip_tunnel_xmit()
819 if (tnl_update_pmtu(dev, skb, rt, df, inner_iph, 0, 0, false)) { in ip_tunnel_xmit()
820 ip_rt_put(rt); in ip_tunnel_xmit()
824 if (tunnel->err_count > 0) { in ip_tunnel_xmit()
826 tunnel->err_time + IPTUNNEL_ERR_TIMEO)) { in ip_tunnel_xmit()
827 tunnel->err_count--; in ip_tunnel_xmit()
831 tunnel->err_count = 0; in ip_tunnel_xmit()
835 ttl = tnl_params->ttl; in ip_tunnel_xmit()
838 ttl = inner_iph->ttl; in ip_tunnel_xmit()
841 ttl = ((const struct ipv6hdr *)inner_iph)->hop_limit; in ip_tunnel_xmit()
844 ttl = ip4_dst_hoplimit(&rt->dst); in ip_tunnel_xmit()
847 max_headroom = LL_RESERVED_SPACE(rt->dst.dev) + sizeof(struct iphdr) in ip_tunnel_xmit()
848 + rt->dst.header_len + ip_encap_hlen(&tunnel->encap); in ip_tunnel_xmit()
851 ip_rt_put(rt); in ip_tunnel_xmit()
859 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl, in ip_tunnel_xmit()
860 df, !net_eq(tunnel->net, dev_net(dev)), 0); in ip_tunnel_xmit()
881 t->parms.iph.saddr = p->iph.saddr; in ip_tunnel_update()
882 t->parms.iph.daddr = p->iph.daddr; in ip_tunnel_update()
883 t->parms.i_key = p->i_key; in ip_tunnel_update()
884 t->parms.o_key = p->o_key; in ip_tunnel_update()
885 if (dev->type != ARPHRD_ETHER) { in ip_tunnel_update()
886 __dev_addr_set(dev, &p->iph.saddr, 4); in ip_tunnel_update()
887 memcpy(dev->broadcast, &p->iph.daddr, 4); in ip_tunnel_update()
891 t->parms.iph.ttl = p->iph.ttl; in ip_tunnel_update()
892 t->parms.iph.tos = p->iph.tos; in ip_tunnel_update()
893 t->parms.iph.frag_off = p->iph.frag_off; in ip_tunnel_update()
895 if (t->parms.link != p->link || t->fwmark != fwmark) { in ip_tunnel_update()
898 WRITE_ONCE(t->parms.link, p->link); in ip_tunnel_update()
899 t->fwmark = fwmark; in ip_tunnel_update()
902 WRITE_ONCE(dev->mtu, mtu); in ip_tunnel_update()
904 dst_cache_reset(&t->dst_cache); in ip_tunnel_update()
913 struct net *net = t->net; in ip_tunnel_ctl()
914 struct ip_tunnel_net *itn = net_generic(net, t->ip_tnl_net_id); in ip_tunnel_ctl()
918 if (dev == itn->fb_tunnel_dev) { in ip_tunnel_ctl()
919 t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type); in ip_tunnel_ctl()
923 memcpy(p, &t->parms, sizeof(*p)); in ip_tunnel_ctl()
928 err = -EPERM; in ip_tunnel_ctl()
929 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_tunnel_ctl()
931 if (p->iph.ttl) in ip_tunnel_ctl()
932 p->iph.frag_off |= htons(IP_DF); in ip_tunnel_ctl()
933 if (!test_bit(IP_TUNNEL_VTI_BIT, p->i_flags)) { in ip_tunnel_ctl()
934 if (!test_bit(IP_TUNNEL_KEY_BIT, p->i_flags)) in ip_tunnel_ctl()
935 p->i_key = 0; in ip_tunnel_ctl()
936 if (!test_bit(IP_TUNNEL_KEY_BIT, p->o_flags)) in ip_tunnel_ctl()
937 p->o_key = 0; in ip_tunnel_ctl()
940 t = ip_tunnel_find(itn, p, itn->type); in ip_tunnel_ctl()
949 err = -EEXIST; in ip_tunnel_ctl()
952 if (dev != itn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) { in ip_tunnel_ctl()
954 if (t->dev != dev) { in ip_tunnel_ctl()
955 err = -EEXIST; in ip_tunnel_ctl()
961 if (ipv4_is_multicast(p->iph.daddr)) in ip_tunnel_ctl()
963 else if (p->iph.daddr) in ip_tunnel_ctl()
966 if ((dev->flags^nflags)&(IFF_POINTOPOINT|IFF_BROADCAST)) { in ip_tunnel_ctl()
967 err = -EINVAL; in ip_tunnel_ctl()
979 err = -ENOENT; in ip_tunnel_ctl()
984 err = -EPERM; in ip_tunnel_ctl()
985 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_tunnel_ctl()
988 if (dev == itn->fb_tunnel_dev) { in ip_tunnel_ctl()
989 err = -ENOENT; in ip_tunnel_ctl()
990 t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type); in ip_tunnel_ctl()
993 err = -EPERM; in ip_tunnel_ctl()
994 if (t == netdev_priv(itn->fb_tunnel_dev)) in ip_tunnel_ctl()
996 dev = t->dev; in ip_tunnel_ctl()
1003 err = -EINVAL; in ip_tunnel_ctl()
1019 strscpy(kp->name, p.name); in ip_tunnel_parm_from_user()
1020 kp->link = p.link; in ip_tunnel_parm_from_user()
1021 ip_tunnel_flags_from_be16(kp->i_flags, p.i_flags); in ip_tunnel_parm_from_user()
1022 ip_tunnel_flags_from_be16(kp->o_flags, p.o_flags); in ip_tunnel_parm_from_user()
1023 kp->i_key = p.i_key; in ip_tunnel_parm_from_user()
1024 kp->o_key = p.o_key; in ip_tunnel_parm_from_user()
1025 memcpy(&kp->iph, &p.iph, min(sizeof(kp->iph), sizeof(p.iph))); in ip_tunnel_parm_from_user()
1035 if (!ip_tunnel_flags_is_be16_compat(kp->i_flags) || in ip_tunnel_parm_to_user()
1036 !ip_tunnel_flags_is_be16_compat(kp->o_flags)) in ip_tunnel_parm_to_user()
1041 strscpy(p.name, kp->name); in ip_tunnel_parm_to_user()
1042 p.link = kp->link; in ip_tunnel_parm_to_user()
1043 p.i_flags = ip_tunnel_flags_to_be16(kp->i_flags); in ip_tunnel_parm_to_user()
1044 p.o_flags = ip_tunnel_flags_to_be16(kp->o_flags); in ip_tunnel_parm_to_user()
1045 p.i_key = kp->i_key; in ip_tunnel_parm_to_user()
1046 p.o_key = kp->o_key; in ip_tunnel_parm_to_user()
1047 memcpy(&p.iph, &kp->iph, min(sizeof(p.iph), sizeof(kp->iph))); in ip_tunnel_parm_to_user()
1060 return -EFAULT; in ip_tunnel_siocdevprivate()
1061 err = dev->netdev_ops->ndo_tunnel_ctl(dev, &p, cmd); in ip_tunnel_siocdevprivate()
1063 return -EFAULT; in ip_tunnel_siocdevprivate()
1071 int t_hlen = tunnel->hlen + sizeof(struct iphdr); in __ip_tunnel_change_mtu()
1072 int max_mtu = IP_MAX_MTU - t_hlen; in __ip_tunnel_change_mtu()
1074 if (dev->type == ARPHRD_ETHER) in __ip_tunnel_change_mtu()
1075 max_mtu -= dev->hard_header_len; in __ip_tunnel_change_mtu()
1078 return -EINVAL; in __ip_tunnel_change_mtu()
1082 return -EINVAL; in __ip_tunnel_change_mtu()
1087 WRITE_ONCE(dev->mtu, new_mtu); in __ip_tunnel_change_mtu()
1102 gro_cells_destroy(&tunnel->gro_cells); in ip_tunnel_dev_free()
1103 dst_cache_destroy(&tunnel->dst_cache); in ip_tunnel_dev_free()
1111 itn = net_generic(tunnel->net, tunnel->ip_tnl_net_id); in ip_tunnel_dellink()
1113 if (itn->fb_tunnel_dev != dev) { in ip_tunnel_dellink()
1124 return READ_ONCE(tunnel->net); in ip_tunnel_get_link_net()
1132 return READ_ONCE(tunnel->parms.link); in ip_tunnel_get_iflink()
1143 itn->rtnl_link_ops = ops; in ip_tunnel_init_net()
1145 INIT_HLIST_HEAD(&itn->tunnels[i]); in ip_tunnel_init_net()
1151 itn->type = it_init_net->type; in ip_tunnel_init_net()
1152 itn->fb_tunnel_dev = NULL; in ip_tunnel_init_net()
1161 itn->fb_tunnel_dev = __ip_tunnel_create(net, ops, &parms); in ip_tunnel_init_net()
1165 if (!IS_ERR(itn->fb_tunnel_dev)) { in ip_tunnel_init_net()
1166 itn->fb_tunnel_dev->netns_immutable = true; in ip_tunnel_init_net()
1167 itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev); in ip_tunnel_init_net()
1168 ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev)); in ip_tunnel_init_net()
1169 itn->type = itn->fb_tunnel_dev->type; in ip_tunnel_init_net()
1173 return PTR_ERR_OR_ZERO(itn->fb_tunnel_dev); in ip_tunnel_init_net()
1188 if (dev->rtnl_link_ops == ops) in ip_tunnel_delete_net()
1194 struct hlist_head *thead = &itn->tunnels[h]; in ip_tunnel_delete_net()
1200 if (!net_eq(dev_net(t->dev), net)) in ip_tunnel_delete_net()
1201 unregister_netdevice_queue(t->dev, head); in ip_tunnel_delete_net()
1216 itn = net_generic(net, nt->ip_tnl_net_id); in ip_tunnel_newlink()
1218 if (nt->collect_md) { in ip_tunnel_newlink()
1219 if (rtnl_dereference(itn->collect_md_tun)) in ip_tunnel_newlink()
1220 return -EEXIST; in ip_tunnel_newlink()
1222 if (ip_tunnel_find(itn, p, dev->type)) in ip_tunnel_newlink()
1223 return -EEXIST; in ip_tunnel_newlink()
1226 nt->net = net; in ip_tunnel_newlink()
1227 nt->parms = *p; in ip_tunnel_newlink()
1228 nt->fwmark = fwmark; in ip_tunnel_newlink()
1233 if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS]) in ip_tunnel_newlink()
1238 unsigned int max = IP_MAX_MTU - (nt->hlen + sizeof(struct iphdr)); in ip_tunnel_newlink() local
1240 if (dev->type == ARPHRD_ETHER) in ip_tunnel_newlink()
1241 max -= dev->hard_header_len; in ip_tunnel_newlink()
1243 mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, max); in ip_tunnel_newlink()
1265 struct net *net = tunnel->net; in ip_tunnel_changelink()
1266 struct ip_tunnel_net *itn = net_generic(net, tunnel->ip_tnl_net_id); in ip_tunnel_changelink()
1268 if (dev == itn->fb_tunnel_dev) in ip_tunnel_changelink()
1269 return -EINVAL; in ip_tunnel_changelink()
1271 t = ip_tunnel_find(itn, p, dev->type); in ip_tunnel_changelink()
1274 if (t->dev != dev) in ip_tunnel_changelink()
1275 return -EEXIST; in ip_tunnel_changelink()
1279 if (dev->type != ARPHRD_ETHER) { in ip_tunnel_changelink()
1282 if (ipv4_is_multicast(p->iph.daddr)) in ip_tunnel_changelink()
1284 else if (p->iph.daddr) in ip_tunnel_changelink()
1287 if ((dev->flags ^ nflags) & in ip_tunnel_changelink()
1289 return -EINVAL; in ip_tunnel_changelink()
1301 struct iphdr *iph = &tunnel->parms.iph; in ip_tunnel_init()
1304 dev->needs_free_netdev = true; in ip_tunnel_init()
1305 dev->priv_destructor = ip_tunnel_dev_free; in ip_tunnel_init()
1306 dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in ip_tunnel_init()
1308 err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL); in ip_tunnel_init()
1312 err = gro_cells_init(&tunnel->gro_cells, dev); in ip_tunnel_init()
1314 dst_cache_destroy(&tunnel->dst_cache); in ip_tunnel_init()
1318 tunnel->dev = dev; in ip_tunnel_init()
1319 strscpy(tunnel->parms.name, dev->name); in ip_tunnel_init()
1320 iph->version = 4; in ip_tunnel_init()
1321 iph->ihl = 5; in ip_tunnel_init()
1323 if (tunnel->collect_md) in ip_tunnel_init()
1333 struct net *net = tunnel->net; in ip_tunnel_uninit()
1336 itn = net_generic(net, tunnel->ip_tnl_net_id); in ip_tunnel_uninit()
1338 if (itn->fb_tunnel_dev == dev) in ip_tunnel_uninit()
1339 WRITE_ONCE(itn->fb_tunnel_dev, NULL); in ip_tunnel_uninit()
1341 dst_cache_reset(&tunnel->dst_cache); in ip_tunnel_uninit()
1349 tunnel->ip_tnl_net_id = net_id; in ip_tunnel_setup()