localize header files
[unix-history] / usr / src / sys / deprecated / netimp / raw_imp.c
index d29c004..02b7532 100644 (file)
@@ -1,28 +1,21 @@
-/*     raw_imp.c       4.2     82/02/01        */
+/*     raw_imp.c       4.13    82/10/09        */
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/protosw.h"
 #include "../h/socketvar.h"
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/protosw.h"
 #include "../h/socketvar.h"
-#include "../net/in.h"
-#include "../net/in_systm.h"
+#include "../netinet/in.h"
+#include "../netinet/in_systm.h"
 #include "../net/if.h"
 #include "../net/if.h"
-#include "../net/if_imp.h"
+#include "../netimp/if_imp.h"
 #include "../net/raw_cb.h"
 #include "../net/raw_cb.h"
-#include "/usr/include/errno.h"
+#include <errno.h>
 
 /*
  * Raw interface to IMP.
  */
 
 
 /*
  * Raw interface to IMP.
  */
 
-/*ARGSUSED*/
-imp_ctlinput(m)
-       struct mbuf *m;
-{
-COUNT(IMP_CTLINPUT);
-}
-
 /*
  * Generate IMP leader and pass packet to impoutput.
  * The user must create a skeletal leader in order to
 /*
  * Generate IMP leader and pass packet to impoutput.
  * The user must create a skeletal leader in order to
@@ -30,30 +23,46 @@ COUNT(IMP_CTLINPUT);
  * We fill in holes where needed and verify parameters
  * supplied by user.
  */
  * We fill in holes where needed and verify parameters
  * supplied by user.
  */
-imp_output(m, so)              /* too close to impoutput */
+rimp_output(m, so)
        register struct mbuf *m;
        struct socket *so;
 {
        struct mbuf *n;
        register struct mbuf *m;
        struct socket *so;
 {
        struct mbuf *n;
-       int len;
+       int len, error = 0;
        register struct imp_leader *ip;
        register struct sockaddr_in *sin;
        register struct rawcb *rp = sotorawcb(so);
        register struct imp_leader *ip;
        register struct sockaddr_in *sin;
        register struct rawcb *rp = sotorawcb(so);
+       struct ifnet *ifp;
+       struct control_leader *cp;
 
 
-COUNT(IMP_OUTPUT);
        /*
         * Verify user has supplied necessary space
         * for the leader and check parameters in it.
         */
        /*
         * Verify user has supplied necessary space
         * for the leader and check parameters in it.
         */
-       if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct imp_leader)) &&
-           (m = m_pullup(m, sizeof(struct imp_leader))) == 0)
+       if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct control_leader)) &&
+           (m = m_pullup(m, sizeof(struct control_leader))) == 0) {
+               error = EMSGSIZE;       /* XXX */
                goto bad;
                goto bad;
+       }
+       cp = mtod(m, struct control_leader *);
+       if (cp->dl_mtype == IMPTYPE_DATA)
+               if (m->m_len < sizeof(struct imp_leader) &&
+                   (m = m_pullup(m, sizeof(struct imp_leader))) == 0) {
+                       error = EMSGSIZE;       /* XXX */
+                       goto bad;
+               }
        ip = mtod(m, struct imp_leader *);
        ip = mtod(m, struct imp_leader *);
-       if (ip->il_format != IMP_NFF)
+       if (ip->il_format != IMP_NFF) {
+               error = EMSGSIZE;               /* XXX */
                goto bad;
                goto bad;
+       }
+#ifdef notdef
        if (ip->il_link != IMPLINK_IP &&
        if (ip->il_link != IMPLINK_IP &&
-           (ip->il_link < IMPLINK_LOWEXPER || ip->il_link > IMPLINK_HIGHEXPER))
+           (ip->il_link<IMPLINK_LOWEXPER || ip->il_link>IMPLINK_HIGHEXPER)) {
+               error = EPERM;
                goto bad;
                goto bad;
+       }
+#endif
 
        /*
         * Fill in IMP leader -- impoutput refrains from rebuilding
 
        /*
         * Fill in IMP leader -- impoutput refrains from rebuilding
@@ -62,63 +71,21 @@ COUNT(IMP_OUTPUT);
         */
        for (len = 0, n = m; n; n = n->m_next)
                len += n->m_len;
         */
        for (len = 0, n = m; n; n = n->m_next)
                len += n->m_len;
-       ip->il_length = len << 3;
-       sin = (struct sockaddr_in *)&rp->rcb_addr;
+       ip->il_length = htons((u_short)(len << 3));
+       sin = (struct sockaddr_in *)&rp->rcb_faddr;
+#ifdef notdef
        ip->il_network = sin->sin_addr.s_net;
        ip->il_network = sin->sin_addr.s_net;
+#else
+       ip->il_network = 0;
+#endif
        ip->il_host = sin->sin_addr.s_host;
        ip->il_imp = sin->sin_addr.s_imp;
        ip->il_host = sin->sin_addr.s_host;
        ip->il_imp = sin->sin_addr.s_imp;
-
-       return (impoutput((struct ifnet *)rp->rcb_pcb, m, PF_IMPLINK));
-
+       /* no routing here */
+       ifp = if_ifonnetof(sin->sin_addr.s_net);
+       if (ifp)
+               return (impoutput(ifp, m, (struct sockaddr *)sin));
+       error = ENETUNREACH;
 bad:
        m_freem(m);
 bad:
        m_freem(m);
-       return (0);
-}
-
-/*
- * Intercept operations required to
- * maintain interface pointer used on output.
- */
-imp_usrreq(so, req, m, addr)
-       struct socket *so;
-       int req;
-       struct mbuf *m;
-       caddr_t addr;
-{
-       register struct rawcb *rp = sotorawcb(so);
-
-COUNT(IMP_USRREQ);
-       if (rp == 0 && req != PRU_ATTACH)
-               return (EINVAL);
-
-       switch (req) {
-
-       /*
-        * Verify address has an interface to go with it
-        * and record information for use in output routine.
-        */
-       case PRU_SEND:
-       case PRU_CONNECT: {
-               register struct sockaddr_in *sin;
-               register struct ifnet *ifp;
-
-               sin = (struct sockaddr_in *)addr;
-               ifp = if_ifonnetof(sin->sin_addr);
-               if (ifp == 0) {
-                       ifp = if_gatewayfor(sin->sin_addr);
-                       if (ifp == 0)
-                               return (EADDRNOTAVAIL); /* XXX */
-               }
-               rp->rcb_pcb = (caddr_t)ifp;
-               break;
-               }
-
-       case PRU_DISCONNECT:
-               rp->rcb_pcb = 0;
-               break;
-
-       case PRU_CONTROL:
-               return (EOPNOTSUPP);
-       }
-       return (raw_usrreq(so, req, m, addr));
+       return (error);
 }
 }