⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 events.c

📁 WPA在Linux下实现的原代码 WPA在Linux下实现的原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				continue;			}			if (wpa_supplicant_ssid_bss_match(ssid, bss)) {				selected = bss;				*selected_ssid = ssid;				break;			}		}	}	/* If no WPA-enabled AP found, try to find non-WPA AP, if configuration	 * allows this. */	for (i = 0; i < num && !selected; i++) {		bss = &results[i];		if ((e = wpa_blacklist_get(wpa_s, bss->bssid)) &&		    e->count > 1) {			continue;		}		for (ssid = group; ssid; ssid = ssid->pnext) {			if (!ssid->disabled &&			    (ssid->ssid_len == 0 ||			     (bss->ssid_len == ssid->ssid_len &&			      memcmp(bss->ssid, ssid->ssid, bss->ssid_len) ==			      0)) &&			    (!ssid->bssid_set ||			     memcmp(bss->bssid, ssid->bssid, ETH_ALEN) == 0) &&			    ((ssid->key_mgmt & WPA_KEY_MGMT_NONE) ||			     (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA))			    &&			    (!(ssid->key_mgmt &			       (WPA_KEY_MGMT_IEEE8021X | WPA_KEY_MGMT_PSK)) ||			     (bss->wpa_ie_len == 0 && bss->rsn_ie_len == 0)) &&			    wpa_supplicant_match_privacy(bss, ssid) &&			    !(bss->caps & IEEE80211_CAP_IBSS))			{				selected = bss;				*selected_ssid = ssid;				wpa_printf(MSG_DEBUG, "   selected non-WPA AP "					   MACSTR " ssid='%s'",					   MAC2STR(bss->bssid),					   wpa_ssid_txt(bss->ssid,							bss->ssid_len));				break;			}		}	}	return selected;}static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s){	int num, prio;	struct wpa_scan_result *selected = NULL;	struct wpa_ssid *ssid = NULL;	struct wpa_scan_result *results;	if (wpa_supplicant_get_scan_results(wpa_s) < 0) {		if (wpa_s->conf->ap_scan == 2)			return;		wpa_printf(MSG_DEBUG, "Failed to get scan results - try "			   "scanning again");		wpa_supplicant_req_scan(wpa_s, 1, 0);		return;	}	if (wpa_s->conf->ap_scan == 2 || wpa_s->disconnected)		return;	results = wpa_s->scan_results;	num = wpa_s->num_scan_results;	while (selected == NULL) {		for (prio = 0; prio < wpa_s->conf->num_prio; prio++) {			selected = wpa_supplicant_select_bss(				wpa_s, wpa_s->conf->pssid[prio], results, num,				&ssid);			if (selected)				break;		}		if (selected == NULL && wpa_s->blacklist) {			wpa_printf(MSG_DEBUG, "No APs found - clear blacklist "				   "and try again");			wpa_blacklist_clear(wpa_s);		} else if (selected == NULL) {			break;		}	}	if (selected) {		if (wpa_s->reassociate ||		    memcmp(selected->bssid, wpa_s->bssid, ETH_ALEN) != 0) {			if (wpa_supplicant_scard_init(wpa_s, ssid)) {				wpa_supplicant_req_scan(wpa_s, 10, 0);				return;			}			wpa_supplicant_associate(wpa_s, selected, ssid);		} else {			wpa_printf(MSG_DEBUG, "Already associated with the "				   "selected AP.");		}		rsn_preauth_scan_results(wpa_s->wpa, results, num);	} else {		wpa_printf(MSG_DEBUG, "No suitable AP found.");		wpa_supplicant_req_scan(wpa_s, 5, 0);	}}static void wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s,					   union wpa_event_data *data){	int l, len, found = 0, wpa_found, rsn_found;	u8 *p;	wpa_printf(MSG_DEBUG, "Association info event");	if (data->assoc_info.req_ies)		wpa_hexdump(MSG_DEBUG, "req_ies", data->assoc_info.req_ies,			    data->assoc_info.req_ies_len);	if (data->assoc_info.resp_ies)		wpa_hexdump(MSG_DEBUG, "resp_ies", data->assoc_info.resp_ies,			    data->assoc_info.resp_ies_len);	if (data->assoc_info.beacon_ies)		wpa_hexdump(MSG_DEBUG, "beacon_ies",			    data->assoc_info.beacon_ies,			    data->assoc_info.beacon_ies_len);	p = data->assoc_info.req_ies;	l = data->assoc_info.req_ies_len;	/* Go through the IEs and make a copy of the WPA/RSN IE, if present. */	while (p && l >= 2) {		len = p[1] + 2;		if (len > l) {			wpa_hexdump(MSG_DEBUG, "Truncated IE in assoc_info",				    p, l);			break;		}		if ((p[0] == GENERIC_INFO_ELEM && p[1] >= 6 &&		     (memcmp(&p[2], "\x00\x50\xF2\x01\x01\x00", 6) == 0)) ||		    (p[0] == RSN_INFO_ELEM && p[1] >= 2)) {			if (wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, p, len))				break;			found = 1;			wpa_find_assoc_pmkid(wpa_s);			break;		}		l -= len;		p += len;	}	if (!found && data->assoc_info.req_ies)		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);	/* WPA/RSN IE from Beacon/ProbeResp */	p = data->assoc_info.beacon_ies;	l = data->assoc_info.beacon_ies_len;	/* Go through the IEs and make a copy of the WPA/RSN IEs, if present.	 */	wpa_found = rsn_found = 0;	while (p && l >= 2) {		len = p[1] + 2;		if (len > l) {			wpa_hexdump(MSG_DEBUG, "Truncated IE in beacon_ies",				    p, l);			break;		}		if (!wpa_found &&		    p[0] == GENERIC_INFO_ELEM && p[1] >= 6 &&		    memcmp(&p[2], "\x00\x50\xF2\x01\x01\x00", 6) == 0) {			wpa_found = 1;			wpa_sm_set_ap_wpa_ie(wpa_s->wpa, p, len);		}		if (!rsn_found &&		    p[0] == RSN_INFO_ELEM && p[1] >= 2) {			rsn_found = 1;			wpa_sm_set_ap_rsn_ie(wpa_s->wpa, p, len);		}		l -= len;		p += len;	}	if (!wpa_found && data->assoc_info.beacon_ies)		wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);	if (!rsn_found && data->assoc_info.beacon_ies)		wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);}static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,				       union wpa_event_data *data){	u8 bssid[ETH_ALEN];	if (data)		wpa_supplicant_event_associnfo(wpa_s, data);	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATED);	if (wpa_drv_get_bssid(wpa_s, bssid) >= 0 &&	    memcmp(bssid, wpa_s->bssid, ETH_ALEN) != 0) {		wpa_msg(wpa_s, MSG_DEBUG, "Associated to a new BSS: BSSID="			MACSTR, MAC2STR(bssid));		memcpy(wpa_s->bssid, bssid, ETH_ALEN);		if (wpa_supplicant_dynamic_keys(wpa_s)) {			wpa_clear_keys(wpa_s, bssid);		}		if (wpa_supplicant_select_config(wpa_s) < 0) {			wpa_supplicant_disassociate(wpa_s,						    REASON_DEAUTH_LEAVING);			return;		}	}	wpa_msg(wpa_s, MSG_INFO, "Associated with " MACSTR, MAC2STR(bssid));	if (wpa_s->current_ssid) {		/* When using scanning (ap_scan=1), SIM PC/SC interface can be		 * initialized before association, but for other modes,		 * initialize PC/SC here, if the current configuration needs		 * smartcard or SIM/USIM. */		wpa_supplicant_scard_init(wpa_s, wpa_s->current_ssid);	}	wpa_sm_notify_assoc(wpa_s->wpa, bssid);	l2_packet_notify_auth_start(wpa_s->l2);	/*	 * Set portEnabled first to FALSE in order to get EAP state machine out	 * of the SUCCESS state and eapSuccess cleared. Without this, EAPOL PAE	 * state machine may transit to AUTHENTICATING state based on obsolete	 * eapSuccess and then trigger BE_AUTH to SUCCESS and PAE to	 * AUTHENTICATED without ever giving chance to EAP state machine to	 * reset the state.	 */	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);	if (wpa_s->key_mgmt == WPA_KEY_MGMT_PSK)		eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);	/* 802.1X::portControl = Auto */	eapol_sm_notify_portEnabled(wpa_s->eapol, TRUE);	wpa_s->eapol_received = 0;	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {		wpa_supplicant_cancel_auth_timeout(wpa_s);		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);	} else {		/* Timeout for receiving the first EAPOL packet */		wpa_supplicant_req_auth_timeout(wpa_s, 10, 0);	}	wpa_supplicant_cancel_scan(wpa_s);}static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s){	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {		/*		 * At least Host AP driver and a Prism3 card seemed to be		 * generating streams of disconnected events when configuring		 * IBSS for WPA-None. Ignore them for now.		 */		wpa_printf(MSG_DEBUG, "Disconnect event - ignore in "			   "IBSS/WPA-None mode");		return;	}	if (wpa_s->wpa_state == WPA_4WAY_HANDSHAKE &&	    wpa_s->key_mgmt == WPA_KEY_MGMT_PSK) {		wpa_msg(wpa_s, MSG_INFO, "WPA: 4-Way Handshake failed - "			"pre-shared key may be incorrect");	}	if (wpa_s->wpa_state >= WPA_ASSOCIATED)		wpa_supplicant_req_scan(wpa_s, 0, 100000);	wpa_blacklist_add(wpa_s, wpa_s->bssid);	wpa_sm_notify_disassoc(wpa_s->wpa);	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "- Disconnect event - "		"remove keys");	if (wpa_supplicant_dynamic_keys(wpa_s)) {		wpa_s->keys_cleared = 0;		wpa_clear_keys(wpa_s, wpa_s->bssid);	}	wpa_supplicant_mark_disassoc(wpa_s);}static voidwpa_supplicant_event_michael_mic_failure(struct wpa_supplicant *wpa_s,					 union wpa_event_data *data){	int pairwise;	time_t now;	wpa_msg(wpa_s, MSG_WARNING, "Michael MIC failure detected");	pairwise = (data && data->michael_mic_failure.unicast);	wpa_sm_key_request(wpa_s->wpa, 1, pairwise);	time(&now);	if (wpa_s->last_michael_mic_error &&	    now - wpa_s->last_michael_mic_error <= 60) {		/* initialize countermeasures */		wpa_s->countermeasures = 1;		wpa_msg(wpa_s, MSG_WARNING, "TKIP countermeasures started");		/*		 * Need to wait for completion of request frame. We do not get		 * any callback for the message completion, so just wait a		 * short while and hope for the best. */		usleep(10000);		wpa_drv_set_countermeasures(wpa_s, 1);		wpa_supplicant_deauthenticate(wpa_s,					      REASON_MICHAEL_MIC_FAILURE);		eloop_cancel_timeout(wpa_supplicant_stop_countermeasures,				     wpa_s, NULL);		eloop_register_timeout(60, 0,				       wpa_supplicant_stop_countermeasures,				       wpa_s, NULL);		/* TODO: mark the AP rejected for 60 second. STA is		 * allowed to associate with another AP.. */	}	wpa_s->last_michael_mic_error = now;}static voidwpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s,				      union wpa_event_data *data){	if (strcmp(wpa_s->ifname, data->interface_status.ifname) != 0)		return;	switch (data->interface_status.ievent) {	case EVENT_INTERFACE_ADDED:		if (!wpa_s->interface_removed)			break;		wpa_s->interface_removed = 0;		wpa_printf(MSG_DEBUG, "Configured interface was added.");		if (wpa_supplicant_driver_init(wpa_s, 1) < 0) {			wpa_printf(MSG_INFO, "Failed to initialize the driver "				   "after interface was added.");		}		break;	case EVENT_INTERFACE_REMOVED:		wpa_printf(MSG_DEBUG, "Configured interface was removed.");		wpa_s->interface_removed = 1;		wpa_supplicant_mark_disassoc(wpa_s);		l2_packet_deinit(wpa_s->l2);		wpa_s->l2 = NULL;		break;	}}void wpa_supplicant_event(struct wpa_supplicant *wpa_s, wpa_event_type event,			  union wpa_event_data *data){	switch (event) {	case EVENT_ASSOC:		wpa_supplicant_event_assoc(wpa_s, data);		break;	case EVENT_DISASSOC:		wpa_supplicant_event_disassoc(wpa_s);		break;	case EVENT_MICHAEL_MIC_FAILURE:		wpa_supplicant_event_michael_mic_failure(wpa_s, data);		break;	case EVENT_SCAN_RESULTS:		wpa_supplicant_event_scan_results(wpa_s);		break;	case EVENT_ASSOCINFO:		wpa_supplicant_event_associnfo(wpa_s, data);		break;	case EVENT_INTERFACE_STATUS:		wpa_supplicant_event_interface_status(wpa_s, data);		break;	case EVENT_PMKID_CANDIDATE:		wpa_supplicant_event_pmkid_candidate(wpa_s, data);		break;	default:		wpa_printf(MSG_INFO, "Unknown event %d", event);		break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -