Lines Matching refs:t
100 for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
120 struct ip6_tnl *t, *cand = NULL; in ip6_tnl_lookup() local
125 if (!ipv6_addr_equal(local, &t->parms.laddr) || in ip6_tnl_lookup()
126 !ipv6_addr_equal(remote, &t->parms.raddr) || in ip6_tnl_lookup()
127 !(t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
130 if (link == t->parms.link) in ip6_tnl_lookup()
131 return t; in ip6_tnl_lookup()
133 cand = t; in ip6_tnl_lookup()
139 if (!ipv6_addr_equal(local, &t->parms.laddr) || in ip6_tnl_lookup()
140 !ipv6_addr_any(&t->parms.raddr) || in ip6_tnl_lookup()
141 !(t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
144 if (link == t->parms.link) in ip6_tnl_lookup()
145 return t; in ip6_tnl_lookup()
147 cand = t; in ip6_tnl_lookup()
152 if (!ipv6_addr_equal(remote, &t->parms.raddr) || in ip6_tnl_lookup()
153 !ipv6_addr_any(&t->parms.laddr) || in ip6_tnl_lookup()
154 !(t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
157 if (link == t->parms.link) in ip6_tnl_lookup()
158 return t; in ip6_tnl_lookup()
160 cand = t; in ip6_tnl_lookup()
166 t = rcu_dereference(ip6n->collect_md_tun); in ip6_tnl_lookup()
167 if (t && t->dev->flags & IFF_UP) in ip6_tnl_lookup()
168 return t; in ip6_tnl_lookup()
170 t = rcu_dereference(ip6n->tnls_wc[0]); in ip6_tnl_lookup()
171 if (t && (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
172 return t; in ip6_tnl_lookup()
211 ip6_tnl_link(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) in ip6_tnl_link() argument
213 struct ip6_tnl __rcu **tp = ip6_tnl_bucket(ip6n, &t->parms); in ip6_tnl_link()
215 if (t->parms.collect_md) in ip6_tnl_link()
216 rcu_assign_pointer(ip6n->collect_md_tun, t); in ip6_tnl_link()
217 rcu_assign_pointer(t->next , rtnl_dereference(*tp)); in ip6_tnl_link()
218 rcu_assign_pointer(*tp, t); in ip6_tnl_link()
228 ip6_tnl_unlink(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) in ip6_tnl_unlink() argument
233 if (t->parms.collect_md) in ip6_tnl_unlink()
236 for (tp = ip6_tnl_bucket(ip6n, &t->parms); in ip6_tnl_unlink()
239 if (t == iter) { in ip6_tnl_unlink()
240 rcu_assign_pointer(*tp, t->next); in ip6_tnl_unlink()
248 struct ip6_tnl *t = netdev_priv(dev); in ip6_dev_free() local
250 gro_cells_destroy(&t->gro_cells); in ip6_dev_free()
251 dst_cache_destroy(&t->dst_cache); in ip6_dev_free()
256 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_create2() local
257 struct ip6_tnl_net *ip6n = net_generic(t->net, ip6_tnl_net_id); in ip6_tnl_create2()
265 strcpy(t->parms.name, dev->name); in ip6_tnl_create2()
267 ip6_tnl_link(ip6n, t); in ip6_tnl_create2()
289 struct ip6_tnl *t; in ip6_tnl_create() local
301 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, in ip6_tnl_create()
308 t = netdev_priv(dev); in ip6_tnl_create()
309 t->parms = *p; in ip6_tnl_create()
310 t->net = dev_net(dev); in ip6_tnl_create()
315 return t; in ip6_tnl_create()
344 struct ip6_tnl *t; in ip6_tnl_locate() local
348 (t = rtnl_dereference(*tp)) != NULL; in ip6_tnl_locate()
349 tp = &t->next) { in ip6_tnl_locate()
350 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_locate()
351 ipv6_addr_equal(remote, &t->parms.raddr) && in ip6_tnl_locate()
352 p->link == t->parms.link) { in ip6_tnl_locate()
356 return t; in ip6_tnl_locate()
375 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_uninit() local
376 struct net *net = t->net; in ip6_tnl_dev_uninit()
382 ip6_tnl_unlink(ip6n, t); in ip6_tnl_dev_uninit()
383 dst_cache_reset(&t->dst_cache); in ip6_tnl_dev_uninit()
384 netdev_put(dev, &t->dev_tracker); in ip6_tnl_dev_uninit()
471 struct ip6_tnl *t; in ip6_tnl_err() local
482 t = ip6_tnl_lookup(dev_net(skb->dev), skb->dev->ifindex, &ipv6h->daddr, &ipv6h->saddr); in ip6_tnl_err()
483 if (!t) in ip6_tnl_err()
486 tproto = READ_ONCE(t->parms.proto); in ip6_tnl_err()
495 t->parms.name); in ip6_tnl_err()
501 t->parms.name); in ip6_tnl_err()
517 t->parms.name); in ip6_tnl_err()
522 t->parms.name); in ip6_tnl_err()
710 static int ip4ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in ip4ip6_dscp_ecn_decapsulate() argument
716 if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) in ip4ip6_dscp_ecn_decapsulate()
722 static int ip6ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in ip6ip6_dscp_ecn_decapsulate() argument
726 if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) in ip6ip6_dscp_ecn_decapsulate()
732 static inline int mplsip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in mplsip6_dscp_ecn_decapsulate() argument
740 __u32 ip6_tnl_get_cap(struct ip6_tnl *t, in ip6_tnl_get_cap() argument
744 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_get_cap()
765 int ip6_tnl_rcv_ctl(struct ip6_tnl *t, in ip6_tnl_rcv_ctl() argument
769 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_rcv_ctl()
771 struct net *net = t->net; in ip6_tnl_rcv_ctl()
775 (ip6_tnl_get_cap(t, laddr, raddr) & IP6_TNL_F_CAP_RCV))) { in ip6_tnl_rcv_ctl()
796 int (*dscp_ecn_decapsulate)(const struct ip6_tnl *t, in __ip6_tnl_rcv() argument
890 int ip6_tnl_rcv(struct ip6_tnl *t, struct sk_buff *skb, in ip6_tnl_rcv() argument
895 int (*dscp_ecn_decapsulate)(const struct ip6_tnl *t, in ip6_tnl_rcv()
903 return __ip6_tnl_rcv(t, skb, tpi, tun_dst, dscp_ecn_decapsulate, in ip6_tnl_rcv()
925 int (*dscp_ecn_decapsulate)(const struct ip6_tnl *t, in ipxip6_rcv() argument
929 struct ip6_tnl *t; in ipxip6_rcv() local
935 t = ip6_tnl_lookup(dev_net(skb->dev), skb->dev->ifindex, &ipv6h->saddr, &ipv6h->daddr); in ipxip6_rcv()
937 if (t) { in ipxip6_rcv()
938 u8 tproto = READ_ONCE(t->parms.proto); in ipxip6_rcv()
945 if (!ip6_tnl_rcv_ctl(t, &ipv6h->daddr, &ipv6h->saddr)) in ipxip6_rcv()
949 if (t->parms.collect_md) { in ipxip6_rcv()
956 ret = __ip6_tnl_rcv(t, skb, tpi, tun_dst, dscp_ecn_decapsulate, in ipxip6_rcv()
1022 ip6_tnl_addr_conflict(const struct ip6_tnl *t, const struct ipv6hdr *hdr) in ip6_tnl_addr_conflict() argument
1024 return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr); in ip6_tnl_addr_conflict()
1027 int ip6_tnl_xmit_ctl(struct ip6_tnl *t, in ip6_tnl_xmit_ctl() argument
1031 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_xmit_ctl()
1033 struct net *net = t->net; in ip6_tnl_xmit_ctl()
1035 if (t->parms.collect_md) in ip6_tnl_xmit_ctl()
1040 (ip6_tnl_get_cap(t, laddr, raddr) & IP6_TNL_F_CAP_XMIT))) { in ip6_tnl_xmit_ctl()
1089 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_xmit() local
1090 struct net *net = t->net; in ip6_tnl_xmit()
1096 unsigned int eth_hlen = t->dev->type == ARPHRD_ETHER ? ETH_HLEN : 0; in ip6_tnl_xmit()
1097 unsigned int psh_hlen = sizeof(struct ipv6hdr) + t->encap_hlen; in ip6_tnl_xmit()
1106 if (t->parms.collect_md) { in ip6_tnl_xmit()
1110 hop_limit = t->parms.hop_limit; in ip6_tnl_xmit()
1114 if (ipv6_addr_any(&t->parms.raddr)) { in ip6_tnl_xmit()
1145 } else if (t->parms.proto != 0 && !(t->parms.flags & in ip6_tnl_xmit()
1155 dst = dst_cache_get(&t->dst_cache); in ip6_tnl_xmit()
1157 if (!ip6_tnl_xmit_ctl(t, &fl6->saddr, &fl6->daddr)) in ip6_tnl_xmit()
1175 if (t->parms.collect_md && ipv6_addr_any(&fl6->saddr) && in ip6_tnl_xmit()
1187 t->parms.name); in ip6_tnl_xmit()
1190 mtu = dst_mtu(dst) - eth_hlen - psh_hlen - t->tun_hlen; in ip6_tnl_xmit()
1199 if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) { in ip6_tnl_xmit()
1205 if (t->err_count > 0) { in ip6_tnl_xmit()
1207 t->err_time + IP6TUNNEL_ERR_TIMEO)) { in ip6_tnl_xmit()
1208 t->err_count--; in ip6_tnl_xmit()
1212 t->err_count = 0; in ip6_tnl_xmit()
1216 skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev))); in ip6_tnl_xmit()
1237 if (t->parms.collect_md) { in ip6_tnl_xmit()
1238 if (t->encap.type != TUNNEL_ENCAP_NONE) in ip6_tnl_xmit()
1242 dst_cache_set_ip6(&t->dst_cache, ndst, &fl6->saddr); in ip6_tnl_xmit()
1259 + dst->header_len + t->hlen; in ip6_tnl_xmit()
1262 err = ip6_tnl_encap(skb, t, &proto, fl6); in ip6_tnl_xmit()
1295 struct ip6_tnl *t = netdev_priv(dev); in ipxip6_tnl_xmit() local
1306 tproto = READ_ONCE(t->parms.proto); in ipxip6_tnl_xmit()
1310 if (t->parms.collect_md) { in ipxip6_tnl_xmit()
1339 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ipxip6_tnl_xmit()
1340 encap_limit = t->parms.encap_limit; in ipxip6_tnl_xmit()
1360 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ipxip6_tnl_xmit()
1363 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ipxip6_tnl_xmit()
1366 fl6.flowi6_mark = t->parms.fwmark; in ipxip6_tnl_xmit()
1371 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ipxip6_tnl_xmit()
1374 dsfield = ip6_tclass(t->parms.flowinfo); in ipxip6_tnl_xmit()
1379 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ipxip6_tnl_xmit()
1382 dsfield = ip6_tclass(t->parms.flowinfo); in ipxip6_tnl_xmit()
1383 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) in ipxip6_tnl_xmit()
1387 orig_dsfield = dsfield = ip6_tclass(t->parms.flowinfo); in ipxip6_tnl_xmit()
1425 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_start_xmit() local
1437 if (ip6_tnl_addr_conflict(t, ipv6_hdr(skb))) in ip6_tnl_start_xmit()
1461 static void ip6_tnl_link_config(struct ip6_tnl *t) in ip6_tnl_link_config() argument
1463 struct net_device *dev = t->dev; in ip6_tnl_link_config()
1465 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_link_config()
1466 struct flowi6 *fl6 = &t->fl.u.ip6; in ip6_tnl_link_config()
1485 p->flags |= ip6_tnl_get_cap(t, &p->laddr, &p->raddr); in ip6_tnl_link_config()
1492 t->tun_hlen = 0; in ip6_tnl_link_config()
1493 t->hlen = t->encap_hlen + t->tun_hlen; in ip6_tnl_link_config()
1494 t_hlen = t->hlen + sizeof(struct ipv6hdr); in ip6_tnl_link_config()
1500 struct rt6_info *rt = rt6_lookup(t->net, in ip6_tnl_link_config()
1509 tdev = __dev_get_by_index(t->net, p->link); in ip6_tnl_link_config()
1517 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6_tnl_link_config()
1537 ip6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p) in ip6_tnl_change() argument
1539 t->parms.laddr = p->laddr; in ip6_tnl_change()
1540 t->parms.raddr = p->raddr; in ip6_tnl_change()
1541 t->parms.flags = p->flags; in ip6_tnl_change()
1542 t->parms.hop_limit = p->hop_limit; in ip6_tnl_change()
1543 t->parms.encap_limit = p->encap_limit; in ip6_tnl_change()
1544 t->parms.flowinfo = p->flowinfo; in ip6_tnl_change()
1545 t->parms.link = p->link; in ip6_tnl_change()
1546 t->parms.proto = p->proto; in ip6_tnl_change()
1547 t->parms.fwmark = p->fwmark; in ip6_tnl_change()
1548 dst_cache_reset(&t->dst_cache); in ip6_tnl_change()
1549 ip6_tnl_link_config(t); in ip6_tnl_change()
1552 static void ip6_tnl_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) in ip6_tnl_update() argument
1554 struct net *net = t->net; in ip6_tnl_update()
1557 ip6_tnl_unlink(ip6n, t); in ip6_tnl_update()
1559 ip6_tnl_change(t, p); in ip6_tnl_update()
1560 ip6_tnl_link(ip6n, t); in ip6_tnl_update()
1561 netdev_state_change(t->dev); in ip6_tnl_update()
1564 static int ip6_tnl0_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p, in ip6_tnl0_update() argument
1573 p->flags != t->parms.flags || p->hop_limit || p->encap_limit || in ip6_tnl0_update()
1577 t->parms.proto = p->proto; in ip6_tnl0_update()
1578 netdev_state_change(t->dev); in ip6_tnl0_update()
1646 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_siocdevprivate() local
1647 struct net *net = t->net; in ip6_tnl_siocdevprivate()
1660 t = ip6_tnl_locate(net, &p1, 0); in ip6_tnl_siocdevprivate()
1661 if (IS_ERR(t)) in ip6_tnl_siocdevprivate()
1662 t = netdev_priv(dev); in ip6_tnl_siocdevprivate()
1666 ip6_tnl_parm_to_user(&p, &t->parms); in ip6_tnl_siocdevprivate()
1683 t = ip6_tnl_locate(net, &p1, cmd == SIOCADDTUNNEL); in ip6_tnl_siocdevprivate()
1685 if (!IS_ERR(t)) { in ip6_tnl_siocdevprivate()
1686 if (t->dev != dev) { in ip6_tnl_siocdevprivate()
1691 t = netdev_priv(dev); in ip6_tnl_siocdevprivate()
1693 ip6_tnl0_update(t, &p1, false); in ip6_tnl_siocdevprivate()
1695 ip6_tnl_update(t, &p1); in ip6_tnl_siocdevprivate()
1697 if (!IS_ERR(t)) { in ip6_tnl_siocdevprivate()
1699 ip6_tnl_parm_to_user(&p, &t->parms); in ip6_tnl_siocdevprivate()
1704 err = PTR_ERR(t); in ip6_tnl_siocdevprivate()
1718 t = ip6_tnl_locate(net, &p1, 0); in ip6_tnl_siocdevprivate()
1719 if (IS_ERR(t)) in ip6_tnl_siocdevprivate()
1722 if (t->dev == ip6n->fb_tnl_dev) in ip6_tnl_siocdevprivate()
1724 dev = t->dev; in ip6_tnl_siocdevprivate()
1772 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_get_iflink() local
1774 return READ_ONCE(t->parms.link); in ip6_tnl_get_iflink()
1808 int ip6_tnl_encap_setup(struct ip6_tnl *t, in ip6_tnl_encap_setup() argument
1813 memset(&t->encap, 0, sizeof(t->encap)); in ip6_tnl_encap_setup()
1819 t->encap.type = ipencap->type; in ip6_tnl_encap_setup()
1820 t->encap.sport = ipencap->sport; in ip6_tnl_encap_setup()
1821 t->encap.dport = ipencap->dport; in ip6_tnl_encap_setup()
1822 t->encap.flags = ipencap->flags; in ip6_tnl_encap_setup()
1824 t->encap_hlen = hlen; in ip6_tnl_encap_setup()
1825 t->hlen = t->encap_hlen + t->tun_hlen; in ip6_tnl_encap_setup()
1886 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_init_gen() local
1890 t->dev = dev; in ip6_tnl_dev_init_gen()
1892 ret = dst_cache_init(&t->dst_cache, GFP_KERNEL); in ip6_tnl_dev_init_gen()
1896 ret = gro_cells_init(&t->gro_cells, dev); in ip6_tnl_dev_init_gen()
1900 t->tun_hlen = 0; in ip6_tnl_dev_init_gen()
1901 t->hlen = t->encap_hlen + t->tun_hlen; in ip6_tnl_dev_init_gen()
1902 t_hlen = t->hlen + sizeof(struct ipv6hdr); in ip6_tnl_dev_init_gen()
1906 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6_tnl_dev_init_gen()
1911 netdev_hold(dev, &t->dev_tracker, GFP_KERNEL); in ip6_tnl_dev_init_gen()
1916 dst_cache_destroy(&t->dst_cache); in ip6_tnl_dev_init_gen()
1928 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_init() local
1933 ip6_tnl_link_config(t); in ip6_tnl_dev_init()
1934 if (t->parms.collect_md) in ip6_tnl_dev_init()
1948 struct ip6_tnl *t = netdev_priv(dev); in ip6_fb_tnl_dev_init() local
1952 t->net = net; in ip6_fb_tnl_dev_init()
1953 t->parms.proto = IPPROTO_IPV6; in ip6_fb_tnl_dev_init()
1955 rcu_assign_pointer(ip6n->tnls_wc[0], t); in ip6_fb_tnl_dev_init()
2023 struct ip6_tnl *nt, *t; in ip6_tnl_newlink() local
2044 t = ip6_tnl_locate(net, &nt->parms, 0); in ip6_tnl_newlink()
2045 if (!IS_ERR(t)) in ip6_tnl_newlink()
2060 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_changelink() local
2062 struct net *net = t->net; in ip6_tnl_changelink()
2080 if (ip6_tnl0_update(t, &p, true) < 0) { in ip6_tnl_changelink()
2090 int err = ip6_tnl_encap_setup(t, &ipencap); in ip6_tnl_changelink()
2099 t = ip6_tnl_locate(net, &p, 0); in ip6_tnl_changelink()
2100 if (!IS_ERR(t)) { in ip6_tnl_changelink()
2101 if (t->dev != dev) in ip6_tnl_changelink()
2104 t = netdev_priv(dev); in ip6_tnl_changelink()
2106 ip6_tnl_update(t, &p); in ip6_tnl_changelink()
2248 struct ip6_tnl *t; in ip6_tnl_exit_rtnl_net() local
2255 t = rtnl_net_dereference(net, ip6n->tnls_r_l[h]); in ip6_tnl_exit_rtnl_net()
2256 while (t) { in ip6_tnl_exit_rtnl_net()
2260 if (!net_eq(dev_net(t->dev), net)) in ip6_tnl_exit_rtnl_net()
2261 unregister_netdevice_queue(t->dev, list); in ip6_tnl_exit_rtnl_net()
2263 t = rtnl_net_dereference(net, t->next); in ip6_tnl_exit_rtnl_net()
2267 t = rtnl_net_dereference(net, ip6n->tnls_wc[0]); in ip6_tnl_exit_rtnl_net()
2268 while (t) { in ip6_tnl_exit_rtnl_net()
2272 if (!net_eq(dev_net(t->dev), net)) in ip6_tnl_exit_rtnl_net()
2273 unregister_netdevice_queue(t->dev, list); in ip6_tnl_exit_rtnl_net()
2275 t = rtnl_net_dereference(net, t->next); in ip6_tnl_exit_rtnl_net()
2282 struct ip6_tnl *t = NULL; in ip6_tnl_init_net() local
2311 t = netdev_priv(ip6n->fb_tnl_dev); in ip6_tnl_init_net()
2313 strcpy(t->parms.name, ip6n->fb_tnl_dev->name); in ip6_tnl_init_net()