changes for var. length sockaddrs, routing lookup changes,
authorKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Sun, 23 Apr 1989 03:14:22 +0000 (19:14 -0800)
committerKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Sun, 23 Apr 1989 03:14:22 +0000 (19:14 -0800)
checkpoint at first working tp4 connection, before gnodes

SCCS-vsn: sys/netns/ns_input.c 7.6
SCCS-vsn: sys/netns/spp_var.h 7.6
SCCS-vsn: sys/netns/spp_usrreq.c 7.10
SCCS-vsn: sys/netns/ns.c 7.4
SCCS-vsn: sys/netns/ns_error.c 7.7
SCCS-vsn: sys/netns/ns.h 7.5
SCCS-vsn: sys/netns/ns_if.h 7.4
SCCS-vsn: sys/netns/ns_ip.c 7.4
SCCS-vsn: sys/netns/ns_output.c 7.5
SCCS-vsn: sys/netns/ns_pcb.c 7.7
SCCS-vsn: sys/netns/idp_usrreq.c 7.6

usr/src/sys/netns/idp_usrreq.c
usr/src/sys/netns/ns.c
usr/src/sys/netns/ns.h
usr/src/sys/netns/ns_error.c
usr/src/sys/netns/ns_if.h
usr/src/sys/netns/ns_input.c
usr/src/sys/netns/ns_ip.c
usr/src/sys/netns/ns_output.c
usr/src/sys/netns/ns_pcb.c
usr/src/sys/netns/spp_usrreq.c
usr/src/sys/netns/spp_var.h

index b47196a..e2278d9 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.
  *
- *     @(#)idp_usrreq.c        7.5 (Berkeley) %G%
+ *     @(#)idp_usrreq.c        7.6 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -42,7 +42,7 @@
  * IDP protocol implementation.
  */
 
  * IDP protocol implementation.
  */
 
-struct sockaddr_ns idp_ns = { AF_NS };
+struct sockaddr_ns idp_ns = { sizeof(idp_ns), AF_NS };
 
 /*
  *  This may also be called for raw listeners.
 
 /*
  *  This may also be called for raw listeners.
@@ -62,12 +62,12 @@ idp_input(m, nsp)
         */
        idp_ns.sns_addr = idp->idp_sna;
        if (ns_neteqnn(idp->idp_sna.x_net, ns_zeronet) && ifp) {
         */
        idp_ns.sns_addr = idp->idp_sna;
        if (ns_neteqnn(idp->idp_sna.x_net, ns_zeronet) && ifp) {
-               register struct ifaddr *ia;
+               register struct ifaddr *ifa;
 
 
-               for (ia = ifp->if_addrlist; ia; ia = ia->ifa_next) {
-                       if (ia->ifa_addr.sa_family == AF_NS) {
+               for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) {
+                       if (ifa->ifa_addr->sa_family == AF_NS) {
                                idp_ns.sns_addr.x_net =
                                idp_ns.sns_addr.x_net =
-                                       IA_SNS(ia)->sns_addr.x_net;
+                                       IA_SNS(ifa)->sns_addr.x_net;
                                break;
                        }
                }
                                break;
                        }
                }
index 1028316..e5ce2c9 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.
  *
- *     @(#)ns.c        7.3 (Berkeley) %G%
+ *     @(#)ns.c        7.4 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
 #ifdef NS
 
 struct ns_ifaddr *ns_ifaddr;
 #ifdef NS
 
 struct ns_ifaddr *ns_ifaddr;
-
-ns_hash(sns, hp)
-       register struct sockaddr_ns *sns;
-       struct afhash *hp;
-{
-       register long hash = 0;
-       register u_short *s =  sns->sns_addr.x_host.s_host;
-       union {
-               union ns_net    net_e;
-               long            long_e;
-       } net;
-
-       net.net_e = sns->sns_addr.x_net;
-       hp->afh_nethash = net.long_e;
-       hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s;
-       hp->afh_hosthash =  hash;
-}
-
-
-ns_netmatch(sns1, sns2)
-       struct sockaddr_ns *sns1, *sns2;
-{
-
-       return (ns_neteq(sns1->sns_addr, sns2->sns_addr));
-}
+int ns_interfaces;
+extern struct sockaddr_ns ns_netmask, ns_hostmask;
 
 /*
  * Generic internet control operations (ioctl's).
 
 /*
  * Generic internet control operations (ioctl's).
@@ -75,9 +52,12 @@ ns_control(so, cmd, data, ifp)
        register struct ifnet *ifp;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
        register struct ifnet *ifp;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
+       register struct ns_aliasreq *ifra = (struct ns_aliasreq *)data;
        register struct ns_ifaddr *ia;
        struct ifaddr *ifa;
        register struct ns_ifaddr *ia;
        struct ifaddr *ifa;
+       struct ns_ifaddr *oia;
        struct mbuf *m;
        struct mbuf *m;
+       int dstIsNew, hostIsNew;
 
        /*
         * Find address for this interface, if it exists.
 
        /*
         * Find address for this interface, if it exists.
@@ -93,7 +73,7 @@ ns_control(so, cmd, data, ifp)
        case SIOCGIFADDR:
                if (ia == (struct ns_ifaddr *)0)
                        return (EADDRNOTAVAIL);
        case SIOCGIFADDR:
                if (ia == (struct ns_ifaddr *)0)
                        return (EADDRNOTAVAIL);
-               ifr->ifr_addr = ia->ia_addr;
+               *(struct sockaddr_ns *)&ifr->ifr_addr = ia->ia_addr;
                return (0);
 
 
                return (0);
 
 
@@ -102,7 +82,7 @@ ns_control(so, cmd, data, ifp)
                        return (EADDRNOTAVAIL);
                if ((ifp->if_flags & IFF_BROADCAST) == 0)
                        return (EINVAL);
                        return (EADDRNOTAVAIL);
                if ((ifp->if_flags & IFF_BROADCAST) == 0)
                        return (EINVAL);
-               ifr->ifr_dstaddr = ia->ia_broadaddr;
+               *(struct sockaddr_ns *)&ifr->ifr_dstaddr = ia->ia_broadaddr;
                return (0);
 
        case SIOCGIFDSTADDR:
                return (0);
 
        case SIOCGIFDSTADDR:
@@ -110,7 +90,7 @@ ns_control(so, cmd, data, ifp)
                        return (EADDRNOTAVAIL);
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
                        return (EADDRNOTAVAIL);
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
-               ifr->ifr_dstaddr = ia->ia_dstaddr;
+               *(struct sockaddr_ns *)&ifr->ifr_dstaddr = ia->ia_dstaddr;
                return (0);
        }
 
                return (0);
        }
 
@@ -118,6 +98,18 @@ ns_control(so, cmd, data, ifp)
                return (u.u_error);
 
        switch (cmd) {
                return (u.u_error);
 
        switch (cmd) {
+       case SIOCAIFADDR:
+       case SIOCDIFADDR:
+               if (ifra->ifra_addr.sns_family == AF_NS)
+                   for (oia = ia; ia; ia = ia->ia_next) {
+                       if (ia->ia_ifp == ifp  &&
+                           ns_neteq(ia->ia_addr.sns_addr,
+                                 ifra->ifra_addr.sns_addr))
+                           break;
+                   }
+               if (cmd == SIOCDIFADDR && ia == 0)
+                       return (EADDRNOTAVAIL);
+               /* FALLTHROUGH */
 
        case SIOCSIFADDR:
        case SIOCSIFDSTADDR:
 
        case SIOCSIFADDR:
        case SIOCSIFDSTADDR:
@@ -139,31 +131,99 @@ ns_control(so, cmd, data, ifp)
                        } else
                                ifp->if_addrlist = (struct ifaddr *) ia;
                        ia->ia_ifp = ifp;
                        } else
                                ifp->if_addrlist = (struct ifaddr *) ia;
                        ia->ia_ifp = ifp;
-                       IA_SNS(ia)->sns_family = AF_NS;
+                       ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
+
+                       ia->ia_ifa.ifa_netmask =
+                               (struct sockaddr *)&ns_netmask;
+
+                       ia->ia_ifa.ifa_dstaddr =
+                               (struct sockaddr *)&ia->ia_dstaddr;
+                       if (ifp->if_flags & IFF_BROADCAST) {
+                               ia->ia_broadaddr.sns_family = AF_NS;
+                               ia->ia_broadaddr.sns_len = sizeof(ia->ia_addr);
+                               ia->ia_broadaddr.sns_addr.x_host = ns_broadhost;
+                       }
+                       ns_interfaces++;
                }
        }
 
        switch (cmd) {
                }
        }
 
        switch (cmd) {
+               int error;
 
        case SIOCSIFDSTADDR:
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
                if (ia->ia_flags & IFA_ROUTE) {
 
        case SIOCSIFDSTADDR:
                if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
                        return (EINVAL);
                if (ia->ia_flags & IFA_ROUTE) {
-                       rtinit(&ia->ia_dstaddr, &ia->ia_addr,
-                               (int)SIOCDELRT, RTF_HOST);
+                       rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
                        ia->ia_flags &= ~IFA_ROUTE;
                }
                if (ifp->if_ioctl) {
                        ia->ia_flags &= ~IFA_ROUTE;
                }
                if (ifp->if_ioctl) {
-                       int error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia);
+                       error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia);
                        if (error)
                                return (error);
                }
                        if (error)
                                return (error);
                }
