Diff below deduplicate and move the code adding a new address to the
global list into in_ifinit(), there's no functional change.

While here add a comment about why we always delete addresses from
the tree during update.

ok?

diff --git sys/net/if_pppx.c sys/net/if_pppx.c
index 5345162..f97e2a0 100644
--- sys/net/if_pppx.c
+++ sys/net/if_pppx.c
@@ -895,7 +895,6 @@ pppx_add_session(struct pppx_dev *pxd, struct 
pipex_session_req *req)
        ifaddr.sin_addr = req->pr_ip_srcaddr;
 
        ia = malloc(sizeof (*ia), M_IFADDR, M_WAITOK | M_ZERO);
-       TAILQ_INSERT_TAIL(&in_ifaddr, ia, ia_list);
 
        ia->ia_addr.sin_family = AF_INET;
        ia->ia_addr.sin_len = sizeof(struct sockaddr_in);
diff --git sys/netinet/in.c sys/netinet/in.c
index 1fb833d..47d5dd9 100644
--- sys/netinet/in.c
+++ sys/netinet/in.c
@@ -241,8 +241,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, 
struct ifnet *ifp)
                        panic("in_control");
                if (ia == NULL) {
                        ia = malloc(sizeof *ia, M_IFADDR, M_WAITOK | M_ZERO);
-                       s = splsoftnet();
-                       TAILQ_INSERT_TAIL(&in_ifaddr, ia, ia_list);
                        ia->ia_addr.sin_family = AF_INET;
                        ia->ia_addr.sin_len = sizeof(ia->ia_addr);
                        ia->ia_ifa.ifa_addr = sintosa(&ia->ia_addr);
@@ -255,7 +253,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, 
struct ifnet *ifp)
                        }
                        ia->ia_ifp = ifp;
                        LIST_INIT(&ia->ia_multiaddrs);
-                       splx(s);
 
                        newifaddr = 1;
                } else
@@ -646,6 +643,13 @@ in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct 
sockaddr_in *sin,
        struct sockaddr_in oldaddr;
        int s = splnet(), flags = RTF_UP, error;
 
+       if (newaddr)
+               TAILQ_INSERT_TAIL(&in_ifaddr, ia, ia_list);
+
+       /*
+        * Always remove the address from the tree to make sure its
+        * position gets updated in case the key changes.
+        */
        if (!newaddr)
                ifa_del(ifp, &ia->ia_ifa);
        oldaddr = ia->ia_addr;

Reply via email to