|
|
1.1 root 1: /*
2: * Copyright (c) 1980, 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: *
33: * @(#)raw_cb.c 7.11 (Berkeley) 6/28/90
34: */
35:
36: #include "param.h"
37: #include "systm.h"
38: #include "mbuf.h"
39: #include "socket.h"
40: #include "socketvar.h"
41: #include "domain.h"
42: #include "protosw.h"
43: #include "errno.h"
44:
45: #include "if.h"
46: #include "route.h"
47: #include "raw_cb.h"
48: #include "../netinet/in.h"
49:
50: #include "machine/mtpr.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: raw_attach(so, proto)
69: register struct socket *so;
70: int proto;
71: {
72: register struct rawcb *rp = sotorawcb(so);
73: int error;
74:
75: /*
76: * It is assumed that raw_attach is called
77: * after space has been allocated for the
78: * rawcb.
79: */
80: if (rp == 0)
81: return (ENOBUFS);
82: if (error = soreserve(so, raw_sendspace, raw_recvspace))
83: return (error);
84: rp->rcb_socket = so;
85: rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
86: rp->rcb_proto.sp_protocol = proto;
87: insque(rp, &rawcb);
88: return (0);
89: }
90:
91: /*
92: * Detach the raw connection block and discard
93: * socket resources.
94: */
95: raw_detach(rp)
96: register struct rawcb *rp;
97: {
98: struct socket *so = rp->rcb_socket;
99:
100: so->so_pcb = 0;
101: sofree(so);
102: remque(rp);
103: #ifdef notdef
104: if (rp->rcb_laddr)
105: m_freem(dtom(rp->rcb_laddr));
106: rp->rcb_laddr = 0;
107: #endif
108: free((caddr_t)(rp), M_PCB);
109: }
110:
111: /*
112: * Disconnect and possibly release resources.
113: */
114: raw_disconnect(rp)
115: struct rawcb *rp;
116: {
117:
118: #ifdef notdef
119: if (rp->rcb_faddr)
120: m_freem(dtom(rp->rcb_faddr));
121: rp->rcb_faddr = 0;
122: #endif
123: if (rp->rcb_socket->so_state & SS_NOFDREF)
124: raw_detach(rp);
125: }
126:
127: #ifdef notdef
128: raw_bind(so, nam)
129: register struct socket *so;
130: struct mbuf *nam;
131: {
132: struct sockaddr *addr = mtod(nam, struct sockaddr *);
133: register struct rawcb *rp;
134:
135: if (ifnet == 0)
136: return (EADDRNOTAVAIL);
137: rp = sotorawcb(so);
138: nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
139: rp->rcb_laddr = mtod(nam, struct sockaddr *);
140: return (0);
141: }
142: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.