OSDN Git Service

v27
[android-x86/external-wireless-tools.git] / wireless_tools / iwlib.h
index f15edc8..67d6ff1 100644 (file)
@@ -1,12 +1,12 @@
 /*
  *     Wireless Tools
  *
- *             Jean II - HPLB 97->99 - HPL 99->02
+ *             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-2002 Jean Tourrilhes <jt@hpl.hp.com>
+ *     Copyright (c) 1997-2004 Jean Tourrilhes <jt@hpl.hp.com>
  */
 
 #ifndef IWLIB_H
 #include <linux/socket.h>              /* for "struct sockaddr" et al  */
 #include <linux/if.h>                  /* for IFNAMSIZ and co... */
 
-#ifdef WEXT_HEADER
 /* Private copy of Wireless extensions */
-#include WEXT_HEADER
-#else  /* !WEXT_HEADER */
-/* System wide Wireless extensions */
-#include <linux/wireless.h>
-#endif /* !WEXT_HEADER */
+#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 */
+#if __GNUC__ == 3
+#if __GNUC_MINOR__ >= 1 && __GNUC_MINOR__ < 4
+#define inline         inline          __attribute__((always_inline))
+#endif
+#endif /* __GNUC__ */
 
 #ifdef __cplusplus
 extern "C" {
@@ -144,6 +154,12 @@ extern "C" {
 
 /************************ CONSTANTS & MACROS ************************/
 
+/* Various versions information */
+/* Recommended Wireless Extension version */
+#define WE_VERSION     17
+/* Version of Wireless Tools */
+#define WT_VERSION     27
+
 /* Paths */
 #define PROC_NET_WIRELESS      "/proc/net/wireless"
 #define PROC_NET_DEV           "/proc/net/dev"
@@ -176,6 +192,11 @@ extern "C" {
 #define SIOCSIWCOMMIT  SIOCSIWNAME
 #endif /* SIOCSIWCOMMIT */
 
+/* Still more backward compatibility */
+#ifndef IW_FREQ_FIXED
+#define IW_FREQ_FIXED  0x01
+#endif /* IW_FREQ_FIXED */
+
 /****************************** TYPES ******************************/
 
 /* Shortcuts */
@@ -188,16 +209,17 @@ typedef struct iw_priv_args       iwprivargs;
 typedef struct sockaddr                sockaddr;
 
 /* Structure for storing all wireless information for each device
- * This is pretty exhaustive... */
-typedef struct wireless_info
+ * 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          has_sens;
-  iwparam      sens;                   /* sensitivity */
+  int          freq_flags;
   int          has_key;
   unsigned char        key[IW_ENCODING_TOKEN_MAX];     /* Encoding key used */
   int          key_size;               /* Number of bytes */
@@ -205,6 +227,18 @@ typedef struct wireless_info
   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;
@@ -215,8 +249,6 @@ typedef struct wireless_info
   iwparam      rts;                    /* RTS threshold in bytes */
   int          has_frag;
   iwparam      frag;                   /* Fragmentation threshold in bytes */
-  int          has_mode;
-  int          mode;                   /* Operation mode */
   int          has_power;
   iwparam      power;                  /* Power management parameters */
   int          has_txpower;
@@ -231,28 +263,36 @@ typedef struct wireless_info
   int          has_range;
 } wireless_info;
 
-/* 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
+/* 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
 {
-  char         name[IFNAMSIZ + 1];     /* Wireless/protocol name */
-  int          has_nwid;
-  iwparam      nwid;                   /* Network ID */
-  int          has_freq;
-  double       freq;                   /* Frequency/channel */
-  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;
+  /* 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 */
@@ -282,91 +322,114 @@ void
                        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,
-                         char *        ifname,
+                         const char *  ifname,
                          iwrange *     range);
 int
-       iw_print_version_info(char *    toolname);
-int
        iw_get_priv_info(int            skfd,
-                        char *         ifname,
-                        iwprivargs *   priv,
-                        int            maxpriv);
+                        const char *   ifname,
+                        iwprivargs **  ppriv);
 int
        iw_get_basic_config(int                 skfd,
-                           char *              ifname,
+                           const char *        ifname,
                            wireless_config *   info);
 int
        iw_set_basic_config(int                 skfd,
-                           char *              ifname,
+                           const char *        ifname,
                            wireless_config *   info);
 /* --------------------- PROTOCOL SUBROUTINES --------------------- */
 int
-       iw_protocol_compare(char *      protocol1,
-                           char *      protocol2);
+       iw_protocol_compare(const char *        protocol1,
+                           const char *        protocol2);
 /* -------------------- FREQUENCY SUBROUTINES --------------------- */
 void
        iw_float2freq(double    in,
-                  iwfreq *     out);
+                     iwfreq *  out);
 double
