Source-Changes-HG archive

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

[src/trunk]: src/sys/net Make ppp a cloning device. Based on the work of Quen...



details:   https://anonhg.NetBSD.org/src/rev/3946dc74bb8b
branches:  trunk
changeset: 571631:3946dc74bb8b
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Dec 05 04:15:16 2004 +0000

description:
Make ppp a cloning device. Based on the work of Quentin Garnier.

diffstat:

 sys/net/if_ppp.c    |  179 +++++++++++++++++++++++++++++++++++++--------------
 sys/net/if_pppvar.h |    4 +-
 2 files changed, 132 insertions(+), 51 deletions(-)

diffs (280 lines):

diff -r ae733ff60b2e -r 3946dc74bb8b sys/net/if_ppp.c
--- a/sys/net/if_ppp.c  Sat Dec 04 23:22:58 2004 +0000
+++ b/sys/net/if_ppp.c  Sun Dec 05 04:15:16 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ppp.c,v 1.90 2004/07/03 18:11:33 dyoung Exp $       */
+/*     $NetBSD: if_ppp.c,v 1.91 2004/12/05 04:15:16 christos Exp $     */
 /*     Id: if_ppp.c,v 1.6 1997/03/04 03:33:00 paulus Exp       */
 
 /*
@@ -102,7 +102,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ppp.c,v 1.90 2004/07/03 18:11:33 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ppp.c,v 1.91 2004/12/05 04:15:16 christos Exp $");
 
 #include "ppp.h"
 
@@ -202,7 +202,17 @@
 #define        M_HIGHPRI       M_LINK0 /* output packet for sc_fastq */
 #define        M_ERRMARK       M_LINK1 /* rx packet following lost/corrupted pkt */
 
-struct ppp_softc ppp_softc[NPPP];
+static int             ppp_clone_create(struct if_clone *, int);
+static int             ppp_clone_destroy(struct ifnet *);
+
+static struct ppp_softc *ppp_create(const char *, int);
+
+static LIST_HEAD(, ppp_softc) ppp_softc_list;
+
+struct if_clone ppp_cloner =
+    IF_CLONE_INITIALIZER("ppp", ppp_clone_create, ppp_clone_destroy);
+
+static struct simplelock ppp_list_mutex = SIMPLELOCK_INITIALIZER;
 
 #ifdef PPP_COMPRESS
 /*
@@ -232,35 +242,104 @@
 void
 pppattach()
 {
-    struct ppp_softc *sc;
-    int i = 0;
+    LIST_INIT(&ppp_softc_list);
+    if_clone_attach(&ppp_cloner);
+}
+
+static struct ppp_softc *
+ppp_create(const char *name, int unit)
+{
+    struct ppp_softc *sc, *sci, *scl = NULL;
+
+    MALLOC(sc, struct ppp_softc *, sizeof(*sc), M_DEVBUF, M_WAIT|M_ZERO);
+
+    simple_lock(&ppp_list_mutex);
+    if (unit == -1) {
+       int i = 0;
+       LIST_FOREACH(sci, &ppp_softc_list, sc_iflist) {
+           scl = sci;
+           if (i < sci->sc_unit) {
+               unit = i;
+               break;
+           } else {
+#ifdef DIAGNOSTIC
+               KASSERT(i == sci->sc_unit);
+#endif
+               i++;
+           }
+       }
+       if (unit == -1)
+           unit = i;
+    } else {
+       LIST_FOREACH(sci, &ppp_softc_list, sc_iflist) {
+           scl = sci;
+           if (unit < sci->sc_unit)
+               break;
+           else if (unit == sci->sc_unit) {
+               FREE(sc, M_DEVBUF);
+               return NULL;
+           }
+       }
+    }
+
+    if (sci != NULL)
+       LIST_INSERT_BEFORE(sci, sc, sc_iflist);
+    else if (scl != NULL)
+       LIST_INSERT_AFTER(scl, sc, sc_iflist);
+    else
+       LIST_INSERT_HEAD(&ppp_softc_list, sc, sc_iflist);
+
+    simple_unlock(&ppp_list_mutex);
 
-    for (sc = ppp_softc; i < NPPP; sc++) {
-       sc->sc_unit = i;        /* XXX */
-       snprintf(sc->sc_if.if_xname, sizeof(sc->sc_if.if_xname), "ppp%d", i++);
-       callout_init(&sc->sc_timo_ch);
-       sc->sc_if.if_softc = sc;
-       sc->sc_if.if_mtu = PPP_MTU;
-       sc->sc_if.if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
-       sc->sc_if.if_type = IFT_PPP;
-       sc->sc_if.if_hdrlen = PPP_HDRLEN;
-       sc->sc_if.if_dlt = DLT_NULL;
-       sc->sc_if.if_ioctl = pppsioctl;
-       sc->sc_if.if_output = pppoutput;
+    (void)snprintf(sc->sc_if.if_xname, sizeof(sc->sc_if.if_xname), "%s%d",
+       name, sc->sc_unit = unit);
+    callout_init(&sc->sc_timo_ch);
+    sc->sc_if.if_softc = sc;
+    sc->sc_if.if_mtu = PPP_MTU;
+    sc->sc_if.if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
+    sc->sc_if.if_type = IFT_PPP;
+    sc->sc_if.if_hdrlen = PPP_HDRLEN;
+    sc->sc_if.if_dlt = DLT_NULL;
+    sc->sc_if.if_ioctl = pppsioctl;
+    sc->sc_if.if_output = pppoutput;
 #ifdef ALTQ
