Lines Matching refs:t

129 struct dst_entry *ip6_tnl_dst_check(struct ip6_tnl *t)  in ip6_tnl_dst_check()  argument
131 struct dst_entry *dst = t->dst_cache; in ip6_tnl_dst_check()
134 !dst->ops->check(dst, t->dst_cookie)) { in ip6_tnl_dst_check()
135 t->dst_cache = NULL; in ip6_tnl_dst_check()
144 void ip6_tnl_dst_reset(struct ip6_tnl *t) in ip6_tnl_dst_reset() argument
146 dst_release(t->dst_cache); in ip6_tnl_dst_reset()
147 t->dst_cache = NULL; in ip6_tnl_dst_reset()
151 void ip6_tnl_dst_store(struct ip6_tnl *t, struct dst_entry *dst) in ip6_tnl_dst_store() argument
154 t->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; in ip6_tnl_dst_store()
155 dst_release(t->dst_cache); in ip6_tnl_dst_store()
156 t->dst_cache = dst; in ip6_tnl_dst_store()
172 for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
178 struct ip6_tnl *t; in ip6_tnl_lookup() local
183 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_lookup()
184 ipv6_addr_equal(remote, &t->parms.raddr) && in ip6_tnl_lookup()
185 (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
186 return t; in ip6_tnl_lookup()
192 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_lookup()
193 (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
194 return t; in ip6_tnl_lookup()
199 if (ipv6_addr_equal(remote, &t->parms.raddr) && in ip6_tnl_lookup()
200 (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
201 return t; in ip6_tnl_lookup()
204 t = rcu_dereference(ip6n->tnls_wc[0]); in ip6_tnl_lookup()
205 if (t && (t->dev->flags & IFF_UP)) in ip6_tnl_lookup()
206 return t; in ip6_tnl_lookup()
243 ip6_tnl_link(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) in ip6_tnl_link() argument
245 struct ip6_tnl __rcu **tp = ip6_tnl_bucket(ip6n, &t->parms); in ip6_tnl_link()
247 rcu_assign_pointer(t->next , rtnl_dereference(*tp)); in ip6_tnl_link()
248 rcu_assign_pointer(*tp, t); in ip6_tnl_link()
257 ip6_tnl_unlink(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) in ip6_tnl_unlink() argument
262 for (tp = ip6_tnl_bucket(ip6n, &t->parms); in ip6_tnl_unlink()
265 if (t == iter) { in ip6_tnl_unlink()
266 rcu_assign_pointer(*tp, t->next); in ip6_tnl_unlink()
280 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_create2() local
285 t = netdev_priv(dev); in ip6_tnl_create2()
291 strcpy(t->parms.name, dev->name); in ip6_tnl_create2()
295 ip6_tnl_link(ip6n, t); in ip6_tnl_create2()
317 struct ip6_tnl *t; in ip6_tnl_create() local
326 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, in ip6_tnl_create()
333 t = netdev_priv(dev); in ip6_tnl_create()
334 t->parms = *p; in ip6_tnl_create()
335 t->net = dev_net(dev); in ip6_tnl_create()
340 return t; in ip6_tnl_create()
368 struct ip6_tnl *t; in ip6_tnl_locate() local
372 (t = rtnl_dereference(*tp)) != NULL; in ip6_tnl_locate()
373 tp = &t->next) { in ip6_tnl_locate()
374 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6_tnl_locate()
375 ipv6_addr_equal(remote, &t->parms.raddr)) { in ip6_tnl_locate()
379 return t; in ip6_tnl_locate()
398 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_uninit() local
399 struct net *net = t->net; in ip6_tnl_dev_uninit()
405 ip6_tnl_unlink(ip6n, t); in ip6_tnl_dev_uninit()
406 ip6_tnl_dst_reset(t); in ip6_tnl_dev_uninit()
484 struct ip6_tnl *t; in ip6_tnl_err() local
498 t = ip6_tnl_lookup(dev_net(skb->dev), &ipv6h->daddr, &ipv6h->saddr); in ip6_tnl_err()
499 if (!t) in ip6_tnl_err()
502 tproto = ACCESS_ONCE(t->parms.proto); in ip6_tnl_err()
514 t->parms.name); in ip6_tnl_err()
520 t->parms.name); in ip6_tnl_err()
533 t->parms.name); in ip6_tnl_err()
538 t->parms.name); in ip6_tnl_err()
545 t->dev->mtu = mtu; in ip6_tnl_err()
716 static int ip4ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in ip4ip6_dscp_ecn_decapsulate() argument
722 if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) in ip4ip6_dscp_ecn_decapsulate()
728 static int ip6ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t, in ip6ip6_dscp_ecn_decapsulate() argument
732 if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) in ip6ip6_dscp_ecn_decapsulate()
738 __u32 ip6_tnl_get_cap(struct ip6_tnl *t, in ip6_tnl_get_cap() argument
742 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_get_cap()
763 int ip6_tnl_rcv_ctl(struct ip6_tnl *t, in ip6_tnl_rcv_ctl() argument
767 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_rcv_ctl()
769 struct net *net = t->net; in ip6_tnl_rcv_ctl()
773 (ip6_tnl_get_cap(t, laddr, raddr) & IP6_TNL_F_CAP_RCV))) { in ip6_tnl_rcv_ctl()
799 int (*dscp_ecn_decapsulate)(const struct ip6_tnl *t, in ip6_tnl_rcv() argument
803 struct ip6_tnl *t; in ip6_tnl_rcv() local
809 t = ip6_tnl_lookup(dev_net(skb->dev), &ipv6h->saddr, &ipv6h->daddr); in ip6_tnl_rcv()
810 if (t) { in ip6_tnl_rcv()
813 tproto = ACCESS_ONCE(t->parms.proto); in ip6_tnl_rcv()
824 if (!ip6_tnl_rcv_ctl(t, &ipv6h->daddr, &ipv6h->saddr)) { in ip6_tnl_rcv()
825 t->dev->stats.rx_dropped++; in ip6_tnl_rcv()
834 __skb_tunnel_rx(skb, t->dev, t->net); in ip6_tnl_rcv()
836 err = dscp_ecn_decapsulate(t, ipv6h, skb); in ip6_tnl_rcv()
843 ++t->dev->stats.rx_frame_errors; in ip6_tnl_rcv()
844 ++t->dev->stats.rx_errors; in ip6_tnl_rcv()
850 tstats = this_cpu_ptr(t->dev->tstats); in ip6_tnl_rcv()
915 ip6_tnl_addr_conflict(const struct ip6_tnl *t, const struct ipv6hdr *hdr) in ip6_tnl_addr_conflict() argument
917 return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr); in ip6_tnl_addr_conflict()
920 int ip6_tnl_xmit_ctl(struct ip6_tnl *t, in ip6_tnl_xmit_ctl() argument
924 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_xmit_ctl()
926 struct net *net = t->net; in ip6_tnl_xmit_ctl()
930 (ip6_tnl_get_cap(t, laddr, raddr) & IP6_TNL_F_CAP_XMIT))) { in ip6_tnl_xmit_ctl()
978 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_xmit2() local
979 struct net *net = t->net; in ip6_tnl_xmit2()
980 struct net_device_stats *stats = &t->dev->stats; in ip6_tnl_xmit2()
991 if (ipv6_addr_any(&t->parms.raddr)) { in ip6_tnl_xmit2()
1013 dst = ip6_tnl_dst_check(t); in ip6_tnl_xmit2()
1015 if (!ip6_tnl_xmit_ctl(t, &fl6->saddr, &fl6->daddr)) in ip6_tnl_xmit2()
1037 t->parms.name); in ip6_tnl_xmit2()
1055 skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev))); in ip6_tnl_xmit2()
1099 ipv6h->hop_limit = t->parms.hop_limit; in ip6_tnl_xmit2()
1105 ip6_tnl_dst_store(t, ndst); in ip6_tnl_xmit2()
1118 struct ip6_tnl *t = netdev_priv(dev); in ip4ip6_tnl_xmit() local
1127 tproto = ACCESS_ONCE(t->parms.proto); in ip4ip6_tnl_xmit()
1131 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip4ip6_tnl_xmit()
1132 encap_limit = t->parms.encap_limit; in ip4ip6_tnl_xmit()
1134 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip4ip6_tnl_xmit()
1139 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ip4ip6_tnl_xmit()
1142 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ip4ip6_tnl_xmit()
1160 struct ip6_tnl *t = netdev_priv(dev); in ip6ip6_tnl_xmit() local
1170 tproto = ACCESS_ONCE(t->parms.proto); in ip6ip6_tnl_xmit()
1172 ip6_tnl_addr_conflict(t, ipv6h)) in ip6ip6_tnl_xmit()
1185 } else if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6ip6_tnl_xmit()
1186 encap_limit = t->parms.encap_limit; in ip6ip6_tnl_xmit()
1188 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip6ip6_tnl_xmit()
1192 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ip6ip6_tnl_xmit()
1194 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) in ip6ip6_tnl_xmit()
1196 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ip6ip6_tnl_xmit()
1212 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_xmit() local
1213 struct net_device_stats *stats = &t->dev->stats; in ip6_tnl_xmit()
1239 static void ip6_tnl_link_config(struct ip6_tnl *t) in ip6_tnl_link_config() argument
1241 struct net_device *dev = t->dev; in ip6_tnl_link_config()
1242 struct __ip6_tnl_parm *p = &t->parms; in ip6_tnl_link_config()
1243 struct flowi6 *fl6 = &t->fl.u.ip6; in ip6_tnl_link_config()
1260 p->flags |= ip6_tnl_get_cap(t, &p->laddr, &p->raddr); in ip6_tnl_link_config()
1271 struct rt6_info *rt = rt6_lookup(t->net, in ip6_tnl_link_config()
1283 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6_tnl_link_config()
1303 ip6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p) in ip6_tnl_change() argument
1305 t->parms.laddr = p->laddr; in ip6_tnl_change()
1306 t->parms.raddr = p->raddr; in ip6_tnl_change()
1307 t->parms.flags = p->flags; in ip6_tnl_change()
1308 t->parms.hop_limit = p->hop_limit; in ip6_tnl_change()
1309 t->parms.encap_limit = p->encap_limit; in ip6_tnl_change()
1310 t->parms.flowinfo = p->flowinfo; in ip6_tnl_change()
1311 t->parms.link = p->link; in ip6_tnl_change()
1312 t->parms.proto = p->proto; in ip6_tnl_change()
1313 ip6_tnl_dst_reset(t); in ip6_tnl_change()
1314 ip6_tnl_link_config(t); in ip6_tnl_change()
1318 static int ip6_tnl_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) in ip6_tnl_update() argument
1320 struct net *net = t->net; in ip6_tnl_update()
1324 ip6_tnl_unlink(ip6n, t); in ip6_tnl_update()
1326 err = ip6_tnl_change(t, p); in ip6_tnl_update()
1327 ip6_tnl_link(ip6n, t); in ip6_tnl_update()
1328 netdev_state_change(t->dev); in ip6_tnl_update()
1332 static int ip6_tnl0_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) in ip6_tnl0_update() argument
1335 t->parms.proto = p->proto; in ip6_tnl0_update()
1336 netdev_state_change(t->dev); in ip6_tnl0_update()
1402 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_ioctl() local
1403 struct net *net = t->net; in ip6_tnl_ioctl()
1414 t = ip6_tnl_locate(net, &p1, 0); in ip6_tnl_ioctl()
1415 if (IS_ERR(t)) in ip6_tnl_ioctl()
1416 t = netdev_priv(dev); in ip6_tnl_ioctl()
1420 ip6_tnl_parm_to_user(&p, &t->parms); in ip6_tnl_ioctl()
1438 t = ip6_tnl_locate(net, &p1, cmd == SIOCADDTUNNEL); in ip6_tnl_ioctl()
1440 if (!IS_ERR(t)) { in ip6_tnl_ioctl()
1441 if (t->dev != dev) { in ip6_tnl_ioctl()
1446 t = netdev_priv(dev); in ip6_tnl_ioctl()
1448 err = ip6_tnl0_update(t, &p1); in ip6_tnl_ioctl()
1450 err = ip6_tnl_update(t, &p1); in ip6_tnl_ioctl()
1452 if (!IS_ERR(t)) { in ip6_tnl_ioctl()
1454 ip6_tnl_parm_to_user(&p, &t->parms); in ip6_tnl_ioctl()
1459 err = PTR_ERR(t); in ip6_tnl_ioctl()
1473 t = ip6_tnl_locate(net, &p1, 0); in ip6_tnl_ioctl()
1474 if (IS_ERR(t)) in ip6_tnl_ioctl()
1477 if (t->dev == ip6n->fb_tnl_dev) in ip6_tnl_ioctl()
1479 dev = t->dev; in ip6_tnl_ioctl()
1520 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_get_iflink() local
1522 return t->parms.link; in ip6_tnl_get_iflink()
1547 struct ip6_tnl *t; in ip6_tnl_dev_setup() local
1555 t = netdev_priv(dev); in ip6_tnl_dev_setup()
1556 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6_tnl_dev_setup()
1575 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_init_gen() local
1577 t->dev = dev; in ip6_tnl_dev_init_gen()
1578 t->net = dev_net(dev); in ip6_tnl_dev_init_gen()
1592 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_dev_init() local
1597 ip6_tnl_link_config(t); in ip6_tnl_dev_init()
1610 struct ip6_tnl *t = netdev_priv(dev); in ip6_fb_tnl_dev_init() local
1614 t->parms.proto = IPPROTO_IPV6; in ip6_fb_tnl_dev_init()
1617 rcu_assign_pointer(ip6n->tnls_wc[0], t); in ip6_fb_tnl_dev_init()
1674 struct ip6_tnl *nt, *t; in ip6_tnl_newlink() local
1679 t = ip6_tnl_locate(net, &nt->parms, 0); in ip6_tnl_newlink()
1680 if (!IS_ERR(t)) in ip6_tnl_newlink()
1689 struct ip6_tnl *t = netdev_priv(dev); in ip6_tnl_changelink() local
1691 struct net *net = t->net; in ip6_tnl_changelink()
1699 t = ip6_tnl_locate(net, &p, 0); in ip6_tnl_changelink()
1700 if (!IS_ERR(t)) { in ip6_tnl_changelink()
1701 if (t->dev != dev) in ip6_tnl_changelink()
1704 t = netdev_priv(dev); in ip6_tnl_changelink()
1706 return ip6_tnl_update(t, &p); in ip6_tnl_changelink()
1811 struct ip6_tnl *t; in ip6_tnl_destroy_tunnels() local
1819 t = rtnl_dereference(ip6n->tnls_r_l[h]); in ip6_tnl_destroy_tunnels()
1820 while (t) { in ip6_tnl_destroy_tunnels()
1824 if (!net_eq(dev_net(t->dev), net)) in ip6_tnl_destroy_tunnels()
1825 unregister_netdevice_queue(t->dev, &list); in ip6_tnl_destroy_tunnels()
1826 t = rtnl_dereference(t->next); in ip6_tnl_destroy_tunnels()
1836 struct ip6_tnl *t = NULL; in ip6_tnl_init_net() local
1863 t = netdev_priv(ip6n->fb_tnl_dev); in ip6_tnl_init_net()
1865 strcpy(t->parms.name, ip6n->fb_tnl_dev->name); in ip6_tnl_init_net()