diff --git a/Headers/IOKit/80211/Apple80211.h b/Headers/IOKit/80211/Apple80211.h deleted file mode 100644 index f29a8152..00000000 --- a/Headers/IOKit/80211/Apple80211.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// Apple80211.h -// itlwm -// -// Created by qcwap on 2020/9/4. -// Copyright © 2020 钟先耀. All rights reserved. -// - -#ifndef Apple80211_h -#define Apple80211_h - -#include -#include -#include -#include -#include -#include -#include -#if __IO80211_TARGET >= __MAC_10_15 -#include -#endif - -#endif /* Apple80211_h */ diff --git a/Headers/IOKit/80211/IO80211Controller.h b/Headers/IOKit/80211/IO80211Controller.h index 5a8906cb..a898bd35 100644 --- a/Headers/IOKit/80211/IO80211Controller.h +++ b/Headers/IOKit/80211/IO80211Controller.h @@ -1,116 +1,136 @@ -// -// IO80211Controller.h -// IO80211Family -// +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ #ifndef _IO80211CONTROLLER_H #define _IO80211CONTROLLER_H -#if defined(KERNEL) && defined(__cplusplus) +#ifndef __PRIVATE_SPI__ +#define __PRIVATE_SPI__ +#endif #include #include -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif - -#if VERSION_MAJOR > 8 -#define _MODERN_BPF -#endif - #include - -#include - #include #include -#include "apple80211_ioctl.h" -#include "IO80211SkywalkInterface.h" -#include "IO80211WorkLoop.h" - -#define AUTH_TIMEOUT 15 // seconds - -/*! @enum LinkSpeed. - @abstract ???. - @discussion ???. - @constant LINK_SPEED_80211A 54 Mbps - @constant LINK_SPEED_80211B 11 Mbps. - @constant LINK_SPEED_80211G 54 Mbps. +#include +#include +#include +#include +#include + +#define AUTH_TIMEOUT 15 // seconds + +/*! @enum linkSpeed. + @abstract The link speed of different 80211 protocols. + @constant LINK_SPEED_80211A 54 Mbps + @constant LINK_SPEED_80211B 11 Mbps. + @constant LINK_SPEED_80211G 54 Mbps. + @constant LINK_SPEED_80211N 300 Mbps. */ -enum { + +enum linkSpeed +{ LINK_SPEED_80211A = 54000000ul, // 54 Mbps LINK_SPEED_80211B = 11000000ul, // 11 Mbps LINK_SPEED_80211G = 54000000ul, // 54 Mbps - LINK_SPEED_80211N = 300000000ul, // 300 Mbps (MCS index 15, 400ns GI, 40 MHz channel) + LINK_SPEED_80211N = 300000000ul, // 300 Mbps (MCS index 15, 400ns GI, 40 MHz channel) }; +enum scanSource +{ + kScanSourceScanManagerFamily = 0x00, + kScanSourceDriverInterleavedScan = 0x01, + kScanSourceDriverScanDone = 0x02, + kScanSourceDriverInternalScanDone = 0x03, + kScanSourceDebugCmd = 0x04, + kScanSourceJoining = 0x05, + kScanSourceFirmwareStartedScan = 0x06, + kScanSourceScanRefused = 0x07, + kScanSourceScanError = 0x08, + kScanSourceScanBlocked = 0x09, + kScanSourceScanDone = 0x0A, + kScanSourcesUnknown +}; + +enum joinStatus {}; +enum CCStreamLogLevel {}; + enum IO80211CountryCodeOp { kIO80211CountryCodeReset, // Reset country code to world wide default, and start // searching for 802.11d beacon }; -typedef enum IO80211CountryCodeOp IO80211CountryCodeOp; enum IO80211SystemPowerState { kIO80211SystemPowerStateUnknown, kIO80211SystemPowerStateAwake, - kIO80211SystemPowerStateSleeping, + kIO80211SystemPowerStateSleeping }; -typedef enum IO80211SystemPowerState IO80211SystemPowerState; enum IO80211FeatureCode { - kIO80211Feature80211n = 1, + kIO80211Feature80211n = 1, + kIO80211Feature80211ac = 2, + kIO80211Feature80211ax = 3 }; -typedef enum IO80211FeatureCode IO80211FeatureCode; - class IOSkywalkInterface; -class IO80211ScanManager; -enum CCStreamLogLevel -{ - LEVEL_1, -}; - -enum scanSource -{ - SOURCE_1, -}; - -enum joinStatus -{ - STATUS_1, -}; - -class IO80211Controller; class IO80211Interface; -class IO82110WorkLoop; class IO80211VirtualInterface; +class IO80211SkywalkInterface; +class IO80211InfraInterface; class IO80211ControllerMonitor; -class CCLogPipe; -class CCIOReporterLogStream; -class CCLogStream; -class IO80211VirtualInterface; +class IO80211ScanManager; class IO80211RangingManager; class IO80211FlowQueue; -class IO80211FlowQueueLegacy; -class FlowIdMetadata; class IOReporter; -extern void IO80211VirtualInterfaceNamerRetain(); +class CCPipe; +class CCLogPipe; +class CCIOReporterLogStream; +class CCLogStream; +class CCFaultReporter; +class CCDataStream; struct apple80211_hostap_state; - -struct apple80211_awdl_sync_channel_sequence; -struct ieee80211_ht_capability_ie; struct apple80211_channel_switch_announcement; struct apple80211_beacon_period_data; struct apple80211_power_debug_sub_info; -struct apple80211_stat_report; +struct apple80211_stat_report; // size = 40 struct apple80211_frame_counters; struct apple80211_leaky_ap_event; struct apple80211_chip_stats; @@ -118,241 +138,287 @@ struct apple80211_extended_stats; struct apple80211_ampdu_stat_report; struct apple80211_btCoex_report; struct apple80211_cca_report; -class CCPipe; struct apple80211_lteCoex_report; -//typedef int scanSource; -//typedef int joinStatus; -//typedef int CCStreamLogLevel; -typedef IOReturn (*IOCTL_FUNC)(IO80211Controller*, IO80211Interface*, IO80211VirtualInterface*, apple80211req*, bool); -extern IOCTL_FUNC gGetHandlerTable[]; -extern IOCTL_FUNC gSetHandlerTable[]; +typedef errno_t (*apple80211_ioctl_func)( IO80211Controller * controller, IO80211Interface * interface, IO80211VirtualInterface * virtualInterface, apple80211req * request, bool isNewRequest ); +extern apple80211_ioctl_func gGetHandlerTable[]; +extern apple80211_ioctl_func gSetHandlerTable[]; -class IO80211Controller : public IOEthernetController { - OSDeclareAbstractStructors(IO80211Controller) +class IO80211Controller : public IOEthernetController +{ + OSDeclareAbstractStructors( IO80211Controller ) public: - + virtual bool init( OSDictionary * dictionary = NULL ) APPLE_KEXT_OVERRIDE; virtual void free() APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET <= __MAC_10_15 - virtual bool terminate(unsigned int) APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_15 + virtual bool terminate( IOOptionBits options ) APPLE_KEXT_OVERRIDE; #endif - virtual bool init(OSDictionary *) APPLE_KEXT_OVERRIDE; - virtual IOReturn configureReport(IOReportChannelList *,UInt,void *,void *) APPLE_KEXT_OVERRIDE; - virtual IOReturn updateReport(IOReportChannelList *,UInt,void *,void *) APPLE_KEXT_OVERRIDE; - virtual bool start(IOService *) APPLE_KEXT_OVERRIDE; - virtual void stop(IOService *) APPLE_KEXT_OVERRIDE; - virtual IOService* getProvider(void) const APPLE_KEXT_OVERRIDE; - virtual IOWorkLoop* getWorkLoop(void) const APPLE_KEXT_OVERRIDE; - virtual const char* stringFromReturn(int) APPLE_KEXT_OVERRIDE; - virtual int errnoFromReturn(int) APPLE_KEXT_OVERRIDE; - virtual IOOutputQueue* getOutputQueue(void) const APPLE_KEXT_OVERRIDE; - virtual bool createWorkLoop(void) APPLE_KEXT_OVERRIDE; - virtual IOReturn enable(IONetworkInterface *) APPLE_KEXT_OVERRIDE; - virtual IOReturn disable(IONetworkInterface *) APPLE_KEXT_OVERRIDE; - virtual bool attachInterface(IONetworkInterface **, bool attach = true) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_10_15 - virtual void detachInterface(IONetworkInterface *, bool sync = false) APPLE_KEXT_OVERRIDE; -#endif - virtual IONetworkInterface* createInterface(void) APPLE_KEXT_OVERRIDE; - virtual bool configureInterface(IONetworkInterface *) APPLE_KEXT_OVERRIDE; -#ifdef __PRIVATE_SPI__ - virtual IOReturn outputStart(IONetworkInterface *,UInt) APPLE_KEXT_OVERRIDE; + + IOReturn createIOReporters( IOService * provider ); + void releaseIOReporters(); + IOReturn findAndAttachToFaultReporter(); + void resetIO80211ReporterHistory(); + virtual IOReturn configureReport( IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport( IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + IOReturn addReporterLegend( IOService * reportLegend, IOReporter * reporter, const char * groupName, const char * subGroupName ); + IOReturn removeReporterFromLegend( IOService * reportLegend, IOReporter * reporter, const char * groupName, const char * subGroupName ); + void lockIOReporterLegend(); + void unlockIOReporterLegend(); + void handleIOReporterTimer( IOTimerEventSource * timer ); + IOReturn logIOReportLogStreamSubscription( UInt64 subscription ); + IOReturn addIOReportLogStreamForProvider( IOService * provider, UInt64 * subscription ); + IOReturn addSubscriptionForThisReporterFetchedOnTimer( IOReporter * reporter, const char * groupName, const char * subGroupName, IOService * driver ); + IOReturn addSubscriptionForProviderFetchedOnTimer( IOService * provider ); + void setIOReportersStreamFlags( UInt64 flags ); + void setIOReportersStreamLevel(); + void updateIOReportersStreamFrequency(); + + virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + virtual int errnoFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + + errno_t getASSOCIATE_RESULT( IO80211Interface * interface, IO80211VirtualInterface * vif, IO80211SkywalkInterface * skywalk, apple80211_assoc_result_data * result ); + errno_t getASSOCIATE_EXTENDED_RESULT( IO80211Interface * interface, IO80211VirtualInterface * vif, IO80211InfraInterface * infra, apple80211_assoc_result_data * result ); + bool getSSIDData( apple80211_ssid_data * ssid ); + bool getBSSIDData( OSObject * interface, apple80211_bssid_data * bssid ); + bool getBeaconPeriod( apple80211_beacon_period_data * period ); + bool getChipCounterStats( apple80211_chip_stats * chip ); + bool getInfraExtendedStats( apple80211_extended_stats * infra ); + bool getInfraChannel( apple80211_channel_data * channel ); + bool getCountryCode( apple80211_country_code_data * countryCode ); + + bool setChanCCA( apple80211_stat_report * stat, int cca ); + bool setChanExtendedCCA( apple80211_stat_report * stat, apple80211_cca_report * cca ); + bool setChanNoiseFloor( apple80211_stat_report * stat, int value ); + bool setChanNoiseFloorLTE( apple80211_stat_report * stat, int value ); + bool setAMPDUstat( apple80211_stat_report * stat, apple80211_ampdu_stat_report * ampdu, apple80211_channel * channel ); + bool setBTCoexstat( apple80211_stat_report * stat, apple80211_btCoex_report * btCoex ); + bool setLTECoexstat( apple80211_stat_report * stat, apple80211_lteCoex_report * lteCoex ); + bool setPowerStats( apple80211_stat_report * stat, apple80211_power_debug_sub_info * info ); + bool setFrameStats( apple80211_stat_report * stat, apple80211_frame_counters * counters, apple80211_channel * channel ); + bool setLeakyAPStats( apple80211_leaky_ap_event * event ); + bool setChipCounterStats( apple80211_stat_report * stat, apple80211_chip_stats * chip, apple80211_channel * channel ); + bool setExtendedChipCounterStats( apple80211_stat_report * stat, void * chip ); + errno_t setCountryCode( apple80211_country_code_data * countryCode ); + + void log11axAsrTxLatency( UInt64 frequency, UInt32 channel ); + IOReturn get11axAsrTxLatencyClearOnRead( OSData * data ); + + bool forceInterfaceRegistration( IO80211Interface * interface ); + bool attachInterfaceWithMacAddress( void * macAddress, UInt32 addrLen, IONetworkInterface ** outInterface, bool doRegister, UInt32 attachTimeout ); + + virtual bool attachInterface( IONetworkInterface ** interface, bool doRegister = true ) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual void detachInterface( IONetworkInterface * interface, bool sync = false ) APPLE_KEXT_OVERRIDE; #endif - virtual IOReturn getHardwareAddress(IOEthernetAddress *) APPLE_KEXT_OVERRIDE; - virtual void requestPacketTx(void*, UInt); - virtual IOReturn getHardwareAddressForInterface(IO80211Interface *,IOEthernetAddress *); - virtual void inputMonitorPacket(mbuf_t,UInt,void *,unsigned long); - virtual int outputRaw80211Packet(IO80211Interface *,mbuf_t); - virtual int outputActionFrame(IO80211Interface *,mbuf_t); - virtual int bpfOutputPacket(OSObject *,UInt,mbuf_t m); - virtual SInt32 monitorModeSetEnabled(IO80211Interface*, bool, UInt); - virtual IO80211Interface* getNetworkInterface(void); -#if __IO80211_TARGET >= __MAC_10_15 - virtual IO80211SkywalkInterface* getPrimarySkywalkInterface(void); + virtual IONetworkInterface * createInterface() APPLE_KEXT_OVERRIDE; + virtual bool configureInterface( IONetworkInterface * interface ) APPLE_KEXT_OVERRIDE; + virtual IOReturn outputStart( IONetworkInterface * interface, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual void requestPacketTx( void * packet, UInt32 size ); + virtual IOReturn getHardwareAddress( IOEthernetAddress * addrP ) APPLE_KEXT_OVERRIDE { return kIOReturnUnsupported; } + virtual IOReturn getHardwareAddressForInterface( IO80211Interface * interface, IOEthernetAddress * addrP ); + virtual void inputMonitorPacket( mbuf_t packet, UInt32 dataLinkType, void * header, size_t headerSize ); + virtual errno_t outputRaw80211Packet( IO80211Interface * interface, mbuf_t packet ); + virtual errno_t outputActionFrame( IO80211Interface * interface, mbuf_t packet ); + virtual errno_t bpfOutputPacket( OSObject *, UInt32 dataLinkType, mbuf_t packet ); + virtual errno_t monitorModeSetEnabled( IO80211Interface * interface, bool enabled, IOOptionBits options ) { return ENXIO; } + void setDisplayState( bool state ); + + virtual IOService * getProvider() const APPLE_KEXT_OVERRIDE; + virtual bool createWorkLoop() APPLE_KEXT_OVERRIDE; + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; + virtual IOOutputQueue * getOutputQueue() const APPLE_KEXT_OVERRIDE; + virtual IO80211Interface * getNetworkInterface(); + IO80211ScanManager * getPrimaryInterfaceScanManager(); + IO80211LinkState getPrimaryInterfaceLinkState(); + void setPrimaryInterfaceDatapathState( bool state ); + IO80211SkywalkInterface * getInfraInterface(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IO80211SkywalkInterface * getPrimarySkywalkInterface(); #endif - virtual SInt32 apple80211_ioctl(IO80211Interface *, IO80211VirtualInterface*, ifnet_t,unsigned long,void *); -#if __IO80211_TARGET >= __MAC_10_15 - virtual SInt32 apple80211_ioctl(IO80211SkywalkInterface *,unsigned long,void *); + IO80211ControllerMonitor * getInterfaceMonitor(); + + virtual errno_t apple80211_ioctl( IO80211Interface * interface, IO80211VirtualInterface * virtualInterface, ifnet_t netif, unsigned long cmd, void * data ); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual errno_t apple80211_ioctl( IO80211SkywalkInterface * interface, unsigned long cmd, void * data ); #endif - virtual SInt32 apple80211_ioctl(IO80211Interface *interface, ifnet_t net,unsigned long id,void *data) { - return apple80211_ioctl(interface, NULL, net, id, data); - } - virtual SInt32 apple80211Request(unsigned int, int, IO80211Interface*, void*) = 0; - virtual SInt32 apple80211VirtualRequest(UInt,int,IO80211VirtualInterface *,void *); -#if __IO80211_TARGET >= __MAC_10_15 - virtual SInt32 apple80211SkywalkRequest(UInt,int,IO80211SkywalkInterface *,void *); + virtual errno_t apple80211_ioctl( IO80211Interface * interface, ifnet_t netif, unsigned long cmd, void * data ); + virtual errno_t apple80211Request( UInt32 req, int type, IO80211Interface * interface, void * data ); + errno_t apple80211RequestIoctl( UInt32 req, int type, IO80211Interface * interface, void * data ); + errno_t apple80211VirtualRequestIoctl( UInt32 req, int type, IO80211VirtualInterface * interface, void * data ); + virtual errno_t apple80211VirtualRequest( UInt32 req, int type, IO80211VirtualInterface * virtualInterface, void * data ) { return EOPNOTSUPP; } +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual errno_t apple80211SkywalkRequest( UInt32 req, int type, IO80211SkywalkInterface * skywalkInterface, void * data ) { return EOPNOTSUPP; } #endif - virtual SInt32 stopDMA() = 0; - virtual UInt32 hardwareOutputQueueDepth(IO80211Interface*) = 0; - virtual SInt32 performCountryCodeOperation(IO80211Interface*, IO80211CountryCodeOp) = 0; - virtual bool useAppleRSNSupplicant(IO80211Interface *); - virtual bool useAppleRSNSupplicant(IO80211VirtualInterface *); - virtual void dataLinkLayerAttachComplete(IO80211Interface *); - virtual SInt32 enableFeature(IO80211FeatureCode, void*) = 0; - virtual SInt32 setVirtualHardwareAddress(IO80211VirtualInterface *,ether_addr *); - virtual SInt32 enableVirtualInterface(IO80211VirtualInterface *); - virtual SInt32 disableVirtualInterface(IO80211VirtualInterface *); - virtual bool requiresExplicitMBufRelease() { - return false; - } - virtual bool flowIdSupported() { - return false; - } - virtual IO80211FlowQueueLegacy* requestFlowQueue(FlowIdMetadata const*); - virtual void releaseFlowQueue(IO80211FlowQueue *); -#if __IO80211_TARGET >= __MAC_10_15 - virtual void getLogPipes(CCPipe**, CCPipe**, CCPipe**) {}; + + virtual errno_t stopDMA() { return EOPNOTSUPP; } + virtual UInt32 hardwareOutputQueueDepth( IO80211Interface * interface ) { return 0; } + virtual errno_t performCountryCodeOperation( IO80211Interface * interface, IO80211CountryCodeOp operation ) { return EOPNOTSUPP; } + virtual bool useAppleRSNSupplicant( IO80211Interface * interface ); + virtual bool useAppleRSNSupplicant( IO80211VirtualInterface * virtualInterface ); + virtual void dataLinkLayerAttachComplete( IO80211Interface * interface ); + + void enableFeatureForLoggingFlags( UInt64 flags ) {} + virtual errno_t enableFeature( IO80211FeatureCode feature, void * data ) { return EOPNOTSUPP; } + virtual errno_t setVirtualHardwareAddress( IO80211VirtualInterface * interface, ether_addr * address ) { return EOPNOTSUPP; } + virtual IOReturn enableVirtualInterface( IO80211VirtualInterface * interface ) { return kIOReturnSuccess; } + virtual IOReturn disableVirtualInterface( IO80211VirtualInterface * interface ) { return kIOReturnSuccess; } + virtual bool requiresExplicitMBufRelease() { return false; } + virtual bool flowIdSupported() { return false; } + virtual IO80211FlowQueueLegacy * requestFlowQueue( const struct FlowIdMetadata * ); + virtual void releaseFlowQueue( IO80211FlowQueue * queue ); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual void getLogPipes( CCPipe **, CCPipe **, CCPipe ** ) {} #endif - virtual IOReturn enablePacketTimestamping(void) { - return kIOReturnUnsupported; - } - virtual IOReturn disablePacketTimestamping(void) { - return kIOReturnUnsupported; - } - virtual UInt32 selfDiagnosticsReport(int,char const*,UInt); - virtual UInt32 getDataQueueDepth(OSObject *); -#if __IO80211_TARGET >= __MAC_11_0 - virtual bool isAssociatedToMovingNetwork(void) { return false; } + + IOReturn requestQueueSizeAndTimeout( UInt16 * size, UInt16 * timeout ) { return kIOReturnUnsupported; } + virtual IOReturn enablePacketTimestamping() { return kIOReturnUnsupported; } + virtual IOReturn disablePacketTimestamping() { return kIOReturnUnsupported; } + virtual IOReturn selfDiagnosticsReport( IOReturn error, const char * errorString, IOOptionBits options ); + virtual UInt32 getDataQueueDepth( OSObject * queue ) { return 1024; } +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual bool isAssociatedToMovingNetwork() { return false; } #endif - virtual mbuf_flags_t inputPacket(mbuf_t); - virtual SInt32 apple80211_ioctl_get(IO80211Interface *,IO80211VirtualInterface *,ifnet_t,void *); + virtual mbuf_flags_t inputPacket( mbuf_t packet ); + void dispatchPacket( mbuf_t packet, UInt32, char * name, UInt32 ); -#if __IO80211_TARGET >= __MAC_10_15 - virtual SInt32 apple80211_ioctl_get(IO80211SkywalkInterface *,void *); - virtual SInt32 apple80211_ioctl_set(IO80211Interface *,IO80211VirtualInterface *,IO80211SkywalkInterface *,void *); - virtual SInt32 apple80211_ioctl_set(IO80211SkywalkInterface *,void*); - virtual bool attachInterface(IOSkywalkInterface *,IOService *); -#else - virtual SInt32 apple80211_ioctl_set(IO80211Interface *,IO80211VirtualInterface *,ifnet_t,void *); -#endif + virtual errno_t apple80211_ioctl_get( IO80211Interface * interface, IO80211VirtualInterface * virtualInterface, ifnet_t netif, void * data ); + virtual errno_t apple80211_ioctl_get( IO80211SkywalkInterface * skywalk, void * data ); + errno_t apple80211_ioctl_get( IO80211Interface * interface, IO80211VirtualInterface * vif, IO80211SkywalkInterface * skywalk, void * data ); + virtual errno_t apple80211_ioctl_set( IO80211Interface * interface, IO80211VirtualInterface * virtualInterface, ifnet_t netif, void * data ); + virtual errno_t apple80211_ioctl_set( IO80211SkywalkInterface * skywalk, void * data ); + errno_t apple80211_ioctl_set( IO80211Interface * interface, IO80211VirtualInterface * vif, IO80211SkywalkInterface * skywalk, void * data ); -#if __IO80211_TARGET >= __MAC_11_0 - virtual bool detachInterface(IOSkywalkInterface *, bool); + virtual bool attachInterface( IOSkywalkInterface * skywalkInterface, IOService * provider ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual bool detachInterface( IOSkywalkInterface * skywalkInterface, bool doRegister ); #endif - virtual IO80211VirtualInterface* createVirtualInterface(ether_addr *,UInt); - virtual bool attachVirtualInterface(IO80211VirtualInterface **,ether_addr *,UInt,bool); - virtual bool detachVirtualInterface(IO80211VirtualInterface *,bool); -#if __IO80211_TARGET >= __MAC_10_15 - virtual IOReturn enable(IO80211SkywalkInterface *); - virtual IOReturn disable(IO80211SkywalkInterface *); + virtual IO80211VirtualInterface * createVirtualInterface( ether_addr * address, UInt32 role ); + virtual bool attachVirtualInterface( IO80211VirtualInterface ** interface, ether_addr * address, UInt32 role, bool doRegister ); + virtual bool detachVirtualInterface( IO80211VirtualInterface * interface, bool doRegister ); + + virtual IOReturn enable( IONetworkInterface * interface ) APPLE_KEXT_OVERRIDE; + virtual IOReturn disable( IONetworkInterface * interface ) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn enable( IO80211SkywalkInterface * skywalkInterface ); + virtual IOReturn disable( IO80211SkywalkInterface * skywalkInterface ); #endif -//public: -// IO80211SkywalkInterface* getInfraInterface(void); -// IO80211ScanManager* getPrimaryInterfaceScanManager(void); -// IO80211ControllerMonitor* getInterfaceMonitor(void); -// IOReturn addReporterLegend(IOService *,IOReporter *,char const*,char const*); -// IOReturn removeReporterFromLegend(IOService *,IOReporter *,char const*,char const*); -// IOReturn unlockIOReporterLegend(void); -// void lockIOReporterLegend(void);// Suspected return type - int -// IOReturn logIOReportLogStreamSubscription(unsigned long long); -// IOReturn addIOReportLogStreamForProvider(IOService *,unsigned long long *); -// IOReturn addSubscriptionForThisReporterFetchedOnTimer(IOReporter *,char const*,char const*,IOService *) ; -// IOReturn addSubscriptionForProviderFetchedOnTimer(IOService *); -// void handleIOReporterTimer(IOTimerEventSource *); -// void setIOReportersStreamFlags(unsigned long long); -// void updateIOReportersStreamFrequency(void); // Suspected return type - int -// void setIOReportersStreamLevel(CCStreamLogLevel); -// void powerChangeGated(OSObject *,void *,void *,void *,void *); -// int copyOut(void const*,unsigned long long,unsigned long); -// SInt32 getASSOCIATE_RESULT(IO80211Interface *,IO80211VirtualInterface *,IO80211SkywalkInterface *,apple80211_assoc_result_data *); -// IOReturn copyIn(unsigned long long,void *,unsigned long); -// void logIOCTL(apple80211req *); -// bool isIOCTLLoggingRestricted(apple80211req *); -// IOReturn setChanNoiseFloorLTE(apple80211_stat_report *,int); -// IOReturn setChanNoiseFloor(apple80211_stat_report *,int); -// IOReturn setChanCCA(apple80211_stat_report *,int); -// IOReturn setChanExtendedCCA(apple80211_stat_report *,apple80211_cca_report *); -// bool setLTECoexstat(apple80211_stat_report *,apple80211_lteCoex_report *); -// bool setBTCoexstat(apple80211_stat_report *,apple80211_btCoex_report *); -// bool setAMPDUstat(apple80211_stat_report *,apple80211_ampdu_stat_report *,apple80211_channel *); -// UInt32 getCountryCode(apple80211_country_code_data *); -// IOReturn setCountryCode(apple80211_country_code_data *); -// bool getInfraExtendedStats(apple80211_extended_stats *); -// bool getChipCounterStats(apple80211_chip_stats *); -// bool setExtendedChipCounterStats(apple80211_stat_report *,void *); -// bool setChipCounterStats(apple80211_stat_report *,apple80211_chip_stats *,apple80211_channel *); -// virtual bool setLeakyAPStats(apple80211_leaky_ap_event *); -// bool setFrameStats(apple80211_stat_report *,apple80211_frame_counters *,apple80211_channel *); -// bool setPowerStats(apple80211_stat_report *,apple80211_power_debug_sub_info *); -// bool getBeaconPeriod(apple80211_beacon_period_data *); - SInt32 apple80211VirtualRequestIoctl(unsigned int,int,IO80211VirtualInterface *,void *); -// bool getBSSIDData(OSObject *,apple80211_bssid_data *); -// bool getSSIDData(apple80211_ssid_data *); -// bool inputInfraPacket(mbuf_t); -// void notifyHostapState(apple80211_hostap_state *); -// bool isAwdlAssistedDiscoveryEnabled(void); -// void joinDone(scanSource,joinStatus); -// void joinStarted(scanSource,joinStatus); -// void handleChannelSwitchAnnouncement(apple80211_channel_switch_announcement *); -// void scanDone(scanSource,int); -// void scanStarted(scanSource,apple80211_scan_data *); -// void printChannels(void); -// void updateInterfaceCoexRiskPct(unsigned long long); -// SInt32 getInfraChannel(apple80211_channel_data *); -// void calculateInterfacesAvaiability(void); // Suspected return type - int -// void setChannelSequenceList(apple80211_awdl_sync_channel_sequence *); // Suspected return type - int -// void setPrimaryInterfaceDatapathState(bool); -// UInt32 getPrimaryInterfaceLinkState(void); -// void setCurrentChannel(apple80211_channel *); // Suspected return type - int -// void setHtCapability(ieee80211_ht_capability_ie *); -// UInt32 getHtCapability(void); -// UInt32 getHtCapabilityLength(void); -// bool io80211isDebuggable(bool* enable); -// void logDebug(unsigned long long,char const*,...); // Suspected return type - int -// void vlogDebug(unsigned long long,char const*,va_list); // Suspected return type - char -// void logDebug(char const*,...); // Suspected return type - int -// bool calculateInterfacesCoex(void); -// void setInfraChannel(apple80211_channel *); -// void configureAntennae(void); - SInt32 apple80211RequestIoctl(unsigned int,int,IO80211Interface *,void *); - UInt32 radioCountForInterface(IO80211Interface *); -// void releaseIOReporters(void); -// bool findAndAttachToFaultReporter(void); -// UInt32 setupControlPathLogging(void); -// IOReturn createIOReporters(IOService *); -// IOReturn powerChangeHandler(void *,void *,unsigned int,IOService *,void *,unsigned long); - - OSMetaClassDeclareReservedUnused( IO80211Controller, 0); - OSMetaClassDeclareReservedUnused( IO80211Controller, 1); - OSMetaClassDeclareReservedUnused( IO80211Controller, 2); - OSMetaClassDeclareReservedUnused( IO80211Controller, 3); - OSMetaClassDeclareReservedUnused( IO80211Controller, 4); - OSMetaClassDeclareReservedUnused( IO80211Controller, 5); - OSMetaClassDeclareReservedUnused( IO80211Controller, 6); - OSMetaClassDeclareReservedUnused( IO80211Controller, 7); - OSMetaClassDeclareReservedUnused( IO80211Controller, 8); - OSMetaClassDeclareReservedUnused( IO80211Controller, 9); - OSMetaClassDeclareReservedUnused( IO80211Controller, 10); - OSMetaClassDeclareReservedUnused( IO80211Controller, 11); - OSMetaClassDeclareReservedUnused( IO80211Controller, 12); - OSMetaClassDeclareReservedUnused( IO80211Controller, 13); - OSMetaClassDeclareReservedUnused( IO80211Controller, 14); - OSMetaClassDeclareReservedUnused( IO80211Controller, 15); + UInt32 assignUnitNumber( const char * name ); + void markInterfaceUnitUsed( const char * name, UInt32 number ); + void markInterfaceUnitUnused( const char * name, UInt32 number ); + + void configureAntennae(); + UInt32 radioCountForInterface( IO80211Interface * interface ); + + void setCurrentChannel( apple80211_channel * channel ); + void setInfraChannel( apple80211_channel * channel ); + + void setHtCapability( ieee80211_ht_capability_ie * capability ); + struct ieee80211_ht_capability_ie * getHtCapability(); + UInt32 getHtCapabilityLength(); + + void logDebug( char const * format, ... ); + void logDebug( UInt64 flags, char const * format, ... ); + void vlogDebug( UInt64 flags, char const * format, va_list args ); + void vlogDebugBPF( UInt64 flags, char const * format, va_list args ) {} + void clearLogTargets(); + void setLogTarget( IO80211Interface * interface, IO80211VirtualInterface * vif, bool mode ); + bool io80211isDebuggable( bool * enable ); + IOReturn setupControlPathLogging(); + bool isIOCTLLoggingRestricted( apple80211req * request ); + void logIOCTL( apple80211req * request ); + + void setChannelSequenceList( apple80211_awdl_sync_channel_sequence * sequence ); + void calculateInterfacesAvaiability(); + void calculateInterfacesCoex(); + bool updateInterfaceCoexRiskPct( UInt64 percent ); + void printChannels(); + void scanStarted( scanSource source, apple80211_scan_data * data ); + void scanDone( scanSource source, int ); + void handleChannelSwitchAnnouncement( apple80211_channel_switch_announcement * announcement ); + void joinStarted( scanSource source, joinStatus status ); + void joinDone( scanSource source, joinStatus status ); + bool isAwdlAssistedDiscoveryEnabled(); + void notifyHostapState( apple80211_hostap_state * state ); + bool inputInfraPacket( mbuf_t packet ); + + int copyIn( user_addr_t uaddr, void * kaddr, size_t len ); + int copyOut( const void * kaddr, user_addr_t udaddr, size_t len ); protected: - uint8_t filler[0x500]; -}; + static IOReturn powerChangeHandler( void * target, void * refCon, UInt32 messageType, IOService * provider, void * messageArgument, vm_size_t argSize ); + static IOReturn powerChangeGated( OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3 ); + + OSMetaClassDeclareReservedUnused( IO80211Controller, 0 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 1 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 2 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 3 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 4 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 5 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 6 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 7 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 8 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 9 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 10 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 11 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 12 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 13 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 14 ); + OSMetaClassDeclareReservedUnused( IO80211Controller, 15 ); -// 0x215: 1 byte, length of channel sequence, should be 16 -// 0x21c: channel sequence, should contain 16 elements of length 12, possibly apple80211_channel (but why 16?) -// struct of three ints, last looks like flags, first unused - -/* - void __thiscall -setChannelSequenceList(IO80211Controller *this,apple80211_awdl_sync_channel_sequence *param_1) - -{ - _memcpy(this + 0x210,param_1,400); - calculateInterfacesAvaiability(this); - return; -} -*/ - - -#endif /* defined(KERNEL) && defined(__cplusplus) */ +protected: + IOTimerEventSource * _fReporterGatheringTimer; //280 + OSArray * _fReporterSubscriptions; //288 + UInt32 _fReporterStreamFrequency; //296 + IOSkywalkInterface * _fSkywalkInterface; //304 + bool _isDebugSetUp; //312 + UInt32 _debugValue; //316 + IORecursiveLock * _fIOReportLegendLock; //320 + + ieee80211_ht_capability_ie _htCapability; //328 + UInt32 _htCapabilityLength; //356 + + IO80211ControllerMonitor * _fControllerMonitor; //360 + + CCLogPipe * _fControllerIOReporterPipe; //368 + CCIOReporterLogStream * _fControllerIOReporterStream; //376 + uint64_t __reserved0; //384 + CCLogPipe * _controlPathLogPipe; //392 + CCLogStream * _ioctlLogStream; //400 + CCLogStream * _eventLogStream; //408 + CCPipe * _debugDataPipe; //416 + CCDataStream * _faultReportDataStream; //424 + CCFaultReporter * _faultReporter; //432 + + UInt32 _11axAsrTxLatency[16]; //440 + + bool _ifAttachPending; // 504 + IO80211WorkLoop * _fWorkLoop; //512 + IONetworkInterface * _netIF; //520 + IO80211VirtualInterface * _primaryVIF; //528 + IO80211VirtualInterface * _secondaryVIF; // 536 + uint64_t __reserved1; // 544 + IO80211VirtualInterface * _vifLogTargets[4]; // 552 + IO80211Interface * _netIFLogTarget; //584 + + apple80211_channel _infraChannel; //592 + apple80211_channel _currentChannel; //604 + apple80211_awdl_sync_channel_sequence _channelSequenceList; //616 + + IONotifier * _fPowerChangeNotifier; //1016 + IOService * _fProvider; //1024 + IO80211RangingManager * _fRangingManager; //1032 + bool _wowEnabled; //1040 + IONotifier * _fEFINVRAMPublishedNotifier; //1048 + UInt8 _io8LogReferenceCount; //1056 + void * _refCon; //1064 +}; -#endif /* !_IO80211CONTROLLER_H */ +#endif diff --git a/Headers/IOKit/80211/IO80211FlowQueue.h b/Headers/IOKit/80211/IO80211FlowQueue.h new file mode 100644 index 00000000..35895b1a --- /dev/null +++ b/Headers/IOKit/80211/IO80211FlowQueue.h @@ -0,0 +1,85 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IO80211FLOWQUEUE_H +#define _IO80211FLOWQUEUE_H + +#include +#include + +struct IO80211FlowQueueHash +{ + UInt8 ac; + UInt8 interface; + ether_addr address; +} __attribute__((packed)); + +class IO80211FlowQueue : public OSObject +{ + OSDeclareDefaultStructors( IO80211FlowQueue ) + +public: + virtual UInt32 enqueuePacket( mbuf_t packet ); + virtual UInt32 queueSpace(); + virtual UInt32 queueSize(); + virtual UInt32 pendingPackets(); + virtual void pause(); + virtual void unPause(); + virtual bool isPaused(); + virtual UInt32 DEBUG_totalStagedPackets(); + virtual UInt32 DEBUG_curStagedPackets(); + virtual UInt32 print( void * userPrintCtx ); + +protected: + IO80211FlowQueueHash _hash; // 16 + void * _buf; // 24 + bool _paused; // 32 +}; + +class IO80211FlowQueueLegacy : public IO80211FlowQueue +{ + OSDeclareDefaultStructors( IO80211FlowQueueLegacy ) + +public: + IO80211FlowQueueLegacy * withParamaters( const ether_addr & address, UInt8 ac, UInt8 interface ); + bool initWithParamaters( const ether_addr & address, UInt8 ac, UInt8 interface ); + + virtual UInt32 enqueuePacket( mbuf_t packet ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 queueSpace() APPLE_KEXT_OVERRIDE; + virtual UInt32 queueSize() APPLE_KEXT_OVERRIDE; + + virtual bool isPaused() APPLE_KEXT_OVERRIDE; +}; + +#endif diff --git a/Headers/IOKit/80211/IO80211FlowQueueDatabase.h b/Headers/IOKit/80211/IO80211FlowQueueDatabase.h new file mode 100644 index 00000000..d8380168 --- /dev/null +++ b/Headers/IOKit/80211/IO80211FlowQueueDatabase.h @@ -0,0 +1,81 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IO80211FLOWQUEUEDATBASE_H +#define _IO80211FLOWQUEUEDATBASE_H + +#include + +typedef bool (*IO80211FlowQueueResultAction)( IO80211FlowQueue * queue, void * arg ); +typedef void (*IO80211FlowQueueAction)( IO80211FlowQueue * queue, void * arg ); + +class IO80211FlowQueueDatabase : public OSObject +{ + OSDeclareDefaultStructors( IO80211FlowQueueDatabase ) + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + void lockDatabase(); + void unlockDatabase(); + + IOReturn insert( IO80211FlowQueue * que ); + void remove( UInt64 hash ); + + IO80211FlowQueue * map( IO80211FlowQueueResultAction action, void * arg ); + IO80211FlowQueue * find( IO80211FlowQueueResultAction action, void * arg ); + IO80211FlowQueue * find( UInt64 hash ); + void flush( IO80211FlowQueueAction action, void * arg ); + + UInt32 pendingPackets( UInt8 interface ); + UInt32 packetSpace( UInt8 interface ); + UInt32 queueSize( UInt8 interface ); + + UInt32 print( void * userPrintCtx ); + +protected: + /*! @var _dataBase + * The data base in which all flow queues of this object are stored. */ + + IO80211FlowQueue * _dataBase[200]; // 16 + + /*! @var _foundQueue + * The result request found in find() will be stored in this member variable so as to accelerate the next find request. */ + + IO80211FlowQueue * _foundQueue; // 1616 + SInt32 _queueSize; // 1624 + IOSimpleLock * _dataBaseLock; // 1632 +}; + +#endif diff --git a/Headers/IOKit/80211/IO80211Interface.h b/Headers/IOKit/80211/IO80211Interface.h index e2ab2492..154508ae 100644 --- a/Headers/IOKit/80211/IO80211Interface.h +++ b/Headers/IOKit/80211/IO80211Interface.h @@ -1,110 +1,375 @@ -// -// IO80211SkywalkInterface.h -// IO80211Family -// +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ #ifndef _IO80211INTERFACE_H #define _IO80211INTERFACE_H -/* - * Kernel - */ -#if defined(KERNEL) && defined(__cplusplus) +#ifndef __PRIVATE_SPI__ +#define __PRIVATE_SPI__ +#endif #include #include -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif +#include +#include +#include +#include +#include +#include -#if VERSION_MAJOR > 8 - #define _MODERN_BPF -#endif +typedef enum IO80211LinkState +{ + kIO80211NetworkLinkUndefined, // Starting link state when an interface is created + kIO80211NetworkLinkDown, // Interface not capable of transmitting packets + kIO80211NetworkLinkUp // Interface capable of transmitting packets +} IO80211LinkState; -#include -#include -#include +typedef enum kIO80211InterfaceType +{ + kIO80211InterfaceTypeInfra, + kIO80211InterfaceTypeAPSta, + kIO80211InterfaceTypeAWDL, + kIO80211InterfaceTypeNAN +} kIO80211InterfaceType; -enum IO80211LinkState +enum { - kIO80211NetworkLinkUndefined, // Starting link state when an interface is created - kIO80211NetworkLinkDown, // Interface not capable of transmitting packets - kIO80211NetworkLinkUp, // Interface capable of transmitting packets + kIO80211InterfaceRoleInfrastructure = 0, + kIO80211InterfaceRoleLowLatency = 1, + kIO80211InterfaceRoleP2PDevice = 2, + kIO80211InterfaceRoleP2PClient = 3, + kIO80211InterfaceRoleP2PGroupOwner = 4, + kIO80211InterfaceRoleAirLink = 5, + kIO80211InterfaceRoleSoftAP = 6, + kIO80211InterfaceRoleWiFiAwareDiscovery = 7, + kIO80211InterfaceRoleWiFiAwareDiscoveryAndData = 8, + kIO80211InterfaceRoleWiFiAwareData = 9, + kIO80211InterfaceRoleUndefined }; -typedef enum IO80211LinkState IO80211LinkState; -/*! @defined kIO80211InterfaceClass - @abstract The name of the IO80211Interface class. - */ +struct io80211_timespec +{ + clock_sec_t secs; + clock_nsec_t nanosecs; +}; + +struct apple80211_interface_availability +{ + UInt64 fExpectedPeakLatency; + UInt64 x; + UInt64 y; + // x/y = open percentage... +}; + +/*! @defined kIO80211InterfaceClass + @abstract The name of the IO80211Interface class. +*/ #define kIO80211InterfaceClass "IO80211Interface" -typedef UInt64 IO80211FlowQueueHash; class RSNSupplicant; -class IOTimerEventSource; -class IOGatedOutputQueue; class IO80211Controller; -class IO80211Workloop; +class IO80211InterfaceMonitor; class IO80211ScanManager; class IO80211PeerManager; -class IO80211FlowQueueDatabase; -class IO80211InterfaceMonitor; class IO80211AssociationJoinSnapshot; +class IO80211AsyncEventUserClient; +class CCFaultReporter; +struct packet_info_tx; struct apple80211_debug_command; -struct apple80211_txstats; -struct apple80211_chip_counters_tx; struct apple80211_chip_error_counters_tx; +struct apple80211_chip_counters_tx; struct apple80211_chip_counters_rx; -struct apple80211_ManagementInformationBasedot11_counters; -struct apple80211_leaky_ap_stats; -struct apple80211_leaky_ap_ssid_metrics; -struct apple80211_interface_availability; -struct apple80211_pmk_cache_data; -struct apple80211_ap_cmp_data; -struct TxPacketRequest; -struct AWSRequest; -struct packet_info_tx; -struct userPrintCtx; -typedef int apple80211_postMessage_tlv_types; +extern const char * ssidBufToString( UInt8 * data, unsigned long dataSize, char * string ); +extern clock_nsec_t timespecSub( io80211_timespec * inSpec1, io80211_timespec * inSpec2, io80211_timespec * outSpec ); +extern void io80211_get_calendar_time( io80211_timespec * spec ); +extern bool procIsSuperuser(); +extern UInt32 calculateChannelBandwidth( UInt32 ); +extern UInt32 channelToFrequency( UInt32, UInt32 ); +extern bool isETSICountryCode( unsigned char * codes ); + +typedef errno_t (OSObject::*IOBPFTapAction)( u_int32_t data_link_type, bpf_tap_mode direction ); + +struct bpfNode +{ + bpfNode * next; // 0 + bpfNode * prev; // 8 + UInt32 dataLinkType; // 16 + IOGatedOutputQueue * outputQueue; // 24 + OSObject * target; // 32 + IOBPFTapAction tap; // 40 + OSObject * tapOwner; // 48 + bpf_tap_mode direction; // 56 +}; + +struct bpfListHeader +{ + bpfNode * first; +}; + +/*! @class IO80211Interface + @abstract The 80211 interface object. + @discussion An 80211 controller driver, + that is a subclass of IOEthernetInterface, will instantiate an object + of this class when the driver calls the attachInterface() method. + This interface object will then vend an Ethernet interface to DLIL, + and manage the connection between the controller driver and the upper + networking layers. Drivers will seldom need to subclass + IO80211Interface. +*/ class IO80211Interface : public IOEthernetInterface { - OSDeclareDefaultStructors( IO80211Interface ); + OSDeclareDefaultStructors( IO80211Interface ) public: - virtual void free() APPLE_KEXT_OVERRIDE; - virtual IOReturn configureReport(IOReportChannelList *,uint,void *,void *) APPLE_KEXT_OVERRIDE; - virtual IOReturn updateReport(IOReportChannelList *,uint,void *,void *) APPLE_KEXT_OVERRIDE; - virtual bool terminate(unsigned int) APPLE_KEXT_OVERRIDE; - virtual bool attach(IOService*) APPLE_KEXT_OVERRIDE; - virtual void detach(IOService*) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_10_15 - virtual IOReturn newUserClient(task_t, void*, UInt32 type, OSDictionary*, IOUserClient**) APPLE_KEXT_OVERRIDE; + virtual bool init( IONetworkController * controller ) APPLE_KEXT_OVERRIDE; + virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach( IOService * provider ) APPLE_KEXT_OVERRIDE; + IOReturn finishAttachToDataLinkLayer(); + static IOReturn finishAttachToDataLinkLayerGated( OSObject * target, void * arg0, void * arg1, void * arg2, void * arg3 ); + virtual IOReturn attachToDataLinkLayer( IOOptionBits options, void * parameter ) APPLE_KEXT_OVERRIDE; + virtual void detachFromDataLinkLayer( IOOptionBits options, void * parameter ) APPLE_KEXT_OVERRIDE; + + virtual bool inputEvent( UInt32 type, void * data ) APPLE_KEXT_OVERRIDE; + + virtual void setPoweredOnByUser( bool userPowered ); + bool poweredOnByUser(); + virtual void setEnabledBySystem( bool systemEnabled ); + bool enabledBySystem(); + + IOReturn IO80211InterfacePostMessage( UInt32 msg ,void * data = NULL, size_t dataSize = 0 ); + void postMessage( UInt32 msg, void * data = NULL, size_t dataSize = 0 ); + IOReturn setDataPointerAndLengthForMessageType( apple80211_postMessage_tlv_types type, void ** data, size_t * dataSize ); + + IOReturn createIOReporters( IOService * service ); + virtual IOReturn configureReport( IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport( IOReportChannelList * channels, IOReportUpdateAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + + void reportTransmitStatus( mbuf_t packet, IOReturn status, struct packet_info_tx * info ); + IOReturn reportTransmitCompletionStatus( mbuf_t packet, IOReturn status, uint32_t param1 = 0, uint32_t param2 = 0, IOOptionBits options = 0 ); + bool reportDataPathEvents( UInt32 msg ,void * data = NULL, size_t dataSize = 0 ); + static IOReturn reportDataPathEventsGated( void * target, void * msg, void * data, void * dataSize, void * arg0 ); + IOReturn reportTxStatistics( apple80211_txstats * stats ); + IOReturn reportDataTransferRates(); + static IOReturn reportDataTransferRatesStatic( void * target ); + void reportDataTransferRatesGated(); + + void setAuthTimeout( AbsoluteTime timeout ); + AbsoluteTime authTimeout(); + + virtual bool setLinkState( IO80211LinkState linkState, UInt32 reason ); + virtual bool setLinkState( IO80211LinkState linkState, IOReturn status, UInt32 reason ); + IO80211LinkState linkState(); + + void setScanningState( UInt32 scanSource, bool scan, apple80211_scan_data * data, IOReturn status ); + + bool setInterfaceExtendedCCA( apple80211_channel channel, apple80211_cca_report * report ); + bool setInterfaceCCA( apple80211_channel channel, int cca ); + bool setInterfaceNF( apple80211_channel channel, long long noiseFloor ); + bool setInterfaceOFDMDesense( apple80211_channel channel, long long ofdmDesense ); + bool setInterfaceChipCounters( struct apple80211_stat_report * report, apple80211_chip_counters_tx * tx, apple80211_chip_error_counters_tx * err, apple80211_chip_counters_rx * rx ); + bool setInterfaceMIBdot11( apple80211_stat_report * report, apple80211_ManagementInformationBasedot11_counters * counters ); + bool setFrameStats( apple80211_stat_report * frame, apple80211_frame_counters * counters ); + + bool setLeakyAPStatsMode( UInt32 mode ); // 0: Disable 1: Enable 2: Unsupported + bool getLeakyApStats( const struct apple80211_leaky_ap_stats ** stats ); + bool resetLeakyApStats(); + bool setLeakyApSsidMetrics( struct apple80211_leaky_ap_ssid_metrics * metrics ); + bool setLeakyAPStats( struct apple80211_leaky_ap_event * event ); + void handleLeakyApStatsModeTimer( IOTimerEventSource * timer ); + void handleLeakyApStatsResetTimer( IOTimerEventSource * timer ); + + bool getExtendedStats( struct apple80211_extended_stats * stats ); + + bool initSupplicant( UInt8 * ie, int mode ); + void terminateSupplicant(); + void resetSupplicant(); + bool setPMK( UInt8 * pmk, UInt8 * pmkID ); + bool setPSKPMK( UInt8 * pmk ); + bool supplicantExchangeComplete(); + bool supplicantInitialized(); + UInt32 outputEAPOLFrame( mbuf_t m ); + void cachePMKSA( UInt8 * pmk, size_t pmkLen, ether_addr * aa, UInt8 * pmkID ); + SInt32 cachePMKSA( UInt8 * pmk, size_t pmkLen, ether_addr * authenticatorEA ); + struct rsn_pmksa_node * pmksaLookup( ether_addr * authenticatorEA, UInt8 * pmkID ); + void getPMKSAList( struct apple80211_pmk_cache_data * list ); + + bool shouldRoam( struct apple80211_scan_result * asr ); + void willRoam( ether_addr * bssid, UInt32 options ); + + virtual UInt32 inputPacket( mbuf_t packet, UInt32 length = 0, IOOptionBits options = 0, void * param = 0 ) APPLE_KEXT_OVERRIDE; + virtual IOReturn outputPacket( mbuf_t m, void * param ); + + IO80211WorkLoop * getControllerWorkLoop(); + IO80211Controller * getController(); + const char * getBSDName(); + + void setCountermeasuresTimer( IOTimerEventSource * timer ); + static void stopCountermeasures( OSObject * owner, IOTimerEventSource * sender ); + + void updateChannelProperty(); + static void updateChannelPropertyStatic( void * owner ); + void updateChannelPropertyGated(); + void updateSSIDProperty(); + void updateBSSIDProperty(); + void updateStaticProperties(); + void updateCountryCodeProperty( bool shouldLog ); + static IOReturn performCountryCodeOpGated( OSObject * owner, void * inInterface, void * inParams, void * arg0, void * arg1 ); + + IOReturn updateLinkStatus(); + static IOReturn updateLinkStatusStatic( void * owner ); + IOReturn updateLinkStatusGated(); + bool updateLinkSpeed(); + bool updateLinkParameters( apple80211_interface_availability * params ); + bool updateLinkParametersStatic( void * target, void * params ); + bool updateLinkParametersGated( apple80211_interface_availability * params ); + + bool updateInterfaceCoexRiskPct( UInt64 percent ); + bool setBTCoexWLANLostAntennaTime( UInt64, UInt64, bool, struct apple80211_btCoex_report * report ); // percentages? + void configureAntennae(); + + void setDebugFlags( UInt64 debugFlags, IOOptionBits options ); + UInt64 debugFlags(); + + void setPeerManagerLogFlag( UInt32 operation, UInt32 bit, IOOptionBits options ); + void togglePeerManagerLogFlag( UInt32 bit, IOOptionBits options ); + + bool shouldLog( UInt64 debugFlags ); + void logDebug( char const * format, ... ); + void logDebug( UInt64 debugFlags, char const * format, ... ); + void logDebugHex( const void * data, size_t size, const char * format, ... ); + void vlogDebug( UInt64 debugFlags, char const * format, va_list va ); + void vlogDebugBPF( UInt64 debugFlags, char const * format, va_list va ); + void logTxCompletionPacket( mbuf_t packet, IOReturn status ); + + virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + virtual int errnoFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + + IOGatedOutputQueue * getOutputQueue(); + IOGatedOutputQueue * getOutputQueueForDLT( UInt32 dlt ); + void configureBpfOutputQueues(bool); + void startOutputQueues(); + void stopOutputQueues(); + + IO80211FlowQueue * findOrCreateFlowQueue( IO80211FlowQueueHash hash ); + IO80211FlowQueue * findExistingFlowQueue( IO80211FlowQueueHash hash ); + void flushPacketQueues(); + void removePacketQueue( const IO80211FlowQueueHash * hash ); + UInt32 pendingPackets( UInt8 interface ); + UInt32 packetSpace( UInt8 interface ); + UInt32 queueSize( UInt8 interface ); + + errno_t bpfAttach( UInt32 dataLinkType, UInt32 headerLength, OSObject * target, IOOutputAction action, IOBPFTapAction tap, IOWorkLoop * workLoop ); + errno_t bpfAttach( UInt32 dataLinkType, UInt32 headerLength ); + + void monitorModeInputPacket(mbuf_t packet, UInt32 dlt, void * header, size_t header_len); + void bpfTapInput(mbuf_t packet, UInt32 dlt, void * header, size_t header_len); + errno_t bpfTap(u_int32_t data_link_type, bpf_tap_mode direction); + + errno_t bpfOutputPacket( mbuf_t packet, void * data ); + errno_t bpfOutput( uint, mbuf_t packet ); + mbuf_t preQueuePacket( mbuf_t packet ); + static errno_t outputPreEnqueueHandler( void * target, void * refCon, mbuf_t packet ); + void logTxPacket( mbuf_t packet ); + void dropTxPacket( mbuf_t packet ); + UInt32 dequeueTxPackets( UInt32, UInt32 ); + UInt32 dequeueTxPackets( struct TxPacketRequest * request ); + + virtual errno_t setLinkQualityMetric( int quality ); + bool setLQM( UInt64 lqm ); + bool setLQMStatic( void * owner, void * lqm ); + bool setLQMGated( UInt64 lqm ); + + IOReturn storeProcessNameAndIoctlInformation( unsigned long ioctlInfo ); + IOReturn storeIoctlInArray( OSArray * array, OSNumber * ioctlInfo ); + IOReturn dumpUnentitledProcesses(); + + UInt32 queueWMEPacket( mbuf_t m, void * param ); + void getWmeTxCounters( UInt64 * counters ); + + bool shortGISupported40MHz(); + bool shortGISupported20MHz(); + void setWoWEnabled( bool enable ); + + IOReturn outputStart( UInt32 ); + IOReturn configureInterface(); + void setDataPathState( bool state ); + + bool setPidLock( bool locked ); + bool pidLocked(); + + bool netBooting(); + void setNetBooting(); + void netBootThreadGated( OSObject * target, void * arg0, void * arg1, void * arg2, void * arg3 ); + void netBootThread( IOService * provider ); + void associateForNetBoot( IOService * provider ); + static IOReturn associateForNetBootGated( OSObject * target, void * arg0, void * arg1, void * arg2, void * arg3 ); + static bool efiNVRAMPublished( void * target, void * refCon, IOService * newService, IONotifier * notifier ); + + struct apple80211_ap_cmp_data * apCompare( apple80211_ap_cmp_data *, apple80211_ap_cmp_data * ); + UInt32 printDataPath( struct userPrintCtx * ctx ); + void printPeers( UInt32, UInt32 ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn newUserClient( task_t owningTask, void * securityID, UInt32 type, OSDictionary * properties, LIBKERN_RETURNS_RETAINED IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; #endif - virtual const char* stringFromReturn(int) APPLE_KEXT_OVERRIDE; - virtual int errnoFromReturn(int) APPLE_KEXT_OVERRIDE; - virtual bool init(IONetworkController*) APPLE_KEXT_OVERRIDE; - virtual UInt32 inputPacket(mbuf_t packet, - UInt32 length = 0, - IOOptionBits options = 0, - void * param = 0) APPLE_KEXT_OVERRIDE; - virtual bool inputEvent(unsigned int, void*) APPLE_KEXT_OVERRIDE; - virtual SInt32 performCommand(IONetworkController*, unsigned long, void*, void*) APPLE_KEXT_OVERRIDE; - virtual IOReturn attachToDataLinkLayer(IOOptionBits, void*) APPLE_KEXT_OVERRIDE; - virtual void detachFromDataLinkLayer(unsigned int, void*) APPLE_KEXT_OVERRIDE; - - virtual void setPoweredOnByUser(bool); - virtual void setEnabledBySystem(bool); - - virtual bool setLinkState(IO80211LinkState, unsigned int); - virtual bool setLinkState(IO80211LinkState, int, unsigned int); - virtual UInt32 outputPacket(mbuf_t, void*); - - virtual bool setLinkQualityMetric(int); - virtual void handleDebugCmd(apple80211_debug_command*); + IOReturn resetUserClientReference(); + static IOReturn resetUserClientReferenceGated( OSObject * target, void * arg0, void * arg1, void * arg2, void * arg3 ); + IOReturn startAsyncEventUserClientForTask( task_t task, kIO80211InterfaceType ); + + OSString * createAssocHistory(); + void clearAssocHistory(); + +protected: + virtual SInt32 performCommand( IONetworkController * controller, unsigned long cmd, void * arg0, void * arg1 ) APPLE_KEXT_OVERRIDE; + static SInt32 performGatedCommand( void * target, void * controller, void * cmd, void * arg0, void * arg1 ); + virtual errno_t handleDebugCmd( apple80211_debug_command * cmd ); + virtual void free() APPLE_KEXT_OVERRIDE; + static IOReturn powerChangeHandler( void * target, void * refCon, UInt32 messageType, IOService * provider, void * messageArgument, vm_size_t argSize ); + +private: + size_t inputAWSPacket( mbuf_t m ); + void awsRespond( mbuf_t m, struct AWSRequest * requestList, size_t numRequests, UInt16 packetID ); + void purgePMKSACache(); + void freePMKSACache(); + void freeBpf(); + void stopBpf(); + OSMetaClassDeclareReservedUnused( IO80211Interface, 0); OSMetaClassDeclareReservedUnused( IO80211Interface, 1); OSMetaClassDeclareReservedUnused( IO80211Interface, 2); @@ -121,24 +386,100 @@ class IO80211Interface : public IOEthernetInterface OSMetaClassDeclareReservedUnused( IO80211Interface, 13); OSMetaClassDeclareReservedUnused( IO80211Interface, 14); OSMetaClassDeclareReservedUnused( IO80211Interface, 15); -public: - IO80211FlowQueue * findOrCreateFlowQueue(IO80211FlowQueueHash); - void dropTxPacket(mbuf_t); - void logDebug(unsigned long long, char const*, ...); - void vlogDebug(unsigned long long, char const*, va_list); - const char * getBSDName(); - bool setLeakyAPStatsMode(unsigned int); - void stopOutputQueues(); - void startOutputQueues(); - bool updateLinkSpeed(); - bool reportDataTransferRatesStatic(void*); - void logDebug(char const*, ...); - void postMessage(unsigned int, void* data = NULL, unsigned long dataLen = 0); + protected: - u_int8_t dat[0x500]; -}; + IO80211PeerManager * _peerManager; // 328 + UInt16 _dataQueueDepth; // 336 + IO80211FlowQueueDatabase * _flowQueueDataBse; // 344 + + UInt64 _unknown; // 352 + UInt64 _linkSpecificInfo; // 360 + UInt32 _linkStatusFlag; // 368 + UInt32 _linkQualityMetric; // 372 + + UInt32 _effectiveTxBWSinceLastRead; // 376 + UInt64 _effectiveDataTxRate; // 380 + UInt32 _txAvailability; // 388, composed of peak latency and close percent + UInt32 _expectedTxPeakLatency; // 392 + UInt32 _txRetransmitRate; // 396 + UInt32 _totalTxPacketsGivenUp; // 400 + UInt32 _txErrorRate; // 404 + + UInt32 _effectiveRxBWSinceLastRead; // 408 + UInt64 _effectiveDataRxRate; // 412 + UInt32 _rxAvailability; // 420 + UInt32 _expectedRxPeakLatency; // 424 + UInt32 _rxErrorRate; // 428 -#endif /* defined(KERNEL) && defined(__cplusplus) */ + UInt32 _channelFrequency; // 432 + uint64_t _reserved0[5]; // 440 + IOTimerEventSource * _leakyApStatsModeTimer; // 480 + IOTimerEventSource * _leakyApStatsResetTimer; // 488 + UInt32 _leakyApStatsMode; // 496 + UInt32 _flowQueueInterface; // 500 + bool _poweredOnByUser; // 504 + bool _enabledBySystem; // 505 + AbsoluteTime _authTimeout; // 512 + IO80211LinkState _linkState; // 520 + bool _linkStateDown; // 524 + bool _linkDownVoluntary; // 525 + UInt64 _linkSpeed; // 528 + UInt64 _interfaceClosePercent; // 536 + UInt64 _coexRiskPercent; // 544 + UInt64 _btCoexWLANLostAntennaTime; // 552 + uint64_t _reserved1[2]; // 560 + UInt32 _testedWlanPanicPostMessage; // 576 + RSNSupplicant * _rsnSupplicant; // 584 -#endif /* ! _IO80211INTERFACE_H */ + ifmultiaddr_t _awsAddr; // 592 + IOTimerEventSource * _countermeasuresTimer; // 600 + + char _bsdName[IFNAMSIZ]; // 608 + rsn_pmksa_node * _pmksaListHead; // 624 + IONotifier * _powerChangeNotifier; // 632 + UInt64 _debugFlags; // 640 + IOGatedOutputQueue * _outputQueue; // 648 + IO80211Controller * _controller; // 656 + CCFaultReporter * _faultReporter; // 664 + void * _linkLayerAddress; // 672 + UInt8 _interfaceType; // 680 + + //681 + //682 + //683 + IOGatedOutputQueue * _backgroundOutputQueue; // 688 + IOGatedOutputQueue * _voiceOutputQueue; // 696 + IOGatedOutputQueue * _videoOututQueue; // 704 + + IO80211ScanManager * _scanManager; // 712 + IO80211InterfaceMonitor * _interfaceMonitor; // 720 + IO80211AssociationJoinSnapshot * _joinSnaposhot; // 728 + bool _wowEnabled; // 736 + int _processID; // 740 + clock_sec_t _pidLockTime; // 744 + thread_call_t _netBootThread; // 752 + bool _netBooting; // 760 + UInt32 _roamThreshold; // 764 + + void * _caps; // 768 + bpfListHeader * _bpfListHead ; // 776 + IOLock * _bpfLock; // 784 + + UInt32 _pairwiseCipherType; // 792 + UInt32 _groupCipherType; // 796 + + OSDictionary * _deniedProcessesArray; // 800 + bool _wlanEntitlement; // 808 + bool _terminateCalled; // 809 + + void * _reserved2; // 816, never used... + + UInt32 _phyMode; // 824 + bool _awdlLinkDown; // 828 + bool _nanLinkDown; // 829 + + IO80211AsyncEventUserClient * _userClient; // 832 +}; + +#endif diff --git a/Headers/IOKit/80211/IO80211P2PInterface.h b/Headers/IOKit/80211/IO80211P2PInterface.h index fbf71c2d..1fddb733 100644 --- a/Headers/IOKit/80211/IO80211P2PInterface.h +++ b/Headers/IOKit/80211/IO80211P2PInterface.h @@ -1,87 +1,84 @@ -#ifndef IO80211P2PInterface_h -#define IO80211P2PInterface_h +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ -#include "IO80211VirtualInterface.h" +#ifndef _IO80211P2PINTERFACE_H +#define _IO80211P2PINTERFACE_H -class IO80211P2PInterface : public IO80211VirtualInterface { - OSDeclareDefaultStructors(IO80211P2PInterface) +#include -public: - virtual void free(void) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_11_0 - virtual bool willTerminate(IOService *,uint) APPLE_KEXT_OVERRIDE; -#endif - virtual IOReturn configureReport(IOReportChannelList *channels, - IOReportConfigureAction action, - void *result, - void *destination) APPLE_KEXT_OVERRIDE; - virtual IOReturn updateReport(IOReportChannelList *channels, - IOReportUpdateAction action, - void *result, - void *destination) APPLE_KEXT_OVERRIDE; - - virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; - virtual bool attach(IOService *) APPLE_KEXT_OVERRIDE; - virtual void detach(IOService *) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_10_15 - virtual IOReturn newUserClient(task_t,void *,UInt,OSDictionary *,IOUserClient **) APPLE_KEXT_OVERRIDE; -#endif - virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; - virtual int errnoFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; - virtual IOReturn powerStateWillChangeTo( - IOPMPowerFlags capabilities, - unsigned long stateNumber, - IOService * whatDevice ) APPLE_KEXT_OVERRIDE; +class IO80211P2PInterface : public IO80211VirtualInterface +{ + OSDeclareDefaultStructors( IO80211P2PInterface ) - virtual IOReturn powerStateDidChangeTo( - IOPMPowerFlags capabilities, - unsigned long stateNumber, - IOService * whatDevice ) APPLE_KEXT_OVERRIDE; - virtual bool init(IO80211Controller *,ether_addr *,uint,char const*) APPLE_KEXT_OVERRIDE; - virtual bool createPeerManager(ether_addr *,IO80211PeerManager **) APPLE_KEXT_OVERRIDE; - virtual UInt getMediumType() APPLE_KEXT_OVERRIDE; - virtual void setLinkState(IO80211LinkState,uint) APPLE_KEXT_OVERRIDE; - virtual bool dequeueOutputPacketsWithServiceClass(uint,IOMbufServiceClass,mbuf_t*,mbuf_t*,UInt *,unsigned long long *) APPLE_KEXT_OVERRIDE; - virtual UInt32 outputPacket (mbuf_t m, void* param) APPLE_KEXT_OVERRIDE; - virtual void setEnabledBySystem(bool) APPLE_KEXT_OVERRIDE; - virtual void handleIoctl(unsigned long,void *) APPLE_KEXT_OVERRIDE; - virtual UInt32 inputPacket(mbuf_t,packet_info_tag *) APPLE_KEXT_OVERRIDE; - virtual IOReturn controllerWillChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *) APPLE_KEXT_OVERRIDE; - virtual IOReturn controllerDidChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *) APPLE_KEXT_OVERRIDE; - virtual bool handleDebugCmd(apple80211_debug_command *) APPLE_KEXT_OVERRIDE; - virtual IOReturn postPeerPresence(ether_addr *,int,int,int,char *) APPLE_KEXT_OVERRIDE; - virtual IOReturn postPeerAbsence(ether_addr *) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_10_15 - virtual IOReturn postPeerPresenceIPv6(ether_addr *,int,int,int,char *,unsigned char *) APPLE_KEXT_OVERRIDE; -#endif - virtual void signalOutputThread() APPLE_KEXT_OVERRIDE; - virtual bool isOutputFlowControlled() APPLE_KEXT_OVERRIDE; - virtual void setOutputFlowControlled() APPLE_KEXT_OVERRIDE; - virtual void clearOutputFlowControlled() APPLE_KEXT_OVERRIDE; - virtual void outputStart(uint) APPLE_KEXT_OVERRIDE; - virtual UInt32 configureAQMOutput() APPLE_KEXT_OVERRIDE; - virtual void setUnitNumber(char const*) APPLE_KEXT_OVERRIDE; - virtual bool initIfnetEparams(ifnet_init_eparams *) APPLE_KEXT_OVERRIDE; - virtual bool attachToBpf() APPLE_KEXT_OVERRIDE; - virtual bool configureIfnet() APPLE_KEXT_OVERRIDE; - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 0); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 1); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 2); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 3); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 4); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 5); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 6); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 7); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 8); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 9); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 10); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 11); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 12); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 13); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 14); - OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 15); public: - char buf[0x300]; + virtual errno_t configureIfnet() APPLE_KEXT_OVERRIDE; + bool isAPSTA(); + errno_t apStaConfigureIfnet(); + bool isP2P(); + errno_t p2pConfigureIfnet(); + + virtual bool createPeerManager( ether_addr * inAddress, IO80211PeerManager ** outManager ) APPLE_KEXT_OVERRIDE; + bool apStaCreatePeerManager( ether_addr * inAddress, IO80211PeerManager ** outManager ); + bool p2pCreatePeerManager( ether_addr * inAddress, IO80211PeerManager ** outManager ); + + virtual bool attachToBpf() APPLE_KEXT_OVERRIDE; + bool apStaAttachToBpf(); + bool p2pAttachToBpf(); + + virtual void setUnitNumber( const char * name ) APPLE_KEXT_OVERRIDE; + void apStaSetUnitNumber( const char * name ); + void p2pSetUnitNumber( const char * name ); + + virtual void initIfnetEparams( struct ifnet_init_eparams * eparams ) APPLE_KEXT_OVERRIDE; + void apStaInitIfnetEparams( struct ifnet_init_eparams * eparams ); + errno_t apsta_if_output_pre_enqueue( ifnet_t interface, mbuf_t data ); + + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 0 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 1 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 2 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 3 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 4 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 5 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 6 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 7 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 8 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 9 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 10 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 11 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 12 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 13 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 14 ); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 15 ); }; -#endif /* IO80211P2PInterface_h */ +#endif diff --git a/Headers/IOKit/80211/IO80211SkywalkInterface.h b/Headers/IOKit/80211/IO80211SkywalkInterface.h index 82dc191e..2d9dbe0c 100644 --- a/Headers/IOKit/80211/IO80211SkywalkInterface.h +++ b/Headers/IOKit/80211/IO80211SkywalkInterface.h @@ -1,27 +1,221 @@ -// -// IO80211SkywalkInterface.h -// IO80211Family -// -// Created by 钟先耀 on 2019/10/18. -// Copyright © 2019 钟先耀. All rights reserved. -// - -#ifndef _IO80211SKYWALK_H -#define _IO80211SKYWALK_H - -#include -#include - -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IO80211SKYWALKINTERFACE_H +#define _IO80211SKYWALKINTERFACE_H + +#include +#include + +class IOSkywalkNetworkPacket; +class IO80211Peer; +class IO80211PeerMonitor; +class IO80211LinkQualityMonitor; +class IO80211LinkRecovery; + +/*! @defined kInterfaceEnableProperty + @abstract kInterfaceEnableProperty is the name of the + Interface Enable property that marks whether the interface + is functional. */ + +#define kInterfaceEnableProperty "InterfaceEnable" + +/*! @defined kInterfaceBSSIDProperty + @abstract kInterfaceBSSIDProperty is the IORegistry property + that records the interface's BSSID. */ + +#define kInterfaceBSSIDProperty "InterfaceBSSID" + +/*! @defined kInterfacePeerMacProperty + @abstract kInterfacePeerMacProperty is IORegistry property + that stores the peer MAC address. */ -class IO80211SkywalkInterface : IOSkywalkEthernetInterface { - OSDeclareAbstractStructors(IO80211SkywalkInterface) +#define kInterfacePeerMacProperty "InterfacePeerMac" +/*! @defined kIO80211InterfaceRole + @abstract kIO80211InterfaceRole is the IORegistry property + that records the role of the skywalk interface. */ + +#define kIO80211InterfaceRole "IO80211InterfaceRole" + +/*! @class IO80211SkywalkInterface + @abstract Abstract skywalk 80211 interface. + @discussion ???. +*/ + +class IO80211SkywalkInterface : public IOSkywalkEthernetInterface +{ + OSDeclareAbstractStructors( IO80211SkywalkInterface ) + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + + UInt32 getInterfaceRole(); + bool setInterfaceRole( UInt32 role ); + const char * getInterfaceRoleStr(); + + IOReturn createIOReporters( IOService * provider ); + virtual IOReturn configureReport( IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport( IOReportChannelList * channels, IOReportUpdateAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + + virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + + const char * getBSDName() APPLE_KEXT_OVERRIDE; + ifnet_t getIfnet(); + IOWorkLoop * getControllerWorkLoop(); + + virtual IOReturn initBSDInterfaceParameters( struct ifnet_init_eparams * params, sockaddr_dl ** ll ) APPLE_KEXT_OVERRIDE; + virtual IOReturn prepareBSDInterface( ifnet_t interface, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual errno_t processBSDCommand( ifnet_t interface, UInt32 cmd, void * data ) APPLE_KEXT_OVERRIDE; + errno_t performGatedCommand( UInt32 cmd, void * data ); + virtual void setRunningState( bool state ) APPLE_KEXT_OVERRIDE; + + IOReturn storeProcessNameAndIoctlInformation( unsigned long ioctlInfo ); + IOReturn storeIoctlInArray( OSArray * array, OSNumber * ioctlInfo ); + IOReturn dumpUnentitledProcesses(); + + virtual void postMessage( UInt32 msg, void * data = NULL, size_t dataSize = 0 ); + virtual bool reportDataPathEvents( UInt32 msg ,void * data = NULL, size_t dataSize = 0 ); + virtual void recordOutputPacket( mbuf_traffic_class_t trafficClass, int txPackets, int txBytes ); + virtual void recordInputPacket( int rxPackets, int rxBytes ); + + virtual void logTxPacket( IOSkywalkNetworkPacket * packet, struct PacketSkywalkScratch * scratch, mbuf_traffic_class_t trafficClass, bool ); + virtual void logTxCompletionPacket( IOSkywalkNetworkPacket * packet, struct PacketSkywalkScratch * scratch, mbuf_traffic_class_t trafficClass, IOReturn status, UInt32, bool ); + + virtual bool inputPacket( IOSkywalkNetworkPacket * packet, struct packet_info_tag * info, ether_header * header ); + virtual UInt32 pendingPackets( UInt8 interface ); + virtual UInt32 packetSpace( UInt8 interface ); + + virtual bool setLinkState( IO80211LinkState linkState, UInt32 reason, bool debounce, UInt32 ); + virtual IO80211LinkState linkState(); + + virtual void postPeerPresence( ether_addr * address, int32_t rssi, int linkQualityMetric, int nodeProximityMetric, char * serviceInfo ); + virtual void postPeerAbsence( ether_addr * address ); + + IO80211PeerMonitor * getPeerMonitor( IO80211Peer * peer ); + IO80211LinkQualityMonitor * getLinkQualityMonitor( IO80211Peer * peer ); + IO80211LinkRecovery * getLinkRecovery( IO80211Peer * peer ); + + virtual void setScanningState( UInt32 scanSource, bool scan, apple80211_scan_data * data, IOReturn status ); + virtual void setDataPathState( bool state ); + + virtual bool updateLinkParameters( apple80211_interface_availability * params ); + virtual bool updateInterfaceCoexRiskPct( UInt64 percent ); + + virtual bool setLQM( UInt64 lqm ); + virtual IOReturn updateLinkStatus(); + virtual IOReturn updateLinkStatusGated(); + + virtual bool setInterfaceExtendedCCA( apple80211_channel channel, apple80211_cca_report * report ); + virtual bool setInterfaceCCA( apple80211_channel channel, int cca ); + virtual bool setInterfaceNF( apple80211_channel channel, long long noiseFloor ); + virtual bool setInterfaceOFDMDesense( apple80211_channel channel, long long ofdmDesense ); + + virtual void removePacketQueue( const IO80211FlowQueueHash * hash ); + virtual void setDebugFlags( UInt64 debugFlags, IOOptionBits options ); + virtual UInt64 debugFlags(); + + virtual bool setInterfaceChipCounters( struct apple80211_stat_report * report, apple80211_chip_counters_tx * tx, apple80211_chip_error_counters_tx * err, apple80211_chip_counters_rx * rx ); + virtual bool setInterfaceMIBdot11( apple80211_stat_report * report, apple80211_ManagementInformationBasedot11_counters * counters ); + virtual bool setFrameStats( apple80211_stat_report * frame, apple80211_frame_counters * counters ); + + virtual void getWmeTxCounters( UInt64 * counters ); + virtual void setEnabledBySystem( bool systemEnabled ); + virtual bool enabledBySystem(); + virtual void willRoam( ether_addr * bssid, UInt32 options ); + virtual void setPeerManagerLogFlag( UInt32 operation, UInt32 bit, IOOptionBits options ); + virtual void setWoWEnabled( bool enable ); + virtual bool wowEnabled(); + + virtual bool shouldLog( UInt64 debugFlags ); + virtual void logDebug( char const * format, ... ); + virtual void logDebug( UInt64 debugFlags, char const * format, ... ); + virtual void logDebugHex( const void * data, size_t size, const char * format, ... ); + virtual void vlogDebug( UInt64 debugFlags, char const * format, va_list va ); + virtual void vlogDebugBPF( UInt64 debugFlags, char const * format, va_list va ); + + virtual IOReturn createLinkQualityMonitor( IO80211Peer * peer, IOService * service ); + virtual void releaseLinkQualityMonitor( IO80211Peer * peer ); + virtual void setNotificationProperty( const OSSymbol * name, const OSObject * data ); + virtual void getWorkerMatchingDict( OSString * name ); + + virtual bool init( IOService * controller ); + virtual bool isInterfaceEnabled(); + + virtual ether_addr getSelfMacAddr(); + virtual void setSelfMacAddr( ether_addr * address ); + virtual ether_addr getBSSID(); + virtual IOSkywalkPacketBufferPool * getPacketPool( OSString * name ); + virtual void * getLogger(); + + virtual errno_t handleSIOCSIFADDR(); + errno_t handleDebugCmd( apple80211_debug_command * cmd ); + virtual errno_t debugHandler( apple80211_debug_command * command ); + + UInt32 printDataPath( userPrintCtx * context ); + UInt32 getDataQueueDepth(); + public: + IO80211PeerManager * _peerManager; // 208 + IO80211Controller * _controller; // 216 + IO80211InterfaceMonitor * _interfaceMonitor; // 224 + IO80211AssociationJoinSnapshot * _assocJoinSnapshot; // 232 + UInt32 _interfaceRole; // 240 + UInt32 _interfaceID; // 244 + bool _wlanEntitlement; // 248 + char _bsdName[IFNAMSIZ]; // 249 + OSDictionary * _deniedProcessesArray; // 272 + // 280 + + OSSymbol * _interfacePeerMacProperty; // 320 + OSSymbol * _interfaceBSSIDProperty; // 328 + OSSymbol * _interfaceEnableProperty; // 336 + OSData * _bssidData; // 344 + // 352 + OSDictionary * _interfaceMacAddress; // 360 + OSBoolean * _interfaceEnabled; // 376 + + void * _logger; // 384 + + bool _runningState; // 408 + IO80211LinkState _linkState; // 412 + ether_addr _selfMacAddress; // 416 + // 424 }; -#endif /* _IO80211SKYWALK_H */ +// 728 + +#endif diff --git a/Headers/IOKit/80211/IO80211String.h b/Headers/IOKit/80211/IO80211String.h new file mode 100644 index 00000000..8f0b6965 --- /dev/null +++ b/Headers/IOKit/80211/IO80211String.h @@ -0,0 +1,65 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IO80211STRING_H +#define _IO80211STRING_H + +#include + +class IO80211String : public OSObject +{ + OSDeclareDefaultStructors(IO80211String) + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + static IO80211String * withString( const char * string ); + bool initWithString( const char * string ); + + static IO80211String * withFormat( const char * format, ... ); + static IO80211String * withFormatAndArguments( const char * format, va_list va ); + bool initWithFormat( const char * foramt, va_list va ); + + bool appendString( const char * string ); + bool appendFormat( const char * format, ... ); + bool appendFormatAndArguments( const char * format, va_list va ); + bool appendStringWithLength( const char * string, UInt32 length ); + const char * getCStringNoCopy(); + void printToIOLog(); + +protected: + OSData * mData; +}; + +#endif diff --git a/Headers/IOKit/80211/IO80211VirtualInterface.h b/Headers/IOKit/80211/IO80211VirtualInterface.h index f405498a..87ff3b0b 100644 --- a/Headers/IOKit/80211/IO80211VirtualInterface.h +++ b/Headers/IOKit/80211/IO80211VirtualInterface.h @@ -1,101 +1,336 @@ -#ifndef IO80211VirtualInterface_h -#define IO80211VirtualInterface_h +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ -#include "IO80211Interface.h" -#include "apple_private_spi.h" +#ifndef _IO80211VIRTUALINTERFACE_H +#define _IO80211VIRTUALINTERFACE_H + +#include + +#include +#include +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif class IO80211PeerManager; +class IO80211AsyncEventUserClient; +class IO80211P2PDaemonUserClient; -class IO80211VirtualInterface : public IOService { - OSDeclareDefaultStructors(IO80211VirtualInterface) +struct bpfTapCallback +{ + u_int32_t data_link_type; + bpf_tap_mode direction; + IO80211VirtualInterface * interface; +}; + +typedef UInt32 realTimeServiceId; + +enum +{ + kIO80211VirtualInterfaceRoleP2PDevice = 0, + kIO80211VirtualInterfaceRoleP2PClient = 1, + kIO80211VirtualInterfaceRoleP2PGroupOwner = 2, + kIO80211VirtualInterfaceRoleAirLink = 3, + kIO80211VirtualInterfaceRoleSoftAP = 4, + kIO80211VirtualInterfaceRoleUknown = 5, + kIO80211VirtualInterfaceRoleWiFiAwareDiscovery = 6, + kIO80211VirtualInterfaceRoleWiFiAwareDiscoveryAndData = 7, + kIO80211VirtualInterfaceRoleWiFiAwareData = 8, + kIO80211VirtualInterfaceRoleUndefined +}; + +class IO80211VirtualInterface : public IOService +{ + OSDeclareDefaultStructors( IO80211VirtualInterface ) public: - virtual void free(void) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_11_0 + virtual bool init( IO80211Controller * controller, ether_addr_t * address, UInt32 role, char const * bsdName ); + virtual void free() APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 virtual bool willTerminate( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; #endif - virtual IOReturn configureReport(IOReportChannelList *channels, - IOReportConfigureAction action, - void *result, - void *destination) APPLE_KEXT_OVERRIDE; - virtual IOReturn updateReport(IOReportChannelList *channels, - IOReportUpdateAction action, - void *result, - void *destination) APPLE_KEXT_OVERRIDE; virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; - virtual bool attach(IOService *) APPLE_KEXT_OVERRIDE; - virtual void detach(IOService *) APPLE_KEXT_OVERRIDE; -#if __IO80211_TARGET >= __MAC_10_15 - virtual IOReturn newUserClient(task_t,void *,UInt,OSDictionary *,IOUserClient **) APPLE_KEXT_OVERRIDE; + + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach( IOService * provider ) APPLE_KEXT_OVERRIDE; + + IOReturn createIOReporters( IOService * service ); + virtual IOReturn configureReport( IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport( IOReportChannelList * channels, IOReportUpdateAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + void reportTransmitStatus( mbuf_t packet, IOReturn status, struct packet_info_tx * info ); + IOReturn reportTransmitCompletionStatus( mbuf_t packet, IOReturn status, uint32_t param1 = 0, uint32_t param2 = 0, IOOptionBits options = 0 ); + + bool reportDataPathEvents( UInt32 msg ,void * data = NULL, size_t dataSize = 0 ); + static IOReturn reportDataPathEventsGated( void * target, void * msg, void * data, void * dataSize, void * arg0 ); + + void setAuthTimeout( AbsoluteTime timeout ); + AbsoluteTime authTimeout(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn newUserClient( task_t owningTask, void * securityID, UInt32 type, OSDictionary * properties, LIBKERN_RETURNS_RETAINED IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; #endif + IOReturn resetUserClientReference(); + static IOReturn resetUserClientReferenceGated( OSObject * target, void * arg0, void * arg1, void * arg2, void * arg3 ); + IOReturn startAsyncEventUserClientForTask( task_t task, kIO80211InterfaceType ); + IOReturn startP2PDaemonUserClientForTask( task_t task ); + void p2pDaemonExited(); + virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; virtual int errnoFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; - virtual IOReturn powerStateWillChangeTo( - IOPMPowerFlags capabilities, - unsigned long stateNumber, - IOService * whatDevice ) APPLE_KEXT_OVERRIDE; - - virtual IOReturn powerStateDidChangeTo( - IOPMPowerFlags capabilities, - unsigned long stateNumber, - IOService * whatDevice ) APPLE_KEXT_OVERRIDE; - virtual bool init(IO80211Controller *,ether_addr *,uint,char const*); - virtual bool createPeerManager(ether_addr *,IO80211PeerManager **); - virtual UInt getMediumType(); - virtual void setLinkState(IO80211LinkState,uint); - virtual bool dequeueOutputPacketsWithServiceClass(uint,IOMbufServiceClass,mbuf_t*,mbuf_t*,UInt *,unsigned long long *); - virtual UInt32 outputPacket (mbuf_t m, void* param); - virtual void setEnabledBySystem(bool); - virtual void handleIoctl(unsigned long,void *); - virtual UInt32 inputPacket(mbuf_t,packet_info_tag *); - virtual IOReturn controllerWillChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *); - virtual IOReturn controllerDidChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *); - virtual bool handleDebugCmd(apple80211_debug_command *); - virtual IOReturn postPeerPresence(ether_addr *,int,int,int,char *); - virtual IOReturn postPeerAbsence(ether_addr *); -#if __IO80211_TARGET >= __MAC_10_15 - virtual IOReturn postPeerPresenceIPv6(ether_addr *,int,int,int,char *,unsigned char *); + + bool setInterfaceRole( UInt32 role ); + UInt32 getInterfaceRole(); + + bool isPeerToPeerInterface(); + virtual bool createPeerManager( ether_addr * inAddress, IO80211PeerManager ** outManager ); + IO80211WorkLoop * getWorkLoop(); + const char * getBSDName(); + virtual IOMediumType getMediumType(); + IO80211Controller * getController(); + bool getInterfaceAddress( UInt8 * address ); + + virtual bool setLinkState( IO80211LinkState state, UInt32 reason ); + IO80211LinkState linkState(); + + void setScanningState( UInt32 scanSource, bool scan, apple80211_scan_data * data, IOReturn status ); + void setJoiningState( UInt32 scanSource, joinStatus status, bool join ); // unimplemented + void setInfraChannel( apple80211_channel * channel ); + void setInfraTxState( bool state ); + bool setInterfaceExtendedCCA( apple80211_channel channel, apple80211_cca_report * report, apple80211_awdl_sync_channel_sequence * sequence ); + bool setInterfaceCCA( apple80211_channel channel, int cca, apple80211_awdl_sync_channel_sequence * sequence ); + bool setInterfaceNF( apple80211_channel channel, int64_t noiseFloor ); + bool setInterfaceChipCounters( apple80211_stat_report * report, apple80211_chip_counters_tx * tx, apple80211_chip_error_counters_tx * errorTx, apple80211_chip_counters_rx * rx ); + bool setInterfaceMIBdot11( apple80211_stat_report * report, apple80211_ManagementInformationBasedot11_counters * mib ); + bool setFrameStats( apple80211_stat_report * report, apple80211_frame_counters * frame ); + bool setAMPDUstat( apple80211_stat_report * report, apple80211_ampdu_stat_report * ampdu ); + + mbuf_t preQueuePacket( mbuf_t packet ); + void dropTxPacket( mbuf_t packet ); + UInt32 dequeueTxPackets( TxPacketRequest * tx ); + virtual IOReturn dequeueOutputPacketsWithServiceClass( UInt32 max, IOMbufServiceClass serviceClass, mbuf_t * firstPacket, mbuf_t * lastPacket, UInt32 * count, UInt64 * result ); + virtual UInt32 outputPacket( mbuf_t m, void * param ); + errno_t bpfOutputPacket( mbuf_t m, void * data ); + errno_t bpfOutput( UInt32, mbuf_t m ); + + virtual void setEnabledBySystem( bool state ); + bool enabledBySystem(); + + static IOReturn ioctl_internal_gated( void * owner, void * request, void * arg0, void * arg1, void * arg2 ); + IOReturn ioctl_internal( void * request ); + virtual errno_t handleIoctl( unsigned long inID, void * inData ); + static errno_t handleIoctlGated( void * owner, void * inID ,void * inData, void * arg0, void * arg1 ); + errno_t handleSIOCGIFMEDIA( unsigned long inID, struct ifmediareq * ); + errno_t handleSIOCSIFADDR(); + errno_t handleSIOCSIFFLAGS( const char * source ); + + virtual UInt32 inputPacket( mbuf_t packet, struct packet_info_tag * info ); + + virtual IOReturn powerStateWillChangeTo( IOPMPowerFlags capabilities, unsigned long stateNumber, IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + static IOReturn powerStateWillChangeToGated( void * owner, void * capabilities, void * stateNumber, void * whatDevice, void * arg ); + virtual IOReturn controllerWillChangePowerState( IO80211Controller * controller, IOPMPowerFlags capabilities, IO80211SystemPowerState stateNumber, IOService * whatDevice ); + + virtual IOReturn powerStateDidChangeTo( IOPMPowerFlags capabilities, unsigned long stateNumber, IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + static IOReturn powerStateDidChangeToGated( void * owner, void * capabilities, void * stateNumber, void * whatDevice, void * arg ); + virtual IOReturn controllerDidChangePowerState( IO80211Controller * controller, IOPMPowerFlags capabilities, IO80211SystemPowerState stateNumber, IOService * whatDevice ); + + virtual errno_t handleDebugCmd( apple80211_debug_command * command ); + + IOReturn IO80211InterfacePostMessage( UInt32 msg ,void * data = NULL, size_t dataSize = 0 ); + void postMessage( UInt32 msg, void * data = NULL, size_t dataSize = 0 ); + void postSyncStateChanged(); + errno_t postNewMasterElected(); + void postServiceIndication(); + void postAwdlStatistics( struct apple80211_awdl_statistics * stats ); // size = 2520 + void postAwdlHppStatsEvent( realTimeServiceId event ); + void postLowlatencyStatistics( struct apple80211_lowlatency_peer_statistics_event * stats ); + void postAwdlAppSpecificInfo( struct apple80211_awdl_app_specific_info * info ); + void postP2PAirplayStatistics( struct apple80211_p2p_airplay_statistics * stats ); + void postHostapChannelChanged(apple80211_hostap_state *); + virtual void postPeerPresence( ether_addr * address, int32_t rssi, int linkQualityMetric, int nodeProximityMetric, char * serviceInfo ); + virtual void postPeerAbsence( ether_addr * address ); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual void postPeerPresenceIPv6( ether_addr * address, int32_t rssi, int linkQualityMetric, int nodeProximityMetric, char * serviceInfo, UInt8 * socketAddressData ); #endif virtual void signalOutputThread(); virtual bool isOutputFlowControlled(); virtual void setOutputFlowControlled(); virtual void clearOutputFlowControlled(); - virtual void outputStart(uint); - virtual UInt32 configureAQMOutput(); - virtual void setUnitNumber(char const*); - virtual bool initIfnetEparams(ifnet_init_eparams *); + virtual IOReturn outputStart( IOOptionBits options ); + static IOReturn _outputStart( OSObject * owner, void * options, void * arg0, void * arg1, void * arg2 ); + IOReturn _outputStartGated( IOOptionBits options ); + IOReturn _outputStartGatedNoPM( IOOptionBits options ); + + virtual void configureAQMOutput(); + virtual void setUnitNumber( const char * name ); + void setUnitNumber( const char * name, UInt32 number ); + + virtual void initIfnetEparams( struct ifnet_init_eparams * params ); + void ifnet_start_callback( ifnet_t ifnet ); + void ifnet_detach_callback( ifnet_t ifnet ); + void ifnet_ioctl_callback( ifnet_t ifnet, unsigned long id, void * data ); + virtual bool attachToBpf(); - virtual bool configureIfnet(); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 0); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 1); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 2); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 3); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 4); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 5); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 6); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 7); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 8); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 9); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 10); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 11); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 12); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 13); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 14); - OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 15); -public: - - static void startOutputQueues(); - - static void stopOutputQueues(); + bool peerToPeerAttachToBpf(); + errno_t bpfAttach( UInt32 dataLinkType, UInt32 headerLength, OSObject * target, IOOutputAction action, IOBPFTapAction tap, IOWorkLoop * workLoop ); + errno_t bpfAttach( UInt32 dataLinkType, UInt32 headerLength ); + errno_t bpfAttachEN10MB( UInt32 headerLength ); + + void bpfTapInput( mbuf_t packet, UInt32 dlt, void * header, size_t header_len ); + errno_t bpfTap( u_int32_t data_link_type, bpf_tap_mode direction ); + void sendToBpfTap( mbuf_t packet, UInt32 dlt, void * header, size_t header_len ); + + ifnet_t getIfnet(); + bool attachIfnet( ether_addr_t * address, char const * bsdName ); + errno_t detachIfnet(); + virtual errno_t configureIfnet(); + errno_t peerToPeerConfigureIfnet(); + + bool updateLinkParameters( apple80211_interface_availability * params ); + bool updateInterfaceCoexRiskPct( UInt64 percent ); + + IOLock * getDetachLock(); + void setWaitingForDetach( bool waiting ); + + void setDebugFlags( UInt64 debugFlags, IOOptionBits options ); + UInt64 debugFlags(); + + bool shouldLog( UInt64 debugFlags ); + void logDebug( char const * format, ... ); + void logDebug( UInt64 debugFlags, const char * format, ... ); + void vlogDebug( UInt64 debugFlags, char const * format, va_list va ); + void vlogDebugBPF( UInt64 debugFlags, char const * format, va_list va ); + void logTxPacket( mbuf_t packet ); + void logTxCompletionPacket( mbuf_t packet, IOReturn status ); + + IOReturn storeProcessNameAndIoctlInformation( unsigned long ioctlInfo ); + IOReturn storeIoctlInArray( OSArray * array, OSNumber * ioctlInfo ); + IOReturn dumpUnentitledProcesses(); + + void handleChannelSwitchAnnouncement( apple80211_channel_switch_announcement * announcement ); + bool isAwdlAssistedDiscoveryEnabled(); + void notifyHostapState( apple80211_hostap_state * state ); + + bool dualBandCapable(); + + // RSN Supplicant + + bool initSupplicant( UInt8 * ie, int mode ); + void terminateSupplicant(); + void resetSupplicant(); + bool setPMK( UInt8 * pmk ); + bool setPSKPMK( UInt8 * pmk ); + bool supplicantExchangeComplete(); + bool supplicantInitialized(); + void cachePMKSA( UInt8 * pmk, size_t pmkLen, ether_addr * aa, UInt8 * pmkID ); + SInt32 cachePMKSA( UInt8 * pmk, size_t pmkLen, ether_addr * authenticatorEA ); + void getPMKSAList( struct apple80211_pmk_cache_data * list ); - static void postMessage(unsigned int, void* data = NULL, unsigned long dataLen = 0); + void getWmeTxCounters( UInt64 * counters ); + void setWoWEnabled( bool enable ); + + bool controllerLostPower(); + void pushPacket( mbuf_t packet ); + UInt32 printDataPath( userPrintCtx * ctx ); + + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 0 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 1 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 2 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 3 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 4 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 5 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 6 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 7 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 8 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 9 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 10 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 11 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 12 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 13 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 14 ); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 15 ); - static int getInterfaceRole(); +protected: + UInt16 _dataQueueDepth; // 136 + IO80211FlowQueueDatabase * _queueDatabase; // 144 + UInt32 _outputSchedulingModel; // 152 + UInt32 _outputQueueMaxLength; // 156 + IO80211AsyncEventUserClient * _asyncEventUserClient; // 160 + IO80211P2PDaemonUserClient * _p2pDaemonUserClient; // 168 + UInt64 _debugFlags; // 176 + IO80211PeerManager * _peerManager; // 184 + IO80211InterfaceMonitor * _interfaceMonitor; // 192 + UInt32 _interfaceRole; // 200 + IO80211Controller * _controller; // 208 + ifnet_t _ifnet; // 216 + const char _bsdName[ 16 ]; // 224 + UInt32 _ifID; // 240 + IOLock * _detachLock; // 248 + bool _waitingForDetach; // 256 + IO80211LinkState _linkState; // 260 + UInt32 _testedWlanPanicPostMessage; // 264 + UInt64 _interfaceClosePercent; // 272 + UInt64 _interfaceCoexRiskPct; // 280 + unsigned long _authTimeout; // 288 + IOGatedOutputQueue * _beQueue; // 296 + IOGatedOutputQueue * _bgQueue; // 304 + IOGatedOutputQueue * _voQueue; // 312 + IOGatedOutputQueue * _viQueue; // 320 + bool _supportOutputQueues; // 328, bg, vo, and vi + void * _caps; // 336, size is 12 + bpfListHeader * _bpfListHead ; // 344 + IOLock * _bpfLock; // 352 + bool _bpfDLTIsEN10MB; // 360 + bpf_tap_mode _tapDirection; // 364 + bool _controllerLostPower; // 368 + bool _enabledBySystem; // 369 + UInt32 _outputFlowControlled; // 372 + + UInt32 _interfaceCCAs[ APPLE80211_MAX_AWDL_CHANNELS ]; // 376 + UInt64 _reserved; // 504 + + OSDictionary * _deniedProcessesArray; // 512 + bool _wlanEntitlement; // 520 + + // Interface Namer + UInt32 _unitNumber; // 524 + const char _unitName [ IFNAMSIZ ]; // 528 - const char *getBSDName(); -public: - char buf[0x300]; + UInt64 __unknown; // 544 + ifmultiaddr_t _ifmaddr; // 552 }; - -#endif /* IO80211VirtualInterface_h */ +#endif diff --git a/Headers/IOKit/80211/IO80211VirtualInterfaceNamer.h b/Headers/IOKit/80211/IO80211VirtualInterfaceNamer.h index 4327a55a..82077dee 100644 --- a/Headers/IOKit/80211/IO80211VirtualInterfaceNamer.h +++ b/Headers/IOKit/80211/IO80211VirtualInterfaceNamer.h @@ -36,29 +36,29 @@ #include +extern bool IO80211VirtualInterfaceNamerRetain(); +extern void IO80211VirtualInterfaceNamerRelease(); +extern bool IO80211VirtualInterfaceNamerMarkInterfaceUnitUsed( char const * name, UInt32 unitNumber ); +extern void IO80211VirtualInterfaceNamerMarkInterfaceUnitUnused( char const * name, UInt32 unitNumber ); +extern UInt32 IO80211VirtualInterfaceNamerNextAvailableUnitNumberForName( char const * name, bool markUsed ); + class IO80211VirtualInterfaceNamer : public IOService { - OSDeclareDefaultStructors(IO80211VirtualInterfaceNamer) + OSDeclareDefaultStructors(IO80211VirtualInterfaceNamer) public: - virtual bool init() APPLE_KEXT_OVERRIDE; - virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; - bool arrayContainsUnitNumber( OSArray * array, OSNumber * unitNumber ); - bool markInterfaceUnitUsed( char const * name, UInt32 unitNumber ); - void markInterfaceUnitUnused( char const * name, UInt32 unitNumber ); - UInt32 nextAvailableUnitNumberForName( char const * name, bool markUsed ); + bool arrayContainsUnitNumber( OSArray * array, OSNumber * unitNumber ); + bool markInterfaceUnitUsed( char const * name, UInt32 unitNumber ); + void markInterfaceUnitUnused( char const * name, UInt32 unitNumber ); + UInt32 nextAvailableUnitNumberForName( char const * name, bool markUsed ); - IORecursiveLock * _lock; - OSDictionary * _interfaceUnits; // all OSArrays + IORecursiveLock * _lock; + OSDictionary * _interfaceUnits; // all OSArrays }; -static IO80211VirtualInterfaceNamer * _interfaceNamer; - -bool IO80211VirtualInterfaceNamerRetain(); -void IO80211VirtualInterfaceNamerRelease(); -bool IO80211VirtualInterfaceNamerMarkInterfaceUnitUsed( char const * name, UInt32 unitNumber ); -void IO80211VirtualInterfaceNamerMarkInterfaceUnitUnused( char const * name, UInt32 unitNumber ); -UInt32 IO80211VirtualInterfaceNamerNextAvailableUnitNumberForName( char const * name, bool markUsed ); +extern static IO80211VirtualInterfaceNamer * _interfaceNamer; #endif diff --git a/Headers/IOKit/80211/IO80211WorkLoop.h b/Headers/IOKit/80211/IO80211WorkLoop.h index bf33bfd7..6f600b8a 100644 --- a/Headers/IOKit/80211/IO80211WorkLoop.h +++ b/Headers/IOKit/80211/IO80211WorkLoop.h @@ -1,29 +1,46 @@ /* - * IO80211WorkLoop.h - * IO80211Family + * Released under "The BSD 3-Clause License" * - * Created by Pete on 5/31/06. - * Copyright 2006 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _IO80211WORKLOOP_H #define _IO80211WORKLOOP_H -#include #include -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif - class IO80211WorkLoop : public IOWorkLoop { OSDeclareDefaultStructors( IO80211WorkLoop ) public: - static IO80211WorkLoop * workLoop(); virtual void openGate() APPLE_KEXT_OVERRIDE; diff --git a/Headers/IOKit/80211/IOSkywalkEthernetInterface.h b/Headers/IOKit/80211/IOSkywalkEthernetInterface.h deleted file mode 100644 index 6670ff6d..00000000 --- a/Headers/IOKit/80211/IOSkywalkEthernetInterface.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef IOSkywalkEthernetInterface_h -#define IOSkywalkEthernetInterface_h - -#include - -class IOSkywalkEthernetInterface : public IOEthernetController { - OSDeclareAbstractStructors( IOSkywalkEthernetInterface ) - -public: - -}; - -#endif /* IOSkywalkEthernetInterface_h */ diff --git a/Headers/IOKit/80211/Stopwatch.h b/Headers/IOKit/80211/Stopwatch.h new file mode 100644 index 00000000..1683e838 --- /dev/null +++ b/Headers/IOKit/80211/Stopwatch.h @@ -0,0 +1,74 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IO80211_STOPWATCH_H +#define _IO80211_STOPWATCH_H + +#include + +class Stopwatch : public OSObject +{ + OSDeclareDefaultStructors( Stopwatch ) + +public: + struct TimeDelta_us + { + UInt32 elapsedTicks; + UInt32 elapsedMs; + UInt32 operationTime; + } __attribute__((packed)); + + static Stopwatch * withUptime(); + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + void start(); + void restart(); + void reset(); + void stop(); + + AbsoluteTime getSplit_abs(); + UInt64 getSplit_ns(); + UInt32 getSplit_us(); + AbsoluteTime getElapsed_abs(); + UInt64 getElapsed_ns(); + UInt32 getElapsed_us(); + UInt32 getElapsed_s(); + + void getElapsed( TimeDelta_us & us ); + +protected: + AbsoluteTime _startTime; + AbsoluteTime _stopTime; +}; + +#endif diff --git a/Headers/IOKit/80211/apple80211_ioctl.h b/Headers/IOKit/80211/apple80211_ioctl.h index 55fb4505..2ca4acec 100644 --- a/Headers/IOKit/80211/apple80211_ioctl.h +++ b/Headers/IOKit/80211/apple80211_ioctl.h @@ -19,6 +19,7 @@ * * @APPLE_LICENSE_HEADER_END@ */ + #ifndef _APPLE80211_IOCTL_H_ #define _APPLE80211_IOCTL_H_ @@ -29,373 +30,597 @@ #include #include -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif - #include struct apple80211req { - char req_if_name[IFNAMSIZ]; // 16 bytes - int req_type; // 4 bytes - int req_val; // 4 bytes - u_int32_t req_len; // 4 bytes - void *req_data; // 4 bytes + char req_if_name[IFNAMSIZ]; + int req_type; + int req_val; + u_int32_t req_len; + void *req_data; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + u_int32_t req_ptr_len; +#endif }; -#define SIOCSA80211 2150656456 -#define SIOCGA80211 3224398281 +#define SIOCSA80211 _IOW( 'i', 200, struct apple80211req ) +#define SIOCGA80211 _IOWR( 'i', 201, struct apple80211req ) + +#define APPLE80211_AWDL_CAP_CCA_STATS 2 +#define APPLE80211_AWDL_CAP_SEC_PAYLOAD 0x100000000 // req_type -#define APPLE80211_IOC_SSID 1 // req_type +#define APPLE80211_IOC_SSID 1 -#define APPLE80211_IOC_AUTH_TYPE 2 // req_type -#define APPLE80211_AUTH_TYPE_UNICAST 1 // req_val, SIOCGA80211 only -#define APPLE80211_AUTH_TYPE_MULTICAST 2 // req_val, SIOCGA80211 only +#define APPLE80211_IOC_AUTH_TYPE 2 +#define APPLE80211_AUTH_TYPE_UNICAST 1 // req_val, SIOCGA80211 only +#define APPLE80211_AUTH_TYPE_MULTICAST 2 // req_val, SIOCGA80211 only -#define APPLE80211_IOC_CIPHER_KEY 3 // req_type -#define APPLE80211_CIPHER_KEY_UNICAST 1 // req_val -#define APPLE80211_CIPHER_KEY_MULICAST 2 // req_val +#define APPLE80211_IOC_CIPHER_KEY 3 +#define APPLE80211_CIPHER_KEY_UNICAST 1 // req_val +#define APPLE80211_CIPHER_KEY_MULICAST 2 // req_val -#define APPLE80211_IOC_CHANNEL 4 // req_type +#define APPLE80211_IOC_CHANNEL 4 -#define APPLE80211_IOC_POWERSAVE 5 // req_type +#define APPLE80211_IOC_POWERSAVE 5 -#define APPLE80211_IOC_PROTMODE 6 // req_type +#define APPLE80211_IOC_PROTMODE 6 -#define APPLE80211_IOC_TXPOWER 7 // req_type -#define APPLE80211_IOC_RATE 8 // req_type -#define APPLE80211_IOC_BSSID 9 // req_type +#define APPLE80211_IOC_TXPOWER 7 +#define APPLE80211_IOC_RATE 8 +#define APPLE80211_IOC_BSSID 9 -#define APPLE80211_IOC_SCAN_REQ 10 // req_type +#define APPLE80211_IOC_SCAN_REQ 10 -#define APPLE80211_IOC_SCAN_RESULT 11 // req_type +#define APPLE80211_IOC_SCAN_RESULT 11 -#define APPLE80211_IOC_CARD_CAPABILITIES 12 // req_type +#define APPLE80211_IOC_CARD_CAPABILITIES 12 -#define APPLE80211_IOC_STATE 13 // req_type (apple80211_state) -#define APPLE80211_IOC_PHY_MODE 14 // req_type (apple80211_phymode) +#define APPLE80211_IOC_STATE 13 +#define APPLE80211_IOC_PHY_MODE 14 -#define APPLE80211_IOC_OP_MODE 15 // req_type (apple80211_opmode) -#define APPLE80211_IOC_RSSI 16 // req_type -#define APPLE80211_IOC_NOISE 17 // req_type +#define APPLE80211_IOC_OP_MODE 15 +#define APPLE80211_IOC_RSSI 16 +#define APPLE80211_IOC_NOISE 17 -#define APPLE80211_IOC_INT_MIT 18 -#define APPLE80211_IOC_INT_MIT_OFF 1 // req_val -#define APPLE80211_IOC_INT_MIT_ON 2 // req_val +#define APPLE80211_IOC_INT_MIT 18 +#define APPLE80211_IOC_INT_MIT_OFF 1 // req_val +#define APPLE80211_IOC_INT_MIT_ON 2 // req_val // card power -#define APPLE80211_IOC_POWER 19 // req_type - -#define APPLE80211_IOC_ASSOCIATE 20 // req_type -#define APPLE80211_IOC_ASSOCIATE_RESULT 21 // req_type -#define APPLE80211_IOC_DISASSOCIATE 22 // req_type -#define APPLE80211_IOC_STATUS_DEV_NAME 23 // req_type - -#define APPLE80211_IOC_IBSS_MODE 24 // req_type -#define APPLE80211_IOC_IBSS_MODE_START 1 // req_val -#define APPLE80211_IOC_IBSS_MODE_STOP 2 // req_val - -#define APPLE80211_IOC_HOST_AP_MODE 25 // req_type -#define APPLE80211_IOC_HOST_AP_MODE_START 1 // req_val -#define APPLE80211_IOC_HOST_AP_MODE_STOP 2 // req_val - -#define APPLE80211_IOC_AP_MODE 26 // req_type (apple80211_apmode) -#define APPLE80211_IOC_SUPPORTED_CHANNELS 27 // req_type -#define APPLE80211_IOC_LOCALE 28 // req_type -#define APPLE80211_IOC_DEAUTH 29 // req_type -#define APPLE80211_IOC_COUNTERMEASURES 30 // req_type -#define APPLE80211_IOC_FRAG_THRESHOLD 31 // req_type -#define APPLE80211_IOC_RATE_SET 32 // req_type -#define APPLE80211_IOC_SHORT_SLOT 33 // req_type -#define APPLE80211_IOC_MULTICAST_RATE 34 // req_type -#define APPLE80211_IOC_SHORT_RETRY_LIMIT 35 // req_type -#define APPLE80211_IOC_LONG_RETRY_LIMIT 36 // req_type -#define APPLE80211_IOC_TX_ANTENNA 37 // req_type -#define APPLE80211_IOC_RX_ANTENNA 38 // req_type -#define APPLE80211_IOC_ANTENNA_DIVERSITY 39 // req_type -#define APPLE80211_IOC_ROM 40 // req_type -#define APPLE80211_IOC_DTIM_INT 41 // req_type -#define APPLE80211_IOC_STATION_LIST 42 // req_type -#define APPLE80211_IOC_DRIVER_VERSION 43 // req_type -#define APPLE80211_IOC_HARDWARE_VERSION 44 // req_type -#define APPLE80211_IOC_RAND 45 // req_type -#define APPLE80211_IOC_RSN_IE 46 // req_type -#define APPLE80211_IOC_BACKGROUND_SCAN 47 // req_type -#define APPLE80211_IOC_AP_IE_LIST 48 // req_type -#define APPLE80211_IOC_STATS 49 // req_type -#define APPLE80211_IOC_ASSOCIATION_STATUS 50 // req_type -#define APPLE80211_IOC_COUNTRY_CODE 51 // req_type -#define APPLE80211_IOC_DEBUG_FLAGS 52 // req_type -#define APPLE80211_IOC_LAST_RX_PKT_DATA 53 // req_type -#define APPLE80211_IOC_RADIO_INFO 54 // req_type -#define APPLE80211_IOC_GUARD_INTERVAL 55 // req_type -#define APPLE80211_IOC_MIMO_POWERSAVE 56 // req_type -#define APPLE80211_IOC_MCS 57 // req_type -#define APPLE80211_IOC_RIFS 58 // req_type -#define APPLE80211_IOC_LDPC 59 // req_type -#define APPLE80211_IOC_MSDU 60 // req_type -#define APPLE80211_IOC_MPDU 61 // req_type -#define APPLE80211_IOC_BLOCK_ACK 62 // req_type -#define APPLE80211_IOC_PLS 63 // req_type -#define APPLE80211_IOC_PSMP 64 // req_type -#define APPLE80211_IOC_PHY_SUB_MODE 65 // req_type -#define APPLE80211_IOC_MCS_INDEX_SET 66 // req_type -#define APPLE80211_IOC_CACHE_THRESH_BCAST 67 // req_type -#define APPLE80211_IOC_CACHE_THRESH_DIRECT 68 // req_type -#define APPLE80211_IOC_WOW_PARAMETERS 69 // req_type -#define APPLE80211_IOC_WOW_ENABLED 70 // req_type -#define APPLE80211_IOC_40MHZ_INTOLERANT 71 // req_type -#define APPLE80211_IOC_PID_LOCK 72 -#define APPLE80211_IOC_STA_IE_LIST 73 -#define APPLE80211_IOC_STA_AUTHORIZE 74 -#define APPLE80211_IOC_STA_DISASSOCIATE 75 -#define APPLE80211_IOC_STA_DEAUTH 76 -#define APPLE80211_IOC_RSN_CONF 77 -#define APPLE80211_IOC_KEY_RSC 78 -#define APPLE80211_IOC_STA_STATS 79 -#define APPLE80211_IOC_ROAM_THRESH 80 -#define APPLE80211_IOC_VENDOR_DBG_FLAGS 81 -#define APPLE80211_IOC_CACHE_AGE_THRESH 82 -#define APPLE80211_IOC_PMK_CACHE 83 -#define APPLE80211_IOC_LINK_QUAL_EVENT_PARAMS 84 -#define APPLE80211_IOC_IE 85 -#define APPLE80211_IOC_SCAN_REQ_MULTIPLE 86 -#define APPLE80211_IOC_BTCOEX_MODE 87 -#define APPLE80211_IOC_WOW_TEST 88 -#define APPLE80211_IOC_CLEAR_PMK_CACHE 89 -#define APPLE80211_IOC_SCANCACHE_CLEAR 90 -#define APPLE80211_IOC_P2P_ENABLE 91 -#define APPLE80211_IOC_P2P_LISTEN 92 -#define APPLE80211_IOC_P2P_SCAN 93 -#define APPLE80211_IOC_VIRTUAL_IF_CREATE 94 -#define APPLE80211_IOC_VIRTUAL_IF_DELETE 95 -#define APPLE80211_IOC_VIRTUAL_IF_ROLE 96 -#define APPLE80211_IOC_VIRTUAL_IF_PARENT 97 -#define APPLE80211_IOC_P2P_GO_CONF 98 -#define APPLE80211_IOC_P2P_NOA_LIST 99 -#define APPLE80211_IOC_P2P_OPP_PS 100 -#define APPLE80211_IOC_P2P_CT_WINDOW 101 -#define APPLE80211_IOC_BT_COEX_FLAGS 102 -#define APPLE80211_IOC_CURRENT_NETWORK 103 -#define APPLE80211_IOC_BT_POWER 104 -#define APPLE80211_IOC_AVAILABILITY 105 -#define APPLE80211_IOC_RSSI_BOUNDS 106 -#define APPLE80211_IOC_ROAM 107 -#define APPLE80211_IOC_TX_CHAIN_POWER 108 -#define APPLE80211_IOC_CDD_MODE 109 -#define APPLE80211_IOC_LAST_BCAST_SCAN_TIME 110 -#define APPLE80211_IOC_THERMAL_THROTTLING 111 -#define APPLE80211_IOC_FACTORY_MODE 112 -#define APPLE80211_IOC_REASSOCIATE 113 - -#define APPLE80211_IOC_POWER_DEBUG_INFO 115 -#define APPLE80211_IOC_AWDL_SYNC_PARAMS 116 -#define APPLE80211_IOC_AWDL_SYNC_ENABLED 117 -#define APPLE80211_IOC_AWDL_EXTENSION_STATE_MACHINE_PARAMETERS 118 -#define APPLE80211_IOC_AWDL_SERVICE_PARAMS 119 -#define APPLE80211_IOC_AWDL_PEER_SERVICE_REQUEST 120 -#define APPLE80211_IOC_AWDL_ELECTION_ALGORITHM_ENABLED 121 -#define APPLE80211_IOC_AWDL_ELECTION_ID 122 -#define APPLE80211_IOC_AWDL_MAX_TREE_DEPTH 123 -#define APPLE80211_IOC_AWDL_GUARD_TIME 124 -#define APPLE80211_IOC_AWDL_BSSID 125 -#define APPLE80211_IOC_AWDL_ELECTION_METRIC 126 -#define APPLE80211_IOC_AWDL_AVAILABILITY_WINDOW_AP_ALIGNMENT 127 -#define APPLE80211_IOC_AWDL_SYNC_FRAME_AP_BEACON_ALIGNMENT 128 -#define APPLE80211_IOC_AWDL_SYNCHRONIZATION_CHANNEL_SEQUENCE 129 -#define APPLE80211_IOC_PEER_CACHE_MAXIMUM_SIZE 130 -#define APPLE80211_IOC_AWDL_OUI 131 -#define APPLE80211_IOC_AWDL_MASTER_CHANNEL 132 -#define APPLE80211_IOC_AWDL_TOP_MASTER 133 -#define APPLE80211_IOC_AWDL_SYNC_STATE 134 -#define APPLE80211_IOC_AWDL_ELECTION_RSSI_THRESHOLDS 135 -#define APPLE80211_IOC_AWDL_PRESENCE_MODE 136 -#define APPLE80211_IOC_AWDL_ELECTION_MASTER_COUNTS 137 -#define APPLE80211_IOC_AWDL_PERIODIC_SYNC_FRAME_PACKET_LIFETIME 138 -#define APPLE80211_IOC_AWDL_MASTER_MODE_SYNC_FRAME_PERIOD 139 -#define APPLE80211_IOC_AWDL_NON_ELECTION_MASTER_MODE_SYNC_FRAME_PERIOD 140 +#define APPLE80211_IOC_POWER 19 + +#define APPLE80211_IOC_ASSOCIATE 20 +#define APPLE80211_IOC_ASSOCIATE_RESULT 21 +#define APPLE80211_IOC_DISASSOCIATE 22 +#define APPLE80211_IOC_STATUS_DEV_NAME 23 + +#define APPLE80211_IOC_IBSS_MODE 24 +#define APPLE80211_IOC_IBSS_MODE_START 1 // req_val +#define APPLE80211_IOC_IBSS_MODE_STOP 2 // req_val + +#define APPLE80211_IOC_HOST_AP_MODE 25 +#define APPLE80211_IOC_HOST_AP_MODE_START 1 // req_val +#define APPLE80211_IOC_HOST_AP_MODE_STOP 2 // req_val + +#define APPLE80211_IOC_AP_MODE 26 +#define APPLE80211_IOC_SUPPORTED_CHANNELS 27 +#define APPLE80211_IOC_LOCALE 28 +#define APPLE80211_IOC_DEAUTH 29 +#define APPLE80211_IOC_COUNTERMEASURES 30 +#define APPLE80211_IOC_FRAG_THRESHOLD 31 +#define APPLE80211_IOC_RATE_SET 32 +#define APPLE80211_IOC_SHORT_SLOT 33 +#define APPLE80211_IOC_MULTICAST_RATE 34 +#define APPLE80211_IOC_SHORT_RETRY_LIMIT 35 +#define APPLE80211_IOC_LONG_RETRY_LIMIT 36 +#define APPLE80211_IOC_TX_ANTENNA 37 +#define APPLE80211_IOC_RX_ANTENNA 38 +#define APPLE80211_IOC_ANTENNA_DIVERSITY 39 +#define APPLE80211_IOC_ROM 40 +#define APPLE80211_IOC_DTIM_INT 41 +#define APPLE80211_IOC_STATION_LIST 42 +#define APPLE80211_IOC_DRIVER_VERSION 43 +#define APPLE80211_IOC_HARDWARE_VERSION 44 +#define APPLE80211_IOC_RAND 45 +#define APPLE80211_IOC_RSN_IE 46 +#define APPLE80211_IOC_BACKGROUND_SCAN 47 +#define APPLE80211_IOC_AP_IE_LIST 48 +#define APPLE80211_IOC_STATS 49 +#define APPLE80211_IOC_ASSOCIATION_STATUS 50 +#define APPLE80211_IOC_COUNTRY_CODE 51 +#define APPLE80211_IOC_DEBUG_FLAGS 52 +#define APPLE80211_IOC_LAST_RX_PKT_DATA 53 +#define APPLE80211_IOC_RADIO_INFO 54 +#define APPLE80211_IOC_GUARD_INTERVAL 55 +#define APPLE80211_IOC_MIMO_POWERSAVE 56 +#define APPLE80211_IOC_MCS 57 +#define APPLE80211_IOC_RIFS 58 +#define APPLE80211_IOC_LDPC 59 +#define APPLE80211_IOC_MSDU 60 +#define APPLE80211_IOC_MPDU 61 +#define APPLE80211_IOC_BLOCK_ACK 62 +#define APPLE80211_IOC_PLS 63 +#define APPLE80211_IOC_PSMP 64 +#define APPLE80211_IOC_PHY_SUB_MODE 65 +#define APPLE80211_IOC_MCS_INDEX_SET 66 +#define APPLE80211_IOC_CACHE_THRESH_BCAST 67 +#define APPLE80211_IOC_CACHE_THRESH_DIRECT 68 +#define APPLE80211_IOC_WOW_PARAMETERS 69 +#define APPLE80211_IOC_WOW_ENABLED 70 +#define APPLE80211_IOC_40MHZ_INTOLERANT 71 +#define APPLE80211_IOC_PID_LOCK 72 +#define APPLE80211_IOC_STA_IE_LIST 73 +#define APPLE80211_IOC_STA_AUTHORIZE 74 +#define APPLE80211_IOC_STA_DISASSOCIATE 75 +#define APPLE80211_IOC_STA_DEAUTH 76 +#define APPLE80211_IOC_RSN_CONF 77 +#define APPLE80211_IOC_KEY_RSC 78 +#define APPLE80211_IOC_STA_STATS 79 +#define APPLE80211_IOC_ROAM_THRESH 80 +#define APPLE80211_IOC_VENDOR_DBG_FLAGS 81 +#define APPLE80211_IOC_CACHE_AGE_THRESH 82 +#define APPLE80211_IOC_PMK_CACHE 83 +#define APPLE80211_IOC_LINK_QUAL_EVENT_PARAMS 84 +#define APPLE80211_IOC_IE 85 +#define APPLE80211_IOC_SCAN_REQ_MULTIPLE 86 +#define APPLE80211_IOC_BTCOEX_MODE 87 +#define APPLE80211_IOC_WOW_TEST 88 +#define APPLE80211_IOC_CLEAR_PMK_CACHE 89 +#define APPLE80211_IOC_SCANCACHE_CLEAR 90 +#define APPLE80211_IOC_P2P_ENABLE 91 +#define APPLE80211_IOC_P2P_LISTEN 92 +#define APPLE80211_IOC_P2P_SCAN 93 +#define APPLE80211_IOC_VIRTUAL_IF_CREATE 94 +#define APPLE80211_IOC_VIRTUAL_IF_DELETE 95 +#define APPLE80211_IOC_VIRTUAL_IF_ROLE 96 +#define APPLE80211_IOC_VIRTUAL_IF_PARENT 97 +#define APPLE80211_IOC_P2P_GO_CONF 98 +#define APPLE80211_IOC_P2P_NOA_LIST 99 +#define APPLE80211_IOC_P2P_OPP_PS 100 +#define APPLE80211_IOC_P2P_CT_WINDOW 101 +#define APPLE80211_IOC_BT_COEX_FLAGS 102 +#define APPLE80211_IOC_CURRENT_NETWORK 103 +#define APPLE80211_IOC_BT_POWER 104 +#define APPLE80211_IOC_AVAILABILITY 105 +#define APPLE80211_IOC_RSSI_BOUNDS 106 +#define APPLE80211_IOC_ROAM 107 +#define APPLE80211_IOC_TX_CHAIN_POWER 108 +#define APPLE80211_IOC_CDD_MODE 109 +#define APPLE80211_IOC_LAST_BCAST_SCAN_TIME 110 +#define APPLE80211_IOC_THERMAL_THROTTLING 111 +#define APPLE80211_IOC_FACTORY_MODE 112 +#define APPLE80211_IOC_REASSOCIATE 113 + +#define APPLE80211_IOC_POWER_DEBUG_INFO 115 +#define APPLE80211_IOC_AWDL_SYNC_PARAMS 116 +#define APPLE80211_IOC_AWDL_SYNC_ENABLED 117 +#define APPLE80211_IOC_AWDL_EXTENSION_STATE_MACHINE_PARAMETERS 118 +#define APPLE80211_IOC_AWDL_SERVICE_PARAMS 119 +#define APPLE80211_IOC_AWDL_PEER_SERVICE_REQUEST 120 +#define APPLE80211_IOC_AWDL_ELECTION_ALGORITHM_ENABLED 121 +#define APPLE80211_IOC_AWDL_ELECTION_ID 122 +#define APPLE80211_IOC_AWDL_MAX_TREE_DEPTH 123 +#define APPLE80211_IOC_AWDL_GUARD_TIME 124 +#define APPLE80211_IOC_AWDL_BSSID 125 +#define APPLE80211_IOC_AWDL_ELECTION_METRIC 126 +#define APPLE80211_IOC_AWDL_AVAILABILITY_WINDOW_AP_ALIGNMENT 127 +#define APPLE80211_IOC_AWDL_SYNC_FRAME_AP_BEACON_ALIGNMENT 128 +#define APPLE80211_IOC_AWDL_SYNCHRONIZATION_CHANNEL_SEQUENCE 129 +#define APPLE80211_IOC_PEER_CACHE_MAXIMUM_SIZE 130 +#define APPLE80211_IOC_AWDL_OUI 131 +#define APPLE80211_IOC_AWDL_MASTER_CHANNEL 132 +#define APPLE80211_IOC_AWDL_TOP_MASTER 133 +#define APPLE80211_IOC_AWDL_SYNC_STATE 134 +#define APPLE80211_IOC_AWDL_ELECTION_RSSI_THRESHOLDS 135 +#define APPLE80211_IOC_AWDL_PRESENCE_MODE 136 +#define APPLE80211_IOC_AWDL_ELECTION_MASTER_COUNTS 137 +#define APPLE80211_IOC_AWDL_PERIODIC_SYNC_FRAME_PACKET_LIFETIME 138 +#define APPLE80211_IOC_AWDL_MASTER_MODE_SYNC_FRAME_PERIOD 139 +#define APPLE80211_IOC_AWDL_NON_ELECTION_MASTER_MODE_SYNC_FRAME_PERIOD 140 #define APPLE80211_IOC_AWDL_EXPLICIT_AVAILABILITY_WINDOW_EXTENSION_OPT_OUT 141 -#define APPLE80211_IOC_AWDL_GET_AWDL_MASTER_DATABASE 142 -#define APPLE80211_IOC_PEER_CACHE_CONTROL 143 -#define APPLE80211_IOC_AWDL_BATTERY_LEVEL 144 -#define APPLE80211_IOC_AWDL_BT_COEX_AW_PROTECTED_PERIOD_LENGTH 145 -#define APPLE80211_IOC_AWDL_BT_COEX_AGREEMENT 146 -#define APPLE80211_IOC_AWDL_BT_COEX_AGREEMENT_ENABLED 147 -#define APPLE80211_IOC_AWDL_STRATEGY 148 -#define APPLE80211_IOC_AWDL_OOB_REQUEST 149 -#define APPLE80211_IOC_AWDL_MAX_NO_MASTER_PERIODS 150 -#define APPLE80211_IOC_AWDL_SYNC_FRAME_TEMPLATE 151 -#define APPLE80211_IOC_LOG_FLAGS 152 -#define APPLE80211_IOC_PEER_STATS 153 -#define APPLE80211_IOC_HT_CAPABILITY 154 -#define APPLE80211_IOC_AWDL_ELECTION_PARAMS 155 -#define APPLE80211_IOC_LINK_CHANGED_EVENT_DATA 156 -#define APPLE80211_IOC_GET_DEBUG_INFO 157 -#define APPLE80211_IOC_AWDL_DEVICE_CAPABILITIES 158 -#define APPLE80211_IOC_AWDL_RSSI_MEASUREMENT_REQUEST 159 -#define APPLE80211_IOC_AWDL_AES_KEY 160 -#define APPLE80211_IOC_AWDL_SCAN_RESERVED_TIME 161 -#define APPLE80211_IOC_AWDL_CTL 162 -#define APPLE80211_IOC_AWDL_SOCIAL_TIME_SLOTS 163 -#define APPLE80211_IOC_AWDL_PEER_TRAFFIC_REGISTRATION 164 -#define APPLE80211_IOC_EXTENDED_STATS 165 -#define APPLE80211_IOC_BEACON_PERIOD 166 -#define APPLE80211_IOC_AWDL_FORCED_ROAM_CONFIG 167 -#define APPLE80211_IOC_AWDL_QUIET 168 -#define APPLE80211_IOC_ACL_POLICY 169 -#define APPLE80211_IOC_ACL_ADD 170 -#define APPLE80211_IOC_ACL_REMOVE 171 -#define APPLE80211_IOC_ACL_FLUSH 172 -#define APPLE80211_IOC_ACL_LIST 173 -#define APPLE80211_IOC_CHAIN_ACK 174 -#define APPLE80211_IOC_DESENSE 175 -#define APPLE80211_IOC_OFFLOAD_SCANNING 176 -#define APPLE80211_IOC_OFFLOAD_RSN 177 -#define APPLE80211_IOC_OFFLOAD_COUNTRY_CODE 178 -#define APPLE80211_IOC_OFFLOAD_KEEPALIVE_L2 179 -#define APPLE80211_IOC_OFFLOAD_ARP_NDP 180 -#define APPLE80211_IOC_VHT_MCS_INDEX_SET 181 -#define APPLE80211_IOC_DWDS 182 -#define APPLE80211_IOC_INTERRUPT_STATS 183 -#define APPLE80211_IOC_INTERRUPT_STATS_RESET 184 -#define APPLE80211_IOC_TIMER_STATS 185 -#define APPLE80211_IOC_TIMER_STATS_RESET 186 -#define APPLE80211_IOC_OFFLOAD_STATS 187 -#define APPLE80211_IOC_OFFLOAD_STATS_RESET 188 -#define APPLE80211_IOC_OFFLOAD_BEACONS 189 -#define APPLE80211_IOC_ROAMING 190 -#define APPLE80211_IOC_OFFLOAD_ARP 191 -#define APPLE80211_IOC_OFFLOAD_NDP 192 -#define APPLE80211_IOC_OFFLOAD_SCAN 193 -#define APPLE80211_IOC_DESENSE_LEVEL 194 -#define APPLE80211_IOC_MCS_VHT 195 -#define APPLE80211_IOC_TX_NSS 196 -#define APPLE80211_IOC_GAS_REQ 197 -#define APPLE80211_IOC_GAS_START 198 -#define APPLE80211_IOC_GAS_SET_PEER 199 -#define APPLE80211_IOC_GAS_RESULTS 200 -#define APPLE80211_IOC_AWDL_BTLE_PEER_INDICATION 201 -#define APPLE80211_IOC_AWDL_BTLE_STATE_PARAMS 202 -#define APPLE80211_IOC_AWDL_PEER_DATABASE 203 -#define APPLE80211_IOC_AWDL_BTLE_ENABLE_SYNC_WITH_PARAMS 204 -#define APPLE80211_IOC_AWDL_SECONDARY_MASTER_CHANNEL 205 -#define APPLE80211_IOC_PHY_STATS 206 -#define APPLE80211_IOC_CHANNELS_INFO 207 -#define APPLE80211_IOC_AWDL_AF_TX_MODE 208 -#define APPLE80211_IOC_ERROR_STRING 209 -#define APPLE80211_IOC_ERROR_NO 210 -#define APPLE80211_IOC_AWDL_PIGGYBACK_SCAN_REQ 211 -#define APPLE80211_IOC_AWDL_PRIVATE_ELECTION_ID 212 -#define APPLE80211_IOC_AWDL_MIN_RATE 213 -#define APPLE80211_IOC_VHT_CAPABILITY 214 -#define APPLE80211_IOC_BGSCAN_CACHE_RESULTS 215 -#define APPLE80211_IOC_ROAM_PROFILE 216 -#define APPLE80211_IOC_AWDL_OPER_MODE 217 -#define APPLE80211_IOC_RESTORE_DEFAULTS 218 -#define APPLE80211_IOC_AWDL_ENCRYPTION_KEYS 219 -#define APPLE80211_IOC_AWDL_ENCRYPTION_TYPE 220 -#define APPLE80211_IOC_BTCOEX_PROFILES 221 -#define APPLE80211_IOC_BTCOEX_CONFIG 222 -#define APPLE80211_IOC_AWDL_STATISTICS 223 -#define APPLE80211_IOC_AWDL_ENABLE_ROAMING 224 -#define APPLE80211_IOC_AWDL_OOB_AUTO_REQUEST 225 -#define APPLE80211_IOC_AWDL_TXCAL_PERIOD 226 -#define APPLE80211_IOC_CHIP_COUNTER_STATS 227 -#define APPLE80211_IOC_DBG_GUARD_TIME_PARAMS 228 -#define APPLE80211_IOC_AWDL_AWDL_ADVERTISERS 229 -#define APPLE80211_IOC_LEAKY_AP_STATS_MODE 230 -#define APPLE80211_IOC_CAPTURE 231 -#define APPLE80211_IOC_LEAKY_AP_STATS 232 -#define APPLE80211_IOC_AWDL_BLOCK_SET_COMMANDS 233 -#define APPLE80211_IOC_LEAKY_AP_AWD_MODE 234 -#define APPLE80211_IOC_BTCOEX_OPTIONS 235 -#define APPLE80211_IOC_FORCE_SYNC_TO_PEER 236 -#define APPLE80211_IOC_COUNTRY_CHANNELS 237 -#define APPLE80211_IOC_PRIVATE_MAC 238 -#define APPLE80211_IOC_RESET_CHIP 239 -#define APPLE80211_IOC_CRASH 240 -#define APPLE80211_IOC_RANGING_ENABLE 241 -#define APPLE80211_IOC_RANGING_START 242 -#define APPLE80211_IOC_RANGING_AUTHENTICATE 243 -#define APPLE80211_IOC_AWDL_PREFERRED_CHANNELS 244 -#define APPLE80211_IOC_LEAKY_AP_SSID_STATS 245 -#define APPLE80211_IOC_AWDL_RSDB_CAPS 246 -#define APPLE80211_IOC_AWDL_DEV_STATS 247 -#define APPLE80211_IOC_LAST_ASSOC_HISTORY 248 -#define APPLE80211_IOC_AWDL_COMMON_CHANNEL 249 -#define APPLE80211_IOC_AWDL_PEERS_INFO 250 -#define APPLE80211_IOC_TKO_PARAMS 251 -#define APPLE80211_IOC_TKO_DUMP 252 -#define APPLE80211_IOC_AWDL_NEARBY_LOG_TRIGGER 253 -#define APPLE80211_IOC_HW_SUPPORTED_CHANNELS 254 -#define APPLE80211_IOC_BTCOEX_PROFILE 255 -#define APPLE80211_IOC_BTCOEX_PROFILE_ACTIVE 256 -#define APPLE80211_IOC_TRAP_INFO 257 -#define APPLE80211_IOC_THERMAL_INDEX 258 -#define APPLE80211_IOC_MAX_NSS_FOR_AP 259 -#define APPLE80211_IOC_BTCOEX_2G_CHAIN_DISABLE 260 -#define APPLE80211_IOC_POWER_BUDGET 261 -#define APPLE80211_IOC_AWDL_DFSP_CONFIG 262 -#define APPLE80211_IOC_AWDL_DFSP_UCSA_CONFIG 263 -#define APPLE80211_IOC_SCAN_BACKOFF_REPORT 264 -#define APPLE80211_IOC_OFFLOAD_TCPKA_ENABLE 265 -#define APPLE80211_IOC_RANGING_CAPS 266 -#define APPLE80211_IOC_PER_CORE_RSSI_REPORT 267 -#define APPLE80211_IOC_NSS 353 - -#define APPLE80211_IOC_CARD_SPECIFIC 0xffffffff // req_type - -// Kernel interface +#define APPLE80211_IOC_AWDL_GET_AWDL_MASTER_DATABASE 142 +#define APPLE80211_IOC_PEER_CACHE_CONTROL 143 +#define APPLE80211_IOC_AWDL_BATTERY_LEVEL 144 +#define APPLE80211_IOC_AWDL_BT_COEX_AW_PROTECTED_PERIOD_LENGTH 145 +#define APPLE80211_IOC_AWDL_BT_COEX_AGREEMENT 146 +#define APPLE80211_IOC_AWDL_BT_COEX_AGREEMENT_ENABLED 147 +#define APPLE80211_IOC_AWDL_STRATEGY 148 +#define APPLE80211_IOC_AWDL_OOB_REQUEST 149 +#define APPLE80211_IOC_AWDL_MAX_NO_MASTER_PERIODS 150 +#define APPLE80211_IOC_AWDL_SYNC_FRAME_TEMPLATE 151 +#define APPLE80211_IOC_LOG_FLAGS 152 +#define APPLE80211_IOC_PEER_STATS 153 +#define APPLE80211_IOC_HT_CAPABILITY 154 +#define APPLE80211_IOC_AWDL_ELECTION_PARAMS 155 +#define APPLE80211_IOC_LINK_CHANGED_EVENT_DATA 156 +#define APPLE80211_IOC_GET_DEBUG_INFO 157 +#define APPLE80211_IOC_AWDL_DEVICE_CAPABILITIES 158 +#define APPLE80211_IOC_AWDL_RSSI_MEASUREMENT_REQUEST 159 +#define APPLE80211_IOC_AWDL_AES_KEY 160 +#define APPLE80211_IOC_AWDL_SCAN_RESERVED_TIME 161 +#define APPLE80211_IOC_AWDL_CTL 162 +#define APPLE80211_IOC_AWDL_SOCIAL_TIME_SLOTS 163 +#define APPLE80211_IOC_AWDL_PEER_TRAFFIC_REGISTRATION 164 +#define APPLE80211_IOC_EXTENDED_STATS 165 +#define APPLE80211_IOC_BEACON_PERIOD 166 +#define APPLE80211_IOC_AWDL_FORCED_ROAM_CONFIG 167 +#define APPLE80211_IOC_AWDL_QUIET 168 +#define APPLE80211_IOC_ACL_POLICY 169 +#define APPLE80211_IOC_ACL_ADD 170 +#define APPLE80211_IOC_ACL_REMOVE 171 +#define APPLE80211_IOC_ACL_FLUSH 172 +#define APPLE80211_IOC_ACL_LIST 173 +#define APPLE80211_IOC_CHAIN_ACK 174 +#define APPLE80211_IOC_DESENSE 175 +#define APPLE80211_IOC_OFFLOAD_SCANNING 176 +#define APPLE80211_IOC_OFFLOAD_RSN 177 +#define APPLE80211_IOC_OFFLOAD_COUNTRY_CODE 178 +#define APPLE80211_IOC_OFFLOAD_KEEPALIVE_L2 179 +#define APPLE80211_IOC_OFFLOAD_ARP_NDP 180 +#define APPLE80211_IOC_VHT_MCS_INDEX_SET 181 +#define APPLE80211_IOC_DWDS 182 +#define APPLE80211_IOC_INTERRUPT_STATS 183 +#define APPLE80211_IOC_INTERRUPT_STATS_RESET 184 +#define APPLE80211_IOC_TIMER_STATS 185 +#define APPLE80211_IOC_TIMER_STATS_RESET 186 +#define APPLE80211_IOC_OFFLOAD_STATS 187 +#define APPLE80211_IOC_OFFLOAD_STATS_RESET 188 +#define APPLE80211_IOC_OFFLOAD_BEACONS 189 +#define APPLE80211_IOC_ROAMING 190 +#define APPLE80211_IOC_OFFLOAD_ARP 191 +#define APPLE80211_IOC_OFFLOAD_NDP 192 +#define APPLE80211_IOC_OFFLOAD_SCAN 193 +#define APPLE80211_IOC_DESENSE_LEVEL 194 +#define APPLE80211_IOC_MCS_VHT 195 +#define APPLE80211_IOC_TX_NSS 196 +#define APPLE80211_IOC_GAS_REQ 197 +#define APPLE80211_IOC_GAS_START 198 +#define APPLE80211_IOC_GAS_SET_PEER 199 +#define APPLE80211_IOC_GAS_RESULTS 200 +#define APPLE80211_IOC_AWDL_BTLE_PEER_INDICATION 201 +#define APPLE80211_IOC_AWDL_BTLE_STATE_PARAMS 202 +#define APPLE80211_IOC_AWDL_PEER_DATABASE 203 +#define APPLE80211_IOC_AWDL_BTLE_ENABLE_SYNC_WITH_PARAMS 204 +#define APPLE80211_IOC_AWDL_SECONDARY_MASTER_CHANNEL 205 +#define APPLE80211_IOC_PHY_STATS 206 +#define APPLE80211_IOC_CHANNELS_INFO 207 +#define APPLE80211_IOC_AWDL_AF_TX_MODE 208 +#define APPLE80211_IOC_ERROR_STRING 209 +#define APPLE80211_IOC_ERROR_NO 210 +#define APPLE80211_IOC_AWDL_PIGGYBACK_SCAN_REQ 211 +#define APPLE80211_IOC_AWDL_PRIVATE_ELECTION_ID 212 +#define APPLE80211_IOC_AWDL_MIN_RATE 213 +#define APPLE80211_IOC_VHT_CAPABILITY 214 +#define APPLE80211_IOC_BGSCAN_CACHE_RESULTS 215 +#define APPLE80211_IOC_ROAM_PROFILE 216 +#define APPLE80211_IOC_AWDL_OPER_MODE 217 +#define APPLE80211_IOC_RESTORE_DEFAULTS 218 +#define APPLE80211_IOC_AWDL_ENCRYPTION_KEYS 219 +#define APPLE80211_IOC_AWDL_ENCRYPTION_TYPE 220 +#define APPLE80211_IOC_BTCOEX_PROFILES 221 +#define APPLE80211_IOC_BTCOEX_CONFIG 222 +#define APPLE80211_IOC_AWDL_STATISTICS 223 +#define APPLE80211_IOC_AWDL_ENABLE_ROAMING 224 +#define APPLE80211_IOC_AWDL_OOB_AUTO_REQUEST 225 +#define APPLE80211_IOC_AWDL_TXCAL_PERIOD 226 +#define APPLE80211_IOC_CHIP_COUNTER_STATS 227 +#define APPLE80211_IOC_DBG_GUARD_TIME_PARAMS 228 +#define APPLE80211_IOC_AWDL_AWDL_ADVERTISERS 229 +#define APPLE80211_IOC_LEAKY_AP_STATS_MODE 230 +#define APPLE80211_IOC_CAPTURE 231 +#define APPLE80211_IOC_LEAKY_AP_STATS 232 +#define APPLE80211_IOC_AWDL_BLOCK_SET_COMMANDS 233 +#define APPLE80211_IOC_LEAKY_AP_AWD_MODE 234 +#define APPLE80211_IOC_BTCOEX_OPTIONS 235 +#define APPLE80211_IOC_FORCE_SYNC_TO_PEER 236 +#define APPLE80211_IOC_COUNTRY_CHANNELS 237 +#define APPLE80211_IOC_PRIVATE_MAC 238 +#define APPLE80211_IOC_RESET_CHIP 239 +#define APPLE80211_IOC_CRASH 240 +#define APPLE80211_IOC_RANGING_ENABLE 241 +#define APPLE80211_IOC_RANGING_START 242 +#define APPLE80211_IOC_RANGING_AUTHENTICATE 243 +#define APPLE80211_IOC_AWDL_PREFERRED_CHANNELS 244 +#define APPLE80211_IOC_LEAKY_AP_SSID_STATS 245 +#define APPLE80211_IOC_AWDL_RSDB_CAPS 246 +#define APPLE80211_IOC_AWDL_DEV_STATS 247 +#define APPLE80211_IOC_LAST_ASSOC_HISTORY 248 +#define APPLE80211_IOC_AWDL_COMMON_CHANNEL 249 +#define APPLE80211_IOC_AWDL_PEERS_INFO 250 +#define APPLE80211_IOC_TKO_PARAMS 251 +#define APPLE80211_IOC_TKO_DUMP 252 +#define APPLE80211_IOC_AWDL_NEARBY_LOG_TRIGGER 253 +#define APPLE80211_IOC_HW_SUPPORTED_CHANNELS 254 +#define APPLE80211_IOC_BTCOEX_PROFILE 255 +#define APPLE80211_IOC_BTCOEX_PROFILE_ACTIVE 256 +#define APPLE80211_IOC_TRAP_INFO 257 +#define APPLE80211_IOC_THERMAL_INDEX 258 +#define APPLE80211_IOC_MAX_NSS_FOR_AP 259 +#define APPLE80211_IOC_BTCOEX_2G_CHAIN_DISABLE 260 +#define APPLE80211_IOC_POWER_BUDGET 261 +#define APPLE80211_IOC_AWDL_DFSP_CONFIG 262 +#define APPLE80211_IOC_AWDL_DFSP_UCSA_CONFIG 263 +#define APPLE80211_IOC_SCAN_BACKOFF_REPORT 264 +#define APPLE80211_IOC_OFFLOAD_TCPKA_ENABLE 265 +#define APPLE80211_IOC_RANGING_CAPS 266 +#define APPLE80211_IOC_SUPPRESS_SCANS 267 +#define APPLE80211_IOC_NAN_ENABLED 268 +#define APPLE80211_IOC_NAN_INIT 269 +#define APPLE80211_IOC_NAN_CLUSTER_ID 270 +#define APPLE80211_IOC_NAN_DISC_BCN_PERIOD 271 +#define APPLE80211_IOC_NAN_SYNC_BCN_PERIOD 272 +#define APPLE80211_IOC_NAN_DW_AWAKE_PERIOD 273 +#define APPLE80211_IOC_NAN_BCN_TX_CONTROL 274 +#define APPLE80211_IOC_NAN_HOST_ELECTION 275 +#define APPLE80211_IOC_NAN_RSSI_CLOSE 276 +#define APPLE80211_IOC_NAN_RSSI_MIDDLE 277 +#define APPLE80211_IOC_NAN_RSSI_5G_CLOSE 278 +#define APPLE80211_IOC_NAN_RSSI_5G_MIDDLE 279 +#define APPLE80211_IOC_NAN_DEVICE_INFO 280 +#define APPLE80211_IOC_NAN_MASTER_PREFERENCE 281 +#define APPLE80211_IOC_NAN_RANDOM_FACTOR 282 +#define APPLE80211_IOC_NAN_RANDOM_FACTOR_ROTATION 283 +#define APPLE80211_IOC_NAN_HOP_COUNT_TO_ANCHOR_MASTER 284 +#define APPLE80211_IOC_NAN_MASTER_RANK 285 +#define APPLE80211_IOC_NAN_MAX_PEERS 286 +#define APPLE80211_IOC_NAN_MASTER_CHANNEL 287 +#define APPLE80211_IOC_NAN_SECONDARY_MASTER_CHANNEL 288 +#define APPLE80211_IOC_NAN_TX_RATE 289 +#define APPLE80211_IOC_NAN_WARMUP_TIME 290 +#define APPLE80211_IOC_NAN_CURRENT_ANCHOR_MASTER_RECORD 291 +#define APPLE80211_IOC_NAN_LAST_ANCHOR_MASTER_RECORD 292 +#define APPLE80211_IOC_COMPANION_SKYWALK_IF_CREATE 293 +#define APPLE80211_IOC_NAN_CW 294 +#define APPLE80211_IOC_NAN_CW_RS 295 +#define APPLE80211_IOC_NAN_SYNC_STATS 296 +#define APPLE80211_IOC_NAN_HOP_COUNT_LIMIT 297 +#define APPLE80211_IOC_NAN_AF_TX 298 +#define APPLE80211_IOC_NAN_CHANNEL_SEQUENCE 299 +#define APPLE80211_IOC_NAN_PUBLISH 300 +#define APPLE80211_IOC_NAN_CANCEL_PUBLISH 301 +#define APPLE80211_IOC_NAN_PUBLISHED_SERVICE_LIST 302 +#define APPLE80211_IOC_NAN_SUBSCRIBE 303 +#define APPLE80211_IOC_NAN_SUBSCRIBED_SERVICE_LIST 304 +#define APPLE80211_IOC_NAN_PUBLISHERS_LIST 305 +#define APPLE80211_IOC_NAN_CANCEL_SUBSCRIBE 306 +#define APPLE80211_IOC_NAN_FOLLOW_UP_TRANSMIT 307 +#define APPLE80211_IOC_NAN_DISCOVERY_RESULT 308 +#define APPLE80211_IOC_NAN_FOLLOW_UP_RECEIVE 309 +#define APPLE80211_IOC_NAN_SERVICE_DISCOVERY_STATS 310 +#define APPLE80211_IOC_NAN_SERVICE_DESCRIPTOR_EXTENSION 311 +#define APPLE80211_IOC_NAN_RANGING_REQUEST 312 +#define APPLE80211_IOC_NAN_RANGING_RESPONSE 313 +#define APPLE80211_IOC_NAN_RANGING_CANCEL 314 +#define APPLE80211_IOC_NAN_DP_REQ 315 +#define APPLE80211_IOC_NAN_DP_RESP 316 +#define APPLE80211_IOC_NAN_SCHEDULE_UPDATE 317 +#define APPLE80211_IOC_NAN_DP_END 318 +#define APPLE80211_IOC_NAN_DP_CONF 319 +#define APPLE80211_IOC_NAN_ADVERTISERS 320 +#define APPLE80211_IOC_NAN_COMMITTED_AVAILABILITY 321 +#define APPLE80211_IOC_NAN_POTENTIAL_AVAILABILITY 322 +#define APPLE80211_IOC_NAN_DEVICE_CAPABILITY 323 +#define APPLE80211_IOC_NAN_NDC_AVAILABILITY 324 +#define APPLE80211_IOC_NAN_IMMUTABLE_AVAILABILITY 325 +#define APPLE80211_IOC_NAN_RANGING_AVAILABILITY 326 +#define APPLE80211_IOC_NAN_PEER_DATABASE 327 +#define APPLE80211_IOC_NAN_CTL 328 +#define APPLE80211_IOC_NAN_DP_INFO 329 +#define APPLE80211_IOC_NAN_VENDOR_PAYLOAD 330 +#define APPLE80211_IOC_NAN_ELECTION_ROLE 331 +#define APPLE80211_IOC_NAN_QOS_PARAMS 332 +#define APPLE80211_IOC_NAN_FAST_DISCOVERY 333 +#define APPLE80211_IOC_RADIO_CHANSEQ_CONTROL 334 +#define APPLE80211_IOC_NAN_DATA_PATH_RESTORE 335 +#define APPLE80211_IOC_HOST_AP_MODE_HIDDEN 336 +#define APPLE80211_IOC_LQM_CONFIG 337 +#define APPLE80211_IOC_AWDL_CCA 338 +#define APPLE80211_IOC_TRAP_CRASHTRACER_MINI_DUMP 339 +#define APPLE80211_IOC_TRAFFIC_REGISTRATION 340 +#define APPLE80211_IOC_AWDL_AF_SECONDARY_PAYLOAD_CAPABILITIES 341 +#define APPLE80211_IOC_AWDL_OOB_SEC_PAYLOAD_REQUEST 342 +#define APPLE80211_IOC_AWDL_SIDECAR_STATISTICS 343 +#define APPLE80211_IOC_LLW_PARAMS 344 +#define APPLE80211_IOC_HE_CAPABILITY 345 +#define APPLE80211_IOC_BEACON_INFO 346 +#define APPLE80211_IOC_SOFTAP_PARAMS 347 +#define APPLE80211_IOC_CHIP_POWER_RANGE 348 +#define APPLE80211_IOC_SOFTAP_TRIGGER_CSA 349 +#define APPLE80211_IOC_SOFTAP_STATS 350 +#define APPLE80211_IOC_AWDL_SIDECAR_DIAGNOSTICS 351 +#define APPLE80211_IOC_SOFTAP_WIFI_NETWORK_INFO_IE 352 +#define APPLE80211_IOC_NSS 353 +#define APPLE80211_IOC_COMPANION_SKYWALK_LINK_STATE 354 +#define APPLE80211_IOC_NAN_LLW_PARAMS 355 +#define APPLE80211_IOC_HP2P_CAPS 356 +#define APPLE80211_IOC_RLLW_STATS 357 +#define APPLE80211_IOC_BTCOEX_DISABLE_ULOFDMA 358 +#define APPLE80211_IOC_HW_ADDR 359 +#define APPLE80211_IOC_SCAN_CONTROL 360 +#define APPLE80211_IOC_HE_MCS_INDEX_SET 361 +#define APPLE80211_IOC_CHIP_DIAGS 362 +#define APPLE80211_IOC_USB_HOST_NOTIFICATION 363 +#define APPLE80211_IOC_LOWLATENCY_STATISTICS 364 +#define APPLE80211_IOC_DISPLAY_STATE 365 +#define APPLE80211_IOC_NAN_OOB_AF_TX 366 +#define APPLE80211_IOC_NAN_DATA_PATH_KEEP_ALIVE_IDENTIFIER 367 +#define APPLE80211_IOC_SET_MAC_ADDRESS 368 +#define APPLE80211_IOC_ASSOCIATE_EXTENDED_RESULT 369 +#define APPLE80211_IOC_AWDL_AIRPLAY_STATISTICS 370 +#define APPLE80211_IOC_HP2P_CTRL 371 +#define APPLE80211_IOC_REQUEST_BSS_BLACKLIST 372 +#define APPLE80211_IOC_ASSOC_READY_STATUS 373 +#define APPLE80211_IOC_TXRX_CHAIN_INFO 374 +#define APPLE80211_IOC_MIMO_STATUS 375 +#define APPLE80211_IOC_CUR_PMK 376 +#define APPLE80211_IOC_DYNSAR_DETAIL 377 +#define APPLE80211_IOC_RANDOMISATION_STATUS 378 +#define APPLE80211_IOC_COUNTRY_CHANNELS_INFO 379 + +#define APPLE80211_IOC_CARD_SPECIFIC UINT32_MAX // Bump this value when structures change -#define APPLE80211_VERSION 1 +#define APPLE80211_VERSION 1 struct apple80211_ssid_data +{ + u_int32_t version; + u_int32_t ssid_len; + u_int8_t ssid_bytes[APPLE80211_MAX_SSID_LEN]; +}; + +struct apple80211_authtype_data { u_int32_t version; - u_int32_t ssid_len; - u_int8_t ssid_bytes[APPLE80211_MAX_SSID_LEN]; + u_int32_t authtype_lower; // apple80211_authtype_lower + u_int32_t authtype_upper; // apple80211_authtype_upper }; -struct apple80211_virt_if_create_data { - uint32_t version; - uint8_t mac[APPLE80211_ADDR_LEN]; - uint16_t unk1; - uint32_t role; - uint8_t bsd_name[15]; +struct apple80211_channel_data +{ + u_int32_t version; + struct apple80211_channel channel; +}; + +struct apple80211_powersave_data +{ + u_int32_t version; + u_int32_t powersave_level; +}; + +struct apple80211_protmode_data +{ + u_int32_t version; + u_int32_t protmode; + u_int32_t threshold; // bytes +}; + +struct apple80211_txpower_data +{ + u_int32_t version; + u_int32_t txpower_unit; + int32_t txpower; +}; + +struct apple80211_rate_data +{ + u_int32_t version; + u_int32_t num_radios; + u_int32_t rate[APPLE80211_MAX_RADIO]; +}; + +struct apple80211_bssid_data +{ + u_int32_t version; + struct ether_addr bssid; +}; + +struct apple80211_scan_data +{ + u_int32_t version; + u_int32_t bss_type; // apple80211_apmode 4 + struct ether_addr bssid; // target BSSID 8 + u_int32_t ssid_len; // length of the SSID 14 + u_int8_t ssid[APPLE80211_MAX_SSID_LEN]; // direct scan ssid or AirDrop scan ssid like "Air-xxxx" 18 + u_int32_t scan_type; // apple80211_scan_type 50 + u_int32_t phy_mode; // apple80211_phymode vector 54 + u_int16_t dwell_time; // time to spend on each channel (ms) 58 + u_int32_t rest_time; // time between scanning each channel (ms) 60 + u_int32_t num_channels; // 0 if not passing in channels 64 + struct apple80211_channel channels[APPLE80211_MAX_CHANNELS]; // channel list 68 + // 1608 +}; +//static_assert(sizeof(apple80211_scan_data) == 2184 ); + +struct apple80211_virt_if_create_data +{ + uint32_t version; + uint8_t mac[APPLE80211_ADDR_LEN]; + uint32_t role; + uint8_t bsd_name[IFNAMSIZ]; +}; + +struct apple80211_virt_if_delete_data +{ + uint32_t version; + uint8_t bsd_name[IFNAMSIZ]; +}; + +#define IEEE80211_HT_MCS_MASK_LEN 10 + +/*! @struct ieee80211_mcs_info + * @abstract MCS Information structure. + * @field rx_mask The RX mask. + * @field rx_highest Highest supported RX rate. If set, it represents the highest supported RX data rate in units of 1 Mbps. If this field is 0 this value should not be used to consider the highest RX data rate supported. + * @field tx_params: The TX parameters. + */ + +struct ieee80211_mcs_info +{ + uint8_t rx_mask[IEEE80211_HT_MCS_MASK_LEN]; + uint16_t rx_highest; + uint8_t tx_params; + uint8_t reserved[3]; } __attribute__((packed)); -struct apple80211_virt_if_delete_data { - uint32_t version; - uint8_t bsd_name[15]; +/*! @struct ieee80211_ht_cap + * @abstract A struct describing HT capabilities. + * @discussion This structure is the "HT capabilities element" as described in 802.11n D5.0 7.3.2.57. +*/ + +struct ieee80211_ht_capability_ie +{ + uint8_t element_id; + uint8_t length; + uint16_t cap_info; + uint8_t ampdu_params_info; + + /* 16 bytes MCS information */ + ieee80211_mcs_info mcs; + + uint16_t extended_ht_cap_info; + uint32_t tx_BF_cap_info; + uint8_t antenna_selection_info; } __attribute__((packed)); -struct apple80211_ht_capability { +struct apple80211_ht_capability +{ uint32_t version; - uint8_t unk1; - uint8_t unk2; - uint16_t unk3; - uint8_t unk4; - uint8_t unk5[16]; - uint16_t unk6; - uint unk7; - uint8_t unk8; + uint8_t hc_id; /* element ID */ + uint8_t hc_len; /* length in bytes */ + uint16_t hc_cap; /* HT caps (see below) */ + uint8_t hc_param; /* HT params (see below) */ + uint8_t hc_mcsset[16]; /* supported MCS set */ + uint16_t hc_extcap; /* extended HT capabilities */ + uint32_t hc_txbf; /* txbf capabilities */ + uint8_t hc_antenna; /* antenna capabilities */ } __attribute__((packed)); -struct apple80211_channel_data +/*! @struct ieee80211_vht_mcs_info + * @abstract VHT MCS information. + * @field rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams + * @field rx_highest: Indicates highest long GI VHT PPDU data rate STA can receive. Rate expressed in units of 1 Mbps. If this field is 0 this value should not be used to consider the highest RX data rate supported. The top 3 bits of this field indicate the Maximum NSTS,total (a beamformee capability.) + * @field tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams + * @field tx_highest: Indicates highest long GI VHT PPDU data rate STA can transmit. Rate expressed in units of 1 Mbps. If this field is 0 this value should not be used to consider the highest TX data rate supported. The top 2 bits of this field are reserved, the 3rd bit from the top indiciates VHT Extended NSS BW Capability. + */ +struct ieee80211_vht_mcs_info { - u_int32_t version; - struct apple80211_channel channel; + uint16_t rx_mcs_map; + uint16_t rx_highest; + uint16_t tx_mcs_map; + uint16_t tx_highest; }; -struct apple80211_bssid_data +struct apple80211_vht_capability { - u_int32_t version; - struct ether_addr bssid; + uint32_t version; + uint8_t element_id; + uint8_t length; + uint32_t cap_info; + uint8_t vhc_mcs_set[8]; }; struct apple80211_capability_data @@ -440,39 +665,12 @@ struct apple80211_assoc_status_data u_int32_t status; }; -struct apple80211_rate_data -{ - u_int32_t version; - u_int32_t num_radios; - u_int32_t rate[APPLE80211_MAX_RADIO]; -}; - struct apple80211_status_dev_data { u_int32_t version; u_int8_t dev_name[MAXPATHLEN]; }; -struct apple80211_powersave_data -{ - u_int32_t version; - u_int32_t powersave_level; -}; - -struct apple80211_protmode_data -{ - u_int32_t version; - u_int32_t protmode; - u_int32_t threshold; // bytes -}; - -struct apple80211_txpower_data -{ - u_int32_t version; - u_int32_t txpower_unit; - int32_t txpower; -}; - struct apple80211_phymode_data { u_int32_t version; @@ -503,13 +701,6 @@ struct apple80211_intmit_data u_int32_t int_mit; }; -struct apple80211_authtype_data -{ - u_int32_t version; - u_int32_t authtype_lower; // apple80211_authtype_lower - u_int32_t authtype_upper; // apple80211_authtype_upper -}; - struct apple80211_sup_channel_data { u_int32_t version; @@ -517,7 +708,6 @@ struct apple80211_sup_channel_data struct apple80211_channel supported_channels[APPLE80211_MAX_CHANNELS]; }; - struct apple80211_roam_threshold_data { u_int32_t threshold; @@ -530,37 +720,22 @@ struct apple80211_locale_data u_int32_t locale; }; -struct apple80211_scan_data -{ - u_int32_t version; - u_int32_t bss_type; // apple80211_apmode - struct ether_addr bssid; // target BSSID - u_int32_t ssid_len; // length of the SSID - u_int8_t ssid[APPLE80211_MAX_SSID_LEN]; // direct scan ssid or AirDrop scan ssid like "Air-xxxx" - u_int32_t scan_type; // apple80211_scan_type - u_int32_t phy_mode; // apple80211_phymode vector - u_int16_t dwell_time; // time to spend on each channel (ms) - u_int32_t rest_time; // time between scanning each channel (ms) - u_int32_t num_channels; // 0 if not passing in channels - struct apple80211_channel channels[APPLE80211_MAX_CHANNELS]; // channel list -}; - struct apple80211_scan_multiple_data { uint32_t version; - uint32_t ap_mode; // apple80211_apmode - uint32_t ssid_count; - apple80211_ssid_data ssids[16]; - uint32_t bssid_count; - ether_addr bssids[16]; - uint32_t scan_type; - uint32_t phy_mode; - uint32_t dwell_time; - uint32_t rest_time; - uint32_t num_channels; - struct apple80211_channel channels[128]; - uint16_t unk_2; + uint32_t ap_mode; // apple80211_apmode, 4 + uint32_t ssid_count; // 8 + apple80211_ssid_data ssids[10]; // 12 + uint32_t bssid_count; // 412 + ether_addr bssids[16]; // 416 + uint32_t scan_type; // 512 + uint32_t phy_mode; // 516 + uint32_t dwell_time; //520 + uint32_t rest_time; // 524 + uint32_t num_channels; //528 + struct apple80211_channel channels[APPLE80211_MAX_CHANNELS]; //532 }; +//static_assert(sizeof(apple80211_scan_multiple_data) == 2080 ); struct apple80211_link_changed_event_data { @@ -568,9 +743,10 @@ struct apple80211_link_changed_event_data uint32_t rssi; // 4 uint16_t snr; // 8 uint16_t nf; // 10 - char cca; // 12 + uint32_t cca; // 12 bool voluntary; // 16 uint32_t reason; // 20 + uint64_t reserved; // 24 }; struct apple80211_apmode_data @@ -589,13 +765,11 @@ struct apple80211_assoc_data u_int8_t ad_ssid[ APPLE80211_MAX_SSID_LEN ]; struct ether_addr ad_bssid; // prefer over ssid if not zeroed struct apple80211_key ad_key; - uint16_t pad; - u_int8_t ad_rsn_ie[ APPLE80211_MAX_RSN_IE_LEN ]; + uint16_t ad_rsn_ie_len; + u_int8_t ad_rsn_ie[ APPLE80211_MAX_RSN_IE_LEN + 1 ]; u_int32_t ad_flags; // apple80211_assoc_flags }; -static_assert(offsetof(apple80211_assoc_data, ad_rsn_ie) == 206, "offsetof(apple80211_assoc_data, ad_rsn_ie)"); - struct apple80211_deauth_data { u_int32_t version; @@ -790,6 +964,21 @@ struct apple80211_mcs_index_set_data u_int8_t mcs_set_map[APPLE80211_MAP_SIZE( APPLE80211_MAX_MCS_INDEX + 1 )]; }; +struct apple80211_vht_mcs_index_set_data +{ + u_int32_t version; + u_int16_t mcs_map; +} __attribute__((packed)); + +struct apple80211_mcs_vht_data +{ + u_int32_t version; + u_int32_t index; + u_int32_t nss; + u_int32_t bw; + u_int32_t guard_interval; +} __attribute__((packed)); + struct apple80211_wow_parameter_data { u_int32_t version; @@ -846,5 +1035,234 @@ struct apple80211_awdl_sync_frame_template void *payload; } __attribute__((packed)); -#endif // _APPLE80211_IOCTL_H_ +struct apple80211_awdl_bssid +{ + uint32_t version; + uint8_t bssid[APPLE80211_ADDR_LEN]; + uint8_t unk_mac[APPLE80211_ADDR_LEN]; +} __attribute__((packed)); + +struct apple80211_awdl_channel +{ + uint16_t chan_spec; + uint8_t chan_num; + uint8_t indoor_restric; + uint8_t radar_dfs; + uint8_t passive; + uint8_t support_40Mhz; + uint8_t support_80Mhz; + uint8_t z; + uint32_t per_chan; + uint32_t chan_bitmap; +} __attribute__((packed)); + +struct apple80211_channels_info +{ + uint32_t version; + uint32_t unk1; + uint16_t num_chan_specs; + uint16_t chan_spec[APPLE80211_MAX_CHANNELS]; + uint8_t chan_num[APPLE80211_MAX_CHANNELS]; + uint8_t indoor_restric[APPLE80211_MAX_CHANNELS]; + uint8_t radar_dfs[APPLE80211_MAX_CHANNELS]; + uint8_t passive[APPLE80211_MAX_CHANNELS]; + uint8_t support_40Mhz[APPLE80211_MAX_CHANNELS]; + uint8_t support_80Mhz[APPLE80211_MAX_CHANNELS]; + uint8_t z[APPLE80211_MAX_CHANNELS]; + uint8_t pad[386]; + uint32_t per_chan[APPLE80211_MAX_CHANNELS]; + uint32_t chan_bitmap[APPLE80211_MAX_CHANNELS]; +} __attribute__((packed)); + +//static_assert(__offsetof(struct apple80211_channels_info, chan_num) == 0x10A, "invalid offset"); //wf_chspec_ctlchan +//static_assert(__offsetof(struct apple80211_channels_info, indoor_restric) == 0x18A, "invalid offset"); //wlc_restricted_chanspec +//static_assert(__offsetof(struct apple80211_channels_info, radar_dfs) == 0x20A, "invalid offset"); //wlc_radar_chanspec +//static_assert(__offsetof(struct apple80211_channels_info, passive) == 0x28A, "invalid offset"); //wlc_quiet_chanspec +//static_assert(__offsetof(struct apple80211_channels_info, support_40Mhz) == 0x30A, "invalid offset"); +//static_assert(__offsetof(struct apple80211_channels_info, support_80Mhz) == 0x38A, "invalid offset"); +//static_assert(__offsetof(struct apple80211_channels_info, per_chan) == 0x60C, "invalid offset"); + +struct apple80211_peer_cache_maximum_size +{ + uint32_t version; + uint32_t max_peers; +} __attribute__((packed)); + +struct apple80211_awdl_election_id +{ + uint32_t version; + uint32_t election_id; +} __attribute__((packed)); + +struct apple80211_awdl_master_channel +{ + uint32_t version; + uint32_t master_channel; +} __attribute__((packed)); + +struct apple80211_awdl_secondary_master_channel +{ + uint32_t version; + uint32_t secondary_master_channel; +} __attribute__((packed)); + +struct apple80211_awdl_min_rate +{ + uint32_t version; + uint8_t min_rate; +} __attribute__((packed)); + +struct apple80211_awdl_election_rssi_thresholds +{ + uint32_t version; + uint32_t unk1; + uint32_t unk2; + uint32_t unk3; +} __attribute__((packed)); + +struct apple80211_awdl_sync_channel_sequence +{ + uint32_t version; + uint8_t pad1; + uint8_t length; // 5 + uint8_t encoding; // 6 + uint8_t step_count; // 7 + uint8_t duplicate_count; // 8 + uint8_t fill_channel; // 9 + uint8_t pad2[6]; + apple80211_channel channels[APPLE80211_MAX_AWDL_CHANNELS]; +} __attribute__((packed)); + +static_assert(sizeof(apple80211_awdl_sync_channel_sequence) == 400); + +struct apple80211_awdl_presence_mode +{ + uint32_t version; + uint32_t mode; +} __attribute__((packed)); + +struct apple80211_awdl_extension_state_machine_parameter +{ + uint32_t version; + uint32_t unk1; + uint32_t unk2; + uint32_t unk3; + uint32_t unk4; +} __attribute__((packed)); + +struct apple80211_awdl_sync_state +{ + uint32_t version; + uint32_t state; +} __attribute__((packed)); + +struct apple80211_awdl_sync_params +{ + uint32_t version; + uint32_t availability_window_length; + uint32_t availability_window_period; + uint32_t extension_length; + uint32_t synchronization_frame_period; +} __attribute__((packed)); + +struct apple80211_awdl_cap +{ + uint32_t version; + uint8_t cap; +} __attribute__((packed)); + +struct apple80211_awdl_af_tx_mode +{ + uint32_t version; + uint64_t mode; +} __attribute__((packed)); + +#define AWDL_OOB_AF_PARAMS_SIZE 38 + +struct apple80211_awdl_oob_request +{ + uint32_t version; + uint32_t unk1; // 4 + uint32_t unk2; // 8 + uint32_t unk3; // 12 + uint32_t unk4; // 16 + uint16_t pad1; + uint32_t unk5; // 22 + uint16_t unk6; // 26 + uint32_t pad2; + uint32_t unk7; // 32 + uint32_t pad3; + uint16_t data_len; // 40 + uint32_t pad4; + uint16_t unk9; // 44 + uint8_t data[1782]; // 48 +} __attribute__((packed)); + +struct apple80211_roam_profile +{ + int8_t flags; + int8_t trigger; + int8_t rssi_lower; + int8_t rssi_boost_delta; + int8_t rssi_boost_thresh; + int8_t delta; + uint16_t backoff_multiplier; + uint16_t full_scan_period; + uint16_t init_scan_period; + uint16_t nfscan; + uint16_t max_scan_period; +} __attribute__((packed)); + +struct apple80211_roam_profile_band_data +{ + uint32_t version; + uint32_t flags; // 4 (0x2, 0x4) + uint32_t profile_cnt; // 8 + struct apple80211_roam_profile profiles[4]; +} __attribute__((packed)); + +static_assert(sizeof(struct apple80211_roam_profile_band_data) == 76, "roam data size error"); + +struct apple80211_ie_data +{ + uint32_t version; + uint32_t frame_type_flags; // 4 + uint32_t add; // 8 + uint32_t signature_len; // 12 + uint32_t ie_len; // 16 + uint32_t pad1; // 20 + uint8_t ie[2048]; +} __attribute__((packed)); + +struct apple80211_p2p_listen_data +{ + uint32_t version; + uint32_t pad1; + uint32_t channel; // 8 + uint32_t flags; // 12 + uint32_t duration; // 16 +} __attribute__((packed)); + +struct apple80211_p2p_go_conf_data +{ + uint32_t version; + uint32_t auth_upper; // 4 should equal to 1 + uint32_t auth_lower; // 6 should non zero + void *dynbcn; // 8 + uint32_t channel; // 12 + uint32_t bcn_len; // 16 + uint32_t ssid_len; // 20 + uint8_t ssid[32]; // 24 + uint32_t suppress_beacon;// 56 security:1,4 +} __attribute__((packed)); + +struct apple80211_sta_roam_data +{ + uint32_t version; + uint8_t rcc_channels; + uint8_t unk1; + uint8_t taget_channel; + uint8_t target_bssid[APPLE80211_ADDR_LEN]; +} __attribute__((packed)); +#endif diff --git a/Headers/IOKit/80211/apple80211_var.h b/Headers/IOKit/80211/apple80211_var.h index 186760b2..a61b3463 100644 --- a/Headers/IOKit/80211/apple80211_var.h +++ b/Headers/IOKit/80211/apple80211_var.h @@ -28,18 +28,14 @@ #include #include -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif - // Sizes and limits #define APPLE80211_ADDR_LEN 6 #define APPLE80211_MAX_RATES 15 #define APPLE80211_MAX_SSID_LEN 32 #define APPLE80211_MAX_ANTENNAE 4 #define APPLE80211_MAX_RADIO 4 -#define APPLE80211_MAX_CHANNELS 64 +#define APPLE80211_MAX_AWDL_CHANNELS 32 +#define APPLE80211_MAX_CHANNELS 128 #define APPLE80211_MAX_STATIONS 128 #define APPLE80211_MAX_VERSION_LEN 256 #define APPLE80211_MAX_ROM_SIZE 32768 // 32 KB @@ -53,7 +49,8 @@ #define APPLE80211_MAP_SIZE( _bits ) (roundup( _bits, NBBY )/NBBY) -enum apple80211_phymode { +enum apple80211_phymode +{ APPLE80211_MODE_UNKNOWN = 0, APPLE80211_MODE_AUTO = 1, // autoselect APPLE80211_MODE_11A = 2 << (1 - 1), // 5GHz, OFDM @@ -66,7 +63,8 @@ enum apple80211_phymode { APPLE80211_MODE_11AX = 2 << (8 - 1), }; -enum apple80211_physubmode { +enum apple80211_physubmode +{ APPLE80211_SUBMODE_UNKNOWN = 0x0, APPLE80211_SUBMODE_11N_AUTO = 0x1, // 11n mode determined by AP capabilities APPLE80211_SUBMODE_11N_LEGACY = 0x2, // legacy @@ -77,7 +75,8 @@ enum apple80211_physubmode { }; // flags -enum apple80211_opmode { +enum apple80211_opmode +{ APPLE80211_M_NONE = 0x0, APPLE80211_M_STA = 0x1, // infrastructure station APPLE80211_M_IBSS = 0x2, // IBSS (adhoc) station @@ -86,14 +85,16 @@ enum apple80211_opmode { APPLE80211_M_MONITOR = 0x10 // Monitor mode }; -enum apple80211_apmode { +enum apple80211_apmode +{ APPLE80211_AP_MODE_UNKNOWN = 0, APPLE80211_AP_MODE_IBSS = 1, // IBSS (adhoc) station APPLE80211_AP_MODE_INFRA = 2, // Access Point APPLE80211_AP_MODE_ANY = 3, // Any supported mode }; -enum apple80211_state { +enum apple80211_state +{ APPLE80211_S_INIT = 0, // default state APPLE80211_S_SCAN = 1, // scanning APPLE80211_S_AUTH = 2, // try to authenticate @@ -101,7 +102,8 @@ enum apple80211_state { APPLE80211_S_RUN = 4, // associated }; -enum apple80211_protmode { +enum apple80211_protmode +{ APPLE80211_PROTMODE_OFF = 0, // no protection APPLE80211_PROTMODE_AUTO = 1, // auto APPLE80211_PROTMODE_CTS = 2, // CTS to self @@ -109,7 +111,8 @@ enum apple80211_protmode { APPLE80211_PROTMODE_DUAL_CTS = 4, // dual CTS }; -enum apple80211_cipher_type { +enum apple80211_cipher_type +{ APPLE80211_CIPHER_NONE = 0, // open network APPLE80211_CIPHER_WEP_40 = 1, // 40 bit WEP APPLE80211_CIPHER_WEP_104 = 2, // 104 bit WEP @@ -118,6 +121,11 @@ enum apple80211_cipher_type { APPLE80211_CIPHER_AES_CCM = 5, // AES (CCM) APPLE80211_CIPHER_PMK = 6, // PMK APPLE80211_CIPHER_PMKSA = 7, // PMK obtained from pre-authentication + APPLE80211_CIPHER_SMS4 = 8, + APPLE80211_CIPHER_MSK = 9, + APPLE80211_CIPHER_PWD = 10, + APPLE80211_CIPHER_AES_GCM = 11, + APPLE80211_CIPHER_AES_GCM256 = 12, }; enum apple80211_cipher_key_type @@ -144,12 +152,18 @@ enum apple80211_authtype_upper APPLE80211_AUTHTYPE_WPA_PSK = 1 << 1, // WPA PSK APPLE80211_AUTHTYPE_WPA2 = 1 << 2, // WPA2 APPLE80211_AUTHTYPE_WPA2_PSK = 1 << 3, // WPA2 PSK - APPLE80211_AUTHTYPE_LEAP = 1 << 4, // LEAP - APPLE80211_AUTHTYPE_8021X = 1 << 5, // 802.1x - APPLE80211_AUTHTYPE_WPS = 1 << 6, // WiFi Protected Setup - APPLE80211_AUTHTYPE_SHA256_PSK = 1 << 7, - APPLE80211_AUTHTYPE_SHA256_8021X = 1 << 8, - APPLE80211_AUTHTYPE_WPA3_SAE = 1 << 9 + APPLE80211_AUTHTYPE_FT_PSK = 1 << 4, // + APPLE80211_AUTHTYPE_LEAP = 1 << 5, // LEAP + APPLE80211_AUTHTYPE_WEP_8021X = 1 << 6, // WEP 802.1x + APPLE80211_AUTHTYPE_FT_8021X = 1 << 7, // 802.1x + APPLE80211_AUTHTYPE_WPS = 1 << 8, // WiFi Protected Setup + APPLE80211_AUTHTYPE_WAPI = 1 << 9, + APPLE80211_AUTHTYPE_SHA256_PSK = 1 << 10, + APPLE80211_AUTHTYPE_SHA256_8021X = 1 << 11, + APPLE80211_AUTHTYPE_WPA3_SAE = 1 << 12, + APPLE80211_AUTHTYPE_WPA3_FT_SAE = 1 << 13, + APPLE80211_AUTHTYPE_WPA3_ENTERPRISE = 1 << 14, + APPLE80211_AUTHTYPE_WPA3_FT_ENTERPRISE = 1 << 15, }; // Unify association status code and deauth reason codes into a single enum describing @@ -246,7 +260,8 @@ enum apple80211_channel_flag APPLE80211_C_FLAG_EXT_ABV = 0x200, // If 40 Mhz, extension channel above. // If this flag is not set, then the // extension channel is below. - APPLE80211_C_FLAG_80MHZ = 0x400 // name made up - set if channelWidth == 80 && 5ghz && AC + APPLE80211_C_FLAG_80MHZ = 0x400, // set if channelWidth == 80 && 5ghz && AC + APPLE80211_C_FLAG_160MHZ = 0x800, // Apple devices do not use it }; enum apple80211_rate_flag @@ -287,6 +302,26 @@ enum apple80211_powersave_mode APPLE80211_POWERSAVE_MODE_MAX_POWERSAVE = 8, }; +enum apple80211_postMessage_tlv_types +{ + APPLE80211_POSTMESSAGE_TLV_BSS_INFO, + APPLE80211_POSTMESSAGE_TLV_SSID_CHANGED, + APPLE80211_POSTMESSAGE_TLV_DAUTH, + APPLE80211_POSTMESSAGE_TLV_DISSASOC, + APPLE80211_POSTMESSAGE_TLV_LINK_CHANGED, + APPLE80211_POSTMESSAGE_TLV_DECRPYTION_ERR, + APPLE80211_POSTMESSAGE_TLV_REASSOC, + APPLE80211_POSTMESSAGE_TLV_AUTH, + APPLE80211_POSTMESSAGE_TLV_ASSOC, + APPLE80211_POSTMESSAGE_TLV_ASSOC_DONE, + APPLE80211_POSTMESSAGE_TLV_ROME, + APPLE80211_POSTMESSAGE_TLV_PRUNE, + APPLE80211_POSTMESSAGE_TLV_SUPP, + APPLE80211_POSTMESSAGE_TLV_LINK_STATUS, + APPLE80211_POSTMESSAGE_TLV_LINK_STATUS_EVENT, + APPLE80211_POSTMESSAGE_TLV_UNKNOWN +}; + enum apple80211_debug_flag { APPLE80211_DEBUG_FLAG_NONE = 0x0, // No logging @@ -449,7 +484,6 @@ struct apple80211_rate #define APPLE80211_MBUF_SET_WME_AC( m, ac ) mbuf_pkthdr_setrcvif( m, (ifnet_t)ac ) #define APPLE80211_MBUF_WME_AC( m ) (int)mbuf_pkthdr_rcvif( m ) -// FIXME: seems that rates array starts at 0x24, immediately after struct apple80211_scan_result { u_int32_t version; // 0x00 - 0x03 @@ -470,15 +504,19 @@ struct apple80211_scan_result u_int32_t asr_rates[ APPLE80211_MAX_RATES ]; // 0x24 - 0x5f u_int8_t asr_ssid_len; // 0x60 u_int8_t asr_ssid[ APPLE80211_MAX_SSID_LEN ]; // 0x61 - 0x80 - __attribute__((packed)) __attribute__((aligned(1))) int16_t unk; + int16_t unk; uint8_t unk2; u_int32_t asr_age; // (ms) non-zero for cached scan result // 0x84 u_int16_t unk3; int16_t asr_ie_len; +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_12_0 uint32_t asr_unk3; void* asr_ie_data; -}; +#else + uint8_t asr_ie_data[1024]; +#endif +} __attribute__((packed)); struct apple80211_network_data { @@ -562,7 +600,17 @@ enum apple80211_virtual_interface_type APPLE80211_VIF_MAX }; -enum apple80211_assoc_flags { +enum apple80211_ie_type +{ + APPLE80211_IE_FLAG_PROBE_REQ = (1 << 0), + APPLE80211_IE_FLAG_PROBE_RESP = (1 << 1), + APPLE80211_IE_FLAG_ASSOC_REQ = (1 << 2), + APPLE80211_IE_FLAG_ASSOC_RESP = (1 << 3), + APPLE80211_IE_FLAG_BEACON = (1 << 4), +}; + +enum apple80211_assoc_flags +{ APPLE80211_ASSOC_F_CLOSED = 1, // flag: scan was directed, needed to remember closed networks }; @@ -576,6 +624,51 @@ struct apple80211_status_msg_hdr // data follows }; +struct apple80211_txstats +{ + UInt32 __reserved; + UInt32 fTxPacketsBe; + UInt32 fTxPacketsBk; + UInt32 fTxPacketsVi; + UInt32 fTxPacketsVo; + UInt32 fTxBytesVo; + UInt32 fTxBytesVi; + UInt32 fTxBytesBe; + UInt32 fTxBytesBk; +}; + +struct apple80211_cca_report +{ + UInt64 fCCA; + UInt64 fCCI; + UInt64 fCCO; + UInt64 fCCi; + UInt64 __reserved; + bool fCCASet; + bool fCCISet; + bool fCCOSet; + bool fCCiSet; +}; + +struct apple80211_ManagementInformationBasedot11_counters +{ + UInt64 f11TxMPDUUnicast; //0 + UInt64 f11TxMSDUMulticast; //8 + UInt64 f11TxMSDUFailedExceeded; //16 + UInt64 f11TxMSDUOneAttempt; //24 + UInt64 f11TxMSDUMoreThanOneAttempt; //32 + UInt64 __reserved1; //40 + UInt64 f11CTSRxdRTSResponse; //48 + UInt64 f11CTSNotRxdRTSresponse;//56 + UInt64 __reserved2; //64 + UInt64 __reserved3; //72 + UInt64 f11RxMSDUMulticast; //80 + UInt64 __reserved4; //88 + UInt64 f11TxMSDUSuccess; //96 +}; + +struct apple80211_frame_counters; + #define APPLE80211_M_MAX_LEN 2048 #define APPLE80211_M_POWER_CHANGED 1 @@ -610,18 +703,30 @@ struct apple80211_status_msg_hdr #define APPLE80211_M_ROAMED 30 #define APPLE80211_M_ACT_FRM_TX_COMPLETE 31 #define APPLE80211_M_DEAUTH_RECEIVED 32 -#define APPLE80211_M_DRIVER_AVAILABLE 0x37 -#define APPLE80211_M_LINK_ADDRESS_CHANGED 0x3B -#define APPLE80211_M_ROAM_START 0x46 -#define APPLE80211_M_ROAM_END 0x47 -#define APPLE80211_M_INTERFACE_STATE 0x3A - -#define APPLE80211_M_MAX 0x3A +#define APPLE80211_M_RSSI_CHANGED 39 +#define APPLE80211_M_PEER_STATE 40 +#define APPLE80211_M_AWDL_AVAILABILITY_WINDOW_START 42 +#define APPLE80211_M_AWDL_AVAILABILITY_WINDOW_EXTENSIONS_END 43 +#define APPLE80211_M_AWDL_SYNC_STATE_CHANGED 46 +#define APPLE80211_M_RESET_INTERFACE 49 +#define APPLE80211_M_PEER_CREDIT_GRANT 50 +#define APPLE80211_M_DRIVER_AVAILABLE 55 +#define APPLE80211_M_INTERFACE_STATE 58 +#define APPLE80211_M_LINK_ADDRESS_CHANGED 59 +#define APPLE80211_M_BGSCAN_CACHED_NETWORK_AVAILABLE 63 +#define APPLE80211_M_ROAM_START 70 +#define APPLE80211_M_ROAM_END 71 +#define APPLE80211_M_AWDL_DFS_CSA 88 +#define APPLE80211_M_TCPKA_TIMEOUT 91 +#define APPLE80211_M_AWDL_DFS_CSA_COMPLETE 94 +#define APPLE80211_M_ACTION_FRAME 143 + +#define APPLE80211_M_MAX 170 #define APPLE80211_M_BUFF_SIZE APPLE80211_MAP_SIZE( APPLE80211_M_MAX ) // Registry Information #define APPLE80211_REGKEY_HARDWARE_VERSION "IO80211HardwareVersion" -// #define APPLE80211_REG_FIRMWARE_VERSION "IO80211FirmwareVersion" +#define APPLE80211_REG_FIRMWARE_VERSION "IO80211FirmwareVersion" #define APPLE80211_REGKEY_DRIVER_VERSION "IO80211DriverVersion" #define APPLE80211_REGKEY_LOCALE "IO80211Locale" #define APPLE80211_REGKEY_SSID "IO80211SSID" @@ -641,5 +746,4 @@ struct apple80211_status_msg_hdr #define APPLE80211_M_RSN_MSG_MAX 2 -#endif // _APPLE80211_VAR_H_ - +#endif diff --git a/Headers/IOKit/80211/apple80211_wps.h b/Headers/IOKit/80211/apple80211_wps.h index 0204b144..8dc1be29 100644 --- a/Headers/IOKit/80211/apple80211_wps.h +++ b/Headers/IOKit/80211/apple80211_wps.h @@ -1,10 +1,24 @@ -// -// wps_eap.h -// IO80211Family -// -// Created by Pete on 6/20/06. -// Copyright 2006 Apple Computer, Inc. All rights reserved. -// +/* + * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ #ifndef _APPLE80211_WPS_H_ #define _APPLE80211_WPS_H_ @@ -13,11 +27,6 @@ #include #include -// This is necessary, because even the latest Xcode does not support properly targeting 11.0. -#ifndef __IO80211_TARGET -#error "Please define __IO80211_TARGET to the requested version" -#endif - #define WPS_HANDSHAKE_TIMEOUT 120 /* seconds */ #define WPS_RETRANSMIT_TIMEOUT 5 #define WPS_MAX_RETRIES 3 @@ -53,13 +62,13 @@ struct wps_eap_hdr { u_int8_t code; u_int8_t identifier; - u_int16_t length; + u_int16_t length; u_int8_t type; u_int8_t vendor_id[3]; - u_int32_t vendor_type; + u_int32_t vendor_type; u_int8_t op_code; u_int8_t flags; - u_int16_t msg_length; + u_int16_t msg_length; // u_int8_t msg[1]; /* data follows */ } PACKED; @@ -510,7 +519,7 @@ enum WPSSupplicantState WPS_S_FAIL_TX, WPS_S_FAIL_RX, WPS_S_MSG_TIMEOUT, - WPS_S_SESSION_TIMEOUT, + WPS_S_SESSION_TIMEOUT }; typedef enum WPSSupplicantState WPSSupplicantState; @@ -518,15 +527,15 @@ typedef enum WPSSupplicantState WPSSupplicantState; #define WPSE_NOERR 0 // no error #define WPSE_ERR -1 // general error code -#define WPSE_PROTO_ERR -2 // Problem with EAPOL handshake -#define WPSE_IE_NOT_PRESENT -3 // No WPS IE present in IE list for ssid -#define WPSE_IE_MALFORMED -4 // WPS IS missing required (for Apple) fields -#define WPSE_SCAN_ERR -5 // Scan failed -#define WPSE_NO_PIN_AT_REG -6 // No PIN configured at registrar +#define WPSE_PROTO_ERR -2 // Problem with EAPOL handshake +#define WPSE_IE_NOT_PRESENT -3 // No WPS IE present in IE list for ssid +#define WPSE_IE_MALFORMED -4 // WPS IS missing required (for Apple) fields +#define WPSE_SCAN_ERR -5 // Scan failed +#define WPSE_NO_PIN_AT_REG -6 // No PIN configured at registrar #define WPSE_NO_PIN_AT_CLIENT -7 // No PIN configured at client -#define WPSE_SSID_NOT_FOUND -8 // Scan did not find SSID -#define WPSE_UNSUPPORTED_PW_ID -9 // Registrar reports that it is using an unsupported PW ID -#define WPSE_ASSOC_FAILED -10 // Association attempt failed +#define WPSE_SSID_NOT_FOUND -8 // Scan did not find SSID +#define WPSE_UNSUPPORTED_PW_ID -9 // Registrar reports that it is using an unsupported PW ID +#define WPSE_ASSOC_FAILED -10 // Association attempt failed #define WPSE_API_REQ -11 // An apple80211 ioctl request failed #define WPSE_NOMEM -12 // memory error #define WPSE_WPA_RSN_NOT_SUP -13 // WPA/RSN not supported diff --git a/Headers/IOKit/80211/apple_private_spi.h b/Headers/IOKit/80211/apple_private_spi.h deleted file mode 100644 index a644de63..00000000 --- a/Headers/IOKit/80211/apple_private_spi.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -* Copyright (c) 1998-2016 Apple Inc. All rights reserved. -* -* @APPLE_OSREFERENCE_LICENSE_HEADER_START@ -* -* This file contains Original Code and/or Modifications of Original Code -* as defined in and that are subject to the Apple Public Source License -* Version 2.0 (the 'License'). You may not use this file except in -* compliance with the License. The rights granted to you under the License -* may not be used to create, or enable the creation or redistribution of, -* unlawful or unlicensed copies of an Apple operating system, or to -* circumvent, violate, or enable the circumvention or violation of, any -* terms of an Apple operating system software license agreement. -* -* Please obtain a copy of the License at -* http://www.opensource.apple.com/apsl/ and read it before using this file. -* -* The Original Code and all software distributed under the License are -* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER -* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, -* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. -* Please see the License for the specific language governing rights and -* limitations under the License. -* -* @APPLE_OSREFERENCE_LICENSE_HEADER_END@ -*/ - -#ifndef apple_private_spi_h -#define apple_private_spi_h - -#ifndef __PRIVATE_SPI__ - -/*! @enum IOMbufServiceClass - @discussion Service class of a mbuf packet. - @constant kIOMbufServiceClassBKSYS Background System-Initiated. - @constant kIOMbufServiceClassBK Background. - @constant kIOMbufServiceClassBE Best Effort. - @constant kIOMbufServiceClassRD Responsive Data. - @constant kIOMbufServiceClassOAM Operations, Administration, and Management. - @constant kIOMbufServiceClassAV Multimedia Audio/Video Streaming. - @constant kIOMbufServiceClassRV Responsive Multimedia Audio/Video. - @constant kIOMbufServiceClassVI Interactive Video. - @constant kIOMbufServiceClassVO Interactive Voice. - @constant kIOMbufServiceClassCTL Network Control. -*/ -enum IOMbufServiceClass { - kIOMbufServiceClassBKSYS = 100, - kIOMbufServiceClassBK = 200, - kIOMbufServiceClassBE = 0, - kIOMbufServiceClassRD = 300, - kIOMbufServiceClassOAM = 400, - kIOMbufServiceClassAV = 500, - kIOMbufServiceClassRV = 600, - kIOMbufServiceClassVI = 700, - kIOMbufServiceClassVO = 800, - kIOMbufServiceClassCTL = 900 -}; - -#endif - -struct packet_info_tag { - -}; - -struct apple80211_debug_command { - -}; - -struct ifnet_init_eparams { - -}; - -#endif /* apple_private_spi_h */ diff --git a/Headers/IOKit/80211/debug.h b/Headers/IOKit/80211/debug.h deleted file mode 100644 index 80937044..00000000 --- a/Headers/IOKit/80211/debug.h +++ /dev/null @@ -1,283 +0,0 @@ -// -// debug.h -// Black80211_HighSierra -// -// Created by Roman Peshkov on 05/07/2018. -// Copyright © 2018 Roman Peshkov. All rights reserved. -// - -#ifndef debug_h -#define debug_h - -static const char* IOCTL_NAMES[] = { - "UNKNOWN", - "SSID", - "AUTH_TYPE", - "CIPHER_KEY", - "CHANNEL", - "POWERSAVE", - "PROTMODE", - "TXPOWER", - "RATE", - "BSSID", - "SCAN_REQ", - "SCAN_RESULT", - "CARD_CAPABILITIES", - "STATE", - "PHY_MODE", - "OP_MODE", - "RSSI", - "NOISE", - "INT_MIT", - "POWER", - "ASSOCIATE", - "ASSOCIATE_RESULT", - "DISASSOCIATE", - "STATUS_DEV_NAME", - "IBSS_MODE", - "HOST_AP_MODE", - "AP_MODE", - "SUPPORTED_CHANNELS", - "LOCALE", - "DEAUTH", - "COUNTERMEASURES", - "FRAG_THRESHOLD", - "RATE_SET", - "SHORT_SLOT", - "MULTICAST_RATE", - "SHORT_RETRY_LIMIT", - "LONG_RETRY_LIMIT", - "TX_ANTENNA", - "RX_ANTENNA", - "ANTENNA_DIVERSITY", - "ROM", - "DTIM_INT", - "STATION_LIST", - "DRIVER_VERSION", - "HARDWARE_VERSION", - "RAND", - "RSN_IE", - "BACKGROUND_SCAN", - "AP_IE_LIST", - "STATS", - "ASSOCIATION_STATUS", - "COUNTRY_CODE", - "DEBUG_FLAGS", - "LAST_RX_PKT_DATA", - "RADIO_INFO", - "GUARD_INTERVAL", - "MIMO_POWERSAVE", - "MCS", - "RIFS", - "LDPC", - "MSDU", - "MPDU", - "BLOCK_ACK", - "PLS", - "PSMP", - "PHY_SUB_MODE", - "MCS_INDEX_SET", - "CACHE_THRESH_BCAST", - "CACHE_THRESH_DIRECT", - "WOW_PARAMETERS", - "WOW_ENABLED", - "40MHZ_INTOLERANT", - "PID_LOCK", - "STA_IE_LIST", - "STA_AUTHORIZE", - "STA_DISASSOCIATE", - "STA_DEAUTH", - "RSN_CONF", - "KEY_RSC", - "STA_STATS", - "ROAM_THRESH", - "VENDOR_DBG_FLAGS", - "CACHE_AGE_THRESH", - "PMK_CACHE", - "LINK_QUAL_EVENT_PARAMS", - "IE", - "SCAN_REQ_MULTIPLE", - "BTCOEX_MODE", - "WOW_TEST", - "CLEAR_PMK_CACHE", - "SCANCACHE_CLEAR", - "P2P_ENABLE", - "P2P_LISTEN", - "P2P_SCAN", - "VIRTUAL_IF_CREATE", - "VIRTUAL_IF_DELETE", - "VIRTUAL_IF_ROLE", - "VIRTUAL_IF_PARENT", - "P2P_GO_CONF", - "P2P_NOA_LIST", - "P2P_OPP_PS", - "P2P_CT_WINDOW", - "BT_COEX_FLAGS", - "CURRENT_NETWORK", - "BT_POWER", - "AVAILABILITY", - "RSSI_BOUNDS", - "ROAM", - "TX_CHAIN_POWER", - "CDD_MODE", - "LAST_BCAST_SCAN_TIME", - "THERMAL_THROTTLING", - "FACTORY_MODE", - "REASSOCIATE", - "???MISSING???", - "POWER_DEBUG_INFO", - "AWDL_SYNC_PARAMS", - "AWDL_SYNC_ENABLED", - "AWDL_EXTENSION_STATE_MACHINE_PARAMETERS", - "AWDL_SERVICE_PARAMS", - "AWDL_PEER_SERVICE_REQUEST", - "AWDL_ELECTION_ALGORITHM_ENABLED", - "AWDL_ELECTION_ID", - "AWDL_MAX_TREE_DEPTH", - "AWDL_GUARD_TIME", - "AWDL_BSSID", - "AWDL_ELECTION_METRIC", - "AWDL_AVAILABILITY_WINDOW_AP_ALIGNMENT", - "AWDL_SYNC_FRAME_AP_BEACON_ALIGNMENT", - "AWDL_SYNCHRONIZATION_CHANNEL_SEQUENCE", - "PEER_CACHE_MAXIMUM_SIZE", - "AWDL_OUI", - "AWDL_MASTER_CHANNEL", - "AWDL_TOP_MASTER", - "AWDL_SYNC_STATE", - "AWDL_ELECTION_RSSI_THRESHOLDS", - "AWDL_PRESENCE_MODE", - "AWDL_ELECTION_MASTER_COUNTS", - "AWDL_PERIODIC_SYNC_FRAME_PACKET_LIFETIME", - "AWDL_MASTER_MODE_SYNC_FRAME_PERIOD", - "AWDL_NON_ELECTION_MASTER_MODE_SYNC_FRAME_PERIOD", - "AWDL_EXPLICIT_AVAILABILITY_WINDOW_EXTENSION_OPT_OUT", - "AWDL_GET_AWDL_MASTER_DATABASE", - "PEER_CACHE_CONTROL", - "AWDL_BATTERY_LEVEL", - "AWDL_BT_COEX_AW_PROTECTED_PERIOD_LENGTH", - "AWDL_BT_COEX_AGREEMENT", - "AWDL_BT_COEX_AGREEMENT_ENABLED", - "AWDL_STRATEGY", - "AWDL_OOB_REQUEST", - "AWDL_MAX_NO_MASTER_PERIODS", - "AWDL_SYNC_FRAME_TEMPLATE", - "LOG_FLAGS", - "PEER_STATS", - "HT_CAPABILITY", - "AWDL_ELECTION_PARAMS", - "LINK_CHANGED_EVENT_DATA", - "GET_DEBUG_INFO", - "AWDL_DEVICE_CAPABILITIES", - "AWDL_RSSI_MEASUREMENT_REQUEST", - "AWDL_AES_KEY", - "AWDL_SCAN_RESERVED_TIME", - "AWDL_CTL", - "AWDL_SOCIAL_TIME_SLOTS", - "AWDL_PEER_TRAFFIC_REGISTRATION", - "EXTENDED_STATS", - "BEACON_PERIOD", - "AWDL_FORCED_ROAM_CONFIG", - "AWDL_QUIET", - "ACL_POLICY", - "ACL_ADD", - "ACL_REMOVE", - "ACL_FLUSH", - "ACL_LIST", - "CHAIN_ACK", - "DESENSE", - "OFFLOAD_SCANNING", - "OFFLOAD_RSN", - "OFFLOAD_COUNTRY_CODE", - "OFFLOAD_KEEPALIVE_L2", - "OFFLOAD_ARP_NDP", - "VHT_MCS_INDEX_SET", - "DWDS", - "INTERRUPT_STATS", - "INTERRUPT_STATS_RESET", - "TIMER_STATS", - "TIMER_STATS_RESET", - "OFFLOAD_STATS", - "OFFLOAD_STATS_RESET", - "OFFLOAD_BEACONS", - "ROAMING", - "OFFLOAD_ARP", - "OFFLOAD_NDP", - "OFFLOAD_SCAN", - "DESENSE_LEVEL", - "MCS_VHT", - "TX_NSS", - "GAS_REQ", - "GAS_START", - "GAS_SET_PEER", - "GAS_RESULTS", - "AWDL_BTLE_PEER_INDICATION", - "AWDL_BTLE_STATE_PARAMS", - "AWDL_PEER_DATABASE", - "AWDL_BTLE_ENABLE_SYNC_WITH_PARAMS", - "AWDL_SECONDARY_MASTER_CHANNEL", - "PHY_STATS", - "CHANNELS_INFO", - "AWDL_AF_TX_MODE", - "ERROR_STRING", - "ERROR_NO", - "AWDL_PIGGYBACK_SCAN_REQ", - "AWDL_PRIVATE_ELECTION_ID", - "AWDL_MIN_RATE", - "VHT_CAPABILITY", - "BGSCAN_CACHE_RESULTS", - "ROAM_PROFILE", - "AWDL_OPER_MODE", - "RESTORE_DEFAULTS", - "AWDL_ENCRYPTION_KEYS", - "AWDL_ENCRYPTION_TYPE", - "BTCOEX_PROFILES", - "BTCOEX_CONFIG", - "AWDL_STATISTICS", - "AWDL_ENABLE_ROAMING", - "AWDL_OOB_AUTO_REQUEST", - "AWDL_TXCAL_PERIOD", - "CHIP_COUNTER_STATS", - "DBG_GUARD_TIME_PARAMS", - "AWDL_AWDL_ADVERTISERS", - "LEAKY_AP_STATS_MODE", - "CAPTURE", - "LEAKY_AP_STATS", - "AWDL_BLOCK_SET_COMMANDS", - "LEAKY_AP_AWD_MODE", - "BTCOEX_OPTIONS", - "FORCE_SYNC_TO_PEER", - "COUNTRY_CHANNELS", - "PRIVATE_MAC", - "RESET_CHIP", - "CRASH", - "RANGING_ENABLE", - "RANGING_START", - "RANGING_AUTHENTICATE", - "AWDL_PREFERRED_CHANNELS", - "LEAKY_AP_SSID_STATS", - "AWDL_RSDB_CAPS", - "AWDL_DEV_STATS", - "LAST_ASSOC_HISTORY", - "AWDL_COMMON_CHANNEL", - "AWDL_PEERS_INFO", - "TKO_PARAMS", - "TKO_DUMP", - "AWDL_NEARBY_LOG_TRIGGER", - "HW_SUPPORTED_CHANNELS", - "BTCOEX_PROFILE", - "BTCOEX_PROFILE_ACTIVE", - "TRAP_INFO", - "THERMAL_INDEX", - "MAX_NSS_FOR_AP", - "BTCOEX_2G_CHAIN_DISABLE", - "POWER_BUDGET", - "AWDL_DFSP_CONFIG", - "AWDL_DFSP_UCSA_CONFIG", - "SCAN_BACKOFF_REPORT", - "OFFLOAD_TCPKA_ENABLE", - "RANGING_CAPS", - "PER_CORE_RSSI_REPORT", -}; - -#endif /* debug_h */ diff --git a/Headers/IOKit/bluetooth/IOBluetoothHostController.h b/Headers/IOKit/bluetooth/IOBluetoothHostController.h index ee94d0a9..80aa607b 100644 --- a/Headers/IOKit/bluetooth/IOBluetoothHostController.h +++ b/Headers/IOKit/bluetooth/IOBluetoothHostController.h @@ -107,7 +107,7 @@ typedef struct HearingDeviceListType typedef struct LEDeviceListType { BluetoothConnectionHandle mConnectionHandle; - bool unknown; + bool mCreateDeviceNotCalled; LEDeviceListType * mNextDevice; LEDeviceListType * mPreviousDevice; } BluetoothLEDevice; @@ -353,9 +353,9 @@ class IOBluetoothHostController : public IOService virtual bool GetCompleteCodeForCommand(BluetoothHCICommandOpCode inOpCode, BluetoothHCIEventCode * outEventCode); #if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 - virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, UInt32 inDataSize, BluetoothHCICommandOpCode * outOpCode, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, UInt8 *, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle, bool *); + virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, UInt32 inDataSize, BluetoothHCICommandOpCode * outOpCode, UInt8 * numOpCodes, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle, bool *); #else - virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, BluetoothHCICommandOpCode * outOpCode, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, UInt8 *, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle); + virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, BluetoothHCICommandOpCode * outOpCode, UInt8 * numOpCodes, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle); #endif virtual IOReturn FindConnectionCompleteType(BluetoothDeviceAddress * inDeviceAddress, BluetoothHCICommandOpCode * outOpCode); diff --git a/Headers/IOKit/network/IOEthernetController.h b/Headers/IOKit/network/IOEthernetController.h index 72b46009..160be490 100644 --- a/Headers/IOKit/network/IOEthernetController.h +++ b/Headers/IOKit/network/IOEthernetController.h @@ -30,10 +30,6 @@ #error "Missing macOS target version" #endif -#ifndef APPLE_KEXT_DEPRECATE -#define APPLE_KEXT_DEPRECATE -#endif - /*! @defined kIOEthernetControllerClass @abstract kIOEthernetControllerClass is the name of the IOEthernetController class. */ @@ -190,7 +186,7 @@ class IOTimeSyncEthernetInterfaceAdapter; the controller driver to the data link layer. */ -class APPLE_KEXT_DEPRECATE IOEthernetController : public IONetworkController +class IOEthernetController : public IONetworkController { OSDeclareAbstractStructors( IOEthernetController ) @@ -599,7 +595,6 @@ class APPLE_KEXT_DEPRECATE IOEthernetController : public IONetworkController /*! @function getAVBSupport @abstract Indicates that AVB streaming is supported and what capabilities it has. - @discussion @param avbSupport A pointer to an IOEthernetControllerAVBSupport struct to return the capabilities. @return True if this controller has at least 1 real time transmit queues or at least 1 realtime receive queues */ @@ -623,7 +618,7 @@ class APPLE_KEXT_DEPRECATE IOEthernetController : public IONetworkController for transmitting packets by the controller. The packet mapper is retained. @param packetMapper the IOMapper to be used. */ - void setAVBPacketMapper(IOMapper *packetMaper); + void setAVBPacketMapper(IOMapper *packetMapper); #pragma mark Interface State friend IOTimeSyncEthernetInterfaceAdapter; @@ -840,7 +835,7 @@ class APPLE_KEXT_DEPRECATE IOEthernetController : public IONetworkController @abstract Set the value returned by getTransmitQueuePrefetchDelay() for a given queue. @discussion Stores the value of the maximum prefetch delay for a given queue. See getTransmitQueuePrefetchDelay for more details. @param queueIndex index of the realtime transmit queue. - @param PrefetchDelay The prefetch delay for the queue. + @param prefetchDelay The prefetch delay for the queue. */ void setTransmitQueuePrefetchDelay(uint32_t queueIndex, uint64_t prefetchDelay); @@ -1137,7 +1132,6 @@ class APPLE_KEXT_DEPRECATE IOEthernetController : public IONetworkController @discussion Sets the gPTPPresent property on the controller and interface. If setting gPTPPresent to true it calls registerService() to trigger matching and loading of the AVB stack on demand, otherwise it calls messageClients to trigger the stack to unload. - @param gPTPPresent @return IOReturn indicating success or reason for failure. */ IOReturn setGPTPPresent(bool gPTPPresent); diff --git a/Headers/IOKit/network/IOEthernetInterface.h b/Headers/IOKit/network/IOEthernetInterface.h index a5f707e6..4de06890 100644 --- a/Headers/IOKit/network/IOEthernetInterface.h +++ b/Headers/IOKit/network/IOEthernetInterface.h @@ -82,7 +82,7 @@ IOEthernetInterface. */ -class APPLE_KEXT_DEPRECATE IOEthernetInterface : public IONetworkInterface +class IOEthernetInterface : public IONetworkInterface { OSDeclareDefaultStructors( IOEthernetInterface ) diff --git a/Headers/IOKit/network/IOKernelDebugger.h b/Headers/IOKit/network/IOKernelDebugger.h index 4543aca8..c1984693 100644 --- a/Headers/IOKit/network/IOKernelDebugger.h +++ b/Headers/IOKit/network/IOKernelDebugger.h @@ -356,7 +356,7 @@ class IOKernelDebugger : public IOService virtual bool init( IOService * target, IODebuggerTxHandler txHandler, IODebuggerRxHandler rxHandler, - IODebuggerLinkStatusHandler linkUpHandler, + IODebuggerLinkStatusHandler linkStatusHandler, IODebuggerSetModeHandler setModeHandler); /*! @function debugger diff --git a/Headers/IOKit/network/IONetworkController.h b/Headers/IOKit/network/IONetworkController.h index ed8b6e7f..d08b98db 100644 --- a/Headers/IOKit/network/IONetworkController.h +++ b/Headers/IOKit/network/IONetworkController.h @@ -493,7 +493,7 @@ class IONetworkController : public IOService process the output packet provided. The implementation in the driver must not block, since this may cause the network stack to be reentered from an unsafe point. - @param mbuf_t An mbuf chain containing the output packet to be sent on + @param m An mbuf chain containing the output packet to be sent on the network. @param param A parameter provided by the caller. @result Returns a return code defined by the caller. @@ -884,7 +884,7 @@ class IONetworkController : public IOService /*! @function freePacket @abstract Releases the packet given back to the free pool. - @param mbuf_t The packet to be freed. + @param packet The packet to be freed. @param options When kDelayFree option is set, then the packet provided to this function will be queued on the free packet queue. A subsequent call to releaseFreePackets() will release all queued @@ -892,7 +892,7 @@ class IONetworkController : public IOService option, the packet provided will be released immediately. */ - virtual void freePacket(mbuf_t, IOOptionBits options = 0); + virtual void freePacket(mbuf_t packet, IOOptionBits options = 0); /*! @function releaseFreePackets @abstract Releases all packets held in the free packet queue. diff --git a/Headers/IOKit/network/IONetworkInterface.h b/Headers/IOKit/network/IONetworkInterface.h index 1e517064..d440544a 100644 --- a/Headers/IOKit/network/IONetworkInterface.h +++ b/Headers/IOKit/network/IONetworkInterface.h @@ -197,10 +197,10 @@ struct IOMbufQueue; all outbound packets sent to the interface from the data link layer. An output handler is registered with the interface by calling registerOutputHandler(). - @param mbuf_t A packet mbuf. + @param packet A packet mbuf. @param param A parameter for the output request. */ -typedef UInt32 (OSObject::*IOOutputAction)(mbuf_t, void * param); +typedef UInt32 (OSObject::*IOOutputAction)(mbuf_t packet, void * param); /*! @typedef BPF_FUNC @discussion Prototype for the BPF tap handler. This will disappear @@ -228,7 +228,6 @@ enum { kIONetworkEventTypeLinkSpeedChange = 0xff000005 }; -#ifdef __PRIVATE_SPI__ enum { kIONetworkWorkLoopSynchronous = 0x00000001 }; @@ -301,7 +300,6 @@ struct IONetworkPacketPollingParameters { uint64_t pollIntervalTime; uint64_t reserved[4]; }; -#endif /* __PRIVATE_SPI__ */ /*! @class IONetworkInterface @abstract Abstract class that manages the connection between an @@ -514,7 +512,7 @@ class IONetworkInterface : public IOService This input queue is not protected by a lock. Drivers that leverage this input queue must either access the queue from a single thread, or enforce serialized access. - @param mbuf_t The mbuf containing the received packet. + @param packet The mbuf containing the received packet. @param length Specify the size of the received packet in the mbuf. The mbuf length fields are updated with this value. If zero, then the mbuf length fields are not updated. @@ -659,7 +657,7 @@ class IONetworkInterface : public IOService /*! @function addNetworkData @abstract Adds an IONetworkData object to the interface. @discussion The IONetworkData object is added to a - collection using the key from IONetworkData::getKey(). + collection using the key from IONetworkData::getKey(). The object provided is retained. @param aData The IONetworkData object. @result Returns true if the object was added, false otherwise. @@ -1068,9 +1066,9 @@ class IONetworkInterface : public IOService @discussion This function is called internally to send input packets to the BPF input tap when it is enabled. Subclasses are not expected to override this method. - @param mbuf_t Pointer to the input packet. + @param packet Pointer to the input packet. */ - virtual void feedPacketInputTap( mbuf_t ); + virtual void feedPacketInputTap( mbuf_t packet ); OSMetaClassDeclareReservedUsed(IONetworkInterface, 2); @@ -1079,9 +1077,9 @@ class IONetworkInterface : public IOService @discussion This function is called internally to send output packets to the BPF output tap when it is enabled. Subclasses are not expected to override this method. - @param mbuf_t Pointer to the output packet. + @param packet Pointer to the output packet. */ - virtual void feedPacketOutputTap( mbuf_t ); + virtual void feedPacketOutputTap( mbuf_t packet ); OSMetaClassDeclareReservedUsed(IONetworkInterface, 3); @@ -1108,8 +1106,8 @@ class IONetworkInterface : public IOService IONetworkInterface::init() and before IONetworkInterface::attachToDataLinkLayer(). This allows for over-riding ifnet_init_eparams.start_delay_qlen and ifnet_init_eparams.start_delay_timeout. - @param outputStartDelayQueueLength, maps to ifnet_init_eparams.start_delay_qlen - @param outputStartDelayTimeout, maps to ifnet_init_eparams.start_delay_timeout + @param outputStartDelayQueueLength maps to ifnet_init_eparams.start_delay_qlen + @param outputStartDelayTimeout maps to ifnet_init_eparams.start_delay_timeout @result kIOReturnSuccess if interface was successfully configured. */ @@ -1130,7 +1128,7 @@ class IONetworkInterface : public IOService /*! @function isBPFTapEnabled @abstract Query if the BPF tap is enabled. - @abstract Allows a driver to poll the BPF tap state after receiving a + @discussion Allows a driver to poll the BPF tap state after receiving a kIONetworkNotificationBPFTapStateChange notification. @param options No options are currently defined, always pass zero. @result Returns true if BPF tap is enabled, @@ -1140,7 +1138,7 @@ class IONetworkInterface : public IOService /*! @function getLoggingLevel @abstract Query the logging level for the interface. - @abstract Allows a driver to poll the logging level after receiving a + @discussion Allows a driver to poll the logging level after receiving a kIONetworkNotificationLoggingLevelChange notification. @param options No options are currently defined, always pass zero. @result Returns the current logging level. @@ -1462,7 +1460,7 @@ class IONetworkInterface : public IOService @param status The transmit status. @param param1 Always pass zero. @param param2 Always pass zero. - @param No options are currently defined, always pass zero. + @param options No options are currently defined, always pass zero. @result kIOReturnSuccess if the transmit status was valid and accepted, otherwise kIOReturnBadArgument for bad status, or kIOReturnError if an error occurred when passing the status diff --git a/Headers/IOKit/network/IOPacketQueue.h b/Headers/IOKit/network/IOPacketQueue.h index b6694b06..36f440ca 100644 --- a/Headers/IOKit/network/IOPacketQueue.h +++ b/Headers/IOKit/network/IOPacketQueue.h @@ -155,7 +155,6 @@ class IOPacketQueue : public OSObject @abstract Adds a chain of packets to the head of a synchronized queue. @discussion A spinlock is used to synchronize access to the queue. @param m A chain of packets to add to the head of the queue. - @result Always returns true. */ virtual void lockPrepend(mbuf_t m); diff --git a/Headers/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h b/Headers/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h new file mode 100644 index 00000000..4850f0b1 --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h @@ -0,0 +1,76 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKCLONEABLENETWORKPACKET_H +#define _IOSKYWALKCLONEABLENETWORKPACKET_H + +#include + +class IOSkywalkCloneableNetworkPacket : public IOSkywalkNetworkPacket +{ + OSDeclareDefaultStructors( IOSkywalkCloneableNetworkPacket ) + +public: + static IOSkywalkPacket * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkCloneableNetworkPacket * packetClone(); + IOReturn packetCloneWithBaseAndLimit( int64_t base, size_t limit, IOSkywalkCloneableNetworkPacket ** packet ); + IOReturn setPacketBufferBaseAndLimit( int64_t base, size_t limit ); + IOReturn getPacketBufferBaseAddr( uint8_t ** baseAddr ); + IOReturn getPacketBufferObjectBaseAddr( uint8_t ** baseAddr ); + IOReturn getPacketBufferObjectIOBusBaseAddr( uint8_t ** baseAddr ); + + virtual bool getPacketBuffers( IOSkywalkPacketBuffer ** buffers, UInt32 count ); + virtual UInt32 getPacketBufferCount(); + virtual IOMemoryDescriptor * getMemoryDescriptor(); + virtual IOReturn setDataLength( UInt32 length ) APPLE_KEXT_OVERRIDE; + virtual UInt32 getDataLength() APPLE_KEXT_OVERRIDE; + virtual IOReturn setDataOffset( UInt16 offset ) APPLE_KEXT_OVERRIDE; + virtual UInt16 getDataOffset() APPLE_KEXT_OVERRIDE; + virtual IOReturn setDataOffsetAndLength( UInt16 offset, UInt32 length ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn prepareWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + virtual IOReturn completeWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getPacketType() APPLE_KEXT_OVERRIDE; + virtual kern_buflet_t acquireWithPacketHandle( UInt64 handle, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual void disposePacket() APPLE_KEXT_OVERRIDE; + void printPacket(); + +protected: + uint64_t _reserved[3]; // 128... I bet they are used or set in another class! +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkController.h b/Headers/IOKit/skywalk/IOSkywalkController.h new file mode 100644 index 00000000..ea0af5d7 --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkController.h @@ -0,0 +1,59 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKCONTROLLER_H +#define _IOSKYWALKCONTROLLER_H + +#include + +class IOSkywalkInterface; + +class IOSkywalkController : public IOService +{ + OSDeclareDefaultStructors( IOSkywalkController ) + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ) APPLE_KEXT_OVERRIDE; + virtual void handleClose( IOService * forClient, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + IOReturn attachInterface( IOSkywalkInterface * interface, IOOptionBits options ); + IOReturn detachInterface( IOSkywalkInterface * interface, IOOptionBits options ); + +protected: + void * mRefCon; + OSSet * mInterfaces; +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkEthernetInterface.h b/Headers/IOKit/skywalk/IOSkywalkEthernetInterface.h new file mode 100644 index 00000000..c729b322 --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkEthernetInterface.h @@ -0,0 +1,95 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKETHERNETINTERFACE_H +#define _IOSKYWALKETHERNETINTERFACE_H + +#include +#include + +class IOSkywalkEthernetInterface : public IOSkywalkNetworkInterface +{ + OSDeclareAbstractStructors( IOSkywalkEthernetInterface ) + + struct RegistrationInfo; + +public: + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + bool initRegistrationInfo( RegistrationInfo * info, IOOptionBits options, size_t size ); + IOReturn registerEthernetInterface( const RegistrationInfo * info, IOSkywalkPacketQueue ** queues, IOOptionBits queueOptions, IOSkywalkPacketBufferPool * pool1, IOSkywalkPacketBufferPool * pool2, IOOptionBits options = 0 ); + IOReturn deregisterEthernetInterface( IOOptionBits options = 0 ); + + virtual IOReturn initBSDInterfaceParameters( struct ifnet_init_eparams * params, sockaddr_dl ** ll ) APPLE_KEXT_OVERRIDE; + virtual IOReturn prepareBSDInterface( ifnet_t interface, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual errno_t processBSDCommand( ifnet_t interface, UInt32 cmd, void * data ) APPLE_KEXT_OVERRIDE; + + errno_t ioctl_sifflags( ifnet_t interface ); + errno_t ioctl_multicast( ifnet_t interface, bool ); + + virtual IOReturn getPacketTapInfo(UInt32 *, UInt32 *) APPLE_KEXT_OVERRIDE; + virtual UInt32 getMaxTransferUnit() APPLE_KEXT_OVERRIDE; + virtual UInt32 getMinPacketSize() APPLE_KEXT_OVERRIDE; + virtual UInt32 getHardwareAssists() APPLE_KEXT_OVERRIDE; + + virtual IOReturn configureMulticastFilter( UInt32, const ether_addr * addresses, uint32_t count ); + virtual IOReturn setPromiscuousModeEnable( bool enable, IOOptionBits options ); + + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 10 ); + +protected: + void * mRefCon; + + struct ExpansionData + { + RegistrationInfo * eRegistrationInfo; + OSData * eMulticastAddresses; + UInt32 eNumMulticastAddresses; + UInt16 eBSDInterfaceFlags; + sockaddr_dl eLinkLayerSockAddress; + }; + ExpansionData * mExpansionData; +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkInterface.h b/Headers/IOKit/skywalk/IOSkywalkInterface.h new file mode 100644 index 00000000..5edb537c --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkInterface.h @@ -0,0 +1,81 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKINTERFACE_H +#define _IOSKYWALKINTERFACE_H + +#include + +class IOSkywalkPacketQueue; +class IOSkywalkPacketBufferPool; + +class IOSkywalkInterface : public IOService +{ + OSDeclareAbstractStructors( IOSkywalkInterface ) + +protected: + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ) APPLE_KEXT_OVERRIDE; + virtual void handleClose( IOService * forClient, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + virtual IOReturn enable( IOOptionBits options ) = 0; + virtual IOReturn disable( IOOptionBits options ) = 0; + virtual IOReturn clientConnectWithTask( task_t task, IOService * forClient, IOOptionBits options ); + virtual void clientDisconnect( IOService * forClient, IOOptionBits options ); + + IOReturn registerInterfaceWithQueues( IOSkywalkPacketQueue ** queue, UInt32 count, IOSkywalkPacketBufferPool * pool1, IOSkywalkPacketBufferPool * pool2, IOOptionBits options = 0 ); + IOReturn deregisterInterfaceWithQueues(); + + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 10 ); + +protected: + void * mRefCon; // 136 + OSArray * mPacketQueueArray; // 144 + IOSkywalkPacketBufferPool * mPacketBufferPool1; // 152 + IOSkywalkPacketBufferPool * mPacketBufferPool2; // 160 + OSSet * mClients; // 168 +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkMemorySegment.h b/Headers/IOKit/skywalk/IOSkywalkMemorySegment.h new file mode 100644 index 00000000..82c58e6a --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkMemorySegment.h @@ -0,0 +1,89 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKMEMORYSEGMENT_H +#define _IOSKYWALKMEMORYSEGMENT_H + +#include +#include + +struct DMASpecification +{ + SegmentFunction outSegFunc; + UInt8 numAddressBits; + UInt64 maxSegmentSize; + MappingOptions mappingOptions; + UInt64 maxTransferSize; + UInt32 alignment; + IOMapper * mapper; +}; + +struct IOSkywalkMemorySegmentDescriptor +{ + UInt32 packetBufferCount; + DMASpecification * specs; +}; + +class IOSkywalkMemorySegment : public OSObject +{ + OSDeclareDefaultStructors( IOSkywalkMemorySegment ) + +public: + static IOSkywalkMemorySegment * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkMemorySegmentDescriptor * desc, IOOptionBits options = 0 ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkMemorySegmentDescriptor * desc, IOOptionBits options = 0 ); + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkPacketBufferPool * getPacketBufferPool(); + virtual IOReturn setDMACommand( IODMACommand * dmaCommand, IOOptionBits options = 0 ); + virtual IODMACommand * getDMACommand(); + + virtual IOReturn prepare( IODirection forDirection = kIODirectionNone ); + virtual IOReturn complete( IODirection forDirection = kIODirectionNone ); + + virtual IOReturn setBufferMemoryDescriptor( IOBufferMemoryDescriptor * md ); + IOMemoryDescriptor * getMemoryDescriptor(); + virtual IOReturn setMemoryDescriptor( IOMemoryDescriptor * md, UInt64 address ); + UInt64 getVirtualAddress(); + +protected: + void * mRefCon; // 16 + IOSkywalkPacketBufferPool * mPool; // 24 + IOMemoryDescriptor * mMemoryDescriptor; // 32 + OSObject * _unknown; // 40 + UInt64 mVirtualAddress; // 48 + IODMACommand * mDMACommand; // 56 + OSArray * mPacketBufferArray; // 64, stores IOSkywalkPacketBuffers + uint64_t _reserved1[6]; // 72 +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkNetworkController.h b/Headers/IOKit/skywalk/IOSkywalkNetworkController.h new file mode 100644 index 00000000..41a1ace2 --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkNetworkController.h @@ -0,0 +1,44 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKNETWORKCONTROLLER_H +#define _IOSKYWALKNETWORKCONTROLLER_H + +#include + +class IOSkywalkNetworkController : public IOSkywalkController +{ + OSDeclareDefaultStructors( IOSkywalkNetworkController ) +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkNetworkInterface.h b/Headers/IOKit/skywalk/IOSkywalkNetworkInterface.h new file mode 100644 index 00000000..f5aef88a --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkNetworkInterface.h @@ -0,0 +1,144 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKNETWORKINTERFACE_H +#define _IOSKYWALKNETWORKINTERFACE_H + +#include +#include +#include + +class IOSkywalkNetworkKDPPoller; + +class IOSkywalkNetworkInterface : public IOSkywalkInterface +{ + OSDeclareAbstractStructors( IOSkywalkNetworkInterface ) + + struct RegistrationInfo; + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + IOReturn registerNetworkInterface( const RegistrationInfo * info, IOSkywalkPacketQueue ** queues, IOOptionBits queueOptions, IOSkywalkPacketBufferPool * pool1, IOSkywalkPacketBufferPool * pool2, IOOptionBits options = 0 ); + IOReturn deregisterNetworkInterface( IOOptionBits options = 0 ); + + void handleLinkStatusEvent(); + IOReturn reportEventType( UInt32 type, void * argument, vm_size_t argSize = 0 ); + IOReturn reportLinkStatus( IOSkywalkNetworkLinkStatus linkStatus, IOSkywalkNetworkMediaType activeMediaType ); + IOReturn reportLinkQuality( IOSkywalkNetworkLinkQuality linkQuality ); + IOReturn reportDataBandwidths( uint64_t maxInputBandwidth, uint64_t maxOutputBandwidth, uint64_t effectiveInputBandwidth, uint64_t effectiveOutputBandwidth ); + IOReturn reportInterfaceAdvisory( const struct ifnet_interface_advisory * advisory ); + + virtual IOReturn setAggressiveness( unsigned long type, unsigned long newLevel ) APPLE_KEXT_OVERRIDE; + + virtual void joinPMtree( IOService * driver ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn initBSDInterfaceParameters( struct ifnet_init_eparams * params, struct sockaddr_dl ** ll ) = 0; + virtual IOReturn prepareBSDInterface( ifnet_t interface, IOOptionBits options ); + virtual void finalizeBSDInterface( ifnet_t interface, IOOptionBits options ); + virtual ifnet_t getBSDInterface(); + virtual void setBSDName( const char * name ); + virtual const char * getBSDName(); + + virtual errno_t processBSDCommand( ifnet_t interface, UInt32 cmd, void * data ); + errno_t ioctl_gifmedia( ifnet_t interface, UInt32 sockioc, void * data ); + errno_t ioctl_sifmedia( ifnet_t interface, void * data ); + errno_t ioctl_gifdevmtu( ifnet_t interface, void * data ); + errno_t ioctl_sifmtu( ifnet_t interface, void * data, bool useOriginalLength ); + errno_t ioctl_gifcap( ifnet_t interface, void * data ); + errno_t ioctl_sifcap( ifnet_t interface, void * data ); + + virtual void setRunningState( bool state ); + + virtual IOReturn handleChosenMedia( UInt32 ); + virtual IOReturn getSupportedMediaArray( UInt32 *, UInt32 * ); + + virtual IOReturn getPacketTapInfo( UInt32 *, UInt32 * ); + virtual IOReturn getUnsentDataByteCount( UInt32 *, UInt32 *, UInt32 ); + virtual IOReturn getSupportedWakeFlags( UInt32 * flags ); + virtual IOReturn enableNetworkWake( UInt32 flags ); + + virtual IOReturn calculateRingSizeForQueue( const IOSkywalkPacketQueue * queue, UInt32 * size ); + IOReturn getServiceClassIndex( UInt32 serviceClass, UInt32 * index ); + virtual UInt32 getMaxTransferUnit(); + virtual UInt32 getMinPacketSize(); + virtual IOReturn getMTU( UInt32 * mtu ); + virtual void setMTU( UInt32 mtu ); + + virtual UInt32 getHardwareAssists(); + virtual void setHardwareAssists( UInt32 hardwareAssists ); + IOReturn setKDPPoller( IOSkywalkNetworkKDPPoller * poller ); + + virtual void captureInterfaceState( UInt32 state ); + virtual void restoreInterfaceState( UInt32 state ); + virtual IOReturn handleDoorbellForQueue( IOSkywalkPacketQueue * queue, UInt32 ); + + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 10 ); + +protected: + void * mRefCon; + + struct ExpansionData + { + RegistrationInfo * eRegistrationInfo; + ifnet_t eBSDInterface; + OSArray * ePacketQueueArray; + IOLock * eDataLock; + IOLock * eInterfacePreparedLock; + IOSkywalkNetworkKDPPoller * eKDPPoller; + thread_call_t eLinkStatusEventThread; + UInt32 eLinkStatusMessageType; + IOSkywalkNetworkMediaType eActiveMediaType; + UInt32 eChosenMedia; + IOSkywalkNetworkLinkStatus eLinkStatus; + bool eInterfacePrepared; + const char eBSDName[80]; + UInt32 eMTU; + }; + ExpansionData * mExpansionData; +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkNetworkPacket.h b/Headers/IOKit/skywalk/IOSkywalkNetworkPacket.h new file mode 100644 index 00000000..7885f7c5 --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkNetworkPacket.h @@ -0,0 +1,83 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKNETWORKPACKET_H +#define _IOSKYWALKNETWORKPACKET_H + +#include + +class IOSkywalkNetworkPacket : public IOSkywalkPacket +{ + OSDeclareDefaultStructors( IOSkywalkNetworkPacket ) + +public: + static IOSkywalkNetworkPacket * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual UInt32 getPacketType() APPLE_KEXT_OVERRIDE; + + IOReturn setHeadroom( uint8_t headroom ); + uint8_t getHeadroom(); + IOReturn setLinkHeaderLength( uint8_t length ); + uint8_t getLinkHeaderLength(); + IOReturn setLinkHeaderOffset( uint32_t offset ); + IOReturn getLinkHeaderOffset( uint32_t * offset ); + IOReturn setNetworkHeaderOffset( uint32_t offset ); + IOReturn getNetworkHeaderOffset( uint32_t * offset ); + IOReturn setDataContainsFCS( bool contain ); + bool getDataContainsFCS(); + UInt32 getServiceClass(); + + IOReturn setTimestamp( AbsoluteTime timestamp ); + IOReturn getTimestamp( AbsoluteTime * timestamp ); + IOReturn clearTimestamp(); + bool isTimestampRequested(); + IOReturn setCompletionStatus( int status ); + IOReturn getExpiryTime( AbsoluteTime * time ); + + IOReturn getTokenData( void * data, uint16_t * size ); + IOReturn getPacketID( struct packet_id * packetID ); + + bool isPacketGroupStart(); + bool isPacketGroupEnd(); + bool isHighPriority(); + bool isTransportNewFlow(); + bool isTransportLastPacket(); + IOReturn setIsLinkBroadcast( bool broadcast ); + bool isLinkBroadcast(); + IOReturn setIsLinkMulticast( bool multicast ); + bool isLinkMulticast(); + +protected: + void * mRefCon; +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkPacket.h b/Headers/IOKit/skywalk/IOSkywalkPacket.h new file mode 100644 index 00000000..31b2ec9d --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkPacket.h @@ -0,0 +1,115 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKET_H +#define _IOSKYWALKPACKET_H + +#include +#include + +typedef uint32_t IOSkywalkPacketDirection; +enum +{ + kIOSkywalkPacketDirectionNone = 0x00000000, + kIOSkywalkPacketDirectionTx = 0x00000001, + kIOSkywalkPacketDirectionRx = 0x00000002 +}; + +enum IOSkywalkPacketTypes +{ + kIOSkywalkPacketTypeGeneric = 0, + kIOSkywalkPacketTypeNetwork, + kIOSkywalkPacketTypeCloneable +}; + +struct IOSkywalkPacketDescriptor +{ + UInt32 packetIndex; + bool singleBuffer; +}; + +class IOSkywalkPacket : public IOCommand +{ + OSDeclareDefaultStructors( IOSkywalkPacket ) + +public: + static IOSkywalkPacket * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkPacketBufferPool * getPacketBufferPool(); + UInt32 getBufferSize(); + virtual UInt32 getPacketBuffers( IOSkywalkPacketBuffer ** buffers, UInt32 maxBuffers ); + virtual UInt32 getPacketBufferCount(); + virtual IOMemoryDescriptor * getMemoryDescriptor(); + virtual IOReturn setDataLength( UInt32 length ); + virtual UInt32 getDataLength(); + virtual IOReturn setDataOffset( UInt16 offset ); + virtual UInt16 getDataOffset(); + virtual IOReturn setDataOffsetAndLength( UInt16 offset, UInt32 length ); + + IOSkywalkPacketQueue * getSourceQueue(); + virtual IOReturn prepareWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ); + virtual IOReturn prepare( IOSkywalkPacketQueue * queue, UInt64, IOOptionBits options = 0 ); + virtual IOReturn completeWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ); + virtual IOReturn complete( IOSkywalkPacketQueue * queue, IOOptionBits options = 0 ); + + void setTransferDirection( IOSkywalkPacketDirection direction ); + IOSkywalkPacketDirection getTransferDirection(); + bool clearTransferDirection( IOSkywalkPacketDirection direction ); + + void setSlotReference( void * ref ); + void * getSlotReference(); + virtual UInt32 getPacketType(); + virtual kern_buflet_t acquireWithPacketHandle( UInt64 handle, IOOptionBits options ); + void cancelCompletionCallback(); + virtual void disposePacket(); + +protected: + void * mRefCon; // 32 + UInt64 mPacketHandle; // 40 + IOSkywalkPacketBuffer ** mPacketBuffers; // 48 + IOSkywalkPacketQueue * mSourceQueue; // 56 + IOSkywalkPacketBufferPool * mBufferPool; // 64 + kern_buflet_t mBuflet; // 72 + + uint64_t _reserved0; // 80 + UInt32 mPacketState; // 88 - 0 on complete, 1 on acquire, 2 on prepare + UInt32 mMaxNumBuffers; // 92 + UInt32 mActualNumBuffers; // 96 + UInt32 mPacketIndex; // 100 + IOSkywalkPacketDirection mTransferDirection; // 104 + void * mSlotReference; // 112 +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkPacketBuffer.h b/Headers/IOKit/skywalk/IOSkywalkPacketBuffer.h new file mode 100644 index 00000000..503c256b --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkPacketBuffer.h @@ -0,0 +1,118 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKETBUFFER_H +#define _IOSKYWALKPACKETBUFFER_H + +#include +#include + +struct __kern_buflet; +typedef __kern_buflet * kern_buflet_t; + +class IOSkywalkPacket; +class IOSkywalkPacketQueue; +class IOSkywalkPacketBufferPool; +class IOSkywalkMemorySegment; + +struct IOSkywalkPacketBufferDescriptor +{ + IOMemoryDescriptor * memDescriptor; + IOSkywalkMemorySegment * memSegment; + UInt64 memSegmentOffset; +}; + +class IOSkywalkPacketBuffer : public IOCommand +{ + OSDeclareDefaultStructors( IOSkywalkPacketBuffer ) + +public: + static IOSkywalkPacketBuffer * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketBufferDescriptor * desc, IOOptionBits options = 0 ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketBufferDescriptor * desc, IOOptionBits options = 0 ); + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkPacketBufferPool * getPacketBufferPool(); + UInt32 getBufferSize(); + + UInt32 getDataLength(); + IOReturn setDataLength( UInt32 length ); + UInt16 getDataOffset(); + IOReturn setDataOffset( UInt16 offset ); + IOReturn setDataOffsetAndLength( UInt16 offset, UInt32 length ); + + IOSkywalkPacket * getPacket(); + virtual void setPacket( IOSkywalkPacket * packet, IOOptionBits options ); + + virtual IOReturn prepare( IODirection forDirection = kIODirectionNone ); + virtual IOReturn complete( IODirection forDirection = kIODirectionNone ); + + IOSkywalkMemorySegment * getMemorySegment(); + UInt64 getMemorySegmentOffset(); + virtual IOReturn prepareWithMemorySegment( IOSkywalkMemorySegment * segment, UInt64 offset, IOOptionBits options = 0 ); + virtual IOReturn completeWithMemorySegment( IOSkywalkMemorySegment * segment, UInt64 offset, IOOptionBits options = 0 ); + + IOSkywalkPacketQueue * getSourceQueue(); + virtual IOReturn prepareWithQueue( IOSkywalkPacketQueue * queue, IODirection direction = kIODirectionNone, IOOptionBits options = 0 ); + virtual IOReturn completeWithQueue( IOSkywalkPacketQueue * queue, IODirection direction = kIODirectionNone, IOOptionBits options = 0 ); + + kern_buflet_t getBufletHandle(); + void setBufletHandle( kern_buflet_t handle ); + virtual void acquireWithBufletHandle( kern_buflet_t handle ); + + UInt64 getBufferHandle(); + virtual void acquireWithBufferHandle( UInt64 handle ); + + virtual void disposePacketBuffer(); + void cancelCompletionCallback(); + +public: + void * mRefCon; // 32 + IOSkywalkPacketBufferPool * mPool; // 40 + kern_buflet_t mBufletHandle; // 48 + UInt64 mBufferHandle; // 56 + + IOSkywalkPacket * mPacket; // 64 + IOSkywalkPacketQueue * mSourceQueue; // 72 + IOMemoryDescriptor * mMemDescriptor; // 80 + IOSkywalkMemorySegment * mMemorySegment; // 88 + uint64_t __reserved0[2]; // 96 + + UInt64 mMemorySegmentOffset; // 112 + UInt32 mBufferState; // 120 + UInt32 mDataLength; // 124 + UInt16 mDataOffset; // 128 + + uint64_t _reserved1; // 136 +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkPacketBufferPool.h b/Headers/IOKit/skywalk/IOSkywalkPacketBufferPool.h new file mode 100644 index 00000000..ddd59e35 --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkPacketBufferPool.h @@ -0,0 +1,168 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKETBUFFERPOOL_H +#define _IOSKYWALKPACKETBUFFERPOOL_H + +#include +#include + +extern void pp_ctx_retain( void * target ); +extern void pp_ctx_release( void * target ); + +struct SegmentStats +{ + UInt64 constructorCount; + UInt64 destructorCount; + UInt64 prepareErrors; + UInt32 prepareMaxRetries; + UInt32 prepareErrorCode; +}; + +struct IOSkywalkPacketDescriptor; +struct IOSkywalkPacketBufferDescriptor; +struct IOSkywalkMemorySegmentDescriptor; + +class IOSkywalkInterface; + +class IOSkywalkPacketBufferPool : public OSObject +{ + OSDeclareDefaultStructors( IOSkywalkPacketBufferPool ) + + /*! @enum IOSkywalkPacketBufferPoolFlags + @abstract Flags for PoolOptions::poolFlags. + @constant PoolFlagSingleMemorySegment The pool will be constucted with single memory segment of buffers. + @constant PoolFlagPersistentMemory The pool memory will be persistently wired. + */ + + enum IOSkywalkPacketBufferPoolFlags + { + kIOSkywalkPacketBufferPoolFlagSingleMemorySegment = 0x00000002, + kIOSkywalkPacketBufferPoolFlagPersistentMemory = 0x00000004, + kIOSkywalkPacketBufferPoolFlagFlagMask = kIOSkywalkPacketBufferPoolFlagSingleMemorySegment | kIOSkywalkPacketBufferPoolFlagPersistentMemory + }; + + struct PoolOptions + { + uint32_t packetCount; // 0 + uint32_t bufferCount; // 4 + uint32_t bufferSize; // 8 + uint32_t maxBuffersPerPacket; // 12 + uint32_t memorySegmentSize; // 16 + uint32_t poolFlags; // 20 + uint64_t _reserved; // 24 + }; + +public: + static IOSkywalkPacketBufferPool * withName( const char * name, OSObject * owner, UInt32 packetType, const PoolOptions * options ); + virtual bool initWithName( const char * name, void * owner, UInt32 packetType, const PoolOptions * options ); + virtual bool initWithName( const char * name, OSObject * owner, UInt32 packetType, const PoolOptions * options ); + virtual void free() APPLE_KEXT_OVERRIDE; + void disposeAllPackets(); + void disposeAllBuffers(); + virtual void release() const APPLE_KEXT_OVERRIDE; + void releaseAllPackets(); + void releaseAllMemorySegments(); + + void segmentConstructor( struct kern_pbufpool * pbufPool, struct sksegment * segment, IOMemoryDescriptor * md ); + void segmentDestructor( struct kern_pbufpool * pbufPool, struct sksegment * segment, IOMemoryDescriptor * md ); + bool createSegmentBuffers( IOSkywalkMemorySegment * segment, UInt32 numBuffers, bool subDesc ); + void destroySegmentBuffers( IOSkywalkMemorySegment * segment ); + IOReturn prepareMemorySegment( IOSkywalkMemorySegment * segment, IOBufferMemoryDescriptor * buffer, UInt64 offset ); + IOSkywalkMemorySegment * getMemorySegmentWithHandle( struct sksegment * handle ); + IOSkywalkPacket * getPacketWithHandle( UInt64 handle ); + IOSkywalkPacket * getPacketWithIndex( UInt32 index ); + IOSkywalkPacketBuffer * getPacketBufferWithBufletHandle( kern_buflet_t handle ); + IOSkywalkPacketBuffer * getPacketBufferWithSegmentInfo( sksegment * segment, UInt32 ); + const char * getPoolName(); + + void checkInPacketQueue( const IOSkywalkPacketQueue * queue ); + void checkOutPacketQueue( const IOSkywalkPacketQueue * queue ); + void reportingChangeNotification(); + void checkInReportingService( IOService * service, const IOSkywalkInterface * interface ); + void checkOutReportingService( const IOService * service ); + void createReportersForService( IOService * service, const IOSkywalkInterface * interface ); + void removeReportersForService( const IOService * service ); + void addPoolReporter( IOService * service, OSSet * reportSet ); + OSSet * copyReportersForService( const IOService * service ); + UInt64 getReportChannelValue( UInt64 reportChannel ); + + virtual IOReturn allocatePacket( UInt32, IOSkywalkPacket ** outPacket, IOOptionBits options ); + virtual IOReturn allocatePackets( UInt32, UInt32 *, IOSkywalkPacket ** outPackets, IOOptionBits options ); + virtual IOReturn deallocatePacket( IOSkywalkPacket * packet ); + virtual IOReturn deallocatePackets( IOSkywalkPacket ** packets, uint32_t packetsCount ); + virtual IOReturn deallocatePacketChain( UInt64 ); + virtual IOReturn allocatePacketBuffer( IOSkywalkPacketBuffer **, UInt32 ); + virtual IOReturn allocatePacketBuffers( UInt32 *, IOSkywalkPacketBuffer **, UInt32 ); + virtual IOReturn deallocatePacketBuffer( IOSkywalkPacketBuffer * buffer ); + virtual IOReturn deallocatePacketBuffers( IOSkywalkPacketBuffer ** buffers, uint32_t buffersCount ); + + virtual IOReturn newPacket( IOSkywalkPacketDescriptor * desc, IOSkywalkPacket ** outPacket ); + virtual IOReturn newPacketBuffer( IOSkywalkPacketBufferDescriptor * desc, IOSkywalkPacketBuffer ** outBuffer ); + virtual IOReturn newMemorySegment( IOSkywalkMemorySegmentDescriptor * desc, IOSkywalkMemorySegment ** outSegment ); + +protected: + void * mRefCon; // 16 + struct kern_pbufpool * mPbufPool; // 24 + OSObject * mProvider; // 32 + + UInt32 mPacketCount; // 40 + UInt32 mBufferCount; // 44 + UInt32 mBufferSize; // 48 + UInt32 mMaxFragments; // 52 + UInt32 mSegmentCount; // 56 + UInt32 mPacketType; // 60 + UInt32 mSegmentSize; // 64 + UInt32 mBuffersPerSegment; // 68 + UInt32 mPoolFlags; // 72 + + uint64_t _reserved; // 80 + IOSkywalkMemorySegment * mMemSegment; // 88 + OSArray * mPacketArray; // 96 + OSArray * mSegmentArray; // 104 + uint64_t _reserved2; // 112 + SegmentStats * mSegmentStats; // 120 + + IOLock * mSetLock; // 128 - protect the OSSets + OSSet * mPacketQueueSet; // 136 + OSString * mPoolName; // 144 + OSSet * mReporterSet; // 152 + OSSet * mReportingServiceSet; // 160 + thread_call_t mReportingChangeNotificationThread; // 168 + bool mSingleMemorySemgent; // 176 + bool mPersistentMemory; // 177 + bool mSegmentBuffersWithSubRange; // 178 + bool mDisposed; // 179 +}; + +#endif diff --git a/Headers/IOKit/skywalk/IOSkywalkTypes.h b/Headers/IOKit/skywalk/IOSkywalkTypes.h new file mode 100644 index 00000000..411a295d --- /dev/null +++ b/Headers/IOKit/skywalk/IOSkywalkTypes.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2019-2020 Apple, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOSKYWALKTYPES_H +#define _IOSKYWALKTYPES_H + +#include + +typedef uint32_t IOSkywalkNetworkLinkStatus; +enum +{ + kIOSkywalkNetworkLinkStatusInvalid = 0x00000000, + kIOSkywalkNetworkLinkStatusInactive = 0x00000001, + kIOSkywalkNetworkLinkStatusActive = 0x00000003, + kIOSkywalkNetworkLinkStatusWakeSameNet = 0x00000004 +}; + +typedef uint32_t IOSkywalkNetworkLinkQuality; +enum +{ + kIOSkywalkNetworkLinkQualityOff = (-2), + kIOSkywalkNetworkLinkQualityUnknown = (-1), + kIOSkywalkNetworkLinkQualityBad = 10, + kIOSkywalkNetworkLinkQualityPoor = 50, + kIOSkywalkNetworkLinkQualityGood = 100 +}; + +enum { + kIOSkywalkNetworkMediaOptionFullDuplex = 0x00100000, + kIOSkywalkNetworkMediaOptionHalfDuplex = 0x00200000, + kIOSkywalkNetworkMediaOptionFlowControl = 0x00400000, + kIOSkywalkNetworkMediaOptionEEE = 0x00800000, + kIOSkywalkNetworkMediaOptionLoopback = 0x08000000 +}; + +typedef uint32_t IOSkywalkNetworkMediaType; +enum +{ + kIOSkywalkNetworkMediaEthernetAuto = 0x00000020, + kIOSkywalkNetworkMediaEthernetManual = 0x00000021, + kIOSkywalkNetworkMediaEthernetNone = 0x00000022, + kIOSkywalkNetworkMediaEthernet10BaseT = 0x00000023, + kIOSkywalkNetworkMediaEthernet10Base2 = 0x00000024, + kIOSkywalkNetworkMediaEthernet10Base5 = 0x00000025, + kIOSkywalkNetworkMediaEthernet100BaseTX = 0x00000026, + kIOSkywalkNetworkMediaEthernet100BaseFX = 0x00000027, + kIOSkywalkNetworkMediaEthernet100BaseT4 = 0x00000028, + kIOSkywalkNetworkMediaEthernet100BaseVG = 0x00000029, + kIOSkywalkNetworkMediaEthernet100BaseT2 = 0x0000002a, + kIOSkywalkNetworkMediaEthernet1000BaseSX = 0x0000002b, + kIOSkywalkNetworkMediaEthernet10BaseSTP = 0x0000002c, + kIOSkywalkNetworkMediaEthernet10BaseFL = 0x0000002d, + kIOSkywalkNetworkMediaEthernet1000BaseLX = 0x0000002e, + kIOSkywalkNetworkMediaEthernet1000BaseCX = 0x0000002f, + kIOSkywalkNetworkMediaEthernet1000BaseT = 0x00000030, + kIOSkywalkNetworkMediaEthernetHomePNA1 = 0x00000031, + kIOSkywalkNetworkMediaEthernet10GBaseSR = 0x00000032, + kIOSkywalkNetworkMediaEthernet10GBaseLR = 0x00000033, + kIOSkywalkNetworkMediaEthernet10GBaseCX4 = 0x00000034, + kIOSkywalkNetworkMediaEthernet10GBaseT = 0x00000035, + kIOSkywalkNetworkMediaEthernet2500BaseT = 0x00000036, + kIOSkywalkNetworkMediaEthernet5000BaseT = 0x00000037, + kIOSkywalkNetworkMediaEthernet1000BaseCX_SGMII = 0x00000038, + kIOSkywalkNetworkMediaEthernet1000BaseKX = 0x00000039, + kIOSkywalkNetworkMediaEthernet10GBaseKX4 = 0x0000003a, + kIOSkywalkNetworkMediaEthernet10GBaseKR = 0x0000003b, + kIOSkywalkNetworkMediaEthernet10GBaseCR1 = 0x0000003c, + kIOSkywalkNetworkMediaEthernet10GBaseER = 0x0000003d, + kIOSkywalkNetworkMediaEthernet20GBaseKR2 = 0x0000003e, + kIOSkywalkNetworkMediaEthernet25GBaseCR = 0x0000003f, + kIOSkywalkNetworkMediaEthernet25GBaseKR = 0x00000820, + kIOSkywalkNetworkMediaEthernet25GBaseSR = 0x00000821, + kIOSkywalkNetworkMediaEthernet25GBaseLR = 0x00000822, + kIOSkywalkNetworkMediaEthernet40GBaseCR4 = 0x00000823, + kIOSkywalkNetworkMediaEthernet40GBaseSR4 = 0x00000824, + kIOSkywalkNetworkMediaEthernet40GBaseLR4 = 0x00000825, + kIOSkywalkNetworkMediaEthernet40GBaseKR4 = 0x00000826, + kIOSkywalkNetworkMediaEthernet50GBaseCR2 = 0x00000827, + kIOSkywalkNetworkMediaEthernet50GBaseKR2 = 0x00000828, + kIOSkywalkNetworkMediaEthernet50GBaseSR2 = 0x00000829, + kIOSkywalkNetworkMediaEthernet50GBaseLR2 = 0x0000082a, + kIOSkywalkNetworkMediaEthernet56GBaseR4 = 0x0000082b, + kIOSkywalkNetworkMediaEthernet100GBaseCR4 = 0x0000082c, + kIOSkywalkNetworkMediaEthernet100GBaseSR4 = 0x0000082d, + kIOSkywalkNetworkMediaEthernet100GBaseKR4 = 0x0000082e, + kIOSkywalkNetworkMediaEthernet100GBaseLR4 = 0x0000082f, + kIOSkywalkNetworkMediaEthernetMask = 0x00000fff +}; + +enum +{ + kIOSkywalkNetworkFeatureFlagSoftwareVlan = 0x00020000, + kIOSkywalkNetworkFeatureFlagWOMP = 0x04000000, + kIOSkywalkNetworkFeatureFlagNicProxy = 0x08000000 +}; + +#endif diff --git a/Headers/corecapture/CCCapture.h b/Headers/corecapture/CCCapture.h new file mode 100644 index 00000000..124aa20f --- /dev/null +++ b/Headers/corecapture/CCCapture.h @@ -0,0 +1,63 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CCCAPTURE_H +#define _CCCAPTURE_H + +#include + +struct CCTimestamp +{ + clock_sec_t secs; + clock_usec_t microsecs; +}; + +class CCCapture : public IOService +{ + OSDeclareDefaultStructors( CCCapture ) + +public: + static CCCapture * withProvider( IOService * provider ); + virtual bool initWithProvider( IOService * provider ); + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach( IOService * provider ) APPLE_KEXT_OVERRIDE; + + bool startPipe(); + +protected: + IOService * mProvider; +}; + +#endif diff --git a/Headers/corecapture/CCDataPipe.h b/Headers/corecapture/CCDataPipe.h new file mode 100644 index 00000000..e69de29b diff --git a/Headers/corecapture/CCDataPipeBlob.h b/Headers/corecapture/CCDataPipeBlob.h new file mode 100644 index 00000000..dd2ad64d --- /dev/null +++ b/Headers/corecapture/CCDataPipeBlob.h @@ -0,0 +1,59 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CCDATAPIPEBLOB_H +#define _CCDATAPIPEBLOB_H + +class CCDataPipeBlob : public OSObject +{ + // default +}; // 88 + +#endif + +/* +CCDataPipeBlob::copyBufferToUser(ulong long,ulong,ulong) __text 000000000000529E 00000063 00000028 00000000 R . . . . B T . +CCDataPipeBlob::free(void) __text 0000000000005230 0000005D 00000010 00000000 R . . . . B T . +CCDataPipeBlob::getBuffer(void) __text 000000000000528E 00000008 00000008 00000000 R . . . . B T . +CCDataPipeBlob::getBufferLength(void) __text 0000000000005296 00000008 00000008 00000000 R . . . . B T . + +CCDataPipeBlobOD::MetaClass::alloc(void) __text 0000000000005502 00000040 00000018 00000000 R . . . . B T . +CCDataPipeBlobOD::free(void) __text 0000000000005486 0000002E 00000010 00000000 R . . . . B T . +CCDataPipeBlobOD::getBuffer(void) __text 00000000000054B4 0000001B 00000008 00000000 R . . . . B T . +CCDataPipeBlobOD::getBufferLength(void) __text 00000000000054D0 0000001E 00000008 00000000 R . . . . B T . + +CCDataPipeBlobOS::MetaClass::alloc(void) __text 000000000000540C 00000040 00000018 00000000 R . . . . B T . +CCDataPipeBlobOS::free(void) __text 0000000000005390 0000002E 00000010 00000000 R . . . . B T . +CCDataPipeBlobOS::getBuffer(void) __text 00000000000053BE 0000001B 00000008 00000000 R . . . . B T . +CCDataPipeBlobOS::getBufferLength(void) __text 00000000000053DA 0000001E 00000008 00000000 R . . . . B T . +*/ diff --git a/Headers/corecapture/CCDataSession.h b/Headers/corecapture/CCDataSession.h new file mode 100644 index 00000000..28142261 --- /dev/null +++ b/Headers/corecapture/CCDataSession.h @@ -0,0 +1,54 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CCDATASESSION_H +#define _CCDATASESSION_H + +#include + +class CCDataSession : public OSObject +{ + OSDeclareDefaultStructors( CCDataSession ) + +public: + CCDataSession * withNameAndTimestamp( const char * name, CCTimestamp timestamp ); + bool initWithNameAndTimestamp( const char * name, CCTimestamp timestamp ); + virtual void free() APPLE_KEXT_OVERRIDE; + +protected: + CCTimestamp mTimestamp; + OSString * mSessionName; +}; + +#endif + diff --git a/Headers/corecapture/CCLogPipe.h b/Headers/corecapture/CCLogPipe.h new file mode 100644 index 00000000..1cc22611 --- /dev/null +++ b/Headers/corecapture/CCLogPipe.h @@ -0,0 +1,39 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CCLOGPIPE_H +#define _CCLOGPIPE_H + +#include + +#endif diff --git a/Headers/corecapture/CCPipe.h b/Headers/corecapture/CCPipe.h new file mode 100644 index 00000000..f8ad61d3 --- /dev/null +++ b/Headers/corecapture/CCPipe.h @@ -0,0 +1,121 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CCPIPE_H +#define _CCPIPE_H + +#include + +struct CCPipeOptions +{ + UInt32 pipeType; // 0 + UInt32 logType; // 4 + UInt32 logDataType; // 8 + UInt32 logPolicy; // 12 + UInt64 pipeSize; // 16 + UInt64 minLogSizeToNotify; // 24 + UInt32 notifyThresold; // 32 + char fileName[0x100]; // 36 + char logIdentifier[0x100]; // 292 + UInt32 logSize; // 548 + UInt32 numFiles; // 552 + // 560, q, 216 + // 568, q, 224 + UInt32 fileOptions; // 576 + char directoryName[0x100]; // 580 + // 836, d, 256 + // 840, d, 260 + // 844, d, 264 +}; + +class IOSimpleReporter; + +class CCPipe : public IOService +{ + OSDeclareAbstractStructors( CCPipe ) + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + virtual void detach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual IOReturn configureReport( IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport( IOReportChannelList * channels, IOReportUpdateAction action, void * result, void * destination ) APPLE_KEXT_OVERRIDE; + bool createReportSet(); + IOReturn createReportersAndLegend( const char * pipeName ); + void destroyReporters(); + + void publishStatistics(); + void updateStatistics( bool ); + + virtual bool startPipe(); + virtual void stopPipe(); + virtual UInt32 generateStreamId(); + + virtual void clientClose() = 0; + virtual bool isClientConnected() = 0; + + virtual void removeCapture(); + virtual void profileLoaded(); + virtual void profileRemoved(); + + static void ensureValidTimestamp( CCTimestamp * timestamp ); + + virtual IOReturn capture( CCTimestamp * timestamp, const char * str ) = 0; + virtual IOReturn capture( CCTimestamp timestamp, const char * str ) = 0; + + void capturePipesUnder( IOService * owner, CCTimestamp timestamp, const char * str ); + void capturePipesWithOwner( const char * ownerName, CCTimestamp timestamp, const char * str ); + + virtual void updateAllReports(); + CCPipe * withOwnerNameCapacity( IOService * owner, const char * ownerName, const char * pipeName, const CCPipeOptions * options ); + virtual bool initWithOwnerNameCapacity( IOService * owner, const char * ownerName, const char * pipeName, const CCPipeOptions * options ); + virtual void addCapture(); + +protected: + static const IORegistryPlane * gCoreCapturePlane; + static const IORegistryEntry * kCoreCapturePlane; + + IOSimpleReporter * mPipeReporter; // 136 + IOService * mOwner; // 144 + UInt32 mStreamID; // 152 + bool pipeStarted; // 156 + // 160 + + CCCapture * mCaptureNub; // 248 + // 256 + + OSSet * mReporterSet; // 328 +}; + +// 336 + +#endif diff --git a/Headers/corecapture/CCStream.h b/Headers/corecapture/CCStream.h new file mode 100644 index 00000000..253f8792 --- /dev/null +++ b/Headers/corecapture/CCStream.h @@ -0,0 +1,51 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CCSTREAM_H +#define _CCSTREAM_H + +enum CCStreamLogLevel +{ + kCCStreamLogLevelEmergency = 0x00, + kCCStreamLogLevelAlert = 0x01, + kCCStreamLogLevelCrit = 0x02, + kCCStreamLogLevelWarn = 0x03, + kCCStreamLogLevelNotice = 0x04, + kCCStreamLogLevelInfo = 0x05, + kCCStreamLogLevelDebug = 0x06, + kCCStreamLogLevelSpam = 0x07, + kCCStreamLogLevelUnspecified = 0x7F, + kCCStreamLogLevelUnknown = 0xFF +}; + +#endif diff --git a/README.md b/README.md index 34b9eddc..c67edb73 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,9 @@ To compile for 32-bit you will need to add a set of flags in your project: - KDP (`kdp/kdp_support.h`) - NKE private APIs (`IOKit/network`) - IOUSBFamily from macOS 10.10 SDK - - IO80211Family from Black80211 originally created by Roman Peshkov + - CoreCapture Framework by cjiang (`corecapture`) + - IOSkywalkFamily by cjiang (`IOKit/skywalk`) + - IO80211Family by cjiang (`IOKit/80211`) - IOBluetoothFamily by cjiang (`IOKit/bluetooth`) - Added kmod targeting earlier macOS kernels: - 10.6 64-bit or newer (`Library/x86_64/libkmod.a`)