-       sc->sc_if.if_start = ppp_ifstart;
+    sc->sc_if.if_start = ppp_ifstart;
+#endif
+    IFQ_SET_MAXLEN(&sc->sc_if.if_snd, IFQ_MAXLEN);
+    sc->sc_inq.ifq_maxlen = IFQ_MAXLEN;
+    sc->sc_fastq.ifq_maxlen = IFQ_MAXLEN;
+    sc->sc_rawq.ifq_maxlen = IFQ_MAXLEN;
+    IFQ_SET_READY(&sc->sc_if.if_snd);
+    if_attach(&sc->sc_if);
+    if_alloc_sadl(&sc->sc_if);
+#if NBPFILTER > 0
+    bpfattach(&sc->sc_if, DLT_NULL, 0);
 #endif
-       IFQ_SET_MAXLEN(&sc->sc_if.if_snd, IFQ_MAXLEN);
-       sc->sc_inq.ifq_maxlen = IFQ_MAXLEN;
-       sc->sc_fastq.ifq_maxlen = IFQ_MAXLEN;
-       sc->sc_rawq.ifq_maxlen = IFQ_MAXLEN;
-       IFQ_SET_READY(&sc->sc_if.if_snd);
-       if_attach(&sc->sc_if);
-       if_alloc_sadl(&sc->sc_if);
-#if NBPFILTER > 0
-       bpfattach(&sc->sc_if, DLT_NULL, 0);
-#endif
-    }
+    return sc;
+}
+
+static int
+ppp_clone_create(struct if_clone *ifc, int unit)
+{
+    return ppp_create(ifc->ifc_name, unit) == NULL ? EEXIST : 0;
+}
+
+static int
+ppp_clone_destroy(struct ifnet *ifp)
+{
+    struct ppp_softc *sc = (struct ppp_softc *)ifp->if_softc;
+
+    if (sc->sc_devp != NULL)
+       return EBUSY; /* Not removing it */
+
+    simple_lock(&ppp_list_mutex);
+    LIST_REMOVE(sc, sc_iflist);
+    simple_unlock(&ppp_list_mutex);
+
+    if_detach(ifp);
+
+    FREE(sc, M_DEVBUF);
+    return 0;
 }
 
 /*
@@ -270,32 +349,36 @@
 pppalloc(pid)
     pid_t pid;
 {
-    int nppp, i;
-    struct ppp_softc *sc;
+    struct ppp_softc *sc = NULL, *scf;
+    int i;
 
-    for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++)
-       if (sc->sc_xfer == pid) {
-           sc->sc_xfer = 0;
-           return sc;
+    simple_lock(&ppp_list_mutex);
+    for (scf = LIST_FIRST(&ppp_softc_list); scf != NULL; 
+       scf = LIST_NEXT(scf, sc_iflist)) {
+       if (scf->sc_xfer == pid) {
+           scf->sc_xfer = 0;
+           simple_unlock(&ppp_list_mutex);
+           return scf;
        }
-    for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++)
-       if (sc->sc_devp == NULL)
-           break;
-    if (nppp >= NPPP)
-       return NULL;
+       if (scf->sc_devp == NULL && sc == NULL)
+           sc = scf;
+    }
+    simple_lock(&ppp_list_mutex);
+
+    if (sc == NULL)
+       sc = ppp_create(ppp_cloner.ifc_name, -1);
 
 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
     sc->sc_si = softintr_establish(IPL_SOFTNET, pppintr, sc);
     if (sc->sc_si == NULL) {
-       printf("ppp%d: unable to establish softintr\n", sc->sc_unit);
+       printf("%s: unable to establish softintr\n", sc->sc_if.if_xname);
        return (NULL);
     }
 #endif
-
     sc->sc_flags = 0;
     sc->sc_mru = PPP_MRU;
     sc->sc_relinq = NULL;
-    memset((char *)&sc->sc_stats, 0, sizeof(sc->sc_stats));
+    (void)memset(&sc->sc_stats, 0, sizeof(sc->sc_stats));
 #ifdef VJC
     MALLOC(sc->sc_comp, struct slcompress *, sizeof(struct slcompress),
           M_DEVBUF, M_NOWAIT);
@@ -390,6 +473,7 @@
        sc->sc_comp = 0;
     }
 #endif
+    (void)ppp_clone_destroy(&sc->sc_if);
 }
 
 /*
@@ -410,7 +494,6 @@
     struct npioctl *npi;
     time_t t;
 #ifdef PPP_FILTER
-/*###413 [cc] warning: `bp' might be used uninitialized in this function%%%*/
     struct bpf_program *bp, *nbp;
     struct bpf_insn *newcode, *oldcode;
     int newcodelen;
