/*
* 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" {
/************************ 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"
#define SIOCSIWCOMMIT SIOCSIWNAME
#endif /* SIOCSIWCOMMIT */
+/* Still more backward compatibility */
+#ifndef IW_FREQ_FIXED
+#define IW_FREQ_FIXED 0x01
+#endif /* IW_FREQ_FIXED */
+
/****************************** TYPES ******************************/
/* Shortcuts */
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 */
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;
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;
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 */
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
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*
int
iw_get_priv_size(int args);
-#if WIRELESS_EXT > 13
/* ---------------------- EVENT SUBROUTINES ---------------------- */
void
iw_init_event_stream(struct stream_descr * stream,
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
*/
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 */
{
*/
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 */
{
}
/*------------------------------------------------------------------*/
+/*
+ * 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... */