[RAMEN9610-12700][Common] wlbt: Enhance kernel logs.
authorHimani Gupta <himani.g2@samsung.com>
Mon, 18 Feb 2019 07:03:15 +0000 (12:33 +0530)
committerCosmin Tanislav <demonsingur@gmail.com>
Mon, 22 Apr 2024 17:23:19 +0000 (20:23 +0300)
Enhance kernel logs and decouple driver changes from enhance
logging in rx_event_log_indication path.
Parse result code in connect_ind and pass it to above.

Change-Id: I0ed613754d8396621f733b8da78c784eadc30235
SCSC-Bug-Id: SSB-49329
Signed-off-by: Himani Gupta <himani.g2@samsung.com>
drivers/net/wireless/scsc/nl80211_vendor.c
drivers/net/wireless/scsc/rx.c
drivers/net/wireless/scsc/tx.c

index 207e5321702a7347b2f54b1d2c03b7f8599a2961..753dd0c8cc52a1425643d9adc7177f3cdb6959ff 100755 (executable)
 #include "mib.h"
 #include "nl80211_vendor.h"
 
+#ifdef CONFIG_SCSC_WLAN_ENHANCED_LOGGING
 #include "scsc_wifilogger.h"
 #include "scsc_wifilogger_rings.h"
 #include "scsc_wifilogger_types.h"
+#endif
+#define SLSI_WIFI_TAG_RSSI               21
+#define SLSI_WIFI_TAG_REASON_CODE        14
+#define SLSI_WIFI_TAG_VENDOR_SPECIFIC    0
+#define SLSI_WIFI_TAG_EAPOL_MESSAGE_TYPE 29
+#define SLSI_WIFI_TAG_STATUS             4
 
 #define SLSI_GSCAN_INVALID_RSSI        0x7FFF
 #define SLSI_EPNO_AUTH_FIELD_WEP_OPEN  1
 #define SLSI_EPNO_AUTH_FIELD_WPA_EAP   4
 #define WIFI_EVENT_FW_BTM_FRAME_REQUEST   56  // Request for a BTM frame is received
 #define WIFI_EVENT_FW_BTM_FRAME_RESPONSE  57     // A BTM frame is transmitted.
-
-#define WIFI_TAG_VD_CHANNEL_UTILISATION   0xf01a
-#define WIFI_TAG_VD_ROAMING_REASON           0xf019
-#define WIFI_TAG_VD_BTM_REQUEST_MODE      0xf01b
-#define WIFI_TAG_VD_BTM_RESPONSE_STATUS  0xf01c
-#define WIFI_TAG_VD_RETRY_COUNT                   0xf00f
-#define WIFI_ROAMING_SEARCH_REASON_RESERVED   0
-#define WIFI_ROAMING_SEARCH_REASON_LOW_RSSI             1
-#define WIFI_ROAMING_SEARCH_REASON_LINK_LOSS             2
-#define WIFI_ROAMING_SEARCH_REASON_BTM_REQ                3
-#define WIFI_ROAMING_SEARCH_REASON_CU_TRIGGER           4
+#define WIFI_EVENT_FW_NR_FRAME_REQUEST      58
+#define WIFI_EVENT_FW_RM_FRAME_RESPONSE    59
+
+#define SLSI_WIFI_TAG_VD_CHANNEL_UTILISATION   0xf01a
+#define SLSI_WIFI_TAG_VD_ROAMING_REASON           0xf019
+#define SLSI_WIFI_TAG_VD_BTM_REQUEST_MODE      0xf01b
+#define SLSI_WIFI_TAG_VD_BTM_RESPONSE_STATUS  0xf01c
+#define SLSI_WIFI_TAG_VD_RETRY_COUNT                   0xf00f
+#define SLSI_WIFI_TAG_VD_EAPOL_KEY_TYPE             0xF008
+#define SLSI_WIFI_EAPOL_KEY_TYPE_GTK                      0x0000
+#define SLSI_WIFI_EAPOL_KEY_TYPE_PTK                      0x0001
+#define SLSI_WIFI_ROAMING_SEARCH_REASON_RESERVED   0
+#define SLSI_WIFI_ROAMING_SEARCH_REASON_LOW_RSSI             1
+#define SLSI_WIFI_ROAMING_SEARCH_REASON_LINK_LOSS             2
+#define SLSI_WIFI_ROAMING_SEARCH_REASON_BTM_REQ                3
+#define SLSI_WIFI_ROAMING_SEARCH_REASON_CU_TRIGGER           4
 
 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
 
