Source-Changes-HG archive

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

[src/trunk]: src/sys/net - Move ifnet_list (and lo0ifp while here) under #ifd...



details:   https://anonhg.NetBSD.org/src/rev/596fd613721d
branches:  trunk
changeset: 329287:596fd613721d
user:      rmind <rmind%NetBSD.org@localhost>
date:      Sun May 18 00:33:20 2014 +0000

description:
- Move ifnet_list (and lo0ifp while here) under #ifdef _KERNEL.
- Make ifindex2ifnet, if_indexlim and some other variables static.
- Move if_index generation into its own function.
- if_alloc/if_free: replace malloc with kmem.

diffstat:

 sys/net/if.c |  145 ++++++++++++++++++++++++++++++----------------------------
 sys/net/if.h |   14 ++---
 2 files changed, 80 insertions(+), 79 deletions(-)

diffs (296 lines):

diff -r fe7c1f3e0d2a -r 596fd613721d sys/net/if.c
--- a/sys/net/if.c      Sun May 18 00:10:11 2014 +0000
+++ b/sys/net/if.c      Sun May 18 00:33:20 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if.c,v 1.273 2014/04/26 11:16:22 pooka Exp $   */
+/*     $NetBSD: if.c,v 1.274 2014/05/18 00:33:20 rmind Exp $   */
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.273 2014/04/26 11:16:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.274 2014/05/18 00:33:20 rmind Exp $");
 
 #include "opt_inet.h"
 
@@ -138,6 +138,7 @@
 
 #include "carp.h"
 #if NCARP > 0
+#include <netinet/in_var.h>
 #include <netinet/ip_carp.h>
 #endif
 
@@ -147,10 +148,23 @@
 MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address");
 MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
 
+/*
+ * Global list of interfaces.
+ */
+struct ifnet_head              ifnet_list;
+static ifnet_t **              ifindex2ifnet = NULL;
+
+static u_int                   if_index = 1;
+static size_t                  if_indexlim = 0;
+static uint64_t                        index_gen;
+static kmutex_t                        index_gen_mtx;
+
+static struct ifaddr **                ifnet_addrs = NULL;
+
+static callout_t               if_slowtimo_ch;
+
+struct ifnet *lo0ifp;
 int    ifqmaxlen = IFQ_MAXLEN;
-callout_t if_slowtimo_ch;
-
-int netisr;                    /* scheduling bits for network */
 
 static int     if_rt_walktree(struct rtentry *, void *);
 
@@ -160,9 +174,6 @@
 static LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners);
 static int if_cloners_count;
 
-static uint64_t index_gen;
-static kmutex_t index_gen_mtx;
-
 /* Packet filtering hook for interfaces. */
 pfil_head_t *  if_pfil;
 
@@ -240,20 +251,23 @@
 ifinit1(void)
 {
        mutex_init(&index_gen_mtx, MUTEX_DEFAULT, IPL_NONE);
+       TAILQ_INIT(&ifnet_list);
+       if_indexlim = 8;
+
        if_pfil = pfil_head_create(PFIL_TYPE_IFNET, NULL);
        KASSERT(if_pfil != NULL);
 }
 
-struct ifnet *
+ifnet_t *
 if_alloc(u_char type)
 {
-       return malloc(sizeof(struct ifnet), M_DEVBUF, M_WAITOK|M_ZERO);
+       return kmem_zalloc(sizeof(ifnet_t), KM_SLEEP);
 }
 
 void
-if_free(struct ifnet *ifp)
+if_free(ifnet_t *ifp)
 {
-       free(ifp, M_DEVBUF);
+       kmem_free(ifp, sizeof(ifnet_t));
 }
 
 void
@@ -329,13 +343,6 @@
        /* Nothing. */
 }
 
-static u_int if_index = 1;
-struct ifnet_head ifnet;
-size_t if_indexlim = 0;
-struct ifaddr **ifnet_addrs = NULL;
-struct ifnet **ifindex2ifnet = NULL;
-struct ifnet *lo0ifp;
-
 void
 if_set_sadl(struct ifnet *ifp, const void *lla, u_char addrlen, bool factory)
 {
@@ -488,61 +495,47 @@
        splx(s);
 }
 
-/*
- * Attach an interface to the
- * list of "active" interfaces.
- */
-void
-if_attach(struct ifnet *ifp)
+static void
+if_getindex(ifnet_t *ifp)
 {
-       int indexlim = 0;
-
-       if (if_indexlim == 0) {
-               TAILQ_INIT(&ifnet);
-               if_indexlim = 8;
-       }
-       TAILQ_INIT(&ifp->if_addrlist);
-       TAILQ_INSERT_TAIL(&ifnet, ifp, if_list);
-
-       if (ifioctl_attach(ifp) != 0)
-               panic("%s: ifioctl_attach() failed", __func__);
+       bool hitlimit = false;
 
        mutex_enter(&index_gen_mtx);
        ifp->if_index_gen = index_gen++;
        mutex_exit(&index_gen_mtx);
 
        ifp->if_index = if_index;
-       if (ifindex2ifnet == NULL)
+       if (ifindex2ifnet == NULL) {
                if_index++;
-       else
-               while (ifp->if_index < if_indexlim &&
-                   ifindex2ifnet[ifp->if_index] != NULL) {
-                       ++if_index;
-                       if (if_index == 0)
-                               if_index = 1;
+               goto skip;
+       }
+       while (if_byindex(ifp->if_index)) {
+               /*
+                * If we hit USHRT_MAX, we skip back to 0 since
+                * there are a number of places where the value
+                * of if_index or if_index itself is compared
+                * to or stored in an unsigned short.  By
+                * jumping back, we won't botch those assignments
+                * or comparisons.
+                */
+               if (++if_index == 0) {
+                       if_index = 1;
+               } else if (if_index == USHRT_MAX) {
                        /*
-                        * If we hit USHRT_MAX, we skip back to 0 since
-                        * there are a number of places where the value
-                        * of if_index or if_index itself is compared
-                        * to or stored in an unsigned short.  By
-                        * jumping back, we won't botch those assignments
-                        * or comparisons.
+                        * However, if we have to jump back to
+                        * zero *twice* without finding an empty
+                        * slot in ifindex2ifnet[], then there
+                        * there are too many (>65535) interfaces.
                         */
-                       else if (if_index == USHRT_MAX) {
-                               /*
-                                * However, if we have to jump back to
-                                * zero *twice* without finding an empty
-                                * slot in ifindex2ifnet[], then there
-                                * there are too many (>65535) interfaces.
-                                */
-                               if (indexlim++)
-                                       panic("too many interfaces");
-                               else
-                                       if_index = 1;
+                       if (hitlimit) {
+                               panic("too many interfaces");
                        }
-                       ifp->if_index = if_index;
+                       hitlimit = true;
+                       if_index = 1;
                }
-
+               ifp->if_index = if_index;
+       }
+skip:
        /*
         * We have some arrays that should be indexed by if_index.
         * since if_index will grow dynamically, they should grow too.
@@ -578,8 +571,23 @@
                }
                ifindex2ifnet = (struct ifnet **)q;
        }
+       ifindex2ifnet[ifp->if_index] = ifp;
+}
 
-       ifindex2ifnet[ifp->if_index] = ifp;
+/*
+ * Attach an interface to the list of "active" interfaces.
+ */
+void
+if_attach(ifnet_t *ifp)
+{
+       KASSERT(if_indexlim > 0);
+       TAILQ_INIT(&ifp->if_addrlist);
+       TAILQ_INSERT_TAIL(&ifnet_list, ifp, if_list);
+
+       if (ifioctl_attach(ifp) != 0)
+               panic("%s: ifioctl_attach() failed", __func__);
+
+       if_getindex(ifp);
 
        /*
         * Link level name is allocated later by a separate call to
@@ -844,7 +852,7 @@
 
        ifindex2ifnet[ifp->if_index] = NULL;
 
-       TAILQ_REMOVE(&ifnet, ifp, if_list);
+       TAILQ_REMOVE(&ifnet_list, ifp, if_list);
 
        ifioctl_detach(ifp);
 
@@ -871,13 +879,9 @@
 
        prev = NULL;
        for (m = q->ifq_head; m != NULL; m = next) {
+               KASSERT((m->m_flags & M_PKTHDR) != 0);
+
                next = m->m_nextpkt;
-#ifdef DIAGNOSTIC
-               if ((m->m_flags & M_PKTHDR) == 0) {
-                       prev = m;
-                       continue;
-               }
-#endif
                if (m->m_pkthdr.rcvif != ifp) {
                        prev = m;
                        continue;
@@ -1542,7 +1546,6 @@
 ifnet_t *
 if_byindex(u_int idx)
 {
-
        return (idx < if_indexlim) ? ifindex2ifnet[idx] : NULL;
 }
 
diff -r fe7c1f3e0d2a -r 596fd613721d sys/net/if.h
--- a/sys/net/if.h      Sun May 18 00:10:11 2014 +0000
+++ b/sys/net/if.h      Sun May 18 00:33:20 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if.h,v 1.164 2014/05/17 20:44:24 rmind Exp $   */
+/*     $NetBSD: if.h,v 1.165 2014/05/18 00:33:20 rmind Exp $   */
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -845,11 +845,6 @@
 MALLOC_DECLARE(M_IFADDR);
 MALLOC_DECLARE(M_IFMADDR);
 
-extern struct ifnet_head ifnet;
-extern struct ifnet **ifindex2ifnet;
-extern struct ifnet *lo0ifp;
-extern size_t if_indexlim;
-
 int ifreq_setaddr(u_long, struct ifreq *, const struct sockaddr *);
 
 struct ifnet *if_alloc(u_char);
@@ -945,15 +940,18 @@
 
 #ifdef _KERNEL
 
-#define        IFNET_FIRST()                   TAILQ_FIRST(&ifnet)
+#define        IFNET_FIRST()                   TAILQ_FIRST(&ifnet_list)
 #define        IFNET_NEXT(__ifp)               TAILQ_NEXT((__ifp), if_list)
-#define        IFNET_FOREACH(__ifp)            TAILQ_FOREACH(__ifp, &ifnet, if_list)
+#define        IFNET_FOREACH(__ifp)            TAILQ_FOREACH(__ifp, &ifnet_list, if_list)
 #define        IFADDR_FIRST(__ifp)             TAILQ_FIRST(&(__ifp)->if_addrlist)
 #define        IFADDR_NEXT(__ifa)              TAILQ_NEXT((__ifa), ifa_list)
 #define        IFADDR_FOREACH(__ifa, __ifp)    TAILQ_FOREACH(__ifa, \
                                            &(__ifp)->if_addrlist, ifa_list)
 #define        IFADDR_EMPTY(__ifp)             TAILQ_EMPTY(&(__ifp)->if_addrlist)
 
+extern struct ifnet_head ifnet_list;
+extern struct ifnet *lo0ifp;
+
 ifnet_t *      if_byindex(u_int);
 
 /*



Home | Main Index | Thread Index | Old Index