]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add ioctl wrappers for Linux wireless extensions version 22.
authorJulian Seward <jseward@acm.org>
Wed, 5 Nov 2008 16:59:55 +0000 (16:59 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 5 Nov 2008 16:59:55 +0000 (16:59 +0000)
Patch from Gwenael Lambrouin.  Fixes #159452.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8734

coregrind/m_syswrap/syswrap-generic.c
include/vki/vki-linux.h

index 4ef98a078ac2532b8ff9d9a18525dc96fcd1d09b..d62b6aa9386e02c9d855bfd77577cb538ab5bb51 100644 (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
index 1581aef1b7a4c0b4692604db05ed3cc340b8f6bf..7ab7d70de1712342f0d340881391dc79000b462e 100644 (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
 
 /*--------------------------------------------------------------------*/