@@ -103,9 +103,9 @@ void WD_SetDefaultScanParameters(ScanParameters* set) {
103103int WD_Init (u8 mode ) {
104104 if (wd_fd < 0 ) {
105105 wd_fd = IOS_Open ("/dev/net/wd/command" , 0x10000 | mode );
106- if (wd_fd < 0 ) return -1 ;
106+ if (wd_fd < 0 ) return WD_UINITIALIZED ;
107107 }
108- return 0 ;
108+ return WD_SUCCESS ;
109109}
110110
111111void WD_Deinit () {
@@ -116,13 +116,13 @@ void WD_Deinit() {
116116}
117117
118118u8 WD_GetRadioLevel (BSSDescriptor * Bss ) {
119- if (Bss -> RSSI >= 0xc4 )
119+ if (( u8 ) Bss -> RSSI >= 0xc4 )
120120 return WD_SIGNAL_STRONG ; // Strong
121121
122- if (Bss -> RSSI >= 0xb5 )
122+ if (( u8 ) Bss -> RSSI >= 0xb5 )
123123 return WD_SIGNAL_NORMAL ; // Normal
124124
125- if (Bss -> RSSI >= 0xab )
125+ if (( u8 ) Bss -> RSSI >= 0xab )
126126 return WD_SIGNAL_FAIR ; // Fair
127127
128128 return WD_SIGNAL_WEAK ; // Weak
@@ -131,7 +131,7 @@ u8 WD_GetRadioLevel(BSSDescriptor* Bss) {
131131int WD_GetInfo (WDInfo * info ) {
132132 s32 lockid = NCD_LockWirelessDriver ();
133133
134- if (WD_Init (AOSSAPScan ) < 0 ) return -1 ;
134+ if (WD_Init (AOSSAPScan ) < 0 ) return WD_UINITIALIZED ;
135135
136136 u8 inf [sizeof (WDInfo )] __attribute__((aligned (32 )));
137137
@@ -145,11 +145,11 @@ int WD_GetInfo(WDInfo* info) {
145145 WD_Deinit ();
146146 NCD_UnlockWirelessDriver (lockid );
147147
148- return 0 ;
148+ return WD_SUCCESS ;
149149}
150150
151151int WD_Scan (ScanParameters * settings , u8 * buff , u16 buffsize ) {
152- if (wd_fd < 0 ) return -1 ;
152+ if (wd_fd < 0 ) return WD_UINITIALIZED ;
153153
154154 u8 buf [buffsize + 2 ] __attribute__((aligned (32 )));
155155 u8 settingsbuf [0x4e ] __attribute__((aligned (32 )));
@@ -168,20 +168,20 @@ int WD_Scan(ScanParameters *settings, u8* buff, u16 buffsize) {
168168 usleep (100000 );
169169 memcpy (buff , buf , buffsize );
170170
171- return 0 ;
171+ return WD_SUCCESS ;
172172}
173173
174174int WD_ScanOnce (ScanParameters * settings , u8 * buff , u16 buffsize ) {
175175 s32 lockid = NCD_LockWirelessDriver ();
176176
177- if (WD_Init (AOSSAPScan ) < 0 ) return -1 ;
177+ if (WD_Init (AOSSAPScan ) < 0 ) return WD_UINITIALIZED ;
178178
179179 WD_Scan (settings , buff , buffsize );
180180
181181 WD_Deinit ();
182182 NCD_UnlockWirelessDriver (lockid );
183183
184- return 0 ;
184+ return WD_SUCCESS ;
185185}
186186
187187u8 WD_GetNumberOfIEs (BSSDescriptor * Bss ) {
@@ -214,13 +214,13 @@ int WD_GetIELength(BSSDescriptor* Bss, u8 ID) {
214214 offset += hdr -> len + sizeof (IE_hdr );
215215 }
216216
217- if (hdr -> ID != ID ) return -1 ;
217+ if (hdr -> ID != ID ) return WD_NOTFOUND ;
218218
219219 return hdr -> len ;
220220}
221221
222222int WD_GetIE (BSSDescriptor * Bss , u8 ID , u8 * buff , u8 buffsize ) {
223- if (!buff ) return -2 ;
223+ if (!buff ) return WD_INVALIDBUFF ;
224224
225225 u16 IEslen = Bss -> IEs_length ;
226226
@@ -234,12 +234,55 @@ int WD_GetIE(BSSDescriptor* Bss, u8 ID, u8* buff, u8 buffsize) {
234234 offset += hdr -> len + sizeof (IE_hdr );
235235 }
236236
237- if (hdr -> ID != ID ) return -1 ;
237+ if (hdr -> ID != ID ) return WD_NOTFOUND ;
238+ if (buffsize < WD_GetIELength (Bss , ID )) return WD_BUFFTOOSMALL ;
238239
239240 memset (buff , 0 , buffsize );
240241 memcpy (buff , & ptr [offset + sizeof (BSSDescriptor ) + sizeof (IE_hdr )], hdr -> len );
241242
242- return 0 ;
243+ return WD_SUCCESS ;
244+ }
245+
246+ int WD_GetIEIDList (BSSDescriptor * Bss , u8 * buff , u8 buffsize ) {
247+ if (!buff ) return WD_INVALIDBUFF ;
248+ if (buffsize < WD_GetNumberOfIEs (Bss )) return WD_BUFFTOOSMALL ;
249+
250+ u8 n = 0 ;
251+
252+ u8 * ptr = (u8 * )Bss ;
253+ IE_hdr * hdr = (IE_hdr * )& ptr [sizeof (BSSDescriptor )];
254+ u16 offset = 0 ;
255+
256+ while (offset < Bss -> IEs_length && hdr -> len != 0 )
257+ {
258+ buff [n ] = hdr -> ID ;
259+ hdr = (IE_hdr * )& ptr [sizeof (BSSDescriptor ) + offset ];
260+ offset += hdr -> len + sizeof (IE_hdr );
261+ n ++ ;
262+ }
263+
264+ return WD_SUCCESS ;
265+ }
266+
267+ int WD_GetVendorSpecificIE (BSSDescriptor * Bss , u32 OUI , u8 * buff , u8 buffsize ) {
268+ if (!buff ) return WD_INVALIDBUFF ;
269+
270+ u16 IEslen = Bss -> IEs_length ;
271+
272+ u8 * ptr = (u8 * )Bss ;
273+ IE_hdr * hdr = (IE_hdr * )& ptr [sizeof (BSSDescriptor )];
274+ u16 offset = 0 ;
275+
276+ while ((hdr -> ID != IEID_VENDORSPECIFIC && (u32 )ptr [sizeof (BSSDescriptor ) + offset + 2 ] != OUI ) && (offset + hdr -> len ) < IEslen && hdr -> len != 0 )
277+ {
278+ hdr = (IE_hdr * )& ptr [sizeof (BSSDescriptor ) + offset ];
279+ offset += hdr -> len + sizeof (IE_hdr );
280+ }
281+
282+ if ( hdr -> ID != IEID_VENDORSPECIFIC ||
283+ (u32 )ptr [sizeof (BSSDescriptor ) + offset + 2 ] != OUI ) return WD_NOTFOUND ;
284+
285+ return WD_SUCCESS ;
243286}
244287
245288#endif
0 commit comments