1*23743Skarels /* 2*23743Skarels * @(#)raw_hy.c 6.1 06/24/85 3*23743Skarels * 4*23743Skarels * 4.2 BSD Unix kernel - NSC HYPERchannel support 5*23743Skarels * NEEDS WORK FOR 4.3 6*23743Skarels * 7*23743Skarels * $Header: raw_hy.c,v 3.1 84/02/15 04:27:44 steveg Exp $ 8*23743Skarels * $Locker: $ 9*23743Skarels * 10*23743Skarels * Copyright (c) 1984, Tektronix Inc. 11*23743Skarels * All Rights Reserved 12*23743Skarels * 13*23743Skarels */ 14*23743Skarels 15*23743Skarels 16*23743Skarels #include "param.h" 17*23743Skarels #include "mbuf.h" 18*23743Skarels #include "socket.h" 19*23743Skarels #include "protosw.h" 20*23743Skarels #include "socketvar.h" 21*23743Skarels #include "errno.h" 22*23743Skarels 23*23743Skarels #include "../net/if.h" 24*23743Skarels #include "../net/route.h" 25*23743Skarels #include "../net/raw_cb.h" 26*23743Skarels 27*23743Skarels #include "../netinet/in.h" 28*23743Skarels #include "../netinet/in_systm.h" 29*23743Skarels #include "if_hy.h" 30*23743Skarels 31*23743Skarels /* 32*23743Skarels * Raw interface to HYPERchannel. 33*23743Skarels */ 34*23743Skarels 35*23743Skarels /* 36*23743Skarels * Generate HYPERchannel leader and pass packet to hyoutput. 37*23743Skarels * The user must create a skeletal leader in order to 38*23743Skarels * communicate message type, message subtype, etc. 39*23743Skarels * We don't really check the header supplied by the user. 40*23743Skarels */ 41*23743Skarels rhy_output(m, so) 42*23743Skarels register struct mbuf *m; 43*23743Skarels struct socket *so; 44*23743Skarels { 45*23743Skarels struct mbuf *n; 46*23743Skarels int error = 0; 47*23743Skarels register struct sockaddr_in *sin; 48*23743Skarels register struct rawcb *rp = sotorawcb(so); 49*23743Skarels struct ifnet *ifp; 50*23743Skarels 51*23743Skarels /* 52*23743Skarels * Verify user has supplied necessary space 53*23743Skarels * for the header. 54*23743Skarels */ 55*23743Skarels if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct hym_hdr)) && 56*23743Skarels (m = m_pullup(m, sizeof(struct hym_hdr))) == 0) { 57*23743Skarels error = EMSGSIZE; /* XXX */ 58*23743Skarels goto bad; 59*23743Skarels } 60*23743Skarels 61*23743Skarels sin = (struct sockaddr_in *)&rp->rcb_faddr; 62*23743Skarels /* no routing here */ 63*23743Skarels ifp = if_ifonnetof((int)sin->sin_addr.s_net); 64*23743Skarels if (ifp) 65*23743Skarels return (hyoutput(ifp, m, (struct sockaddr *)sin)); 66*23743Skarels error = ENETUNREACH; 67*23743Skarels bad: 68*23743Skarels m_freem(m); 69*23743Skarels return (error); 70*23743Skarels } 71