libiwinfo: fix several nl80211 issues, detect used WEP mode in madwifi
This commit is contained in:
parent
b095337a94
commit
e077f36436
3 changed files with 287 additions and 100 deletions
|
@ -39,6 +39,43 @@
|
|||
* TODO: need more info?
|
||||
*/
|
||||
|
||||
/**
|
||||
* DOC: Frame transmission/registration support
|
||||
*
|
||||
* Frame transmission and registration support exists to allow userspace
|
||||
* management entities such as wpa_supplicant react to management frames
|
||||
* that are not being handled by the kernel. This includes, for example,
|
||||
* certain classes of action frames that cannot be handled in the kernel
|
||||
* for various reasons.
|
||||
*
|
||||
* Frame registration is done on a per-interface basis and registrations
|
||||
* cannot be removed other than by closing the socket. It is possible to
|
||||
* specify a registration filter to register, for example, only for a
|
||||
* certain type of action frame. In particular with action frames, those
|
||||
* that userspace registers for will not be returned as unhandled by the
|
||||
* driver, so that the registered application has to take responsibility
|
||||
* for doing that.
|
||||
*
|
||||
* The type of frame that can be registered for is also dependent on the
|
||||
* driver and interface type. The frame types are advertised in wiphy
|
||||
* attributes so applications know what to expect.
|
||||
*
|
||||
* NOTE: When an interface changes type while registrations are active,
|
||||
* these registrations are ignored until the interface type is
|
||||
* changed again. This means that changing the interface type can
|
||||
* lead to a situation that couldn't otherwise be produced, but
|
||||
* any such registrations will be dormant in the sense that they
|
||||
* will not be serviced, i.e. they will not receive any frames.
|
||||
*
|
||||
* Frame transmission allows userspace to send for example the required
|
||||
* responses to action frames. It is subject to some sanity checking,
|
||||
* but many frames can be transmitted. When a frame was transmitted, its
|
||||
* status is indicated to the sending socket.
|
||||
*
|
||||
* For more technical details, see the corresponding command descriptions
|
||||
* below.
|
||||
*/
|
||||
|
||||
/**
|
||||
* enum nl80211_commands - supported nl80211 commands
|
||||
*
|
||||
|
@ -258,7 +295,9 @@
|
|||
* auth and assoc steps. For this, you need to specify the SSID in a
|
||||
* %NL80211_ATTR_SSID attribute, and can optionally specify the association
|
||||
* IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC,
|
||||
* %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_CONTROL_PORT.
|
||||
* %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT,
|
||||
* %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and
|
||||
* %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT.
|
||||
* It is also sent as an event, with the BSSID and response IEs when the
|
||||
* connection is established or failed to be established. This can be
|
||||
* determined by the STATUS_CODE attribute.
|
||||
|
@ -276,8 +315,8 @@
|
|||
* channel for the specified amount of time. This can be used to do
|
||||
* off-channel operations like transmit a Public Action frame and wait for
|
||||
* a response while being associated to an AP on another channel.
|
||||
* %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify which
|
||||
* radio is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the
|
||||
* %NL80211_ATTR_IFINDEX is used to specify which interface (and thus
|
||||
* radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the
|
||||
* frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be
|
||||
* optionally used to specify additional channel parameters.
|
||||
* %NL80211_ATTR_DURATION is used to specify the duration in milliseconds
|
||||
|
@ -301,16 +340,20 @@
|
|||
* rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface
|
||||
* and @NL80211_ATTR_TX_RATES the set of allowed rates.
|
||||
*
|
||||
* @NL80211_CMD_REGISTER_ACTION: Register for receiving certain action frames
|
||||
* (via @NL80211_CMD_ACTION) for processing in userspace. This command
|
||||
* requires an interface index and a match attribute containing the first
|
||||
* few bytes of the frame that should match, e.g. a single byte for only
|
||||
* a category match or four bytes for vendor frames including the OUI.
|
||||
* The registration cannot be dropped, but is removed automatically
|
||||
* when the netlink socket is closed. Multiple registrations can be made.
|
||||
* @NL80211_CMD_ACTION: Action frame TX request and RX notification. This
|
||||
* command is used both as a request to transmit an Action frame and as an
|
||||
* event indicating reception of an Action frame that was not processed in
|
||||
* @NL80211_CMD_REGISTER_FRAME: Register for receiving certain mgmt frames
|
||||
* (via @NL80211_CMD_FRAME) for processing in userspace. This command
|
||||
* requires an interface index, a frame type attribute (optional for
|
||||
* backward compatibility reasons, if not given assumes action frames)
|
||||
* and a match attribute containing the first few bytes of the frame
|
||||
* that should match, e.g. a single byte for only a category match or
|
||||
* four bytes for vendor frames including the OUI. The registration
|
||||
* cannot be dropped, but is removed automatically when the netlink
|
||||
* socket is closed. Multiple registrations can be made.
|
||||
* @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for
|
||||
* backward compatibility
|
||||
* @NL80211_CMD_FRAME: Management frame TX request and RX notification. This
|
||||
* command is used both as a request to transmit a management frame and
|
||||
* as an event indicating reception of a frame that was not processed in
|
||||
* kernel code, but is for us (i.e., which may need to be processed in a
|
||||
* user space application). %NL80211_ATTR_FRAME is used to specify the
|
||||
* frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and
|
||||
|
@ -320,11 +363,14 @@
|
|||
* operational channel). When called, this operation returns a cookie
|
||||
* (%NL80211_ATTR_COOKIE) that will be included with the TX status event
|
||||
* pertaining to the TX request.
|
||||
* @NL80211_CMD_ACTION_TX_STATUS: Report TX status of an Action frame
|
||||
* transmitted with %NL80211_CMD_ACTION. %NL80211_ATTR_COOKIE identifies
|
||||
* @NL80211_CMD_ACTION: Alias for @NL80211_CMD_FRAME for backward compatibility.
|
||||
* @NL80211_CMD_FRAME_TX_STATUS: Report TX status of a management frame
|
||||
* transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies
|
||||
* the TX command and %NL80211_ATTR_FRAME includes the contents of the
|
||||
* frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged
|
||||
* the frame.
|
||||
* @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for
|
||||
* backward compatibility.
|
||||
* @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command
|
||||
* is used to configure connection quality monitoring notification trigger
|
||||
* levels.
|
||||
|
@ -341,6 +387,8 @@
|
|||
* of any other interfaces, and other interfaces will again take
|
||||
* precedence when they are used.
|
||||
*
|
||||
* @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface.
|
||||
*
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
|
@ -429,9 +477,12 @@ enum nl80211_commands {
|
|||
|
||||
NL80211_CMD_SET_TX_BITRATE_MASK,
|
||||
|
||||
NL80211_CMD_REGISTER_ACTION,
|
||||
NL80211_CMD_ACTION,
|
||||
NL80211_CMD_ACTION_TX_STATUS,
|
||||
NL80211_CMD_REGISTER_FRAME,
|
||||
NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME,
|
||||
NL80211_CMD_FRAME,
|
||||
NL80211_CMD_ACTION = NL80211_CMD_FRAME,
|
||||
NL80211_CMD_FRAME_TX_STATUS,
|
||||
NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS,
|
||||
|
||||
NL80211_CMD_SET_POWER_SAVE,
|
||||
NL80211_CMD_GET_POWER_SAVE,
|
||||
|
@ -440,6 +491,7 @@ enum nl80211_commands {
|
|||
NL80211_CMD_NOTIFY_CQM,
|
||||
|
||||
NL80211_CMD_SET_CHANNEL,
|
||||
NL80211_CMD_SET_WDS_PEER,
|
||||
|
||||
/* add new commands above here */
|
||||
|
||||
|
@ -639,6 +691,15 @@ enum nl80211_commands {
|
|||
* request, the driver will assume that the port is unauthorized until
|
||||
* authorized by user space. Otherwise, port is marked authorized by
|
||||
* default in station mode.
|
||||
* @NL80211_ATTR_CONTROL_PORT_ETHERTYPE: A 16-bit value indicating the
|
||||
* ethertype that will be used for key negotiation. It can be
|
||||
* specified with the associate and connect commands. If it is not
|
||||
* specified, the value defaults to 0x888E (PAE, 802.1X). This
|
||||
* attribute is also used as a flag in the wiphy information to
|
||||
* indicate that protocols other than PAE are supported.
|
||||
* @NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT: When included along with
|
||||
* %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom
|
||||
* ethertype frames used for key negotiation must not be encrypted.
|
||||
*
|
||||
* @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver.
|
||||
* We recommend using nested, driver-specific attributes within this.
|
||||
|
@ -708,7 +769,16 @@ enum nl80211_commands {
|
|||
* is used with %NL80211_CMD_SET_TX_BITRATE_MASK.
|
||||
*
|
||||
* @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain
|
||||
* at least one byte, currently used with @NL80211_CMD_REGISTER_ACTION.
|
||||
* at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME.
|
||||
* @NL80211_ATTR_FRAME_TYPE: A u16 indicating the frame type/subtype for the
|
||||
* @NL80211_CMD_REGISTER_FRAME command.
|
||||
* @NL80211_ATTR_TX_FRAME_TYPES: wiphy capability attribute, which is a
|
||||
* nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing
|
||||
* information about which frame types can be transmitted with
|
||||
* %NL80211_CMD_FRAME.
|
||||
* @NL80211_ATTR_RX_FRAME_TYPES: wiphy capability attribute, which is a
|
||||
* nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing
|
||||
* information about which frame types can be registered for RX.
|
||||
*
|
||||
* @NL80211_ATTR_ACK: Flag attribute indicating that the frame was
|
||||
* acknowledged by the recipient.
|
||||
|
@ -725,6 +795,17 @@ enum nl80211_commands {
|
|||
* @NL80211_ATTR_AP_ISOLATE: (AP mode) Do not forward traffic between stations
|
||||
* connected to this BSS.
|
||||
*
|
||||
* @NL80211_ATTR_WIPHY_TX_POWER_SETTING: Transmit power setting type. See
|
||||
* &enum nl80211_tx_power_setting for possible values.
|
||||
* @NL80211_ATTR_WIPHY_TX_POWER_LEVEL: Transmit power level in signed mBm units.
|
||||
* This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING
|
||||
* for non-automatic settings.
|
||||
*
|
||||
* @NL80211_ATTR_SUPPORT_IBSS_RSN: The device supports IBSS RSN, which mostly
|
||||
* means support for per-station GTKs.
|
||||
*
|
||||
* @NL80211_ATTR_MCAST_RATE: Multicast tx rate (in 100 kbps) for IBSS
|
||||
*
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
|
@ -882,6 +963,20 @@ enum nl80211_attrs {
|
|||
|
||||
NL80211_ATTR_AP_ISOLATE,
|
||||
|
||||
NL80211_ATTR_WIPHY_TX_POWER_SETTING,
|
||||
NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
|
||||
|
||||
NL80211_ATTR_TX_FRAME_TYPES,
|
||||
NL80211_ATTR_RX_FRAME_TYPES,
|
||||
NL80211_ATTR_FRAME_TYPE,
|
||||
|
||||
NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
|
||||
NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,
|
||||
|
||||
NL80211_ATTR_SUPPORT_IBSS_RSN,
|
||||
|
||||
NL80211_ATTR_MCAST_RATE,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
|
@ -937,8 +1032,10 @@ enum nl80211_attrs {
|
|||
* @NL80211_IFTYPE_WDS: wireless distribution interface
|
||||
* @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames
|
||||
* @NL80211_IFTYPE_MESH_POINT: mesh point
|
||||
* @NL80211_IFTYPE_P2P_CLIENT: P2P client
|
||||
* @NL80211_IFTYPE_P2P_GO: P2P group owner
|
||||
* @NL80211_IFTYPE_MAX: highest interface type number currently defined
|
||||
* @__NL80211_IFTYPE_AFTER_LAST: internal use
|
||||
* @NUM_NL80211_IFTYPES: number of defined interface types
|
||||
*
|
||||
* These values are used with the %NL80211_ATTR_IFTYPE
|
||||
* to set the type of an interface.
|
||||
|
@ -953,10 +1050,12 @@ enum nl80211_iftype {
|
|||
NL80211_IFTYPE_WDS,
|
||||
NL80211_IFTYPE_MONITOR,
|
||||
NL80211_IFTYPE_MESH_POINT,
|
||||
NL80211_IFTYPE_P2P_CLIENT,
|
||||
NL80211_IFTYPE_P2P_GO,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_IFTYPE_AFTER_LAST,
|
||||
NL80211_IFTYPE_MAX = __NL80211_IFTYPE_AFTER_LAST - 1
|
||||
NUM_NL80211_IFTYPES,
|
||||
NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -965,11 +1064,14 @@ enum nl80211_iftype {
|
|||
* Station flags. When a station is added to an AP interface, it is
|
||||
* assumed to be already associated (and hence authenticated.)
|
||||
*
|
||||
* @__NL80211_STA_FLAG_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X)
|
||||
* @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames
|
||||
* with short barker preamble
|
||||
* @NL80211_STA_FLAG_WME: station is WME/QoS capable
|
||||
* @NL80211_STA_FLAG_MFP: station uses management frame protection
|
||||
* @NL80211_STA_FLAG_MAX: highest station flag number currently defined
|
||||
* @__NL80211_STA_FLAG_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_sta_flags {
|
||||
__NL80211_STA_FLAG_INVALID,
|
||||
|
@ -1039,6 +1141,8 @@ enum nl80211_rate_info {
|
|||
* @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station)
|
||||
* @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this
|
||||
* station)
|
||||
* @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station)
|
||||
* @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station)
|
||||
*/
|
||||
enum nl80211_sta_info {
|
||||
__NL80211_STA_INFO_INVALID,
|
||||
|
@ -1052,6 +1156,8 @@ enum nl80211_sta_info {
|
|||
NL80211_STA_INFO_TX_BITRATE,
|
||||
NL80211_STA_INFO_RX_PACKETS,
|
||||
NL80211_STA_INFO_TX_PACKETS,
|
||||
NL80211_STA_INFO_TX_RETRIES,
|
||||
NL80211_STA_INFO_TX_FAILED,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_STA_INFO_AFTER_LAST,
|
||||
|
@ -1082,14 +1188,17 @@ enum nl80211_mpath_flags {
|
|||
* information about a mesh path.
|
||||
*
|
||||
* @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination
|
||||
* @NL80211_ATTR_MPATH_SN: destination sequence number
|
||||
* @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path
|
||||
* @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now
|
||||
* @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in
|
||||
* @NL80211_MPATH_INFO_FRAME_QLEN: number of queued frames for this destination
|
||||
* @NL80211_MPATH_INFO_SN: destination sequence number
|
||||
* @NL80211_MPATH_INFO_METRIC: metric (cost) of this mesh path
|
||||
* @NL80211_MPATH_INFO_EXPTIME: expiration time for the path, in msec from now
|
||||
* @NL80211_MPATH_INFO_FLAGS: mesh path flags, enumerated in
|
||||
* &enum nl80211_mpath_flags;
|
||||
* @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
|
||||
* @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries
|
||||
* @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
|
||||
* @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries
|
||||
* @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number
|
||||
* currently defind
|
||||
* @__NL80211_MPATH_INFO_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_mpath_info {
|
||||
__NL80211_MPATH_INFO_INVALID,
|
||||
|
@ -1118,6 +1227,8 @@ enum nl80211_mpath_info {
|
|||
* @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE
|
||||
* @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n
|
||||
* @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n
|
||||
* @NL80211_BAND_ATTR_MAX: highest band attribute currently defined
|
||||
* @__NL80211_BAND_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_band_attr {
|
||||
__NL80211_BAND_ATTR_INVALID,
|
||||
|
@ -1138,6 +1249,7 @@ enum nl80211_band_attr {
|
|||
|
||||
/**
|
||||
* enum nl80211_frequency_attr - frequency attributes
|
||||
* @__NL80211_FREQUENCY_ATTR_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz
|
||||
* @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current
|
||||
* regulatory domain.
|
||||
|
@ -1149,6 +1261,9 @@ enum nl80211_band_attr {
|
|||
* on this channel in current regulatory domain.
|
||||
* @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm
|
||||
* (100 * dBm).
|
||||
* @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
|
||||
* currently defined
|
||||
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_frequency_attr {
|
||||
__NL80211_FREQUENCY_ATTR_INVALID,
|
||||
|
@ -1168,9 +1283,13 @@ enum nl80211_frequency_attr {
|
|||
|
||||
/**
|
||||
* enum nl80211_bitrate_attr - bitrate attributes
|
||||
* @__NL80211_BITRATE_ATTR_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps
|
||||
* @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported
|
||||
* in 2.4 GHz band.
|
||||
* @NL80211_BITRATE_ATTR_MAX: highest bitrate attribute number
|
||||
* currently defined
|
||||
* @__NL80211_BITRATE_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_bitrate_attr {
|
||||
__NL80211_BITRATE_ATTR_INVALID,
|
||||
|
@ -1226,6 +1345,7 @@ enum nl80211_reg_type {
|
|||
|
||||
/**
|
||||
* enum nl80211_reg_rule_attr - regulatory rule attributes
|
||||
* @__NL80211_REG_RULE_ATTR_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional
|
||||
* considerations for a given frequency range. These are the
|
||||
* &enum nl80211_reg_rule_flags.
|
||||
|
@ -1242,6 +1362,9 @@ enum nl80211_reg_type {
|
|||
* If you don't have one then don't send this.
|
||||
* @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for
|
||||
* a given frequency range. The value is in mBm (100 * dBm).
|
||||
* @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number
|
||||
* currently defined
|
||||
* @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_reg_rule_attr {
|
||||
__NL80211_REG_RULE_ATTR_INVALID,
|
||||
|
@ -1293,11 +1416,31 @@ enum nl80211_reg_rule_flags {
|
|||
* @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel
|
||||
* @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm)
|
||||
* @NL80211_SURVEY_INFO_IN_USE: channel is currently being used
|
||||
* @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio
|
||||
* spent on this channel
|
||||
* @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary
|
||||
* channel was sensed busy (either due to activity or energy detect)
|
||||
* @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension
|
||||
* channel was sensed busy
|
||||
* @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent
|
||||
* receiving data
|
||||
* @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent
|
||||
* transmitting data
|
||||
* @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
|
||||
* currently defined
|
||||
* @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_survey_info {
|
||||
__NL80211_SURVEY_INFO_INVALID,
|
||||
NL80211_SURVEY_INFO_FREQUENCY,
|
||||
NL80211_SURVEY_INFO_NOISE,
|
||||
NL80211_SURVEY_INFO_IN_USE,
|
||||
NL80211_SURVEY_INFO_CHANNEL_TIME,
|
||||
NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
|
||||
NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
|
||||
NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
|
||||
NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_SURVEY_INFO_AFTER_LAST,
|
||||
|
@ -1457,6 +1600,7 @@ enum nl80211_channel_type {
|
|||
* enum nl80211_bss - netlink attributes for a BSS
|
||||
*
|
||||
* @__NL80211_BSS_INVALID: invalid
|
||||
* @NL80211_BSS_BSSID: BSSID of the BSS (6 octets)
|
||||
* @NL80211_BSS_FREQUENCY: frequency in MHz (u32)
|
||||
* @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64)
|
||||
* @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16)
|
||||
|
@ -1500,6 +1644,12 @@ enum nl80211_bss {
|
|||
|
||||
/**
|
||||
* enum nl80211_bss_status - BSS "status"
|
||||
* @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS.
|
||||
* @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS.
|
||||
* @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS.
|
||||
*
|
||||
* The BSS status is a BSS attribute in scan dumps, which
|
||||
* indicates the status the interface has wrt. this BSS.
|
||||
*/
|
||||
enum nl80211_bss_status {
|
||||
NL80211_BSS_STATUS_AUTHENTICATED,
|
||||
|
@ -1537,11 +1687,14 @@ enum nl80211_auth_type {
|
|||
* @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key
|
||||
* @NL80211_KEYTYPE_PAIRWISE: Pairwise (unicast/individual) key
|
||||
* @NL80211_KEYTYPE_PEERKEY: PeerKey (DLS)
|
||||
* @NUM_NL80211_KEYTYPES: number of defined key types
|
||||
*/
|
||||
enum nl80211_key_type {
|
||||
NL80211_KEYTYPE_GROUP,
|
||||
NL80211_KEYTYPE_PAIRWISE,
|
||||
NL80211_KEYTYPE_PEERKEY,
|
||||
|
||||
NUM_NL80211_KEYTYPES
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1572,6 +1725,9 @@ enum nl80211_wpa_versions {
|
|||
* CCMP keys, each six bytes in little endian
|
||||
* @NL80211_KEY_DEFAULT: flag indicating default key
|
||||
* @NL80211_KEY_DEFAULT_MGMT: flag indicating default management key
|
||||
* @NL80211_KEY_TYPE: the key type from enum nl80211_key_type, if not
|
||||
* specified the default depends on whether a MAC address was
|
||||
* given with the command using the key or not (u32)
|
||||
* @__NL80211_KEY_AFTER_LAST: internal
|
||||
* @NL80211_KEY_MAX: highest key attribute
|
||||
*/
|
||||
|
@ -1583,6 +1739,7 @@ enum nl80211_key_attributes {
|
|||
NL80211_KEY_SEQ,
|
||||
NL80211_KEY_DEFAULT,
|
||||
NL80211_KEY_DEFAULT_MGMT,
|
||||
NL80211_KEY_TYPE,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_KEY_AFTER_LAST,
|
||||
|
@ -1610,8 +1767,8 @@ enum nl80211_tx_rate_attributes {
|
|||
|
||||
/**
|
||||
* enum nl80211_band - Frequency band
|
||||
* @NL80211_BAND_2GHZ - 2.4 GHz ISM band
|
||||
* @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz)
|
||||
* @NL80211_BAND_2GHZ: 2.4 GHz ISM band
|
||||
* @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
|
||||
*/
|
||||
enum nl80211_band {
|
||||
NL80211_BAND_2GHZ,
|
||||
|
@ -1649,9 +1806,9 @@ enum nl80211_attr_cqm {
|
|||
|
||||
/**
|
||||
* enum nl80211_cqm_rssi_threshold_event - RSSI threshold event
|
||||
* @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the
|
||||
* @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW: The RSSI level is lower than the
|
||||
* configured threshold
|
||||
* @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the
|
||||
* @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the
|
||||
* configured threshold
|
||||
*/
|
||||
enum nl80211_cqm_rssi_threshold_event {
|
||||
|
@ -1659,4 +1816,17 @@ enum nl80211_cqm_rssi_threshold_event {
|
|||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* enum nl80211_tx_power_setting - TX power adjustment
|
||||
* @NL80211_TX_POWER_AUTOMATIC: automatically determine transmit power
|
||||
* @NL80211_TX_POWER_LIMITED: limit TX power by the mBm parameter
|
||||
* @NL80211_TX_POWER_FIXED: fix TX power to the mBm parameter
|
||||
*/
|
||||
enum nl80211_tx_power_setting {
|
||||
NL80211_TX_POWER_AUTOMATIC,
|
||||
NL80211_TX_POWER_LIMITED,
|
||||
NL80211_TX_POWER_FIXED,
|
||||
};
|
||||
|
||||
#endif /* __LINUX_NL80211_H */
|
||||
|
|
|
@ -539,7 +539,7 @@ int madwifi_get_quality_max(const char *ifname, int *buf)
|
|||
|
||||
int madwifi_get_encryption(const char *ifname, char *buf)
|
||||
{
|
||||
int ciphers = 0, key_type = 0, key_len = 0;
|
||||
int ciphers = 0, key_len = 0;
|
||||
struct iwinfo_crypto_entry *c = (struct iwinfo_crypto_entry *)buf;
|
||||
struct iwreq wrq;
|
||||
struct ieee80211req_key wk;
|
||||
|
@ -548,16 +548,6 @@ int madwifi_get_encryption(const char *ifname, char *buf)
|
|||
memset(&wk, 0, sizeof(wk));
|
||||
memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);
|
||||
|
||||
/* Get key information */
|
||||
if( get80211priv(ifname, IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk)) >= 0 )
|
||||
{
|
||||
key_type = wk.ik_type;
|
||||
|
||||
/* Type 0 == WEP */
|
||||
if( key_type == 0 )
|
||||
c->auth_algs = (IWINFO_AUTH_OPEN | IWINFO_AUTH_SHARED);
|
||||
}
|
||||
|
||||
/* Get wpa protocol version */
|
||||
wrq.u.mode = IEEE80211_PARAM_WPA;
|
||||
if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
|
||||
|
@ -576,12 +566,28 @@ int madwifi_get_encryption(const char *ifname, char *buf)
|
|||
c->auth_suites |= IWINFO_KMGMT_PSK;
|
||||
break;
|
||||
|
||||
case IEEE80211_AUTH_OPEN:
|
||||
c->auth_algs |= IWINFO_AUTH_OPEN;
|
||||
break;
|
||||
|
||||
case IEEE80211_AUTH_SHARED:
|
||||
c->auth_algs |= IWINFO_AUTH_SHARED;
|
||||
break;
|
||||
|
||||
default:
|
||||
c->auth_suites |= IWINFO_KMGMT_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get key information */
|
||||
if( get80211priv(ifname, IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk)) >= 0 )
|
||||
{
|
||||
/* Type 0 == WEP */
|
||||
if( (wk.ik_type == 0) && (c->auth_algs == 0) )
|
||||
c->auth_algs = (IWINFO_AUTH_OPEN | IWINFO_AUTH_SHARED);
|
||||
}
|
||||
|
||||
/* Get group key length */
|
||||
wrq.u.mode = IEEE80211_PARAM_MCASTKEYLEN;
|
||||
if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
|
||||
|
|
|
@ -754,10 +754,11 @@ int nl80211_get_signal(const char *ifname, int *buf)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int nl80211_get_noise(const char *ifname, int *buf)
|
||||
static int nl80211_get_noise_cb(struct nl_msg *msg, void *arg)
|
||||
{
|
||||
int rv = -1;
|
||||
struct nl80211_msg_conveyor *req, *res;
|
||||
int8_t *noise = arg;
|
||||
struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
|
||||
struct nlattr *tb[NL80211_ATTR_MAX + 1];
|
||||
struct nlattr *si[NL80211_SURVEY_INFO_MAX + 1];
|
||||
|
||||
static struct nla_policy sp[NL80211_SURVEY_INFO_MAX + 1] = {
|
||||
|
@ -765,28 +766,48 @@ int nl80211_get_noise(const char *ifname, int *buf)
|
|||
[NL80211_SURVEY_INFO_NOISE] = { .type = NLA_U8 },
|
||||
};
|
||||
|
||||
nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
|
||||
genlmsg_attrlen(gnlh, 0), NULL);
|
||||
|
||||
if (!tb[NL80211_ATTR_SURVEY_INFO])
|
||||
return NL_SKIP;
|
||||
|
||||
if (nla_parse_nested(si, NL80211_SURVEY_INFO_MAX,
|
||||
tb[NL80211_ATTR_SURVEY_INFO], sp))
|
||||
return NL_SKIP;
|
||||
|
||||
if (!si[NL80211_SURVEY_INFO_NOISE])
|
||||
return NL_SKIP;
|
||||
|
||||
if (!*noise || si[NL80211_SURVEY_INFO_IN_USE])
|
||||
*noise = (int8_t)nla_get_u8(si[NL80211_SURVEY_INFO_NOISE]);
|
||||
|
||||
return NL_SKIP;
|
||||
}
|
||||
|
||||
|
||||
int nl80211_get_noise(const char *ifname, int *buf)
|
||||
{
|
||||
int8_t noise;
|
||||
struct nl80211_msg_conveyor *req;
|
||||
|
||||
req = nl80211_msg(ifname, NL80211_CMD_GET_SURVEY, NLM_F_DUMP);
|
||||
if( req )
|
||||
if (req)
|
||||
{
|
||||
res = nl80211_send(req);
|
||||
if( res )
|
||||
{
|
||||
if( res->attr[NL80211_ATTR_SURVEY_INFO] )
|
||||
{
|
||||
if( !nla_parse_nested(si, NL80211_SURVEY_INFO_MAX,
|
||||
res->attr[NL80211_ATTR_SURVEY_INFO], sp) &&
|
||||
si[NL80211_SURVEY_INFO_NOISE] )
|
||||
{
|
||||
*buf = (int8_t)nla_get_u8(si[NL80211_SURVEY_INFO_NOISE]);
|
||||
rv = 0;
|
||||
}
|
||||
}
|
||||
nl80211_free(res);
|
||||
}
|
||||
noise = 0;
|
||||
|
||||
nl80211_cb(req, nl80211_get_noise_cb, &noise);
|
||||
nl80211_send(req);
|
||||
nl80211_free(req);
|
||||
|
||||
if (noise)
|
||||
{
|
||||
*buf = noise;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int nl80211_get_quality(const char *ifname, int *buf)
|
||||
|
@ -844,10 +865,34 @@ int nl80211_get_encryption(const char *ifname, char *buf)
|
|||
/* Hostapd */
|
||||
if( (res = nl80211_hostapd_info(ifname)) )
|
||||
{
|
||||
if( (val = nl80211_getval(ifname, res, "auth_algs")) && (val > 0) )
|
||||
{
|
||||
if( (val = nl80211_getval(ifname, res, "wpa")) != NULL )
|
||||
c->wpa_version = atoi(val);
|
||||
|
||||
val = nl80211_getval(ifname, res, "wpa_key_mgmt");
|
||||
|
||||
if( !val || strstr(val, "PSK") )
|
||||
c->auth_suites |= IWINFO_KMGMT_PSK;
|
||||
|
||||
if( val && strstr(val, "EAP") )
|
||||
c->auth_suites |= IWINFO_KMGMT_8021x;
|
||||
|
||||
if( val && strstr(val, "NONE") )
|
||||
c->auth_suites |= IWINFO_KMGMT_NONE;
|
||||
|
||||
if( (val = nl80211_getval(ifname, res, "wpa_pairwise")) != NULL )
|
||||
{
|
||||
if( strstr(val, "TKIP") )
|
||||
c->pair_ciphers |= IWINFO_CIPHER_TKIP;
|
||||
|
||||
if( strstr(val, "CCMP") )
|
||||
c->pair_ciphers |= IWINFO_CIPHER_CCMP;
|
||||
|
||||
if( strstr(val, "NONE") )
|
||||
c->pair_ciphers |= IWINFO_CIPHER_NONE;
|
||||
}
|
||||
|
||||
if( (val = nl80211_getval(ifname, res, "auth_algs")) != NULL )
|
||||
{
|
||||
switch(atoi(val)) {
|
||||
case 1:
|
||||
c->auth_algs |= IWINFO_AUTH_OPEN;
|
||||
|
@ -879,42 +924,8 @@ int nl80211_get_encryption(const char *ifname, char *buf)
|
|||
c->pair_ciphers |= IWINFO_CIPHER_WEP104;
|
||||
}
|
||||
}
|
||||
|
||||
c->group_ciphers = c->pair_ciphers;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if( (val = nl80211_getval(ifname, res, "wpa")) != NULL )
|
||||
c->wpa_version = atoi(val);
|
||||
|
||||
|
||||
val = nl80211_getval(ifname, res, "wpa_key_mgmt");
|
||||
|
||||
if( !val || strstr(val, "PSK") )
|
||||
c->auth_suites |= IWINFO_KMGMT_PSK;
|
||||
|
||||
if( val && strstr(val, "EAP") )
|
||||
c->auth_suites |= IWINFO_KMGMT_8021x;
|
||||
|
||||
if( val && strstr(val, "NONE") )
|
||||
c->auth_suites |= IWINFO_KMGMT_NONE;
|
||||
|
||||
|
||||
if( (val = nl80211_getval(ifname, res, "wpa_pairwise")) != NULL )
|
||||
{
|
||||
if( strstr(val, "TKIP") )
|
||||
c->pair_ciphers |= IWINFO_CIPHER_TKIP;
|
||||
|
||||
if( strstr(val, "CCMP") )
|
||||
c->pair_ciphers |= IWINFO_CIPHER_CCMP;
|
||||
|
||||
if( strstr(val, "NONE") )
|
||||
c->pair_ciphers |= IWINFO_CIPHER_NONE;
|
||||
}
|
||||
|
||||
|
||||
c->group_ciphers = c->pair_ciphers;
|
||||
c->enabled = (c->auth_algs || c->auth_suites) ? 1 : 0;
|
||||
|
||||
|
|
Loading…
Reference in a new issue