|
|
1.1 root 1: /*
2: * Copyright (c) 1980, 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution is only permitted until one year after the first shipment
6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
7: * binary forms are permitted provided that: (1) source distributions retain
8: * this entire copyright notice and comment, and (2) distributions including
9: * binaries display the following acknowledgement: This product includes
10: * software developed by the University of California, Berkeley and its
11: * contributors'' in the documentation or other materials provided with the
12: * distribution and in all advertising materials mentioning features or use
13: * of this software. Neither the name of the University nor the names of
14: * its contributors may be used to endorse or promote products derived from
15: * this software without specific prior written permission.
16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19: *
20: * @(#)raw_cb.c 7.11 (Berkeley) 6/28/90
21: */
22:
23: #include "param.h"
24: #include "systm.h"
25: #include "mbuf.h"
26: #include "socket.h"
27: #include "socketvar.h"
28: #include "domain.h"
29: #include "protosw.h"
30: #include "errno.h"
31:
32: #include "if.h"
33: #include "route.h"
34: #include "raw_cb.h"
35: #include "../netinet/in.h"
36:
37: #include "machine/mtpr.h"
38:
39: /*
40: * Routines to manage the raw protocol control blocks.
41: *
42: * TODO:
43: * hash lookups by protocol family/protocol + address family
44: * take care of unique address problems per AF?
45: * redo address binding to allow wildcards
46: */
47:
48: u_long raw_sendspace = RAWSNDQ;
49: u_long raw_recvspace = RAWRCVQ;
50:
51: /*
52: * Allocate a control block and a nominal amount
53: * of buffer space for the socket.
54: */
55: raw_attach(so, proto)
56: register struct socket *so;
57: int proto;
58: {
59: register struct rawcb *rp = sotorawcb(so);
60: int error;
61:
62: /*
63: * It is assumed that raw_attach is called
64: * after space has been allocated for the
65: * rawcb.
66: */
67: if (rp == 0)
68: return (ENOBUFS);
69: if (error = soreserve(so, raw_sendspace, raw_recvspace))
70: return (error);
71: rp->rcb_socket = so;
72: rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
73: rp->rcb_proto.sp_protocol = proto;
74: insque(rp, &rawcb);
75: return (0);
76: }
77:
78: /*
79: * Detach the raw connection block and discard
80: * socket resources.
81: */
82: raw_detach(rp)
83: register struct rawcb *rp;
84: {
85: struct socket *so = rp->rcb_socket;
86:
87: so->so_pcb = 0;
88: sofree(so);
89: remque(rp);
90: #ifdef notdef
91: if (rp->rcb_laddr)
92: m_freem(dtom(rp->rcb_laddr));
93: rp->rcb_laddr = 0;
94: #endif
95: free((caddr_t)(rp), M_PCB);
96: }
97:
98: /*
99: * Disconnect and possibly release resources.
100: */
101: raw_disconnect(rp)
102: struct rawcb *rp;
103: {
104:
105: #ifdef notdef
106: if (rp->rcb_faddr)
107: m_freem(dtom(rp->rcb_faddr));
108: rp->rcb_faddr = 0;
109: #endif
110: if (rp->rcb_socket->so_state & SS_NOFDREF)
111: raw_detach(rp);
112: }
113:
114: #ifdef notdef
115: raw_bind(so, nam)
116: register struct socket *so;
117: struct mbuf *nam;
118: {
119: struct sockaddr *addr = mtod(nam, struct sockaddr *);
120: register struct rawcb *rp;
121:
122: if (ifnet == 0)
123: return (EADDRNOTAVAIL);
124: rp = sotorawcb(so);
125: nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
126: rp->rcb_laddr = mtod(nam, struct sockaddr *);
127: return (0);
128: }
129: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.