/* * Apple80211.h * * This is the reverse engineered header for the Apple80211 private framework. * The framework can be found at /System/Library/PrivateFrameworks/Apple80211.framework. * Linking with Apple80211.framework requires CoreFoundation.framework and AppKit.framework. * * Note that there is also information in the IORegistry, see * ioreg -c AirPortDriver -w 0 * * Contributors: * korben - korben@cox.net * jason - catalyst@mac.com * ragge - ragge@nada.kth.se * * Last updated by korben on 5/15/2002 */ /* ChangeLog: 2002-05-14 ragge Changed argument types and count to procedures Added WirelessScan Changed name of unknown field to beaconInterval Added error values and error return types 2002-05-15 korben Combined ragge's changes with jason's 2002-05-17 korben fixed adhoc and mangaged WINetworkInfoFlags per ragge's request Added WirelessEncrypt and WirelessKey declarations Updated WirelessJoinWEP and WirelessMakeIBSS comments regarding keys */ #ifndef __APPLE_80211__ #define __APPLE_80211__ #import /* A WirelessContext should be created using WirelessAttach before any other Wireless functions are called. WirelessDetach is used to dispose of a WirelessContext. */ typedef struct __WirelessContext *WirelessContextPtr; struct WirelessInfo { UInt16 link_qual; /* Link quality, percent? */ UInt16 comms_qual; /* Communication Quality */ UInt16 signal; /* Signal level */ UInt16 noise; /* Noise level */ UInt16 port_stat; /* HERMES_RID_PORTSTAT? (Uncertain about the meaning of this! 1=off? 2=connetion bad? 3=AdHoc Create? 4=BSS (Client)? 5=BSS+OutOfRange?) */ UInt16 client_mode; /* 1 = BSS, 4 = Create IBSS */ UInt16 u7; /* ? */ UInt16 power; /* Power on flag */ UInt16 u9; /* 0=bad?, 1=ok?, 2=wrong key? */ UInt8 macAddress[6]; /* MAC address of wireless access point. */ SInt8 name[34]; /* Name of current (or wanted?) network. */ }; typedef struct WirelessInfo WirelessInfo; /* I'm not sure what most of the values in the WirelessInfo structure are for, but here are some examples of the numbers returned: With Airport Off: 0 0 0 0 1 1 0 0 1 With Airport On: 72 22 31 9 4 1 0 1 1 With Computer to Computer Network: 0 0 0 0 3 4 0 1 1 - jason */ /* WINetworkInfoFlags are used in the WirelessNetworkInfo struct returned by the WirelessScanSplit function. I filled in the rest of this list from the netstumbler FAQ: http://www.netstumbler.com/modules.php?op=modload&name=FAQ&file=index&myfaq=yes&id_cat=1&categories=Official+NetStumbler+Version+0.3+FAQ These are aparrently also defined in section 7.3.1.4 of the 802.11b spec */ typedef UInt16 WINetworkInfoFlags; enum { kWINetworkManagedFlag = 0x0001, kWINetworkAdhocFlag = 0x0002, kWINetworkCFPollable = 0x0004, kWINetworkCFPollRequest = 0x0008, kWINetworkEncryptedFlag = 0x0010, kWINetworkShortPreamble = 0x0020, kWINetworkPBCC = 0x0040, kWINetworkChannelAgility = 0x0080, kWINetworkReserved = 0xFF00 }; typedef SInt32 WIErr; enum { airpParamErr = -2013261823, /* 0x88001001 */ airpNoIOServiceErr = -2013261822, /* 0x88001002 */ airpInternalErr = -2013261821, /* 0x88001003 */ airpUnk4Err = -2013261820, /* 0x88001004 */ airpOutOfMemErr = -2013261819, /* 0x88001005 */ airpInternal2Err = -2013261818, /* 0x88001006 */ airpUnk7Err = -2013261817, /* 0x88001007 */ airpUnk8Err = -2013261816, /* 0x88001008 */ airpUnk9Err = -2013261815, /* 0x88001009 */ airpUnkaErr = -2013261814, /* 0x8800100a */ airpNoPowerErr = -2013261813 /* 0x8800100b */ }; /* The meaning of these error codes can be wrong, and the list is not * complete. In general checking for noErr (0) should be enough */ struct WirelessNetworkInfo { UInt16 channel; /* Channel for the network. */ UInt16 noise; /* Noise for the network. 0 for Adhoc. */ UInt16 signal; /* Signal strength of the network. 0 for Adhoc. */ UInt8 macAddress[6]; /* MAC address of the wireless access point. */ UInt16 beaconInterval; /* beacon interval in milliseconds */ WINetworkInfoFlags flags; /* Flags for the network. */ UInt16 nameLen; SInt8 name[32]; }; typedef struct WirelessNetworkInfo WirelessNetworkInfo; typedef UInt8 WirelessKey[13]; // For use with WirelessEncrypt /* * WirelessIsAvailable() * * Returns 1 if a wireless interface is available, 0 otherwise */ extern int WirelessIsAvailable(void); /* * WirelessAttach() * * WirelessAttach should be called before all other Wireless functions. * * outContext returns the contextPtr you will pass * to all other Wireless functions * The second argument must be zero. */ extern WIErr WirelessAttach( WirelessContextPtr *outContext, const UInt32); /* * WirelessDetach() * * WirelessDetach is called after you are done calling Wireless functions. * It will free all memory being used by the library. * * inContext is the contextPtr you want to dispose of. */ extern WIErr WirelessDetach( WirelessContextPtr inContext); /* * WirelessGetPower() * * WirelessGetPower returns the power state of Airport. * * inContext is the contextPtr created by WirelessAttach. * outPower is 0 for off and 1 for on. */ extern WIErr WirelessGetPower( WirelessContextPtr inContext, UInt8 *outPower); /* * WirelessSetPower() * * WirelessSetPower will turn Airport on or off. * * inContext is the contextPtr created by WirelessAttach. * inPower is 0 for off and 1 for on. */ extern WIErr WirelessSetPower( WirelessContextPtr inContext, UInt8 inPower); /* * WirelessGetEnabled() * * WirelessGetEnabled could have returned the Enabled state of Airport, * but it seems to rather return the Power state. * * inContext is the contextPtr created by WirelessAttach. * outEnabled is 0 for off and 1 for on. */ extern WIErr WirelessGetEnabled( WirelessContextPtr inContext, UInt8 *outEnabled); /* * WirelessSetEnabled() * * WirelessSetEnabled will enable or disable Airport communication. * * inContext is the contextPtr created by WirelessAttach. * inEnabled is 0 for off and 1 for on. */ extern WIErr WirelessSetEnabled( WirelessContextPtr inContext, UInt32 inEnabled); /* * WirelessGetInfo() * * WirelessGetInfo returns info about the state * of the current wireless connection. * * inContext is the contextPtr created by WirelessAttach. * outInfo is a WirelessInfo structure containing state info. */ extern WIErr WirelessGetInfo( WirelessContextPtr inContext, WirelessInfo *outInfo); /* * WirelessScanSplit(), WirelessScan() * * WirelessScanSplit scans for available wireless networks. * It will allocate 2 CFArrays to store a list * of managed and adhoc networks. The arrays hold CFData * objects which contain WirelessNetworkInfo structures. * Note: An adhoc network created on the computer the * scan is running on will not be found. WirelessGetInfo * can be used to find info about a local adhoc network. * * inContext is the contextPtr created by WirelessAttach. * apList will contain a CFArrayRef of managed networks. * adhocList will contain a CFArrayRef of adhoc networks. * For example: * WirelessScanSplit(clientContext, &apList, &adhocList, 1) * * If stripDups != 0 only one basestation for each SSID will be returned * * WirelessScan works the same way but does not split the list by AP type */ extern WIErr WirelessScanSplit( WirelessContextPtr inContext, CFArrayRef *apList, CFArrayRef *adhocList, const UInt32 stripDups); extern WIErr WirelessScan( WirelessContextPtr inContext, CFArrayRef *apList, const UInt32 stripDups); /* * WirelessJoin() * * WirelessJoin is used to join a Wireless network. * * inContext is the contextPtr created by WirelessAttach. * inNetworkName is the name of the network to join. */ extern WIErr WirelessJoin( WirelessContextPtr inContext, CFStringRef inNetworkName); /* * WirelessJoinWEP() * * WirelessJoinWEP is used to join an encrypted network. * * inContext is the contextPtr created by WirelessAttach. * inNetworkName is the name of the network to join. * inNetworkPassword is the password/key of the network. * * inNetworkPassword description: * - Passwords are just a string of any length, they will be hashed into a key. * - Keys should be passed as a hex string, optionally beginning with 0x, * and must be either 10 digits for a 40bit key or 26 digits for a 104bit key, * or an ascii/binary representation of the key, 5 or 13 bytes long. * - It can also be the empty string, meaning no encryption. * * For more info see: * http://kbase.info.apple.com/cgi-bin/WebObjects/kbase.woa/11/wa/query?searchMode=Expert&type=id&val=KC.106424 */ extern WIErr WirelessJoinWEP( WirelessContextPtr inContext, CFStringRef inNetworkName, CFStringRef inNetworkPassword); /* * WirelessEncrypt * * WirelessEncrypt is called from WirelessJoinWEP and * WirelessMakeIBSS to translate a string into a 40 or * 104-bit Apple hashed WEP key. * Third argument is 0 for 40 bit key and 1 for 104 bit key. * * Sample usage: * * WirelessKey myKey; * WirelessEncrypt(@"password", &myKey, 1); * for(int i=0; i <= 12; i++) * printf("%.2X ", myKey[i]); * */ extern WIErr WirelessEncrypt( CFStringRef inNetworkPassword, WirelessKey *wepKey, const UInt32 use104bits); /* * WirelessGetChannels() * * WirelessGetChannels is used to get valid channels for * creating an adhoc network. * * inContext is the contextPtr created by WirelessAttach. * outChannelBitField contains a bit field of valid channels. * For example if 0x07FF is returned then bits 0 through 10 * are set, which means channels 1 through 11 are valid. */ extern WIErr WirelessGetChannels( WirelessContextPtr inContext, UInt16 *outChannelBitField); /* * WirelessGetBestChannel() * * WirelessGetBestChannel is used to get the best channel * for creating an adhoc network on. * * inContext is the contextPtr created by WirelessAttach. * outBestChannel is the best channel for a wireless network. */ extern WIErr WirelessGetBestChannel( WirelessContextPtr inContext, UInt16 *outBestChannel); /* * WirelessMakeIBSS() * * WirelessMakeIBSS is used to create a computer to computer * adhoc wireless network. * * inContext is the contextPtr created by WirelessAttach. * inNetworkName is the name of the network to create. * inNetworkPassword is the password/key for the new network. * inChannel is the wireless channel the network will use. * * inNetworkPassword description: * - Passwords are just a string of any length, they will be hashed into a key. * - Keys should be passed as a hex string, optionally beginning with 0x, * and must be either 10 digits for a 40bit key or 26 digits for a 104bit key. * - It can also be the empty string, meaning no encryption. * * For more info see: * http://kbase.info.apple.com/cgi-bin/WebObjects/kbase.woa/11/wa/query?searchMode=Expert&type=id&val=KC.106424 */ extern WIErr WirelessMakeIBSS( WirelessContextPtr inContex, CFStringRef inNetworkName, CFStringRef inNetworkPassword, UInt32 inChannel); /* * Get information from the Hermes chip. * * RIDno is the Hermes RID number for the data to get, as * 0xFC01 - HERMES_RID_CNFOWNMACADDR * 0xFC02 - HERMES_RID_CNFDESIREDSSID * 0xFDC1 - HERMES_RID_CURRENTCHANNEL * and so on. * Don't know why, but 0xF100 - HERMES_INQ_TALLIES works here too, * and a struct with the counters will be returned. (The data * returned seems to be lagging, though, call twice for fresh data.) */ extern WIErr WirelessHCF_GetInfo( WirelessContextPtr inContext, UInt16 RIDno, UInt32 outBufSize, void *outBuf); /* ***** MISSING FUNCTIONS ***** These functions are used to configure an Access Point (Base Station). Most of these are used by the Airport Admin Utility.app, and some like WirelessAP_GetStatus are even used by Internet Connect.app. - jason WirelessAP_BinaryCurrentVersion WirelessAP_BinaryCurrentVersion2 WirelessAP_BinaryIsCurrent WirelessAP_BinaryUpload WirelessAP_BinaryUploadACP WirelessAP_BinaryVersion WirelessAP_Dial WirelessAP_DialDynamic WirelessAP_Explore WirelessAP_ForceIPAddress WirelessAP_GetBridgeStatus WirelessAP_GetCommonVariables WirelessAP_GetCommonVariablesACP WirelessAP_GetFullStatus WirelessAP_GetModemVersion WirelessAP_GetModemVersionACP WirelessAP_GetStatus WirelessAP_GetType WirelessAP_GetVersion WirelessAP_Hangup WirelessAP_IsConnected WirelessAP_Read WirelessAP_ReadACP WirelessAP_ResetNVRAM WirelessAP_Restart WirelessAP_RestartACP WirelessAP_Write WirelessAP_WriteACP I can't find any apps that use these functions. - jason WirelessAccessPoint WirelessConfigure WirelessDownloadFW WirelessSetKey */ #endif // __APPLE_80211__