diff --git a/core/dp/htt/htt_rx.c b/core/dp/htt/htt_rx.c index 841e9479b8..1020710849 100644 --- a/core/dp/htt/htt_rx.c +++ b/core/dp/htt/htt_rx.c @@ -2205,7 +2205,6 @@ htt_rx_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev, qdf_dp_trace_set_track(msdu, QDF_RX); QDF_NBUF_CB_TX_PACKET_TRACK(msdu) = QDF_NBUF_TX_PKT_DATA_TRACK; QDF_NBUF_CB_RX_CTX_ID(msdu) = rx_ctx_id; - ol_rx_log_packet(pdev, peer_id, msdu); DPTRACE(qdf_dp_trace(msdu, QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c index 8e2e9e7310..966c409526 100644 --- a/core/dp/txrx/ol_rx.c +++ b/core/dp/txrx/ol_rx.c @@ -1626,17 +1626,6 @@ ol_rx_in_order_deliver(struct ol_txrx_vdev_t *vdev, ol_rx_data_process(peer, msdu_list); } -void ol_rx_log_packet(htt_pdev_handle htt_pdev, - uint8_t peer_id, qdf_nbuf_t msdu) -{ - struct ol_txrx_peer_t *peer; - - peer = ol_txrx_peer_find_by_id(htt_pdev->txrx_pdev, peer_id); - if (peer) - qdf_dp_trace_log_pkt(peer->vdev->vdev_id, msdu, QDF_RX, - QDF_TRACE_DEFAULT_PDEV_ID); -} - void ol_rx_offload_paddr_deliver_ind_handler(htt_pdev_handle htt_pdev, uint32_t msdu_count, diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index d0bc954c85..41107f5cd1 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -52,7 +52,6 @@ struct hdd_context; #define FW_MODULE_LOG_LEVEL_STRING_LENGTH (255) #define TX_SCHED_WRR_PARAM_STRING_LENGTH (50) #define TX_SCHED_WRR_PARAMS_NUM (5) - #define CFG_ENABLE_RX_THREAD (1 << 0) #define CFG_ENABLE_RPS (1 << 1) #define CFG_ENABLE_NAPI (1 << 2) @@ -9124,9 +9123,70 @@ enum dot11p_mode { */ #define CFG_ENABLE_DP_TRACE "enable_dp_trace" #define CFG_ENABLE_DP_TRACE_MIN (0) -#define CFG_ENABLE_DP_TRACE_MAX (1) +#define CFG_ENABLE_DP_TRACE_MAX (1) #define CFG_ENABLE_DP_TRACE_DEFAULT (1) +/* Max length of gDptraceConfig string. e.g.- "1, 6, 1, 62" */ +#define DP_TRACE_CONFIG_STRING_LENGTH (20) + +/* At max 4 DP Trace config parameters are allowed. Refer - gDptraceConfig */ +#define DP_TRACE_CONFIG_NUM_PARAMS (4) + +/* + * Default value of live mode in case it cannot be determined from cfg string + * gDptraceConfig + */ +#define DP_TRACE_CONFIG_DEFAULT_LIVE_MODE (1) + +/* + * Default value of thresh (packets/second) beyond which DP Trace is disabled. + * Use this default in case the value cannot be determined from cfg string + * gDptraceConfig + */ +#define DP_TRACE_CONFIG_DEFAULT_THRESH (4) + +/* + * Number of intervals of BW timer to wait before enabling/disabling DP Trace. + * Since throughput threshold to disable live logging for DP Trace is very low, + * we calculate throughput based on # packets received in a second. + * For example assuming bandwidth timer interval is 100ms, and if more than 4 + * packets are received in 10 * 100 ms interval, we want to disable DP Trace + * live logging. DP_TRACE_CONFIG_DEFAULT_THRESH_TIME_LIMIT is the default + * value, to be used in case the real value cannot be derived from + * bw timer interval + */ +#define DP_TRACE_CONFIG_DEFAULT_THRESH_TIME_LIMIT (10) + +/* Default proto bitmap in case its missing in gDptraceConfig string */ +#define DP_TRACE_CONFIG_DEFAULT_BITMAP \ + (QDF_NBUF_PKT_TRAC_TYPE_EAPOL |\ + QDF_NBUF_PKT_TRAC_TYPE_DHCP |\ + QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION |\ + QDF_NBUF_PKT_TRAC_TYPE_ARP |\ + QDF_NBUF_PKT_TRAC_TYPE_ICMP)\ + +/* Default verbosity, in case its missing in gDptraceConfig string*/ +#define DP_TRACE_CONFIG_DEFAULT_VERBOSTY QDF_DP_TRACE_VERBOSITY_LOW +/* + * Config DPTRACE + * The sequence of params is important. If some param is missing, defaults are + * considered. + * Param 1: Enable/Disable DP Trace live mode (uint8_t) + * Param 2: DP Trace live mode high bandwidth thresh.(uint8_t) + * (packets/second) beyond which DP Trace is disabled. Decimal Val. + * MGMT, DHCP, EAPOL, ARP pkts are not counted. ICMP and Data are. + * Param 3: Default Verbosity (0-3) + * Param 4: Proto Bitmap (uint8_t). Decimal Value. + * (decimal 62 = 0x3e) + * e.g., to disable live mode, use the following param in the ini file. + * gDptraceConfig = 0 + * e.g., to enable dptrace live mode and set the thresh as 4, + * use the following param in the ini file. + * gDptraceConfig = 1, 4 + */ +#define CFG_ENABLE_DP_TRACE_CONFIG "gDptraceConfig" +#define CFG_ENABLE_DP_TRACE_CONFIG_DEFAULT "1, 8, 1, 62" + /* * This parameter will set the weight to calculate the average low pass * filter for channel congestion. @@ -12302,6 +12362,7 @@ struct hdd_config { bool enable_fatal_event; bool bpf_enabled; bool enable_dp_trace; + uint8_t dp_trace_config[DP_TRACE_CONFIG_STRING_LENGTH]; bool adaptive_dwell_mode_enabled; enum wmi_dwelltime_adaptive_mode scan_adaptive_dwell_mode; enum wmi_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode; diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 49c3a5ad16..a33e52b0eb 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -2774,4 +2774,12 @@ hdd_nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head, } #endif +/** + * hdd_dp_trace_init() - initialize DP Trace by calling the QDF API + * @config: hdd config + * + * Return: NONE + */ +void hdd_dp_trace_init(struct hdd_config *config); + #endif /* end #if !defined(WLAN_HDD_MAIN_H) */ diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 8b80512c0b..80a33c7fdc 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -4096,6 +4096,12 @@ struct reg_table_entry g_registry_table[] = { CFG_ENABLE_DP_TRACE_MIN, CFG_ENABLE_DP_TRACE_MAX), + + REG_VARIABLE_STRING(CFG_ENABLE_DP_TRACE_CONFIG, WLAN_PARAM_String, + struct hdd_config, dp_trace_config, + VAR_FLAGS_OPTIONAL, + (void *) CFG_ENABLE_DP_TRACE_CONFIG_DEFAULT), + REG_VARIABLE(CFG_ADAPTIVE_SCAN_DWELL_MODE_NAME, WLAN_PARAM_Integer, struct hdd_config, scan_adaptive_dwell_mode, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, @@ -6232,10 +6238,12 @@ void hdd_cfg_print(struct hdd_context *pHddCtx) hdd_debug("Name = [%s] Value = [%s]", CFG_ENABLE_TX_SCHED_WRR_BE_NAME, pHddCtx->config->tx_sched_wrr_be); - - hdd_debug("Name = [%s] Value = [%u]", + hdd_info("Name = [%s] Value = [%u]", CFG_ENABLE_DP_TRACE, pHddCtx->config->enable_dp_trace); + hdd_debug("Name = [%s] Value = [%s]", + CFG_ENABLE_DP_TRACE_CONFIG, + pHddCtx->config->dp_trace_config); hdd_debug("Name = [%s] Value = [%u]", CFG_ADAPTIVE_SCAN_DWELL_MODE_NAME, pHddCtx->config->scan_adaptive_dwell_mode); diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 1885273313..fbb970b879 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2949,6 +2949,8 @@ static int __iw_softap_set_two_ints_getnone(struct net_device *dev, qdf_dp_trace_enable_live_mode(); else if (value[1] == CLEAR_DP_TRACE_BUFFER) qdf_dp_trace_clear_buffer(); + else if (value[1] == DISABLE_DP_TRACE_LIVE_MODE) + qdf_dp_trace_disable_live_mode(); break; case QCSAP_ENABLE_FW_PROFILE: hdd_debug("QCSAP_ENABLE_FW_PROFILE: %d %d", diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 5c8c96492d..84a99a4184 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -6435,6 +6435,9 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, hdd_napi_apply_throughput_policy(hdd_ctx, tx_packets, rx_packets); } + qdf_dp_trace_throttle_live_mode( + (next_vote_level > PLD_BUS_WIDTH_NONE) ? true : false); + /* fine-tuning parameters for RX Flows */ temp_rx = (rx_packets + hdd_ctx->prev_rx) / 2; @@ -9679,6 +9682,46 @@ static void wlan_init_bug_report_lock(void) qdf_spinlock_create(&p_cds_context->bug_report_lock); } +void hdd_dp_trace_init(struct hdd_config *config) +{ + + bool live_mode = DP_TRACE_CONFIG_DEFAULT_LIVE_MODE; + uint8_t thresh = DP_TRACE_CONFIG_DEFAULT_THRESH; + uint16_t thresh_time_limit = DP_TRACE_CONFIG_DEFAULT_THRESH_TIME_LIMIT; + uint8_t verbosity = DP_TRACE_CONFIG_DEFAULT_VERBOSTY; + uint8_t proto_bitmap = DP_TRACE_CONFIG_DEFAULT_BITMAP; + uint8_t config_params[DP_TRACE_CONFIG_NUM_PARAMS]; + uint8_t num_entries = 0; + + hdd_string_to_u8_array(config->dp_trace_config, config_params, + &num_entries, sizeof(config_params)); + + /* calculating, num bw timer intervals in a second (1000ms) */ + if (config->busBandwidthComputeInterval) + thresh_time_limit = + (1000 / config->busBandwidthComputeInterval); + else + hdd_err("busBandwidthComputeInterval is 0, using defaults"); + + switch (num_entries) { + case 4: + proto_bitmap = config_params[3]; + case 3: + verbosity = config_params[2]; + case 2: + thresh = config_params[1]; + case 1: + live_mode = config_params[0]; + default: + hdd_info("live_mode %u thresh %u time_limit %u verbosity %u bitmap 0x%x", + live_mode, thresh, thresh_time_limit, + verbosity, proto_bitmap); + }; + + qdf_dp_trace_init(live_mode, thresh, thresh_time_limit, + verbosity, proto_bitmap); + +} /** * hdd_wlan_startup() - HDD init function * @dev: Pointer to the underlying device @@ -9748,7 +9791,7 @@ int hdd_wlan_startup(struct device *dev) } if (hdd_ctx->config->enable_dp_trace) - qdf_dp_trace_init(); + hdd_dp_trace_init(hdd_ctx->config); if (hdd_ipa_init(hdd_ctx) == QDF_STATUS_E_FAILURE) goto err_wiphy_unregister; diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 0c80ab973e..3e25c6aa4a 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -1384,7 +1384,7 @@ QDF_STATUS hdd_wlan_re_init(void) } if (pHddCtx->config->enable_dp_trace) - qdf_dp_trace_init(); + hdd_dp_trace_init(pHddCtx->config); hdd_bus_bandwidth_init(pHddCtx); diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index bc6c272742..9540615175 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -697,6 +697,7 @@ QDF_STATUS hdd_softap_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf) struct hdd_context *pHddCtx = NULL; struct qdf_mac_addr src_mac; uint8_t staid; + bool proto_pkt_logged = false; /* Sanity check on inputs */ if (unlikely((NULL == context) || (NULL == rxBuf))) { @@ -760,22 +761,28 @@ QDF_STATUS hdd_softap_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf) } } hdd_event_eapol_log(skb, QDF_RX); + proto_pkt_logged = qdf_dp_trace_log_pkt(pAdapter->sessionId, + skb, QDF_RX, + QDF_TRACE_DEFAULT_PDEV_ID); DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(skb), sizeof(qdf_nbuf_data(skb)), QDF_RX)); - DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_RX_PACKET_RECORD, + if (!proto_pkt_logged) { + DPTRACE(qdf_dp_trace(skb, + QDF_DP_TRACE_HDD_RX_PACKET_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)skb->data, qdf_nbuf_len(skb), QDF_RX)); - if (qdf_nbuf_len(skb) > QDF_DP_TRACE_RECORD_SIZE) - DPTRACE(qdf_dp_trace(skb, + if (qdf_nbuf_len(skb) > QDF_DP_TRACE_RECORD_SIZE) + DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_RX_PACKET_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)&skb->data[QDF_DP_TRACE_RECORD_SIZE], (qdf_nbuf_len(skb)-QDF_DP_TRACE_RECORD_SIZE), QDF_RX)); + } skb->protocol = eth_type_trans(skb, skb->dev); diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index 428ab7566a..8e269a4007 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -390,7 +390,6 @@ void wlan_hdd_classify_pkt(struct sk_buff *skb) else if (qdf_nbuf_is_icmp_pkt(skb)) QDF_NBUF_CB_GET_PACKET_TYPE(skb) = QDF_NBUF_CB_PACKET_TYPE_ICMP; - } /** @@ -533,6 +532,7 @@ static int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) uint8_t STAId; struct hdd_station_ctx *pHddStaCtx = &pAdapter->sessionCtx.station; struct qdf_mac_addr *mac_addr; + bool pkt_proto_logged = false; #ifdef QCA_PKT_PROTO_TRACE uint8_t proto_type = 0; struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter); @@ -704,24 +704,30 @@ static int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++pAdapter->stats.tx_packets; hdd_event_eapol_log(skb, QDF_TX); - qdf_dp_trace_log_pkt(pAdapter->sessionId, skb, QDF_TX, - QDF_TRACE_DEFAULT_PDEV_ID); + pkt_proto_logged = qdf_dp_trace_log_pkt(pAdapter->sessionId, + skb, QDF_TX, + QDF_TRACE_DEFAULT_PDEV_ID); QDF_NBUF_CB_TX_PACKET_TRACK(skb) = QDF_NBUF_TX_PKT_DATA_TRACK; QDF_NBUF_UPDATE_TX_PKT_COUNT(skb, QDF_NBUF_TX_PKT_HDD); qdf_dp_trace_set_track(skb, QDF_TX); + DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(skb), sizeof(qdf_nbuf_data(skb)), QDF_TX)); - DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_TX_PACKET_RECORD, - QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)skb->data, - qdf_nbuf_len(skb), QDF_TX)); - if (qdf_nbuf_len(skb) > QDF_DP_TRACE_RECORD_SIZE) { + if (!pkt_proto_logged) { DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_TX_PACKET_RECORD, - QDF_TRACE_DEFAULT_PDEV_ID, - (uint8_t *)&skb->data[QDF_DP_TRACE_RECORD_SIZE], - (qdf_nbuf_len(skb)-QDF_DP_TRACE_RECORD_SIZE), QDF_TX)); + QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)skb->data, + qdf_nbuf_len(skb), QDF_TX)); + if (qdf_nbuf_len(skb) > QDF_DP_TRACE_RECORD_SIZE) { + DPTRACE(qdf_dp_trace(skb, + QDF_DP_TRACE_HDD_TX_PACKET_RECORD, + QDF_TRACE_DEFAULT_PDEV_ID, + (uint8_t *)&skb->data[QDF_DP_TRACE_RECORD_SIZE], + (qdf_nbuf_len(skb)-QDF_DP_TRACE_RECORD_SIZE), + QDF_TX)); + } } if (!hdd_is_tx_allowed(skb, STAId)) { @@ -1151,6 +1157,7 @@ QDF_STATUS hdd_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf) unsigned int cpu_index; struct qdf_mac_addr *mac_addr; bool wake_lock = false; + bool proto_pkt_logged = false; /* Sanity check on inputs */ if (unlikely((NULL == context) || (NULL == rxBuf))) { @@ -1209,22 +1216,32 @@ QDF_STATUS hdd_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf) } hdd_event_eapol_log(skb, QDF_RX); + proto_pkt_logged = qdf_dp_trace_log_pkt(pAdapter->sessionId, + skb, QDF_RX, + QDF_TRACE_DEFAULT_PDEV_ID); + DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(skb), sizeof(qdf_nbuf_data(skb)), QDF_RX)); - DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_RX_PACKET_RECORD, - QDF_TRACE_DEFAULT_PDEV_ID, - (uint8_t *)skb->data, qdf_nbuf_len(skb), QDF_RX)); - if (qdf_nbuf_len(skb) > QDF_DP_TRACE_RECORD_SIZE) + + if (!proto_pkt_logged) { DPTRACE(qdf_dp_trace(skb, QDF_DP_TRACE_HDD_RX_PACKET_RECORD, QDF_TRACE_DEFAULT_PDEV_ID, - (uint8_t *)&skb->data[QDF_DP_TRACE_RECORD_SIZE], - (qdf_nbuf_len(skb)-QDF_DP_TRACE_RECORD_SIZE), + (uint8_t *)skb->data, qdf_nbuf_len(skb), QDF_RX)); - + if (qdf_nbuf_len(skb) > QDF_DP_TRACE_RECORD_SIZE) + DPTRACE(qdf_dp_trace(skb, + QDF_DP_TRACE_HDD_RX_PACKET_RECORD, + QDF_TRACE_DEFAULT_PDEV_ID, + (uint8_t *) + &skb->data[QDF_DP_TRACE_RECORD_SIZE], + (qdf_nbuf_len(skb) - + QDF_DP_TRACE_RECORD_SIZE), + QDF_RX)); + } mac_addr = (struct qdf_mac_addr *)(skb->data+QDF_MAC_ADDR_SIZE); ucfg_tdls_update_rx_pkt_cnt(pAdapter->hdd_vdev, mac_addr); diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index 7fcefe727e..b73a5b023d 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -13086,6 +13086,8 @@ static int __iw_set_two_ints_getnone(struct net_device *dev, qdf_dp_trace_enable_live_mode(); else if (value[1] == CLEAR_DP_TRACE_BUFFER) qdf_dp_trace_clear_buffer(); + else if (value[1] == DISABLE_DP_TRACE_LIVE_MODE) + qdf_dp_trace_disable_live_mode(); break; case WE_SET_MON_MODE_CHAN: ret = wlan_hdd_set_mon_chan(pAdapter, value[1], value[2]);