|
@@ -231,10 +231,21 @@ ol_rx_pn_check_base(struct ol_txrx_vdev_t *vdev,
|
|
|
* of the PN.
|
|
|
* This is more efficient than doing a conditional
|
|
|
* branch to copy only the relevant portion.
|
|
|
+
|
|
|
+ * IWNCOM AP will send 1 packet with old PN after USK
|
|
|
+ * rekey, don't update last_pn when recv the packet, or
|
|
|
+ * PN check failed for later packets
|
|
|
*/
|
|
|
- last_pn->pn128[0] = new_pn.pn128[0];
|
|
|
- last_pn->pn128[1] = new_pn.pn128[1];
|
|
|
- OL_RX_PN_TRACE_ADD(pdev, peer, tid, rx_desc);
|
|
|
+ if ((peer->security[index].sec_type
|
|
|
+ == htt_sec_type_wapi) &&
|
|
|
+ (peer->tids_rekey_flag[tid] == 1) &&
|
|
|
+ (index == txrx_sec_ucast)) {
|
|
|
+ peer->tids_rekey_flag[tid] = 0;
|
|
|
+ } else {
|
|
|
+ last_pn->pn128[0] = new_pn.pn128[0];
|
|
|
+ last_pn->pn128[1] = new_pn.pn128[1];
|
|
|
+ OL_RX_PN_TRACE_ADD(pdev, peer, tid, rx_desc);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
mpdu = next_mpdu;
|