Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}