raw_cb.c revision 29024
165865Siwasaki/*
265865Siwasaki * Copyright (c) 1980, 1986, 1993
365865Siwasaki *	The Regents of the University of California.  All rights reserved.
465865Siwasaki *
565865Siwasaki * Redistribution and use in source and binary forms, with or without
665865Siwasaki * modification, are permitted provided that the following conditions
765865Siwasaki * are met:
865865Siwasaki * 1. Redistributions of source code must retain the above copyright
965865Siwasaki *    notice, this list of conditions and the following disclaimer.
1065865Siwasaki * 2. Redistributions in binary form must reproduce the above copyright
1165865Siwasaki *    notice, this list of conditions and the following disclaimer in the
1265865Siwasaki *    documentation and/or other materials provided with the distribution.
1365865Siwasaki * 3. All advertising materials mentioning features or use of this software
1465865Siwasaki *    must display the following acknowledgement:
1565865Siwasaki *	This product includes software developed by the University of
1665865Siwasaki *	California, Berkeley and its contributors.
1765865Siwasaki * 4. Neither the name of the University nor the names of its contributors
1865865Siwasaki *    may be used to endorse or promote products derived from this software
1965865Siwasaki *    without specific prior written permission.
2065865Siwasaki *
2165865Siwasaki * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2265865Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2365865Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2465865Siwasaki * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2565865Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2665865Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2765865Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2865865Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2965865Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3065865Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3165865Siwasaki * SUCH DAMAGE.
3265865Siwasaki *
3365865Siwasaki *	@(#)raw_cb.c	8.1 (Berkeley) 6/10/93
3465865Siwasaki *	$Id: raw_cb.c,v 1.12 1997/04/27 20:00:58 wollman Exp $
3565865Siwasaki */
3665865Siwasaki
3765865Siwasaki#include <sys/param.h>
3865865Siwasaki#include <sys/queue.h>
3965865Siwasaki#include <sys/systm.h>
4065865Siwasaki#include <sys/malloc.h>
4165865Siwasaki#include <sys/mbuf.h>
4265865Siwasaki#include <sys/socket.h>
4365865Siwasaki#include <sys/socketvar.h>
4465865Siwasaki#include <sys/domain.h>
4565865Siwasaki#include <sys/protosw.h>
4665865Siwasaki#include <sys/errno.h>
4765865Siwasaki
4865865Siwasaki#include <net/if.h>
4965865Siwasaki#include <net/route.h>
5065865Siwasaki#include <net/raw_cb.h>
5165865Siwasaki#include <netinet/in.h>
5265865Siwasaki
5365865Siwasaki/*
5465865Siwasaki * Routines to manage the raw protocol control blocks.
5565865Siwasaki *
5665865Siwasaki * TODO:
5765865Siwasaki *	hash lookups by protocol family/protocol + address family
5865865Siwasaki *	take care of unique address problems per AF?
5965865Siwasaki *	redo address binding to allow wildcards
6065865Siwasaki */
6165865Siwasaki
6265865Siwasakistruct rawcb_list_head rawcb_list;
6365865Siwasaki
6465865Siwasakistatic u_long	raw_sendspace = RAWSNDQ;
6565865Siwasakistatic u_long	raw_recvspace = RAWRCVQ;
6665865Siwasaki
6765865Siwasaki/*
6865865Siwasaki * Allocate a control block and a nominal amount
6965865Siwasaki * of buffer space for the socket.
7065865Siwasaki */
7165865Siwasakiint
7265865Siwasakiraw_attach(so, proto)
7365865Siwasaki	register struct socket *so;
7465865Siwasaki	int proto;
7565865Siwasaki{
7665865Siwasaki	register struct rawcb *rp = sotorawcb(so);
7765865Siwasaki	int error;
7865865Siwasaki
7965865Siwasaki	/*
8065865Siwasaki	 * It is assumed that raw_attach is called
8165865Siwasaki	 * after space has been allocated for the
8265865Siwasaki	 * rawcb.
8365865Siwasaki	 */
8465865Siwasaki	if (rp == 0)
8565865Siwasaki		return (ENOBUFS);
8665865Siwasaki	error = soreserve(so, raw_sendspace, raw_recvspace);
8765865Siwasaki	if (error)
8865865Siwasaki		return (error);
8965865Siwasaki	rp->rcb_socket = so;
9065865Siwasaki	rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
9165865Siwasaki	rp->rcb_proto.sp_protocol = proto;
9265865Siwasaki	LIST_INSERT_HEAD(&rawcb_list, rp, list);
9365865Siwasaki	return (0);
9465865Siwasaki}
9565865Siwasaki
9665865Siwasaki/*
9765865Siwasaki * Detach the raw connection block and discard
9865865Siwasaki * socket resources.
9965865Siwasaki */
10065865Siwasakivoid
10165865Siwasakiraw_detach(rp)
10265865Siwasaki	register struct rawcb *rp;
10365865Siwasaki{
10465865Siwasaki	struct socket *so = rp->rcb_socket;
10565865Siwasaki
10665865Siwasaki	so->so_pcb = 0;
10765865Siwasaki	sofree(so);
10865865Siwasaki	LIST_REMOVE(rp, list);
10965865Siwasaki#ifdef notdef
11065865Siwasaki	if (rp->rcb_laddr)
11165865Siwasaki		m_freem(dtom(rp->rcb_laddr));
11265865Siwasaki	rp->rcb_laddr = 0;
11365865Siwasaki#endif
11465865Siwasaki	free((caddr_t)(rp), M_PCB);
11565865Siwasaki}
11665865Siwasaki
11765865Siwasaki/*
11865865Siwasaki * Disconnect and possibly release resources.
11965865Siwasaki */
12065865Siwasakivoid
12165865Siwasakiraw_disconnect(rp)
12265865Siwasaki	struct rawcb *rp;
12365865Siwasaki{
12465865Siwasaki
12565865Siwasaki#ifdef notdef
12665865Siwasaki	if (rp->rcb_faddr)
12765865Siwasaki		m_freem(dtom(rp->rcb_faddr));
12865865Siwasaki	rp->rcb_faddr = 0;
12965865Siwasaki#endif
13065865Siwasaki	if (rp->rcb_socket->so_state & SS_NOFDREF)
13165865Siwasaki		raw_detach(rp);
13265865Siwasaki}
13365865Siwasaki
13465865Siwasaki#ifdef notdef
13565865Siwasakiint
13665865Siwasakiraw_bind(so, nam)
13765865Siwasaki	register struct socket *so;
13865865Siwasaki	struct mbuf *nam;
13965865Siwasaki{
140	struct sockaddr *addr = mtod(nam, struct sockaddr *);
141	register struct rawcb *rp;
142
143	if (ifnet == 0)
144		return (EADDRNOTAVAIL);
145	rp = sotorawcb(so);
146	nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
147	rp->rcb_laddr = mtod(nam, struct sockaddr *);
148	return (0);
149}
150#endif
151