Commit fd7ef879 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva Committed by Kalle Valo
Browse files

wifi: hostap: Avoid clashing function prototypes

When built with Control Flow Integrity, function prototypes between
caller and function declaration must match. These mismatches are visible
at compile time with the new -Wcast-function-type-strict in Clang[1].

Fix a total of 42 warnings like these:

../drivers/net/wireless/intersil/hostap/hostap_ioctl.c:3868:2: warning: cast from 'int (*)(struct net_device *, struct iw_request_info *, char *, char *)' to 'iw_handler' (aka 'int (*)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *)') converts to incompatible function type [-Wcast-function-type-strict]
        (iw_handler) prism2_get_name,                   /* SIOCGIWNAME */
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

The hostap Wireless Extension handler callbacks (iw_handler) use a
union for the data argument. Actually use the union and perform explicit
member selection in the function body instead of having a function
prototype mismatch. There are no resulting binary differences
before/after changes.

These changes were made partly manually and partly with the help of
Coccinelle.

Link: https://github.com/KSPP/linux/issues/235
Link: https://reviews.llvm.org/D134831

 [1]
Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/e480e7713f1a4909ae011068c8d793cc4a638fbd.1667934775.git.gustavoars@kernel.org
parent 02ae6a70
Loading
Loading
Loading
Loading
+133 −111
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ static int prism2_get_datarates(struct net_device *dev, u8 *rates)

static int prism2_get_name(struct net_device *dev,
			   struct iw_request_info *info,
			   char *name, char *extra)
			   union iwreq_data *wrqu, char *extra)
{
	u8 rates[10];
	int len, i, over2 = 0;
@@ -105,7 +105,7 @@ static int prism2_get_name(struct net_device *dev,
		}
	}

	strcpy(name, over2 ? "IEEE 802.11b" : "IEEE 802.11-DS");
	strcpy(wrqu->name, over2 ? "IEEE 802.11b" : "IEEE 802.11-DS");

	return 0;
}
@@ -113,8 +113,9 @@ static int prism2_get_name(struct net_device *dev,

static int prism2_ioctl_siwencode(struct net_device *dev,
				  struct iw_request_info *info,
				  struct iw_point *erq, char *keybuf)
				  union iwreq_data *wrqu, char *keybuf)
{
	struct iw_point *erq = &wrqu->encoding;
	struct hostap_interface *iface;
	local_info_t *local;
	int i;
@@ -215,8 +216,9 @@ static int prism2_ioctl_siwencode(struct net_device *dev,

static int prism2_ioctl_giwencode(struct net_device *dev,
				  struct iw_request_info *info,
				  struct iw_point *erq, char *key)
				  union iwreq_data *wrqu, char *key)
{
	struct iw_point *erq = &wrqu->encoding;
	struct hostap_interface *iface;
	local_info_t *local;
	int i, len;
@@ -321,8 +323,9 @@ static int hostap_set_rate(struct net_device *dev)

static int prism2_ioctl_siwrate(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *rrq, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rrq = &wrqu->bitrate;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -381,8 +384,9 @@ static int prism2_ioctl_siwrate(struct net_device *dev,

static int prism2_ioctl_giwrate(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *rrq, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rrq = &wrqu->bitrate;
	u16 val;
	struct hostap_interface *iface;
	local_info_t *local;
@@ -440,8 +444,9 @@ static int prism2_ioctl_giwrate(struct net_device *dev,

static int prism2_ioctl_siwsens(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *sens, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *sens = &wrqu->sens;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -461,8 +466,9 @@ static int prism2_ioctl_siwsens(struct net_device *dev,

static int prism2_ioctl_giwsens(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *sens, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *sens = &wrqu->sens;
	struct hostap_interface *iface;
	local_info_t *local;
	__le16 val;
@@ -485,8 +491,9 @@ static int prism2_ioctl_giwsens(struct net_device *dev,
/* Deprecated in new wireless extension API */
static int prism2_ioctl_giwaplist(struct net_device *dev,
				  struct iw_request_info *info,
				  struct iw_point *data, char *extra)
				  union iwreq_data *wrqu, char *extra)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;
	struct sockaddr *addr;
@@ -526,8 +533,9 @@ static int prism2_ioctl_giwaplist(struct net_device *dev,

static int prism2_ioctl_siwrts(struct net_device *dev,
			       struct iw_request_info *info,
			       struct iw_param *rts, char *extra)
			       union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rts = &wrqu->rts;
	struct hostap_interface *iface;
	local_info_t *local;
	__le16 val;
@@ -553,8 +561,9 @@ static int prism2_ioctl_siwrts(struct net_device *dev,

static int prism2_ioctl_giwrts(struct net_device *dev,
			       struct iw_request_info *info,
			       struct iw_param *rts, char *extra)
			       union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rts = &wrqu->rts;
	struct hostap_interface *iface;
	local_info_t *local;
	__le16 val;
@@ -576,8 +585,9 @@ static int prism2_ioctl_giwrts(struct net_device *dev,

static int prism2_ioctl_siwfrag(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *rts, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rts = &wrqu->rts;
	struct hostap_interface *iface;
	local_info_t *local;
	__le16 val;
@@ -603,8 +613,9 @@ static int prism2_ioctl_siwfrag(struct net_device *dev,

static int prism2_ioctl_giwfrag(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *rts, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rts = &wrqu->rts;
	struct hostap_interface *iface;
	local_info_t *local;
	__le16 val;
@@ -669,8 +680,9 @@ static int hostap_join_ap(struct net_device *dev)

static int prism2_ioctl_siwap(struct net_device *dev,
			      struct iw_request_info *info,
			      struct sockaddr *ap_addr, char *extra)
			      union iwreq_data *wrqu, char *extra)
{
	struct sockaddr *ap_addr = &wrqu->ap_addr;
#ifdef PRISM2_NO_STATION_MODES
	return -EOPNOTSUPP;
#else /* PRISM2_NO_STATION_MODES */
@@ -709,8 +721,9 @@ static int prism2_ioctl_siwap(struct net_device *dev,

static int prism2_ioctl_giwap(struct net_device *dev,
			      struct iw_request_info *info,
			      struct sockaddr *ap_addr, char *extra)
			      union iwreq_data *wrqu, char *extra)
{
	struct sockaddr *ap_addr = &wrqu->ap_addr;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -745,8 +758,9 @@ static int prism2_ioctl_giwap(struct net_device *dev,

static int prism2_ioctl_siwnickn(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *nickname)
				 union iwreq_data *wrqu, char *nickname)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -766,8 +780,9 @@ static int prism2_ioctl_siwnickn(struct net_device *dev,

static int prism2_ioctl_giwnickn(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *nickname)
				 union iwreq_data *wrqu, char *nickname)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;
	int len;
@@ -793,8 +808,9 @@ static int prism2_ioctl_giwnickn(struct net_device *dev,

static int prism2_ioctl_siwfreq(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_freq *freq, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_freq *freq = &wrqu->freq;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -830,8 +846,9 @@ static int prism2_ioctl_siwfreq(struct net_device *dev,

static int prism2_ioctl_giwfreq(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_freq *freq, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_freq *freq = &wrqu->freq;
	struct hostap_interface *iface;
	local_info_t *local;
	u16 val;
@@ -874,8 +891,9 @@ static void hostap_monitor_set_type(local_info_t *local)

static int prism2_ioctl_siwessid(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *ssid)
				 union iwreq_data *wrqu, char *ssid)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -910,8 +928,9 @@ static int prism2_ioctl_siwessid(struct net_device *dev,

static int prism2_ioctl_giwessid(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *essid)
				 union iwreq_data *wrqu, char *essid)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;
	u16 val;
@@ -946,8 +965,9 @@ static int prism2_ioctl_giwessid(struct net_device *dev,

static int prism2_ioctl_giwrange(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;
	struct iw_range *range = (struct iw_range *) extra;
@@ -1121,8 +1141,9 @@ static int hostap_monitor_mode_disable(local_info_t *local)

static int prism2_ioctl_siwmode(struct net_device *dev,
				struct iw_request_info *info,
				__u32 *mode, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	__u32 *mode = &wrqu->mode;
	struct hostap_interface *iface;
	local_info_t *local;
	int double_reset = 0;
@@ -1197,8 +1218,9 @@ static int prism2_ioctl_siwmode(struct net_device *dev,

static int prism2_ioctl_giwmode(struct net_device *dev,
				struct iw_request_info *info,
				__u32 *mode, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	__u32 *mode = &wrqu->mode;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -1222,8 +1244,9 @@ static int prism2_ioctl_giwmode(struct net_device *dev,

static int prism2_ioctl_siwpower(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_param *wrq, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_param *wrq = &wrqu->power;
#ifdef PRISM2_NO_STATION_MODES
	return -EOPNOTSUPP;
#else /* PRISM2_NO_STATION_MODES */
@@ -1281,8 +1304,9 @@ static int prism2_ioctl_siwpower(struct net_device *dev,

static int prism2_ioctl_giwpower(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_param *rrq, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rrq = &wrqu->power;
#ifdef PRISM2_NO_STATION_MODES
	return -EOPNOTSUPP;
#else /* PRISM2_NO_STATION_MODES */
@@ -1339,8 +1363,9 @@ static int prism2_ioctl_giwpower(struct net_device *dev,

static int prism2_ioctl_siwretry(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_param *rrq, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rrq = &wrqu->retry;
	struct hostap_interface *iface;
	local_info_t *local;

@@ -1400,8 +1425,9 @@ static int prism2_ioctl_siwretry(struct net_device *dev,

static int prism2_ioctl_giwretry(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_param *rrq, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rrq = &wrqu->retry;
	struct hostap_interface *iface;
	local_info_t *local;
	__le16 shortretry, longretry, lifetime, altretry;
@@ -1494,8 +1520,9 @@ static u16 prism2_txpower_dBm_to_hfa386x(int val)

static int prism2_ioctl_siwtxpow(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_param *rrq, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_param *rrq = &wrqu->txpower;
	struct hostap_interface *iface;
	local_info_t *local;
#ifdef RAW_TXPOWER_SETTING
@@ -1575,9 +1602,10 @@ static int prism2_ioctl_siwtxpow(struct net_device *dev,

static int prism2_ioctl_giwtxpow(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_param *rrq, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
#ifdef RAW_TXPOWER_SETTING
	struct iw_param *rrq = &wrqu->txpower;
	struct hostap_interface *iface;
	local_info_t *local;
	u16 resp0;
@@ -1710,8 +1738,9 @@ static inline int prism2_request_scan(struct net_device *dev)

static int prism2_ioctl_siwscan(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_point *data, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;
	int ret;
@@ -2057,8 +2086,9 @@ static inline int prism2_ioctl_giwscan_sta(struct net_device *dev,

static int prism2_ioctl_giwscan(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_point *data, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface;
	local_info_t *local;
	int res;
@@ -2303,7 +2333,7 @@ static int prism2_ioctl_priv_inquire(struct net_device *dev, int *i)

static int prism2_ioctl_priv_prism2_param(struct net_device *dev,
					  struct iw_request_info *info,
					  void *wrqu, char *extra)
					  union iwreq_data *uwrq, char *extra)
{
	struct hostap_interface *iface;
	local_info_t *local;
@@ -2654,7 +2684,7 @@ static int prism2_ioctl_priv_prism2_param(struct net_device *dev,

static int prism2_ioctl_priv_get_prism2_param(struct net_device *dev,
					      struct iw_request_info *info,
					      void *wrqu, char *extra)
					      union iwreq_data *wrqu, char *extra)
{
	struct hostap_interface *iface;
	local_info_t *local;
@@ -2841,7 +2871,7 @@ static int prism2_ioctl_priv_get_prism2_param(struct net_device *dev,

static int prism2_ioctl_priv_readmif(struct net_device *dev,
				     struct iw_request_info *info,
				     void *wrqu, char *extra)
				     union iwreq_data *wrqu, char *extra)
{
	struct hostap_interface *iface;
	local_info_t *local;
@@ -2862,7 +2892,7 @@ static int prism2_ioctl_priv_readmif(struct net_device *dev,

static int prism2_ioctl_priv_writemif(struct net_device *dev,
				      struct iw_request_info *info,
				      void *wrqu, char *extra)
				      union iwreq_data *wrqu, char *extra)
{
	struct hostap_interface *iface;
	local_info_t *local;
@@ -2885,7 +2915,7 @@ static int prism2_ioctl_priv_monitor(struct net_device *dev, int *i)
	struct hostap_interface *iface;
	local_info_t *local;
	int ret = 0;
	u32 mode;
	union iwreq_data wrqu;

	iface = netdev_priv(dev);
	local = iface->local;
@@ -2899,8 +2929,8 @@ static int prism2_ioctl_priv_monitor(struct net_device *dev, int *i)
	if (*i == 0) {
		/* Disable monitor mode - old mode was not saved, so go to
		 * Master mode */
		mode = IW_MODE_MASTER;
		ret = prism2_ioctl_siwmode(dev, NULL, &mode, NULL);
		wrqu.mode = IW_MODE_MASTER;
		ret = prism2_ioctl_siwmode(dev, NULL, &wrqu, NULL);
	} else if (*i == 1) {
		/* netlink socket mode is not supported anymore since it did
		 * not separate different devices from each other and was not
@@ -2916,8 +2946,8 @@ static int prism2_ioctl_priv_monitor(struct net_device *dev, int *i)
			local->monitor_type = PRISM2_MONITOR_PRISM;
			break;
		}
		mode = IW_MODE_MONITOR;
		ret = prism2_ioctl_siwmode(dev, NULL, &mode, NULL);
		wrqu.mode = IW_MODE_MONITOR;
		ret = prism2_ioctl_siwmode(dev, NULL, &wrqu, NULL);
		hostap_monitor_mode_enable(local);
	} else
		ret = -EINVAL;
@@ -3079,8 +3109,9 @@ static int prism2_set_genericelement(struct net_device *dev, u8 *elem,

static int prism2_ioctl_siwauth(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *data, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *data = &wrqu->param;
	struct hostap_interface *iface = netdev_priv(dev);
	local_info_t *local = iface->local;

@@ -3145,8 +3176,9 @@ static int prism2_ioctl_siwauth(struct net_device *dev,

static int prism2_ioctl_giwauth(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_param *data, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct iw_param *data = &wrqu->param;
	struct hostap_interface *iface = netdev_priv(dev);
	local_info_t *local = iface->local;

@@ -3184,8 +3216,9 @@ static int prism2_ioctl_giwauth(struct net_device *dev,

static int prism2_ioctl_siwencodeext(struct net_device *dev,
				     struct iw_request_info *info,
				     struct iw_point *erq, char *extra)
				     union iwreq_data *wrqu, char *extra)
{
	struct iw_point *erq = &wrqu->encoding;
	struct hostap_interface *iface = netdev_priv(dev);
	local_info_t *local = iface->local;
	struct iw_encode_ext *ext = (struct iw_encode_ext *) extra;
@@ -3358,8 +3391,9 @@ static int prism2_ioctl_siwencodeext(struct net_device *dev,

static int prism2_ioctl_giwencodeext(struct net_device *dev,
				     struct iw_request_info *info,
				     struct iw_point *erq, char *extra)
				     union iwreq_data *wrqu, char *extra)
{
	struct iw_point *erq = &wrqu->encoding;
	struct hostap_interface *iface = netdev_priv(dev);
	local_info_t *local = iface->local;
	struct lib80211_crypt_data **crypt;
@@ -3666,16 +3700,18 @@ static int prism2_ioctl_set_assoc_ap_addr(local_info_t *local,

static int prism2_ioctl_siwgenie(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_point *data = &wrqu->data;
	return prism2_set_genericelement(dev, extra, data->length);
}


static int prism2_ioctl_giwgenie(struct net_device *dev,
				 struct iw_request_info *info,
				 struct iw_point *data, char *extra)
				 union iwreq_data *wrqu, char *extra)
{
	struct iw_point *data = &wrqu->data;
	struct hostap_interface *iface = netdev_priv(dev);
	local_info_t *local = iface->local;
	int len = local->generic_elem_len - 2;
@@ -3713,7 +3749,7 @@ static int prism2_ioctl_set_generic_element(local_info_t *local,

static int prism2_ioctl_siwmlme(struct net_device *dev,
				struct iw_request_info *info,
				struct iw_point *data, char *extra)
				union iwreq_data *wrqu, char *extra)
{
	struct hostap_interface *iface = netdev_priv(dev);
	local_info_t *local = iface->local;
@@ -3864,70 +3900,56 @@ const struct ethtool_ops prism2_ethtool_ops = {

static const iw_handler prism2_handler[] =
{
	(iw_handler) NULL,				/* SIOCSIWCOMMIT */
	(iw_handler) prism2_get_name,			/* SIOCGIWNAME */
	(iw_handler) NULL,				/* SIOCSIWNWID */
	(iw_handler) NULL,				/* SIOCGIWNWID */
	(iw_handler) prism2_ioctl_siwfreq,		/* SIOCSIWFREQ */
	(iw_handler) prism2_ioctl_giwfreq,		/* SIOCGIWFREQ */
	(iw_handler) prism2_ioctl_siwmode,		/* SIOCSIWMODE */
	(iw_handler) prism2_ioctl_giwmode,		/* SIOCGIWMODE */
	(iw_handler) prism2_ioctl_siwsens,		/* SIOCSIWSENS */
	(iw_handler) prism2_ioctl_giwsens,		/* SIOCGIWSENS */
	(iw_handler) NULL /* not used */,		/* SIOCSIWRANGE */
	(iw_handler) prism2_ioctl_giwrange,		/* SIOCGIWRANGE */
	(iw_handler) NULL /* not used */,		/* SIOCSIWPRIV */
	(iw_handler) NULL /* kernel code */,		/* SIOCGIWPRIV */
	(iw_handler) NULL /* not used */,		/* SIOCSIWSTATS */
	(iw_handler) NULL /* kernel code */,		/* SIOCGIWSTATS */
	iw_handler_set_spy,				/* SIOCSIWSPY */
	iw_handler_get_spy,				/* SIOCGIWSPY */
	iw_handler_set_thrspy,				/* SIOCSIWTHRSPY */
	iw_handler_get_thrspy,				/* SIOCGIWTHRSPY */
	(iw_handler) prism2_ioctl_siwap,		/* SIOCSIWAP */
	(iw_handler) prism2_ioctl_giwap,		/* SIOCGIWAP */
	(iw_handler) prism2_ioctl_siwmlme,		/* SIOCSIWMLME */
	(iw_handler) prism2_ioctl_giwaplist,		/* SIOCGIWAPLIST */
	(iw_handler) prism2_ioctl_siwscan,		/* SIOCSIWSCAN */
	(iw_handler) prism2_ioctl_giwscan,		/* SIOCGIWSCAN */
	(iw_handler) prism2_ioctl_siwessid,		/* SIOCSIWESSID */
	(iw_handler) prism2_ioctl_giwessid,		/* SIOCGIWESSID */
	(iw_handler) prism2_ioctl_siwnickn,		/* SIOCSIWNICKN */
	(iw_handler) prism2_ioctl_giwnickn,		/* SIOCGIWNICKN */
	(iw_handler) NULL,				/* -- hole -- */
	(iw_handler) NULL,				/* -- hole -- */
	(iw_handler) prism2_ioctl_siwrate,		/* SIOCSIWRATE */
	(iw_handler) prism2_ioctl_giwrate,		/* SIOCGIWRATE */
	(iw_handler) prism2_ioctl_siwrts,		/* SIOCSIWRTS */
	(iw_handler) prism2_ioctl_giwrts,		/* SIOCGIWRTS */
	(iw_handler) prism2_ioctl_siwfrag,		/* SIOCSIWFRAG */
	(iw_handler) prism2_ioctl_giwfrag,		/* SIOCGIWFRAG */
	(iw_handler) prism2_ioctl_siwtxpow,		/* SIOCSIWTXPOW */
	(iw_handler) prism2_ioctl_giwtxpow,		/* SIOCGIWTXPOW */
	(iw_handler) prism2_ioctl_siwretry,		/* SIOCSIWRETRY */
	(iw_handler) prism2_ioctl_giwretry,		/* SIOCGIWRETRY */
	(iw_handler) prism2_ioctl_siwencode,		/* SIOCSIWENCODE */
	(iw_handler) prism2_ioctl_giwencode,		/* SIOCGIWENCODE */
	(iw_handler) prism2_ioctl_siwpower,		/* SIOCSIWPOWER */
	(iw_handler) prism2_ioctl_giwpower,		/* SIOCGIWPOWER */
	(iw_handler) NULL,				/* -- hole -- */
	(iw_handler) NULL,				/* -- hole -- */
	(iw_handler) prism2_ioctl_siwgenie,		/* SIOCSIWGENIE */
	(iw_handler) prism2_ioctl_giwgenie,		/* SIOCGIWGENIE */
	(iw_handler) prism2_ioctl_siwauth,		/* SIOCSIWAUTH */
	(iw_handler) prism2_ioctl_giwauth,		/* SIOCGIWAUTH */
	(iw_handler) prism2_ioctl_siwencodeext,		/* SIOCSIWENCODEEXT */
	(iw_handler) prism2_ioctl_giwencodeext,		/* SIOCGIWENCODEEXT */
	(iw_handler) NULL,				/* SIOCSIWPMKSA */
	(iw_handler) NULL,				/* -- hole -- */
	IW_HANDLER(SIOCGIWNAME,		prism2_get_name),
	IW_HANDLER(SIOCSIWFREQ,		prism2_ioctl_siwfreq),
	IW_HANDLER(SIOCGIWFREQ,		prism2_ioctl_giwfreq),
	IW_HANDLER(SIOCSIWMODE,		prism2_ioctl_siwmode),
	IW_HANDLER(SIOCGIWMODE,		prism2_ioctl_giwmode),
	IW_HANDLER(SIOCSIWSENS,		prism2_ioctl_siwsens),
	IW_HANDLER(SIOCGIWSENS,		prism2_ioctl_giwsens),
	IW_HANDLER(SIOCGIWRANGE,	prism2_ioctl_giwrange),
	IW_HANDLER(SIOCSIWSPY,		iw_handler_set_spy),
	IW_HANDLER(SIOCGIWSPY,		iw_handler_get_spy),
	IW_HANDLER(SIOCSIWTHRSPY,	iw_handler_set_thrspy),
	IW_HANDLER(SIOCGIWTHRSPY,	iw_handler_get_thrspy),
	IW_HANDLER(SIOCSIWAP,		prism2_ioctl_siwap),
	IW_HANDLER(SIOCGIWAP,		prism2_ioctl_giwap),
	IW_HANDLER(SIOCSIWMLME,		prism2_ioctl_siwmlme),
	IW_HANDLER(SIOCGIWAPLIST,       prism2_ioctl_giwaplist),
	IW_HANDLER(SIOCSIWSCAN,		prism2_ioctl_siwscan),
	IW_HANDLER(SIOCGIWSCAN,		prism2_ioctl_giwscan),
	IW_HANDLER(SIOCSIWESSID,        prism2_ioctl_siwessid),
	IW_HANDLER(SIOCGIWESSID,        prism2_ioctl_giwessid),
	IW_HANDLER(SIOCSIWNICKN,        prism2_ioctl_siwnickn),
	IW_HANDLER(SIOCGIWNICKN,        prism2_ioctl_giwnickn),
	IW_HANDLER(SIOCSIWRATE,		prism2_ioctl_siwrate),
	IW_HANDLER(SIOCGIWRATE,		prism2_ioctl_giwrate),
	IW_HANDLER(SIOCSIWRTS,		prism2_ioctl_siwrts),
	IW_HANDLER(SIOCGIWRTS,		prism2_ioctl_giwrts),
	IW_HANDLER(SIOCSIWFRAG,		prism2_ioctl_siwfrag),
	IW_HANDLER(SIOCGIWFRAG,		prism2_ioctl_giwfrag),
	IW_HANDLER(SIOCSIWTXPOW,        prism2_ioctl_siwtxpow),
	IW_HANDLER(SIOCGIWTXPOW,        prism2_ioctl_giwtxpow),
	IW_HANDLER(SIOCSIWRETRY,        prism2_ioctl_siwretry),
	IW_HANDLER(SIOCGIWRETRY,        prism2_ioctl_giwretry),
	IW_HANDLER(SIOCSIWENCODE,       prism2_ioctl_siwencode),
	IW_HANDLER(SIOCGIWENCODE,       prism2_ioctl_giwencode),
	IW_HANDLER(SIOCSIWPOWER,        prism2_ioctl_siwpower),
	IW_HANDLER(SIOCGIWPOWER,        prism2_ioctl_giwpower),
	IW_HANDLER(SIOCSIWGENIE,        prism2_ioctl_siwgenie),
	IW_HANDLER(SIOCGIWGENIE,        prism2_ioctl_giwgenie),
	IW_HANDLER(SIOCSIWAUTH,		prism2_ioctl_siwauth),
	IW_HANDLER(SIOCGIWAUTH,		prism2_ioctl_giwauth),
	IW_HANDLER(SIOCSIWENCODEEXT,    prism2_ioctl_siwencodeext),
	IW_HANDLER(SIOCGIWENCODEEXT,    prism2_ioctl_giwencodeext),
};

static const iw_handler prism2_private_handler[] =
{						/* SIOCIWFIRSTPRIV + */
	(iw_handler) prism2_ioctl_priv_prism2_param,	/* 0 */
	(iw_handler) prism2_ioctl_priv_get_prism2_param, /* 1 */
	(iw_handler) prism2_ioctl_priv_writemif,	/* 2 */
	(iw_handler) prism2_ioctl_priv_readmif,		/* 3 */
	prism2_ioctl_priv_prism2_param,		/* 0 */
	prism2_ioctl_priv_get_prism2_param,	/* 1 */
	prism2_ioctl_priv_writemif,		/* 2 */
	prism2_ioctl_priv_readmif,		/* 3 */
};

const struct iw_handler_def hostap_iw_handler_def =
@@ -3935,8 +3957,8 @@ const struct iw_handler_def hostap_iw_handler_def =
	.num_standard	= ARRAY_SIZE(prism2_handler),
	.num_private	= ARRAY_SIZE(prism2_private_handler),
	.num_private_args = ARRAY_SIZE(prism2_priv),
	.standard	= (iw_handler *) prism2_handler,
	.private	= (iw_handler *) prism2_private_handler,
	.standard	= prism2_handler,
	.private	= prism2_private_handler,
	.private_args	= (struct iw_priv_args *) prism2_priv,
	.get_wireless_stats = hostap_get_wireless_stats,
};