qcacmn: Set mpdu data ptr correctly

Handle mpdu data pointer for PMF frames based on EXT IV bit

Change-Id: I7c1b585a538402ae784985852c873537c0e4eb86
This commit is contained in:
Disha Das
2018-02-16 14:58:19 +05:30
committed by snandini
parent d819e98465
commit 19fa32351f
3 changed files with 19 additions and 5 deletions

View File

@@ -28,6 +28,9 @@
#define IEEE80211_CCMP_HEADERLEN 8 #define IEEE80211_CCMP_HEADERLEN 8
#define IEEE80211_CCMP_MICLEN 8 #define IEEE80211_CCMP_MICLEN 8
#define IEEE80211_FC1_WEP 0x40 #define IEEE80211_FC1_WEP 0x40
#define WLAN_HDR_IV_LEN 3
#define WLAN_HDR_EXT_IV_BIT 0x20
#define WLAN_HDR_EXT_IV_LEN 4
#define WLAN_SEQ_SEQ_SHIFT 4 #define WLAN_SEQ_SEQ_SHIFT 4

View File

@@ -779,7 +779,8 @@ QDF_STATUS wlan_crypto_delkey(struct wlan_objmgr_vdev *vdev,
if (!vdev || !macaddr || if (!vdev || !macaddr ||
(key_idx > (key_idx >
(WLAN_CRYPTO_MAXKEYIDX + WLAN_CRYPTO_MAXIGTKKEYIDX))) { (WLAN_CRYPTO_MAXKEYIDX + WLAN_CRYPTO_MAXIGTKKEYIDX))) {
qdf_print("%s[%d] Invalid params vdev %pK, macaddr %pK" QDF_TRACE(QDF_MODULE_ID_CRYPTO, QDF_TRACE_LEVEL_ERROR,
"%s[%d] Invalid params vdev %pK, macaddr %pK"
"keyidx %d\n", __func__, __LINE__, vdev, "keyidx %d\n", __func__, __LINE__, vdev,
macaddr, key_idx); macaddr, key_idx);
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;

View File

@@ -846,6 +846,8 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
enum mgmt_frame_type frm_type; enum mgmt_frame_type frm_type;
struct mgmt_rx_handler *rx_handler; struct mgmt_rx_handler *rx_handler;
struct mgmt_rx_handler *rx_handler_head = NULL, *rx_handler_tail = NULL; struct mgmt_rx_handler *rx_handler_head = NULL, *rx_handler_tail = NULL;
u_int8_t *data, *ivp = NULL;
uint16_t buflen;
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
if (!buf) { if (!buf) {
@@ -859,7 +861,12 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
wh = (struct ieee80211_frame *)qdf_nbuf_data(buf); data = (uint8_t *)qdf_nbuf_data(buf);
wh = (struct ieee80211_frame *)data;
buflen = qdf_nbuf_len(buf);
if (buflen > (sizeof(struct ieee80211_frame) + WLAN_HDR_EXT_IV_LEN))
ivp = data + sizeof(struct ieee80211_frame);
/* peer can be NULL in following 2 scenarios: /* peer can be NULL in following 2 scenarios:
* 1. broadcast frame received * 1. broadcast frame received
@@ -897,10 +904,13 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
mpdu_data_ptr = (uint8_t *)qdf_nbuf_data(buf) + mpdu_data_ptr = (uint8_t *)qdf_nbuf_data(buf) +
sizeof(struct ieee80211_frame); sizeof(struct ieee80211_frame);
if ((wh->i_fc[1] & IEEE80211_FC1_WEP) && if ((wh->i_fc[1] & IEEE80211_FC1_WEP) &&
(mgmt_subtype == MGMT_SUBTYPE_ACTION) &&
!qdf_is_macaddr_group((struct qdf_mac_addr *)wh->i_addr1) && !qdf_is_macaddr_group((struct qdf_mac_addr *)wh->i_addr1) &&
!qdf_is_macaddr_broadcast((struct qdf_mac_addr *)wh->i_addr1)) !qdf_is_macaddr_broadcast((struct qdf_mac_addr *)wh->i_addr1)) {
mpdu_data_ptr += IEEE80211_CCMP_HEADERLEN; if (ivp[WLAN_HDR_IV_LEN] & WLAN_HDR_EXT_IV_BIT)
mpdu_data_ptr += IEEE80211_CCMP_HEADERLEN;
else
mpdu_data_ptr += WLAN_HDR_EXT_IV_LEN;
}
frm_type = mgmt_txrx_get_frm_type(mgmt_subtype, mpdu_data_ptr); frm_type = mgmt_txrx_get_frm_type(mgmt_subtype, mpdu_data_ptr);
if (frm_type == MGMT_FRM_UNSPECIFIED) { if (frm_type == MGMT_FRM_UNSPECIFIED) {