-               ia->ia_dstaddr = ifr->ifr_dstaddr;
+               *(struct sockaddr *)&ia->ia_dstaddr = ifr->ifr_dstaddr;
                return (0);
 
        case SIOCSIFADDR:
                return (0);
 
        case SIOCSIFADDR:
-               return
-                   (ns_ifinit(ifp, ia, (struct sockaddr_ns *)&ifr->ifr_addr));
+               return (ns_ifinit(ifp, ia,
+                               (struct sockaddr_ns *)&ifr->ifr_addr, 1));
+
+       case SIOCDIFADDR:
+               ns_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 nsifaddr from ifp\n");
+               }
+               oia = ia;
+               if (oia == (ia = ns_ifaddr)) {
+                       ns_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 nsifadr from list\n");
+               }
+               (void) m_free(dtom(oia));
+               if (0 == --ns_interfaces) {
+                       /*
+                        * We reset to virginity and start all over again
+                        */
+                       ns_thishost = ns_zerohost;
+               }
+               return (0);
+       
+       case SIOCAIFADDR:
+               dstIsNew = 0; hostIsNew = 1;
+               if (ia->ia_addr.sns_family == AF_NS) {
+                       if (ifra->ifra_addr.sns_len == 0) {
+                               ifra->ifra_addr = ia->ia_addr;
+                               hostIsNew = 0;
+                       } else if (ns_neteq(ifra->ifra_addr.sns_addr,
+                                        ia->ia_addr.sns_addr))
+                               hostIsNew = 0;
+               }
+               if ((ifp->if_flags & IFF_POINTOPOINT) &&
+                   (ifra->ifra_dstaddr.sns_family == AF_NS)) {
+                       if (hostIsNew == 0)
+                               ns_ifscrub(ifp, ia);
+                       ia->ia_dstaddr = ifra->ifra_dstaddr;
+                       dstIsNew  = 1;
+               }
+               if (ifra->ifra_addr.sns_family == AF_NS &&
+                                           (hostIsNew || dstIsNew))
+                       error = ns_ifinit(ifp, ia, &ifra->ifra_addr, 0);
+               return (error);
 
        default:
                if (ifp->if_ioctl == 0)
 
        default:
                if (ifp->if_ioctl == 0)
@@ -172,19 +232,39 @@ ns_control(so, cmd, data, ifp)
        }
 }
 
        }
 }
 
