Initial commit with current version (0.3.3)
[pyiw] / staticlibiw / iwlib.h
diff --git a/staticlibiw/iwlib.h b/staticlibiw/iwlib.h
new file mode 100644 (file)
index 0000000..c67ec82
--- /dev/null
@@ -0,0 +1,596 @@
+/*
+ *     Wireless Tools
+ *
+ *             Jean II - HPLB 97->99 - HPL 99->04
+ *
+ * Common header for the Wireless Extension library...
+ *
+ * This file is released under the GPL license.
+ *     Copyright (c) 1997-2004 Jean Tourrilhes <jt@hpl.hp.com>
+ */
+
+#ifndef IWLIB_H
+#define IWLIB_H
+
+/*#include "CHANGELOG.h"*/
+
+/***************************** INCLUDES *****************************/
+
+/* Standard headers */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <math.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>             /* gethostbyname, getnetbyname */
+#include <net/ethernet.h>      /* struct ether_addr */
+#include <sys/time.h>          /* struct timeval */
+#include <unistd.h>
+
+/* This is our header selection. Try to hide the mess and the misery :-(
+ * Don't look, you would go blind ;-) */
+
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif
+
+/* Kernel headers 2.4.X + Glibc 2.2 - Mandrake 8.0, Debian 2.3, RH 7.1
+ * Kernel headers 2.2.X + Glibc 2.2 - Slackware 8.0 */
+#if defined(__GLIBC__) \
+    && __GLIBC__ == 2 \
+    && __GLIBC_MINOR__ >= 2 \
+    && LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
+#define HEADERS_GENERIC
+
+/* Kernel headers 2.4.X + Glibc 2.1 - Debian 2.2 upgraded, RH 7.0
+ * Kernel headers 2.2.X + Glibc 2.1 - Debian 2.2, RH 6.1 */
+#elif defined(__GLIBC__) \
+      && __GLIBC__ == 2 \
+      && __GLIBC_MINOR__ == 1 \
+      && LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
+#define HEADERS_GENERIC
+#define HEADERS_KERNEL
+
+/* Unsupported combination */
+#else
+#error "Your kernel/libc combination is not supported"
+#endif
+
+#ifdef HEADERS_GENERIC 
+/* Proposed by Dr. Michael Rietz <rietz@mail.amps.de>, 27.3.2 */
+#include <net/if_arp.h>                /* For ARPHRD_ETHER */
+#include <sys/socket.h>                /* For AF_INET & struct sockaddr */
+#include <netinet/in.h>         /* For struct sockaddr_in */
+#include <netinet/if_ether.h>
+#endif /* HEADERS_GENERIC */    
+
+/* Fixup to be able to include kernel includes in userspace.
+ * Basically, kill the sparse annotations... Jean II */
+#ifndef __user
+#define __user
+#endif
+
+#include <linux/types.h>               /* for "caddr_t" et al          */
+
+#ifdef HEADERS_KERNEL
+/* Traditionally we have used kernel headers, included in wireless.h */
+#include <linux/socket.h>              /* for "struct sockaddr" et al  */
+#include <linux/if.h>                  /* for IFNAMSIZ and co... */
+#else  /* !HEADERS_KERNEL */
+/* Glibc systems headers are supposedly less problematic than kernel ones */
+#include <sys/socket.h>                        /* for "struct sockaddr" et al  */
+#include <net/if.h>                    /* for IFNAMSIZ and co... */
+#endif /* !HEADERS_KERNEL */
+
+/* Private copy of Wireless extensions (in this directoty) */
+#include "wireless.h"
+
+/* Make gcc understant that when we say inline, we mean it.
+ * I really hate when the compiler is trying to be more clever than me,
+ * because in this case gcc is not able to figure out functions with a
+ * single call site, so not only I have to tag those functions inline
+ * by hand, but then it refuse to inline them properly.
+ * Total saving for iwevent : 150B = 0.7%.
+ * Fortunately, in gcc 3.4, they now automatically inline static functions
+ * with a single call site. Hurrah !
+ * Jean II */
+#undef IW_GCC_HAS_BROKEN_INLINE
+#if __GNUC__ == 3
+#if __GNUC_MINOR__ >= 1 && __GNUC_MINOR__ < 4
+#define IW_GCC_HAS_BROKEN_INLINE       1
+#endif /* __GNUC_MINOR__ */
+#endif /* __GNUC__ */
+/* However, gcc 4.0 has introduce a new "feature", when compiling with
+ * '-Os', it does not want to inline iw_ether_cmp() and friends.
+ * So, we need to fix inline again !
+ * Jean II */
+#if __GNUC__ == 4
+#define IW_GCC_HAS_BROKEN_INLINE       1
+#endif /* __GNUC__ */
+/* Now, really fix the inline */
+#ifdef IW_GCC_HAS_BROKEN_INLINE
+#ifdef inline
+#undef inline
+#endif /* inline */
+#define inline         inline          __attribute__((always_inline))
+#endif /* IW_GCC_HAS_BROKEN_INLINE */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/****************************** DEBUG ******************************/
+
+
+/************************ CONSTANTS & MACROS ************************/
+
+/* Various versions information */
+/* Recommended Wireless Extension version */
+#define WE_VERSION     21
+/* Maximum forward compatibility built in this version of WT */
+#define WE_MAX_VERSION 21
+/* Version of Wireless Tools */
+#define WT_VERSION     29
+
+/* Paths */
+#define PROC_NET_WIRELESS      "/proc/net/wireless"
+#define PROC_NET_DEV           "/proc/net/dev"
+
+/* Some usefull constants */
+#define KILO   1e3
+#define MEGA   1e6
+#define GIGA   1e9
+/* For doing log10/exp10 without libm */
+#define LOG10_MAGIC    1.25892541179
+
+/* Backward compatibility for network headers */
+#ifndef ARPHRD_IEEE80211
+#define ARPHRD_IEEE80211 801           /* IEEE 802.11                  */
+#endif /* ARPHRD_IEEE80211 */
+
+/****************************** TYPES ******************************/
+
+/* Shortcuts */
+typedef struct iw_statistics   iwstats;
+typedef struct iw_range                iwrange;
+typedef struct iw_param                iwparam;
+typedef struct iw_freq         iwfreq;
+typedef struct iw_quality      iwqual;
+typedef struct iw_priv_args    iwprivargs;
+typedef struct sockaddr                sockaddr;
+
+/* Structure for storing all wireless information for each device
+ * This is a cut down version of the one above, containing only
+ * the things *truly* needed to configure a card.
+ * Don't add other junk, I'll remove it... */
+typedef struct wireless_config
+{
+  char         name[IFNAMSIZ + 1];     /* Wireless/protocol name */
+  int          has_nwid;
+  iwparam      nwid;                   /* Network ID */
+  int          has_freq;
+  double       freq;                   /* Frequency/channel */
+  int          freq_flags;
+  int          has_key;
+  unsigned char        key[IW_ENCODING_TOKEN_MAX];     /* Encoding key used */
+  int          key_size;               /* Number of bytes */
+  int          key_flags;              /* Various flags */
+  int          has_essid;
+  int          essid_on;
+  char         essid[IW_ESSID_MAX_SIZE + 1];   /* ESSID (extended network) */
+  int          has_mode;
+  int          mode;                   /* Operation mode */
+} wireless_config;
+
+/* Structure for storing all wireless information for each device
+ * This is pretty exhaustive... */
+typedef struct wireless_info
+{
+  struct wireless_config       b;      /* Basic information */
+
+  int          has_sens;
+  iwparam      sens;                   /* sensitivity */
+  int          has_nickname;
+  char         nickname[IW_ESSID_MAX_SIZE + 1]; /* NickName */
+  int          has_ap_addr;
+  sockaddr     ap_addr;                /* Access point address */
+  int          has_bitrate;
+  iwparam      bitrate;                /* Bit rate in bps */
+  int          has_rts;
+  iwparam      rts;                    /* RTS threshold in bytes */
+  int          has_frag;
+  iwparam      frag;                   /* Fragmentation threshold in bytes */
+  int          has_power;
+  iwparam      power;                  /* Power management parameters */
+  int          has_txpower;
+  iwparam      txpower;                /* Transmit Power in dBm */
+  int          has_retry;
+  iwparam      retry;                  /* Retry limit or lifetime */
+
+  /* Stats */
+  iwstats      stats;
+  int          has_stats;
+  iwrange      range;
+  int          has_range;
+
+  /* Auth params for WPA/802.1x/802.11i */
+  int          auth_key_mgmt;
+  int          has_auth_key_mgmt;
+  int          auth_cipher_pairwise;
+  int          has_auth_cipher_pairwise;
+  int          auth_cipher_group;
+  int          has_auth_cipher_group;
+} wireless_info;
+
+/* Structure for storing an entry of a wireless scan.
+ * This is only a subset of all possible information, the flexible
+ * structure of scan results make it impossible to capture all
+ * information in such a static structure. */
+typedef struct wireless_scan
+{
+  /* Linked list */
+  struct wireless_scan *       next;
+
+  /* Cell identifiaction */
+  int          has_ap_addr;
+  sockaddr     ap_addr;                /* Access point address */
+
+  /* Other information */
+  struct wireless_config       b;      /* Basic information */
+  iwstats      stats;                  /* Signal strength */
+  int          has_stats;
+} wireless_scan;
+
+/*
+ * Context used for non-blocking scan.
+ */
+typedef struct wireless_scan_head
+{
+  wireless_scan *      result;         /* Result of the scan */
+  int                  retry;          /* Retry level */
+} wireless_scan_head;
+
+/* Structure used for parsing event streams, such as Wireless Events
+ * and scan results */
+typedef struct stream_descr
+{
+  char *       end;            /* End of the stream */
+  char *       current;        /* Current event in stream of events */
+  char *       value;          /* Current value in event */
+} stream_descr;
+
+/* Prototype for handling display of each single interface on the
+ * system - see iw_enum_devices() */
+typedef int (*iw_enum_handler)(int     skfd,
+                              char *   ifname,
+                              char *   args[],
+                              int      count);
+
+/* Describe a modulation */
+typedef struct iw_modul_descr
+{
+  unsigned int         mask;           /* Modulation bitmask */
+  char                 cmd[8];         /* Short name */
+  char *               verbose;        /* Verbose description */
+} iw_modul_descr;
+
+/**************************** PROTOTYPES ****************************/
+/*
+ * All the functions in iwcommon.c
+ */
+
+/* ---------------------- SOCKET SUBROUTINES -----------------------*/
+int
+       iw_sockets_open(void);
+void
+       iw_enum_devices(int             skfd,
+                       iw_enum_handler fn,
+                       char *          args[],
+                       int             count);
+/* --------------------- WIRELESS SUBROUTINES ----------------------*/
+int
+       iw_get_kernel_we_version(void);
+int
+       iw_print_version_info(const char *      toolname);
+int
+       iw_get_range_info(int           skfd,
+                         const char *  ifname,
+                         iwrange *     range);
+int
+       iw_get_priv_info(int            skfd,
+                        const char *   ifname,
+                        iwprivargs **  ppriv);
+int
+       iw_get_basic_config(int                 skfd,
+                           const char *        ifname,
+                           wireless_config *   info);
+int
+       iw_set_basic_config(int                 skfd,
+                           const char *        ifname,
+                           wireless_config *   info);
+/* --------------------- PROTOCOL SUBROUTINES --------------------- */
+int
+       iw_protocol_compare(const char *        protocol1,
+                           const char *        protocol2);
+/* -------------------- FREQUENCY SUBROUTINES --------------------- */
+void
+       iw_float2freq(double    in,
+                     iwfreq *  out);
+double
+       iw_freq2float(const iwfreq *    in);
+void
+       iw_print_freq_value(char *      buffer,
+                           int         buflen,
+                           double      freq);
+void
+       iw_print_freq(char *    buffer,
+                     int       buflen,
+                     double    freq,
+                     int       channel,
+                     int       freq_flags);
+int
+       iw_freq_to_channel(double                       freq,
+                          const struct iw_range *      range);
+int
+       iw_channel_to_freq(int                          channel,
+                          double *                     pfreq,
+                          const struct iw_range *      range);
+void
+       iw_print_bitrate(char * buffer,
+                        int    buflen,
+                        int    bitrate);
+/* ---------------------- POWER SUBROUTINES ----------------------- */
+int
+       iw_dbm2mwatt(int        in);
+int
+       iw_mwatt2dbm(int        in);
+void
+       iw_print_txpower(char *                 buffer,
+                        int                    buflen,
+                        struct iw_param *      txpower);
+/* -------------------- STATISTICS SUBROUTINES -------------------- */
+int
+       iw_get_stats(int                skfd,
+                    const char *       ifname,
+                    iwstats *          stats,
+                    const iwrange *    range,
+                    int                has_range);
+void
+       iw_print_stats(char *           buffer,
+                      int              buflen,
+                      const iwqual *   qual,
+                      const iwrange *  range,
+                      int              has_range);
+/* --------------------- ENCODING SUBROUTINES --------------------- */
+void
+       iw_print_key(char *                     buffer,
+                    int                        buflen,
+                    const unsigned char *      key,
+                    int                        key_size,
+                    int                        key_flags);
+int
+       iw_in_key(const char *          input,
+                 unsigned char *       key);
+int
+       iw_in_key_full(int              skfd,
+                      const char *     ifname,
+                      const char *     input,
+                      unsigned char *  key,
+                      __u16 *          flags);
+/* ----------------- POWER MANAGEMENT SUBROUTINES ----------------- */
+void
+       iw_print_pm_value(char *        buffer,
+                         int           buflen,
+                         int           value,
+                         int           flags,
+                         int           we_version);
+void
+       iw_print_pm_mode(char *         buffer,
+                        int            buflen,
+                        int            flags);
+/* --------------- RETRY LIMIT/LIFETIME SUBROUTINES --------------- */
+void
+       iw_print_retry_value(char *     buffer,
+                            int        buflen,
+                            int        value,
+                            int        flags,
+                            int        we_version);
+/* ----------------------- TIME SUBROUTINES ----------------------- */
+void
+       iw_print_timeval(char *                         buffer,
+                        int                            buflen,
+                        const struct timeval *         time,
+                        const struct timezone *        tz);
+/* --------------------- ADDRESS SUBROUTINES ---------------------- */
+int
+       iw_check_mac_addr_type(int              skfd,
+                              const char *     ifname);
+int
+       iw_check_if_addr_type(int               skfd,
+                             const char *      ifname);
+#if 0
+int
+       iw_check_addr_type(int          skfd,
+                          const char * ifname);
+#endif
+#if 0
+int
+       iw_get_mac_addr(int                     skfd,
+                       const char *            name,
+                       struct ether_addr *     eth,
+                       unsigned short *        ptype);
+#endif
+char *
+       iw_mac_ntop(const unsigned char *       mac,
+                   int                         maclen,
+                   char *                      buf,
+                   int                         buflen);
+void
+       iw_ether_ntop(const struct ether_addr * eth,
+                     char *                    buf);
+char *
+       iw_sawap_ntop(const struct sockaddr *   sap,
+                     char *                    buf);
+int
+       iw_mac_aton(const char *        orig,
+                   unsigned char *     mac,
+                   int                 macmax);
+int
+       iw_ether_aton(const char* bufp, struct ether_addr* eth);
+int
+       iw_in_inet(char *bufp, struct sockaddr *sap);
+int
+       iw_in_addr(int                  skfd,
+                  const char *         ifname,
+                  char *               bufp,
+                  struct sockaddr *    sap);
+/* ----------------------- MISC SUBROUTINES ------------------------ */
+int
+       iw_get_priv_size(int            args);
+
+/* ---------------------- EVENT SUBROUTINES ---------------------- */
+void
+       iw_init_event_stream(struct stream_descr *      stream,
+                            char *                     data,
+                            int                        len);
+int
+       iw_extract_event_stream(struct stream_descr *   stream,
+                               struct iw_event *       iwe,
+                               int                     we_version);
+/* --------------------- SCANNING SUBROUTINES --------------------- */
+int
+       iw_process_scan(int                     skfd,
+                       char *                  ifname,
+                       int                     we_version,
+                       wireless_scan_head *    context);
+int
+       iw_scan(int                     skfd,
+               char *                  ifname,
+               int                     we_version,
+               wireless_scan_head *    context);
+
+/**************************** VARIABLES ****************************/
+
+/* Modes as human readable strings */
+extern const char * const      iw_operation_mode[];
+#define IW_NUM_OPER_MODE       7
+
+/* Modulations as human readable strings */
+extern const struct iw_modul_descr     iw_modul_list[];
+#define IW_SIZE_MODUL_LIST     16
+
+/************************* INLINE FUNTIONS *************************/
+/*
+ * Functions that are so simple that it's more efficient inlining them
+ */
+
+/*
+ * Note : I've defined wrapper for the ioctl request so that
+ * it will be easier to migrate to other kernel API if needed
+ */
+
+/*------------------------------------------------------------------*/
+/*
+ * Wrapper to push some Wireless Parameter in the driver
+ */
+static inline int
+iw_set_ext(int                 skfd,           /* Socket to the kernel */
+          const char *         ifname,         /* Device name */
+          int                  request,        /* WE ID */
+          struct iwreq *       pwrq)           /* Fixed part of the request */
+{
+  /* Set device name */
+  strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
+  /* Do the request */
+  return(ioctl(skfd, request, pwrq));
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Wrapper to extract some Wireless Parameter out of the driver
+ */
+static inline int
+iw_get_ext(int                 skfd,           /* Socket to the kernel */
+          const char *         ifname,         /* Device name */
+          int                  request,        /* WE ID */
+          struct iwreq *       pwrq)           /* Fixed part of the request */
+{
+  /* Set device name */
+  strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
+  /* Do the request */
+  return(ioctl(skfd, request, pwrq));
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Close the socket used for ioctl.
+ */
+static inline void
+iw_sockets_close(int   skfd)
+{
+  close(skfd);
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Display an Ethernet Socket Address in readable format.
+ */
+static inline char *
+iw_saether_ntop(const struct sockaddr *sap, char* bufp)
+{
+  iw_ether_ntop((const struct ether_addr *) sap->sa_data, bufp);
+  return bufp;
+}
+/*------------------------------------------------------------------*/
+/*
+ * Input an Ethernet Socket Address and convert to binary.
+ */
+static inline int
+iw_saether_aton(const char *bufp, struct sockaddr *sap)
+{
+  sap->sa_family = ARPHRD_ETHER;
+  return iw_ether_aton(bufp, (struct ether_addr *) sap->sa_data);
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Create an Ethernet broadcast address
+ */
+static inline void
+iw_broad_ether(struct sockaddr *sap)
+{
+  sap->sa_family = ARPHRD_ETHER;
+  memset((char *) sap->sa_data, 0xFF, ETH_ALEN);
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Create an Ethernet NULL address
+ */
+static inline void
+iw_null_ether(struct sockaddr *sap)
+{
+  sap->sa_family = ARPHRD_ETHER;
+  memset((char *) sap->sa_data, 0x00, ETH_ALEN);
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Compare two ethernet addresses
+ */
+static inline int
+iw_ether_cmp(const struct ether_addr* eth1, const struct ether_addr* eth2)
+{
+  return memcmp(eth1, eth2, sizeof(*eth1));
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IWLIB_H */