X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/ee7873401e686a0eb45d334385c26708ef8a23f0..5548a02fb5c1a0399f9e8d8d90b4a0370bea6070:/usr/src/sys/net/raw_cb.c diff --git a/usr/src/sys/net/raw_cb.c b/usr/src/sys/net/raw_cb.c index 7cd10fdc3a..b46b003808 100644 --- a/usr/src/sys/net/raw_cb.c +++ b/usr/src/sys/net/raw_cb.c @@ -1,17 +1,25 @@ -/* raw_cb.c 4.6 82/03/28 */ +/* + * Copyright (c) 1980, 1986 Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + * + * @(#)raw_cb.c 7.13 (Berkeley) %G% + */ -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/mbuf.h" -#include "../h/socket.h" -#include "../h/socketvar.h" -#include "../h/mtpr.h" -#include "../net/in.h" -#include "../net/in_systm.h" -#include "../net/if.h" -#include "../net/raw_cb.h" -#include "../net/pup.h" -#include "../errno.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include /* * Routines to manage the raw protocol control blocks. @@ -22,78 +30,34 @@ * redo address binding to allow wildcards */ +u_long raw_sendspace = RAWSNDQ; +u_long raw_recvspace = RAWRCVQ; + /* * Allocate a control block and a nominal amount * of buffer space for the socket. */ -raw_attach(so, addr) +raw_attach(so, proto) register struct socket *so; - struct sockaddr *addr; + int proto; { - struct mbuf *m; - register struct rawcb *rp; + register struct rawcb *rp = sotorawcb(so); + int error; -COUNT(RAW_ATTACH); - if (ifnet == 0) - return (EADDRNOTAVAIL); /* - * Should we verify address not already in use? - * Some say yes, others no. + * It is assumed that raw_attach is called + * after space has been allocated for the + * rawcb. */ - if (addr) switch (addr->sa_family) { - - case AF_IMPLINK: - case AF_INET: - if (((struct sockaddr_in *)addr)->sin_addr.s_addr && - if_ifwithaddr(addr) == 0) - return (EADDRNOTAVAIL); - break; - -#ifdef PUP - /* - * Curious, we convert PUP address format to internet - * to allow us to verify we're asking for an Ethernet - * interface. This is wrong, but things are heavily - * oriented towards the internet addressing scheme, and - * converting internet to PUP would be very expensive. - */ - case AF_PUP: { - struct sockaddr_pup *spup = (struct sockaddr_pup *)addr; - struct sockaddr_in inpup; - - bzero((caddr_t)&inpup, sizeof(inpup)); - inpup.sin_addr.s_net = spup->sp_net; - inpup.sin_addr.s_impno = spup->sp_host; - if (inpup.sin_addr.s_addr && - if_ifwithaddr((struct sockaddr *)&inpup) == 0) - return (EADDRNOTAVAIL); - break; - } -#endif - - default: - return (EAFNOSUPPORT); - } - m = m_getclr(M_DONTWAIT); - if (m == 0) + if (rp == 0) return (ENOBUFS); - if (sbreserve(&so->so_snd, RAWSNDQ) == 0) - goto bad; - if (sbreserve(&so->so_rcv, RAWRCVQ) == 0) - goto bad2; - rp = mtod(m, struct rawcb *); + if (error = soreserve(so, raw_sendspace, raw_recvspace)) + return (error); rp->rcb_socket = so; + rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family; + rp->rcb_proto.sp_protocol = proto; insque(rp, &rawcb); - so->so_pcb = (caddr_t)rp; - rp->rcb_pcb = 0; - if (addr) - bcopy((caddr_t)addr, (caddr_t)&so->so_addr, sizeof(*addr)); return (0); -bad2: - sbrelease(&so->so_snd); -bad: - (void) m_free(m); - return (ENOBUFS); } /* @@ -105,11 +69,15 @@ raw_detach(rp) { struct socket *so = rp->rcb_socket; -COUNT(RAW_DETACH); so->so_pcb = 0; sofree(so); remque(rp); - (void) m_freem(dtom(rp)); +#ifdef notdef + if (rp->rcb_laddr) + m_freem(dtom(rp->rcb_laddr)); + rp->rcb_laddr = 0; +#endif + free((caddr_t)(rp), M_PCB); } /* @@ -118,21 +86,29 @@ COUNT(RAW_DETACH); raw_disconnect(rp) struct rawcb *rp; { -COUNT(RAW_DISCONNECT); - rp->rcb_flags &= ~RAW_ADDR; - if (rp->rcb_socket->so_state & SS_USERGONE) + +#ifdef notdef + if (rp->rcb_faddr) + m_freem(dtom(rp->rcb_faddr)); + rp->rcb_faddr = 0; +#endif + if (rp->rcb_socket->so_state & SS_NOFDREF) raw_detach(rp); } -/* - * Associate a peer's address with a - * raw connection block. - */ -raw_connaddr(rp, addr) - struct rawcb *rp; - struct sockaddr *addr; +#ifdef notdef +raw_bind(so, nam) + register struct socket *so; + struct mbuf *nam; { -COUNT(RAW_CONNADDR); - bcopy((caddr_t)addr, (caddr_t)&rp->rcb_addr, sizeof(*addr)); - rp->rcb_flags |= RAW_ADDR; + struct sockaddr *addr = mtod(nam, struct sockaddr *); + register struct rawcb *rp; + + if (ifnet == 0) + return (EADDRNOTAVAIL); + rp = sotorawcb(so); + nam = m_copym(nam, 0, M_COPYALL, M_WAITOK); + rp->rcb_laddr = mtod(nam, struct sockaddr *); + return (0); } +#endif