Commit 4814bdbd authored by Denis V. Lunev's avatar Denis V. Lunev Committed by David S. Miller

[NETNS]: Lookup in FIB semantic hashes taking into account the namespace.

The namespace is not available in the fib_sync_down_addr, add it as a
parameter.

Looking up a device by the pointer to it is OK. Looking up using a
result from fib_trie/fib_hash table lookup is also safe. No need to
fix that at all.  So, just fix lookup by address and insertion to the
hash table path.
Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7462bd74
...@@ -220,7 +220,7 @@ extern void fib_select_default(struct net *net, const struct flowi *flp, ...@@ -220,7 +220,7 @@ extern void fib_select_default(struct net *net, const struct flowi *flp,
/* Exported by fib_semantics.c */ /* Exported by fib_semantics.c */
extern int ip_fib_check_default(__be32 gw, struct net_device *dev); extern int ip_fib_check_default(__be32 gw, struct net_device *dev);
extern int fib_sync_down_dev(struct net_device *dev, int force); extern int fib_sync_down_dev(struct net_device *dev, int force);
extern int fib_sync_down_addr(__be32 local); extern int fib_sync_down_addr(struct net *net, __be32 local);
extern int fib_sync_up(struct net_device *dev); extern int fib_sync_up(struct net_device *dev);
extern __be32 __fib_res_prefsrc(struct fib_result *res); extern __be32 __fib_res_prefsrc(struct fib_result *res);
extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res); extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
......
...@@ -808,7 +808,7 @@ static void fib_del_ifaddr(struct in_ifaddr *ifa) ...@@ -808,7 +808,7 @@ static void fib_del_ifaddr(struct in_ifaddr *ifa)
First of all, we scan fib_info list searching First of all, we scan fib_info list searching
for stray nexthop entries, then ignite fib_flush. for stray nexthop entries, then ignite fib_flush.
*/ */
if (fib_sync_down_addr(ifa->ifa_local)) if (fib_sync_down_addr(dev->nd_net, ifa->ifa_local))
fib_flush(dev->nd_net); fib_flush(dev->nd_net);
} }
} }
......
...@@ -229,6 +229,8 @@ static struct fib_info *fib_find_info(const struct fib_info *nfi) ...@@ -229,6 +229,8 @@ static struct fib_info *fib_find_info(const struct fib_info *nfi)
head = &fib_info_hash[hash]; head = &fib_info_hash[hash];
hlist_for_each_entry(fi, node, head, fib_hash) { hlist_for_each_entry(fi, node, head, fib_hash) {
if (fi->fib_net != nfi->fib_net)
continue;
if (fi->fib_nhs != nfi->fib_nhs) if (fi->fib_nhs != nfi->fib_nhs)
continue; continue;
if (nfi->fib_protocol == fi->fib_protocol && if (nfi->fib_protocol == fi->fib_protocol &&
...@@ -1031,7 +1033,7 @@ nla_put_failure: ...@@ -1031,7 +1033,7 @@ nla_put_failure:
referring to it. referring to it.
- device went down -> we must shutdown all nexthops going via it. - device went down -> we must shutdown all nexthops going via it.
*/ */
int fib_sync_down_addr(__be32 local) int fib_sync_down_addr(struct net *net, __be32 local)
{ {
int ret = 0; int ret = 0;
unsigned int hash = fib_laddr_hashfn(local); unsigned int hash = fib_laddr_hashfn(local);
...@@ -1043,6 +1045,8 @@ int fib_sync_down_addr(__be32 local) ...@@ -1043,6 +1045,8 @@ int fib_sync_down_addr(__be32 local)
return 0; return 0;
hlist_for_each_entry(fi, node, head, fib_lhash) { hlist_for_each_entry(fi, node, head, fib_lhash) {
if (fi->fib_net != net)
continue;
if (fi->fib_prefsrc == local) { if (fi->fib_prefsrc == local) {
fi->fib_flags |= RTNH_F_DEAD; fi->fib_flags |= RTNH_F_DEAD;
ret++; ret++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment