diff options
author | Thomas Schwinge <tschwinge@gnu.org> | 2006-06-09 23:50:14 +0000 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gnu.org> | 2009-06-18 00:26:37 +0200 |
commit | 57c412aeb0f2e475adc33e5c86b2ddfec0453dec (patch) | |
tree | a0811153322a5201aa779d2e08b3c09053daa502 /linux | |
parent | 46066cf8d9392a3a9a423f4a7e6c0582a1efcd88 (diff) |
2006-06-09 Stefan Siegl <stesie@brokenpipe.de>
* linux/dev/include/asm-i386/uaccess.h: New dummy file.
* linux/dev/include/linux/pm.h: Likewise.
* linux/dev/include/linux/threads.h: Likewise.
* linux/src/include/linux/symtab_begin.h: New file from Linux 2.0.40.
* linux/src/include/linux/symtab_end.h: Likewise.
* linux/src/include/linux/module.h: Update from Linux 2.0.40 with minor
changes.
* linux/src/include/linux/list.h: New file from Linux 2.2.26.
* linux/src/include/linux/kcomp.h: Likewise with minor changes.
* linux/src/include/linux/wait.h: Update from Linux 2.2.26.
* linux/src/include/linux/wireless.h: Likewise.
* linux/src/include/asm-i386/bitops.h [__KERNEL__] (ffs, hweight32)
(hweight16, hweight8): Copy from Linux 2.2.26.
Diffstat (limited to 'linux')
-rw-r--r-- | linux/dev/include/asm-i386/uaccess.h | 1 | ||||
-rw-r--r-- | linux/dev/include/linux/pm.h | 1 | ||||
-rw-r--r-- | linux/dev/include/linux/threads.h | 1 | ||||
-rw-r--r-- | linux/src/include/asm-i386/bitops.h | 30 | ||||
-rw-r--r-- | linux/src/include/linux/kcomp.h | 54 | ||||
-rw-r--r-- | linux/src/include/linux/list.h | 112 | ||||
-rw-r--r-- | linux/src/include/linux/module.h | 12 | ||||
-rw-r--r-- | linux/src/include/linux/symtab_begin.h | 45 | ||||
-rw-r--r-- | linux/src/include/linux/symtab_end.h | 15 | ||||
-rw-r--r-- | linux/src/include/linux/wait.h | 12 | ||||
-rw-r--r-- | linux/src/include/linux/wireless.h | 266 |
11 files changed, 485 insertions, 64 deletions
diff --git a/linux/dev/include/asm-i386/uaccess.h b/linux/dev/include/asm-i386/uaccess.h new file mode 100644 index 0000000..9d841c9 --- /dev/null +++ b/linux/dev/include/asm-i386/uaccess.h @@ -0,0 +1 @@ +/* Dummy file. */ diff --git a/linux/dev/include/linux/pm.h b/linux/dev/include/linux/pm.h new file mode 100644 index 0000000..9d841c9 --- /dev/null +++ b/linux/dev/include/linux/pm.h @@ -0,0 +1 @@ +/* Dummy file. */ diff --git a/linux/dev/include/linux/threads.h b/linux/dev/include/linux/threads.h new file mode 100644 index 0000000..9d841c9 --- /dev/null +++ b/linux/dev/include/linux/threads.h @@ -0,0 +1 @@ +/* Dummy file. */ diff --git a/linux/src/include/asm-i386/bitops.h b/linux/src/include/asm-i386/bitops.h index e3ea8f5..d3ed1fb 100644 --- a/linux/src/include/asm-i386/bitops.h +++ b/linux/src/include/asm-i386/bitops.h @@ -134,4 +134,34 @@ extern __inline__ unsigned long ffz(unsigned long word) return word; } +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +extern __inline__ int ffs(int x) +{ + int r; + + __asm__("bsfl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" : "=r" (r) : "g" (x)); + return r+1; +} + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + #endif /* _I386_BITOPS_H */ diff --git a/linux/src/include/linux/kcomp.h b/linux/src/include/linux/kcomp.h new file mode 100644 index 0000000..1f7344a --- /dev/null +++ b/linux/src/include/linux/kcomp.h @@ -0,0 +1,54 @@ +/* + * Kernel compatibility glue to allow USB compile on 2.2.x kernels + */ + +#include <linux/list.h> +#include <linux/sched.h> +#include <linux/netdevice.h> +#include <linux/pagemap.h> + +#define __exit + +#define pci_enable_device(x) 0 + +#define page_address(x) (x | PAGE_OFFSET) + +#define TTY_DRIVER_NO_DEVFS 0 + +#define net_device device +#define dev_kfree_skb_irq(a) dev_kfree_skb(a, FREE_WRITE) +#define netif_wake_queue(dev) do { clear_bit(0, &dev->tbusy); mark_bh(NET_BH); } while(0) +#define netif_stop_queue(dev) test_and_set_bit(0, &dev->tbusy) +#define netif_start_queue(dev) do { dev->tbusy = 0; dev->interrupt = 0; dev->start = 1; } while (0) +#define netif_queue_stopped(dev) dev->tbusy +#define netif_running(dev) dev->start + +/* hot-(un)plugging stuff */ +static inline int netif_device_present(struct net_device *dev) +{ + return test_bit(0, &dev->start); +} + +static inline void netif_device_detach(struct net_device *dev) +{ + if ( test_and_clear_bit(0, &dev->start) ) + netif_stop_queue(dev); +} + +static inline void netif_device_attach(struct net_device *dev) +{ + if ( !test_and_set_bit(0, &dev->start) ) + netif_wake_queue(dev); +} + +#define NET_XMIT_SUCCESS 0 +#define NET_XMIT_DROP 1 +#define NET_XMIT_CN 2 + +#define IORESOURCE_IO 1 +#define pci_resource_start(dev,bar) \ +(((dev)->base_address[(bar)] & PCI_BASE_ADDRESS_SPACE) ? \ + ((dev)->base_address[(bar)] & PCI_BASE_ADDRESS_IO_MASK) : \ + ((dev)->base_address[(bar)] & PCI_BASE_ADDRESS_MEM_MASK)) +#define pci_resource_flags(dev, i) (dev->base_address[i] & IORESOURCE_IO) + diff --git a/linux/src/include/linux/list.h b/linux/src/include/linux/list.h new file mode 100644 index 0000000..27a6ff4 --- /dev/null +++ b/linux/src/include/linux/list.h @@ -0,0 +1,112 @@ +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +#ifdef __KERNEL__ + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = { &name, &name } + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ +} while (0) + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static __inline__ void __list_add(struct list_head * new, + struct list_head * prev, + struct list_head * next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/* + * Insert a new entry after the specified head.. + */ +static __inline__ void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/* + * Insert a new entry at the tail + */ +static __inline__ void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static __inline__ void __list_del(struct list_head * prev, + struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +static __inline__ void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static __inline__ int list_empty(struct list_head *head) +{ + return head->next == head; +} + +/* + * Splice in "list" into "head" + */ +static __inline__ void list_splice(struct list_head *list, struct list_head *head) +{ + struct list_head *first = list->next; + + if (first != list) { + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; + } +} + +#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) + +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#endif /* __KERNEL__ */ + +#endif diff --git a/linux/src/include/linux/module.h b/linux/src/include/linux/module.h index b4b92af..bc364f7 100644 --- a/linux/src/include/linux/module.h +++ b/linux/src/include/linux/module.h @@ -46,7 +46,7 @@ struct module_ref { struct internal_symbol { void *addr; const char *name; - }; +}; struct symbol_table { /* received from "insmod" */ int size; /* total, including string table!!! */ @@ -65,7 +65,7 @@ struct module { struct symbol_table *symtab; const char *name; int size; /* size of module in pages */ - void* addr; /* address of module */ + void *addr; /* address of module */ int state; void (*cleanup)(void); /* cleanup routine */ }; @@ -108,12 +108,6 @@ int Using_Versions; /* gcc will handle this global (used as a flag) correctly */ #endif /* insert new symbol table */ -extern int register_symtab_from(struct symbol_table *, long *); -extern void *get_module_symbol(char *, char *); -#ifdef MODULE -#define register_symtab(symtab) register_symtab_from(symtab, &mod_use_count_) -#else -#define register_symtab(symtab) register_symtab_from(symtab, 0) -#endif +#define register_symtab(symtab) #endif diff --git a/linux/src/include/linux/symtab_begin.h b/linux/src/include/linux/symtab_begin.h new file mode 100644 index 0000000..65a8700 --- /dev/null +++ b/linux/src/include/linux/symtab_begin.h @@ -0,0 +1,45 @@ +#include <linux/linkage.h> + +#ifdef MODVERSIONS +# undef _set_ver +# undef X +/* + * These two macros _will_ get enough arguments from the X* macros + * since "sym" expands to "symaddr, symstr" from the #define in *.ver + */ +# define _basic_version(symaddr,symstr) symaddr, symstr +# define _alias_version(really,symaddr,symstr) (void *) & really , symstr + +# ifndef __GENKSYMS__ +# ifdef MODULE +# define _set_ver(sym,ver) \ + (void *) & sym ## _R ## ver, SYMBOL_NAME_STR(sym) "_R" #ver +# else /* !MODULE */ +# define _set_ver(sym,ver) \ + (void *) & sym, SYMBOL_NAME_STR(sym) "_R" #ver +# endif /* !MODULE */ +# define X(sym) { _basic_version(sym) } +/* + * For _really_ stacked modules: + * + * Use "Xalias(local_symbol, symbol_from_other_module)" + * to make subsequent modules really use "local_symbol" + * when they think that they are using "symbol_from_other_module" + * + * The "aliasing" module can still use "symbol_from_other_module", + * but can now replace and/or modify the behaviour of that symbol. + */ +# define Xalias(really,sym) { _alias_version(really,sym) } +# endif /* !__GENKSYMS__ */ +#else /* !MODVERSIONS */ +# define X(sym) { (void *) & sym, SYMBOL_NAME_STR(sym)} +# define Xalias(really,sym) { (void *) & really, SYMBOL_NAME_STR(sym)} +#endif /* MODVERSIONS */ +/* + * Some symbols always need to be unversioned. This includes + * compiler generated calls to functions. + */ +#define XNOVERS(sym) { (void *) & sym, SYMBOL_NAME_STR(sym)} + +#define EMPTY {0,0} + 0, 0, 0, { diff --git a/linux/src/include/linux/symtab_end.h b/linux/src/include/linux/symtab_end.h new file mode 100644 index 0000000..91b92e2 --- /dev/null +++ b/linux/src/include/linux/symtab_end.h @@ -0,0 +1,15 @@ +#ifdef MODVERSIONS +#undef _set_ver +#if defined(MODULE) && !defined(__GENKSYMS__) +#define _set_ver(sym,vers) sym ## _R ## vers +#else +#define _set_ver(a,b) a +#endif +#endif /* MODVERSIONS */ +#undef X +#undef EMPTY + /* mark end of table, last entry above ended with a comma! */ + { (void *)0, (char *)0 } + }, + /* no module refs, insmod will take care of that instead! */ + { { (struct module *)0, (struct module_ref *)0 } } diff --git a/linux/src/include/linux/wait.h b/linux/src/include/linux/wait.h index 46f1e4f..96de4aa 100644 --- a/linux/src/include/linux/wait.h +++ b/linux/src/include/linux/wait.h @@ -4,16 +4,26 @@ #define WNOHANG 0x00000001 #define WUNTRACED 0x00000002 -#define __WCLONE 0x80000000 +#define __WALL 0x40000000 /* Wait on all children, regardless of type */ +#define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */ #ifdef __KERNEL__ +#include <asm/page.h> + struct wait_queue { struct task_struct * task; struct wait_queue * next; }; +typedef struct wait_queue wait_queue_t; +typedef struct wait_queue *wait_queue_head_t; + #define WAIT_QUEUE_HEAD(x) ((struct wait_queue *)((x)-1)) +#define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL } +#define DECLARE_WAIT_QUEUE_HEAD(wait) wait_queue_head_t wait +#define init_waitqueue_head(x) *(x)=NULL +#define init_waitqueue_entry(q,p) ((q)->task)=(p) static inline void init_waitqueue(struct wait_queue **q) { diff --git a/linux/src/include/linux/wireless.h b/linux/src/include/linux/wireless.h index a368355..c552ff2 100644 --- a/linux/src/include/linux/wireless.h +++ b/linux/src/include/linux/wireless.h @@ -1,9 +1,9 @@ /* * This file define a set of standard wireless extensions * - * Version : 4 12.2.97 + * Version : 9 16.10.99 * - * Authors : Jean Tourrilhes - HPLB - <jt@hplb.hpl.hp.com> + * Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com> */ #ifndef _LINUX_WIRELESS_H @@ -63,7 +63,7 @@ * (there is some stuff that will be added in the future...) * I just plan to increment with each new version. */ -#define WIRELESS_EXT 5 +#define WIRELESS_EXT 10 /* * Changes : @@ -82,26 +82,55 @@ * -------- * - Missing encoding definitions in range * - Access points stuff + * + * V5 to V6 + * -------- + * - 802.11 support (ESSID ioctls) + * + * V6 to V7 + * -------- + * - define IW_ESSID_MAX_SIZE and IW_MAX_AP + * + * V7 to V8 + * -------- + * - Changed my e-mail address + * - More 802.11 support (nickname, rate, rts, frag) + * - List index in frequencies + * + * V8 to V9 + * -------- + * - Support for 'mode of operation' (ad-hoc, managed...) + * - Support for unicast and multicast power saving + * - Change encoding to support larger tokens (>64 bits) + * - Updated iw_params (disable, flags) and use it for NWID + * - Extracted iw_point from iwreq for clarity + * + * V9 to V10 + * --------- + * - Add PM capability to range structure + * - Add PM modifier : MAX/MIN/RELATIVE + * - Add encoding option : IW_ENCODE_NOKEY + * - Add TxPower ioctls (work like TxRate) */ /* -------------------------- IOCTL LIST -------------------------- */ /* Basic operations */ -#define SIOCSIWNAME 0x8B00 /* Unused ??? */ -#define SIOCGIWNAME 0x8B01 /* get name */ -#define SIOCSIWNWID 0x8B02 /* set network id */ +#define SIOCSIWNAME 0x8B00 /* Unused */ +#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ +#define SIOCSIWNWID 0x8B02 /* set network id (the cell) */ #define SIOCGIWNWID 0x8B03 /* get network id */ -#define SIOCSIWFREQ 0x8B04 /* set channel/frequency */ -#define SIOCGIWFREQ 0x8B05 /* get channel/frequency */ -#define SIOCSIWENCODE 0x8B06 /* set encoding info */ -#define SIOCGIWENCODE 0x8B07 /* get encoding info */ -#define SIOCSIWSENS 0x8B08 /* set sensitivity */ -#define SIOCGIWSENS 0x8B09 /* get sensitivity */ +#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ +#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ +#define SIOCSIWMODE 0x8B06 /* set operation mode */ +#define SIOCGIWMODE 0x8B07 /* get operation mode */ +#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ +#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ /* Informative stuff */ -#define SIOCSIWRANGE 0x8B0A /* Unused ??? */ +#define SIOCSIWRANGE 0x8B0A /* Unused */ #define SIOCGIWRANGE 0x8B0B /* Get range of parameters */ -#define SIOCSIWPRIV 0x8B0C /* Unused ??? */ +#define SIOCSIWPRIV 0x8B0C /* Unused */ #define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ /* Mobile IP support */ @@ -109,15 +138,43 @@ #define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ /* Access Point manipulation */ -#define SIOCSIWAP 0x8B14 /* set access point hardware addresses */ -#define SIOCGIWAP 0x8B15 /* get access point hardware addresses */ +#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ +#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ #define SIOCGIWAPLIST 0x8B17 /* get list of access point in range */ +/* 802.11 specific support */ +#define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */ +#define SIOCGIWESSID 0x8B1B /* get ESSID */ +#define SIOCSIWNICKN 0x8B1C /* set node name/nickname */ +#define SIOCGIWNICKN 0x8B1D /* get node name/nickname */ +/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit + * within the 'iwreq' structure, so we need to use the 'data' member to + * point to a string in user space, like it is done for RANGE... + * The "flags" member indicate if the ESSID is active or not (promiscuous). + */ + +/* Other parameters usefull in 802.11 and some other devices */ +#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ +#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ +#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ +#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ +#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ +#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ +#define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */ +#define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */ + +/* Encoding stuff (scrambling, hardware security, WEP...) */ +#define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */ +#define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */ +/* Power saving stuff (power management, unicast and multicast) */ +#define SIOCSIWPOWER 0x8B2C /* set Power Management settings */ +#define SIOCGIWPOWER 0x8B2D /* get Power Management settings */ + /* ------------------------- IOCTL STUFF ------------------------- */ /* The first and the last (range) */ #define SIOCIWFIRST 0x8B00 -#define SIOCIWLAST 0x8B17 +#define SIOCIWLAST 0x8B30 /* Even : get (world access), odd : set (root access) */ #define IW_IS_SET(cmd) (!((cmd) & 0x1)) @@ -154,23 +211,105 @@ * don't increase this constant and don't fill the frequency list. * The user will be able to set by channel anyway... */ +/* Maximum bit rates in the range struct */ +#define IW_MAX_BITRATES 8 + +/* Maximum tx powers in the range struct */ +#define IW_MAX_TXPOWER 8 + /* Maximum of address that you may set with SPY */ #define IW_MAX_SPY 8 +/* Maximum of address that you may get in the + list of access points in range */ +#define IW_MAX_AP 8 + +/* Maximum size of the ESSID and NICKN strings */ +#define IW_ESSID_MAX_SIZE 32 + +/* Modes of operation */ +#define IW_MODE_AUTO 0 /* Let the driver decides */ +#define IW_MODE_ADHOC 1 /* Single cell network */ +#define IW_MODE_INFRA 2 /* Multi cell network, roaming, ... */ +#define IW_MODE_MASTER 3 /* Synchronisation master or Access Point */ +#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */ +#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */ + +/* Maximum number of size of encoding token available + * they are listed in the range structure */ +#define IW_MAX_ENCODING_SIZES 8 + +/* Maximum size of the encoding token in bytes */ +#define IW_ENCODING_TOKEN_MAX 32 /* 256 bits (for now) */ + +/* Flags for encoding (along with the token) */ +#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ +#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */ +#define IW_ENCODE_MODE 0xF000 /* Modes defined below */ +#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */ +#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ +#define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */ +#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ +#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ + +/* Power management flags available (along with the value, if any) */ +#define IW_POWER_ON 0x0000 /* No details... */ +#define IW_POWER_TYPE 0xF000 /* Type of parameter */ +#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */ +#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */ +#define IW_POWER_MODE 0x0F00 /* Power Management mode */ +#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */ +#define IW_POWER_MULTICAST_R 0x0200 /* Receive only multicast messages */ +#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */ +#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */ +#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */ +#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 */ + +/* Transmit Power flags available */ +#define IW_TXPOW_DBM 0x0000 /* Value is in dBm */ +#define IW_TXPOW_MWATT 0x0001 /* Value is in mW */ + /****************************** TYPES ******************************/ /* --------------------------- SUBTYPES --------------------------- */ /* + * Generic format for most parameters that fit in an int + */ +struct iw_param +{ + __s32 value; /* The value of the parameter itself */ + __u8 fixed; /* Hardware should not use auto select */ + __u8 disabled; /* Disable the feature */ + __u16 flags; /* Various specifc flags (if any) */ +}; + +/* + * For all data larger than 16 octets, we need to use a + * pointer to memory alocated in user space. + */ +struct iw_point +{ + caddr_t pointer; /* Pointer to the data (in user space) */ + __u16 length; /* number of fields or size in bytes */ + __u16 flags; /* Optional params */ +}; + +/* * A frequency - * For numbers lower than 10^9, we encode the number in 'mant' and - * set 'exp' to 0 - * For number greater than 10^9, we divide it by a power of 10. - * The power of 10 is in 'exp', the result is in 'mant'. + * For numbers lower than 10^9, we encode the number in 'm' and + * set 'e' to 0 + * For number greater than 10^9, we divide it by the lowest power + * of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')... + * The power of 10 is in 'e', the result of the division is in 'm'. */ struct iw_freq { __u32 m; /* Mantissa */ __u16 e; /* Exponent */ + __u8 i; /* List index (when in range struct) */ }; /* @@ -178,7 +317,7 @@ struct iw_freq */ struct iw_quality { - __u8 qual; /* link quality (SNR or better...) */ + __u8 qual; /* link quality (%retries, SNR or better...) */ __u8 level; /* signal level */ __u8 noise; /* noise level */ __u8 updated; /* Flags to know if updated */ @@ -195,25 +334,14 @@ struct iw_discarded __u32 misc; /* Others cases */ }; -/* - * Encoding information (setting and so on) - * Encoding might be hardware encryption, scrambing or others - */ -struct iw_encoding -{ - __u8 method; /* Algorithm number / key used */ - __u64 code; /* Data/key used for algorithm */ -}; - - /* ------------------------ WIRELESS STATS ------------------------ */ /* * Wireless statistics (used for /proc/net/wireless) */ struct iw_statistics { - __u8 status; /* Status - * - device dependant for now */ + __u16 status; /* Status + * - device dependent for now */ struct iw_quality qual; /* Quality of the link * (instant/mean/max) */ @@ -234,40 +362,36 @@ struct iwreq { union { - char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */ } ifr_ifrn; /* Data part */ union { /* Config - generic */ - char name[IFNAMSIZ]; + char name[IFNAMSIZ]; /* Name : used to verify the presence of wireless extensions. * Name of the protocol/provider... */ - struct /* network id (or domain) : used to */ - { /* create logical channels on the air */ - __u32 nwid; /* value */ - __u8 on; /* active/unactive nwid */ - } nwid; - + struct iw_point essid; /* Extended network name */ + struct iw_param nwid; /* network id (or domain - the cell) */ struct iw_freq freq; /* frequency or channel : * 0-1000 = channel * > 1000 = frequency in Hz */ - struct iw_encoding encoding; /* Encoding stuff */ + struct iw_param sens; /* signal level threshold */ + struct iw_param bitrate; /* default bit rate */ + struct iw_param txpower; /* default transmit power */ + struct iw_param rts; /* RTS threshold threshold */ + struct iw_param frag; /* Fragmentation threshold */ + __u32 mode; /* Operation mode */ - __u32 sensitivity; /* signal level threshold */ + struct iw_point encoding; /* Encoding stuff : tokens */ + struct iw_param power; /* PM duration/timeout */ struct sockaddr ap_addr; /* Access point address */ - struct /* For all data bigger than 16 octets */ - { - caddr_t pointer; /* Pointer to the data - * (in user space) */ - __u16 length; /* fields or byte size */ - __u16 flags; /* Unused */ - } data; + struct iw_point data; /* Other large parameters */ } u; }; @@ -285,6 +409,12 @@ struct iw_range { /* Informative stuff (to choose between different interface) */ __u32 throughput; /* To give an idea... */ + /* In theory this value should be the maximum benchmarked + * TCP/IP throughput, because with most of these devices the + * bit rate is meaningless (overhead an co) to estimate how + * fast the connection will go and pick the fastest one. + * I suggest people to play with Netperf or any benchmark... + */ /* NWID (or domain id) */ __u32 min_nwid; /* Minimal NWID we are able to set */ @@ -297,13 +427,41 @@ struct iw_range /* Note : this frequency list doesn't need to fit channel numbers */ /* signal level threshold range */ - __u32 sensitivity; + __s32 sensitivity; /* Quality of link & SNR stuff */ struct iw_quality max_qual; /* Quality of the link */ + /* Rates */ + __u8 num_bitrates; /* Number of entries in the list */ + __s32 bitrate[IW_MAX_BITRATES]; /* list, in bps */ + + /* RTS threshold */ + __s32 min_rts; /* Minimal RTS threshold */ + __s32 max_rts; /* Maximal RTS threshold */ + + /* Frag threshold */ + __s32 min_frag; /* Minimal frag threshold */ + __s32 max_frag; /* Maximal frag threshold */ + + /* Power Management duration & timeout */ + __s32 min_pmp; /* Minimal PM period */ + __s32 max_pmp; /* Maximal PM period */ + __s32 min_pmt; /* Minimal PM timeout */ + __s32 max_pmt; /* Maximal PM timeout */ + __u16 pmp_flags; /* How to decode max/min PM period */ + __u16 pmt_flags; /* How to decode max/min PM timeout */ + __u16 pm_capa; /* What PM options are supported */ + /* Encoder stuff */ - struct iw_encoding max_encoding; /* Encoding max range */ + __u16 encoding_size[IW_MAX_ENCODING_SIZES]; /* Different token sizes */ + __u8 num_encoding_sizes; /* Number of entry in the list */ + __u8 max_encoding_tokens; /* Max number of tokens */ + + /* Transmit power */ + __u16 txpower_capa; /* What options are supported */ + __u8 num_txpower; /* Number of entries in the list */ + __s32 txpower[IW_MAX_TXPOWER]; /* list, in bps */ }; /* |