-       iw_freq2float(iwfreq *  in);
+       iw_freq2float(const iwfreq *    in);
+void
+       iw_print_freq_value(char *      buffer,
+                           int         buflen,
+                           double      freq);
 void
        iw_print_freq(char *    buffer,
-                     double    freq);
+                     int       buflen,
+                     double    freq,
+                     int       channel,
+                     int       freq_flags);
+int
+       iw_freq_to_channel(double                       freq,
+                          const struct iw_range *      range);
 int
-       iw_freq_to_channel(double               freq,
-                          struct iw_range *    range);
+       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,
-                    char *     ifname,
-                    iwstats *  stats);
+       iw_get_stats(int                skfd,
+                    const char *       ifname,
+                    iwstats *          stats,
+                    const iwrange *    range,
+                    int                has_range);
 void
        iw_print_stats(char *           buffer,
-                      iwqual *         qual,
-                      iwrange *        range,
+                      int              buflen,
+                      const iwqual *   qual,
+                      const iwrange *  range,
                       int              has_range);
 /* --------------------- ENCODING SUBROUTINES --------------------- */
 void
-       iw_print_key(char *             buffer,
-                    unsigned char *    key,
-                    int                key_size,
-                    int                key_flags);
+       iw_print_key(char *                     buffer,
+                    int                        buflen,
+                    const unsigned char *      key,
+                    int                        key_size,
+                    int                        key_flags);
 int
-       iw_in_key(char *                input,
+       iw_in_key(const char *          input,
                  unsigned char *       key);
 int
        iw_in_key_full(int              skfd,
-                      char *           ifname,
-                      char *           input,
+                      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);
 void
        iw_print_pm_mode(char *         buffer,
+                        int            buflen,
                         int            flags);
 /* --------------- RETRY LIMIT/LIFETIME SUBROUTINES --------------- */
-#if WIRELESS_EXT > 10
 void
        iw_print_retry_value(char *     buffer,
+                            int        buflen,
                             int        value,
                             int        flags);
-#endif
 /* ----------------------- TIME SUBROUTINES ----------------------- */
 void
        iw_print_timeval(char *                 buffer,
+                        int                    buflen,
                         const struct timeval * time);
 /* --------------------- ADDRESS SUBROUTINES ---------------------- */
 int
@@ -380,6 +443,11 @@ int
        iw_check_addr_type(int          skfd,
                           char *       ifname);
 #endif
+int
+       iw_get_mac_addr(int                     skfd,
+                       const char *            name,
+                       struct ether_addr *     eth,
+                       unsigned short *        ptype);
 void
        iw_ether_ntop(const struct ether_addr* eth, char* buf);
 char*
@@ -397,7 +465,6 @@ int
 int
        iw_get_priv_size(int            args);
 
-#if WIRELESS_EXT > 13
 /* ---------------------- EVENT SUBROUTINES ---------------------- */
 void
        iw_init_event_stream(struct stream_descr *      stream,
@@ -405,11 +472,23 @@ void
                             int                        len);
 int
        iw_extract_event_stream(struct stream_descr *   stream,
-                               struct iw_event *       iwe);
-#endif /* WIRELESS_EXT > 13 */
+                               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
 
@@ -429,7 +508,7 @@ extern const char * const   iw_operation_mode[];
  */
 static inline int
 iw_set_ext(int                 skfd,           /* Socket to the kernel */
-          char *               ifname,         /* Device name */
+          const char *         ifname,         /* Device name */
           int                  request,        /* WE ID */
           struct iwreq *       pwrq)           /* Fixed part of the request */
 {
@@ -445,7 +524,7 @@ iw_set_ext(int                      skfd,           /* Socket to the kernel */
  */
 static inline int
 iw_get_ext(int                 skfd,           /* Socket to the kernel */
-          char *               ifname,         /* Device name */
+          const char *         ifname,         /* Device name */
           int                  request,        /* WE ID */
           struct iwreq *       pwrq)           /* Fixed part of the request */
 {
@@ -456,6 +535,16 @@ iw_get_ext(int                     skfd,           /* Socket to the kernel */
 }
 
 /*------------------------------------------------------------------*/
+/*
+ * Close the socket used for ioctl.
+ */
+static inline void
+iw_sockets_close(int   skfd)
+{
+  close(skfd);
+}
+
+/*------------------------------------------------------------------*/
 /* Backwards compatability
  * Actually, those form are much easier to use when dealing with
  * struct sockaddr... */