Lines Matching refs:t

146 struct dst_entry *ip6_tnl_dst_get(struct ip6_tnl *t)  in ip6_tnl_dst_get()  argument
153 idst = raw_cpu_ptr(t->dst_cache); in ip6_tnl_dst_get()
175 void ip6_tnl_dst_reset(struct ip6_tnl *t) in ip6_tnl_dst_reset() argument
180 ip6_tnl_per_cpu_dst_set(per_cpu_ptr(t->dst_cache, i), NULL); in ip6_tnl_dst_reset()
184 void ip6_tnl_dst_set(struct ip6_tnl *t, struct dst_entry *dst) in ip6_tnl_dst_set() argument
186 ip6_tnl_per_cpu_dst_set(raw_cpu_ptr(t->dst_cache), dst); in ip6_tnl_dst_set()
191 void ip6_tnl_dst_destroy(struct ip6_tnl *t) in ip6_tnl_dst_destroy() argument
193 if (!t->dst_cache) in ip6_tnl_dst_destroy()
196 ip6_tnl_dst_reset(t); in ip6_tnl_dst_destroy()
197 free_percpu(t->dst_cache); in ip6_tnl_dst_destroy()
201 int ip6_tnl_dst_init(struct ip6_tnl *t) in ip6_tnl_dst_init() argument
205 t->dst_cache = alloc_percpu(struct ip6_tnl_dst); in ip6_tnl_dst_init()
206 if (!t->dst_cache) in ip6_tnl_dst_init()
210 seqlock_init(&per_cpu_ptr(t->dst_cache, i)->lock); in ip6_tnl_dst_init()
228 for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
234 struct ip6_tnl *t; in ip6_tnl_lookup() local
239 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_lookup()
240 ipv6_addr_equal(remote, &t->parms.raddr) && in ip6_tnl_lookup()
241 (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
242 return t; in ip6_tnl_lookup()
248 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_lookup()
249 (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
250 return t; in ip6_tnl_lookup()
255 if (ipv6_addr_equal(remote, &t->parms.raddr) && in ip6_tnl_lookup()
256 (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
257 return t; in ip6_tnl_lookup()
260 t = rcu_dereference(ip6n->tnls_wc[0]); in ip6_tnl_lookup()
261 if (t && (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
262 return t; in ip6_tnl_lookup()
299 ip6_tnl_link(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) in ip6_tnl_link() argument
301 struct ip6_tnl __rcu **tp = ip6_tnl_bucket(ip6n, &t->parms); in ip6_tnl_link()
303 rcu_assign_pointer(t->next , rtnl_dereference(*tp)); in ip6_tnl_link()
304 rcu_assign_pointer(*tp, t); in ip6_tnl_link()
313 ip6_tnl_unlink(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) in ip6_tnl_unlink() argument
318 for (tp = ip6_tnl_bucket(ip6n, &t->parms); in ip6_tnl_unlink()
321 if (t == iter) { in ip6_tnl_unlink()
322 rcu_assign_pointer(*tp, t->next); in ip6_tnl_unlink()
330 struct ip6_tnl *t = netdev_priv(dev); in ip6_dev_free() local
332 ip6_tnl_dst_destroy(t); in ip6_dev_free()
339 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_create2() local
344 t = netdev_priv(dev); in ip6_tnl_create2()
351 strcpy(t->parms.name, dev->name); in ip6_tnl_create2()
354 ip6_tnl_link(ip6n, t); in ip6_tnl_create2()
376 struct ip6_tnl *t; in ip6_tnl_create() local
385 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, in ip6_tnl_create()
392 t = netdev_priv(dev); in ip6_tnl_create()
393 t->parms = *p; in ip6_tnl_create()
394 t->net = dev_net(dev); in ip6_tnl_create()
399 return t; in ip6_tnl_create()
427 struct ip6_tnl *t; in ip6_tnl_locate() local
431 (t = rtnl_dereference(*tp)) != NULL; in ip6_tnl_locate()
432 tp = &t->next) { in ip6_tnl_locate()
433 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_locate()
434 ipv6_addr_equal(remote, &t->parms.raddr)) { in ip6_tnl_locate()
438 return t; in ip6_tnl_locate()
457 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_uninit() local
458 struct net *net = t->net; in ip6_tnl_dev_uninit()
464 ip6_tnl_unlink(ip6n, t); in ip6_tnl_dev_uninit()
465 ip6_tnl_dst_reset(t); in ip6_tnl_dev_uninit()
543 struct ip6_tnl *t; in ip6_tnl_err() local
557 t = ip6_tnl_lookup(dev_net(skb->dev), &ipv6h->daddr, &ipv6h->saddr); in ip6_tnl_err()
558 if (!t) in ip6_tnl_err()
561 tproto = ACCESS_ONCE(t->parms.proto); in ip6_tnl_err()
573 t->parms.name); in ip6_tnl_err()
579 t->parms.name); in ip6_tnl_err()
592 t->parms.name); in ip6_tnl_err()
597 t->parms.name); in ip6_tnl_err()
604 t->dev->mtu = mtu; in ip6_tnl_err()
775 static int ip4ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in ip4ip6_dscp_ecn_decapsulate() argument
781 if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) in ip4ip6_dscp_ecn_decapsulate()
787 static int ip6ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in ip6ip6_dscp_ecn_decapsulate() argument
791 if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) in ip6ip6_dscp_ecn_decapsulate()
797 __u32 ip6_tnl_get_cap(struct ip6_tnl *t, in ip6_tnl_get_cap() argument
801 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_get_cap()
822 int ip6_tnl_rcv_ctl(struct ip6_tnl *t, in ip6_tnl_rcv_ctl() argument
826 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_rcv_ctl()
828 struct net *net = t->net; in ip6_tnl_rcv_ctl()
832 (ip6_tnl_get_cap(t, laddr, raddr) & IP6_TNL_F_CAP_RCV))) { in ip6_tnl_rcv_ctl()
858 int (*dscp_ecn_decapsulate)(const struct ip6_tnl *t, in ip6_tnl_rcv() argument
862 struct ip6_tnl *t; in ip6_tnl_rcv() local
868 t = ip6_tnl_lookup(dev_net(skb->dev), &ipv6h->saddr, &ipv6h->daddr); in ip6_tnl_rcv()
869 if (t) { in ip6_tnl_rcv()
872 tproto = ACCESS_ONCE(t->parms.proto); in ip6_tnl_rcv()
883 if (!ip6_tnl_rcv_ctl(t, &ipv6h->daddr, &ipv6h->saddr)) { in ip6_tnl_rcv()
884 t->dev->stats.rx_dropped++; in ip6_tnl_rcv()
893 __skb_tunnel_rx(skb, t->dev, t->net); in ip6_tnl_rcv()
895 err = dscp_ecn_decapsulate(t, ipv6h, skb); in ip6_tnl_rcv()
902 ++t->dev->stats.rx_frame_errors; in ip6_tnl_rcv()
903 ++t->dev->stats.rx_errors; in ip6_tnl_rcv()
909 tstats = this_cpu_ptr(t->dev->tstats); in ip6_tnl_rcv()
974 ip6_tnl_addr_conflict(const struct ip6_tnl *t, const struct ipv6hdr *hdr) in ip6_tnl_addr_conflict() argument
976 return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr); in ip6_tnl_addr_conflict()
979 int ip6_tnl_xmit_ctl(struct ip6_tnl *t, in ip6_tnl_xmit_ctl() argument
983 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_xmit_ctl()
985 struct net *net = t->net; in ip6_tnl_xmit_ctl()
989 (ip6_tnl_get_cap(t, laddr, raddr) & IP6_TNL_F_CAP_XMIT))) { in ip6_tnl_xmit_ctl()
1037 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_xmit2() local
1038 struct net *net = t->net; in ip6_tnl_xmit2()
1039 struct net_device_stats *stats = &t->dev->stats; in ip6_tnl_xmit2()
1050 if (ipv6_addr_any(&t->parms.raddr)) { in ip6_tnl_xmit2()
1072 dst = ip6_tnl_dst_get(t); in ip6_tnl_xmit2()
1074 if (!ip6_tnl_xmit_ctl(t, &fl6->saddr, &fl6->daddr)) in ip6_tnl_xmit2()
1096 t->parms.name); in ip6_tnl_xmit2()
1114 skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev))); in ip6_tnl_xmit2()
1136 ip6_tnl_dst_set(t, ndst); in ip6_tnl_xmit2()
1157 ipv6h->hop_limit = t->parms.hop_limit; in ip6_tnl_xmit2()
1174 struct ip6_tnl *t = netdev_priv(dev); in ip4ip6_tnl_xmit() local
1185 tproto = ACCESS_ONCE(t->parms.proto); in ip4ip6_tnl_xmit()
1189 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip4ip6_tnl_xmit()
1190 encap_limit = t->parms.encap_limit; in ip4ip6_tnl_xmit()
1192 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip4ip6_tnl_xmit()
1197 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ip4ip6_tnl_xmit()
1200 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ip4ip6_tnl_xmit()
1218 struct ip6_tnl *t = netdev_priv(dev); in ip6ip6_tnl_xmit() local
1228 tproto = ACCESS_ONCE(t->parms.proto); in ip6ip6_tnl_xmit()
1230 ip6_tnl_addr_conflict(t, ipv6h)) in ip6ip6_tnl_xmit()
1243 } else if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6ip6_tnl_xmit()
1244 encap_limit = t->parms.encap_limit; in ip6ip6_tnl_xmit()
1246 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip6ip6_tnl_xmit()
1250 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ip6ip6_tnl_xmit()
1252 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) in ip6ip6_tnl_xmit()
1254 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ip6ip6_tnl_xmit()
1270 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_xmit() local
1271 struct net_device_stats *stats = &t->dev->stats; in ip6_tnl_xmit()
1297 static void ip6_tnl_link_config(struct ip6_tnl *t) in ip6_tnl_link_config() argument
1299 struct net_device *dev = t->dev; in ip6_tnl_link_config()
1300 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_link_config()
1301 struct flowi6 *fl6 = &t->fl.u.ip6; in ip6_tnl_link_config()
1318 p->flags |= ip6_tnl_get_cap(t, &p->laddr, &p->raddr); in ip6_tnl_link_config()
1329 struct rt6_info *rt = rt6_lookup(t->net, in ip6_tnl_link_config()
1341 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6_tnl_link_config()
1361 ip6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p) in ip6_tnl_change() argument
1363 t->parms.laddr = p->laddr; in ip6_tnl_change()
1364 t->parms.raddr = p->raddr; in ip6_tnl_change()
1365 t->parms.flags = p->flags; in ip6_tnl_change()
1366 t->parms.hop_limit = p->hop_limit; in ip6_tnl_change()
1367 t->parms.encap_limit = p->encap_limit; in ip6_tnl_change()
1368 t->parms.flowinfo = p->flowinfo; in ip6_tnl_change()
1369 t->parms.link = p->link; in ip6_tnl_change()
1370 t->parms.proto = p->proto; in ip6_tnl_change()
1371 ip6_tnl_dst_reset(t); in ip6_tnl_change()
1372 ip6_tnl_link_config(t); in ip6_tnl_change()
1376 static int ip6_tnl_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) in ip6_tnl_update() argument
1378 struct net *net = t->net; in ip6_tnl_update()
1382 ip6_tnl_unlink(ip6n, t); in ip6_tnl_update()
1384 err = ip6_tnl_change(t, p); in ip6_tnl_update()
1385 ip6_tnl_link(ip6n, t); in ip6_tnl_update()
1386 netdev_state_change(t->dev); in ip6_tnl_update()
1390 static int ip6_tnl0_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) in ip6_tnl0_update() argument
1393 t->parms.proto = p->proto; in ip6_tnl0_update()
1394 netdev_state_change(t->dev); in ip6_tnl0_update()
1460 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_ioctl() local
1461 struct net *net = t->net; in ip6_tnl_ioctl()
1472 t = ip6_tnl_locate(net, &p1, 0); in ip6_tnl_ioctl()
1473 if (IS_ERR(t)) in ip6_tnl_ioctl()
1474 t = netdev_priv(dev); in ip6_tnl_ioctl()
1478 ip6_tnl_parm_to_user(&p, &t->parms); in ip6_tnl_ioctl()
1496 t = ip6_tnl_locate(net, &p1, cmd == SIOCADDTUNNEL); in ip6_tnl_ioctl()
1498 if (!IS_ERR(t)) { in ip6_tnl_ioctl()
1499 if (t->dev != dev) { in ip6_tnl_ioctl()
1504 t = netdev_priv(dev); in ip6_tnl_ioctl()
1506 err = ip6_tnl0_update(t, &p1); in ip6_tnl_ioctl()
1508 err = ip6_tnl_update(t, &p1); in ip6_tnl_ioctl()
1510 if (!IS_ERR(t)) { in ip6_tnl_ioctl()
1512 ip6_tnl_parm_to_user(&p, &t->parms); in ip6_tnl_ioctl()
1517 err = PTR_ERR(t); in ip6_tnl_ioctl()
1531 t = ip6_tnl_locate(net, &p1, 0); in ip6_tnl_ioctl()
1532 if (IS_ERR(t)) in ip6_tnl_ioctl()
1535 if (t->dev == ip6n->fb_tnl_dev) in ip6_tnl_ioctl()
1537 dev = t->dev; in ip6_tnl_ioctl()
1578 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_get_iflink() local
1580 return t->parms.link; in ip6_tnl_get_iflink()
1605 struct ip6_tnl *t; in ip6_tnl_dev_setup() local
1613 t = netdev_priv(dev); in ip6_tnl_dev_setup()
1614 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6_tnl_dev_setup()
1633 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_init_gen() local
1636 t->dev = dev; in ip6_tnl_dev_init_gen()
1637 t->net = dev_net(dev); in ip6_tnl_dev_init_gen()
1642 ret = ip6_tnl_dst_init(t); in ip6_tnl_dev_init_gen()
1659 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_init() local
1664 ip6_tnl_link_config(t); in ip6_tnl_dev_init()
1677 struct ip6_tnl *t = netdev_priv(dev); in ip6_fb_tnl_dev_init() local
1681 t->parms.proto = IPPROTO_IPV6; in ip6_fb_tnl_dev_init()
1684 rcu_assign_pointer(ip6n->tnls_wc[0], t); in ip6_fb_tnl_dev_init()
1741 struct ip6_tnl *nt, *t; in ip6_tnl_newlink() local
1746 t = ip6_tnl_locate(net, &nt->parms, 0); in ip6_tnl_newlink()
1747 if (!IS_ERR(t)) in ip6_tnl_newlink()
1756 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_changelink() local
1758 struct net *net = t->net; in ip6_tnl_changelink()
1766 t = ip6_tnl_locate(net, &p, 0); in ip6_tnl_changelink()
1767 if (!IS_ERR(t)) { in ip6_tnl_changelink()
1768 if (t->dev != dev) in ip6_tnl_changelink()
1771 t = netdev_priv(dev); in ip6_tnl_changelink()
1773 return ip6_tnl_update(t, &p); in ip6_tnl_changelink()
1878 struct ip6_tnl *t; in ip6_tnl_destroy_tunnels() local
1886 t = rtnl_dereference(ip6n->tnls_r_l[h]); in ip6_tnl_destroy_tunnels()
1887 while (t) { in ip6_tnl_destroy_tunnels()
1891 if (!net_eq(dev_net(t->dev), net)) in ip6_tnl_destroy_tunnels()
1892 unregister_netdevice_queue(t->dev, &list); in ip6_tnl_destroy_tunnels()
1893 t = rtnl_dereference(t->next); in ip6_tnl_destroy_tunnels()
1903 struct ip6_tnl *t = NULL; in ip6_tnl_init_net() local
1930 t = netdev_priv(ip6n->fb_tnl_dev); in ip6_tnl_init_net()
1932 strcpy(t->parms.name, ip6n->fb_tnl_dev->name); in ip6_tnl_init_net()