Print command name for nl80211 family.

Added local nl80211.h header to keep types/definitions
from original Linux nl80211.h header, so it allows
to compile netsniff-ng for the older Linux versions where these
types/definitions does not exist.

Signed-off-by: Vadim Kochan <[email protected]>
---
 nl80211.h     | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 proto_nlmsg.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 362 insertions(+), 6 deletions(-)
 create mode 100644 nl80211.h

diff --git a/nl80211.h b/nl80211.h
new file mode 100644
index 0000000..ce91d56
--- /dev/null
+++ b/nl80211.h
@@ -0,0 +1,196 @@
+#ifndef NL80211_I_H
+#define NL80211_I_H
+
+/* Used types/definitions from Linux nl80211.h file */
+
+enum nl80211_commands {
+/* don't change the order or add anything between, this is ABI! */
+       NL80211_CMD_UNSPEC,
+
+       NL80211_CMD_GET_WIPHY,          /* can dump */
+       NL80211_CMD_SET_WIPHY,
+       NL80211_CMD_NEW_WIPHY,
+       NL80211_CMD_DEL_WIPHY,
+
+       NL80211_CMD_GET_INTERFACE,      /* can dump */
+       NL80211_CMD_SET_INTERFACE,
+       NL80211_CMD_NEW_INTERFACE,
+       NL80211_CMD_DEL_INTERFACE,
+
+       NL80211_CMD_GET_KEY,
+       NL80211_CMD_SET_KEY,
+       NL80211_CMD_NEW_KEY,
+       NL80211_CMD_DEL_KEY,
+
+       NL80211_CMD_GET_BEACON,
+       NL80211_CMD_SET_BEACON,
+       NL80211_CMD_START_AP,
+       NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP,
+       NL80211_CMD_STOP_AP,
+       NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP,
+
+       NL80211_CMD_GET_STATION,
+       NL80211_CMD_SET_STATION,
+       NL80211_CMD_NEW_STATION,
+       NL80211_CMD_DEL_STATION,
+
+       NL80211_CMD_GET_MPATH,
+       NL80211_CMD_SET_MPATH,
+       NL80211_CMD_NEW_MPATH,
+       NL80211_CMD_DEL_MPATH,
+
+       NL80211_CMD_SET_BSS,
+
+       NL80211_CMD_SET_REG,
+       NL80211_CMD_REQ_SET_REG,
+
+       NL80211_CMD_GET_MESH_CONFIG,
+       NL80211_CMD_SET_MESH_CONFIG,
+
+       NL80211_CMD_SET_MGMT_EXTRA_IE /* reserved; not used */,
+
+       NL80211_CMD_GET_REG,
+
+       NL80211_CMD_GET_SCAN,
+       NL80211_CMD_TRIGGER_SCAN,
+       NL80211_CMD_NEW_SCAN_RESULTS,
+       NL80211_CMD_SCAN_ABORTED,
+
+       NL80211_CMD_REG_CHANGE,
+
+       NL80211_CMD_AUTHENTICATE,
+       NL80211_CMD_ASSOCIATE,
+       NL80211_CMD_DEAUTHENTICATE,
+       NL80211_CMD_DISASSOCIATE,
+
+       NL80211_CMD_MICHAEL_MIC_FAILURE,
+
+       NL80211_CMD_REG_BEACON_HINT,
+
+       NL80211_CMD_JOIN_IBSS,
+       NL80211_CMD_LEAVE_IBSS,
+
+       NL80211_CMD_TESTMODE,
+
+       NL80211_CMD_CONNECT,
+       NL80211_CMD_ROAM,
+       NL80211_CMD_DISCONNECT,
+
+       NL80211_CMD_SET_WIPHY_NETNS,
+
+       NL80211_CMD_GET_SURVEY,
+       NL80211_CMD_NEW_SURVEY_RESULTS,
+
+       NL80211_CMD_SET_PMKSA,
+       NL80211_CMD_DEL_PMKSA,
+       NL80211_CMD_FLUSH_PMKSA,
+
+       NL80211_CMD_REMAIN_ON_CHANNEL,
+       NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
+
+       NL80211_CMD_SET_TX_BITRATE_MASK,
+
+       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,
+
+       NL80211_CMD_SET_CQM,
+       NL80211_CMD_NOTIFY_CQM,
+
+       NL80211_CMD_SET_CHANNEL,
+       NL80211_CMD_SET_WDS_PEER,
+
+       NL80211_CMD_FRAME_WAIT_CANCEL,
+
+       NL80211_CMD_JOIN_MESH,
+       NL80211_CMD_LEAVE_MESH,
+
+       NL80211_CMD_UNPROT_DEAUTHENTICATE,
+       NL80211_CMD_UNPROT_DISASSOCIATE,
+
+       NL80211_CMD_NEW_PEER_CANDIDATE,
+
+       NL80211_CMD_GET_WOWLAN,
+       NL80211_CMD_SET_WOWLAN,
+
+       NL80211_CMD_START_SCHED_SCAN,
+       NL80211_CMD_STOP_SCHED_SCAN,
+       NL80211_CMD_SCHED_SCAN_RESULTS,
+       NL80211_CMD_SCHED_SCAN_STOPPED,
+
+       NL80211_CMD_SET_REKEY_OFFLOAD,
+
+       NL80211_CMD_PMKSA_CANDIDATE,
+
+       NL80211_CMD_TDLS_OPER,
+       NL80211_CMD_TDLS_MGMT,
+
+       NL80211_CMD_UNEXPECTED_FRAME,
+
+       NL80211_CMD_PROBE_CLIENT,
+
+       NL80211_CMD_REGISTER_BEACONS,
+
+       NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
+
+       NL80211_CMD_SET_NOACK_MAP,
+
+       NL80211_CMD_CH_SWITCH_NOTIFY,
+
+       NL80211_CMD_START_P2P_DEVICE,
+       NL80211_CMD_STOP_P2P_DEVICE,
+
+       NL80211_CMD_CONN_FAILED,
+
+       NL80211_CMD_SET_MCAST_RATE,
+
+       NL80211_CMD_SET_MAC_ACL,
+
+       NL80211_CMD_RADAR_DETECT,
+
+       NL80211_CMD_GET_PROTOCOL_FEATURES,
+
+       NL80211_CMD_UPDATE_FT_IES,
+       NL80211_CMD_FT_EVENT,
+
+       NL80211_CMD_CRIT_PROTOCOL_START,
+       NL80211_CMD_CRIT_PROTOCOL_STOP,
+
+       NL80211_CMD_GET_COALESCE,
+       NL80211_CMD_SET_COALESCE,
+
+       NL80211_CMD_CHANNEL_SWITCH,
+
+       NL80211_CMD_VENDOR,
+
+       NL80211_CMD_SET_QOS_MAP,
+
+       NL80211_CMD_ADD_TX_TS,
+       NL80211_CMD_DEL_TX_TS,
+
+       NL80211_CMD_GET_MPP,
+
+       NL80211_CMD_JOIN_OCB,
+       NL80211_CMD_LEAVE_OCB,
+
+       NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
+
+       NL80211_CMD_TDLS_CHANNEL_SWITCH,
+       NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
+
+       NL80211_CMD_WIPHY_REG_CHANGE,
+
+       /* add new commands above here */
+
+       /* used to define NL80211_CMD_MAX below */
+       __NL80211_CMD_AFTER_LAST,
+       NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
+};
+
+#endif /* NL80211_I_H */
diff --git a/proto_nlmsg.c b/proto_nlmsg.c
index 52ed138..08378bb 100644
--- a/proto_nlmsg.c
+++ b/proto_nlmsg.c
@@ -23,6 +23,7 @@
 #include "proto.h"
 #include "protos.h"
 #include "timer.h"
+#include "nl80211.h"
 
 #define INFINITY 0xFFFFFFFFU
 
@@ -100,6 +101,12 @@
 static struct nl_cache *genl_af_cache;
 static struct nl_sock *genl_sock;
 
+enum genl_family_t {
+       GENL_FAMILY_UNSPEC,
+       GENL_FAMILY_CTRL,
+       GENL_FAMILY_NL80211,
+};
+
 struct flag_name {
        const char *name;
        unsigned int flag;
@@ -824,11 +831,8 @@ static void rtnl_msg_print(struct nlmsghdr *hdr)
        }
 }
 
-static const char *genl_cmd2str(uint16_t type, uint8_t cmd)
+static const char *genl_ctrl_cmd2str(uint8_t cmd)
 {
-       if (type != GENL_ID_CTRL)
-               return "Unknown";
-
        switch (cmd) {
        case CTRL_CMD_UNSPEC: return "unspec";
        case CTRL_CMD_NEWFAMILY: return "new family";
@@ -845,6 +849,139 @@ static const char *genl_cmd2str(uint16_t type, uint8_t 
cmd)
        }
 }
 
+static const char *nl80211_cmd2str(uint8_t cmd)
+{
+       switch (cmd) {
+       case NL80211_CMD_UNSPEC: return "unspec";
+       case NL80211_CMD_GET_WIPHY: return "get wiphy";
+       case NL80211_CMD_SET_WIPHY: return "set wiphy";
+       case NL80211_CMD_NEW_WIPHY: return "new wiphy";
+       case NL80211_CMD_DEL_WIPHY: return "del wiphy";
+       case NL80211_CMD_GET_INTERFACE: return "get interface";
+       case NL80211_CMD_SET_INTERFACE: return "set interface";
+       case NL80211_CMD_NEW_INTERFACE: return "new interface";
+       case NL80211_CMD_DEL_INTERFACE: return "del interface";
+       case NL80211_CMD_GET_KEY:  return "get key";
+       case NL80211_CMD_SET_KEY: return "set key";
+       case NL80211_CMD_NEW_KEY: return "new key";
+       case NL80211_CMD_DEL_KEY: return "del key";
+       case NL80211_CMD_GET_BEACON: return "get beacon";
+       case NL80211_CMD_SET_BEACON: return "set beacon";
+       case NL80211_CMD_START_AP: return "start ap";
+       case NL80211_CMD_STOP_AP: return "stop ap";
+       case NL80211_CMD_GET_STATION: return "get station";
+       case NL80211_CMD_SET_STATION: return "set station";
+       case NL80211_CMD_NEW_STATION: return "new station";
+       case NL80211_CMD_DEL_STATION: return "del station";
+       case NL80211_CMD_GET_MPATH: return "get mesh path";
+       case NL80211_CMD_SET_MPATH: return "set mesh path";
+       case NL80211_CMD_NEW_MPATH: return "new mesh path";
+       case NL80211_CMD_DEL_MPATH: return "del mesh path";
+       case NL80211_CMD_SET_BSS: return "set bss";
+       case NL80211_CMD_SET_REG: return "set regdom";
+       case NL80211_CMD_REQ_SET_REG: return "regdom request";
+       case NL80211_CMD_GET_MESH_CONFIG: return "get mesh config";
+       case NL80211_CMD_SET_MESH_CONFIG: return "set mesh config";
+       case NL80211_CMD_SET_MGMT_EXTRA_IE: return "set mgmt extra IE";
+       case NL80211_CMD_GET_REG: return "get regdom";
+       case NL80211_CMD_GET_SCAN: return "get scan";
+       case NL80211_CMD_TRIGGER_SCAN: return "trigger scan";
+       case NL80211_CMD_NEW_SCAN_RESULTS: return "new scan results";
+       case NL80211_CMD_SCAN_ABORTED: return "abort scan";
+       case NL80211_CMD_REG_CHANGE: return "regdom changed";
+       case NL80211_CMD_AUTHENTICATE: return "authenticate";
+       case NL80211_CMD_ASSOCIATE: return "associate";
+       case NL80211_CMD_DEAUTHENTICATE: return "deauthenticate";
+       case NL80211_CMD_DISASSOCIATE: return "disassociate";
+       case NL80211_CMD_MICHAEL_MIC_FAILURE: return "michael mic failure";
+       case NL80211_CMD_REG_BEACON_HINT: return "regulatory beacon hint";
+       case NL80211_CMD_JOIN_IBSS: return "join ibss";
+       case NL80211_CMD_LEAVE_IBSS: return "leave ibss";
+       case NL80211_CMD_TESTMODE: return "test mode";
+       case NL80211_CMD_CONNECT: return "connect";
+       case NL80211_CMD_ROAM: return "roam card request";
+       case NL80211_CMD_DISCONNECT: return "disconnect";
+       case NL80211_CMD_SET_WIPHY_NETNS: return "set wiphy netns";
+       case NL80211_CMD_GET_SURVEY: return "get survey";
+       case NL80211_CMD_NEW_SURVEY_RESULTS: return "new survey results";
+       case NL80211_CMD_SET_PMKSA: return "add pmksa entry";
+       case NL80211_CMD_DEL_PMKSA: return "del pmksa entry";
+       case NL80211_CMD_FLUSH_PMKSA: return "flush all pmksa entries";
+       case NL80211_CMD_REMAIN_ON_CHANNEL: return "remain awake on channel";
+       case NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL: return "cancel remain on 
channel";
+       case NL80211_CMD_SET_TX_BITRATE_MASK: return "set tx bitrate mask";
+       case NL80211_CMD_REGISTER_FRAME: return "register mgmt frame";
+       case NL80211_CMD_FRAME: return "mgmt frame request/event";
+       case NL80211_CMD_FRAME_TX_STATUS: return "mgmt frame tx status";
+       case NL80211_CMD_SET_POWER_SAVE: return "set power save";
+       case NL80211_CMD_GET_POWER_SAVE: return "get power save";
+       case NL80211_CMD_SET_CQM: return "set cqm";
+       case NL80211_CMD_NOTIFY_CQM: return "notify cqm";
+       case NL80211_CMD_SET_CHANNEL: return "set channel";
+       case NL80211_CMD_SET_WDS_PEER: return "set wds peer";
+       case NL80211_CMD_FRAME_WAIT_CANCEL: return "frame wait cancel";
+       case NL80211_CMD_JOIN_MESH: return "join mesh";
+       case NL80211_CMD_LEAVE_MESH: return "leave mesh";
+       case NL80211_CMD_UNPROT_DEAUTHENTICATE: return "unprotected 
deauthenticate";
+       case NL80211_CMD_UNPROT_DISASSOCIATE: return "unprotected disassociate";
+       case NL80211_CMD_NEW_PEER_CANDIDATE: return "new peer candidate";
+       case NL80211_CMD_GET_WOWLAN: return "get wowlan";
+       case NL80211_CMD_SET_WOWLAN: return "set wowlan";
+       case NL80211_CMD_START_SCHED_SCAN: return "start sched scan";
+       case NL80211_CMD_STOP_SCHED_SCAN: return "stop sched scan";
+       case NL80211_CMD_SCHED_SCAN_RESULTS: return "sched scan results";
+       case NL80211_CMD_SCHED_SCAN_STOPPED: return "sched scan stopped";
+       case NL80211_CMD_SET_REKEY_OFFLOAD: return "set rekey offload";
+       case NL80211_CMD_PMKSA_CANDIDATE: return "pmksa candidate event";
+       case NL80211_CMD_TDLS_OPER: return "tdls command";
+       case NL80211_CMD_TDLS_MGMT: return "send tdls mgmt frame";
+       case NL80211_CMD_UNEXPECTED_FRAME: return "unexpected frame";
+       case NL80211_CMD_PROBE_CLIENT: return "probe client";
+       case NL80211_CMD_REGISTER_BEACONS: return "register beacons";
+       case NL80211_CMD_UNEXPECTED_4ADDR_FRAME: return "unexpecetd 4addr 
frame";
+       case NL80211_CMD_SET_NOACK_MAP: return "set noack map";
+       case NL80211_CMD_CH_SWITCH_NOTIFY: return "channel switch notify";
+       case NL80211_CMD_START_P2P_DEVICE: return "start p2p device";
+       case NL80211_CMD_STOP_P2P_DEVICE: return "stop p2p device";
+       case NL80211_CMD_CONN_FAILED: return "connection request failed";
+       case NL80211_CMD_SET_MCAST_RATE: return "set mcast rate";
+       case NL80211_CMD_SET_MAC_ACL: return "set mac acl";
+       case NL80211_CMD_RADAR_DETECT: return "radar detect";
+       case NL80211_CMD_GET_PROTOCOL_FEATURES: return "get proto features";
+       case NL80211_CMD_UPDATE_FT_IES: return "update fast-transition(FT) IE";
+       case NL80211_CMD_FT_EVENT: return "fast-transition(FT) event";
+       case NL80211_CMD_CRIT_PROTOCOL_START: return "critical proto start";
+       case NL80211_CMD_CRIT_PROTOCOL_STOP: return "critical proto stop";
+       case NL80211_CMD_GET_COALESCE: return "get coalesce";
+       case NL80211_CMD_SET_COALESCE: return "set coalesce";
+       case NL80211_CMD_CHANNEL_SWITCH: return "channel switch";
+       case NL80211_CMD_VENDOR: return "vendor command/event";
+       case NL80211_CMD_SET_QOS_MAP: return "set qos map";
+       case NL80211_CMD_ADD_TX_TS: return "add tx traffic stream";
+       case NL80211_CMD_DEL_TX_TS: return "del tx traffic stream";
+       case NL80211_CMD_GET_MPP: return "get mesh proxy path";
+       case NL80211_CMD_JOIN_OCB: return "join ocb";
+       case NL80211_CMD_LEAVE_OCB: return "leave ocb";
+       case NL80211_CMD_CH_SWITCH_STARTED_NOTIFY: return "channel switch 
started";
+       case NL80211_CMD_TDLS_CHANNEL_SWITCH: return "tdls start channel 
switch";
+       case NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH: return "tdls cancel 
channel switch";
+       case NL80211_CMD_WIPHY_REG_CHANGE: return "wiphy regdom change";
+       }
+
+       return "Unknown";
+}
+
+static const char *genl_cmd2str(enum genl_family_t type, uint8_t cmd)
+{
+       if (type == GENL_FAMILY_CTRL)
+               return genl_ctrl_cmd2str(cmd);
+
+       if (type == GENL_FAMILY_NL80211)
+               return nl80211_cmd2str(cmd);
+
+       return "Unknown";
+}
+
 static struct flag_name genl_ops_flags[] = {
        { "admin", GENL_ADMIN_PERM },
        { "doit", GENL_CMD_CAP_DO },
@@ -953,20 +1090,43 @@ static void genl_print_ctrl_attrs(struct nlmsghdr *hdr)
        }
 }
 
