net: Eliminate duplicated codes by creating one new function in_dev_select_addr

There are two duplicated loops codes which used to select right
address in current codes. Now eliminate these codes by creating
one new function in_dev_select_addr.

Signed-off-by: Gao Feng <fgao@ikuai8.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Gao Feng 2017-03-10 12:38:47 +08:00 коммит произвёл David S. Miller
Родитель 81663bee16
Коммит 8b57fd1ec1
1 изменённых файлов: 18 добавлений и 14 удалений

Просмотреть файл

@ -1192,6 +1192,18 @@ out:
return done; return done;
} }
static __be32 in_dev_select_addr(const struct in_device *in_dev,
int scope)
{
for_primary_ifa(in_dev) {
if (ifa->ifa_scope != RT_SCOPE_LINK &&
ifa->ifa_scope <= scope)
return ifa->ifa_local;
} endfor_ifa(in_dev);
return 0;
}
__be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope) __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
{ {
__be32 addr = 0; __be32 addr = 0;
@ -1228,14 +1240,10 @@ no_in_dev:
if (master_idx && if (master_idx &&
(dev = dev_get_by_index_rcu(net, master_idx)) && (dev = dev_get_by_index_rcu(net, master_idx)) &&
(in_dev = __in_dev_get_rcu(dev))) { (in_dev = __in_dev_get_rcu(dev))) {
for_primary_ifa(in_dev) { addr = in_dev_select_addr(in_dev, scope);
if (ifa->ifa_scope != RT_SCOPE_LINK && if (addr)
ifa->ifa_scope <= scope) {
addr = ifa->ifa_local;
goto out_unlock; goto out_unlock;
} }
} endfor_ifa(in_dev);
}
/* Not loopback addresses on loopback should be preferred /* Not loopback addresses on loopback should be preferred
in this case. It is important that lo is the first interface in this case. It is important that lo is the first interface
@ -1249,14 +1257,10 @@ no_in_dev:
if (!in_dev) if (!in_dev)
continue; continue;
for_primary_ifa(in_dev) { addr = in_dev_select_addr(in_dev, scope);
if (ifa->ifa_scope != RT_SCOPE_LINK && if (addr)
ifa->ifa_scope <= scope) {
addr = ifa->ifa_local;
goto out_unlock; goto out_unlock;
} }
} endfor_ifa(in_dev);
}
out_unlock: out_unlock:
rcu_read_unlock(); rcu_read_unlock();
return addr; return addr;