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