ipv6: some fixes for ipv6_dev_find()
This patch is to do 3 things for ipv6_dev_find():
As David A. noticed,
- rt6_lookup() is not really needed. Different from __ip_dev_find(),
ipv6_dev_find() doesn't have a compatibility problem, so remove it.
As Hideaki suggested,
- "valid" (non-tentative) check for the address is also needed.
ipv6_chk_addr() calls ipv6_chk_addr_and_flags(), which will
traverse the address hash list, but it's heavy to be called
inside ipv6_dev_find(). This patch is to reuse the code of
ipv6_chk_addr_and_flags() for ipv6_dev_find().
- dev parameter is passed into ipv6_dev_find(), as link-local
addresses from user space has sin6_scope_id set and the dev
lookup needs it.
Fixes: 81f6cb3122
("ipv6: add ipv6_dev_find()")
Suggested-by: YOSHIFUJI Hideaki <hideaki.yoshifuji@miraclelinux.com>
Reported-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
0410d07190
commit
4ef1a7cb08
@@ -660,6 +660,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
|
||||
struct udp_tunnel_sock_cfg tuncfg = {NULL};
|
||||
struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
|
||||
u8 node_id[NODE_ID_LEN] = {0,};
|
||||
struct net_device *dev;
|
||||
int rmcast = 0;
|
||||
|
||||
ub = kzalloc(sizeof(*ub), GFP_ATOMIC);
|
||||
@@ -714,8 +715,6 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
|
||||
rcu_assign_pointer(ub->bearer, b);
|
||||
tipc_udp_media_addr_set(&b->addr, &local);
|
||||
if (local.proto == htons(ETH_P_IP)) {
|
||||
struct net_device *dev;
|
||||
|
||||
dev = __ip_dev_find(net, local.ipv4.s_addr, false);
|
||||
if (!dev) {
|
||||
err = -ENODEV;
|
||||
@@ -738,9 +737,8 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
|
||||
b->mtu = b->media->mtu;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
} else if (local.proto == htons(ETH_P_IPV6)) {
|
||||
struct net_device *dev;
|
||||
|
||||
dev = ipv6_dev_find(net, &local.ipv6);
|
||||
dev = ub->ifindex ? __dev_get_by_index(net, ub->ifindex) : NULL;
|
||||
dev = ipv6_dev_find(net, &local.ipv6, dev);
|
||||
if (!dev) {
|
||||
err = -ENODEV;
|
||||
goto err;
|
||||
|
Reference in New Issue
Block a user