@@ -425,7 +508,7 @@
        break;
 
     case PPPIOCGUNIT:
-       *(int *)data = sc->sc_unit;     /* XXX */
+       *(int *)data = sc->sc_unit;
        break;
 
     case PPPIOCGFLAGS:
@@ -1202,12 +1285,10 @@
 pppnetisr(void)
 {
        struct ppp_softc *sc;
-       int i;
 
-       for (i = 0; i < NPPP; i++) {
-               sc = &ppp_softc[i];
+       for (sc = LIST_FIRST(&ppp_softc_list); scf != NULL; 
+           sc = LIST_NEXT(sc, sc_iflist))
                pppintr(sc);
-       }
 }
 #endif
 
diff -r ae733ff60b2e -r 3946dc74bb8b sys/net/if_pppvar.h
--- a/sys/net/if_pppvar.h       Sat Dec 04 23:22:58 2004 +0000
+++ b/sys/net/if_pppvar.h       Sun Dec 05 04:15:16 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_pppvar.h,v 1.18 2003/09/01 16:51:27 christos Exp $  */
+/*     $NetBSD: if_pppvar.h,v 1.19 2004/12/05 04:15:16 christos Exp $  */
 /*     Id: if_pppvar.h,v 1.3 1996/07/01 01:04:37 paulus Exp     */
 
 /*
@@ -143,10 +143,10 @@
        u_int16_t sc_outfcs;            /* FCS so far for output packet */
        u_char sc_rawin_start;          /* current char start */
        struct ppp_rawin sc_rawin;      /* chars as received */
+       LIST_ENTRY(ppp_softc) sc_iflist;
 };
 
 #ifdef _KERNEL
-extern struct  ppp_softc ppp_softc[];
 
 struct ppp_softc *pppalloc __P((pid_t));
 void   pppdealloc __P((struct ppp_softc *));



Home | Main Index | Thread Index | Old Index