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