/*
- * 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
*/
/*
#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 <sys/param.h>
+#include <sys/proc.h>
+#include <sys/mbuf.h>
+#include <sys/buf.h>
+#include <sys/dkstat.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/file.h>
+#include <sys/tty.h>
+#include <sys/kernel.h>
+#include <sys/conf.h>
+
+#include <machine/cpu.h>
+
+#include <net/if.h>
+#include <net/if_types.h>
+#include <net/netisr.h>
+#include <net/route.h>
+
#if INET
-#include "netinet/in.h"
-#include "netinet/in_systm.h"
-#include "netinet/in_var.h"
-#include "netinet/ip.h"
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/in_var.h>
+#include <netinet/ip.h>
#else
Huh? Slip without inet?
#endif
-#include "machine/mtpr.h"
-
-#include "slcompress.h"
-#include "if_slvar.h"
+#include <net/slcompress.h>
+#include <net/if_slvar.h>
/*
* SLMAX is a hard limit on input packet size. To simplify the code
* (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 */
#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;
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;
* Attach the given tty to the first available sl unit.
*/
/* ARGSUSED */
+int
slopen(dev, tp)
dev_t dev;
register struct tty *tp;
/*
* Line specific close routine.
* Detach the tty from the sl unit.
- * Mimics part of ttyclose().
*/
+void
slclose(tp)
struct tty *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;
*(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);
}
/*
* 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;
/*
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
* to send from the interface queue and map it to
* the interface before starting output.
*/
+void
slstart(tp)
register struct tty *tp;
{
/*
* tty interface receiver interrupt.
*/
+void
slinput(c, tp)
register int c;
register struct tty *tp;
/*
* 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) {
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