xref: /csrg-svn/sys/vax/if/raw_hy.c (revision 23743)
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