+static enum genl_family_t genl_family_type_get(uint16_t type)
+{
+       struct genl_family *fam;
+       char *name;
+
+       if (type == GENL_ID_CTRL)
+               return GENL_FAMILY_CTRL;
+
+       fam = genl_ctrl_search(genl_af_cache, type);
+       if (!fam)
+               return GENL_FAMILY_UNSPEC;
+
+       name = genl_family_get_name(fam);
+       if (!name)
+               return GENL_FAMILY_UNSPEC;
+
+       if (strcmp("nl80211", name) == 0)
+               return GENL_FAMILY_NL80211;
+
+       return GENL_FAMILY_UNSPEC;
+}
+
 static void genl_msg_print(struct nlmsghdr *hdr)
 {
        struct genlmsghdr *genl = NLMSG_DATA(hdr);
        uint32_t payload_len = NLMSG_PAYLOAD(hdr, sizeof(*genl));
+       enum genl_family_t type = genl_family_type_get(hdr->nlmsg_type);
 
        tprintf(" [ Cmd %u (%s%s%s)", genl->cmd,
                 colorize_start(bold),
-                genl_cmd2str(hdr->nlmsg_type, genl->cmd),
+                genl_cmd2str(type, genl->cmd),
                 colorize_end());
        tprintf(", Version %u", genl->version);
        tprintf(", Reserved %u", genl->reserved);
        tprintf(" ]\n");
 
-       if (hdr->nlmsg_type == GENL_ID_CTRL) {
+       if (type == GENL_FAMILY_CTRL) {
                genl_print_ctrl_attrs(hdr);
                return;
        }
-- 
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