IONetworkUserClient.cpp [plain text]
#include <IOKit/assert.h>
#include <IOKit/network/IONetworkInterface.h>
#include "IONetworkUserClient.h"
#include <IOKit/network/IONetworkData.h>
#define super IOUserClient
OSDefineMetaClassAndStructors( IONetworkUserClient, IOUserClient )
#ifdef DEBUG
#define DLOG(fmt, args...) IOLog(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif
IONetworkUserClient * IONetworkUserClient::withTask(task_t owningTask)
{
IONetworkUserClient * me;
me = new IONetworkUserClient;
if (me)
{
if (!me->init())
{
me->release();
return 0;
}
me->_task = owningTask;
}
return me;
}
bool IONetworkUserClient::start(IOService * provider)
{
UInt32 i;
_owner = OSDynamicCast(IONetworkInterface, provider);
assert(_owner);
if (!super::start(_owner))
return false;
if (!_owner->open(this))
return false;
i = kIONUCResetNetworkDataIndex;
_methods[i].object = this;
_methods[i].func = (IOMethod) &IONetworkUserClient::resetNetworkData;
_methods[i].count0 = kIONUCResetNetworkDataInputs;
_methods[i].count1 = kIONUCResetNetworkDataOutputs;
_methods[i].flags = kIONUCResetNetworkDataFlags;
i = kIONUCWriteNetworkDataIndex;
_methods[i].object = this;
_methods[i].func = (IOMethod) &IONetworkUserClient::writeNetworkData;
_methods[i].count0 = kIONUCWriteNetworkDataInput0;
_methods[i].count1 = kIONUCWriteNetworkDataInput1;
_methods[i].flags = kIONUCWriteNetworkDataFlags;
i = kIONUCReadNetworkDataIndex;
_methods[i].object = this;
_methods[i].func = (IOMethod) &IONetworkUserClient::readNetworkData;
_methods[i].count0 = kIONUCReadNetworkDataInputs;
_methods[i].count1 = kIONUCReadNetworkDataOutputs;
_methods[i].flags = kIONUCReadNetworkDataFlags;
i = kIONUCGetNetworkDataCapacityIndex;
_methods[i].object = this;
_methods[i].func = (IOMethod)
&IONetworkUserClient::getNetworkDataCapacity;
_methods[i].count0 = kIONUCGetNetworkDataCapacityInputs;
_methods[i].count1 = kIONUCGetNetworkDataCapacityOutputs;
_methods[i].flags = kIONUCGetNetworkDataCapacityFlags;
i = kIONUCGetNetworkDataHandleIndex;
_methods[i].object = this;
_methods[i].func = (IOMethod) &IONetworkUserClient::getNetworkDataHandle;
_methods[i].count0 = kIONUCGetNetworkDataHandleInputs;
_methods[i].count1 = kIONUCGetNetworkDataHandleOutputs;
_methods[i].flags = kIONUCGetNetworkDataHandleFlags;
return true;
}
void IONetworkUserClient::free()
{
super::free();
}
IOReturn IONetworkUserClient::clientClose()
{
if (_owner) {
_owner->close(this);
detach(_owner);
}
return kIOReturnSuccess;
}
IOReturn IONetworkUserClient::clientDied()
{
return clientClose();
}
IOExternalMethod *
IONetworkUserClient::getExternalMethodForIndex(UInt32 index)
{
if (index >= kIONUCLastIndex)
return 0;
else
return &_methods[index];
}
IOReturn IONetworkUserClient::resetNetworkData(OSSymbol * key)
{
IONetworkData * data;
IOReturn ret;
data = _owner->getNetworkData(key);
ret = data ? data->reset() : kIOReturnBadArgument;
return ret;
}
IOReturn
IONetworkUserClient::writeNetworkData(OSSymbol * key,
void * srcBuffer,
IOByteCount srcBufferSize)
{
IONetworkData * data;
IOReturn ret;
if (!srcBuffer || (srcBufferSize == 0))
return kIOReturnBadArgument;
data = _owner->getNetworkData(key);
ret = data ? data->write(srcBuffer, srcBufferSize) : kIOReturnBadArgument;
return ret;
}
IOReturn
IONetworkUserClient::readNetworkData(OSSymbol * key,
void * dstBuffer,
IOByteCount * dstBufferSize)
{
IONetworkData * data;
IOReturn ret ;
if (!dstBuffer || !dstBufferSize)
return kIOReturnBadArgument;
data = _owner->getNetworkData(key);
ret = data ? data->read(dstBuffer, dstBufferSize) :
kIOReturnBadArgument;
return ret;
}
IOReturn
IONetworkUserClient::getNetworkDataCapacity(OSSymbol * key,
UInt32 * capacity)
{
IOReturn ret = kIOReturnBadArgument;
IONetworkData * data;
data = _owner->getNetworkData(key);
if (data) {
*capacity = data->getSize();
ret = kIOReturnSuccess;
}
return ret;
}
IOReturn
IONetworkUserClient::getNetworkDataHandle(char * name,
OSSymbol ** handle,
IOByteCount nameSize,
IOByteCount * handleSizeP)
{
IOReturn ret = kIOReturnBadArgument;
const OSSymbol * key;
if (!name || !nameSize || (name[nameSize - 1] != '\0') ||
(*handleSizeP != sizeof(*handle)))
return kIOReturnBadArgument;
key = OSSymbol::withCStringNoCopy(name);
if (!key)
return kIOReturnNoMemory;
if (_owner->getNetworkData(key))
{
*handle = (OSSymbol *) key;
ret = kIOReturnSuccess;
}
if (key)
key->release();
return ret;
}
IOReturn
IONetworkUserClient::setProperties(OSObject * properties)
{
return _owner->setProperties(properties);
}
IOService * IONetworkUserClient::getService()
{
return _owner;
}