xref: /csrg-svn/sys/net/raw_cb.c (revision 56529)
123160Smckusick /*
229066Smckusick  * Copyright (c) 1980, 1986 Regents of the University of California.
333183Sbostic  * All rights reserved.
423160Smckusick  *
544465Sbostic  * %sccs.include.redist.c%
633183Sbostic  *
7*56529Sbostic  *	@(#)raw_cb.c	7.13 (Berkeley) 10/11/92
823160Smckusick  */
95635Sroot 
10*56529Sbostic #include <sys/param.h>
11*56529Sbostic #include <sys/systm.h>
12*56529Sbostic #include <sys/mbuf.h>
13*56529Sbostic #include <sys/socket.h>
14*56529Sbostic #include <sys/socketvar.h>
15*56529Sbostic #include <sys/domain.h>
16*56529Sbostic #include <sys/protosw.h>
17*56529Sbostic #include <sys/errno.h>
1810890Ssam 
19*56529Sbostic #include <net/if.h>
20*56529Sbostic #include <net/route.h>
21*56529Sbostic #include <net/raw_cb.h>
22*56529Sbostic #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  */
4021769Skarels raw_attach(so, proto)
415635Sroot 	register struct socket *so;
4221769Skarels 	int proto;
435635Sroot {
4437472Ssklower 	register struct rawcb *rp = sotorawcb(so);
4544413Skarels 	int error;
465635Sroot 
4737472Ssklower 	/*
4837472Ssklower 	 * It is assumed that raw_attach is called
4937472Ssklower 	 * after space has been allocated for the
5037472Ssklower 	 * rawcb.
5137472Ssklower 	 */
5237472Ssklower 	if (rp == 0)
535635Sroot 		return (ENOBUFS);
5444413Skarels 	if (error = soreserve(so, raw_sendspace, raw_recvspace))
5544413Skarels 		return (error);
565635Sroot 	rp->rcb_socket = so;
5721769Skarels 	rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
5821769Skarels 	rp->rcb_proto.sp_protocol = proto;
5921769Skarels 	insque(rp, &rawcb);
605635Sroot 	return (0);
615635Sroot }
625635Sroot 
635635Sroot /*
645635Sroot  * Detach the raw connection block and discard
655635Sroot  * socket resources.
665635Sroot  */
675635Sroot raw_detach(rp)
685635Sroot 	register struct rawcb *rp;
695635Sroot {
705635Sroot 	struct socket *so = rp->rcb_socket;
715635Sroot 
725635Sroot 	so->so_pcb = 0;
735635Sroot 	sofree(so);
745635Sroot 	remque(rp);
7537472Ssklower #ifdef notdef
7637472Ssklower 	if (rp->rcb_laddr)
7737472Ssklower 		m_freem(dtom(rp->rcb_laddr));
7837472Ssklower 	rp->rcb_laddr = 0;
7937472Ssklower #endif
8037472Ssklower 	free((caddr_t)(rp), M_PCB);
815635Sroot }
825635Sroot 
835635Sroot /*
845635Sroot  * Disconnect and possibly release resources.
855635Sroot  */
865635Sroot raw_disconnect(rp)
875635Sroot 	struct rawcb *rp;
885635Sroot {
898975Sroot 
9037472Ssklower #ifdef notdef
9137472Ssklower 	if (rp->rcb_faddr)
9237472Ssklower 		m_freem(dtom(rp->rcb_faddr));
9337472Ssklower 	rp->rcb_faddr = 0;
9437472Ssklower #endif
957517Sroot 	if (rp->rcb_socket->so_state & SS_NOFDREF)
965635Sroot 		raw_detach(rp);
975635Sroot }
985635Sroot 
9937472Ssklower #ifdef notdef
1008394Swnj raw_bind(so, nam)
1018394Swnj 	register struct socket *so;
1028394Swnj 	struct mbuf *nam;
1038394Swnj {
1048394Swnj 	struct sockaddr *addr = mtod(nam, struct sockaddr *);
1058394Swnj 	register struct rawcb *rp;
1068394Swnj 
1078394Swnj 	if (ifnet == 0)
1088394Swnj 		return (EADDRNOTAVAIL);
1099184Ssam 	rp = sotorawcb(so);
11037472Ssklower 	nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
11137472Ssklower 	rp->rcb_laddr = mtod(nam, struct sockaddr *);
1128394Swnj 	return (0);
1138394Swnj }
11437472Ssklower #endif
115