From 7f5ad85b061a538e6666ec4be988354e6188f443 Mon Sep 17 00:00:00 2001 From: Himani Gupta Date: Mon, 18 Feb 2019 12:33:15 +0530 Subject: [PATCH] [RAMEN9610-12700][Common] wlbt: Enhance kernel logs. 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 --- drivers/net/wireless/scsc/nl80211_vendor.c | 111 ++++++++++++++------- drivers/net/wireless/scsc/rx.c | 58 +++++------ drivers/net/wireless/scsc/tx.c | 47 ++++----- 3 files changed, 122 insertions(+), 94 deletions(-) diff --git a/drivers/net/wireless/scsc/nl80211_vendor.c b/drivers/net/wireless/scsc/nl80211_vendor.c index 207e5321702a..753dd0c8cc52 100755 --- a/drivers/net/wireless/scsc/nl80211_vendor.c +++ b/drivers/net/wireless/scsc/nl80211_vendor.c @@ -17,9 +17,16 @@ #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 @@ -27,17 +34,22 @@ #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); diff --git a/drivers/net/wireless/scsc/rx.c b/drivers/net/wireless/scsc/rx.c index a9b0fbd0d5eb..6c5302a0b7e7 100755 --- a/drivers/net/wireless/scsc/rx.c +++ b/drivers/net/wireless/scsc/rx.c @@ -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) diff --git a/drivers/net/wireless/scsc/tx.c b/drivers/net/wireless/scsc/tx.c index a8a7a5f1902a..e60b42aa93a7 100755 --- a/drivers/net/wireless/scsc/tx.c +++ b/drivers/net/wireless/scsc/tx.c @@ -29,6 +29,20 @@ MODULE_PARM_DESC(msdu_enable, "MSDU frame format, Y: enable (default), N: disabl #include +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; -- 2.20.1