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