diff options
| author | Subhani Shaik <subhanis@qca.qualcomm.com> | 2014-07-18 17:08:54 -0700 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com> | 2014-08-07 12:46:38 +0530 |
| commit | b1fc2f24f45783ed0dcbd27374f9542546055e34 (patch) | |
| tree | af71166f1c0aeeff09663555d900dd4560a82843 | |
| parent | 065c421650d251d9df9f6d30b82109c701fc5a86 (diff) | |
wlan: Add nan-parser support for cnss_diag.
For the NAN feature enablement, adding the support for
FW logging in the parser files.
Change-Id: I6456d71b80b44ba1239f30b46daf8dee24e36f5a
CRs-fixed: 704050
| -rw-r--r-- | tools/fwdebuglog/Android.mk | 4 | ||||
| -rw-r--r-- | tools/fwdebuglog/Makefile | 2 | ||||
| -rw-r--r-- | tools/fwdebuglog/nan-parser.c | 4577 | ||||
| -rw-r--r-- | tools/fwdebuglog/parser.c | 10 |
4 files changed, 4590 insertions, 3 deletions
diff --git a/tools/fwdebuglog/Android.mk b/tools/fwdebuglog/Android.mk index d42b7b99faa2..93e370d8d5fa 100644 --- a/tools/fwdebuglog/Android.mk +++ b/tools/fwdebuglog/Android.mk @@ -15,7 +15,7 @@ LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/common/inc \ LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../wlan/utils/asf/inc \ LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../CORE/SERVICES/COMMON LOCAL_SHARED_LIBRARIES := libc libcutils libdiag libhardware_legacy -LOCAL_SRC_FILES := cld-fwlog-netlink.c parser.c +LOCAL_SRC_FILES := cld-fwlog-netlink.c parser.c nan-parser.c LOCAL_CFLAGS += -DCONFIG_ANDROID_LOG LOCAL_CFLAGS += -DANDROID LOCAL_LDLIBS += -llog @@ -29,7 +29,7 @@ LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/common/inc \ LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../wlan/utils/asf/inc \ LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../CORE/SERVICES/COMMON LOCAL_SHARED_LIBRARIES := libc libcutils libdiag libhardware_legacy -LOCAL_SRC_FILES := cld-fwlog-netlink.c parser.c +LOCAL_SRC_FILES := cld-fwlog-netlink.c parser.c nan-parser.c LOCAL_CFLAGS += -DCONFIG_ANDROID_LOG LOCAL_CFLAGS += -DANDROID LOCAL_LDLIBS += -llog diff --git a/tools/fwdebuglog/Makefile b/tools/fwdebuglog/Makefile index d0ccb9d10714..ac1c922e1836 100644 --- a/tools/fwdebuglog/Makefile +++ b/tools/fwdebuglog/Makefile @@ -10,7 +10,7 @@ all: $(CC) -g3 -Wall \ -I ../../CORE/SERVICES/COMMON/ \ -I ../../CORE/SERVICES/HIF/ \ - cld-fwlog-netlink.c parser.c -o cld-fwlog-netlink + cld-fwlog-netlink.c parser.c nan-parser.c -o cld-fwlog-netlink $(CC) -g3 -Wall \ -I ../../CORE/SERVICES/COMMON/ \ -I ../../CORE/SERVICES/HIF/ \ diff --git a/tools/fwdebuglog/nan-parser.c b/tools/fwdebuglog/nan-parser.c new file mode 100644 index 000000000000..7a4d297380b3 --- /dev/null +++ b/tools/fwdebuglog/nan-parser.c @@ -0,0 +1,4577 @@ +/* + * Copyright (c) 2014 Qualcomm Atheros, Inc. + * All Rights Reserved. + * Qualcomm Atheros Confidential and Proprietary. + */ + +#include <stdlib.h> +#include <stdarg.h> +#include <stdio.h> +#include <signal.h> +#include <string.h> +#include <unistd.h> + +#include <athdefs.h> +#include <a_types.h> +#include "dbglog.h" +#include "dbglog_id.h" +#include "dbglog_host.h" +#include "msg.h" +#include "msgcfg.h" +#include "diag_lsm.h" +#include "log.h" + +#include "a_debug.h" +#include "ol_defines.h" +#include "ah_osdep.h" + +extern void +dbglog_printf( + A_UINT32 timestamp, + A_UINT16 vap_id, + const char *fmt, ...); + +extern void +dbglog_sm_print( + A_UINT32 timestamp, + A_UINT16 vap_id, + A_UINT16 numargs, + A_UINT32 *args, + const char *module_prefix, + const char *states[], A_UINT32 num_states, + const char *events[], A_UINT32 num_events); + +static const char * +dbglog_get_nan_role_str( + A_UINT8 nan_role); + +static const char * +dbglog_get_nan_chan_type( + A_UINT32 type); + +static const char * +dbglog_get_nan_tlv_type_str( + A_UINT16 tlv_type); + +#define MAX_DBG_MSGS 256 + +/* NAN DBGIDs */ +#define NAN_DBGID_START 0 + +/* Debug IDs for debug logs. 3 args max, not fixed. */ +#define NAN_DBGID_DBG_LOG_BASE 1 +#define NAN_DBGID_FUNC_BEGIN NAN_DBGID_DBG_LOG_BASE +#define NAN_DBGID_FUNC_END 2 +#define NAN_DBGID_MAIN_DEBUG 3 +#define NAN_DBGID_MAC_DEBUG 4 +#define NAN_DBGID_BLOOM_FILTER_DEBUG 5 +#define NAN_DBGID_MAC_ADDR 6 +#define NAN_DBGID_PARAM_UPDATED 7 +#define NAN_DBGID_NULL_PTR 8 +#define NAN_DBGID_INVALID_FUNC_ARG 9 +#define NAN_DBGID_INVALID_MSG_PARAM 10 +#define NAN_DBGID_MISSING_MSG_PARAM 11 +#define NAN_DBGID_DEPRECATED_MSG_PARAM 12 +#define NAN_DBGID_UNSUPPORTED_MSG_PARAM 13 +#define NAN_DBGID_INVALID_PKT_DATA 14 +#define NAN_DBGID_LOG_PKT_DATA 15 +#define NAN_DBGID_INVALID_VALUE 16 +#define NAN_DBGID_INVALID_OPERATION 17 +#define NAN_DBGID_INVALID_STATE 18 +#define NAN_DBGID_FUNCTION_ENABLED 19 +#define NAN_DBGID_FUNCTION_DISABLED 20 +#define NAN_DBGID_INVALID_FUNCTION_STATE 21 +#define NAN_DBGID_READ_ERROR 22 +#define NAN_DBGID_WRITE_ERROR 23 +#define NAN_DBGID_RECEIVE_ERROR 24 +#define NAN_DBGID_TRANSMIT_ERROR 25 +#define NAN_DBGID_PARSE_ERROR 26 +#define NAN_DBGID_RES_ALLOC_ERROR 27 +/* PLEASE KEEP THIS ONE AT THE END */ +#define NAN_DBGID_DBG_LOG_LAST 28 + +/* Debug IDs for event logs. */ + +#define NAN_DBGID_EVT_BASE NAN_DBGID_DBG_LOG_LAST +/* args: <none> */ +#define NAN_DBGID_NAN_ENABLED (NAN_DBGID_EVT_BASE + 0) +/* args: <none> */ +#define NAN_DBGID_NAN_DISABLED (NAN_DBGID_EVT_BASE + 1) +/* args: <none> */ +#define NAN_DBGID_CONFIG_RESTORED (NAN_DBGID_EVT_BASE + 2) +/* args: framesQueued */ +#define NAN_DBGID_SDF_QUEUED (NAN_DBGID_EVT_BASE + 3) +/* args: old, new */ +#define NAN_DBGID_TW_CHANGED (NAN_DBGID_EVT_BASE + 4) +/* args: <none> */ +#define NAN_DBGID_DW_START (NAN_DBGID_EVT_BASE + 5) +/* args: busyDiff */ +#define NAN_DBGID_DW_END (NAN_DBGID_EVT_BASE + 6) +/* args: oldClusterId, newClusterId */ +#define NAN_DBGID_CLUSTER_ID_CHANGED (NAN_DBGID_EVT_BASE + 7) +/* args: cmd, buffer, length */ +#define NAN_DBGID_WMI_CMD_RECEIVED (NAN_DBGID_EVT_BASE + 8) +/* args: pEventPkt, pEventBuf, eventSize, dataSize */ +#define NAN_DBGID_WMI_EVT_SENT (NAN_DBGID_EVT_BASE + 9) +/* args: type length, readLen */ +#define NAN_DBGID_TLV_READ (NAN_DBGID_EVT_BASE + 10) +/* args: type length, writeLen */ +#define NAN_DBGID_TLV_WRITE (NAN_DBGID_EVT_BASE + 11) +/* args: handle */ +#define NAN_DBGID_PUBSUB_UPDATED (NAN_DBGID_EVT_BASE + 12) +/* args: handle */ +#define NAN_DBGID_PUBSUB_REMOVE_DEFERRED (NAN_DBGID_EVT_BASE + 13) +/* args: handle */ +#define NAN_DBGID_PUBSUB_REMOVE_PENDING (NAN_DBGID_EVT_BASE + 14) +/* args: handle */ +#define NAN_DBGID_PUBSUB_REMOVED (NAN_DBGID_EVT_BASE + 15) +/* args: handle, status, value */ +#define NAN_DBGID_PUBSUB_PROCESSED (NAN_DBGID_EVT_BASE + 16) +/* args: handle, sid1, sid2, svcCtrl, length */ +#define NAN_DBGID_PUBSUB_MATCHED (NAN_DBGID_EVT_BASE + 17) +/* args: handle, flags */ +#define NAN_DBGID_PUBSUB_PREPARED (NAN_DBGID_EVT_BASE + 18) +/* args: handle, mac1, mac2 */ +#define NAN_DBGID_PUBSUB_FOLLOWUP_TRANSMIT (NAN_DBGID_EVT_BASE + 19) +/* args: handle, mac1, mac2 */ +#define NAN_DBGID_PUBSUB_FOLLOWUP_RECEIVED (NAN_DBGID_EVT_BASE + 20) +/* args: subscribeHandle, matchHandle, oldTimeout, newTimeout */ +#define NAN_DBGID_SUBSCRIBE_UNMATCH_TIMEOUT_UPDATE (NAN_DBGID_EVT_BASE + 21) +/* args: subscribeHandle, matchHandle, timestamp*/ +#define NAN_DBGID_SUBSCRIBE_MATCH_NEW (NAN_DBGID_EVT_BASE + 22) +/* args: subscribeHandle, matchHandle, timestamp*/ +#define NAN_DBGID_SUBSCRIBE_MATCH_REPEAT (NAN_DBGID_EVT_BASE + 23) +/* args: subscribeHandle, matchHandle, matchTimestamp, timestamp*/ +#define NAN_DBGID_SUBSCRIBE_MATCH_EXPIRED (NAN_DBGID_EVT_BASE + 24) +/* args: subscribeHandle, matchHandle, matchTimestamp, timestamp */ +#define NAN_DBGID_SUBSCRIBE_MATCH_LOG (NAN_DBGID_EVT_BASE + 25) +/* args: sid1, sid2 */ +#define NAN_DBGID_SERVICE_ID_CREATED (NAN_DBGID_EVT_BASE + 26) +/* args: size */ +#define NAN_DBGID_SD_ATTR_BUILT (NAN_DBGID_EVT_BASE + 27) +/* args: offset */ +#define NAN_DBGID_SERVICE_RSP_OFFSET (NAN_DBGID_EVT_BASE + 28) +/* args: offset */ +#define NAN_DBGID_SERVICE_INFO_OFFSET (NAN_DBGID_EVT_BASE + 29) +/* args: chan, interval, start_time */ +#define NAN_DBGID_CHREQ_CREATE (NAN_DBGID_EVT_BASE + 30) +/* args: start_time, status */ +#define NAN_DBGID_CHREQ_UPDATE (NAN_DBGID_EVT_BASE + 31) +/* args: chan, interval, status */ +#define NAN_DBGID_CHREQ_REMOVE (NAN_DBGID_EVT_BASE + 32) +/* args: type, timestamp */ +#define NAN_DBGID_CHREQ_GRANT (NAN_DBGID_EVT_BASE + 33) +/* args: type, timestamp */ +#define NAN_DBGID_CHREQ_END (NAN_DBGID_EVT_BASE + 34) +/* args: type, timestamp */ +#define NAN_DBGID_CHREQ_ERROR (NAN_DBGID_EVT_BASE + 35) +/* args: type, length, timestamp, rssi */ +#define NAN_DBGID_RX_CALLBACK (NAN_DBGID_EVT_BASE + 36) +/* args: type, handle, bufp, status, timestamp */ +#define NAN_DBGID_TX_COMPLETE (NAN_DBGID_EVT_BASE + 37) +/* args: tsf, tsf */ +#define NAN_DBGID_TSF_TIMEOUT (NAN_DBGID_EVT_BASE + 38) +/* args: clusterId, clusterStart */ +#define NAN_DBGID_SYNC_START (NAN_DBGID_EVT_BASE + 39) +/* args: clusterId */ +#define NAN_DBGID_SYNC_STOP (NAN_DBGID_EVT_BASE + 40) +/* args: enable, scanType, rval */ +#define NAN_DBGID_NAN_SCAN (NAN_DBGID_EVT_BASE + 41) +/* args: scanType */ +#define NAN_DBGID_NAN_SCAN_COMPLETE (NAN_DBGID_EVT_BASE + 42) +/* args: masterPref */ +#define NAN_DBGID_MPREF_CHANGE (NAN_DBGID_EVT_BASE + 43) +/* args: masterPref, randFactor */ +#define NAN_DBGID_WARMUP_EXPIRE (NAN_DBGID_EVT_BASE + 44) +/* args: randFactor */ +#define NAN_DBGID_RANDOM_FACTOR_EXPIRE (NAN_DBGID_EVT_BASE + 45) +/* args: tsf, tsf */ +#define NAN_DBGID_DW_SKIP (NAN_DBGID_EVT_BASE + 46) +/* args: type, tsfDiff */ +#define NAN_DBGID_DB_SKIP (NAN_DBGID_EVT_BASE + 47) +/* args: TBD */ +#define NAN_DBGID_BEACON_RX (NAN_DBGID_EVT_BASE + 48) +/* args: TBD */ +#define NAN_DBGID_BEACON_TX (NAN_DBGID_EVT_BASE + 49) +/* args: clusterId */ +#define NAN_DBGID_CLUSTER_MERGE (NAN_DBGID_EVT_BASE + 50) +/* args: cmd, status, value */ +#define NAN_DBGID_TEST_CMD_EXEC (NAN_DBGID_EVT_BASE + 51) +/* args: tsfHi, tsfLo, age */ +#define NAN_DBGID_APPLY_BEACON_TSF (NAN_DBGID_EVT_BASE + 52) +/* args: behindFlag, diff */ +#define NAN_DBGID_TSF_UPDATE (NAN_DBGID_EVT_BASE + 53) +/* args: argc==4 (rawTsfHi, rawTsfLo, nanTsfHi, nanTsfLo), argc==2(offsetHi, offsetLo) */ +#define NAN_DBGID_SET_TSF (NAN_DBGID_EVT_BASE + 54) +/* args: rankHi, rankLo, mp, rf*/ +#define NAN_DBGID_NEW_MASTERRANK (NAN_DBGID_EVT_BASE + 55) +/* args: amRankHi, amRankLo, mp, rf */ +#define NAN_DBGID_NEW_ANCHORMASTER (NAN_DBGID_EVT_BASE + 56) +/* args: amRankHi, amRankLo, HC, BTT */ +#define NAN_DBGID_ANCHORMASTER_RECORD_UPDATE (NAN_DBGID_EVT_BASE + 57) +/* args: amRankHi, amRankLo, HC, BTT */ +#define NAN_DBGID_ANCHORMASTER_RECORD_EXPIRED (NAN_DBGID_EVT_BASE + 58) +/* args: reason, transitionsToAM */ +#define NAN_DBGID_BECOMING_ANCHORMASTER (NAN_DBGID_EVT_BASE + 59) +/* args: oldRole, newRole */ +#define NAN_DBGID_ROLE_CHANGE (NAN_DBGID_EVT_BASE + 60) +/* args: oldRole, newRole */ +#define NAN_DBGID_SYNC_BEACON_DW_STATS (NAN_DBGID_EVT_BASE + 61) +/* args: attrId */ +#define NAN_DBGID_RX_UNSUPPORTED_SDF_ATTR_ID (NAN_DBGID_EVT_BASE + 62) +/* args: handle, sid1, sid2, svcCtrl, length */ +#define NAN_DBGID_PUBSUB_MATCHED_SKIPPED_SSI (NAN_DBGID_EVT_BASE + 63) +/* args: offset */ +#define NAN_DBGID_MATCH_FILTER_OFFSET (NAN_DBGID_EVT_BASE + 64) +/* args: tsSize, n, twIndex */ +#define NAN_DBGID_TW_PARAMS (NAN_DBGID_EVT_BASE + 65) +/* args: */ +#define NAN_DBGID_BEACON_SENDER (NAN_DBGID_EVT_BASE + 66) +/* args: */ +#define NAN_DBGID_SPARE_67 (NAN_DBGID_EVT_BASE + 67) +/* args: */ +#define NAN_DBGID_SPARE_68 (NAN_DBGID_EVT_BASE + 68) +/* args: */ +#define NAN_DBGID_SPARE_69 (NAN_DBGID_EVT_BASE + 69) +/* args: */ +#define NAN_DBGID_SPARE_70 (NAN_DBGID_EVT_BASE + 70) +/* args: */ +#define NAN_DBGID_SPARE_71 (NAN_DBGID_EVT_BASE + 71) +/* args: */ +#define NAN_DBGID_SPARE_72 (NAN_DBGID_EVT_BASE + 72) +/* args: */ +#define NAN_DBGID_SPARE_73 (NAN_DBGID_EVT_BASE + 73) +/* args: */ +#define NAN_DBGID_SPARE_74 (NAN_DBGID_EVT_BASE + 74) +/* args: */ +#define NAN_DBGID_SPARE_75 (NAN_DBGID_EVT_BASE + 75) + +/* PLEASE KEEP THIS ONE AT THE END */ +#define NAN_DBGID_EVT_LOG_LAST (NAN_DBGID_EVT_BASE + 76) + +/* Debug IDs for message logs. */ +#define NAN_DBGID_API_MSG_BASE NAN_DBGID_EVT_LOG_LAST +#define NAN_DBGID_API_MSG_HEADER (NAN_DBGID_API_MSG_BASE + 0) +#define NAN_DBGID_API_MSG_DATA (NAN_DBGID_API_MSG_BASE + 1) +#define NAN_DBGID_API_MSG_LAST (NAN_DBGID_API_MSG_BASE + 2) + +/* Debug IDs for packet logs. */ +#define NAN_DBGID_OTA_PKT_BASE NAN_DBGID_API_MSG_LAST +#define NAN_DBGID_OTA_PKT_HEADER (NAN_DBGID_OTA_PKT_BASE + 0) +#define NAN_DBGID_OTA_PKT_DATA (NAN_DBGID_OTA_PKT_BASE + 1) +#define NAN_DBGID_OTA_PKT_LAST (NAN_DBGID_OTA_PKT_BASE + 2) + +#define NAN_DBGID_END NAN_DBGID_OTA_PKT_LAST + +static char *DBG_MSG_ARR[MAX_DBG_MSGS] = +{ + /* Start */ + "NAN debug ID start", + + /* Debug log IDs */ + "NAN function begin", + "NAN function end", + "NAN main debug", + "NAN MAC debug", + "NAN bloom filter debug", + "NAN MAC address", + "NAN param updated", + "NAN NULL pointer", + "NAN invalid function argument", + "NAN invalid message parameter", + "NAN missing message parameter", + "NAN deprecated message parameter", + "NAN unsupported message parameter", + "NAN invalid packet data", + "NAN log packet data", + "NAN invalid value", + "NAN invalid operation", + "NAN invalid state", + "NAN function enabled", + "NAN function disable", + "NAN invalid funtion state", + "NAN read error", + "NAN write error", + "NAN receive error", + "NAN transmit error", + "NAN parse error", + "NAN resource allocation error", + + /* Event log IDs */ + "NAN enabled", + "NAN disabled", + "NAN config restored", + "NAN SDF queued", + "NAN TW changed", + "NAN DW start", + "NAN DW end", + "NAN cluster ID changed", + "NAN WMI command received", + "NAN WMI event sent", + "NAN TLV read", + "NAN TLV write", + "NAN pub/sub updated", + "NAN pub/sub remove deferred", + "NAN pub/sub remove pending", + "NAN pub/sub removed", + "NAN pub/sub processed", + "NAN pub/sub matched", + "NAN pub/sub prepared", + "NAN pub/sub follow-up transmit", + "NAN pub/sub follow-up received", + "NAN subscribe unmatch timeout update", + "NAN subscribe match new", + "NAN subscribe match repeat", + "NAN subscribe match expired", + "NAN subscribe match log", + "NAN service ID created", + "NAN SD attribute built", + "NAN service response offset", + "NAN service info offset", + "NAN channel request create", + "NAN channel request update", + "NAN channel request remove", + "NAN channel request grant", + "NAN channel request end", + "NAN channel request error", + "NAN rx callback", + "NAN tx complete", + "NAN TSF timeout", + "NAN sync start", + "NAN sync stop", + "NAN scan", + "NAN scan complete", + "NAN master preference changed", + "NAN warm-up timer expired", + "NAN random factor timer expired", + "NAN DW skip", + "NAN DB skip", + "NAN beacon rx", + "NAN beacon tx", + "NAN cluster merge", + "NAN test command exec", + "NAN apply beacon tsf", + "NAN tsf update", + "NAN set tsf", + "NAN new master rank", + "NAN new anchor master device", + "NAN anchor master record update", + "NAN anchor master record expired", + "NAN becoming anchor master", + "NAN role change", + "NAN sync beacon stats", + "NAN received unsupported attribute id", + "NAN pub/sub matched/skipped", + "NAN match filter offset", + "NAN TW params", + "NAN beacon sender", + "NAN spare 67", + "NAN spare 68", + "NAN spare 69", + "NAN spare 70", + "NAN spare 71", + "NAN spare 72", + "NAN spare 73", + "NAN spare 74", + "NAN spare 75", + + /* Message log IDs */ + "NAN API message header", + "NAN API Message data", + + /* Packet log IDs */ + "NAN OTA packet", + "NAN OTA packet data", + + /* End */ + "NAN End" +}; + +#define CHARS_PER_DATA_BYTE 3 +#define BYTES_PER_ARG sizeof(A_UINT32) +#define CHARS_PER_ARG (CHARS_PER_DATA_BYTE * BYTES_PER_ARG) +#define STR_INDEX(arg_idx, byte_idx) \ + (((arg_idx) * CHARS_PER_ARG) + ((byte_idx) * CHARS_PER_DATA_BYTE)) + +#define NAN_SUBSCRIBE_HANDLE_OFFSET 128 + +#define PUBSUB_STR(handle) \ + (((handle) < NAN_SUBSCRIBE_HANDLE_OFFSET) ? "publish" : "subscribe") + +#define BOOL_STR(value) ((value) ? "TRUE" : "FALSE") + +typedef enum +{ + NAN_MODULE_ID_ATTR, + NAN_MODULE_ID_BEACON, + NAN_MODULE_ID_BEACON_IE, + NAN_MODULE_ID_BLOOM_FILTER, + NAN_MODULE_ID_MAIN, + NAN_MODULE_ID_CLUSTER_SM, + NAN_MODULE_ID_CRC, + NAN_MODULE_ID_CTRL, + NAN_MODULE_ID_DE_IF, + NAN_MODULE_ID_LOG, + NAN_MODULE_ID_MAC, + NAN_MODULE_ID_PUBLISH, + NAN_MODULE_ID_RX, + NAN_MODULE_ID_SUBSCRIBE, + NAN_MODULE_ID_SYNC, + NAN_MODULE_ID_TIME, + NAN_MODULE_ID_TLV, + NAN_MODULE_ID_UTIL, + NAN_MODULE_ID_LAST +} tNanModuleId; + +static A_BOOL +dbglog_nan_debug_print_handler( + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + static const char *modules[] = + { + "wlan_nan_attr.c", + "wlan_nan_beacon.c", + "wlan_nan_beacon_ie.c", + "wlan_nan_bloom_filter.c", + "wlan_nan.c", + "wlan_nan_cluster_sm.c", + "wlan_nan_crc.c", + "wlan_nan_ctrl.c", + "wlan_nan_de_if.c", + "wlan_nan_log.c", + "wlan_nan_mac.c", + "wlan_nan_publish.c", + "wlan_nan_rx.c", + "wlan_nan_subscribe.c", + "wlan_nan_sched.c", + "wlan_nan_sync.c", + "wlan_nan_time.c", + "wlan_nan_tlv.c", + "wlan_nan_util.c" + }; + + char str[64] = { 0 }; + A_UINT16 arg_idx; + + /* + * Start at 2 here and subtract 2 below because arg[0] specifies the NAN + * module ID and args[1] specifies the line number within the module. + */ + for (arg_idx=2; arg_idx < numargs; ++arg_idx) + { + snprintf(&str[(arg_idx-2)*11], sizeof(&str[(arg_idx-2)*11]), + "0x%08X ", args[arg_idx]); + } + + if (args[0] < NAN_MODULE_ID_LAST) + { + dbglog_printf(timestamp, vap_id, "%s, line %u: %s, %s", + modules[args[0]], args[1], DBG_MSG_ARR[dbg_id], &str[0]); + } + else + { + dbglog_printf(timestamp, vap_id, "Unknown module %u, line %u: %s, %s", + args[0], args[1], DBG_MSG_ARR[dbg_id], &str[0]); + } + + return TRUE; +} + +static A_BOOL +dbglog_nan_event_print_handler( + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + + switch (dbg_id) + { + case NAN_DBGID_NAN_ENABLED: + dbglog_printf(timestamp, vap_id, "%s", DBG_MSG_ARR[dbg_id]); + break; + + case NAN_DBGID_NAN_DISABLED: + dbglog_printf(timestamp, vap_id, "%s", DBG_MSG_ARR[dbg_id]); + break; + + case NAN_DBGID_CONFIG_RESTORED: + dbglog_printf(timestamp, vap_id, "%s", DBG_MSG_ARR[dbg_id]); + break; + + case NAN_DBGID_SDF_QUEUED: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s, frames queued %u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_TW_CHANGED: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s, old %u, new %u", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_DW_START: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "[==================> %s (%s)", + DBG_MSG_ARR[dbg_id], args[0] ? "secondary" : "primary"); + break; + + case NAN_DBGID_DW_END: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "<==================] %s (%s)", + DBG_MSG_ARR[dbg_id], args[0] ? "secondary" : "primary"); + break; + + case NAN_DBGID_CLUSTER_ID_CHANGED: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s, 0x%04X -> 0x%04X", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_WMI_CMD_RECEIVED: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, cmd 0x%08X, buffer 0x%08X, length %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_WMI_EVT_SENT: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, pEventPkt 0x%08X, pEventBuf 0x%08X, event size %u, data size %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_TLV_READ: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s, type %s (%u), read length %u", + DBG_MSG_ARR[dbg_id], dbglog_get_nan_tlv_type_str(args[0]), args[0], + args[1]); + break; + + case NAN_DBGID_TLV_WRITE: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, type %s (%u), length %u, write length %u", + DBG_MSG_ARR[dbg_id], dbglog_get_nan_tlv_type_str(args[0]), args[0], + args[1], args[2]); + break; + + case NAN_DBGID_PUBSUB_UPDATED: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "NAN %s %u updated", + PUBSUB_STR(args[0]), args[0]); + break; + + case NAN_DBGID_PUBSUB_REMOVE_DEFERRED: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "NAN %s %u remove deferred", + PUBSUB_STR(args[0]), args[0]); + break; + + case NAN_DBGID_PUBSUB_REMOVE_PENDING: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "NAN %s %u remove pending", + PUBSUB_STR(args[0]), args[0]); + break; + + case NAN_DBGID_PUBSUB_REMOVED: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "NAN %s %u removed", + PUBSUB_STR(args[0]), args[0]); + break; + + case NAN_DBGID_PUBSUB_PROCESSED: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "NAN %s %u processed, status %u, value %u", + PUBSUB_STR(args[0]), args[0], args[1], args[2]); + break; + + case NAN_DBGID_PUBSUB_MATCHED: + if (numargs != 5) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "NAN %s %u matched, instance id %u, requestor id %u, " + "svc id %02X:%02X:%02X:%02X:%02X:%02X, svcCtrl 0x%02X, len %u", + PUBSUB_STR(args[0]), args[0], + (args[2] & 0xFF), ((args[2] >> 8) & 0xFF), + ((args[1] >> 24) & 0xFF), ((args[1] >> 16) & 0xFF), + ((args[1] >> 8) & 0xFF), (args[1] & 0xFF), + ((args[2] >> 24) & 0xFF), ((args[2] >> 16) & 0xFF), + args[3], args[4]); + break; + + case NAN_DBGID_PUBSUB_PREPARED: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "NAN %s %u prepared, flags %X", + PUBSUB_STR(args[0]), args[0], args[1]); + break; + + case NAN_DBGID_PUBSUB_FOLLOWUP_TRANSMIT: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "NAN %s %u follow-up transmit, MAC address " + "%02X:%02X:%02X:%02X:%02X:%02X", + PUBSUB_STR(args[0]), args[0], + ((args[1] >> 24) & 0xFF), ((args[1] >> 16) & 0xFF), + ((args[1] >> 8) & 0xFF), (args[1] & 0xFF), + ((args[2] >> 24) & 0xFF), ((args[2] >> 16) & 0xFF)); + break; + + case NAN_DBGID_PUBSUB_FOLLOWUP_RECEIVED: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "NAN %s %u follow-up received, MAC address " + "%02X:%02X:%02X:%02X:%02X:%02X", + PUBSUB_STR(args[0]), args[0], + ((args[1] >> 24) & 0xFF), ((args[1] >> 16) & 0xFF), + ((args[1] >> 8) & 0xFF), (args[1] & 0xFF), + ((args[2] >> 24) & 0xFF), ((args[2] >> 16) & 0xFF)); + break; + + case NAN_DBGID_SUBSCRIBE_UNMATCH_TIMEOUT_UPDATE: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, handle %u, match handle %u, old timeout %u, new timeout %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_SUBSCRIBE_MATCH_NEW: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, handle %u, match handle %u, timestamp %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_SUBSCRIBE_MATCH_REPEAT: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, handle %u, match handle %u, timestamp %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_SUBSCRIBE_MATCH_EXPIRED: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, handle %u, match handle %u, match timestamp %u, timestamp %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_SUBSCRIBE_MATCH_LOG: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s, handle %u, match handle %u, match timestamp %u, timestamp %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_SERVICE_ID_CREATED: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s %02X:%02X:%02X:%02X:%02X:%02X", DBG_MSG_ARR[dbg_id], + ((args[0] >> 24) & 0xFF), ((args[0] >> 16) & 0xFF), + ((args[0] >> 8) & 0xFF), (args[0] & 0xFF), + ((args[1] >> 24) & 0xFF), ((args[1] >> 16) & 0xFF)); + break; + + case NAN_DBGID_SD_ATTR_BUILT: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s, size %u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_SERVICE_RSP_OFFSET: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s %u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_SERVICE_INFO_OFFSET: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s %u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_CHREQ_CREATE: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: chan %u, interval %u, start_time 0x%08X, duration %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_CHREQ_UPDATE: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: chan %u, interval %u, start_time 0x%08X, duration %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_CHREQ_REMOVE: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: chan %u, interval %u, status %d", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_CHREQ_GRANT: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: chan %u, %s, tsfLo 0x%08X", + DBG_MSG_ARR[dbg_id], args[0], dbglog_get_nan_chan_type(args[1]), + args[2]); + break; + + case NAN_DBGID_CHREQ_END: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: chan %u, %s, tsfLo 0x%08X", + DBG_MSG_ARR[dbg_id], args[0], dbglog_get_nan_chan_type(args[1]), + args[2]); + break; + + case NAN_DBGID_CHREQ_ERROR: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: chan %u, %s, tsfLo 0x%08X", + DBG_MSG_ARR[dbg_id], args[0], dbglog_get_nan_chan_type(args[1]), + args[2]); + break; + + case NAN_DBGID_RX_CALLBACK: + if (numargs != 5) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: type 0x%X, length %u, timestamp 0x%08X, rssi %d, freq %d", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3], args[4]); + break; + + case NAN_DBGID_TX_COMPLETE: + if (numargs != 5) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: type 0x%X, handle %u, bufp %u, status %u, timestamp 0x%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3], args[4]); + break; + + case NAN_DBGID_TSF_TIMEOUT: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: tsfLo 0x%X, usecs %u", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_SYNC_START: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: %s clusterId 0x%04x", + DBG_MSG_ARR[dbg_id], (args[1] ? "**STARTING**" : "**JOINING**"), + args[0]); + break; + + case NAN_DBGID_SYNC_STOP: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: stopping clusterId 0x%04x", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_NAN_SCAN: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: enable %u, type %u, rval %d", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_NAN_SCAN_COMPLETE: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: scan type %u completed", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_MPREF_CHANGE: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: new value=%u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_WARMUP_EXPIRE: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: masterPref=%u, randomFactor=%u", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_RANDOM_FACTOR_EXPIRE: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: new randomFactor=%u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_DW_SKIP: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: tsfLo 0x%08X, tsfDiff 0x%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_DB_SKIP: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: reason %x, tsfDiff 0x%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_BEACON_RX: + /* args: TBD */ + if (numargs == 5) + { + A_UINT8 ctl = (args[0] >> 24) & 0xFF; + if (ctl == 0) + { + A_UINT8 mac[6]; + + mac[0] = args[0] & 0xFF; + mac[1] = (args[0] >> 8) & 0xFF; + mac[2] = args[1] & 0xFF; + mac[3] = (args[1] >> 8) & 0xFF; + mac[4] = (args[1] >> 16) & 0xFF; + mac[5] = (args[1] >> 24) & 0xFF; + + dbglog_printf(timestamp, vap_id, + "NAN Beacon from %02x:%02x:%02x:%02x:%02x:%02x, clusterId 0x%04x, " + "RSSI %d, TS 0x%08lx_%08lx", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + (args[2] >> 16) & 0xFFFF, + args[2] & 0xFF, + args[3], + args[4]); + } + else if (ctl == 1) + { + dbglog_printf(timestamp, vap_id, + " - Times: NAN TSF 0x%08lx_%08lx, hwRxTs 0x%08lx, statusFlags 0x%08lx", + args[1], + args[2], + args[3], + args[4]); + } + else if (ctl == 2) + { + dbglog_printf(timestamp, vap_id, + " - Attrs: [mpref=%d randf=%d], [amRank=0x%08lx_%08lx amHC=%d amBTT=%08lx]", + args[0] & 0xFF, + (args[0] >> 8) & 0xFF, + args[1], + args[2], + args[3], + args[4]); + } + else if (ctl == 3) + { + dbglog_printf(timestamp, vap_id, + " - AvgRssi: %u, numSamples=%u [%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u]", + (args[0]) & 0xFF, + (args[0] >> 8) & 0xFF, + (args[1]) & 0xFF, + (args[1] >> 8) & 0xFF, + (args[1] >> 16) & 0xFF, + (args[1] >> 24) & 0xFF, + (args[2]) & 0xFF, + (args[2] >> 8) & 0xFF, + (args[2] >> 16) & 0xFF, + (args[2] >> 24) & 0xFF, + (args[3]) & 0xFF, + (args[3] >> 8) & 0xFF, + (args[3] >> 16) & 0xFF, + (args[3] >> 24) & 0xFF, + (args[4]) & 0xFF, + (args[4] >> 8) & 0xFF, + (args[4] >> 16) & 0xFF, + (args[4] >> 24) & 0xFF); + } + else + { + dbglog_printf(timestamp, vap_id, "%s, unknown ctl value: %d", + DBG_MSG_ARR[dbg_id], ctl); + return FALSE; + } + } + else + { + char str[64] = { 0 }; + A_UINT16 i; + for (i=0; i < numargs; ++i) + { + snprintf(&str[i*9], sizeof(&str[i*9]), "%08X ", args[i]); + } + dbglog_printf(timestamp, vap_id, "%s: numargs %u, %s", + DBG_MSG_ARR[dbg_id], numargs, str); + } + break; + + case NAN_DBGID_BEACON_TX: + /* args: TBD */ + { + char str[64] = { 0 }; + A_UINT16 i; + for (i=0; i < numargs; ++i) + { + snprintf(&str[i*9], sizeof(&str[i*9]), "%08X ", args[i]); + } + dbglog_printf(timestamp, vap_id, "%s: numargs %u, %s", + DBG_MSG_ARR[dbg_id], numargs, str); + } + break; + + case NAN_DBGID_CLUSTER_MERGE: + if (numargs != 5) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: **MERGING** to clusterId 0x%04x [amRank=0x%08lx_%08lx, TS=%08lx_%08lx]", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3], args[4]); + break; + + case NAN_DBGID_TEST_CMD_EXEC: + if (numargs == 1) + { + dbglog_printf(timestamp, vap_id, "%s: cmd %u", + DBG_MSG_ARR[dbg_id], args[0]); + } + else if (numargs == 2) + { + dbglog_printf(timestamp, vap_id, "%s: cmd %u, status %d", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + } + else if (numargs == 3) + { + dbglog_printf(timestamp, vap_id, "%s: cmd %u, status %d, value %u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + } + else + { + dbglog_printf(timestamp, vap_id, "%s: too many args %u", + DBG_MSG_ARR[dbg_id], numargs); + return FALSE; + } + break; + + case NAN_DBGID_APPLY_BEACON_TSF: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: timestamp=0x%08X_%08X, age=%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_TSF_UPDATE: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: diff %c%d", + DBG_MSG_ARR[dbg_id], args[0] ? '-' : '+', args[1]); + break; + + case NAN_DBGID_SET_TSF: + if (numargs == 4) + { + dbglog_printf(timestamp, vap_id, + "%s: raw 0x%08X_%08X, nan 0x%08X_%08x", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + } + else if (numargs == 2) + { + dbglog_printf(timestamp, vap_id, "%s: offset 0x%08X_%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + } + else + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + break; + + case NAN_DBGID_NEW_MASTERRANK: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "%s: our rank is 0x%08X_%08x (mp=%d, rf=%d)", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + break; + + case NAN_DBGID_NEW_ANCHORMASTER: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + { + A_UINT8 mac[6]; + + mac[0] = args[1] & 0xFF; + mac[1] = (args[1] >> 8) & 0xFF; + mac[2] = (args[1] >> 16) & 0xFF; + mac[3] = (args[1] >> 24) & 0xFF; + mac[4] = args[0] & 0xFF; + mac[5] = (args[0] >> 8) & 0xFF; + dbglog_printf(timestamp, vap_id, + "%s: %02x:%02x:%02x:%02x:%02x:%02x, rank is 0x%08X_%08x (mp=%d, rf=%d)", + DBG_MSG_ARR[dbg_id], mac[0], mac[1], mac[2], mac[3], mac[4], + mac[5], args[0], args[1], args[2], args[3]); + } + break; + + case NAN_DBGID_ANCHORMASTER_RECORD_UPDATE: + if (numargs == 4) + { + dbglog_printf(timestamp, vap_id, + "%s: rank=0x%08X_%08x HC=%d BTT=0x%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + } + else if (numargs == 3) + { + dbglog_printf(timestamp, vap_id, + "%s: rank=0x%08X_%08x BTT=0x%08X (*Last*)", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + } + else + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + break; + + case NAN_DBGID_ANCHORMASTER_RECORD_EXPIRED: + if (numargs == 4) + { + dbglog_printf(timestamp, vap_id, + "%s: rank=0x%08X_%08x HC=%d BTT=0x%08X", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3]); + } + else if (numargs == 5) + { + dbglog_printf(timestamp, vap_id, + "%s: rank=0x%08X_%08x HC=%d BTT=0x%08X ==> Setting HC to %d", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2], args[3], args[4]); + } + else + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + break; + + case NAN_DBGID_BECOMING_ANCHORMASTER: + if (numargs != 2) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: reason=%d, transitionsToAM=%d", + DBG_MSG_ARR[dbg_id], args[0], args[1]); + break; + + case NAN_DBGID_ROLE_CHANGE: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: oldRole=%s, newRole=%s %s", + DBG_MSG_ARR[dbg_id], + dbglog_get_nan_role_str(args[0]), + dbglog_get_nan_role_str(args[1]), + args[2] ? "(**FORCED**)" : ""); + break; + + case NAN_DBGID_SYNC_BEACON_DW_STATS: + if (numargs != 4) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + { + A_UINT16 c1_close, c1_middle, c1_poor; + A_UINT16 c2_close, c2_middle, c2_poor; + c1_close = args[1] >> 16, + c2_close = args[1] & 0xFFFF, + c1_middle = args[2] >> 16, + c2_middle = args[2] & 0xFFFF, + c1_poor = args[3] >> 16, + c2_poor = args[3] & 0xFFFF, + + dbglog_printf(timestamp, vap_id, + "%s: total rx %d, c1=(%d/%d/%d) c1=(%d/%d/%d)", + DBG_MSG_ARR[dbg_id], args[0], c1_close, c1_middle, c1_poor, + c2_close, c2_middle, c2_poor); + } + break; + + case NAN_DBGID_RX_UNSUPPORTED_SDF_ATTR_ID: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s %u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_PUBSUB_MATCHED_SKIPPED_SSI: + if (numargs != 5) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg(s)", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, + "NAN %s %u matched and skipped because SSI is required, " + "instance id %u, requestor id %u, " + "svc id %02X:%02X:%02X:%02X:%02X:%02X, svcCtrl 0x%02X, len%u", + PUBSUB_STR(args[0]), args[0], + (args[2] & 0xFF), ((args[2] >> 8) && 0xFF), + ((args[1] >> 24) & 0xFF), ((args[1] >> 16) & 0xFF), + ((args[1] >> 8) & 0xFF), (args[1] & 0xFF), + ((args[2] >> 24) & 0xFF), ((args[2] >> 16) & 0xFF), + args[3], args[4]); + break; + + case NAN_DBGID_MATCH_FILTER_OFFSET: + if (numargs != 1) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s %u", + DBG_MSG_ARR[dbg_id], args[0]); + break; + + case NAN_DBGID_TW_PARAMS: + if (numargs != 3) + { + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + dbglog_printf(timestamp, vap_id, "%s: twSize=%u, n=%u, twIndex=%u", + DBG_MSG_ARR[dbg_id], args[0], args[1], args[2]); + break; + + case NAN_DBGID_BEACON_SENDER: + if (numargs == 1) + { + dbglog_printf(timestamp, vap_id, "%s: failed, reason %x", + DBG_MSG_ARR[dbg_id], args[0]); + } + else if (numargs == 3) + { + dbglog_printf(timestamp, vap_id, "%s: %s idx=%u sender 0x%08x", + DBG_MSG_ARR[dbg_id], args[0] ? "alloc" : "reclaim", args[1], args[2]); + } + else + { + + dbglog_printf(timestamp, vap_id, "%s, missing arg", + DBG_MSG_ARR[dbg_id]); + return FALSE; + } + break; + + default: + dbglog_printf(timestamp, vap_id, + "NAN unknown event id %u (should never reach this case)", dbg_id); + return FALSE; + } + + return TRUE; +} + +/* NAN message IDs */ +typedef enum +{ + NAN_MSG_ID_ERROR_RSP = 0, + NAN_MSG_ID_CONFIGURATION_REQ = 1, + NAN_MSG_ID_CONFIGURATION_RSP = 2, + NAN_MSG_ID_PUBLISH_SERVICE_REQ = 3, + NAN_MSG_ID_PUBLISH_SERVICE_RSP = 4, + NAN_MSG_ID_PUBLISH_SERVICE_CANCEL_REQ = 5, + NAN_MSG_ID_PUBLISH_SERVICE_CANCEL_RSP = 6, + NAN_MSG_ID_PUBLISH_REPLIED_IND = 7, + NAN_MSG_ID_PUBLISH_TERMINATED_IND = 8, + NAN_MSG_ID_SUBSCRIBE_SERVICE_REQ = 9, + NAN_MSG_ID_SUBSCRIBE_SERVICE_RSP = 10, + NAN_MSG_ID_SUBSCRIBE_SERVICE_CANCEL_REQ = 11, + NAN_MSG_ID_SUBSCRIBE_SERVICE_CANCEL_RSP = 12, + NAN_MSG_ID_SUBSCRIBE_MATCH_IND = 13, + NAN_MSG_ID_SUBSCRIBE_UNMATCH_IND = 14, + NAN_MSG_ID_SUBSCRIBE_TERMINATED_IND = 15, + NAN_MSG_ID_DE_EVENT_IND = 16, + NAN_MSG_ID_TRANSMIT_FOLLOWUP_REQ = 17, + NAN_MSG_ID_TRANSMIT_FOLLOWUP_RSP = 18, + NAN_MSG_ID_FOLLOWUP_IND = 19, + NAN_MSG_ID_STATS_REQ = 20, + NAN_MSG_ID_STATS_RSP = 21, + NAN_MSG_ID_ENABLE_REQ = 22, + NAN_MSG_ID_ENABLE_RSP = 23, + NAN_MSG_ID_DISABLE_REQ = 24, + NAN_MSG_ID_DISABLE_RSP = 25, + NAN_MSG_ID_DISABLE_IND = 26, + NAN_MSG_ID_TCA_REQ = 27, + NAN_MSG_ID_TCA_RSP = 28, + NAN_MSG_ID_TCA_IND = 29, + NAN_MSG_ID_BCN_SDF_PAYLOAD_REQ = 30, + NAN_MSG_ID_BCN_SDF_PAYLOAD_RSP = 31, + NAN_MSG_ID_BCN_SDF_PAYLOAD_IND = 32, + NAN_MSG_ID_LAST +} tNanMsgId; + +/* NAN Event ID Codes */ +typedef enum +{ + NAN_EVENT_ID_FIRST = 0, + NAN_EVENT_ID_SELF_STA_MAC_ADDR = NAN_EVENT_ID_FIRST, + NAN_EVENT_ID_STARTED_CLUSTER, + NAN_EVENT_ID_JOINED_CLUSTER, + NAN_EVENT_ID_LAST +} tNanEventId; + +/* NAN Statistics Request ID Codes */ +typedef enum +{ + NAN_STATS_ID_FIRST = 0, + NAN_STATS_ID_DE_PUBLISH = NAN_STATS_ID_FIRST, + NAN_STATS_ID_DE_SUBSCRIBE, + NAN_STATS_ID_DE_MAC, + NAN_STATS_ID_DE_TIMING_SYNC, + NAN_STATS_ID_DE_DW, + NAN_STATS_ID_DE, + NAN_STATS_ID_LAST +} tNanStatsId; + +typedef enum +{ + NAN_TLV_TYPE_FIRST = 0, + + /* Service Discovery Frame types */ + NAN_TLV_TYPE_SDF_FIRST = NAN_TLV_TYPE_FIRST, + NAN_TLV_TYPE_SERVICE_NAME = NAN_TLV_TYPE_SDF_FIRST, + NAN_TLV_TYPE_SDF_MATCH_FILTER, + NAN_TLV_TYPE_TX_MATCH_FILTER, + NAN_TLV_TYPE_RX_MATCH_FILTER, + NAN_TLV_TYPE_SERVICE_SPECIFIC_INFO, + NAN_TLV_TYPE_EXT_SERVICE_SPECIFIC_INFO, + NAN_TLV_TYPE_VENDOR_SPECIFIC_ATTRIBUTE_TRANSMIT, + NAN_TLV_TYPE_VENDOR_SPECIFIC_ATTRIBUTE_RECEIVE, + NAN_TLV_TYPE_POST_NAN_CONNECTIVITY_CAPABILITIES_RECEIVE, + NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_RECEIVE, + NAN_TLV_TYPE_BEACON_SDF_PAYLOAD_RECEIVE, + NAN_TLV_TYPE_SDF_LAST = 4095, + + /* Configuration types */ + NAN_TLV_TYPE_CONFIG_FIRST = 4096, + NAN_TLV_TYPE_24G_SUPPORT = NAN_TLV_TYPE_CONFIG_FIRST, + NAN_TLV_TYPE_24G_BEACON, + NAN_TLV_TYPE_24G_SDF, + NAN_TLV_TYPE_24G_RSSI_CLOSE, + NAN_TLV_TYPE_24G_RSSI_MIDDLE, + NAN_TLV_TYPE_24G_RSSI_CLOSE_PROXIMITY, + NAN_TLV_TYPE_5G_SUPPORT, + NAN_TLV_TYPE_5G_BEACON, + NAN_TLV_TYPE_5G_SDF, + NAN_TLV_TYPE_5G_RSSI_CLOSE, + NAN_TLV_TYPE_5G_RSSI_MIDDLE, + NAN_TLV_TYPE_5G_RSSI_CLOSE_PROXIMITY, + NAN_TLV_TYPE_SID_BEACON, + NAN_TLV_TYPE_HOP_COUNT_LIMIT, + NAN_TLV_TYPE_MASTER_PREFERENCE, + NAN_TLV_TYPE_CLUSTER_ID_LOW, + NAN_TLV_TYPE_CLUSTER_ID_HIGH, + NAN_TLV_TYPE_RSSI_AVERAGING_WINDOW_SIZE, + NAN_TLV_TYPE_CLUSTER_OUI_NETWORK_ID, + NAN_TLV_TYPE_SOURCE_MAC_ADDRESS, + NAN_TLV_TYPE_CLUSTER_ATTRIBUTE_IN_SDF, + NAN_TLV_TYPE_SOCIAL_CHANNEL_SCAN_PARAMS, + NAN_TLV_TYPE_DEBUGGING_FLAGS, + NAN_TLV_TYPE_POST_NAN_CONNECTIVITY_CAPABILITIES_TRANSMIT, + NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_TRANSMIT, + NAN_TLV_TYPE_FURTHER_AVAILABILITY_MAP, + NAN_TLV_TYPE_HOP_COUNT_FORCE, + NAN_TLV_TYPE_RANDOM_FACTOR_FORCE, + NAN_TLV_TYPE_CONFIG_LAST = 8191, + + + /* Attributes types */ + NAN_TLV_TYPE_ATTRS_FIRST = 8192, + NAN_TLV_TYPE_AVAILABILITY_INTERVALS_MAP = NAN_TLV_TYPE_ATTRS_FIRST, + NAN_TLV_TYPE_WLAN_MESH_ID, + NAN_TLV_TYPE_MAC_ADDRESS, + NAN_TLV_TYPE_RECEIVED_RSSI_VALUE, + NAN_TLV_TYPE_CLUSTER_ATTRIBUTE, + NAN_TLV_TYPE_ATTRS_LAST = 12287, + + /* Event types */ + NAN_TLV_TYPE_EVENTS_FIRST = 12288, + NAN_TLV_TYPE_EVENT_SELF_STATION_MAC_ADDRESS = NAN_TLV_TYPE_EVENTS_FIRST, + NAN_TLV_TYPE_EVENT_STARTED_CLUSTER, + NAN_TLV_TYPE_EVENT_JOINED_CLUSTER, + NAN_TLV_TYPE_EVENT_CLUSTER_SCAN_RESULTS, + NAN_TLV_TYPE_EVENTS_LAST = 16383, + + /* Thrshold Cross Alerts types */ + NAN_TLV_TYPE_TCA_FIRST = 16384, + NAN_TLV_TYPE_CLUSTER_SIZE_REQ = NAN_TLV_TYPE_TCA_FIRST, + NAN_TLV_TYPE_CLUSTER_SIZE_RSP, + NAN_TLV_TYPE_TCA_LAST = 20479, + + /* Statistics types */ + NAN_TLV_TYPE_STATS_FIRST = 32768, + NAN_TLV_TYPE_DE_PUBLISH_STATS = NAN_TLV_TYPE_STATS_FIRST, + NAN_TLV_TYPE_DE_SUBSCRIBE_STATS, + NAN_TLV_TYPE_DE_MAC_STATS, + NAN_TLV_TYPE_DE_TIMING_SYNC_STATS, + NAN_TLV_TYPE_DE_DW_STATS, + NAN_TLV_TYPE_DE_STATS, + NAN_TLV_TYPE_STATS_LAST, + + NAN_TLV_TYPE_LAST = 65535 +} tNanTlvType; + +/* NAN Miscellaneous Constants */ +#define NAN_TTL_INFINITE 0 +#define NAN_REPLY_COUNT_INFINITE 0 + +/* NAN Publish Types */ +typedef enum +{ + NAN_PUBLISH_TYPE_UNSOLICITED = 0, + NAN_PUBLISH_TYPE_SOLICITED, + NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED, + NAN_PUBLISH_TYPE_LAST, +} tNanPublishType; + +/* NAN Transmit Types */ +typedef enum +{ + NAN_TX_TYPE_BROADCAST = 0, + NAN_TX_TYPE_UNICAST, + NAN_TX_TYPE_LAST +} tNanTxType; + +/* NAN Subscribe Type Bit */ +#define NAN_SUBSCRIBE_TYPE_PASSIVE 0 +#define NAN_SUBSCRIBE_TYPE_ACTIVE 1 + +/* NAN Service Response Filter Attribute Bit */ +#define NAN_SRF_ATTR_BLOOM_FILTER 0 +#define NAN_SRF_ATTR_PARTIAL_MAC_ADDR 1 + +/* NAN Service Response Filter Include Bit */ +#define NAN_SRF_INCLUDE_DO_NOT_RESPOND 0 +#define NAN_SRF_INCLUDE_RESPOND 1 + +/* NAN Match Algorithms */ +typedef enum +{ + NAN_MATCH_ALG_FIRST = 0, + NAN_MATCH_ALG_MATCH_ONCE = NAN_MATCH_ALG_FIRST, + NAN_MATCH_ALG_MATCH_CONTINUOUS, + NAN_MATCH_ALG_LAST +} tNanMatchAlg; + + +/* NAN Transmit Priorities */ +typedef enum +{ + NAN_TX_PRIORITY_LOW = 0, + NAN_TX_PRIORITY_NORMAL, + NAN_TX_PRIORITY_HIGH, + NAN_TX_PRIORITY_LAST +} tNanTxPriority; + +/* NAN TLV Maximum Lengths */ +#define NAN_MAX_SERVICE_NAME_LEN 255 +#define NAN_MAX_MATCH_FILTER_LEN 255 +#define NAN_MAX_SERVICE_SPECIFIC_INFO_LEN 255 +#define NAN_MAX_GROUP_KEY_LEN 32 +#define NAN_MAX_EXT_SERVICE_SPECIFIC_INFO_LEN 1024 +#define NAN_MAX_TLV_LEN NAN_MAX_EXT_SERVICE_SPECIFIC_INFO_LEN + +/* NAN Confguration 5G Channel Access Bit */ +#define NAN_5G_CHANNEL_ACCESS_UNSUPPORTED 0 +#define NAN_5G_CHANNEL_ACCESS_SUPPORTED 1 + +/* NAN Configuration Service IDs Enclosure Bit */ +#define NAN_SIDS_NOT_ENCLOSED_IN_BEACONS 0 +#define NAN_SIBS_ENCLOSED_IN_BECAONS 1 + +/* NAN Configuration Priority */ +#define NAN_CFG_PRIORITY_SERVICE_DISCOVERY 0 +#define NAN_CFG_PRIORITY_DATA_CONNECTION 1 + +/* NAN Configuration 5G Channel Usage */ +#define NAN_5G_CHANNEL_USAGE_SYNC_AND_DISCOVERY 0 +#define NAN_5G_CHANNEL_USAGE_DISCOVERY_ONLY 1 + +/* NAN Configuration TX_Beacon Content */ +#define NAN_TX_BEACON_CONTENT_OLD_AM_INFO 0 +#define NAN_TX_BEACON_CONTENT_UPDATED_AM_INFO 1 + +/* NAN Configuration Miscellaneous Constants */ +#define NAN_MAC_INTERFACE_PERIODICITY_MIN 30 +#define NAN_MAC_INTERFACE_PERIODICITY_MAX 255 + +#define NAN_DW_RANDOM_TIME_MIN 120 +#define NAN_DW_RANDOM_TIME_MAX 240 + +#define NAN_INITIAL_SCAN_MIN_IDEAL_PERIOD 200 +#define NAN_INITIAL_SCAN_MAX_IDEAL_PERIOD 300 + +#define NAN_ONGOING_SCAN_MIN_PERIOD 10 +#define NAN_ONGOING_SCAN_MAX_PERIOD 30 + +#define NAN_HOP_COUNT_LIMIT 5 + +#define NAN_WINDOW_DW 0 +#define NAN_WINDOW_FAW 1 + +/* TCA IDs */ +typedef enum +{ + NAN_TCA_ID_FIRST = 0, + NAN_TCA_ID_CLUSTER_SIZE = NAN_TCA_ID_FIRST, + NAN_TCA_ID_LAST +} tNanTcaId; + +/* NAN Status Codes */ +typedef enum +{ + NAN_STATUS_SUCCESS = 0, + NAN_STATUS_TIMEOUT, + NAN_STATUS_DE_FAILURE, + NAN_STATUS_INVALID_MSG_VERSION, + NAN_STATUS_INVALID_MSG_LEN, + NAN_STATUS_INVALID_MSG_ID, + NAN_STATUS_INVALID_HANDLE, + NAN_STATUS_NO_SPACE_AVAILABLE, + NAN_STATUS_INVALID_PUBLISH_TYPE, + NAN_STATUS_INVALID_TX_TYPE, + NAN_STATUS_INVALID_MATCH_ALGORITHM, + NAN_STATUS_DISABLE_IN_PROGRESS, + NAN_STATUS_INVALID_TLV_LEN, + NAN_STATUS_INVALID_TLV_TYPE, + NAN_STATUS_MISSING_TLV_TYPE, + NAN_STATUS_INVALID_TOTAL_TLVS_LEN, + NAN_STATUS_INVALID_MATCH_HANDLE, + NAN_STATUS_INVALID_TLV_VALUE, + NAN_STATUS_INVALID_TX_PRIORITY, + NAN_STATUS_INVALID_CONN_MAP, + + /* Config */ + NAN_STATUS_INVALID_RSSI_CLOSE_VALUE = 4096, + NAN_STATUS_INVALID_RSSI_MIDDLE_VALUE, + NAN_STATUS_INVALID_HOP_COUNT_LIMIT, + NAN_STATUS_INVALID_MASTER_PREFERENCE_VALUE, + NAN_STATUS_INVALID_LOW_CLUSTER_ID_VALUE, + NAN_STATUS_INVALID_HIGH_CLUSTER_ID_VALUE, + NAN_STATUS_INVALID_BACKGROUND_SCAN_PERIOD, + NAN_STATUS_INVALID_RSSI_PROXIMITY_VALUE, + NAN_STATUS_INVALID_SCAN_CHANNEL, + NAN_STATUS_INVALID_POST_NAN_CONN_CAP_BITMAP, + NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_NUM_CHAN, + NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_AVAIL_INT_DURATION, + NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_CLASS, + NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_CHANNEL, + NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_AVAIL_INT_BITMAP, + NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_MAP_ID, + NAN_STATUS_INVALID_POST_DISC_CONN_TYPE, + NAN_STATUS_INVALID_POST_DISC_DEVICE_ROLE, + NAN_STATUS_INVALID_POST_DISC_AVAIL_INT_DURATION, + NAN_STATUS_MISSING_FURTHER_AVAIL_MAP, + + /* Terminated reasons */ + NAN_TERMINATED_REASON_INVALID = 8192, + NAN_TERMINATED_REASON_TIMEOUT, + NAN_TERMINATED_REASON_USER_REQUEST, + NAN_TERMINATED_REASON_FAILURE, + NAN_TERMINATED_REASON_COUNT_REACHED, + NAN_TERMINATED_REASON_DE_SHUTDOWN, + NAN_TERMINATED_REASON_DISABLE_IN_PROGRESS, + NAN_TERMINATED_REASON_POST_DISC_ATTR_EXPIRED, + NAN_TERMINATED_REASON_POST_DISC_LEN_EXCEEDED, + NAN_TERMINATED_REASON_FURTHER_AVAIL_MAP_EMPTY, + + NAN_STATUS_LAST +} tNanStatusType; + +typedef enum +{ + NAN_ROLE_INVALID = 0, + NAN_ROLE_NON_MASTER_NON_SYNC = 1, + NAN_ROLE_NON_MASTER_SYNC = 2, + NAN_ROLE_MASTER = 3 +} tNanRole; + +static const char * +dbglog_get_nan_msg_id_str( + A_UINT16 msg_id) +{ + switch (msg_id) + { + case NAN_MSG_ID_ERROR_RSP: + return "Error Rsp"; + case NAN_MSG_ID_CONFIGURATION_REQ: + return "Configuration Req"; + case NAN_MSG_ID_CONFIGURATION_RSP: + return "Configuration Rsp"; + case NAN_MSG_ID_PUBLISH_SERVICE_REQ: + return "Publish Service Req"; + case NAN_MSG_ID_PUBLISH_SERVICE_RSP: + return "Publish Service Rsp"; + case NAN_MSG_ID_PUBLISH_SERVICE_CANCEL_REQ: + return "Publish Service Cancel Req"; + case NAN_MSG_ID_PUBLISH_SERVICE_CANCEL_RSP: + return "Publish Service Cancel Rsp"; + case NAN_MSG_ID_PUBLISH_REPLIED_IND: + return "Publish Replied Ind"; + case NAN_MSG_ID_PUBLISH_TERMINATED_IND: + return "Publish Terminated Ind"; + case NAN_MSG_ID_SUBSCRIBE_SERVICE_REQ: + return "Subscribe Service Req"; + case NAN_MSG_ID_SUBSCRIBE_SERVICE_RSP: + return "Subscribe Service Rsp"; + case NAN_MSG_ID_SUBSCRIBE_SERVICE_CANCEL_REQ: + return "Subscribe Service Cancel Req"; + case NAN_MSG_ID_SUBSCRIBE_SERVICE_CANCEL_RSP: + return "Subscribe Service Cancel Rsp"; + case NAN_MSG_ID_SUBSCRIBE_MATCH_IND: + return "Subscribe Match Ind"; + case NAN_MSG_ID_SUBSCRIBE_UNMATCH_IND: + return "Subscribe Unmatch Ind"; + case NAN_MSG_ID_SUBSCRIBE_TERMINATED_IND: + return "Subscribe Terminated Ind"; + case NAN_MSG_ID_DE_EVENT_IND: + return "DE Event Ind"; + case NAN_MSG_ID_TRANSMIT_FOLLOWUP_REQ: + return "Transmit Followup Req"; + case NAN_MSG_ID_TRANSMIT_FOLLOWUP_RSP: + return "Transmit Followup Rsp"; + case NAN_MSG_ID_FOLLOWUP_IND: + return "Followup Ind"; + case NAN_MSG_ID_STATS_REQ: + return "Stats Req"; + case NAN_MSG_ID_STATS_RSP: + return "Stats Rsp"; + case NAN_MSG_ID_ENABLE_REQ: + return "Enable Req"; + case NAN_MSG_ID_ENABLE_RSP: + return "Enable Rsp"; + case NAN_MSG_ID_DISABLE_REQ: + return "Disable Req"; + case NAN_MSG_ID_DISABLE_RSP: + return "Disable Rsp"; + case NAN_MSG_ID_DISABLE_IND: + return "Disable Ind"; + case NAN_MSG_ID_TCA_REQ: + return "TCA Req"; + case NAN_MSG_ID_TCA_RSP: + return "TCA Rsp"; + case NAN_MSG_ID_TCA_IND: + return "TCA Ind"; + case NAN_MSG_ID_BCN_SDF_PAYLOAD_REQ: + return "BCN/SDF Payload Req"; + case NAN_MSG_ID_BCN_SDF_PAYLOAD_RSP: + return "BCN/SDF Payload Rsp"; + case NAN_MSG_ID_BCN_SDF_PAYLOAD_IND: + return "BCN/SDF Payload Ind"; + default: + return "Unknown Msg"; + } +} + +static const char * +dbglog_get_nan_status_str( + A_UINT32 status) +{ + switch (status) + { + case NAN_STATUS_SUCCESS: + return "Success"; + case NAN_STATUS_TIMEOUT: + return "Timeout"; + case NAN_STATUS_DE_FAILURE: + return "DE Failure"; + case NAN_STATUS_INVALID_MSG_VERSION: + return "Invalid Msg Version"; + case NAN_STATUS_INVALID_MSG_LEN: + return "Invalid Msg Len"; + case NAN_STATUS_INVALID_MSG_ID: + return "Invalid Msg Id"; + case NAN_STATUS_INVALID_HANDLE: + return "Invalid Handle"; + case NAN_STATUS_NO_SPACE_AVAILABLE: + return "No Space Available"; + case NAN_STATUS_INVALID_PUBLISH_TYPE: + return "Invalid Publish Type"; + case NAN_STATUS_INVALID_TX_TYPE: + return "Invalid Tx Type"; + case NAN_STATUS_INVALID_MATCH_ALGORITHM: + return "Invalid Match Algorithm"; + case NAN_STATUS_DISABLE_IN_PROGRESS: + return "Disable In Progress"; + case NAN_STATUS_INVALID_TLV_LEN: + return "Invalid TLV Len"; + case NAN_STATUS_INVALID_TLV_TYPE: + return "Invalid TLV Type"; + case NAN_STATUS_MISSING_TLV_TYPE: + return "Missing TLV Type"; + case NAN_STATUS_INVALID_TOTAL_TLVS_LEN: + return "Invalid Total TLVs Len"; + case NAN_STATUS_INVALID_TLV_VALUE: + return "Invalid TLV Value"; + case NAN_STATUS_INVALID_MATCH_HANDLE: + return "Invalid Match Handle"; + case NAN_STATUS_INVALID_TX_PRIORITY: + return "Invalid Tx Priority"; + case NAN_STATUS_INVALID_CONN_MAP: + return "Invalid Connection Capability Map"; + + /* Config */ + case NAN_STATUS_INVALID_RSSI_CLOSE_VALUE: + return "Invalid RSSI Close Value"; + case NAN_STATUS_INVALID_RSSI_MIDDLE_VALUE: + return "Invalid RSSI Middle Value"; + case NAN_STATUS_INVALID_HOP_COUNT_LIMIT: + return "Hop Count Limit"; + case NAN_STATUS_INVALID_MASTER_PREFERENCE_VALUE: + return "Invalid Master Preference Value"; + case NAN_STATUS_INVALID_LOW_CLUSTER_ID_VALUE: + return "Invalid Low Cluster ID Value"; + case NAN_STATUS_INVALID_HIGH_CLUSTER_ID_VALUE: + return "Invalid High Cluster ID Value"; + case NAN_STATUS_INVALID_BACKGROUND_SCAN_PERIOD: + return "Invalid Background Scan Period"; + case NAN_STATUS_INVALID_RSSI_PROXIMITY_VALUE: + return "Invalid RSSI Proximity Value"; + case NAN_STATUS_INVALID_SCAN_CHANNEL: + return "Invalid Scan Channel"; + case NAN_STATUS_INVALID_POST_NAN_CONN_CAP_BITMAP: + return "Invalid Connection Capability Bitmap"; + case NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_NUM_CHAN: + return "Invalid Further Availability Map Num Channels"; + case NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_AVAIL_INT_DURATION: + return "Invalid Further Availability Map Availability Interval Duration"; + case NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_CLASS: + return "Invalid Further Availability Map Class"; + case NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_CHANNEL: + return "Invalid Further Availability Map Channel"; + case NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_AVAIL_INT_BITMAP: + return "Invalid Further Availability Map Bitmap"; + case NAN_STATUS_INVALID_FURTHER_AVAIL_MAP_MAP_ID: + return "Invalid Further Availability Map Map_ID"; + case NAN_STATUS_INVALID_POST_DISC_CONN_TYPE: + return "Invalid Post-Discovery Connection Type"; + case NAN_STATUS_INVALID_POST_DISC_DEVICE_ROLE: + return "Invalid Post-Discovery Device Role"; + case NAN_STATUS_INVALID_POST_DISC_AVAIL_INT_DURATION: + return "Invalid Post-Discovery Availability Interval Duration"; + case NAN_STATUS_MISSING_FURTHER_AVAIL_MAP: + return "Missing Further Availability Map"; + + /* Terminated reasons */ + case NAN_TERMINATED_REASON_INVALID: + return "Invalid"; + case NAN_TERMINATED_REASON_TIMEOUT: + return "Timeout"; + case NAN_TERMINATED_REASON_USER_REQUEST: + return "User Request"; + case NAN_TERMINATED_REASON_FAILURE: + return "Failure"; + case NAN_TERMINATED_REASON_COUNT_REACHED: + return "Count Reached"; + case NAN_TERMINATED_REASON_DE_SHUTDOWN: + return "DE Shutdown"; + case NAN_TERMINATED_REASON_DISABLE_IN_PROGRESS: + return "Disable In Progress"; + case NAN_TERMINATED_REASON_POST_DISC_ATTR_EXPIRED: + return "Post-Discovery Attribute Expired"; + case NAN_TERMINATED_REASON_POST_DISC_LEN_EXCEEDED: + return "Post-Discovery Attribute Length Exceeded"; + case NAN_TERMINATED_REASON_FURTHER_AVAIL_MAP_EMPTY: + return "Further Availability Map Empty"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_event_id_str( + A_UINT8 event_id) +{ + switch (event_id) + { + case NAN_EVENT_ID_SELF_STA_MAC_ADDR: + return "Self-Station MAC Addr"; + case NAN_EVENT_ID_STARTED_CLUSTER: + return "Started Cluster"; + case NAN_EVENT_ID_JOINED_CLUSTER: + return "Joined Cluster"; + default: + return "Unknown"; + } +} + +const char * +dbglog_get_nan_stats_id_str( + A_UINT8 stats_id) +{ + switch (stats_id) + { + case NAN_STATS_ID_DE_PUBLISH: + return "DE Publish"; + case NAN_STATS_ID_DE_SUBSCRIBE: + return "DE Subscribe"; + case NAN_STATS_ID_DE_MAC: + return "DE MAC"; + case NAN_STATS_ID_DE_TIMING_SYNC: + return "DE Timing Sync"; + case NAN_STATS_ID_DE_DW: + return "DE DW"; + case NAN_STATS_ID_DE: + return "DE"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_tlv_type_str( + A_UINT16 tlv_type) +{ + switch (tlv_type) + { + case NAN_TLV_TYPE_SERVICE_NAME: + return "Service Name"; + case NAN_TLV_TYPE_SDF_MATCH_FILTER: + return "SDF Match Filter"; + case NAN_TLV_TYPE_TX_MATCH_FILTER: + return "Tx Match Filter"; + case NAN_TLV_TYPE_RX_MATCH_FILTER: + return "Rx Match Filter"; + case NAN_TLV_TYPE_SERVICE_SPECIFIC_INFO: + return "Service Specific Info"; + case NAN_TLV_TYPE_EXT_SERVICE_SPECIFIC_INFO: + return "Extended Service Specific Info"; + case NAN_TLV_TYPE_VENDOR_SPECIFIC_ATTRIBUTE_TRANSMIT: + return "VSA Transmit"; + case NAN_TLV_TYPE_VENDOR_SPECIFIC_ATTRIBUTE_RECEIVE: + return "VSA Receive"; + case NAN_TLV_TYPE_POST_NAN_CONNECTIVITY_CAPABILITIES_RECEIVE: + return "Post-NAN Capabilities Receive"; + case NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_RECEIVE: + return "Post-NAN Discovery Receive"; + case NAN_TLV_TYPE_BEACON_SDF_PAYLOAD_RECEIVE: + return "Bcn/SDF Payload Receive"; + + // Config TLVs + case NAN_TLV_TYPE_24G_SUPPORT: + return "2.4G Support Enabled"; + case NAN_TLV_TYPE_24G_BEACON: + return "2.4G Beacon Support"; + case NAN_TLV_TYPE_24G_SDF: + return "2.4G SDF Support"; + case NAN_TLV_TYPE_24G_RSSI_CLOSE: + return "2.4G RSSI Close"; + case NAN_TLV_TYPE_24G_RSSI_MIDDLE: + return "2.4G RSSI Middle"; + case NAN_TLV_TYPE_24G_RSSI_CLOSE_PROXIMITY: + return "2.4G RSSI Close Proximity"; + case NAN_TLV_TYPE_5G_SUPPORT: + return "5G Support Enabled"; + case NAN_TLV_TYPE_5G_BEACON: + return "5G Beacon Support"; + case NAN_TLV_TYPE_5G_SDF: + return "5G SDF Support"; + case NAN_TLV_TYPE_5G_RSSI_CLOSE: + return "5G RSSI Close"; + case NAN_TLV_TYPE_5G_RSSI_MIDDLE: + return "5G RSSI Middle"; + case NAN_TLV_TYPE_5G_RSSI_CLOSE_PROXIMITY: + return "5G RSSI Close Proximity"; + case NAN_TLV_TYPE_SID_BEACON: + return "SID Beacon"; + case NAN_TLV_TYPE_HOP_COUNT_LIMIT: + return "Hop Count Limit"; + case NAN_TLV_TYPE_MASTER_PREFERENCE: + return "Master Preference"; + case NAN_TLV_TYPE_CLUSTER_ID_LOW: + return "Cluster ID Low"; + case NAN_TLV_TYPE_CLUSTER_ID_HIGH: + return "Cluster ID High"; + case NAN_TLV_TYPE_RSSI_AVERAGING_WINDOW_SIZE: + return "RSSI Averaging Window Size"; + case NAN_TLV_TYPE_CLUSTER_OUI_NETWORK_ID: + return "Cluster OUI NetworkID"; + case NAN_TLV_TYPE_SOURCE_MAC_ADDRESS: + return "Source MAC Addr"; + case NAN_TLV_TYPE_CLUSTER_ATTRIBUTE_IN_SDF: + return "Cluster Attribute in SDF"; + case NAN_TLV_TYPE_SOCIAL_CHANNEL_SCAN_PARAMS: + return "Social Channel Scan Params"; + case NAN_TLV_TYPE_DEBUGGING_FLAGS: + return "Debugging Flags"; + case NAN_TLV_TYPE_POST_NAN_CONNECTIVITY_CAPABILITIES_TRANSMIT: + return "Post-NAN Capabilities Transmit"; + case NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_TRANSMIT: + return "Post-NAN Discovery Transmit"; + case NAN_TLV_TYPE_FURTHER_AVAILABILITY_MAP: + return "Further Availability Map"; + case NAN_TLV_TYPE_HOP_COUNT_FORCE: + return "Hop Count Force"; + case NAN_TLV_TYPE_RANDOM_FACTOR_FORCE: + return "Random Factor Force"; + + + case NAN_TLV_TYPE_AVAILABILITY_INTERVALS_MAP: + return "Availability Intervals Map"; + case NAN_TLV_TYPE_WLAN_MESH_ID: + return "WLAN Mesh ID"; + case NAN_TLV_TYPE_MAC_ADDRESS: + return "MAC Addr"; + case NAN_TLV_TYPE_RECEIVED_RSSI_VALUE: + return "Recevied RSSI Value"; + case NAN_TLV_TYPE_CLUSTER_ATTRIBUTE: + return "Cluster Attr"; + + case NAN_TLV_TYPE_EVENT_SELF_STATION_MAC_ADDRESS: + return "Self MAC Addr"; + case NAN_TLV_TYPE_EVENT_STARTED_CLUSTER: + return "Start Cluster Addr"; + case NAN_TLV_TYPE_EVENT_JOINED_CLUSTER: + return "Joined Cluster Addr"; + case NAN_TLV_TYPE_EVENT_CLUSTER_SCAN_RESULTS: + return "Cluster Scan Results"; + + case NAN_TLV_TYPE_CLUSTER_SIZE_REQ: + return "TCA Cluster Size Req"; + case NAN_TLV_TYPE_CLUSTER_SIZE_RSP: + return "TCA Cluster Size Rsp"; + + case NAN_TLV_TYPE_DE_PUBLISH_STATS: + return "DE Publish Stats"; + case NAN_TLV_TYPE_DE_SUBSCRIBE_STATS: + return "DE Subscribe Stats"; + case NAN_TLV_TYPE_DE_MAC_STATS: + return "DE MAC Stats"; + case NAN_TLV_TYPE_DE_TIMING_SYNC_STATS: + return "DE Timing Sync Stats"; + case NAN_TLV_TYPE_DE_DW_STATS: + return "DE DW Stats"; + case NAN_TLV_TYPE_DE_STATS: + return "DE Stats"; + + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_publish_type_str( + A_UINT32 publish_type) +{ + switch (publish_type) + { + case NAN_PUBLISH_TYPE_UNSOLICITED: + return "Unsolicited"; + case NAN_PUBLISH_TYPE_SOLICITED: + return "Solicited"; + case NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED: + return "Unsolicited/Solicitted"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_tx_type_str( + A_UINT32 tx_type) +{ + switch (tx_type) + { + case NAN_TX_TYPE_BROADCAST: + return "Broadcast"; + case NAN_TX_TYPE_UNICAST: + return "Unicast"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_subscribe_type_str( + A_UINT8 subscribe_type) +{ + switch (subscribe_type) + { + case NAN_SUBSCRIBE_TYPE_PASSIVE: + return "Passive"; + case NAN_SUBSCRIBE_TYPE_ACTIVE: + return "Active"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_srf_attr_str( + A_UINT8 srf_attr) +{ + switch (srf_attr) + { + case NAN_SRF_ATTR_BLOOM_FILTER: + return "Bloom Filter"; + case NAN_SRF_ATTR_PARTIAL_MAC_ADDR: + return "Partial MAC Addr"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_src_include_bit_str( + A_UINT8 src_include_bit) +{ + switch (src_include_bit) + { + case NAN_SRF_INCLUDE_DO_NOT_RESPOND: + return "Do Not Respond"; + case NAN_SRF_INCLUDE_RESPOND: + return "Respond"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_match_alg_str( + A_UINT8 match_alg) +{ + switch (match_alg) + { + case NAN_MATCH_ALG_MATCH_ONCE: + return "Match Once"; + case NAN_MATCH_ALG_MATCH_CONTINUOUS: + return "Match Continuous"; + default: + return "Unknown"; + } +} + + +static const char * +dbglog_get_nan_tx_priority_str( + A_UINT32 tx_priority) +{ + switch (tx_priority) + { + case NAN_TX_PRIORITY_LOW: + return "Low"; + case NAN_TX_PRIORITY_NORMAL: + return "Normal"; + case NAN_TX_PRIORITY_HIGH: + return "High"; + default: + return "Unknown"; + } +} + +static const char * +dbglog_get_nan_window_str( + A_UINT8 window) +{ + switch (window) + { + case NAN_WINDOW_DW: + return "DW"; + case NAN_WINDOW_FAW: + return "FAW"; + default: + return "Unknown"; + } +} + + +static const char * +dbglog_get_nan_role_str( + A_UINT8 nan_role) +{ + switch (nan_role) + { + case NAN_ROLE_NON_MASTER_NON_SYNC: + return "NON-MASTER-NON-SYNC"; + case NAN_ROLE_NON_MASTER_SYNC: + return "NON-MASTER-SYNC"; + case NAN_ROLE_MASTER: + return "MASTER"; + case NAN_ROLE_INVALID: + break; + default: + break; + } + return "Unknown"; +} + +static const char * +dbglog_get_nan_chan_type( + A_UINT32 type) +{ + switch (type) + { + case 1: + return "Primary DW"; + case 2: + return "Primary DiscBcn"; + case 3: + return "Secondary DW"; + case 4: + return "Secondary DiscBcn"; + default: + break; + } + return "Invalid/Unknown"; +} + +/* + * NOTE: Use the following convenience macros with care!!! + * + * They expect that certain variables are present and also have specific uses, + * e.g. within switch case statements. + */ +#define GET_TYPE (args[0] >> 16) +#define GET_LENGTH (args[0] & 0xFFFFu) + +#define CHECK_TYPE(param_max, type) \ + if ((param_idx < (param_max)) && ((type) != NAN_TLV_TYPE_LAST)) \ + { \ + dbglog_printf(timestamp, vap_id, \ + " %s: unexpected type %u for parameter index %u", \ + __func__, (type), param_idx); \ + return; \ + } + +#define CHECK_LENGTH(rx_length, exp_length) \ + if ((rx_length) != (exp_length)) \ + { \ + dbglog_printf(timestamp, vap_id, \ + " %s: invalid size (%u vs. %u) for parameter index %u", \ + __func__, (rx_length), (exp_length), param_idx); \ + break; \ + } + +#define LOG_UNKNOWN_PARAM() \ + dbglog_printf(timestamp, vap_id, \ + " %s: unknown parameter with index %u, numargs %u", \ + __func__, param_idx, numargs); + +#if 1 +#define VAR64BIT(__lo, __hi) \ + (A_UINT64)((A_UINT64)(__lo & 0xFFFFFFFFull) | \ + (A_UINT64)(__hi & 0xFFFFFFFFull) << 32) +#endif + +static void +dbglog_nan_tlv_print_handler( + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + + if (type == NAN_TLV_TYPE_LAST) + { + dbglog_printf(timestamp, vap_id, + " %s: unexpected type %u for parameter index %u", + __func__, type); + return; + } + + char str[128] = { 0 }; + A_UINT16 arg_idx; + A_UINT16 byte_idx; + A_UINT16 shift; + A_UINT16 byteCount = 0; + + /* TLV data starts at args[1]. */ + for (arg_idx=1; arg_idx < numargs; ++arg_idx) + { + for (byte_idx=0, shift=24; byte_idx < 4; ++byte_idx, shift -= 8) + { + if (byteCount < length) + { + byteCount++; + snprintf(&str[STR_INDEX((arg_idx-1), byte_idx)], + sizeof(&str[STR_INDEX((arg_idx-1), byte_idx)]),"%02X ", + ((args[arg_idx] >> shift) & 0xFF)); + } + } + } + + dbglog_printf(timestamp, vap_id, " %s: %s", + dbglog_get_nan_tlv_type_str(type), str ); +} + +static void +dbglog_nan_error_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_configuration_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); +} + +static void +dbglog_nan_configuration_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_publish_service_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(9, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " ttl: %u", args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " period: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " replyIndFlag: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " publishType: %s (%u)", + dbglog_get_nan_publish_type_str(args[1]), args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " txType: %s (%u)", + dbglog_get_nan_tx_type_str(args[1]), args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " useRssi: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " otaFlag: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " count: %u", args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " connMap: 0x%04X", args[1]); + // FIXME: decode this further. + break; + + default: + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); + break; + } +} + +static void +dbglog_nan_publish_service_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_publish_service_cancel_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + LOG_UNKNOWN_PARAM(); +} + +static void +dbglog_nan_publish_service_cancel_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_publish_replied_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); +} + +static void +dbglog_nan_publish_terminated_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " reason: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_subscribe_service_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(12, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " ttl: %u", args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " period: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " subscribeType: %s (%u)", + dbglog_get_nan_subscribe_type_str(args[1]), args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " srfAttr: %s (%u)", + dbglog_get_nan_srf_attr_str(args[1]), args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " srfInclude: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " srfSend: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " ssiRequired: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " matchAlg: %s (%u)", + dbglog_get_nan_match_alg_str(args[1]), args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " count: %u", args[1]); + break; + + case 9: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " useRssi: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 10: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " otaFlag: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + case 11: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " connMap: 0x%04X", args[1]); + // FIXME: decode this further. + break; + + default: + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); + break; + } +} + +static void +dbglog_nan_subscribe_service_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_subscribe_service_cancel_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + LOG_UNKNOWN_PARAM(); +} + +static void +dbglog_nan_subscribe_service_cancel_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_subscribe_match_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " matchHandle: %u", args[1]); + break; + + default: + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); + break; + } +} + +static void +dbglog_nan_subscribe_unmatch_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " matchHandle: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_subscribe_terminated_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " reason: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_de_event_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); +} + +static void +dbglog_nan_transmit_followup_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " txPriority: %s (%u)", + dbglog_get_nan_tx_priority_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " window: %s (%u)", + dbglog_get_nan_window_str(args[1]), args[1]); + break; + + default: + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); + break; + } +} + +static void +dbglog_nan_transmit_followup_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_followup_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, " window: %s (%u)", + dbglog_get_nan_window_str(args[1]), args[1]); + break; + + default: + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); + break; + } +} + +static void +dbglog_nan_stats_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, + " statsId: %s (%u)", + dbglog_get_nan_stats_id_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " clear: %s (%u)", + BOOL_STR(args[1]), args[1]); + break; + + default: + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); + break; + } +} + +static void +dbglog_nan_publish_stats_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(15, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validPublishServiceReqMsgs: %u", args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validPublishServiceRspMsgs: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validPublishServiceCancelReqMsgs: %u", args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validPublishServiceCancelRspMsgs: %u", args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validPublishRepliedIndMsgs: %u", args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validPublishTerminatedIndMsgs: %u", args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validActiveSubscribes: %u", args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validMatches: %u", args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validFollowups: %u", args[1]); + break; + + case 9: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidPublishServiceReqMsgs: %u", args[1]); + break; + + case 10: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidPublishServiceCancelReqMsgs: %u", args[1]); + break; + + case 11: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidActiveSubscribes: %u", args[1]); + break; + + case 12: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidMatches: %u", args[1]); + break; + + case 13: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidFollowups: %u", args[1]); + break; + + case 14: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " publishCount: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_subscribe_stats_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(17, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeServiceReqMsgs: %u", args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeServiceRspMsgs: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeServiceCancelReqMsgs: %u", args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeServiceCancelRspMsgs: %u", args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeTerminatedIndMsgs: %u", args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeMatchIndMsgs: %u", args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSubscribeUnmatchIndMsgs: %u", args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validSolicitedPublishes: %u", args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validMatches: %u", args[1]); + break; + + case 9: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validFollowups: %u", args[1]); + break; + + case 10: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidSubscribeServiceReqMsgs: %u", args[1]); + break; + + case 11: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidSubscribeServiceCancelReqMsgs: %u", args[1]); + break; + + case 12: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidSolicitedPublishes: %u", args[1]); + break; + + case 13: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidMatches: %u", args[1]); + break; + + case 14: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidFollowups: %u", args[1]); + break; + + case 15: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " subscribeCount: %u", args[1]); + break; + + case 16: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " bloomFilterIndex: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_mac_stats_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(25, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validFrames: %u", args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validActionFrames: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validBeaconFrames: %u", args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " ignoredActionFrames: %u", args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " ignoredBeaconFrames: %u", args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidFrames: %u", args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidActionFrames: %u", args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidBeaconFrames: %u", args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidMacHeaders: %u", args[1]); + break; + + case 9: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidPafHeaders: %u", args[1]); + break; + + case 10: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " nonNanBeaconFrames: %u", args[1]); + break; + + case 11: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " earlyActionFrames: %u", args[1]); + break; + + case 12: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " inDwActionFrames: %u", args[1]); + break; + + case 13: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " lateActionFrames: %u", args[1]); + break; + + case 14: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " framesQueued: %u", args[1]); + break; + + case 15: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " totalTRSpUpdates: %u", args[1]); + break; + + case 16: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " completeByTRSp: %u", args[1]); + break; + + case 17: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " completeByTp75DW: %u", args[1]); + break; + + case 18: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " completeByTendDW: %u", args[1]); + break; + + case 19: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " lateActionFramesTx: %u", args[1]); + break; + + case 20: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " twIncreases: %u", args[1]); + break; + + case 21: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " twDecreases: %u", args[1]); + break; + + case 22: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " twChanges: %u", args[1]); + break; + + case 23: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " twHighwater: %u", args[1]); + break; + + case 24: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " bloomFilterIndex: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_timing_sync_stats_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(36, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " currTsf: 0x%08lx_%08lx", args[2], args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " myRank: 0x%08lx_%08lx", args[2], args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " currAmRank: 0x%08lx_%08lx", args[2], args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " lastAmRank: 0x%08lx_%08lx", args[2], args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " currAmBTT: 0x%08lx", args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " lastAmBTT: 0x%08lx", args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, + " currAmHopCount: %u", args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, + " currRole: %s (%u)", + dbglog_get_nan_role_str(args[1]), args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, + " clusterId: 0x%04x", args[1]); + break; + + case 9: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " timeSpentInCurrRole: 0x%08lx_%08lx, %lu seconds", + args[2], args[1], (A_UINT32) (VAR64BIT(args[1], args[2])/1000000ull)); + break; + + case 10: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " totalTimeSpentAsMaster: 0x%08lx_%08lx, %lu seconds", + args[2], args[1], (A_UINT32) (VAR64BIT(args[1], args[2])/1000000ull)); + break; + + case 11: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " totalTimeSpentAsNonMasterSync: 0x%08lx_%08lx, %lu seconds", + args[2], args[1], (A_UINT32) (VAR64BIT(args[1], args[2])/1000000ull)); + break; + + case 12: + CHECK_LENGTH(length, sizeof(A_UINT64)); + dbglog_printf(timestamp, vap_id, + " totalTimeSpentAsNonMasterNonSync: 0x%08lx_%08lx, %lu seconds", + args[2], args[1], (A_UINT32) (VAR64BIT(args[1], args[2])/1000000ull)); + break; + + case 13: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " transitionsToAnchorMaster: %u", args[1]); + break; + + case 14: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " transitionsToMaster: %u", args[1]); + break; + + case 15: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " transitionsToNonMasterSync: %u", args[1]); + break; + + case 16: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " transitionsToNonMasterNonSync: %u", args[1]); + break; + + case 17: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amrUpdateCount: %u", args[1]); + break; + + case 18: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amrUpdateRankChangedCount: %u", args[1]); + break; + + case 19: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amrUpdateBTTChangedCount: %u", args[1]); + break; + + case 20: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amrUpdateHcChangedCount: %u", args[1]); + break; + + case 21: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amrUpdateNewDeviceCount: %u", args[1]); + break; + + case 22: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amrExpireCount: %u", args[1]); + break; + + case 23: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " mergeCount: %u", args[1]); + break; + + case 24: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconsAboveHcLimit: %u", args[1]); + break; + + case 25: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconsBelowRssiThresh: %u", args[1]); + break; + + case 26: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconsIgnoredNoSpace: %u", args[1]); + break; + + case 27: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconsForOurCluster: %u", args[1]); + break; + + case 28: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconsForOtherCluster: %u", args[1]); + break; + + case 29: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconCancelRequests: %u", args[1]); + break; + + case 30: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconCancelFailures: %u", args[1]); + break; + + case 31: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconUpdateRequests: %u", args[1]); + break; + + case 32: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " beaconUpdateFailures: %u", args[1]); + break; + + case 33: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " syncBeaconTxAttempts: %u", args[1]); + break; + + case 34: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " syncBeaconTxFailures: %u", args[1]); + break; + + case 35: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " discBeaconTxAttempts: %u", args[1]); + break; + + case 36: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " discBeaconTxFailures: %u", args[1]); + break; + + case 37: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " amHopCountExpireCount: %u", args[1]); + break; + + case 38: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " reserved: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_dw_stats_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + /* DW stats are the same as MAC stats. */ + dbglog_nan_mac_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); +} + +static void +dbglog_nan_de_stats_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(23, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validErrorRspMsgs: %u", args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validTransmitFollowupReqMsgs: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validTransmitFollowupRspMsgs: %u", args[1]); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validFollowupIndMsgs: %u", args[1]); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validConfigurationReqMsgs: %u", args[1]); + break; + + case 5: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validConfigurationRspMsgs: %u", args[1]); + break; + + case 6: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validStatsReqMsgs: %u", args[1]); + break; + + case 7: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validStatsRspMsgs: %u", args[1]); + break; + + case 8: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validEnableReqMsgs: %u", args[1]); + break; + + case 9: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validEnableRspMsgs: %u", args[1]); + break; + + case 10: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validDisableReqMsgs: %u", args[1]); + break; + + case 11: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validDisableRspMsgs: %u", args[1]); + break; + + case 12: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validDisableIndMsgs: %u", args[1]); + break; + + case 13: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validEventIndMsgs: %u", args[1]); + break; + + case 14: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validTcaReqMsgs: %u", args[1]); + break; + + case 15: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validTcaRspMsgs: %u", args[1]); + break; + + case 16: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validTcaIndMsgs: %u", args[1]); + break; + + case 17: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidTransmitFollowupReqMsgs: %u", args[1]); + break; + + case 18: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidConfigurationReqMsgs: %u", args[1]); + break; + + case 19: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidStatsReqMsgs: %u", args[1]); + break; + + case 20: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidEnableReqMsgs: %u", args[1]); + break; + + case 21: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidDisableReqMsgs: %u", args[1]); + break; + + case 22: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidTcaReqMsgs: %u", args[1]); + break; + + case 23: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validBcnSdfPayloadReqMsgs: %u", args[1]); + break; + + case 24: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validBcnSdfPayloadRspMsgs: %u", args[1]); + break; + + case 25: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " validBcnSdfPayloadIndMsgs: %u", args[1]); + break; + + case 26: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, + " invalidBcnSdfPayloadReqMsgs: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_stats_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + static A_UINT8 stats_id = NAN_STATS_ID_LAST; + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + //CHECK_TYPE(3, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_UINT8)); + dbglog_printf(timestamp, vap_id, + " statsId: %s (%u)", + dbglog_get_nan_stats_id_str(args[1]), args[1]); + stats_id = (A_UINT8)args[1]; + break; + + default: + if (NAN_STATS_ID_LAST == stats_id) + { + dbglog_printf(timestamp, vap_id, "Stats ID not set yet"); + break; + } + + /* -3 for the status, length, and stats ID already processed. */ + param_idx -= 3; + + switch (stats_id) + { + case NAN_STATS_ID_DE_PUBLISH: + dbglog_nan_publish_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_STATS_ID_DE_SUBSCRIBE: + dbglog_nan_subscribe_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_STATS_ID_DE_MAC: + dbglog_nan_mac_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_STATS_ID_DE_TIMING_SYNC: + dbglog_nan_timing_sync_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_STATS_ID_DE_DW: + dbglog_nan_dw_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_STATS_ID_DE: + dbglog_nan_de_stats_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + default: + dbglog_printf(timestamp, vap_id, "Invalid stats id %u", stats_id); + break; + } + break; + } +} + +static void +dbglog_nan_enable_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); +} + +static void +dbglog_nan_enable_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_disable_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + LOG_UNKNOWN_PARAM(); +} + +static void +dbglog_nan_disable_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_disable_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " reason: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_tca_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(5, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " tcaTlv: %s (%u)", + dbglog_get_nan_tlv_type_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " rising: %s", BOOL_STR(args[1])); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " falling: %s", BOOL_STR(args[1])); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " clear: %s", BOOL_STR(args[1])); + break; + + case 4: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, " threshold: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_tca_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(2, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_tca_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(4, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " tcaTlv: %s (%u)", + dbglog_get_nan_tlv_type_str(args[1]), args[1]); + break; + + case 1: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " rising: %s", BOOL_STR(args[1])); + break; + + case 2: + CHECK_LENGTH(length, sizeof(A_BOOL)); + dbglog_printf(timestamp, vap_id, " falling: %s", BOOL_STR(args[1])); + break; + + case 3: + CHECK_LENGTH(length, sizeof(A_UINT32)); + dbglog_printf(timestamp, vap_id, " value: %u", args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + +static void +dbglog_nan_bcn_sdf_payload_req_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + //A_UINT16 type = GET_TYPE; + //A_UINT16 length = GET_LENGTH; + //CHECK_TYPE(0, type); + + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); +} + +static void +dbglog_nan_bcn_sdf_payload_rsp_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + A_UINT16 type = GET_TYPE; + A_UINT16 length = GET_LENGTH; + CHECK_TYPE(1, type); + + switch (param_idx) + { + case 0: + CHECK_LENGTH(length, sizeof(A_UINT16)); + dbglog_printf(timestamp, vap_id, " status: %s (%u)", + dbglog_get_nan_status_str(args[1]), args[1]); + break; + + default: + LOG_UNKNOWN_PARAM(); + break; + } +} + + + +static void +dbglog_nan_bcn_sdf_payload_ind_msg_print_handler( + A_UINT32 param_idx, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + //A_UINT16 type = GET_TYPE; + //A_UINT16 length = GET_LENGTH; + //CHECK_TYPE(0, type); + + dbglog_nan_tlv_print_handler(vap_id, dbg_id, timestamp, numargs, args); +} + +static A_BOOL +dbglog_nan_api_msg_print_handler( + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + static A_UINT32 msg_id = NAN_MSG_ID_LAST; + static A_UINT32 param_idx = 0; + + if (dbg_id == NAN_DBGID_API_MSG_HEADER) + { + param_idx = 0; + msg_id = args[0]; + + if (args[0] < NAN_MSG_ID_LAST) + { + dbglog_printf(timestamp, vap_id, + "NAN %s/%u (version %u, id %u, length %u, handle %u, " + "transaction id %u)", + dbglog_get_nan_msg_id_str(args[0]), args[0], + args[1], args[0], args[2], args[3], args[4]); + } + else + { + dbglog_printf(timestamp, vap_id, + "NAN unknown msg %u (version %u, length %u, handle %u, " + "transaction id %u)", + args[0], args[1], args[2], args[3], args[4]); + } + return TRUE; + } + else if (dbg_id == NAN_DBGID_API_MSG_DATA) + { + switch (msg_id) + { + case NAN_MSG_ID_ERROR_RSP: + dbglog_nan_error_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_CONFIGURATION_REQ: + dbglog_nan_configuration_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_CONFIGURATION_RSP: + dbglog_nan_configuration_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_PUBLISH_SERVICE_REQ: + dbglog_nan_publish_service_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_PUBLISH_SERVICE_RSP: + dbglog_nan_publish_service_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_PUBLISH_SERVICE_CANCEL_REQ: + dbglog_nan_publish_service_cancel_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_PUBLISH_SERVICE_CANCEL_RSP: + dbglog_nan_publish_service_cancel_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_PUBLISH_REPLIED_IND: + dbglog_nan_publish_replied_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_PUBLISH_TERMINATED_IND: + dbglog_nan_publish_terminated_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_SERVICE_REQ: + dbglog_nan_subscribe_service_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_SERVICE_RSP: + dbglog_nan_subscribe_service_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_SERVICE_CANCEL_REQ: + dbglog_nan_subscribe_service_cancel_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_SERVICE_CANCEL_RSP: + dbglog_nan_subscribe_service_cancel_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_MATCH_IND: + dbglog_nan_subscribe_match_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_UNMATCH_IND: + dbglog_nan_subscribe_unmatch_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_SUBSCRIBE_TERMINATED_IND: + dbglog_nan_subscribe_terminated_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_DE_EVENT_IND: + dbglog_nan_de_event_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_TRANSMIT_FOLLOWUP_REQ: + dbglog_nan_transmit_followup_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_TRANSMIT_FOLLOWUP_RSP: + dbglog_nan_transmit_followup_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_FOLLOWUP_IND: + dbglog_nan_followup_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_STATS_REQ: + dbglog_nan_stats_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_STATS_RSP: + dbglog_nan_stats_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_ENABLE_REQ: + dbglog_nan_enable_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_ENABLE_RSP: + dbglog_nan_enable_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_DISABLE_REQ: + dbglog_nan_disable_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_DISABLE_RSP: + dbglog_nan_disable_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_DISABLE_IND: + dbglog_nan_disable_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_TCA_REQ: + dbglog_nan_tca_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_TCA_RSP: + dbglog_nan_tca_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_TCA_IND: + dbglog_nan_tca_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_BCN_SDF_PAYLOAD_REQ: + dbglog_nan_bcn_sdf_payload_req_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_BCN_SDF_PAYLOAD_RSP: + dbglog_nan_bcn_sdf_payload_rsp_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + case NAN_MSG_ID_BCN_SDF_PAYLOAD_IND: + dbglog_nan_bcn_sdf_payload_ind_msg_print_handler( + param_idx, vap_id, dbg_id, timestamp, numargs, args); + break; + + + default: + LOG_UNKNOWN_PARAM(); + break; + } + + param_idx++; + return TRUE; + } + else + { + return FALSE; + } +} + +static A_BOOL +dbglog_nan_ota_pkt_print_handler( + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + if (dbg_id == NAN_DBGID_OTA_PKT_HEADER) + { + dbglog_printf(timestamp, vap_id, "%s %s, length %u", + DBG_MSG_ARR[dbg_id], + (args[0] ? "transmitted" : "received"), args[1]); + return TRUE; + } + + if (dbg_id == NAN_DBGID_OTA_PKT_DATA) + { + char str[128]; + A_UINT16 arg_idx; + A_UINT16 byte_idx; + A_UINT16 shift; + + for (arg_idx=0; arg_idx < numargs; ++arg_idx) + { + for (byte_idx=0, shift=24; byte_idx < 4; ++byte_idx, shift -= 8) + { + snprintf(&str[STR_INDEX(arg_idx, byte_idx)], + sizeof(&str[STR_INDEX(arg_idx, byte_idx)]), "%02X ", + ((args[arg_idx] >> shift) & 0xFF)); + } + } + + dbglog_printf(timestamp, vap_id, "%s: %s", DBG_MSG_ARR[dbg_id], str); + return TRUE; + } + + return FALSE; +} + +A_BOOL +dbglog_nan_print_handler( + A_UINT32 mod_id, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + if ((dbg_id >= NAN_DBGID_DBG_LOG_BASE) && + (dbg_id < NAN_DBGID_DBG_LOG_LAST)) + { + return dbglog_nan_debug_print_handler( + vap_id, dbg_id, timestamp, numargs, args); + } + else if ((dbg_id >= NAN_DBGID_EVT_BASE) && + (dbg_id < NAN_DBGID_EVT_LOG_LAST)) + { + return dbglog_nan_event_print_handler( + vap_id, dbg_id, timestamp, numargs, args); + } + else if ((dbg_id >= NAN_DBGID_API_MSG_BASE) && + (dbg_id < NAN_DBGID_API_MSG_LAST)) + { + return dbglog_nan_api_msg_print_handler( + vap_id, dbg_id, timestamp, numargs, args); + } + else if ((dbg_id >= NAN_DBGID_OTA_PKT_BASE) && + (dbg_id < NAN_DBGID_OTA_PKT_LAST)) + { + return dbglog_nan_ota_pkt_print_handler( + vap_id, dbg_id, timestamp, numargs, args); + } + else if (dbg_id == DBGLOG_DBGID_SM_FRAMEWORK_PROXY_DBGLOG_MSG) + { + static const char *states[] = + { + "IDLE", + "WAIT", + "STARTING", + "JOINING", + "ACTIVE", + "MERGING" + }; + + static const char *events[] = + { + "NONE", + "STARTSM", + "STOPSM", + "BEACON_RECVD", + "WAIT_TIMEOUT", + "START_TIMEOUT", + "DELAYED_START", + "BGSCAN_TIMEOUT", + "SCAN_TIMEOUT", + "SCAN_COMPLETE", + "CLUSTER_MERGE", + "UNKNOWN" + }; + + dbglog_sm_print(timestamp, vap_id, numargs, args, "NAN Cluster SM", + states, ARRAY_LENGTH(states), events, ARRAY_LENGTH(events)); + return TRUE; + } + + return FALSE; +} + diff --git a/tools/fwdebuglog/parser.c b/tools/fwdebuglog/parser.c index 6c9d2d177c7f..3d3f42c77a2b 100644 --- a/tools/fwdebuglog/parser.c +++ b/tools/fwdebuglog/parser.c @@ -66,6 +66,15 @@ extern int optionflag; module_dbg_print mod_print[WLAN_MODULE_ID_MAX]; +extern A_BOOL +dbglog_nan_print_handler( + A_UINT32 mod_id, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args); + const char *dbglog_get_module_str(A_UINT32 module_id) { switch (module_id) { @@ -2724,6 +2733,7 @@ int parser_init() dbglog_reg_modprint(WLAN_MODULE_STA_SMPS, dbglog_smps_print_handler); dbglog_reg_modprint(WLAN_MODULE_P2P, dbglog_p2p_print_handler); dbglog_reg_modprint(WLAN_MODULE_PCIELP, dbglog_pcielp_print_handler); + dbglog_reg_modprint(WLAN_MODULE_NAN, dbglog_nan_print_handler); return 0; } |
