|
|
1.1 root 1: /*
2: * Copyright (c) 1998-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) 1998 Apple Computer, Inc. All rights reserved.
24: *
25: * IOPacketQueue.h
26: *
27: * HISTORY
28: * 9-Dec-1998 Joe Liu (jliu) created.
29: *
30: */
31:
32: #ifndef _IOPACKETQUEUE_H
33: #define _IOPACKETQUEUE_H
34:
35: #include <libkern/c++/OSObject.h>
36: #include <IOKit/IOLocks.h>
37:
38: // Forward structure declarations.
39: //
40: struct mbuf;
41:
42: // We do not want the enqueue/dequeue macros defined in queue.h.
43: //
44: // #warning queue.h should not be included
45: #undef enqueue(queue,elt)
46: #undef dequeue(queue)
47:
48: /*! @class IOPacketQueue
49: @abstract Implements a FIFO queue of mbuf packets.
50: A spinlock allocated by this object is used to enforce mutual
51: exclusion between methods with a "lock" prefix. */
52:
53: class IOPacketQueue : public OSObject
54: {
55: OSDeclareDefaultStructors(IOPacketQueue)
56:
57: private:
58: struct mbuf * _head; // head of the mbuf queue
59: struct mbuf * _tail; // tail of the mbuf queue
60: UInt32 _size; // size of the queue
61: UInt32 _peakSize; // peak size of the queue
62: UInt32 _capacity; // maximum size of the queue
63: IOSimpleLock * _lock; // spinlock for locking methods
64:
65: /*! @function free
66: @abstract Free the IOPacketQueue instance.
67: @discussion Release all packets in the queue to the free mbuf pool,
68: deallocate the spinlock, then call super::free(). */
69:
70: virtual void free();
71:
72: /*! @var IOPQDefaultCapacity Specifies the default capacity of the queue
73: (number of packets that the queue can hold). Once the size of the queue
74: grows to its capacity, the queue will begin to drop incoming packets.
75: This capacity can be overridden by specifying the desired capacity when
76: the queue is initialized, or the setCapacity() method can be called to
77: adjust the queue's capacity. */
78:
79: static const UInt32 IOPQDefaultCapacity = 100;
80:
81: public:
82:
83: /*! @function freePacketChain
84: @abstract Free a packet chain.
85: @discussion Traverse a packet chain linked through the mbuf
86: nextpkt field, and free each packet.
87: @param m The mbuf at the head of the mbuf chain.
88: @result The number of mbufs freed. */
89:
90: static UInt32 freePacketChain(struct mbuf * m);
91:
92: /*! @function withCapacity
93: @abstract Factory method that will construct and initialize an
94: IOPacketQueue instance.
95: @param capacity The initial capacity of the queue. Can be changed
96: later through setCapacity().
97: @result An IOPacketQueue instance on success, or 0 otherwise. */
98:
99: static IOPacketQueue * withCapacity(UInt32 capacity = IOPQDefaultCapacity);
100:
101: /*! @function initWithCapacity
102: @abstract Initialize an IOPacketQueue instance.
103: @discussion Initialize the queue and create a spinlock.
104: @param capacity The initial capacity of the queue. Can be changed
105: later through setCapacity().
106: @result true if initialized successfully, false otherwise. */
107:
108: virtual bool initWithCapacity(UInt32 capacity = IOPQDefaultCapacity);
109:
110: /*! @function getSize
111: @abstract Get the size of the queue.
112: @result The number of packets currently held in the queue. */
113:
114: UInt32 getSize() const;
115:
116: /*! @function getPeakSize
117: @abstract Returns the peak size of the queue.
118: @discussion The queue contains a counter that records the peak
119: size of the queue. This method returns the value in the counter,
120: and can optionally reset the counter back to zero.
121: @param reset Reset the peak size counter to zero if true.
122: @result The peak size count. */
123:
124: UInt32 getPeakSize(bool reset = false);
125:
126: /*! @function setCapacity
127: @abstract Adjust the queue's capacity.
128: @discussion If the capacity is set to a value that is smaller than its
129: current size, then the queue will drop incoming packets, but existing
130: packets in the queue will remain intact.
131: @param capacity The new capacity.
132: @result true if the new capacity was accepted, false otherwise. */
133:
134: bool setCapacity(UInt32 capacity);
135:
136: /*! @function getCapacity
137: @abstract Get the capacity of the queue.
138: @result The current queue capacity. */
139:
140: UInt32 getCapacity() const;
141:
142: /*! @function peek
143: @discussion Peek at the head of the queue without dequeueing the packet.
144: An ensuing call to peek() or dequeue() will return the same packet.
145: The caller must not modify the packet returned.
146: @result The packet at the head of the queue. */
147:
148: const struct mbuf * peek() const;
149:
150: /*! @function prepend
151: @abstract Add a packet (or a packet chain) to the head of the queue.
152: @discussion Unlike enqueue(), the capacity is not checked, and the input
153: packet is never dropped.
154: @param m A single packet, or packet chain, to be added to the head of the
155: queue. */
156:
157: void prepend(struct mbuf * m);
158:
159: /*! @function lockPrepend
160: @abstract Add a packet (or a packet chain) to the head of the queue.
161: @discussion Same as prepend(). A spinlock lock is held while the queue
162: is modified.
163: @param m A single packet, or packet chain, to be added to the head of the
164: queue. */
165:
166: void lockPrepend(struct mbuf * m);
167:
168: /*! @function enqueue
169: @abstract Add a packet (or a packet chain) to the tail of the queue.
170: @param m A single packet, or a packet chain, to be added to the tail of the
171: queue.
172: @result The number of packets dropped from over-capacity. */
173:
174: UInt32 enqueue(struct mbuf * m);
175:
176: /*! @function lockEnqueue
177: @abstract Add a packet (or a packet chain) to the tail of the queue.
178: @discussion Same as enqueue(). A spinlock lock is held while the queue
179: is modified.
180: @param m A single packet, or a packet chain, to be added to the tail of the
181: queue.
182: @result The number of packets dropped from over-capacity. */
183:
184: UInt32 lockEnqueue(struct mbuf * m);
185:
186: /*! @function dequeue
187: @abstract Remove a single packet from the head of the queue.
188: @result The dequeued packet. A NULL is returned if the queue is empty. */
189:
190: struct mbuf * dequeue();
191:
192: /*! @function lockDequeue
193: @abstract Remove a single packet from the head of the queue.
194: @discussion Same as dequeue(). A spinlock lock is held while the queue
195: is modified.
196: @result The dequeued packet. A NULL is returned if the queue is empty. */
197:
198: struct mbuf * lockDequeue();
199:
200: /*! @function dequeueAll
201: @abstract Removes all packets from the queue and return the first packet
202: of the packet chain.
203: @result The head of the dequeued packet chain. */
204:
205: struct mbuf * dequeueAll();
206:
207: /*! @function lockDequeueAll
208: @abstract Removes all packets from the queue and return the first packet
209: of the packet chain.
210: @discussion Same as dequeueAll(). A spinlock lock is held while the queue
211: is modified.
212: @result The head of the dequeued packet chain. */
213:
214: struct mbuf * lockDequeueAll();
215:
216: /*! @function flush
217: @abstract Removes all packets from the queue and release them to the
218: free mbuf pool.
219: @discussion The size of the queue will be zero after the call.
220: @result The number of packets freed. */
221:
222: UInt32 flush();
223:
224: /*! @function lockFlush
225: @abstract Removes all packets from the queue and release them to the
226: free mbuf pool.
227: @discussion Same as flush(). A spinlock lock is held while the queue
228: is modified.
229: @result The number of packets freed. */
230:
231: UInt32 lockFlush();
232: };
233:
234: #endif /* !_IOPACKETQUEUE_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.