From: Julian Seward Date: Wed, 5 Nov 2008 16:59:55 +0000 (+0000) Subject: Add ioctl wrappers for Linux wireless extensions version 22. X-Git-Tag: svn/VALGRIND_3_4_0~160 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3a2fbbfafd57a0e1f5c0ca10563a6835b33162ed;p=thirdparty%2Fvalgrind.git 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 --- diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 4ef98a078a..d62b6aa938 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -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 diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 1581aef1b7..7ab7d70de1 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 /*--------------------------------------------------------------------*/