tree: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git master head: e0ada51db907ed2db5d46ad7ff86a8b5df68e59b commit: a68886a691804d3f6d479ebf6825480fbafb6a00 [211/214] net/ipv6: Make from in rt6_info rcu protected reproduce: # apt-get install sparse git checkout a68886a691804d3f6d479ebf6825480fbafb6a00 make ARCH=x86_64 allmodconfig make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>) net/ipv6/route.c:2584:15: sparse: expression using sizeof(void) >> net/ipv6/route.c:3357:41: sparse: incorrect type in argument 2 (different >> address spaces) @@ expected struct fib6_info *ort @@ got struct >> fib6_info struct fib6_info *ort @@ net/ipv6/route.c:3357:41: expected struct fib6_info *ort net/ipv6/route.c:3357:41: got struct fib6_info [noderef] <asn:4>*from net/ipv6/route.c:1391:15: sparse: expression using sizeof(void) >> net/ipv6/route.c:1544:36: sparse: incorrect type in initializer (different >> address spaces) @@ expected struct fib6_info *from @@ got struct >> fib6_info struct fib6_info *from @@ net/ipv6/route.c:1544:36: expected struct fib6_info *from net/ipv6/route.c:1544:36: got struct fib6_info [noderef] <asn:4>*from net/ipv6/route.c:1589:36: sparse: incorrect type in initializer (different address spaces) @@ expected struct fib6_info *from @@ got struct fib6_info struct fib6_info *from @@ net/ipv6/route.c:1589:36: expected struct fib6_info *from net/ipv6/route.c:1589:36: got struct fib6_info [noderef] <asn:4>*from net/ipv6/route.c:1962:39: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [unsigned] [usertype] flow_label @@ got gned] [usertype] flow_label @@ net/ipv6/route.c:1962:39: expected unsigned int [unsigned] [usertype] flow_label net/ipv6/route.c:1962:39: got restricted __be32 net/ipv6/route.c:2304:15: sparse: expression using sizeof(void) net/ipv6/route.c:3189:12: sparse: context imbalance in 'ip6_route_del' - wrong count at exit vim +3357 net/ipv6/route.c ^1da177e4 Linus Torvalds 2005-04-16 3250 6700c2709 David S. Miller 2012-07-17 3251 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb) a6279458c YOSHIFUJI Hideaki 2006-08-23 3252 { a6279458c YOSHIFUJI Hideaki 2006-08-23 3253 struct netevent_redirect netevent; e8599ff4b David S. Miller 2012-07-11 3254 struct rt6_info *rt, *nrt = NULL; e8599ff4b David S. Miller 2012-07-11 3255 struct ndisc_options ndopts; e8599ff4b David S. Miller 2012-07-11 3256 struct inet6_dev *in6_dev; e8599ff4b David S. Miller 2012-07-11 3257 struct neighbour *neigh; a68886a69 David Ahern 2018-04-20 3258 struct fib6_info *from; 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3259 struct rd_msg *msg; 6e157b6ac David S. Miller 2012-07-12 3260 int optlen, on_link; 6e157b6ac David S. Miller 2012-07-12 3261 u8 *lladdr; e8599ff4b David S. Miller 2012-07-11 3262 29a3cad5c Simon Horman 2013-05-28 3263 optlen = skb_tail_pointer(skb) - skb_transport_header(skb); 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3264 optlen -= sizeof(*msg); e8599ff4b David S. Miller 2012-07-11 3265 e8599ff4b David S. Miller 2012-07-11 3266 if (optlen < 0) { 6e157b6ac David S. Miller 2012-07-12 3267 net_dbg_ratelimited("rt6_do_redirect: packet too short\n"); e8599ff4b David S. Miller 2012-07-11 3268 return; e8599ff4b David S. Miller 2012-07-11 3269 } e8599ff4b David S. Miller 2012-07-11 3270 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3271 msg = (struct rd_msg *)icmp6_hdr(skb); e8599ff4b David S. Miller 2012-07-11 3272 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3273 if (ipv6_addr_is_multicast(&msg->dest)) { 6e157b6ac David S. Miller 2012-07-12 3274 net_dbg_ratelimited("rt6_do_redirect: destination address is multicast\n"); e8599ff4b David S. Miller 2012-07-11 3275 return; e8599ff4b David S. Miller 2012-07-11 3276 } e8599ff4b David S. Miller 2012-07-11 3277 6e157b6ac David S. Miller 2012-07-12 3278 on_link = 0; 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3279 if (ipv6_addr_equal(&msg->dest, &msg->target)) { e8599ff4b David S. Miller 2012-07-11 3280 on_link = 1; 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3281 } else if (ipv6_addr_type(&msg->target) != e8599ff4b David S. Miller 2012-07-11 3282 (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) { 6e157b6ac David S. Miller 2012-07-12 3283 net_dbg_ratelimited("rt6_do_redirect: target address is not link-local unicast\n"); e8599ff4b David S. Miller 2012-07-11 3284 return; e8599ff4b David S. Miller 2012-07-11 3285 } e8599ff4b David S. Miller 2012-07-11 3286 e8599ff4b David S. Miller 2012-07-11 3287 in6_dev = __in6_dev_get(skb->dev); e8599ff4b David S. Miller 2012-07-11 3288 if (!in6_dev) e8599ff4b David S. Miller 2012-07-11 3289 return; e8599ff4b David S. Miller 2012-07-11 3290 if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects) e8599ff4b David S. Miller 2012-07-11 3291 return; e8599ff4b David S. Miller 2012-07-11 3292 e8599ff4b David S. Miller 2012-07-11 3293 /* RFC2461 8.1: e8599ff4b David S. Miller 2012-07-11 3294 * The IP source address of the Redirect MUST be the same as the current e8599ff4b David S. Miller 2012-07-11 3295 * first-hop router for the specified ICMP Destination Address. e8599ff4b David S. Miller 2012-07-11 3296 */ e8599ff4b David S. Miller 2012-07-11 3297 f997c55c1 Alexander Aring 2016-06-15 3298 if (!ndisc_parse_options(skb->dev, msg->opt, optlen, &ndopts)) { e8599ff4b David S. Miller 2012-07-11 3299 net_dbg_ratelimited("rt6_redirect: invalid ND options\n"); e8599ff4b David S. Miller 2012-07-11 3300 return; e8599ff4b David S. Miller 2012-07-11 3301 } 6e157b6ac David S. Miller 2012-07-12 3302 6e157b6ac David S. Miller 2012-07-12 3303 lladdr = NULL; e8599ff4b David S. Miller 2012-07-11 3304 if (ndopts.nd_opts_tgt_lladdr) { e8599ff4b David S. Miller 2012-07-11 3305 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, e8599ff4b David S. Miller 2012-07-11 3306 skb->dev); e8599ff4b David S. Miller 2012-07-11 3307 if (!lladdr) { e8599ff4b David S. Miller 2012-07-11 3308 net_dbg_ratelimited("rt6_redirect: invalid link-layer address length\n"); e8599ff4b David S. Miller 2012-07-11 3309 return; e8599ff4b David S. Miller 2012-07-11 3310 } e8599ff4b David S. Miller 2012-07-11 3311 } e8599ff4b David S. Miller 2012-07-11 3312 6e157b6ac David S. Miller 2012-07-12 3313 rt = (struct rt6_info *) dst; ec13ad1d7 Matthias Schiffer 2015-11-02 3314 if (rt->rt6i_flags & RTF_REJECT) { 6e157b6ac David S. Miller 2012-07-12 3315 net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n"); e8599ff4b David S. Miller 2012-07-11 3316 return; 6e157b6ac David S. Miller 2012-07-12 3317 } e8599ff4b David S. Miller 2012-07-11 3318 6e157b6ac David S. Miller 2012-07-12 3319 /* Redirect received -> path was valid. 6e157b6ac David S. Miller 2012-07-12 3320 * Look, redirects are sent only in response to data packets, 6e157b6ac David S. Miller 2012-07-12 3321 * so that this nexthop apparently is reachable. --ANK 6e157b6ac David S. Miller 2012-07-12 3322 */ 0dec879f6 Julian Anastasov 2017-02-06 3323 dst_confirm_neigh(&rt->dst, &ipv6_hdr(skb)->saddr); a6279458c YOSHIFUJI Hideaki 2006-08-23 3324 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3325 neigh = __neigh_lookup(&nd_tbl, &msg->target, skb->dev, 1); 6e157b6ac David S. Miller 2012-07-12 3326 if (!neigh) 6e157b6ac David S. Miller 2012-07-12 3327 return; a6279458c YOSHIFUJI Hideaki 2006-08-23 3328 ^1da177e4 Linus Torvalds 2005-04-16 3329 /* ^1da177e4 Linus Torvalds 2005-04-16 3330 * We have finally decided to accept it. ^1da177e4 Linus Torvalds 2005-04-16 3331 */ ^1da177e4 Linus Torvalds 2005-04-16 3332 f997c55c1 Alexander Aring 2016-06-15 3333 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, ^1da177e4 Linus Torvalds 2005-04-16 3334 NEIGH_UPDATE_F_WEAK_OVERRIDE| ^1da177e4 Linus Torvalds 2005-04-16 3335 NEIGH_UPDATE_F_OVERRIDE| ^1da177e4 Linus Torvalds 2005-04-16 3336 (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER| f997c55c1 Alexander Aring 2016-06-15 3337 NEIGH_UPDATE_F_ISROUTER)), f997c55c1 Alexander Aring 2016-06-15 3338 NDISC_REDIRECT, &ndopts); ^1da177e4 Linus Torvalds 2005-04-16 3339 4d85cd0c2 David Ahern 2018-04-20 3340 rcu_read_lock(); a68886a69 David Ahern 2018-04-20 3341 from = rcu_dereference(rt->from); a68886a69 David Ahern 2018-04-20 3342 nrt = ip6_rt_cache_alloc(from, &msg->dest, NULL); 4d85cd0c2 David Ahern 2018-04-20 3343 rcu_read_unlock(); 383084739 David S. Miller 2011-12-03 3344 if (!nrt) ^1da177e4 Linus Torvalds 2005-04-16 3345 goto out; ^1da177e4 Linus Torvalds 2005-04-16 3346 ^1da177e4 Linus Torvalds 2005-04-16 3347 nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE; ^1da177e4 Linus Torvalds 2005-04-16 3348 if (on_link) ^1da177e4 Linus Torvalds 2005-04-16 3349 nrt->rt6i_flags &= ~RTF_GATEWAY; ^1da177e4 Linus Torvalds 2005-04-16 3350 4e3fd7a06 Alexey Dobriyan 2011-11-21 3351 nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key; ^1da177e4 Linus Torvalds 2005-04-16 3352 2b760fcf5 Wei Wang 2017-10-06 3353 /* No need to remove rt from the exception table if rt is 2b760fcf5 Wei Wang 2017-10-06 3354 * a cached route because rt6_insert_exception() will 2b760fcf5 Wei Wang 2017-10-06 3355 * takes care of it 2b760fcf5 Wei Wang 2017-10-06 3356 */ d4ead6b34 David Ahern 2018-04-17 @3357 if (rt6_insert_exception(nrt, rt->from)) { 2b760fcf5 Wei Wang 2017-10-06 3358 dst_release_immediate(&nrt->dst); 2b760fcf5 Wei Wang 2017-10-06 3359 goto out; 2b760fcf5 Wei Wang 2017-10-06 3360 } ^1da177e4 Linus Torvalds 2005-04-16 3361 d8d1f30b9 Changli Gao 2010-06-10 3362 netevent.old = &rt->dst; d8d1f30b9 Changli Gao 2010-06-10 3363 netevent.new = &nrt->dst; 71bcdba06 YOSHIFUJI Hideaki / 吉藤英明 2013-01-05 3364 netevent.daddr = &msg->dest; 605928337 YOSHIFUJI Hideaki / 吉藤英明 2013-01-14 3365 netevent.neigh = neigh; 8d71740c5 Tom Tucker 2006-07-30 3366 call_netevent_notifiers(NETEVENT_REDIRECT, &netevent); 8d71740c5 Tom Tucker 2006-07-30 3367 ^1da177e4 Linus Torvalds 2005-04-16 3368 out: e8599ff4b David S. Miller 2012-07-11 3369 neigh_release(neigh); 6e157b6ac David S. Miller 2012-07-12 3370 } 6e157b6ac David S. Miller 2012-07-12 3371 :::::: The code at line 3357 was first introduced by commit :::::: d4ead6b34b67fd711639324b6465a050bcb197d4 net/ipv6: move metrics from dst to rt6_info :::::: TO: David Ahern <dsah...@gmail.com> :::::: CC: David S. Miller <da...@davemloft.net> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation