checkpoint at first working tp4 connection; & before gnodes
authorKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Sun, 23 Apr 1989 03:06:06 +0000 (19:06 -0800)
committerKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Sun, 23 Apr 1989 03:06:06 +0000 (19:06 -0800)
SCCS-vsn: sys/netinet/ip_icmp.c 7.12
SCCS-vsn: sys/netinet/in_pcb.c 7.9
SCCS-vsn: sys/netinet/in_pcb.h 7.4
SCCS-vsn: sys/netinet/in_proto.c 7.4
SCCS-vsn: sys/netinet/in_var.h 7.4
SCCS-vsn: sys/netinet/if_ether.c 7.10
SCCS-vsn: sys/netinet/in.h 7.7
SCCS-vsn: sys/netinet/in.c 7.10

usr/src/sys/netinet/if_ether.c
usr/src/sys/netinet/in.c
usr/src/sys/netinet/in.h
usr/src/sys/netinet/in_pcb.c
usr/src/sys/netinet/in_pcb.h
usr/src/sys/netinet/in_proto.c
usr/src/sys/netinet/in_var.h
usr/src/sys/netinet/ip_icmp.c

index 744c8f4..28dd53d 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)if_ether.c  7.9 (Berkeley) %G%
+ *     @(#)if_ether.c  7.10 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -39,6 +39,7 @@
 #include "../net/if.h"
 #include "in.h"
 #include "in_systm.h"
 #include "../net/if.h"
 #include "in.h"
 #include "in_systm.h"
+#include "in_var.h"
 #include "ip.h"
 #include "if_ether.h"
 
 #include "ip.h"
 #include "if_ether.h"
 
@@ -165,6 +166,7 @@ arpresolve(ac, m, destip, desten, usetrailers)
 {
        register struct arptab *at;
        struct sockaddr_in sin;
 {
        register struct arptab *at;
        struct sockaddr_in sin;
+       register struct in_ifaddr *ia;
        u_long lna;
        int s;
 
        u_long lna;
        int s;
 
@@ -176,7 +178,9 @@ arpresolve(ac, m, destip, desten, usetrailers)
        }
        lna = in_lnaof(*destip);
        /* if for us, use software loopback driver if up */
        }
        lna = in_lnaof(*destip);
        /* if for us, use software loopback driver if up */
-       if (destip->s_addr == ac->ac_ipaddr.s_addr) {
+       for (ia = in_ifaddr; ia; ia = ia->ia_next)
+           if ((ia->ia_ifp == &ac->ac_if) &&
+               (destip->s_addr == ia->ia_addr.sin_addr.s_addr)) {
                /*
                 * This test used to be
                 *      if (loif.if_flags & IFF_UP)
                /*
                 * This test used to be
                 *      if (loif.if_flags & IFF_UP)
@@ -300,18 +304,29 @@ in_arpinput(ac, m)
        register struct ether_arp *ea;
        struct ether_header *eh;
        register struct arptab *at;  /* same as "merge" flag */
        register struct ether_arp *ea;
        struct ether_header *eh;
        register struct arptab *at;  /* same as "merge" flag */
+       register struct in_ifaddr *ia;
+       struct in_ifaddr *maybe_ia = 0;
        struct mbuf *mcopy = 0;
        struct sockaddr_in sin;
        struct sockaddr sa;
        struct in_addr isaddr, itaddr, myaddr;
        int proto, op, s, completed = 0;
 
        struct mbuf *mcopy = 0;
        struct sockaddr_in sin;
        struct sockaddr sa;
        struct in_addr isaddr, itaddr, myaddr;
        int proto, op, s, completed = 0;
 
-       myaddr = ac->ac_ipaddr;
        ea = mtod(m, struct ether_arp *);
        proto = ntohs(ea->arp_pro);
        op = ntohs(ea->arp_op);
        bcopy((caddr_t)ea->arp_spa, (caddr_t)&isaddr, sizeof (isaddr));
        bcopy((caddr_t)ea->arp_tpa, (caddr_t)&itaddr, sizeof (itaddr));
        ea = mtod(m, struct ether_arp *);
        proto = ntohs(ea->arp_pro);
        op = ntohs(ea->arp_op);
        bcopy((caddr_t)ea->arp_spa, (caddr_t)&isaddr, sizeof (isaddr));
        bcopy((caddr_t)ea->arp_tpa, (caddr_t)&itaddr, sizeof (itaddr));
+       for (ia = in_ifaddr; ia; ia = ia->ia_next)
+               if (ia->ia_ifp == &ac->ac_if) {
+                       maybe_ia = ia;
+                       if ((itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) ||
+                            (isaddr.s_addr == ia->ia_addr.sin_addr.s_addr))
+                               break;
+               }
+       if (maybe_ia == 0)
+               goto out;
+       myaddr = ia ? ia->ia_addr.sin_addr : maybe_ia->ia_addr.sin_addr;
        if (!bcmp((caddr_t)ea->arp_sha, (caddr_t)ac->ac_enaddr,
            sizeof (ea->arp_sha)))
                goto out;       /* it's from me, ignore it. */
        if (!bcmp((caddr_t)ea->arp_sha, (caddr_t)ac->ac_enaddr,
            sizeof (ea->arp_sha)))
                goto out;       /* it's from me, ignore it. */
index eac5b1d..1793dba 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)in.c        7.9 (Berkeley) %G%
+ *     @(#)in.c        7.10 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
 #include "in_var.h"
 
 #ifdef INET
 #include "in_var.h"
 
 #ifdef INET
-inet_hash(sin, hp)
-       register struct sockaddr_in *sin;
-       struct afhash *hp;
-{
-       register u_long n;
-
-       n = in_netof(sin->sin_addr);
-       if (n)
-           while ((n & 0xff) == 0)
-               n >>= 8;
-       hp->afh_nethash = n;
-       hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
-}
-
-inet_netmatch(sin1, sin2)
-       struct sockaddr_in *sin1, *sin2;
-{
-
-       return (in_netof(sin1->sin_addr) == in_netof(sin2->sin_addr));
-}
-
 /*
  * Formulate an Internet address from network + host.
  */
 /*
  * Formulate an Internet address from network + host.
  */
@@ -111,6 +90,53 @@ in_netof(in)
        return (net);
 }
 
        return (net);
 }
 
+/*
+ * Compute and save network mask as sockaddr from an internet address.
+ */
+in_sockmaskof(in, sockmask)
+       struct in_addr in;
+       register struct sockaddr_in *sockmask;
+{
+       register u_long net;
+       register u_long mask;
+    {
+       register u_long i = ntohl(in.s_addr);
+
+       if (i == 0)
+               net = 0, mask = 0;
+       else if (IN_CLASSA(i))
+               net = i & IN_CLASSA_NET, mask = IN_CLASSA_NET;
+       else if (IN_CLASSB(i))
+               net = i & IN_CLASSB_NET, mask = IN_CLASSB_NET;
+       else if (IN_CLASSC(i))
+               net = i & IN_CLASSC_NET, mask = IN_CLASSC_NET;
+       else
+               net = i, mask = -1;
+    }
+    {
+       register struct in_ifaddr *ia;
+       /*
+        * Check whether network is a subnet;
+        * if so, return subnet number.
+        */
+       for (ia = in_ifaddr; ia; ia = ia->ia_next)
+               if (net == ia->ia_net)
+                       mask =  ia->ia_subnetmask;
+    }
+    {
+       register char *cp = (char *)&(sockmask->sin_port);
+       register char *cpbase = (char *)&(sockmask->sin_addr);
+
+       sockmask->sin_addr.s_addr = htonl(mask);
+       sockmask->sin_len = 0;
+       while (--cp >= cpbase)
+               if (*cp) {
+                       sockmask->sin_len = 1 + cp - (caddr_t)sockmask;
+                       break;
+               }
+    }
+}
+
 /*
  * Return the host portion of an internet address.
  */
 /*
  * Return the host portion of an internet address.
  */
@@ -209,9 +235,13 @@ in_control(so, cmd, data, ifp)
 {
        register struct ifreq *ifr = (struct ifreq *)data;
        register struct in_ifaddr *ia = 0;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
        register struct in_ifaddr *ia = 0;
-       struct ifaddr *ifa;
+       register struct ifaddr *ifa;
+       struct in_ifaddr *oia;
+       struct in_aliasreq *ifra = (struct in_aliasreq *)data;
        struct mbuf *m;
        struct mbuf *m;
-       int error;
+       struct sockaddr_in oldaddr;
+       int error, hostIsNew, maskIsNew;
+       u_long i;
 
        /*
         * Find address for this interface, if it exists.
 
        /*
         * Find address for this interface, if it exists.
@@ -223,6 +253,18 @@ in_control(so, cmd, data, ifp)
 
        switch (cmd) {
 
 
        switch (cmd) {
 
+       case SIOCAIFADDR:
+       case SIOCDIFADDR:
+               if (ifra->ifra_addr.sin_family == AF_INET)
+                   for (oia = ia; ia; ia = ia->ia_next) {
+                       if (ia->ia_ifp == ifp  &&
+                           ia->ia_addr.sin_addr.s_addr ==
+                               ifra->ifra_addr.sin_addr.s_addr)
+                           break;
+               }
+               if (cmd == SIOCDIFADDR && ia == 0)
+                       return (EADDRNOTAVAIL);
+               /* FALLTHROUGH */
        case SIOCSIFADDR:
        case SIOCSIFNETMASK:
        case SIOCSIFDSTADDR:
        case SIOCSIFADDR:
        case SIOCSIFNETMASK:
        case SIOCSIFDSTADDR:
@@ -248,8 +290,17 @@ in_control(so, cmd, data, ifp)
                                ifa->ifa_next = (struct ifaddr *) ia;
                        } else
                                ifp->if_addrlist = (struct ifaddr *) ia;
                                ifa->ifa_next = (struct ifaddr *) ia;
                        } else
                                ifp->if_addrlist = (struct ifaddr *) ia;
+                       ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
+                       ia->ia_ifa.ifa_dstaddr
+                                       = (struct sockaddr *)&ia->ia_dstaddr;
+                       ia->ia_ifa.ifa_netmask
+                                       = (struct sockaddr *)&ia->ia_sockmask;
+                       ia->ia_sockmask.sin_len = 8;
+                       if (ifp->if_flags & IFF_BROADCAST) {
+                               ia->ia_broadaddr.sin_len = sizeof(ia->ia_addr);
+                               ia->ia_broadaddr.sin_family = AF_INET;
+                       }
                        ia->ia_ifp = ifp;
                        ia->ia_ifp = ifp;
-                       IA_SIN(ia)->sin_family = AF_INET;
                        if (ifp != &loif)
                                in_interfaces++;
                }
                        if (ifp != &loif)
                                in_interfaces++;
                }
@@ -265,65 +316,118 @@ in_control(so, cmd, data, ifp)
                        return (EADDRNOTAVAIL);
                break;
        }
                        return (EADDRNOTAVAIL);
                break;
        }
-
        switch (cmd) {
 
        case SIOCGIFADDR:
        switch (cmd) {
 
        case SIOCGIFADDR:
-               ifr->ifr_addr = ia->ia_addr;
+               *((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_addr;
                break;
 
        case SIOCGIFBRDADDR:
                if ((ifp->if_flags & IFF_BROADCAST) == 0)
                        return (EINVAL);
                break;
 
        case SIOCGIFBRDADDR:
                if ((ifp->if_flags & IFF_BROADCAST) == 0)
                        return (EINVAL);
-               ifr->ifr_dstaddr = ia->ia_broadaddr;
+               *((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_broadaddr;
                break;
 
        case SIOCGIFDSTADDR:
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
                break;
 
        case SIOCGIFDSTADDR:
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
-               ifr->ifr_dstaddr = ia->ia_dstaddr;
+               *((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_dstaddr;
                break;
 
        case SIOCGIFNETMASK:
                break;
 
        case SIOCGIFNETMASK:
-#define        satosin(sa)     ((struct sockaddr_in *)(sa))
-               satosin(&ifr->ifr_addr)->sin_family = AF_INET;
-               satosin(&ifr->ifr_addr)->sin_addr.s_addr = htonl(ia->ia_subnetmask);
+               *((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_sockmask;
                break;
 
        case SIOCSIFDSTADDR:
                break;
 
        case SIOCSIFDSTADDR:
-           {
-               struct sockaddr oldaddr;
-
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
                oldaddr = ia->ia_dstaddr;
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
                oldaddr = ia->ia_dstaddr;
-               ia->ia_dstaddr = ifr->ifr_dstaddr;
+               ia->ia_dstaddr = *(struct sockaddr_in *)&ifr->ifr_dstaddr;
                if (ifp->if_ioctl &&
                    (error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia))) {
                        ia->ia_dstaddr = oldaddr;
                        return (error);
                }
                if (ia->ia_flags & IFA_ROUTE) {
                if (ifp->if_ioctl &&
                    (error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia))) {
                        ia->ia_dstaddr = oldaddr;
                        return (error);
                }
                if (ia->ia_flags & IFA_ROUTE) {
-                       rtinit(&oldaddr, &ia->ia_addr, (int)SIOCDELRT,
-                           RTF_HOST);
-                       rtinit(&ia->ia_dstaddr, &ia->ia_addr, (int)SIOCADDRT,
-                           RTF_HOST|RTF_UP);
+                       ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&oldaddr;
+                       rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
+                       ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&ia->ia_addr;
+                       rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
                }
                }
-           }
                break;
 
        case SIOCSIFBRDADDR:
                if ((ifp->if_flags & IFF_BROADCAST) == 0)
                        return (EINVAL);
                break;
 
        case SIOCSIFBRDADDR:
                if ((ifp->if_flags & IFF_BROADCAST) == 0)
                        return (EINVAL);
-               ia->ia_broadaddr = ifr->ifr_broadaddr;
+               ia->ia_broadaddr = *(struct sockaddr_in *)&ifr->ifr_broadaddr;
                break;
 
        case SIOCSIFADDR:
                return (in_ifinit(ifp, ia,
                break;
 
        case SIOCSIFADDR:
                return (in_ifinit(ifp, ia,
-                   (struct sockaddr_in *) &ifr->ifr_addr));
+                   (struct sockaddr_in *) &ifr->ifr_addr, 1));
 
        case SIOCSIFNETMASK:
 
        case SIOCSIFNETMASK:
-               ia->ia_subnetmask = ntohl(satosin(&ifr->ifr_addr)->sin_addr.s_addr);
+               i = ifra->ifra_addr.sin_addr.s_addr;
+               ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr = i);
+               break;
+
+       case SIOCAIFADDR:
+               maskIsNew = 0; hostIsNew = 1; error = u.u_error;
+               if (ia->ia_addr.sin_family == AF_INET) {
+                       if (ifra->ifra_addr.sin_len == 0) {
+                               ifra->ifra_addr = ia->ia_addr;
+                               hostIsNew = 0;
+                       } else if (ifra->ifra_addr.sin_addr.s_addr ==
+                                              ia->ia_addr.sin_addr.s_addr)
+                               hostIsNew = 0;
+               }
+               if (ifra->ifra_mask.sin_len) {
+                       in_ifscrub(ifp, ia);
+                       ia->ia_sockmask = ifra->ifra_mask;
+                       ia->ia_subnetmask =
+                                       ntohl(ia->ia_sockmask.sin_addr.s_addr);
+                       maskIsNew = 1;
+               }
+               if ((ifp->if_flags & IFF_POINTOPOINT) &&
+                   (ifra->ifra_dstaddr.sin_family == AF_INET)) {
+                       in_ifscrub(ifp, ia);
+                       ia->ia_dstaddr = ifra->ifra_dstaddr;
+                       maskIsNew  = 1; /* We lie; but the effect's the same */
+               }
+               if (ifra->ifra_addr.sin_family == AF_INET &&
+                                           (hostIsNew || maskIsNew))
+                       error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0);
+               if ((ifp->if_flags & IFF_BROADCAST) &&
+                   (ifra->ifra_broadaddr.sin_family == AF_INET))
+                       ia->ia_broadaddr = ifra->ifra_broadaddr;
+               return (error);
+
+       case SIOCDIFADDR:
+               in_ifscrub(ifp, ia);
+               if ((ifa = ifp->if_addrlist) == (struct ifaddr *)ia)
+                       ifp->if_addrlist = ifa->ifa_next;
+               else {
+                       while (ifa->ifa_next &&
+                              (ifa->ifa_next != (struct ifaddr *)ia))
+                                   ifa = ifa->ifa_next;
+                       if (ifa->ifa_next)
+                           ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next;
+                       else
+                               printf("Couldn't unlink inifaddr from ifp\n");
+               }
+               oia = ia;
+               if (oia == (ia = in_ifaddr)) {
+                       in_ifaddr = ia->ia_next;
+               } else {
+                       while (ia->ia_next && (ia->ia_next != oia)) {
+                               ia = ia->ia_next;
+                       }
+                       if (ia->ia_next)
+                           ia->ia_next = oia->ia_next;
+                       else
+                               printf("Didn't unlink inifadr from list\n");
+               }
+               (void) m_free(dtom(oia));
                break;
 
        default:
                break;
 
        default:
@@ -334,23 +438,38 @@ in_control(so, cmd, data, ifp)
        return (0);
 }
 
        return (0);
 }
 
+/*
+ * Delete any existing route for an interface.
+ */
+in_ifscrub(ifp, ia)
+       register struct ifnet *ifp;
+       register struct in_ifaddr *ia;
+{
+
+       if ((ia->ia_flags & IFA_ROUTE) == 0)
+               return;
+       if (ifp->if_flags & (IFF_LOOPBACK|IFF_POINTOPOINT))
+               rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
+       else
+               rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0);
+       ia->ia_flags &= ~IFA_ROUTE;
+}
+
 /*
  * Initialize an interface's internet address
  * and routing table entry.
  */
 /*
  * Initialize an interface's internet address
  * and routing table entry.
  */
-in_ifinit(ifp, ia, sin)
+in_ifinit(ifp, ia, sin, scrub)
        register struct ifnet *ifp;
        register struct in_ifaddr *ia;
        struct sockaddr_in *sin;
 {
        register u_long i = ntohl(sin->sin_addr.s_addr);
        register struct ifnet *ifp;
        register struct in_ifaddr *ia;
        struct sockaddr_in *sin;
 {
        register u_long i = ntohl(sin->sin_addr.s_addr);
-       struct sockaddr oldaddr;
-       struct sockaddr_in netaddr;
+       struct sockaddr_in oldaddr;
        int s = splimp(), error;
 
        oldaddr = ia->ia_addr;
        int s = splimp(), error;
 
        oldaddr = ia->ia_addr;
-       ia->ia_addr = *(struct sockaddr *)sin;
-
+       ia->ia_addr = *sin;
        /*
         * Give the interface a chance to initialize
         * if this is its first address,
        /*
         * Give the interface a chance to initialize
         * if this is its first address,
@@ -361,25 +480,10 @@ in_ifinit(ifp, ia, sin)
                ia->ia_addr = oldaddr;
                return (error);
        }
                ia->ia_addr = oldaddr;
                return (error);
        }
-
-       /*
-        * Delete any previous route for an old address.
-        */
-       bzero((caddr_t)&netaddr, sizeof (netaddr));
-       netaddr.sin_family = AF_INET;
-       if (ia->ia_flags & IFA_ROUTE) {
-               if (ifp->if_flags & IFF_LOOPBACK)
-                       rtinit(&oldaddr, &oldaddr, (int)SIOCDELRT, RTF_HOST);
-               else if (ifp->if_flags & IFF_POINTOPOINT)
-                       rtinit(&ia->ia_dstaddr, &oldaddr, (int)SIOCDELRT,
-                           RTF_HOST);
-               else {
-                       netaddr.sin_addr = in_makeaddr(ia->ia_subnet,
-                           INADDR_ANY);
-                       rtinit((struct sockaddr *)&netaddr, &oldaddr, 
-                           (int)SIOCDELRT, 0);
-               }
-               ia->ia_flags &= ~IFA_ROUTE;
+       if (scrub) {
+               ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
+               in_ifscrub(ifp, ia);
+               ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
        }
        if (IN_CLASSA(i))
                ia->ia_netmask = IN_CLASSA_NET;
        }
        if (IN_CLASSA(i))
                ia->ia_netmask = IN_CLASSA_NET;
@@ -394,9 +498,9 @@ in_ifinit(ifp, ia, sin)
         */
        ia->ia_subnetmask |= ia->ia_netmask;
        ia->ia_subnet = i & ia->ia_subnetmask;
         */
        ia->ia_subnetmask |= ia->ia_netmask;
        ia->ia_subnet = i & ia->ia_subnetmask;
+       ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);
        if (ifp->if_flags & IFF_BROADCAST) {
        if (ifp->if_flags & IFF_BROADCAST) {
-               ia->ia_broadaddr.sa_family = AF_INET;
-               ((struct sockaddr_in *)(&ia->ia_broadaddr))->sin_addr =
+               ia->ia_broadaddr.sin_addr = 
                        in_makeaddr(ia->ia_subnet, INADDR_BROADCAST);
                ia->ia_netbroadcast.s_addr =
                    htonl(ia->ia_net | (INADDR_BROADCAST &~ ia->ia_netmask));
                        in_makeaddr(ia->ia_subnet, INADDR_BROADCAST);
                ia->ia_netbroadcast.s_addr =
                    htonl(ia->ia_net | (INADDR_BROADCAST &~ ia->ia_netmask));
@@ -404,16 +508,14 @@ in_ifinit(ifp, ia, sin)
        /*
         * Add route for the network.
         */
        /*
         * Add route for the network.
         */
-       if (ifp->if_flags & IFF_LOOPBACK)
-               rtinit(&ia->ia_addr, &ia->ia_addr, (int)SIOCADDRT,
-                   RTF_HOST|RTF_UP);
-       else if (ifp->if_flags & IFF_POINTOPOINT)
-               rtinit(&ia->ia_dstaddr, &ia->ia_addr, (int)SIOCADDRT,
-                   RTF_HOST|RTF_UP);
+       if (ifp->if_flags & IFF_LOOPBACK) {
+               ia->ia_ifa.ifa_dstaddr = ia->ia_ifa.ifa_addr;
+               rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
+       } else if (ifp->if_flags & IFF_POINTOPOINT &&
+                ia->ia_dstaddr.sin_family == AF_INET)
+               rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
        else {
        else {
-               netaddr.sin_addr = in_makeaddr(ia->ia_subnet, INADDR_ANY);
-               rtinit((struct sockaddr *)&netaddr, &ia->ia_addr,
-                   (int)SIOCADDRT, RTF_UP);
+               rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP);
        }
        ia->ia_flags |= IFA_ROUTE;
        splx(s);
        }
        ia->ia_flags |= IFA_ROUTE;
        splx(s);
@@ -450,7 +552,7 @@ in_broadcast(in)
         */
        for (ia = in_ifaddr; ia; ia = ia->ia_next)
            if (ia->ia_ifp->if_flags & IFF_BROADCAST) {
         */
        for (ia = in_ifaddr; ia; ia = ia->ia_next)
            if (ia->ia_ifp->if_flags & IFF_BROADCAST) {
-               if (satosin(&ia->ia_broadaddr)->sin_addr.s_addr == in.s_addr)
+               if (ia->ia_broadaddr.sin_addr.s_addr == in.s_addr)
                     return (1);
                /*
                 * Check for old-style (host 0) broadcast.
                     return (1);
                /*
                 * Check for old-style (host 0) broadcast.
index 95c74f7..d881e5e 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)in.h        7.6 (Berkeley) %G%
+ *     @(#)in.h        7.7 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -33,6 +33,8 @@
 #define        IPPROTO_PUP             12              /* pup */
 #define        IPPROTO_UDP             17              /* user datagram protocol */
 #define        IPPROTO_IDP             22              /* xns idp */
 #define        IPPROTO_PUP             12              /* pup */
 #define        IPPROTO_UDP             17              /* user datagram protocol */
 #define        IPPROTO_IDP             22              /* xns idp */
+#define        IPPROTO_TP              29              /* tp-4 w/ class negotiation */
+#define        IPPROTO_EON             80              /* ISO cnlp */
 
 #define        IPPROTO_RAW             255             /* raw IP packet */
 #define        IPPROTO_MAX             256
 
 #define        IPPROTO_RAW             255             /* raw IP packet */
 #define        IPPROTO_MAX             256
@@ -101,7 +103,8 @@ struct in_addr {
  * Socket address, internet style.
  */
 struct sockaddr_in {
  * Socket address, internet style.
  */
 struct sockaddr_in {
-       short   sin_family;
+       u_char  sin_len;
+       u_char  sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
@@ -111,6 +114,7 @@ struct sockaddr_in {
  * Options for use with [gs]etsockopt at the IP level.
  */
 #define        IP_OPTIONS      1               /* set/get IP per-packet options */
  * Options for use with [gs]etsockopt at the IP level.
  */
 #define        IP_OPTIONS      1               /* set/get IP per-packet options */
+#define        IP_HDRINCL      2               /* set/get IP per-packet options */
 
 #ifdef KERNEL
 extern struct domain inetdomain;
 
 #ifdef KERNEL
 extern struct domain inetdomain;
index bd51dae..47049da 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)in_pcb.c    7.8 (Berkeley) %G%
+ *     @(#)in_pcb.c    7.9 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -168,6 +168,7 @@ in_pcbconnect(inp, nam)
                    ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
                        /* No route yet, so try to acquire one */
                        ro->ro_dst.sa_family = AF_INET;
                    ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
                        /* No route yet, so try to acquire one */
                        ro->ro_dst.sa_family = AF_INET;
+                       ro->ro_dst.sa_len = sizeof(struct sockaddr_in);
                        ((struct sockaddr_in *) &ro->ro_dst)->sin_addr =
                                sin->sin_addr;
                        rtalloc(ro);
                        ((struct sockaddr_in *) &ro->ro_dst)->sin_addr =
                                sin->sin_addr;
                        rtalloc(ro);
@@ -251,6 +252,7 @@ in_setsockaddr(inp, nam)
        sin = mtod(nam, struct sockaddr_in *);
        bzero((caddr_t)sin, sizeof (*sin));
        sin->sin_family = AF_INET;
        sin = mtod(nam, struct sockaddr_in *);
        bzero((caddr_t)sin, sizeof (*sin));
        sin->sin_family = AF_INET;
+       sin->sin_len = sizeof(*sin);
        sin->sin_port = inp->inp_lport;
        sin->sin_addr = inp->inp_laddr;
 }
        sin->sin_port = inp->inp_lport;
        sin->sin_addr = inp->inp_laddr;
 }
@@ -265,6 +267,7 @@ in_setpeeraddr(inp, nam)
        sin = mtod(nam, struct sockaddr_in *);
        bzero((caddr_t)sin, sizeof (*sin));
        sin->sin_family = AF_INET;
        sin = mtod(nam, struct sockaddr_in *);
        bzero((caddr_t)sin, sizeof (*sin));
        sin->sin_family = AF_INET;
+       sin->sin_len = sizeof(*sin);
        sin->sin_port = inp->inp_fport;
        sin->sin_addr = inp->inp_faddr;
 }
        sin->sin_port = inp->inp_fport;
        sin->sin_addr = inp->inp_faddr;
 }
@@ -310,10 +313,15 @@ in_losing(inp)
        register struct rtentry *rt;
 
        if ((rt = inp->inp_route.ro_rt)) {
        register struct rtentry *rt;
 
        if ((rt = inp->inp_route.ro_rt)) {
+               rt_missmsg(RTM_LOSING, &inp->inp_route.ro_dst,
+                           rt->rt_gateway, (struct sockaddr *)rt_mask(rt),
+                           (struct sockaddr *)0, rt->rt_flags, 0);
                if (rt->rt_flags & RTF_DYNAMIC)
                if (rt->rt_flags & RTF_DYNAMIC)
-                       (void) rtrequest((int)SIOCDELRT, rt);
-               rtfree(rt);
+                       (void) rtrequest(RTM_DELETE, rt_key(rt),
+                               rt->rt_gateway, rt_mask(rt), rt->rt_flags, 
+                               (struct rtentry **)0);
                inp->inp_route.ro_rt = 0;
                inp->inp_route.ro_rt = 0;
+               rtfree(rt);
                /*
                 * A new route can be allocated
                 * the next time output is attempted.
                /*
                 * A new route can be allocated
                 * the next time output is attempted.
index 2e15a0a..bf6ecd3 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)in_pcb.h    7.3 (Berkeley) %G%
+ *     @(#)in_pcb.h    7.4 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -39,10 +39,28 @@ struct inpcb {
        struct  mbuf *inp_options;      /* IP options */
 };
 
        struct  mbuf *inp_options;      /* IP options */
 };
 
+#ifdef sotorawcb
+/*
+ * Common structure pcb for raw internet protocol access.
+ * Here are internet specific extensions to the raw control block,
+ * and space is allocated to the necessary sockaddrs.
+ */
+struct raw_inpcb {
+       struct  rawcb rinp_rcb; /* common control block prefix */
+       struct  mbuf *rinp_options;     /* IP options */
+       int     rinp_flags;             /* flags, e.g. raw sockopts */
+#define        RINPF_HDRINCL   0x1             /* user supplies entire IP header */
+       struct  sockaddr_in rinp_faddr; /* foreign address */
+       struct  sockaddr_in rinp_laddr; /* local address */
+       struct  route rinp_route;       /* placeholder for routing entry */
+};
+#endif
+
 #define        INPLOOKUP_WILDCARD      1
 #define        INPLOOKUP_SETLOCAL      2
 
 #define        sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb)
 #define        INPLOOKUP_WILDCARD      1
 #define        INPLOOKUP_SETLOCAL      2
 
 #define        sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb)
+#define        sotorawinpcb(so)        ((struct raw_inpcb *)(so)->so_pcb)
 
 #ifdef KERNEL
 struct inpcb *in_pcblookup();
 
 #ifdef KERNEL
 struct inpcb *in_pcblookup();
index 9a191af..2fabf3d 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)in_proto.c  7.3 (Berkeley) %G%
+ *     @(#)in_proto.c  7.4 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -38,8 +38,7 @@ int   udp_init();
 int    tcp_input(),tcp_ctlinput();
 int    tcp_usrreq(),tcp_ctloutput();
 int    tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain();
 int    tcp_input(),tcp_ctlinput();
 int    tcp_usrreq(),tcp_ctloutput();
 int    tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain();
-int    rip_input(),rip_output(),rip_ctloutput();
-extern int raw_usrreq();
+int    rip_input(),rip_output(),rip_ctloutput(), rip_usrreq();
 /*
  * IMP protocol family: raw interface.
  * Using the raw interface entry to get the timer routine
 /*
  * IMP protocol family: raw interface.
  * Using the raw interface entry to get the timer routine
@@ -54,6 +53,15 @@ int  rimp_output(), hostslowtimo();
 int    idpip_input(), nsip_ctlinput();
 #endif
 
 int    idpip_input(), nsip_ctlinput();
 #endif
 
+#ifdef TPIP
+int    tpip_input(), tpip_ctlinput(), tp_ctloutput(), tp_usrreq();
+int    tp_init(), tp_slowtimo(), tp_drain();
+#endif
+
+#ifdef EON
+int    eoninput(), eonctlinput(), eonprotoinit();
+#endif EON
+
 extern struct domain inetdomain;
 
 struct protosw inetsw[] = {
 extern struct domain inetdomain;
 
 struct protosw inetsw[] = {
@@ -74,25 +82,40 @@ struct protosw inetsw[] = {
 },
 { SOCK_RAW,    &inetdomain,    IPPROTO_RAW,    PR_ATOMIC|PR_ADDR,
   rip_input,   rip_output,     0,              rip_ctloutput,
 },
 { SOCK_RAW,    &inetdomain,    IPPROTO_RAW,    PR_ATOMIC|PR_ADDR,
   rip_input,   rip_output,     0,              rip_ctloutput,
-  raw_usrreq,
+  rip_usrreq,
   0,           0,              0,              0,
 },
 { SOCK_RAW,    &inetdomain,    IPPROTO_ICMP,   PR_ATOMIC|PR_ADDR,
   icmp_input,  rip_output,     0,              rip_ctloutput,
   0,           0,              0,              0,
 },
 { SOCK_RAW,    &inetdomain,    IPPROTO_ICMP,   PR_ATOMIC|PR_ADDR,
   icmp_input,  rip_output,     0,              rip_ctloutput,
-  raw_usrreq,
+  rip_usrreq,
   0,           0,              0,              0,
 },
   0,           0,              0,              0,
 },
+#ifdef TPIP
+{ SOCK_SEQPACKET,&inetdomain,  IPPROTO_TP,     PR_CONNREQUIRED|PR_WANTRCVD,
+  tpip_input,  0,              tpip_ctlinput,          tp_ctloutput,
+  tp_usrreq,
+  tp_init,     0,              tp_slowtimo,    tp_drain,
+},
+#endif
+/* EON (ISO CLNL over IP) */
+#ifdef EON
+{ SOCK_RAW,    &inetdomain,    IPPROTO_EON,    0,
+  eoninput,    0,              eonctlinput,            0,
+  0,
+  eonprotoinit,        0,              0,              0,
+},
+#endif
 #ifdef NSIP
 { SOCK_RAW,    &inetdomain,    IPPROTO_IDP,    PR_ATOMIC|PR_ADDR,
   idpip_input, rip_output,     nsip_ctlinput,  0,
 #ifdef NSIP
 { SOCK_RAW,    &inetdomain,    IPPROTO_IDP,    PR_ATOMIC|PR_ADDR,
   idpip_input, rip_output,     nsip_ctlinput,  0,
-  raw_usrreq,
+  rip_usrreq,
   0,           0,              0,              0,
 },
 #endif
        /* raw wildcard */
 { SOCK_RAW,    &inetdomain,    0,              PR_ATOMIC|PR_ADDR,
   rip_input,   rip_output,     0,              rip_ctloutput,
   0,           0,              0,              0,
 },
 #endif
        /* raw wildcard */
 { SOCK_RAW,    &inetdomain,    0,              PR_ATOMIC|PR_ADDR,
   rip_input,   rip_output,     0,              rip_ctloutput,
-  raw_usrreq,
+  rip_usrreq,
   0,           0,              0,              0,
 },
 };
   0,           0,              0,              0,
 },
 };
@@ -107,7 +130,7 @@ extern      struct domain impdomain;
 struct protosw impsw[] = {
 { SOCK_RAW,    &impdomain,     0,              PR_ATOMIC|PR_ADDR,
   0,           rimp_output,    0,              0,
 struct protosw impsw[] = {
 { SOCK_RAW,    &impdomain,     0,              PR_ATOMIC|PR_ADDR,
   0,           rimp_output,    0,              0,
-  raw_usrreq,
+  rip_usrreq,
   0,           0,              hostslowtimo,   0,
 },
 };
   0,           0,              hostslowtimo,   0,
 },
 };
@@ -128,7 +151,7 @@ extern      struct domain hydomain;
 struct protosw hysw[] = {
 { SOCK_RAW,    &hydomain,      0,              PR_ATOMIC|PR_ADDR,
   0,           rhy_output,     0,              0,
 struct protosw hysw[] = {
 { SOCK_RAW,    &hydomain,      0,              PR_ATOMIC|PR_ADDR,
   0,           rhy_output,     0,              0,
-  raw_usrreq,
+  rip_usrreq,
   0,           0,              0,              0,
 },
 };
   0,           0,              0,              0,
 },
 };
index 16cd3a2..1edd230 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)in_var.h    7.3 (Berkeley) %G%
+ *     @(#)in_var.h    7.4 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
  */
 struct in_ifaddr {
        struct  ifaddr ia_ifa;          /* protocol-independent info */
  */
 struct in_ifaddr {
        struct  ifaddr ia_ifa;          /* protocol-independent info */
-#define        ia_addr ia_ifa.ifa_addr
-#define        ia_broadaddr    ia_ifa.ifa_broadaddr
-#define        ia_dstaddr      ia_ifa.ifa_dstaddr
 #define        ia_ifp          ia_ifa.ifa_ifp
 #define        ia_ifp          ia_ifa.ifa_ifp
+                                       /* ia_{,sub}net{,mask} in host order */
        u_long  ia_net;                 /* network number of interface */
        u_long  ia_netmask;             /* mask of net part */
        u_long  ia_subnet;              /* subnet number, including net */
        u_long  ia_net;                 /* network number of interface */
        u_long  ia_netmask;             /* mask of net part */
        u_long  ia_subnet;              /* subnet number, including net */
-       u_long  ia_subnetmask;          /* mask of net + subnet */
-       struct  in_addr ia_netbroadcast; /* broadcast addr for (logical) net */
+       u_long  ia_subnetmask;          /* mask of subnet part */
        int     ia_flags;
        int     ia_flags;
+       struct  in_addr ia_netbroadcast; /* to recognize net broadcasts */
        struct  in_ifaddr *ia_next;     /* next in list of internet addresses */
        struct  in_ifaddr *ia_next;     /* next in list of internet addresses */
+       struct  sockaddr_in ia_addr;    /* reserve space for interface name */
+       struct  sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */
+#define        ia_broadaddr    ia_dstaddr
+       struct  sockaddr_in ia_sockmask; /* reserve space for general netmask */
+};
+
+struct in_aliasreq {
+       char    ifra_name[IFNAMSIZ];            /* if name, e.g. "en0" */
+       struct  sockaddr_in ifra_addr;
+       struct  sockaddr_in ifra_broadaddr;
+#define ifra_dstaddr ifra_broadaddr
+       struct  sockaddr_in ifra_mask;
 };
 /*
  * Given a pointer to an in_ifaddr (ifaddr),
  * return a pointer to the addr as a sockadd_in.
  */
 };
 /*
  * Given a pointer to an in_ifaddr (ifaddr),
  * return a pointer to the addr as a sockadd_in.
  */
-#define        IA_SIN(ia) ((struct sockaddr_in *)(&((struct in_ifaddr *)ia)->ia_addr))
+#define        IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr))
 /*
  * ia_flags
  */
 /*
  * ia_flags
  */
index d4947e2..0b09e51 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)ip_icmp.c   7.8.1.2 (Berkeley) %G%
+ *     @(#)ip_icmp.c   7.12 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -73,13 +73,13 @@ icmp_error(n, type, code, dest)
         * error message, only known informational types.
         */
        if (oip->ip_off &~ (IP_MF|IP_DF))
         * error message, only known informational types.
         */
        if (oip->ip_off &~ (IP_MF|IP_DF))
-               goto free;
+               goto freeit;
        if (oip->ip_p == IPPROTO_ICMP && type != ICMP_REDIRECT &&
          dtom(oip)->m_len >= oiplen + ICMP_MINLEN &&
          n->m_len >= oiplen + ICMP_MINLEN &&
          !ICMP_INFOTYPE(((struct icmp *)((caddr_t)oip + oiplen))->icmp_type)) {
                icmpstat.icps_oldicmp++;
        if (oip->ip_p == IPPROTO_ICMP && type != ICMP_REDIRECT &&
          dtom(oip)->m_len >= oiplen + ICMP_MINLEN &&
          n->m_len >= oiplen + ICMP_MINLEN &&
          !ICMP_INFOTYPE(((struct icmp *)((caddr_t)oip + oiplen))->icmp_type)) {
                icmpstat.icps_oldicmp++;
-               goto free;
+               goto freeit;
        }
 
        /*
        }
 
        /*
@@ -87,7 +87,7 @@ icmp_error(n, type, code, dest)
         */
        m = m_gethdr(M_DONTWAIT, MT_HEADER);
        if (m == NULL)
         */
        m = m_gethdr(M_DONTWAIT, MT_HEADER);
        if (m == NULL)
-               goto free;
+               goto freeit;
        icmplen = oiplen + min(8, oip->ip_len);
        m->m_len = icmplen + ICMP_MINLEN;
        MH_ALIGN(m, m->m_len);
        icmplen = oiplen + min(8, oip->ip_len);
        m->m_len = icmplen + ICMP_MINLEN;
        MH_ALIGN(m, m->m_len);
@@ -127,7 +127,7 @@ icmp_error(n, type, code, dest)
        nip->ip_p = IPPROTO_ICMP;
        icmp_reflect(m);
 
        nip->ip_p = IPPROTO_ICMP;
        icmp_reflect(m);
 
-free:
+freeit:
        m_freem(n);
 }
 
        m_freem(n);
 }
 
@@ -164,7 +164,7 @@ icmp_input(m, hlen)
 #endif
        if (icmplen < ICMP_MINLEN) {
                icmpstat.icps_tooshort++;
 #endif
        if (icmplen < ICMP_MINLEN) {
                icmpstat.icps_tooshort++;
-               goto free;
+               goto freeit;
        }
        i = hlen + MIN(icmplen, ICMP_ADVLENMIN);
        if (m->m_len < i && (m = m_pullup(m, i)) == 0)  {
        }
        i = hlen + MIN(icmplen, ICMP_ADVLENMIN);
        if (m->m_len < i && (m = m_pullup(m, i)) == 0)  {
@@ -177,7 +177,7 @@ icmp_input(m, hlen)
        icp = mtod(m, struct icmp *);
        if (in_cksum(m, icmplen)) {
                icmpstat.icps_checksum++;
        icp = mtod(m, struct icmp *);
        if (in_cksum(m, icmplen)) {
                icmpstat.icps_checksum++;
-               goto free;
+               goto freeit;
        }
        m->m_len += hlen;
        m->m_data -= hlen;
        }
        m->m_len += hlen;
        m->m_data -= hlen;
@@ -225,7 +225,7 @@ icmp_input(m, hlen)
                icp->icmp_ip.ip_len = ntohs((u_short)icp->icmp_ip.ip_len);
                if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp)) {
                        icmpstat.icps_badlen++;
                icp->icmp_ip.ip_len = ntohs((u_short)icp->icmp_ip.ip_len);
                if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp)) {
                        icmpstat.icps_badlen++;
-                       goto free;
+                       goto freeit;
                }
 #ifdef ICMPPRINTFS
                if (icmpprintfs)
                }
 #ifdef ICMPPRINTFS
                if (icmpprintfs)
@@ -309,7 +309,7 @@ reflect:
                        rtredirect((struct sockaddr *)&icmpsrc,
                          (struct sockaddr *)&icmpdst,
                          (struct sockaddr *)&icmpmask, RTF_GATEWAY,
                        rtredirect((struct sockaddr *)&icmpsrc,
                          (struct sockaddr *)&icmpdst,
                          (struct sockaddr *)&icmpmask, RTF_GATEWAY,
-                         (struct sockaddr *)&icmpgw);
+                         (struct sockaddr *)&icmpgw, (struct rtentry **)0);
                        icmpsrc.sin_addr = icp->icmp_ip.ip_dst;
                        pfctlinput(PRC_REDIRECT_NET,
                          (struct sockaddr *)&icmpsrc);
                        icmpsrc.sin_addr = icp->icmp_ip.ip_dst;
                        pfctlinput(PRC_REDIRECT_NET,
                          (struct sockaddr *)&icmpsrc);
@@ -318,7 +318,7 @@ reflect:
                        rtredirect((struct sockaddr *)&icmpsrc,
                          (struct sockaddr *)&icmpdst,
                          (struct sockaddr *)0, RTF_GATEWAY | RTF_HOST,
                        rtredirect((struct sockaddr *)&icmpsrc,
                          (struct sockaddr *)&icmpdst,
                          (struct sockaddr *)0, RTF_GATEWAY | RTF_HOST,
-                         (struct sockaddr *)&icmpgw);
+                         (struct sockaddr *)&icmpgw, (struct rtentry **)0);
                        pfctlinput(PRC_REDIRECT_HOST,
                          (struct sockaddr *)&icmpsrc);
                }
                        pfctlinput(PRC_REDIRECT_HOST,
                          (struct sockaddr *)&icmpsrc);
                }
@@ -343,7 +343,7 @@ raw:
            (struct sockaddr *)&icmpdst);
        return;
 
            (struct sockaddr *)&icmpdst);
        return;
 
-free:
+freeit:
        m_freem(m);
 }
 
        m_freem(m);
 }
 
@@ -388,7 +388,7 @@ icmp_reflect(m)
                u_int len;
 
                register u_char *cp;
                u_int len;
 
                register u_char *cp;
-               int opt, cnt, off;
+               int opt, cnt;
                u_int len;
 
                /*
                u_int len;
 
                /*
@@ -447,7 +447,7 @@ icmp_reflect(m)
                        m->m_pkthdr.len -= optlen;
                optlen += sizeof(struct ip);
                bcopy((caddr_t)ip + optlen, (caddr_t)(ip + 1),
                        m->m_pkthdr.len -= optlen;
                optlen += sizeof(struct ip);
                bcopy((caddr_t)ip + optlen, (caddr_t)(ip + 1),
-                   m->m_len - sizeof(struct ip));
+                        (unsigned)(m->m_len - sizeof(struct ip)));
        }
 
        icmp_send(m, opts);
        }
 
        icmp_send(m, opts);