isl_ioctl.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 2,270 行 · 第 1/5 页

C
2,270
字号
		 */	case DOT11_OID_DEAUTHENTICATEEX:		send_formatted_event(priv, "DeAuthenticate request", mlme, 0);		break;	case DOT11_OID_AUTHENTICATEEX:		handle_request(priv, mlme, oid);		send_formatted_event(priv, "Authenticate request", mlme, 1);		break;	case DOT11_OID_DISASSOCIATEEX:		send_formatted_event(priv, "Disassociate request", mlme, 0);		break;	case DOT11_OID_ASSOCIATEEX:		handle_request(priv, mlme, oid);		send_formatted_event(priv, "Associate request", mlme, 1);		break;	case DOT11_OID_REASSOCIATEEX:		handle_request(priv, mlme, oid);		send_formatted_event(priv, "Reassociate request", mlme, 1);		break;	default:		return -EINVAL;	}	return 0;}/* * Process a device trap.  This is called via schedule_work(), outside of * interrupt context, no locks held. */voidprism54_process_trap(void *data){	struct islpci_mgmtframe *frame = data;	struct net_device *ndev = frame->ndev;	enum oid_num_t n = mgt_oidtonum(frame->header->oid);	if (n != OID_NUM_LAST)		prism54_process_trap_helper(netdev_priv(ndev), n, frame->data);	islpci_mgt_release(frame);}intprism54_set_mac_address(struct net_device *ndev, void *addr){	islpci_private *priv = netdev_priv(ndev);	int ret;	if (ndev->addr_len != 6)		return -EINVAL;	ret = mgt_set_request(priv, GEN_OID_MACADDRESS, 0,			      &((struct sockaddr *) addr)->sa_data);	if (!ret)		memcpy(priv->ndev->dev_addr,		       &((struct sockaddr *) addr)->sa_data, 6);	return ret;}intprism54_set_wpa(struct net_device *ndev, struct iw_request_info *info,		__u32 * uwrq, char *extra){	islpci_private *priv = netdev_priv(ndev);	down_write(&priv->mib_sem);	priv->wpa = *uwrq;	if (priv->wpa) {		u32 l = DOT11_MLME_EXTENDED;		mgt_set(priv, DOT11_OID_MLMEAUTOLEVEL, &l);	}	/* restart the card with new level. Needed ? */	mgt_commit(priv);	up_write(&priv->mib_sem);	return 0;}intprism54_get_wpa(struct net_device *ndev, struct iw_request_info *info,		__u32 * uwrq, char *extra){	islpci_private *priv = netdev_priv(ndev);	*uwrq = priv->wpa;	return 0;}intprism54_set_prismhdr(struct net_device *ndev, struct iw_request_info *info,		     __u32 * uwrq, char *extra){	islpci_private *priv = netdev_priv(ndev);	priv->monitor_type =	    (*uwrq ? ARPHRD_IEEE80211_PRISM : ARPHRD_IEEE80211);	if (priv->iw_mode == IW_MODE_MONITOR)		priv->ndev->type = priv->monitor_type;	return 0;}intprism54_get_prismhdr(struct net_device *ndev, struct iw_request_info *info,		     __u32 * uwrq, char *extra){	islpci_private *priv = netdev_priv(ndev);	*uwrq = (priv->monitor_type == ARPHRD_IEEE80211_PRISM);	return 0;}intprism54_debug_oid(struct net_device *ndev, struct iw_request_info *info,		  __u32 * uwrq, char *extra){	islpci_private *priv = netdev_priv(ndev);	priv->priv_oid = *uwrq;	printk("%s: oid 0x%08X\n", ndev->name, *uwrq);	return 0;}intprism54_debug_get_oid(struct net_device *ndev, struct iw_request_info *info,		      struct iw_point *data, char *extra){	islpci_private *priv = netdev_priv(ndev);	struct islpci_mgmtframe *response = NULL;	int ret = -EIO;	printk("%s: get_oid 0x%08X\n", ndev->name, priv->priv_oid);	data->length = 0;	if (islpci_get_state(priv) >= PRV_STATE_INIT) {		ret =		    islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET,					   priv->priv_oid, extra, 256,					   &response);		printk("%s: ret: %i\n", ndev->name, ret);		if (ret || !response		    || response->header->operation == PIMFOR_OP_ERROR) {			if (response) {				islpci_mgt_release(response);			}			printk("%s: EIO\n", ndev->name);			ret = -EIO;		}		if (!ret) {			data->length = response->header->length;			memcpy(extra, response->data, data->length);			islpci_mgt_release(response);			printk("%s: len: %i\n", ndev->name, data->length);		}	}	return ret;}intprism54_debug_set_oid(struct net_device *ndev, struct iw_request_info *info,		      struct iw_point *data, char *extra){	islpci_private *priv = netdev_priv(ndev);	struct islpci_mgmtframe *response = NULL;	int ret = 0, response_op = PIMFOR_OP_ERROR;	printk("%s: set_oid 0x%08X\tlen: %d\n", ndev->name, priv->priv_oid,	       data->length);	if (islpci_get_state(priv) >= PRV_STATE_INIT) {		ret =		    islpci_mgt_transaction(priv->ndev, PIMFOR_OP_SET,					   priv->priv_oid, extra, data->length,					   &response);		printk("%s: ret: %i\n", ndev->name, ret);		if (ret || !response		    || response->header->operation == PIMFOR_OP_ERROR) {			if (response) {				islpci_mgt_release(response);			}			printk("%s: EIO\n", ndev->name);			ret = -EIO;		}		if (!ret) {			response_op = response->header->operation;			printk("%s: response_op: %i\n", ndev->name,			       response_op);			islpci_mgt_release(response);		}	}	return (ret ? ret : -EINPROGRESS);}static intprism54_set_spy(struct net_device *ndev,		struct iw_request_info *info,		union iwreq_data *uwrq, char *extra){	islpci_private *priv = netdev_priv(ndev);	u32 u, oid = OID_INL_CONFIG;	down_write(&priv->mib_sem);	mgt_get(priv, OID_INL_CONFIG, &u);	if ((uwrq->data.length == 0) && (priv->spy_data.spy_number > 0))		/* disable spy */		u &= ~INL_CONFIG_RXANNEX;	else if ((uwrq->data.length > 0) && (priv->spy_data.spy_number == 0))		/* enable spy */		u |= INL_CONFIG_RXANNEX;	mgt_set(priv, OID_INL_CONFIG, &u);	mgt_commit_list(priv, &oid, 1);	up_write(&priv->mib_sem);	return iw_handler_set_spy(ndev, info, uwrq, extra);}static const iw_handler prism54_handler[] = {	(iw_handler) prism54_commit,	/* SIOCSIWCOMMIT */	(iw_handler) prism54_get_name,	/* SIOCGIWNAME */	(iw_handler) NULL,	/* SIOCSIWNWID */	(iw_handler) NULL,	/* SIOCGIWNWID */	(iw_handler) prism54_set_freq,	/* SIOCSIWFREQ */	(iw_handler) prism54_get_freq,	/* SIOCGIWFREQ */	(iw_handler) prism54_set_mode,	/* SIOCSIWMODE */	(iw_handler) prism54_get_mode,	/* SIOCGIWMODE */	(iw_handler) prism54_set_sens,	/* SIOCSIWSENS */	(iw_handler) prism54_get_sens,	/* SIOCGIWSENS */	(iw_handler) NULL,	/* SIOCSIWRANGE */	(iw_handler) prism54_get_range,	/* SIOCGIWRANGE */	(iw_handler) NULL,	/* SIOCSIWPRIV */	(iw_handler) NULL,	/* SIOCGIWPRIV */	(iw_handler) NULL,	/* SIOCSIWSTATS */	(iw_handler) NULL,	/* SIOCGIWSTATS */	prism54_set_spy,	/* SIOCSIWSPY */	iw_handler_get_spy,	/* SIOCGIWSPY */	iw_handler_set_thrspy,	/* SIOCSIWTHRSPY */	iw_handler_get_thrspy,	/* SIOCGIWTHRSPY */	(iw_handler) prism54_set_wap,	/* SIOCSIWAP */	(iw_handler) prism54_get_wap,	/* SIOCGIWAP */	(iw_handler) NULL,	/* -- hole -- */	(iw_handler) NULL,	/* SIOCGIWAPLIST depreciated */	(iw_handler) prism54_set_scan,	/* SIOCSIWSCAN */	(iw_handler) prism54_get_scan,	/* SIOCGIWSCAN */	(iw_handler) prism54_set_essid,	/* SIOCSIWESSID */	(iw_handler) prism54_get_essid,	/* SIOCGIWESSID */	(iw_handler) prism54_set_nick,	/* SIOCSIWNICKN */	(iw_handler) prism54_get_nick,	/* SIOCGIWNICKN */	(iw_handler) NULL,	/* -- hole -- */	(iw_handler) NULL,	/* -- hole -- */	(iw_handler) prism54_set_rate,	/* SIOCSIWRATE */	(iw_handler) prism54_get_rate,	/* SIOCGIWRATE */	(iw_handler) prism54_set_rts,	/* SIOCSIWRTS */	(iw_handler) prism54_get_rts,	/* SIOCGIWRTS */	(iw_handler) prism54_set_frag,	/* SIOCSIWFRAG */	(iw_handler) prism54_get_frag,	/* SIOCGIWFRAG */	(iw_handler) prism54_set_txpower,	/* SIOCSIWTXPOW */	(iw_handler) prism54_get_txpower,	/* SIOCGIWTXPOW */	(iw_handler) prism54_set_retry,	/* SIOCSIWRETRY */	(iw_handler) prism54_get_retry,	/* SIOCGIWRETRY */	(iw_handler) prism54_set_encode,	/* SIOCSIWENCODE */	(iw_handler) prism54_get_encode,	/* SIOCGIWENCODE */	(iw_handler) NULL,	/* SIOCSIWPOWER */	(iw_handler) NULL,	/* SIOCGIWPOWER */};/* The low order bit identify a SET (0) or a GET (1) ioctl.  */#define PRISM54_RESET		SIOCIWFIRSTPRIV#define PRISM54_GET_POLICY	SIOCIWFIRSTPRIV+1#define PRISM54_SET_POLICY	SIOCIWFIRSTPRIV+2#define PRISM54_GET_MAC		SIOCIWFIRSTPRIV+3#define PRISM54_ADD_MAC		SIOCIWFIRSTPRIV+4#define PRISM54_DEL_MAC		SIOCIWFIRSTPRIV+6#define PRISM54_KICK_MAC	SIOCIWFIRSTPRIV+8#define PRISM54_KICK_ALL	SIOCIWFIRSTPRIV+10#define PRISM54_GET_WPA		SIOCIWFIRSTPRIV+11#define PRISM54_SET_WPA		SIOCIWFIRSTPRIV+12#define PRISM54_DBG_OID		SIOCIWFIRSTPRIV+14#define PRISM54_DBG_GET_OID	SIOCIWFIRSTPRIV+15#define PRISM54_DBG_SET_OID	SIOCIWFIRSTPRIV+16#define PRISM54_GET_OID		SIOCIWFIRSTPRIV+17#define PRISM54_SET_OID_U32	SIOCIWFIRSTPRIV+18#define	PRISM54_SET_OID_STR	SIOCIWFIRSTPRIV+20#define	PRISM54_SET_OID_ADDR	SIOCIWFIRSTPRIV+22#define PRISM54_GET_PRISMHDR	SIOCIWFIRSTPRIV+23#define PRISM54_SET_PRISMHDR	SIOCIWFIRSTPRIV+24#define IWPRIV_SET_U32(n,x)	{ n, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "s_"x }#define IWPRIV_SET_SSID(n,x)	{ n, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 1, 0, "s_"x }#define IWPRIV_SET_ADDR(n,x)	{ n, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "s_"x }#define IWPRIV_GET(n,x)	{ n, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | PRIV_STR_SIZE, "g_"x }#define IWPRIV_U32(n,x)		IWPRIV_SET_U32(n,x), IWPRIV_GET(n,x)#define IWPRIV_SSID(n,x)	IWPRIV_SET_SSID(n,x), IWPRIV_GET(n,x)#define IWPRIV_ADDR(n,x)	IWPRIV_SET_ADDR(n,x), IWPRIV_GET(n,x)/* Note : limited to 128 private ioctls (wireless tools 26) */static const struct iw_priv_args prism54_private_args[] = {/*{ cmd, set_args, get_args, name } */	{PRISM54_RESET, 0, 0, "reset"},	{PRISM54_GET_PRISMHDR, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,	 "get_prismhdr"},	{PRISM54_SET_PRISMHDR, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,	 "set_prismhdr"},	{PRISM54_GET_POLICY, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,	 "getPolicy"},	{PRISM54_SET_POLICY, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,	 "setPolicy"},	{PRISM54_GET_MAC, 0, IW_PRIV_TYPE_ADDR | 64, "getMac"},	{PRISM54_ADD_MAC, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,	 "addMac"},	{PRISM54_DEL_MAC, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,	 "delMac"},	{PRISM54_KICK_MAC, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,	 "kickMac"},	{PRISM54_KICK_ALL, 0, 0, "kickAll"},	{PRISM54_GET_WPA, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,	 "get_wpa"},	{PRISM54_SET_WPA, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,	 "set_wpa"},	{PRISM54_DBG_OID, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,	 "dbg_oid"},	{PRISM54_DBG_GET_OID, 0, IW_PRIV_TYPE_BYTE | 256, "dbg_get_oid"},	{PRISM54_DBG_SET_OID, IW_PRIV_TYPE_BYTE | 256, 0, "dbg_set_oid"},	/* --- sub-ioctls handlers --- */	{PRISM54_GET_OID,	 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | PRIV_STR_SIZE, ""},	{PRISM54_SET_OID_U32,	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, ""},	{PRISM54_SET_OID_STR,	 IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 1, 0, ""},	{PRISM54_SET_OID_ADDR,	 IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, ""},	/* --- sub-ioctls definitions --- */	IWPRIV_ADDR(GEN_OID_MACADDRESS, "addr"),	IWPRIV_GET(GEN_OID_LINKSTATE, "linkstate"),	IWPRIV_U32(DOT11_OID_BSSTYPE, "bsstype"),	IWPRIV_ADDR(DOT11_OID_BSSID, "bssid"),	IWPRIV_U32(DOT11_OID_STATE, "state"),	IWPRIV_U32(DOT11_OID_AID, "aid"),	IWPRIV_SSID(DOT11_OID_SSIDOVERRIDE, "ssidoverride"),	IWPRIV_U32(DOT11_OID_MEDIUMLIMIT, "medlimit"),	IWPRIV_U32(DOT11_OID_BEACONPERIOD, "beacon"),	IWPRIV_U32(DOT11_OID_DTIMPERIOD, "dtimperiod"),	IWPRIV_U32(DOT11_OID_AUTHENABLE, "authenable"),	IWPRIV_U32(DOT11_OID_PRIVACYINVOKED, "privinvok"),	IWPRIV_U32(DOT11_OID_EXUNENCRYPTED, "exunencrypt"),	IWPRIV_U32(DOT11_OID_REKEYTHRESHOLD, "rekeythresh"),	IWPRIV_U32(DOT11_OID_MAXTXLIFETIME, "maxtxlife"),	IWPRIV_U32(DOT11_OID_MAXRXLIFETIME, "maxrxlife"),	IWPRIV_U32(DOT11_OID_ALOFT_FIXEDRATE, "fixedrate"),	IWPRIV_U32(DOT11_OID_MAXFRAMEBURST, "frameburst"),	IWPRIV_U32(DOT11_OID_PSM, "psm"),	IWPRIV_U32(DOT11_OID_BRIDGELOCAL, "bridge"),	IWPRIV_U32(DOT11_OID_CLIENTS, "clients"),	IWPRIV_U32(DOT11_OID_CLIENTSASSOCIATED, "clientassoc"),	IWPRIV_U32(DOT11_OID_DOT1XENABLE, "dot1xenable"),	IWPRIV_U32(DOT11_OID_ANTENNARX, "rxant"),	IWPRIV_U32(DOT11_OID_ANTENNATX, "txant"),	IWPRIV_U32(DOT11_OID_ANTENNADIVERSITY, "antdivers"),	IWPRIV_U32(DOT11_OID_EDTHRESHOLD, "edthresh"),	IWPRIV_U32(DOT11_OID_PREAMBLESETTINGS, "preamble"),	IWPRIV_GET(DOT11_OID_RATES, "rates"),	IWPRIV_U32(DOT11_OID_OUTPUTPOWER, ".11outpower"),	IWPRIV_GET(DOT11_OID_SUPPORTEDRATES, "supprates"),	IWPRIV_GET(DOT11_OID_SUPPORTEDFREQUENCIES, "suppfreq"),	IWPRIV_U32(DOT11_OID_NOISEFLOOR, "noisefloor"),	IWPRIV_GET(DOT11_OID_FREQUENCYACTIVITY, "freqactivity"),	IWPRIV_U32(DOT11_OID_NONERPPROTECTION, "nonerpprotec"),	IWPRIV_U32(DOT11_OID_PROFILES, "profile"),	IWPRIV_GET(DOT11_OID_EXTENDEDRATES, "extrates"),	IWPRIV_U32(DOT11_OID_MLMEAUTOLEVEL, "mlmelevel"),	IWPRIV_GET(DOT11_OID_BSSS, "bsss"),	IWPRIV_GET(DOT11_OID_BSSLIST, "bsslist"),	IWPRIV_U32(OID_INL_MODE, "mode"),	IWPRIV_U32(OID_INL_CONFIG, "config"),	IWPRIV_U32(OID_INL_DOT11D_CONFORMANCE, ".11dconform"),	IWPRIV_GET(OID_INL_PHYCAPABILITIES, "phycapa"),	IWPRIV_U32(OID_INL_OUTPUTPOWER, "outpower"),};static const iw_handler prism54_private_handler[] = {	(iw_handler) prism54_reset,	(iw_handler) prism54_get_policy,	(iw_handler) prism54_set_policy,	(iw_handler) prism54_get_mac,	(iw_handler) prism54_add_mac,	(iw_handler) NULL,	(iw_handler) prism54_del_mac,	(iw_handler) NULL,	(iw_handler) prism54_kick_mac,	(iw_handler) NULL,	(iw_handler) prism54_kick_all,	(iw_handler) prism54_get_wpa,	(iw_handler) prism54_set_wpa,	(iw_handler) NULL,	(iw_handler) prism54_debug_oid,	(iw_handler) prism54_debug_get_oid,	(iw_handler) prism54_debug_set_oid,	(iw_handler) prism54_get_oid,	(iw_handler) prism54_set_u32,	(iw_handler) NULL,	(iw_handler) prism54_set_raw,	(iw_handler) NULL,	(iw_handler) prism54_set_raw,	(iw_handler) prism54_get_prismhdr,	(iw_handler) prism54_set_prismhdr,};const struct iw_handler_def prism54_handler_def = {	.num_standard = sizeof (prism54_handler) / sizeof (iw_handler),	.num_private = sizeof (prism54_private_handler) / sizeof (iw_handler),	.num_private_args =	    sizeof (prism54_private_args) / sizeof (struct iw_priv_args),	.standard = (iw_handler *) prism54_handler,	.private = (iw_handler *) prism54_private_handler,	.private_args = (struct iw_priv_args *) prism54_private_args,	.spy_offset = offsetof(islpci_private, spy_data),};/* For ioctls that don't work with the new API */intprism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd){	return -EOPNOTSUPP;}

⌨️ 快捷键说明

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