diff options
Diffstat (limited to 'include/net/ip_fib.h')
| -rw-r--r-- | include/net/ip_fib.h | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 09a819ee2151..5bd120e4bc0a 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h | |||
| @@ -222,16 +222,19 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id) | |||
| 222 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, | 222 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, |
| 223 | struct fib_result *res) | 223 | struct fib_result *res) |
| 224 | { | 224 | { |
| 225 | struct fib_table *table; | 225 | int err = -ENETUNREACH; |
| 226 | |||
| 227 | rcu_read_lock(); | ||
| 228 | |||
| 229 | if (!fib_table_lookup(fib_get_table(net, RT_TABLE_LOCAL), flp, res, | ||
| 230 | FIB_LOOKUP_NOREF) || | ||
| 231 | !fib_table_lookup(fib_get_table(net, RT_TABLE_MAIN), flp, res, | ||
| 232 | FIB_LOOKUP_NOREF)) | ||
| 233 | err = 0; | ||
| 226 | 234 | ||
| 227 | table = fib_get_table(net, RT_TABLE_LOCAL); | 235 | rcu_read_unlock(); |
| 228 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) | ||
| 229 | return 0; | ||
| 230 | 236 | ||
| 231 | table = fib_get_table(net, RT_TABLE_MAIN); | 237 | return err; |
| 232 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) | ||
| 233 | return 0; | ||
| 234 | return -ENETUNREACH; | ||
| 235 | } | 238 | } |
| 236 | 239 | ||
| 237 | #else /* CONFIG_IP_MULTIPLE_TABLES */ | 240 | #else /* CONFIG_IP_MULTIPLE_TABLES */ |
| @@ -247,20 +250,25 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp, | |||
| 247 | struct fib_result *res) | 250 | struct fib_result *res) |
| 248 | { | 251 | { |
| 249 | if (!net->ipv4.fib_has_custom_rules) { | 252 | if (!net->ipv4.fib_has_custom_rules) { |
| 253 | int err = -ENETUNREACH; | ||
| 254 | |||
| 255 | rcu_read_lock(); | ||
| 256 | |||
| 250 | res->tclassid = 0; | 257 | res->tclassid = 0; |
| 251 | if (net->ipv4.fib_local && | 258 | if ((net->ipv4.fib_local && |
| 252 | !fib_table_lookup(net->ipv4.fib_local, flp, res, | 259 | !fib_table_lookup(net->ipv4.fib_local, flp, res, |
| 253 | FIB_LOOKUP_NOREF)) | 260 | FIB_LOOKUP_NOREF)) || |
| 254 | return 0; | 261 | (net->ipv4.fib_main && |
| 255 | if (net->ipv4.fib_main && | 262 | !fib_table_lookup(net->ipv4.fib_main, flp, res, |
| 256 | !fib_table_lookup(net->ipv4.fib_main, flp, res, | 263 | FIB_LOOKUP_NOREF)) || |
| 257 | FIB_LOOKUP_NOREF)) | 264 | (net->ipv4.fib_default && |
| 258 | return 0; | 265 | !fib_table_lookup(net->ipv4.fib_default, flp, res, |
| 259 | if (net->ipv4.fib_default && | 266 | FIB_LOOKUP_NOREF))) |
| 260 | !fib_table_lookup(net->ipv4.fib_default, flp, res, | 267 | err = 0; |
| 261 | FIB_LOOKUP_NOREF)) | 268 | |
| 262 | return 0; | 269 | rcu_read_unlock(); |
| 263 | return -ENETUNREACH; | 270 | |
| 271 | return err; | ||
| 264 | } | 272 | } |
| 265 | return __fib_lookup(net, flp, res); | 273 | return __fib_lookup(net, flp, res); |
| 266 | } | 274 | } |
