From 190350d73236c5f2ab2885f63b61a43e8890f02c Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Wed, 5 Apr 2017 01:51:19 +0200 Subject: Initial support for Linux 802.11 Netlink (nl80211) dissection Only commands and top-level attributes are recognized, no specialization is done (yet?) since it is a large protocol. Fields are extracted from Linux v4.10-rc4-749-g8585989d146c using the "tools/generate-nl80211-fields.py --update" command. Depends on the Generic Netlink (genl) dissector. Change-Id: I7f81b91e3beacca8ebcb853137212406004f65e8 Ping-Bug: 13561 Reviewed-on: https://code.wireshark.org/review/20914 Petri-Dish: Peter Wu Reviewed-by: Peter Wu Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann --- docbook/release-notes.asciidoc | 1 + epan/dissectors/CMakeLists.txt | 1 + epan/dissectors/Makefile.am | 1 + epan/dissectors/packet-netlink-nl80211.c | 925 +++++++++++++++++++++++++++++++ epan/dissectors/packet-netlink.c | 8 +- tools/generate-nl80211-fields.py | 204 +++++++ 6 files changed, 1139 insertions(+), 1 deletion(-) create mode 100644 epan/dissectors/packet-netlink-nl80211.c create mode 100755 tools/generate-nl80211-fields.py diff --git a/docbook/release-notes.asciidoc b/docbook/release-notes.asciidoc index d0617fc73d..a76cb578d3 100644 --- a/docbook/release-notes.asciidoc +++ b/docbook/release-notes.asciidoc @@ -68,6 +68,7 @@ Health Level 7 (HL7) High-speed SECS message service (HSMS) iPerf2 ISO 15765 +Linux 802.11 Netlink (nl80211) Local Service Discovery (LSD) M2 Application Protocol Mesh Link Establishment (MLE) diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt index d8f0b1f5c2..ccbe2d3ba9 100644 --- a/epan/dissectors/CMakeLists.txt +++ b/epan/dissectors/CMakeLists.txt @@ -963,6 +963,7 @@ set(DISSECTOR_SRC packet-netflow.c packet-netlink-generic.c packet-netlink-netfilter.c + packet-netlink-nl80211.c packet-netlink-route.c packet-netlink-sock_diag.c packet-netlink.c diff --git a/epan/dissectors/Makefile.am b/epan/dissectors/Makefile.am index 5c9407f553..4e34fa0bef 100644 --- a/epan/dissectors/Makefile.am +++ b/epan/dissectors/Makefile.am @@ -985,6 +985,7 @@ DISSECTOR_SRC = \ packet-netflow.c \ packet-netlink-generic.c \ packet-netlink-netfilter.c \ + packet-netlink-nl80211.c \ packet-netlink-route.c \ packet-netlink-sock_diag.c \ packet-netlink.c \ diff --git a/epan/dissectors/packet-netlink-nl80211.c b/epan/dissectors/packet-netlink-nl80211.c new file mode 100644 index 0000000000..ccf0ac651d --- /dev/null +++ b/epan/dissectors/packet-netlink-nl80211.c @@ -0,0 +1,925 @@ +/* packet-netlink-nl80211.c + * Dissector for nl80211 (over Netlink). + * + * Copyright (c) 2017, Peter Wu + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define NEW_PROTO_TREE_API + +#include "config.h" + +#include +#include "packet-netlink.h" + +/* Extracted using tools/make-nl80211-fields.py */ +/* Definitions from linux/nl80211.h {{{ */ +enum ws_nl80211_commands { + WS_NL80211_CMD_UNSPEC, + WS_NL80211_CMD_GET_WIPHY, + WS_NL80211_CMD_SET_WIPHY, + WS_NL80211_CMD_NEW_WIPHY, + WS_NL80211_CMD_DEL_WIPHY, + WS_NL80211_CMD_GET_INTERFACE, + WS_NL80211_CMD_SET_INTERFACE, + WS_NL80211_CMD_NEW_INTERFACE, + WS_NL80211_CMD_DEL_INTERFACE, + WS_NL80211_CMD_GET_KEY, + WS_NL80211_CMD_SET_KEY, + WS_NL80211_CMD_NEW_KEY, + WS_NL80211_CMD_DEL_KEY, + WS_NL80211_CMD_GET_BEACON, + WS_NL80211_CMD_SET_BEACON, + WS_NL80211_CMD_START_AP, + WS_NL80211_CMD_STOP_AP, + WS_NL80211_CMD_GET_STATION, + WS_NL80211_CMD_SET_STATION, + WS_NL80211_CMD_NEW_STATION, + WS_NL80211_CMD_DEL_STATION, + WS_NL80211_CMD_GET_MPATH, + WS_NL80211_CMD_SET_MPATH, + WS_NL80211_CMD_NEW_MPATH, + WS_NL80211_CMD_DEL_MPATH, + WS_NL80211_CMD_SET_BSS, + WS_NL80211_CMD_SET_REG, + WS_NL80211_CMD_REQ_SET_REG, + WS_NL80211_CMD_GET_MESH_CONFIG, + WS_NL80211_CMD_SET_MESH_CONFIG, + WS_NL80211_CMD_SET_MGMT_EXTRA_IE, + WS_NL80211_CMD_GET_REG, + WS_NL80211_CMD_GET_SCAN, + WS_NL80211_CMD_TRIGGER_SCAN, + WS_NL80211_CMD_NEW_SCAN_RESULTS, + WS_NL80211_CMD_SCAN_ABORTED, + WS_NL80211_CMD_REG_CHANGE, + WS_NL80211_CMD_AUTHENTICATE, + WS_NL80211_CMD_ASSOCIATE, + WS_NL80211_CMD_DEAUTHENTICATE, + WS_NL80211_CMD_DISASSOCIATE, + WS_NL80211_CMD_MICHAEL_MIC_FAILURE, + WS_NL80211_CMD_REG_BEACON_HINT, + WS_NL80211_CMD_JOIN_IBSS, + WS_NL80211_CMD_LEAVE_IBSS, + WS_NL80211_CMD_TESTMODE, + WS_NL80211_CMD_CONNECT, + WS_NL80211_CMD_ROAM, + WS_NL80211_CMD_DISCONNECT, + WS_NL80211_CMD_SET_WIPHY_NETNS, + WS_NL80211_CMD_GET_SURVEY, + WS_NL80211_CMD_NEW_SURVEY_RESULTS, + WS_NL80211_CMD_SET_PMKSA, + WS_NL80211_CMD_DEL_PMKSA, + WS_NL80211_CMD_FLUSH_PMKSA, + WS_NL80211_CMD_REMAIN_ON_CHANNEL, + WS_NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, + WS_NL80211_CMD_SET_TX_BITRATE_MASK, + WS_NL80211_CMD_REGISTER_FRAME, + WS_NL80211_CMD_FRAME, + WS_NL80211_CMD_FRAME_TX_STATUS, + WS_NL80211_CMD_SET_POWER_SAVE, + WS_NL80211_CMD_GET_POWER_SAVE, + WS_NL80211_CMD_SET_CQM, + WS_NL80211_CMD_NOTIFY_CQM, + WS_NL80211_CMD_SET_CHANNEL, + WS_NL80211_CMD_SET_WDS_PEER, + WS_NL80211_CMD_FRAME_WAIT_CANCEL, + WS_NL80211_CMD_JOIN_MESH, + WS_NL80211_CMD_LEAVE_MESH, + WS_NL80211_CMD_UNPROT_DEAUTHENTICATE, + WS_NL80211_CMD_UNPROT_DISASSOCIATE, + WS_NL80211_CMD_NEW_PEER_CANDIDATE, + WS_NL80211_CMD_GET_WOWLAN, + WS_NL80211_CMD_SET_WOWLAN, + WS_NL80211_CMD_START_SCHED_SCAN, + WS_NL80211_CMD_STOP_SCHED_SCAN, + WS_NL80211_CMD_SCHED_SCAN_RESULTS, + WS_NL80211_CMD_SCHED_SCAN_STOPPED, + WS_NL80211_CMD_SET_REKEY_OFFLOAD, + WS_NL80211_CMD_PMKSA_CANDIDATE, + WS_NL80211_CMD_TDLS_OPER, + WS_NL80211_CMD_TDLS_MGMT, + WS_NL80211_CMD_UNEXPECTED_FRAME, + WS_NL80211_CMD_PROBE_CLIENT, + WS_NL80211_CMD_REGISTER_BEACONS, + WS_NL80211_CMD_UNEXPECTED_4ADDR_FRAME, + WS_NL80211_CMD_SET_NOACK_MAP, + WS_NL80211_CMD_CH_SWITCH_NOTIFY, + WS_NL80211_CMD_START_P2P_DEVICE, + WS_NL80211_CMD_STOP_P2P_DEVICE, + WS_NL80211_CMD_CONN_FAILED, + WS_NL80211_CMD_SET_MCAST_RATE, + WS_NL80211_CMD_SET_MAC_ACL, + WS_NL80211_CMD_RADAR_DETECT, + WS_NL80211_CMD_GET_PROTOCOL_FEATURES, + WS_NL80211_CMD_UPDATE_FT_IES, + WS_NL80211_CMD_FT_EVENT, + WS_NL80211_CMD_CRIT_PROTOCOL_START, + WS_NL80211_CMD_CRIT_PROTOCOL_STOP, + WS_NL80211_CMD_GET_COALESCE, + WS_NL80211_CMD_SET_COALESCE, + WS_NL80211_CMD_CHANNEL_SWITCH, + WS_NL80211_CMD_VENDOR, + WS_NL80211_CMD_SET_QOS_MAP, + WS_NL80211_CMD_ADD_TX_TS, + WS_NL80211_CMD_DEL_TX_TS, + WS_NL80211_CMD_GET_MPP, + WS_NL80211_CMD_JOIN_OCB, + WS_NL80211_CMD_LEAVE_OCB, + WS_NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, + WS_NL80211_CMD_TDLS_CHANNEL_SWITCH, + WS_NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, + WS_NL80211_CMD_WIPHY_REG_CHANGE, + WS_NL80211_CMD_ABORT_SCAN, + WS_NL80211_CMD_START_NAN, + WS_NL80211_CMD_STOP_NAN, + WS_NL80211_CMD_ADD_NAN_FUNCTION, + WS_NL80211_CMD_DEL_NAN_FUNCTION, + WS_NL80211_CMD_CHANGE_NAN_CONFIG, + WS_NL80211_CMD_NAN_MATCH, + WS_NL80211_CMD_SET_MULTICAST_TO_UNICAST, + WS_NL80211_CMD_UPDATE_CONNECT_PARAMS, +}; + +enum ws_nl80211_attrs { + WS_NL80211_ATTR_UNSPEC, + WS_NL80211_ATTR_WIPHY, + WS_NL80211_ATTR_WIPHY_NAME, + WS_NL80211_ATTR_IFINDEX, + WS_NL80211_ATTR_IFNAME, + WS_NL80211_ATTR_IFTYPE, + WS_NL80211_ATTR_MAC, + WS_NL80211_ATTR_KEY_DATA, + WS_NL80211_ATTR_KEY_IDX, + WS_NL80211_ATTR_KEY_CIPHER, + WS_NL80211_ATTR_KEY_SEQ, + WS_NL80211_ATTR_KEY_DEFAULT, + WS_NL80211_ATTR_BEACON_INTERVAL, + WS_NL80211_ATTR_DTIM_PERIOD, + WS_NL80211_ATTR_BEACON_HEAD, + WS_NL80211_ATTR_BEACON_TAIL, + WS_NL80211_ATTR_STA_AID, + WS_NL80211_ATTR_STA_FLAGS, + WS_NL80211_ATTR_STA_LISTEN_INTERVAL, + WS_NL80211_ATTR_STA_SUPPORTED_RATES, + WS_NL80211_ATTR_STA_VLAN, + WS_NL80211_ATTR_STA_INFO, + WS_NL80211_ATTR_WIPHY_BANDS, + WS_NL80211_ATTR_MNTR_FLAGS, + WS_NL80211_ATTR_MESH_ID, + WS_NL80211_ATTR_STA_PLINK_ACTION, + WS_NL80211_ATTR_MPATH_NEXT_HOP, + WS_NL80211_ATTR_MPATH_INFO, + WS_NL80211_ATTR_BSS_CTS_PROT, + WS_NL80211_ATTR_BSS_SHORT_PREAMBLE, + WS_NL80211_ATTR_BSS_SHORT_SLOT_TIME, + WS_NL80211_ATTR_HT_CAPABILITY, + WS_NL80211_ATTR_SUPPORTED_IFTYPES, + WS_NL80211_ATTR_REG_ALPHA2, + WS_NL80211_ATTR_REG_RULES, + WS_NL80211_ATTR_MESH_CONFIG, + WS_NL80211_ATTR_BSS_BASIC_RATES, + WS_NL80211_ATTR_WIPHY_TXQ_PARAMS, + WS_NL80211_ATTR_WIPHY_FREQ, + WS_NL80211_ATTR_WIPHY_CHANNEL_TYPE, + WS_NL80211_ATTR_KEY_DEFAULT_MGMT, + WS_NL80211_ATTR_MGMT_SUBTYPE, + WS_NL80211_ATTR_IE, + WS_NL80211_ATTR_MAX_NUM_SCAN_SSIDS, + WS_NL80211_ATTR_SCAN_FREQUENCIES, + WS_NL80211_ATTR_SCAN_SSIDS, + WS_NL80211_ATTR_GENERATION, + WS_NL80211_ATTR_BSS, + WS_NL80211_ATTR_REG_INITIATOR, + WS_NL80211_ATTR_REG_TYPE, + WS_NL80211_ATTR_SUPPORTED_COMMANDS, + WS_NL80211_ATTR_FRAME, + WS_NL80211_ATTR_SSID, + WS_NL80211_ATTR_AUTH_TYPE, + WS_NL80211_ATTR_REASON_CODE, + WS_NL80211_ATTR_KEY_TYPE, + WS_NL80211_ATTR_MAX_SCAN_IE_LEN, + WS_NL80211_ATTR_CIPHER_SUITES, + WS_NL80211_ATTR_FREQ_BEFORE, + WS_NL80211_ATTR_FREQ_AFTER, + WS_NL80211_ATTR_FREQ_FIXED, + WS_NL80211_ATTR_WIPHY_RETRY_SHORT, + WS_NL80211_ATTR_WIPHY_RETRY_LONG, + WS_NL80211_ATTR_WIPHY_FRAG_THRESHOLD, + WS_NL80211_ATTR_WIPHY_RTS_THRESHOLD, + WS_NL80211_ATTR_TIMED_OUT, + WS_NL80211_ATTR_USE_MFP, + WS_NL80211_ATTR_STA_FLAGS2, + WS_NL80211_ATTR_CONTROL_PORT, + WS_NL80211_ATTR_TESTDATA, + WS_NL80211_ATTR_PRIVACY, + WS_NL80211_ATTR_DISCONNECTED_BY_AP, + WS_NL80211_ATTR_STATUS_CODE, + WS_NL80211_ATTR_CIPHER_SUITES_PAIRWISE, + WS_NL80211_ATTR_CIPHER_SUITE_GROUP, + WS_NL80211_ATTR_WPA_VERSIONS, + WS_NL80211_ATTR_AKM_SUITES, + WS_NL80211_ATTR_REQ_IE, + WS_NL80211_ATTR_RESP_IE, + WS_NL80211_ATTR_PREV_BSSID, + WS_NL80211_ATTR_KEY, + WS_NL80211_ATTR_KEYS, + WS_NL80211_ATTR_PID, + WS_NL80211_ATTR_4ADDR, + WS_NL80211_ATTR_SURVEY_INFO, + WS_NL80211_ATTR_PMKID, + WS_NL80211_ATTR_MAX_NUM_PMKIDS, + WS_NL80211_ATTR_DURATION, + WS_NL80211_ATTR_COOKIE, + WS_NL80211_ATTR_WIPHY_COVERAGE_CLASS, + WS_NL80211_ATTR_TX_RATES, + WS_NL80211_ATTR_FRAME_MATCH, + WS_NL80211_ATTR_ACK, + WS_NL80211_ATTR_PS_STATE, + WS_NL80211_ATTR_CQM, + WS_NL80211_ATTR_LOCAL_STATE_CHANGE, + WS_NL80211_ATTR_AP_ISOLATE, + WS_NL80211_ATTR_WIPHY_TX_POWER_SETTING, + WS_NL80211_ATTR_WIPHY_TX_POWER_LEVEL, + WS_NL80211_ATTR_TX_FRAME_TYPES, + WS_NL80211_ATTR_RX_FRAME_TYPES, + WS_NL80211_ATTR_FRAME_TYPE, + WS_NL80211_ATTR_CONTROL_PORT_ETHERTYPE, + WS_NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT, + WS_NL80211_ATTR_SUPPORT_IBSS_RSN, + WS_NL80211_ATTR_WIPHY_ANTENNA_TX, + WS_NL80211_ATTR_WIPHY_ANTENNA_RX, + WS_NL80211_ATTR_MCAST_RATE, + WS_NL80211_ATTR_OFFCHANNEL_TX_OK, + WS_NL80211_ATTR_BSS_HT_OPMODE, + WS_NL80211_ATTR_KEY_DEFAULT_TYPES, + WS_NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, + WS_NL80211_ATTR_MESH_SETUP, + WS_NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, + WS_NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, + WS_NL80211_ATTR_SUPPORT_MESH_AUTH, + WS_NL80211_ATTR_STA_PLINK_STATE, + WS_NL80211_ATTR_WOWLAN_TRIGGERS, + WS_NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED, + WS_NL80211_ATTR_SCHED_SCAN_INTERVAL, + WS_NL80211_ATTR_INTERFACE_COMBINATIONS, + WS_NL80211_ATTR_SOFTWARE_IFTYPES, + WS_NL80211_ATTR_REKEY_DATA, + WS_NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, + WS_NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, + WS_NL80211_ATTR_SCAN_SUPP_RATES, + WS_NL80211_ATTR_HIDDEN_SSID, + WS_NL80211_ATTR_IE_PROBE_RESP, + WS_NL80211_ATTR_IE_ASSOC_RESP, + WS_NL80211_ATTR_STA_WME, + WS_NL80211_ATTR_SUPPORT_AP_UAPSD, + WS_NL80211_ATTR_ROAM_SUPPORT, + WS_NL80211_ATTR_SCHED_SCAN_MATCH, + WS_NL80211_ATTR_MAX_MATCH_SETS, + WS_NL80211_ATTR_PMKSA_CANDIDATE, + WS_NL80211_ATTR_TX_NO_CCK_RATE, + WS_NL80211_ATTR_TDLS_ACTION, + WS_NL80211_ATTR_TDLS_DIALOG_TOKEN, + WS_NL80211_ATTR_TDLS_OPERATION, + WS_NL80211_ATTR_TDLS_SUPPORT, + WS_NL80211_ATTR_TDLS_EXTERNAL_SETUP, + WS_NL80211_ATTR_DEVICE_AP_SME, + WS_NL80211_ATTR_DONT_WAIT_FOR_ACK, + WS_NL80211_ATTR_FEATURE_FLAGS, + WS_NL80211_ATTR_PROBE_RESP_OFFLOAD, + WS_NL80211_ATTR_PROBE_RESP, + WS_NL80211_ATTR_DFS_REGION, + WS_NL80211_ATTR_DISABLE_HT, + WS_NL80211_ATTR_HT_CAPABILITY_MASK, + WS_NL80211_ATTR_NOACK_MAP, + WS_NL80211_ATTR_INACTIVITY_TIMEOUT, + WS_NL80211_ATTR_RX_SIGNAL_DBM, + WS_NL80211_ATTR_BG_SCAN_PERIOD, + WS_NL80211_ATTR_WDEV, + WS_NL80211_ATTR_USER_REG_HINT_TYPE, + WS_NL80211_ATTR_CONN_FAILED_REASON, + WS_NL80211_ATTR_AUTH_DATA, + WS_NL80211_ATTR_VHT_CAPABILITY, + WS_NL80211_ATTR_SCAN_FLAGS, + WS_NL80211_ATTR_CHANNEL_WIDTH, + WS_NL80211_ATTR_CENTER_FREQ1, + WS_NL80211_ATTR_CENTER_FREQ2, + WS_NL80211_ATTR_P2P_CTWINDOW, + WS_NL80211_ATTR_P2P_OPPPS, + WS_NL80211_ATTR_LOCAL_MESH_POWER_MODE, + WS_NL80211_ATTR_ACL_POLICY, + WS_NL80211_ATTR_MAC_ADDRS, + WS_NL80211_ATTR_MAC_ACL_MAX, + WS_NL80211_ATTR_RADAR_EVENT, + WS_NL80211_ATTR_EXT_CAPA, + WS_NL80211_ATTR_EXT_CAPA_MASK, + WS_NL80211_ATTR_STA_CAPABILITY, + WS_NL80211_ATTR_STA_EXT_CAPABILITY, + WS_NL80211_ATTR_PROTOCOL_FEATURES, + WS_NL80211_ATTR_SPLIT_WIPHY_DUMP, + WS_NL80211_ATTR_DISABLE_VHT, + WS_NL80211_ATTR_VHT_CAPABILITY_MASK, + WS_NL80211_ATTR_MDID, + WS_NL80211_ATTR_IE_RIC, + WS_NL80211_ATTR_CRIT_PROT_ID, + WS_NL80211_ATTR_MAX_CRIT_PROT_DURATION, + WS_NL80211_ATTR_PEER_AID, + WS_NL80211_ATTR_COALESCE_RULE, + WS_NL80211_ATTR_CH_SWITCH_COUNT, + WS_NL80211_ATTR_CH_SWITCH_BLOCK_TX, + WS_NL80211_ATTR_CSA_IES, + WS_NL80211_ATTR_CSA_C_OFF_BEACON, + WS_NL80211_ATTR_CSA_C_OFF_PRESP, + WS_NL80211_ATTR_RXMGMT_FLAGS, + WS_NL80211_ATTR_STA_SUPPORTED_CHANNELS, + WS_NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES, + WS_NL80211_ATTR_HANDLE_DFS, + WS_NL80211_ATTR_SUPPORT_5_MHZ, + WS_NL80211_ATTR_SUPPORT_10_MHZ, + WS_NL80211_ATTR_OPMODE_NOTIF, + WS_NL80211_ATTR_VENDOR_ID, + WS_NL80211_ATTR_VENDOR_SUBCMD, + WS_NL80211_ATTR_VENDOR_DATA, + WS_NL80211_ATTR_VENDOR_EVENTS, + WS_NL80211_ATTR_QOS_MAP, + WS_NL80211_ATTR_MAC_HINT, + WS_NL80211_ATTR_WIPHY_FREQ_HINT, + WS_NL80211_ATTR_MAX_AP_ASSOC_STA, + WS_NL80211_ATTR_TDLS_PEER_CAPABILITY, + WS_NL80211_ATTR_SOCKET_OWNER, + WS_NL80211_ATTR_CSA_C_OFFSETS_TX, + WS_NL80211_ATTR_MAX_CSA_COUNTERS, + WS_NL80211_ATTR_TDLS_INITIATOR, + WS_NL80211_ATTR_USE_RRM, + WS_NL80211_ATTR_WIPHY_DYN_ACK, + WS_NL80211_ATTR_TSID, + WS_NL80211_ATTR_USER_PRIO, + WS_NL80211_ATTR_ADMITTED_TIME, + WS_NL80211_ATTR_SMPS_MODE, + WS_NL80211_ATTR_OPER_CLASS, + WS_NL80211_ATTR_MAC_MASK, + WS_NL80211_ATTR_WIPHY_SELF_MANAGED_REG, + WS_NL80211_ATTR_EXT_FEATURES, + WS_NL80211_ATTR_SURVEY_RADIO_STATS, + WS_NL80211_ATTR_NETNS_FD, + WS_NL80211_ATTR_SCHED_SCAN_DELAY, + WS_NL80211_ATTR_REG_INDOOR, + WS_NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, + WS_NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, + WS_NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, + WS_NL80211_ATTR_SCHED_SCAN_PLANS, + WS_NL80211_ATTR_PBSS, + WS_NL80211_ATTR_BSS_SELECT, + WS_NL80211_ATTR_STA_SUPPORT_P2P_PS, + WS_NL80211_ATTR_PAD, + WS_NL80211_ATTR_IFTYPE_EXT_CAPA, + WS_NL80211_ATTR_MU_MIMO_GROUP_DATA, + WS_NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR, + WS_NL80211_ATTR_SCAN_START_TIME_TSF, + WS_NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, + WS_NL80211_ATTR_MEASUREMENT_DURATION, + WS_NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY, + WS_NL80211_ATTR_MESH_PEER_AID, + WS_NL80211_ATTR_NAN_MASTER_PREF, + WS_NL80211_ATTR_BANDS, + WS_NL80211_ATTR_NAN_FUNC, + WS_NL80211_ATTR_NAN_MATCH, + WS_NL80211_ATTR_FILS_KEK, + WS_NL80211_ATTR_FILS_NONCES, + WS_NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED, + WS_NL80211_ATTR_BSSID, + WS_NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, + WS_NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, + WS_NL80211_ATTR_TIMEOUT_REASON, +}; + +static const value_string ws_nl80211_commands_vals[] = { + { WS_NL80211_CMD_UNSPEC, "NL80211_CMD_UNSPEC" }, + { WS_NL80211_CMD_GET_WIPHY, "NL80211_CMD_GET_WIPHY" }, + { WS_NL80211_CMD_SET_WIPHY, "NL80211_CMD_SET_WIPHY" }, + { WS_NL80211_CMD_NEW_WIPHY, "NL80211_CMD_NEW_WIPHY" }, + { WS_NL80211_CMD_DEL_WIPHY, "NL80211_CMD_DEL_WIPHY" }, + { WS_NL80211_CMD_GET_INTERFACE, "NL80211_CMD_GET_INTERFACE" }, + { WS_NL80211_CMD_SET_INTERFACE, "NL80211_CMD_SET_INTERFACE" }, + { WS_NL80211_CMD_NEW_INTERFACE, "NL80211_CMD_NEW_INTERFACE" }, + { WS_NL80211_CMD_DEL_INTERFACE, "NL80211_CMD_DEL_INTERFACE" }, + { WS_NL80211_CMD_GET_KEY, "NL80211_CMD_GET_KEY" }, + { WS_NL80211_CMD_SET_KEY, "NL80211_CMD_SET_KEY" }, + { WS_NL80211_CMD_NEW_KEY, "NL80211_CMD_NEW_KEY" }, + { WS_NL80211_CMD_DEL_KEY, "NL80211_CMD_DEL_KEY" }, + { WS_NL80211_CMD_GET_BEACON, "NL80211_CMD_GET_BEACON" }, + { WS_NL80211_CMD_SET_BEACON, "NL80211_CMD_SET_BEACON" }, + { WS_NL80211_CMD_START_AP, "NL80211_CMD_START_AP" }, + { WS_NL80211_CMD_STOP_AP, "NL80211_CMD_STOP_AP" }, + { WS_NL80211_CMD_GET_STATION, "NL80211_CMD_GET_STATION" }, + { WS_NL80211_CMD_SET_STATION, "NL80211_CMD_SET_STATION" }, + { WS_NL80211_CMD_NEW_STATION, "NL80211_CMD_NEW_STATION" }, + { WS_NL80211_CMD_DEL_STATION, "NL80211_CMD_DEL_STATION" }, + { WS_NL80211_CMD_GET_MPATH, "NL80211_CMD_GET_MPATH" }, + { WS_NL80211_CMD_SET_MPATH, "NL80211_CMD_SET_MPATH" }, + { WS_NL80211_CMD_NEW_MPATH, "NL80211_CMD_NEW_MPATH" }, + { WS_NL80211_CMD_DEL_MPATH, "NL80211_CMD_DEL_MPATH" }, + { WS_NL80211_CMD_SET_BSS, "NL80211_CMD_SET_BSS" }, + { WS_NL80211_CMD_SET_REG, "NL80211_CMD_SET_REG" }, + { WS_NL80211_CMD_REQ_SET_REG, "NL80211_CMD_REQ_SET_REG" }, + { WS_NL80211_CMD_GET_MESH_CONFIG, "NL80211_CMD_GET_MESH_CONFIG" }, + { WS_NL80211_CMD_SET_MESH_CONFIG, "NL80211_CMD_SET_MESH_CONFIG" }, + { WS_NL80211_CMD_SET_MGMT_EXTRA_IE, "NL80211_CMD_SET_MGMT_EXTRA_IE" }, + { WS_NL80211_CMD_GET_REG, "NL80211_CMD_GET_REG" }, + { WS_NL80211_CMD_GET_SCAN, "NL80211_CMD_GET_SCAN" }, + { WS_NL80211_CMD_TRIGGER_SCAN, "NL80211_CMD_TRIGGER_SCAN" }, + { WS_NL80211_CMD_NEW_SCAN_RESULTS, "NL80211_CMD_NEW_SCAN_RESULTS" }, + { WS_NL80211_CMD_SCAN_ABORTED, "NL80211_CMD_SCAN_ABORTED" }, + { WS_NL80211_CMD_REG_CHANGE, "NL80211_CMD_REG_CHANGE" }, + { WS_NL80211_CMD_AUTHENTICATE, "NL80211_CMD_AUTHENTICATE" }, + { WS_NL80211_CMD_ASSOCIATE, "NL80211_CMD_ASSOCIATE" }, + { WS_NL80211_CMD_DEAUTHENTICATE, "NL80211_CMD_DEAUTHENTICATE" }, + { WS_NL80211_CMD_DISASSOCIATE, "NL80211_CMD_DISASSOCIATE" }, + { WS_NL80211_CMD_MICHAEL_MIC_FAILURE, "NL80211_CMD_MICHAEL_MIC_FAILURE" }, + { WS_NL80211_CMD_REG_BEACON_HINT, "NL80211_CMD_REG_BEACON_HINT" }, + { WS_NL80211_CMD_JOIN_IBSS, "NL80211_CMD_JOIN_IBSS" }, + { WS_NL80211_CMD_LEAVE_IBSS, "NL80211_CMD_LEAVE_IBSS" }, + { WS_NL80211_CMD_TESTMODE, "NL80211_CMD_TESTMODE" }, + { WS_NL80211_CMD_CONNECT, "NL80211_CMD_CONNECT" }, + { WS_NL80211_CMD_ROAM, "NL80211_CMD_ROAM" }, + { WS_NL80211_CMD_DISCONNECT, "NL80211_CMD_DISCONNECT" }, + { WS_NL80211_CMD_SET_WIPHY_NETNS, "NL80211_CMD_SET_WIPHY_NETNS" }, + { WS_NL80211_CMD_GET_SURVEY, "NL80211_CMD_GET_SURVEY" }, + { WS_NL80211_CMD_NEW_SURVEY_RESULTS, "NL80211_CMD_NEW_SURVEY_RESULTS" }, + { WS_NL80211_CMD_SET_PMKSA, "NL80211_CMD_SET_PMKSA" }, + { WS_NL80211_CMD_DEL_PMKSA, "NL80211_CMD_DEL_PMKSA" }, + { WS_NL80211_CMD_FLUSH_PMKSA, "NL80211_CMD_FLUSH_PMKSA" }, + { WS_NL80211_CMD_REMAIN_ON_CHANNEL, "NL80211_CMD_REMAIN_ON_CHANNEL" }, + { WS_NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, "NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL" }, + { WS_NL80211_CMD_SET_TX_BITRATE_MASK, "NL80211_CMD_SET_TX_BITRATE_MASK" }, + { WS_NL80211_CMD_REGISTER_FRAME, "NL80211_CMD_REGISTER_FRAME" }, + { WS_NL80211_CMD_FRAME, "NL80211_CMD_FRAME" }, + { WS_NL80211_CMD_FRAME_TX_STATUS, "NL80211_CMD_FRAME_TX_STATUS" }, + { WS_NL80211_CMD_SET_POWER_SAVE, "NL80211_CMD_SET_POWER_SAVE" }, + { WS_NL80211_CMD_GET_POWER_SAVE, "NL80211_CMD_GET_POWER_SAVE" }, + { WS_NL80211_CMD_SET_CQM, "NL80211_CMD_SET_CQM" }, + { WS_NL80211_CMD_NOTIFY_CQM, "NL80211_CMD_NOTIFY_CQM" }, + { WS_NL80211_CMD_SET_CHANNEL, "NL80211_CMD_SET_CHANNEL" }, + { WS_NL80211_CMD_SET_WDS_PEER, "NL80211_CMD_SET_WDS_PEER" }, + { WS_NL80211_CMD_FRAME_WAIT_CANCEL, "NL80211_CMD_FRAME_WAIT_CANCEL" }, + { WS_NL80211_CMD_JOIN_MESH, "NL80211_CMD_JOIN_MESH" }, + { WS_NL80211_CMD_LEAVE_MESH, "NL80211_CMD_LEAVE_MESH" }, + { WS_NL80211_CMD_UNPROT_DEAUTHENTICATE, "NL80211_CMD_UNPROT_DEAUTHENTICATE" }, + { WS_NL80211_CMD_UNPROT_DISASSOCIATE, "NL80211_CMD_UNPROT_DISASSOCIATE" }, + { WS_NL80211_CMD_NEW_PEER_CANDIDATE, "NL80211_CMD_NEW_PEER_CANDIDATE" }, + { WS_NL80211_CMD_GET_WOWLAN, "NL80211_CMD_GET_WOWLAN" }, + { WS_NL80211_CMD_SET_WOWLAN, "NL80211_CMD_SET_WOWLAN" }, + { WS_NL80211_CMD_START_SCHED_SCAN, "NL80211_CMD_START_SCHED_SCAN" }, + { WS_NL80211_CMD_STOP_SCHED_SCAN, "NL80211_CMD_STOP_SCHED_SCAN" }, + { WS_NL80211_CMD_SCHED_SCAN_RESULTS, "NL80211_CMD_SCHED_SCAN_RESULTS" }, + { WS_NL80211_CMD_SCHED_SCAN_STOPPED, "NL80211_CMD_SCHED_SCAN_STOPPED" }, + { WS_NL80211_CMD_SET_REKEY_OFFLOAD, "NL80211_CMD_SET_REKEY_OFFLOAD" }, + { WS_NL80211_CMD_PMKSA_CANDIDATE, "NL80211_CMD_PMKSA_CANDIDATE" }, + { WS_NL80211_CMD_TDLS_OPER, "NL80211_CMD_TDLS_OPER" }, + { WS_NL80211_CMD_TDLS_MGMT, "NL80211_CMD_TDLS_MGMT" }, + { WS_NL80211_CMD_UNEXPECTED_FRAME, "NL80211_CMD_UNEXPECTED_FRAME" }, + { WS_NL80211_CMD_PROBE_CLIENT, "NL80211_CMD_PROBE_CLIENT" }, + { WS_NL80211_CMD_REGISTER_BEACONS, "NL80211_CMD_REGISTER_BEACONS" }, + { WS_NL80211_CMD_UNEXPECTED_4ADDR_FRAME, "NL80211_CMD_UNEXPECTED_4ADDR_FRAME" }, + { WS_NL80211_CMD_SET_NOACK_MAP, "NL80211_CMD_SET_NOACK_MAP" }, + { WS_NL80211_CMD_CH_SWITCH_NOTIFY, "NL80211_CMD_CH_SWITCH_NOTIFY" }, + { WS_NL80211_CMD_START_P2P_DEVICE, "NL80211_CMD_START_P2P_DEVICE" }, + { WS_NL80211_CMD_STOP_P2P_DEVICE, "NL80211_CMD_STOP_P2P_DEVICE" }, + { WS_NL80211_CMD_CONN_FAILED, "NL80211_CMD_CONN_FAILED" }, + { WS_NL80211_CMD_SET_MCAST_RATE, "NL80211_CMD_SET_MCAST_RATE" }, + { WS_NL80211_CMD_SET_MAC_ACL, "NL80211_CMD_SET_MAC_ACL" }, + { WS_NL80211_CMD_RADAR_DETECT, "NL80211_CMD_RADAR_DETECT" }, + { WS_NL80211_CMD_GET_PROTOCOL_FEATURES, "NL80211_CMD_GET_PROTOCOL_FEATURES" }, + { WS_NL80211_CMD_UPDATE_FT_IES, "NL80211_CMD_UPDATE_FT_IES" }, + { WS_NL80211_CMD_FT_EVENT, "NL80211_CMD_FT_EVENT" }, + { WS_NL80211_CMD_CRIT_PROTOCOL_START, "NL80211_CMD_CRIT_PROTOCOL_START" }, + { WS_NL80211_CMD_CRIT_PROTOCOL_STOP, "NL80211_CMD_CRIT_PROTOCOL_STOP" }, + { WS_NL80211_CMD_GET_COALESCE, "NL80211_CMD_GET_COALESCE" }, + { WS_NL80211_CMD_SET_COALESCE, "NL80211_CMD_SET_COALESCE" }, + { WS_NL80211_CMD_CHANNEL_SWITCH, "NL80211_CMD_CHANNEL_SWITCH" }, + { WS_NL80211_CMD_VENDOR, "NL80211_CMD_VENDOR" }, + { WS_NL80211_CMD_SET_QOS_MAP, "NL80211_CMD_SET_QOS_MAP" }, + { WS_NL80211_CMD_ADD_TX_TS, "NL80211_CMD_ADD_TX_TS" }, + { WS_NL80211_CMD_DEL_TX_TS, "NL80211_CMD_DEL_TX_TS" }, + { WS_NL80211_CMD_GET_MPP, "NL80211_CMD_GET_MPP" }, + { WS_NL80211_CMD_JOIN_OCB, "NL80211_CMD_JOIN_OCB" }, + { WS_NL80211_CMD_LEAVE_OCB, "NL80211_CMD_LEAVE_OCB" }, + { WS_NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, "NL80211_CMD_CH_SWITCH_STARTED_NOTIFY" }, + { WS_NL80211_CMD_TDLS_CHANNEL_SWITCH, "NL80211_CMD_TDLS_CHANNEL_SWITCH" }, + { WS_NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, "NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH" }, + { WS_NL80211_CMD_WIPHY_REG_CHANGE, "NL80211_CMD_WIPHY_REG_CHANGE" }, + { WS_NL80211_CMD_ABORT_SCAN, "NL80211_CMD_ABORT_SCAN" }, + { WS_NL80211_CMD_START_NAN, "NL80211_CMD_START_NAN" }, + { WS_NL80211_CMD_STOP_NAN, "NL80211_CMD_STOP_NAN" }, + { WS_NL80211_CMD_ADD_NAN_FUNCTION, "NL80211_CMD_ADD_NAN_FUNCTION" }, + { WS_NL80211_CMD_DEL_NAN_FUNCTION, "NL80211_CMD_DEL_NAN_FUNCTION" }, + { WS_NL80211_CMD_CHANGE_NAN_CONFIG, "NL80211_CMD_CHANGE_NAN_CONFIG" }, + { WS_NL80211_CMD_NAN_MATCH, "NL80211_CMD_NAN_MATCH" }, + { WS_NL80211_CMD_SET_MULTICAST_TO_UNICAST, "NL80211_CMD_SET_MULTICAST_TO_UNICAST" }, + { WS_NL80211_CMD_UPDATE_CONNECT_PARAMS, "NL80211_CMD_UPDATE_CONNECT_PARAMS" }, + { 0, NULL } +}; +static value_string_ext ws_nl80211_commands_vals_ext = VALUE_STRING_EXT_INIT(ws_nl80211_commands_vals); + +static const value_string ws_nl80211_attrs_vals[] = { + { WS_NL80211_ATTR_UNSPEC, "NL80211_ATTR_UNSPEC" }, + { WS_NL80211_ATTR_WIPHY, "NL80211_ATTR_WIPHY" }, + { WS_NL80211_ATTR_WIPHY_NAME, "NL80211_ATTR_WIPHY_NAME" }, + { WS_NL80211_ATTR_IFINDEX, "NL80211_ATTR_IFINDEX" }, + { WS_NL80211_ATTR_IFNAME, "NL80211_ATTR_IFNAME" }, + { WS_NL80211_ATTR_IFTYPE, "NL80211_ATTR_IFTYPE" }, + { WS_NL80211_ATTR_MAC, "NL80211_ATTR_MAC" }, + { WS_NL80211_ATTR_KEY_DATA, "NL80211_ATTR_KEY_DATA" }, + { WS_NL80211_ATTR_KEY_IDX, "NL80211_ATTR_KEY_IDX" }, + { WS_NL80211_ATTR_KEY_CIPHER, "NL80211_ATTR_KEY_CIPHER" }, + { WS_NL80211_ATTR_KEY_SEQ, "NL80211_ATTR_KEY_SEQ" }, + { WS_NL80211_ATTR_KEY_DEFAULT, "NL80211_ATTR_KEY_DEFAULT" }, + { WS_NL80211_ATTR_BEACON_INTERVAL, "NL80211_ATTR_BEACON_INTERVAL" }, + { WS_NL80211_ATTR_DTIM_PERIOD, "NL80211_ATTR_DTIM_PERIOD" }, + { WS_NL80211_ATTR_BEACON_HEAD, "NL80211_ATTR_BEACON_HEAD" }, + { WS_NL80211_ATTR_BEACON_TAIL, "NL80211_ATTR_BEACON_TAIL" }, + { WS_NL80211_ATTR_STA_AID, "NL80211_ATTR_STA_AID" }, + { WS_NL80211_ATTR_STA_FLAGS, "NL80211_ATTR_STA_FLAGS" }, + { WS_NL80211_ATTR_STA_LISTEN_INTERVAL, "NL80211_ATTR_STA_LISTEN_INTERVAL" }, + { WS_NL80211_ATTR_STA_SUPPORTED_RATES, "NL80211_ATTR_STA_SUPPORTED_RATES" }, + { WS_NL80211_ATTR_STA_VLAN, "NL80211_ATTR_STA_VLAN" }, + { WS_NL80211_ATTR_STA_INFO, "NL80211_ATTR_STA_INFO" }, + { WS_NL80211_ATTR_WIPHY_BANDS, "NL80211_ATTR_WIPHY_BANDS" }, + { WS_NL80211_ATTR_MNTR_FLAGS, "NL80211_ATTR_MNTR_FLAGS" }, + { WS_NL80211_ATTR_MESH_ID, "NL80211_ATTR_MESH_ID" }, + { WS_NL80211_ATTR_STA_PLINK_ACTION, "NL80211_ATTR_STA_PLINK_ACTION" }, + { WS_NL80211_ATTR_MPATH_NEXT_HOP, "NL80211_ATTR_MPATH_NEXT_HOP" }, + { WS_NL80211_ATTR_MPATH_INFO, "NL80211_ATTR_MPATH_INFO" }, + { WS_NL80211_ATTR_BSS_CTS_PROT, "NL80211_ATTR_BSS_CTS_PROT" }, + { WS_NL80211_ATTR_BSS_SHORT_PREAMBLE, "NL80211_ATTR_BSS_SHORT_PREAMBLE" }, + { WS_NL80211_ATTR_BSS_SHORT_SLOT_TIME, "NL80211_ATTR_BSS_SHORT_SLOT_TIME" }, + { WS_NL80211_ATTR_HT_CAPABILITY, "NL80211_ATTR_HT_CAPABILITY" }, + { WS_NL80211_ATTR_SUPPORTED_IFTYPES, "NL80211_ATTR_SUPPORTED_IFTYPES" }, + { WS_NL80211_ATTR_REG_ALPHA2, "NL80211_ATTR_REG_ALPHA2" }, + { WS_NL80211_ATTR_REG_RULES, "NL80211_ATTR_REG_RULES" }, + { WS_NL80211_ATTR_MESH_CONFIG, "NL80211_ATTR_MESH_CONFIG" }, + { WS_NL80211_ATTR_BSS_BASIC_RATES, "NL80211_ATTR_BSS_BASIC_RATES" }, + { WS_NL80211_ATTR_WIPHY_TXQ_PARAMS, "NL80211_ATTR_WIPHY_TXQ_PARAMS" }, + { WS_NL80211_ATTR_WIPHY_FREQ, "NL80211_ATTR_WIPHY_FREQ" }, + { WS_NL80211_ATTR_WIPHY_CHANNEL_TYPE, "NL80211_ATTR_WIPHY_CHANNEL_TYPE" }, + { WS_NL80211_ATTR_KEY_DEFAULT_MGMT, "NL80211_ATTR_KEY_DEFAULT_MGMT" }, + { WS_NL80211_ATTR_MGMT_SUBTYPE, "NL80211_ATTR_MGMT_SUBTYPE" }, + { WS_NL80211_ATTR_IE, "NL80211_ATTR_IE" }, + { WS_NL80211_ATTR_MAX_NUM_SCAN_SSIDS, "NL80211_ATTR_MAX_NUM_SCAN_SSIDS" }, + { WS_NL80211_ATTR_SCAN_FREQUENCIES, "NL80211_ATTR_SCAN_FREQUENCIES" }, + { WS_NL80211_ATTR_SCAN_SSIDS, "NL80211_ATTR_SCAN_SSIDS" }, + { WS_NL80211_ATTR_GENERATION, "NL80211_ATTR_GENERATION" }, + { WS_NL80211_ATTR_BSS, "NL80211_ATTR_BSS" }, + { WS_NL80211_ATTR_REG_INITIATOR, "NL80211_ATTR_REG_INITIATOR" }, + { WS_NL80211_ATTR_REG_TYPE, "NL80211_ATTR_REG_TYPE" }, + { WS_NL80211_ATTR_SUPPORTED_COMMANDS, "NL80211_ATTR_SUPPORTED_COMMANDS" }, + { WS_NL80211_ATTR_FRAME, "NL80211_ATTR_FRAME" }, + { WS_NL80211_ATTR_SSID, "NL80211_ATTR_SSID" }, + { WS_NL80211_ATTR_AUTH_TYPE, "NL80211_ATTR_AUTH_TYPE" }, + { WS_NL80211_ATTR_REASON_CODE, "NL80211_ATTR_REASON_CODE" }, + { WS_NL80211_ATTR_KEY_TYPE, "NL80211_ATTR_KEY_TYPE" }, + { WS_NL80211_ATTR_MAX_SCAN_IE_LEN, "NL80211_ATTR_MAX_SCAN_IE_LEN" }, + { WS_NL80211_ATTR_CIPHER_SUITES, "NL80211_ATTR_CIPHER_SUITES" }, + { WS_NL80211_ATTR_FREQ_BEFORE, "NL80211_ATTR_FREQ_BEFORE" }, + { WS_NL80211_ATTR_FREQ_AFTER, "NL80211_ATTR_FREQ_AFTER" }, + { WS_NL80211_ATTR_FREQ_FIXED, "NL80211_ATTR_FREQ_FIXED" }, + { WS_NL80211_ATTR_WIPHY_RETRY_SHORT, "NL80211_ATTR_WIPHY_RETRY_SHORT" }, + { WS_NL80211_ATTR_WIPHY_RETRY_LONG, "NL80211_ATTR_WIPHY_RETRY_LONG" }, + { WS_NL80211_ATTR_WIPHY_FRAG_THRESHOLD, "NL80211_ATTR_WIPHY_FRAG_THRESHOLD" }, + { WS_NL80211_ATTR_WIPHY_RTS_THRESHOLD, "NL80211_ATTR_WIPHY_RTS_THRESHOLD" }, + { WS_NL80211_ATTR_TIMED_OUT, "NL80211_ATTR_TIMED_OUT" }, + { WS_NL80211_ATTR_USE_MFP, "NL80211_ATTR_USE_MFP" }, + { WS_NL80211_ATTR_STA_FLAGS2, "NL80211_ATTR_STA_FLAGS2" }, + { WS_NL80211_ATTR_CONTROL_PORT, "NL80211_ATTR_CONTROL_PORT" }, + { WS_NL80211_ATTR_TESTDATA, "NL80211_ATTR_TESTDATA" }, + { WS_NL80211_ATTR_PRIVACY, "NL80211_ATTR_PRIVACY" }, + { WS_NL80211_ATTR_DISCONNECTED_BY_AP, "NL80211_ATTR_DISCONNECTED_BY_AP" }, + { WS_NL80211_ATTR_STATUS_CODE, "NL80211_ATTR_STATUS_CODE" }, + { WS_NL80211_ATTR_CIPHER_SUITES_PAIRWISE, "NL80211_ATTR_CIPHER_SUITES_PAIRWISE" }, + { WS_NL80211_ATTR_CIPHER_SUITE_GROUP, "NL80211_ATTR_CIPHER_SUITE_GROUP" }, + { WS_NL80211_ATTR_WPA_VERSIONS, "NL80211_ATTR_WPA_VERSIONS" }, + { WS_NL80211_ATTR_AKM_SUITES, "NL80211_ATTR_AKM_SUITES" }, + { WS_NL80211_ATTR_REQ_IE, "NL80211_ATTR_REQ_IE" }, + { WS_NL80211_ATTR_RESP_IE, "NL80211_ATTR_RESP_IE" }, + { WS_NL80211_ATTR_PREV_BSSID, "NL80211_ATTR_PREV_BSSID" }, + { WS_NL80211_ATTR_KEY, "NL80211_ATTR_KEY" }, + { WS_NL80211_ATTR_KEYS, "NL80211_ATTR_KEYS" }, + { WS_NL80211_ATTR_PID, "NL80211_ATTR_PID" }, + { WS_NL80211_ATTR_4ADDR, "NL80211_ATTR_4ADDR" }, + { WS_NL80211_ATTR_SURVEY_INFO, "NL80211_ATTR_SURVEY_INFO" }, + { WS_NL80211_ATTR_PMKID, "NL80211_ATTR_PMKID" }, + { WS_NL80211_ATTR_MAX_NUM_PMKIDS, "NL80211_ATTR_MAX_NUM_PMKIDS" }, + { WS_NL80211_ATTR_DURATION, "NL80211_ATTR_DURATION" }, + { WS_NL80211_ATTR_COOKIE, "NL80211_ATTR_COOKIE" }, + { WS_NL80211_ATTR_WIPHY_COVERAGE_CLASS, "NL80211_ATTR_WIPHY_COVERAGE_CLASS" }, + { WS_NL80211_ATTR_TX_RATES, "NL80211_ATTR_TX_RATES" }, + { WS_NL80211_ATTR_FRAME_MATCH, "NL80211_ATTR_FRAME_MATCH" }, + { WS_NL80211_ATTR_ACK, "NL80211_ATTR_ACK" }, + { WS_NL80211_ATTR_PS_STATE, "NL80211_ATTR_PS_STATE" }, + { WS_NL80211_ATTR_CQM, "NL80211_ATTR_CQM" }, + { WS_NL80211_ATTR_LOCAL_STATE_CHANGE, "NL80211_ATTR_LOCAL_STATE_CHANGE" }, + { WS_NL80211_ATTR_AP_ISOLATE, "NL80211_ATTR_AP_ISOLATE" }, + { WS_NL80211_ATTR_WIPHY_TX_POWER_SETTING, "NL80211_ATTR_WIPHY_TX_POWER_SETTING" }, + { WS_NL80211_ATTR_WIPHY_TX_POWER_LEVEL, "NL80211_ATTR_WIPHY_TX_POWER_LEVEL" }, + { WS_NL80211_ATTR_TX_FRAME_TYPES, "NL80211_ATTR_TX_FRAME_TYPES" }, + { WS_NL80211_ATTR_RX_FRAME_TYPES, "NL80211_ATTR_RX_FRAME_TYPES" }, + { WS_NL80211_ATTR_FRAME_TYPE, "NL80211_ATTR_FRAME_TYPE" }, + { WS_NL80211_ATTR_CONTROL_PORT_ETHERTYPE, "NL80211_ATTR_CONTROL_PORT_ETHERTYPE" }, + { WS_NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT, "NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT" }, + { WS_NL80211_ATTR_SUPPORT_IBSS_RSN, "NL80211_ATTR_SUPPORT_IBSS_RSN" }, + { WS_NL80211_ATTR_WIPHY_ANTENNA_TX, "NL80211_ATTR_WIPHY_ANTENNA_TX" }, + { WS_NL80211_ATTR_WIPHY_ANTENNA_RX, "NL80211_ATTR_WIPHY_ANTENNA_RX" }, + { WS_NL80211_ATTR_MCAST_RATE, "NL80211_ATTR_MCAST_RATE" }, + { WS_NL80211_ATTR_OFFCHANNEL_TX_OK, "NL80211_ATTR_OFFCHANNEL_TX_OK" }, + { WS_NL80211_ATTR_BSS_HT_OPMODE, "NL80211_ATTR_BSS_HT_OPMODE" }, + { WS_NL80211_ATTR_KEY_DEFAULT_TYPES, "NL80211_ATTR_KEY_DEFAULT_TYPES" }, + { WS_NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, "NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION" }, + { WS_NL80211_ATTR_MESH_SETUP, "NL80211_ATTR_MESH_SETUP" }, + { WS_NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX" }, + { WS_NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX" }, + { WS_NL80211_ATTR_SUPPORT_MESH_AUTH, "NL80211_ATTR_SUPPORT_MESH_AUTH" }, + { WS_NL80211_ATTR_STA_PLINK_STATE, "NL80211_ATTR_STA_PLINK_STATE" }, + { WS_NL80211_ATTR_WOWLAN_TRIGGERS, "NL80211_ATTR_WOWLAN_TRIGGERS" }, + { WS_NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED, "NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED" }, + { WS_NL80211_ATTR_SCHED_SCAN_INTERVAL, "NL80211_ATTR_SCHED_SCAN_INTERVAL" }, + { WS_NL80211_ATTR_INTERFACE_COMBINATIONS, "NL80211_ATTR_INTERFACE_COMBINATIONS" }, + { WS_NL80211_ATTR_SOFTWARE_IFTYPES, "NL80211_ATTR_SOFTWARE_IFTYPES" }, + { WS_NL80211_ATTR_REKEY_DATA, "NL80211_ATTR_REKEY_DATA" }, + { WS_NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, "NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS" }, + { WS_NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, "NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN" }, + { WS_NL80211_ATTR_SCAN_SUPP_RATES, "NL80211_ATTR_SCAN_SUPP_RATES" }, + { WS_NL80211_ATTR_HIDDEN_SSID, "NL80211_ATTR_HIDDEN_SSID" }, + { WS_NL80211_ATTR_IE_PROBE_RESP, "NL80211_ATTR_IE_PROBE_RESP" }, + { WS_NL80211_ATTR_IE_ASSOC_RESP, "NL80211_ATTR_IE_ASSOC_RESP" }, + { WS_NL80211_ATTR_STA_WME, "NL80211_ATTR_STA_WME" }, + { WS_NL80211_ATTR_SUPPORT_AP_UAPSD, "NL80211_ATTR_SUPPORT_AP_UAPSD" }, + { WS_NL80211_ATTR_ROAM_SUPPORT, "NL80211_ATTR_ROAM_SUPPORT" }, + { WS_NL80211_ATTR_SCHED_SCAN_MATCH, "NL80211_ATTR_SCHED_SCAN_MATCH" }, + { WS_NL80211_ATTR_MAX_MATCH_SETS, "NL80211_ATTR_MAX_MATCH_SETS" }, + { WS_NL80211_ATTR_PMKSA_CANDIDATE, "NL80211_ATTR_PMKSA_CANDIDATE" }, + { WS_NL80211_ATTR_TX_NO_CCK_RATE, "NL80211_ATTR_TX_NO_CCK_RATE" }, + { WS_NL80211_ATTR_TDLS_ACTION, "NL80211_ATTR_TDLS_ACTION" }, + { WS_NL80211_ATTR_TDLS_DIALOG_TOKEN, "NL80211_ATTR_TDLS_DIALOG_TOKEN" }, + { WS_NL80211_ATTR_TDLS_OPERATION, "NL80211_ATTR_TDLS_OPERATION" }, + { WS_NL80211_ATTR_TDLS_SUPPORT, "NL80211_ATTR_TDLS_SUPPORT" }, + { WS_NL80211_ATTR_TDLS_EXTERNAL_SETUP, "NL80211_ATTR_TDLS_EXTERNAL_SETUP" }, + { WS_NL80211_ATTR_DEVICE_AP_SME, "NL80211_ATTR_DEVICE_AP_SME" }, + { WS_NL80211_ATTR_DONT_WAIT_FOR_ACK, "NL80211_ATTR_DONT_WAIT_FOR_ACK" }, + { WS_NL80211_ATTR_FEATURE_FLAGS, "NL80211_ATTR_FEATURE_FLAGS" }, + { WS_NL80211_ATTR_PROBE_RESP_OFFLOAD, "NL80211_ATTR_PROBE_RESP_OFFLOAD" }, + { WS_NL80211_ATTR_PROBE_RESP, "NL80211_ATTR_PROBE_RESP" }, + { WS_NL80211_ATTR_DFS_REGION, "NL80211_ATTR_DFS_REGION" }, + { WS_NL80211_ATTR_DISABLE_HT, "NL80211_ATTR_DISABLE_HT" }, + { WS_NL80211_ATTR_HT_CAPABILITY_MASK, "NL80211_ATTR_HT_CAPABILITY_MASK" }, + { WS_NL80211_ATTR_NOACK_MAP, "NL80211_ATTR_NOACK_MAP" }, + { WS_NL80211_ATTR_INACTIVITY_TIMEOUT, "NL80211_ATTR_INACTIVITY_TIMEOUT" }, + { WS_NL80211_ATTR_RX_SIGNAL_DBM, "NL80211_ATTR_RX_SIGNAL_DBM" }, + { WS_NL80211_ATTR_BG_SCAN_PERIOD, "NL80211_ATTR_BG_SCAN_PERIOD" }, + { WS_NL80211_ATTR_WDEV, "NL80211_ATTR_WDEV" }, + { WS_NL80211_ATTR_USER_REG_HINT_TYPE, "NL80211_ATTR_USER_REG_HINT_TYPE" }, + { WS_NL80211_ATTR_CONN_FAILED_REASON, "NL80211_ATTR_CONN_FAILED_REASON" }, + { WS_NL80211_ATTR_AUTH_DATA, "NL80211_ATTR_AUTH_DATA" }, + { WS_NL80211_ATTR_VHT_CAPABILITY, "NL80211_ATTR_VHT_CAPABILITY" }, + { WS_NL80211_ATTR_SCAN_FLAGS, "NL80211_ATTR_SCAN_FLAGS" }, + { WS_NL80211_ATTR_CHANNEL_WIDTH, "NL80211_ATTR_CHANNEL_WIDTH" }, + { WS_NL80211_ATTR_CENTER_FREQ1, "NL80211_ATTR_CENTER_FREQ1" }, + { WS_NL80211_ATTR_CENTER_FREQ2, "NL80211_ATTR_CENTER_FREQ2" }, + { WS_NL80211_ATTR_P2P_CTWINDOW, "NL80211_ATTR_P2P_CTWINDOW" }, + { WS_NL80211_ATTR_P2P_OPPPS, "NL80211_ATTR_P2P_OPPPS" }, + { WS_NL80211_ATTR_LOCAL_MESH_POWER_MODE, "NL80211_ATTR_LOCAL_MESH_POWER_MODE" }, + { WS_NL80211_ATTR_ACL_POLICY, "NL80211_ATTR_ACL_POLICY" }, + { WS_NL80211_ATTR_MAC_ADDRS, "NL80211_ATTR_MAC_ADDRS" }, + { WS_NL80211_ATTR_MAC_ACL_MAX, "NL80211_ATTR_MAC_ACL_MAX" }, + { WS_NL80211_ATTR_RADAR_EVENT, "NL80211_ATTR_RADAR_EVENT" }, + { WS_NL80211_ATTR_EXT_CAPA, "NL80211_ATTR_EXT_CAPA" }, + { WS_NL80211_ATTR_EXT_CAPA_MASK, "NL80211_ATTR_EXT_CAPA_MASK" }, + { WS_NL80211_ATTR_STA_CAPABILITY, "NL80211_ATTR_STA_CAPABILITY" }, + { WS_NL80211_ATTR_STA_EXT_CAPABILITY, "NL80211_ATTR_STA_EXT_CAPABILITY" }, + { WS_NL80211_ATTR_PROTOCOL_FEATURES, "NL80211_ATTR_PROTOCOL_FEATURES" }, + { WS_NL80211_ATTR_SPLIT_WIPHY_DUMP, "NL80211_ATTR_SPLIT_WIPHY_DUMP" }, + { WS_NL80211_ATTR_DISABLE_VHT, "NL80211_ATTR_DISABLE_VHT" }, + { WS_NL80211_ATTR_VHT_CAPABILITY_MASK, "NL80211_ATTR_VHT_CAPABILITY_MASK" }, + { WS_NL80211_ATTR_MDID, "NL80211_ATTR_MDID" }, + { WS_NL80211_ATTR_IE_RIC, "NL80211_ATTR_IE_RIC" }, + { WS_NL80211_ATTR_CRIT_PROT_ID, "NL80211_ATTR_CRIT_PROT_ID" }, + { WS_NL80211_ATTR_MAX_CRIT_PROT_DURATION, "NL80211_ATTR_MAX_CRIT_PROT_DURATION" }, + { WS_NL80211_ATTR_PEER_AID, "NL80211_ATTR_PEER_AID" }, + { WS_NL80211_ATTR_COALESCE_RULE, "NL80211_ATTR_COALESCE_RULE" }, + { WS_NL80211_ATTR_CH_SWITCH_COUNT, "NL80211_ATTR_CH_SWITCH_COUNT" }, + { WS_NL80211_ATTR_CH_SWITCH_BLOCK_TX, "NL80211_ATTR_CH_SWITCH_BLOCK_TX" }, + { WS_NL80211_ATTR_CSA_IES, "NL80211_ATTR_CSA_IES" }, + { WS_NL80211_ATTR_CSA_C_OFF_BEACON, "NL80211_ATTR_CSA_C_OFF_BEACON" }, + { WS_NL80211_ATTR_CSA_C_OFF_PRESP, "NL80211_ATTR_CSA_C_OFF_PRESP" }, + { WS_NL80211_ATTR_RXMGMT_FLAGS, "NL80211_ATTR_RXMGMT_FLAGS" }, + { WS_NL80211_ATTR_STA_SUPPORTED_CHANNELS, "NL80211_ATTR_STA_SUPPORTED_CHANNELS" }, + { WS_NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES, "NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES" }, + { WS_NL80211_ATTR_HANDLE_DFS, "NL80211_ATTR_HANDLE_DFS" }, + { WS_NL80211_ATTR_SUPPORT_5_MHZ, "NL80211_ATTR_SUPPORT_5_MHZ" }, + { WS_NL80211_ATTR_SUPPORT_10_MHZ, "NL80211_ATTR_SUPPORT_10_MHZ" }, + { WS_NL80211_ATTR_OPMODE_NOTIF, "NL80211_ATTR_OPMODE_NOTIF" }, + { WS_NL80211_ATTR_VENDOR_ID, "NL80211_ATTR_VENDOR_ID" }, + { WS_NL80211_ATTR_VENDOR_SUBCMD, "NL80211_ATTR_VENDOR_SUBCMD" }, + { WS_NL80211_ATTR_VENDOR_DATA, "NL80211_ATTR_VENDOR_DATA" }, + { WS_NL80211_ATTR_VENDOR_EVENTS, "NL80211_ATTR_VENDOR_EVENTS" }, + { WS_NL80211_ATTR_QOS_MAP, "NL80211_ATTR_QOS_MAP" }, + { WS_NL80211_ATTR_MAC_HINT, "NL80211_ATTR_MAC_HINT" }, + { WS_NL80211_ATTR_WIPHY_FREQ_HINT, "NL80211_ATTR_WIPHY_FREQ_HINT" }, + { WS_NL80211_ATTR_MAX_AP_ASSOC_STA, "NL80211_ATTR_MAX_AP_ASSOC_STA" }, + { WS_NL80211_ATTR_TDLS_PEER_CAPABILITY, "NL80211_ATTR_TDLS_PEER_CAPABILITY" }, + { WS_NL80211_ATTR_SOCKET_OWNER, "NL80211_ATTR_SOCKET_OWNER" }, + { WS_NL80211_ATTR_CSA_C_OFFSETS_TX, "NL80211_ATTR_CSA_C_OFFSETS_TX" }, + { WS_NL80211_ATTR_MAX_CSA_COUNTERS, "NL80211_ATTR_MAX_CSA_COUNTERS" }, + { WS_NL80211_ATTR_TDLS_INITIATOR, "NL80211_ATTR_TDLS_INITIATOR" }, + { WS_NL80211_ATTR_USE_RRM, "NL80211_ATTR_USE_RRM" }, + { WS_NL80211_ATTR_WIPHY_DYN_ACK, "NL80211_ATTR_WIPHY_DYN_ACK" }, + { WS_NL80211_ATTR_TSID, "NL80211_ATTR_TSID" }, + { WS_NL80211_ATTR_USER_PRIO, "NL80211_ATTR_USER_PRIO" }, + { WS_NL80211_ATTR_ADMITTED_TIME, "NL80211_ATTR_ADMITTED_TIME" }, + { WS_NL80211_ATTR_SMPS_MODE, "NL80211_ATTR_SMPS_MODE" }, + { WS_NL80211_ATTR_OPER_CLASS, "NL80211_ATTR_OPER_CLASS" }, + { WS_NL80211_ATTR_MAC_MASK, "NL80211_ATTR_MAC_MASK" }, + { WS_NL80211_ATTR_WIPHY_SELF_MANAGED_REG, "NL80211_ATTR_WIPHY_SELF_MANAGED_REG" }, + { WS_NL80211_ATTR_EXT_FEATURES, "NL80211_ATTR_EXT_FEATURES" }, + { WS_NL80211_ATTR_SURVEY_RADIO_STATS, "NL80211_ATTR_SURVEY_RADIO_STATS" }, + { WS_NL80211_ATTR_NETNS_FD, "NL80211_ATTR_NETNS_FD" }, + { WS_NL80211_ATTR_SCHED_SCAN_DELAY, "NL80211_ATTR_SCHED_SCAN_DELAY" }, + { WS_NL80211_ATTR_REG_INDOOR, "NL80211_ATTR_REG_INDOOR" }, + { WS_NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, "NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS" }, + { WS_NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, "NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL" }, + { WS_NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, "NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS" }, + { WS_NL80211_ATTR_SCHED_SCAN_PLANS, "NL80211_ATTR_SCHED_SCAN_PLANS" }, + { WS_NL80211_ATTR_PBSS, "NL80211_ATTR_PBSS" }, + { WS_NL80211_ATTR_BSS_SELECT, "NL80211_ATTR_BSS_SELECT" }, + { WS_NL80211_ATTR_STA_SUPPORT_P2P_PS, "NL80211_ATTR_STA_SUPPORT_P2P_PS" }, + { WS_NL80211_ATTR_PAD, "NL80211_ATTR_PAD" }, + { WS_NL80211_ATTR_IFTYPE_EXT_CAPA, "NL80211_ATTR_IFTYPE_EXT_CAPA" }, + { WS_NL80211_ATTR_MU_MIMO_GROUP_DATA, "NL80211_ATTR_MU_MIMO_GROUP_DATA" }, + { WS_NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR, "NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR" }, + { WS_NL80211_ATTR_SCAN_START_TIME_TSF, "NL80211_ATTR_SCAN_START_TIME_TSF" }, + { WS_NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, "NL80211_ATTR_SCAN_START_TIME_TSF_BSSID" }, + { WS_NL80211_ATTR_MEASUREMENT_DURATION, "NL80211_ATTR_MEASUREMENT_DURATION" }, + { WS_NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY, "NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY" }, + { WS_NL80211_ATTR_MESH_PEER_AID, "NL80211_ATTR_MESH_PEER_AID" }, + { WS_NL80211_ATTR_NAN_MASTER_PREF, "NL80211_ATTR_NAN_MASTER_PREF" }, + { WS_NL80211_ATTR_BANDS, "NL80211_ATTR_BANDS" }, + { WS_NL80211_ATTR_NAN_FUNC, "NL80211_ATTR_NAN_FUNC" }, + { WS_NL80211_ATTR_NAN_MATCH, "NL80211_ATTR_NAN_MATCH" }, + { WS_NL80211_ATTR_FILS_KEK, "NL80211_ATTR_FILS_KEK" }, + { WS_NL80211_ATTR_FILS_NONCES, "NL80211_ATTR_FILS_NONCES" }, + { WS_NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED, "NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED" }, + { WS_NL80211_ATTR_BSSID, "NL80211_ATTR_BSSID" }, + { WS_NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, "NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI" }, + { WS_NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, "NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST" }, + { WS_NL80211_ATTR_TIMEOUT_REASON, "NL80211_ATTR_TIMEOUT_REASON" }, + { 0, NULL } +}; +static value_string_ext ws_nl80211_attrs_vals_ext = VALUE_STRING_EXT_INIT(ws_nl80211_attrs_vals); +/* }}} */ + + +static int proto_netlink_nl80211; + +static dissector_handle_t netlink_nl80211_handle; + +static header_field_info *hfi_netlink_nl80211 = NULL; + +#define NETLINK_NL80211_HFI_INIT HFI_INIT(proto_netlink_generic) + +static gint ett_nl80211 = -1; +static gint ett_nl80211_attr = -1; + +static header_field_info hfi_nl80211_attr_type NETLINK_NL80211_HFI_INIT = + { "Attribute Type", "nl80211.attr_type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, + VALS(&ws_nl80211_attrs_vals_ext), 0x00, NULL, HFILL }; + +static header_field_info hfi_nl80211_attr_value NETLINK_NL80211_HFI_INIT = + { "Attribute Value", "nl80211.attr_value", FT_BYTES, BASE_NONE, + NULL, 0x00, NULL, HFILL }; + +static header_field_info hfi_nl80211_attr_value16 NETLINK_NL80211_HFI_INIT = + { "Attribute Value", "nl80211.attr_value16", FT_UINT16, BASE_HEX_DEC, + NULL, 0x00, NULL, HFILL }; + +static header_field_info hfi_nl80211_attr_value32 NETLINK_NL80211_HFI_INIT = + { "Attribute Value", "nl80211.attr_value32", FT_UINT32, BASE_HEX_DEC, + NULL, 0x00, NULL, HFILL }; + +static int +dissect_nl80211_attrs(tvbuff_t *tvb, void *data, proto_tree *tree, int nla_type, int offset, int len) +{ + enum ws_nl80211_commands type = (enum ws_nl80211_commands) nla_type; + genl_info_t *genl_info = (genl_info_t *)data; + + switch (type) { + /* TODO add more fields here? */ + default: + /* + * No specific dissection available, apply arbitrary heuristics to + * determine whether we have an u16 or u32 field and treat others as + * opaque bytes. + */ + if (len) { + if (len == 2) { + proto_tree_add_item(tree, &hfi_nl80211_attr_value16, tvb, offset, len, genl_info->encoding); + } else if (len == 4) { + proto_tree_add_item(tree, &hfi_nl80211_attr_value32, tvb, offset, len, genl_info->encoding); + } else { + proto_tree_add_item(tree, &hfi_nl80211_attr_value, tvb, offset, len, genl_info->encoding); + } + offset += len; + } + break; + } + + return offset; +} + + +static header_field_info hfi_nl80211_cmd NETLINK_NL80211_HFI_INIT = + { "Command", "nl80211.cmd", FT_UINT8, BASE_DEC | BASE_EXT_STRING, + &ws_nl80211_commands_vals_ext, 0x00, "Generic Netlink command", HFILL }; + +static int +dissect_netlink_nl80211(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +{ + genl_info_t *genl_info = (genl_info_t *)data; + proto_tree *nlmsg_tree; + proto_item *pi; + int offset; + + DISSECTOR_ASSERT(genl_info); + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "nl80211"); + col_clear(pinfo->cinfo, COL_INFO); + + offset = dissect_genl_header(tvb, genl_info, &hfi_nl80211_cmd); + + pi = proto_tree_add_item(tree, proto_registrar_get_nth(proto_netlink_nl80211), tvb, offset, -1, ENC_NA); + nlmsg_tree = proto_item_add_subtree(pi, ett_nl80211); + + offset = dissect_netlink_attributes(tvb, &hfi_nl80211_attr_type, ett_nl80211_attr, genl_info, genl_info->data, nlmsg_tree, offset, -1, dissect_nl80211_attrs); + + return offset; +} + +void +proto_register_netlink_nl80211(void) +{ +#ifndef HAVE_HFI_SECTION_INIT + static header_field_info *hfi[] = { + &hfi_nl80211_cmd, + &hfi_nl80211_attr_type, + &hfi_nl80211_attr_value, + &hfi_nl80211_attr_value16, + &hfi_nl80211_attr_value32, + }; +#endif + + static gint *ett[] = { + &ett_nl80211, + &ett_nl80211_attr, + }; + + proto_netlink_nl80211 = proto_register_protocol("Linux 802.11 Netlink", "nl80211", "nl80211"); + hfi_netlink_nl80211 = proto_registrar_get_nth(proto_netlink_nl80211); + + proto_register_fields(proto_netlink_nl80211, hfi, array_length(hfi)); + proto_register_subtree_array(ett, array_length(ett)); + + netlink_nl80211_handle = create_dissector_handle(dissect_netlink_nl80211, proto_netlink_nl80211); +} + +void +proto_reg_handoff_netlink_nl80211(void) +{ + dissector_add_string("genl.family", "nl80211", netlink_nl80211_handle); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ diff --git a/epan/dissectors/packet-netlink.c b/epan/dissectors/packet-netlink.c index 22cedaa68d..f2a496134e 100644 --- a/epan/dissectors/packet-netlink.c +++ b/epan/dissectors/packet-netlink.c @@ -294,7 +294,13 @@ dissect_netlink_attributes_common(tvbuff_t *tvb, header_field_info *hfi_type, in if (hfi_type->strings) { /* XXX, export hf_try_val_to_str */ - const char *rta_str = try_val_to_str(type, (const value_string *) hfi_type->strings); + const char *rta_str; + + if (hfi_type->display & BASE_EXT_STRING) { + rta_str = try_val_to_str_ext(type, (value_string_ext *)hfi_type->strings); + } else { + rta_str = try_val_to_str(type, (const value_string *) hfi_type->strings); + } if (rta_str) { proto_item_append_text(type_item, ", %s (%d)", rta_str, type); diff --git a/tools/generate-nl80211-fields.py b/tools/generate-nl80211-fields.py new file mode 100755 index 0000000000..24b21b7d17 --- /dev/null +++ b/tools/generate-nl80211-fields.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python +# Parses the nl80211.h interface and generate appropriate enums and fields +# (value_string) for packet-netlink-nl80211.c +# +# Copyright (c) 2017, Peter Wu +# +# Wireshark - Network traffic analyzer +# By Gerald Combs +# Copyright 1998 Gerald Combs +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# +# To update the dissector source file, run this from the source directory: +# +# python tools/generate-nl80211-fields.py --update +# + +import argparse +import re +import requests +import sys + +# Begin of comment, followed by the actual array definition +HEADER = "/* Definitions from linux/nl80211.h {{{ */\n" +FOOTER = "/* }}} */\n" +# Enums to extract from the header file +EXPORT_ENUMS = ("nl80211_commands", "nl80211_attrs") +# File to be patched +SOURCE_FILE = "epan/dissectors/packet-netlink-nl80211.c" +# URL where the latest version can be found +URL = "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/include/uapi/linux/nl80211.h" + +def make_enum(name, values, indent): + code = 'enum ws_%s {\n' % name + for value in values: + code += '%sWS_%s,\n' % (indent, value) + code += '};\n' + return code + +def make_value_string(name, values, indent): + code = 'static const value_string ws_%s_vals[] = {\n' % name + align = 40 + for value in values: + code += indent + ('{ WS_%s,' % value).ljust(align - 1) + ' ' + code += '"%s" },\n' % value + code += '%s{ 0, NULL }\n' % indent + code += '};\n' + code += 'static value_string_ext ws_%s_vals_ext =' % name + code += ' VALUE_STRING_EXT_INIT(ws_%s_vals);\n' % name + return code + +class EnumStore(object): + def __init__(self, name): + self.name = name + self.values = [] + self.active = True + + def update(self, line): + if not self.active: + return + + # Skip comments and remove trailing comma + line = re.sub(r'\s*/\*.*?\*/\s*', '', line).rstrip(",") + if not line: + return + + # Try to match a name. Allow aliases only for the previous item. + m = re.match(r'^(?P\w+)(?: *= *(?P\w+))?$', line) + assert m, "Failed to find match in %r" % line + name, alias_of = m.groups() + if alias_of: + # Alias must match previous item, skip it otherwise. + assert alias_of == self.values[-1] + elif name.startswith("__"): + # Skip after hitting "__NL80211_CMD_AFTER_LAST" + self.active = False + else: + self.values.append(name) + + def finish(self): + assert not self.active + assert self.values + return self.name, self.values + +def parse_header(f): + enum_store = None + enums = [] + for line in f: + line = line.strip() + if line.startswith("enum "): + assert not enum_store + enum_keyword, enum_name, trailer = line.split() + assert trailer == "{" + if enum_name in EXPORT_ENUMS: + enum_store = EnumStore(enum_name) + elif enum_store: + if line == "};": + enums.append(enum_store.finish()) + enum_store = None + elif line: + enum_store.update(line) + return enums + +def parse_source(): + """ + Reads the source file and tries to split it in the parts before, inside and + after the block. + """ + begin, block, end = '', '', '' + # Stages: 1 (before block), 2 (in block, skip), 3 (after block) + stage = 1 + with open(SOURCE_FILE) as f: + for line in f: + if line == FOOTER and stage == 2: + stage = 3 # End of block + if stage == 1: + begin += line + if line == HEADER: + stage = 2 # Begin of block + elif stage == 2: + block += line + elif stage == 3: + end += line + if stage != 3: + raise RuntimeError("Could not parse file (in stage %d)" % stage) + return begin, block, end + +parser = argparse.ArgumentParser() +parser.add_argument("--update", action="store_true", + help="Update %s as needed instead of writing to stdout" % SOURCE_FILE) +parser.add_argument("--indent", default=" " * 4, + help="indentation (use \\t for tabs, default 4 spaces)") +parser.add_argument("header_file", nargs="?", default=URL, + help="nl80211.h header file (use - for stdin or a HTTP(S) URL, " + "default %(default)s)") + +def main(): + args = parser.parse_args() + + indent = args.indent.replace("\\t", "\t") + + if any(args.header_file.startswith(proto) for proto in ('http:', 'https')): + r = requests.get(args.header_file) + r.raise_for_status() + enums = parse_header(r.text.splitlines()) + elif args.header_file == "-": + enums = parse_header(sys.stdin) + else: + with open(args.header_file) as f: + enums = parse_header(f) + + assert len(enums) == len(EXPORT_ENUMS), \ + "Could not parse data, found %d/%d results" % \ + (len(enums), len(EXPORT_ENUMS)) + + code_enums, code_vals = '', '' + for enum_name, enum_values in enums: + code_enums += make_enum(enum_name, enum_values, indent) + '\n' + code_vals += make_value_string(enum_name, enum_values, indent) + '\n' + + code = code_enums + code_vals + code = code.rstrip("\n") + "\n" + + if args.update: + begin, block, end = parse_source() + if block == code: + print("File is up-to-date") + else: + with open(SOURCE_FILE, "w") as f: + f.write(begin) + f.write(code) + f.write(end) + print("Updated %s" % SOURCE_FILE) + else: + print(code) + +if __name__ == '__main__': + main() + +# +# Editor modelines - https://www.wireshark.org/tools/modelines.html +# +# Local variables: +# c-basic-offset: 4 +# tab-width: 8 +# indent-tabs-mode: nil +# End: +# +# vi: set shiftwidth=4 tabstop=8 expandtab: +# :indentSize=4:tabSize=8:noTabs=true: +# -- cgit v1.2.3