static CFStringRef pollCurrentNAP (struct service *serv, Boolean *wifiErr) { CFDataRef napDataRef = NULL; CFStringRef nap = NULL; char *interface_buf; CFStringRef interfName = NULL; Apple80211Err err = kA11NoErr; int state; SCLog(TRUE, LOG_INFO, CFSTR("%s:"), __FUNCTION__); // get interface info interface_buf = getVPNInterfaceBuf(serv); // setup update notification (if not already) if (!serv->connection_nap_monitor) { interfName = copyVPNInterfaceName(serv); if (!interfName) { SCLog(TRUE, LOG_INFO, CFSTR("%s: failed to get CF interface name for %s"), __FUNCTION__, interface_buf? interface_buf : "null"); goto init_failed; } err = Apple80211Open((Apple80211Ref *)&serv->connection_nap_monitor); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211Open failed"), __FUNCTION__); *wifiErr = true; goto init_failed; } err = Apple80211BindToInterface((Apple80211Ref)serv->connection_nap_monitor, interfName); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211BindToInterface(%@) failed"), __FUNCTION__, interfName); *wifiErr = true; goto init_failed; } err = Apple80211EventMonitoringInit((Apple80211Ref)serv->connection_nap_monitor, monitorApple80211Callback, (void*)serv, CFRunLoopGetCurrent()); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211EventMonitoringInit(%@) failed, %d"), __FUNCTION__, interfName, err); goto init_failed; } err = Apple80211StartMonitoringEvent((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_M_SSID_CHANGED); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211StartMonitoringEvent(%@) failed, %d"), __FUNCTION__, interfName, err); goto init_failed; } } // get current state err = Apple80211Get((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_IOC_STATE, 0, &state, sizeof(state)); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) failed, err = %d"), __FUNCTION__, interfName, err); *wifiErr = true; goto done; } if (state != APPLE80211_S_ASSOC && state != APPLE80211_S_RUN) { if (state > APPLE80211_S_INIT) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) got invalid state = %d."), __FUNCTION__, interfName, state, WAIT_SSID_TIMEOUT); } goto done; } else { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) got valid state = %d"), __FUNCTION__, interfName, state); } err = Apple80211CopyValue((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_IOC_SSID, NULL, &napDataRef); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211CopyValue(%@, SSID) failed, err = %d"), __FUNCTION__, interfName, err); *wifiErr = true; goto done; } nap = CFStringCreateWithBytes(kCFAllocatorDefault, CFDataGetBytePtr(napDataRef), CFDataGetLength(napDataRef), kCFStringEncodingUTF8, false); SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211CopyValue(%@, SSID) got %@"), __FUNCTION__, interfName, nap); if (napDataRef) { CFRelease(napDataRef); } if (interfName) { CFRelease(interfName); } return nap; init_failed: if (serv->connection_nap_monitor) { Apple80211Close((Apple80211Ref)serv->connection_nap_monitor); serv->connection_nap_monitor = NULL; } done: if (nap) { CFRelease(nap); } if (napDataRef) { CFRelease(napDataRef); } if (interfName) { CFRelease(interfName); } return NULL; }
boolean_t wireless_scan(wireless_t this_wref, CFStringRef ssid, int num_scans, wireless_scan_callback_t func, void * arg) { scanCallbackEntryRef callback; Apple80211Err error; bool ret = TRUE; CFDictionaryRef scan_args; Apple80211Ref wref = (Apple80211Ref)this_wref; EAPLOG(LOG_ERR, "######## DEBUG ####### - FAIL - wireless_scan"); if (ssid == NULL || func == NULL) { EAPLOG(LOG_ERR, "%s: ssid and/or func NULL\n", __FUNCTION__); return (FALSE); } callback = scanCallbackEntryFind(wref); if (callback == NULL) { #ifdef APPLE80211KEY_SCAN_BSSID_LIST error = Apple80211EventMonitoringInit(wref, scanCallbackEvent, NULL, CFRunLoopGetCurrent()); #else /* APPLE80211KEY_SCAN_BSSID_LIST */ error = Apple80211EventMonitoringInit(wref, scanCallbackEvent, NULL); #endif /* APPLE80211KEY_SCAN_BSSID_LIST */ if (error != kA11NoErr) { EAPLOG(LOG_ERR, "%s: Apple80211EventMonitoringInit failed, %d\n", __FUNCTION__, error); ret = FALSE; goto done; } error = Apple80211StartMonitoringEvent(wref, APPLE80211_M_SCAN_DONE); if (error != kA11NoErr) { (void)Apple80211EventMonitoringHalt(wref); EAPLOG(LOG_ERR, "%s: Apple80211StartMonitoringEvent failed, %d\n", __FUNCTION__, error); ret = FALSE; goto done; } /* create a callback entry, and add it to the list */ callback = (scanCallbackEntryRef)malloc(sizeof(*callback)); bzero(callback, sizeof(*callback)); callback->wref = wref; callback->ssid = CFRetain(ssid); TAILQ_INSERT_TAIL(S_scanCallbackHead_p, callback, link); } else if (!CFEqual(callback->ssid, ssid)) { CFRetain(ssid); CFRelease(callback->ssid); callback->ssid = ssid; callback->state = kScanCallbackStateNone; } callback->func = func; callback->arg = arg; if (callback->state == kScanCallbackStateStarted) { /* there's already a scan for this SSID pending */ EAPLOG(LOG_ERR, "%s: scan already in progress\n", __FUNCTION__); goto done; } scan_args = make_scan_args(ssid, num_scans); error = Apple80211ScanAsync((Apple80211Ref)wref, scan_args); CFRelease(scan_args); if (error != kA11NoErr) { EAPLOG(LOG_ERR, "%s: Apple80211ScanAsync failed, %d\n", __FUNCTION__, error); goto done; } callback->state = kScanCallbackStateStarted; done: return (ret); }
static CFStringRef copyCurrentNAPFromStore (struct service *serv) { CFStringRef nap; char *interface_buf; CFStringRef interfName = NULL; Apple80211Err err = kA11NoErr; SCLog(TRUE, LOG_INFO, CFSTR("%s:"), __FUNCTION__); // get interface info interface_buf = getVPNInterfaceBuf(serv); nap = copyVPNInterfaceNAP(interface_buf); if (!nap) { return NULL; } // setup update notification (if not already) if (!serv->connection_nap_monitor) { interfName = copyVPNInterfaceName(serv); if (!interfName) { SCLog(TRUE, LOG_INFO, CFSTR("%s: failed to get CF interface name for %s"), __FUNCTION__, interface_buf? interface_buf : "null"); goto init_failed; } err = Apple80211Open((Apple80211Ref *)&serv->connection_nap_monitor); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211Open failed"), __FUNCTION__); goto init_failed; } err = Apple80211BindToInterface((Apple80211Ref)serv->connection_nap_monitor, interfName); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211BindToInterface(%@) failed"), __FUNCTION__, interfName); goto init_failed; } err = Apple80211EventMonitoringInit((Apple80211Ref)serv->connection_nap_monitor, monitorApple80211Callback, (void*)serv, CFRunLoopGetCurrent()); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211EventMonitoringInit(%@) failed, %d"), __FUNCTION__, interfName, err); goto init_failed; } err = Apple80211StartMonitoringEvent((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_M_SSID_CHANGED); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211StartMonitoringEvent(%@) failed, %d"), __FUNCTION__, interfName, err); goto init_failed; } } if (interfName) { CFRelease(interfName); } return nap; init_failed: if (serv->connection_nap_monitor) { Apple80211Close((Apple80211Ref)serv->connection_nap_monitor); serv->connection_nap_monitor = NULL; } if (interfName) { CFRelease(interfName); } return nap; }