Lines Matching refs:t

78 static void ip6gre_tunnel_link(struct ip6gre_net *ign, struct ip6_tnl *t);
79 static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu);
122 struct ip6_tnl *t, *cand = NULL; in ip6gre_tunnel_lookup() local
128 for_each_ip_tunnel_rcu(t, ign->tunnels_r_l[h0 ^ h1]) { in ip6gre_tunnel_lookup()
129 if (!ipv6_addr_equal(local, &t->parms.laddr) || in ip6gre_tunnel_lookup()
130 !ipv6_addr_equal(remote, &t->parms.raddr) || in ip6gre_tunnel_lookup()
131 key != t->parms.i_key || in ip6gre_tunnel_lookup()
132 !(t->dev->flags & IFF_UP)) in ip6gre_tunnel_lookup()
135 if (t->dev->type != ARPHRD_IP6GRE && in ip6gre_tunnel_lookup()
136 t->dev->type != dev_type) in ip6gre_tunnel_lookup()
140 if (t->parms.link != link) in ip6gre_tunnel_lookup()
142 if (t->dev->type != dev_type) in ip6gre_tunnel_lookup()
145 return t; in ip6gre_tunnel_lookup()
148 cand = t; in ip6gre_tunnel_lookup()
153 for_each_ip_tunnel_rcu(t, ign->tunnels_r[h0 ^ h1]) { in ip6gre_tunnel_lookup()
154 if (!ipv6_addr_equal(remote, &t->parms.raddr) || in ip6gre_tunnel_lookup()
155 key != t->parms.i_key || in ip6gre_tunnel_lookup()
156 !(t->dev->flags & IFF_UP)) in ip6gre_tunnel_lookup()
159 if (t->dev->type != ARPHRD_IP6GRE && in ip6gre_tunnel_lookup()
160 t->dev->type != dev_type) in ip6gre_tunnel_lookup()
164 if (t->parms.link != link) in ip6gre_tunnel_lookup()
166 if (t->dev->type != dev_type) in ip6gre_tunnel_lookup()
169 return t; in ip6gre_tunnel_lookup()
172 cand = t; in ip6gre_tunnel_lookup()
177 for_each_ip_tunnel_rcu(t, ign->tunnels_l[h1]) { in ip6gre_tunnel_lookup()
178 if ((!ipv6_addr_equal(local, &t->parms.laddr) && in ip6gre_tunnel_lookup()
179 (!ipv6_addr_equal(local, &t->parms.raddr) || in ip6gre_tunnel_lookup()
181 key != t->parms.i_key || in ip6gre_tunnel_lookup()
182 !(t->dev->flags & IFF_UP)) in ip6gre_tunnel_lookup()
185 if (t->dev->type != ARPHRD_IP6GRE && in ip6gre_tunnel_lookup()
186 t->dev->type != dev_type) in ip6gre_tunnel_lookup()
190 if (t->parms.link != link) in ip6gre_tunnel_lookup()
192 if (t->dev->type != dev_type) in ip6gre_tunnel_lookup()
195 return t; in ip6gre_tunnel_lookup()
198 cand = t; in ip6gre_tunnel_lookup()
203 for_each_ip_tunnel_rcu(t, ign->tunnels_wc[h1]) { in ip6gre_tunnel_lookup()
204 if (t->parms.i_key != key || in ip6gre_tunnel_lookup()
205 !(t->dev->flags & IFF_UP)) in ip6gre_tunnel_lookup()
208 if (t->dev->type != ARPHRD_IP6GRE && in ip6gre_tunnel_lookup()
209 t->dev->type != dev_type) in ip6gre_tunnel_lookup()
213 if (t->parms.link != link) in ip6gre_tunnel_lookup()
215 if (t->dev->type != dev_type) in ip6gre_tunnel_lookup()
218 return t; in ip6gre_tunnel_lookup()
221 cand = t; in ip6gre_tunnel_lookup()
255 const struct ip6_tnl *t) in ip6gre_bucket() argument
257 return __ip6gre_bucket(ign, &t->parms); in ip6gre_bucket()
260 static void ip6gre_tunnel_link(struct ip6gre_net *ign, struct ip6_tnl *t) in ip6gre_tunnel_link() argument
262 struct ip6_tnl __rcu **tp = ip6gre_bucket(ign, t); in ip6gre_tunnel_link()
264 rcu_assign_pointer(t->next, rtnl_dereference(*tp)); in ip6gre_tunnel_link()
265 rcu_assign_pointer(*tp, t); in ip6gre_tunnel_link()
268 static void ip6gre_tunnel_unlink(struct ip6gre_net *ign, struct ip6_tnl *t) in ip6gre_tunnel_unlink() argument
273 for (tp = ip6gre_bucket(ign, t); in ip6gre_tunnel_unlink()
276 if (t == iter) { in ip6gre_tunnel_unlink()
277 rcu_assign_pointer(*tp, t->next); in ip6gre_tunnel_unlink()
291 struct ip6_tnl *t; in ip6gre_tunnel_find() local
296 (t = rtnl_dereference(*tp)) != NULL; in ip6gre_tunnel_find()
297 tp = &t->next) in ip6gre_tunnel_find()
298 if (ipv6_addr_equal(local, &t->parms.laddr) && in ip6gre_tunnel_find()
299 ipv6_addr_equal(remote, &t->parms.raddr) && in ip6gre_tunnel_find()
300 key == t->parms.i_key && in ip6gre_tunnel_find()
301 link == t->parms.link && in ip6gre_tunnel_find()
302 type == t->dev->type) in ip6gre_tunnel_find()
305 return t; in ip6gre_tunnel_find()
311 struct ip6_tnl *t, *nt; in ip6gre_tunnel_locate() local
316 t = ip6gre_tunnel_find(net, parms, ARPHRD_IP6GRE); in ip6gre_tunnel_locate()
317 if (t && create) in ip6gre_tunnel_locate()
319 if (t || !create) in ip6gre_tunnel_locate()
320 return t; in ip6gre_tunnel_locate()
327 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, in ip6gre_tunnel_locate()
360 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_tunnel_uninit() local
361 struct ip6gre_net *ign = net_generic(t->net, ip6gre_net_id); in ip6gre_tunnel_uninit()
363 ip6gre_tunnel_unlink(ign, t); in ip6gre_tunnel_uninit()
364 ip6_tnl_dst_reset(t); in ip6gre_tunnel_uninit()
375 struct ip6_tnl *t; in ip6gre_err() local
395 t = ip6gre_tunnel_lookup(skb->dev, &ipv6h->daddr, &ipv6h->saddr, in ip6gre_err()
399 if (!t) in ip6gre_err()
408 t->parms.name); in ip6gre_err()
413 t->parms.name); in ip6gre_err()
425 t->parms.name); in ip6gre_err()
429 t->parms.name); in ip6gre_err()
436 t->dev->mtu = mtu; in ip6gre_err()
440 if (time_before(jiffies, t->err_time + IP6TUNNEL_ERR_TIMEO)) in ip6gre_err()
441 t->err_count++; in ip6gre_err()
443 t->err_count = 1; in ip6gre_err()
444 t->err_time = jiffies; in ip6gre_err()
778 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_xmit_ipv4() local
786 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6gre_xmit_ipv4()
787 encap_limit = t->parms.encap_limit; in ip6gre_xmit_ipv4()
789 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip6gre_xmit_ipv4()
794 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ip6gre_xmit_ipv4()
797 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ip6gre_xmit_ipv4()
814 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_xmit_ipv6() local
823 if (ipv6_addr_equal(&t->parms.raddr, &ipv6h->saddr)) in ip6gre_xmit_ipv6()
836 } else if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6gre_xmit_ipv6()
837 encap_limit = t->parms.encap_limit; in ip6gre_xmit_ipv6()
839 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip6gre_xmit_ipv6()
843 if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) in ip6gre_xmit_ipv6()
845 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) in ip6gre_xmit_ipv6()
847 if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) in ip6gre_xmit_ipv6()
874 static inline bool ip6gre_tnl_addr_conflict(const struct ip6_tnl *t, in ip6gre_tnl_addr_conflict() argument
877 return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr); in ip6gre_tnl_addr_conflict()
882 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_xmit_other() local
888 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6gre_xmit_other()
889 encap_limit = t->parms.encap_limit; in ip6gre_xmit_other()
891 memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); in ip6gre_xmit_other()
902 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_tunnel_xmit() local
903 struct net_device_stats *stats = &t->dev->stats; in ip6gre_tunnel_xmit()
906 if (!ip6_tnl_xmit_ctl(t, &t->parms.laddr, &t->parms.raddr)) in ip6gre_tunnel_xmit()
933 static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu) in ip6gre_tnl_link_config() argument
935 struct net_device *dev = t->dev; in ip6gre_tnl_link_config()
936 struct __ip6_tnl_parm *p = &t->parms; in ip6gre_tnl_link_config()
937 struct flowi6 *fl6 = &t->fl.u.ip6; in ip6gre_tnl_link_config()
957 p->flags |= ip6_tnl_get_cap(t, &p->laddr, &p->raddr); in ip6gre_tnl_link_config()
966 if (t->parms.o_flags&(GRE_CSUM|GRE_KEY|GRE_SEQ)) { in ip6gre_tnl_link_config()
967 if (t->parms.o_flags&GRE_CSUM) in ip6gre_tnl_link_config()
969 if (t->parms.o_flags&GRE_KEY) in ip6gre_tnl_link_config()
971 if (t->parms.o_flags&GRE_SEQ) in ip6gre_tnl_link_config()
974 t->hlen = addend; in ip6gre_tnl_link_config()
980 struct rt6_info *rt = rt6_lookup(t->net, in ip6gre_tnl_link_config()
992 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6gre_tnl_link_config()
1003 static int ip6gre_tnl_change(struct ip6_tnl *t, in ip6gre_tnl_change() argument
1006 t->parms.laddr = p->laddr; in ip6gre_tnl_change()
1007 t->parms.raddr = p->raddr; in ip6gre_tnl_change()
1008 t->parms.flags = p->flags; in ip6gre_tnl_change()
1009 t->parms.hop_limit = p->hop_limit; in ip6gre_tnl_change()
1010 t->parms.encap_limit = p->encap_limit; in ip6gre_tnl_change()
1011 t->parms.flowinfo = p->flowinfo; in ip6gre_tnl_change()
1012 t->parms.link = p->link; in ip6gre_tnl_change()
1013 t->parms.proto = p->proto; in ip6gre_tnl_change()
1014 t->parms.i_key = p->i_key; in ip6gre_tnl_change()
1015 t->parms.o_key = p->o_key; in ip6gre_tnl_change()
1016 t->parms.i_flags = p->i_flags; in ip6gre_tnl_change()
1017 t->parms.o_flags = p->o_flags; in ip6gre_tnl_change()
1018 ip6_tnl_dst_reset(t); in ip6gre_tnl_change()
1019 ip6gre_tnl_link_config(t, set_mtu); in ip6gre_tnl_change()
1064 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_tunnel_ioctl() local
1065 struct net *net = t->net; in ip6gre_tunnel_ioctl()
1076 t = ip6gre_tunnel_locate(net, &p1, 0); in ip6gre_tunnel_ioctl()
1077 if (!t) in ip6gre_tunnel_ioctl()
1078 t = netdev_priv(dev); in ip6gre_tunnel_ioctl()
1081 ip6gre_tnl_parm_to_user(&p, &t->parms); in ip6gre_tunnel_ioctl()
1106 t = ip6gre_tunnel_locate(net, &p1, cmd == SIOCADDTUNNEL); in ip6gre_tunnel_ioctl()
1109 if (t) { in ip6gre_tunnel_ioctl()
1110 if (t->dev != dev) { in ip6gre_tunnel_ioctl()
1115 t = netdev_priv(dev); in ip6gre_tunnel_ioctl()
1117 ip6gre_tunnel_unlink(ign, t); in ip6gre_tunnel_ioctl()
1119 ip6gre_tnl_change(t, &p1, 1); in ip6gre_tunnel_ioctl()
1120 ip6gre_tunnel_link(ign, t); in ip6gre_tunnel_ioctl()
1125 if (t) { in ip6gre_tunnel_ioctl()
1129 ip6gre_tnl_parm_to_user(&p, &t->parms); in ip6gre_tunnel_ioctl()
1147 t = ip6gre_tunnel_locate(net, &p1, 0); in ip6gre_tunnel_ioctl()
1148 if (!t) in ip6gre_tunnel_ioctl()
1151 if (t == netdev_priv(ign->fb_tunnel_dev)) in ip6gre_tunnel_ioctl()
1153 dev = t->dev; in ip6gre_tunnel_ioctl()
1180 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_header() local
1181 struct ipv6hdr *ipv6h = (struct ipv6hdr *)skb_push(skb, t->hlen); in ip6gre_header()
1186 t->fl.u.ip6.flowlabel, false)); in ip6gre_header()
1187 ipv6h->hop_limit = t->parms.hop_limit; in ip6gre_header()
1189 ipv6h->saddr = t->parms.laddr; in ip6gre_header()
1190 ipv6h->daddr = t->parms.raddr; in ip6gre_header()
1192 p[0] = t->parms.o_flags; in ip6gre_header()
1204 return t->hlen; in ip6gre_header()
1206 return -t->hlen; in ip6gre_header()
1231 struct ip6_tnl *t; in ip6gre_tunnel_setup() local
1239 t = netdev_priv(dev); in ip6gre_tunnel_setup()
1240 if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) in ip6gre_tunnel_setup()
1304 struct ip6_tnl *t; in ip6gre_destroy_tunnels() local
1306 t = rtnl_dereference(ign->tunnels[prio][h]); in ip6gre_destroy_tunnels()
1308 while (t) { in ip6gre_destroy_tunnels()
1312 if (!net_eq(dev_net(t->dev), net)) in ip6gre_destroy_tunnels()
1313 unregister_netdevice_queue(t->dev, in ip6gre_destroy_tunnels()
1315 t = rtnl_dereference(t->next); in ip6gre_destroy_tunnels()
1539 struct ip6_tnl *t, *nt = netdev_priv(dev); in ip6gre_changelink() local
1549 t = ip6gre_tunnel_locate(net, &p, 0); in ip6gre_changelink()
1551 if (t) { in ip6gre_changelink()
1552 if (t->dev != dev) in ip6gre_changelink()
1555 t = nt; in ip6gre_changelink()
1558 ip6gre_tunnel_unlink(ign, t); in ip6gre_changelink()
1559 ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]); in ip6gre_changelink()
1560 ip6gre_tunnel_link(ign, t); in ip6gre_changelink()
1605 struct ip6_tnl *t = netdev_priv(dev); in ip6gre_fill_info() local
1606 struct __ip6_tnl_parm *p = &t->parms; in ip6gre_fill_info()