IOEthernetController.cpp [plain text]
#include <IOKit/assert.h>
#include <IOKit/network/IOEthernetController.h>
#include <IOKit/network/IOEthernetInterface.h>
extern "C" {
#include <sys/socket.h>
#include <net/if.h>
#include <net/etherdefs.h>
}
#define super IONetworkController
OSDefineMetaClassAndAbstractStructors( IOEthernetController, IONetworkController)
OSMetaClassDefineReservedUnused( IOEthernetController, 0);
OSMetaClassDefineReservedUnused( IOEthernetController, 1);
OSMetaClassDefineReservedUnused( IOEthernetController, 2);
OSMetaClassDefineReservedUnused( IOEthernetController, 3);
OSMetaClassDefineReservedUnused( IOEthernetController, 4);
OSMetaClassDefineReservedUnused( IOEthernetController, 5);
OSMetaClassDefineReservedUnused( IOEthernetController, 6);
OSMetaClassDefineReservedUnused( IOEthernetController, 7);
OSMetaClassDefineReservedUnused( IOEthernetController, 8);
OSMetaClassDefineReservedUnused( IOEthernetController, 9);
OSMetaClassDefineReservedUnused( IOEthernetController, 10);
OSMetaClassDefineReservedUnused( IOEthernetController, 11);
OSMetaClassDefineReservedUnused( IOEthernetController, 12);
OSMetaClassDefineReservedUnused( IOEthernetController, 13);
OSMetaClassDefineReservedUnused( IOEthernetController, 14);
OSMetaClassDefineReservedUnused( IOEthernetController, 15);
OSMetaClassDefineReservedUnused( IOEthernetController, 16);
OSMetaClassDefineReservedUnused( IOEthernetController, 17);
OSMetaClassDefineReservedUnused( IOEthernetController, 18);
OSMetaClassDefineReservedUnused( IOEthernetController, 19);
OSMetaClassDefineReservedUnused( IOEthernetController, 20);
OSMetaClassDefineReservedUnused( IOEthernetController, 21);
OSMetaClassDefineReservedUnused( IOEthernetController, 22);
OSMetaClassDefineReservedUnused( IOEthernetController, 23);
OSMetaClassDefineReservedUnused( IOEthernetController, 24);
OSMetaClassDefineReservedUnused( IOEthernetController, 25);
OSMetaClassDefineReservedUnused( IOEthernetController, 26);
OSMetaClassDefineReservedUnused( IOEthernetController, 27);
OSMetaClassDefineReservedUnused( IOEthernetController, 28);
OSMetaClassDefineReservedUnused( IOEthernetController, 29);
OSMetaClassDefineReservedUnused( IOEthernetController, 30);
OSMetaClassDefineReservedUnused( IOEthernetController, 31);
#ifdef DEBUG
#define DLOG(fmt, args...) IOLog(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif
void IOEthernetController::initialize()
{
}
bool IOEthernetController::init(OSDictionary * properties)
{
if (!super::init(properties))
{
DLOG("IOEthernetController: super::init() failed\n");
return false;
}
return true;
}
void IOEthernetController::free()
{
super::free();
}
bool IOEthernetController::publishProperties()
{
bool ret = false;
IOEthernetAddress addr;
OSDictionary * dict;
do {
if (super::publishProperties() == false)
break;
if ( (getHardwareAddress(&addr) != kIOReturnSuccess) ||
(setProperty(kIOMACAddress, (void *) &addr,
kIOEthernetAddressSize) == false) )
{
break;
}
dict = OSDynamicCast(OSDictionary, getProperty(kIOPacketFilters));
if ( dict )
{
UInt32 filters;
OSNumber * num;
if ( getPacketFilters(gIOEthernetWakeOnLANFilterGroup,
&filters) != kIOReturnSuccess )
{
break;
}
num = OSNumber::withNumber(filters, sizeof(filters) * 8);
if (num == 0)
break;
ret = dict->setObject(gIOEthernetWakeOnLANFilterGroup, num);
num->release();
}
}
while (false);
return ret;
}
IOReturn
IOEthernetController::setHardwareAddress(const IOEthernetAddress * addr)
{
return kIOReturnUnsupported;
}
IOReturn IOEthernetController::setMulticastMode(bool active)
{
return kIOReturnUnsupported;
}
IOReturn IOEthernetController::setPromiscuousMode(bool active)
{
return kIOReturnUnsupported;
}
IOReturn IOEthernetController::setWakeOnMagicPacket(bool active)
{
return kIOReturnUnsupported;
}
IOReturn IOEthernetController::setMulticastList(IOEthernetAddress * ,
UInt32 )
{
return kIOReturnUnsupported;
}
IONetworkInterface * IOEthernetController::createInterface()
{
IOEthernetInterface * netif = new IOEthernetInterface;
if ( netif && ( netif->init( this ) == false ) )
{
netif->release();
netif = 0;
}
return netif;
}
IOReturn
IOEthernetController::getPacketFilters(const OSSymbol * group,
UInt32 * filters) const
{
*filters = 0;
if ( group == gIONetworkFilterGroup )
{
return getPacketFilters(filters);
}
else
{
return kIOReturnSuccess;
}
}
IOReturn IOEthernetController::getPacketFilters(UInt32 * filters) const
{
*filters = ( kIOPacketFilterUnicast |
kIOPacketFilterBroadcast |
kIOPacketFilterMulticast |
kIOPacketFilterPromiscuous );
return kIOReturnSuccess;
}
#define UCAST_BCAST_MASK \
( kIOPacketFilterUnicast | kIOPacketFilterBroadcast )
IOReturn IOEthernetController::enablePacketFilter(
const OSSymbol * group,
UInt32 aFilter,
UInt32 enabledFilters,
IOOptionBits options = 0)
{
IOReturn ret = kIOReturnUnsupported;
UInt32 newFilters = enabledFilters | aFilter;
if ( group == gIONetworkFilterGroup )
{
if ( aFilter == kIOPacketFilterMulticast )
{
ret = setMulticastMode(true);
}
else if ( aFilter == kIOPacketFilterPromiscuous )
{
ret = setPromiscuousMode(true);
}
else if ( (newFilters ^ enabledFilters) & UCAST_BCAST_MASK )
{
ret = kIOReturnSuccess;
}
}
else if ( group == gIOEthernetWakeOnLANFilterGroup )
{
if ( aFilter == kIOEthernetWakeOnMagicPacket )
{
ret = setWakeOnMagicPacket(true);
}
}
return ret;
}
IOReturn IOEthernetController::disablePacketFilter(
const OSSymbol * group,
UInt32 aFilter,
UInt32 enabledFilters,
IOOptionBits options = 0)
{
IOReturn ret = kIOReturnUnsupported;
UInt32 newFilters = enabledFilters & ~aFilter;
if ( group == gIONetworkFilterGroup )
{
if ( aFilter == kIOPacketFilterMulticast )
{
ret = setMulticastMode(false);
}
else if ( aFilter == kIOPacketFilterPromiscuous )
{
ret = setPromiscuousMode(false);
}
else if ( (newFilters ^ enabledFilters) & UCAST_BCAST_MASK )
{
ret = kIOReturnSuccess;
}
}
else if ( group == gIOEthernetWakeOnLANFilterGroup )
{
if ( aFilter == kIOEthernetWakeOnMagicPacket )
{
ret = setWakeOnMagicPacket(false);
}
}
return ret;
}
IOReturn
IOEthernetController::getHardwareAddress(void * addr,
UInt32 * inOutAddrBytes)
{
UInt32 bufBytes;
if (inOutAddrBytes == 0)
return kIOReturnBadArgument;
bufBytes = *inOutAddrBytes;
*inOutAddrBytes = kIOEthernetAddressSize;
if ((addr == 0) || (bufBytes < kIOEthernetAddressSize))
return kIOReturnNoSpace;
return getHardwareAddress((IOEthernetAddress *) addr);
}
IOReturn
IOEthernetController::setHardwareAddress(const void * addr,
UInt32 addrBytes)
{
if ((addr == 0) || (addrBytes != kIOEthernetAddressSize))
return kIOReturnBadArgument;
return setHardwareAddress((const IOEthernetAddress *) addr);
}
IOReturn IOEthernetController::getMaxPacketSize(UInt32 * maxSize) const
{
*maxSize = kIOEthernetMaxPacketSize;
return kIOReturnSuccess;
}
IOReturn IOEthernetController::getMinPacketSize(UInt32 * minSize) const
{
*minSize = kIOEthernetMinPacketSize;
return kIOReturnSuccess;
}