Add ioctl wrappers for Linux wireless extensions version 22.

Patch from Gwenael Lambrouin.  Fixes #159452.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8734
This commit is contained in:
Julian Seward 2008-11-05 16:59:55 +00:00
parent 650da4509d
commit 3a2fbbfafd
2 changed files with 348 additions and 0 deletions

View File

@ -4227,6 +4227,99 @@ PRE(sys_ioctl)
PRE_MEM_WRITE( "ioctl(I2C_FUNCS)", ARG3, sizeof(unsigned long) );
break;
/* Wireless extensions ioctls */
case VKI_SIOCSIWCOMMIT:
case VKI_SIOCSIWNWID:
case VKI_SIOCSIWFREQ:
case VKI_SIOCSIWMODE:
case VKI_SIOCSIWSENS:
case VKI_SIOCSIWRANGE:
case VKI_SIOCSIWPRIV:
case VKI_SIOCSIWSTATS:
case VKI_SIOCSIWSPY:
case VKI_SIOCSIWTHRSPY:
case VKI_SIOCSIWAP:
case VKI_SIOCSIWSCAN:
case VKI_SIOCSIWESSID:
case VKI_SIOCSIWRATE:
case VKI_SIOCSIWNICKN:
case VKI_SIOCSIWRTS:
case VKI_SIOCSIWFRAG:
case VKI_SIOCSIWTXPOW:
case VKI_SIOCSIWRETRY:
case VKI_SIOCSIWENCODE:
case VKI_SIOCSIWPOWER:
case VKI_SIOCSIWGENIE:
case VKI_SIOCSIWMLME:
case VKI_SIOCSIWAUTH:
case VKI_SIOCSIWENCODEEXT:
case VKI_SIOCSIWPMKSA:
break;
case VKI_SIOCGIWNAME:
if (ARG3) {
PRE_MEM_WRITE("ioctl(SIOCGIWNAME)",
(Addr)((struct vki_iwreq *)ARG3)->u.name,
sizeof(((struct vki_iwreq *)ARG3)->u.name));
}
break;
case VKI_SIOCGIWNWID:
case VKI_SIOCGIWSENS:
case VKI_SIOCGIWRATE:
case VKI_SIOCGIWRTS:
case VKI_SIOCGIWFRAG:
case VKI_SIOCGIWTXPOW:
case VKI_SIOCGIWRETRY:
case VKI_SIOCGIWPOWER:
case VKI_SIOCGIWAUTH:
if (ARG3) {
PRE_MEM_WRITE("ioctl(SIOCGIW[NWID|SENS|RATE|RTS|FRAG|TXPOW|"
"RETRY|PARAM|AUTH])",
(Addr)&((struct vki_iwreq *)ARG3)->u.nwid,
sizeof(struct vki_iw_param));
}
break;
case VKI_SIOCGIWFREQ:
if (ARG3) {
PRE_MEM_WRITE("ioctl(SIOCGIWFREQ",
(Addr)&((struct vki_iwreq *)ARG3)->u.freq,
sizeof(struct vki_iw_freq));
}
break;
case VKI_SIOCGIWMODE:
if (ARG3) {
PRE_MEM_WRITE("ioctl(SIOCGIWMODE",
(Addr)&((struct vki_iwreq *)ARG3)->u.mode,
sizeof(__vki_u32));
}
break;
case VKI_SIOCGIWRANGE:
case VKI_SIOCGIWPRIV:
case VKI_SIOCGIWSTATS:
case VKI_SIOCGIWSPY:
case VKI_SIOCGIWTHRSPY:
case VKI_SIOCGIWAPLIST:
case VKI_SIOCGIWSCAN:
case VKI_SIOCGIWESSID:
case VKI_SIOCGIWNICKN:
case VKI_SIOCGIWENCODE:
case VKI_SIOCGIWGENIE:
case VKI_SIOCGIWENCODEEXT:
if (ARG3) {
struct vki_iw_point* point;
point = &((struct vki_iwreq *)ARG3)->u.data;
PRE_MEM_WRITE("ioctl(SIOCGIW[RANGE|PRIV|STATS|SPY|THRSPY|"
"APLIST|SCAN|ESSID|NICKN|ENCODE|GENIE|ENCODEEXT])",
(Addr)point->pointer, point->length);
}
break;
case VKI_SIOCGIWAP:
if (ARG3) {
PRE_MEM_WRITE("ioctl(SIOCGIWAP)",
(Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
sizeof(struct vki_sockaddr));
}
break;
/* We don't have any specific information on it, so
try to do something reasonable based on direction and
size bits. The encoding scheme is described in
@ -4945,6 +5038,91 @@ POST(sys_ioctl)
POST_MEM_WRITE( ARG3, sizeof(unsigned long) );
break;
/* Wireless extensions ioctls */
case VKI_SIOCSIWCOMMIT:
case VKI_SIOCSIWNWID:
case VKI_SIOCSIWFREQ:
case VKI_SIOCSIWMODE:
case VKI_SIOCSIWSENS:
case VKI_SIOCSIWRANGE:
case VKI_SIOCSIWPRIV:
case VKI_SIOCSIWSTATS:
case VKI_SIOCSIWSPY:
case VKI_SIOCSIWTHRSPY:
case VKI_SIOCSIWAP:
case VKI_SIOCSIWSCAN:
case VKI_SIOCSIWESSID:
case VKI_SIOCSIWRATE:
case VKI_SIOCSIWNICKN:
case VKI_SIOCSIWRTS:
case VKI_SIOCSIWFRAG:
case VKI_SIOCSIWTXPOW:
case VKI_SIOCSIWRETRY:
case VKI_SIOCSIWENCODE:
case VKI_SIOCSIWPOWER:
case VKI_SIOCSIWGENIE:
case VKI_SIOCSIWMLME:
case VKI_SIOCSIWAUTH:
case VKI_SIOCSIWENCODEEXT:
case VKI_SIOCSIWPMKSA:
break;
case VKI_SIOCGIWNAME:
if (ARG3) {
POST_MEM_WRITE((Addr)((struct vki_iwreq *)ARG3)->u.name,
sizeof(((struct vki_iwreq *)ARG3)->u.name));
}
break;
case VKI_SIOCGIWNWID:
case VKI_SIOCGIWSENS:
case VKI_SIOCGIWRATE:
case VKI_SIOCGIWRTS:
case VKI_SIOCGIWFRAG:
case VKI_SIOCGIWTXPOW:
case VKI_SIOCGIWRETRY:
case VKI_SIOCGIWPOWER:
case VKI_SIOCGIWAUTH:
if (ARG3) {
POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.param,
sizeof(struct vki_iw_param));
}
break;
case VKI_SIOCGIWFREQ:
if (ARG3) {
POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.freq,
sizeof(struct vki_iw_freq));
}
break;
case VKI_SIOCGIWMODE:
if (ARG3) {
POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.mode,
sizeof(__vki_u32));
}
break;
case VKI_SIOCGIWRANGE:
case VKI_SIOCGIWPRIV:
case VKI_SIOCGIWSTATS:
case VKI_SIOCGIWSPY:
case VKI_SIOCGIWTHRSPY:
case VKI_SIOCGIWAPLIST:
case VKI_SIOCGIWSCAN:
case VKI_SIOCGIWESSID:
case VKI_SIOCGIWNICKN:
case VKI_SIOCGIWENCODE:
case VKI_SIOCGIWGENIE:
case VKI_SIOCGIWENCODEEXT:
if (ARG3) {
struct vki_iw_point* point;
point = &((struct vki_iwreq *)ARG3)->u.data;
POST_MEM_WRITE((Addr)point->pointer, point->length);
}
break;
case VKI_SIOCGIWAP:
if (ARG3) {
POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
sizeof(struct vki_sockaddr));
}
break;
/* We don't have any specific information on it, so
try to do something reasonable based on direction and
size bits. The encoding scheme is described in

View File

@ -179,6 +179,8 @@ typedef unsigned int vki_uint;
typedef __vki_s32 vki_int32_t;
typedef __vki_u8 vki_uint8_t;
typedef __vki_u16 vki_uint16_t;
typedef __vki_u32 vki_uint32_t;
//----------------------------------------------------------------------
@ -2375,6 +2377,174 @@ typedef vki_int32_t vki_key_serial_t;
/* key handle permissions mask */
typedef vki_uint32_t vki_key_perm_t;
//----------------------------------------------------------------------
// From linux-2.6.24.7/include/linux/wireless.h
// (wireless extensions version 22, 2007-03-16)
//----------------------------------------------------------------------
/*
* [[Wireless extensions ioctls.]]
*/
/* Wireless Identification */
#define VKI_SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */
#define VKI_SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
/* Basic operations */
#define VKI_SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */
#define VKI_SIOCGIWNWID 0x8B03 /* get network id (the cell) */
#define VKI_SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */
#define VKI_SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */
#define VKI_SIOCSIWMODE 0x8B06 /* set operation mode */
#define VKI_SIOCGIWMODE 0x8B07 /* get operation mode */
#define VKI_SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */
#define VKI_SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */
/* Informative stuff */
#define VKI_SIOCSIWRANGE 0x8B0A /* Unused */
#define VKI_SIOCGIWRANGE 0x8B0B /* Get range of parameters */
#define VKI_SIOCSIWPRIV 0x8B0C /* Unused */
#define VKI_SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */
#define VKI_SIOCSIWSTATS 0x8B0E /* Unused */
#define VKI_SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */
/* Spy support (statistics per MAC address - used for Mobile IP support) */
#define VKI_SIOCSIWSPY 0x8B10 /* set spy addresses */
#define VKI_SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */
#define VKI_SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */
#define VKI_SIOCGIWTHRSPY 0x8B13 /* get spy threshold */
/* Access Point manipulation */
#define VKI_SIOCSIWAP 0x8B14 /* set access point MAC addresses */
#define VKI_SIOCGIWAP 0x8B15 /* get access point MAC addresses */
#define VKI_SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */
#define VKI_SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */
#define VKI_SIOCGIWSCAN 0x8B19 /* get scanning results */
/* 802.11 specific support */
#define VKI_SIOCSIWESSID 0x8B1A /* set ESSID (network name) */
#define VKI_SIOCGIWESSID 0x8B1B /* get ESSID */
#define VKI_SIOCSIWNICKN 0x8B1C /* set node name/nickname */
#define VKI_SIOCGIWNICKN 0x8B1D /* get node name/nickname */
/* Other parameters useful in 802.11 and some other devices */
#define VKI_SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */
#define VKI_SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */
#define VKI_SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */
#define VKI_SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */
#define VKI_SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */
#define VKI_SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */
#define VKI_SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */
#define VKI_SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */
#define VKI_SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */
#define VKI_SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */
/* Encoding stuff (scrambling, hardware security, WEP...) */
#define VKI_SIOCSIWENCODE 0x8B2A /* set encoding token & mode */
#define VKI_SIOCGIWENCODE 0x8B2B /* get encoding token & mode */
/* Power saving stuff (power management, unicast and multicast) */
#define VKI_SIOCSIWPOWER 0x8B2C /* set Power Management settings */
#define VKI_SIOCGIWPOWER 0x8B2D /* get Power Management settings */
/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM). */
#define VKI_SIOCSIWGENIE 0x8B30 /* set generic IE */
#define VKI_SIOCGIWGENIE 0x8B31 /* get generic IE */
/* WPA : IEEE 802.11 MLME requests */
#define VKI_SIOCSIWMLME 0x8B16 /* request MLME operation; uses
* struct iw_mlme */
/* WPA : Authentication mode parameters */
#define VKI_SIOCSIWAUTH 0x8B32 /* set authentication mode params */
#define VKI_SIOCGIWAUTH 0x8B33 /* get authentication mode params */
/* WPA : Extended version of encoding configuration */
#define VKI_SIOCSIWENCODEEXT 0x8B34 /* set encoding token & mode */
#define VKI_SIOCGIWENCODEEXT 0x8B35 /* get encoding token & mode */
/* WPA2 : PMKSA cache management */
#define VKI_SIOCSIWPMKSA 0x8B36 /* PMKSA cache operation */
/*
* [[Payload for the wireless extensions ioctls.]]
*/
struct vki_iw_param
{
__vki_s32 value; /* The value of the parameter itself */
__vki_u8 fixed; /* Hardware should not use auto select */
__vki_u8 disabled; /* Disable the feature */
__vki_u16 flags; /* Various specifc flags (if any) */
};
struct vki_iw_point
{
void __user *pointer; /* Pointer to the data (in user space) */
__vki_u16 length; /* number of fields or size in bytes */
__vki_u16 flags; /* Optional params */
};
struct vki_iw_freq
{
__vki_s32 m; /* Mantissa */
__vki_s16 e; /* Exponent */
__vki_u8 i; /* List index (when in range struct) */
__vki_u8 flags; /* Flags (fixed/auto) */
};
struct vki_iw_quality
{
__vki_u8 qual; /* link quality (%retries, SNR,
%missed beacons or better...) */
__vki_u8 level; /* signal level (dBm) */
__vki_u8 noise; /* noise level (dBm) */
__vki_u8 updated; /* Flags to know if updated */
};
union vki_iwreq_data
{
/* Config - generic */
char name[VKI_IFNAMSIZ];
/* Name : used to verify the presence of wireless extensions.
* Name of the protocol/provider... */
struct vki_iw_point essid; /* Extended network name */
struct vki_iw_param nwid; /* network id (or domain - the cell) */
struct vki_iw_freq freq; /* frequency or channel :
* 0-1000 = channel
* > 1000 = frequency in Hz */
struct vki_iw_param sens; /* signal level threshold */
struct vki_iw_param bitrate;/* default bit rate */
struct vki_iw_param txpower;/* default transmit power */
struct vki_iw_param rts; /* RTS threshold threshold */
struct vki_iw_param frag; /* Fragmentation threshold */
__vki_u32 mode; /* Operation mode */
struct vki_iw_param retry; /* Retry limits & lifetime */
struct vki_iw_point encoding; /* Encoding stuff : tokens */
struct vki_iw_param power; /* PM duration/timeout */
struct vki_iw_quality qual; /* Quality part of statistics */
struct vki_sockaddr ap_addr; /* Access point address */
struct vki_sockaddr addr; /* Destination address (hw/mac) */
struct vki_iw_param param; /* Other small parameters */
struct vki_iw_point data; /* Other large parameters */
};
struct vki_iwreq
{
union
{
char ifrn_name[VKI_IFNAMSIZ]; /* if name, e.g. "eth0" */
} ifr_ifrn;
/* Data part (defined just above) */
union vki_iwreq_data u;
};
#endif // __VKI_LINUX_H
/*--------------------------------------------------------------------*/