net: Use passed in table for nexthop lookups
If a user passes in a table for new routes use that table for nexthop lookups. Specifically, this solves the case where a connected route does not exist in the main table, but only another table and then a subsequent route is added with a next hop using the connected route. ie., $ ip route ls default via 10.0.2.2 dev eth0 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 169.254.0.0/16 dev eth0 scope link metric 1003 192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.51 $ ip route ls table 10 1.1.1.0/24 dev eth2 scope link Without this patch adding a nexthop route fails: $ ip route add table 10 2.2.2.0/24 via 1.1.1.10 RTNETLINK answers: Network is unreachable With this patch the route is added successfully. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									021dd3b8a1
								
							
						
					
					
						commit
						3bfd847203
					
				| @ -691,6 +691,7 @@ static int fib_check_nh(struct fib_config *cfg, struct fib_info *fi, | |||||||
| 		} | 		} | ||||||
| 		rcu_read_lock(); | 		rcu_read_lock(); | ||||||
| 		{ | 		{ | ||||||
|  | 			struct fib_table *tbl = NULL; | ||||||
| 			struct flowi4 fl4 = { | 			struct flowi4 fl4 = { | ||||||
| 				.daddr = nh->nh_gw, | 				.daddr = nh->nh_gw, | ||||||
| 				.flowi4_scope = cfg->fc_scope + 1, | 				.flowi4_scope = cfg->fc_scope + 1, | ||||||
| @ -701,8 +702,16 @@ static int fib_check_nh(struct fib_config *cfg, struct fib_info *fi, | |||||||
| 			/* It is not necessary, but requires a bit of thinking */ | 			/* It is not necessary, but requires a bit of thinking */ | ||||||
| 			if (fl4.flowi4_scope < RT_SCOPE_LINK) | 			if (fl4.flowi4_scope < RT_SCOPE_LINK) | ||||||
| 				fl4.flowi4_scope = RT_SCOPE_LINK; | 				fl4.flowi4_scope = RT_SCOPE_LINK; | ||||||
| 			err = fib_lookup(net, &fl4, &res, | 
 | ||||||
| 					 FIB_LOOKUP_IGNORE_LINKSTATE); | 			if (cfg->fc_table) | ||||||
|  | 				tbl = fib_get_table(net, cfg->fc_table); | ||||||
|  | 
 | ||||||
|  | 			if (tbl) | ||||||
|  | 				err = fib_table_lookup(tbl, &fl4, &res, | ||||||
|  | 						   FIB_LOOKUP_IGNORE_LINKSTATE); | ||||||
|  | 			else | ||||||
|  | 				err = fib_lookup(net, &fl4, &res, | ||||||
|  | 						 FIB_LOOKUP_IGNORE_LINKSTATE); | ||||||
| 			if (err) { | 			if (err) { | ||||||
| 				rcu_read_unlock(); | 				rcu_read_unlock(); | ||||||
| 				return err; | 				return err; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user