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