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

📄 driver_atheros.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	wpa_printf(MSG_DEBUG, "%s: addr=%s authorized=%d",		   __func__, ether_sprintf(addr), authorized);	if (authorized)		mlme.im_op = IEEE80211_MLME_AUTHORIZE;	else		mlme.im_op = IEEE80211_MLME_UNAUTHORIZE;	mlme.im_reason = 0;	memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);	ret = set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme));	if (ret < 0) {		wpa_printf(MSG_DEBUG, "%s: Failed to %sauthorize STA " MACSTR,			   __func__, authorized ? "" : "un", MAC2STR(addr));	}	return ret;}static intmadwifi_sta_set_flags(void *priv, const u8 *addr, int total_flags,		      int flags_or, int flags_and){	/* For now, only support setting Authorized flag */	if (flags_or & WLAN_STA_AUTHORIZED)		return madwifi_set_sta_authorized(priv, addr, 1);	if (!(flags_and & WLAN_STA_AUTHORIZED))		return madwifi_set_sta_authorized(priv, addr, 0);	return 0;}static intmadwifi_del_key(void *priv, const u8 *addr, int key_idx){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_del_key wk;	int ret;	wpa_printf(MSG_DEBUG, "%s: addr=%s key_idx=%d",		   __func__, ether_sprintf(addr), key_idx);	memset(&wk, 0, sizeof(wk));	if (addr != NULL) {		memcpy(wk.idk_macaddr, addr, IEEE80211_ADDR_LEN);		wk.idk_keyix = (u8) IEEE80211_KEYIX_NONE;	} else {		wk.idk_keyix = key_idx;	}	ret = set80211priv(drv, IEEE80211_IOCTL_DELKEY, &wk, sizeof(wk));	if (ret < 0) {		wpa_printf(MSG_DEBUG, "%s: Failed to delete key (addr %s"			   " key_idx %d)", __func__, ether_sprintf(addr),			   key_idx);	}	return ret;}static intmadwifi_set_key(const char *ifname, void *priv, const char *alg,		const u8 *addr, int key_idx,		const u8 *key, size_t key_len, int txkey){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_key wk;	u_int8_t cipher;	int ret;	if (strcmp(alg, "none") == 0)		return madwifi_del_key(drv, addr, key_idx);	wpa_printf(MSG_DEBUG, "%s: alg=%s addr=%s key_idx=%d",		   __func__, alg, ether_sprintf(addr), key_idx);	if (strcmp(alg, "WEP") == 0)		cipher = IEEE80211_CIPHER_WEP;	else if (strcmp(alg, "TKIP") == 0)		cipher = IEEE80211_CIPHER_TKIP;	else if (strcmp(alg, "CCMP") == 0)		cipher = IEEE80211_CIPHER_AES_CCM;	else {		printf("%s: unknown/unsupported algorithm %s\n",			__func__, alg);		return -1;	}	if (key_len > sizeof(wk.ik_keydata)) {		printf("%s: key length %lu too big\n", __func__,		       (unsigned long) key_len);		return -3;	}	memset(&wk, 0, sizeof(wk));	wk.ik_type = cipher;	wk.ik_flags = IEEE80211_KEY_RECV | IEEE80211_KEY_XMIT;	if (addr == NULL) {		memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);		wk.ik_keyix = key_idx;		wk.ik_flags |= IEEE80211_KEY_DEFAULT;	} else {		memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);		wk.ik_keyix = IEEE80211_KEYIX_NONE;	}	wk.ik_keylen = key_len;	memcpy(wk.ik_keydata, key, key_len);	ret = set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk));	if (ret < 0) {		wpa_printf(MSG_DEBUG, "%s: Failed to set key (addr %s"			   " key_idx %d alg '%s' key_len %lu txkey %d)",			   __func__, ether_sprintf(wk.ik_macaddr), key_idx,			   alg, (unsigned long) key_len, txkey);	}	return ret;}static intmadwifi_get_seqnum(const char *ifname, void *priv, const u8 *addr, int idx,		   u8 *seq){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_key wk;	wpa_printf(MSG_DEBUG, "%s: addr=%s idx=%d",		   __func__, ether_sprintf(addr), idx);	memset(&wk, 0, sizeof(wk));	if (addr == NULL)		memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);	else		memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);	wk.ik_keyix = idx;	if (set80211priv(drv, IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk))) {		wpa_printf(MSG_DEBUG, "%s: Failed to get encryption data "			   "(addr " MACSTR " key_idx %d)",			   __func__, MAC2STR(wk.ik_macaddr), idx);		return -1;	}#ifdef WORDS_BIGENDIAN	{		/*		 * wk.ik_keytsc is in host byte order (big endian), need to		 * swap it to match with the byte order used in WPA.		 */		int i;		u8 tmp[WPA_KEY_RSC_LEN];		memcpy(tmp, &wk.ik_keytsc, sizeof(wk.ik_keytsc));		for (i = 0; i < WPA_KEY_RSC_LEN; i++) {			seq[i] = tmp[WPA_KEY_RSC_LEN - i - 1];		}	}#else /* WORDS_BIGENDIAN */	memcpy(seq, &wk.ik_keytsc, sizeof(wk.ik_keytsc));#endif /* WORDS_BIGENDIAN */	return 0;}static intmadwifi_flush(void *priv){	u8 allsta[IEEE80211_ADDR_LEN];	memset(allsta, 0xff, IEEE80211_ADDR_LEN);	return madwifi_sta_deauth(priv, allsta, IEEE80211_REASON_AUTH_LEAVE);}static intmadwifi_read_sta_driver_data(void *priv, struct hostap_sta_driver_data *data,			     const u8 *addr){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_sta_stats stats;	memset(data, 0, sizeof(*data));	/*	 * Fetch statistics for station from the system.	 */	memset(&stats, 0, sizeof(stats));	memcpy(stats.is_u.macaddr, addr, IEEE80211_ADDR_LEN);	if (set80211priv(drv, IEEE80211_IOCTL_STA_STATS,			 &stats, sizeof(stats))) {		wpa_printf(MSG_DEBUG, "%s: Failed to fetch STA stats (addr "			   MACSTR ")", __func__, MAC2STR(addr));		if (memcmp(addr, drv->acct_mac, ETH_ALEN) == 0) {			memcpy(data, &drv->acct_data, sizeof(*data));			return 0;		}		printf("Failed to get station stats information element.\n");		return -1;	}	data->rx_packets = stats.is_stats.ns_rx_data;	data->rx_bytes = stats.is_stats.ns_rx_bytes;	data->tx_packets = stats.is_stats.ns_tx_data;	data->tx_bytes = stats.is_stats.ns_tx_bytes;	return 0;}static intmadwifi_sta_clear_stats(void *priv, const u8 *addr){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_mlme mlme;	int ret;	wpa_printf(MSG_DEBUG, "%s: addr=%s", __func__, ether_sprintf(addr));	mlme.im_op = IEEE80211_MLME_CLEAR_STATS;	memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);	ret = set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme,			   sizeof(mlme));	if (ret < 0) {		wpa_printf(MSG_DEBUG, "%s: Failed to clear STA stats (addr "			   MACSTR ")", __func__, MAC2STR(addr));	}	return ret;}static intmadwifi_set_opt_ie(const char *ifname, void *priv, const u8 *ie, size_t ie_len){	/*	 * Do nothing; we setup parameters at startup that define the	 * contents of the beacon information element.	 */	return 0;}static intmadwifi_sta_deauth(void *priv, const u8 *addr, int reason_code){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_mlme mlme;	int ret;	wpa_printf(MSG_DEBUG, "%s: addr=%s reason_code=%d",		   __func__, ether_sprintf(addr), reason_code);	mlme.im_op = IEEE80211_MLME_DEAUTH;	mlme.im_reason = reason_code;	memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);	ret = set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme));	if (ret < 0) {		wpa_printf(MSG_DEBUG, "%s: Failed to deauth STA (addr " MACSTR			   " reason %d)",			   __func__, MAC2STR(addr), reason_code);	}	return ret;}static intmadwifi_sta_disassoc(void *priv, const u8 *addr, int reason_code){	struct madwifi_driver_data *drv = priv;	struct ieee80211req_mlme mlme;	int ret;	wpa_printf(MSG_DEBUG, "%s: addr=%s reason_code=%d",		   __func__, ether_sprintf(addr), reason_code);	mlme.im_op = IEEE80211_MLME_DISASSOC;	mlme.im_reason = reason_code;	memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);	ret = set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme));	if (ret < 0) {		wpa_printf(MSG_DEBUG, "%s: Failed to disassoc STA (addr "			   MACSTR " reason %d)",			   __func__, MAC2STR(addr), reason_code);	}	return ret;}#ifdef CONFIG_WPSstatic void madwifi_raw_receive(void *ctx, const u8 *src_addr, const u8 *buf,				size_t len){	struct madwifi_driver_data *drv = ctx;	const struct ieee80211_mgmt *mgmt;	const u8 *end, *ie;	u16 fc;	size_t ie_len;	/* Send Probe Request information to WPS processing */	if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req))		return;	mgmt = (const struct ieee80211_mgmt *) buf;	fc = le_to_host16(mgmt->frame_control);	if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT ||	    WLAN_FC_GET_STYPE(fc) != WLAN_FC_STYPE_PROBE_REQ)		return;	end = buf + len;	ie = mgmt->u.probe_req.variable;	ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req));	hostapd_wps_probe_req_rx(drv->hapd, mgmt->sa, ie, ie_len);}#endif /* CONFIG_WPS */static int madwifi_receive_probe_req(struct madwifi_driver_data *drv){	int ret = 0;#ifdef CONFIG_WPS	struct ieee80211req_set_filter filt;	wpa_printf(MSG_DEBUG, "%s Enter", __func__);	filt.app_filterype = IEEE80211_FILTER_TYPE_PROBE_REQ;	ret = set80211priv(drv, IEEE80211_IOCTL_FILTERFRAME, &filt,			   sizeof(struct ieee80211req_set_filter));	if (ret)		return ret;	drv->sock_raw = l2_packet_init(drv->iface, NULL, ETH_P_80211_RAW,				       madwifi_raw_receive, drv, 1);	if (drv->sock_raw == NULL)		return -1;#endif /* CONFIG_WPS */	return ret;}#ifdef CONFIG_WPSstatic intmadwifi_set_wps_ie(void *priv, const u8 *ie, size_t len, u32 frametype){	struct madwifi_driver_data *drv = priv;	u8 buf[256];	struct ieee80211req_getset_appiebuf *beac_ie;	wpa_printf(MSG_DEBUG, "%s buflen = %lu", __func__,		   (unsigned long) len);	beac_ie = (struct ieee80211req_getset_appiebuf *) buf;	beac_ie->app_frmtype = frametype;	beac_ie->app_buflen = len;	memcpy(&(beac_ie->app_buf[0]), ie, len);	return set80211priv(drv, IEEE80211_IOCTL_SET_APPIEBUF, beac_ie,			    sizeof(struct ieee80211req_getset_appiebuf) + len);}static intmadwifi_set_wps_beacon_ie(const char *ifname, void *priv, const u8 *ie,			  size_t len){	return madwifi_set_wps_ie(priv, ie, len, IEEE80211_APPIE_FRAME_BEACON);}static intmadwifi_set_wps_probe_resp_ie(const char *ifname, void *priv, const u8 *ie,			      size_t len){	return madwifi_set_wps_ie(priv, ie, len,				  IEEE80211_APPIE_FRAME_PROBE_RESP);}#else /* CONFIG_WPS */#define madwifi_set_wps_beacon_ie NULL#define madwifi_set_wps_probe_resp_ie NULL#endif /* CONFIG_WPS */static intmadwifi_new_sta(struct madwifi_driver_data *drv, u8 addr[IEEE80211_ADDR_LEN]){	struct hostapd_data *hapd = drv->hapd;	struct ieee80211req_wpaie ie;	int ielen = 0, res;	u8 *iebuf = NULL;	/*	 * Fetch negotiated WPA/RSN parameters from the system.	 */	memset(&ie, 0, sizeof(ie));	memcpy(ie.wpa_macaddr, addr, IEEE80211_ADDR_LEN);	if (set80211priv(drv, IEEE80211_IOCTL_GETWPAIE, &ie, sizeof(ie))) {		/*		 * See ATH_WPS_IE comment in the beginning of the file for a		 * possible cause for the failure..		 */		wpa_printf(MSG_DEBUG, "%s: Failed to get WPA/RSN IE: %s",			   __func__, strerror(errno));		goto no_ie;	}	wpa_hexdump(MSG_MSGDUMP, "madwifi req WPA IE",		    ie.wpa_ie, IEEE80211_MAX_OPT_IE);	wpa_hexdump(MSG_MSGDUMP, "madwifi req RSN IE",		    ie.rsn_ie, IEEE80211_MAX_OPT_IE);	iebuf = ie.wpa_ie;	/* madwifi seems to return some random data if WPA/RSN IE is not set.	 * Assume the IE was not included if the IE type is unknown. */	if (iebuf[0] != WLAN_EID_VENDOR_SPECIFIC)		iebuf[1] = 0;	if (iebuf[1] == 0 && ie.rsn_ie[1] > 0) {		/* madwifi-ng svn #1453 added rsn_ie. Use it, if wpa_ie was not		 * set. This is needed for WPA2. */		iebuf = ie.rsn_ie;		if (iebuf[0] != WLAN_EID_RSN)			iebuf[1] = 0;	}	ielen = iebuf[1];	if (ielen == 0)		iebuf = NULL;	else		ielen += 2;no_ie:	res = hostapd_notif_assoc(hapd, addr, iebuf, ielen);	if (memcmp(addr, drv->acct_mac, ETH_ALEN) == 0) {		/* Cached accounting data is not valid anymore. */		memset(drv->acct_mac, 0, ETH_ALEN);		memset(&drv->acct_data, 0, sizeof(drv->acct_data));	}	return res;}static voidmadwifi_wireless_event_wireless_custom(struct madwifi_driver_data *drv,				       char *custom, char *end){	wpa_printf(MSG_DEBUG, "Custom wireless event: '%s'", custom);	if (strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {		char *pos;		u8 addr[ETH_ALEN];		pos = strstr(custom, "addr=");		if (pos == NULL) {			wpa_printf(MSG_DEBUG,				   "MLME-MICHAELMICFAILURE.indication "				   "without sender address ignored");			return;		}		pos += 5;		if (hwaddr_aton(pos, addr) == 0) {			hostapd_michael_mic_failure(drv->hapd, addr);		} else {			wpa_printf(MSG_DEBUG,				   "MLME-MICHAELMICFAILURE.indication "				   "with invalid MAC address");		}	} else if (strncmp(custom, "STA-TRAFFIC-STAT", 16) == 0) {		char *key, *value;		u32 val;		key = custom;		while ((key = strchr(key, '\n')) != NULL) {			key++;			value = strchr(key, '=');			if (value == NULL)				continue;			*value++ = '\0';			val = strtoul(value, NULL, 10);			if (strcmp(key, "mac") == 0)				hwaddr_aton(value, drv->acct_mac);			else if (strcmp(key, "rx_packets") == 0)				drv->acct_data.rx_packets = val;			else if (strcmp(key, "tx_packets") == 0)				drv->acct_data.tx_packets = val;			else if (strcmp(key, "rx_bytes") == 0)				drv->acct_data.rx_bytes = val;			else if (strcmp(key, "tx_bytes") == 0)				drv->acct_data.tx_bytes = val;			key = value;		}#ifdef CONFIG_WPS	} else if (strncmp(custom, "PUSH-BUTTON.indication", 22) == 0) {		/* Some atheros kernels send push button as a wireless event */		/* PROBLEM! this event is received for ALL BSSs ...		 * so all are enabled for WPS... ugh.		 */		hostapd_wps_button_pushed(drv->hapd);

⌨️ 快捷键说明

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