X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/db1ff792ae4772fd4bf8cb91f1876f7d8c593713..ad7871609881e73855d0b04da49b486cd93efca7:/usr/src/sys/net/if_sl.c diff --git a/usr/src/sys/net/if_sl.c b/usr/src/sys/net/if_sl.c index 3f058ddd9d..0f51fc2a18 100644 --- a/usr/src/sys/net/if_sl.c +++ b/usr/src/sys/net/if_sl.c @@ -1,10 +1,36 @@ /* - * Copyright (c) 1987, 1989 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1987, 1989, 1992, 1993 + * The Regents of the University of California. All rights reserved. * - * %sccs.include.redist.c% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. * - * @(#)if_sl.c 7.24 (Berkeley) %G% + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if_sl.c 8.1 (Berkeley) 6/10/93 */ /* @@ -41,35 +67,36 @@ #include "sl.h" #if NSL > 0 -#include "param.h" -#include "proc.h" -#include "mbuf.h" -#include "buf.h" -#include "dk.h" -#include "socket.h" -#include "ioctl.h" -#include "file.h" -#include "tty.h" -#include "kernel.h" -#include "conf.h" - -#include "if.h" -#include "if_types.h" -#include "netisr.h" -#include "route.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + #if INET -#include "netinet/in.h" -#include "netinet/in_systm.h" -#include "netinet/in_var.h" -#include "netinet/ip.h" +#include +#include +#include +#include #else Huh? Slip without inet? #endif -#include "machine/mtpr.h" - -#include "slcompress.h" -#include "if_slvar.h" +#include +#include /* * SLMAX is a hard limit on input packet size. To simplify the code @@ -123,28 +150,13 @@ Huh? Slip without inet? * (inspired by HAYES modem escape arrangement) * 1sec escape 1sec escape 1sec escape { 1sec escape 1sec escape } * within window time signals a "soft" exit from slip mode by remote end + * if the IFF_DEBUG flag is on. */ - #define ABT_ESC '\033' /* can't be t_intr - distant host must know it*/ #define ABT_IDLE 1 /* in seconds - idle before an escape */ #define ABT_COUNT 3 /* count of escapes for abort */ #define ABT_WINDOW (ABT_COUNT*2+2) /* in seconds - time to count */ - -#ifdef nomore -/* - * The following disgusting hack gets around the problem that IP TOS - * can't be set yet. We want to put "interactive" traffic on a high - * priority queue. To decide if traffic is interactive, we check that - * a) it is TCP and b) one of its ports is telnet, rlogin or ftp control. - */ -static u_short interactive_ports[8] = { - 0, 513, 0, 0, - 0, 21, 0, 23, -}; -#define INTERACTIVE(p) (interactive_ports[(p) & 7] == (p)) -#endif - struct sl_softc sl_softc[NSL]; #define FRAME_END 0xc0 /* Frame End */ @@ -154,12 +166,15 @@ struct sl_softc sl_softc[NSL]; #define t_sc T_LINEP -int sloutput(), slioctl(), ttrstrt(); extern struct timeval time; +static int slinit __P((struct sl_softc *)); +static struct mbuf *sl_btom __P((struct sl_softc *, int)); + /* * Called from boot code to establish sl interfaces. */ +void slattach() { register struct sl_softc *sc; @@ -167,9 +182,11 @@ slattach() for (sc = sl_softc; i < NSL; sc++) { sc->sc_if.if_name = "sl"; + sc->sc_if.if_next = NULL; sc->sc_if.if_unit = i++; sc->sc_if.if_mtu = SLMTU; - sc->sc_if.if_flags = IFF_POINTOPOINT; + sc->sc_if.if_flags = + IFF_POINTOPOINT | SC_AUTOCOMP | IFF_MULTICAST; sc->sc_if.if_type = IFT_SLIP; sc->sc_if.if_ioctl = slioctl; sc->sc_if.if_output = sloutput; @@ -206,6 +223,7 @@ slinit(sc) * Attach the given tty to the first available sl unit. */ /* ARGSUSED */ +int slopen(dev, tp) dev_t dev; register struct tty *tp; @@ -237,8 +255,8 @@ slopen(dev, tp) /* * Line specific close routine. * Detach the tty from the sl unit. - * Mimics part of ttyclose(). */ +void slclose(tp) struct tty *tp; { @@ -266,9 +284,12 @@ slclose(tp) * Provide a way to get the sl unit number. */ /* ARGSUSED */ +int sltioctl(tp, cmd, data, flag) struct tty *tp; + int cmd; caddr_t data; + int flag; { struct sl_softc *sc = (struct sl_softc *)tp->t_sc; int s; @@ -278,25 +299,6 @@ sltioctl(tp, cmd, data, flag) *(int *)data = sc->sc_if.if_unit; break; -#ifdef notdef - case SLIOCGFLAGS: - *(int *)data = sc->sc_if.if_flags; - break; -#endif - - case SLIOCSFLAGS: - s = splimp(); - /* temp compat */ - sc->sc_if.if_flags &= ~(SC_COMPRESS | SC_NOICMP | SC_AUTOCOMP); - if (*(int *)data & 0x2) - sc->sc_if.if_flags |= SC_COMPRESS; - if (*(int *)data & 0x4) - sc->sc_if.if_flags |= SC_NOICMP; - if (*(int *)data & 0x8) - sc->sc_if.if_flags |= SC_AUTOCOMP; - splx(s); - break; - default: return (-1); } @@ -306,14 +308,17 @@ sltioctl(tp, cmd, data, flag) /* * Queue a packet. Start transmission if not active. */ -sloutput(ifp, m, dst) +int +sloutput(ifp, m, dst, rtp) struct ifnet *ifp; register struct mbuf *m; struct sockaddr *dst; + struct rtentry *rtp; { register struct sl_softc *sc = &sl_softc[ifp->if_unit]; register struct ip *ip; register struct ifqueue *ifq; + register int p; int s; /* @@ -337,25 +342,13 @@ sloutput(ifp, m, dst) return (EHOSTUNREACH); } ifq = &sc->sc_if.if_snd; - if ((ip = mtod(m, struct ip *))->ip_p == IPPROTO_TCP) { -#ifdef nomore - register int p = ((int *)ip)[ip->ip_hl]; - - if (INTERACTIVE(p & 0xffff) || INTERACTIVE(p >> 16)) { - ifq = &sc->sc_fastq; - p = 1; - } else - p = 0; -#else - register int p; - - if (ip->ip_tos & IPTOS_LOWDELAY) { - ifq = &sc->sc_fastq; - p = 1; - } else - p = 0; -#endif - + ip = mtod(m, struct ip *); + if (ip->ip_tos & IPTOS_LOWDELAY) { + ifq = &sc->sc_fastq; + p = 1; + } else + p = 0; + if (ip->ip_p == IPPROTO_TCP) { if (sc->sc_if.if_flags & SC_COMPRESS) { /* * The last parameter turns off connection id @@ -392,6 +385,7 @@ sloutput(ifp, m, dst) * to send from the interface queue and map it to * the interface before starting output. */ +void slstart(tp) register struct tty *tp; { @@ -567,6 +561,7 @@ sl_btom(sc, len) /* * tty interface receiver interrupt. */ +void slinput(c, tp) register int c; register struct tty *tp; @@ -697,13 +692,15 @@ newpack: /* * Process an ioctl request. */ +int slioctl(ifp, cmd, data) register struct ifnet *ifp; int cmd; caddr_t data; { register struct ifaddr *ifa = (struct ifaddr *)data; - int s = splimp(), error = 0; + register struct ifreq *ifr; + register int s = splimp(), error = 0; switch (cmd) { @@ -719,10 +716,30 @@ slioctl(ifp, cmd, data) error = EAFNOSUPPORT; break; + case SIOCADDMULTI: + case SIOCDELMULTI: + ifr = (struct ifreq *)data; + if (ifr == 0) { + error = EAFNOSUPPORT; /* XXX */ + break; + } + switch (ifr->ifr_addr.sa_family) { + +#ifdef INET + case AF_INET: + break; +#endif + + default: + error = EAFNOSUPPORT; + break; + } + break; +#endif + default: error = EINVAL; } splx(s); return (error); } -#endif