X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=staticlibiw%2Fiwlib.h;fp=staticlibiw%2Fiwlib.h;h=c67ec823495034ceec2e08cea0c5171af2e37ecd;hb=9f9f6e4593b75e314882c26040b89718d0d9b320;hp=0000000000000000000000000000000000000000;hpb=6575cccbd0ea775d09abba754062d83f2a6958ed;p=pyiw diff --git a/staticlibiw/iwlib.h b/staticlibiw/iwlib.h new file mode 100644 index 0000000..c67ec82 --- /dev/null +++ b/staticlibiw/iwlib.h @@ -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 + */ + +#ifndef IWLIB_H +#define IWLIB_H + +/*#include "CHANGELOG.h"*/ + +/***************************** INCLUDES *****************************/ + +/* Standard headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* gethostbyname, getnetbyname */ +#include /* struct ether_addr */ +#include /* struct timeval */ +#include + +/* 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 +#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 , 27.3.2 */ +#include /* For ARPHRD_ETHER */ +#include /* For AF_INET & struct sockaddr */ +#include /* For struct sockaddr_in */ +#include +#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 /* for "caddr_t" et al */ + +#ifdef HEADERS_KERNEL +/* Traditionally we have used kernel headers, included in wireless.h */ +#include /* for "struct sockaddr" et al */ +#include /* for IFNAMSIZ and co... */ +#else /* !HEADERS_KERNEL */ +/* Glibc systems headers are supposedly less problematic than kernel ones */ +#include /* for "struct sockaddr" et al */ +#include /* 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 */