Date: Wed, 15 Sep 1999 23:07:08 -0400 (EDT) From: bloom@acm.org To: FreeBSD-gnats-submit@freebsd.org Subject: kern/13770: Almost clone update for kernel ppp implementation Message-ID: <199909160307.XAA00598@jbloom.ne.mediaone.net>
next in thread | raw e-mail | index | archive | help
>Number: 13770 >Category: kern >Synopsis: Almost clone update for kernel ppp implementation >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Sep 15 20:10:01 PDT 1999 >Closed-Date: >Last-Modified: >Originator: Jim Bloom >Release: FreeBSD 4.0-CURRENT i386 >Organization: none >Environment: Kernel mode ppp using pppd >Description: Give PPP the "almost-clone" update. The kernel configuration no longer requires the number of PPP interfaces to be specified when running config(8). PPP interfaces will be created upon demand. >How-To-Repeat: >Fix: Here are the diffs for the the changes. --- sys/pc98/conf/GENERIC98.orig Wed Sep 15 22:44:24 1999 +++ sys/pc98/conf/GENERIC98 Wed Sep 15 22:44:42 1999 @@ -246,7 +246,7 @@ pseudo-device loop pseudo-device ether pseudo-device sl 1 -pseudo-device ppp 1 +pseudo-device ppp pseudo-device tun pseudo-device pty pseudo-device gzip # Exec gzipped a.out's --- sys/i386/conf/GENERIC.orig Wed Sep 15 22:42:24 1999 +++ sys/i386/conf/GENERIC Wed Sep 15 22:42:51 1999 @@ -194,7 +194,7 @@ pseudo-device loop # Network loopback pseudo-device ether # Ethernet support pseudo-device sl 1 # Kernel SLIP -pseudo-device ppp 1 # Kernel PPP +pseudo-device ppp # Kernel PPP pseudo-device tun # Packet tunnel, for ppp(1) pseudo-device pty # Pseudo-ttys (telnet etc) pseudo-device gzip # Exec gzipped a.out's --- sys/i386/conf/LINT.orig Mon Aug 16 16:12:03 1999 +++ sys/i386/conf/LINT Wed Sep 15 22:43:26 1999 @@ -406,7 +406,7 @@ pseudo-device disc #Discard device pseudo-device tun #Tunnel driver (ppp(8), nos-tun(8)) pseudo-device sl 2 #Serial Line IP -pseudo-device ppp 2 #Point-to-point protocol +pseudo-device ppp #Point-to-point protocol pseudo-device streams options PPP_BSDCOMP #PPP BSD-compress support options PPP_DEFLATE #PPP zlib/deflate/gzip support --- sys/i386/conf/PCCARD.orig Wed Sep 15 22:43:54 1999 +++ sys/i386/conf/PCCARD Wed Sep 15 22:43:56 1999 @@ -190,7 +190,7 @@ pseudo-device loop # Network loopback pseudo-device ether # Ethernet support pseudo-device sl 1 # Kernel SLIP -pseudo-device ppp 1 # Kernel PPP +pseudo-device ppp # Kernel PPP pseudo-device tun # Packet tunnel, for ppp(1) pseudo-device pty # Pseudo-ttys (telnet etc) pseudo-device gzip # Exec gzipped a.out's --- sys/net/if_ppp.c.orig Sat Aug 14 22:53:14 1999 +++ sys/net/if_ppp.c Tue Aug 31 15:23:04 1999 @@ -95,6 +95,7 @@ #include <sys/kernel.h> #include <sys/time.h> #include <sys/malloc.h> +#include <sys/queue.h> #include <net/if.h> #include <net/if_types.h> @@ -138,7 +139,7 @@ #include <net/ppp_comp.h> #endif -struct ppp_softc ppp_softc[NPPP]; +MALLOC_DEFINE(M_PPP, "PPP", "PPP data"); /* XXX layering violation */ extern void pppasyncattach __P((void *)); @@ -146,6 +147,7 @@ static void pppattach __P((void *)); PSEUDO_SET(pppattach, if_ppp); +static struct ppp_softc *pppcreate __P((void)); static int pppsioctl __P((struct ifnet *ifp, u_long cmd, caddr_t data)); static void pppintr __P((void)); @@ -197,6 +199,9 @@ }; #endif /* PPP_COMPRESS */ +/* List of state elements. */ +static SLIST_HEAD(ppp_softc_list, ppp_softc) ppp_softc; + /* * Called from boot code to establish ppp interfaces. */ @@ -204,27 +209,12 @@ pppattach(dummy) void *dummy; { - register struct ppp_softc *sc; - register int i = 0; - - for (sc = ppp_softc; i < NPPP; sc++) { - sc->sc_if.if_name = "ppp"; - sc->sc_if.if_unit = i++; - 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_ioctl = pppsioctl; - sc->sc_if.if_output = pppoutput; - sc->sc_if.if_snd.ifq_maxlen = IFQ_MAXLEN; - sc->sc_inq.ifq_maxlen = IFQ_MAXLEN; - sc->sc_fastq.ifq_maxlen = IFQ_MAXLEN; - sc->sc_rawq.ifq_maxlen = IFQ_MAXLEN; - if_attach(&sc->sc_if); -#if NBPF > 0 - bpfattach(&sc->sc_if, DLT_PPP, PPP_HDRLEN); -#endif - } + SLIST_INIT(&ppp_softc); + /* + * Create the first device to indicate that the kernel supports PPP. + * Any more devices needed will be created when they are first used. + */ + (void) pppcreate(); register_netisr(NETISR_PPP, pppintr); /* * XXX layering violation - if_ppp can work over any lower level @@ -233,6 +223,35 @@ pppasyncattach(dummy); } +static struct ppp_softc * +pppcreate(void) +{ + register struct ppp_softc *sc; + static int unit = 0; + + MALLOC(sc, struct ppp_softc *, sizeof(*sc), M_PPP, M_WAITOK); + bzero(sc, sizeof(*sc)); + sc->sc_if.if_name = "ppp"; + sc->sc_if.if_unit = unit++; + 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_ioctl = pppsioctl; + sc->sc_if.if_output = pppoutput; + sc->sc_if.if_snd.ifq_maxlen = IFQ_MAXLEN; + sc->sc_inq.ifq_maxlen = IFQ_MAXLEN; + sc->sc_fastq.ifq_maxlen = IFQ_MAXLEN; + sc->sc_rawq.ifq_maxlen = IFQ_MAXLEN; + sc->sc_if.if_softc = sc; + if_attach(&sc->sc_if); +#if NBPF > 0 + bpfattach(&sc->sc_if, DLT_PPP, PPP_HDRLEN); +#endif + SLIST_INSERT_HEAD(&ppp_softc, sc, sc_list); + return(sc); +} + /* * Allocate a ppp interface unit and initialize it. */ @@ -240,19 +259,19 @@ pppalloc(pid) pid_t pid; { - int nppp, i; + int i; struct ppp_softc *sc; - for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++) + SLIST_FOREACH(sc, &ppp_softc, sc_list) if (sc->sc_xfer == pid) { sc->sc_xfer = 0; return sc; } - for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++) + SLIST_FOREACH(sc, &ppp_softc, sc_list) if (sc->sc_devp == NULL) break; - if (nppp >= NPPP) - return NULL; + if (sc == NULL) + sc = pppcreate(); sc->sc_flags = 0; sc->sc_mru = PPP_MRU; @@ -564,7 +583,7 @@ caddr_t data; { struct proc *p = curproc; /* XXX */ - register struct ppp_softc *sc = &ppp_softc[ifp->if_unit]; + register struct ppp_softc *sc = ifp->if_softc; register struct ifaddr *ifa = (struct ifaddr *)data; register struct ifreq *ifr = (struct ifreq *)data; struct ppp_stats *psp; @@ -694,7 +713,7 @@ struct sockaddr *dst; struct rtentry *rtp; { - register struct ppp_softc *sc = &ppp_softc[ifp->if_unit]; + register struct ppp_softc *sc = ifp->if_softc; int protocol, address, control; u_char *cp; int s, error; @@ -1077,11 +1096,10 @@ pppintr() { struct ppp_softc *sc; - int i, s; + int s; struct mbuf *m; - sc = ppp_softc; - for (i = 0; i < NPPP; ++i, ++sc) { + SLIST_FOREACH(sc, &ppp_softc, sc_list) { s = splimp(); if (!(sc->sc_flags & SC_TBUSY) && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head)) { --- sys/net/if_pppvar.h.orig Sun Jun 7 13:12:04 1998 +++ sys/net/if_pppvar.h Tue Aug 31 10:13:08 1999 @@ -83,6 +83,7 @@ #ifdef VJC struct slcompress *sc_comp; /* vjc control buffer */ #endif + SLIST_ENTRY(ppp_softc) sc_list; /* list of ppp units */ /* Device-dependent part for async lines. */ ext_accm sc_asyncmap; /* async control character map */ @@ -97,8 +98,6 @@ u_char sc_rawin[16]; /* chars as received */ int sc_rawin_count; /* # in sc_rawin */ }; - -extern struct ppp_softc ppp_softc[NPPP]; struct ppp_softc *pppalloc __P((pid_t pid)); void pppdealloc __P((struct ppp_softc *sc)); --- sys/net/ppp_tty.c.orig Fri May 21 23:06:26 1999 +++ sys/net/ppp_tty.c Tue Aug 31 10:13:08 1999 @@ -90,6 +90,7 @@ #include <sys/conf.h> #include <sys/uio.h> #include <sys/vnode.h> +#include <sys/queue.h> #ifdef __i386__ #include <i386/isa/intr_machdep.h> >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199909160307.XAA00598>