hostap_ioctl.c

来自「IEEE 802.11a/b/g linux2.4/2.6 驱动程序源代码」· C语言 代码 · 共 2,339 行 · 第 1/5 页

C
2,339
字号
			| IW_QUAL_DBM;		iwe.len = IW_EV_QUAL_LEN;		current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,						  IW_EV_QUAL_LEN);	}	memset(&iwe, 0, sizeof(iwe));	iwe.cmd = SIOCGIWENCODE;	if (capabilities & WLAN_CAPABILITY_PRIVACY)		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;	else		iwe.u.data.flags = IW_ENCODE_DISABLED;	iwe.u.data.length = 0;	iwe.len = IW_EV_POINT_LEN + iwe.u.data.length;	current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");	/* TODO: add SuppRates into BSS table */	if (scan) {		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = SIOCGIWRATE;		current_val = current_ev + IW_EV_LCP_LEN;		pos = scan->sup_rates;		for (i = 0; i < sizeof(scan->sup_rates); i++) {			if (pos[i] == 0)				break;			/* Bit rate given in 500 kb/s units (+ 0x80) */			iwe.u.bitrate.value = ((pos[i] & 0x7f) * 500000);			current_val = iwe_stream_add_value(				current_ev, current_val, end_buf, &iwe,				IW_EV_PARAM_LEN);		}		/* Check if we added any event */		if ((current_val - current_ev) > IW_EV_LCP_LEN)			current_ev = current_val;	}#if WIRELESS_EXT > 14	/* TODO: add BeaconInt,resp_rate,atim into BSS table */	if (scan) {		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = IWEVCUSTOM;		sprintf(buf, "bcn_int=%d",			le16_to_cpu(scan->beacon_interval));		iwe.u.data.length = strlen(buf);		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,						  buf);		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = IWEVCUSTOM;		sprintf(buf, "resp_rate=%d", le16_to_cpu(scan->rate));		iwe.u.data.length = strlen(buf);		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,						  buf);		if (local->last_scan_type == PRISM2_HOSTSCAN &&		    (capabilities & WLAN_CAPABILITY_IBSS)) {			memset(&iwe, 0, sizeof(iwe));			iwe.cmd = IWEVCUSTOM;			sprintf(buf, "atim=%d", le16_to_cpu(scan->atim));			iwe.u.data.length = strlen(buf);			current_ev = iwe_stream_add_point(current_ev, end_buf,							  &iwe, buf);		}	}#if WIRELESS_EXT > 17	if (bss && bss->wpa_ie_len > 0 && bss->wpa_ie_len <= MAX_WPA_IE_LEN) {		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = IWEVGENIE;		iwe.u.data.length = bss->wpa_ie_len;		current_ev = iwe_stream_add_point(			current_ev, end_buf, &iwe, bss->wpa_ie);	}	if (bss && bss->rsn_ie_len > 0 && bss->rsn_ie_len <= MAX_WPA_IE_LEN) {		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = IWEVGENIE;		iwe.u.data.length = bss->rsn_ie_len;		current_ev = iwe_stream_add_point(			current_ev, end_buf, &iwe, bss->rsn_ie);	}#else /* WIRELESS_EXT > 17 */	if (bss && bss->wpa_ie_len > 0 && bss->wpa_ie_len <= MAX_WPA_IE_LEN) {		u8 *p = buf;		p += sprintf(p, "wpa_ie=");		for (i = 0; i < bss->wpa_ie_len; i++) {			p += sprintf(p, "%02x", bss->wpa_ie[i]);		}		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = IWEVCUSTOM;		iwe.u.data.length = strlen(buf);		current_ev = iwe_stream_add_point(			current_ev, end_buf, &iwe, buf);	}	if (bss && bss->rsn_ie_len > 0 && bss->rsn_ie_len <= MAX_WPA_IE_LEN) {		u8 *p = buf;		p += sprintf(p, "rsn_ie=");		for (i = 0; i < bss->rsn_ie_len; i++) {			p += sprintf(p, "%02x", bss->rsn_ie[i]);		}		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = IWEVCUSTOM;		iwe.u.data.length = strlen(buf);		current_ev = iwe_stream_add_point(			current_ev, end_buf, &iwe, buf);	}#endif /* WIRELESS_EXT > 17 */#endif /* WIRELESS_EXT > 14 */	return current_ev;}/* Translate scan data returned from the card to a card independant * format that the Wireless Tools will understand - Jean II */static inline int prism2_translate_scan(local_info_t *local,					char *buffer, int buflen){	struct hfa384x_hostscan_result *scan;	int entry, hostscan;	char *current_ev = buffer;	char *end_buf = buffer + buflen;	struct list_head *ptr;	spin_lock_bh(&local->lock);	list_for_each(ptr, &local->bss_list) {		struct hostap_bss_info *bss;		bss = list_entry(ptr, struct hostap_bss_info, list);		bss->included = 0;	}	hostscan = local->last_scan_type == PRISM2_HOSTSCAN;	for (entry = 0; entry < local->last_scan_results_count; entry++) {		int found = 0;		scan = &local->last_scan_results[entry];		/* Report every SSID if the AP is using multiple SSIDs. If no		 * BSS record is found (e.g., when WPA mode is disabled),		 * report the AP once. */		list_for_each(ptr, &local->bss_list) {			struct hostap_bss_info *bss;			bss = list_entry(ptr, struct hostap_bss_info, list);			if (memcmp(bss->bssid, scan->bssid, ETH_ALEN) == 0) {				bss->included = 1;				current_ev = __prism2_translate_scan(					local, scan, bss, current_ev, end_buf);				found++;			}		}		if (!found) {			current_ev = __prism2_translate_scan(				local, scan, NULL, current_ev, end_buf);		}#if WIRELESS_EXT > 16		/* Check if there is space for one more entry */		if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {			/* Ask user space to try again with a bigger buffer */			spin_unlock_bh(&local->lock);			return -E2BIG;		}#endif /* WIRELESS_EXT > 16 */	}	/* Prism2 firmware has limits (32 at least in some versions) for number	 * of BSSes in scan results. Extend this limit by using local BSS list.	 */	list_for_each(ptr, &local->bss_list) {		struct hostap_bss_info *bss;		bss = list_entry(ptr, struct hostap_bss_info, list);		if (bss->included)			continue;		current_ev = __prism2_translate_scan(local, NULL, bss,						     current_ev, end_buf);#if WIRELESS_EXT > 16		/* Check if there is space for one more entry */		if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {			/* Ask user space to try again with a bigger buffer */			spin_unlock_bh(&local->lock);			return -E2BIG;		}#endif /* WIRELESS_EXT > 16 */	}	spin_unlock_bh(&local->lock);	return current_ev - buffer;}#endif /* PRISM2_NO_STATION_MODES */static inline int prism2_ioctl_giwscan_sta(struct net_device *dev,					   struct iw_request_info *info,					   struct iw_point *data, char *extra){#ifdef PRISM2_NO_STATION_MODES	return -EOPNOTSUPP;#else /* PRISM2_NO_STATION_MODES */	struct hostap_interface *iface = dev->priv;	local_info_t *local = iface->local;	int res;	/* Wait until the scan is finished. We can probably do better	 * than that - Jean II */	if (local->scan_timestamp &&	    time_before(jiffies, local->scan_timestamp + 3 * HZ)) {		/* Important note : we don't want to block the caller		 * until results are ready for various reasons.		 * First, managing wait queues is complex and racy		 * (there may be multiple simultaneous callers).		 * Second, we grab some rtnetlink lock before comming		 * here (in dev_ioctl()).		 * Third, the caller can wait on the Wireless Event		 * - Jean II */		return -EAGAIN;	}	local->scan_timestamp = 0;	res = prism2_translate_scan(local, extra, data->length);	if (res >= 0) {		data->length = res;		return 0;	} else {		data->length = 0;		return res;	}#endif /* PRISM2_NO_STATION_MODES */}static int prism2_ioctl_giwscan(struct net_device *dev,				struct iw_request_info *info,				struct iw_point *data, char *extra){	struct hostap_interface *iface = dev->priv;	local_info_t *local = iface->local;	int res;	if (local->iw_mode == IW_MODE_MASTER) {		/* In MASTER mode, it doesn't make sense to go around		 * scanning the frequencies and make the stations we serve		 * wait when what the user is really interested about is the		 * list of stations and access points we are talking to.		 * So, just extract results from our cache...		 * Jean II */		/* Translate to WE format */		res = prism2_ap_translate_scan(dev, extra);		if (res >= 0) {			printk(KERN_DEBUG "Scan result translation succeeded "			       "(length=%d)\n", res);			data->length = res;			return 0;		} else {			printk(KERN_DEBUG			       "Scan result translation failed (res=%d)\n",			       res);			data->length = 0;			return res;		}	} else {		/* Station mode */		return prism2_ioctl_giwscan_sta(dev, info, data, extra);	}}static const struct iw_priv_args prism2_priv[] = {	{ PRISM2_IOCTL_MONITOR,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "monitor" },	{ PRISM2_IOCTL_READMIF,	  IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,	  IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "readmif" },	{ PRISM2_IOCTL_WRITEMIF,	  IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 2, 0, "writemif" },	{ PRISM2_IOCTL_RESET,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "reset" },	{ PRISM2_IOCTL_INQUIRE,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "inquire" },	{ PRISM2_IOCTL_SET_RID_WORD,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "set_rid_word" },	{ PRISM2_IOCTL_MACCMD,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "maccmd" },#ifdef PRISM2_USE_WE_TYPE_ADDR	{ PRISM2_IOCTL_WDS_ADD,	  IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "wds_add" },	{ PRISM2_IOCTL_WDS_DEL,	  IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "wds_del" },	{ PRISM2_IOCTL_ADDMAC,	  IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "addmac" },	{ PRISM2_IOCTL_DELMAC,	  IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "delmac" },	{ PRISM2_IOCTL_KICKMAC,	  IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "kickmac" },#else /* PRISM2_USE_WE_TYPE_ADDR */	{ PRISM2_IOCTL_WDS_ADD,	  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 18, 0, "wds_add" },	{ PRISM2_IOCTL_WDS_DEL,	  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 18, 0, "wds_del" },	{ PRISM2_IOCTL_ADDMAC,	  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 18, 0, "addmac" },	{ PRISM2_IOCTL_DELMAC,	  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 18, 0, "delmac" },	{ PRISM2_IOCTL_KICKMAC,	  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 18, 0, "kickmac" },#endif /* PRISM2_USE_WE_TYPE_ADDR */	/* --- raw access to sub-ioctls --- */	{ PRISM2_IOCTL_PRISM2_PARAM,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "prism2_param" },	{ PRISM2_IOCTL_GET_PRISM2_PARAM,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getprism2_param" },#ifdef PRISM2_USE_WE_SUB_IOCTLS	/* --- sub-ioctls handlers --- */	{ PRISM2_IOCTL_PRISM2_PARAM,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "" },	{ PRISM2_IOCTL_GET_PRISM2_PARAM,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "" },	/* --- sub-ioctls definitions --- */	{ PRISM2_PARAM_TXRATECTRL,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "txratectrl" },	{ PRISM2_PARAM_TXRATECTRL,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gettxratectrl" },	{ PRISM2_PARAM_BEACON_INT,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "beacon_int" },	{ PRISM2_PARAM_BEACON_INT,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbeacon_int" },#ifndef PRISM2_NO_STATION_MODES	{ PRISM2_PARAM_PSEUDO_IBSS,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "pseudo_ibss" },	{ PRISM2_PARAM_PSEUDO_IBSS,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getpseudo_ibss" },#endif /* PRISM2_NO_STATION_MODES */	{ PRISM2_PARAM_ALC,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "alc" },	{ PRISM2_PARAM_ALC,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getalc" },	{ PRISM2_PARAM_DUMP,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dump" },	{ PRISM2_PARAM_DUMP,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getdump" },	{ PRISM2_PARAM_OTHER_AP_POLICY,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "other_ap_policy" },	{ PRISM2_PARAM_OTHER_AP_POLICY,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getother_ap_pol" },	{ PRISM2_PARAM_AP_MAX_INACTIVITY,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "max_inactivity" },	{ PRISM2_PARAM_AP_MAX_INACTIVITY,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getmax_inactivi" },	{ PRISM2_PARAM_AP_BRIDGE_PACKETS,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bridge_packets" },	{ PRISM2_PARAM_AP_BRIDGE_PACKETS,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbridge_packe" },	{ PRISM2_PARAM_DTIM_PERIOD,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dtim_period" },	{ PRISM2_PARAM_DTIM_PERIOD,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getdtim_period" },	{ PRISM2_PARAM_AP_NULLFUNC_ACK,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "nullfunc_ack" },	{ PRISM2_PARAM_AP_NULLFUNC_ACK,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getnullfunc_ack" },	{ PRISM2_PARAM_MAX_WDS,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "max_wds" },	{ PRISM2_PARAM_MAX_WDS,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getmax_wds" },	{ PRISM2_PARAM_AP_AUTOM_AP_WDS,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "autom_ap_wds" },	{ PRISM2_PARAM_AP_AUTOM_AP_WDS,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getautom_ap_wds" },	{ PRISM2_PARAM_AP_AUTH_ALGS,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "ap_auth_algs" },	{ PRISM2_PARAM_AP_AUTH_ALGS,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getap_auth_algs" },	{ PRISM2_PARAM_MONITOR_ALLOW_FCSERR,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "allow_fcserr" },	{ PRISM2_PARAM_MONITOR_ALLOW_FCSERR,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getallow_fcserr" },	{ PRISM2_PARAM_HOST_ENCRYPT,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "host_encrypt" },	{ PRISM2_PARAM_HOST_ENCRYPT,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethost_encrypt" },	{ PRISM2_PARAM_HOST_DECRYPT,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "host_decrypt" },	{ PRISM2_PARAM_HOST_DECRYPT,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethost_decrypt" },	{ PRISM2_PARAM_BUS_MASTER_THRESHOLD_RX,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "busmaster_rx" },	{ PRISM2_PARAM_BUS_MASTER_THRESHOLD_RX,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbusmaster_rx" },	{ PRISM2_PARAM_BUS_MASTER_THRESHOLD_TX,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "busmaster_tx" },	{ PRISM2_PARAM_BUS_MASTER_THRESHOLD_TX,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbusmaster_tx" },#ifndef PRISM2_NO_STATION_MODES	{ PRISM2_PARAM_HOST_ROAMING,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "host_roaming" },	{ PRISM2_PARAM_HOST_ROAMING,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethost_roaming" },#endif /* PRISM2_NO_STATION_MODES */	{ PRISM2_PARAM_BCRX_STA_KEY,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bcrx_sta_key" },	{ PRISM2_PARAM_BCRX_STA_KEY,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbcrx_sta_key" },	{ PRISM2_PARAM_IEEE_802_1X,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "ieee_802_1x" },	{ PRISM2_PARAM_IEEE_802_1X,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getieee_802_1x" },	{ PRISM2_PARAM_ANTSEL_TX,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "antsel_tx" },	{ PRISM2_PARAM_ANTSEL_TX,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getantsel_tx" },	{ PRISM2_PARAM_ANTSEL_RX,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "antsel_rx" },	{ PRISM2_PARAM_ANTSEL_RX,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getantsel_rx" },	{ PRISM2_PARAM_MONITOR_TYPE,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "monitor_type" },	{ PRISM2_PARAM_MONITOR_TYPE,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getmonitor_type" },	{ PRISM2_PARAM_WDS_TYPE,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wds_type" },	{ PRISM2_PARAM_WDS_TYPE,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getwds_type" },	{ PRISM2_PARAM_HOSTSCAN,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "hostscan" },	{ PRISM2_PARAM_HOSTSCAN,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethostscan" },	{ PRISM2_PARAM_AP_SCAN,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "ap_scan" },	{ PRISM2_PARAM_AP_SCAN,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getap_scan" },	{ PRISM2_PARAM_ENH_SEC,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "enh_sec" },	{ PRISM2_PARAM_ENH_SEC,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getenh_sec" },#ifdef PRISM2_IO_DEBUG	{ PRISM2_PARAM_IO_DEBUG,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "io_debug" },	{ PRISM2_PARAM_IO_DEBUG,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getio_debug" },#endif /* PRISM2_IO_DEBUG */	{ PRISM2_PARAM_BASIC_RATES,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "basic_rates" },	{ PRISM2_PARAM_BASIC_RATES,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbasic_rates" },	{ PRISM2_PARAM_OPER_RATES,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "oper_rates" },	{ PRISM2_PARAM_OPER_RATES,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getoper_rates" },	{ PRISM2_PARAM_HOSTAPD,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "hostapd" },	{ PRISM2_PARAM_HOSTAPD,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethostapd" },	{ PRISM2_PARAM_HOSTAPD_STA,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "hostapd_sta" },	{ PRISM2_PARAM_HOSTAPD_STA,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethostapd_sta" },	{ PRISM2_PARAM_WPA,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wpa" },	{ PRISM2_PARAM_WPA,	  0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getwpa" },	{ PRISM2_PARAM_PRIVACY_INVOKED,	  IW_PRIV_

⌨️ 快捷键说明

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