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