|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (C) 1990 by NeXT, Inc., All Rights Reserved
24: *
25: */
26:
27: /*
28: * Network Buffer handling
29: * These should be used instead of mbufs. Currently, they are just
30: * wrappers around mbufs, but we hope to flush mbufs one day. Third parties
31: * must use this API, or risk breakage after an OS upgrade.
32: *
33: * HISTORY
34: * 09-Apr-90 Bradley Taylor (btaylor) at NeXT, Inc.
35: * Created.
36: */
37:
38: #import <sys/types.h>
39: #import <sys/param.h>
40: #import <sys/mbuf.h>
41: #import <machine/spl.h>
42: #import <net/netbuf.h>
43:
44: const char
45: IFCONTROL_SETFLAGS[] = "setflags",
46: IFCONTROL_SETADDR[] = "setaddr",
47: IFCONTROL_GETADDR[] = "getaddr",
48: IFCONTROL_AUTOADDR[] = "autoaddr",
49: IFCONTROL_UNIXIOCTL[] = "unix-ioctl",
50: IFCONTROL_RCVPROMISCUOUS[] = "promiscuous-on",
51: IFCONTROL_RCVPROMISCOFF[] = "promiscuous-off",
52: IFCONTROL_ADDMULTICAST[] = "add-multicast",
53: IFCONTROL_RMVMULTICAST[] = "rmv-multicast";
54:
55: static void
56: nb_alloc_free(
57: void *orig_data
58: )
59: {
60: int orig_size = *(unsigned *)orig_data;
61:
62: if ( orig_size <= MCLBYTES ) {
63: MCLFREE( orig_data );
64: } else {
65: kfree(orig_data, orig_size);
66: }
67: }
68:
69: void
70: nb_delayed_free(void *data, unsigned size, void *orig_data)
71: {
72: int orig_size = *(unsigned *)orig_data;
73:
74: if ( orig_size <= MCLBYTES ) {
75: MCLFREE( orig_data );
76: } else {
77: kfree(orig_data, orig_size);
78: }
79: }
80:
81:
82:
83: netbuf_t
84: nb_alloc(
85: unsigned data_size
86: )
87: {
88: void *data;
89: netbuf_t nb;
90: unsigned *orig_data;
91: unsigned orig_size;
92:
93: orig_size = data_size + 0x20; /* Add cache-line size to request */
94:
95: if ( orig_size <= MCLBYTES ) {
96: MCLALLOC( orig_data, M_DONTWAIT );
97: } else {
98: orig_data = (unsigned *)kalloc(orig_size);
99: }
100: if (orig_data == NULL) {
101: return (NULL);
102: }
103: orig_data[0] = orig_size;
104: data = (void *)&orig_data[1];
105: data = (void *)(((unsigned int)data + 0x1F) & ~0x1F); /* Align to cache-line boundary */
106: nb = nb_alloc_wrapper(data, data_size,
107: nb_delayed_free,
108: (void *)orig_data);
109: if (nb == NULL) {
110: nb_alloc_free((void *)orig_data);
111: return (NULL);
112: }
113:
114: return (nb);
115: }
116: struct mbuf *
117: mclgetx(fun, arg, addr, len, wait)
118: int (*fun)(), arg, len, wait;
119: caddr_t addr;
120: {
121: register struct mbuf *m;
122:
123: MGETHDR(m, wait, MT_DATA);
124: if (m == 0)
125: return (0);
126: // m->m_off = (int)addr - (int)m;
127: // m->m_len = len;
128: // m->m_cltype = MCL_LOANED;
129: // m->m_clfun = fun;
130: // m->m_clarg = arg;
131: // m->m_clswp = NULL;
132: m->m_ext.ext_buf = addr;
133: m->m_ext.ext_free = fun;
134: m->m_ext.ext_size = len;
135: m->m_ext.ext_arg = arg;
136: m->m_ext.ext_refs.forward = m->m_ext.ext_refs.backward =
137: &m->m_ext.ext_refs;
138: m->m_data = addr;
139: m->m_flags |= M_EXT;
140: m->m_pkthdr.len = len;
141: m->m_len = len;
142:
143: return (m);
144: }
145:
146: netbuf_t
147: nb_alloc_wrapper(
148: void *data,
149: unsigned data_size,
150: void data_free(void *arg),
151: void *data_free_arg
152: )
153: {
154: struct mbuf *m;
155: m = mclgetx(data_free, data_free_arg, data, data_size, M_DONTWAIT);
156: if (m == NULL) {
157: return (NULL);
158: }
159: return ((netbuf_t)m);
160: }
161:
162: char *
163: nb_map(netbuf_t nb)
164: {
165: return (mtod(((struct mbuf *)nb), char *));
166: }
167:
168: void
169: nb_free(netbuf_t nb)
170: {
171: m_freem((struct mbuf *)nb);
172: }
173:
174: unsigned
175: nb_size(netbuf_t nb)
176: {
177: return (((struct mbuf *)nb)->m_len);
178: }
179:
180: int
181: nb_read(netbuf_t nb, unsigned offset, unsigned size, void *target)
182: {
183: struct mbuf *m = (struct mbuf *)nb;
184: void *data;
185:
186: if (offset + size > m->m_len) {
187: return (-1);
188: }
189: data = mtod(m, void *);
190: bcopy(data + offset, target, size);
191: return (0);
192: }
193:
194: int
195: nb_write(netbuf_t nb, unsigned offset, unsigned size, void *source)
196: {
197: struct mbuf *m = (struct mbuf *)nb;
198: void *data;
199:
200: if (offset + size > m->m_len) {
201: return (-1);
202: }
203: data = mtod(m, void *);
204: bcopy(source, data + offset, size);
205: return (0);
206: }
207: /* Remember to look at the PPP and slip interfaces, which bypassses the
208: * m_data field XXXX : (AR, CCG 6/30/95)
209: */
210: int
211: nb_shrink_top(netbuf_t nb, unsigned size)
212: {
213: struct mbuf *m = (struct mbuf *)nb;
214:
215: m->m_len -= size;
216: m->m_data += size;
217: return (0); /* XXX should error check */
218: }
219:
220: int
221: nb_grow_top(netbuf_t nb, unsigned size)
222: {
223: struct mbuf *m = (struct mbuf *)nb;
224:
225: m->m_len += size;
226: m->m_data -= size;
227: return (0); /* XXX should error check */
228: }
229:
230: int
231: nb_shrink_bot(netbuf_t nb, unsigned size)
232: {
233: struct mbuf *m = (struct mbuf *)nb;
234:
235: m->m_len -= size;
236: return (0); /* XXX should error check */
237: }
238:
239:
240: int
241: nb_grow_bot(netbuf_t nb, unsigned size)
242: {
243: struct mbuf *m = (struct mbuf *)nb;
244:
245: m->m_len += size;
246: return (0); /* XXX should error check */
247: }
248:
249: int
250: nb_aligned_copy(netbuf_t nb, unsigned aligned)
251: {
252: struct mbuf *m = (struct mbuf *)nb;
253: unsigned char *buf_p, *buf_m;
254:
255: buf_p = buf_m = mtod(m, unsigned char *);
256: buf_m -= aligned;
257: if (buf_p != buf_m)
258: memmove(buf_m, buf_p, m->m_len);
259: m->m_data = buf_m;
260: return(0);
261: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.