Browse Source

qcacmn: Log EAP 8-way handshake packets properly

Currently EAP 8-way handshake packets are logged as
EAP REQ and EAP RSP.
Fix the logging issue by logging EAP 8-way handshake
packets properly

Change-Id: I6af3b3140b5881ece58dd06a9725c103c9388b4c
CRs-Fixed: 3400396
Amit Mehta 2 years ago
parent
commit
f9f4ba1b9d
4 changed files with 223 additions and 11 deletions
  1. 27 0
      qdf/inc/qdf_nbuf.h
  2. 39 9
      qdf/inc/qdf_types.h
  3. 97 2
      qdf/linux/src/qdf_nbuf.c
  4. 60 0
      qdf/linux/src/qdf_trace.c

+ 27 - 0
qdf/inc/qdf_nbuf.h

@@ -130,6 +130,33 @@
 #define QDF_EAP_INITIATE			5
 #define QDF_EAP_FINISH				6
 
+#define EAP_PACKET_TYPE_ID 0x01
+#define EAP_PACKET_TYPE_EXP 0xFE
+
+#define EAP_EXP_TYPE_WSC_START 0x01
+#define EAP_EXP_TYPE_M1 0x04
+#define EAP_EXP_TYPE_M2 0x05
+#define EAP_EXP_TYPE_M3 0x07
+#define EAP_EXP_TYPE_M4 0x08
+#define EAP_EXP_TYPE_M5 0x09
+#define EAP_EXP_TYPE_M6 0x0A
+#define EAP_EXP_TYPE_M7 0x0B
+#define EAP_EXP_TYPE_M8 0x0C
+#define EAP_EXP_TYPE_WSC_DONE 0x0F
+
+#define EAP_EXP_MSG_OPCODE_OFFSET 0x1E
+#define EAP_EXP_MSG_TYPE_OFFSET 0x29
+
+enum wsc_op_code {
+	WSC_UPNP = 0, /* No OP Code in UPnP transport */
+	WSC_START = 0x01,
+	WSC_ACK = 0x02,
+	WSC_NACK = 0x03,
+	WSC_MSG = 0x04,
+	WSC_DONE = 0x05,
+	WSC_FRAG_ACK = 0x06
+};
+
 /* ARP Related MASK */
 #define QDF_NBUF_PKT_ARP_OPCODE_OFFSET	20
 #define QDF_NBUF_PKT_ARPOP_REQ		1

+ 39 - 9
qdf/inc/qdf_types.h

