@@ -322,13 +322,13 @@ int WD_GetVendorSpecificIELength(BSSDescriptor* Bss, u32 OUI) {
322322 return hdr -> len ;
323323}
324324
325- int WD_GetRSN_PCSList (BSSDescriptor * Bss , u8 * destbuff , u16 buffsize ) {
325+ int WD_GetPCSList (BSSDescriptor * Bss , u8 * destbuff , u16 buffsize , u8 offset ) {
326326 if (!Bss ) return WD_INVALIDBUFF ;
327327 if (!destbuff ) return WD_INVALIDBUFF ;
328328
329- IE_RSN IE ;
329+ IE_RSN_WPA IE ;
330330
331- int ret = WD_GetRSNEssentials (Bss , & IE );
331+ int ret = WD_GetRSN_WPAEssentials (Bss , & IE , offset );
332332
333333 if (ret < 0 ) return WD_INVALIDBUFF ;
334334 if (IE .PCS_Count * 4 > buffsize ) return WD_BUFFTOOSMALL ;
@@ -339,33 +339,12 @@ int WD_GetRSN_PCSList(BSSDescriptor *Bss, u8* destbuff, u16 buffsize) {
339339 WD_GetIE (Bss , IEID_SECURITY_RSN , buff , IE_len );
340340
341341 memset (destbuff , 0 , buffsize );
342- memcpy (destbuff , & buff [8 ], IE .PCS_Count * 4 );
342+ memcpy (destbuff , & buff [8 + offset ], IE .PCS_Count * 4 );
343343
344344 return WD_SUCCESS ;
345345}
346346
347- int WD_GetWPA_PCSList (BSSDescriptor * Bss , u8 * destbuff , u16 buffsize ) {
348- if (!Bss ) return WD_INVALIDBUFF ;
349- if (!destbuff ) return WD_INVALIDBUFF ;
350-
351- IE_WPA IE ;
352-
353- int ret = WD_GetWPAIEEssentials (Bss , & IE );
354-
355- if (ret < 0 ) return WD_INVALIDBUFF ;
356- if (IE .PCS_Count * 4 > buffsize ) return WD_BUFFTOOSMALL ;
357-
358- u8 IE_len = WD_GetIELength (Bss , IEID_SECURITY_RSN );
359- u8 buff [IE_len ];
360- WD_GetIE (Bss , IEID_SECURITY_RSN , buff , IE_len );
361-
362- memset (destbuff , 0 , buffsize );
363- memcpy (destbuff , & buff [8 ], IE .PCS_Count * 4 );
364-
365- return WD_SUCCESS ;
366- }
367-
368- int WD_GetRSNEssentials (BSSDescriptor * Bss , IE_RSN * IE ) {
347+ int WD_GetRSN_WPAEssentials (BSSDescriptor * Bss , IE_RSN_WPA * IE , u8 offset ) {
369348 if (!Bss ) return WD_INVALIDBUFF ;
370349 if (!IE ) return WD_INVALIDBUFF ;
371350
@@ -376,31 +355,6 @@ int WD_GetRSNEssentials(BSSDescriptor *Bss, IE_RSN *IE) {
376355
377356 WD_GetIE (Bss , IEID_SECURITY_RSN , buff , IE_size );
378357
379- u8 offset = 0 ;
380- IE -> Version = buff [0 + offset ] | buff [1 + offset ] << 8 ;
381- offset += 2 ;
382- IE -> GDCS = buff [0 + offset ] << 24 | buff [1 + offset ] << 16 | buff [2 + offset ] << 8 | buff [3 + offset ];
383- offset += 4 ;
384- IE -> PCS_Count = buff [0 + offset ] | buff [1 + offset ] << 8 ;
385- offset += 2 + IE -> PCS_Count * 4 ;
386- IE -> AKMS_Count = buff [0 + offset ] | buff [1 + offset ] << 8 ;
387- offset += 2 + IE -> AKMS_Count * 4 ;
388-
389- return WD_SUCCESS ;
390- }
391-
392- int WD_GetWPAIEEssentials (BSSDescriptor * Bss , IE_WPA * IE ) {
393- if (!Bss ) return WD_INVALIDBUFF ;
394- if (!IE ) return WD_INVALIDBUFF ;
395-
396- u8 IE_size = WD_GetVendorSpecificIELength (Bss , OUI_WPA );
397- if (IE_size < 0 ) return WD_NOTFOUND ;
398-
399- u8 buff [IE_size ];
400-
401- WD_GetVendorSpecificIE (Bss , OUI_WPA , buff , IE_size );
402-
403- u8 offset = 4 ;
404358 IE -> Version = buff [0 + offset ] | buff [1 + offset ] << 8 ;
405359 offset += 2 ;
406360 IE -> GDCS = buff [0 + offset ] << 24 | buff [1 + offset ] << 16 | buff [2 + offset ] << 8 | buff [3 + offset ];
@@ -418,45 +372,46 @@ u8 WD_GetSecurity(BSSDescriptor *Bss) {
418372 if (!(Bss -> Capabilities & CAPAB_SECURED_FLAG )) return WD_OPEN ;
419373
420374 int ie_len = WD_GetVendorSpecificIELength (Bss , OUI_WPA );
375+ u8 ret = 0 ;
421376
422377 if (ie_len != WD_NOTFOUND && ie_len > 0 ) { // WPA
423- IE_WPA IE ;
424- WD_GetWPAIEEssentials (Bss , & IE );
378+ IE_RSN_WPA IE ;
379+ WD_GetRSN_WPAEssentials (Bss , & IE , WPA_ESSENTIALS );
425380
426381 u8 buff [IE .PCS_Count * 4 ];
427382 WD_GetWPA_PCSList (Bss , buff , IE .PCS_Count * 4 );
428383
429384 u8 offset = 0 ;
430385
431386 for (int i = 0 ; i < IE .PCS_Count ; i ++ ) {
432- if (buff [offset + 3 ] == 0x02 ) return WD_WPA_TKIP ;
433- else if (buff [offset + 3 ] == 0x04 ) return WD_WPA_AES ;
387+ if (buff [offset + 3 ] == 0x02 ) ret |= WD_WPA_TKIP ;
388+ else if (buff [offset + 3 ] == 0x04 ) ret |= WD_WPA_AES ;
434389 offset += 4 ;
435390 }
391+ return ret ;
436392 }
437393
438394 ie_len = WD_GetIELength (Bss , IEID_SECURITY_RSN );
439395
440396 if (ie_len != WD_NOTFOUND && ie_len > 0 ) { // WPA2
441- IE_RSN IE ;
442- WD_GetRSNEssentials (Bss , & IE );
443-
444- u8 ret = 0 ;
397+ IE_RSN_WPA IE ;
398+ WD_GetRSN_WPAEssentials (Bss , & IE );
445399
446400 u8 buff [IE .PCS_Count * 4 ];
447401 WD_GetRSN_PCSList (Bss , buff , IE .PCS_Count * 4 );
448402
449403 u8 offset = 0 ;
450404
451405 for (int i = 0 ; i < IE .PCS_Count ; i ++ ) {
452- if (buff [offset + 3 ] == 0x02 ) ret = WD_WPA2_TKIP ;
453- if (buff [offset + 3 ] == 0x04 ) ret = WD_WPA2_AES ;
406+ if (buff [offset + 3 ] == 0x02 ) ret | = WD_WPA2_TKIP ;
407+ if (buff [offset + 3 ] == 0x04 ) ret | = WD_WPA2_AES ;
454408 offset += 4 ;
455409 }
456-
457- return ret ;
458410 }
459- return WD_WEP ;
411+
412+ if (!ret ) return WD_WEP ;
413+
414+ return ret ;
460415}
461416
462417#endif
0 commit comments