diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 0b3fcb7acc..2e118baa5b 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/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 diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 13f28dedbe..fcaf46644d 100644 --- a/qdf/inc/qdf_types.h +++ b/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 }; diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index 4744a17f61..135c0e0e12 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/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: diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index e1356623cc..65c99dcabd 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/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: