Print basic wireless interface attributes

Signed-off-by: Vadim Kochan <[email protected]>
---
 nl80211.h     | 398 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 proto_nlmsg.c | 107 +++++++++++++++-
 2 files changed, 500 insertions(+), 5 deletions(-)

diff --git a/nl80211.h b/nl80211.h
index ce91d56..a31427b 100644
--- a/nl80211.h
+++ b/nl80211.h
@@ -193,4 +193,402 @@ enum nl80211_commands {
        NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
 };
 
+enum nl80211_attrs {
+/* don't change the order or add anything between, this is ABI! */
+       NL80211_ATTR_UNSPEC,
+
+       NL80211_ATTR_WIPHY,
+       NL80211_ATTR_WIPHY_NAME,
+
+       NL80211_ATTR_IFINDEX,
+       NL80211_ATTR_IFNAME,
+       NL80211_ATTR_IFTYPE,
+
+       NL80211_ATTR_MAC,
+
+       NL80211_ATTR_KEY_DATA,
+       NL80211_ATTR_KEY_IDX,
+       NL80211_ATTR_KEY_CIPHER,
+       NL80211_ATTR_KEY_SEQ,
+       NL80211_ATTR_KEY_DEFAULT,
+
+       NL80211_ATTR_BEACON_INTERVAL,
+       NL80211_ATTR_DTIM_PERIOD,
+       NL80211_ATTR_BEACON_HEAD,
+       NL80211_ATTR_BEACON_TAIL,
+
+       NL80211_ATTR_STA_AID,
+       NL80211_ATTR_STA_FLAGS,
+       NL80211_ATTR_STA_LISTEN_INTERVAL,
+       NL80211_ATTR_STA_SUPPORTED_RATES,
+       NL80211_ATTR_STA_VLAN,
+       NL80211_ATTR_STA_INFO,
+
+       NL80211_ATTR_WIPHY_BANDS,
+
+       NL80211_ATTR_MNTR_FLAGS,
+
+       NL80211_ATTR_MESH_ID,
+       NL80211_ATTR_STA_PLINK_ACTION,
+       NL80211_ATTR_MPATH_NEXT_HOP,
+       NL80211_ATTR_MPATH_INFO,
+
+       NL80211_ATTR_BSS_CTS_PROT,
+       NL80211_ATTR_BSS_SHORT_PREAMBLE,
+       NL80211_ATTR_BSS_SHORT_SLOT_TIME,
+
+       NL80211_ATTR_HT_CAPABILITY,
+
+       NL80211_ATTR_SUPPORTED_IFTYPES,
+
+       NL80211_ATTR_REG_ALPHA2,
+       NL80211_ATTR_REG_RULES,
+
+       NL80211_ATTR_MESH_CONFIG,
+
+       NL80211_ATTR_BSS_BASIC_RATES,
+
+       NL80211_ATTR_WIPHY_TXQ_PARAMS,
+       NL80211_ATTR_WIPHY_FREQ,
+       NL80211_ATTR_WIPHY_CHANNEL_TYPE,
+
+       NL80211_ATTR_KEY_DEFAULT_MGMT,
+
+       NL80211_ATTR_MGMT_SUBTYPE,
+       NL80211_ATTR_IE,
+
+       NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
+
+       NL80211_ATTR_SCAN_FREQUENCIES,
+       NL80211_ATTR_SCAN_SSIDS,
+       NL80211_ATTR_GENERATION, /* replaces old SCAN_GENERATION */
+       NL80211_ATTR_BSS,
+
+       NL80211_ATTR_REG_INITIATOR,
+       NL80211_ATTR_REG_TYPE,
+
+       NL80211_ATTR_SUPPORTED_COMMANDS,
+
+       NL80211_ATTR_FRAME,
+       NL80211_ATTR_SSID,
+       NL80211_ATTR_AUTH_TYPE,
+       NL80211_ATTR_REASON_CODE,
+
+       NL80211_ATTR_KEY_TYPE,
+
+       NL80211_ATTR_MAX_SCAN_IE_LEN,
+       NL80211_ATTR_CIPHER_SUITES,
+
+       NL80211_ATTR_FREQ_BEFORE,
+       NL80211_ATTR_FREQ_AFTER,
+
+       NL80211_ATTR_FREQ_FIXED,
+
+
+       NL80211_ATTR_WIPHY_RETRY_SHORT,
+       NL80211_ATTR_WIPHY_RETRY_LONG,
+       NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
+       NL80211_ATTR_WIPHY_RTS_THRESHOLD,
+
+       NL80211_ATTR_TIMED_OUT,
+
+       NL80211_ATTR_USE_MFP,
+
+       NL80211_ATTR_STA_FLAGS2,
+
+       NL80211_ATTR_CONTROL_PORT,
+
+       NL80211_ATTR_TESTDATA,
+
+       NL80211_ATTR_PRIVACY,
+
+       NL80211_ATTR_DISCONNECTED_BY_AP,
+       NL80211_ATTR_STATUS_CODE,
+
+       NL80211_ATTR_CIPHER_SUITES_PAIRWISE,
+       NL80211_ATTR_CIPHER_SUITE_GROUP,
+       NL80211_ATTR_WPA_VERSIONS,
+       NL80211_ATTR_AKM_SUITES,
+
+       NL80211_ATTR_REQ_IE,
+       NL80211_ATTR_RESP_IE,
+
+       NL80211_ATTR_PREV_BSSID,
+
+       NL80211_ATTR_KEY,
+       NL80211_ATTR_KEYS,
+
+       NL80211_ATTR_PID,
+
+       NL80211_ATTR_4ADDR,
+
+       NL80211_ATTR_SURVEY_INFO,
+
+       NL80211_ATTR_PMKID,
+       NL80211_ATTR_MAX_NUM_PMKIDS,
+
+       NL80211_ATTR_DURATION,
+
+       NL80211_ATTR_COOKIE,
+
+       NL80211_ATTR_WIPHY_COVERAGE_CLASS,
+
+       NL80211_ATTR_TX_RATES,
+
+       NL80211_ATTR_FRAME_MATCH,
+
+       NL80211_ATTR_ACK,
+
+       NL80211_ATTR_PS_STATE,
+
+       NL80211_ATTR_CQM,
+
+       NL80211_ATTR_LOCAL_STATE_CHANGE,
+
+       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_WIPHY_ANTENNA_TX,
+       NL80211_ATTR_WIPHY_ANTENNA_RX,
+
+       NL80211_ATTR_MCAST_RATE,
+
+       NL80211_ATTR_OFFCHANNEL_TX_OK,
+
+       NL80211_ATTR_BSS_HT_OPMODE,
+
+       NL80211_ATTR_KEY_DEFAULT_TYPES,
+
+       NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
+
+       NL80211_ATTR_MESH_SETUP,
+
+       NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
+       NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
+
+       NL80211_ATTR_SUPPORT_MESH_AUTH,
+       NL80211_ATTR_STA_PLINK_STATE,
+
+       NL80211_ATTR_WOWLAN_TRIGGERS,
+       NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED,
+
+       NL80211_ATTR_SCHED_SCAN_INTERVAL,
+
+       NL80211_ATTR_INTERFACE_COMBINATIONS,
+       NL80211_ATTR_SOFTWARE_IFTYPES,
+
+       NL80211_ATTR_REKEY_DATA,
+
+       NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
+       NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
+
+       NL80211_ATTR_SCAN_SUPP_RATES,
+
+       NL80211_ATTR_HIDDEN_SSID,
+
+       NL80211_ATTR_IE_PROBE_RESP,
+       NL80211_ATTR_IE_ASSOC_RESP,
+
+       NL80211_ATTR_STA_WME,
+       NL80211_ATTR_SUPPORT_AP_UAPSD,
+
+       NL80211_ATTR_ROAM_SUPPORT,
+
+       NL80211_ATTR_SCHED_SCAN_MATCH,
+       NL80211_ATTR_MAX_MATCH_SETS,
+
+       NL80211_ATTR_PMKSA_CANDIDATE,
+
+       NL80211_ATTR_TX_NO_CCK_RATE,
+
+       NL80211_ATTR_TDLS_ACTION,
+       NL80211_ATTR_TDLS_DIALOG_TOKEN,
+       NL80211_ATTR_TDLS_OPERATION,
+       NL80211_ATTR_TDLS_SUPPORT,
+       NL80211_ATTR_TDLS_EXTERNAL_SETUP,
+
+       NL80211_ATTR_DEVICE_AP_SME,
+
+       NL80211_ATTR_DONT_WAIT_FOR_ACK,
+
+       NL80211_ATTR_FEATURE_FLAGS,
+
+       NL80211_ATTR_PROBE_RESP_OFFLOAD,
+
+       NL80211_ATTR_PROBE_RESP,
+
+       NL80211_ATTR_DFS_REGION,
+
+       NL80211_ATTR_DISABLE_HT,
+       NL80211_ATTR_HT_CAPABILITY_MASK,
+
+       NL80211_ATTR_NOACK_MAP,
+
+       NL80211_ATTR_INACTIVITY_TIMEOUT,
+
+       NL80211_ATTR_RX_SIGNAL_DBM,
+
+       NL80211_ATTR_BG_SCAN_PERIOD,
+
+       NL80211_ATTR_WDEV,
+
+       NL80211_ATTR_USER_REG_HINT_TYPE,
+
+       NL80211_ATTR_CONN_FAILED_REASON,
+
+       NL80211_ATTR_SAE_DATA,
+
+       NL80211_ATTR_VHT_CAPABILITY,
+
+       NL80211_ATTR_SCAN_FLAGS,
+
+       NL80211_ATTR_CHANNEL_WIDTH,
+       NL80211_ATTR_CENTER_FREQ1,
+       NL80211_ATTR_CENTER_FREQ2,
+
+       NL80211_ATTR_P2P_CTWINDOW,
+       NL80211_ATTR_P2P_OPPPS,
+
+       NL80211_ATTR_LOCAL_MESH_POWER_MODE,
+
+       NL80211_ATTR_ACL_POLICY,
+
+       NL80211_ATTR_MAC_ADDRS,
+
+       NL80211_ATTR_MAC_ACL_MAX,
+
+       NL80211_ATTR_RADAR_EVENT,
+
+       NL80211_ATTR_EXT_CAPA,
+       NL80211_ATTR_EXT_CAPA_MASK,
+
+       NL80211_ATTR_STA_CAPABILITY,
+       NL80211_ATTR_STA_EXT_CAPABILITY,
+
+       NL80211_ATTR_PROTOCOL_FEATURES,
+       NL80211_ATTR_SPLIT_WIPHY_DUMP,
+
+       NL80211_ATTR_DISABLE_VHT,
+       NL80211_ATTR_VHT_CAPABILITY_MASK,
+
+       NL80211_ATTR_MDID,
+       NL80211_ATTR_IE_RIC,
+
+       NL80211_ATTR_CRIT_PROT_ID,
+       NL80211_ATTR_MAX_CRIT_PROT_DURATION,
+
+       NL80211_ATTR_PEER_AID,
+
+       NL80211_ATTR_COALESCE_RULE,
+
+       NL80211_ATTR_CH_SWITCH_COUNT,
+       NL80211_ATTR_CH_SWITCH_BLOCK_TX,
+       NL80211_ATTR_CSA_IES,
+       NL80211_ATTR_CSA_C_OFF_BEACON,
+       NL80211_ATTR_CSA_C_OFF_PRESP,
+
+       NL80211_ATTR_RXMGMT_FLAGS,
+
+       NL80211_ATTR_STA_SUPPORTED_CHANNELS,
+
+       NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
+
+       NL80211_ATTR_HANDLE_DFS,
+
+       NL80211_ATTR_SUPPORT_5_MHZ,
+       NL80211_ATTR_SUPPORT_10_MHZ,
+
+       NL80211_ATTR_OPMODE_NOTIF,
+
+       NL80211_ATTR_VENDOR_ID,
+       NL80211_ATTR_VENDOR_SUBCMD,
+       NL80211_ATTR_VENDOR_DATA,
+       NL80211_ATTR_VENDOR_EVENTS,
+
+       NL80211_ATTR_QOS_MAP,
+
+       NL80211_ATTR_MAC_HINT,
+       NL80211_ATTR_WIPHY_FREQ_HINT,
+
+       NL80211_ATTR_MAX_AP_ASSOC_STA,
+
+       NL80211_ATTR_TDLS_PEER_CAPABILITY,
+
+       NL80211_ATTR_SOCKET_OWNER,
+
+       NL80211_ATTR_CSA_C_OFFSETS_TX,
+       NL80211_ATTR_MAX_CSA_COUNTERS,
+
+       NL80211_ATTR_TDLS_INITIATOR,
+
+       NL80211_ATTR_USE_RRM,
+
+       NL80211_ATTR_WIPHY_DYN_ACK,
+
+       NL80211_ATTR_TSID,
+       NL80211_ATTR_USER_PRIO,
+       NL80211_ATTR_ADMITTED_TIME,
+
+       NL80211_ATTR_SMPS_MODE,
+
+       NL80211_ATTR_OPER_CLASS,
+
+       NL80211_ATTR_MAC_MASK,
+
+       NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
+
+       NL80211_ATTR_EXT_FEATURES,
+
+       NL80211_ATTR_SURVEY_RADIO_STATS,
+
+       NL80211_ATTR_NETNS_FD,
+
+       NL80211_ATTR_SCHED_SCAN_DELAY,
+
+       NL80211_ATTR_REG_INDOOR,
+
+       /* add attributes here, update the policy in nl80211.c */
+
+       __NL80211_ATTR_AFTER_LAST,
+       NUM_NL80211_ATTR = __NL80211_ATTR_AFTER_LAST,
+       NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
+};
+
+enum nl80211_iftype {
+       NL80211_IFTYPE_UNSPECIFIED,
+       NL80211_IFTYPE_ADHOC,
+       NL80211_IFTYPE_STATION,
+       NL80211_IFTYPE_AP,
+       NL80211_IFTYPE_AP_VLAN,
+       NL80211_IFTYPE_WDS,
+       NL80211_IFTYPE_MONITOR,
+       NL80211_IFTYPE_MESH_POINT,
+       NL80211_IFTYPE_P2P_CLIENT,
+       NL80211_IFTYPE_P2P_GO,
+       NL80211_IFTYPE_P2P_DEVICE,
+       NL80211_IFTYPE_OCB,
+
+       /* keep last */
+       NUM_NL80211_IFTYPES,
+       NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
+};
+
+enum nl80211_channel_type {
+       NL80211_CHAN_NO_HT,
+       NL80211_CHAN_HT20,
+       NL80211_CHAN_HT40MINUS,
+       NL80211_CHAN_HT40PLUS
+};
+
 #endif /* NL80211_I_H */
diff --git a/proto_nlmsg.c b/proto_nlmsg.c
index 08378bb..1fb42c4 100644
--- a/proto_nlmsg.c
+++ b/proto_nlmsg.c
@@ -61,6 +61,7 @@
 #define NLA_UINT8(attr) (*(uint8_t *)NLA_DATA(attr))
 #define NLA_UINT16(attr) (*(uint16_t *)NLA_DATA(attr))
 #define NLA_UINT32(attr) (*(uint32_t *)NLA_DATA(attr))
+#define NLA_UINT64(attr) (*(uint64_t *)NLA_DATA(attr))
 #define NLA_STR(attr) ((char *)NLA_DATA(attr))
 
 #ifndef GEN_NLA
@@ -1090,6 +1091,102 @@ static void genl_print_ctrl_attrs(struct nlmsghdr *hdr)
        }
 }
 
+static const char *nl80211_if_type2str(uint32_t type)
+{
+       switch (type) {
+       case NL80211_IFTYPE_UNSPECIFIED: return "unspec";
+       case NL80211_IFTYPE_ADHOC: return "ad-hoc";
+       case NL80211_IFTYPE_STATION: return "station";
+       case NL80211_IFTYPE_AP: return "ap";
+       case NL80211_IFTYPE_AP_VLAN: return "ap vlan";
+       case NL80211_IFTYPE_WDS: return "wds";
+       case NL80211_IFTYPE_MONITOR: return "monitor";
+       case NL80211_IFTYPE_MESH_POINT: return "mesh point";
+       case NL80211_IFTYPE_P2P_CLIENT: return "p2p client";
+       case NL80211_IFTYPE_P2P_GO: return "p2p go";
+       case NL80211_IFTYPE_P2P_DEVICE: return "p2p device";
+       case NL80211_IFTYPE_OCB: return "ocb";
+       default: return "unknown";
+       }
+}
+
+static const char *nl80211_chan_type2str(uint32_t type)
+{
+       switch (type) {
+       case NL80211_CHAN_NO_HT: return "no ht";
+       case NL80211_CHAN_HT20: return "20 ht";
+       case NL80211_CHAN_HT40MINUS: return "-40 ht";
+       case NL80211_CHAN_HT40PLUS: return "+40 ht";
+       default: return "unknown";
+       }
+}
+
+static void genl_print_nl80211_attrs(struct nlmsghdr *hdr)
+{
+       struct genlmsghdr *genl = NLMSG_DATA(hdr);
+       struct nlattr *attr = GEN_NLA(genl);
+       uint32_t attrs_len = NLMSG_PAYLOAD(hdr, sizeof(struct genlmsghdr));
+       char str[40];
+
+       for (; NLA_OK(attr, attrs_len); attr = NLA_NEXT(attr, attrs_len)) {
+               switch (attr->nla_type) {
+               case NL80211_ATTR_UNSPEC:
+                       nla_fmt(attr, "Unspecified");
+                       break;
+               case NL80211_ATTR_WIPHY:
+                       nla_fmt(attr, "Phy id %u", NLA_UINT32(attr));
+                       break;
+               case NL80211_ATTR_WIPHY_NAME:
+                       nla_fmt(attr, "Phy name %s", NLA_STR(attr));
+                       break;
+               case NL80211_ATTR_IFINDEX:
+                       nla_fmt(attr, "Index %u", NLA_UINT32(attr));
+                       break;
+               case NL80211_ATTR_IFNAME:
+                       nla_fmt(attr, "Name %s", NLA_STR(attr));
+                       break;
+               case NL80211_ATTR_IFTYPE:
+                       nla_fmt(attr, "Type %u (%s%s%s)", NLA_UINT32(attr),
+                               colorize_start(bold),
+                               nl80211_if_type2str(NLA_UINT32(attr)),
+                               colorize_end());
+                       break;
+               case NL80211_ATTR_MAC:
+                       nla_fmt(attr, "MAC %s",
+                               device_addr2str(NLA_DATA(attr),
+                               NLA_LEN(attr), 0, str, sizeof(str)));
+                       break;
+               case NL80211_ATTR_WDEV:
+                       nla_fmt(attr, "Wireless device id %lu", 
NLA_UINT64(attr));
+                       break;
+               case NL80211_ATTR_WIPHY_FREQ:
+                       nla_fmt(attr, "Phy freq %u", NLA_UINT32(attr));
+                       break;
+               case NL80211_ATTR_WIPHY_CHANNEL_TYPE:
+                       nla_fmt(attr, "Channel type %u (%s%s%s)", 
NLA_UINT32(attr),
+                               colorize_start(bold),
+                               nl80211_chan_type2str(NLA_UINT32(attr)),
+                               colorize_end());
+                       break;
+               case NL80211_ATTR_CHANNEL_WIDTH:
+                       nla_fmt(attr, "Channel width %u", NLA_UINT32(attr));
+                       break;
+               case NL80211_ATTR_CENTER_FREQ1:
+                       nla_fmt(attr, "Center freq1 %u", NLA_UINT32(attr));
+                       break;
+               case NL80211_ATTR_CENTER_FREQ2:
+                       nla_fmt(attr, "Center freq2 %u", NLA_UINT32(attr));
+                       break;
+               case NL80211_ATTR_WIPHY_TX_POWER_LEVEL:
+                       nla_fmt(attr, "Tx power level %u mBm", 
NLA_UINT32(attr));
+                       break;
+               default:
+                       nla_fmt(attr, "0x%x", attr->nla_type);
+                       break;
+               }
+       }
+}
+
 static enum genl_family_t genl_family_type_get(uint16_t type)
 {
        struct genl_family *fam;
@@ -1126,12 +1223,12 @@ static void genl_msg_print(struct nlmsghdr *hdr)
        tprintf(", Reserved %u", genl->reserved);
        tprintf(" ]\n");
 
-       if (type == GENL_FAMILY_CTRL) {
+       if (type == GENL_FAMILY_CTRL)
                genl_print_ctrl_attrs(hdr);
-               return;
-       }
-
-       print_raw((uint8_t *)genl + NLMSG_ALIGN(sizeof(*genl)), payload_len);
+       else if (type == GENL_FAMILY_NL80211)
+               genl_print_nl80211_attrs(hdr);
+       else
+               print_raw((uint8_t *)genl + NLMSG_ALIGN(sizeof(*genl)), 
payload_len);
 }
 
 static bool nlmsg_skip(struct nlmsghdr *hdr)
-- 
2.6.2

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to