23
23
#include <mon.h>
24
24
#include <wifi.h>
25
25
#include <linux/vmalloc.h>
26
- #include <net/lib80211.h>
27
26
28
27
#define ETHERNET_HEADER_SIZE 14 /* Ethernet Header Length */
29
28
#define LLC_HEADER_SIZE 6 /* LLC Header Length */
@@ -221,20 +220,31 @@ u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter)
221
220
static int recvframe_chkmic (struct adapter * adapter ,
222
221
struct recv_frame * precvframe )
223
222
{
224
- int res = _SUCCESS ;
225
- struct rx_pkt_attrib * prxattrib = & precvframe -> attrib ;
226
- struct sta_info * stainfo = rtw_get_stainfo (& adapter -> stapriv , prxattrib -> ta );
223
+ int i , res = _SUCCESS ;
224
+ u32 datalen ;
225
+ u8 miccode [8 ];
226
+ u8 bmic_err = false, brpt_micerror = true;
227
+ u8 * pframe , * payload , * pframemic ;
228
+ u8 * mickey ;
229
+ struct sta_info * stainfo ;
230
+ struct rx_pkt_attrib * prxattrib = & precvframe -> attrib ;
231
+ struct security_priv * psecuritypriv = & adapter -> securitypriv ;
232
+
233
+ struct mlme_ext_priv * pmlmeext = & adapter -> mlmeextpriv ;
234
+ struct mlme_ext_info * pmlmeinfo = & (pmlmeext -> mlmext_info );
235
+
236
+ stainfo = rtw_get_stainfo (& adapter -> stapriv , & prxattrib -> ta [0 ]);
227
237
228
238
if (prxattrib -> encrypt == _TKIP_ ) {
239
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_info_ ,
240
+ ("\n %s: prxattrib->encrypt==_TKIP_\n" , __func__ ));
241
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_info_ ,
242
+ ("\n %s: da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n" ,
243
+ __func__ , prxattrib -> ra [0 ], prxattrib -> ra [1 ], prxattrib -> ra [2 ],
244
+ prxattrib -> ra [3 ], prxattrib -> ra [4 ], prxattrib -> ra [5 ]));
245
+
246
+ /* calculate mic code */
229
247
if (stainfo ) {
230
- int key_idx ;
231
- const int iv_len = 8 , icv_len = 4 , key_length = 32 ;
232
- struct sk_buff * skb = precvframe -> pkt ;
233
- u8 key [32 ], iv [8 ], icv [4 ], * pframe = skb -> data ;
234
- void * crypto_private = NULL ;
235
- struct lib80211_crypto_ops * crypto_ops = try_then_request_module (lib80211_get_crypto_ops ("TKIP" ), "lib80211_crypt_tkip" );
236
- struct security_priv * psecuritypriv = & adapter -> securitypriv ;
237
-
238
248
if (IS_MCAST (prxattrib -> ra )) {
239
249
if (!psecuritypriv ) {
240
250
res = _FAIL ;
@@ -243,58 +253,115 @@ static int recvframe_chkmic(struct adapter *adapter,
243
253
DBG_88E ("\n %s: didn't install group key!!!!!!!!!!\n" , __func__ );
244
254
goto exit ;
245
255
}
246
- key_idx = prxattrib -> key_index ;
247
- memcpy (key , psecuritypriv -> dot118021XGrpKey [key_idx ].skey , 16 );
248
- memcpy (key + 16 , psecuritypriv -> dot118021XGrprxmickey [key_idx ].skey , 16 );
256
+ mickey = & psecuritypriv -> dot118021XGrprxmickey [prxattrib -> key_index ].skey [0 ];
257
+
258
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_info_ ,
259
+ ("\n %s: bcmc key\n" , __func__ ));
249
260
} else {
250
- key_idx = 0 ;
251
- memcpy ( key , stainfo -> dot118021x_UncstKey . skey , 16 );
252
- memcpy ( key + 16 , stainfo -> dot11tkiprxmickey . skey , 16 );
261
+ mickey = & stainfo -> dot11tkiprxmickey . skey [ 0 ] ;
262
+ RT_TRACE ( _module_rtl871x_recv_c_ , _drv_err_ ,
263
+ ( "\n %s: unicast key\n" , __func__ ) );
253
264
}
254
265
255
- if (!crypto_ops ) {
256
- res = _FAIL ;
257
- goto exit_lib80211_tkip ;
258
- }
266
+ /* icv_len included the mic code */
267
+ datalen = precvframe -> pkt -> len - prxattrib -> hdrlen -
268
+ prxattrib -> iv_len - prxattrib -> icv_len - 8 ;
269
+ pframe = precvframe -> pkt -> data ;
270
+ payload = pframe + prxattrib -> hdrlen + prxattrib -> iv_len ;
259
271
260
- memcpy ( iv , pframe + prxattrib -> hdrlen , iv_len );
261
- memcpy ( icv , pframe + skb -> len - icv_len , icv_len );
262
- memmove ( pframe + iv_len , pframe , prxattrib -> hdrlen );
272
+ RT_TRACE ( _module_rtl871x_recv_c_ , _drv_info_ , ( "\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n" , prxattrib -> iv_len , prxattrib -> icv_len ) );
273
+ rtw_seccalctkipmic ( mickey , pframe , payload , datalen , & miccode [ 0 ],
274
+ ( unsigned char ) prxattrib -> priority ); /* care the length of the data */
263
275
264
- skb_pull (skb , iv_len );
265
- skb_trim (skb , skb -> len - icv_len );
276
+ pframemic = payload + datalen ;
266
277
267
- crypto_private = crypto_ops -> init (key_idx );
268
- if (!crypto_private ) {
269
- res = _FAIL ;
270
- goto exit_lib80211_tkip ;
271
- }
272
- if (crypto_ops -> set_key (key , key_length , NULL , crypto_private ) < 0 ) {
273
- res = _FAIL ;
274
- goto exit_lib80211_tkip ;
275
- }
276
- if (crypto_ops -> decrypt_msdu (skb , key_idx , prxattrib -> hdrlen , crypto_private )) {
277
- res = _FAIL ;
278
- goto exit_lib80211_tkip ;
278
+ bmic_err = false;
279
+
280
+ for (i = 0 ; i < 8 ; i ++ ) {
281
+ if (miccode [i ] != * (pframemic + i )) {
282
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ ,
283
+ ("%s: miccode[%d](%02x)!=*(pframemic+%d)(%02x) " ,
284
+ __func__ , i , miccode [i ], i , * (pframemic + i )));
285
+ bmic_err = true;
286
+ }
279
287
}
280
288
281
- memmove (pframe , pframe + iv_len , prxattrib -> hdrlen );
282
- skb_push (skb , iv_len );
283
- skb_put (skb , icv_len );
289
+ if (bmic_err ) {
290
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ ,
291
+ ("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n" ,
292
+ * (pframemic - 8 ), * (pframemic - 7 ), * (pframemic - 6 ),
293
+ * (pframemic - 5 ), * (pframemic - 4 ), * (pframemic - 3 ),
294
+ * (pframemic - 2 ), * (pframemic - 1 )));
295
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ ,
296
+ ("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n" ,
297
+ * (pframemic - 16 ), * (pframemic - 15 ), * (pframemic - 14 ),
298
+ * (pframemic - 13 ), * (pframemic - 12 ), * (pframemic - 11 ),
299
+ * (pframemic - 10 ), * (pframemic - 9 )));
300
+ {
301
+ uint i ;
284
302
285
- memcpy (pframe + prxattrib -> hdrlen , iv , iv_len );
286
- memcpy (pframe + skb -> len - icv_len , icv , icv_len );
303
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ ,
304
+ ("\n ======demp packet (len=%d)======\n" ,
305
+ precvframe -> pkt -> len ));
306
+ for (i = 0 ; i < precvframe -> pkt -> len ; i += 8 ) {
307
+ RT_TRACE (_module_rtl871x_recv_c_ ,
308
+ _drv_err_ ,
309
+ ("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x" ,
310
+ * (precvframe -> pkt -> data + i ),
311
+ * (precvframe -> pkt -> data + i + 1 ),
312
+ * (precvframe -> pkt -> data + i + 2 ),
313
+ * (precvframe -> pkt -> data + i + 3 ),
314
+ * (precvframe -> pkt -> data + i + 4 ),
315
+ * (precvframe -> pkt -> data + i + 5 ),
316
+ * (precvframe -> pkt -> data + i + 6 ),
317
+ * (precvframe -> pkt -> data + i + 7 )));
318
+ }
319
+ RT_TRACE (_module_rtl871x_recv_c_ ,
320
+ _drv_err_ ,
321
+ ("\n ====== demp packet end [len=%d]======\n" ,
322
+ precvframe -> pkt -> len ));
323
+ RT_TRACE (_module_rtl871x_recv_c_ ,
324
+ _drv_err_ ,
325
+ ("\n hrdlen=%d,\n" ,
326
+ prxattrib -> hdrlen ));
327
+ }
287
328
288
- exit_lib80211_tkip :
289
- if (crypto_ops && crypto_private )
290
- crypto_ops -> deinit (crypto_private );
329
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ ,
330
+ ("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d " ,
331
+ prxattrib -> ra [0 ], prxattrib -> ra [1 ], prxattrib -> ra [2 ],
332
+ prxattrib -> ra [3 ], prxattrib -> ra [4 ], prxattrib -> ra [5 ], psecuritypriv -> binstallGrpkey ));
333
+
334
+ /* double check key_index for some timing issue , */
335
+ /* cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */
336
+ if ((IS_MCAST (prxattrib -> ra ) == true) && (prxattrib -> key_index != pmlmeinfo -> key_index ))
337
+ brpt_micerror = false;
338
+
339
+ if ((prxattrib -> bdecrypted ) && (brpt_micerror )) {
340
+ rtw_handle_tkip_mic_err (adapter , (u8 )IS_MCAST (prxattrib -> ra ));
341
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ , (" mic error :prxattrib->bdecrypted=%d " , prxattrib -> bdecrypted ));
342
+ DBG_88E (" mic error :prxattrib->bdecrypted=%d\n" , prxattrib -> bdecrypted );
343
+ } else {
344
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ , (" mic error :prxattrib->bdecrypted=%d " , prxattrib -> bdecrypted ));
345
+ DBG_88E (" mic error :prxattrib->bdecrypted=%d\n" , prxattrib -> bdecrypted );
346
+ }
347
+ res = _FAIL ;
348
+ } else {
349
+ /* mic checked ok */
350
+ if ((!psecuritypriv -> bcheck_grpkey ) && (IS_MCAST (prxattrib -> ra ))) {
351
+ psecuritypriv -> bcheck_grpkey = true;
352
+ RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ , ("psecuritypriv->bcheck_grpkey = true" ));
353
+ }
354
+ }
291
355
} else {
292
356
RT_TRACE (_module_rtl871x_recv_c_ , _drv_err_ ,
293
357
("%s: rtw_get_stainfo==NULL!!!\n" , __func__ ));
294
358
}
359
+
360
+ skb_trim (precvframe -> pkt , precvframe -> pkt -> len - 8 );
295
361
}
296
362
297
363
exit :
364
+
298
365
return res ;
299
366
}
300
367
0 commit comments