xref: /csrg-svn/sys/net/raw_cb.c (revision 44465)
123160Smckusick /*
229066Smckusick  * Copyright (c) 1980, 1986 Regents of the University of California.
333183Sbostic  * All rights reserved.
423160Smckusick  *
5*44465Sbostic  * %sccs.include.redist.c%
633183Sbostic  *
7*44465Sbostic  *	@(#)raw_cb.c	7.11 (Berkeley) 06/28/90
823160Smckusick  */
95635Sroot 
1017066Sbloom #include "param.h"
1117066Sbloom #include "systm.h"
1217066Sbloom #include "mbuf.h"
1317066Sbloom #include "socket.h"
1417066Sbloom #include "socketvar.h"
1521769Skarels #include "domain.h"
1621769Skarels #include "protosw.h"
1717066Sbloom #include "errno.h"
1810890Ssam 
1917066Sbloom #include "if.h"
2017066Sbloom #include "route.h"
2117066Sbloom #include "raw_cb.h"
2212783Ssam #include "../netinet/in.h"
235635Sroot 
2437500Smckusick #include "machine/mtpr.h"
2510890Ssam 
265635Sroot /*
275635Sroot  * Routines to manage the raw protocol control blocks.
285635Sroot  *
295635Sroot  * TODO:
305635Sroot  *	hash lookups by protocol family/protocol + address family
316339Ssam  *	take care of unique address problems per AF?
326045Swnj  *	redo address binding to allow wildcards
335635Sroot  */
345635Sroot 
3536823Skarels u_long	raw_sendspace = RAWSNDQ;
3636823Skarels u_long	raw_recvspace = RAWRCVQ;
3736823Skarels 
385635Sroot /*
395635Sroot  * Allocate a control block and a nominal amount
405635Sroot  * of buffer space for the socket.
415635Sroot  */
4221769Skarels raw_attach(so, proto)
435635Sroot 	register struct socket *so;
4421769Skarels 	int proto;
455635Sroot {
4637472Ssklower 	register struct rawcb *rp = sotorawcb(so);
4744413Skarels 	int error;
485635Sroot 
4937472Ssklower 	/*
5037472Ssklower 	 * It is assumed that raw_attach is called
5137472Ssklower 	 * after space has been allocated for the
5237472Ssklower 	 * rawcb.
5337472Ssklower 	 */
5437472Ssklower 	if (rp == 0)
555635Sroot 		return (ENOBUFS);
5644413Skarels 	if (error = soreserve(so, raw_sendspace, raw_recvspace))
5744413Skarels 		return (error);
585635Sroot 	rp->rcb_socket = so;
5921769Skarels 	rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
6021769Skarels 	rp->rcb_proto.sp_protocol = proto;
6121769Skarels 	insque(rp, &rawcb);
625635Sroot 	return (0);
635635Sroot }
645635Sroot 
655635Sroot /*
665635Sroot  * Detach the raw connection block and discard
675635Sroot  * socket resources.
685635Sroot  */
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  */
885635Sroot raw_disconnect(rp)
895635Sroot 	struct rawcb *rp;
905635Sroot {
918975Sroot 
9237472Ssklower #ifdef notdef
9337472Ssklower 	if (rp->rcb_faddr)
9437472Ssklower 		m_freem(dtom(rp->rcb_faddr));
9537472Ssklower 	rp->rcb_faddr = 0;
9637472Ssklower #endif
977517Sroot 	if (rp->rcb_socket->so_state & SS_NOFDREF)
985635Sroot 		raw_detach(rp);
995635Sroot }
1005635Sroot 
10137472Ssklower #ifdef notdef
1028394Swnj raw_bind(so, nam)
1038394Swnj 	register struct socket *so;
1048394Swnj 	struct mbuf *nam;
1058394Swnj {
1068394Swnj 	struct sockaddr *addr = mtod(nam, struct sockaddr *);
1078394Swnj 	register struct rawcb *rp;
1088394Swnj 
1098394Swnj 	if (ifnet == 0)
1108394Swnj 		return (EADDRNOTAVAIL);
1119184Ssam 	rp = sotorawcb(so);
11237472Ssklower 	nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
11337472Ssklower 	rp->rcb_laddr = mtod(nam, struct sockaddr *);
1148394Swnj 	return (0);
1158394Swnj }
11637472Ssklower #endif
117