All of them are passed to inspect/copy out fields, none of the functions
writes to the struct.

This makes it easier to argue about code (in MP context).

For this to work, ifa_ifwithaddr(), ifa_ifwithdstaddr() and
ifaof_ifpforaddr() need const arguments as well (matching the behaviour).

Expand three satosin6() calls and use a local variable to be able to add
const and reduce duplication.

Builds and runs fine on sparc64.
Feedback? OK?
diff --git a/sys/net/if.c b/sys/net/if.c
index cdb43e83d15..d71927b9aa9 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1414,7 +1414,7 @@ if_congested(void)
  * Locate an interface based on a complete address.
  */
 struct ifaddr *
-ifa_ifwithaddr(struct sockaddr *addr, u_int rtableid)
+ifa_ifwithaddr(const struct sockaddr *addr, u_int rtableid)
 {
        struct ifnet *ifp;
        struct ifaddr *ifa;
@@ -1444,7 +1444,7 @@ ifa_ifwithaddr(struct sockaddr *addr, u_int rtableid)
  * Locate the point to point interface with a given destination address.
  */
 struct ifaddr *
-ifa_ifwithdstaddr(struct sockaddr *addr, u_int rdomain)
+ifa_ifwithdstaddr(const struct sockaddr *addr, u_int rdomain)
 {
        struct ifnet *ifp;
        struct ifaddr *ifa;
@@ -1475,11 +1475,11 @@ ifa_ifwithdstaddr(struct sockaddr *addr, u_int rdomain)
  * a given address.
  */
 struct ifaddr *
-ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
+ifaof_ifpforaddr(const struct sockaddr *addr, struct ifnet *ifp)
 {
        struct ifaddr *ifa;
-       char *cp, *cp2, *cp3;
-       char *cplim;
+       const char *cp, *cp2, *cp3;
+       const char *cplim;
        struct ifaddr *ifa_maybe = NULL;
        u_int af = addr->sa_family;
 
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index 400afd319b0..f511af7dfbd 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -330,9 +330,9 @@ void        p2p_rtrequest(struct ifnet *, int, struct 
rtentry *);
 void   p2p_input(struct ifnet *, struct mbuf *);
 int    p2p_bpf_mtap(caddr_t, const struct mbuf *, u_int);
 
-struct ifaddr *ifa_ifwithaddr(struct sockaddr *, u_int);
-struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *, u_int);
-struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *);
+struct ifaddr *ifa_ifwithaddr(const struct sockaddr *, u_int);
+struct ifaddr *ifa_ifwithdstaddr(const struct sockaddr *, u_int);
+struct ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
 void   ifafree(struct ifaddr *);
 
 int    if_isconnected(const struct ifnet *, unsigned int);
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index d4aedb92187..5259b0790c7 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -1329,14 +1329,15 @@ nd6_slowtimo(void *ignored_arg)
 
 int
 nd6_resolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m,
-    struct sockaddr *dst, u_char *desten)
+    const struct sockaddr *dst, u_char *desten)
 {
        struct sockaddr_dl *sdl;
        struct rtentry *rt;
        struct llinfo_nd6 *ln = NULL;
+       const struct in6_addr *in6 = &((struct sockaddr_in6 *)dst)->sin6_addr;
 
        if (m->m_flags & M_MCAST) {
-               ETHER_MAP_IPV6_MULTICAST(&satosin6(dst)->sin6_addr, desten);
+               ETHER_MAP_IPV6_MULTICAST(in6, desten);
                return (0);
        }
 
@@ -1404,8 +1405,7 @@ nd6_resolve(struct ifnet *ifp, struct rtentry *rt0, 
struct mbuf *m,
                        char addr[INET6_ADDRSTRLEN];
                        log(LOG_DEBUG, "%s: %s: incorrect nd6 information\n",
                            __func__,
-                           inet_ntop(AF_INET6, &satosin6(dst)->sin6_addr,
-                               addr, sizeof(addr)));
+                           inet_ntop(AF_INET6, in6, addr, sizeof(addr)));
                        m_freem(m);
                        return (EINVAL);
                }
@@ -1431,7 +1431,7 @@ nd6_resolve(struct ifnet *ifp, struct rtentry *rt0, 
struct mbuf *m,
        if (!ND6_LLINFO_PERMANENT(ln) && ln->ln_asked == 0) {
                ln->ln_asked++;
                nd6_llinfo_settimer(ln, ND_IFINFO(ifp)->retrans / 1000);
-               nd6_ns_output(ifp, NULL, &satosin6(dst)->sin6_addr, ln, 0);
+               nd6_ns_output(ifp, NULL, in6, ln, 0);
        }
        return (EAGAIN);
 }
diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h
index 980524f16ea..254a613ba42 100644
--- a/sys/netinet6/nd6.h
+++ b/sys/netinet6/nd6.h
@@ -171,12 +171,12 @@ int nd6_ioctl(u_long, caddr_t, struct ifnet *);
 void nd6_cache_lladdr(struct ifnet *, const struct in6_addr *, char *,
     int, int, int);
 int nd6_resolve(struct ifnet *, struct rtentry *, struct mbuf *,
-        struct sockaddr *, u_char *);
+        const struct sockaddr *, u_char *);
 int nd6_need_cache(struct ifnet *);
 
 void nd6_na_input(struct mbuf *, int, int);
 void nd6_na_output(struct ifnet *, const struct in6_addr *,
-       const struct in6_addr *, u_long, int, struct sockaddr *);
+       const struct in6_addr *, u_long, int, const struct sockaddr *);
 void nd6_ns_input(struct mbuf *, int, int);
 void nd6_ns_output(struct ifnet *, const struct in6_addr *,
        const struct in6_addr *, const struct llinfo_nd6 *, int);
diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c
index 57433b47d41..c079e6a133a 100644
--- a/sys/netinet6/nd6_nbr.c
+++ b/sys/netinet6/nd6_nbr.c
@@ -873,7 +873,7 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
 void
 nd6_na_output(struct ifnet *ifp, const struct in6_addr *daddr6,
     const struct in6_addr *taddr6, u_long flags, int tlladdr,
-    struct sockaddr *sdl0)
+    const struct sockaddr *sdl0)
 {
        struct mbuf *m;
        struct rtentry *rt = NULL;
@@ -985,8 +985,9 @@ nd6_na_output(struct ifnet *ifp, const struct in6_addr 
*daddr6,
                if (sdl0 == NULL) {
                        mac = nd6_ifptomac(ifp);
                } else if (sdl0->sa_family == AF_LINK) {
-                       struct sockaddr_dl *sdl;
-                       sdl = satosdl(sdl0);
+                       const struct sockaddr_dl *sdl;
+
+                       sdl = (struct sockaddr_dl *)sdl0;
                        if (sdl->sdl_alen == ifp->if_addrlen)
                                mac = LLADDR(sdl);
                }
-- 
2.34.2

Reply via email to