Annotation of XNU/iokit/IOKit/network/IONetworkData.h, revision 1.1.1.1

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:  * IONetworkData.h
                     26:  *
                     27:  * HISTORY
                     28:  * 21-Apr-1999      Joe Liu (jliu) created.
                     29:  *
                     30:  */
                     31: 
                     32: #ifndef _IONETWORKDATA_H
                     33: #define _IONETWORKDATA_H
                     34: 
                     35: #define IONetworkParameter IONetworkData
                     36: 
                     37: /*! @enum IONDAccessFlags
                     38:     @discussion Flags to encode access types, and other flags
                     39:     used by the access methods.
                     40:     @constant kIONDAccessTypeRead  read access type.
                     41:     @constant kIONDAccessTypeWrite write access type.
                     42:     @constant kIONDAccessTypeReset reset access type.
                     43:     @constant kIONDAccessTypeSerialize serialize access type.
                     44:     @constant kIONDAccessNoBufferAccess The data buffer
                     45:     cannot be accessed through the access methods. Buffer serialization
                     46:     is also disabled. However, the notification handler will continue
                     47:     to be called for supported access types. */
                     48: 
                     49: enum IONDAccessFlags {
                     50:     kIONDAccessTypeRead        = 0x01,
                     51:     kIONDAccessTypeWrite       = 0x02,
                     52:     kIONDAccessTypeReset       = 0x04,
                     53:     kIONDAccessTypeSerialize   = 0x08,
                     54:     kIONDAccessTypeMask        = 0xff,
                     55: 
                     56:     kIONDAccessNoBufferAccess  = 0x100,
                     57: };
                     58: 
                     59: /*! @define kIONDBasicAccessTypes
                     60:     @discussion The default access types supported by an IONetworkData
                     61:     object. Allow read() and serialize(). */
                     62: 
                     63: #define kIONDBasicAccessTypes \
                     64:        (kIONDAccessTypeRead | kIONDAccessTypeSerialize)
                     65: 
                     66: /*! @define kIONDImmutableAccessFlags
                     67:     @discussion Access flags that cannot be changed by setAccessFlags(),
                     68:     after the object has been initialized. */
                     69: 
                     70: #define kIONDImmutableAccessFlags   0
                     71: 
                     72: #ifdef KERNEL
                     73: 
                     74: #include <libkern/c++/OSData.h>
                     75: #include <libkern/c++/OSSymbol.h>
                     76: #include <libkern/c++/OSSerialize.h>
                     77: 
                     78: /*! @class IONetworkData : public OSData
                     79:     An IONetworkData manages a fixed-capacity named buffer.
                     80:     This class provide external access methods that can be called by
                     81:     an IOUserClient to allow user space access to the data buffer.
                     82:     In addition, serialization is supported, and therefore the object
                     83:     can be added to a property table to publish the data object.
                     84:     An unique name must be assigned to the object during initialization.
                     85:     An OSSymbol key will be created based on the assigned name, and this
                     86:     key should be used when the object is added to a dictionary.
                     87: 
                     88:     The level of access granted to the access methods can be controlled,
                     89:     by specifying a default set of access flags when the object is
                     90:     initialized, or modified later by calling setAccessFlags(). By
                     91:     default, each IONetworkData object created will support serialization,
                     92:     and will also allow its data buffer to be read through the read()
                     93:     access method.
                     94: 
                     95:     A notification handler, in the form of a C++ function pointer, can
                     96:     be registered to receive a call each time the data buffer is accessed
                     97:     through an access method. Arguments provided will identify the data
                     98:     object and the type of access that triggered the notification.
                     99:     The handler can therefore perform lazy update of the data buffer
                    100:     until an interested party tries to read the data.
                    101:     The notification handler can also take over the default action performed
                    102:     by the access methods when the kIONDAccessNoBufferAccess flag is set.
                    103:     This will prevent the access methods from accessing the data buffer,
                    104:     and allow the handler to override the access protocol.
                    105: 
                    106:     This object is used by IONetworkInterface to export statistics
                    107:     counters to user space. */
                    108: 
                    109: 
                    110: class IONetworkData : public OSData
                    111: {
                    112:     OSDeclareDefaultStructors(IONetworkData)
                    113: 
                    114: public:
                    115: 
                    116: /*! @typedef Action
                    117:     Defines the prototype of the notification handler that is called
                    118:     when the data buffer is accessed through an access method.
                    119:     @param data The IONetworkData object being accessed
                    120:            (the sender of the notification).
                    121:     @param accessType A bit will be set indicating a particular
                    122:            access type.
                    123:     @param arg An action argument.
                    124:     @param buffer Pointer to the client buffer for read() and write()
                    125:            accesses.
                    126:     @param bufSize Pointer to the size of the client buffer. */
                    127: 
                    128:     typedef IOReturn (OSObject::*Action)(IONetworkData * data,
                    129:                                          UInt32          accessType,
                    130:                                          void *          arg,
                    131:                                          void *          buffer,
                    132:                                          UInt32 *        bufSize);
                    133: 
                    134: protected:
                    135:     const OSSymbol *    _key;       // key associated with this object.
                    136:     UInt32              _access;    // access flags.
                    137:     UInt                _capacity;  // data buffer capacity.
                    138:     OSObject *          _tapTarget; // a target for access notification.
                    139:     Action              _tapAction; // the target method to call.
                    140:     void *              _tapArg;    // arbitrary target argument.
                    141: 
                    142: /*! @function free
                    143:     @abstract Free the IONetworkData instance. */
                    144: 
                    145:     virtual void free();
                    146: 
                    147: public:
                    148: 
                    149: /*! @function initialize
                    150:     @abstract IONetworkData class initializer. */
                    151: 
                    152:     static void initialize();
                    153: 
                    154: /*! @function withName
                    155:     @abstract Factory method that will construct and initialize an
                    156:     IONetworkData instance.
                    157:     @param name A name assigned to this object.
                    158:     @param capacity Capacity of the data buffer.
                    159:     @param buffer Pointer to an external data buffer. If 0,
                    160:            then an internal buffer shall be allocated.
                    161:     @param accessFlags Access flags.
                    162:            Can be later modified by calling setAccessFlags().
                    163:     @param target Notification target. The target will be notified
                    164:            when IONetworkData receives a call to one of its
                    165:            access methods. If 0, then notification is disabled.
                    166:     @param action Notification action. If 0, then notification is
                    167:            disabled.
                    168:     @param arg An argument to passed to the notification
                    169:            action when it is called.
                    170:     @result An IONetworkData instance on success, or 0 otherwise. */
                    171: 
                    172:     static IONetworkData * withName(
                    173:                            const char * name,
                    174:                            UInt32       capacity,
                    175:                            void *       buffer = 0,
                    176:                            UInt32       accessFlags  = kIONDBasicAccessTypes,
                    177:                            OSObject *   target = 0,
                    178:                            Action       action = 0,
                    179:                            void *       arg    = 0);
                    180: 
                    181: /*! @function init
                    182:     @abstract Initialize an IONetworkData instance.
                    183:     @param name A name assigned to this object.
                    184:     @param capacity Capacity of the data buffer.
                    185:     @param buffer Pointer to an external data buffer. If 0,
                    186:            then an internal buffer shall be allocated.
                    187:     @param accessFlags Access flags.
                    188:            Can be later modified by calling setAccessFlags().
                    189:     @param target Notification target. The target will be notified
                    190:            when IONetworkData receives a call to one of its
                    191:            access methods. If 0, then notification is disabled.
                    192:     @param action Notification action. If 0, then notification is
                    193:            disabled.
                    194:     @param arg An argument to passed to the notification
                    195:            action when it is called.
                    196:     @result true if initialized successfully, false otherwise. */
                    197: 
                    198:     virtual bool initWithName(const char * name,
                    199:                               UInt32       capacity,
                    200:                               void *       buffer = 0,
                    201:                               UInt32       accessFlags = kIONDBasicAccessTypes,
                    202:                               OSObject *   target = 0,
                    203:                               Action       action = 0,
                    204:                               void *       arg    = 0);
                    205: 
                    206: /*! @function setAccessFlags
                    207:     @abstract Change the access flags.
                    208:     @param accessFlags A bitfield of access flag bits.
                    209:            See IONDAccessFlags enum. */
                    210: 
                    211:     virtual void setAccessFlags(UInt32 accessFlags);
                    212: 
                    213: /*! @function setNotificationTarget
                    214:     @abstract Register a target/action to handle access notification.
                    215:     @discussion A notification is sent by an IONetworkData to the registered
                    216:     notification handler when an access method is called.
                    217:     @param target The target object that implements the notification action.
                    218:            If 0, then notification will be disabled.
                    219:     @param action The notification action.
                    220:            If 0, then notification will be disabled.
                    221:     @param arg An optional argument passed to the notification handler. */
                    222: 
                    223:     virtual void setNotificationTarget(OSObject *  target,
                    224:                                        Action      action,
                    225:                                        void *      arg = 0);
                    226: 
                    227: /*! @function getBuffer
                    228:     @result A pointer to the data buffer. */
                    229: 
                    230:     virtual const void *     getBuffer() const;
                    231: 
                    232: /*! @function getAccessFlags
                    233:     @result The access flags. */
                    234: 
                    235:     virtual UInt32           getAccessFlags() const;
                    236: 
                    237: /*! @function getTarget
                    238:     @result The notification target. */
                    239: 
                    240:     virtual OSObject *       getTarget() const;
                    241: 
                    242: /*! @function getAction
                    243:     @result The notification action. */
                    244: 
                    245:     virtual Action           getAction() const;
                    246: 
                    247: /*! @function getArgument
                    248:     @result The optional notification argument. */
                    249: 
                    250:     virtual void *           getArgument() const;
                    251: 
                    252: /*! @function getKey
                    253:     @abstract Get an OSSymbol key associated with this IONetworkData
                    254:     instance.
                    255:     @discussion During initialization, IONetworkData will create an
                    256:     OSSymbol key based on its assigned name.
                    257:     @result An OSSymbol key generated from the assigned name. */
                    258: 
                    259:     virtual const OSSymbol * getKey() const;
                    260: 
                    261: /*! @function getCapacity
                    262:     @abstract Override the getCapacity() method inherited from OSData.
                    263:     @discussion This method overrides the implementation in OSData
                    264:     in order to report the capacity for both internal or external
                    265:     data buffers.
                    266:     @result The capacity of the data buffer in bytes. */
                    267: 
                    268:     virtual UInt getCapacity() const;
                    269: 
                    270: /*! @function setBytes
                    271:     @abstract Update the data buffer from a source buffer provided by the
                    272:     caller.
                    273:     @param bytes Pointer to a source buffer provided by the caller.
                    274:     @param inLength Length of the source buffer, or the amount of data
                    275:            to copy to the data buffer. The length provided must
                    276:            be smaller than or equal to the capacity of the object.
                    277:     @result true if the length of the source buffer is within limits,
                    278:     and the source buffer was copied, false otherwise. */
                    279: 
                    280:     virtual bool setBytes(const void * bytes, UInt inLength);
                    281: 
                    282: /*! @function setLength
                    283:     @abstract Set a new data buffer length to indicate the amount of
                    284:     valid data in the data buffer.
                    285:     @param inLength Length of the data buffer in bytes. This must be
                    286:            smaller than or equal to the capacity of the data object.
                    287:     @result true if the length provided was accepted. */
                    288: 
                    289:     virtual bool setLength(UInt inLength);
                    290: 
                    291: /*! @function copyBytes
                    292:     @abstract Copy the data buffer (with length bytes) to a destination
                    293:     buffer provided by the caller.
                    294:     @param bytes Pointer to a destination buffer.
                    295:     @param inOutLength The caller must initialize the integer value pointed
                    296:     by inOutLength with the size of the destination buffer before the call.
                    297:     This method will overwrite it with the number of bytes copied.
                    298:     @result true if the destination buffer is larger than or equal to the 
                    299:     length of the data buffer, false otherwise. */
                    300: 
                    301:     virtual bool copyBytes(void * bytes, UInt * inOutLength) const;
                    302: 
                    303: /*! @function clearBytes
                    304:     @abstract Clear the entire data buffer and fill it with zeroes.
                    305:     @result true if the buffer was cleared, false otherwise. */
                    306: 
                    307:     virtual bool clearBytes();
                    308: 
                    309: /*! @function reset
                    310:     @abstract An access method to reset the data buffer.
                    311:     @discussion Handle an external request to reset the data buffer.
                    312:     If notication is enabled, then the notification handler is called
                    313:     after the data buffer has been cleared.
                    314:     @result kIOReturnNotWritable if reset access is not allowed,
                    315:     kIOReturnSuccess otherwise. If a notification handler is called,
                    316:     and it returns an error code, then that error is returned. */
                    317: 
                    318:     virtual IOReturn reset();
                    319: 
                    320: /*! @function read
                    321:     @abstract An access method to read from the data buffer.
                    322:     @discussion Handle an external request to read from the data buffer
                    323:     and copy it to the destination buffer provided. If notification is
                    324:     enabled, then the notification handler is called before the data buffer
                    325:     is copied to the destination buffer. The notification handler may use
                    326:     this opportunity to update the contents of the data buffer.
                    327:     @param inBuffer Pointer to the destination buffer.
                    328:     @param inOutSize Pointer to an integer containing the size of the
                    329:     destination buffer before the call. Overwritten by this method to
                    330:     the actual number of bytes copied to the destination buffer.
                    331:     @result kIOReturnSuccess on success,
                    332:     kIOReturnBadArgument if an argument provided is invalid,
                    333:     kIOReturnNoSpace if the destination buffer is too small,
                    334:     kIOReturnNotReadable if read access is not permitted,
                    335:     or an error from the notification handler. */
                    336: 
                    337:     virtual IOReturn read(void * inBuffer, UInt * inOutSize);
                    338: 
                    339: /*! @function write
                    340:     @abstract An access method to write to the data buffer.
                    341:     @discussion Handle an external request to write to the data buffer
                    342:     from a source buffer provided. If notification is enabled, then
                    343:     the notification handler is called after the source buffer has
                    344:     been copied to the data buffer.
                    345:     @param inBuffer Pointer to the source buffer.
                    346:     @param size Size of the source buffer in bytes.
                    347:     @result kIOReturnSuccess on success,
                    348:     kIOReturnBadArgument if an argument provided is invalid,
                    349:     kIOReturnNoSpace if the source buffer is too big,
                    350:     kIOReturnNotWritable if write access is not permitted,
                    351:     or an error from the notification handler. */
                    352: 
                    353:     virtual IOReturn write(void * inBuffer, UInt size);
                    354: 
                    355: /*! @function serialize
                    356:     @abstract Serialize the object, including the data buffer.
                    357:     @discussion If notification is enabled, then the notification
                    358:     handler is called just before the data buffer is serialized.
                    359:     @param s An OSSerialize object.
                    360:     @result true on success, false otherwise. */
                    361: 
                    362:     virtual bool serialize(OSSerialize * s) const;
                    363: };
                    364: 
                    365: #endif /* KERNEL */
                    366: 
                    367: #endif /* !_IONETWORKDATA_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.