raw_cb.c revision 1.8 1 /* $NetBSD: raw_cb.c,v 1.8 1995/06/12 00:46:53 mycroft Exp $ */
2
3 /*
4 * Copyright (c) 1980, 1986, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * @(#)raw_cb.c 8.1 (Berkeley) 6/10/93
36 */
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/mbuf.h>
41 #include <sys/socket.h>
42 #include <sys/socketvar.h>
43 #include <sys/domain.h>
44 #include <sys/protosw.h>
45 #include <sys/errno.h>
46
47 #include <net/if.h>
48 #include <net/route.h>
49 #include <net/raw_cb.h>
50 #include <netinet/in.h>
51
52 /*
53 * Routines to manage the raw protocol control blocks.
54 *
55 * TODO:
56 * hash lookups by protocol family/protocol + address family
57 * take care of unique address problems per AF?
58 * redo address binding to allow wildcards
59 */
60
61 u_long raw_sendspace = RAWSNDQ;
62 u_long raw_recvspace = RAWRCVQ;
63
64 /*
65 * Allocate a control block and a nominal amount
66 * of buffer space for the socket.
67 */
68 int
69 raw_attach(so, proto)
70 register struct socket *so;
71 int proto;
72 {
73 register struct rawcb *rp = sotorawcb(so);
74 int error;
75
76 /*
77 * It is assumed that raw_attach is called
78 * after space has been allocated for the
79 * rawcb.
80 */
81 if (rp == 0)
82 return (ENOBUFS);
83 if (error = soreserve(so, raw_sendspace, raw_recvspace))
84 return (error);
85 rp->rcb_socket = so;
86 rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
87 rp->rcb_proto.sp_protocol = proto;
88 LIST_INSERT_HEAD(&rawcb, rp, rcb_list);
89 return (0);
90 }
91
92 /*
93 * Detach the raw connection block and discard
94 * socket resources.
95 */
96 void
97 raw_detach(rp)
98 register struct rawcb *rp;
99 {
100 struct socket *so = rp->rcb_socket;
101
102 so->so_pcb = 0;
103 sofree(so);
104 LIST_REMOVE(rp, rcb_list);
105 #ifdef notdef
106 if (rp->rcb_laddr)
107 m_freem(dtom(rp->rcb_laddr));
108 rp->rcb_laddr = 0;
109 #endif
110 free((caddr_t)(rp), M_PCB);
111 }
112
113 /*
114 * Disconnect and possibly release resources.
115 */
116 void
117 raw_disconnect(rp)
118 struct rawcb *rp;
119 {
120
121 #ifdef notdef
122 if (rp->rcb_faddr)
123 m_freem(dtom(rp->rcb_faddr));
124 rp->rcb_faddr = 0;
125 #endif
126 if (rp->rcb_socket->so_state & SS_NOFDREF)
127 raw_detach(rp);
128 }
129
130 #ifdef notdef
131 int
132 raw_bind(so, nam)
133 register struct socket *so;
134 struct mbuf *nam;
135 {
136 struct sockaddr *addr = mtod(nam, struct sockaddr *);
137 register struct rawcb *rp;
138
139 if (ifnet == 0)
140 return (EADDRNOTAVAIL);
141 rp = sotorawcb(so);
142 nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
143 rp->rcb_laddr = mtod(nam, struct sockaddr *);
144 return (0);
145 }
146 #endif
147