+/*
+* Delete any previous route for an old address.
+*/
+ns_ifscrub(ifp, ia)
+       register struct ifnet *ifp;
+       register struct ns_ifaddr *ia; 
+{
+       if (ia->ia_flags & IFA_ROUTE) {
+               if (ifp->if_flags & 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.
  */
-ns_ifinit(ifp, ia, sns)
+ns_ifinit(ifp, ia, sns, scrub)
        register struct ifnet *ifp;
        register struct ns_ifaddr *ia;
        register struct ifnet *ifp;
        register struct ns_ifaddr *ia;
-       struct sockaddr_ns *sns;
+       register struct sockaddr_ns *sns;
 {
 {
-       struct sockaddr_ns netaddr;
-       register union ns_host *h = &(IA_SNS(ia)->sns_addr.x_host);
+       struct sockaddr_ns oldaddr;
+       register union ns_host *h = &ia->ia_addr.sns_addr.x_host;
        int s = splimp(), error;
 
        int s = splimp(), error;
 
+       /*
+        * Set up new addresses.
+        */
+       oldaddr = ia->ia_addr;
+       ia->ia_addr = *sns;
        /*
         * The convention we shall adopt for naming is that
         * a supplied address of zero means that "we don't care".
        /*
         * The convention we shall adopt for naming is that
         * a supplied address of zero means that "we don't care".
@@ -193,42 +273,6 @@ ns_ifinit(ifp, ia, sns)
         * if there are multiple interfaces, use any address already
         * used.
         *
         * if there are multiple interfaces, use any address already
         * used.
         *
-        * If we have gotten into trouble and want to reset back to
-        * virginity, we recognize a request of the broadcast address.
-        */
-       if (ns_hosteqnh(sns->sns_addr.x_host, ns_broadhost)) {
-               ns_thishost = ns_zerohost;
-               splx(s);
-               return (0);
-       }
-
-       /*
-        * Delete any previous route for an old address.
-        */
-       bzero((caddr_t)&netaddr, sizeof (netaddr));
-       netaddr.sns_family = AF_NS;
-       netaddr.sns_addr.x_host = ns_broadhost;
-       netaddr.sns_addr.x_net = ia->ia_net;
-       if (ia->ia_flags & IFA_ROUTE) {
-               if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
-                   rtinit((struct sockaddr *)&netaddr, &ia->ia_addr,
-                                   (int)SIOCDELRT, 0);
-               } else
-                   rtinit(&ia->ia_dstaddr, &ia->ia_addr,
-                                   (int)SIOCDELRT, RTF_HOST);
-       }
-
-       /*
-        * Set up new addresses.
-        */
-       ia->ia_addr = *(struct sockaddr *)sns;
-       ia->ia_net = sns->sns_addr.x_net;
-       netaddr.sns_addr.x_net = ia->ia_net;
-       if (ifp->if_flags & IFF_BROADCAST) {
-               ia->ia_broadaddr = * (struct sockaddr *) &netaddr;
-       }
-
-       /*
         * Give the interface a chance to initialize
         * if this is its first address,
         * and to validate the address if necessary.
         * Give the interface a chance to initialize
         * if this is its first address,
         * and to validate the address if necessary.
@@ -236,6 +280,7 @@ ns_ifinit(ifp, ia, sns)
        if (ns_hosteqnh(ns_thishost, ns_zerohost)) {
                if (ifp->if_ioctl &&
                     (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) {
        if (ns_hosteqnh(ns_thishost, ns_zerohost)) {
                if (ifp->if_ioctl &&
                     (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) {
+                       ia->ia_addr = oldaddr;
                        splx(s);
                        return (error);
                }
                        splx(s);
                        return (error);
                }
@@ -245,27 +290,34 @@ ns_ifinit(ifp, ia, sns)
                *h = ns_thishost;
                if (ifp->if_ioctl &&
                     (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) {
                *h = ns_thishost;
                if (ifp->if_ioctl &&
                     (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) {
+                       ia->ia_addr = oldaddr;
                        splx(s);
                        return (error);
                }
                if (!ns_hosteqnh(ns_thishost,*h)) {
                        splx(s);
                        return (error);
                }
                if (!ns_hosteqnh(ns_thishost,*h)) {
+                       ia->ia_addr = oldaddr;
                        splx(s);
                        return (EINVAL);
                }
        } else {
                        splx(s);
                        return (EINVAL);
                }
        } else {
+               ia->ia_addr = oldaddr;
                splx(s);
                return (EINVAL);
        }
                splx(s);
                return (EINVAL);
        }
-
        /*
         * Add route for the network.
         */
        /*
         * Add route for the network.
         */
+       if (scrub) {
+               ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
+               ns_ifscrub(ifp, ia);
+               ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
+       }
        if (ifp->if_flags & IFF_POINTOPOINT)
        if (ifp->if_flags & IFF_POINTOPOINT)
-               rtinit(&ia->ia_dstaddr, &ia->ia_addr, (int)SIOCADDRT,
-                       RTF_HOST|RTF_UP);
-       else
-               rtinit(&ia->ia_broadaddr, &ia->ia_addr, (int)SIOCADDRT,
-                       RTF_UP);
+               rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
+       else {
+               ia->ia_broadaddr.sns_addr.x_net = ia->ia_net;
+               rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP);
+       }
        ia->ia_flags |= IFA_ROUTE;
        return (0);
 }
        ia->ia_flags |= IFA_ROUTE;
        return (0);
 }
index 89b4a1c..c147f02 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.
  *
- *     @(#)ns.h        7.4 (Berkeley) %G%
+ *     @(#)ns.h        7.5 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -95,7 +95,8 @@ struct ns_addr {
  * Socket address, Xerox style
  */
 struct sockaddr_ns {
  * Socket address, Xerox style
  */
 struct sockaddr_ns {
-       u_short         sns_family;
+       u_char          sns_len;
+       u_char          sns_family;
        struct ns_addr  sns_addr;
        char            sns_zero[2];
 };
        struct ns_addr  sns_addr;
        char            sns_zero[2];
 };
index b7f82c1..9529770 100644 (file)
  * 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.
  *
- *     @(#)ns_error.c  7.6 (Berkeley) %G%
+ *     @(#)ns_error.c  7.7 (Berkeley) %G%
  */
 
 #include "param.h"
 #include "systm.h"
  */
 
 #include "param.h"
 #include "systm.h"
+#include "malloc.h"
 #include "mbuf.h"
 #include "protosw.h"
 #include "socket.h"
 #include "mbuf.h"
 #include "protosw.h"
 #include "socket.h"
@@ -84,9 +85,9 @@ ns_error(om, type, param)
         * and nobody was there, just echo it.
         * (Yes, this is a wart!)
         */
         * and nobody was there, just echo it.
         * (Yes, this is a wart!)
         */
-       if (type==NS_ERR_NOSOCK &&
-           oip->idp_dna.x_port==htons(2) &&
-           (type = ns_echo(oip)==0))
+       if (type == NS_ERR_NOSOCK &&
+           oip->idp_dna.x_port == htons(2) &&
+           (type = ns_echo(om))==0)
                return;
 
 #ifdef NS_ERRPRINTFS
                return;
 
 #ifdef NS_ERRPRINTFS
@@ -97,7 +98,7 @@ ns_error(om, type, param)
         * Don't Generate error packets in response to multicasts.
         */
        if (oip->idp_dna.x_host.c_host[0] & 1)
         * Don't Generate error packets in response to multicasts.
         */
        if (oip->idp_dna.x_host.c_host[0] & 1)
-               goto free;
+               goto freeit;
 
        ns_errstat.ns_es_error++;
        /*
 
        ns_errstat.ns_es_error++;
        /*
@@ -107,21 +108,21 @@ ns_error(om, type, param)
         */
        if (oip->idp_len < sizeof(struct idp)) {
                ns_errstat.ns_es_oldshort++;
         */
        if (oip->idp_len < sizeof(struct idp)) {
                ns_errstat.ns_es_oldshort++;
-               goto free;
+               goto freeit;
        }
        if (oip->idp_pt == NSPROTO_ERROR) {
                ns_errstat.ns_es_oldns_err++;
        }
        if (oip->idp_pt == NSPROTO_ERROR) {
                ns_errstat.ns_es_oldns_err++;
-               goto free;
+               goto freeit;
        }
 
        /*
         * First, formulate ns_err message
         */
        }
 
        /*
         * First, formulate ns_err message
         */
-       m = m_get(M_DONTWAIT, MT_HEADER);
+       m = m_gethdr(M_DONTWAIT, MT_HEADER);
        if (m == NULL)
        if (m == NULL)
-               goto free;
+               goto freeit;
        m->m_len = sizeof(*ep);
        m->m_len = sizeof(*ep);
-       m->m_off = MMAXOFF - m->m_len;
+       MH_ALIGN(m, m->m_len);
        ep = mtod(m, struct ns_epidp *);
        if ((u_int)type > NS_ERR_TOO_BIG)
                panic("ns_err_error");
        ep = mtod(m, struct ns_epidp *);
        if ((u_int)type > NS_ERR_TOO_BIG)
                panic("ns_err_error");
@@ -138,13 +139,13 @@ ns_error(om, type, param)
        nip->idp_sna = oip->idp_dna;
        if (idpcksum) {
                nip->idp_sum = 0;
        nip->idp_sna = oip->idp_dna;
        if (idpcksum) {
                nip->idp_sum = 0;
-               nip->idp_sum = ns_cksum(dtom(nip), sizeof(*ep));
+               nip->idp_sum = ns_cksum(m, sizeof(*ep));
        } else 
                nip->idp_sum = 0xffff;
        } else 
                nip->idp_sum = 0xffff;
-       (void) ns_output(dtom(nip), (struct route *)0, 0);
+       (void) ns_output(m, (struct route *)0, 0);
 
 
-free:
-       m_freem(dtom(oip));
+freeit:
+       m_freem(om);
 }
 
 ns_printhost(p)
 }
 
 ns_printhost(p)
@@ -184,7 +185,7 @@ ns_err_input(m)
        }
 #endif
        i = sizeof (struct ns_epidp);
        }
 #endif
        i = sizeof (struct ns_epidp);
-       if ((m->m_off > MMAXOFF || m->m_len < i) &&
+       if (((m->m_flags & M_EXT) || m->m_len < i) &&
                (m = m_pullup(m, i)) == 0)  {
                ns_errstat.ns_es_tooshort++;
                return;
                (m = m_pullup(m, i)) == 0)  {
                ns_errstat.ns_es_tooshort++;
                return;
@@ -252,15 +253,15 @@ ns_err_input(m)
                        idp_ctlinput(code, (caddr_t)ep);
                }
                
                        idp_ctlinput(code, (caddr_t)ep);
                }
                
-               goto free;
+               goto freeit;
 
        default:
        badcode:
                ns_errstat.ns_es_badcode++;
 
        default:
        badcode:
                ns_errstat.ns_es_badcode++;
-               goto free;
+               goto freeit;
 
        }
 
        }
