changes for var. length sockaddrs, routing lookup changes,
[unix-history] / usr / src / sys / netns / idp_usrreq.c
index 79792fc..e2278d9 100644 (file)
@@ -1,14 +1,26 @@
 /*
 /*
- * Copyright (c) 1984, 1985, 1986 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1984, 1985, 1986, 1987 Regents of the University of California.
+ * All rights reserved.
  *
  *
- *      @(#)idp_usrreq.c       7.1 (Berkeley) %G%
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *     @(#)idp_usrreq.c        7.6 (Berkeley) %G%
  */
 
 #include "param.h"
 #include "dir.h"
 #include "user.h"
  */
 
 #include "param.h"
 #include "dir.h"
 #include "user.h"
+#include "malloc.h"
 #include "mbuf.h"
 #include "protosw.h"
 #include "socket.h"
 #include "mbuf.h"
 #include "protosw.h"
 #include "socket.h"
  * 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.
  */
-idp_input(m, nsp, ifp)
+idp_input(m, nsp)
        struct mbuf *m;
        register struct nspcb *nsp;
        struct mbuf *m;
        register struct nspcb *nsp;
-       struct ifnet *ifp;
 {
        register struct idp *idp = mtod(m, struct idp *);
 {
        register struct idp *idp = mtod(m, struct idp *);
+       struct ifnet *ifp = m->m_pkthdr.rcvif;
 
        if (nsp==0)
                panic("No nspcb");
 
        if (nsp==0)
                panic("No nspcb");
@@ -50,12 +62,12 @@ idp_input(m, nsp, ifp)
         */
        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;
                        }
                }
@@ -63,7 +75,8 @@ idp_input(m, nsp, ifp)
        nsp->nsp_rpt = idp->idp_pt;
        if ( ! (nsp->nsp_flags & NSP_RAWIN) ) {
                m->m_len -= sizeof (struct idp);
        nsp->nsp_rpt = idp->idp_pt;
        if ( ! (nsp->nsp_flags & NSP_RAWIN) ) {
                m->m_len -= sizeof (struct idp);
-               m->m_off += sizeof (struct idp);
+               m->m_pkthdr.len -= sizeof (struct idp);
+               m->m_data += sizeof (struct idp);
        }
        if (sbappendaddr(&nsp->nsp_socket->so_rcv, (struct sockaddr *)&idp_ns,
            m, (struct mbuf *)0) == 0)
        }
        if (sbappendaddr(&nsp->nsp_socket->so_rcv, (struct sockaddr *)&idp_ns,
            m, (struct mbuf *)0) == 0)
@@ -133,7 +146,8 @@ idp_output(nsp, m0)
        
        if (len & 1) {
                m = mprev;
        
        if (len & 1) {
                m = mprev;
-               if (m->m_len + m->m_off < MMAXOFF) {
+               if ((m->m_flags & M_EXT) == 0 &&
+                       (m->m_len + m->m_data < &m->m_dat[MLEN])) {
                        m->m_len++;
                } else {
                        struct mbuf *m1 = m_get(M_DONTWAIT, MT_DATA);
                        m->m_len++;
                } else {
                        struct mbuf *m1 = m_get(M_DONTWAIT, MT_DATA);
@@ -143,30 +157,23 @@ idp_output(nsp, m0)
                                return (ENOBUFS);
                        }
                        m1->m_len = 1;
                                return (ENOBUFS);
                        }
                        m1->m_len = 1;
-                       m1->m_off = MMAXOFF - 1;
                        * mtod(m1, char *) = 0;
                        m->m_next = m1;
                }
                        * mtod(m1, char *) = 0;
                        m->m_next = m1;
                }
+               m0->m_pkthdr.len++;
        }
 
        /*
         * Fill in mbuf with extended IDP header
         * and addresses and length put into network format.
         */
        }
 
        /*
         * Fill in mbuf with extended IDP header
         * and addresses and length put into network format.
         */
+       m = m0;
        if (nsp->nsp_flags & NSP_RAWOUT) {
        if (nsp->nsp_flags & NSP_RAWOUT) {
-               m = m0;
                idp = mtod(m, struct idp *);
        } else {
                idp = mtod(m, struct idp *);
        } else {
-               m = m_get(M_DONTWAIT, MT_HEADER);
-               if (m == 0) {
-                       m_freem(m0);
+               M_PREPEND(m, sizeof (struct idp), M_DONTWAIT);
+               if (m == 0)
                        return (ENOBUFS);
                        return (ENOBUFS);
-               }
-               m->m_off = MMAXOFF - sizeof (struct idp) - 2;
-                               /* adjust to start on longword bdry
-                                  for NSIP on gould */
-               m->m_len = sizeof (struct idp);
-               m->m_next = m0;
                idp = mtod(m, struct idp *);
                idp->idp_tc = 0;
                idp->idp_pt = nsp->nsp_dpt;
                idp = mtod(m, struct idp *);
                idp->idp_tc = 0;
                idp->idp_pt = nsp->nsp_dpt;
@@ -273,13 +280,11 @@ idp_ctloutput(req, so, level, name, value)
                        mask = NSP_RAWOUT;
                get_flags:
                        m->m_len = sizeof(short);
                        mask = NSP_RAWOUT;
                get_flags:
                        m->m_len = sizeof(short);
-                       m->m_off = MMAXOFF - sizeof(short);
                        *mtod(m, short *) = nsp->nsp_flags & mask;
                        break;
 
                case SO_DEFAULT_HEADERS:
                        m->m_len = sizeof(struct idp);
                        *mtod(m, short *) = nsp->nsp_flags & mask;
                        break;
 
                case SO_DEFAULT_HEADERS:
                        m->m_len = sizeof(struct idp);
-                       m->m_off = MMAXOFF - sizeof(struct idp);
                        {
                                register struct idp *idp = mtod(m, struct idp *);
                                idp->idp_len = 0;
                        {
                                register struct idp *idp = mtod(m, struct idp *);
                                idp->idp_len = 0;
@@ -293,7 +298,6 @@ idp_ctloutput(req, so, level, name, value)
 
                case SO_SEQNO:
                        m->m_len = sizeof(long);
 
                case SO_SEQNO:
                        m->m_len = sizeof(long);
-                       m->m_off = MMAXOFF - sizeof(long);
                        *mtod(m, long *) = ns_pexseq++;
                        break;
 
                        *mtod(m, long *) = ns_pexseq++;
                        break;
 
@@ -380,7 +384,7 @@ idp_usrreq(so, req, m, nam, rights)
                error = ns_pcballoc(so, &nspcb);
                if (error)
                        break;
                error = ns_pcballoc(so, &nspcb);
                if (error)
                        break;
-               error = soreserve(so, 2048, 2048);
+               error = soreserve(so, (u_long) 2048, (u_long) 2048);
                if (error)
                        break;
                break;
                if (error)
                        break;
                break;
@@ -531,7 +535,7 @@ idp_raw_usrreq(so, req, m, nam, rights)
                error = ns_pcballoc(so, &nsrawpcb);
                if (error)
                        break;
                error = ns_pcballoc(so, &nsrawpcb);
                if (error)
                        break;
-               error = soreserve(so, 2048, 2048);
+               error = soreserve(so, (u_long) 2048, (u_long) 2048);
                if (error)
                        break;
                nsp = sotonspcb(so);
                if (error)
                        break;
                nsp = sotonspcb(so);