|
@@ -1057,6 +1057,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
|
|
|
fi->fib_priority = cfg->fc_priority;
|
|
|
fi->fib_prefsrc = cfg->fc_prefsrc;
|
|
|
fi->fib_type = cfg->fc_type;
|
|
|
+ fi->fib_tb_id = cfg->fc_table;
|
|
|
|
|
|
fi->fib_nhs = nhs;
|
|
|
change_nexthops(fi) {
|
|
@@ -1337,18 +1338,21 @@ nla_put_failure:
|
|
|
* referring to it.
|
|
|
* - device went down -> we must shutdown all nexthops going via it.
|
|
|
*/
|
|
|
-int fib_sync_down_addr(struct net *net, __be32 local)
|
|
|
+int fib_sync_down_addr(struct net_device *dev, __be32 local)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
unsigned int hash = fib_laddr_hashfn(local);
|
|
|
struct hlist_head *head = &fib_info_laddrhash[hash];
|
|
|
+ struct net *net = dev_net(dev);
|
|
|
+ int tb_id = l3mdev_fib_table(dev);
|
|
|
struct fib_info *fi;
|
|
|
|
|
|
if (!fib_info_laddrhash || local == 0)
|
|
|
return 0;
|
|
|
|
|
|
hlist_for_each_entry(fi, head, fib_lhash) {
|
|
|
- if (!net_eq(fi->fib_net, net))
|
|
|
+ if (!net_eq(fi->fib_net, net) ||
|
|
|
+ fi->fib_tb_id != tb_id)
|
|
|
continue;
|
|
|
if (fi->fib_prefsrc == local) {
|
|
|
fi->fib_flags |= RTNH_F_DEAD;
|