#!/bin/sh # # WlGetDriverStats.sh # # Copyright (C) 2019, Broadcom. All Rights Reserved. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # <> # WLCMD=wl DHDCMD=dhd IFNAME=$1 DUMPPATH=/tmp DUMPDIR=${DUMPPATH}/$(date +"%d:%m:%Y_%H:%M") SOCRAMDUMPFILE=${DUMPDIR}/socram_${IFNAME} LOOP_TIME=10 NR_RUNS=0 ENABLEDUMP=0 HOSTAPD_CONF=/tmp/wlX_hapd.conf show_help () { echo "Syntax: $0 " echo " or : $0 [] " echo "Example 1: $0 wl1 (infinite loop)" echo "Example 2: $0 wl1 dhd (for FD driver; infinite loop)" echo "Example 3: $0 eth5 auto 12 enable (for any driver; 12 loops - 5s between loops; dump socram also)" echo "Try \`$0 --help' for more information." exit } dump_hapd () { for i in 0 1 2 do HAPDFILE=${HOSTAPD_CONF//X/$i} if test -f $HAPDFILE; then echo "------- Dumping $HAPDFILE ----------" cat $HAPDFILE fi done } # $1 Heading # $2 cmd to execute display_cmd_op(){ cmd="$2" echo "---------------------------------" echo -e "$1" echo "---------------------------------" $cmd | while IFS= read -r line do echo -e "\t""$line" done } # Help option if [[ $# -eq 1 ]] && [[ $1 == "--help" ]]; then show_help exit 0 fi if [ $# -eq 0 ]; then show_help exit 0 fi MODE="auto" ENABLEDUMP="disable" NR_REPEATS=0 if [ $# -eq 4 ]; then MODE=$2 NR_REPEATS=$3 ENABLEDUMP=$4 elif [ $# -eq 3 ]; then if [[ $2 != "nic" ]] && [[ $2 != "dhd" ]] && [[ $2 != "auto" ]]; then NR_REPEATS=$2 ENABLEDUMP=$3 else MODE=$2 NR_REPEATS=$3 fi elif [ $# -eq 2 ]; then if [[ $2 != "nic" ]] && [[ $2 != "dhd" ]] && [[ $2 != "auto" ]]; then NR_REPEATS=$2 else MODE=$2 fi fi if [ $MODE = "auto" ]; then fwid=$(wl -i $IFNAME ver | grep -c FWID) if [ $fwid = "1" ]; then MODE="dhd" else MODE="nic" fi fi if [[ $MODE != "nic" ]] && [[ $MODE != "dhd" ]]; then echo "UNKNOWN driver mode!" show_help exit 0 fi # Overwrite msglevel WLMSGLVL=`wl -i $IFNAME msglevel | cut -d ' ' -f1` wl -i $IFNAME msglevel 0 if [[ $MODE == "dhd" ]]; then echo -n $IFNAME DHD version = ; echo $($DHDCMD -i $IFNAME version) DHDMSGLVL=`dhd -i $IFNAME msglevel | cut -d ' ' -f1` $DHDCMD -i $IFNAME msglevel 0 fi driver_init () { if [ $($WLCMD -i $IFNAME isup) -ne 1 ]; then echo -e "Interface $IFNAME is not up" exit 0 fi $WLCMD -i $IFNAME bs_data > /dev/NULL 2>&1 $WLCMD -i $IFNAME pktq_stats c: a:// p:// > /dev/NULL 2>&1 $WLCMD -i $IFNAME rx_report -noidle > /dev/NULL 2>&1 } driver_info () { echo "=============================" echo "$IFNAME Driver info" echo "=============================" display_cmd_op "WLVERSION: wl -i $IFNAME ver" "$WLCMD -i $IFNAME ver" display_cmd_op "REVINFO: wl -i $IFNAME revinfo" "$WLCMD -i $IFNAME revinfo" display_cmd_op "DHDVERSION: dhd -i $IFNAME version" "$DHDCMD -i $IFNAME version" display_cmd_op "WLCAP: wl -i $IFNAME cap" "$WLCMD -i $IFNAME cap" display_cmd_op "UPTIME (sec): [System uptime] [sum of how much time each core spent idle] " "cat /proc/uptime" } wl_stats () { echo "=================================" echo "WL Statistics for $IFNAME" echo "=================================" display_cmd_op "STATUS: wl -i $IFNAME status" "$WLCMD -i $IFNAME status" display_cmd_op "ASSOCLIST: wl -i $IFNAME assoclist" "$WLCMD -i $IFNAME assoclist" for x in $($WLCMD -i $IFNAME assoclist); do if [ $x != assoclist ] ; then display_cmd_op "STAINFO: stainfo for $x" "$WLCMD -i $IFNAME sta_info $x" fi done for x in $($WLCMD -i $IFNAME assoclist); do if [ $x != assoclist ] ; then display_cmd_op "RSSI: rssi for $x" "$WLCMD -i $IFNAME rssi $x" fi done display_cmd_op "AUTH STA LIST: wl -i $IFNAME authe_sta_list" "$WLCMD -i $IFNAME authe_sta_list" display_cmd_op "SMFSTATS: wl -i $IFNAME smfstats" "$WLCMD -i $IFNAME smfstats" display_cmd_op "6G RATE: wl -i $IFNAME 6g_rate" "$WLCMD -i $IFNAME 6g_rate" display_cmd_op "5G RATE: wl -i $IFNAME 5g_rate" "$WLCMD -i $IFNAME 5g_rate" display_cmd_op "2G RATE: wl -i $IFNAME 2g_rate" "$WLCMD -i $IFNAME 2g_rate" display_cmd_op "NRATE: wl -i $IFNAME nrate" "$WLCMD -i $IFNAME nrate" display_cmd_op "RATE: wl -i $IFNAME rate" "$WLCMD -i $IFNAME rate" display_cmd_op "11H SPECT: wl -i $IFNAME spect" "$WLCMD -i $IFNAME spect" display_cmd_op "CHANIMSTATS: wl -i $IFNAME chanim_stats" "$WLCMD -i $IFNAME chanim_stats" display_cmd_op "INTERFERENCE: wl -i $IFNAME interference" "$WLCMD -i $IFNAME interference" display_cmd_op "INTERFERENCE_OVR: wl -i $IFNAME interference_override" "$WLCMD -i $IFNAME interference_override" display_cmd_op "BSDATA: wl -i $IFNAME bs_data" "$WLCMD -i $IFNAME bs_data" display_cmd_op "PKTQSTATS: wl -i $IFNAME pktq_stats" "$WLCMD -i $IFNAME pktq_stats c: a:// p://" display_cmd_op "RXREPORT: wl -i $IFNAME rx_report" "$WLCMD -i $IFNAME rx_report -noidle" display_cmd_op "TXQ DUMP: wl -i $IFNAME dump txq" "$WLCMD -i $IFNAME dump txq" display_cmd_op "PERFSTATS DUMP: wl -i $IFNAME dump perf_stats" "$WLCMD -i $IFNAME dump perf_stats" display_cmd_op "AMPDU DUMP: wl -i $IFNAME dump ampdu" "$WLCMD -i $IFNAME dump ampdu" display_cmd_op "AMSDU DUMP: wl -i $IFNAME dump amsdu" "$WLCMD -i $IFNAME dump amsdu" display_cmd_op "WLC DUMP: wl -i $IFNAME dump wlc" "$WLCMD -i $IFNAME dump wlc" display_cmd_op "TXBF DUMP: wl -i $IFNAME dump txbf" "$WLCMD -i $IFNAME dump txbf" display_cmd_op "MUTX DUMP: wl -i $IFNAME dump mutx" "$WLCMD -i $IFNAME dump mutx" display_cmd_op "MURX DUMP: wl -i $IFNAME dump murx" "$WLCMD -i $IFNAME dump murx" display_cmd_op "MSCHED DUMP: wl -i $IFNAME dump msched" "$WLCMD -i $IFNAME dump msched" display_cmd_op "UMSCHED DUMP: wl -i $IFNAME dump umsched" "$WLCMD -i $IFNAME dump umsched" display_cmd_op "TWT DUMP: wl -i $IFNAME dump twt" "$WLCMD -i $IFNAME dump twt" display_cmd_op "D11CNTS DUMP: wl -i $IFNAME dump d11cnts" "$WLCMD -i $IFNAME dump d11cnts" display_cmd_op "WME COUNTERS: wl -i $IFNAME wme counters" "$WLCMD -i $IFNAME wme_counters" display_cmd_op "INTERFACE COUNTERS: wl -i $IFNAME if_counters" "$WLCMD -i $IFNAME if_counters" display_cmd_op "COUNTERS: wl -i $IFNAME counters" "$WLCMD -i $IFNAME counters" display_cmd_op "MEMORY USAGE: wl -i $IFNAME memuse" "$WLCMD -i $IFNAME memuse" display_cmd_op "CHANNEL INFO: wl -i $IFNAME chan_info" "$WLCMD -i $IFNAME chan_info" display_cmd_op "DFS STATUS: wl -i $IFNAME dfs_status_all" "$WLCMD -i $IFNAME dfs_status_all" display_cmd_op "NOISE: wl -i $IFNAME noise" "$WLCMD -i $IFNAME noise" display_cmd_op "TEMPERATURE SENSOR: wl -i $IFNAME phy_tempsense" "$WLCMD -i $IFNAME phy_tempsense" display_cmd_op "BAND: wl -i $IFNAME band" "$WLCMD -i $IFNAME band" display_cmd_op "SCAN RESULTS: wl -i $IFNAME scanresults" "$WLCMD -i $IFNAME scanresults" display_cmd_op "RATELINKMEM: wl -i $IFNAME dump ratelinkmem" "$WLCMD -i $IFNAME dump ratelinkmem" } dhd_stats () { echo "=================================" echo "DHD Statistics for $IFNAME" echo "=================================" display_cmd_op "DHDDUMP: dhd -i $IFNAME DHD dump" "$DHDCMD -i $IFNAME dump" if [ $ENABLEDUMP = "enable" ] ; then mkdir $DUMPDIR display_cmd_op "SOCRAMDUMP: Uploading DUMP to $1" "$DHDCMD -i $IFNAME upload $1" fi $DHDCMD -i $IFNAME cons mu } host_side_dump () { ### host side dump echo "=================================" echo "HOST Statistics" echo "=================================" fcctl status; cat /proc/wfd/stats; cat /proc/fcache/stats/errors; cat /proc/fcache/stats/slow_path; if [[ $MODE == "dhd" ]]; then bs /d/r/pddc; bs /d/rdd pdfrc; fi cat /proc/net/igmp_snooping; cat /proc/fcache/misc/mcastlist; bs /b/e mcast; bs /b/e wlan_mcast; bs /b/e l2_ucast; ### } loop_commands () { sleep $LOOP_TIME NR_RUNS=`expr $NR_RUNS + 1` echo "=================================" echo "CPU Stats" echo "=================================" mpstat -P ALL echo "=================================" echo "Process status" echo "=================================" ps -ax if [ $? != 0 ]; then ps fi top -n 1 echo "=================================" echo "Memory status" echo "=================================" cat /proc/meminfo echo "=================================" echo "Statistics for $IFNAME run $NR_RUNS/$NR_REPEATS @$LOOP_TIME s" echo "=================================" wl_stats if [[ $MODE == "dhd" ]]; then dhd_stats "${SOCRAMDUMPFILE}_${NR_RUNS}" fi host_side_dump } if [ $MODE == "dhd" ]; then $DHDCMD -i $IFNAME version > /dev/NULL 2>&1 if [ $? -ne 0 ] ; then echo -e "Bad Interface $IFNAME $?" show_help exit 0 fi fi $WLCMD -i $IFNAME ver > /dev/NULL 2>&1 if [ $? -ne 0 ] ; then echo "########### Dongle trap detected on $IFNAME ################" exit 0 fi #driver_init driver_info #display_cmd_op "IFCONFIG: ifconfig -a" "ifconfig -a" echo "=================================" echo "Statistics for $IFNAME first run" echo "=================================" wl_stats if [[ $MODE == "dhd" ]]; then dhd_stats "${SOCRAMDUMPFILE}_${NR_RUNS}" fi if [[ $NR_REPEATS -eq 0 ]]; then while true; do loop_commands done else while [[ $NR_REPEATS -gt $NR_RUNS ]]; do loop_commands done dump_hapd # restore msglevel wl -i $IFNAME msglevel $WLMSGLVL if [ $MODE == "dhd" ]; then dhd -i $IFNAME msglevel $DHDMSGLVL fi fi