-/* raw_cb.c 4.17 83/05/27 */
-
-#include "../h/param.h"
-#include "../h/systm.h"
-#include "../h/mbuf.h"
-#include "../h/socket.h"
-#include "../h/socketvar.h"
-#include "../h/errno.h"
+/*
+ * 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 "../net/if.h"
-#include "../net/raw_cb.h"
-#include "../netinet/in.h"
-#include "../netpup/pup.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/domain.h>
+#include <sys/protosw.h>
+#include <sys/errno.h>
-#include "../vax/mtpr.h"
+#include <net/if.h>
+#include <net/route.h>
+#include <net/raw_cb.h>
+#include <netinet/in.h>
/*
* Routines to manage the raw protocol control blocks.
* 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)
+raw_attach(so, proto)
register struct socket *so;
+ int proto;
{
- struct mbuf *m;
- register struct rawcb *rp;
+ register struct rawcb *rp = sotorawcb(so);
+ int error;
- m = m_getclr(M_DONTWAIT, MT_PCB);
- if (m == 0)
+ /*
+ * It is assumed that raw_attach is called
+ * after space has been allocated for the
+ * rawcb.
+ */
+ 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;
return (0);
-bad2:
- sbrelease(&so->so_snd);
-bad:
- (void) m_free(m);
- return (ENOBUFS);
}
/*
so->so_pcb = 0;
sofree(so);
remque(rp);
- 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);
}
/*
struct rawcb *rp;
{
- rp->rcb_flags &= ~RAW_FADDR;
+#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);
}
+#ifdef notdef
raw_bind(so, nam)
register struct socket *so;
struct mbuf *nam;
if (ifnet == 0)
return (EADDRNOTAVAIL);
-/* BEGIN DUBIOUS */
- /*
- * Should we verify address not already in use?
- * Some say yes, others no.
- */
- switch (addr->sa_family) {
-
-#ifdef INET
- case AF_IMPLINK:
- case AF_INET: {
- if (((struct sockaddr_in *)addr)->sin_addr.s_addr &&
- if_ifwithaddr(addr) == 0)
- return (EADDRNOTAVAIL);
- break;
- }
-#endif
-
-#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, (unsigned)sizeof(inpup));
- inpup.sin_family = AF_INET;
- 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);
- }
-/* END DUBIOUS */
rp = sotorawcb(so);
- bcopy((caddr_t)addr, (caddr_t)&rp->rcb_laddr, sizeof (*addr));
- rp->rcb_flags |= RAW_LADDR;
+ nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
+ rp->rcb_laddr = mtod(nam, struct sockaddr *);
return (0);
}
-
-/*
- * Associate a peer's address with a
- * raw connection block.
- */
-raw_connaddr(rp, nam)
- struct rawcb *rp;
- struct mbuf *nam;
-{
- struct sockaddr *addr = mtod(nam, struct sockaddr *);
-
- bcopy((caddr_t)addr, (caddr_t)&rp->rcb_faddr, sizeof(*addr));
- rp->rcb_flags |= RAW_FADDR;
-}
+#endif