nexmon – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /*
2 * Wireless Tools
3 *
4 * Jean II - HPLB 97->99 - HPL 99->07
5 *
6 * Common header for the Wireless Extension library...
7 *
8 * This file is released under the GPL license.
9 * Copyright (c) 1997-2007 Jean Tourrilhes <jt@hpl.hp.com>
10 */
11  
12 #ifndef IWLIB_H
13 #define IWLIB_H
14  
15 /*#include "CHANGELOG.h"*/
16  
17 /***************************** INCLUDES *****************************/
18  
19 /* Standard headers */
20 #include <sys/types.h>
21 #include <sys/ioctl.h>
22 #include <stdio.h>
23 #include <math.h>
24 #include <errno.h>
25 #include <fcntl.h>
26 #include <ctype.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
30 #include <netdb.h> /* gethostbyname, getnetbyname */
31 #include <net/ethernet.h> /* struct ether_addr */
32 #include <sys/time.h> /* struct timeval */
33 #include <unistd.h>
34  
35 /* This is our header selection. Try to hide the mess and the misery :-(
36 * Don't look, you would go blind ;-)
37 * Note : compatibility with *old* distributions has been removed,
38 * you will need Glibc 2.2 and older to compile (which means
39 * Mandrake 8.0, Debian 2.3, RH 7.1 or older).
40 */
41  
42 /* Set of headers proposed by Dr. Michael Rietz <rietz@mail.amps.de>, 27.3.2 */
43 #include <net/if_arp.h> /* For ARPHRD_ETHER */
44 #include <sys/socket.h> /* For AF_INET & struct sockaddr */
45 #include <netinet/in.h> /* For struct sockaddr_in */
46 #include <netinet/if_ether.h>
47  
48 /* Fixup to be able to include kernel includes in userspace.
49 * Basically, kill the sparse annotations... Jean II */
50 #ifndef __user
51 #define __user
52 #endif
53  
54 #include <linux/types.h> /* for "caddr_t" et al */
55  
56 /* Glibc systems headers are supposedly less problematic than kernel ones */
57 #include <sys/socket.h> /* for "struct sockaddr" et al */
58 #include <net/if.h> /* for IFNAMSIZ and co... */
59  
60 /* Private copy of Wireless extensions (in this directoty) */
61 #include "wireless.h"
62  
63 /* Make gcc understant that when we say inline, we mean it.
64 * I really hate when the compiler is trying to be more clever than me,
65 * because in this case gcc is not able to figure out functions with a
66 * single call site, so not only I have to tag those functions inline
67 * by hand, but then it refuse to inline them properly.
68 * Total saving for iwevent : 150B = 0.7%.
69 * Fortunately, in gcc 3.4, they now automatically inline static functions
70 * with a single call site. Hurrah !
71 * Jean II */
72 #undef IW_GCC_HAS_BROKEN_INLINE
73 #if __GNUC__ == 3
74 #if __GNUC_MINOR__ >= 1 && __GNUC_MINOR__ < 4
75 #define IW_GCC_HAS_BROKEN_INLINE 1
76 #endif /* __GNUC_MINOR__ */
77 #endif /* __GNUC__ */
78 /* However, gcc 4.0 has introduce a new "feature", when compiling with
79 * '-Os', it does not want to inline iw_ether_cmp() and friends.
80 * So, we need to fix inline again !
81 * Jean II */
82 #if __GNUC__ == 4
83 #define IW_GCC_HAS_BROKEN_INLINE 1
84 #endif /* __GNUC__ */
85 /* Now, really fix the inline */
86 #ifdef IW_GCC_HAS_BROKEN_INLINE
87 #ifdef inline
88 #undef inline
89 #endif /* inline */
90 #define inline inline __attribute__((always_inline))
91 #endif /* IW_GCC_HAS_BROKEN_INLINE */
92  
93 #ifdef __cplusplus
94 extern "C" {
95 #endif
96  
97 /****************************** DEBUG ******************************/
98  
99 //#define DEBUG 1
100  
101 /************************ CONSTANTS & MACROS ************************/
102  
103 /* Various versions information */
104 /* Recommended Wireless Extension version */
105 #define WE_VERSION 21
106 /* Maximum forward compatibility built in this version of WT */
107 #define WE_MAX_VERSION 22
108 /* Version of Wireless Tools */
109 #define WT_VERSION 29
110  
111 /* Paths */
112 #define PROC_NET_WIRELESS "/proc/net/wireless"
113 #define PROC_NET_DEV "/proc/net/dev"
114  
115 /* Some usefull constants */
116 #define KILO 1e3
117 #define MEGA 1e6
118 #define GIGA 1e9
119 /* For doing log10/exp10 without libm */
120 #define LOG10_MAGIC 1.25892541179
121  
122 /* Backward compatibility for network headers */
123 #ifndef ARPHRD_IEEE80211
124 #define ARPHRD_IEEE80211 801 /* IEEE 802.11 */
125 #endif /* ARPHRD_IEEE80211 */
126  
127 #ifndef IW_EV_LCP_PK_LEN
128 /* Size of the Event prefix when packed in stream */
129 #define IW_EV_LCP_PK_LEN (4)
130 /* Size of the various events when packed in stream */
131 #define IW_EV_CHAR_PK_LEN (IW_EV_LCP_PK_LEN + IFNAMSIZ)
132 #define IW_EV_UINT_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(__u32))
133 #define IW_EV_FREQ_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq))
134 #define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param))
135 #define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr))
136 #define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality))
137 #define IW_EV_POINT_PK_LEN (IW_EV_LCP_PK_LEN + 4)
138  
139 struct iw_pk_event
140 {
141 __u16 len; /* Real lenght of this stuff */
142 __u16 cmd; /* Wireless IOCTL */
143 union iwreq_data u; /* IOCTL fixed payload */
144 } __attribute__ ((packed));
145 struct iw_pk_point
146 {
147 void __user *pointer; /* Pointer to the data (in user space) */
148 __u16 length; /* number of fields or size in bytes */
149 __u16 flags; /* Optional params */
150 } __attribute__ ((packed));
151  
152 #define IW_EV_LCP_PK2_LEN (sizeof(struct iw_pk_event) - sizeof(union iwreq_data))
153 #define IW_EV_POINT_PK2_LEN (IW_EV_LCP_PK2_LEN + sizeof(struct iw_pk_point) - IW_EV_POINT_OFF)
154  
155 #endif /* IW_EV_LCP_PK_LEN */
156  
157 /****************************** TYPES ******************************/
158  
159 /* Shortcuts */
160 typedef struct iw_statistics iwstats;
161 typedef struct iw_range iwrange;
162 typedef struct iw_param iwparam;
163 typedef struct iw_freq iwfreq;
164 typedef struct iw_quality iwqual;
165 typedef struct iw_priv_args iwprivargs;
166 typedef struct sockaddr sockaddr;
167  
168 /* Structure for storing all wireless information for each device
169 * This is a cut down version of the one above, containing only
170 * the things *truly* needed to configure a card.
171 * Don't add other junk, I'll remove it... */
172 typedef struct wireless_config
173 {
174 char name[IFNAMSIZ + 1]; /* Wireless/protocol name */
175 int has_nwid;
176 iwparam nwid; /* Network ID */
177 int has_freq;
178 double freq; /* Frequency/channel */
179 int freq_flags;
180 int has_key;
181 unsigned char key[IW_ENCODING_TOKEN_MAX]; /* Encoding key used */
182 int key_size; /* Number of bytes */
183 int key_flags; /* Various flags */
184 int has_essid;
185 int essid_on;
186 char essid[IW_ESSID_MAX_SIZE + 1]; /* ESSID (extended network) */
187 int has_mode;
188 int mode; /* Operation mode */
189 } wireless_config;
190  
191 /* Structure for storing all wireless information for each device
192 * This is pretty exhaustive... */
193 typedef struct wireless_info
194 {
195 struct wireless_config b; /* Basic information */
196  
197 int has_sens;
198 iwparam sens; /* sensitivity */
199 int has_nickname;
200 char nickname[IW_ESSID_MAX_SIZE + 1]; /* NickName */
201 int has_ap_addr;
202 sockaddr ap_addr; /* Access point address */
203 int has_bitrate;
204 iwparam bitrate; /* Bit rate in bps */
205 int has_rts;
206 iwparam rts; /* RTS threshold in bytes */
207 int has_frag;
208 iwparam frag; /* Fragmentation threshold in bytes */
209 int has_power;
210 iwparam power; /* Power management parameters */
211 int has_txpower;
212 iwparam txpower; /* Transmit Power in dBm */
213 int has_retry;
214 iwparam retry; /* Retry limit or lifetime */
215  
216 /* Stats */
217 iwstats stats;
218 int has_stats;
219 iwrange range;
220 int has_range;
221  
222 /* Auth params for WPA/802.1x/802.11i */
223 int auth_key_mgmt;
224 int has_auth_key_mgmt;
225 int auth_cipher_pairwise;
226 int has_auth_cipher_pairwise;
227 int auth_cipher_group;
228 int has_auth_cipher_group;
229 } wireless_info;
230  
231 /* Structure for storing an entry of a wireless scan.
232 * This is only a subset of all possible information, the flexible
233 * structure of scan results make it impossible to capture all
234 * information in such a static structure. */
235 typedef struct wireless_scan
236 {
237 /* Linked list */
238 struct wireless_scan * next;
239  
240 /* Cell identifiaction */
241 int has_ap_addr;
242 sockaddr ap_addr; /* Access point address */
243  
244 /* Other information */
245 struct wireless_config b; /* Basic information */
246 iwstats stats; /* Signal strength */
247 int has_stats;
248 iwparam maxbitrate; /* Max bit rate in bps */
249 int has_maxbitrate;
250 } wireless_scan;
251  
252 /*
253 * Context used for non-blocking scan.
254 */
255 typedef struct wireless_scan_head
256 {
257 wireless_scan * result; /* Result of the scan */
258 int retry; /* Retry level */
259 } wireless_scan_head;
260  
261 /* Structure used for parsing event streams, such as Wireless Events
262 * and scan results */
263 typedef struct stream_descr
264 {
265 char * end; /* End of the stream */
266 char * current; /* Current event in stream of events */
267 char * value; /* Current value in event */
268 } stream_descr;
269  
270 /* Prototype for handling display of each single interface on the
271 * system - see iw_enum_devices() */
272 typedef int (*iw_enum_handler)(int skfd,
273 char * ifname,
274 char * args[],
275 int count);
276  
277 /* Describe a modulation */
278 typedef struct iw_modul_descr
279 {
280 unsigned int mask; /* Modulation bitmask */
281 char cmd[8]; /* Short name */
282 char * verbose; /* Verbose description */
283 } iw_modul_descr;
284  
285 /**************************** PROTOTYPES ****************************/
286 /*
287 * All the functions in iwcommon.c
288 */
289  
290 /* ---------------------- SOCKET SUBROUTINES -----------------------*/
291 int
292 iw_sockets_open(void);
293 void
294 iw_enum_devices(int skfd,
295 iw_enum_handler fn,
296 char * args[],
297 int count);
298 /* --------------------- WIRELESS SUBROUTINES ----------------------*/
299 int
300 iw_get_kernel_we_version(void);
301 int
302 iw_print_version_info(const char * toolname);
303 int
304 iw_get_range_info(int skfd,
305 const char * ifname,
306 iwrange * range);
307 int
308 iw_get_priv_info(int skfd,
309 const char * ifname,
310 iwprivargs ** ppriv);
311 int
312 iw_get_basic_config(int skfd,
313 const char * ifname,
314 wireless_config * info);
315 int
316 iw_set_basic_config(int skfd,
317 const char * ifname,
318 wireless_config * info);
319 /* --------------------- PROTOCOL SUBROUTINES --------------------- */
320 int
321 iw_protocol_compare(const char * protocol1,
322 const char * protocol2);
323 /* -------------------- FREQUENCY SUBROUTINES --------------------- */
324 void
325 iw_float2freq(double in,
326 iwfreq * out);
327 double
328 iw_freq2float(const iwfreq * in);
329 void
330 iw_print_freq_value(char * buffer,
331 int buflen,
332 double freq);
333 void
334 iw_print_freq(char * buffer,
335 int buflen,
336 double freq,
337 int channel,
338 int freq_flags);
339 int
340 iw_freq_to_channel(double freq,
341 const struct iw_range * range);
342 int
343 iw_channel_to_freq(int channel,
344 double * pfreq,
345 const struct iw_range * range);
346 void
347 iw_print_bitrate(char * buffer,
348 int buflen,
349 int bitrate);
350 /* ---------------------- POWER SUBROUTINES ----------------------- */
351 int
352 iw_dbm2mwatt(int in);
353 int
354 iw_mwatt2dbm(int in);
355 void
356 iw_print_txpower(char * buffer,
357 int buflen,
358 struct iw_param * txpower);
359 /* -------------------- STATISTICS SUBROUTINES -------------------- */
360 int
361 iw_get_stats(int skfd,
362 const char * ifname,
363 iwstats * stats,
364 const iwrange * range,
365 int has_range);
366 void
367 iw_print_stats(char * buffer,
368 int buflen,
369 const iwqual * qual,
370 const iwrange * range,
371 int has_range);
372 /* --------------------- ENCODING SUBROUTINES --------------------- */
373 void
374 iw_print_key(char * buffer,
375 int buflen,
376 const unsigned char * key,
377 int key_size,
378 int key_flags);
379 int
380 iw_in_key(const char * input,
381 unsigned char * key);
382 int
383 iw_in_key_full(int skfd,
384 const char * ifname,
385 const char * input,
386 unsigned char * key,
387 __u16 * flags);
388 /* ----------------- POWER MANAGEMENT SUBROUTINES ----------------- */
389 void
390 iw_print_pm_value(char * buffer,
391 int buflen,
392 int value,
393 int flags,
394 int we_version);
395 void
396 iw_print_pm_mode(char * buffer,
397 int buflen,
398 int flags);
399 /* --------------- RETRY LIMIT/LIFETIME SUBROUTINES --------------- */
400 void
401 iw_print_retry_value(char * buffer,
402 int buflen,
403 int value,
404 int flags,
405 int we_version);
406 /* ----------------------- TIME SUBROUTINES ----------------------- */
407 void
408 iw_print_timeval(char * buffer,
409 int buflen,
410 const struct timeval * time,
411 const struct timezone * tz);
412 /* --------------------- ADDRESS SUBROUTINES ---------------------- */
413 int
414 iw_check_mac_addr_type(int skfd,
415 const char * ifname);
416 int
417 iw_check_if_addr_type(int skfd,
418 const char * ifname);
419 #if 0
420 int
421 iw_check_addr_type(int skfd,
422 const char * ifname);
423 #endif
424 #if 0
425 int
426 iw_get_mac_addr(int skfd,
427 const char * name,
428 struct ether_addr * eth,
429 unsigned short * ptype);
430 #endif
431 char *
432 iw_mac_ntop(const unsigned char * mac,
433 int maclen,
434 char * buf,
435 int buflen);
436 void
437 iw_ether_ntop(const struct ether_addr * eth,
438 char * buf);
439 char *
440 iw_sawap_ntop(const struct sockaddr * sap,
441 char * buf);
442 int
443 iw_mac_aton(const char * orig,
444 unsigned char * mac,
445 int macmax);
446 int
447 iw_ether_aton(const char* bufp, struct ether_addr* eth);
448 int
449 iw_in_inet(char *bufp, struct sockaddr *sap);
450 int
451 iw_in_addr(int skfd,
452 const char * ifname,
453 char * bufp,
454 struct sockaddr * sap);
455 /* ----------------------- MISC SUBROUTINES ------------------------ */
456 int
457 iw_get_priv_size(int args);
458  
459 /* ---------------------- EVENT SUBROUTINES ---------------------- */
460 void
461 iw_init_event_stream(struct stream_descr * stream,
462 char * data,
463 int len);
464 int
465 iw_extract_event_stream(struct stream_descr * stream,
466 struct iw_event * iwe,
467 int we_version);
468 /* --------------------- SCANNING SUBROUTINES --------------------- */
469 int
470 iw_process_scan(int skfd,
471 char * ifname,
472 int we_version,
473 wireless_scan_head * context);
474 int
475 iw_scan(int skfd,
476 char * ifname,
477 int we_version,
478 wireless_scan_head * context);
479  
480 /**************************** VARIABLES ****************************/
481  
482 /* Modes as human readable strings */
483 extern const char * const iw_operation_mode[];
484 #define IW_NUM_OPER_MODE 7
485 #define IW_NUM_OPER_MODE_EXT 8
486  
487 /* Modulations as human readable strings */
488 extern const struct iw_modul_descr iw_modul_list[];
489 #define IW_SIZE_MODUL_LIST 16
490  
491 /************************* INLINE FUNTIONS *************************/
492 /*
493 * Functions that are so simple that it's more efficient inlining them
494 */
495  
496 /*
497 * Note : I've defined wrapper for the ioctl request so that
498 * it will be easier to migrate to other kernel API if needed
499 */
500  
501 /*------------------------------------------------------------------*/
502 /*
503 * Wrapper to push some Wireless Parameter in the driver
504 */
505 static inline int
506 iw_set_ext(int skfd, /* Socket to the kernel */
507 const char * ifname, /* Device name */
508 int request, /* WE ID */
509 struct iwreq * pwrq) /* Fixed part of the request */
510 {
511 /* Set device name */
512 strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
513 /* Do the request */
514 return(ioctl(skfd, request, pwrq));
515 }
516  
517 /*------------------------------------------------------------------*/
518 /*
519 * Wrapper to extract some Wireless Parameter out of the driver
520 */
521 static inline int
522 iw_get_ext(int skfd, /* Socket to the kernel */
523 const char * ifname, /* Device name */
524 int request, /* WE ID */
525 struct iwreq * pwrq) /* Fixed part of the request */
526 {
527 /* Set device name */
528 strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
529 /* Do the request */
530 return(ioctl(skfd, request, pwrq));
531 }
532  
533 /*------------------------------------------------------------------*/
534 /*
535 * Close the socket used for ioctl.
536 */
537 static inline void
538 iw_sockets_close(int skfd)
539 {
540 close(skfd);
541 }
542  
543 /*------------------------------------------------------------------*/
544 /*
545 * Display an Ethernet Socket Address in readable format.
546 */
547 static inline char *
548 iw_saether_ntop(const struct sockaddr *sap, char* bufp)
549 {
550 iw_ether_ntop((const struct ether_addr *) sap->sa_data, bufp);
551 return bufp;
552 }
553 /*------------------------------------------------------------------*/
554 /*
555 * Input an Ethernet Socket Address and convert to binary.
556 */
557 static inline int
558 iw_saether_aton(const char *bufp, struct sockaddr *sap)
559 {
560 sap->sa_family = ARPHRD_ETHER;
561 return iw_ether_aton(bufp, (struct ether_addr *) sap->sa_data);
562 }
563  
564 /*------------------------------------------------------------------*/
565 /*
566 * Create an Ethernet broadcast address
567 */
568 static inline void
569 iw_broad_ether(struct sockaddr *sap)
570 {
571 sap->sa_family = ARPHRD_ETHER;
572 memset((char *) sap->sa_data, 0xFF, ETH_ALEN);
573 }
574  
575 /*------------------------------------------------------------------*/
576 /*
577 * Create an Ethernet NULL address
578 */
579 static inline void
580 iw_null_ether(struct sockaddr *sap)
581 {
582 sap->sa_family = ARPHRD_ETHER;
583 memset((char *) sap->sa_data, 0x00, ETH_ALEN);
584 }
585  
586 /*------------------------------------------------------------------*/
587 /*
588 * Compare two ethernet addresses
589 */
590 static inline int
591 iw_ether_cmp(const struct ether_addr* eth1, const struct ether_addr* eth2)
592 {
593 return memcmp(eth1, eth2, sizeof(*eth1));
594 }
595  
596 #ifdef __cplusplus
597 }
598 #endif
599  
600 #endif /* IWLIB_H */