# 2.11BSD#431 - /usr/src/sys/netimp/raw_imp.c

##### Functions

    rimp_output       X

       1: /*
       2:  * Copyright (c) 1986 Regents of the University of California.
       3:  * All rights reserved.  The Berkeley software License Agreement
       4:  * specifies the terms and conditions for redistribution.
       5:  *
       6:  *	@(#)raw_imp.c	1.1 (2.10BSD Berkeley) 12/1/86
       7:  */
       8:
       9: #include "imp.h"
      10: #if NIMP > 0
      11:
      12: #include "param.h"
      13: #include "mbuf.h"
      14: #include "domain.h"
      15: #include "protosw.h"
      16: #include "socket.h"
      17: #include "socketvar.h"
      18: #include <net/if.h>
      19: #include <net/route.h>
      20: #include <net/raw_cb.h>
      21: #include <netinet/in.h>
      22: #include <netinet/in_systm.h>
      23: #include <netinet/in_var.h>
      24: #include <netimp/if_imp.h>
      25: #include <errno.h>
      26:
      27: /*
      28:  * Raw interface to IMP.
      29:  */
      30:
      31: /*
      32:  * Generate IMP leader and pass packet to impoutput.
      33:  * The user must create a skeletal leader in order to
      34:  * communicate message type, message subtype, etc.
      35:  * We fill in holes where needed and verify parameters
      36:  * supplied by user.
      37:  */
      38: rimp_output(m, so)
      39:     register struct mbuf *m;
      40:     struct socket *so;
      41: {
      42:     struct mbuf *n;
      43:     int len, error = 0;
      44:     register struct imp_leader *ip;
      45:     register struct sockaddr_in *sin;
      46:     register struct rawcb *rp = sotorawcb(so);
      47:     struct in_ifaddr *ia;
      48:     struct control_leader *cp;
      49:
      50:     /*
      51: 	 * Verify user has supplied necessary space
      52: 	 * for the leader and check parameters in it.
      53: 	 */
      54:     if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct control_leader)) &&
      55:         (m = m_pullup(m, sizeof(struct control_leader))) == 0) {
      56:         error = EMSGSIZE;   /* XXX */
      57:         goto bad;
      58:     }
      59:     cp = mtod(m, struct control_leader *);
      60:     if (cp->dl_mtype == IMPTYPE_DATA)
      61:         if (m->m_len < sizeof(struct imp_leader) &&
      62:             (m = m_pullup(m, sizeof(struct imp_leader))) == 0) {
      63:             error = EMSGSIZE;   /* XXX */
      64:             goto bad;
      65:         }
      66:     ip = mtod(m, struct imp_leader *);
      67:     if (ip->il_format != IMP_NFF) {
      68:         error = EMSGSIZE;       /* XXX */
      69:         goto bad;
      70:     }
      71: #ifdef notdef
      72:     if (UCHAR(ip->il_link) != IMPLINK_IP &&
      73:         (UCHAR(ip->il_link)<IMPLINK_LOWEXPER || UCHAR(ip->il_link)>IMPLINK_HIGHEXPER)) {
      74:         error = EPERM;
      75:         goto bad;
      76:     }
      77: #endif
      78:
      79:     /*
      80: 	 * Fill in IMP leader -- impoutput refrains from rebuilding
      81: 	 * the leader when it sees the protocol family PF_IMPLINK.
      82: 	 * (message size calculated by walking through mbuf's)
      83: 	 */
      84:     for (len = 0, n = m; n; n = n->m_next)
      85:         len += n->m_len;
      86:     ip->il_length = htons((u_short)(len << 3));
      87:     sin = (struct sockaddr_in *)&rp->rcb_faddr;
      88:     imp_addr_to_leader(ip, sin->sin_addr.s_addr);   /* BRL */
      89:     /* no routing here */
      90:     ia = in_iaonnetof(in_netof(sin->sin_addr));
      91:     if (ia)
      92:         return (impoutput(ia->ia_ifp, m, (struct sockaddr *)sin));
      93:     error = ENETUNREACH;
      94: bad:
      95:     m_freem(m);
      96:     return (error);
      97: }
      98: #endif

#### Defined functions

rimp_output defined in line 38; never used

Last modified: 1988-01-26 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1235 |