18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef APPLE80211_H
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define APPLE80211_H
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Apple80211 framework definitions
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This is an undocumented interface and the definitions here are based on
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * information from MacStumbler (http://www.macstumbler.com/Apple80211.h) and
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * whatever related information can be found with google and experiments ;-).
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef struct __WirelessRef *WirelessRef;
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef SInt32 WirelessError;
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define errWirelessNoError 0
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef struct WirelessInfo {
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 link_qual;
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 comms_qual;
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 signal;
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 noise;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 port_stat;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 client_mode;
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 res1;
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 power;
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 res2;
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt8 bssID[6];
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt8 ssid[34];
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} WirelessInfo;
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef struct WirelessInfo2 {
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* TODO - these are probably not in correct order or complete */
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WirelessInfo info1;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt8 macAddress[6];
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} WirelessInfo2;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef struct WirelessNetworkInfo {
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 channel;
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 noise;
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 signal;
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt8 bssid[6];
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 beacon_int;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 capability;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt16 ssid_len;
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	UInt8 ssid[32];
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} WirelessNetworkInfo;
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef int wirelessKeyType; /* TODO */
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint WirelessIsAvailable(void);
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessAttach(WirelessRef *ref, UInt32 res);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessDetach(WirelessRef ref);
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessPrivate(WirelessRef ref, void *in_ptr, int in_bytes,
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      void *out_ptr, int out_bytes);
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessSetEnabled(WirelessRef ref, UInt8 enabled);
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessGetEnabled(WirelessRef ref, UInt8 *enabled);
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessSetPower(WirelessRef ref, UInt8 power);
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessGetPower(WirelessRef ref, UInt8 *power);
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessGetInfo(WirelessRef ref, WirelessInfo *info);
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessGetInfo2(WirelessRef ref, WirelessInfo2 *info);
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessScan(WirelessRef ref, CFArrayRef *results,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   UInt32 strip_dups);
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessScanSplit(WirelessRef ref, CFArrayRef *ap_results,
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				CFArrayRef *ibss_results, UInt32 strip_dups);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessDirectedScan(WirelessRef ref, CFArrayRef *results,
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   UInt32 strip_dups, CFStringRef ssid);
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessDirectedScan2(WirelessRef ref, CFDataRef ssid,
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    UInt32 strip_dups, CFArrayRef *results);
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessJoin(WirelessRef ref, CFStringRef ssid);
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessJoinWEP(WirelessRef ref, CFStringRef ssid,
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      CFStringRef passwd);
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessJoin8021x(WirelessRef ref, CFStringRef ssid);
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Set WEP key
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ref: wireless reference from WirelessAttach()
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * type: ?
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * key_idx: 0..3
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * key_len: 13 for WEP-104 or 0 for clearing the key
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * key: Pointer to the key or %NULL if key_len = 0
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessSetKey(WirelessRef ref, wirelessKeyType type,
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     int key_idx, int key_len,
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     const unsigned char *key);
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Set WPA key (e.g., PMK for 4-way handshake)
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ref: wireless reference from WirelessAttach()
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * type: 0..4; 1 = PMK
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * key_len: 16, 32, or 0
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * key: Pointer to the key or %NULL if key_len = 0
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessSetWPAKey(WirelessRef ref, wirelessKeyType type,
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				int key_len, const unsigned char *key);
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessAssociate(WirelessRef ref, int type, CFDataRef ssid,
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				CFStringRef key);
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessAssociate2(WirelessRef ref, CFDictionaryRef scan_res,
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 CFStringRef key);
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessDisassociate(WirelessRef ref);
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Get a copy of scan results for the given SSID
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The returned dictionary includes following entries:
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * beaconInterval: CFNumber(kCFNumberSInt32Type)
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * SSID: CFData buffer of the SSID
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * isWPA: CFNumber(kCFNumberSInt32Type); 0 = not used, 1 = WPA, -128 = WPA2
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * name: Name of the network (SSID string)
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * BSSID: CFData buffer of the BSSID
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * channel: CFNumber(kCFNumberSInt32Type)
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * signal: CFNumber(kCFNumberSInt32Type)
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * appleIE: CFData
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPSNOPINRequired: CFBoolean
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * noise: CFNumber(kCFNumberSInt32Type)
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * capability: CFNumber(kCFNumberSInt32Type)
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * uniCipher: CFArray of CFNumber(kCFNumberSInt32Type)
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * appleIE_Version: CFNumber(kCFNumberSInt32Type)
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * appleIE_Robust: CFBoolean
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPSConfigured: CFBoolean
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * scanWasDirected: CFBoolean
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * appleIE_Product: CFNumber(kCFNumberSInt32Type)
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authModes: CFArray of CFNumber(kCFNumberSInt32Type)
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * multiCipher: CFNumber(kCFNumberSInt32Type)
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCFDictionaryRef WirelessSafeDirectedScanCopy(WirelessRef ref, CFDataRef ssid);
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Get information about the current association
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The returned dictionary includes following entries:
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * keyData: CFData buffer of the key (e.g., 32-octet PSK)
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * multiCipher: CFNumber(kCFNumberSInt32Type); 0 = none, 5 = CCMP?
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * channel: CFNumber(kCFNumberSInt32Type)
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * isIBSS: CFBoolean
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authMode: CFNumber(kCFNumberSInt32Type); 2 = WPA-Personal; 3 = open,
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *	129 = WPA2-Enterprise
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * isWPA: CFNumber(kCFNumberSInt32Type); 0 = not used, 1 = WPA, -128 == WPA2
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * SSID: CFData buffer of the SSID
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * cipherMode: CFNumber(kCFNumberSInt32Type); 0 = none, 4 = CCMP?
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCFDictionaryRef WirelessGetAssociationInfo(WirelessRef ref);
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWirelessError WirelessConfigure(WirelessRef ref);
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Get ASP information
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The returned dictionary includes following entries:
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Version: version number (e.g., 3.0)
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Channel: channel (e.g., 1)
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Vendor: vendor (e.g., 2)
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCFDictionaryRef WirelessGetInfoASP(void);
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Get a copy of the interface dictionary
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The returned dictionary has a key,value pairs for wireless interfaces.
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The key is the interface name and the value is the driver identifier, e.g.,
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * en1: com.apple.driver.AirPort.Atheros
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCFDictionaryRef WirelessCopyInterfaceDict(void);
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* APPLE80211_H */
157