Clean up the routing and networking code before I parallelize routing.
authorJeffrey Hsu <hsu@dragonflybsd.org>
Tue, 21 Dec 2004 02:54:48 +0000 (02:54 +0000)
committerJeffrey Hsu <hsu@dragonflybsd.org>
Tue, 21 Dec 2004 02:54:48 +0000 (02:54 +0000)
93 files changed:
sys/dev/netif/sbsh/if_sbsh.c
sys/net/bpf.c
sys/net/bpf.h
sys/net/bpf_compat.h [deleted file]
sys/net/bpf_filter.c
sys/net/bpfdesc.h
sys/net/bsd_comp.c
sys/net/ethernet.h
sys/net/faith/if_faith.c
sys/net/hostcache.c
sys/net/hostcache.h
sys/net/if.c
sys/net/if.h
sys/net/if_arcsubr.c
sys/net/if_arp.h
sys/net/if_atm.h
sys/net/if_ethersubr.c
sys/net/if_fddisubr.c
sys/net/if_iso88025subr.c
sys/net/if_loop.c
sys/net/if_media.c
sys/net/if_types.h
sys/net/if_var.h
sys/net/net_osdep.h
sys/net/pf/pf.c
sys/net/radix.c
sys/net/radix.h
sys/net/raw_cb.c
sys/net/raw_usrreq.c
sys/net/route.c
sys/net/route.h
sys/net/rtsock.c
sys/net/stf/if_stf.c
sys/net/zlib.c
sys/net/zlib.h
sys/netinet/icmp6.h
sys/netinet/icmp_var.h
sys/netinet/if_atm.c
sys/netinet/if_atm.h
sys/netinet/if_ether.c
sys/netinet/if_ether.h
sys/netinet/if_fddi.h
sys/netinet/igmp.c
sys/netinet/igmp.h
sys/netinet/in.c
sys/netinet/in.h
sys/netinet/in_cksum.c
sys/netinet/in_gif.c
sys/netinet/in_hostcache.c
sys/netinet/in_hostcache.h
sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet/in_proto.c
sys/netinet/in_rmx.c
sys/netinet/in_var.h
sys/netinet/ip6.h
sys/netinet/ip_demux.c
sys/netinet/ip_divert.c
sys/netinet/ip_flow.c
sys/netinet/ip_gre.c
sys/netinet/ip_gre.h
sys/netinet/ip_icmp.c
sys/netinet/ip_id.c
sys/netinet/ip_input.c
sys/netinet/ip_output.c
sys/netinet/ip_var.h
sys/netinet/tcp.h
sys/netinet/tcp_debug.h
sys/netinet/tcp_input.c
sys/netinet/tcp_output.c
sys/netinet/tcp_seq.h
sys/netinet/tcp_subr.c
sys/netinet/tcp_syncache.c
sys/netinet/tcp_timer.c
sys/netinet/tcp_usrreq.c
sys/netinet/tcp_var.h
sys/netinet/tcpip.h
sys/netinet/udp_usrreq.c
sys/netinet/udp_var.h
sys/netinet6/frag6.c
sys/netinet6/icmp6.c
sys/netinet6/in6.c
sys/netinet6/in6_gif.c
sys/netinet6/in6_ifattach.c
sys/netinet6/in6_pcb.c
sys/netinet6/in6_rmx.c
sys/netinet6/in6_src.c
sys/netinet6/ip6_input.c
sys/netinet6/ip6_output.c
sys/netinet6/nd6.c
sys/netinet6/nd6_nbr.c
sys/netinet6/nd6_rtr.c
sys/netproto/atalk/aarp.c

index 29c39e9..5f7af5d 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sbsh/if_sbsh.c,v 1.3.2.1 2003/04/15 18:15:07 fjoe Exp $
- * $DragonFly: src/sys/dev/netif/sbsh/if_sbsh.c,v 1.12 2004/07/23 07:16:28 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/sbsh/if_sbsh.c,v 1.13 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -459,7 +459,7 @@ sbsh_ioctl(struct ifnet     *ifp, u_long cmd, caddr_t data, struct ucred *cr)
                ds.status_3 = ((volatile u_int8_t *)sc->cmdp)[0x3c2];
 
                bcopy(&sc->in_stats, ifr->ifr_data, sizeof(struct sbni16_stats));
-               bcopy(&ds, ifr->ifr_data + sizeof(struct sbni16_stats),
+               bcopy(&ds, (char *)ifr->ifr_data + sizeof(struct sbni16_stats),
                    sizeof(struct dsl_stats));
                break;
 
index 287a8d8..f7e3105 100644 (file)
@@ -38,7 +38,7 @@
  *      @(#)bpf.c      8.2 (Berkeley) 3/28/94
  *
  * $FreeBSD: src/sys/net/bpf.c,v 1.59.2.12 2002/04/14 21:41:48 luigi Exp $
- * $DragonFly: src/sys/net/bpf.c,v 1.19 2004/07/07 15:16:04 joerg Exp $
+ * $DragonFly: src/sys/net/bpf.c,v 1.20 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include "use_bpf.h"
@@ -182,7 +182,7 @@ bpf_movein(struct uio *uio, int linktype, struct mbuf **mp,
                 * specified anyway.
                 */
                sockp->sa_family = AF_UNSPEC;
-               hlen = 12;      /* XXX 4(ATM_PH) + 3(LLC) + 5(SNAP) */
+               hlen = 12;      /* XXX 4(ATM_PH) + 3(LLC) + 5(SNAP) */
                break;
 
        case DLT_PPP:
@@ -200,11 +200,11 @@ bpf_movein(struct uio *uio, int linktype, struct mbuf **mp,
                return(EIO);
 
        MGETHDR(m, MB_WAIT, MT_DATA);
-       if (m == 0)
+       if (m == NULL)
                return(ENOBUFS);
        if (len > MHLEN) {
                MCLGET(m, MB_WAIT);
-               if ((m->m_flags & M_EXT) == 0) {
+               if (!(m->m_flags & M_EXT)) {
                        error = ENOBUFS;
                        goto bad;
                }
@@ -244,9 +244,7 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
         * it will divert packets to bpf.
         */
        d->bd_bif = bp;
-       d->bd_next = bp->bif_dlist;
-       bp->bif_dlist = d;
-
+       SLIST_INSERT_HEAD(&bp->bif_dlist, d, bd_next);
        bp->bif_ifp->if_bpf = bp;
 }
 
@@ -256,7 +254,6 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
 static void
 bpf_detachd(struct bpf_d *d)
 {
-       struct bpf_d **p;
        struct bpf_if *bp;
 
        bp = d->bd_bif;
@@ -276,20 +273,15 @@ bpf_detachd(struct bpf_d *d)
                }
        }
        /* Remove d from the interface's descriptor list. */
-       p = &bp->bif_dlist;
-       while (*p != d) {
-               p = &(*p)->bd_next;
-               if (*p == NULL)
-                       panic("bpf_detachd: descriptor not in list");
-       }
-       *p = (*p)->bd_next;
-       if (bp->bif_dlist == NULL) {
+       SLIST_REMOVE(&bp->bif_dlist, d, bpf_d, bd_next);
+
+       if (SLIST_EMPTY(&bp->bif_dlist)) {
                /*
                 * Let the driver know that there are no more listeners.
                 */
-               d->bd_bif->bif_ifp->if_bpf = 0;
+               d->bd_bif->bif_ifp->if_bpf = NULL;
        }
-       d->bd_bif = 0;
+       d->bd_bif = NULL;
 }
 
 /*
@@ -310,7 +302,7 @@ bpfopen(dev_t dev, int flags, int fmt, struct thread *td)
 
        d = dev->si_drv1;
        /*
-        * Each minor can be opened by only one process.  If the requested 
+        * Each minor can be opened by only one process.  If the requested
         * minor is in use, return EBUSY.
         */
        if (d != NULL)
@@ -345,7 +337,7 @@ bpfclose(dev_t dev, int flags, int fmt, struct thread *td)
                bpf_detachd(d);
        splx(s);
        bpf_freed(d);
-       dev->si_drv1 = 0;
+       dev->si_drv1 = NULL;
        free(d, M_BPF);
 
        return(0);
@@ -361,7 +353,7 @@ bpfclose(dev_t dev, int flags, int fmt, struct thread *td)
        (d)->bd_hlen = (d)->bd_slen; \
        (d)->bd_sbuf = (d)->bd_fbuf; \
        (d)->bd_slen = 0; \
-       (d)->bd_fbuf = 0;
+       (d)->bd_fbuf = NULL;
 /*
  *  bpfread - read next chunk of packets from buffers
  */
@@ -390,7 +382,7 @@ bpfread(dev_t dev, struct uio *uio, int ioflag)
         * ends when the timeout expires or when enough packets
         * have arrived to fill the store buffer.
         */
-       while (d->bd_hbuf == 0) {
+       while (d->bd_hbuf == NULL) {
                if ((d->bd_immediate || timed_out) && d->bd_slen != 0) {
                        /*
                         * A packet(s) either arrived since the previous
@@ -457,7 +449,7 @@ bpfread(dev_t dev, struct uio *uio, int ioflag)
 
        s = splimp();
        d->bd_fbuf = d->bd_hbuf;
-       d->bd_hbuf = 0;
+       d->bd_hbuf = NULL;
        d->bd_hlen = 0;
        splx(s);
 
@@ -475,7 +467,7 @@ bpf_wakeup(struct bpf_d *d)
                callout_stop(&d->bd_callout);
                d->bd_state = BPF_IDLE;
        }
-       wakeup((caddr_t)d);
+       wakeup(d);
        if (d->bd_async && d->bd_sig && d->bd_sigio)
                pgsigio(d->bd_sigio, d->bd_sig, 0);
 
@@ -509,7 +501,7 @@ bpfwrite(dev_t dev, struct uio *uio, int ioflag)
        static struct sockaddr dst;
        int datlen;
 
-       if (d->bd_bif == 0)
+       if (d->bd_bif == NULL)
                return(ENXIO);
 
        ifp = d->bd_bif->bif_ifp;
@@ -546,7 +538,7 @@ reset_d(struct bpf_d *d)
        if (d->bd_hbuf) {
                /* Free the hold buffer. */
                d->bd_fbuf = d->bd_hbuf;
-               d->bd_hbuf = 0;
+               d->bd_hbuf = NULL;
        }
        d->bd_slen = 0;
        d->bd_hlen = 0;
@@ -614,7 +606,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
                {
                        struct ifnet *ifp;
 
-                       if (d->bd_bif == 0)
+                       if (d->bd_bif == NULL)
                                error = EINVAL;
                        else {
                                ifp = d->bd_bif->bif_ifp;
@@ -668,7 +660,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
         * Put interface into promiscuous mode.
         */
        case BIOCPROMISC:
-               if (d->bd_bif == 0) {
+               if (d->bd_bif == NULL) {
                        /*
                         * No interface attached yet.
                         */
@@ -688,7 +680,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
         * Get device parameters.
         */
        case BIOCGDLT:
-               if (d->bd_bif == 0)
+               if (d->bd_bif == NULL)
                        error = EINVAL;
                else
                        *(u_int *)addr = d->bd_bif->bif_dlt;
@@ -698,7 +690,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
         * Get interface name.
         */
        case BIOCGETIF:
-               if (d->bd_bif == 0)
+               if (d->bd_bif == NULL)
                        error = EINVAL;
                else {
                        struct ifnet *const ifp = d->bd_bif->bif_ifp;
@@ -827,7 +819,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
 
        case BIOCSRSIG:         /* Set receive signal */
                {
-                       u_int sig;
+                       u_int sig;
 
                        sig = *(u_int *)addr;
 
@@ -856,15 +848,15 @@ bpf_setf(struct bpf_d *d, struct bpf_program *fp)
        int s;
 
        old = d->bd_filter;
-       if (fp->bf_insns == 0) {
+       if (fp->bf_insns == NULL) {
                if (fp->bf_len != 0)
                        return(EINVAL);
                s = splimp();
-               d->bd_filter = 0;
+               d->bd_filter = NULL;
                reset_d(d);
                splx(s);
                if (old != 0)
-                       free((caddr_t)old, M_BPF);
+                       free(old, M_BPF);
                return(0);
        }
        flen = fp->bf_len;
@@ -873,18 +865,18 @@ bpf_setf(struct bpf_d *d, struct bpf_program *fp)
 
        size = flen * sizeof(*fp->bf_insns);
        fcode = (struct bpf_insn *)malloc(size, M_BPF, M_WAITOK);
-       if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size) == 0 &&
+       if (copyin(fp->bf_insns, fcode, size) == 0 &&
            bpf_validate(fcode, (int)flen)) {
                s = splimp();
                d->bd_filter = fcode;
                reset_d(d);
                splx(s);
                if (old != 0)
-                       free((caddr_t)old, M_BPF);
+                       free(old, M_BPF);
 
                return(0);
        }
-       free((caddr_t)fcode, M_BPF);
+       free(fcode, M_BPF);
        return(EINVAL);
 }
 
@@ -901,7 +893,7 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr)
        struct ifnet *theywant;
 
        theywant = ifunit(ifr->ifr_name);
-       if (theywant == 0)
+       if (theywant == NULL)
                return(ENXIO);
 
        /*
@@ -910,7 +902,7 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr)
        for (bp = bpf_iflist; bp != 0; bp = bp->bif_next) {
                struct ifnet *ifp = bp->bif_ifp;
 
-               if (ifp == 0 || ifp != theywant)
+               if (ifp == NULL || ifp != theywant)
                        continue;
                /*
                 * We found the requested interface.
@@ -919,7 +911,7 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr)
                 * If we're already attached to requested interface,
                 * just flush the buffer.
                 */
-               if ((ifp->if_flags & IFF_UP) == 0)
+               if (!(ifp->if_flags & IFF_UP))
                        return(ENETDOWN);
 
                if (d->bd_sbuf == NULL) {
@@ -1000,16 +992,16 @@ bpfpoll(dev_t dev, int events, struct thread *td)
 void
 bpf_tap(struct ifnet *ifp, u_char *pkt, u_int pktlen)
 {
-       struct bpf_if *bp;
+       struct bpf_if *bp = ifp->if_bpf;
        struct bpf_d *d;
        u_int slen;
+
        /*
         * Note that the ipl does not have to be raised at this point.
         * The only problem that could arise here is that if two different
         * interfaces shared any data.  This is not the case.
         */
-       bp = ifp->if_bpf;
-       for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
+       SLIST_FOREACH(d, &bp->bif_dlist, bd_next) {
                ++d->bd_rcount;
                slen = bpf_filter(d->bd_filter, pkt, pktlen, pktlen);
                if (slen != 0)
@@ -1053,10 +1045,10 @@ bpf_mtap(struct ifnet *ifp, struct mbuf *m)
        struct mbuf *m0;
 
        pktlen = 0;
-       for (m0 = m; m0 != 0; m0 = m0->m_next)
+       for (m0 = m; m0 != NULL; m0 = m0->m_next)
                pktlen += m0->m_len;
 
-       for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
+       SLIST_FOREACH(d, &bp->bif_dlist, bd_next) {
                if (!d->bd_seesent && (m->m_pkthdr.rcvif == NULL))
                        continue;
                ++d->bd_rcount;
@@ -1101,7 +1093,7 @@ catchpacket(struct bpf_d *d, u_char *pkt, u_int pktlen, u_int snaplen,
                 * Rotate the buffers if we can, then wakeup any
                 * pending reads.
                 */
-               if (d->bd_fbuf == 0) {
+               if (d->bd_fbuf == NULL) {
                        /*
                         * We haven't completed the previous read yet,
                         * so drop the packet.
@@ -1167,15 +1159,15 @@ bpf_freed(struct bpf_d *d)
         * been detached from its interface and it yet hasn't been marked
         * free.
         */
-       if (d->bd_sbuf != 0) {
+       if (d->bd_sbuf != NULL) {
                free(d->bd_sbuf, M_BPF);
-               if (d->bd_hbuf != 0)
+               if (d->bd_hbuf != NULL)
                        free(d->bd_hbuf, M_BPF);
-               if (d->bd_fbuf != 0)
+               if (d->bd_fbuf != NULL)
                        free(d->bd_fbuf, M_BPF);
        }
        if (d->bd_filter)
-               free((caddr_t)d->bd_filter, M_BPF);
+               free(d->bd_filter, M_BPF);
 }
 
 /*
@@ -1197,7 +1189,7 @@ bpfattach(struct ifnet *ifp, u_int dlt, u_int hdrlen)
        bp->bif_next = bpf_iflist;
        bpf_iflist = bp;
 
-       bp->bif_ifp->if_bpf = 0;
+       bp->bif_ifp->if_bpf = NULL;
 
        /*
         * Compute the length of the bpf header.  This is not necessarily
@@ -1241,7 +1233,7 @@ bpfdetach(struct ifnet *ifp)
                return;
        }
 
-       while ((d = bp->bif_dlist) != NULL) {
+       while ((d = SLIST_FIRST(&bp->bif_dlist)) != NULL) {
                bpf_detachd(d);
                bpf_wakeup(d);
        }
index 6624029..9573104 100644 (file)
@@ -39,7 +39,7 @@
  *     @(#)bpf.h       1.34 (LBL)     6/16/96
  *
  * $FreeBSD: src/sys/net/bpf.h,v 1.21.2.4 2002/07/05 14:40:00 fenner Exp $
- * $DragonFly: src/sys/net/bpf.h,v 1.6 2004/09/19 22:32:47 joerg Exp $
+ * $DragonFly: src/sys/net/bpf.h,v 1.7 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _NET_BPF_H_
@@ -294,7 +294,7 @@ struct bpf_hdr {
 #define                BPF_H           0x08
 #define                BPF_B           0x10
 #define BPF_MODE(code) ((code) & 0xe0)
-#define                BPF_IMM         0x00
+#define                BPF_IMM         0x00
 #define                BPF_ABS         0x20
 #define                BPF_IND         0x40
 #define                BPF_MEM         0x60
diff --git a/sys/net/bpf_compat.h b/sys/net/bpf_compat.h
deleted file mode 100644 (file)
index f7c5b57..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * 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.
- *
- * 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.
- *
- *     @(#)bpf_compat.h        8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/net/bpf_compat.h,v 1.6 1999/08/28 00:48:13 peter Exp $
- * $DragonFly: src/sys/net/Attic/bpf_compat.h,v 1.2 2003/06/17 04:28:47 dillon Exp $
- */
-
-#ifndef _NET_BPF_COMPAT_H_
-#define _NET_BPF_COMPAT_H_
-
-/*
- * Some hacks for compatibility across SunOS and 4.4BSD.  We emulate malloc
- * and free with mbuf clusters.  We store a pointer to the mbuf in the first
- * word of the mbuf and return 8 bytes passed the start of data (for double
- * word alignment).  We cannot just use offsets because clusters are not at
- * a fixed offset from the associated mbuf.  Sorry for this kludge.
- */
-#define malloc(size, type, canwait) bpf_alloc(size, canwait)
-#define free(cp, type) m_free(*(struct mbuf **)(cp - 8))
-#define M_WAITOK M_WAIT
-
-/* This mapping works for our purposes. */
-#define ERESTART EINTR
-
-#endif
index b487f39..3e969c3 100644 (file)
@@ -38,7 +38,7 @@
  *      @(#)bpf_filter.c       8.1 (Berkeley) 6/10/93
  *
  * $FreeBSD: src/sys/net/bpf_filter.c,v 1.17 1999/12/29 04:38:31 peter Exp $
- * $DragonFly: src/sys/net/bpf_filter.c,v 1.5 2004/07/27 01:24:28 cpressey Exp $
+ * $DragonFly: src/sys/net/bpf_filter.c,v 1.6 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -70,7 +70,7 @@
 #define MINDEX(m, k)                                                   \
 {                                                                      \
        int len = m->m_len;                                             \
-                                                                       \
+                                                                       \
        while (k >= len) {                                              \
                k -= len;                                               \
                m = m->m_next;                                          \
index 143cc84..90fc8f9 100644 (file)
@@ -38,7 +38,7 @@
  *      @(#)bpfdesc.h  8.1 (Berkeley) 6/10/93
  *
  * $FreeBSD: src/sys/net/bpfdesc.h,v 1.14.2.2 2001/12/17 19:32:33 jdp Exp $
- * $DragonFly: src/sys/net/bpfdesc.h,v 1.2 2003/06/17 04:28:47 dillon Exp $
+ * $DragonFly: src/sys/net/bpfdesc.h,v 1.3 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _NET_BPFDESC_H_
@@ -51,7 +51,7 @@
  * Descriptor associated with each open bpf file.
  */
 struct bpf_d {
-       struct bpf_d    *bd_next;       /* Linked list of descriptors */
+       SLIST_ENTRY(bpf_d) bd_next;     /* Linked list of descriptors */
        /*
         * Buffer slots: two mbuf clusters buffer the incoming packets.
         *   The model has three slots.  Sbuf is always occupied.
@@ -64,14 +64,14 @@ struct bpf_d {
        caddr_t         bd_sbuf;        /* store slot */
        caddr_t         bd_hbuf;        /* hold slot */
        caddr_t         bd_fbuf;        /* free slot */
-       int             bd_slen;        /* current length of store buffer */
-       int             bd_hlen;        /* current length of hold buffer */
+       int             bd_slen;        /* current length of store buffer */
+       int             bd_hlen;        /* current length of hold buffer */
 
        int             bd_bufsize;     /* absolute length of buffers */
 
        struct bpf_if * bd_bif;         /* interface descriptor */
        u_long          bd_rtout;       /* Read timeout in 'ticks' */
-       struct bpf_insn *bd_filter;     /* filter code */
+       struct bpf_insn *bd_filter;     /* filter code */
        u_long          bd_rcount;      /* number of packets received */
        u_long          bd_dcount;      /* number of packets dropped */
 
@@ -104,7 +104,7 @@ struct bpf_d {
  */
 struct bpf_if {
        struct bpf_if *bif_next;        /* list of all interfaces */
-       struct bpf_d *bif_dlist;        /* descriptor list */
+       SLIST_HEAD(, bpf_d) bif_dlist;  /* descriptor list */
        u_int bif_dlt;                  /* link layer type */
        u_int bif_hdrlen;               /* length of header (with padding) */
        struct ifnet *bif_ifp;          /* corresponding interface */
index 029ee4a..46b79ea 100644 (file)
@@ -41,7 +41,7 @@
  * This version is for use with mbufs on BSD-derived systems.
  *
  * $FreeBSD: src/sys/net/bsd_comp.c,v 1.11.2.1 2002/04/14 21:41:48 luigi Exp $
- * $DragonFly: src/sys/net/bsd_comp.c,v 1.7 2004/07/27 01:24:28 cpressey Exp $
+ * $DragonFly: src/sys/net/bsd_comp.c,v 1.8 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -440,8 +440,8 @@ bsd_decomp_init(void *state, u_char *options, int opt_len,
  * compress a packet
  *     One change from the BSD compress command is that when the
  *     code size expands, we do not output a bunch of padding.
- *   **mret    - return compressed mbuf chain here
- *   *mp       - from here
+ *   **mret    - return compressed mbuf chain here
+ *   *mp       - from here
  *   slen      - uncompressed length
  *   maxolen   - max compressed length
  */
@@ -755,7 +755,7 @@ bsd_incomp(void *state, struct mbuf *dmsg)
     bitno += n_bits;           /* output (count) the last code */
     db->bytes_out += bitno/8;
     db->in_count += ilen;
-    (void)bsd_check(db);
+    bsd_check(db);
 
     ++db->incomp_count;
     db->incomp_bytes += ilen;
index e516aa6..15154e4 100644 (file)
@@ -2,7 +2,7 @@
  * Fundamental constants relating to ethernet.
  *
  * $FreeBSD: src/sys/net/ethernet.h,v 1.12.2.8 2002/12/01 14:03:09 sobomax Exp $
- * $DragonFly: src/sys/net/ethernet.h,v 1.9 2004/07/26 14:41:17 joerg Exp $
+ * $DragonFly: src/sys/net/ethernet.h,v 1.10 2004/12/21 02:54:14 hsu Exp $
  *
  */
 
@@ -92,23 +92,23 @@ extern const uint8_t        etherbroadcastaddr[ETHER_ADDR_LEN];
                             /* 0x0400     Nixdorf */
 #define        ETHERTYPE_NS            0x0600  /* XNS */
 #define        ETHERTYPE_NSAT          0x0601  /* XNS Address Translation (3Mb only) */
-#define        ETHERTYPE_DLOG1         0x0660  /* DLOG (?) */
-#define        ETHERTYPE_DLOG2         0x0661  /* DLOG (?) */
+#define        ETHERTYPE_DLOG1         0x0660  /* DLOG (?) */
+#define        ETHERTYPE_DLOG2         0x0661  /* DLOG (?) */
 #define        ETHERTYPE_IP            0x0800  /* IP protocol */
 #define        ETHERTYPE_X75           0x0801  /* X.75 Internet */
 #define        ETHERTYPE_NBS           0x0802  /* NBS Internet */
 #define        ETHERTYPE_ECMA          0x0803  /* ECMA Internet */
-#define        ETHERTYPE_CHAOS         0x0804  /* CHAOSnet */
+#define        ETHERTYPE_CHAOS         0x0804  /* CHAOSnet */
 #define        ETHERTYPE_X25           0x0805  /* X.25 Level 3 */
 #define        ETHERTYPE_ARP           0x0806  /* Address resolution protocol */
 #define        ETHERTYPE_NSCOMPAT      0x0807  /* XNS Compatibility */
-#define        ETHERTYPE_FRARP         0x0808  /* Frame Relay ARP (RFC1701) */
+#define        ETHERTYPE_FRARP         0x0808  /* Frame Relay ARP (RFC1701) */
                             /* 0x081C     Symbolics Private */
                    /* 0x0888 - 0x088A     Xyplex */
 #define        ETHERTYPE_UBDEBUG       0x0900  /* Ungermann-Bass network debugger */
 #define        ETHERTYPE_IEEEPUP       0x0A00  /* Xerox IEEE802.3 PUP */
 #define        ETHERTYPE_IEEEPUPAT     0x0A01  /* Xerox IEEE802.3 PUP Address Translation */
-#define        ETHERTYPE_VINES         0x0BAD  /* Banyan VINES */
+#define        ETHERTYPE_VINES         0x0BAD  /* Banyan VINES */
 #define        ETHERTYPE_VINESLOOP     0x0BAE  /* Banyan VINES Loopback */
 #define        ETHERTYPE_VINESECHO     0x0BAF  /* Banyan VINES Echo */
 
@@ -122,7 +122,7 @@ extern const uint8_t        etherbroadcastaddr[ETHER_ADDR_LEN];
 #define        ETHERTYPE_NTRAILER      16
 
 #define        ETHERTYPE_DCA           0x1234  /* DCA - Multicast */
-#define        ETHERTYPE_VALID         0x1600  /* VALID system protocol */
+#define        ETHERTYPE_VALID         0x1600  /* VALID system protocol */
 #define        ETHERTYPE_DOGFIGHT      0x1989  /* Artificial Horizons ("Aviator" dogfight simulator [on Sun]) */
 #define        ETHERTYPE_RCL           0x1995  /* Datapoint Corporation (RCL lan protocol) */
 
@@ -387,7 +387,7 @@ __BEGIN_DECLS
 struct ether_addr *ether_aton (const char *);
 int    ether_hostton (const char *, struct ether_addr *);
 int    ether_line (const char *, struct ether_addr *, char *);
-char   *ether_ntoa (const struct ether_addr *);
+char   *ether_ntoa (const struct ether_addr *);
 int    ether_ntohost (char *, const struct ether_addr *);
 __END_DECLS
 
index 918f289..0ee9998 100644 (file)
@@ -33,7 +33,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_faith.c,v 1.3.2.6 2002/04/28 05:40:25 suz Exp $
- * $DragonFly: src/sys/net/faith/if_faith.c,v 1.8 2004/03/23 22:19:06 hsu Exp $
+ * $DragonFly: src/sys/net/faith/if_faith.c,v 1.9 2004/12/21 02:54:15 hsu Exp $
  */
 /*
  * derived from
@@ -368,9 +368,9 @@ faithprefix(in6)
        sin6.sin6_family = AF_INET6;
        sin6.sin6_len = sizeof(struct sockaddr_in6);
        sin6.sin6_addr = *in6;
-       rt = rtalloc1((struct sockaddr *)&sin6, 0, 0UL);
+       rt = rtlookup((struct sockaddr *)&sin6, 0, 0UL);
        if (rt && rt->rt_ifp && rt->rt_ifp->if_type == IFT_FAITH &&
-           (rt->rt_ifp->if_flags & IFF_UP) != 0)
+           (rt->rt_ifp->if_flags & IFF_UP))
                ret = 1;
        else
                ret = 0;
index be2df15..9b11354 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/hostcache.c,v 1.6.2.1 2002/04/14 21:41:48 luigi Exp $
- * $DragonFly: src/sys/net/Attic/hostcache.c,v 1.3 2004/09/15 20:38:36 joerg Exp $
+ * $DragonFly: src/sys/net/Attic/hostcache.c,v 1.4 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -77,8 +77,7 @@ hc_init(int af, struct hccallback *hccb, int init_nelem, int primes)
        hct->hct_nentries = nelem;
        hct->hct_primes = primes;
        callout_init(&hc_timeout_h);
-       callout_reset(&hc_timeout_h, hc_timeout_interval * hz,
-                     hc_timeout, hct);
+       callout_reset(&hc_timeout_h, hc_timeout_interval * hz, hc_timeout, hct);
        return 0;
 }
 
@@ -99,15 +98,15 @@ hc_get(struct sockaddr *sa)
                if (cmpsa(hc->hc_host, sa) == 0)
                        break;
        }
-       if (hc == 0)
-               return 0;
+       if (hc == NULL)
+               return NULL;
        s = splnet();
-       if (hc->hc_rt && (hc->hc_rt->rt_flags & RTF_UP) == 0) {
+       if (hc->hc_rt && !(hc->hc_rt->rt_flags & RTF_UP)) {
                RTFREE(hc->hc_rt);
-               hc->hc_rt = 0;
+               hc->hc_rt = NULL;
        }
-       if (hc->hc_rt == 0) {
-               hc->hc_rt = rtalloc1(hc->hc_host, 1, 0);
+       if (hc->hc_rt == NULL) {
+               hc->hc_rt = rtlookup(hc->hc_host, 1, 0);
        }
        hc_ref(hc);
        splx(s);
@@ -162,7 +161,7 @@ hc_insert(struct hcentry *hc)
                if (cmpsa(hc2->hc_host, hc->hc_host) == 0)
                        break;
        }
-       if (hc2 != 0)
+       if (hc2 != NULL)
                return EEXIST;
        hc->hc_hct = hct;
        s = splnet();
index d1d17a2..c367160 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/hostcache.h,v 1.4 1999/12/29 04:38:32 peter Exp $
- * $DragonFly: src/sys/net/Attic/hostcache.h,v 1.2 2003/06/17 04:28:47 dillon Exp $
+ * $DragonFly: src/sys/net/Attic/hostcache.h,v 1.3 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _NET_HOSTCACHE_H
@@ -56,7 +56,7 @@ struct hcentry {
        struct  rtentry *hc_rt;         /* route to get there */
        /* struct nexthop *hc_nh; */
        int     hc_refcnt;              /* reference count */
-       struct  hctable *hc_hct;        /* back ref to table */
+       struct  hctable *hc_hct;        /* back ref to table */
 };
 
 struct hccallback {
index a42ec18..3589184 100644 (file)
@@ -31,8 +31,8 @@
  * SUCH DAMAGE.
  *
  *     @(#)if.c        8.3 (Berkeley) 1/4/94
- * $FreeBSD: src/sys/net/if.c,v 1.185 2004/03/13 02:35:03 brooks Exp $ 
- * $DragonFly: src/sys/net/if.c,v 1.22 2004/09/15 19:34:55 joerg Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.185 2004/03/13 02:35:03 brooks Exp $
+ * $DragonFly: src/sys/net/if.c,v 1.23 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include "opt_compat.h"
@@ -123,8 +123,7 @@ struct callout if_slowtimo_timer;
  */
 /* ARGSUSED*/
 void
-ifinit(dummy)
-       void *dummy;
+ifinit(void *dummy)
 {
        struct ifnet *ifp;
        int s;
@@ -147,14 +146,12 @@ int if_index = 0;
 struct ifaddr **ifnet_addrs;
 struct ifnet **ifindex2ifnet = NULL;
 
-
 /*
  * Attach an interface to the
  * list of "active" interfaces.
  */
 void
-if_attach(ifp)
-       struct ifnet *ifp;
+if_attach(struct ifnet *ifp)
 {
        unsigned socksize, ifasize;
        int namelen, masklen;
@@ -181,13 +178,13 @@ if_attach(ifp)
        TAILQ_INIT(&ifp->if_prefixhead);
        LIST_INIT(&ifp->if_multiaddrs);
        getmicrotime(&ifp->if_lastchange);
-       if (ifnet_addrs == 0 || if_index >= if_indexlim) {
+       if (ifnet_addrs == NULL || if_index >= if_indexlim) {
                unsigned n = (if_indexlim <<= 1) * sizeof(ifa);
                caddr_t q = malloc(n, M_IFADDR, M_WAITOK);
                bzero(q, n);
-               if (ifnet_addrs) {
-                       bcopy((caddr_t)ifnet_addrs, (caddr_t)q, n/2);
-                       free((caddr_t)ifnet_addrs, M_IFADDR);
+               if (ifnet_addrs != NULL) {
+                       bcopy(ifnet_addrs, q, n/2);
+                       free(ifnet_addrs, M_IFADDR);
                }
                ifnet_addrs = (struct ifaddr **)q;
 
@@ -196,8 +193,8 @@ if_attach(ifp)
                q = malloc(n, M_IFADDR, M_WAITOK);
                bzero(q, n);
                if (ifindex2ifnet) {
-                       bcopy((caddr_t)ifindex2ifnet, q, n/2);
-                       free((caddr_t)ifindex2ifnet, M_IFADDR);
+                       bcopy(ifindex2ifnet, q, n/2);
+                       free(ifindex2ifnet, M_IFADDR);
                }
                ifindex2ifnet = (struct ifnet **)q;
        }
@@ -218,7 +215,7 @@ if_attach(ifp)
        ifasize = sizeof(*ifa) + 2 * socksize;
        ifa = (struct ifaddr *)malloc(ifasize, M_IFADDR, M_WAITOK);
        if (ifa) {
-               bzero((caddr_t)ifa, ifasize);
+               bzero(ifa, ifasize);
                sdl = (struct sockaddr_dl *)(ifa + 1);
                sdl->sdl_len = socksize;
                sdl->sdl_family = AF_LINK;
@@ -249,8 +246,7 @@ if_attach(ifp)
  * list of "active" interfaces.
  */
 void
-if_detach(ifp)
-       struct ifnet *ifp;
+if_detach(struct ifnet *ifp)
 {
        struct ifaddr *ifa;
        struct radix_node_head  *rnh;
@@ -280,7 +276,7 @@ if_detach(ifp)
                if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) {
                        struct ifaliasreq ifr;
 
-                       bzero(&ifr, sizeof(ifr));
+                       bzero(&ifr, sizeof ifr);
                        ifr.ifra_addr = *ifa->ifa_addr;
                        if (ifa->ifa_dstaddr)
                                ifr.ifra_broadaddr = *ifa->ifa_dstaddr;
@@ -319,7 +315,7 @@ if_detach(ifp)
        for (i = 1; i <= AF_MAX; i++) {
                if ((rnh = rt_tables[i]) == NULL)
                        continue;
-               (void) rnh->rnh_walktree(rnh, if_rtdel, ifp);
+               rnh->rnh_walktree(rnh, if_rtdel, ifp);
        }
 
        /* Announce that the interface is gone. */
@@ -333,7 +329,7 @@ if_detach(ifp)
 
 /*
  * Delete Routes for a Network Interface
- * 
+ *
  * Called for each routing entry via the rnh->rnh_walktree() call above
  * to delete all route entries referencing a detaching network interface.
  *
@@ -347,9 +343,7 @@ if_detach(ifp)
  *
  */
 static int
-if_rtdel(rn, arg)
-       struct radix_node       *rn;
-       void                    *arg;
+if_rtdel(struct radix_node *rn, void *arg)
 {
        struct rtentry  *rt = (struct rtentry *)rn;
        struct ifnet    *ifp = arg;
@@ -361,7 +355,7 @@ if_rtdel(rn, arg)
                 * Protect (sorta) against walktree recursion problems
                 * with cloned routes
                 */
-               if ((rt->rt_flags & RTF_UP) == 0)
+               if (!(rt->rt_flags & RTF_UP))
                        return (0);
 
                err = rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
@@ -379,9 +373,7 @@ if_rtdel(rn, arg)
  * Create a clone network interface.
  */
 int
-if_clone_create(name, len)
-       char *name;
-       int len;
+if_clone_create(char *name, int len)
 {
        struct if_clone *ifc;
        char *dp;
@@ -402,8 +394,8 @@ if_clone_create(name, len)
         * Find a free unit if none was given.
         */
        if (wildcard) {
-               while ((bytoff < ifc->ifc_bmlen)
-                   && (ifc->ifc_units[bytoff] == 0xff))
+               while (bytoff < ifc->ifc_bmlen &&
+                   ifc->ifc_units[bytoff] == 0xff)
                        bytoff++;
                if (bytoff >= ifc->ifc_bmlen)
                        return (ENOSPC);
@@ -455,8 +447,7 @@ if_clone_create(name, len)
  * Destroy a clone network interface.
  */
 int
-if_clone_destroy(name)
-       const char *name;
+if_clone_destroy(const char *name)
 {
        struct if_clone *ifc;
        struct ifnet *ifp;
@@ -494,9 +485,7 @@ if_clone_destroy(name)
  * Look up a network interface cloner.
  */
 struct if_clone *
-if_clone_lookup(name, unitp)
-       const char *name;
-       int *unitp;
+if_clone_lookup(const char *name, int *unitp)
 {
        struct if_clone *ifc;
        const char *cp;
@@ -537,8 +526,7 @@ if_clone_lookup(name, unitp)
  * Register a network interface cloner.
  */
 void
-if_clone_attach(ifc)
-       struct if_clone *ifc;
+if_clone_attach(struct if_clone *ifc)
 {
        int bytoff, bitoff;
        int err;
@@ -579,8 +567,7 @@ if_clone_attach(ifc)
  * Unregister a network interface cloner.
  */
 void
-if_clone_detach(ifc)
-       struct if_clone *ifc;
+if_clone_detach(struct if_clone *ifc)
 {
 
        LIST_REMOVE(ifc, ifc_list);
@@ -592,8 +579,7 @@ if_clone_detach(ifc)
  * Provide list of interface cloners to userspace.
  */
 int
-if_clone_list(ifcr)
-       struct if_clonereq *ifcr;
+if_clone_list(struct if_clonereq *ifcr)
 {
        char outbuf[IFNAMSIZ], *dst;
        struct if_clone *ifc;
@@ -625,16 +611,15 @@ if_clone_list(ifcr)
 /*
  * Locate an interface based on a complete address.
  */
-/*ARGSUSED*/
 struct ifaddr *
-ifa_ifwithaddr(addr)
-       struct sockaddr *addr;
+ifa_ifwithaddr(struct sockaddr *addr)
 {
        struct ifnet *ifp;
        struct ifaddr *ifa;
 
 #define        equal(a1, a2) \
-  (bcmp((caddr_t)(a1), (caddr_t)(a2), ((struct sockaddr *)(a1))->sa_len) == 0)
+  (bcmp((a1), (a2), ((struct sockaddr *)(a1))->sa_len) == 0)
+
        TAILQ_FOREACH(ifp, &ifnet, if_link)
            TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
                if (ifa->ifa_addr->sa_family != addr->sa_family)
@@ -652,10 +637,8 @@ ifa_ifwithaddr(addr)
 /*
  * Locate the point to point interface with a given destination address.
  */
-/*ARGSUSED*/
 struct ifaddr *
-ifa_ifwithdstaddr(addr)
-       struct sockaddr *addr;
+ifa_ifwithdstaddr(struct sockaddr *addr)
 {
        struct ifnet *ifp;
        struct ifaddr *ifa;
@@ -676,8 +659,7 @@ ifa_ifwithdstaddr(addr)
  * is most specific found.
  */
 struct ifaddr *
-ifa_ifwithnet(addr)
-       struct sockaddr *addr;
+ifa_ifwithnet(struct sockaddr *addr)
 {
        struct ifnet *ifp;
        struct ifaddr *ifa;
@@ -714,15 +696,15 @@ next:                             continue;
                                 * The trouble is that we don't know the
                                 * netmask for the remote end.
                                 */
-                               if (ifa->ifa_dstaddr != 0
-                                   && equal(addr, ifa->ifa_dstaddr))
-                                       return (ifa);
+                               if (ifa->ifa_dstaddr != 0 &&
+                                   equal(addr, ifa->ifa_dstaddr))
+                                       return (ifa);
                        } else {
                                /*
                                 * if we have a special address handler,
                                 * then use it instead of the generic one.
                                 */
-                               if (ifa->ifa_claim_addr) {
+                               if (ifa->ifa_claim_addr) {
                                        if ((*ifa->ifa_claim_addr)(ifa, addr)) {
                                                return (ifa);
                                        } else {
@@ -755,8 +737,8 @@ next:                               continue;
                                 * for an even better one.
                                 */
                                if (ifa_maybe == 0 ||
-                                   rn_refines((caddr_t)ifa->ifa_netmask,
-                                   (caddr_t)ifa_maybe->ifa_netmask))
+                                   rn_refines((char *)ifa->ifa_netmask,
+                                              (char *)ifa_maybe->ifa_netmask))
                                        ifa_maybe = ifa;
                        }
                }
@@ -769,9 +751,7 @@ next:                               continue;
  * a given address.
  */
 struct ifaddr *
-ifaof_ifpforaddr(addr, ifp)
-       struct sockaddr *addr;
-       struct ifnet *ifp;
+ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
 {
        struct ifaddr *ifa;
        char *cp, *cp2, *cp3;
@@ -818,23 +798,20 @@ ifaof_ifpforaddr(addr, ifp)
  * This should be moved to /sys/net/link.c eventually.
  */
 static void
-link_rtrequest(cmd, rt, info)
-       int cmd;
-       struct rtentry *rt;
-       struct rt_addrinfo *info;
+link_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
 {
        struct ifaddr *ifa;
        struct sockaddr *dst;
        struct ifnet *ifp;
 
-       if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == 0) ||
-           ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0))
+       if (cmd != RTM_ADD || (ifa = rt->rt_ifa) == NULL ||
+           (ifp = ifa->ifa_ifp) == NULL || (dst = rt_key(rt)) == NULL)
                return;
        ifa = ifaof_ifpforaddr(dst, ifp);
-       if (ifa) {
+       if (ifa != NULL) {
                IFAFREE(rt->rt_ifa);
+               IFAREF(ifa);
                rt->rt_ifa = ifa;
-               ifa->ifa_refcnt++;
                if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest)
                        ifa->ifa_rtrequest(cmd, rt, info);
        }
@@ -846,9 +823,7 @@ link_rtrequest(cmd, rt, info)
  * NOTE: must be called at splnet or eqivalent.
  */
 void
-if_unroute(ifp, flag, fam)
-       struct ifnet *ifp;
-       int flag, fam;
+if_unroute(struct ifnet *ifp, int flag, int fam)
 {
        struct ifaddr *ifa;
 
@@ -867,9 +842,7 @@ if_unroute(ifp, flag, fam)
  * NOTE: must be called at splnet or eqivalent.
  */
 void
-if_route(ifp, flag, fam)
-       struct ifnet *ifp;
-       int flag, fam;
+if_route(struct ifnet *ifp, int flag, int fam)
 {
        struct ifaddr *ifa;
 
@@ -890,8 +863,7 @@ if_route(ifp, flag, fam)
  * NOTE: must be called at splnet or eqivalent.
  */
 void
-if_down(ifp)
-       struct ifnet *ifp;
+if_down(struct ifnet *ifp)
 {
 
        if_unroute(ifp, IFF_UP, AF_UNSPEC);
@@ -903,8 +875,7 @@ if_down(ifp)
  * NOTE: must be called at splnet or eqivalent.
  */
 void
-if_up(ifp)
-       struct ifnet *ifp;
+if_up(struct ifnet *ifp)
 {
 
        if_route(ifp, IFF_UP, AF_UNSPEC);
@@ -914,8 +885,7 @@ if_up(ifp)
  * Flush an interface queue.
  */
 static void
-if_qflush(ifq)
-       struct ifqueue *ifq;
+if_qflush(struct ifqueue *ifq)
 {
        struct mbuf *m, *n;
 
@@ -935,8 +905,7 @@ if_qflush(ifq)
  * call the appropriate interface routine on expiration.
  */
 static void
-if_slowtimo(arg)
-       void *arg;
+if_slowtimo(void *arg)
 {
        struct ifnet *ifp;
        int s = splimp();
@@ -977,8 +946,7 @@ ifunit(const char *name)
  * interface structure pointer.
  */
 struct ifnet *
-if_withname(sa)
-       struct sockaddr *sa;
+if_withname(struct sockaddr *sa)
 {
        char ifname[IFNAMSIZ+1];
        struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
@@ -1033,7 +1001,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
                return ((cmd == SIOCIFCREATE) ?
                        if_clone_create(ifr->ifr_name, sizeof(ifr->ifr_name)) :
                        if_clone_destroy(ifr->ifr_name));
-       
+
        case SIOCIFGCLONERS:
                return (if_clone_list((struct if_clonereq *)data));
        }
@@ -1093,8 +1061,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
                        ifp->if_flags &= ~IFF_PROMISC;
                }
                if (ifp->if_ioctl)
-                       (void) (*ifp->if_ioctl)(ifp, cmd, data,
-                                               td->td_proc->p_ucred);
+                       (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
                getmicrotime(&ifp->if_lastchange);
                break;
 
@@ -1104,54 +1071,54 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
                        return (error);
                if (ifr->ifr_reqcap & ~ifp->if_capabilities)
                        return (EINVAL);
-               (void) (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
+               (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
                break;
 
-       case SIOCSIFNAME:
-               error = suser(td);
-               if (error != 0)
-                       return (error);
-               error = copyinstr(ifr->ifr_data, new_name, IFNAMSIZ, NULL);
-               if (error != 0)
-                       return (error);
+       case SIOCSIFNAME:
+               error = suser(td);
+               if (error != 0)
+                       return (error);
+               error = copyinstr(ifr->ifr_data, new_name, IFNAMSIZ, NULL);
+               if (error != 0)
+                       return (error);
                if (new_name[0] == '\0')
                        return (EINVAL);
-               if (ifunit(new_name) != NULL)
-                       return (EEXIST);
+               if (ifunit(new_name) != NULL)
+                       return (EEXIST);
 
                EVENTHANDLER_INVOKE(ifnet_detach_event, ifp);
-               
-               /* Announce the departure of the interface. */
-               rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
-               strlcpy(ifp->if_xname, new_name, sizeof(ifp->if_xname));
-               ifa = TAILQ_FIRST(&ifp->if_addrhead);
-               /* XXX IFA_LOCK(ifa); */
-               sdl = (struct sockaddr_dl *)ifa->ifa_addr;
-               namelen = strlen(new_name);
-               onamelen = sdl->sdl_nlen;
-               /*
-                * Move the address if needed.  This is safe because we
-                * allocate space for a name of length IFNAMSIZ when we
-                * create this in if_attach().
-                */
-               if (namelen != onamelen) {
-                       bcopy(sdl->sdl_data + onamelen,
-                           sdl->sdl_data + namelen, sdl->sdl_alen);
-               }
-               bcopy(new_name, sdl->sdl_data, namelen);
-               sdl->sdl_nlen = namelen;
-               sdl = (struct sockaddr_dl *)ifa->ifa_netmask;
-               bzero(sdl->sdl_data, onamelen);
-               while (namelen != 0)
-                       sdl->sdl_data[--namelen] = 0xff;
-               /* XXX IFA_UNLOCK(ifa) */
+
+               /* Announce the departure of the interface. */
+               rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
+
+               strlcpy(ifp->if_xname, new_name, sizeof(ifp->if_xname));
+               ifa = TAILQ_FIRST(&ifp->if_addrhead);
+               /* XXX IFA_LOCK(ifa); */
+               sdl = (struct sockaddr_dl *)ifa->ifa_addr;
+               namelen = strlen(new_name);
+               onamelen = sdl->sdl_nlen;
+               /*
+                * Move the address if needed.  This is safe because we
+                * allocate space for a name of length IFNAMSIZ when we
+                * create this in if_attach().
+                */
+               if (namelen != onamelen) {
+                       bcopy(sdl->sdl_data + onamelen,
+                           sdl->sdl_data + namelen, sdl->sdl_alen);
+               }
+               bcopy(new_name, sdl->sdl_data, namelen);
+               sdl->sdl_nlen = namelen;
+               sdl = (struct sockaddr_dl *)ifa->ifa_netmask;
+               bzero(sdl->sdl_data, onamelen);
+               while (namelen != 0)
+                       sdl->sdl_data[--namelen] = 0xff;
+               /* XXX IFA_UNLOCK(ifa) */
 
                EVENTHANDLER_INVOKE(ifnet_attach_event, ifp);
-               /* Announce the return of the interface. */
-               rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
-               break;
+
+               /* Announce the return of the interface. */
+               rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
+               break;
 
        case SIOCSIFMETRIC:
                error = suser(td);
@@ -1170,7 +1137,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
                error = (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
                if (error == 0)
                        getmicrotime(&ifp->if_lastchange);
-               return(error);
+               return (error);
 
        case SIOCSIFMTU:
        {
@@ -1244,7 +1211,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
        case SIOCGIFSTATUS:
                ifs = (struct ifstat *)data;
                ifs->ascii[0] = '\0';
-               
+
        case SIOCGIFPSRCADDR:
        case SIOCGIFPDSTADDR:
        case SIOCGLIFPHYADDR:
@@ -1340,9 +1307,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
  * Results are undefined if the "off" and "on" requests are not matched.
  */
 int
-ifpromisc(ifp, pswitch)
-       struct ifnet *ifp;
-       int pswitch;
+ifpromisc(struct ifnet *ifp, int pswitch)
 {
        struct ifreq ifr;
        int error;
@@ -1390,7 +1355,6 @@ ifpromisc(ifp, pswitch)
  * in later ioctl's (above) to get
  * other information.
  */
-/*ARGSUSED*/
 static int
 ifconf(u_long cmd, caddr_t data, struct thread *td)
 {
@@ -1405,7 +1369,7 @@ ifconf(u_long cmd, caddr_t data, struct thread *td)
        TAILQ_FOREACH(ifp, &ifnet, if_link) {
                int addrs;
 
-               if (space <= sizeof (ifr))
+               if (space <= sizeof ifr)
                        break;
                if (strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name))
                    >= sizeof(ifr.ifr_name)) {
@@ -1415,7 +1379,7 @@ ifconf(u_long cmd, caddr_t data, struct thread *td)
 
                addrs = 0;
                TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
-                       if (space <= sizeof(ifr))
+                       if (space <= sizeof ifr)
                                break;
                        sa = ifa->ifa_addr;
                        if (td->td_proc->p_ucred->cr_prison &&
@@ -1428,42 +1392,39 @@ ifconf(u_long cmd, caddr_t data, struct thread *td)
                                         (struct osockaddr *)&ifr.ifr_addr;
                                ifr.ifr_addr = *sa;
                                osa->sa_family = sa->sa_family;
-                               error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
-                                               sizeof (ifr));
+                               error = copyout(&ifr, ifrp, sizeof ifr);
                                ifrp++;
                        } else
 #endif
                        if (sa->sa_len <= sizeof(*sa)) {
                                ifr.ifr_addr = *sa;
-                               error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
-                                               sizeof (ifr));
+                               error = copyout(&ifr, ifrp, sizeof ifr);
                                ifrp++;
                        } else {
-                               if (space < sizeof (ifr) + sa->sa_len -
+                               if (space < (sizeof ifr) + sa->sa_len -
                                            sizeof(*sa))
                                        break;
                                space -= sa->sa_len - sizeof(*sa);
-                               error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
-                                               sizeof (ifr.ifr_name));
+                               error = copyout(&ifr, ifrp,
+                                               sizeof ifr.ifr_name);
                                if (error == 0)
-                                   error = copyout((caddr_t)sa,
-                                     (caddr_t)&ifrp->ifr_addr, sa->sa_len);
+                                       error = copyout(sa, &ifrp->ifr_addr,
+                                                       sa->sa_len);
                                ifrp = (struct ifreq *)
                                        (sa->sa_len + (caddr_t)&ifrp->ifr_addr);
                        }
                        if (error)
                                break;
-                       space -= sizeof (ifr);
+                       space -= sizeof ifr;
                }
                if (error)
                        break;
                if (!addrs) {
-                       bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
-                       error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
-                           sizeof (ifr));
+                       bzero(&ifr.ifr_addr, sizeof ifr.ifr_addr);
+                       error = copyout(&ifr, ifrp, sizeof ifr);
                        if (error)
                                break;
-                       space -= sizeof (ifr);
+                       space -= sizeof ifr;
                        ifrp++;
                }
        }
@@ -1475,9 +1436,7 @@ ifconf(u_long cmd, caddr_t data, struct thread *td)
  * Just like if_promisc(), but for all-multicast-reception mode.
  */
 int
-if_allmulti(ifp, onswitch)
-       struct ifnet *ifp;
-       int onswitch;
+if_allmulti(struct ifnet *ifp, int onswitch)
 {
        int error = 0;
        int s = splimp();
@@ -1515,10 +1474,10 @@ if_allmulti(ifp, onswitch)
  * The link layer provides a routine which converts
  */
 int
-if_addmulti(ifp, sa, retifma)
-       struct ifnet *ifp;      /* interface to manipulate */
-       struct sockaddr *sa;    /* address to add */
-       struct ifmultiaddr **retifma;
+if_addmulti(
+       struct ifnet *ifp,      /* interface to manipulate */
+       struct sockaddr *sa,    /* address to add */
+       struct ifmultiaddr **retifma)
 {
        struct sockaddr *llsa, *dupsa;
        int error, s;
@@ -1606,9 +1565,7 @@ if_addmulti(ifp, sa, retifma)
  * if the request does not match an existing membership.
  */
 int
-if_delmulti(ifp, sa)
-       struct ifnet *ifp;
-       struct sockaddr *sa;
+if_delmulti(struct ifnet *ifp, struct sockaddr *sa)
 {
        struct ifmultiaddr *ifma;
        int s;
@@ -1740,9 +1697,7 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
 }
 
 struct ifmultiaddr *
-ifmaof_ifpforaddr(sa, ifp)
-       struct sockaddr *sa;
-       struct ifnet *ifp;
+ifmaof_ifpforaddr(struct sockaddr *sa, struct ifnet *ifp)
 {
        struct ifmultiaddr *ifma;
 
index 34bea82..a4f5422 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if.h        8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if.h,v 1.58.2.9 2002/08/30 14:23:38 sobomax Exp $
- * $DragonFly: src/sys/net/if.h,v 1.11 2004/07/06 11:44:37 joerg Exp $
+ * $DragonFly: src/sys/net/if.h,v 1.12 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _NET_IF_H_
@@ -243,7 +243,7 @@ struct      ifreq {
                int     ifru_mtu;
                int     ifru_phys;
                int     ifru_media;
-               caddr_t ifru_data;
+               void   *ifru_data;
                int     ifru_cap[2];
        } ifr_ifru;
 #define        ifr_addr        ifr_ifru.ifru_addr      /* address */
@@ -324,13 +324,6 @@ struct if_laddrreq {
        struct  sockaddr_storage dstaddr; /* out */
 };
 
-#ifdef _KERNEL
-#ifdef MALLOC_DECLARE
-MALLOC_DECLARE(M_IFADDR);
-MALLOC_DECLARE(M_IFMADDR);
-#endif
-#endif
-
 #ifndef _KERNEL
 struct if_nameindex {
        u_int   if_index;       /* 1, 2, ... */
index c9b7b2c..7a7f882 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_arcsubr.c,v 1.36 2001/06/14 05:44:23 itojun Exp $   */
 /*     $FreeBSD: src/sys/net/if_arcsubr.c,v 1.1.2.5 2003/02/05 18:42:15 fjoe Exp $ */
-/*     $DragonFly: src/sys/net/Attic/if_arcsubr.c,v 1.10 2004/07/23 07:16:30 joerg Exp $ */
+/*     $DragonFly: src/sys/net/Attic/if_arcsubr.c,v 1.11 2004/12/21 02:54:14 hsu Exp $ */
 
 /*
  * Copyright (c) 1994, 1995 Ignatios Souvatzis
@@ -106,44 +106,16 @@ const uint8_t     arcbroadcastaddr[1] = {0};
  */
 static int
 arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
-          struct rtentry *rt0)
+          struct rtentry *rt)
 {
-       struct rtentry          *rt;
-       struct arccom           *ac;
        struct arc_header       *ah;
        int                     error;
        u_int8_t                atype, adst;
        int                     loop_copy = 0;
        int                     isphds;
 
-       if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
-               return(ENETDOWN); /* m, m1 aren't initialized yet */
-
-       error = 0;
-       ac = (struct arccom *)ifp;
-
-       if ((rt = rt0)) {
-               if ((rt->rt_flags & RTF_UP) == 0) {
-                       if ((rt0 = rt = rtalloc1(dst, 1, 0UL)))
-                               rt->rt_refcnt--;
-                       else
-                               senderr(EHOSTUNREACH);
-               }
-               if (rt->rt_flags & RTF_GATEWAY) {
-                       if (rt->rt_gwroute == 0)
-                               goto lookup;
-                       if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
-                       lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1, 0UL);
-                               if ((rt = rt->rt_gwroute) == 0)
-                                       senderr(EHOSTUNREACH);
-                       }
-               }
-               if (rt->rt_flags & RTF_REJECT)
-                       if (rt->rt_rmx.rmx_expire == 0 ||
-                           time_second < rt->rt_rmx.rmx_expire)
-                               senderr(rt == rt0 ? EHOSTDOWN : EHOSTUNREACH);
-       }
+       if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
+               return (ENETDOWN);      /* m, m1 aren't initialized yet */
 
        switch (dst->sa_family) {
 #ifdef INET
@@ -156,7 +128,7 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                        adst = ifp->if_broadcastaddr[0];
                else if (ifp->if_flags & IFF_NOARP)
                        adst = ntohl(SIN(dst)->sin_addr.s_addr) & 0xFF;
-               else if (!arpresolve(ifp, rt, m, dst, &adst, rt0))
+               else if (!arpresolve(ifp, rt, m, dst, &adst))
                        return 0;       /* not resolved yet */
 
                atype = (ifp->if_flags & IFF_LINK0) ?
@@ -165,13 +137,8 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 #endif
 #ifdef INET6
        case AF_INET6:
-#ifdef OLDIP6OUTPUT
-               if (!nd6_resolve(ifp, rt, m, dst, (u_char *)&adst))
-                       return(0);      /* if not yet resolves */
-#else
                if (!nd6_storelladdr(ifp, rt, m, dst, (u_char *)&adst))
-                       return(0); /* it must be impossible, but... */
-#endif /* OLDIP6OUTPUT */
+                       return (0); /* it must be impossible, but... */
                atype = ARCTYPE_INET6;
                break;
 #endif
@@ -215,7 +182,7 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 
        isphds = arc_isphds(atype);
        M_PREPEND(m, isphds ? ARC_HDRNEWLEN : ARC_HDRLEN, MB_DONTWAIT);
-       if (m == 0)
+       if (m == NULL)
                senderr(ENOBUFS);
        ah = mtod(m, struct arc_header *);
        ah->arc_type = atype;
@@ -229,11 +196,11 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 
        if ((ifp->if_flags & IFF_SIMPLEX) && (loop_copy != -1)) {
                if ((m->m_flags & M_BCAST) || (loop_copy > 0)) {
-                       struct mbuf *n = m_copy(m, 0, (int)M_COPYALL);
+                       struct mbuf *n = m_copypacket(m, MB_DONTWAIT);
 
-                       (void) if_simloop(ifp, n, dst->sa_family, ARC_HDRLEN);
+                       if_simloop(ifp, n, dst->sa_family, ARC_HDRLEN);
                } else if (ah->arc_dhost == ah->arc_shost) {
-                       (void) if_simloop(ifp, m, dst->sa_family, ARC_HDRLEN);
+                       if_simloop(ifp, m, dst->sa_family, ARC_HDRLEN);
                        return (0);     /* XXX */
                }
        }
@@ -246,7 +213,7 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                senderr(ENOBUFS);
        }
 
-       return (error);
+       return (0);
 
 bad:
        if (m)
@@ -481,7 +448,7 @@ arc_defrag(ifp, m)
                        /* is it the last one? */
                        if (af->af_lastseen > af->af_maxflag) {
                                af->af_packet = NULL;
-                               return(m1);
+                               return (m1);
                        } else
                                return NULL;
                }
index 021552b..20a679e 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_arp.h    8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_arp.h,v 1.14.2.3 2002/02/20 23:34:09 fjoe Exp $
- * $DragonFly: src/sys/net/if_arp.h,v 1.4 2004/07/17 09:43:05 joerg Exp $
+ * $DragonFly: src/sys/net/if_arp.h,v 1.5 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _NET_IF_ARP_H_
  */
 struct arphdr {
        u_short ar_hrd;         /* format of hardware address */
-#define ARPHRD_ETHER   1       /* ethernet hardware format */
+#define ARPHRD_ETHER   1       /* ethernet hardware format */
 #define ARPHRD_IEEE802 6       /* token-ring hardware format */
 #define ARPHRD_ARCNET  7       /* arcnet hardware format */
-#define ARPHRD_FRELAY  15      /* frame relay hardware format */
+#define ARPHRD_FRELAY  15      /* frame relay hardware format */
        u_short ar_pro;         /* format of protocol address */
        u_char  ar_hln;         /* length of hardware address */
        u_char  ar_pln;         /* length of protocol address */
@@ -62,7 +62,7 @@ struct        arphdr {
 #define        ARPOP_REPLY     2       /* response to previous request */
 #define        ARPOP_REVREQUEST 3      /* request protocol address given hardware */
 #define        ARPOP_REVREPLY  4       /* response giving protocol address */
-#define ARPOP_INVREQUEST 8     /* request to identify peer */
+#define ARPOP_INVREQUEST 8     /* request to identify peer */
 #define ARPOP_INVREPLY 9       /* response identifying peer */
 /*
  * The remaining fields are variable in size,
@@ -111,7 +111,7 @@ struct      arpcom {
        /*
         * The ifnet struct _must_ be at the head of this structure.
         */
-       struct  ifnet ac_if;            /* network-visible interface */
+       struct  ifnet ac_if;            /* network-visible interface */
        u_char  ac_enaddr[6];           /* ethernet hardware address */
        int     ac_multicnt;            /* length of ac_multiaddrs list */
        void    *ac_netgraph;           /* ng_ether(4) netgraph node info */
index 3a9b8a1..255e859 100644 (file)
@@ -1,6 +1,6 @@
 /*      $NetBSD: if_atm.h,v 1.7 1996/11/09 23:02:27 chuck Exp $       */
 /* $FreeBSD: src/sys/net/if_atm.h,v 1.4 1999/12/29 04:38:34 peter Exp $ */
-/* $DragonFly: src/sys/net/if_atm.h,v 1.4 2004/02/13 17:45:49 joerg Exp $ */
+/* $DragonFly: src/sys/net/if_atm.h,v 1.5 2004/12/21 02:54:14 hsu Exp $ */
 
 /*
  *
  */
 
 #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)
-#define RTALLOC1(A,B)          rtalloc1((A),(B))
-#elif defined(__DragonFly__) || defined(__FreeBSD__)
-#define RTALLOC1(A,B)          rtalloc1((A),(B),0UL)
+#define RTALLOC1(A,B)          rtalloc1((A), (B))
+#elif defined(__DragonFly__)
+#define RTALLOC1(A,B)          rtlookup((A), (B), 0UL)
+#elif defined(__FreeBSD__)
+#define RTALLOC1(A,B)          rtalloc1((A), (B), 0UL)
 #endif
 
 /*
index 9e20768..21a95c9 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $
- * $DragonFly: src/sys/net/if_ethersubr.c,v 1.20 2004/12/14 18:46:08 hsu Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.21 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include "opt_atalk.h"
@@ -76,8 +76,8 @@
 #include <netproto/ipx/ipx.h>
 #include <netproto/ipx/ipx_if.h>
 int (*ef_inputp)(struct ifnet*, struct ether_header *eh, struct mbuf *m);
-int (*ef_outputp)(struct ifnet *ifp, struct mbuf **mp,
-               struct sockaddr *dst, short *tp, int *hlen);
+int (*ef_outputp)(struct ifnet *ifp, struct mbuf **mp, struct sockaddr *dst,
+                 short *tp, int *hlen);
 #endif
 
 #ifdef NS
@@ -93,8 +93,8 @@ int ether_inputdebug = 0;
 #include <netproto/atalk/at_var.h>
 #include <netproto/atalk/at_extern.h>
 
-#define llc_snap_org_code llc_un.type_snap.org_code
-#define llc_snap_ether_type llc_un.type_snap.ether_type
+#define        llc_snap_org_code       llc_un.type_snap.org_code
+#define        llc_snap_ether_type     llc_un.type_snap.ether_type
 
 extern u_char  at_org_code[3];
 extern u_char  aarp_org_code[3];
@@ -115,7 +115,9 @@ int (*vlan_input_tag_p)(struct mbuf *m, uint16_t t);
 static int     ether_output(struct ifnet *, struct mbuf *, struct sockaddr *,
                             struct rtentry *);
 
-/* bridge support */
+/*
+ * bridge support
+ */
 int do_bridge;
 bridge_in_t *bridge_in_ptr;
 bdg_forward_t *bdg_forward_ptr;
@@ -128,8 +130,8 @@ const uint8_t       etherbroadcastaddr[ETHER_ADDR_LEN] = {
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
-#define senderr(e) do { error = (e); goto bad;} while (0)
-#define IFP2AC(IFP) ((struct arpcom *)IFP)
+#define gotoerr(e) do { error = (e); goto bad;} while (0)
+#define IFP2AC(ifp) ((struct arpcom *)(ifp))
 
 int
 ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
@@ -145,180 +147,144 @@ static int ether_ipfw;
  */
 static int
 ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
-            struct rtentry *rt0)
+            struct rtentry *rt)
 {
-       short type;
-       int error = 0, hdrcmplt = 0;
-       u_char esrc[6], edst[6];
-       struct rtentry *rt;
-       struct ether_header *eh;
+       struct ether_header *eh, *deh;
+       u_char *edst;
        int loop_copy = 0;
-       int hlen;       /* link layer header lenght */
+       int hlen = ETHER_HDR_LEN;       /* link layer header length */
        struct arpcom *ac = IFP2AC(ifp);
+       int error;
 
-       if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
-               senderr(ENETDOWN);
-       rt = rt0;
-       if (rt) {
-               if ((rt->rt_flags & RTF_UP) == 0) {
-                       rt0 = rt = rtalloc1(dst, 1, 0UL);
-                       if (rt0)
-                               rt->rt_refcnt--;
-                       else
-                               senderr(EHOSTUNREACH);
-               }
-               if (rt->rt_flags & RTF_GATEWAY) {
-                       if (rt->rt_gwroute == 0)
-                               goto lookup;
-                       if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
-                       lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1,
-                                                         0UL);
-                               if ((rt = rt->rt_gwroute) == 0)
-                                       senderr(EHOSTUNREACH);
-                       }
-               }
-               if (rt->rt_flags & RTF_REJECT)
-                       if (rt->rt_rmx.rmx_expire == 0 ||
-                           time_second < rt->rt_rmx.rmx_expire)
-                               senderr(rt == rt0 ? EHOSTDOWN : EHOSTUNREACH);
-       }
-       hlen = ETHER_HDR_LEN;
+       if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
+               gotoerr(ENETDOWN);
+
+       M_PREPEND(m, sizeof(struct ether_header), MB_DONTWAIT);
+       if (m == NULL)
+               gotoerr(ENOBUFS);
+       eh = mtod(m, struct ether_header *);
+       edst = eh->ether_dhost;
+
+       /* Fill in the destination ethernet address and frame type. */
        switch (dst->sa_family) {
 #ifdef INET
        case AF_INET:
-               if (!arpresolve(ifp, rt, m, dst, edst, rt0))
+               if (!arpresolve(ifp, rt, m, dst, edst))
                        return (0);     /* if not yet resolved */
-               type = htons(ETHERTYPE_IP);
+               eh->ether_type = htons(ETHERTYPE_IP);
                break;
 #endif
 #ifdef INET6
        case AF_INET6:
-               if (!nd6_storelladdr(&ac->ac_if, rt, m, dst, (u_char *)edst)) {
-                       /* Something bad happened */
-                       return(0);
-               }
-               type = htons(ETHERTYPE_IPV6);
+               if (!nd6_storelladdr(&ac->ac_if, rt, m, dst, edst))
+                       return (0);             /* Something bad happened. */
+               eh->ether_type = htons(ETHERTYPE_IPV6);
                break;
 #endif
 #ifdef IPX
        case AF_IPX:
-               if (ef_outputp) {
-                   error = ef_outputp(ifp, &m, dst, &type, &hlen);
-                   if (error)
-                       goto bad;
-               } else
-                   type = htons(ETHERTYPE_IPX);
-               bcopy((caddr_t)&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host),
-                   (caddr_t)edst, sizeof (edst));
+               if (ef_outputp != NULL) {
+                       error = ef_outputp(ifp, &m, dst, &eh->ether_type,
+                                          &hlen);
+                       if (error)
+                               goto bad;
+               } else {
+                       eh->ether_type = htons(ETHERTYPE_IPX);
+                       bcopy(&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host),
+                             edst, ETHER_ADDR_LEN);
+               }
                break;
 #endif
 #ifdef NETATALK
-       case AF_APPLETALK:
-         {
-           struct at_ifaddr *aa;
-
-           if ((aa = at_ifawithnet((struct sockaddr_at *)dst)) == NULL) {
-                   goto bad;
-           }
-           if (!aarpresolve(ac, m, (struct sockaddr_at *)dst, edst))
-                   return (0);
-           /*
-            * In the phase 2 case, need to prepend an mbuf for the llc header.
-            * Since we must preserve the value of m, which is passed to us by
-            * value, we m_copy() the first mbuf, and use it for our llc header.
-            */
-           if ( aa->aa_flags & AFA_PHASE2 ) {
-               struct llc llc;
-
-               M_PREPEND(m, sizeof(struct llc), MB_WAIT);
-               llc.llc_dsap = llc.llc_ssap = LLC_SNAP_LSAP;
-               llc.llc_control = LLC_UI;
-               bcopy(at_org_code, llc.llc_snap_org_code, sizeof(at_org_code));
-               llc.llc_snap_ether_type = htons( ETHERTYPE_AT );
-               bcopy(&llc, mtod(m, caddr_t), sizeof(struct llc));
-               type = htons(m->m_pkthdr.len);
-               hlen = sizeof(struct llc) + ETHER_HDR_LEN;
-           } else {
-               type = htons(ETHERTYPE_AT);
-           }
-           break;
+       case AF_APPLETALK: {
+               struct at_ifaddr *aa;
+
+               if ((aa = at_ifawithnet((struct sockaddr_at *)dst)) == NULL) {
+                       error = 0;      /* XXX */
+                       goto bad;
+               }
+               /*
+                * In the phase 2 case, need to prepend an mbuf for
+                * the llc header.  Since we must preserve the value
+                * of m, which is passed to us by value, we m_copy()
+                * the first mbuf, and use it for our llc header.
+                */
+               if (aa->aa_flags & AFA_PHASE2) {
+                       struct llc llc;
+
+                       M_PREPEND(m, sizeof(struct llc), MB_DONTWAIT);
+                       llc.llc_dsap = llc.llc_ssap = LLC_SNAP_LSAP;
+                       llc.llc_control = LLC_UI;
+                       bcopy(at_org_code, llc.llc_snap_org_code,
+                             sizeof at_org_code);
+                       llc.llc_snap_ether_type = htons(ETHERTYPE_AT);
+                       bcopy(&llc, mtod(m, caddr_t), sizeof(struct llc));
+                       eh->ether_type = htons(m->m_pkthdr.len);
+                       hlen = sizeof(struct llc) + ETHER_HDR_LEN;
+               } else {
+                       eh->ether_type = htons(ETHERTYPE_AT);
+               }
+               if (!aarpresolve(ac, m, (struct sockaddr_at *)dst, edst))
+                       return (0);
+               break;
          }
 #endif /* NETATALK */
 #ifdef NS
        case AF_NS:
-               switch(ns_nettype){
+               switch(ns_nettype) {
                default:
-               case 0x8137: /* Novell Ethernet_II Ethernet TYPE II */
-                       type = 0x8137;
+               case 0x8137:    /* Novell Ethernet_II Ethernet TYPE II */
+                       eh->ether_type = 0x8137;
                        break;
-               case 0x0: /* Novell 802.3 */
-                       type = htons( m->m_pkthdr.len);
+               case 0x0:       /* Novell 802.3 */
+                       eh->ether_type = htons(m->m_pkthdr.len);
                        break;
-               case 0xe0e0: /* Novell 802.2 and Token-Ring */
-                       M_PREPEND(m, 3, MB_WAIT);
-                       type = htons( m->m_pkthdr.len);
+               case 0xe0e0:    /* Novell 802.2 and Token-Ring */
+                       M_PREPEND(m, 3, MB_DONTWAIT);
+                       eh->ether_type = htons(m->m_pkthdr.len);
                        cp = mtod(m, u_char *);
                        *cp++ = 0xE0;
                        *cp++ = 0xE0;
                        *cp++ = 0x03;
                        break;
                }
-               bcopy((caddr_t)&(((struct sockaddr_ns *)dst)->sns_addr.x_host),
-                   (caddr_t)edst, sizeof (edst));
+               bcopy(&(((struct sockaddr_ns *)dst)->sns_addr.x_host), edst,
+                     ETHER_ADDR_LEN);
                /*
                 * XXX if ns_thishost is the same as the node's ethernet
                 * address then just the default code will catch this anyhow.
                 * So I'm not sure if this next clause should be here at all?
                 * [JRE]
                 */
-               if (!bcmp((caddr_t)edst, (caddr_t)&ns_thishost, sizeof(edst))){
+               if (bcmp(edst, &ns_thishost, ETHER_ADDR_LEN) == 0) {
                        m->m_pkthdr.rcvif = ifp;
                        netisr_dispatch(NETISR_NS, m);
                        return (error);
                }
-               if (!bcmp((caddr_t)edst, (caddr_t)&ns_broadhost, sizeof(edst))){
+               if (bcmp(edst, &ns_broadhost, ETHER_ADDR_LEN) == 0)
                        m->m_flags |= M_BCAST;
-               }
                break;
 #endif /* NS */
-
        case pseudo_AF_HDRCMPLT:
-               hdrcmplt = 1;
-               eh = (struct ether_header *)dst->sa_data;
-               (void)memcpy(esrc, eh->ether_shost, sizeof (esrc));
-               /* FALLTHROUGH */
-
        case AF_UNSPEC:
                loop_copy = -1; /* if this is for us, don't do it */
-               eh = (struct ether_header *)dst->sa_data;
-               (void)memcpy(edst, eh->ether_dhost, sizeof (edst));
-               type = eh->ether_type;
+               deh = (struct ether_header *)dst->sa_data;
+               memcpy(edst, deh->ether_dhost, ETHER_ADDR_LEN);
+               eh->ether_type = deh->ether_type;
                break;
 
        default:
                printf("%s: can't handle af%d\n", ifp->if_xname,
                        dst->sa_family);
-               senderr(EAFNOSUPPORT);
+               gotoerr(EAFNOSUPPORT);
        }
 
-       /*
-        * Add local net header.  If no space in first mbuf,
-        * allocate another.
-        */
-       M_PREPEND(m, sizeof (struct ether_header), MB_DONTWAIT);
-       if (m == 0)
-               senderr(ENOBUFS);
-       eh = mtod(m, struct ether_header *);
-       (void)memcpy(&eh->ether_type, &type,
-               sizeof(eh->ether_type));
-       (void)memcpy(eh->ether_dhost, edst, sizeof (edst));
-       if (hdrcmplt)
-               (void)memcpy(eh->ether_shost, esrc,
-                       sizeof(eh->ether_shost));
+       if (dst->sa_family == pseudo_AF_HDRCMPLT)       /* unlikely */
+               memcpy(eh->ether_shost,
+                      ((struct ether_header *)dst->sa_data)->ether_shost,
+                      ETHER_ADDR_LEN);
        else
-               (void)memcpy(eh->ether_shost, ac->ac_enaddr,
-                       sizeof(eh->ether_shost));
+               memcpy(eh->ether_shost, ac->ac_enaddr, ETHER_ADDR_LEN);
 
        /*
         * If a simplex interface, and the packet is being sent to our
@@ -333,25 +299,25 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                int csum_flags = 0;
 
                if (m->m_pkthdr.csum_flags & CSUM_IP)
-                       csum_flags |= (CSUM_IP_CHECKED|CSUM_IP_VALID);
+                       csum_flags |= (CSUM_IP_CHECKED | CSUM_IP_VALID);
                if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA)
-                       csum_flags |= (CSUM_DATA_VALID|CSUM_PSEUDO_HDR);
+                       csum_flags |= (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
                if ((m->m_flags & M_BCAST) || (loop_copy > 0)) {
                        struct mbuf *n;
 
-                       if ((n = m_copy(m, 0, (int)M_COPYALL)) != NULL) {
+                       if ((n = m_copypacket(m, MB_DONTWAIT)) != NULL) {
                                n->m_pkthdr.csum_flags |= csum_flags;
                                if (csum_flags & CSUM_DATA_VALID)
                                        n->m_pkthdr.csum_data = 0xffff;
-                               (void)if_simloop(ifp, n, dst->sa_family, hlen);
+                               if_simloop(ifp, n, dst->sa_family, hlen);
                        } else
                                ifp->if_iqdrops++;
-               } else if (bcmp(eh->ether_dhost,
-                   eh->ether_shost, ETHER_ADDR_LEN) == 0) {
+               } else if (bcmp(eh->ether_dhost, eh->ether_shost,
+                               ETHER_ADDR_LEN) == 0) {
                        m->m_pkthdr.csum_flags |= csum_flags;
                        if (csum_flags & CSUM_DATA_VALID)
                                m->m_pkthdr.csum_data = 0xffff;
-                       (void) if_simloop(ifp, m, dst->sa_family, hlen);
+                       if_simloop(ifp, m, dst->sa_family, hlen);
                        return (0);     /* XXX */
                }
        }
@@ -378,13 +344,11 @@ bad:                      if (m != NULL)
  * in the first mbuf (if BRIDGE'ing).
  */
 int
-ether_output_frame(ifp, m)
-       struct ifnet *ifp;
-       struct mbuf *m;
+ether_output_frame(struct ifnet *ifp, struct mbuf *m)
 {
+       struct ip_fw *rule = NULL;
        int error = 0;
        int s;
-       struct ip_fw *rule = NULL;
 
        /* Extract info from dummynet tag, ignore others */
        for (; m->m_type == MT_TAG; m = m->m_next)
@@ -417,12 +381,12 @@ no_bridge:
                if (ether_ipfw_chk(&m, ifp, &rule, eh, 0) == 0) {
                        if (m) {
                                m_freem(m);
-                               return ENOBUFS; /* pkt dropped */
+                               return ENOBUFS; /* pkt dropped */
                        } else
                                return 0;       /* consumed e.g. in a pipe */
                }
                /* packet was ok, restore the ethernet header */
-               if ( (void *)(eh + 1) == (void *)m->m_data) {
+               if ((void *)(eh + 1) == (void *)m->m_data) {
                        m->m_data -= ETHER_HDR_LEN ;
                        m->m_len += ETHER_HDR_LEN ;
                        m->m_pkthdr.len += ETHER_HDR_LEN ;
@@ -453,12 +417,16 @@ no_bridge:
  * to distinguish that case from ether_output_frame();
  */
 int
-ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
-       struct ip_fw **rule, struct ether_header *eh, int shared)
+ether_ipfw_chk(
+       struct mbuf **m0,
+       struct ifnet *dst,
+       struct ip_fw **rule,
+       struct ether_header *eh,
+       int shared)
 {
        struct ether_header save_eh = *eh;      /* might be a ptr in m */
-       int i;
        struct ip_fw_args args;
+       int i;
 
        if (*rule != NULL && fw_one_pass)
                return 1; /* dummynet packet, already partially processed */
@@ -467,8 +435,8 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
         * I need some amt of data to be contiguous, and in case others need
         * the packet (shared==1) also better be in the first mbuf.
         */
-       i = min( (*m0)->m_pkthdr.len, max_protohdr);
-       if ( shared || (*m0)->m_len < i) {
+       i = min((*m0)->m_pkthdr.len, max_protohdr);
+       if (shared || (*m0)->m_len < i) {
                *m0 = m_pullup(*m0, i);
                if (*m0 == NULL)
                        return 0;
@@ -484,7 +452,7 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
        *m0 = args.m;
        *rule = args.rule;
 
-       if ( (i & IP_FW_PORT_DENY_FLAG) || *m0 == NULL) /* drop */
+       if ((i & IP_FW_PORT_DENY_FLAG) || *m0 == NULL) /* drop */
                return 0;
 
        if (i == 0) /* a PASS rule.  */
@@ -509,7 +477,7 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
                 * Prepend the header, optimize for the common case of
                 * eh pointing into the mbuf.
                 */
-               if ( (void *)(eh + 1) == (void *)m->m_data) {
+               if ((void *)(eh + 1) == (void *)m->m_data) {
                        m->m_data -= ETHER_HDR_LEN ;
                        m->m_len += ETHER_HDR_LEN ;
                        m->m_pkthdr.len += ETHER_HDR_LEN ;
@@ -623,16 +591,14 @@ ether_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
                        }
                        eh = &save_eh ;
                }
-               if (bif == BDG_LOCAL
-                   || bif == BDG_BCAST
-                   || bif == BDG_MCAST)
-                       goto recvLocal;                 /* receive locally */
+               if (bif == BDG_LOCAL || bif == BDG_BCAST || bif == BDG_MCAST)
+                       goto recvLocal;         /* receive locally */
 
                /* If not local and not multicast, just drop it */
                if (m != NULL)
                        m_freem(m);
                return;
-       }
+       }
 
 recvLocal:
        /* Continue with upper layer processing */
@@ -643,10 +609,7 @@ recvLocal:
  * Upper layer processing for a received Ethernet packet.
  */
 void
-ether_demux(ifp, eh, m)
-       struct ifnet *ifp;
-       struct ether_header *eh;
-       struct mbuf *m;
+ether_demux(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
 {
        int isr;
        u_short ether_type;
@@ -665,22 +628,22 @@ ether_demux(ifp, eh, m)
        if (rule)       /* packet was already bridged */
                goto post_stats;
 
-    if (! (BDG_ACTIVE(ifp) ) )
-       /* Discard packet if upper layers shouldn't see it because it was
-          unicast to a different Ethernet address. If the driver is working
-          properly, then this situation can only happen when the interface
-          is in promiscuous mode. */
-       if ((ifp->if_flags & IFF_PROMISC) != 0
-           && (eh->ether_dhost[0] & 1) == 0
-           && bcmp(eh->ether_dhost,
-             IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN) != 0
-           && (ifp->if_flags & IFF_PPROMISC) == 0) {
+       /*
+        * Discard packet if upper layers shouldn't see it because
+        * it was unicast to a different Ethernet address.  If the
+        * driver is working properly, then this situation can only
+        * happen when the interface is in promiscuous mode.
+        */
+       if (!BDG_ACTIVE(ifp) &&
+           (ifp->if_flags & IFF_PROMISC) &&
+           (eh->ether_dhost[0] & 1) == 0 &&
+           !bcmp(eh->ether_dhost, IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN) &&
+           !(ifp->if_flags & IFF_PPROMISC)) {
                m_freem(m);
                return;
        }
-
        /* Discard packet if interface is not up */
-       if ((ifp->if_flags & IFF_UP) == 0) {
+       if (!(ifp->if_flags & IFF_UP)) {
                m_freem(m);
                return;
        }
@@ -741,12 +704,12 @@ post_stats:
 
 #endif /* NS */
 #ifdef NETATALK
-        case ETHERTYPE_AT:
+       case ETHERTYPE_AT:
                isr = NETISR_ATALK1;
-                break;
-        case ETHERTYPE_AARP:
+               break;
+       case ETHERTYPE_AARP:
                isr = NETISR_AARP;
-                break;
+               break;
 #endif /* NETATALK */
        case ETHERTYPE_VLAN:
                /* XXX lock ? */
@@ -784,7 +747,7 @@ post_stats:
                if (l->llc_dsap == LLC_SNAP_LSAP &&
                    l->llc_ssap == LLC_SNAP_LSAP &&
                    l->llc_control == LLC_UI) {
-                        if (bcmp(&(l->llc_snap_org_code)[0], at_org_code,
+                       if (bcmp(&(l->llc_snap_org_code)[0], at_org_code,
                            sizeof(at_org_code)) == 0 &&
                            ntohs(l->llc_snap_ether_type) == ETHERTYPE_AT) {
                                m_adj(m, sizeof(struct llc));
@@ -836,7 +799,7 @@ ether_ifattach_bpf(struct ifnet *ifp, uint8_t *lla, u_int dlt, u_int hdrlen)
        ifp->if_mtu = ETHERMTU;
        ifp->if_resolvemulti = ether_resolvemulti;
        if (ifp->if_baudrate == 0)
-           ifp->if_baudrate = 10000000;
+               ifp->if_baudrate = 10000000;
        ifa = ifnet_addrs[ifp->if_index - 1];
        KASSERT(ifa != NULL, ("%s: no lladdr!\n", __FUNCTION__));
        sdl = (struct sockaddr_dl *)ifa->ifa_addr;
@@ -884,10 +847,7 @@ SYSCTL_INT(_net_link_ether, OID_AUTO, ipfw, CTLFLAG_RW,
            &ether_ipfw,0,"Pass ether pkts through firewall");
 
 int
-ether_ioctl(ifp, command, data)
-       struct ifnet *ifp;
-       int command;
-       caddr_t data;
+ether_ioctl(struct ifnet *ifp, int command, caddr_t data)
 {
        struct ifaddr *ifa = (struct ifaddr *) data;
        struct ifreq *ifr = (struct ifreq *) data;
@@ -910,23 +870,16 @@ ether_ioctl(ifp, command, data)
                 */
                case AF_IPX:
                        {
-                       struct ipx_addr *ina = &(IA_SIPX(ifa)->sipx_addr);
+                       struct ipx_addr *ina = &IA_SIPX(ifa)->sipx_addr;
                        struct arpcom *ac = IFP2AC(ifp);
 
                        if (ipx_nullhost(*ina))
-                               ina->x_host =
-                                   *(union ipx_host *)
-                                   ac->ac_enaddr;
-                       else {
-                               bcopy((caddr_t) ina->x_host.c_host,
-                                     (caddr_t) ac->ac_enaddr,
-                                     sizeof(ac->ac_enaddr));
-                       }
+                               ina->x_host = *(union ipx_host *) ac->ac_enaddr;
+                       else
+                               bcopy(ina->x_host.c_host, ac->ac_enaddr,
+                                     sizeof ac->ac_enaddr);
 
-                       /*
-                        * Set new address
-                        */
-                       ifp->if_init(ifp->if_softc);
+                       ifp->if_init(ifp->if_softc);    /* Set new address. */
                        break;
                        }
 #endif
@@ -940,13 +893,10 @@ ether_ioctl(ifp, command, data)
                        struct arpcom *ac = IFP2AC(ifp);
 
                        if (ns_nullhost(*ina))
-                               ina->x_host =
-                                   *(union ns_host *) (ac->ac_enaddr);
-                       else {
-                               bcopy((caddr_t) ina->x_host.c_host,
-                                     (caddr_t) ac->ac_enaddr,
-                                     sizeof(ac->ac_enaddr));
-                       }
+                               ina->x_host = *(union ns_host *)(ac->ac_enaddr);
+                       else
+                               bcopy(ina->x_host.c_host, ac->ac_enaddr,
+                                     sizeof ac->ac_enaddr);
 
                        /*
                         * Set new address
@@ -962,13 +912,9 @@ ether_ioctl(ifp, command, data)
                break;
 
        case SIOCGIFADDR:
-               {
-                       struct sockaddr *sa;
-
-                       sa = (struct sockaddr *) & ifr->ifr_data;
-                       bcopy(IFP2AC(ifp)->ac_enaddr,
-                             (caddr_t) sa->sa_data, ETHER_ADDR_LEN);
-               }
+               bcopy(IFP2AC(ifp)->ac_enaddr,
+                     ((struct sockaddr *)ifr->ifr_data)->sa_data,
+                     ETHER_ADDR_LEN);
                break;
 
        case SIOCSIFMTU:
@@ -989,10 +935,10 @@ ether_ioctl(ifp, command, data)
 }
 
 int
-ether_resolvemulti(ifp, llsa, sa)
-       struct ifnet *ifp;
-       struct sockaddr **llsa;
-       struct sockaddr *sa;
+ether_resolvemulti(
+       struct ifnet *ifp,
+       struct sockaddr **llsa,
+       struct sockaddr *sa)
 {
        struct sockaddr_dl *sdl;
        struct sockaddr_in *sin;
@@ -1092,7 +1038,7 @@ ether_crc32_le(const uint8_t *buf, size_t len)
                }
        }
 
-       return(crc);
+       return (crc);
 }
 #else
 uint32_t
@@ -1115,7 +1061,7 @@ ether_crc32_le(const uint8_t *buf, size_t len)
                crc = (crc >> 4) ^ crctab[crc & 0xf];
        }
 
-       return(crc);
+       return (crc);
 }
 #endif
 
@@ -1138,5 +1084,5 @@ ether_crc32_be(const uint8_t *buf, size_t len)
                }
        }
 
-       return(crc);
+       return (crc);
 }
index 0959446..88866f7 100644 (file)
@@ -34,7 +34,7 @@
  *
  *     from: if_ethersubr.c,v 1.5 1994/12/13 22:31:45 wollman Exp
  * $FreeBSD: src/sys/net/if_fddisubr.c,v 1.41.2.8 2002/02/20 23:34:09 fjoe Exp $
- * $DragonFly: src/sys/net/Attic/if_fddisubr.c,v 1.12 2004/12/14 18:46:08 hsu Exp $
+ * $DragonFly: src/sys/net/Attic/if_fddisubr.c,v 1.13 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include "opt_atalk.h"
@@ -72,7 +72,7 @@
 #endif
 
 #ifdef IPX
-#include <netproto/ipx/ipx.h> 
+#include <netproto/ipx/ipx.h>
 #include <netproto/ipx/ipx_if.h>
 #endif
 
@@ -112,10 +112,10 @@ static int        fddi_output(struct ifnet *, struct mbuf *, struct sockaddr *,
 #define        llc_snap        llc_un.type_snap
 #endif
 
-#if defined(__bsdi__) || defined(__NetBSD__)
-#define        RTALLOC1(a, b)                  rtalloc1(a, b)
+#if defined(__DragonFly__)
+#define        RTALLOC1(a, b)                  rtlookup(a, b, 0UL)
 #define        ARPRESOLVE(a, b, c, d, e, f)    arpresolve(a, b, c, d, e)
-#elif defined(__DragonFly__) || defined(__FreeBSD__)
+#elif defined(__FreeBSD__)
 #define        RTALLOC1(a, b)                  rtalloc1(a, b, 0UL)
 #define        ARPRESOLVE(a, b, c, d, e, f)    arpresolve(a, b, c, d, e, f)
 #endif
@@ -128,54 +128,23 @@ static int        fddi_output(struct ifnet *, struct mbuf *, struct sockaddr *,
  */
 static int
 fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
-           struct rtentry *rt0)
+           struct rtentry *rt)
 {
+       struct arpcom *ac = (struct arpcom *)ifp;
        u_int16_t type;
-       int s, loop_copy = 0, error = 0, hdrcmplt = 0;
-       u_char esrc[6], edst[6];
-       struct rtentry *rt;
+       u_char esrc[6], edst[6];
        struct fddi_header *fh;
-       struct arpcom *ac = (struct arpcom *)ifp;
+       boolean_t hdrcmplt = FALSE;
+       int s, loop_copy = 0, error;
 
        if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
                senderr(ENETDOWN);
-       getmicrotime(&ifp->if_lastchange);
-#if !defined(__bsdi__) || _BSDI_VERSION >= 199401
-       if ((rt = rt0) != NULL) {
-               if ((rt->rt_flags & RTF_UP) == 0) {
-                       if ((rt0 = rt = RTALLOC1(dst, 1)) != NULL)
-                               rt->rt_refcnt--;
-                       else 
-                               senderr(EHOSTUNREACH);
-               }
-               if (rt->rt_flags & RTF_GATEWAY) {
-                       if (rt->rt_gwroute == 0)
-                               goto lookup;
-                       if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
-                       lookup: rt->rt_gwroute = RTALLOC1(rt->rt_gateway, 1);
-                               if ((rt = rt->rt_gwroute) == 0)
-                                       senderr(EHOSTUNREACH);
-                       }
-               }
-               if (rt->rt_flags & RTF_REJECT)
-                       if (rt->rt_rmx.rmx_expire == 0 ||
-                           time_second < rt->rt_rmx.rmx_expire)
-                               senderr(rt == rt0 ? EHOSTDOWN : EHOSTUNREACH);
-       }
-#endif
-       switch (dst->sa_family) {
 
+       switch (dst->sa_family) {
 #ifdef INET
        case AF_INET: {
-#if !defined(__bsdi__) || _BSDI_VERSION >= 199401
-               if (!ARPRESOLVE(ifp, rt, m, dst, edst, rt0))
-                       return (0);     /* if not yet resolved */
-#else
-               int usetrailers;
-               if (!arpresolve(ac, m, &((struct sockaddr_in *)dst)->sin_addr, edst, &usetrailers))
+               if (!arpresolve(ifp, rt, m, dst, edst))
                        return (0);     /* if not yet resolved */
-#endif
                type = htons(ETHERTYPE_IP);
                break;
        }
@@ -184,7 +153,7 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
        case AF_INET6:
                if (!nd6_storelladdr(&ac->ac_if, rt, m, dst, (u_char *)edst)) {
                        /* Something bad happened */
-                       return(0);
+                       return (0);
                }
                type = htons(ETHERTYPE_IPV6);
                break;
@@ -192,67 +161,77 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 #ifdef IPX
        case AF_IPX:
                type = htons(ETHERTYPE_IPX);
-               bcopy((caddr_t)&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host),
-                   (caddr_t)edst, sizeof (edst));
+               bcopy(&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host), edst,
+                     sizeof edst);
                break;
 #endif
 #ifdef NETATALK
        case AF_APPLETALK: {
-           struct at_ifaddr *aa;
-            if (!aarpresolve(ac, m, (struct sockaddr_at *)dst, edst))
-                return (0);
-           /*
-            * ifaddr is the first thing in at_ifaddr
-            */
-           if ((aa = at_ifawithnet( (struct sockaddr_at *)dst)) == 0)
-               goto bad;
-           
-           /*
-            * In the phase 2 case, we need to prepend an mbuf for the llc header.
-            * Since we must preserve the value of m, which is passed to us by
-            * value, we m_copy() the first mbuf, and use it for our llc header.
-            */
-           if (aa->aa_flags & AFA_PHASE2) {
-               struct llc llc;
-
-               M_PREPEND(m, sizeof(struct llc), MB_WAIT);
-               if (m == 0)
-                       senderr(ENOBUFS);
-               llc.llc_dsap = llc.llc_ssap = LLC_SNAP_LSAP;
-               llc.llc_control = LLC_UI;
-               bcopy(at_org_code, llc.llc_snap_org_code, sizeof(at_org_code));
-               llc.llc_snap_ether_type = htons(ETHERTYPE_AT);
-               bcopy(&llc, mtod(m, caddr_t), sizeof(struct llc));
-               type = 0;
-           } else {
-               type = htons(ETHERTYPE_AT);
-           }
-           break;
+               struct at_ifaddr *aa;
+
+               if (!aarpresolve((struct arpcom *) ifp, m,
+                                (struct sockaddr_at *)dst, edst))
+                       return (0);
+
+               /*
+                * ifaddr is the first thing in at_ifaddr
+                */
+               if ((aa = at_ifawithnet((struct sockaddr_at *)dst)) == NULL) {
+                       error = 0;      /* XXX */
+                       goto bad;
+               }
+
+               /*
+                * In the phase 2 case, we need to prepend an mbuf
+                * for the llc header.  Since we must preserve the
+                * value of m, which is passed to us by value, we
+                * m_copy() the first mbuf, and use it for our llc
+                * header.
+                */
+               if (aa->aa_flags & AFA_PHASE2) {
+                       struct llc llc;
+
+                       M_PREPEND(m, sizeof(struct llc), MB_WAIT);
+                       if (m == NULL)
+                               senderr(ENOBUFS);
+                       llc.llc_dsap = llc.llc_ssap = LLC_SNAP_LSAP;
+                       llc.llc_control = LLC_UI;
+                       bcopy(at_org_code, llc.llc_snap_org_code,
+                             sizeof at_org_code);
+                       llc.llc_snap_ether_type = htons(ETHERTYPE_AT);
+                       bcopy(&llc, mtod(m, caddr_t), sizeof(struct llc));
+                       type = 0;
+               } else {
+                       type = htons(ETHERTYPE_AT);
+               }
+               break;
        }
 #endif /* NETATALK */
 #ifdef NS
        case AF_NS:
                type = htons(ETHERTYPE_NS);
-               bcopy((caddr_t)&(((struct sockaddr_ns *)dst)->sns_addr.x_host),
-                   (caddr_t)edst, sizeof (edst));
+               bcopy(&(((struct sockaddr_ns *)dst)->sns_addr.x_host), edst,
+                     sizeof edst);
                break;
 #endif
 
        case pseudo_AF_HDRCMPLT:
        {
                struct ether_header *eh;
-               hdrcmplt = 1;
+
+               hdrcmplt = TRUE;
                eh = (struct ether_header *)dst->sa_data;
-               (void)memcpy((caddr_t)esrc, (caddr_t)eh->ether_shost, sizeof (esrc));
+               memcpy(esrc, eh->ether_shost, sizeof esrc);
                /* FALLTHROUGH */
        }
 
        case AF_UNSPEC:
        {
                struct ether_header *eh;
+
                loop_copy = -1;
                eh = (struct ether_header *)dst->sa_data;
-               (void)memcpy((caddr_t)edst, (caddr_t)eh->ether_dhost, sizeof (edst));
+               memcpy(edst, eh->ether_dhost, sizeof edst);
                if (*edst & 1)
                        m->m_flags |= (M_BCAST|M_MCAST);
                type = eh->ether_type;
@@ -267,7 +246,7 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                        case FDDIFC_LLC_ASYNC: {
                                /* legal priorities are 0 through 7 */
                                if ((fh->fddi_fc & FDDIFC_Z) > 7)
-                                       goto bad;
+                                       goto bad;
                                break;
                        }
                        case FDDIFC_LLC_SYNC: {
@@ -284,12 +263,12 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                        }
                        default: {
                                /* anything else is too dangerous */
-                                       goto bad;
+                               goto bad;
                        }
                }
                error = 0;
                if (fh->fddi_dhost[0] & 1)
-                       m->m_flags |= (M_BCAST|M_MCAST);
+                       m->m_flags |= (M_BCAST | M_MCAST);
                goto queue_it;
        }
        default:
@@ -300,36 +279,36 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 
        if (type != 0) {
                struct llc *l;
-               M_PREPEND(m, sizeof (struct llc), MB_DONTWAIT);
-               if (m == 0)
-                       senderr(ENOBUFS);
+
+               M_PREPEND(m, sizeof(struct llc), MB_DONTWAIT);
+               if (m == NULL)
+                       return (ENOBUFS);
                l = mtod(m, struct llc *);
                l->llc_control = LLC_UI;
                l->llc_dsap = l->llc_ssap = LLC_SNAP_LSAP;
-               l->llc_snap.org_code[0] = l->llc_snap.org_code[1] = l->llc_snap.org_code[2] = 0;
-               (void)memcpy((caddr_t) &l->llc_snap.ether_type, (caddr_t) &type,
-                       sizeof(u_int16_t));
+               l->llc_snap.org_code[0] = l->llc_snap.org_code[1] =
+                   l->llc_snap.org_code[2] = 0;
+               memcpy(&l->llc_snap.ether_type, &type, sizeof(u_int16_t));
        }
 
        /*
         * Add local net header.  If no space in first mbuf,
         * allocate another.
         */
-       M_PREPEND(m, sizeof (struct fddi_header), MB_DONTWAIT);
-       if (m == 0)
-               senderr(ENOBUFS);
+       M_PREPEND(m, sizeof(struct fddi_header), MB_DONTWAIT);
+       if (m == NULL)
+               return (ENOBUFS);
        fh = mtod(m, struct fddi_header *);
        fh->fddi_fc = FDDIFC_LLC_ASYNC|FDDIFC_LLC_PRIO4;
-       (void)memcpy((caddr_t)fh->fddi_dhost, (caddr_t)edst, sizeof (edst));
-  queue_it:
+       memcpy(fh->fddi_dhost, edst, sizeof edst);
+
+queue_it:
        if (hdrcmplt)
-               (void)memcpy((caddr_t)fh->fddi_shost, (caddr_t)esrc,
-                       sizeof(fh->fddi_shost));
+               memcpy(fh->fddi_shost, esrc, sizeof fh->fddi_shost);
        else
-               (void)memcpy((caddr_t)fh->fddi_shost, (caddr_t)ac->ac_enaddr,
-                       sizeof(fh->fddi_shost));
+               memcpy(fh->fddi_shost, ac->ac_enaddr, sizeof fh->fddi_shost);
        /*
-        * If a simplex interface, and the packet is being sent to our
+               memcpy(fh->fddi_shost, ac->ac_enaddr, sizeof fh->fddi_shost);
         * Ethernet address or a broadcast address, loopback a copy.
         * XXX To make a simplex device behave exactly like a duplex
         * device, we should copy in the case of sending to our own
@@ -340,15 +319,15 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
        if ((ifp->if_flags & IFF_SIMPLEX) &&
           (loop_copy != -1)) {
                if ((m->m_flags & M_BCAST) || loop_copy) {
-                       struct mbuf *n = m_copy(m, 0, (int)M_COPYALL);
-
-                       (void) if_simloop(ifp,
-                               n, dst->sa_family, sizeof(struct fddi_header));
-               } else if (bcmp(fh->fddi_dhost,
-                   fh->fddi_shost, sizeof(fh->fddi_shost)) == 0) {
-                       (void) if_simloop(ifp,
-                               m, dst->sa_family, sizeof(struct fddi_header));
-                       return(0);      /* XXX */
+                       struct mbuf *n = m_copypacket(m, MB_DONTWAIT);
+
+                       if_simloop(ifp, n, dst->sa_family,
+                                  sizeof(struct fddi_header));
+               } else if (bcmp(fh->fddi_dhost, fh->fddi_shost,
+                               sizeof(fh->fddi_shost)) == 0) {
+                       if_simloop(ifp, m, dst->sa_family,
+                                  sizeof(struct fddi_header));
+                       senderr(0);     /* XXX */
                }
        }
 
@@ -370,7 +349,7 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                (*ifp->if_start)(ifp);
        splx(s);
 
-       return (error);
+       return (0);
 
 bad:
        if (m)
@@ -403,7 +382,7 @@ fddi_input(struct ifnet *ifp, struct mbuf *m)
                return;
        }
        getmicrotime(&ifp->if_lastchange);
-       ifp->if_ibytes += m->m_pkthdr.len + sizeof (*fh);
+       ifp->if_ibytes += m->m_pkthdr.len + sizeof *fh;
        if (fh->fddi_dhost[0] & 1) {
                if (bcmp(ifp->if_broadcastaddr, fh->fddi_dhost,
                         ifp->if_addrlen) == 0)
@@ -412,8 +391,8 @@ fddi_input(struct ifnet *ifp, struct mbuf *m)
                        m->m_flags |= M_MCAST;
                ifp->if_imcasts++;
        } else if ((ifp->if_flags & IFF_PROMISC) &&
-           bcmp(((struct arpcom *)ifp)->ac_enaddr, (caddr_t)fh->fddi_dhost,
-                   sizeof(fh->fddi_dhost)) != 0) {
+           bcmp(((struct arpcom *)ifp)->ac_enaddr, fh->fddi_dhost,
+                sizeof fh->fddi_dhost) != 0) {
                m_freem(m);
                return;
        }
@@ -449,7 +428,7 @@ fddi_input(struct ifnet *ifp, struct mbuf *m)
                if (bcmp(&(l->llc_snap_org_code)[0], aarp_org_code,
                         sizeof(aarp_org_code)) == 0 &&
                        ntohs(l->llc_snap_ether_type) == ETHERTYPE_AARP) {
-                   m_adj( m, sizeof( struct llc ));
+                   m_adj(m, sizeof(struct llc));
                    isr = NETISR_AARP;
                    break;
                }
@@ -479,11 +458,11 @@ fddi_input(struct ifnet *ifp, struct mbuf *m)
                        isr = NETISR_IPV6;
                        break;
 #endif
-#ifdef IPX      
-               case ETHERTYPE_IPX: 
+#ifdef IPX
+               case ETHERTYPE_IPX:
                        isr = NETISR_IPX;
-                       break;  
-#endif   
+                       break;
+#endif
 #ifdef NS
                case ETHERTYPE_NS:
                        isr = NETISR_NS;
@@ -494,7 +473,7 @@ fddi_input(struct ifnet *ifp, struct mbuf *m)
                        isr = NETISR_DECNET;
                        break;
 #endif
-#ifdef NETATALK 
+#ifdef NETATALK
                case ETHERTYPE_AT:
                        isr = NETISR_ATALK1;
                        break;
@@ -510,7 +489,7 @@ fddi_input(struct ifnet *ifp, struct mbuf *m)
                break;
        }
 #endif /* INET || NS */
-               
+
        default:
                /* printf("fddi_input: unknown dsap 0x%x\n", l->llc_dsap); */
                ifp->if_noproto++;
@@ -566,8 +545,8 @@ fddi_ifattach(ifp)
                    sdl->sdl_family == AF_LINK) {
                        sdl->sdl_type = IFT_FDDI;
                        sdl->sdl_alen = ifp->if_addrlen;
-                       bcopy((caddr_t)((struct arpcom *)ifp)->ac_enaddr,
-                             LLADDR(sdl), ifp->if_addrlen);
+                       bcopy(((struct arpcom *)ifp)->ac_enaddr, LLADDR(sdl),
+                             ifp->if_addrlen);
                        break;
                }
 #endif
index 511571f..d83d82f 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Questions, comments or suggestions should be directed to
  * Larry Lile <lile@stdio.com>.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_iso88025subr.c,v 1.7.2.7 2002/06/18 00:15:31 kbyanc Exp $
- * $DragonFly: src/sys/net/Attic/if_iso88025subr.c,v 1.9 2004/07/23 07:16:30 joerg Exp $
+ * $DragonFly: src/sys/net/Attic/if_iso88025subr.c,v 1.10 2004/12/21 02:54:14 hsu Exp $
  *
  */
 
 /*
  *
  * General ISO 802.5 (Token Ring) support routines
- * 
+ *
  */
 
 #include "opt_inet.h"
@@ -49,7 +49,7 @@
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
-#include <sys/sockio.h> 
+#include <sys/sockio.h>
 #include <sys/sysctl.h>
 
 #include <net/if.h>
@@ -104,120 +104,98 @@ iso88025_ifattach(struct ifnet *ifp)
        if (ifp->if_mtu == 0)
                ifp->if_mtu = ISO88025_DEFAULT_MTU;
 
-        ifa = ifnet_addrs[ifp->if_index - 1];
-        if (ifa == 0) {
-                printf("iso88025_ifattach: no lladdr!\n");
-                return;
-        }
-        sdl = (struct sockaddr_dl *)ifa->ifa_addr;
-        sdl->sdl_type = IFT_ISO88025;
-        sdl->sdl_alen = ifp->if_addrlen;
-        bcopy(((struct arpcom *)ifp)->ac_enaddr, LLADDR(sdl), ifp->if_addrlen);
+       ifa = ifnet_addrs[ifp->if_index - 1];
+       if (ifa == NULL) {
+               printf("iso88025_ifattach: no lladdr!\n");
+               return;
+       }
+       sdl = (struct sockaddr_dl *)ifa->ifa_addr;
+       sdl->sdl_type = IFT_ISO88025;
+       sdl->sdl_alen = ifp->if_addrlen;
+       bcopy(((struct arpcom *)ifp)->ac_enaddr, LLADDR(sdl), ifp->if_addrlen);
        bpfattach(ifp, DLT_IEEE802, sizeof(struct iso88025_header));
 }
 
 int
 iso88025_ioctl(struct ifnet *ifp, int command, caddr_t data)
 {
-        struct ifaddr *ifa = (struct ifaddr *) data;
-        struct ifreq *ifr = (struct ifreq *) data;
-        int error = 0;
+       struct ifaddr *ifa = (struct ifaddr *) data;
+       struct ifreq *ifr = (struct ifreq *) data;
+       int error = 0;
 
-        switch (command) {
-        case SIOCSIFADDR:
-                ifp->if_flags |= IFF_UP;
+       switch (command) {
+       case SIOCSIFADDR:
+               ifp->if_flags |= IFF_UP;
 
-                switch (ifa->ifa_addr->sa_family) {
+               switch (ifa->ifa_addr->sa_family) {
 #ifdef INET
-                case AF_INET:
-                        ifp->if_init(ifp->if_softc);    /* before arpwhohas */
-                        arp_ifinit(ifp, ifa);
-                        break;
+               case AF_INET:
+                       ifp->if_init(ifp->if_softc);    /* before arpwhohas */
+                       arp_ifinit(ifp, ifa);
+                       break;
 #endif
-                default:
-                        ifp->if_init(ifp->if_softc);
-                        break;
-                }
-                break;
-
-        case SIOCGIFADDR:
-                {
-                        struct sockaddr *sa;
-
-                        sa = (struct sockaddr *) & ifr->ifr_data;
-                        bcopy(((struct arpcom *)ifp->if_softc)->ac_enaddr,
-                              (caddr_t) sa->sa_data, ISO88025_ADDR_LEN);
-                }
-                break;
-
-        case SIOCSIFMTU:
-                /*
-                 * Set the interface MTU.
-                 */
-                if (ifr->ifr_mtu > ISO88025_MAX_MTU) {
-                        error = EINVAL;
-                } else {
-                        ifp->if_mtu = ifr->ifr_mtu;
-                }
-                break;
-        }
-        return (error);
+               default:
+                       ifp->if_init(ifp->if_softc);
+                       break;
+               }
+               break;
+
+       case SIOCGIFADDR:
+               bcopy(((struct arpcom *)ifp->if_softc)->ac_enaddr,
+                     ((struct sockaddr *)ifr->ifr_data)->sa_data,
+                     ISO88025_ADDR_LEN);
+               break;
+
+       case SIOCSIFMTU:
+               /*
+                * Set the interface MTU.
+                */
+               if (ifr->ifr_mtu > ISO88025_MAX_MTU) {
+                       error = EINVAL;
+               } else {
+                       ifp->if_mtu = ifr->ifr_mtu;
+               }
+               break;
+       }
+       return (error);
 }
 
 /*
  * ISO88025 encapsulation
  */
 static int
-iso88025_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct rtentry *rt0)
+iso88025_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
+               struct rtentry *rt0)
 {
        struct iso88025_header *th;
        struct iso88025_header gen_th;
        struct iso88025_sockaddr_data *sd = (struct iso88025_sockaddr_data *)dst->sa_data;
-        struct llc *l;
+       struct llc *l;
        struct sockaddr_dl *sdl = NULL;
-        int s, error = 0, rif_len = 0;
-       u_char edst[6];
+       int s, error = 0, rif_len = 0;
+       u_char edst[6];
        struct rtentry *rt;
        int len = m->m_pkthdr.len, loop_copy = 0;
        struct arpcom *ac = (struct arpcom *)ifp;
 
        if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
                senderr(ENETDOWN);
-       rt = rt0;
-       if (rt) {
-               if ((rt->rt_flags & RTF_UP) == 0) {
-                       rt0 = rt = rtalloc1(dst, 1, 0UL);
-                       if (rt0)
-                               rt->rt_refcnt--;
-                       else
-                               senderr(EHOSTUNREACH);
-               }
-               if (rt->rt_flags & RTF_GATEWAY) {
-                       if (rt->rt_gwroute == 0)
-                               goto lookup;
-                       if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
-                       lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1,
-                                                         0UL);
-                               if ((rt = rt->rt_gwroute) == 0)
-                                       senderr(EHOSTUNREACH);
-                       }
-               }
-               if (rt->rt_flags & RTF_REJECT)
-                       if (rt->rt_rmx.rmx_expire == 0 ||
-                           time_second < rt->rt_rmx.rmx_expire)
-                               senderr(rt == rt0 ? EHOSTDOWN : EHOSTUNREACH);
-       }
 
-       /* Calculate routing info length based on arp table entry */
+       if (rt0 == NULL)
+               senderr(EHOSTUNREACH);
+       error = rt_llroute(dst, rt0, &rt);
+       if (error != 0)
+               senderr(error);
+
+       /* Calculate routing info length based on arp table entry. */
        if (rt && (sdl = (struct sockaddr_dl *)rt->rt_gateway))
                if (SDL_ISO88025(sdl)->trld_rcf != NULL)
                        rif_len = TR_RCF_RIFLEN(SDL_ISO88025(sdl)->trld_rcf);
 
-       /* Generate a generic 802.5 header for the packet */
+       /* Generate a generic 802.5 header for the packet. */
        gen_th.ac = TR_AC;
        gen_th.fc = TR_LLC_FRAME;
-       memcpy(gen_th.iso88025_shost, ac->ac_enaddr, sizeof(ac->ac_enaddr));
+       memcpy(gen_th.iso88025_shost, ac->ac_enaddr, sizeof ac->ac_enaddr);
        if (rif_len) {
                gen_th.iso88025_shost[0] |= TR_RII;
                if (rif_len > 2) {
@@ -225,20 +203,20 @@ iso88025_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct
                        memcpy(gen_th.rd, sdl->sdl_route, rif_len - 2);
                }
        }
-       
+
 
        switch (dst->sa_family) {
 #ifdef INET
        case AF_INET:
-               if (!arpresolve(ifp, rt, m, dst, edst, rt0))
+               if (!arpresolve(ifp, rt0, m, dst, edst))
                        return (0);     /* if not yet resolved */
                /* Add LLC and SNAP headers */
                M_PREPEND(m, 8, MB_DONTWAIT);
-               if (m == 0)
-                       senderr(ENOBUFS);
+               if (m == NULL)
+                       return (ENOBUFS);
                l = mtod(m, struct llc *);
-               l->llc_un.type_snap.ether_type = htons(ETHERTYPE_IP);
-               l->llc_dsap = l->llc_ssap = LLC_SNAP_LSAP;
+               l->llc_un.type_snap.ether_type = htons(ETHERTYPE_IP);
+               l->llc_dsap = l->llc_ssap = LLC_SNAP_LSAP;
                l->llc_un.type_snap.control = LLC_UI;
                l->llc_un.type_snap.org_code[0] = 0x0;
                l->llc_un.type_snap.org_code[1] = 0x0;
@@ -256,7 +234,7 @@ iso88025_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct
                 * mbuf provided, ac/fc are set in sa_data.  sockaddr.sa_data
                 * should be a iso88025_sockaddr_data structure see iso88025.h
                 */
-                loop_copy = -1;
+               loop_copy = -1;
                sd = (struct iso88025_sockaddr_data *)dst->sa_data;
                gen_th.ac = sd->ac;
                gen_th.fc = sd->fc;
@@ -275,45 +253,44 @@ iso88025_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct
         * Add local net header.  If no space in first mbuf,
         * allocate another.
         */
-       
+
        M_PREPEND(m, ISO88025_HDR_LEN + rif_len, MB_DONTWAIT);
-       if (m == 0)
-               senderr(ENOBUFS);
+       if (m == NULL)
+               return (ENOBUFS);
 
        /* Copy as much of the generic header as is needed into the mbuf */
        th = mtod(m, struct iso88025_header *);
        memcpy(th, &gen_th, ISO88025_HDR_LEN + rif_len);
 
-        /*
-         * If a simplex interface, and the packet is being sent to our
-         * Ethernet address or a broadcast address, loopback a copy.
-         * XXX To make a simplex device behave exactly like a duplex
-         * device, we should copy in the case of sending to our own
-         * ethernet address (thus letting the original actually appear
-         * on the wire). However, we don't do that here for security
-         * reasons and compatibility with the original behavior.
-         */     
-        if ((ifp->if_flags & IFF_SIMPLEX) &&
-           (loop_copy != -1)) {
-                if ((m->m_flags & M_BCAST) || (loop_copy > 0)) { 
-                        struct mbuf *n = m_copy(m, 0, (int)M_COPYALL);
-                        (void) if_simloop(ifp,
-                           n, dst->sa_family, ISO88025_HDR_LEN);
-                } else if (bcmp(th->iso88025_dhost,
-                    th->iso88025_shost, ETHER_ADDR_LEN) == 0) {
-                        (void) if_simloop(ifp,
-                           m, dst->sa_family, ISO88025_HDR_LEN);
-                        return(0);      /* XXX */
-                }       
-        }      
-
-        s = splimp();
+       /*
+        * If a simplex interface, and the packet is being sent to our
+        * Ethernet address or a broadcast address, loopback a copy.
+        * XXX To make a simplex device behave exactly like a duplex
+        * device, we should copy in the case of sending to our own
+        * ethernet address (thus letting the original actually appear
+        * on the wire). However, we don't do that here for security
+        * reasons and compatibility with the original behavior.
+        */
+       if ((ifp->if_flags & IFF_SIMPLEX) &&
+          (loop_copy != -1)) {
+               if ((m->m_flags & M_BCAST) || (loop_copy > 0)) {
+                       struct mbuf *n = m_copypacket(m, MB_DONTWAIT);
+
+                       if_simloop(ifp, n, dst->sa_family, ISO88025_HDR_LEN);
+               } else if (bcmp(th->iso88025_dhost,
+                   th->iso88025_shost, ETHER_ADDR_LEN) == 0) {
+                       if_simloop(ifp, m, dst->sa_family, ISO88025_HDR_LEN);
+                       return (0);     /* XXX */
+               }
+       }
+
+       s = splimp();
        /*
         * Queue message on interface, and start output if interface
         * not yet active.
         */
        if (IF_QFULL(&ifp->if_snd)) {
-            printf("iso88025_output: packet dropped QFULL.\n");
+               printf("iso88025_output: packet dropped QFULL.\n");
                IF_DROP(&ifp->if_snd);
                splx(s);
                senderr(ENOBUFS);
@@ -321,7 +298,7 @@ iso88025_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct
        if (m->m_flags & M_MCAST)
                ifp->if_omcasts++;
        IF_ENQUEUE(&ifp->if_snd, m);
-        if ((ifp->if_flags & IFF_OACTIVE) == 0)
+       if (!(ifp->if_flags & IFF_OACTIVE))
                (*ifp->if_start)(ifp);
        splx(s);
        ifp->if_obytes += len + ISO88025_HDR_LEN + 8;
@@ -344,7 +321,7 @@ iso88025_input(struct ifnet *ifp, struct mbuf *m)
        int isr, hdr_len;
        u_short ether_type;
 
-       if ((ifp->if_flags & IFF_UP) == 0) {
+       if (!(ifp->if_flags & IFF_UP)) {
                m_freem(m);
                return;
        }
@@ -383,8 +360,8 @@ iso88025_input(struct ifnet *ifp, struct mbuf *m)
                l->llc_dsap = l->llc_ssap;
                l->llc_ssap = c;
                if (m->m_flags & (M_BCAST | M_MCAST))
-                       bcopy((caddr_t)ac->ac_enaddr, 
-                             (caddr_t)th->iso88025_dhost, ISO88025_ADDR_LEN);
+                       bcopy(ac->ac_enaddr, th->iso88025_dhost,
+                             ISO88025_ADDR_LEN);
                sa.sa_family = AF_UNSPEC;
                sa.sa_len = sizeof(sa);
                th2 = (struct iso88025_sockaddr_data *)sa.sa_data;
@@ -404,9 +381,9 @@ iso88025_input(struct ifnet *ifp, struct mbuf *m)
                return;
        }
 
-        m->m_pkthdr.len -= 8;
-        m->m_len -= 8;
-        m->m_data += 8; /* Length of LLC header in our case */
+       m->m_pkthdr.len -= 8;
+       m->m_len -= 8;
+       m->m_data += 8; /* Length of LLC header in our case */
 
        ifp->if_ibytes += m->m_pkthdr.len + sizeof(*th);
        if (th->iso88025_dhost[0] & 1) {
@@ -415,7 +392,7 @@ iso88025_input(struct ifnet *ifp, struct mbuf *m)
                        m->m_flags |= M_BCAST;
                else
                        m->m_flags |= M_MCAST;
-       } 
+       }
        if (m->m_flags & (M_BCAST|M_MCAST))
                ifp->if_imcasts++;
 
@@ -424,7 +401,7 @@ iso88025_input(struct ifnet *ifp, struct mbuf *m)
        switch (ether_type) {
 #ifdef INET
        case ETHERTYPE_IP:
-               th->iso88025_shost[0] &= ~(TR_RII); 
+               th->iso88025_shost[0] &= ~(TR_RII);
                if (ipflow_fastforward(m))
                        return;
                isr = NETISR_IP;
@@ -436,7 +413,7 @@ iso88025_input(struct ifnet *ifp, struct mbuf *m)
                        return;
                }
                isr = NETISR_ARP;
-                break;
+               break;
 #endif
        default:
            m_freem(m);
index e271427..6c768c5 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_loop.c   8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_loop.c,v 1.47.2.8 2003/06/01 01:46:11 silby Exp $
- * $DragonFly: src/sys/net/if_loop.c,v 1.11 2004/06/02 14:42:57 eirikn Exp $
+ * $DragonFly: src/sys/net/if_loop.c,v 1.12 2004/12/21 02:54:14 hsu Exp $
  */
 
 /*
@@ -108,31 +108,30 @@ struct    ifnet loif[NLOOP];
 
 /* ARGSUSED */
 static void
-loopattach(dummy)
-       void *dummy;
+loopattach(void *dummy)
 {
        struct ifnet *ifp;
-       int i = 0;
-
-       for (ifp = loif; i < NLOOP; ifp++) {
-           if_initname(ifp, "lo", i++);
-           ifp->if_mtu = LOMTU;
-           ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
-           ifp->if_ioctl = loioctl;
-           ifp->if_output = looutput;
-           ifp->if_type = IFT_LOOP;
-           ifp->if_snd.ifq_maxlen = ifqmaxlen;
-           if_attach(ifp);
-           bpfattach(ifp, DLT_NULL, sizeof(u_int));
+       int i;
+
+       for (i = 0, ifp = loif; i < NLOOP; i++, ifp++) {
+               if_initname(ifp, "lo", i);
+               ifp->if_mtu = LOMTU;
+               ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
+               ifp->if_ioctl = loioctl;
+               ifp->if_output = looutput;
+               ifp->if_type = IFT_LOOP;
+               ifp->if_snd.ifq_maxlen = ifqmaxlen;
+               if_attach(ifp);
+               bpfattach(ifp, DLT_NULL, sizeof(u_int));
        }
 }
 
 int
-looutput(ifp, m, dst, rt)
-       struct ifnet *ifp;
-       struct mbuf *m;
-       struct sockaddr *dst;
-       struct rtentry *rt;
+looutput(
+       struct ifnet *ifp,
+       struct mbuf *m,
+       struct sockaddr *dst,
+       struct rtentry *rt)
 {
        struct mbuf *n;
 
@@ -181,7 +180,7 @@ looutput(ifp, m, dst, rt)
                return (EAFNOSUPPORT);
        }
 #endif
-       return(if_simloop(ifp, m, dst->sa_family, 0));
+       return (if_simloop(ifp, m, dst->sa_family, 0));
 }
 
 /*
@@ -194,13 +193,8 @@ looutput(ifp, m, dst, rt)
  *
  * This function expects the packet to include the media header of length hlen.
  */
-
 int
-if_simloop(ifp, m, af, hlen)
-       struct ifnet *ifp;
-       struct mbuf *m;
-       int af;
-       int hlen;
+if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
 {
        int isr;
 
@@ -295,10 +289,7 @@ if_simloop(ifp, m, af, hlen)
 
 /* ARGSUSED */
 static void
-lortrequest(cmd, rt, info)
-       int cmd;
-       struct rtentry *rt;
-       struct rt_addrinfo *info;
+lortrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
 {
        if (rt) {
                rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu; /* for ISO */
@@ -307,8 +298,7 @@ lortrequest(cmd, rt, info)
                 * should be at least twice the MTU plus a little more for
                 * overhead.
                 */
-               rt->rt_rmx.rmx_recvpipe =
-                       rt->rt_rmx.rmx_sendpipe = 3 * LOMTU;
+               rt->rt_rmx.rmx_recvpipe = rt->rt_rmx.rmx_sendpipe = 3 * LOMTU;
        }
 }
 
@@ -317,11 +307,7 @@ lortrequest(cmd, rt, info)
  */
 /* ARGSUSED */
 int
-loioctl(ifp, cmd, data, cr)
-       struct ifnet *ifp;
-       u_long cmd;
-       caddr_t data;
-       struct ucred *cr;
+loioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
 {
        struct ifaddr *ifa;
        struct ifreq *ifr = (struct ifreq *)data;
index 5d25d87..1364ea6 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_media.c,v 1.1 1997/03/17 02:55:15 thorpej Exp $     */
 /* $FreeBSD: src/sys/net/if_media.c,v 1.9.2.4 2001/07/04 00:12:38 brooks Exp $ */
-/* $DragonFly: src/sys/net/if_media.c,v 1.6 2004/04/22 04:21:29 dillon Exp $ */
+/* $DragonFly: src/sys/net/if_media.c,v 1.7 2004/12/21 02:54:14 hsu Exp $ */
 
 /*
  * Copyright (c) 1997
@@ -60,7 +60,7 @@
  * Compile-time options:
  * IFMEDIA_DEBUG:
  *     turn on implementation-level debug printfs.
- *     Useful for debugging newly-ported  drivers.
+ *     Useful for debugging newly-ported  drivers.
  */
 
 static struct ifmedia_entry *ifmedia_match (struct ifmedia *ifm,
@@ -201,7 +201,7 @@ ifmedia_ioctl(ifp, ifr, ifm, cmd)
        int error = 0, sticky;
 
        if (ifp == NULL || ifr == NULL || ifm == NULL)
-               return(EINVAL);
+               return (EINVAL);
 
        switch (cmd) {
 
index 2b9dc04..3256d47 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_types.h  8.3 (Berkeley) 4/28/95
  * $FreeBSD: src/sys/net/if_types.h,v 1.8.2.4 2002/12/23 23:02:21 kbyanc Exp $
- * $DragonFly: src/sys/net/if_types.h,v 1.3 2004/09/19 22:32:47 joerg Exp $
+ * $DragonFly: src/sys/net/if_types.h,v 1.4 2004/12/21 02:54:14 hsu Exp $
  * $NetBSD: if_types.h,v 1.16 2000/04/19 06:30:53 itojun Exp $
  */
 
@@ -44,7 +44,7 @@
  * This list is derived from the SNMP list of ifTypes, originally
  * documented in RFC1573, now maintained as:
  *
- *     ftp.isi.edu/in-notes/iana/assignments/smi-numbers
+ *     ftp.isi.edu/in-notes/iana/assignments/smi-numbers
  */
 
 #define        IFT_OTHER       0x1             /* none of the following */
index c5bf538..4e09ec6 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     From: @(#)if.h  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.16 2003/04/15 18:11:19 fjoe Exp $
- * $DragonFly: src/sys/net/if_var.h,v 1.18 2004/09/15 19:33:36 joerg Exp $
+ * $DragonFly: src/sys/net/if_var.h,v 1.19 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef        _NET_IF_VAR_H_
@@ -138,7 +138,7 @@ struct      ifqueue {
  */
 struct ifnet {
        void    *if_softc;              /* pointer to driver state */
-       TAILQ_ENTRY(ifnet) if_link;     /* all struct ifnets are chained */
+       TAILQ_ENTRY(ifnet) if_link;     /* all struct ifnets are chained */
        char    if_xname[IFNAMSIZ];     /* external name (name + unit) */
        const char *if_dname;           /* driver name */
        int     if_dunit;               /* unit or IF_DUNIT_NONE */
@@ -444,7 +444,7 @@ struct ifprefix {
  */
 struct ifmultiaddr {
        LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */
-       struct  sockaddr *ifma_addr;    /* address this membership is for */
+       struct  sockaddr *ifma_addr;    /* address this membership is for */
        struct  sockaddr *ifma_lladdr;  /* link-layer translation, if any */
        struct  ifnet *ifma_ifp;        /* back-pointer to interface */
        u_int   ifma_refcount;          /* reference count */
@@ -465,13 +465,25 @@ EVENTHANDLER_DECLARE(ifnet_detach_event, ifnet_detach_event_handler_t);
 typedef void (*if_clone_event_handler_t)(void *, struct if_clone *);
 EVENTHANDLER_DECLARE(if_clone_event, if_clone_event_handler_t);
 
-#define        IFAFREE(ifa)                                    \
-       do {                                            \
-               if ((ifa)->ifa_refcnt <= 0)             \
-                       ifafree(ifa);                   \
-               else                                    \
-                       (ifa)->ifa_refcnt--;            \
-       } while (0)
+static __inline void
+IFAREF(struct ifaddr *ifa)
+{
+       ++ifa->ifa_refcnt;
+}
+
+#include <sys/malloc.h>
+
+MALLOC_DECLARE(M_IFADDR);
+MALLOC_DECLARE(M_IFMADDR);
+
+static __inline void
+IFAFREE(struct ifaddr *ifa)
+{
+       if (ifa->ifa_refcnt <= 0)
+               free(ifa, M_IFADDR);
+       else
+               ifa->ifa_refcnt--;
+}
 
 extern struct ifnethead ifnet;
 extern struct  ifnet   **ifindex2ifnet;
index 4cc66c9..b2f4ae5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * $KAME: net_osdep.h,v 1.68 2001/12/21 08:14:58 itojun Exp $
  * $FreeBSD: src/sys/net/net_osdep.h,v 1.1.2.3 2002/04/28 05:40:25 suz Exp $
- * $DragonFly: src/sys/net/net_osdep.h,v 1.5 2004/06/04 01:46:49 dillon Exp $
+ * $DragonFly: src/sys/net/net_osdep.h,v 1.6 2004/12/21 02:54:14 hsu Exp $
  */
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -295,9 +295,6 @@ extern const char *if_name (struct ifnet *);
 #define if_addrlist    if_addrhead
 #define if_list                if_link
 
-/* sys/net/if.h */
-#define IFAREF(ifa)    do { ++(ifa)->ifa_refcnt; } while (0)
-
 #define WITH_CONVERT_AND_STRIP_IP_LEN
 
 #if 1                          /* at this moment, all OSes do this */
index ac64541..f664ada 100644 (file)
@@ -1,7 +1,7 @@
 /*     $FreeBSD: src/sys/contrib/pf/net/pf.c,v 1.19 2004/09/11 11:18:25 mlaier Exp $   */
 /*     $OpenBSD: pf.c,v 1.433.2.2 2004/07/17 03:22:34 brad Exp $ */
 /* add $OpenBSD: pf.c,v 1.448 2004/05/11 07:34:11 dhartmei Exp $ */
-/*     $DragonFly: src/sys/net/pf/pf.c,v 1.2 2004/11/30 16:02:21 joerg Exp $ */
+/*     $DragonFly: src/sys/net/pf/pf.c,v 1.3 2004/12/21 02:54:15 hsu Exp $ */
 
 /*
  * Copyright (c) 2004 The DragonFly Project.  All rights reserved.
@@ -4854,7 +4854,7 @@ pf_routable(struct pf_addr *addr, sa_family_t af)
        dst->sin_family = af;
        dst->sin_len = sizeof(*dst);
        dst->sin_addr = addr->v4;
-       rtalloc_ign(&ro, (RTF_CLONING|RTF_PRCLONING));
+       rtalloc_ign(&ro, (RTF_CLONING | RTF_PRCLONING));
 
        if (ro.ro_rt != NULL) {
                ret = 1;
index a294221..5a33bfd 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)radix.c     8.4 (Berkeley) 11/2/94
  * $FreeBSD: src/sys/net/radix.c,v 1.20.2.3 2002/04/28 05:40:25 suz Exp $
- * $DragonFly: src/sys/net/radix.c,v 1.7 2004/12/15 00:11:04 hsu Exp $
+ * $DragonFly: src/sys/net/radix.c,v 1.8 2004/12/21 02:54:14 hsu Exp $
  */
 
 /*
  */
 #define clen(c)        (*(u_char *)(c))
 
-static int rn_walktree_from(struct radix_node_head *h, u_char *a, u_char *m,
+static int rn_walktree_from(struct radix_node_head *h, char *a, char *m,
                            walktree_f_t *f, void *w);
 static int rn_walktree(struct radix_node_head *, walktree_f_t *, void *);
 
 static struct radix_node
     *rn_insert(char *, struct radix_node_head *, boolean_t *,
-              struct radix_node [2]),
+              struct radix_node [2]),
     *rn_newpair(char *, int, struct radix_node[2]),
     *rn_search(const char *, struct radix_node *),
     *rn_search_m(const char *, struct radix_node *, const char *);
@@ -70,7 +70,6 @@ static int max_keylen;
 static struct radix_mask *rn_mkfreelist;
 static struct radix_node_head *mask_rnhead;
 static char *addmask_key;
-static char normal_chars[] = {0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, -1};
 static char *rn_zeros, *rn_ones;
 
 #define rn_masktop (mask_rnhead->rnh_treetop)
@@ -178,17 +177,17 @@ rn_refines(char *m, char *n)
                lim -= longer;
        while (n < lim) {
                if (*n & ~(*m))
-                       return 0;
+                       return FALSE;
                if (*n++ != *m++)
                        masks_are_equal = FALSE;
        }
        while (n < lim2)
                if (*n++)
-                       return 0;
+                       return FALSE;
        if (masks_are_equal && (longer < 0))
                for (lim2 = m - longer; m < lim2; )
                        if (*m++)
-                               return 1;
+                               return TRUE;
        return (!masks_are_equal);
 }
 
@@ -362,11 +361,8 @@ rn_newpair(char *key, int indexbit, struct radix_node nodes[2])
 }
 
 static struct radix_node *
-rn_insert(
-       char *key,
-       struct radix_node_head *head,
-       boolean_t *dupentry,
-       struct radix_node nodes[2])
+rn_insert(char *key, struct radix_node_head *head, boolean_t *dupentry,
+         struct radix_node nodes[2])
 {
        struct radix_node *top = head->rnh_treetop;
        int head_off = top->rn_offset, klen = clen(key);
@@ -374,7 +370,7 @@ rn_insert(
        char *cp = key + head_off;
        int b;
        struct radix_node *tt;
-       /*
+       /*
         * Find first bit at which the key and t->rn_key differ
         */
     {
@@ -489,6 +485,10 @@ rn_addmask(char *netmask, boolean_t search, int skip)
        for (cp = netmask + skip; cp < cplim && clen(cp) == 0xff;)
                cp++;
        if (cp != cplim) {
+               static const char normal_chars[] = {
+                       0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, -1
+               };
+
                for (j = 0x80; (j & *cp) != 0; j >>= 1)
                        b++;
                if (*cp != normal_chars[b] || cp != (cplim - 1))
@@ -593,7 +593,7 @@ rn_addroute(char *key, char *netmask, struct radix_node_head *head,
                        (tt = treenodes)->rn_dupedkey = t;
                        tt->rn_flags = t->rn_flags;
                        tt->rn_parent = x = t->rn_parent;
-                       t->rn_parent = tt;                      /* parent */
+                       t->rn_parent = tt;                      /* parent */
                        if (x->rn_left == t)
                                x->rn_left = tt;
                        else
@@ -831,9 +831,11 @@ on1:
                                mp = &m->rm_next;
                        *mp = t->rn_mklist;
                } else {
-                       /* If there are any key,mask pairs in a sibling
-                          duped-key chain, some subset will appear sorted
-                          in the same order attached to our mklist */
+                       /*
+                        * If there are any (key, mask) pairs in a sibling
+                        * duped-key chain, some subset will appear sorted
+                        * in the same order attached to our mklist.
+                        */
                        for (m = t->rn_mklist; m && x; x = x->rn_dupedkey)
                                if (m == x->rn_mklist) {
                                        struct radix_mask *mm = m->rm_next;
@@ -880,12 +882,12 @@ out:
  * exit.
  */
 static int
-rn_walktree_from(struct radix_node_head *h, u_char *xa, u_char *xm,
+rn_walktree_from(struct radix_node_head *h, char *xa, char *xm,
                 walktree_f_t *f, void *w)
 {
        struct radix_node *base, *next;
        struct radix_node *rn, *last = NULL /* shut up gcc */;
-       int stopping = 0;
+       boolean_t stopping = FALSE;
        int lastb, error;
 
        /*
@@ -936,7 +938,7 @@ rn_walktree_from(struct radix_node_head *h, u_char *xa, u_char *xm,
 
                        /* if went up beyond last, stop */
                        if (rn->rn_bit < lastb) {
-                               stopping = 1;
+                               stopping = TRUE;
                                /* printf("up too far\n"); */
                        }
                }
@@ -956,7 +958,7 @@ rn_walktree_from(struct radix_node_head *h, u_char *xa, u_char *xm,
 
                if (rn->rn_flags & RNF_ROOT) {
                        /* printf("root, stopping"); */
-                       stopping = 1;
+                       stopping = TRUE;
                }
 
        }
@@ -1005,7 +1007,7 @@ int
 rn_inithead(void **head, int off)
 {
        struct radix_node_head *rnh;
-       struct radix_node *t, *left, *right;
+       struct radix_node *root, *left, *right;
 
        if (*head)
                return (1);
@@ -1015,25 +1017,26 @@ rn_inithead(void **head, int off)
        bzero(rnh, sizeof (*rnh));
        *head = rnh;
 
-       t = rn_newpair(rn_zeros, off, rnh->rnh_nodes);
+       root = rn_newpair(rn_zeros, off, rnh->rnh_nodes);
        right = rnh->rnh_nodes + 2;
-       t->rn_right = right;
-       t->rn_parent = t;
+       root->rn_parent = root;
+       root->rn_flags = RNF_ROOT | RNF_ACTIVE;
+       root->rn_right = right;
 
-       left = t->rn_left;
-       left->rn_flags = t->rn_flags = RNF_ROOT | RNF_ACTIVE;
+       left = root->rn_left;
        left->rn_bit = -1 - off;
+       left->rn_flags = RNF_ROOT | RNF_ACTIVE;
 
        *right = *left;
        right->rn_key = rn_ones;
 
+       rnh->rnh_treetop = root;
        rnh->rnh_addaddr = rn_addroute;
        rnh->rnh_deladdr = rn_delete;
        rnh->rnh_matchaddr = rn_match;
        rnh->rnh_lookup = rn_lookup;
        rnh->rnh_walktree = rn_walktree;
        rnh->rnh_walktree_from = rn_walktree_from;
-       rnh->rnh_treetop = t;
 
        return (1);
 }
index e71bf08..cec0302 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)radix.h     8.2 (Berkeley) 10/31/94
  * $FreeBSD: src/sys/net/radix.h,v 1.16.2.1 2000/05/03 19:17:11 wollman Exp $
- * $DragonFly: src/sys/net/radix.h,v 1.7 2004/12/15 07:32:26 hsu Exp $
+ * $DragonFly: src/sys/net/radix.h,v 1.8 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _RADIX_H_
@@ -128,7 +128,7 @@ struct radix_node_head {
 
        /* traverse tree below a */
        int     (*rnh_walktree_from)
-                   (struct radix_node_head *head, u_char *a, u_char *m,
+                   (struct radix_node_head *head, char *a, char *m,
                     walktree_f_t *f, void *w);
 
        /* do something when the last ref drops */
@@ -159,15 +159,15 @@ struct radix_node_head {
 #define Free(p) free(p, M_RTABLE);
 #endif
 
-void                    rn_init (void);
-int                     rn_inithead (void **, int);
+void                    rn_init (void);
+int                     rn_inithead (void **, int);
 boolean_t               rn_refines (char *, char *);
 struct radix_node      *rn_addmask (char *, boolean_t, int),
-                       *rn_addroute (char *, char *, struct radix_node_head *,
-                                     struct radix_node [2]),
-                       *rn_delete (char *, char *, struct radix_node_head *),
-                       *rn_lookup (char *key, char *mask,
-                                   struct radix_node_head *head),
-                       *rn_match (char *, struct radix_node_head *);
+                       *rn_addroute (char *, char *, struct radix_node_head *,
+                                     struct radix_node [2]),
+                       *rn_delete (char *, char *, struct radix_node_head *),
+                       *rn_lookup (char *key, char *mask,
+                                   struct radix_node_head *head),
+                       *rn_match (char *, struct radix_node_head *);
 
 #endif /* _RADIX_H_ */
index e2871aa..4f49208 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)raw_cb.c    8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/raw_cb.c,v 1.16 1999/08/28 00:48:27 peter Exp $
- * $DragonFly: src/sys/net/raw_cb.c,v 1.8 2004/06/04 04:30:55 dillon Exp $
+ * $DragonFly: src/sys/net/raw_cb.c,v 1.9 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -97,7 +97,7 @@ raw_detach(struct rawcb *rp)
        so->so_pcb = 0;
        sofree(so);
        LIST_REMOVE(rp, list);
-       free((caddr_t)(rp), M_PCB);
+       free(rp, M_PCB);
 }
 
 /*
index 8f1918b..dd3717f 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)raw_usrreq.c        8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/raw_usrreq.c,v 1.18 1999/08/28 00:48:28 peter Exp $
- * $DragonFly: src/sys/net/raw_usrreq.c,v 1.7 2004/06/06 19:16:07 dillon Exp $
+ * $DragonFly: src/sys/net/raw_usrreq.c,v 1.8 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -97,10 +97,11 @@ raw_input(m0, proto, src, dst)
                        continue;
                if (last) {
                        struct mbuf *n;
-                       n = m_copy(m, 0, (int)M_COPYALL);
+
+                       n = m_copypacket(m, MB_DONTWAIT);
                        if (n) {
-                               if (sbappendaddr(&last->so_rcv, src,
-                                   n, (struct mbuf *)0) == 0)
+                               if (sbappendaddr(&last->so_rcv, src, n,
+                                               (struct mbuf *)0) == 0)
                                        /* should notify about lost packet */
                                        m_freem(n);
                                else {
@@ -112,8 +113,7 @@ raw_input(m0, proto, src, dst)
                last = rp->rcb_socket;
        }
        if (last) {
-               if (sbappendaddr(&last->so_rcv, src,
-                   m, (struct mbuf *)0) == 0)
+               if (sbappendaddr(&last->so_rcv, src, m, (struct mbuf *)0) == 0)
                        m_freem(m);
                else {
                        sorwakeup(last);
index 12dfb9c..6bf6803 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)route.c     8.3 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/net/route.c,v 1.59.2.10 2003/01/17 08:04:00 ru Exp $
- * $DragonFly: src/sys/net/route.c,v 1.9 2004/12/15 00:11:04 hsu Exp $
+ * $DragonFly: src/sys/net/route.c,v 1.10 2004/12/21 02:54:14 hsu Exp $
  */
 
 #include "opt_inet.h"
 #include <netinet/in.h>
 #include <net/ip_mroute/ip_mroute.h>
 
-#define        SA(p) ((struct sockaddr *)(p))
-
-struct route_cb route_cb;
 static struct rtstat rtstat;
 struct radix_node_head *rt_tables[AF_MAX+1];
 
-static int rttrash;            /* routes not in table but not freed */
-
-static void rt_maskedcopy (struct sockaddr *, struct sockaddr *,
-    struct sockaddr *);
-static void rtable_init (void **);
+static void    rt_maskedcopy (struct sockaddr *, struct sockaddr *,
+                              struct sockaddr *);
+static void    rtable_init (void **);
 
 static void
 rtable_init(void **table)
@@ -84,6 +79,11 @@ route_init()
 /*
  * Packet routing routines.
  */
+
+/*
+ * Lookup and fill in the ro_rt rtentry field in a route structure given
+ * an address in the ro_dst field.
+ */
 void
 rtalloc(struct route *ro)
 {
@@ -93,190 +93,116 @@ rtalloc(struct route *ro)
 void
 rtalloc_ign(struct route *ro, u_long ignore)
 {
-       struct rtentry *rt;
        int s;
 
-       if ((rt = ro->ro_rt) != NULL) {
-               if (rt->rt_ifp != NULL && rt->rt_flags & RTF_UP)
+       if (ro->ro_rt != NULL) {
+               if (ro->ro_rt->rt_ifp != NULL && ro->ro_rt->rt_flags & RTF_UP)
                        return;
-               /* XXX - We are probably always at splnet here already. */
-               s = splnet();
-               RTFREE(rt);
+               s = splnet(); /* XXX probably always at splnet here already */
+               rtfree(ro->ro_rt);
                ro->ro_rt = NULL;
                splx(s);
        }
-       ro->ro_rt = rtalloc1(&ro->ro_dst, 1, ignore);
+       ro->ro_rt = rtlookup(&ro->ro_dst, 1, ignore);
 }
 
 /*
- * Look up the route that matches the address given
- * Or, at least try.. Create a cloned route if needed.
+ * Look up the route that matches the given 'dst' address.
+ *
+ * Create a cloned route if the route is a cloning route
+ * and RTF_CLONING or RTF_PRCLONING are not being ignored.
+ *
+ * In either case, the returned route has its refcnt incremented.
  */
 struct rtentry *
-rtalloc1(struct sockaddr *dst, int report, u_long ignflags)
+rtlookup(struct sockaddr *dst, int report, u_long ignflags)
 {
        struct radix_node_head *rnh = rt_tables[dst->sa_family];
        struct rtentry *rt;
        struct radix_node *rn;
-       struct rtentry *newrt = NULL;
        struct rt_addrinfo info;
        u_long nflags;
-       int  s = splnet(), err = 0, msgtype = RTM_MISS;
+       int s, err, msgtype;
 
-       /*
-        * Look up the address in the table for that Address Family
-        */
-       if (rnh != NULL && (rn = rnh->rnh_matchaddr((char *)dst, rnh)) &&
-           !(rn->rn_flags & RNF_ROOT)) {
-               /*
-                * If we find it and it's not the root node, then
-                * get a refernce on the rtentry associated.
-                */
-               newrt = rt = (struct rtentry *)rn;
+       s = splnet();
+       if (rnh != NULL && (rn = rnh->rnh_matchaddr((char *)dst, rnh))) {
+               rt = (struct rtentry *)rn;
                nflags = rt->rt_flags & ~ignflags;
                if (report && (nflags & (RTF_CLONING | RTF_PRCLONING))) {
-                       /*
-                        * We are apparently adding (report = 0 in delete).
-                        * If it requires that it be cloned, do so.
-                        * (This implies it wasn't a HOST route.)
-                        */
-                       err = rtrequest(RTM_RESOLVE, dst, SA(0),
-                                             SA(0), 0, &newrt);
-                       if (err) {
-                               /*
-                                * If the cloning didn't succeed, maybe
-                                * what we have will do. Return that.
-                                */
-                               newrt = rt;
+                       struct rtentry *clonedroute;
+
+                       clonedroute = rt;  /* value used in rtrequest()! */
+                       err = rtrequest(RTM_RESOLVE, dst, NULL, NULL, 0,
+                                       &clonedroute);
+                       if (err != 0) {
+                               /* use original route on clone failure */
                                rt->rt_refcnt++;
-                               goto miss;
+                               goto reportmiss;
+                       } else {
+                               rt = clonedroute;       /* use cloned route */
                        }
-                       if ((rt = newrt) && (rt->rt_flags & RTF_XRESOLVE)) {
+                       if (clonedroute->rt_flags & RTF_XRESOLVE) {
                                /*
-                                * If the new route specifies it be
-                                * externally resolved, then go do that.
+                                * The new cloned route needs external
+                                * resolution.
                                 */
                                msgtype = RTM_RESOLVE;
-                               goto miss;
+                               goto reportmsg;
                        }
                        /* Inform listeners of the new route. */
                        bzero(&info, sizeof(info));
-                       info.rti_info[RTAX_DST] = rt_key(rt);
-                       info.rti_info[RTAX_NETMASK] = rt_mask(rt);
-                       info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
-                       if (rt->rt_ifp != NULL) {
+                       info.rti_info[RTAX_DST] = rt_key(clonedroute);
+                       info.rti_info[RTAX_NETMASK] = rt_mask(clonedroute);
+                       info.rti_info[RTAX_GATEWAY] = clonedroute->rt_gateway;
+                       if (clonedroute->rt_ifp != NULL) {
                                info.rti_info[RTAX_IFP] =
-                                   TAILQ_FIRST(&rt->rt_ifp->if_addrhead)->
-                                                                   ifa_addr;
-                               info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
+                                   TAILQ_FIRST(&clonedroute->rt_ifp
+                                               ->if_addrhead)->ifa_addr;
+                               info.rti_info[RTAX_IFA] =
+                                   clonedroute->rt_ifa->ifa_addr;
                        }
-                       rt_missmsg(RTM_ADD, &info, rt->rt_flags, 0);
+                       rt_missmsg(RTM_ADD, &info, clonedroute->rt_flags, 0);
                } else
-                       rt->rt_refcnt++;
+                       rt->rt_refcnt++;        /* most common case */
        } else {
-               /*
-                * Either we hit the root or couldn't find any match,
-                * Which basically means
-                * "caint get there frm here"
-                */
+               rt = NULL;
                rtstat.rts_unreach++;
-miss:
                if (report) {
-                       /*
-                        * If required, report the failure to the supervising
-                        * Authorities.
-                        * For a delete, this is not an error. (report == 0)
-                        */
+                       err = 0;
+reportmiss:
+                       msgtype = RTM_MISS;
+reportmsg:
                        bzero(&info, sizeof(info));
                        info.rti_info[RTAX_DST] = dst;
                        rt_missmsg(msgtype, &info, 0, err);
                }
        }
        splx(s);
-       return (newrt);
+       return (rt);
 }
 
-/*
- * Remove a reference count from an rtentry.
- * If the count gets low enough, take it out of the routing table
- */
 void
 rtfree(struct rtentry *rt)
 {
-       /*
-        * find the tree for that address family
-        */
        struct radix_node_head *rnh = rt_tables[rt_key(rt)->sa_family];
-       struct ifaddr *ifa;
-
-       if (rt == NULL || rnh == NULL)
-               panic("rtfree");
 
-       /*
-        * decrement the reference count by one and if it reaches 0,
-        * and there is a close function defined, call the close function
-        */
-       rt->rt_refcnt--;
-       if(rnh->rnh_close && rt->rt_refcnt == 0) {
+       --rt->rt_refcnt;
+       if (rnh->rnh_close && rt->rt_refcnt == 0)
                rnh->rnh_close((struct radix_node *)rt, rnh);
-       }
-
-       /*
-        * If we are no longer "up" (and ref == 0)
-        * then we can free the resources associated
-        * with the route.
-        */
        if (rt->rt_refcnt <= 0 && !(rt->rt_flags & RTF_UP)) {
-               if (rt->rt_nodes->rn_flags & (RNF_ACTIVE | RNF_ROOT))
-                       panic ("rtfree 2");
-               /*
-                * the rtentry must have been removed from the routing table
-                * so it is represented in rttrash.. remove that now.
-                */
-               rttrash--;
-
-#ifdef DIAGNOSTIC
-               if (rt->rt_refcnt < 0) {
-                       printf("rtfree: %p not freed (neg refs)\n", rt);
-                       return;
-               }
-#endif
-
-               /*
-                * release references on items we hold them on..
-                * e.g other routes and ifaddrs.
-                */
-               if((ifa = rt->rt_ifa))
-                       IFAFREE(ifa);
-               if (rt->rt_parent) {
+               KASSERT(!(rt->rt_nodes->rn_flags & (RNF_ACTIVE | RNF_ROOT)),
+                       ("rtfree: rn_flags 0x%x ", rt->rt_nodes->rn_flags));
+               KASSERT(rt->rt_refcnt == 0,
+                       ("rtfree: rt_refcnt %ld", rt->rt_refcnt));
+               if (rt->rt_ifa != NULL)
+                       IFAFREE(rt->rt_ifa);
+               if (rt->rt_parent != NULL)
                        RTFREE(rt->rt_parent);
-               }
-
-               /*
-                * The key is separatly alloc'd so free it (see rt_setgate()).
-                * This also frees the gateway, as they are always malloc'd
-                * together.
-                */
-               Free(rt_key(rt));
-
-               /*
-                * and the rtentry itself of course
-                */
+               Free(rt_key(rt));  /* Also frees gateway.  See rt_setgate(). */
                Free(rt);
        }
 }
 
-void
-ifafree(struct ifaddr *ifa)
-{
-       if (ifa == NULL)
-               panic("ifafree");
-       if (ifa->ifa_refcnt == 0)
-               free(ifa, M_IFADDR);
-       else
-               ifa->ifa_refcnt--;
-}
-
 #define        sa_equal(a1, a2) (bcmp((a1), (a2), (a1)->sa_len) == 0)
 
 /*
@@ -298,41 +224,44 @@ rtredirect(
        struct rtentry **rtp)
 {
        struct rtentry *rt;
-       int error = 0;
-       short *stat = NULL;
        struct rt_addrinfo info;
        struct ifaddr *ifa;
+       short *stat = NULL;
+       int error;
 
        /* verify the gateway is directly reachable */
        if ((ifa = ifa_ifwithnet(gateway)) == NULL) {
                error = ENETUNREACH;
                goto out;
        }
-       rt = rtalloc1(dst, 0, 0UL);
+
        /*
         * If the redirect isn't from our current router for this dst,
         * it's either old or wrong.  If it redirects us to ourselves,
         * we have a routing loop, perhaps as a result of an interface
         * going down recently.
         */
-       if (!(flags & RTF_DONE) && rt &&
-            (!sa_equal(src, rt->rt_gateway) || rt->rt_ifa != ifa))
+       if (!(flags & RTF_DONE) &&
+           (rt = rtlookup(dst, 0, 0UL)) != NULL &&
+           (!sa_equal(src, rt->rt_gateway) || rt->rt_ifa != ifa)) {
                error = EINVAL;
-       else if (ifa_ifwithaddr(gateway))
+               goto done;
+       } else if (ifa_ifwithaddr(gateway)) {
                error = EHOSTUNREACH;
-       if (error)
                goto done;
+       }
+
        /*
         * Create a new entry if we just got back a wildcard entry
         * or the the lookup failed.  This is necessary for hosts
         * which use routing redirects generated by smart gateways
         * to dynamically build the routing tables.
         */
-       if ((rt == NULL) || (rt_mask(rt) != NULL && rt_mask(rt)->sa_len < 2))
+       if (rt == NULL || (rt_mask(rt) != NULL && rt_mask(rt)->sa_len < 2))
                goto create;
+
        /*
-        * Don't listen to the redirect if it's
-        * for a route to an interface.
+        * Don't listen to the redirect if it's for a route to an interface.
         */
        if (rt->rt_flags & RTF_GATEWAY) {
                if ((!(rt->rt_flags & RTF_HOST)) && (flags & RTF_HOST)) {
@@ -340,8 +269,8 @@ rtredirect(
                         * Changing from route to net => route to host.
                         * Create new route, rather than smashing route to net.
                         */
-               create:
-                       if (rt)
+create:
+                       if (rt != NULL)
                                rtfree(rt);
                        flags |=  RTF_GATEWAY | RTF_DYNAMIC;
                        bzero(&info, sizeof(info));
@@ -363,25 +292,28 @@ rtredirect(
                        rt->rt_flags |= RTF_MODIFIED;
                        flags |= RTF_MODIFIED;
                        stat = &rtstat.rts_newgateway;
-                       /*
-                        * add the key and gateway (in one malloc'd chunk).
-                        */
+                       /* Add the key and gateway (in one malloc'ed chunk). */
                        rt_setgate(rt, rt_key(rt), gateway);
+                       error = 0;
                }
-       } else
+       } else {
                error = EHOSTUNREACH;
+       }
+
 done:
-       if (rt) {
-               if (rtp != NULL && !error)
+       if (rt != NULL) {
+               if (rtp != NULL && error == 0)
                        *rtp = rt;
                else
                        rtfree(rt);
        }
+
 out:
-       if (error)
+       if (error != 0)
                rtstat.rts_badredirect++;
        else if (stat != NULL)
                (*stat)++;
+
        bzero(&info, sizeof(info));
        info.rti_info[RTAX_DST] = dst;
        info.rti_info[RTAX_GATEWAY] = gateway;
@@ -412,7 +344,7 @@ ifa_ifwithroute(int flags, struct sockaddr *dst, struct sockaddr *gateway)
        if (!(flags & RTF_GATEWAY)) {
                /*
                 * If we are adding a route to an interface,
-                * and the interface is a pt to pt link
+                * and the interface is a point-to-point link,
                 * we should search for the destination
                 * as our clue to the interface.  Otherwise
                 * we can use the local address.
@@ -434,7 +366,8 @@ ifa_ifwithroute(int flags, struct sockaddr *dst, struct sockaddr *gateway)
        if (ifa == NULL)
                ifa = ifa_ifwithnet(gateway);
        if (ifa == NULL) {
-               struct rtentry *rt = rtalloc1(gateway, 0, 0UL);
+               struct rtentry *rt = rtlookup(gateway, 0, 0UL);
+
                if (rt == NULL)
                        return (NULL);
                rt->rt_refcnt--;
@@ -443,6 +376,7 @@ ifa_ifwithroute(int flags, struct sockaddr *dst, struct sockaddr *gateway)
        }
        if (ifa->ifa_addr->sa_family != dst->sa_family) {
                struct ifaddr *oifa = ifa;
+
                ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp);
                if (ifa == NULL)
                        ifa = oifa;
@@ -458,29 +392,6 @@ struct rtfc_arg {
        struct radix_node_head *rnh;
 };
 
-/*
- * Do appropriate manipulations of a routing tree given
- * all the bits of info needed
- */
-int
-rtrequest(
-       int req,
-       struct sockaddr *dst,
-       struct sockaddr *gateway,
-       struct sockaddr *netmask,
-       int flags,
-       struct rtentry **ret_nrt)
-{
-       struct rt_addrinfo info;
-
-       bzero(&info, sizeof(info));
-       info.rti_flags = flags;
-       info.rti_info[RTAX_DST] = dst;
-       info.rti_info[RTAX_GATEWAY] = gateway;
-       info.rti_info[RTAX_NETMASK] = netmask;
-       return rtrequest1(req, &info, ret_nrt);
-}
-
 int
 rt_getifa(struct rt_addrinfo *info)
 {
@@ -522,6 +433,29 @@ rt_getifa(struct rt_addrinfo *info)
        return (error);
 }
 
+/*
+ * Do appropriate manipulations of a routing tree given
+ * all the bits of info needed
+ */
+int
+rtrequest(
+       int req,
+       struct sockaddr *dst,
+       struct sockaddr *gateway,
+       struct sockaddr *netmask,
+       int flags,
+       struct rtentry **ret_nrt)
+{
+       struct rt_addrinfo info;
+
+       bzero(&info, sizeof info);
+       info.rti_flags = flags;
+       info.rti_info[RTAX_DST] = dst;
+       info.rti_info[RTAX_GATEWAY] = gateway;
+       info.rti_info[RTAX_NETMASK] = netmask;
+       return rtrequest1(req, &info, ret_nrt);
+}
+
 int
 rtrequest1(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt)
 {
@@ -531,16 +465,18 @@ rtrequest1(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt)
        struct radix_node_head *rnh;
        struct ifaddr *ifa;
        struct sockaddr *ndst;
-       int s = splnet();
        int error = 0;
+       int s;
 
 #define gotoerr(x) { error = x ; goto bad; }
 
+       s = splnet();
        /*
         * Find the correct routing tree to use for this Address Family
         */
        if ((rnh = rt_tables[dst->sa_family]) == NULL)
                gotoerr(EAFNOSUPPORT);
+
        /*
         * If we are adding a host route then we don't want to put
         * a netmask in the tree, nor do we want to clone it.
@@ -549,71 +485,52 @@ rtrequest1(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt)
                info->rti_info[RTAX_NETMASK] = NULL;
                info->rti_flags &= ~(RTF_CLONING | RTF_PRCLONING);
        }
+
        switch (req) {
        case RTM_DELETE:
-               /*
-                * Remove the item from the tree and return it.
-                * Complain if it is not there and do no more processing.
-                */
-               if ((rn = rnh->rnh_deladdr((char *)dst,
-                   (char *)info->rti_info[RTAX_NETMASK], rnh)) == NULL)
+               /* Remove the item from the tree. */
+               rn = rnh->rnh_deladdr((char *)info->rti_info[RTAX_DST],
+                                     (char *)info->rti_info[RTAX_NETMASK],
+                                     rnh);
+               if (rn == NULL)
                        gotoerr(ESRCH);
-               if (rn->rn_flags & (RNF_ACTIVE | RNF_ROOT))
-                       panic ("rtrequest delete");
+               KASSERT(!(rn->rn_flags & (RNF_ACTIVE | RNF_ROOT)),
+                       ("rnh_deladdr returned flags 0x%x", rn->rn_flags));
                rt = (struct rtentry *)rn;
 
-               /*
-                * Now search what's left of the subtree for any cloned
-                * routes which might have been formed from this node.
-                */
+               /* Free any routes cloned from this one. */
                if ((rt->rt_flags & (RTF_CLONING | RTF_PRCLONING)) &&
                    rt_mask(rt) != NULL) {
-                       rnh->rnh_walktree_from(rnh, (char *)dst,
+                       rnh->rnh_walktree_from(rnh, (char *)rt_key(rt),
                                               (char *)rt_mask(rt),
                                               rt_fixdelete, rt);
                }
 
-               /*
-                * Remove any external references we may have.
-                * This might result in another rtentry being freed if
-                * we held its last reference.
-                */
-               if (rt->rt_gwroute) {
-                       rt = rt->rt_gwroute;
-                       RTFREE(rt);
-                       (rt = (struct rtentry *)rn)->rt_gwroute = NULL;
+               if (rt->rt_gwroute != NULL) {
+                       RTFREE(rt->rt_gwroute);
+                       rt->rt_gwroute = NULL;
                }
 
                /*
                 * NB: RTF_UP must be set during the search above,
                 * because we might delete the last ref, causing
                 * rt to get freed prematurely.
-                *  eh? then why not just add a reference?
-                * I'm not sure how RTF_UP helps matters. (JRE)
                 */
                rt->rt_flags &= ~RTF_UP;
 
-               /*
-                * give the protocol a chance to keep things in sync.
-                */
+               /* Give the protocol a chance to keep things in sync. */
                if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest)
                        ifa->ifa_rtrequest(RTM_DELETE, rt, info);
 
-               /*
-                * one more rtentry floating around that is not
-                * linked to the routing table.
-                */
-               rttrash++;
-
                /*
                 * If the caller wants it, then it can have it,
                 * but it's up to it to free the rtentry as we won't be
                 * doing it.
                 */
-               if (ret_nrt != NULL)
+               if (ret_nrt != NULL) {
                        *ret_nrt = rt;
-               else if (rt->rt_refcnt <= 0) {
-                       rt->rt_refcnt++; /* make a 1->0 transition */
+               else if (rt->rt_refcnt <= 0) {
+                       rt->rt_refcnt++;  /* refcnt > 0 required for rtfree() */
                        rtfree(rt);
                }
                break;
@@ -631,41 +548,29 @@ rtrequest1(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt)
                goto makeroute;
 
        case RTM_ADD:
-               if ((info->rti_flags & RTF_GATEWAY) &&
-                   !info->rti_info[RTAX_GATEWAY])
-                       panic("rtrequest: GATEWAY but no gateway");
+               KASSERT(!(info->rti_flags & RTF_GATEWAY) ||
+                       info->rti_info[RTAX_GATEWAY] != NULL,
+                   ("rtrequest: GATEWAY but no gateway"));
 
                if (info->rti_ifa == NULL && (error = rt_getifa(info)))
                        gotoerr(error);
                ifa = info->rti_ifa;
-
 makeroute:
-               R_Malloc(rt, struct rtentry *, sizeof(*rt));
+               R_Malloc(rt, struct rtentry *, sizeof *rt);
                if (rt == NULL)
                        gotoerr(ENOBUFS);
-               bzero(rt, sizeof(*rt));
+               bzero(rt, sizeof *rt);
                rt->rt_flags = RTF_UP | info->rti_flags;
-               /*
-                * Add the gateway. Possibly re-malloc-ing the storage for it
-                * also add the rt_gwroute if possible.
-                */
-               if ((error = rt_setgate(rt, dst, info->rti_info[RTAX_GATEWAY]))
-                   != 0) {
+               error = rt_setgate(rt, dst, info->rti_info[RTAX_GATEWAY]);
+               if (error != 0) {
                        Free(rt);
                        gotoerr(error);
                }
 
-               /*
-                * point to the (possibly newly malloc'd) dest address.
-                */
                ndst = rt_key(rt);
-
-               /*
-                * make sure it contains the value we want (masked if needed).
-                */
-               if (info->rti_info[RTAX_NETMASK] != NULL) {
+               if (info->rti_info[RTAX_NETMASK] != NULL)
                        rt_maskedcopy(dst, ndst, info->rti_info[RTAX_NETMASK]);
-               else
+               else
                        bcopy(dst, ndst, dst->sa_len);
 
                /*
@@ -673,7 +578,7 @@ makeroute:
                 * This moved from below so that rnh->rnh_addaddr() can
                 * examine the ifa and  ifa->ifa_ifp if it so desires.
                 */
-               ifa->ifa_refcnt++;
+               IFAREF(ifa);
                rt->rt_ifa = ifa;
                rt->rt_ifp = ifa->ifa_ifp;
                /* XXX mtu manipulation will be done in rnh_addaddr -- itojun */
@@ -682,57 +587,53 @@ makeroute:
                                      (char *)info->rti_info[RTAX_NETMASK],
                                      rnh, rt->rt_nodes);
                if (rn == NULL) {
-                       struct rtentry *rt2;
+                       struct rtentry *oldrt;
+
                        /*
-                        * Uh-oh, we already have one of these in the tree.
-                        * We do a special hack: if the route that's already
-                        * there was generated by the protocol-cloning
-                        * mechanism, then we just blow it away and retry
-                        * the insertion of the new one.
+                        * We already have one of these in the tree.
+                        * We do a special hack: if the old route was
+                        * cloned, then we blow it away and try
+                        * re-inserting the new one.
                         */
-                       rt2 = rtalloc1(dst, 0, RTF_PRCLONING);
-                       if (rt2 != NULL && rt2->rt_parent) {
-                               rtrequest(RTM_DELETE,
-                                         (struct sockaddr *)rt_key(rt2),
-                                         rt2->rt_gateway,
-                                         rt_mask(rt2), rt2->rt_flags, 0);
-                               RTFREE(rt2);
-                               rn = rnh->rnh_addaddr((char *)ndst,
-                                   (char *)info->rti_info[RTAX_NETMASK],
-                                   rnh, rt->rt_nodes);
-                       } else if (rt2 != NULL) {
-                               /* undo the extra ref we got */
-                               RTFREE(rt2);
+                       oldrt = rtlookup(ndst, 0, RTF_CLONING | RTF_PRCLONING);
+                       if (oldrt != NULL) {
+                               --oldrt->rt_refcnt;
+                               if (oldrt->rt_flags & RTF_WASCLONED) {
+                                       rtrequest(RTM_DELETE, rt_key(oldrt),
+                                                 oldrt->rt_gateway,
+                                                 rt_mask(oldrt),
+                                                 oldrt->rt_flags, NULL);
+                                       rn = rnh->rnh_addaddr((char *)ndst,
+                                                 (char *)
+                                                 info->rti_info[RTAX_NETMASK],
+                                                 rnh, rt->rt_nodes);
+                               }
                        }
                }
 
                /*
                 * If it still failed to go into the tree,
-                * then un-make it (this should be a function)
+                * then un-make it (this should be a function).
                 */
                if (rn == NULL) {
-                       if (rt->rt_gwroute)
+                       if (rt->rt_gwroute != NULL)
                                rtfree(rt->rt_gwroute);
-                       if (rt->rt_ifa) {
-                               IFAFREE(rt->rt_ifa);
-                       }
+                       IFAFREE(ifa);
                        Free(rt_key(rt));
                        Free(rt);
                        gotoerr(EEXIST);
                }
 
-               rt->rt_parent = 0;
-
                /*
                 * If we got here from RESOLVE, then we are cloning
                 * so clone the rest, and note that we
                 * are a clone (and increment the parent's references)
                 */
                if (req == RTM_RESOLVE) {
-                       rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */
-                       rt->rt_rmx.rmx_pksent = 0; /* reset packet counter */
+                       rt->rt_rmx = (*ret_nrt)->rt_rmx;    /* copy metrics */
+                       rt->rt_rmx.rmx_pksent = 0;  /* reset packet counter */
                        if ((*ret_nrt)->rt_flags &
-                           (RTF_CLONING | RTF_PRCLONING)) {
+                                      (RTF_CLONING | RTF_PRCLONING)) {
                                rt->rt_parent = *ret_nrt;
                                (*ret_nrt)->rt_refcnt++;
                        }
@@ -742,7 +643,7 @@ makeroute:
                 * if this protocol has something to add to this then
                 * allow it to do that as well.
                 */
-               if (ifa->ifa_rtrequest)
+               if (ifa->ifa_rtrequest != NULL)
                        ifa->ifa_rtrequest(req, rt, info);
 
                /*
@@ -752,21 +653,20 @@ makeroute:
                 */
                if (req == RTM_ADD && !(rt->rt_flags & RTF_HOST) &&
                    rt_mask(rt) != NULL) {
-                       struct rtfc_arg arg;
-                       arg.rnh = rnh;
-                       arg.rt0 = rt;
+                       struct rtfc_arg arg = { rt, rnh };
+
                        rnh->rnh_walktree_from(rnh, (char *)rt_key(rt),
                                               (char *)rt_mask(rt),
                                               rt_fixchange, &arg);
                }
 
                /*
-                * actually return a resultant rtentry and
-                * give the caller a single reference.
+                * Return the resulting rtentry,
+                * increasing the number of references by one.
                 */
                if (ret_nrt != NULL) {
-                       *ret_nrt = rt;
                        rt->rt_refcnt++;
+                       *ret_nrt = rt;
                }
                break;
        default:
@@ -792,9 +692,8 @@ rt_fixdelete(struct radix_node *rn, void *vp)
 
        if (rt->rt_parent == rt0 &&
            !(rt->rt_flags & (RTF_PINNED | RTF_CLONING | RTF_PRCLONING))) {
-               return rtrequest(RTM_DELETE, rt_key(rt),
-                                (struct sockaddr *)0, rt_mask(rt),
-                                rt->rt_flags, (struct rtentry **)0);
+               return rtrequest(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt),
+                                rt->rt_flags, NULL);
        }
        return 0;
 }
@@ -831,29 +730,27 @@ rt_fixchange(struct radix_node *rn, void *vp)
                printf("rt_fixchange: rt %p, rt0 %p\n", rt, rt0);
 #endif
 
-       if (!rt->rt_parent ||
+       if (rt->rt_parent == NULL ||
            (rt->rt_flags & (RTF_PINNED | RTF_CLONING | RTF_PRCLONING))) {
 #ifdef DEBUG
-               if(rtfcdebug) printf("no parent, pinned or cloning\n");
+               if (rtfcdebug) printf("no parent, pinned or cloning\n");
 #endif
                return 0;
        }
 
        if (rt->rt_parent == rt0) {
 #ifdef DEBUG
-               if(rtfcdebug) printf("parent match\n");
+               if (rtfcdebug) printf("parent match\n");
 #endif
-               return rtrequest(RTM_DELETE, rt_key(rt),
-                                (struct sockaddr *)0, rt_mask(rt),
-                                rt->rt_flags, (struct rtentry **)0);
+               return rtrequest(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt),
+                                rt->rt_flags, NULL);
        }
 
        /*
         * There probably is a function somewhere which does this...
         * if not, there should be.
         */
-       len = imin(((struct sockaddr *)rt_key(rt0))->sa_len,
-                  ((struct sockaddr *)rt_key(rt))->sa_len);
+       len = imin(rt_key(rt0)->sa_len, rt_key(rt)->sa_len);
 
        xk1 = (u_char *)rt_key(rt0);
        xm1 = (u_char *)rt_mask(rt0);
@@ -861,8 +758,8 @@ rt_fixchange(struct radix_node *rn, void *vp)
 
        /* avoid applying a less specific route */
        xmp = (u_char *)rt_mask(rt->rt_parent);
-       mlen = ((struct sockaddr *)rt_key(rt->rt_parent))->sa_len;
-       if (mlen > ((struct sockaddr *)rt_key(rt0))->sa_len) {
+       mlen = rt_key(rt->rt_parent)->sa_len;
+       if (mlen > rt_key(rt0)->sa_len) {
 #ifdef DEBUG
                if (rtfcdebug)
                        printf("rt_fixchange: inserting a less "
@@ -884,7 +781,7 @@ rt_fixchange(struct radix_node *rn, void *vp)
        for (i = rnh->rnh_treetop->rn_offset; i < len; i++) {
                if ((xk2[i] & xm1[i]) != xk1[i]) {
 #ifdef DEBUG
-                       if(rtfcdebug) printf("no match\n");
+                       if (rtfcdebug) printf("no match\n");
 #endif
                        return 0;
                }
@@ -895,10 +792,10 @@ rt_fixchange(struct radix_node *rn, void *vp)
         * changed/added under the node's mask.  So, get rid of it.
         */
 #ifdef DEBUG
-       if(rtfcdebug) printf("deleting\n");
+       if (rtfcdebug) printf("deleting\n");
 #endif
-       return rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
-                        rt_mask(rt), rt->rt_flags, (struct rtentry **)0);
+       return rtrequest(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt),
+                        rt->rt_flags, NULL);
 }
 
 #define ROUNDUP(a) (a>0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
@@ -906,7 +803,7 @@ rt_fixchange(struct radix_node *rn, void *vp)
 int
 rt_setgate(struct rtentry *rt0, struct sockaddr *dst, struct sockaddr *gate)
 {
-       caddr_t newkey, oldkey;
+       char *space, *oldspace;
        int dlen = ROUNDUP(dst->sa_len), glen = ROUNDUP(gate->sa_len);
        struct rtentry *rt = rt0;
        struct radix_node_head *rnh = rt_tables[dst->sa_family];
@@ -916,78 +813,78 @@ rt_setgate(struct rtentry *rt0, struct sockaddr *dst, struct sockaddr *gate)
         * will interfere with keeping LLINFO in the routing
         * table, so disallow it.
         */
-       if (((rt0->rt_flags & (RTF_HOST|RTF_GATEWAY|RTF_LLINFO)) ==
-                                       (RTF_HOST|RTF_GATEWAY)) &&
-           (dst->sa_len == gate->sa_len) &&
-           (bcmp(dst, gate, dst->sa_len) == 0)) {
+       if (((rt0->rt_flags & (RTF_HOST | RTF_GATEWAY | RTF_LLINFO)) ==
+                             (RTF_HOST | RTF_GATEWAY)) &&
+           dst->sa_len == gate->sa_len &&
+           sa_equal(dst, gate)) {
                /*
                 * The route might already exist if this is an RTM_CHANGE
                 * or a routing redirect, so try to delete it.
                 */
                if (rt_key(rt0) != NULL)
                        rtrequest(RTM_DELETE, rt_key(rt0), rt0->rt_gateway,
-                           rt_mask(rt0), rt0->rt_flags, 0);
+                                 rt_mask(rt0), rt0->rt_flags, NULL);
                return EADDRNOTAVAIL;
        }
 
        /*
-        * Both dst and gateway are stored in the same malloc'd chunk
+        * Both dst and gateway are stored in the same malloc'ed chunk
         * (If I ever get my hands on....)
         * if we need to malloc a new chunk, then keep the old one around
         * till we don't need it any more.
         */
        if (rt->rt_gateway == NULL || glen > ROUNDUP(rt->rt_gateway->sa_len)) {
-               oldkey = (caddr_t)rt_key(rt);
-               R_Malloc(newkey, caddr_t, dlen + glen);
-               if (newkey == NULL)
+               oldspace = (char *)rt_key(rt);
+               R_Malloc(space, char *, dlen + glen);
+               if (space == NULL)
                        return ENOBUFS;
-               rt->rt_nodes->rn_key = newkey;
+               rt->rt_nodes->rn_key = space;
        } else {
-               /*
-                * otherwise just overwrite the old one
-                */
-               newkey = rt->rt_nodes->rn_key;
-               oldkey = NULL;
+               space = (char *)rt_key(rt);     /* Just use the old space. */
+               oldspace = NULL;
        }
 
-       /*
-        * copy the new gateway value into the memory chunk
-        */
-       rt->rt_gateway = (struct sockaddr *)(newkey + dlen);
+       /* Set the gateway value. */
+       rt->rt_gateway = (struct sockaddr *)(space + dlen);
        bcopy(gate, rt->rt_gateway, glen);
 
-       /*
-        * if we are replacing the chunk (or it's new) we need to
-        * replace the dst as well
-        */
-       if (oldkey != NULL) {
-               bcopy(dst, newkey, dlen);
-               Free(oldkey);
+       if (oldspace != NULL) {
+               /*
+                * If we allocated a new chunk, preserve the original dst.
+                * This way, rt_setgate() really just sets the gate
+                * and leaves the dst field alone.
+                */
+               bcopy(dst, space, dlen);
+               Free(oldspace);
        }
 
        /*
-        * If there is already a gwroute, it's now almost definitly wrong
+        * If there is already a gwroute, it's now almost definitely wrong
         * so drop it.
         */
        if (rt->rt_gwroute != NULL) {
                RTFREE(rt->rt_gwroute);
                rt->rt_gwroute = NULL;
        }
-       /*
-        * Cloning loop avoidance:
-        * In the presence of protocol-cloning and bad configuration,
-        * it is possible to get stuck in bottomless mutual recursion
-        * (rtrequest rt_setgate rtalloc1).  We avoid this by not allowing
-        * protocol-cloning to operate for gateways (which is probably the
-        * correct choice anyway), and avoid the resulting reference loops
-        * by disallowing any route to run through itself as a gateway.
-        * This is obviously mandatory when we get rt->rt_output().
-        */
        if (rt->rt_flags & RTF_GATEWAY) {
-               rt->rt_gwroute = rtalloc1(gate, 1, RTF_PRCLONING);
+               /*
+                * Cloning loop avoidance: In the presence of
+                * protocol-cloning and bad configuration, it is
+                * possible to get stuck in bottomless mutual recursion
+                * (rtrequest rt_setgate rtlookup).  We avoid this
+                * by not allowing protocol-cloning to operate for
+                * gateways (which is probably the correct choice
+                * anyway), and avoid the resulting reference loops
+                * by disallowing any route to run through itself as
+                * a gateway.  This is obviously mandatory when we
+                * get rt->rt_output().
+                *
+                * This breaks TTCP!  XXX JH
+                */
+               rt->rt_gwroute = rtlookup(gate, 1, RTF_PRCLONING);
                if (rt->rt_gwroute == rt) {
-                       RTFREE(rt->rt_gwroute);
-                       rt->rt_gwroute = 0;
+                       rt->rt_gwroute = NULL;
+                       --rt->rt_refcnt;
                        return EDQUOT; /* failure */
                }
        }
@@ -998,10 +895,9 @@ rt_setgate(struct rtentry *rt0, struct sockaddr *dst, struct sockaddr *gate)
         * (we don't yet have one during adds).
         */
        if (!(rt->rt_flags & RTF_HOST) && rt_mask(rt) != NULL) {
-               struct rtfc_arg arg;
-               arg.rnh = rnh;
-               arg.rt0 = rt;
-               rnh->rnh_walktree_from(rnh, (char*)rt_key(rt),
+               struct rtfc_arg arg = { rt, rnh };
+
+               rnh->rnh_walktree_from(rnh, (char *)rt_key(rt),
                                       (char *)rt_mask(rt),
                                       rt_fixchange, &arg);
        }
@@ -1010,8 +906,10 @@ rt_setgate(struct rtentry *rt0, struct sockaddr *dst, struct sockaddr *gate)
 }
 
 static void
-rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst,
-    struct sockaddr *netmask)
+rt_maskedcopy(
+       struct sockaddr *src,
+       struct sockaddr *dst,
+       struct sockaddr *netmask)
 {
        u_char *cp1 = (u_char *)src;
        u_char *cp2 = (u_char *)dst;
@@ -1026,7 +924,41 @@ rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst,
        while (cp2 < cplim)
                *cp2++ = *cp1++ & *cp3++;
        if (cp2 < cplim2)
-               bzero(cp2, (unsigned)(cplim2 - cp2));
+               bzero(cp2, cplim2 - cp2);
+}
+
+int
+rt_llroute(struct sockaddr *dst, struct rtentry *rt0, struct rtentry **drt)
+{
+       struct rtentry *up_rt, *rt;
+
+       if (!(rt0->rt_flags & RTF_UP)) {
+               up_rt = rtlookup(dst, 1, 0UL);
+               if (up_rt == NULL)
+                       return (EHOSTUNREACH);
+               up_rt->rt_refcnt--;
+       } else
+               up_rt = rt0;
+       if (up_rt->rt_flags & RTF_GATEWAY) {
+               if (up_rt->rt_gwroute == NULL) {
+                       up_rt->rt_gwroute = rtlookup(up_rt->rt_gateway, 1, 0UL);
+                       if (up_rt->rt_gwroute == NULL)
+                               return (EHOSTUNREACH);
+               } else if (!(up_rt->rt_gwroute->rt_flags & RTF_UP)) {
+                       rtfree(up_rt->rt_gwroute);
+                       up_rt->rt_gwroute = rtlookup(up_rt->rt_gateway, 1, 0UL);
+                       if (up_rt->rt_gwroute == NULL)
+                               return (EHOSTUNREACH);
+               }
+               rt = up_rt->rt_gwroute;
+       } else
+               rt = up_rt;
+       if (rt->rt_flags & RTF_REJECT &&
+           (rt->rt_rmx.rmx_expire == 0 ||              /* rt doesn't expire */
+            time_second < rt->rt_rmx.rmx_expire))      /* rt not expired */
+               return (rt->rt_flags & RTF_HOST ?  EHOSTDOWN : EHOSTUNREACH);
+       *drt = rt;
+       return 0;
 }
 
 /*
@@ -1036,16 +968,14 @@ rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst,
 int
 rtinit(struct ifaddr *ifa, int cmd, int flags)
 {
+       struct sockaddr *dst, *deldst, *netmask;
        struct rtentry *rt;
-       struct sockaddr *dst;
-       struct sockaddr *deldst;
-       struct sockaddr *netmask;
-       struct mbuf *m = NULL;
        struct rtentry *nrt = NULL;
+       struct mbuf *m = NULL;
        struct radix_node_head *rnh;
        struct radix_node *rn;
-       int error;
        struct rt_addrinfo info;
+       int error;
 
        if (flags & RTF_HOST) {
                dst = ifa->ifa_dstaddr;
@@ -1068,7 +998,7 @@ rtinit(struct ifaddr *ifa, int cmd, int flags)
                if (netmask != NULL) {
                        m = m_get(MB_DONTWAIT, MT_SONAME);
                        if (m == NULL)
-                               return(ENOBUFS);
+                               return (ENOBUFS);
                        deldst = mtod(m, struct sockaddr *);
                        rt_maskedcopy(dst, deldst, netmask);
                        dst = deldst;
@@ -1078,13 +1008,12 @@ rtinit(struct ifaddr *ifa, int cmd, int flags)
                 * contains the correct info.
                 */
                if ((rnh = rt_tables[dst->sa_family]) == NULL ||
-                   (rn = rnh->rnh_lookup((char *)dst, (char *)netmask,
-                    rnh)) == NULL ||
-                   (rn->rn_flags & RNF_ROOT) ||
+                   (rn = rnh->rnh_lookup((char *)dst,
+                                         (char *)netmask, rnh)) == NULL ||
                    ((struct rtentry *)rn)->rt_ifa != ifa ||
-                   !sa_equal(SA(rn->rn_key), dst)) {
+                   !sa_equal((struct sockaddr *)rn->rn_key, dst)) {
                        if (m != NULL)
-                               (void) m_free(m);
+                               m_free(m);
                        return (flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
                }
                /* XXX */
@@ -1132,7 +1061,7 @@ rtinit(struct ifaddr *ifa, int cmd, int flags)
                }
        }
        if (m != NULL)
-               (void) m_free(m);
+               m_free(m);
        return (error);
 }
 
index f48fd06..1f6e9e9 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)route.h     8.4 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/net/route.h,v 1.36.2.5 2002/02/01 11:48:01 ru Exp $
- * $DragonFly: src/sys/net/route.h,v 1.6 2004/12/15 00:11:04 hsu Exp $
+ * $DragonFly: src/sys/net/route.h,v 1.7 2004/12/21 02:54:14 hsu Exp $
  */
 
 #ifndef _NET_ROUTE_H_
@@ -99,6 +99,7 @@ struct mbuf;
 #ifndef RNF_NORMAL
 #include <net/radix.h>
 #endif
+
 struct rtentry {
        struct  radix_node rt_nodes[2]; /* tree glue, and other values */
 #define        rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
@@ -109,13 +110,13 @@ struct rtentry {
        struct  ifnet *rt_ifp;          /* the answer: interface to use */
        struct  ifaddr *rt_ifa;         /* the answer: interface to use */
        struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
-       caddr_t rt_llinfo;              /* pointer to link level info cache */
+       void    *rt_llinfo;             /* pointer to link level info cache */
        struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
        struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
-       int     (*rt_output) (struct ifnet *, struct mbuf *,
-                                 struct sockaddr *, struct rtentry *);
+       int     (*rt_output) (struct ifnet *, struct mbuf *, struct sockaddr *,
+                             struct rtentry *);
                                        /* output routine for this (rt,if) */
-       struct  rtentry *rt_parent;     /* cloning parent of this route */
+       struct  rtentry *rt_parent;     /* cloning parent of this route */
        void    *rt_filler2;            /* more filler */
 };
 
@@ -156,7 +157,7 @@ struct ortentry {
 #define RTF_PROTO3     0x40000         /* protocol specific routing flag */
 /*                     0x80000            unused */
 #define RTF_PINNED     0x100000        /* future use */
-#define        RTF_LOCAL       0x200000        /* route represents a local address */
+#define        RTF_LOCAL       0x200000        /* route represents a local address */
 #define        RTF_BROADCAST   0x400000        /* route represents a bcast address */
 #define        RTF_MULTICAST   0x800000        /* route represents a mcast address */
                                        /* 0x1000000 and up unassigned */
@@ -266,24 +267,7 @@ struct rt_addrinfo {
 #define        sa_author       rti_info[RTAX_AUTHOR]
 #define        sa_bcastaddr    rti_info[RTAX_BRD]
 
-struct route_cb {
-       int     ip_count;
-       int     ip6_count;
-       int     ipx_count;
-       int     ns_count;
-       int     any_count;
-};
-
 #ifdef _KERNEL
-#define        RTFREE(rt) \
-       do { \
-               if ((rt)->rt_refcnt <= 1) \
-                       rtfree(rt); \
-               else \
-                       (rt)->rt_refcnt--; \
-       } while (0)
-
-extern struct route_cb route_cb;
 extern struct radix_node_head *rt_tables[AF_MAX+1];
 
 struct ifmultiaddr;
@@ -293,6 +277,8 @@ void         route_init (void);
 int     rt_getifa (struct rt_addrinfo *);
 void    rt_ifannouncemsg (struct ifnet *, int);
 void    rt_ifmsg (struct ifnet *);
+int     rt_llroute (struct sockaddr *dst, struct rtentry *rt0,
+           struct rtentry **drt);
 void    rt_missmsg (int, struct rt_addrinfo *, int, int);
 void    rt_newaddrmsg (int, struct ifaddr *, int, struct rtentry *);
 void    rt_newmaddrmsg (int, struct ifmultiaddr *);
@@ -301,7 +287,7 @@ int  rt_setgate (struct rtentry *,
 void    rtalloc (struct route *);
 void    rtalloc_ign (struct route *, u_long);
 struct rtentry *
-        rtalloc1 (struct sockaddr *, int, u_long);
+        rtlookup (struct sockaddr *, int, u_long);
 void    rtfree (struct rtentry *);
 int     rtinit (struct ifaddr *, int, int);
 int     rtioctl (u_long, caddr_t, struct thread *);
@@ -310,6 +296,15 @@ void        rtredirect (struct sockaddr *, struct sockaddr *,
 int     rtrequest (int, struct sockaddr *,
            struct sockaddr *, struct sockaddr *, int, struct rtentry **);
 int     rtrequest1 (int, struct rt_addrinfo *, struct rtentry **);
+
+static __inline void
+RTFREE(struct rtentry *rt)
+{
+       if (rt->rt_refcnt <= 1)
+               rtfree(rt);
+       else
+               --rt->rt_refcnt;
+}
 #endif
 
 #endif
index 8f81406..a12ef88 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)rtsock.c    8.7 (Berkeley) 10/12/95
  * $FreeBSD: src/sys/net/rtsock.c,v 1.44.2.11 2002/12/04 14:05:41 ru Exp $
- * $DragonFly: src/sys/net/rtsock.c,v 1.16 2004/12/15 00:11:04 hsu Exp $
+ * $DragonFly: src/sys/net/rtsock.c,v 1.17 2004/12/21 02:54:14 hsu Exp $
  */
 
 
 
 MALLOC_DEFINE(M_RTABLE, "routetbl", "routing tables");
 
+static struct route_cb {
+       int     ip_count;
+       int     ip6_count;
+       int     ipx_count;
+       int     ns_count;
+       int     any_count;
+} route_cb;
+
 static struct  sockaddr route_dst = { 2, PF_ROUTE, };
 static struct  sockaddr route_src = { 2, PF_ROUTE, };
 static struct  sockaddr sa_zero   = { sizeof(sa_zero), AF_INET, };
@@ -76,7 +84,7 @@ static int    sysctl_dumpentry (struct radix_node *rn, void *vw);
 static int     sysctl_iflist (int af, struct walkarg *w);
 static int     route_output(struct mbuf *, struct socket *, ...);
 static void    rt_setmetrics (u_long, struct rt_metrics *,
-                   struct rt_metrics *);
+                              struct rt_metrics *);
 
 /*
  * It really doesn't make any sense at all for this code to share much
@@ -86,6 +94,7 @@ static int
 rts_abort(struct socket *so)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_abort(so);
        splx(s);
@@ -102,6 +111,7 @@ rts_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 
        if (sotorawcb(so) != NULL)
                return EISCONN; /* XXX panic? */
+
        MALLOC(rp, struct rawcb *, sizeof *rp, M_PCB, M_WAITOK|M_ZERO);
        if (rp == NULL)
                return ENOBUFS;
@@ -148,6 +158,7 @@ static int
 rts_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_bind(so, nam, td); /* xxx just EINVAL */
        splx(s);
@@ -158,6 +169,7 @@ static int
 rts_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_connect(so, nam, td); /* XXX just EINVAL */
        splx(s);
@@ -200,6 +212,7 @@ static int
 rts_disconnect(struct socket *so)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_disconnect(so);
        splx(s);
@@ -212,6 +225,7 @@ static int
 rts_peeraddr(struct socket *so, struct sockaddr **nam)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_peeraddr(so, nam);
        splx(s);
@@ -226,6 +240,7 @@ rts_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
         struct mbuf *control, struct thread *td)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_send(so, flags, m, nam, control, td);
        splx(s);
@@ -238,6 +253,7 @@ static int
 rts_shutdown(struct socket *so)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_shutdown(so);
        splx(s);
@@ -248,6 +264,7 @@ static int
 rts_sockaddr(struct socket *so, struct sockaddr **nam)
 {
        int s, error;
+
        s = splnet();
        error = raw_usrreqs.pru_sockaddr(so, nam);
        splx(s);
@@ -272,6 +289,7 @@ route_output(struct mbuf *m, struct socket *so, ...)
        struct radix_node_head *rnh;
        struct ifnet *ifp = NULL;
        struct ifaddr *ifa = NULL;
+       struct rawcb *rp = NULL;
        struct pr_output_info *oi;
        struct rt_addrinfo info;
        int len, error = 0;
@@ -405,7 +423,7 @@ route_output(struct mbuf *m, struct socket *so, ...)
                                bcopy(rtm, new_rtm, rtm->rtm_msglen);
                                Free(rtm); rtm = new_rtm;
                        }
-                       (void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, NULL);
+                       rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, NULL);
                        rtm->rtm_flags = rt->rt_flags;
                        rtm->rtm_rmx = rt->rt_rmx;
                        rtm->rtm_addrs = info.rti_addrs;
@@ -428,23 +446,23 @@ route_output(struct mbuf *m, struct socket *so, ...)
                        }
                        if (info.sa_gateway != NULL &&
                            (error = rt_setgate(rt, rt_key(rt),
-                                               info.sa_gateway)) != 0)
+                                               info.sa_gateway)) != 0)
                                gotoerr(error);
                        if ((ifa = info.rti_ifa) != NULL) {
                                struct ifaddr *oifa = rt->rt_ifa;
 
                                if (oifa != ifa) {
-                                   if (oifa && oifa->ifa_rtrequest)
-                                       oifa->ifa_rtrequest(RTM_DELETE, rt,
-                                           &info);
-                                   IFAFREE(rt->rt_ifa);
-                                   rt->rt_ifa = ifa;
-                                   ifa->ifa_refcnt++;
-                                   rt->rt_ifp = info.rti_ifp;
+                                       if (oifa && oifa->ifa_rtrequest)
+                                               oifa->ifa_rtrequest(RTM_DELETE,
+                                                                   rt, &info);
+                                       IFAFREE(rt->rt_ifa);
+                                       rt->rt_ifa = ifa;
+                                       IFAREF(ifa);
+                                       rt->rt_ifp = info.rti_ifp;
                                }
                        }
                        rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx,
-                                       &rt->rt_rmx);
+                           &rt->rt_rmx);
                        if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
                               rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, &info);
                        if (info.sa_genmask != NULL)
@@ -473,8 +491,6 @@ flush:
        }
        if (rt)
                rtfree(rt);
-    {
-       struct rawcb *rp = NULL;
        /*
         * Check to see if we don't want our own messages.
         */
@@ -505,7 +521,6 @@ flush:
                raw_input(m, &route_proto, &route_src, &route_dst);
        if (rp != NULL)
                rp->rcb_proto.sp_family = PF_ROUTE;
-    }
        return (error);
 }
 
@@ -710,18 +725,16 @@ again:
 
 /*
  * This routine is called to generate a message from the routing
- * socket indicating that a redirect has occured, a routing lookup
+ * socket indicating that a redirect has occurred, a routing lookup
  * has failed, or that a protocol has detected timeouts to a particular
  * destination.
  */
 void
-rt_missmsg(type, rtinfo, flags, error)
-       int type, flags, error;
-       struct rt_addrinfo *rtinfo;
+rt_missmsg(int type, struct rt_addrinfo *rtinfo, int flags, int error)
 {
+       struct sockaddr *sa = rtinfo->rti_info[RTAX_DST];
        struct rt_msghdr *rtm;
        struct mbuf *m;
-       struct sockaddr *sa = rtinfo->sa_dst;
 
        if (route_cb.any_count == 0)
                return;
@@ -777,8 +790,11 @@ rt_ifamsg(int cmd, struct ifaddr *ifa)
        info.sa_ifpaddr = TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
        info.sa_netmask = ifa->ifa_netmask;
        info.sa_bcastaddr = ifa->ifa_dstaddr;
-       if ((m = rt_msg1(cmd, &info)) == NULL)
+
+       m = rt_msg1(cmd, &info);
+       if (m == NULL)
                return;
+
        ifam = mtod(m, struct ifa_msghdr *);
        ifam->ifam_index = ifp->if_index;
        ifam->ifam_metric = ifa->ifa_metric;
@@ -786,6 +802,7 @@ rt_ifamsg(int cmd, struct ifaddr *ifa)
        ifam->ifam_addrs = info.rti_addrs;
 
        route_proto.sp_protocol = sa ? sa->sa_family : 0;
+
        raw_input(m, &route_proto, &route_src, &route_dst);
 }
 
@@ -800,12 +817,16 @@ rt_rtmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
 
        if (rt == NULL)
                return;
+
        bzero(&info, sizeof(info));
        info.sa_netmask = rt_mask(rt);
        info.sa_dst = sa = rt_key(rt);
        info.sa_gateway = rt->rt_gateway;
-       if ((m = rt_msg1(cmd, &info)) == NULL)
+
+       m = rt_msg1(cmd, &info);
+       if (m == NULL)
                return;
+
        rtm = mtod(m, struct rt_msghdr *);
        rtm->rtm_index = ifp->if_index;
        rtm->rtm_flags |= rt->rt_flags;
@@ -813,6 +834,7 @@ rt_rtmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
        rtm->rtm_addrs = info.rti_addrs;
 
        route_proto.sp_protocol = sa ? sa->sa_family : 0;
+
        raw_input(m, &route_proto, &route_src, &route_dst);
 }
 
@@ -872,12 +894,16 @@ rt_newmaddrmsg(cmd, ifma)
         * (similarly to how ARP entries, e.g., are presented).
         */
        info.sa_gateway = ifma->ifma_lladdr;
-       if ((m = rt_msg1(cmd, &info)) == NULL)
+
+       m = rt_msg1(cmd, &info);
+       if (m == NULL)
                return;
+
        ifmam = mtod(m, struct ifma_msghdr *);
        ifmam->ifmam_index = ifp->if_index;
        ifmam->ifmam_addrs = info.rti_addrs;
        route_proto.sp_protocol = ifma->ifma_addr->sa_family;
+
        raw_input(m, &route_proto, &route_src, &route_dst);
 }
 
@@ -896,15 +922,20 @@ rt_ifannouncemsg(ifp, what)
 
        if (route_cb.any_count == 0)
                return;
+
        bzero(&info, sizeof(info));
+
        m = rt_msg1(RTM_IFANNOUNCE, &info);
        if (m == NULL)
                return;
+
        ifan = mtod(m, struct if_announcemsghdr *);
        ifan->ifan_index = ifp->if_index;
        strlcpy(ifan->ifan_name, ifp->if_xname, sizeof(ifan->ifan_name));
        ifan->ifan_what = what;
+
        route_proto.sp_protocol = 0;
+
        raw_input(m, &route_proto, &route_src, &route_dst);
  }
 
@@ -923,6 +954,7 @@ sysctl_dumpentry(rn, vw)
 
        if (w->w_op == NET_RT_FLAGS && !(rt->rt_flags & w->w_arg))
                return 0;
+
        bzero(&info, sizeof(info));
        info.sa_dst = rt_key(rt);
        info.sa_gateway = rt->rt_gateway;
@@ -1038,7 +1070,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
                for (i = 1; i <= AF_MAX; i++)
                        if ((rnh = rt_tables[i]) && (af == 0 || af == i) &&
                            (error = rnh->rnh_walktree(rnh,
-                                                       sysctl_dumpentry, &w)))
+                                                      sysctl_dumpentry, &w)))
                                break;
                break;
 
index d15d806..a2e9889 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/net/if_stf.c,v 1.1.2.11 2003/01/23 21:06:44 sam Exp $ */
-/*     $DragonFly: src/sys/net/stf/if_stf.c,v 1.11 2004/11/30 19:21:26 joerg Exp $     */
+/*     $DragonFly: src/sys/net/stf/if_stf.c,v 1.12 2004/12/21 02:54:15 hsu Exp $       */
 /*     $KAME: if_stf.c,v 1.73 2001/12/03 11:08:30 keiichi Exp $        */
 
 /*
@@ -480,7 +480,7 @@ stf_checkaddr4(sc, in, inifp)
                sin.sin_family = AF_INET;
                sin.sin_len = sizeof(struct sockaddr_in);
                sin.sin_addr = *in;
-               rt = rtalloc1((struct sockaddr *)&sin, 0, 0UL);
+               rt = rtlookup((struct sockaddr *)&sin, 0, 0UL);
                if (!rt || rt->rt_ifp != inifp) {
 #if 0
                        log(LOG_WARNING, "%s: packet from 0x%x dropped "
index 47a557b..1c22bd2 100644 (file)
@@ -11,7 +11,7 @@
  * - allow strm->next_out to be NULL, meaning discard the output
  *
  * $FreeBSD: src/sys/net/zlib.c,v 1.10.2.3 2002/03/24 23:12:48 jedgar Exp $
- * $DragonFly: src/sys/net/zlib.c,v 1.6 2004/02/13 17:45:49 joerg Exp $
+ * $DragonFly: src/sys/net/zlib.c,v 1.7 2004/12/21 02:54:14 hsu Exp $
  */
 
 /* 
@@ -1601,7 +1601,7 @@ local block_state deflate_stored(s, flush)
        s->lookahead = 0;
 
        /* Emit a stored block if pending_buf will be full: */
-       max_start = s->block_start + max_block_size;
+       max_start = s->block_start + max_block_size;
         if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
            /* strstart == 0 is possible when wraparound on 16-bit machine */
            s->lookahead = (uInt)(s->strstart - max_start);
@@ -4069,7 +4069,7 @@ z_stream *z;
        n -= t;
        z->total_out += t;
        s->read = q;    /* drag read pointer forward */
-/*      WWRAP  */      /* expand WWRAP macro by hand to handle s->read */
+/*      WWRAP  */      /* expand WWRAP macro by hand to handle s->read */
        if (q == s->end) {
            s->read = q = s->window;
            m = WAVAIL;
index fef416c..7d6be09 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/net/zlib.h,v 1.7.2.1 2002/07/31 14:13:05 rwatson Exp $    */
-/* $DragonFly: src/sys/net/zlib.h,v 1.3 2004/02/13 17:45:49 joerg Exp $        */
+/* $DragonFly: src/sys/net/zlib.h,v 1.4 2004/12/21 02:54:14 hsu Exp $  */
 
 /*
  * This file is derived from zlib.h and zconf.h from the zlib-1.0.4
@@ -74,7 +74,7 @@ extern "C" {
 #  define deflateInit_ z_deflateInit_
 #  define deflate      z_deflate
 #  define deflateEnd   z_deflateEnd
-#  define inflateInit_         z_inflateInit_
+#  define inflateInit_ z_inflateInit_
 #  define inflate      z_inflate
 #  define inflateEnd   z_inflateEnd
 #  define deflateInit2_        z_deflateInit2_
index 43306fe..c58fee2 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet/icmp6.h,v 1.2.2.5 2002/06/29 18:31:11 ume Exp $       */
-/*     $DragonFly: src/sys/netinet/icmp6.h,v 1.4 2004/09/23 16:44:32 joerg Exp $       */
+/*     $DragonFly: src/sys/netinet/icmp6.h,v 1.5 2004/12/21 02:54:15 hsu Exp $ */
 /*     $KAME: icmp6.h,v 1.46 2001/04/27 15:09:48 itojun Exp $  */
 
 /*
@@ -100,7 +100,7 @@ struct icmp6_hdr {
 #define ICMP6_ECHO_REQUEST             128     /* echo service */
 #define ICMP6_ECHO_REPLY               129     /* echo reply */
 #define ICMP6_MEMBERSHIP_QUERY         130     /* group membership query */
-#define MLD_LISTENER_QUERY             130     /* multicast listener query */
+#define MLD_LISTENER_QUERY             130     /* multicast listener query */
 #define ICMP6_MEMBERSHIP_REPORT                131     /* group membership report */
 #define MLD_LISTENER_REPORT            131     /* multicast listener report */
 #define ICMP6_MEMBERSHIP_REDUCTION     132     /* group membership termination */
@@ -134,7 +134,7 @@ struct icmp6_hdr {
 
 #define ICMP6_HADISCOV_REQUEST         202     /* XXX To be defined */
 #define ICMP6_HADISCOV_REPLY           203     /* XXX To be defined */
-  
 #ifndef _KERNEL
 #define MLD6_MTRACE_RESP       MLD_MTRACE_RESP
 #define MLD6_MTRACE            MLD_MTRACE
@@ -143,16 +143,16 @@ struct icmp6_hdr {
 #define ICMP6_MAXTYPE                  203
 
 #define ICMP6_DST_UNREACH_NOROUTE      0       /* no route to destination */
-#define ICMP6_DST_UNREACH_ADMIN                1       /* administratively prohibited */
+#define ICMP6_DST_UNREACH_ADMIN                1       /* administratively prohibited */
 #define ICMP6_DST_UNREACH_NOTNEIGHBOR  2       /* not a neighbor(obsolete) */
 #define ICMP6_DST_UNREACH_BEYONDSCOPE  2       /* beyond scope of source address */
 #define ICMP6_DST_UNREACH_ADDR         3       /* address unreachable */
 #define ICMP6_DST_UNREACH_NOPORT       4       /* port unreachable */
 
-#define ICMP6_TIME_EXCEED_TRANSIT      0       /* ttl==0 in transit */
+#define ICMP6_TIME_EXCEED_TRANSIT      0       /* ttl==0 in transit */
 #define ICMP6_TIME_EXCEED_REASSEMBLY   1       /* ttl==0 in reass */
 
-#define ICMP6_PARAMPROB_HEADER                 0       /* erroneous header field */
+#define ICMP6_PARAMPROB_HEADER         0       /* erroneous header field */
 #define ICMP6_PARAMPROB_NEXTHEADER     1       /* unrecognized next header */
 #define ICMP6_PARAMPROB_OPTION         2       /* unrecognized option */
 
@@ -205,7 +205,7 @@ struct mld_hdr {
  */
 
 struct nd_router_solicit {     /* router solicitation */
-       struct icmp6_hdr        nd_rs_hdr;
+       struct icmp6_hdr        nd_rs_hdr;
        /* could be followed by options */
 } __attribute__((__packed__));
 
@@ -345,7 +345,7 @@ struct nd_opt_route_info {  /* route info */
  */
 
 struct icmp6_namelookup {
-       struct icmp6_hdr        icmp6_nl_hdr;
+       struct icmp6_hdr        icmp6_nl_hdr;
        u_int8_t        icmp6_nl_nonce[8];
        int32_t         icmp6_nl_ttl;
 #if 0
@@ -453,7 +453,7 @@ struct icmp6_router_renum { /* router renumbering header */
 #define rr_type                rr_hdr.icmp6_type
 #define rr_code                rr_hdr.icmp6_code
 #define rr_cksum       rr_hdr.icmp6_cksum
-#define rr_seqnum      rr_hdr.icmp6_data32[0]
+#define rr_seqnum      rr_hdr.icmp6_data32[0]
 
 struct rr_pco_match {          /* match prefix part */
        u_int8_t        rpm_code;
@@ -694,8 +694,8 @@ do {                                                                \
 #define icmp6_ifoutstat_inc(ifp, type, code) \
 do { \
                icmp6_ifstat_inc(ifp, ifs6_out_msg); \
-               if (type < ICMP6_INFOMSG_MASK) \
-                       icmp6_ifstat_inc(ifp, ifs6_out_error); \
+               if (type < ICMP6_INFOMSG_MASK) \
+                       icmp6_ifstat_inc(ifp, ifs6_out_error); \
                switch(type) { \
                 case ICMP6_DST_UNREACH: \
                         icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \
index 843e24d..1d8369a 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)icmp_var.h  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netinet/icmp_var.h,v 1.15.2.2 2001/12/07 09:23:11 ru Exp $
- * $DragonFly: src/sys/netinet/icmp_var.h,v 1.4 2004/09/19 22:32:48 joerg Exp $
+ * $DragonFly: src/sys/netinet/icmp_var.h,v 1.5 2004/12/21 02:54:15 hsu Exp $
  */
 
 #ifndef _NETINET_ICMP_VAR_H_
@@ -53,16 +53,16 @@ struct      icmpstat {
        u_long  icps_oldicmp;           /* no error 'cuz old was icmp */
        u_long  icps_outhist[ICMP_MAXTYPE + 1];
 /* statistics related to input messages processed */
-       u_long  icps_badcode;           /* icmp_code out of range */
+       u_long  icps_badcode;           /* icmp_code out of range */
        u_long  icps_tooshort;          /* packet < ICMP_MINLEN */
        u_long  icps_checksum;          /* bad checksum */
        u_long  icps_badlen;            /* calculated bound mismatch */
        u_long  icps_reflect;           /* number of responses */
        u_long  icps_inhist[ICMP_MAXTYPE + 1];
-       u_long  icps_bmcastecho;        /* b/mcast echo requests dropped */
-       u_long  icps_bmcasttstamp;      /* b/mcast tstamp requests dropped */
+       u_long  icps_bmcastecho;        /* b/mcast echo requests dropped */
+       u_long  icps_bmcasttstamp;      /* b/mcast tstamp requests dropped */
        u_long  icps_badaddr;           /* bad return address */
-       u_long  icps_noroute;           /* no route back */
+       u_long  icps_noroute;           /* no route back */
 };
 
 /*
index 4f86163..f8674d1 100644 (file)
@@ -15,7 +15,7 @@
  *    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 Charles D. Cranor and 
+ *      This product includes software developed by Charles D. Cranor and
  *     Washington University.
  * 4. The name of the author may not be used to endorse or promote products
  *    derived from this software without specific prior written permission.
@@ -32,7 +32,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/if_atm.c,v 1.8.2.1 2001/12/20 10:30:18 ru Exp $
- * $DragonFly: src/sys/netinet/if_atm.c,v 1.5 2004/03/23 22:19:07 hsu Exp $
+ * $DragonFly: src/sys/netinet/if_atm.c,v 1.6 2004/12/21 02:54:15 hsu Exp $
  */
 
 /*
 /*
  * atm_rtrequest: handle ATM rt request (in support of generic code)
  *   inputs: "req" = request code
- *           "rt" = route entry
- *           "info" = rt_addrinfo
+ *          "rt" = route entry
+ *          "info" = rt_addrinfo
  */
-
 void
 atm_rtrequest(req, rt, info)
        int req;
@@ -108,7 +107,7 @@ atm_rtrequest(req, rt, info)
                 * case we are being called via "ifconfig" to set the address.
                 */
 
-               if ((rt->rt_flags & RTF_HOST) == 0) { 
+               if ((rt->rt_flags & RTF_HOST) == 0) {
                        rt_setgate(rt,rt_key(rt),(struct sockaddr *)&null_sdl);
                        gate = rt->rt_gateway;
                        SDL(gate)->sdl_type = rt->rt_ifp->if_type;
@@ -139,14 +138,14 @@ atm_rtrequest(req, rt, info)
                if (sin->sin_family != AF_INET)
                        goto failed;
                aph = (struct atm_pseudohdr *) LLADDR(SDL(gate));
-               npcb = npcb_add(NULL, rt->rt_ifp, ATM_PH_VCI(aph), 
+               npcb = npcb_add(NULL, rt->rt_ifp, ATM_PH_VCI(aph),
                                                ATM_PH_VPI(aph));
-               if (npcb == NULL) 
+               if (npcb == NULL)
                        goto failed;
                npcb->npcb_flags |= NPCB_IP;
                npcb->ipaddr.s_addr = sin->sin_addr.s_addr;
                /* XXX: move npcb to llinfo when ATM ARP is ready */
-               rt->rt_llinfo = (caddr_t) npcb;
+               rt->rt_llinfo =  npcb;
                rt->rt_flags |= RTF_LLINFO;
 #endif
                /*
@@ -154,8 +153,8 @@ atm_rtrequest(req, rt, info)
                 */
                bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph));
                api.rxhand = NULL;
-               if (rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMENA, 
-                   (caddr_t)&api, (struct ucred *)NULL) != 0) {
+               if (rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMENA, (caddr_t)&api,
+                                        (struct ucred *)NULL) != 0) {
                        printf("atm: couldn't add VC\n");
                        goto failed;
                }
@@ -173,8 +172,8 @@ failed:
                        rt->rt_flags &= ~RTF_LLINFO;
                }
 #endif
-               rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
-                       rt_mask(rt), 0, (struct rtentry **) 0);
+               rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *) NULL,
+                   rt_mask(rt), 0, (struct rtentry **) NULL);
                break;
 
        case RTM_DELETE:
@@ -185,8 +184,7 @@ failed:
                 */
 
                if (rt->rt_flags & RTF_LLINFO) {
-                       npcb_free((struct natmpcb *)rt->rt_llinfo, 
-                                                               NPCB_DESTROY);
+                       npcb_free(rt->rt_llinfo, NPCB_DESTROY);
                        rt->rt_llinfo = NULL;
                        rt->rt_flags &= ~RTF_LLINFO;
                }
@@ -197,8 +195,8 @@ failed:
 
                bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph));
                api.rxhand = NULL;
-               (void)rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMDIS, 
-                   (caddr_t)&api, (struct ucred *)NULL);
+               rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMDIS, (caddr_t)&api,
+                                    (struct ucred *)NULL);
 
                break;
        }
@@ -212,7 +210,7 @@ failed:
  *     [3] "dst" = sockaddr_in (IP) address of dest.
  *   output:
  *     [4] "desten" = ATM pseudo header which we will fill in VPI/VCI info
- *   return: 
+ *   return:
  *     0 == resolve FAILED; note that "m" gets m_freem'd in this case
  *     1 == resolve OK; desten contains result
  *
@@ -240,7 +238,7 @@ struct atm_pseudohdr *desten;       /* OUT */
                rt = RTALLOC1(dst, 0);
                if (rt == NULL) goto bad; /* failed */
                rt->rt_refcnt--;        /* don't keep LL references */
-               if ((rt->rt_flags & RTF_GATEWAY) != 0 || 
+               if ((rt->rt_flags & RTF_GATEWAY) != 0 ||
                        (rt->rt_flags & RTF_LLINFO) == 0 ||
                        /* XXX: are we using LLINFO? */
                        rt->rt_gateway->sa_family != AF_LINK) {
@@ -249,7 +247,7 @@ struct atm_pseudohdr *desten;       /* OUT */
        }
 
        /*
-        * note that rt_gateway is a sockaddr_dl which contains the 
+        * note that rt_gateway is a sockaddr_dl which contains the
         * atm_pseudohdr data structure for this route.   we currently
         * don't need any rt_llinfo info (but will if we want to support
         * ATM ARP [c.f. if_ether.c]).
index 30f3e0d..115573b 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/netinet/if_atm.h,v 1.2.6.2 2001/12/20 10:30:18 ru Exp $ */
-/* $DragonFly: src/sys/netinet/if_atm.h,v 1.3 2003/08/23 11:18:00 rob Exp $ */
+/* $DragonFly: src/sys/netinet/if_atm.h,v 1.4 2004/12/21 02:54:15 hsu Exp $ */
 /*      $NetBSD: if_atm.h,v 1.2 1996/07/03 17:17:17 chuck Exp $       */
 
 /*
@@ -17,8 +17,8 @@
  *    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 Charles D. Cranor and 
- *     Washington University.
+ *      This product includes software developed by Charles D. Cranor and
+ *     Washington University.
  * 4. The name of the author may not be used to endorse or promote products
  *    derived from this software without specific prior written permission.
  *
@@ -44,5 +44,5 @@ struct rtentry;
 struct sockaddr;
 
 void atm_rtrequest (int, struct rtentry *, struct rt_addrinfo *);
-int atmresolve (struct rtentry *, struct mbuf *, struct sockaddr *, 
+int atmresolve (struct rtentry *, struct mbuf *, struct sockaddr *,
                struct atm_pseudohdr *);
index de45f9b..d45f2f3 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ether.c  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netinet/if_ether.c,v 1.64.2.23 2003/04/11 07:23:15 fjoe Exp $
- * $DragonFly: src/sys/netinet/if_ether.c,v 1.20 2004/12/14 18:46:08 hsu Exp $
+ * $DragonFly: src/sys/netinet/if_ether.c,v 1.21 2004/12/21 02:54:15 hsu Exp $
  */
 
 /*
@@ -88,12 +88,12 @@ static int arpt_down = 20;  /* once declared down, don't send for 20 sec */
 
 SYSCTL_INT(_net_link_ether_inet, OID_AUTO, prune_intvl, CTLFLAG_RW,
           &arpt_prune, 0, "");
-SYSCTL_INT(_net_link_ether_inet, OID_AUTO, max_age, CTLFLAG_RW, 
+SYSCTL_INT(_net_link_ether_inet, OID_AUTO, max_age, CTLFLAG_RW,
           &arpt_keep, 0, "");
 SYSCTL_INT(_net_link_ether_inet, OID_AUTO, host_down_time, CTLFLAG_RW,
           &arpt_down, 0, "");
 
-#define        rt_expire rt_rmx.rmx_expire
+#define        rt_expire       rt_rmx.rmx_expire
 
 struct llinfo_arp {
        LIST_ENTRY(llinfo_arp) la_le;
@@ -105,8 +105,6 @@ struct llinfo_arp {
 
 static LIST_HEAD(, llinfo_arp) llinfo_arp;
 
-static int     arp_inuse, arp_allocated, arpinit_done;
-
 static int     arp_maxtries = 5;
 static int     useloopback = 1; /* use loopback interface for local traffic */
 static int     arp_proxyall = 0;
@@ -125,7 +123,7 @@ static int  arpintr(struct netmsg *);
 static void    arptfree (struct llinfo_arp *);
 static void    arptimer (void *);
 static struct llinfo_arp
-               *arplookup (u_long, int, int);
+               *arplookup (in_addr_t addr, boolean_t create, boolean_t proxy);
 #ifdef INET
 static void    in_arpinput (struct mbuf *);
 #endif
@@ -137,8 +135,7 @@ static struct callout       arptimer_ch;
  */
 /* ARGSUSED */
 static void
-arptimer(ignored_arg)
-       void *ignored_arg;
+arptimer(void *ignored_arg)
 {
        int s = splnet();
        struct llinfo_arp *la, *nla;
@@ -155,31 +152,31 @@ arptimer(ignored_arg)
  * Parallel to llc_rtrequest.
  */
 static void
-arp_rtrequest(req, rt, info)
-       int req;
-       struct rtentry *rt;
-       struct rt_addrinfo *info;
+arp_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info)
 {
        struct sockaddr *gate = rt->rt_gateway;
-       struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo;
-       static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK};
+       struct llinfo_arp *la = rt->rt_llinfo;
+
+       struct sockaddr_dl null_sdl = { sizeof(null_sdl), AF_LINK };
+       static boolean_t arpinit_done;
+       static int arp_inuse, arp_allocated;    /* for debugging only */
 
        if (!arpinit_done) {
-               arpinit_done = 1;
+               arpinit_done = TRUE;
                callout_init(&arptimer_ch);
                callout_reset(&arptimer_ch, hz, arptimer, NULL);
        }
        if (rt->rt_flags & RTF_GATEWAY)
                return;
-       switch (req) {
 
+       switch (req) {
        case RTM_ADD:
                /*
                 * XXX: If this is a manually added route to interface
                 * such as older version of routed or gated might provide,
                 * restore cloning bit.
                 */
-               if ((rt->rt_flags & RTF_HOST) == 0 &&
+               if (!(rt->rt_flags & RTF_HOST) &&
                    SIN(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
                        rt->rt_flags |= RTF_CLONING;
                if (rt->rt_flags & RTF_CLONING) {
@@ -187,7 +184,7 @@ arp_rtrequest(req, rt, info)
                         * Case 1: This route should come from a route to iface.
                         */
                        rt_setgate(rt, rt_key(rt),
-                                       (struct sockaddr *)&null_sdl);
+                           (struct sockaddr *)&null_sdl);
                        gate = rt->rt_gateway;
                        SDL(gate)->sdl_type = rt->rt_ifp->if_type;
                        SDL(gate)->sdl_index = rt->rt_ifp->if_index;
@@ -199,30 +196,30 @@ arp_rtrequest(req, rt, info)
                        arprequest(rt->rt_ifp,
                            &SIN(rt_key(rt))->sin_addr,
                            &SIN(rt_key(rt))->sin_addr,
-                           (u_char *)LLADDR(SDL(gate)));
+                           LLADDR(SDL(gate)));
                /*FALLTHROUGH*/
        case RTM_RESOLVE:
                if (gate->sa_family != AF_LINK ||
-                   gate->sa_len < sizeof(null_sdl)) {
+                   gate->sa_len < sizeof(struct sockaddr_dl)) {
                        log(LOG_DEBUG, "arp_rtrequest: bad gateway value\n");
                        break;
                }
                SDL(gate)->sdl_type = rt->rt_ifp->if_type;
                SDL(gate)->sdl_index = rt->rt_ifp->if_index;
-               if (la != 0)
+               if (la != NULL)
                        break; /* This happens on a route change */
                /*
                 * Case 2:  This route may come from cloning, or a manual route
                 * add with a LL address.
                 */
                R_Malloc(la, struct llinfo_arp *, sizeof(*la));
-               rt->rt_llinfo = (caddr_t)la;
-               if (la == 0) {
+               rt->rt_llinfo = la;
+               if (la == NULL) {
                        log(LOG_DEBUG, "arp_rtrequest: malloc failed\n");
                        break;
                }
                arp_inuse++, arp_allocated++;
-               bzero(la, sizeof(*la));
+               bzero(la, sizeof *la);
                la->la_rt = rt;
                rt->rt_flags |= RTF_LLINFO;
                LIST_INSERT_HEAD(&llinfo_arp, la, la_le);
@@ -233,8 +230,8 @@ arp_rtrequest(req, rt, info)
                 * in `arp -a' listings as unresolved.  It's not actually
                 * functional.  Then the same for broadcast.
                 */
-               if (IN_MULTICAST(ntohl(SIN(rt_key(rt))->sin_addr.s_addr))
-               &&  rt->rt_ifp->if_type != IFT_ARCNET) {
+               if (IN_MULTICAST(ntohl(SIN(rt_key(rt))->sin_addr.s_addr)) &&
+                   rt->rt_ifp->if_type != IFT_ARCNET) {
                        ETHER_MAP_IP_MULTICAST(&SIN(rt_key(rt))->sin_addr,
                                               LLADDR(SDL(gate)));
                        SDL(gate)->sdl_alen = 6;
@@ -250,35 +247,36 @@ arp_rtrequest(req, rt, info)
 
                if (SIN(rt_key(rt))->sin_addr.s_addr ==
                    (IA_SIN(rt->rt_ifa))->sin_addr.s_addr) {
-                   /*
-                    * This test used to be
-                    *  if (loif.if_flags & IFF_UP)
-                    * It allowed local traffic to be forced
-                    * through the hardware by configuring the loopback down.
-                    * However, it causes problems during network configuration
-                    * for boards that can't receive packets they send.
-                    * It is now necessary to clear "useloopback" and remove
-                    * the route to force traffic out to the hardware.
-                    */
+                       /*
+                        * This test used to be
+                        *      if (loif.if_flags & IFF_UP)
+                        * It allowed local traffic to be forced
+                        * through the hardware by configuring the
+                        * loopback down.  However, it causes problems
+                        * during network configuration for boards
+                        * that can't receive packets they send.  It
+                        * is now necessary to clear "useloopback" and
+                        * remove the route to force traffic out to
+                        * the hardware.
+                        */
                        rt->rt_expire = 0;
                        bcopy(IF_LLADDR(rt->rt_ifp), LLADDR(SDL(gate)),
                              SDL(gate)->sdl_alen = rt->rt_ifp->if_addrlen);
                        if (useloopback)
                                rt->rt_ifp = loif;
-
                }
                break;
 
        case RTM_DELETE:
-               if (la == 0)
+               if (la == NULL)
                        break;
                arp_inuse--;
                LIST_REMOVE(la, la_le);
-               rt->rt_llinfo = 0;
+               rt->rt_llinfo = NULL;
                rt->rt_flags &= ~RTF_LLINFO;
-               if (la->la_hold)
+               if (la->la_hold != NULL)
                        m_freem(la->la_hold);
-               Free((caddr_t)la);
+               Free(la);
        }
 }
 
@@ -289,23 +287,22 @@ arp_rtrequest(req, rt, info)
  *     - arp header source ethernet address
  */
 static void
-arprequest(ifp, sip, tip, enaddr)
-       struct ifnet *ifp;
-       struct in_addr *sip, *tip;
-       u_char *enaddr;
+arprequest(struct ifnet *ifp, struct in_addr *sip, struct in_addr *tip,
+          u_char *enaddr)
 {
        struct mbuf *m;
        struct ether_header *eh;
        struct arc_header *arh;
        struct arphdr *ah;
        struct sockaddr sa;
-       static u_char   llcx[] = { 0x82, 0x40, LLC_SNAP_LSAP, LLC_SNAP_LSAP,
-                                  LLC_UI, 0x00, 0x00, 0x00, 0x08, 0x06 };
+       static u_char llcx[] = { 0x82, 0x40, LLC_SNAP_LSAP, LLC_SNAP_LSAP,
+                                LLC_UI, 0x00, 0x00, 0x00, 0x08, 0x06 };
        u_short ar_hrd;
 
        if ((m = m_gethdr(MB_DONTWAIT, MT_DATA)) == NULL)
                return;
-       m->m_pkthdr.rcvif = (struct ifnet *)0;
+       m->m_pkthdr.rcvif = (struct ifnet *)NULL;
+
        switch (ifp->if_type) {
        case IFT_ARCNET:
                ar_hrd = htons(ARPHRD_ARCNET);
@@ -329,9 +326,9 @@ arprequest(ifp, sip, tip, enaddr)
                m->m_pkthdr.len = m->m_len;
                MH_ALIGN(m, m->m_len);
 
-               (void)memcpy(mtod(m, caddr_t), llcx, sizeof(llcx));
+               memcpy(mtod(m, caddr_t), llcx, sizeof(llcx));
                memcpy(sa.sa_data, ifp->if_broadcastaddr, ifp->if_addrlen);
-               (void)memcpy(sa.sa_data + 6, enaddr, 6);
+               memcpy(sa.sa_data + 6, enaddr, 6);
                sa.sa_data[6] |= TR_RII;
                sa.sa_data[12] = TR_AC;
                sa.sa_data[13] = TR_LLC_FRAME;
@@ -352,7 +349,7 @@ arprequest(ifp, sip, tip, enaddr)
                MH_ALIGN(m, m->m_len);
 
                eh = (struct ether_header *)sa.sa_data;
-               /* if_output will not swap */
+               /* if_output() will not swap */
                eh->ether_type = htons(ETHERTYPE_ARP);
                memcpy(eh->ether_dhost, ifp->if_broadcastaddr, ifp->if_addrlen);
 
@@ -365,14 +362,14 @@ arprequest(ifp, sip, tip, enaddr)
        ah->ar_hln = ifp->if_addrlen;           /* hardware address length */
        ah->ar_pln = sizeof(struct in_addr);    /* protocol address length */
        ah->ar_op = htons(ARPOP_REQUEST);
-       (void)memcpy(ar_sha(ah), enaddr, ah->ar_hln);
+       memcpy(ar_sha(ah), enaddr, ah->ar_hln);
        memset(ar_tha(ah), 0, ah->ar_hln);
-       (void)memcpy(ar_spa(ah), sip, ah->ar_pln);
-       (void)memcpy(ar_tpa(ah), tip, ah->ar_pln);
+       memcpy(ar_spa(ah), sip, ah->ar_pln);
+       memcpy(ar_tpa(ah), tip, ah->ar_pln);
 
        sa.sa_family = AF_UNSPEC;
        sa.sa_len = sizeof(sa);
-       (*ifp->if_output)(ifp, m, &sa, (struct rtentry *)0);
+       (*ifp->if_output)(ifp, m, &sa, (struct rtentry *)NULL);
 }
 
 /*
@@ -386,15 +383,15 @@ arprequest(ifp, sip, tip, enaddr)
  * taken over here, either now or for later transmission.
  */
 int
-arpresolve(ifp, rt, m, dst, desten, rt0)
-       struct ifnet *ifp;
-       struct rtentry *rt;
-       struct mbuf *m;
-       struct sockaddr *dst;
-       u_char *desten;
-       struct rtentry *rt0;
+arpresolve(
+       struct ifnet *ifp,
+       struct rtentry *rt0,
+       struct mbuf *m,
+       struct sockaddr *dst,
+       u_char *desten)
 {
-       struct llinfo_arp *la = 0;
+       struct rtentry *rt;
+       struct llinfo_arp *la = NULL;
        struct sockaddr_dl *sdl;
 
        if (m->m_flags & M_BCAST) {     /* broadcast */
@@ -403,16 +400,21 @@ arpresolve(ifp, rt, m, dst, desten, rt0)
        }
        if (m->m_flags & M_MCAST && ifp->if_type != IFT_ARCNET) {/* multicast */
                ETHER_MAP_IP_MULTICAST(&SIN(dst)->sin_addr, desten);
-               return(1);
+               return (1);
        }
-       if (rt)
-               la = (struct llinfo_arp *)rt->rt_llinfo;
-       if (la == 0) {
-               la = arplookup(SIN(dst)->sin_addr.s_addr, 1, 0);
-               if (la)
+       if (rt0 != NULL) {
+               if (rt_llroute(dst, rt0, &rt) != 0) {
+                       m_freem(m);
+                       return 0;
+               }
+               la = rt->rt_llinfo;
+       }
+       if (la == NULL) {
+               la = arplookup(SIN(dst)->sin_addr.s_addr, TRUE, FALSE);
+               if (la != NULL)
                        rt = la->la_rt;
        }
-       if (la == 0 || rt == 0) {
+       if (la == NULL || rt == NULL) {
                log(LOG_DEBUG, "arpresolve: can't allocate llinfo for %s%s%s\n",
                        inet_ntoa(SIN(dst)->sin_addr), la ? "la" : "",
                                rt ? "rt" : "");
@@ -438,7 +440,7 @@ arpresolve(ifp, rt, m, dst, desten, rt0)
                                   &SIN(dst)->sin_addr,
                                   IF_LLADDR(ifp));
                        la->la_preempt--;
-               } 
+               }
 
                bcopy(LLADDR(sdl), desten, sdl->sdl_alen);
                return 1;
@@ -458,7 +460,7 @@ arpresolve(ifp, rt, m, dst, desten, rt0)
         * response yet.  Replace the held mbuf with this
         * latest one.
         */
-       if (la->la_hold)
+       if (la->la_hold != NULL)
                m_freem(la->la_hold);
        la->la_hold = m;
        if (rt->rt_expire || ((rt->rt_flags & RTF_STATIC) && !sdl->sdl_alen)) {
@@ -552,8 +554,7 @@ SYSCTL_INT(_net_link_ether_inet, OID_AUTO, log_arp_wrong_iface, CTLFLAG_RW,
        "log arp packets arriving on the wrong interface");
 
 static void
-in_arpinput(m)
-       struct mbuf *m;
+in_arpinput(struct mbuf *m)
 {
        struct arphdr *ah;
        struct ifnet *ifp = m->m_pkthdr.rcvif;
@@ -579,8 +580,8 @@ in_arpinput(m)
 
        ah = mtod(m, struct arphdr *);
        op = ntohs(ah->ar_op);
-       (void)memcpy(&isaddr, ar_spa(ah), sizeof (isaddr));
-       (void)memcpy(&itaddr, ar_tpa(ah), sizeof (itaddr));
+       memcpy(&isaddr, ar_spa(ah), sizeof isaddr);
+       memcpy(&itaddr, ar_tpa(ah), sizeof itaddr);
 #ifdef BRIDGE
 #define BRIDGE_TEST (do_bridge)
 #else
@@ -640,12 +641,13 @@ match:
                itaddr = myaddr;
                goto reply;
        }
-       la = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr, 0);
+       la = arplookup(isaddr.s_addr, (itaddr.s_addr == myaddr.s_addr), FALSE);
        if (la && (rt = la->la_rt) && (sdl = SDL(rt->rt_gateway))) {
                /* the following is not an error when doing bridging */
                if (!BRIDGE_TEST && rt->rt_ifp != ifp) {
                    if (log_arp_wrong_iface)
-                       log(LOG_ERR, "arp: %s is on %s but got reply from %*D on %s\n",
+                       log(LOG_ERR,
+                           "arp: %s is on %s but got reply from %*D on %s\n",
                            inet_ntoa(isaddr),
                            rt->rt_ifp->if_xname,
                            ifp->if_addrlen, (u_char *)ar_sha(ah), ":",
@@ -655,7 +657,8 @@ match:
                if (sdl->sdl_alen &&
                    bcmp(ar_sha(ah), LLADDR(sdl), sdl->sdl_alen)) {
                        if (rt->rt_expire)
-                           log(LOG_INFO, "arp: %s moved from %*D to %*D on %s\n",
+                           log(LOG_INFO,
+                               "arp: %s moved from %*D to %*D on %s\n",
                                inet_ntoa(isaddr),
                                ifp->if_addrlen, (u_char *)LLADDR(sdl), ":",
                                ifp->if_addrlen, (u_char *)ar_sha(ah), ":",
@@ -687,8 +690,7 @@ match:
                            ah->ar_hln, ifp->if_addrlen);
                        goto reply;
                }
-               (void)memcpy(LLADDR(sdl), ar_sha(ah),
-                   sdl->sdl_alen = ah->ar_hln);
+               memcpy(LLADDR(sdl), ar_sha(ah), sdl->sdl_alen = ah->ar_hln);
                /*
                 * If we receive an arp from a token-ring station over
                 * a token-ring nic then try to save the source
@@ -725,10 +727,9 @@ match:
                rt->rt_flags &= ~RTF_REJECT;
                la->la_asked = 0;
                la->la_preempt = arp_maxtries;
-               if (la->la_hold) {
-                       (*ifp->if_output)(ifp, la->la_hold,
-                               rt_key(rt), rt);
-                       la->la_hold = 0;
+               if (la->la_hold != NULL) {
+                       (*ifp->if_output)(ifp, la->la_hold, rt_key(rt), rt);
+                       la->la_hold = NULL;
                }
        }
 reply:
@@ -738,10 +739,10 @@ reply:
        }
        if (itaddr.s_addr == myaddr.s_addr) {
                /* I am the target */
-               (void)memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln);
-               (void)memcpy(ar_sha(ah), IF_LLADDR(ifp), ah->ar_hln);
+               memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln);
+               memcpy(ar_sha(ah), IF_LLADDR(ifp), ah->ar_hln);
        } else {
-               la = arplookup(itaddr.s_addr, 0, SIN_PROXY);
+               la = arplookup(itaddr.s_addr, FALSE, SIN_PROXY);
                if (la == NULL) {
                        struct sockaddr_in sin;
 
@@ -755,7 +756,7 @@ reply:
                        sin.sin_len = sizeof sin;
                        sin.sin_addr = itaddr;
 
-                       rt = rtalloc1((struct sockaddr *)&sin, 0, 0UL);
+                       rt = rtlookup((struct sockaddr *)&sin, 0, 0UL);
                        if (!rt) {
                                m_freem(m);
                                return;
@@ -766,27 +767,27 @@ reply:
                         * over who claims what Ether address.
                         */
                        if (rt->rt_ifp == ifp) {
-                               rtfree(rt);
+                               --rt->rt_refcnt;
                                m_freem(m);
                                return;
                        }
-                       (void)memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln);
-                       (void)memcpy(ar_sha(ah), IF_LLADDR(ifp), ah->ar_hln);
-                       rtfree(rt);
+                       memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln);
+                       memcpy(ar_sha(ah), IF_LLADDR(ifp), ah->ar_hln);
+                       --rt->rt_refcnt;
 #ifdef DEBUG_PROXY
                        printf("arp: proxying for %s\n",
                               inet_ntoa(itaddr));
 #endif
                } else {
                        rt = la->la_rt;
-                       (void)memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln);
+                       memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln);
                        sdl = SDL(rt->rt_gateway);
-                       (void)memcpy(ar_sha(ah), LLADDR(sdl), ah->ar_hln);
+                       memcpy(ar_sha(ah), LLADDR(sdl), ah->ar_hln);
                }
        }
 
-       (void)memcpy(ar_tpa(ah), ar_spa(ah), ah->ar_pln);
-       (void)memcpy(ar_spa(ah), &itaddr, ah->ar_pln);
+       memcpy(ar_tpa(ah), ar_spa(ah), ah->ar_pln);
+       memcpy(ar_spa(ah), &itaddr, ah->ar_pln);
        ah->ar_op = htons(ARPOP_REPLY);
        ah->ar_pro = htons(ETHERTYPE_IP); /* let's be sure! */
        switch (ifp->if_type) {
@@ -822,8 +823,7 @@ reply:
         */
        default:
                eh = (struct ether_header *)sa.sa_data;
-               (void)memcpy(eh->ether_dhost, ar_tha(ah),
-                   sizeof(eh->ether_dhost));
+               memcpy(eh->ether_dhost, ar_tha(ah), sizeof(eh->ether_dhost));
                eh->ether_type = htons(ETHERTYPE_ARP);
                break;
        }
@@ -848,41 +848,39 @@ arptfree(la)
 {
        struct rtentry *rt = la->la_rt;
        struct sockaddr_dl *sdl;
+
        if (rt == NULL)
                panic("arptfree");
        sdl = SDL(rt->rt_gateway);
-       if (sdl && ((rt->rt_refcnt > 0 && sdl->sdl_family == AF_LINK) || 
+       if (sdl && ((rt->rt_refcnt > 0 && sdl->sdl_family == AF_LINK) ||
            (rt->rt_flags & RTF_STATIC))) {
                sdl->sdl_alen = 0;
                la->la_preempt = la->la_asked = 0;
                rt->rt_flags &= ~RTF_REJECT;
                return;
        }
-       rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0, rt_mask(rt),
-                       0, (struct rtentry **)0);
+       rtrequest(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt), 0, NULL);
 }
 /*
  * Lookup or enter a new address in arptab.
  */
 static struct llinfo_arp *
-arplookup(addr, create, proxy)
-       u_long addr;
-       int create, proxy;
+arplookup(in_addr_t addr, boolean_t create, boolean_t proxy)
 {
        struct rtentry *rt;
-       static struct sockaddr_inarp sin = {sizeof(sin), AF_INET };
-       const char *why = 0;
+       static struct sockaddr_inarp sin = { sizeof(sin), AF_INET };
+       const char *why = NULL;
 
        sin.sin_addr.s_addr = addr;
        sin.sin_other = proxy ? SIN_PROXY : 0;
-       rt = rtalloc1((struct sockaddr *)&sin, create, 0UL);
-       if (rt == 0)
-               return (0);
+       rt = rtlookup((struct sockaddr *)&sin, create, 0UL);
+       if (rt == NULL)
+               return (NULL);
        rt->rt_refcnt--;
 
        if (rt->rt_flags & RTF_GATEWAY)
                why = "host is not on local network";
-       else if ((rt->rt_flags & RTF_LLINFO) == 0)
+       else if (!(rt->rt_flags & RTF_LLINFO))
                why = "could not allocate llinfo";
        else if (rt->rt_gateway->sa_family != AF_LINK)
                why = "gateway route is not ours";
@@ -892,27 +890,22 @@ arplookup(addr, create, proxy)
                        log(LOG_DEBUG, "arplookup %s failed: %s\n",
                            inet_ntoa(sin.sin_addr), why);
                }
-
-               /* if there are no references to this route, purge it */
-               if (rt->rt_refcnt <= 0 &&
-                   (rt->rt_flags & RTF_WASCLONED) == RTF_WASCLONED) {
-                           rtrequest(RTM_DELETE,
-                               (struct sockaddr *)rt_key(rt), rt->rt_gateway,
-                               rt_mask(rt), rt->rt_flags, 0);
+               if (rt->rt_refcnt <= 0 && (rt->rt_flags & RTF_WASCLONED)) {
+                       /* No references to this route.  Purge it. */
+                       rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
+                           rt_mask(rt), rt->rt_flags, NULL);
                }
-               return (0);
+               return (NULL);
        }
-       return ((struct llinfo_arp *)rt->rt_llinfo);
+       return (rt->rt_llinfo);
 }
 
 void
-arp_ifinit(ifp, ifa)
-       struct ifnet *ifp;
-       struct ifaddr *ifa;
+arp_ifinit(struct ifnet *ifp, struct ifaddr *ifa)
 {
-       if (ntohl(IA_SIN(ifa)->sin_addr.s_addr) != INADDR_ANY)
-               arprequest(ifp, &IA_SIN(ifa)->sin_addr,
-                               &IA_SIN(ifa)->sin_addr, IF_LLADDR(ifp));
+       if (IA_SIN(ifa)->sin_addr.s_addr != INADDR_ANY)
+               arprequest(ifp, &IA_SIN(ifa)->sin_addr, &IA_SIN(ifa)->sin_addr,
+                          IF_LLAD