8ae758db52
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
382 lines
11 KiB
C
382 lines
11 KiB
C
/*
|
|
* iwinfo - Wireless Information Library - Linux Wireless Extension Headers
|
|
*
|
|
* Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
|
|
*
|
|
* The iwinfo library is free software: you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version 2
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* The iwinfo library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with the iwinfo library. If not, see http://www.gnu.org/licenses/.
|
|
*/
|
|
|
|
#ifndef __IWINFO_WEXT_SCAN_H_
|
|
#define __IWINFO_WEXT_SCAN_H_
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include "iwinfo.h"
|
|
#include "iwinfo/utils.h"
|
|
#include "api/wext.h"
|
|
|
|
|
|
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;
|
|
|
|
/*
|
|
* Describe how a standard IOCTL looks like.
|
|
*/
|
|
struct iw_ioctl_description
|
|
{
|
|
uint8_t header_type; /* NULL, iw_point or other */
|
|
uint8_t token_type; /* Future */
|
|
uint16_t token_size; /* Granularity of payload */
|
|
uint16_t min_tokens; /* Min acceptable token number */
|
|
uint16_t max_tokens; /* Max acceptable token number */
|
|
uint32_t flags; /* Special handling of the request */
|
|
};
|
|
|
|
/* Type of headers we know about (basically union iwreq_data) */
|
|
#define IW_HEADER_TYPE_NULL 0 /* Not available */
|
|
#define IW_HEADER_TYPE_CHAR 2 /* char [IFNAMSIZ] */
|
|
#define IW_HEADER_TYPE_UINT 4 /* __u32 */
|
|
#define IW_HEADER_TYPE_FREQ 5 /* struct iw_freq */
|
|
#define IW_HEADER_TYPE_ADDR 6 /* struct sockaddr */
|
|
#define IW_HEADER_TYPE_POINT 8 /* struct iw_point */
|
|
#define IW_HEADER_TYPE_PARAM 9 /* struct iw_param */
|
|
#define IW_HEADER_TYPE_QUAL 10 /* struct iw_quality */
|
|
|
|
/* Handling flags */
|
|
/* Most are not implemented. I just use them as a reminder of some
|
|
* cool features we might need one day ;-) */
|
|
#define IW_DESCR_FLAG_NONE 0x0000 /* Obvious */
|
|
/* Wrapper level flags */
|
|
#define IW_DESCR_FLAG_DUMP 0x0001 /* Not part of the dump command */
|
|
#define IW_DESCR_FLAG_EVENT 0x0002 /* Generate an event on SET */
|
|
#define IW_DESCR_FLAG_RESTRICT 0x0004 /* GET : request is ROOT only */
|
|
/* SET : Omit payload from generated iwevent */
|
|
#define IW_DESCR_FLAG_NOMAX 0x0008 /* GET : no limit on request size */
|
|
/* Driver level flags */
|
|
#define IW_DESCR_FLAG_WAIT 0x0100 /* Wait for driver event */
|
|
|
|
|
|
/*
|
|
* Meta-data about all the standard Wireless Extension request we
|
|
* know about.
|
|
*/
|
|
static const struct iw_ioctl_description standard_ioctl_descr[] = {
|
|
[SIOCSIWCOMMIT - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_NULL,
|
|
},
|
|
[SIOCGIWNAME - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_CHAR,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWNWID - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
.flags = IW_DESCR_FLAG_EVENT,
|
|
},
|
|
[SIOCGIWNWID - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWFREQ - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_FREQ,
|
|
.flags = IW_DESCR_FLAG_EVENT,
|
|
},
|
|
[SIOCGIWFREQ - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_FREQ,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWMODE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_UINT,
|
|
.flags = IW_DESCR_FLAG_EVENT,
|
|
},
|
|
[SIOCGIWMODE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_UINT,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWSENS - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWSENS - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWRANGE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_NULL,
|
|
},
|
|
[SIOCGIWRANGE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = sizeof(struct iw_range),
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWPRIV - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_NULL,
|
|
},
|
|
[SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */
|
|
.header_type = IW_HEADER_TYPE_NULL,
|
|
},
|
|
[SIOCSIWSTATS - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_NULL,
|
|
},
|
|
[SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */
|
|
.header_type = IW_HEADER_TYPE_NULL,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWSPY - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = sizeof(struct sockaddr),
|
|
.max_tokens = IW_MAX_SPY,
|
|
},
|
|
[SIOCGIWSPY - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = sizeof(struct sockaddr) +
|
|
sizeof(struct iw_quality),
|
|
.max_tokens = IW_MAX_SPY,
|
|
},
|
|
[SIOCSIWTHRSPY - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = sizeof(struct iw_thrspy),
|
|
.min_tokens = 1,
|
|
.max_tokens = 1,
|
|
},
|
|
[SIOCGIWTHRSPY - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = sizeof(struct iw_thrspy),
|
|
.min_tokens = 1,
|
|
.max_tokens = 1,
|
|
},
|
|
[SIOCSIWAP - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_ADDR,
|
|
},
|
|
[SIOCGIWAP - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_ADDR,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWMLME - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.min_tokens = sizeof(struct iw_mlme),
|
|
.max_tokens = sizeof(struct iw_mlme),
|
|
},
|
|
[SIOCGIWAPLIST - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = sizeof(struct sockaddr) +
|
|
sizeof(struct iw_quality),
|
|
.max_tokens = IW_MAX_AP,
|
|
.flags = IW_DESCR_FLAG_NOMAX,
|
|
},
|
|
[SIOCSIWSCAN - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.min_tokens = 0,
|
|
.max_tokens = sizeof(struct iw_scan_req),
|
|
},
|
|
[SIOCGIWSCAN - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_SCAN_MAX_DATA,
|
|
.flags = IW_DESCR_FLAG_NOMAX,
|
|
},
|
|
[SIOCSIWESSID - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
|
.flags = IW_DESCR_FLAG_EVENT,
|
|
},
|
|
[SIOCGIWESSID - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
|
.flags = IW_DESCR_FLAG_DUMP,
|
|
},
|
|
[SIOCSIWNICKN - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
|
},
|
|
[SIOCGIWNICKN - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
|
},
|
|
[SIOCSIWRATE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWRATE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWRTS - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWRTS - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWFRAG - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWFRAG - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWTXPOW - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWTXPOW - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWRETRY - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWRETRY - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWENCODE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_ENCODING_TOKEN_MAX,
|
|
.flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT,
|
|
},
|
|
[SIOCGIWENCODE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_ENCODING_TOKEN_MAX,
|
|
.flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT,
|
|
},
|
|
[SIOCSIWPOWER - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWPOWER - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWMODUL - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWMODUL - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWGENIE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_GENERIC_IE_MAX,
|
|
},
|
|
[SIOCGIWGENIE - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_GENERIC_IE_MAX,
|
|
},
|
|
[SIOCSIWAUTH - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCGIWAUTH - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_PARAM,
|
|
},
|
|
[SIOCSIWENCODEEXT - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.min_tokens = sizeof(struct iw_encode_ext),
|
|
.max_tokens = sizeof(struct iw_encode_ext) +
|
|
IW_ENCODING_TOKEN_MAX,
|
|
},
|
|
[SIOCGIWENCODEEXT - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.min_tokens = sizeof(struct iw_encode_ext),
|
|
.max_tokens = sizeof(struct iw_encode_ext) +
|
|
IW_ENCODING_TOKEN_MAX,
|
|
},
|
|
[SIOCSIWPMKSA - SIOCIWFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.min_tokens = sizeof(struct iw_pmksa),
|
|
.max_tokens = sizeof(struct iw_pmksa),
|
|
},
|
|
};
|
|
|
|
/*
|
|
* Meta-data about all the additional standard Wireless Extension events
|
|
* we know about.
|
|
*/
|
|
static const struct iw_ioctl_description standard_event_descr[] = {
|
|
[IWEVTXDROP - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_ADDR,
|
|
},
|
|
[IWEVQUAL - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_QUAL,
|
|
},
|
|
[IWEVCUSTOM - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_CUSTOM_MAX,
|
|
},
|
|
[IWEVREGISTERED - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_ADDR,
|
|
},
|
|
[IWEVEXPIRED - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_ADDR,
|
|
},
|
|
[IWEVGENIE - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_GENERIC_IE_MAX,
|
|
},
|
|
[IWEVMICHAELMICFAILURE - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = sizeof(struct iw_michaelmicfailure),
|
|
},
|
|
[IWEVASSOCREQIE - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_GENERIC_IE_MAX,
|
|
},
|
|
[IWEVASSOCRESPIE - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = IW_GENERIC_IE_MAX,
|
|
},
|
|
[IWEVPMKIDCAND - IWEVFIRST] = {
|
|
.header_type = IW_HEADER_TYPE_POINT,
|
|
.token_size = 1,
|
|
.max_tokens = sizeof(struct iw_pmkid_cand),
|
|
},
|
|
};
|
|
|
|
/* Size (in bytes) of various events */
|
|
static const int event_type_size[] = {
|
|
IW_EV_LCP_PK_LEN, /* IW_HEADER_TYPE_NULL */
|
|
0,
|
|
IW_EV_CHAR_PK_LEN, /* IW_HEADER_TYPE_CHAR */
|
|
0,
|
|
IW_EV_UINT_PK_LEN, /* IW_HEADER_TYPE_UINT */
|
|
IW_EV_FREQ_PK_LEN, /* IW_HEADER_TYPE_FREQ */
|
|
IW_EV_ADDR_PK_LEN, /* IW_HEADER_TYPE_ADDR */
|
|
0,
|
|
IW_EV_POINT_PK_LEN, /* Without variable payload */
|
|
IW_EV_PARAM_PK_LEN, /* IW_HEADER_TYPE_PARAM */
|
|
IW_EV_QUAL_PK_LEN, /* IW_HEADER_TYPE_QUAL */
|
|
};
|
|
|
|
|
|
static const unsigned int standard_ioctl_num =
|
|
(sizeof(standard_ioctl_descr) / sizeof(struct iw_ioctl_description));
|
|
|
|
static const unsigned int standard_event_num =
|
|
(sizeof(standard_event_descr) / sizeof(struct iw_ioctl_description));
|
|
|
|
#define IW_IE_CYPHER_NUM 8
|
|
#define IW_IE_KEY_MGMT_NUM 3
|
|
|
|
int wext_get_scanlist(const char *ifname, char *buf, int *len);
|
|
|
|
#endif
|