Thread (15 messages) flat view 15 messages, 5 authors, 2020-08-13

Re: [PATCH net 1/2] ipv6: add ipv6_dev_find()

From: Xin Long <lucien.xin@gmail.com>
Date: 2020-08-07 07:19:13

On Thu, Aug 6, 2020 at 10:03 PM David Ahern [off-list ref] wrote:
On 8/6/20 2:55 AM, Xin Long wrote:
quoted
On Thu, Aug 6, 2020 at 10:50 AM Hideaki Yoshifuji
[off-list ref] wrote:
quoted
Hi,

2020年8月4日(火) 0:35 Xin Long [off-list ref]:
quoted
This is to add an ip_dev_find like function for ipv6, used to find
the dev by saddr.

It will be used by TIPC protocol. So also export it.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 include/net/addrconf.h |  2 ++
 net/ipv6/addrconf.c    | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 8418b7d..ba3f6c15 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -97,6 +97,8 @@ bool ipv6_chk_custom_prefix(const struct in6_addr *addr,

 int ipv6_chk_prefix(const struct in6_addr *addr, struct net_device *dev);

+struct net_device *ipv6_dev_find(struct net *net, const struct in6_addr *addr);
+
How do we handle link-local addresses?
This is what "if (!result)" branch meant to do:

+       if (!result) {
+               struct rt6_info *rt;
+
+               rt = rt6_lookup(net, addr, NULL, 0, NULL, 0);
+               if (rt) {
+                       dev = rt->dst.dev;
+                       ip6_rt_put(rt);
+               }
+       } else {
+               dev = result->idev->dev;
+       }
the stated purpose of this function is to find the netdevice to which an
address is attached. A route lookup should not be needed. Walking the
address hash list finds the address and hence the netdev or it does not.
Hi, David,
Sorry. it does. I misunderstood the code in __ip_dev_find().
I will delete the rt6_lookup() part from ipv6_dev_find().

Also for the compatibility, tipc part should change to:
@@ -741,10 +741,8 @@ static int tipc_udp_enable(struct net *net,
struct tipc_bearer *b,
                struct net_device *dev;

               dev = ipv6_dev_find(net, &local.ipv6);
               if (!dev)
                      ub->ifindex = dev->ifindex;

as when dev is not found from the hash list, it should fall back to
the old tipc code.

Ying, what do you think?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help