Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Switch the IPv4 address list to pslist(9)



details:   https://anonhg.NetBSD.org/src/rev/6ba730315d5c
branches:  trunk
changeset: 346301:6ba730315d5c
user:      ozaki-r <ozaki-r%NetBSD.org@localhost>
date:      Wed Jul 06 08:42:34 2016 +0000

description:
Switch the IPv4 address list to pslist(9)

Note that we leave the old list just in case; it seems there are some
kvm(3) users accessing the list. We can remove it later if we confirmed
nobody does actually.

diffstat:

 sys/net/if_stf.c       |   7 ++---
 sys/netinet/in.c       |  30 ++++++++++++++++++---------
 sys/netinet/in_gif.c   |   6 ++--
 sys/netinet/in_pcb.c   |  13 ++++++-----
 sys/netinet/in_var.h   |  53 +++++++++++++++++++++++++++++++++++++++++++++++++-
 sys/netinet/ip_carp.c  |   8 ++----
 sys/netinet/ip_icmp.c  |   6 ++--
 sys/netinet/ip_input.c |   7 ++---
 sys/netipsec/key.c     |  10 +++-----
 9 files changed, 98 insertions(+), 42 deletions(-)

diffs (truncated from 441 to 300 lines):

diff -r fece9b2acf14 -r 6ba730315d5c sys/net/if_stf.c
--- a/sys/net/if_stf.c  Wed Jul 06 08:01:30 2016 +0000
+++ b/sys/net/if_stf.c  Wed Jul 06 08:42:34 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_stf.c,v 1.93 2016/07/04 04:35:09 knakahara Exp $    */
+/*     $NetBSD: if_stf.c,v 1.94 2016/07/06 08:42:34 ozaki-r Exp $      */
 /*     $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */
 
 /*
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.93 2016/07/04 04:35:09 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.94 2016/07/06 08:42:34 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -488,8 +488,7 @@
        /*
         * reject packets with broadcast
         */
-       TAILQ_FOREACH(ia4, &in_ifaddrhead, ia_list)
-       {
+       IN_ADDRLIST_READER_FOREACH(ia4) {
                if ((ia4->ia_ifa.ifa_ifp->if_flags & IFF_BROADCAST) == 0)
                        continue;
                if (in->s_addr == ia4->ia_broadaddr.sin_addr.s_addr)
diff -r fece9b2acf14 -r 6ba730315d5c sys/netinet/in.c
--- a/sys/netinet/in.c  Wed Jul 06 08:01:30 2016 +0000
+++ b/sys/netinet/in.c  Wed Jul 06 08:42:34 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in.c,v 1.170 2016/07/06 05:27:52 ozaki-r Exp $ */
+/*     $NetBSD: in.c,v 1.171 2016/07/06 08:42:34 ozaki-r Exp $ */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.170 2016/07/06 05:27:52 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.171 2016/07/06 08:42:34 ozaki-r Exp $");
 
 #include "arp.h"
 
@@ -185,13 +185,14 @@
 #define IN_MULTI_HASH(x, ifp) \
     (in_multihashtbl[(u_long)((x) ^ (ifp->if_index)) % IN_MULTI_HASH_SIZE])
 
-/* XXX DEPRECATED. Keep it to avoid breaking kvm(3) users. */
+/* XXX DEPRECATED. Keep them to avoid breaking kvm(3) users. */
 struct in_ifaddrhashhead *     in_ifaddrhashtbl;
 u_long                         in_ifaddrhash;
 struct in_ifaddrhead           in_ifaddrhead;
 
 struct pslist_head *           in_ifaddrhashtbl_pslist;
 u_long                         in_ifaddrhash_pslist;
+struct pslist_head             in_ifaddrhead_pslist;
 
 void
 in_init(void)
@@ -199,6 +200,7 @@
        pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl",
            NULL, IPL_SOFTNET);
        TAILQ_INIT(&in_ifaddrhead);
+       PSLIST_INIT(&in_ifaddrhead_pslist);
 
        in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
            &in_ifaddrhash);
@@ -223,13 +225,15 @@
        struct in_ifaddr *ia;
 
        if (subnetsarelocal) {
-               TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list)
+               IN_ADDRLIST_READER_FOREACH(ia) {
                        if ((in.s_addr & ia->ia_netmask) == ia->ia_net)
                                return (1);
+               }
        } else {
-               TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list)
+               IN_ADDRLIST_READER_FOREACH(ia) {
                        if ((in.s_addr & ia->ia_subnetmask) == ia->ia_subnet)
                                return (1);
+               }
        }
        return (0);
 }
@@ -304,7 +308,7 @@
        struct ifnet *ifp;
        unsigned long maxmtu = 0;
 
