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

📄 ctrl_iface.c

📁 WLAN无线网络管理的最新程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * WPA Supplicant / Control interface (shared code for all backends) * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. */#include "includes.h"#include "common.h"#include "eloop.h"#include "wpa.h"#include "wpa_supplicant.h"#include "config.h"#include "eapol_sm.h"#include "wpa_supplicant_i.h"#include "ctrl_iface.h"#include "l2_packet.h"#include "preauth.h"#include "pmksa_cache.h"#include "wpa_ctrl.h"#include "eap.h"static int wpa_supplicant_global_iface_interfaces(struct wpa_global *global,						  char *buf, int len);static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,					 char *cmd){	char *value;	int ret = 0;	value = os_strchr(cmd, ' ');	if (value == NULL)		return -1;	*value++ = '\0';	wpa_printf(MSG_DEBUG, "CTRL_IFACE SET '%s'='%s'", cmd, value);	if (os_strcasecmp(cmd, "EAPOL::heldPeriod") == 0) {		eapol_sm_configure(wpa_s->eapol,				   atoi(value), -1, -1, -1);	} else if (os_strcasecmp(cmd, "EAPOL::authPeriod") == 0) {		eapol_sm_configure(wpa_s->eapol,				   -1, atoi(value), -1, -1);	} else if (os_strcasecmp(cmd, "EAPOL::startPeriod") == 0) {		eapol_sm_configure(wpa_s->eapol,				   -1, -1, atoi(value), -1);	} else if (os_strcasecmp(cmd, "EAPOL::maxStart") == 0) {		eapol_sm_configure(wpa_s->eapol,				   -1, -1, -1, atoi(value));	} else if (os_strcasecmp(cmd, "dot11RSNAConfigPMKLifetime") == 0) {		if (wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,				     atoi(value)))			ret = -1;	} else if (os_strcasecmp(cmd, "dot11RSNAConfigPMKReauthThreshold") ==		   0) {		if (wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,				     atoi(value)))			ret = -1;	} else if (os_strcasecmp(cmd, "dot11RSNAConfigSATimeout") == 0) {		if (wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT, atoi(value)))			ret = -1;	} else		ret = -1;	return ret;}static int wpa_supplicant_ctrl_iface_preauth(struct wpa_supplicant *wpa_s,					     char *addr){	u8 bssid[ETH_ALEN];	if (hwaddr_aton(addr, bssid)) {		wpa_printf(MSG_DEBUG, "CTRL_IFACE PREAUTH: invalid address "			   "'%s'", addr);		return -1;	}	wpa_printf(MSG_DEBUG, "CTRL_IFACE PREAUTH " MACSTR, MAC2STR(bssid));	rsn_preauth_deinit(wpa_s->wpa);	if (rsn_preauth_init(wpa_s->wpa, bssid, wpa_s->current_ssid))		return -1;	return 0;}#ifdef CONFIG_PEERKEY/* MLME-STKSTART.request(peer) */static int wpa_supplicant_ctrl_iface_stkstart(	struct wpa_supplicant *wpa_s, char *addr){	u8 peer[ETH_ALEN];	if (hwaddr_aton(addr, peer)) {		wpa_printf(MSG_DEBUG, "CTRL_IFACE STKSTART: invalid "			   "address '%s'", peer);		return -1;	}	wpa_printf(MSG_DEBUG, "CTRL_IFACE STKSTART " MACSTR,		   MAC2STR(peer));	return wpa_sm_stkstart(wpa_s->wpa, peer);}#endif /* CONFIG_PEERKEY */static int wpa_supplicant_ctrl_iface_ctrl_rsp(struct wpa_supplicant *wpa_s,					      char *rsp){#ifdef IEEE8021X_EAPOL	char *pos, *id_pos;	int id;	struct wpa_ssid *ssid;	pos = os_strchr(rsp, '-');	if (pos == NULL)		return -1;	*pos++ = '\0';	id_pos = pos;	pos = os_strchr(pos, ':');	if (pos == NULL)		return -1;	*pos++ = '\0';	id = atoi(id_pos);	wpa_printf(MSG_DEBUG, "CTRL_IFACE: field=%s id=%d", rsp, id);	wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: value",			      (u8 *) pos, os_strlen(pos));	ssid = wpa_config_get_network(wpa_s->conf, id);	if (ssid == NULL) {		wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find SSID id=%d "			   "to update", id);		return -1;	}	if (os_strcmp(rsp, "IDENTITY") == 0) {		os_free(ssid->identity);		ssid->identity = (u8 *) os_strdup(pos);		ssid->identity_len = os_strlen(pos);		ssid->pending_req_identity = 0;		if (ssid == wpa_s->current_ssid)			wpa_s->reassociate = 1;	} else if (os_strcmp(rsp, "PASSWORD") == 0) {		os_free(ssid->password);		ssid->password = (u8 *) os_strdup(pos);		ssid->password_len = os_strlen(pos);		ssid->pending_req_password = 0;		if (ssid == wpa_s->current_ssid)			wpa_s->reassociate = 1;	} else if (os_strcmp(rsp, "NEW_PASSWORD") == 0) {		os_free(ssid->new_password);		ssid->new_password = (u8 *) os_strdup(pos);		ssid->new_password_len = os_strlen(pos);		ssid->pending_req_new_password = 0;		if (ssid == wpa_s->current_ssid)			wpa_s->reassociate = 1;	} else if (os_strcmp(rsp, "PIN") == 0) {		os_free(ssid->pin);		ssid->pin = os_strdup(pos);		ssid->pending_req_pin = 0;		if (ssid == wpa_s->current_ssid)			wpa_s->reassociate = 1;	} else if (os_strcmp(rsp, "OTP") == 0) {		os_free(ssid->otp);		ssid->otp = (u8 *) os_strdup(pos);		ssid->otp_len = os_strlen(pos);		os_free(ssid->pending_req_otp);		ssid->pending_req_otp = NULL;		ssid->pending_req_otp_len = 0;	} else if (os_strcmp(rsp, "PASSPHRASE") == 0) {		os_free(ssid->private_key_passwd);		ssid->private_key_passwd = (u8 *) os_strdup(pos);		ssid->pending_req_passphrase = 0;		if (ssid == wpa_s->current_ssid)			wpa_s->reassociate = 1;	} else {		wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", rsp);		return -1;	}	return 0;#else /* IEEE8021X_EAPOL */	wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included");	return -1;#endif /* IEEE8021X_EAPOL */}static int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s,					    const char *params,					    char *buf, size_t buflen){	char *pos, *end, tmp[30];	int res, verbose, ret;	verbose = os_strcmp(params, "-VERBOSE") == 0;	pos = buf;	end = buf + buflen;	if (wpa_s->wpa_state >= WPA_ASSOCIATED) {		struct wpa_ssid *ssid = wpa_s->current_ssid;		ret = os_snprintf(pos, end - pos, "bssid=" MACSTR "\n",				  MAC2STR(wpa_s->bssid));		if (ret < 0 || ret >= end - pos)			return pos - buf;		pos += ret;		if (ssid) {			u8 *_ssid = ssid->ssid;			size_t ssid_len = ssid->ssid_len;			u8 ssid_buf[MAX_SSID_LEN];			if (ssid_len == 0) {				int _res = wpa_drv_get_ssid(wpa_s, ssid_buf);				if (_res < 0)					ssid_len = 0;				else					ssid_len = _res;				_ssid = ssid_buf;			}			ret = os_snprintf(pos, end - pos, "ssid=%s\nid=%d\n",					  wpa_ssid_txt(_ssid, ssid_len),					  ssid->id);			if (ret < 0 || ret >= end - pos)				return pos - buf;			pos += ret;			if (ssid->id_str) {				ret = os_snprintf(pos, end - pos,						  "id_str=%s\n",						  ssid->id_str);				if (ret < 0 || ret >= end - pos)					return pos - buf;				pos += ret;			}		}		pos += wpa_sm_get_status(wpa_s->wpa, pos, end - pos, verbose);	}	ret = os_snprintf(pos, end - pos, "wpa_state=%s\n",			  wpa_supplicant_state_txt(wpa_s->wpa_state));	if (ret < 0 || ret >= end - pos)		return pos - buf;	pos += ret;	if (wpa_s->l2 &&	    l2_packet_get_ip_addr(wpa_s->l2, tmp, sizeof(tmp)) >= 0) {		ret = os_snprintf(pos, end - pos, "ip_address=%s\n", tmp);		if (ret < 0 || ret >= end - pos)			return pos - buf;		pos += ret;	}	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {		res = eapol_sm_get_status(wpa_s->eapol, pos, end - pos,					  verbose);		if (res >= 0)			pos += res;	}	res = rsn_preauth_get_status(wpa_s->wpa, pos, end - pos, verbose);	if (res >= 0)		pos += res;	return pos - buf;}static int wpa_supplicant_ctrl_iface_bssid(struct wpa_supplicant *wpa_s,					   char *cmd){	char *pos;	int id;	struct wpa_ssid *ssid;	u8 bssid[ETH_ALEN];	/* cmd: "<network id> <BSSID>" */	pos = os_strchr(cmd, ' ');	if (pos == NULL)		return -1;	*pos++ = '\0';	id = atoi(cmd);	wpa_printf(MSG_DEBUG, "CTRL_IFACE: id=%d bssid='%s'", id, pos);	if (hwaddr_aton(pos, bssid)) {		wpa_printf(MSG_DEBUG ,"CTRL_IFACE: invalid BSSID '%s'", pos);		return -1;	}	ssid = wpa_config_get_network(wpa_s->conf, id);	if (ssid == NULL) {		wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find SSID id=%d "			   "to update", id);		return -1;	}	os_memcpy(ssid->bssid, bssid, ETH_ALEN);	ssid->bssid_set =		os_memcmp(bssid, "\x00\x00\x00\x00\x00\x00", ETH_ALEN) != 0;			return 0;}static int wpa_supplicant_ctrl_iface_list_networks(	struct wpa_supplicant *wpa_s, char *buf, size_t buflen){	char *pos, *end;	struct wpa_ssid *ssid;	int ret;	pos = buf;	end = buf + buflen;	ret = os_snprintf(pos, end - pos,			  "network id / ssid / bssid / flags\n");	if (ret < 0 || ret >= end - pos)		return pos - buf;	pos += ret;	ssid = wpa_s->conf->ssid;	while (ssid) {		ret = os_snprintf(pos, end - pos, "%d\t%s",				  ssid->id,				  wpa_ssid_txt(ssid->ssid, ssid->ssid_len));		if (ret < 0 || ret >= end - pos)			return pos - buf;		pos += ret;		if (ssid->bssid_set) {			ret = os_snprintf(pos, end - pos, "\t" MACSTR,					  MAC2STR(ssid->bssid));		} else {			ret = os_snprintf(pos, end - pos, "\tany");		}		if (ret < 0 || ret >= end - pos)			return pos - buf;		pos += ret;		ret = os_snprintf(pos, end - pos, "\t%s%s",				  ssid == wpa_s->current_ssid ?				  "[CURRENT]" : "",				  ssid->disabled ? "[DISABLED]" : "");		if (ret < 0 || ret >= end - pos)			return pos - buf;		pos += ret;		ret = os_snprintf(pos, end - pos, "\n");		if (ret < 0 || ret >= end - pos)			return pos - buf;		pos += ret;		ssid = ssid->next;	}	return pos - buf;}static char * wpa_supplicant_cipher_txt(char *pos, char *end, int cipher){	int first = 1, ret;	ret = os_snprintf(pos, end - pos, "-");	if (ret < 0 || ret >= end - pos)		return pos;	pos += ret;	if (cipher & WPA_CIPHER_NONE) {		ret = os_snprintf(pos, end - pos, "%sNONE", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	if (cipher & WPA_CIPHER_WEP40) {		ret = os_snprintf(pos, end - pos, "%sWEP40", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	if (cipher & WPA_CIPHER_WEP104) {		ret = os_snprintf(pos, end - pos, "%sWEP104",				  first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	if (cipher & WPA_CIPHER_TKIP) {		ret = os_snprintf(pos, end - pos, "%sTKIP", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	if (cipher & WPA_CIPHER_CCMP) {		ret = os_snprintf(pos, end - pos, "%sCCMP", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	return pos;}static char * wpa_supplicant_ie_txt(char *pos, char *end, const char *proto,				    const u8 *ie, size_t ie_len){	struct wpa_ie_data data;	int first, ret;	ret = os_snprintf(pos, end - pos, "[%s-", proto);	if (ret < 0 || ret >= end - pos)		return pos;	pos += ret;	if (wpa_parse_wpa_ie(ie, ie_len, &data) < 0) {		ret = os_snprintf(pos, end - pos, "?]");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		return pos;	}	first = 1;	if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X) {		ret = os_snprintf(pos, end - pos, "%sEAP", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	if (data.key_mgmt & WPA_KEY_MGMT_PSK) {		ret = os_snprintf(pos, end - pos, "%sPSK", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	if (data.key_mgmt & WPA_KEY_MGMT_WPA_NONE) {		ret = os_snprintf(pos, end - pos, "%sNone", first ? "" : "+");		if (ret < 0 || ret >= end - pos)			return pos;		pos += ret;		first = 0;	}	pos = wpa_supplicant_cipher_txt(pos, end, data.pairwise_cipher);	if (data.capabilities & WPA_CAPABILITY_PREAUTH) {		ret = os_snprintf(pos, end - pos, "-preauth");

⌨️ 快捷键说明

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