#ifndef _IOKIT_IOFIREWIREIP_H
#define _IOKIT_IOFIREWIREIP_H
extern "C"{
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <net/dlil.h>
#include <sys/sysctl.h>
#include <sys/syslog.h>
#include <sys/kern_event.h>
#include <net/if.h>
#include <net/route.h>
#include <net/if_dl.h>
#include <net/if_types.h>
#include <firewire.h>
#include <if_firewire.h>
#include <netinet/in.h>
#include <netinet/in_var.h>
#include <netinet/icmp6.h>
#include <netinet/ip6.h>
#include <sys/socketvar.h>
#include <net/dlil.h>
}
#include <IOKit/assert.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOBSD.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOCommandPool.h>
#include <IOKit/IOBufferMemoryDescriptor.h>
#include <IOKit/IOTimerEventSource.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/IOService.h>
#include <IOKit/firewire/IOFWRegs.h>
#include <IOKit/firewire/IOFWAddressSpace.h>
#include <IOKit/firewire/IOLocalConfigDirectory.h>
#include <IOKit/firewire/IOFireWireBus.h>
#include <IOKit/firewire/IOFWDCLProgram.h>
#include <IOKit/firewire/IOFireWireUnit.h>
#include <IOKit/firewire/IOFireWireDevice.h>
#include <IOKit/network/IOGatedOutputQueue.h>
#include <IOFWController.h>
#include <IOFWInterface.h>
#include "IOFWAsyncStreamRxCommand.h"
#include "IOFireWireIPCommand.h"
#include "ip_firewire.h"
#include "IOFireWireIPDiagnostics.h"
#include "firewire.h"
class IOFireWireNub;
typedef UInt32 (*IOTransmitPacket)(mbuf_t m, void * param);
typedef bool (*IOUpdateARPCache)(void *refcon, IP1394_ARP *fwa);
typedef struct IOFireWireIPPrivateHandlers
{
OSObject *newService;
IOTransmitPacket transmitPacket;
IOUpdateARPCache updateARPCache;
};
#include "IOFWIPBusInterface.h"
#define kInvalidIPDeviceRefID 0
const UInt32 kUnicastHi = 0x0001;
const UInt32 kUnicastLo = 0x00000000;
const UInt32 kIOFireWireIPNoResources = 0xe0009001;
#define MAX_FIFO_SIZE 4096
#define WATCHDOG_TIMER_MS 1000
#define TRANSMIT_QUEUE_SIZE 256 // Overridden by IORegistry value
#define NETWORK_STAT_ADD( x ) (fpNetStats->x++)
#define ETHERNET_STAT_ADD( x ) (fpEtherStats->x++)
#define GUID_TYPE 0x1
#define kIOFWHWAddr "IOFWHWAddr"
#define kChannelPrime ((UInt32)0x80000000)
enum {
kNotifyOnSuccess = 0x80000000,
kDoNotNotifyOnFailure = 0x40000000,
kDoNotAllocate = 0x20000000,
kDoNotDeallocate = 0x10000000
};
const int kRCBExpirationtime = 2;
const bool kCopyBuffers = false;
const bool kQueueCommands = false;
const UInt32 kLowWaterMark = 48;
const int kDeviceHoldSeconds = (30*60);
class IOFireWireIP : public IOFWController
{
OSDeclareDefaultStructors(IOFireWireIP)
friend class IOFireWireIPDiagnostics;
friend class IOFWIPBusInterface;
private:
IOFWInterface *networkInterface;
IOBasicOutputQueue *transmitQueue;
IOPacketQueue *debugQueue;
IONetworkStats *fpNetStats;
IOFWStats *fpEtherStats;
IOFWAddress myAddress;
bool isPromiscuous;
bool multicastEnabled;
bool isFullDuplex;
bool netifEnabled;
bool busifEnabled;
bool fBuiltin; UInt32 linkStatusPrev;
UInt16 phyStatusPrev;
OSDictionary *mediumDict;
protected:
IOFireWireNub *fDevice;
IOFireWireController *fControl;
IOLocalConfigDirectory *fLocalIP1394ConfigDirectory;
IOLocalConfigDirectory *fLocalIP1394v6ConfigDirectory;
OSData *fwOwnAddr; IORecursiveLock *ipLock;
IOWorkLoop *workLoop;
IONotifier *fIPUnitNotifier;
IONotifier *fIPv6UnitNotifier;
LCB *fLcb;
u_char macAddr[FIREWIRE_ADDR_LEN];
bool fStarted;
bool fPacketsQueued;
UInt32 fActiveBcastCmds;
UInt32 fInActiveBcastCmds;
UInt32 fActiveCmds;
UInt32 fInActiveCmds;
UInt32 fNoCommands;
UInt32 fNoRCBCommands;
UInt32 fNoBCastCommands;
UInt32 fDoubleCompletes;
UInt32 fCallErrs;
UInt32 fServiceInOutput;
UInt32 fServiceInCallback;
UInt32 fRxFragmentPkts;
UInt32 fRxFragmentPktsDropped;
UInt32 fTxFragmentPkts;
UInt16 fMaxPktSize;
UInt16 fMaxInputCount;
UInt32 fTxBcast;
UInt32 fRxBcast;
UInt32 fTxUni;
UInt32 fRxUni;
UInt32 fMaxQueueSize;
UInt32 fLastStarted;
UInt32 fMaxPacketSize;
UInt32 fGaspTagError;
UInt32 fGaspHeaderError;
UInt32 fNonRFC2734Gasp;
UInt32 fRemoteGaspError; UInt32 fEncapsulationHeaderError;
UInt32 fNoMbufs;
IOFWSpeed fPrevBroadcastSpeed;
bool fDumpLog;
OSObject *fDiagnostics;
OSObject *fPrivateInterface;
IOTransmitPacket fOutAction;
IOUpdateARPCache fUpdateARPCache;
const OSSymbol *fDiagnostics_Symbol;
struct ExpansionData { };
ExpansionData *reserved;
public:
UInt32 fSubmitErrs;
UInt32 fNoResources;
UInt32 activeMbufs;
UInt32 inActiveMbufs;
UInt32 fBusyAcks;
UInt32 fFastRetryBusyAcks;
bool fDoFastRetry;
virtual bool start(IOService *provider);
virtual void stop(IOService *provider);
virtual void free();
virtual bool finalize(IOOptionBits options);
virtual IOReturn message(UInt32 type, IOService *provider, void *argument);
#pragma mark -
#pragma mark еее IOFWController defs еее
virtual IOReturn setMaxPacketSize(UInt32 maxSize);
virtual IOReturn getMaxPacketSize(UInt32 * maxSize) const;
virtual bool createWorkLoop();
virtual IOWorkLoop *getWorkLoop() const;
virtual IOOutputAction getOutputHandler() const;
virtual IOReturn enable(IONetworkInterface * netif);
virtual IOReturn disable(IONetworkInterface * netif);
virtual IOReturn setWakeOnMagicPacket( bool active );
virtual IOReturn getPacketFilters(const OSSymbol *group, UInt32 *filters ) const;
virtual IOReturn getHardwareAddress(IOFWAddress *addr);
virtual IOReturn setMulticastMode(IOEnetMulticastMode mode);
virtual IOReturn setMulticastList(IOFWAddress *addrs, UInt32 count);
virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode);
virtual IOOutputQueue *createOutputQueue();
virtual const OSString *newVendorString() const;
virtual const OSString *newModelString() const;
virtual const OSString *newRevisionString() const;
virtual IOReturn enable(IOKernelDebugger * debugger);
virtual IOReturn disable(IOKernelDebugger * debugger);
virtual bool configureInterface(IONetworkInterface *netif);
virtual void receivePackets(void * pkt, UInt32 pkt_len, UInt32 options);
static UInt32 outputPacket(mbuf_t m, void * param);
virtual bool arpCacheHandler(IP1394_ARP *fwa);
virtual UInt32 transmitPacket(mbuf_t m, void * param);
void networkStatAdd(UInt32 *x) const
{(*x)++;};
IONetworkStats* getNetStats() const
{return fpNetStats;};
bool createMediumState();
#pragma mark -
#pragma mark еее IOFireWireIP defs еее
UInt32 getMaxARDMAPacketSize();
UInt8 getMaxARDMARec(UInt32 size);
void updateMTU(UInt32 mtu);
IOFireWireNub* getDevice() const
{return fDevice;};
IOFireWireController *getController() const
{return fControl;};
LCB* getLcb() const
{return fLcb;};
IORecursiveLock *getIPLock() const
{return ipLock;};
inline void IOFireWireIP::closeIPGate()
{
IORecursiveLockLock(ipLock);
}
inline void IOFireWireIP::openIPGate()
{
IORecursiveLockUnlock(ipLock);
}
IOReturn createIPConfigRomEntry();
static bool fwIPUnitAttach(void *target, void *refCon, IOService *newService);
void registerFWIPPrivateHandlers(IOFireWireIPPrivateHandlers *service);
void deRegisterFWIPPrivateHandlers();
void getBytesFromGUID(void *guid, u_char *bufAddr, UInt8 type);
void makeEthernetAddress(CSRNodeUniqueID *fwuid, u_char *bufAddr, UInt32 vendorID);
#ifdef DEBUG
void showIPStatus();
#endif
};
#endif // _IOKIT_IOFIREWIREIP_H