123160Smckusick /* 229066Smckusick * Copyright (c) 1980, 1986 Regents of the University of California. 333183Sbostic * All rights reserved. 423160Smckusick * 544465Sbostic * %sccs.include.redist.c% 633183Sbostic * 7*61359Sbostic * @(#)raw_cb.c 7.14 (Berkeley) 06/04/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 */ 40*61359Sbostic int 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 */ 68*61359Sbostic void 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 */ 88*61359Sbostic void 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 103*61359Sbostic int 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