/*
* Wireless Tools
*
- * Jean II - HPLB 97->99 - HPL 99->04
+ * Jean II - HPLB 97->99 - HPL 99->09
*
* 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>
+ * Copyright (c) 1997-2009 Jean Tourrilhes <jt@hpl.hp.com>
*/
#ifndef IWLIB_H
#define IWLIB_H
-/*#include "CHANGELOG.h"*/
-
/***************************** INCLUDES *****************************/
/* Standard headers */
#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 GLIBC22_HEADERS
-#define GENERIC_HEADERS
-
-/* 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 GLIBC_HEADERS
-#define GENERIC_HEADERS
-
-/* Kernel headers 2.2.X + Glibc 2.0 - Debian 2.1 */
-#elif defined(__GLIBC__) \
- && __GLIBC__ == 2 \
- && __GLIBC_MINOR__ == 0 \
- && LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,0) \
- && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
-#define GLIBC_HEADERS
-#define KLUDGE_HEADERS
-
-/* Note : is it really worth supporting kernel 2.0.X, knowing that
- * we require WE v9, which is only available in 2.2.X and higher ?
- * I guess one could use 2.0.x with an upgraded wireless.h... */
-
-/* Kernel headers 2.0.X + Glibc 2.0 - Debian 2.0, RH 5 */
-#elif defined(__GLIBC__) \
- && __GLIBC__ == 2 \
- && __GLIBC_MINOR__ == 0 \
- && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) \
- && LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,0)
-#define GLIBC_HEADERS
-
-/* Kernel headers 2.0.X + libc5 - old systems */
-#elif defined(_LINUX_C_LIB_VERSION_MAJOR) \
- && _LINUX_C_LIB_VERSION_MAJOR == 5 \
- && LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,0) \
- && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
-#define LIBC5_HEADERS
-
-/* Unsupported combination */
-#else
-#error "Your kernel/libc combination is not supported"
-#endif
+ * Don't look, you would go blind ;-)
+ * Note : compatibility with *old* distributions has been removed,
+ * you will need Glibc 2.2 and older to compile (which means
+ * Mandrake 8.0, Debian 2.3, RH 7.1 or older).
+ */
-#ifdef GENERIC_HEADERS
-/* Proposed by Dr. Michael Rietz <rietz@mail.amps.de>, 27.3.2 */
-/* If this works for all, it might be more stable on the long term - Jean II */
+/* Set of headers 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 /* GENERIC_HEADERS */
-
-#ifdef GLIBC22_HEADERS
-/* Added by Ross G. Miller <Ross_Miller@baylor.edu>, 3/28/01 */
-#include <linux/if_arp.h> /* For ARPHRD_ETHER */
-#include <linux/socket.h> /* For AF_INET & struct sockaddr */
-#include <sys/socket.h>
-#endif /* GLIBC22_HEADERS */
-
-#ifdef KLUDGE_HEADERS
-#include <socketbits.h>
-#endif /* KLUDGE_HEADERS */
-
-#ifdef GLIBC_HEADERS
-#include <linux/if_arp.h> /* For ARPHRD_ETHER */
-#include <linux/socket.h> /* For AF_INET & struct sockaddr */
-#include <linux/in.h> /* For struct sockaddr_in */
-#endif /* KLUDGE_HEADERS || GLIBC_HEADERS */
-
-#ifdef LIBC5_HEADERS
-#include <sys/socket.h> /* For AF_INET & struct sockaddr & socket() */
-#include <linux/if_arp.h> /* For ARPHRD_ETHER */
-#include <linux/in.h> /* For struct sockaddr_in */
-#endif /* LIBC5_HEADERS */
-
-/* Those 3 headers were previously included in wireless.h */
-#include <linux/types.h> /* for "caddr_t" et al */
-#include <linux/socket.h> /* for "struct sockaddr" et al */
-#include <linux/if.h> /* for IFNAMSIZ and co... */
-
-/* Private copy of Wireless extensions */
-#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))
+
+/* Fixup to be able to include kernel includes in userspace.
+ * Basically, kill the sparse annotations... Jean II */
+#ifndef __user
+#define __user
#endif
-#endif /* __GNUC__ */
+
+#include <linux/types.h> /* for "caddr_t" et al */
+
+/* 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... */
+
+/* Private copy of Wireless extensions (in this directoty) */
+#include "wireless.h"
#ifdef __cplusplus
extern "C" {
#endif
-/****************************** DEBUG ******************************/
-
-
/************************ CONSTANTS & MACROS ************************/
/* Various versions information */
/* Recommended Wireless Extension version */
-#define WE_VERSION 17
+#define WE_VERSION 22
+/* Maximum forward compatibility built in this version of WT */
+#define WE_MAX_VERSION 22
/* Version of Wireless Tools */
-#define WT_VERSION 27
-
-/* 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 Wireless Extension 9 */
-#ifndef IW_POWER_MODIFIER
-#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */
-#define IW_POWER_MIN 0x0001 /* Value is a minimum */
-#define IW_POWER_MAX 0x0002 /* Value is a maximum */
-#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
-#endif /* IW_POWER_MODIFIER */
-
-#ifndef IW_ENCODE_NOKEY
-#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not here */
-#define IW_ENCODE_MODE 0xF000 /* Modes defined below */
-#endif /* IW_ENCODE_NOKEY */
-#ifndef IW_ENCODE_TEMP
-#define IW_ENCODE_TEMP 0x0400 /* Temporary key */
-#endif /* IW_ENCODE_TEMP */
-
-/* More backward compatibility */
-#ifndef SIOCSIWCOMMIT
-#define SIOCSIWCOMMIT SIOCSIWNAME
-#endif /* SIOCSIWCOMMIT */
-
-/* Still more backward compatibility */
-#ifndef IW_FREQ_FIXED
-#define IW_FREQ_FIXED 0x01
-#endif /* IW_FREQ_FIXED */
+#define WT_VERSION 30
/****************************** TYPES ******************************/
int key_flags; /* Various flags */
int has_essid;
int essid_on;
- char essid[IW_ESSID_MAX_SIZE + 1]; /* ESSID (extended network) */
+ char essid[IW_ESSID_MAX_SIZE + 2]; /* ESSID (extended network) */
+ int essid_len;
int has_mode;
int mode; /* Operation mode */
} wireless_config;
int has_sens;
iwparam sens; /* sensitivity */
int has_nickname;
- char nickname[IW_ESSID_MAX_SIZE + 1]; /* NickName */
+ char nickname[IW_ESSID_MAX_SIZE + 2]; /* NickName */
int has_ap_addr;
sockaddr ap_addr; /* Access point address */
int has_bitrate;
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.
struct wireless_config b; /* Basic information */
iwstats stats; /* Signal strength */
int has_stats;
+ iwparam maxbitrate; /* Max bit rate in bps */
+ int has_maxbitrate;
} wireless_scan;
/*
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
+ * All the functions in iwlib.c
*/
/* ---------------------- SOCKET SUBROUTINES -----------------------*/
int
iw_protocol_compare(const char * protocol1,
const char * protocol2);
+/* ---------------------- ESSID SUBROUTINES ---------------------- */
+void
+ iw_essid_escape(char * dest,
+ const char * src,
+ const int slen);
+int
+ iw_essid_unescape(char * dest,
+ const char * src);
/* -------------------- FREQUENCY SUBROUTINES --------------------- */
void
iw_float2freq(double in,
iw_print_pm_value(char * buffer,
int buflen,
int value,
- int flags);
+ int flags,
+ int we_version);
void
iw_print_pm_mode(char * buffer,
int buflen,
iw_print_retry_value(char * buffer,
int buflen,
int value,
- int flags);
+ int flags,
+ int we_version);
/* ----------------------- TIME SUBROUTINES ----------------------- */
void
- iw_print_timeval(char * buffer,
- int buflen,
- const struct timeval * time);
+ 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,
- char * ifname);
-int
- iw_check_if_addr_type(int skfd,
- char * ifname);
-#if 0
-int
- iw_check_addr_type(int skfd,
- char * ifname);
-#endif
+ iw_check_mac_addr_type(int skfd,
+ const char * ifname);
int
- iw_get_mac_addr(int skfd,
- const char * name,
- struct ether_addr * eth,
- unsigned short * ptype);
+ iw_check_if_addr_type(int skfd,
+ const char * ifname);
+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_ether_ntoa(const struct ether_addr* eth);
+ 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,
- char * ifname,
+ const char * ifname,
char * bufp,
struct sockaddr * sap);
/* ----------------------- MISC SUBROUTINES ------------------------ */
/* Modes as human readable strings */
extern const char * const iw_operation_mode[];
#define IW_NUM_OPER_MODE 7
+#define IW_NUM_OPER_MODE_EXT 8
+
+/* 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
+ * Most inline are private because gcc is fussy about inline...
*/
/*
/*
* Wrapper to push some Wireless Parameter in the driver
*/
-static inline int
+static inline __attribute__((always_inline)) int
iw_set_ext(int skfd, /* Socket to the kernel */
const char * ifname, /* Device name */
int request, /* WE ID */
/*
* Wrapper to extract some Wireless Parameter out of the driver
*/
-static inline int
+static inline __attribute__((always_inline)) int
iw_get_ext(int skfd, /* Socket to the kernel */
const char * ifname, /* Device name */
int request, /* WE ID */
close(skfd);
}
-/*------------------------------------------------------------------*/
-/* Backwards compatability
- * Actually, those form are much easier to use when dealing with
- * struct sockaddr... */
-static inline char*
-iw_pr_ether(char* bufp, const unsigned char* addr)
-{
- iw_ether_ntop((const struct ether_addr *) addr, bufp);
- return bufp;
-}
-/* Backwards compatability */
-static inline int
-iw_in_ether(const char *bufp, struct sockaddr *sap)
-{
- sap->sa_family = ARPHRD_ETHER;
- return iw_ether_aton(bufp, (struct ether_addr *) sap->sa_data) ? 0 : -1;
-}
-
-/*------------------------------------------------------------------*/
-/*
- * 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);
-}
-
#ifdef __cplusplus
}
#endif