@@ -1042,15 +1042,30 @@ struct qdf_mac_addr {
  * @QDF_ROAM_EVENTID: roam eventid from fw
  * @QDF_PROTO_DNS_QUERY: dns query
  * @QDF_PROTO_DNS_RES: dns response
- * QDF_PROTO_EAP_REQUEST: EAP Request
- * QDF_PROTO_EAP_RESPONSE: EAP Response
- * QDF_PROTO_EAP_SUCCESS: EAP Success
- * QDF_PROTO_EAP_FAILURE: EAP Filure
- * QDF_PROTO_EAP_INITIATE: EAP Initiate
- * QDF_PROTO_EAP_FINISH: EAP Finish
- * QDF_PROTO_EAPOL_START: EAPOL-Start message
- * QDF_PROTO_EAPOL_LOGOFF: EAPOL Log Off message.
- * QDF_PROTO_EAPOL_ASF: ASF Alert message
+ * @QDF_PROTO_EAP_REQUEST: EAP Request
+ * @QDF_PROTO_EAP_RESPONSE: EAP Response
+ * @QDF_PROTO_EAP_SUCCESS: EAP Success
+ * @QDF_PROTO_EAP_FAILURE: EAP Filure
+ * @QDF_PROTO_EAP_INITIATE: EAP Initiate
+ * @QDF_PROTO_EAP_FINISH: EAP Finish
+ * @QDF_PROTO_EAPOL_START: EAPOL-Start message
+ * @QDF_PROTO_EAPOL_LOGOFF: EAPOL Log Off message.
+ * @QDF_PROTO_EAPOL_ASF: ASF Alert message
+ * @QDF_PROTO_EAP_REQ_ID: EAP identify request
+ * @QDF_PROTO_EAP_RSP_ID: EAP identify response
+ * @QDF_PROTO_EAP_M1: EAP expanded type M1
+ * @QDF_PROTO_EAP_M2: EAP expanded type M2
+ * @QDF_PROTO_EAP_M3: EAP expanded type M3
+ * @QDF_PROTO_EAP_M4: EAP expanded type M4
+ * @QDF_PROTO_EAP_M5: EAP expanded type M5
+ * @QDF_PROTO_EAP_M6: EAP expanded type M6
+ * @QDF_PROTO_EAP_M7: EAP expanded type M7
+ * @QDF_PROTO_EAP_M8: EAP expanded type M8
+ * @QDF_PROTO_EAP_WSC_START: EAP expanded type WSC start
+ * @QDF_PROTO_EAP_WSC_ACK: EAP expanded type WSC ACK
+ * @QDF_PROTO_EAP_WSC_NACK: EAP expanded type WSC NACK
+ * @QDF_PROTO_EAP_WSC_DONE: EAP expanded type WSC DONE
+ * @QDF_PROTO_EAP_WSC_FRAG_ACK: EAP expanded type WSC frag ACK
  * @QDF_PROTO_SUBTYPE_MAX: subtype max
  */
 enum qdf_proto_subtype {
@@ -1099,6 +1114,21 @@ enum qdf_proto_subtype {
 	QDF_PROTO_EAPOL_START,
 	QDF_PROTO_EAPOL_LOGOFF,
 	QDF_PROTO_EAPOL_ASF,
+	QDF_PROTO_EAP_REQ_ID,
+	QDF_PROTO_EAP_RSP_ID,
+	QDF_PROTO_EAP_M1,
+	QDF_PROTO_EAP_M2,
+	QDF_PROTO_EAP_M3,
+	QDF_PROTO_EAP_M4,
+	QDF_PROTO_EAP_M5,
+	QDF_PROTO_EAP_M6,
+	QDF_PROTO_EAP_M7,
+	QDF_PROTO_EAP_M8,
+	QDF_PROTO_EAP_WSC_START,
+	QDF_PROTO_EAP_WSC_ACK,
+	QDF_PROTO_EAP_WSC_NACK,
+	QDF_PROTO_EAP_WSC_DONE,
+	QDF_PROTO_EAP_WSC_FRAG_ACK,
 	QDF_PROTO_SUBTYPE_MAX
 };
 

+ 97 - 2
qdf/linux/src/qdf_nbuf.c

@@ -1560,6 +1560,102 @@ __qdf_nbuf_data_get_eapol_key(uint8_t *data)
 	return subtype;
 }
 
+/**
+ * __qdf_nbuf_data_get_exp_msg_type() - Get EAP expanded msg type
+ * @data: Pointer to EAPOL packet data buffer
+ * @code: EAP code
+ *
+ * Return: subtype of the EAPOL packet.
+ */
+static inline enum qdf_proto_subtype
+__qdf_nbuf_data_get_exp_msg_type(uint8_t *data, uint8_t code)
+{
+	uint8_t msg_type;
+	uint8_t opcode = *(data + EAP_EXP_MSG_OPCODE_OFFSET);
+
+	switch (opcode) {
+	case WSC_START:
+		return QDF_PROTO_EAP_WSC_START;
+	case WSC_ACK:
+		return QDF_PROTO_EAP_WSC_ACK;
+	case WSC_NACK:
+		return QDF_PROTO_EAP_WSC_NACK;
+	case WSC_MSG:
+		msg_type = *(data + EAP_EXP_MSG_TYPE_OFFSET);
+		switch (msg_type) {
+		case EAP_EXP_TYPE_M1:
+			return QDF_PROTO_EAP_M1;
+		case EAP_EXP_TYPE_M2:
+			return QDF_PROTO_EAP_M2;
+		case EAP_EXP_TYPE_M3:
+			return QDF_PROTO_EAP_M3;
+		case EAP_EXP_TYPE_M4:
+			return QDF_PROTO_EAP_M4;
+		case EAP_EXP_TYPE_M5:
+			return QDF_PROTO_EAP_M5;
+		case EAP_EXP_TYPE_M6:
+			return QDF_PROTO_EAP_M6;
+		case EAP_EXP_TYPE_M7:
+			return QDF_PROTO_EAP_M7;
+		case EAP_EXP_TYPE_M8:
+			return QDF_PROTO_EAP_M8;
+		default:
+			break;
+		}
+		break;
+	case WSC_DONE:
+		return QDF_PROTO_EAP_WSC_DONE;
+	case WSC_FRAG_ACK:
+		return QDF_PROTO_EAP_WSC_FRAG_ACK;
+	default:
+		break;
+	}
+	switch (code) {
+	case QDF_EAP_REQUEST:
+		return QDF_PROTO_EAP_REQUEST;
+	case QDF_EAP_RESPONSE:
+		return QDF_PROTO_EAP_RESPONSE;
+	default:
+		return QDF_PROTO_INVALID;
+	}
+}
+
+/**
+ * __qdf_nbuf_data_get_eap_type() - Get EAP type
+ * @data: Pointer to EAPOL packet data buffer
+ * @code: EAP code
+ *
+ * Return: subtype of the EAPOL packet.
+ */
+static inline enum qdf_proto_subtype
+__qdf_nbuf_data_get_eap_type(uint8_t *data, uint8_t code)
+{
+	uint8_t type = *(data + EAP_TYPE_OFFSET);
+
+	switch (type) {
+	case EAP_PACKET_TYPE_EXP:
+		return __qdf_nbuf_data_get_exp_msg_type(data, code);
+	case EAP_PACKET_TYPE_ID:
+		switch (code) {
+		case QDF_EAP_REQUEST:
+			return QDF_PROTO_EAP_REQ_ID;
+		case QDF_EAP_RESPONSE:
+			return QDF_PROTO_EAP_RSP_ID;
+		default:
+			return QDF_PROTO_INVALID;
+		}
+	default:
+		switch (code) {
+		case QDF_EAP_REQUEST:
+			return QDF_PROTO_EAP_REQUEST;
+		case QDF_EAP_RESPONSE:
+			return QDF_PROTO_EAP_RESPONSE;
+		default:
+			return QDF_PROTO_INVALID;
+		}
+	}
+}
+
 /**
  * __qdf_nbuf_data_get_eap_code() - Get EAPOL code
  * @data: Pointer to EAPOL packet data buffer
@@ -1573,9 +1669,8 @@ __qdf_nbuf_data_get_eap_code(uint8_t *data)
 
 	switch (code) {
 	case QDF_EAP_REQUEST:
-		return QDF_PROTO_EAP_REQUEST;
 	case QDF_EAP_RESPONSE:
-		return QDF_PROTO_EAP_RESPONSE;
+		return __qdf_nbuf_data_get_eap_type(data, code);
 	case QDF_EAP_SUCCESS:
 		return QDF_PROTO_EAP_SUCCESS;
 	case QDF_EAP_FAILURE:

+ 60 - 0
qdf/linux/src/qdf_trace.c

@@ -1255,6 +1255,36 @@ static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
 		return "LOGOFF";
 	case QDF_PROTO_EAPOL_ASF:
 		return "ASF";
+	case QDF_PROTO_EAP_REQ_ID:
+		return "EAP REQ ID";
+	case QDF_PROTO_EAP_RSP_ID:
+		return "EAP RSP ID";
+	case QDF_PROTO_EAP_M1:
+		return "EAP M1";
+	case QDF_PROTO_EAP_M2:
+		return "EAP M2";
+	case QDF_PROTO_EAP_M3:
+		return "EAP M3";
+	case QDF_PROTO_EAP_M4:
+		return "EAP M4";
+	case QDF_PROTO_EAP_M5:
+		return "EAP M5";
+	case QDF_PROTO_EAP_M6:
+		return "EAP M6";
+	case QDF_PROTO_EAP_M7:
+		return "EAP M7";
+	case QDF_PROTO_EAP_M8:
+		return "EAP M8";
+	case QDF_PROTO_EAP_WSC_START:
+		return "EAP WSC START";
+	case QDF_PROTO_EAP_WSC_DONE:
+		return "EAP WSC DONE";
+	case QDF_PROTO_EAP_WSC_ACK:
+		return "EAP WSC ACK";
+	case QDF_PROTO_EAP_WSC_NACK:
+		return "EAP WSC NACK";
+	case QDF_PROTO_EAP_WSC_FRAG_ACK:
+		return "EAP WSC FRAG ACK";
 	default:
 		return "invalid";
 	}
@@ -1555,6 +1585,36 @@ uint8_t *qdf_get_pkt_type_string(uint8_t type, uint8_t subtype)
 		return "EAPOL-LOGOFF";
 	case QDF_PROTO_EAPOL_ASF:
 		return "EAPOL-ASF";
+	case QDF_PROTO_EAP_REQ_ID:
+		return "EAP-REQ-ID";
+	case QDF_PROTO_EAP_RSP_ID:
+		return "EAP-RSP-ID";
+	case QDF_PROTO_EAP_M1:
+		return "EAP-M1";
+	case QDF_PROTO_EAP_M2:
+		return "EAP-M2";
+	case QDF_PROTO_EAP_M3:
+		return "EAP-M3";
+	case QDF_PROTO_EAP_M4:
+		return "EAP-M4";
+	case QDF_PROTO_EAP_M5:
+		return "EAP-M5";
+	case QDF_PROTO_EAP_M6:
+		return "EAP-M6";
+	case QDF_PROTO_EAP_M7:
+		return "EAP-M7";
+	case QDF_PROTO_EAP_M8:
+		return "EAP-M8";
+	case QDF_PROTO_EAP_WSC_START:
+		return "EAP-WSC-START";
+	case QDF_PROTO_EAP_WSC_DONE:
+		return "EAP-WSC-DONE";
+	case QDF_PROTO_EAP_WSC_ACK:
+		return "EAP-WSC-ACK";
+	case QDF_PROTO_EAP_WSC_NACK:
+		return "EAP-WSC-NACK";
+	case QDF_PROTO_EAP_WSC_FRAG_ACK:
+		return "EAP-WSC-FRAG-ACK";
 	default:
 		switch (type) {
 		case QDF_PROTO_TYPE_EAPOL: