提交 8b57fd1e 编写于 作者: G Gao Feng 提交者: David S. Miller

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: NGao Feng <fgao@ikuai8.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 81663bee
...@@ -1192,6 +1192,18 @@ static int inet_gifconf(struct net_device *dev, char __user *buf, int len) ...@@ -1192,6 +1192,18 @@ static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
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 @@ __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope) ...@@ -1228,14 +1240,10 @@ __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
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 @@ __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope) ...@@ -1249,14 +1257,10 @@ __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册