|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1990-1992 Microsoft Corporation
4:
5: Module Name:
6:
7: packet.c
8:
9: Abstract:
10:
11: This module contains code to copy from ndis packets to ndis packets,
12: and also to copy from ndis packets to a buffer.
13:
14: Author:
15:
16: Anthony V. Ercolano (Tonye) 12-Sept-1990
17:
18: Environment:
19:
20: Works in kernel mode, but is not important that it does.
21:
22: Revision History:
23:
24:
25: --*/
26:
27: #include <ndis.h>
28: #include <efilter.h>
29:
30: #include <sonichrd.h>
31: #include <sonicsft.h>
32:
33:
34: extern
35: VOID
36: SonicCopyFromPacketToBuffer(
37: IN PNDIS_PACKET Packet,
38: IN UINT Offset,
39: IN UINT BytesToCopy,
40: OUT PCHAR Buffer,
41: OUT PUINT BytesCopied
42: )
43:
44: /*++
45:
46: Routine Description:
47:
48: Copy from an ndis packet into a buffer.
49:
50: Arguments:
51:
52: Packet - The packet to copy from.
53:
54: Offset - The offset from which to start the copy.
55:
56: BytesToCopy - The number of bytes to copy from the packet.
57:
58: Buffer - The destination of the copy.
59:
60: BytesCopied - The number of bytes actually copied. Can be less then
61: BytesToCopy if the packet is shorter than BytesToCopy.
62:
63: Return Value:
64:
65: None
66:
67: --*/
68:
69: {
70:
71: //
72: // Holds the number of ndis buffers comprising the packet.
73: //
74: UINT NdisBufferCount;
75:
76: //
77: // Points to the buffer from which we are extracting data.
78: //
79: PNDIS_BUFFER CurrentBuffer;
80:
81: //
82: // Holds the virtual address of the current buffer.
83: //
84: PVOID VirtualAddress;
85:
86: //
87: // Holds the length of the current buffer of the packet.
88: //
89: UINT CurrentLength;
90:
91: //
92: // Keep a local variable of BytesCopied so we aren't referencing
93: // through a pointer.
94: //
95: UINT LocalBytesCopied = 0;
96:
97: //
98: // Take care of boundary condition of zero length copy.
99: //
100:
101: *BytesCopied = 0;
102: if (!BytesToCopy) return;
103:
104: //
105: // Get the first buffer.
106: //
107:
108: NdisQueryPacket(
109: Packet,
110: NULL,
111: &NdisBufferCount,
112: &CurrentBuffer,
113: NULL
114: );
115:
116: //
117: // Could have a null packet.
118: //
119:
120: if (!NdisBufferCount) return;
121:
122: NdisQueryBuffer(
123: CurrentBuffer,
124: &VirtualAddress,
125: &CurrentLength
126: );
127:
128: while (LocalBytesCopied < BytesToCopy) {
129:
130: if (!CurrentLength) {
131:
132: NdisGetNextBuffer(
133: CurrentBuffer,
134: &CurrentBuffer
135: );
136:
137: //
138: // We've reached the end of the packet. We return
139: // with what we've done so far. (Which must be shorter
140: // than requested.
141: //
142:
143: if (!CurrentBuffer) break;
144:
145: NdisQueryBuffer(
146: CurrentBuffer,
147: &VirtualAddress,
148: &CurrentLength
149: );
150: continue;
151:
152: }
153:
154: //
155: // Try to get us up to the point to start the copy.
156: //
157:
158: if (Offset) {
159:
160: if (Offset > CurrentLength) {
161:
162: //
163: // What we want isn't in this buffer.
164: //
165:
166: Offset -= CurrentLength;
167: CurrentLength = 0;
168: continue;
169:
170: } else {
171:
172: VirtualAddress = (PCHAR)VirtualAddress + Offset;
173: CurrentLength -= Offset;
174: Offset = 0;
175:
176: }
177:
178: }
179:
180: //
181: // Copy the data.
182: //
183:
184:
185: {
186:
187: //
188: // Holds the amount of data to move.
189: //
190: UINT AmountToMove;
191:
192: AmountToMove =
193: ((CurrentLength <= (BytesToCopy - LocalBytesCopied))?
194: (CurrentLength):(BytesToCopy - LocalBytesCopied));
195:
196: SONIC_MOVE_MEMORY(
197: Buffer,
198: VirtualAddress,
199: AmountToMove
200: );
201:
202: Buffer = (PCHAR)Buffer + AmountToMove;
203: VirtualAddress = (PCHAR)VirtualAddress + AmountToMove;
204:
205: LocalBytesCopied += AmountToMove;
206: CurrentLength -= AmountToMove;
207:
208: }
209:
210: }
211:
212: *BytesCopied = LocalBytesCopied;
213:
214: }
215:
216: extern
217: VOID
218: SonicCopyFromBufferToPacket(
219: IN PCHAR Buffer,
220: IN UINT BytesToCopy,
221: IN PNDIS_PACKET Packet,
222: IN UINT Offset,
223: OUT PUINT BytesCopied
224: )
225:
226: /*++
227:
228: Routine Description:
229:
230: Copy from a buffer into an ndis packet.
231:
232: Arguments:
233:
234: Buffer - The packet to copy from.
235:
236: Offset - The offset from which to start the copy.
237:
238: BytesToCopy - The number of bytes to copy from the buffer.
239:
240: Packet - The destination of the copy.
241:
242: BytesCopied - The number of bytes actually copied. Will be less
243: than BytesToCopy if the packet is not large enough.
244:
245: Return Value:
246:
247: None
248:
249: --*/
250:
251: {
252: //
253: // Holds the count of the number of ndis buffers comprising the
254: // destination packet.
255: //
256: UINT DestinationBufferCount;
257:
258: //
259: // Points to the buffer into which we are putting data.
260: //
261: PNDIS_BUFFER DestinationCurrentBuffer;
262:
263: //
264: // Points to the location in Buffer from which we are extracting data.
265: //
266: PUCHAR SourceCurrentAddress;
267:
268: //
269: // Holds the virtual address of the current destination buffer.
270: //
271: PVOID DestinationVirtualAddress;
272:
273: //
274: // Holds the length of the current destination buffer.
275: //
276: UINT DestinationCurrentLength;
277:
278: //
279: // Keep a local variable of BytesCopied so we aren't referencing
280: // through a pointer.
281: //
282: UINT LocalBytesCopied = 0;
283:
284:
285: //
286: // Take care of boundary condition of zero length copy.
287: //
288:
289: *BytesCopied = 0;
290: if (!BytesToCopy) return;
291:
292: //
293: // Get the first buffer of the destination.
294: //
295:
296: NdisQueryPacket(
297: Packet,
298: NULL,
299: &DestinationBufferCount,
300: &DestinationCurrentBuffer,
301: NULL
302: );
303:
304: //
305: // Could have a null packet.
306: //
307:
308: if (!DestinationBufferCount) return;
309:
310: NdisQueryBuffer(
311: DestinationCurrentBuffer,
312: &DestinationVirtualAddress,
313: &DestinationCurrentLength
314: );
315:
316: //
317: // Set up the source address.
318: //
319:
320: SourceCurrentAddress = Buffer;
321:
322:
323: while (LocalBytesCopied < BytesToCopy) {
324:
325: //
326: // Check to see whether we've exhausted the current destination
327: // buffer. If so, move onto the next one.
328: //
329:
330: if (!DestinationCurrentLength) {
331:
332: NdisGetNextBuffer(
333: DestinationCurrentBuffer,
334: &DestinationCurrentBuffer
335: );
336:
337: if (!DestinationCurrentBuffer) {
338:
339: //
340: // We've reached the end of the packet. We return
341: // with what we've done so far. (Which must be shorter
342: // than requested.)
343: //
344:
345: break;
346:
347: }
348:
349: NdisQueryBuffer(
350: DestinationCurrentBuffer,
351: &DestinationVirtualAddress,
352: &DestinationCurrentLength
353: );
354:
355: continue;
356:
357: }
358:
359: //
360: // Try to get us up to the point to start the copy.
361: //
362:
363: if (Offset) {
364:
365: if (Offset > DestinationCurrentLength) {
366:
367: //
368: // What we want isn't in this buffer.
369: //
370:
371: Offset -= DestinationCurrentLength;
372: DestinationCurrentLength = 0;
373: continue;
374:
375: } else {
376:
377: DestinationVirtualAddress = (PCHAR)DestinationVirtualAddress
378: + Offset;
379: DestinationCurrentLength -= Offset;
380: Offset = 0;
381:
382: }
383:
384: }
385:
386:
387: //
388: // Copy the data.
389: //
390:
391: {
392:
393: //
394: // Holds the amount of data to move.
395: //
396: UINT AmountToMove;
397:
398: //
399: // Holds the amount desired remaining.
400: //
401: UINT Remaining = BytesToCopy - LocalBytesCopied;
402:
403:
404: AmountToMove = DestinationCurrentLength;
405:
406: AmountToMove = ((Remaining < AmountToMove)?
407: (Remaining):(AmountToMove));
408:
409: SONIC_MOVE_MEMORY(
410: DestinationVirtualAddress,
411: SourceCurrentAddress,
412: AmountToMove
413: );
414:
415: SourceCurrentAddress += AmountToMove;
416: LocalBytesCopied += AmountToMove;
417: DestinationCurrentLength -= AmountToMove;
418:
419: }
420:
421: }
422:
423: *BytesCopied = LocalBytesCopied;
424:
425:
426: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.