xref: /csrg-svn/sys/net/raw_cb.c (revision 63211)
123160Smckusick /*
2*63211Sbostic  * Copyright (c) 1980, 1986, 1993
3*63211Sbostic  *	The Regents of the University of California.  All rights reserved.
423160Smckusick  *
544465Sbostic  * %sccs.include.redist.c%
633183Sbostic  *
7*63211Sbostic  *	@(#)raw_cb.c	8.1 (Berkeley) 06/10/93
823160Smckusick  */
95635Sroot 
1056529Sbostic #include <sys/param.h>
1156529Sbostic #include <sys/systm.h>
1256529Sbostic #include <sys/mbuf.h>
1356529Sbostic #include <sys/socket.h>
1456529Sbostic #include <sys/socketvar.h>
1556529Sbostic #include <sys/domain.h>
1656529Sbostic #include <sys/protosw.h>
1756529Sbostic #include <sys/errno.h>
1810890Ssam 
1956529Sbostic #include <net/if.h>
2056529Sbostic #include <net/route.h>
2156529Sbostic #include <net/raw_cb.h>
2256529Sbostic #include <netinet/in.h>
235635Sroot 
245635Sroot /*
255635Sroot  * Routines to manage the raw protocol control blocks.
265635Sroot  *
275635Sroot  * TODO:
285635Sroot  *	hash lookups by protocol family/protocol + address family
296339Ssam  *	take care of unique address problems per AF?
306045Swnj  *	redo address binding to allow wildcards
315635Sroot  */
325635Sroot 
3336823Skarels u_long	raw_sendspace = RAWSNDQ;
3436823Skarels u_long	raw_recvspace = RAWRCVQ;
3536823Skarels 
365635Sroot /*
375635Sroot  * Allocate a control block and a nominal amount
385635Sroot  * of buffer space for the socket.
395635Sroot  */
4061359Sbostic int
raw_attach(so,proto)4121769Skarels raw_attach(so, proto)
425635Sroot 	register struct socket *so;
4321769Skarels 	int proto;
445635Sroot {
4537472Ssklower 	register struct rawcb *rp = sotorawcb(so);
4644413Skarels 	int error;
475635Sroot 
4837472Ssklower 	/*
4937472Ssklower 	 * It is assumed that raw_attach is called
5037472Ssklower 	 * after space has been allocated for the
5137472Ssklower 	 * rawcb.
5237472Ssklower 	 */
5337472Ssklower 	if (rp == 0)
545635Sroot 		return (ENOBUFS);
5544413Skarels 	if (error = soreserve(so, raw_sendspace, raw_recvspace))
5644413Skarels 		return (error);
575635Sroot 	rp->rcb_socket = so;
5821769Skarels 	rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
5921769Skarels 	rp->rcb_proto.sp_protocol = proto;
6021769Skarels 	insque(rp, &rawcb);
615635Sroot 	return (0);
625635Sroot }
635635Sroot 
645635Sroot /*
655635Sroot  * Detach the raw connection block and discard
665635Sroot  * socket resources.
675635Sroot  */
6861359Sbostic void
raw_detach(rp)695635Sroot raw_detach(rp)
705635Sroot 	register struct rawcb *rp;
715635Sroot {
725635Sroot 	struct socket *so = rp->rcb_socket;
735635Sroot 
745635Sroot 	so->so_pcb = 0;
755635Sroot 	sofree(so);
765635Sroot 	remque(rp);
7737472Ssklower #ifdef notdef
7837472Ssklower 	if (rp->rcb_laddr)
7937472Ssklower 		m_freem(dtom(rp->rcb_laddr));
8037472Ssklower 	rp->rcb_laddr = 0;
8137472Ssklower #endif
8237472Ssklower 	free((caddr_t)(rp), M_PCB);
835635Sroot }
845635Sroot 
855635Sroot /*
865635Sroot  * Disconnect and possibly release resources.
875635Sroot  */
8861359Sbostic void
raw_disconnect(rp)895635Sroot raw_disconnect(rp)
905635Sroot 	struct rawcb *rp;
915635Sroot {
928975Sroot 
9337472Ssklower #ifdef notdef
9437472Ssklower 	if (rp->rcb_faddr)
9537472Ssklower 		m_freem(dtom(rp->rcb_faddr));
9637472Ssklower 	rp->rcb_faddr = 0;
9737472Ssklower #endif
987517Sroot 	if (rp->rcb_socket->so_state & SS_NOFDREF)
995635Sroot 		raw_detach(rp);
1005635Sroot }
1015635Sroot 
10237472Ssklower #ifdef notdef
10361359Sbostic int
raw_bind(so,nam)1048394Swnj raw_bind(so, nam)
1058394Swnj 	register struct socket *so;
1068394Swnj 	struct mbuf *nam;
1078394Swnj {
1088394Swnj 	struct sockaddr *addr = mtod(nam, struct sockaddr *);
1098394Swnj 	register struct rawcb *rp;
1108394Swnj 
1118394Swnj 	if (ifnet == 0)
1128394Swnj 		return (EADDRNOTAVAIL);
1139184Ssam 	rp = sotorawcb(so);
11437472Ssklower 	nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
11537472Ssklower 	rp->rcb_laddr = mtod(nam, struct sockaddr *);
1168394Swnj 	return (0);
1178394Swnj }
11837472Ssklower #endif
119