Skip to content

Commit 4a65ed7

Browse files
committed
Full rewrite IE operations.
The way I interpreted IEs was wrong, which lead to the code being absolutely useless and broken (The last commit happened because of the lack of tests).
1 parent bf54c60 commit 4a65ed7

2 files changed

Lines changed: 39 additions & 25 deletions

File tree

gc/ogc/wd.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ enum WDIOCTLV
6262

6363
#define CAPAB_SECURED_FLAG 0x10
6464

65+
// Information Elements IDs :
66+
67+
#define IEID_SSID 0x0
68+
#define IEID_VENDORSPECIFIC 0xDD
69+
#define IEID_SECURITY 0x30
70+
6571
// WD Modes :
6672

6773
enum MODES
@@ -124,10 +130,17 @@ typedef struct BSSDescriptor
124130
u16 channel;
125131
u16 CF_period;
126132
u16 CF_max_duration;
127-
// IE -> Information Elements
128133
u16 IEs_length;
129134
} BSSDescriptor;
130135

136+
// Information Element Header :
137+
138+
typedef struct IE_hdr
139+
{
140+
u8 ID;
141+
u8 len;
142+
} IE_hdr;
143+
131144
// General Purpose :
132145

133146
s32 NCD_LockWirelessDriver();
@@ -142,7 +155,7 @@ u8 WD_GetRadioLevel(BSSDescriptor* Bss);
142155
int WD_Scan(ScanParameters *settings, u8* buff, u16 buffsize);
143156
int WD_ScanOnce(ScanParameters *settings, u8* buff, u16 buffsize);
144157
u8 WD_GetNumberOfIEs(BSSDescriptor* Bss);
145-
u8 WD_GetIELength(BSSDescriptor* Bss, u8 ID);
158+
int WD_GetIELength(BSSDescriptor* Bss, u8 ID, u8* len);
146159
int WD_GetIE(BSSDescriptor* Bss, u8 ID, u8* buff, u8 buffsize);
147160
void WD_SetDefaultScanParameters(ScanParameters* set);
148161

libogc/wd.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -194,56 +194,57 @@ u8 WD_GetNumberOfIEs(BSSDescriptor* Bss) {
194194
u8 ret = 0;
195195

196196
u8* ptr = (u8*)Bss;
197-
size_t offset = 0;
197+
IE_hdr* hdr = (IE_hdr*)&ptr[sizeof(BSSDescriptor)];
198+
u16 offset = 0;
198199

199-
for(;
200-
offset < Bss->IEs_length && ptr[offset + 0x3F] != 0;
201-
offset += ptr[offset + 0x3F])
200+
while(offset < Bss->IEs_length && hdr->len != 0 )
202201
{
202+
hdr = (IE_hdr*)&ptr[sizeof(BSSDescriptor) + offset];
203+
offset += hdr->len + sizeof(IE_hdr);
203204
ret++;
204205
}
205206

206207
return ret;
207208
}
208209

209-
u8 WD_GetIELength(BSSDescriptor* Bss, u8 ID) {
210-
if(ID > WD_GetNumberOfIEs(Bss)) return -1;
211-
212-
210+
int WD_GetIELength(BSSDescriptor* Bss, u8 ID, u8* len) {
213211
u16 IEslen = Bss->IEs_length;
214212

215213
u8* ptr = (u8*)Bss;
216-
size_t offset = 0;
214+
IE_hdr* hdr = (IE_hdr*)&ptr[sizeof(BSSDescriptor)];
215+
u16 offset = 0;
217216

218-
for(u8 IE = 0;
219-
(IE < ID) && ((offset + ptr[offset + 0x3F]) < IEslen && ptr[offset + 0x3F] != 0);
220-
offset += ptr[offset + 0x3F])
217+
while(hdr->ID != ID && (offset + hdr->len) < IEslen && hdr->len != 0)
221218
{
222-
IE++;
219+
hdr = (IE_hdr*)&ptr[sizeof(BSSDescriptor) + offset];
220+
offset += hdr->len + sizeof(IE_hdr);
223221
}
224-
225-
return ptr[offset + 0x3F];
222+
223+
if(hdr->ID != ID) return -1;
224+
225+
*len = hdr->len;
226+
return 0;
226227
}
227228

228229
int WD_GetIE(BSSDescriptor* Bss, u8 ID, u8* buff, u8 buffsize) {
229-
if(ID > WD_GetNumberOfIEs(Bss)) return -1;
230-
231230
if(!buff) return -2;
232231

233232
u16 IEslen = Bss->IEs_length;
234233

235234
u8* ptr = (u8*)Bss;
236-
size_t offset = 0;
235+
IE_hdr* hdr = (IE_hdr*)&ptr[sizeof(BSSDescriptor)];
236+
u16 offset = 0;
237237

238-
for(u8 IE = 0;
239-
(IE < ID) && ((offset + WD_GetIELength(Bss, ID)) < IEslen && WD_GetIELength(Bss, ID) != 0);
240-
offset += WD_GetIELength(Bss, ID))
238+
while(hdr->ID != ID && (offset + hdr->len) < IEslen && hdr->len != 0)
241239
{
242-
IE++;
240+
hdr = (IE_hdr*)&ptr[sizeof(BSSDescriptor) + offset];
241+
offset += hdr->len + sizeof(IE_hdr);
243242
}
244243

244+
if(hdr->ID != ID) return -1;
245+
245246
memset(buff, 0, buffsize);
246-
memcpy(buff, &ptr[offset + 0x3F + 1], WD_GetIELength(Bss, ID));
247+
memcpy(buff, &ptr[offset + sizeof(BSSDescriptor) + sizeof(IE_hdr)], hdr->len);
247248

248249
return 0;
249250
}

0 commit comments

Comments
 (0)