-free:
+freeit:
        m_freem(m);
 }
 
        m_freem(m);
 }
 
@@ -277,10 +278,10 @@ nstime()
 }
 #endif
 
 }
 #endif
 
-ns_echo(idp)
-register struct idp *idp;
+ns_echo(m)
+struct mbuf *m;
 {
 {
-       struct mbuf *m = dtom(idp);
+       register struct idp *idp = mtod(m, struct idp *);
        register struct echo {
            struct idp  ec_idp;
            u_short             ec_op; /* Operation, 1 = request, 2 = reply */
        register struct echo {
            struct idp  ec_idp;
            u_short             ec_op; /* Operation, 1 = request, 2 = reply */
index 7809b0f..b58c2dd 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.
  *
- *     @(#)ns_if.h     7.3 (Berkeley) %G%
+ *     @(#)ns_if.h     7.4 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
 
 struct ns_ifaddr {
        struct  ifaddr ia_ifa;          /* protocol-independent info */
 
 struct ns_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
-       union   ns_net  ia_net;         /* network number of interface */
+/*     union   ns_net  ia_net;         /* network number of interface */
+#define ia_net         ia_addr.sns_addr.x_net
        int     ia_flags;
        int     ia_flags;
-       struct  ns_ifaddr *ia_next;     /* next in list of internet addresses */
+       struct  ns_ifaddr *ia_next;     /* next in list of xerox addresses */
+       struct  sockaddr_ns ia_addr;    /* reserve space for my address */
+       struct  sockaddr_ns ia_dstaddr; /* space for my broadcast address */
+#define ia_broadaddr   ia_dstaddr
+       struct  sockaddr_ns ia_netmask; /* space for my network mask */
 };
 
 };
 
+struct ns_aliasreq {
+       char    ifra_name[IFNAMSIZ];            /* if name, e.g. "en0" */
+       struct  sockaddr_ns ifra_addr;
+       struct  sockaddr_ns ifra_broadaddr;
+#define ifra_dstaddr ifra_broadaddr
+};
 /*
  * Given a pointer to an ns_ifaddr (ifaddr),
  * return a pointer to the addr as a sockadd_ns.
  */
 
 /*
  * Given a pointer to an ns_ifaddr (ifaddr),
  * return a pointer to the addr as a sockadd_ns.
  */
 
-#define        IA_SNS(ia) ((struct sockaddr_ns *)(&((struct ns_ifaddr *)ia)->ia_addr))
+#define        IA_SNS(ia) (&(((struct ns_ifaddr *)(ia))->ia_addr))
 /*
  * ia_flags
  */
 /*
  * ia_flags
  */
index 040280c..437201f 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.
  *
- *     @(#)ns_input.c  7.5 (Berkeley) %G%
+ *     @(#)ns_input.c  7.6 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -48,6 +48,7 @@ union ns_host ns_zerohost;
 union ns_host  ns_broadhost;
 union ns_net   ns_zeronet;
 union ns_net   ns_broadnet;
 union ns_host  ns_broadhost;
 union ns_net   ns_zeronet;
 union ns_net   ns_broadnet;
+struct sockaddr_ns ns_netmask, ns_hostmask;
 
 static u_short allones[] = {-1, -1, -1};
 
 
 static u_short allones[] = {-1, -1, -1};
 
@@ -70,6 +71,11 @@ ns_init()
        nsrawpcb.nsp_next = nsrawpcb.nsp_prev = &nsrawpcb;
        nsintrq.ifq_maxlen = nsqmaxlen;
        ns_pexseq = time.tv_usec;
        nsrawpcb.nsp_next = nsrawpcb.nsp_prev = &nsrawpcb;
        nsintrq.ifq_maxlen = nsqmaxlen;
        ns_pexseq = time.tv_usec;
+       ns_netmask.sns_len = 6;
+       ns_netmask.sns_addr.x_net = ns_broadnet;
+       ns_hostmask.sns_len = 12;
+       ns_hostmask.sns_addr.x_net = ns_broadnet;
+       ns_hostmask.sns_addr.x_host = ns_broadhost;
 }
 
 /*
 }
 
 /*
@@ -82,8 +88,6 @@ nsintr()
        register struct idp *idp;
        register struct mbuf *m;
        register struct nspcb *nsp;
        register struct idp *idp;
        register struct mbuf *m;
        register struct nspcb *nsp;
-       struct ifnet *ifp;
-       struct mbuf *m0;
        register int i;
        int len, s, error;
        char oddpacketp;
        register int i;
        int len, s, error;
        char oddpacketp;
@@ -247,7 +251,7 @@ idp_ctlinput(cmd, arg)
        case PRC_HOSTDEAD:
        case PRC_HOSTUNREACH:
                sns = (struct sockaddr_ns *)arg;
        case PRC_HOSTDEAD:
        case PRC_HOSTUNREACH:
                sns = (struct sockaddr_ns *)arg;
-               if (sns->sns_family != AF_INET)
+               if (sns->sns_family != AF_NS)
                        return;
                ns = &sns->sns_addr;
                break;
                        return;
                ns = &sns->sns_addr;
                break;
@@ -412,6 +416,7 @@ struct route *ro;
        bzero((caddr_t)ro, sizeof (*ro));
        dst = (struct sockaddr_ns *)&ro->ro_dst;
 
        bzero((caddr_t)ro, sizeof (*ro));
        dst = (struct sockaddr_ns *)&ro->ro_dst;
 
+       dst->sns_len = sizeof(*dst);
        dst->sns_family = AF_NS;
        dst->sns_addr = *src;
        dst->sns_addr.x_port = 0;
        dst->sns_family = AF_NS;
        dst->sns_addr = *src;
        dst->sns_addr.x_port = 0;
@@ -436,7 +441,7 @@ struct mbuf *m;
 struct ifnet *ifp;
 {
        register struct nspcb *nsp;
 struct ifnet *ifp;
 {
        register struct nspcb *nsp;
-       register struct ifaddr *ia;
+       register struct ifaddr *ifa;
        /*
         * Give any raw listeners a crack at the packet
         */
        /*
         * Give any raw listeners a crack at the packet
         */
@@ -452,11 +457,10 @@ struct ifnet *ifp;
                        idp->idp_sna.x_net = ns_zeronet;
                        idp->idp_sna.x_host = ns_thishost;
                        if (ifp && (ifp->if_flags & IFF_POINTOPOINT))
                        idp->idp_sna.x_net = ns_zeronet;
                        idp->idp_sna.x_host = ns_thishost;
                        if (ifp && (ifp->if_flags & IFF_POINTOPOINT))
-                           for(ia = ifp->if_addrlist; ia;
-                                               ia = ia->ifa_next) {
-                               if (ia->ifa_addr.sa_family==AF_NS) {
-                                   idp->idp_sna = 
-                                       satons_addr(ia->ifa_dstaddr);
+                           for(ifa = ifp->if_addrlist; ifa;
+                                               ifa = ifa->ifa_next) {
+                               if (ifa->ifa_addr->sa_family==AF_NS) {
+                                   idp->idp_sna = IA_SNS(ifa)->sns_addr;
                                    break;
                                }
                            }
                                    break;
                                }
                            }
index df7513a..4454bed 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.
  *
- *     @(#)ns_ip.c     7.3 (Berkeley) %G%
+ *     @(#)ns_ip.c     7.4 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -24,6 +24,7 @@
 #ifdef NSIP
 #include "param.h"
 #include "systm.h"
 #ifdef NSIP
 #include "param.h"
 #include "systm.h"
+#include "malloc.h"
 #include "mbuf.h"
 #include "socket.h"
 #include "socketvar.h"
 #include "mbuf.h"
 #include "socket.h"
 #include "socketvar.h"
@@ -41,9 +42,7 @@
 #include "../netinet/ip.h"
 #include "../netinet/ip_var.h"
 
 #include "../netinet/ip.h"
 #include "../netinet/ip_var.h"
 
-#ifdef vax
-#include "../vax/mtpr.h"
-#endif
+#include "../machine/mtpr.h"
 
 #include "../netns/ns.h"
 #include "../netns/ns_if.h"
 
 #include "../netns/ns.h"
 #include "../netns/ns_if.h"
@@ -54,36 +53,48 @@ struct ifnet_en {
        struct route ifen_route;
        struct in_addr ifen_src;
        struct in_addr ifen_dst;
        struct route ifen_route;
        struct in_addr ifen_src;
        struct in_addr ifen_dst;
+       struct ifnet_en *ifen_next;
 };
 
 };
 
-int    nsipoutput(), nsipioctl();
+int    nsipoutput(), nsipioctl(), nsipstart();
 #define LOMTU  (1024+512);
 
 struct ifnet nsipif;
 #define LOMTU  (1024+512);
 
 struct ifnet nsipif;
-struct mbuf *nsip_list;                /* list of all hosts and gateways or
+struct ifnet_en *nsip_list;            /* list of all hosts and gateways or
                                        broadcast addrs */
 
                                        broadcast addrs */
 
-struct mbuf *
+struct ifnet_en *
 nsipattach()
 {
 nsipattach()
 {
-       register struct mbuf *m = m_getclr(M_DONTWAIT, MT_PCB);
+       register struct ifnet_en *m;
        register struct ifnet *ifp;
 
        register struct ifnet *ifp;
 
+       if (nsipif.if_mtu == 0) {
+               ifp = &nsipif;
+               ifp->if_name = "nsip";
+               ifp->if_mtu = LOMTU;
+               ifp->if_ioctl = nsipioctl;
+               ifp->if_output = nsipoutput;
+               ifp->if_start = nsipstart;
+               ifp->if_flags = IFF_POINTOPOINT;
+       }
+
+       MALLOC((m), struct ifnet_en *, sizeof(*m), M_PCB, M_NOWAIT);
        if (m == NULL) return (NULL);
        if (m == NULL) return (NULL);
-       m->m_off = MMINOFF;
-       m->m_len = sizeof(struct ifnet_en);
-       m->m_next = nsip_list;
+       m->ifen_next = nsip_list;
        nsip_list = m;
        nsip_list = m;
-       ifp = mtod(m, struct ifnet *);
+       ifp = &m->ifen_ifnet;
 
        ifp->if_name = "nsip";
        ifp->if_mtu = LOMTU;
        ifp->if_ioctl = nsipioctl;
        ifp->if_output = nsipoutput;
 
        ifp->if_name = "nsip";
        ifp->if_mtu = LOMTU;
        ifp->if_ioctl = nsipioctl;
        ifp->if_output = nsipoutput;
+       ifp->if_start = nsipstart;
        ifp->if_flags = IFF_POINTOPOINT;
        ifp->if_unit = nsipif.if_unit++;
        if_attach(ifp);
        ifp->if_flags = IFF_POINTOPOINT;
        ifp->if_unit = nsipif.if_unit++;
        if_attach(ifp);
-       return (dtom(ifp));
+
+       return (m);
 }
 
 
 }
 
 
@@ -140,14 +151,14 @@ idpip_input(m, ifp)
                if (nsip_lastin) {
                        m_freem(nsip_lastin);
                }
                if (nsip_lastin) {
                        m_freem(nsip_lastin);
                }
-               nsip_lastin = m_copy(m, 0, (int)M_COPYALL);
+               nsip_lastin = m_copym(m, 0, (int)M_COPYALL, M_DONTWAIT);
        }
        /*
         * Get IP and IDP header together in first mbuf.
         */
        nsipif.if_ipackets++;
        s = sizeof (struct ip) + sizeof (struct idp);
        }
        /*
         * Get IP and IDP header together in first mbuf.
         */
        nsipif.if_ipackets++;
        s = sizeof (struct ip) + sizeof (struct idp);
-       if ((m->m_off > MMAXOFF || m->m_len < s) &&
+       if (((m->m_flags & M_EXT) || m->m_len < s) &&
            (m = m_pullup(m, s)) == 0) {
                nsipif.if_ierrors++;
                return;
            (m = m_pullup(m, s)) == 0) {
                nsipif.if_ierrors++;
                return;
@@ -168,8 +179,9 @@ idpip_input(m, ifp)
         * Make mbuf data length reflect IDP length.
         * If not enough data to reflect IDP length, drop.
         */
         * Make mbuf data length reflect IDP length.
         * If not enough data to reflect IDP length, drop.
         */
-       m->m_off += sizeof (struct ip);
+       m->m_data += sizeof (struct ip);
        m->m_len -= sizeof (struct ip);
        m->m_len -= sizeof (struct ip);
+       m->m_pkthdr.len -= sizeof (struct ip);
        idp = mtod(m, struct idp *);
        len = ntohs(idp->idp_len);
        if (len & 1) len++;             /* Preserve Garbage Byte */
        idp = mtod(m, struct idp *);
        len = ntohs(idp->idp_len);
        if (len & 1) len++;             /* Preserve Garbage Byte */
@@ -187,22 +199,7 @@ idpip_input(m, ifp)
         * Place interface pointer before the data
         * for the receiving protocol.
         */
         * Place interface pointer before the data
         * for the receiving protocol.
         */
-       if (m->m_off >= MMINOFF + sizeof(struct ifnet *)) {
-               m->m_off -= sizeof(struct ifnet *);
-               m->m_len += sizeof(struct ifnet *);
-       } else {
-               struct mbuf *n;
-
-               n = m_get(M_DONTWAIT, MT_HEADER);
-               if (n == (struct mbuf *)0)
-                       goto bad;
-               n->m_off = MMINOFF;
-               n->m_len = sizeof(struct ifnet *);
-               n->m_next = m;
-               m = n;
-       }
-       *(mtod(m, struct ifnet **)) = ifp;
-
+       m->m_pkthdr.rcvif = ifp;
        /*
         * Deliver to NS
         */
        /*
         * Deliver to NS
         */
@@ -221,23 +218,18 @@ bad:
 }
 
 /* ARGSUSED */
 }
 
 /* ARGSUSED */
-nsipoutput(ifn, m0, dst)
+nsipoutput(ifn, m, dst)
        struct ifnet_en *ifn;
        struct ifnet_en *ifn;
-       struct mbuf *m0;
+       register struct mbuf *m;
        struct sockaddr *dst;
 {
 
        struct sockaddr *dst;
 {
 
-       register struct mbuf *m = dtom(ifn);
        register struct ip *ip;
        register struct route *ro = &(ifn->ifen_route);
        register int len = 0;
        register struct ip *ip;
        register struct route *ro = &(ifn->ifen_route);
        register int len = 0;
-       register struct idp *idp = mtod(m0, struct idp *);
+       register struct idp *idp = mtod(m, struct idp *);
        int error;
 
        int error;
 
-       if (m->m_len != sizeof(struct ifnet_en)) {
-               printf("nsipoutput: bad dst ifp %x\n", ifn);
-               goto bad;
-       }
        ifn->ifen_ifnet.if_opackets++;
        nsipif.if_opackets++;
 
        ifn->ifen_ifnet.if_opackets++;
        nsipif.if_opackets++;
 
@@ -248,19 +240,24 @@ nsipoutput(ifn, m0, dst)
         */
        len =  ntohs(idp->idp_len);
        if (len & 1) len++;             /* Preserve Garbage Byte */
         */
        len =  ntohs(idp->idp_len);
        if (len & 1) len++;             /* Preserve Garbage Byte */
-       m = m0;
-       if (m->m_off < MMINOFF + sizeof (struct ip)) {
-               m = m_get(M_DONTWAIT, MT_HEADER);
-               if (m == 0) {
-                       m_freem(m0);
+       /* following clause not necessary on vax */
+       if (3 & (int)m->m_data) {
+               /* force longword alignment of ip hdr */
+               struct mbuf *m0 = m_gethdr(MT_HEADER, M_DONTWAIT);
+               if (m0 == 0) {
+                       m_freem(m);
                        return (ENOBUFS);
                }
                        return (ENOBUFS);
                }
-               m->m_off = MMAXOFF - sizeof (struct ip);
-               m->m_len = sizeof (struct ip);
-               m->m_next = m0;
+               MH_ALIGN(m0, sizeof (struct ip));
+               m0->m_flags = m->m_flags & M_COPYFLAGS;
+               m0->m_next = m;
+               m0->m_len = sizeof (struct ip);
+               m0->m_pkthdr.len = m0->m_len + m->m_len;
+               m->m_flags &= ~M_PKTHDR;
        } else {
        } else {
-               m->m_off -= sizeof (struct ip);
-               m->m_len += sizeof (struct ip);
+               M_PREPEND(m, sizeof (struct ip), M_DONTWAIT);
+               if (m == 0)
+                       return (ENOBUFS);
        }
        /*
         * Fill in IP header.
        }
        /*
         * Fill in IP header.
@@ -283,10 +280,16 @@ nsipoutput(ifn, m0, dst)
        }
        return (error);
 bad:
        }
        return (error);
 bad:
-       m_freem(m0);
+       m_freem(m);
        return (ENETUNREACH);
 }
 
        return (ENETUNREACH);
 }
 
+nsipstart(ifp)
+struct ifnet *ifp;
+{
+       panic("nsip_start called\n");
+}
+
 struct ifreq ifr = {"nsip0"};
 
 nsip_route(m)
 struct ifreq ifr = {"nsip0"};
 
 nsip_route(m)
@@ -337,19 +340,16 @@ nsip_route(m)
        /*
         * Is there a free (pseudo-)interface or space?
         */
        /*
         * Is there a free (pseudo-)interface or space?
         */
-       for (m = nsip_list; m; m = m->m_next) {
-               struct ifnet *ifp = mtod(m, struct ifnet *);
-               if ((ifp->if_flags & IFF_UP) == 0)
+       for (ifn = nsip_list; ifn; ifn = ifn->ifen_next) {
+               if ((ifn->ifen_ifnet.if_flags & IFF_UP) == 0)
                        break;
        }
                        break;
        }
-       if (m == (struct mbuf *) 0)
-               m = nsipattach();
-       if (m == NULL) {
+       if (ifn == NULL)
+               ifn = nsipattach();
+       if (ifn == NULL) {
                RTFREE(ro.ro_rt);
                return (ENOBUFS);
        }
                RTFREE(ro.ro_rt);
                return (ENOBUFS);
        }
-       ifn = mtod(m, struct ifnet_en *);
-
        ifn->ifen_route = ro;
        ifn->ifen_dst =  ip_dst->sin_addr;
        ifn->ifen_src = src->sin_addr;
        ifn->ifen_route = ro;
        ifn->ifen_dst =  ip_dst->sin_addr;
        ifn->ifen_src = src->sin_addr;
@@ -411,11 +411,9 @@ nsip_ctlinput(cmd, sa)
 nsip_rtchange(dst)
        register struct in_addr *dst;
 {
 nsip_rtchange(dst)
        register struct in_addr *dst;
 {
-       register struct mbuf *m;
        register struct ifnet_en *ifn;
 
        register struct ifnet_en *ifn;
 
-       for (m = nsip_list; m; m = m->m_next) {
-               ifn = mtod(m, struct ifnet_en *);
+       for (ifn = nsip_list; ifn; ifn = ifn->ifen_next) {
                if (ifn->ifen_dst.s_addr == dst->s_addr &&
                        ifn->ifen_route.ro_rt) {
                                RTFREE(ifn->ifen_route.ro_rt);
                if (ifn->ifen_dst.s_addr == dst->s_addr &&
                        ifn->ifen_route.ro_rt) {
                                RTFREE(ifn->ifen_route.ro_rt);
index bedb993..3b4c9f2 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.
  *
- *     @(#)ns_output.c 7.4 (Berkeley) %G%
+ *     @(#)ns_output.c 7.5 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -68,6 +68,7 @@ ns_output(m0, ro, flags)
        dst = (struct sockaddr_ns *)&ro->ro_dst;
        if (ro->ro_rt == 0) {
                dst->sns_family = AF_NS;
        dst = (struct sockaddr_ns *)&ro->ro_dst;
        if (ro->ro_rt == 0) {
                dst->sns_family = AF_NS;
+               dst->sns_len = sizeof (*dst);
                dst->sns_addr = idp->idp_dna;
                dst->sns_addr.x_port = 0;
                /*
                dst->sns_addr = idp->idp_dna;
                dst->sns_addr.x_port = 0;
                /*
@@ -99,7 +100,7 @@ ns_output(m0, ro, flags)
        }
        ro->ro_rt->rt_use++;
        if (ro->ro_rt->rt_flags & (RTF_GATEWAY|RTF_HOST))
        }
        ro->ro_rt->rt_use++;
        if (ro->ro_rt->rt_flags & (RTF_GATEWAY|RTF_HOST))
-               dst = (struct sockaddr_ns *)&ro->ro_rt->rt_gateway;
+               dst = (struct sockaddr_ns *)ro->ro_rt->rt_gateway;
 gotif:
 
        /*
 gotif:
 
        /*
@@ -134,7 +135,9 @@ bad:
        }
        m_freem(m0);
 done:
        }
        m_freem(m0);
 done:
-       if (ro == &idproute && (flags & NS_ROUTETOIF) == 0 && ro->ro_rt)
+       if (ro == &idproute && (flags & NS_ROUTETOIF) == 0 && ro->ro_rt) {
                RTFREE(ro->ro_rt);
                RTFREE(ro->ro_rt);
+               ro->ro_rt = 0;
+       }
        return (error);
 }
        return (error);
 }
index 1419084..5958f66 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.
  *
- *     @(#)ns_pcb.c    7.6 (Berkeley) %G%
+ *     @(#)ns_pcb.c    7.7 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -58,7 +58,7 @@ ns_pcbbind(nsp, nam)
        register struct sockaddr_ns *sns;
        u_short lport = 0;
 
        register struct sockaddr_ns *sns;
        u_short lport = 0;
 
-       if(nsp->nsp_lport || !ns_nullhost(nsp->nsp_laddr))
+       if (nsp->nsp_lport || !ns_nullhost(nsp->nsp_laddr))
                return (EINVAL);
        if (nam == 0)
                goto noname;
                return (EINVAL);
        if (nam == 0)
                goto noname;
@@ -155,6 +155,7 @@ ns_pcbconnect(nsp, nam)
             ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
                    /* No route yet, so try to acquire one */
                    ro->ro_dst.sa_family = AF_NS;
             ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
                    /* No route yet, so try to acquire one */
                    ro->ro_dst.sa_family = AF_NS;
+                   ro->ro_dst.sa_len = sizeof(ro->ro_dst);
                    *dst = sns->sns_addr;
                    dst->x_port = 0;
                    rtalloc(ro);
                    *dst = sns->sns_addr;
                    dst->x_port = 0;
                    rtalloc(ro);
@@ -232,6 +233,7 @@ ns_setsockaddr(nsp, nam)
        nam->m_len = sizeof (*sns);
        sns = mtod(nam, struct sockaddr_ns *);
        bzero((caddr_t)sns, sizeof (*sns));
        nam->m_len = sizeof (*sns);
        sns = mtod(nam, struct sockaddr_ns *);
        bzero((caddr_t)sns, sizeof (*sns));
+       sns->sns_len = sizeof(*sns);
        sns->sns_family = AF_NS;
        sns->sns_addr = nsp->nsp_laddr;
 }
        sns->sns_family = AF_NS;
        sns->sns_addr = nsp->nsp_laddr;
 }
@@ -245,6 +247,7 @@ ns_setpeeraddr(nsp, nam)
        nam->m_len = sizeof (*sns);
        sns = mtod(nam, struct sockaddr_ns *);
        bzero((caddr_t)sns, sizeof (*sns));
        nam->m_len = sizeof (*sns);
        sns = mtod(nam, struct sockaddr_ns *);
        bzero((caddr_t)sns, sizeof (*sns));
+       sns->sns_len = sizeof(*sns);
        sns->sns_family = AF_NS;
        sns->sns_addr  = nsp->nsp_faddr;
 }
        sns->sns_family = AF_NS;
        sns->sns_addr  = nsp->nsp_faddr;
 }
@@ -325,8 +328,8 @@ ns_pcblookup(faddr, lport, wildp)
                        else {
                                if (!ns_hosteq(nsp->nsp_faddr, *faddr))
                                        continue;
                        else {
                                if (!ns_hosteq(nsp->nsp_faddr, *faddr))
                                        continue;
-                               ifnsp->nsp_fport != fport) {
-                                       if(nsp->nsp_fport != 0)
+                               if (nsp->nsp_fport != fport) {
+                                       if (nsp->nsp_fport != 0)
                                                continue;
                                        else
                                                wildcard++;
                                                continue;
                                        else
                                                wildcard++;
index 502eac6..1092212 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.
  *
- *     @(#)spp_usrreq.c        7.9 (Berkeley) %G%
+ *     @(#)spp_usrreq.c        7.10 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -151,6 +151,7 @@ spp_input(m, nsp)
                        goto drop;
                am->m_len = sizeof (struct sockaddr_ns);
                sns = mtod(am, struct sockaddr_ns *);
                        goto drop;
                am->m_len = sizeof (struct sockaddr_ns);
                sns = mtod(am, struct sockaddr_ns *);
+               sns->sns_len = sizeof(*sns);
                sns->sns_family = AF_NS;
                sns->sns_addr = si->si_sna;
                laddr = nsp->nsp_laddr;
                sns->sns_family = AF_NS;
                sns->sns_addr = si->si_sna;
                laddr = nsp->nsp_laddr;
@@ -722,11 +723,12 @@ spp_output(cb, m0)
 
                                cb->s_cc &= ~SP_EM;
                                while (len > mtu) {
 
                                cb->s_cc &= ~SP_EM;
                                while (len > mtu) {
-                                       m = m_copy(m0, 0, mtu);
-                                       if (m == NULL) {
-                                               error = ENOBUFS;
-                                               goto bad_copy;
-                                       }
+                                       /*
+                                        * Here we are only being called
+                                        * from usrreq(), so it is OK to
+                                        * block.
+                                        */
+                                       m = m_copym(m0, 0, mtu, M_WAIT);
                                        if (cb->s_flags & SF_NEWCALL) {
                                            struct mbuf *mm = m;
                                            spp_newchecks[7]++;
                                        if (cb->s_flags & SF_NEWCALL) {
                                            struct mbuf *mm = m;
                                            spp_newchecks[7]++;
@@ -737,7 +739,6 @@ spp_output(cb, m0)
                                        }
                                        error = spp_output(cb, m);
                                        if (error) {
                                        }
                                        error = spp_output(cb, m);
                                        if (error) {
-                                       bad_copy:
                                                cb->s_cc |= oldEM;
                                                m_freem(m0);
                                                return(error);
                                                cb->s_cc |= oldEM;
                                                m_freem(m0);
                                                return(error);
@@ -1449,10 +1450,10 @@ spp_usrreq(so, req, m, nam, rights, controlp)
                /* fall into */
        case PRU_SEND:
                if (controlp) {
                /* fall into */
        case PRU_SEND:
                if (controlp) {
-                       u_short *s = mtod(controlp, u_short *);
+                       u_short *p = mtod(controlp, u_short *);
                        spp_newchecks[2]++;
                        spp_newchecks[2]++;
-                       if ((s[0] == 5) && s[1] == 1 ) { /* XXXX, for testing */
-                               cb->s_shdr.sp_dt = *(u_char *)(&s[2]);
+                       if ((p[0] == 5) && p[1] == 1) { /* XXXX, for testing */
+                               cb->s_shdr.sp_dt = *(u_char *)(&p[2]);
                                spp_newchecks[3]++;
                        }
                }
                                spp_newchecks[3]++;
                        }
                }
@@ -1666,7 +1667,8 @@ spp_slowtimo()
                        if (cb->s_timer[i] && --cb->s_timer[i] == 0) {
                                (void) spp_usrreq(cb->s_nspcb->nsp_socket,
                                    PRU_SLOWTIMO, (struct mbuf *)0,
                        if (cb->s_timer[i] && --cb->s_timer[i] == 0) {
                                (void) spp_usrreq(cb->s_nspcb->nsp_socket,
                                    PRU_SLOWTIMO, (struct mbuf *)0,
-                                   (struct mbuf *)i, (struct mbuf *)0);
+                                   (struct mbuf *)i, (struct mbuf *)0,
+                                   (struct mbuf *)0);
                                if (ipnxt->nsp_prev != ip)
                                        goto tpgone;
                        }
                                if (ipnxt->nsp_prev != ip)
                                        goto tpgone;
                        }
index 6360edc..ba7de44 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.
  *
- *     @(#)spp_var.h   7.5 (Berkeley) %G%
+ *     @(#)spp_var.h   7.6 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -90,6 +90,9 @@ struct sppcb {
        u_short s_want;                 /* Last candidate for sending */
        char    s_outx;                 /* exit taken from spp_output */
        char    s_inx;                  /* exit taken from spp_input */
        u_short s_want;                 /* Last candidate for sending */
        char    s_outx;                 /* exit taken from spp_output */
        char    s_inx;                  /* exit taken from spp_input */
+       u_short s_flags2;               /* more flags for testing */
+#define SF_NEWCALL     0x100           /* for new_recvmsg */
+#define SO_NEWCALL     10              /* for new_recvmsg */
 };
 
 #define        nstosppcb(np)   ((struct sppcb *)(np)->nsp_pcb)
 };
 
 #define        nstosppcb(np)   ((struct sppcb *)(np)->nsp_pcb)