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

📄 driver_wext.c

📁 WLAN无线网络管理的最新程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		os_free(range);		return -1;	} else if (iwr.u.data.length >= minlen &&		   range->we_version_compiled >= 18) {		wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: WE(compiled)=%d "			   "WE(source)=%d enc_capa=0x%x",			   range->we_version_compiled,			   range->we_version_source,			   range->enc_capa);		drv->has_capability = 1;		drv->we_version_compiled = range->we_version_compiled;		if (range->enc_capa & IW_ENC_CAPA_WPA) {			drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA |				WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK;		}		if (range->enc_capa & IW_ENC_CAPA_WPA2) {			drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |				WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;		}		drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 |			WPA_DRIVER_CAPA_ENC_WEP104;		if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)			drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP;		if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)			drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;		wpa_printf(MSG_DEBUG, "  capabilities: key_mgmt 0x%x enc 0x%x",			   drv->capa.key_mgmt, drv->capa.enc);	} else {		wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: too old (short) data - "			   "assuming WPA is not supported");	}	os_free(range);	return 0;}static int wpa_driver_wext_set_wpa(void *priv, int enabled){	struct wpa_driver_wext_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);	return wpa_driver_wext_set_auth_param(drv, IW_AUTH_WPA_ENABLED,					      enabled);}static int wpa_driver_wext_set_key_ext(void *priv, wpa_alg alg,				       const u8 *addr, int key_idx,				       int set_tx, const u8 *seq,				       size_t seq_len,				       const u8 *key, size_t key_len){	struct wpa_driver_wext_data *drv = priv;	struct iwreq iwr;	int ret = 0;	struct iw_encode_ext *ext;	if (seq_len > IW_ENCODE_SEQ_MAX_SIZE) {		wpa_printf(MSG_DEBUG, "%s: Invalid seq_len %lu",			   __FUNCTION__, (unsigned long) seq_len);		return -1;	}	ext = os_zalloc(sizeof(*ext) + key_len);	if (ext == NULL)		return -1;	os_memset(&iwr, 0, sizeof(iwr));	os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);	iwr.u.encoding.flags = key_idx + 1;	if (alg == WPA_ALG_NONE)		iwr.u.encoding.flags |= IW_ENCODE_DISABLED;	iwr.u.encoding.pointer = (caddr_t) ext;	iwr.u.encoding.length = sizeof(*ext) + key_len;	if (addr == NULL ||	    os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0)		ext->ext_flags |= IW_ENCODE_EXT_GROUP_KEY;	if (set_tx)		ext->ext_flags |= IW_ENCODE_EXT_SET_TX_KEY;	ext->addr.sa_family = ARPHRD_ETHER;	if (addr)		os_memcpy(ext->addr.sa_data, addr, ETH_ALEN);	else		os_memset(ext->addr.sa_data, 0xff, ETH_ALEN);	if (key && key_len) {		os_memcpy(ext + 1, key, key_len);		ext->key_len = key_len;	}	switch (alg) {	case WPA_ALG_NONE:		ext->alg = IW_ENCODE_ALG_NONE;		break;	case WPA_ALG_WEP:		ext->alg = IW_ENCODE_ALG_WEP;		break;	case WPA_ALG_TKIP:		ext->alg = IW_ENCODE_ALG_TKIP;		break;	case WPA_ALG_CCMP:		ext->alg = IW_ENCODE_ALG_CCMP;		break;	default:		wpa_printf(MSG_DEBUG, "%s: Unknown algorithm %d",			   __FUNCTION__, alg);		os_free(ext);		return -1;	}	if (seq && seq_len) {		ext->ext_flags |= IW_ENCODE_EXT_RX_SEQ_VALID;		os_memcpy(ext->rx_seq, seq, seq_len);	}	if (ioctl(drv->ioctl_sock, SIOCSIWENCODEEXT, &iwr) < 0) {		ret = errno == EOPNOTSUPP ? -2 : -1;		if (errno == ENODEV) {			/*			 * ndiswrapper seems to be returning incorrect error			 * code.. */			ret = -2;		}		perror("ioctl[SIOCSIWENCODEEXT]");	}	os_free(ext);	return ret;}/** * wpa_driver_wext_set_key - Configure encryption key * @priv: Pointer to private wext data from wpa_driver_wext_init() * @priv: Private driver interface data * @alg: Encryption algorithm (%WPA_ALG_NONE, %WPA_ALG_WEP, *	%WPA_ALG_TKIP, %WPA_ALG_CCMP); %WPA_ALG_NONE clears the key. * @addr: Address of the peer STA or ff:ff:ff:ff:ff:ff for *	broadcast/default keys * @key_idx: key index (0..3), usually 0 for unicast keys * @set_tx: Configure this key as the default Tx key (only used when *	driver does not support separate unicast/individual key * @seq: Sequence number/packet number, seq_len octets, the next *	packet number to be used for in replay protection; configured *	for Rx keys (in most cases, this is only used with broadcast *	keys and set to zero for unicast keys) * @seq_len: Length of the seq, depends on the algorithm: *	TKIP: 6 octets, CCMP: 6 octets * @key: Key buffer; TKIP: 16-byte temporal key, 8-byte Tx Mic key, *	8-byte Rx Mic Key * @key_len: Length of the key buffer in octets (WEP: 5 or 13, *	TKIP: 32, CCMP: 16) * Returns: 0 on success, -1 on failure * * This function uses SIOCSIWENCODEEXT by default, but tries to use * SIOCSIWENCODE if the extended ioctl fails when configuring a WEP key. */int wpa_driver_wext_set_key(void *priv, wpa_alg alg,			    const u8 *addr, int key_idx,			    int set_tx, const u8 *seq, size_t seq_len,			    const u8 *key, size_t key_len){	struct wpa_driver_wext_data *drv = priv;	struct iwreq iwr;	int ret = 0;	wpa_printf(MSG_DEBUG, "%s: alg=%d key_idx=%d set_tx=%d seq_len=%lu "		   "key_len=%lu",		   __FUNCTION__, alg, key_idx, set_tx,		   (unsigned long) seq_len, (unsigned long) key_len);	ret = wpa_driver_wext_set_key_ext(drv, alg, addr, key_idx, set_tx,					  seq, seq_len, key, key_len);	if (ret == 0)		return 0;	if (ret == -2 &&	    (alg == WPA_ALG_NONE || alg == WPA_ALG_WEP)) {		wpa_printf(MSG_DEBUG, "Driver did not support "			   "SIOCSIWENCODEEXT, trying SIOCSIWENCODE");		ret = 0;	} else {		wpa_printf(MSG_DEBUG, "Driver did not support "			   "SIOCSIWENCODEEXT");		return ret;	}	os_memset(&iwr, 0, sizeof(iwr));	os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);	iwr.u.encoding.flags = key_idx + 1;	if (alg == WPA_ALG_NONE)		iwr.u.encoding.flags |= IW_ENCODE_DISABLED;	iwr.u.encoding.pointer = (caddr_t) key;	iwr.u.encoding.length = key_len;	if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {		perror("ioctl[SIOCSIWENCODE]");		ret = -1;	}	if (set_tx && alg != WPA_ALG_NONE) {		os_memset(&iwr, 0, sizeof(iwr));		os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);		iwr.u.encoding.flags = key_idx + 1;		iwr.u.encoding.pointer = (caddr_t) NULL;		iwr.u.encoding.length = 0;		if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {			perror("ioctl[SIOCSIWENCODE] (set_tx)");			ret = -1;		}	}	return ret;}static int wpa_driver_wext_set_countermeasures(void *priv,					       int enabled){	struct wpa_driver_wext_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);	return wpa_driver_wext_set_auth_param(drv,					      IW_AUTH_TKIP_COUNTERMEASURES,					      enabled);}static int wpa_driver_wext_set_drop_unencrypted(void *priv,						int enabled){	struct wpa_driver_wext_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);	drv->use_crypt = enabled;	return wpa_driver_wext_set_auth_param(drv, IW_AUTH_DROP_UNENCRYPTED,					      enabled);}static int wpa_driver_wext_mlme(struct wpa_driver_wext_data *drv,				const u8 *addr, int cmd, int reason_code){	struct iwreq iwr;	struct iw_mlme mlme;	int ret = 0;	os_memset(&iwr, 0, sizeof(iwr));	os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);	os_memset(&mlme, 0, sizeof(mlme));	mlme.cmd = cmd;	mlme.reason_code = reason_code;	mlme.addr.sa_family = ARPHRD_ETHER;	os_memcpy(mlme.addr.sa_data, addr, ETH_ALEN);	iwr.u.data.pointer = (caddr_t) &mlme;	iwr.u.data.length = sizeof(mlme);	if (ioctl(drv->ioctl_sock, SIOCSIWMLME, &iwr) < 0) {		perror("ioctl[SIOCSIWMLME]");		ret = -1;	}	return ret;}static int wpa_driver_wext_deauthenticate(void *priv, const u8 *addr,					  int reason_code){	struct wpa_driver_wext_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);	return wpa_driver_wext_mlme(drv, addr, IW_MLME_DEAUTH, reason_code);}static int wpa_driver_wext_disassociate(void *priv, const u8 *addr,					int reason_code){	struct wpa_driver_wext_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);	return wpa_driver_wext_mlme(drv, addr, IW_MLME_DISASSOC,				    reason_code);}static int wpa_driver_wext_set_gen_ie(void *priv, const u8 *ie,				      size_t ie_len){	struct wpa_driver_wext_data *drv = priv;	struct iwreq iwr;	int ret = 0;	os_memset(&iwr, 0, sizeof(iwr));	os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);	iwr.u.data.pointer = (caddr_t) ie;	iwr.u.data.length = ie_len;	if (ioctl(drv->ioctl_sock, SIOCSIWGENIE, &iwr) < 0) {		perror("ioctl[SIOCSIWGENIE]");		ret = -1;	}	return ret;}static int wpa_driver_wext_cipher2wext(int cipher){	switch (cipher) {	case CIPHER_NONE:		return IW_AUTH_CIPHER_NONE;	case CIPHER_WEP40:		return IW_AUTH_CIPHER_WEP40;	case CIPHER_TKIP:		return IW_AUTH_CIPHER_TKIP;	case CIPHER_CCMP:		return IW_AUTH_CIPHER_CCMP;	case CIPHER_WEP104:		return IW_AUTH_CIPHER_WEP104;	default:		return 0;	}}static int wpa_driver_wext_keymgmt2wext(int keymgmt){	switch (keymgmt) {	case KEY_MGMT_802_1X:	case KEY_MGMT_802_1X_NO_WPA:		return IW_AUTH_KEY_MGMT_802_1X;	case KEY_MGMT_PSK:		return IW_AUTH_KEY_MGMT_PSK;	default:		return 0;	}}static intwpa_driver_wext_auth_alg_fallback(struct wpa_driver_wext_data *drv,				  struct wpa_driver_associate_params *params){	struct iwreq iwr;	int ret = 0;	wpa_printf(MSG_DEBUG, "WEXT: Driver did not support "		   "SIOCSIWAUTH for AUTH_ALG, trying SIOCSIWENCODE");	os_memset(&iwr, 0, sizeof(iwr));	os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);	/* Just changing mode, not actual keys */	iwr.u.encoding.flags = 0;	iwr.u.encoding.pointer = (caddr_t) NULL;	iwr.u.encoding.length = 0;	/*	 * Note: IW_ENCODE_{OPEN,RESTRICTED} can be interpreted to mean two	 * different things. Here they are used to indicate Open System vs.	 * Shared Key authentication algorithm. However, some drivers may use	 * them to select between open/restricted WEP encrypted (open = allow	 * both unencrypted and encrypted frames; restricted = only allow	 * encrypted frames).	 */	if (!drv->use_crypt) {		iwr.u.encoding.flags |= IW_ENCODE_DISABLED;	} else {		if (params->auth_alg & AUTH_ALG_OPEN_SYSTEM)			iwr.u.encoding.flags |= IW_ENCODE_OPEN;		if (params->auth_alg & AUTH_ALG_SHARED_KEY)			iwr.u.encoding.flags |= IW_ENCODE_RESTRICTED;	}	if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {		perror("ioctl[SIOCSIWENCODE]");		ret = -1;	}	return ret;}static intwpa_driver_wext_associate(void *priv,			  struct wpa_driver_associate_params *params){	struct wpa_driver_wext_data *drv = priv;	int ret = 0;	int allow_unencrypted_eapol;	int value;	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);	/*	 * If the driver did not support SIOCSIWAUTH, fallback to	 * SIOCSIWENCODE here.	 */	if (drv->auth_alg_fallback &&	    wpa_driver_wext_auth_alg_fallback(drv, params) < 0)		ret = -1;	if (!params->bssid &&	    wpa_driver_wext_set_bssid(drv, NULL) < 0)		ret = -1;	if (wpa_driver_wext_set_mode(drv, params->mode) < 0)		ret = -1;	/* TODO: should consider getting wpa version and cipher/key_mgmt suites	 * from configuration, not from here, where only the selected suite is	 * available */	if (wpa_driver_wext_set_gen_ie(drv, params->wpa_ie, params->wpa_ie_len)	    < 0)		ret = -1;	if (params->wpa_ie == NULL || params->wpa_ie_len == 0)		value = IW_AUTH_WPA_VERSION_DISABLED;	else if (params->wpa_ie[0] == RSN_INFO_ELEM)		value = IW_AUTH_WPA_VERSION_WPA2;	else		value = IW_AUTH_WPA_VERSION_WPA;	if (wpa_driver_wext_set_auth_param(drv,					   IW_AUTH_WPA_VERSION, value) < 0)		ret = -1;	value = wpa_driver_wext_cipher2wext(params->pairwise_suite);	if (wpa_driver_wext_set_auth_param(drv,					   IW_AUTH_CIPHER_PAIRWISE, value) < 0)		ret = -1;	value = wpa_driver_wext_cipher2wext(params->group_suite);	if (wpa_driver_wext_set_auth_param(drv,					   IW_AUTH_CIPHER_GROUP, value) < 0)		ret = -1;	value = wpa_driver_wext_keymgmt2wext(params->key_mgmt_suite);	if (wpa_driver_wext_set_auth_param(drv,					   IW_AUTH_KEY_MGMT, value) < 0)		ret = -1;	value = params->key_mgmt_suite != KEY_MGMT_NONE ||		params->pairwise_suite != CIPHER_NONE ||		params->group_suite != CIPHER_NONE ||		params->wpa_ie_len;	if (wpa_driver_wext_set_auth_param(drv,					   IW_AUTH_PRIVACY_INVOKED, value) < 0)		ret = -1;	/* Allow unencrypted EAPOL messages even if pairwise keys are set when	 * not using WPA. IEEE 802.1X specifies that these frames are not	 * encrypted, but WPA encrypts them when pairwise keys are in use. */	if (params->key_mgmt_suite == KEY_MGMT_802_1X ||	    params->key_mgmt_suite == KEY_MGMT_PSK)		allow_unencrypted_eapol = 0;	else		allow_unencrypted_eapol = 1;		if (wpa_driver_wext_set_auth_param(drv,					   IW_AUTH_RX_UNENCRYPTED_EAPOL,					   allow_unencrypted_eapol) < 0)		ret = -1;	if (params->freq && wpa_driver_wext_set_freq(drv, params->freq) < 0)		ret = -1;	if (wpa_driver_wext_set_ssid(drv, params->ssid, params->ssid_len) < 0)		ret = -1;	if (params->bssid &&	    wpa_driver_wext_set_bssid(drv, params->bssid) < 0)		ret = -1;	return ret;}static int wpa_driver_wext_set_auth_alg(void *priv, int auth_alg){	struct wpa_driver_wext_data *drv = priv;	int algs = 0, res;	if (auth_alg & AUTH_ALG_OPEN_SYSTEM)		algs |= IW_AUTH_ALG_OPEN_SYSTEM;

⌨️ 快捷键说明

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