-       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+       IN_ADDRLIST_READER_FOREACH(ia) {
                if ((ifp = ia->ia_ifp) == 0)
                        continue;
                if ((ifp->if_flags & (IFF_UP|IFF_LOOPBACK)) != IFF_UP)
@@ -466,6 +470,7 @@
                        ia->ia_idsalt = cprng_fast32() % 65535;
                        LIST_INIT(&ia->ia_multiaddrs);
                        IN_ADDRHASH_ENTRY_INIT(ia);
+                       IN_ADDRLIST_ENTRY_INIT(ia);
 
                        newifaddr = 1;
                }
@@ -640,6 +645,8 @@
                TAILQ_INSERT_TAIL(&in_ifaddrhead, ia, ia_list);
                ifaref(&ia->ia_ifa);
                ifa_insert(ifp, &ia->ia_ifa);
+               TAILQ_INSERT_TAIL(&in_ifaddrhead, ia, ia_list);
+               IN_ADDRLIST_WRITER_INSERT_TAIL(ia);
                LIST_INSERT_HEAD(&IN_IFADDR_HASH(ia->ia_addr.sin_addr.s_addr),
                    ia, ia_hash);
                IN_ADDRHASH_WRITER_INSERT_HEAD(ia);
@@ -690,7 +697,7 @@
        ia = (struct in_ifaddr *)ifa;
        /* Delete the entry if exactly one ifaddr matches the
         * address, ifa->ifa_addr. */
-       TAILQ_FOREACH(p, &in_ifaddrhead, ia_list) {
+       IN_ADDRLIST_READER_FOREACH(p) {
                if (!in_hosteq(p->ia_addr.sin_addr, ia->ia_addr.sin_addr))
                        continue;
                if (p->ia_ifp != ia->ia_ifp)
@@ -722,6 +729,9 @@
        IN_ADDRHASH_ENTRY_DESTROY(ia);
        ifa_remove(ifp, &ia->ia_ifa);
        TAILQ_REMOVE(&in_ifaddrhead, ia, ia_list);
+       IN_ADDRLIST_WRITER_REMOVE(ia);
+       IN_ADDRLIST_ENTRY_DESTROY(ia);
+
        if (ia->ia_allhosts != NULL)
                in_delmulti(ia->ia_allhosts);
        ifafree(&ia->ia_ifa);
@@ -1066,7 +1076,7 @@
                prefix.s_addr &= mask.s_addr;
        }
 
-       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+       IN_ADDRLIST_READER_FOREACH(ia) {
                if (rtinitflags(ia))
                        p = ia->ia_dstaddr.sin_addr;
                else {
@@ -1126,7 +1136,7 @@
                prefix.s_addr &= mask.s_addr;
        }
 
-       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+       IN_ADDRLIST_READER_FOREACH(ia) {
                if (rtinitflags(ia))
                        p = ia->ia_dstaddr.sin_addr;
                else {
@@ -1524,7 +1534,7 @@
                sin->sin_port = fport;
                if (ia == NULL) {
                        /* Find 1st non-loopback AF_INET address */
-                       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+                       IN_ADDRLIST_READER_FOREACH(ia) {
                                if (!(ia->ia_ifp->if_flags & IFF_LOOPBACK))
                                        break;
                        }
diff -r fece9b2acf14 -r 6ba730315d5c sys/netinet/in_gif.c
--- a/sys/netinet/in_gif.c      Wed Jul 06 08:01:30 2016 +0000
+++ b/sys/netinet/in_gif.c      Wed Jul 06 08:42:34 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_gif.c,v 1.80 2016/07/06 01:10:07 knakahara Exp $    */
+/*     $NetBSD: in_gif.c,v 1.81 2016/07/06 08:42:34 ozaki-r Exp $      */
 /*     $KAME: in_gif.c,v 1.66 2001/07/29 04:46:09 itojun Exp $ */
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_gif.c,v 1.80 2016/07/06 01:10:07 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_gif.c,v 1.81 2016/07/06 08:42:34 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -306,7 +306,7 @@
                return 0;
        }
        /* reject packets with broadcast on source */
-       TAILQ_FOREACH(ia4, &in_ifaddrhead, ia_list) {
+       IN_ADDRLIST_READER_FOREACH(ia4) {
                if ((ia4->ia_ifa.ifa_ifp->if_flags & IFF_BROADCAST) == 0)
                        continue;
                if (ip->ip_src.s_addr == ia4->ia_broadaddr.sin_addr.s_addr)
diff -r fece9b2acf14 -r 6ba730315d5c sys/netinet/in_pcb.c
--- a/sys/netinet/in_pcb.c      Wed Jul 06 08:01:30 2016 +0000
+++ b/sys/netinet/in_pcb.c      Wed Jul 06 08:42:34 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_pcb.c,v 1.164 2016/06/21 03:28:27 ozaki-r Exp $     */
+/*     $NetBSD: in_pcb.c,v 1.165 2016/07/06 08:42:34 ozaki-r Exp $     */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.164 2016/06/21 03:28:27 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.165 2016/07/06 08:42:34 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -411,7 +411,7 @@
        if (inp->inp_af != AF_INET)
                return (EINVAL);
 
-       if (TAILQ_FIRST(&in_ifaddrhead) == 0)
+       if (IN_ADDRLIST_READER_EMPTY())
                return (EADDRNOTAVAIL);
        if (inp->inp_lport || !in_nullhost(inp->inp_laddr))
                return (EINVAL);
@@ -470,7 +470,7 @@
            inp->inp_socket->so_type == SOCK_STREAM)
                return EADDRNOTAVAIL;
 
-       if (TAILQ_FIRST(&in_ifaddrhead) != 0) {
+       if (!IN_ADDRLIST_READER_EMPTY()) {
                /*
                 * If the destination address is INADDR_ANY,
                 * use any local address (likely loopback).
@@ -480,10 +480,11 @@
                 */
 
                if (in_nullhost(sin->sin_addr)) {
+                       /* XXX racy */
                        sin->sin_addr =
-                           TAILQ_FIRST(&in_ifaddrhead)->ia_addr.sin_addr;
+                           IN_ADDRLIST_READER_FIRST()->ia_addr.sin_addr;
                } else if (sin->sin_addr.s_addr == INADDR_BROADCAST) {
-                       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+                       IN_ADDRLIST_READER_FOREACH(ia) {
                                if (ia->ia_ifp->if_flags & IFF_BROADCAST) {
                                        sin->sin_addr =
                                            ia->ia_broadaddr.sin_addr;
diff -r fece9b2acf14 -r 6ba730315d5c sys/netinet/in_var.h
--- a/sys/netinet/in_var.h      Wed Jul 06 08:01:30 2016 +0000
+++ b/sys/netinet/in_var.h      Wed Jul 06 08:42:34 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_var.h,v 1.75 2016/07/06 05:27:52 ozaki-r Exp $      */
+/*     $NetBSD: in_var.h,v 1.76 2016/07/06 08:42:34 ozaki-r Exp $      */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -107,6 +107,7 @@
 
 #ifdef _KERNEL
        struct pslist_entry     ia_hash_pslist_entry;
+       struct pslist_entry     ia_pslist_entry;
 #endif
 };
 
@@ -148,6 +149,7 @@
 
 extern struct pslist_head *in_ifaddrhashtbl_pslist;
 extern u_long in_ifaddrhash_pslist;
+extern struct pslist_head in_ifaddrhead_pslist;
 
 #define IN_IFADDR_HASH_PSLIST(x)                                       \
        in_ifaddrhashtbl_pslist[(u_long)(x) % IN_IFADDR_HASH_SIZE]
@@ -166,6 +168,55 @@
 #define IN_ADDRHASH_ENTRY_DESTROY(__ia)                                        \
        PSLIST_ENTRY_DESTROY((__ia), ia_hash_pslist_entry);
 
+#define IN_ADDRLIST_ENTRY_INIT(__ia)                                   \
+       PSLIST_ENTRY_INIT((__ia), ia_pslist_entry)
+#define IN_ADDRLIST_ENTRY_DESTROY(__ia)                                        \
+       PSLIST_ENTRY_DESTROY((__ia), ia_pslist_entry);
+#define IN_ADDRLIST_READER_EMPTY()                                     \
+       (PSLIST_READER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr,   \
+                            ia_pslist_entry) == NULL)
+#define IN_ADDRLIST_READER_FIRST()                                     \
+       PSLIST_READER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr,    \
+                           ia_pslist_entry)
+#define IN_ADDRLIST_READER_NEXT(__ia)                                  \
+       PSLIST_READER_NEXT((__ia), struct in_ifaddr, ia_pslist_entry)
+#define IN_ADDRLIST_READER_FOREACH(__ia)                               \
+       PSLIST_READER_FOREACH((__ia), &in_ifaddrhead_pslist,            \
+                             struct in_ifaddr, ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_INSERT_HEAD(__ia)                           \
+       PSLIST_WRITER_INSERT_HEAD(&in_ifaddrhead_pslist, (__ia),        \
+           ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_REMOVE(__ia)                                        \
+       PSLIST_WRITER_REMOVE((__ia), ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_FOREACH(__ia)                               \
+       PSLIST_WRITER_FOREACH((__ia), &in_ifaddrhead_pslist,            \
+                             struct in_ifaddr, ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_FIRST()                                     \
+       PSLIST_WRITER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr,    \
+                           ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_NEXT(__ia)                                  \
+       PSLIST_WRITER_NEXT((__ia), struct in_ifaddr, ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_INSERT_AFTER(__ia, __new)                   \
+       PSLIST_WRITER_INSERT_AFTER((__ia), (__new), ia_pslist_entry)
+#define IN_ADDRLIST_WRITER_EMPTY()                                     \
+       (PSLIST_WRITER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr,   \
+           ia_pslist_entry) == NULL)
+#define IN_ADDRLIST_WRITER_INSERT_TAIL(__new)                          \



Home | Main Index | Thread Index | Old Index