@@ -5323,15 +5335,15 @@ exit:
 char *slsi_get_roam_reason_str(int roam_reason)
 {
        switch (roam_reason) {
-       case WIFI_ROAMING_SEARCH_REASON_RESERVED:
+       case SLSI_WIFI_ROAMING_SEARCH_REASON_RESERVED:
                return "WIFI_ROAMING_SEARCH_REASON_RESERVED";
-       case WIFI_ROAMING_SEARCH_REASON_LOW_RSSI:
+       case SLSI_WIFI_ROAMING_SEARCH_REASON_LOW_RSSI:
                return "WIFI_ROAMING_SEARCH_REASON_LOW_RSSI";
-       case WIFI_ROAMING_SEARCH_REASON_LINK_LOSS:
+       case SLSI_WIFI_ROAMING_SEARCH_REASON_LINK_LOSS:
                return "WIFI_ROAMING_SEARCH_REASON_LINK_LOSS";
-       case WIFI_ROAMING_SEARCH_REASON_BTM_REQ:
+       case SLSI_WIFI_ROAMING_SEARCH_REASON_BTM_REQ:
                return "WIFI_ROAMING_SEARCH_REASON_BTM_REQ";
-       case WIFI_ROAMING_SEARCH_REASON_CU_TRIGGER:
+       case SLSI_WIFI_ROAMING_SEARCH_REASON_CU_TRIGGER:
                return "WIFI_ROAMING_SEARCH_REASON_CU_TRIGGER";
        default:
                return "UNKNOWN_REASON";
@@ -5344,8 +5356,8 @@ void slsi_rx_event_log_indication(struct slsi_dev *sdev, struct net_device *dev,
        u64 timestamp = 0;
        u8 *tlv_data;
        u32 roam_reason, chan_utilisation, btm_request_mode, btm_response, eapol_msg_type;
-       u32 deauth_reason, eapol_retry_count, roam_rssi, eapol_result_code;
-       u16 vendor_len, tag_id, tag_len, vtag_id;
+       u32 deauth_reason, eapol_retry_count, roam_rssi, status_code;
+       u16 vendor_len, tag_id, tag_len, vtag_id, eapol_key_type;
        u32 tag_value, vtag_value, rssi_bits = 0;
        int roam_rssi_val;
        __le16               *le16_ptr = NULL;
@@ -5376,7 +5388,7 @@ void slsi_rx_event_log_indication(struct slsi_dev *sdev, struct net_device *dev,
                }
                tag_value = slsi_convert_tlv_data_to_value(&tlv_data[i], tag_len);
                switch (tag_id) {
-               case WIFI_TAG_RSSI:
+               case SLSI_WIFI_TAG_RSSI:
                        roam_rssi = tag_value;
                        while (roam_rssi) {
                                rssi_bits++;
@@ -5385,63 +5397,88 @@ void slsi_rx_event_log_indication(struct slsi_dev *sdev, struct net_device *dev,
                        roam_rssi_val = ((1 << rssi_bits) - 1) ^ tag_value;
                        roam_rssi_val = -(roam_rssi_val + 1);
                        break;
-               case WIFI_TAG_REASON_CODE:
+               case SLSI_WIFI_TAG_REASON_CODE:
                        deauth_reason = tag_value;
                        break;
-               case WIFI_TAG_VENDOR_SPECIFIC:
+               case SLSI_WIFI_TAG_VENDOR_SPECIFIC:
                        vendor_len = tag_len - 2;
                        le16_ptr = (__le16 *)&tlv_data[i];
                        vtag_id = le16_to_cpu(*le16_ptr);
                        vtag_value = slsi_convert_tlv_data_to_value(&tlv_data[i + 2], vendor_len);
                        switch (vtag_id) {
-                       case WIFI_TAG_VD_CHANNEL_UTILISATION:
+                       case SLSI_WIFI_TAG_VD_CHANNEL_UTILISATION:
                                chan_utilisation = vtag_value;
                                break;
-                       case WIFI_TAG_VD_ROAMING_REASON:
+                       case SLSI_WIFI_TAG_VD_ROAMING_REASON:
                                roam_reason = vtag_value;
                                break;
-                       case WIFI_TAG_VD_BTM_REQUEST_MODE:
+                       case SLSI_WIFI_TAG_VD_BTM_REQUEST_MODE:
                                btm_request_mode = vtag_value;
                                break;
-                       case WIFI_TAG_VD_BTM_RESPONSE_STATUS:
+                       case SLSI_WIFI_TAG_VD_BTM_RESPONSE_STATUS:
                                btm_response = vtag_value;
                                break;
-                       case WIFI_TAG_VD_RETRY_COUNT:
+                       case SLSI_WIFI_TAG_VD_RETRY_COUNT:
                                eapol_retry_count = vtag_value;
                                break;
+                       case SLSI_WIFI_TAG_VD_EAPOL_KEY_TYPE:
+                               eapol_key_type = vtag_value;
+                               break;
                        }
                        break;
-               case WIFI_TAG_EAPOL_MESSAGE_TYPE:
+               case SLSI_WIFI_TAG_EAPOL_MESSAGE_TYPE:
                        eapol_msg_type = tag_value;
                        break;
-               case WIFI_TAG_STATUS:
-                       eapol_result_code = tag_value;
+               case SLSI_WIFI_TAG_STATUS:
+                       status_code = tag_value;
                        break;
                }
                i += tag_len;
        }
        switch (event_id) {
-       case WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_START:
-               SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_START, Send 4way-H/S, M%d\n", eapol_msg_type);
+       case FAPI_EVENT_WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_START:
+               if (eapol_key_type == SLSI_WIFI_EAPOL_KEY_TYPE_GTK)
+                       SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_START, Send GTK, G%d\n", eapol_msg_type);
+               else if (eapol_key_type == SLSI_WIFI_EAPOL_KEY_TYPE_PTK)
+                       SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_START, Send 4way-H/S, M%d\n",
+                                 eapol_msg_type);
                break;
-       case WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_STOP:
+       case FAPI_EVENT_WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_STOP:
                SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_TRANSMIT_STOP,Result Code:%d, Retry Count:%d\n",
-                         eapol_result_code, eapol_retry_count);
+                         status_code, eapol_retry_count);
                break;
-       case WIFI_EVENT_FW_EAPOL_FRAME_RECEIVED:
-               SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_RECEIVED, Received 4way-H/S, M%d\n", eapol_msg_type);
+       case FAPI_EVENT_WIFI_EVENT_FW_EAPOL_FRAME_RECEIVED:
+               if (eapol_key_type == SLSI_WIFI_EAPOL_KEY_TYPE_GTK)
+                       SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_RECEIVED, Received GTK, G%d\n", eapol_msg_type);
+               else if (eapol_key_type == SLSI_WIFI_EAPOL_KEY_TYPE_PTK)
+                       SLSI_INFO(sdev, "WIFI_EVENT_FW_EAPOL_FRAME_RECEIVED, Received 4way-H/S, M%d\n", eapol_msg_type);
                break;
        case WIFI_EVENT_FW_BTM_FRAME_REQUEST:
                SLSI_INFO(sdev, "WIFI_EVENT_FW_BTM_FRAME_REQUEST,Request Mode:%d\n", btm_request_mode);
                break;
        case WIFI_EVENT_FW_BTM_FRAME_RESPONSE:
-               SLSI_INFO(sdev, "WIFI_EVENT_FW_BTM_FRAME_RESPONSE:%s\n", btm_response ? "Success" : "Failure");
+               SLSI_INFO(sdev, "WIFI_EVENT_FW_BTM_FRAME_RESPONSE,Status code:%d\n", btm_response);
                break;
-       case WIFI_EVENT_ROAM_SEARCH_STARTED:
+       case FAPI_EVENT_WIFI_EVENT_ROAM_SEARCH_STARTED:
                SLSI_INFO(sdev, "WIFI_EVENT_ROAM_SEARCH_STARTED, RSSI:%d, Deauth Reason:0x%04x, Channel Utilisation:%d,"
                          "Roam Reason: %s\n", roam_rssi_val, deauth_reason, chan_utilisation,
                          slsi_get_roam_reason_str(roam_reason));
                break;
+       case FAPI_EVENT_WIFI_EVENT_FW_AUTH_STARTED:
+               SLSI_INFO(sdev, "WIFI_EVENT_FW_AUTH_STARTED\n");
+               break;
+       case FAPI_EVENT_WIFI_EVENT_AUTH_COMPLETE:
+               SLSI_INFO(sdev, "WIFI_EVENT_AUTH_COMPLETE,Status code:%d\n", status_code);
+               break;
+       case FAPI_EVENT_WIFI_EVENT_ROAM_ASSOC_COMPLETE:
+               SLSI_INFO(sdev, "WIFI_EVENT_ROAM_ASSOC_COMPLETE\n");
+               break;
+       case WIFI_EVENT_FW_NR_FRAME_REQUEST:
+               SLSI_INFO(sdev, "Send Radio Measurement Frame (Neighbor Report Req)\n");
+               break;
+       case WIFI_EVENT_FW_RM_FRAME_RESPONSE:
+               SLSI_INFO(sdev, "Received Radio Measurement Frame (Radio Measurement Rep)\n");
+               break;
        }
 
        slsi_kfree_skb(skb);
index a9b0fbd0d5eb1333a0c8016ccde8846b82ebbc1a..6c5302a0b7e7fc1f4bcaa5bfdf63965b948f4819 100755 (executable)
@@ -1218,7 +1218,6 @@ void slsi_rx_roamed_ind(struct slsi_dev *sdev, struct net_device *dev, struct sk
 
        SLSI_MUTEX_LOCK(ndev_vif->vif_mutex);
 
-       SLSI_INFO(sdev, "Received Association Response\n");
        SLSI_NET_DBG1(dev, SLSI_MLME, "mlme_roamed_ind(vif:%d) Roaming to %pM\n",
                      fapi_get_vif(skb),
                      mgmt->bssid);
@@ -1770,7 +1769,6 @@ void slsi_rx_connect_ind(struct slsi_dev *sdev, struct net_device *dev, struct s
 
        SLSI_NET_DBG1(dev, SLSI_MLME, "mlme_connect_ind(vif:%d, result:0x%04x)\n",
                      fapi_get_vif(skb), fw_result_code);
-       SLSI_INFO(sdev, "Received Association Response\n");
 
        if (!ndev_vif->activated) {
                SLSI_NET_DBG1(dev, SLSI_MLME, "VIF not activated\n");
@@ -1794,18 +1792,26 @@ void slsi_rx_connect_ind(struct slsi_dev *sdev, struct net_device *dev, struct s
        }
        sdev->assoc_result_code = fw_result_code;
        if (fw_result_code != FAPI_RESULTCODE_SUCCESS) {
-               if (fw_result_code == FAPI_RESULTCODE_AUTH_NO_ACK)
+               if (fw_result_code == FAPI_RESULTCODE_AUTH_NO_ACK) {
                        SLSI_INFO(sdev, "Connect failed,Result code:AUTH_NO_ACK\n");
-               else if (fw_result_code == FAPI_RESULTCODE_ASSOC_NO_ACK)
+               } else if (fw_result_code == FAPI_RESULTCODE_ASSOC_NO_ACK) {
                        SLSI_INFO(sdev, "Connect failed,Result code:ASSOC_NO_ACK\n");
-               else
+               } else if (fw_result_code >= 0x8100 && fw_result_code <= 0x81FF) {
+                       fw_result_code = fw_result_code & 0x00FF;
+                       SLSI_INFO(sdev, "Connect failed(Auth failure), Result code:0x%04x\n", fw_result_code);
+               } else if (fw_result_code >= 0x8200 && fw_result_code <= 0x82FF) {
+                       fw_result_code = fw_result_code & 0x00FF;
+                       SLSI_INFO(sdev, "Connect failed(Assoc Failure), Result code:0x%04x\n", fw_result_code);
+               } else {
                        SLSI_INFO(sdev, "Connect failed,Result code:0x%04x\n", fw_result_code);
+               }
 #ifdef CONFIG_SCSC_LOG_COLLECTION
                /* Trigger log collection if fw result code is not success */
                scsc_log_collector_schedule_collection(SCSC_LOG_HOST_WLAN, SCSC_LOG_HOST_WLAN_REASON_CONNECT_ERR);
 #endif
                status = fw_result_code;
        } else {
+               SLSI_INFO(sdev, "Received Association Response\n");
                if (!peer || !peer->assoc_ie) {
                        if (peer)
                                WARN(!peer->assoc_ie, "proc-started-ind not received before connect-ind");
@@ -1985,9 +1991,12 @@ void slsi_rx_disconnected_ind(struct slsi_dev *sdev, struct net_device *dev, str
 #endif
        if (reason >= 0 && reason <= 0xFF) {
                SLSI_INFO(sdev, "Received DEAUTH, reason = %d\n", reason);
-       } else if (reason >= 0x8200 && reason <= 0x82FF) {
+       } else if (reason >= 0x8100 && reason <= 0x81FF) {
                reason = reason & 0x00FF;
                SLSI_INFO(sdev, "Received DEAUTH, reason = %d\n", reason);
+       } else if (reason >= 0x8200 && reason <= 0x82FF) {
+               reason = reason & 0x00FF;
+               SLSI_INFO(sdev, "Received DISASSOC, reason = %d\n", reason);
        } else {
                SLSI_INFO(sdev, "Received DEAUTH, reason = Local Disconnect <%d>\n", reason);
        }
@@ -2278,10 +2287,10 @@ void slsi_rx_received_frame_ind(struct slsi_dev *sdev, struct net_device *dev, s
        struct netdev_vif *ndev_vif = netdev_priv(dev);
        u16 data_unit_descriptor = fapi_get_u16(skb, u.mlme_received_frame_ind.data_unit_descriptor);
        u16 frequency = SLSI_FREQ_FW_TO_HOST(fapi_get_u16(skb, u.mlme_received_frame_ind.channel_frequency));
-       u8 *eapol = NULL;
        u8 *eap = NULL;
        u16 protocol = 0;
        u32 dhcp_message_type = SLSI_DHCP_MESSAGE_TYPE_INVALID;
+       u16                 eap_length = 0;
 
        SLSI_NET_DBG2(dev, SLSI_MLME, "mlme_received_frame_ind(vif:%d, data descriptor:%d, freq:%d)\n",
                      fapi_get_vif(skb),
@@ -2388,44 +2397,25 @@ void slsi_rx_received_frame_ind(struct slsi_dev *sdev, struct net_device *dev, s
                dev->last_rx = jiffies;
 #endif
                /* Storing Data for Logging Information */
-               if ((skb->len + sizeof(struct ethhdr)) >= 99)
-                       eapol = skb->data + sizeof(struct ethhdr);
-               if ((skb->len + sizeof(struct ethhdr)) >= 5)
+               if ((skb->len - sizeof(struct ethhdr)) >= 9) {
+                       eap_length = (skb->len - sizeof(struct ethhdr)) - 4;
                        eap = skb->data + sizeof(struct ethhdr);
+               }
                if (skb->len >= 285 && slsi_is_dhcp_packet(skb->data) != SLSI_TX_IS_NOT_DHCP)
                        dhcp_message_type = skb->data[284];
 
                skb->protocol = eth_type_trans(skb, dev);
                protocol = ntohs(skb->protocol);
                if (protocol == ETH_P_PAE) {
-                       if (eapol && eapol[SLSI_EAPOL_IEEE8021X_TYPE_POS] == SLSI_IEEE8021X_TYPE_EAPOL_KEY) {
-                               if ((eapol[SLSI_EAPOL_TYPE_POS] == SLSI_EAPOL_TYPE_RSN_KEY ||
-                                    eapol[SLSI_EAPOL_TYPE_POS] == SLSI_EAPOL_TYPE_WPA_KEY) &&
-                                   (eapol[SLSI_EAPOL_KEY_INFO_LOWER_BYTE_POS] &
-                                    SLSI_EAPOL_KEY_INFO_KEY_TYPE_BIT_IN_LOWER_BYTE) &&
-                                   (eapol[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS] &
-                                    SLSI_EAPOL_KEY_INFO_MIC_BIT_IN_HIGHER_BYTE) &&
-                                   (eapol[SLSI_EAPOL_KEY_DATA_LENGTH_HIGHER_BYTE_POS] == 0) &&
-                                   (eapol[SLSI_EAPOL_KEY_DATA_LENGTH_LOWER_BYTE_POS] == 0)) {
-                                       SLSI_INFO(sdev, "Received 4way-H/S, M4\n");
-                               } else if (!(eapol[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS] &
-                                            SLSI_EAPOL_KEY_INFO_MIC_BIT_IN_HIGHER_BYTE)) {
-                                       SLSI_INFO(sdev, "Received 4way-H/S, M1\n");
-                               } else if (eapol[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS] &
-                                          SLSI_EAPOL_KEY_INFO_SECURE_BIT_IN_HIGHER_BYTE) {
-                                       SLSI_INFO(sdev, "Received 4way-H/S, M3\n");
-                               } else {
-                                       SLSI_INFO(sdev, "Received 4way-H/S, M2\n");
-                               }
-                       } else if (eap && eap[SLSI_EAPOL_IEEE8021X_TYPE_POS] == SLSI_IEEE8021X_TYPE_EAP_PACKET) {
+                       if (eap && eap[SLSI_EAPOL_IEEE8021X_TYPE_POS] == SLSI_IEEE8021X_TYPE_EAP_PACKET) {
                                if (eap[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_REQUEST)
-                                       SLSI_INFO(sdev, "Received EAP-Request\n");
+                                       SLSI_INFO(sdev, "Received EAP-Request (%d)\n", eap_length);
                                else if (eap[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_RESPONSE)
-                                       SLSI_INFO(sdev, "Received EAP-Response\n");
+                                       SLSI_INFO(sdev, "Received EAP-Response (%d)\n", eap_length);
                                else if (eap[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_SUCCESS)
-                                       SLSI_INFO(sdev, "Received EAP-Success\n");
+                                       SLSI_INFO(sdev, "Received EAP-Success (%d)\n", eap_length);
                                else if (eap[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_FAILURE)
-                                       SLSI_INFO(sdev, "Received EAP-Failure\n");
+                                       SLSI_INFO(sdev, "Received EAP-Failure (%d)\n", eap_length);
                        }
                } else if (protocol == ETH_P_IP) {
                        if (dhcp_message_type == SLSI_DHCP_MESSAGE_TYPE_DISCOVER)
index a8a7a5f1902af9842ab5e63876e750f9cd5a8348..e60b42aa93a7097c21afd65e06e2251c415ca28c 100755 (executable)
@@ -29,6 +29,20 @@ MODULE_PARM_DESC(msdu_enable, "MSDU frame format, Y: enable (default), N: disabl
 
 #include <linux/spinlock.h>
 
+int slsi_is_wps_msg_start_or_m17(u8 *eapol, u16 eap_length)
+{
+       /* Note that Message should not be M8.This check is to identify only WSC_START message or M1-M7 */
+       /*Return 1 If opcode type WSC msg and Msg Type M1-M7 or if opcode is WSC start.*/
+       if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_REQUEST ||
+           eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_RESPONSE)
+               if (eapol[SLSI_EAP_TYPE_POS] == SLSI_EAP_TYPE_EXPANDED && eap_length >= SLSI_EAP_OPCODE_POS - 3 &&
+                   ((eapol[SLSI_EAP_OPCODE_POS] == SLSI_EAP_OPCODE_WSC_MSG && eap_length >= SLSI_EAP_MSGTYPE_POS - 3 &&
+                   eapol[SLSI_EAP_MSGTYPE_POS] != SLSI_EAP_MSGTYPE_M8) ||
+                   eapol[SLSI_EAP_OPCODE_POS] == SLSI_EAP_OPCODE_WSC_START))
+                       return 1;
+       return 0;
+}
+
 static int slsi_tx_eapol(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb)
 {
        struct netdev_vif       *ndev_vif = netdev_priv(dev);
@@ -39,6 +53,7 @@ static int slsi_tx_eapol(struct slsi_dev *sdev, struct net_device *dev, struct s
        int                     ret = 0;
        u32              dwell_time = sdev->fw_dwell_time;
        u64                     tx_bytes_tmp = 0;
+       u16                 eap_length = 0;
 
        slsi_spinlock_lock(&ndev_vif->peer_lock);
        peer = slsi_get_peer_from_mac(sdev, dev, eth_hdr(skb)->h_dest);
@@ -57,7 +72,7 @@ static int slsi_tx_eapol(struct slsi_dev *sdev, struct net_device *dev, struct s
                 *   - Key type bit set in key info (pairwise=1, Group=0)
                 *   - Key Data Length would be 0
                 */
-               if ((skb->len + sizeof(struct ethhdr)) >= 99)
+               if ((skb->len - sizeof(struct ethhdr)) >= 99)
                        eapol = skb->data + sizeof(struct ethhdr);
                if (eapol && eapol[SLSI_EAPOL_IEEE8021X_TYPE_POS] == SLSI_IEEE8021X_TYPE_EAPOL_KEY) {
                        msg_type = FAPI_MESSAGETYPE_EAPOL_KEY_M123;
@@ -67,43 +82,29 @@ static int slsi_tx_eapol(struct slsi_dev *sdev, struct net_device *dev, struct s
                            (eapol[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS] & SLSI_EAPOL_KEY_INFO_MIC_BIT_IN_HIGHER_BYTE) &&
                            (eapol[SLSI_EAPOL_KEY_DATA_LENGTH_HIGHER_BYTE_POS] == 0) &&
                            (eapol[SLSI_EAPOL_KEY_DATA_LENGTH_LOWER_BYTE_POS] == 0)) {
-                               SLSI_INFO(sdev, "Send 4way-H/S, M4\n");
                                msg_type = FAPI_MESSAGETYPE_EAPOL_KEY_M4;
                                dwell_time = 0;
-                       } else if (msg_type == FAPI_MESSAGETYPE_EAPOL_KEY_M123) {
-                               if (!(eapol[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS] &
-                                     SLSI_EAPOL_KEY_INFO_MIC_BIT_IN_HIGHER_BYTE))
-                                       SLSI_INFO(sdev, "Send 4way-H/S, M1\n");
-                               else if (eapol[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS] &
-                                        SLSI_EAPOL_KEY_INFO_SECURE_BIT_IN_HIGHER_BYTE)
-                                       SLSI_INFO(sdev, "Send 4way-H/S, M3\n");
-                               else
-                                       SLSI_INFO(sdev, "Send 4way-H/S, M2\n");
                        }
                } else {
                        msg_type = FAPI_MESSAGETYPE_EAP_MESSAGE;
-                       if ((skb->len - sizeof(struct ethhdr)) >= 5)
+                       if ((skb->len - sizeof(struct ethhdr)) >= 9)
                                eapol = skb->data + sizeof(struct ethhdr);
 
                        dwell_time = 0;
                        if (eapol && eapol[SLSI_EAPOL_IEEE8021X_TYPE_POS] == SLSI_IEEE8021X_TYPE_EAP_PACKET) {
+                               eap_length = (skb->len - sizeof(struct ethhdr)) - 4;
                                if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_REQUEST)
-                                       SLSI_INFO(sdev, "Send EAP-Request\n");
+                                       SLSI_INFO(sdev, "Send EAP-Request (%d)\n", eap_length);
                                else if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_RESPONSE)
-                                       SLSI_INFO(sdev, "Send EAP-Response\n");
+                                       SLSI_INFO(sdev, "Send EAP-Response (%d)\n", eap_length);
                                else if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_SUCCESS)
-                                       SLSI_INFO(sdev, "Send EAP-Success\n");
+                                       SLSI_INFO(sdev, "Send EAP-Success (%d)\n", eap_length);
                                else if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_FAILURE)
-                                       SLSI_INFO(sdev, "Send EAP-Failure\n");
+                                       SLSI_INFO(sdev, "Send EAP-Failure (%d)\n", eap_length);
 
                                /*Identify WPS_START & M1-M7 and set dwell time to 100ms */
-                               if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_REQUEST ||
-                                   eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_RESPONSE)
-                                       if (eapol[SLSI_EAP_TYPE_POS] == SLSI_EAP_TYPE_EXPANDED &&
-                                           ((eapol[SLSI_EAP_OPCODE_POS] == SLSI_EAP_OPCODE_WSC_MSG &&
-                                           eapol[SLSI_EAP_MSGTYPE_POS] != SLSI_EAP_MSGTYPE_M8) ||
-                                           eapol[SLSI_EAP_OPCODE_POS] == SLSI_EAP_OPCODE_WSC_START))
-                                               dwell_time = SLSI_EAP_WPS_DWELL_TIME;
+                               if (slsi_is_wps_msg_start_or_m17(eapol, eap_length))
+                                       dwell_time = SLSI_EAP_WPS_DWELL_TIME;
                        }
                }
        break;