Skip to content

Commit 8862162

Browse files
abdelali221DacoTaco
authored andcommitted
Check description.
- Add WD_GetVendorSpecificIE. - Use WD Errors instead of values. - Fix Wd_GetRadioLevel.
1 parent e9274af commit 8862162

2 files changed

Lines changed: 73 additions & 17 deletions

File tree

gc/ogc/wd.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,24 @@ enum WDIOCTLV
5858
IOCTLV_WD_RECV_NOTIFICATION = 0x8001 // WD_ReceiveNotification
5959
};
6060

61+
// Error Codes :
62+
63+
#define WD_SUCCESS 0
64+
#define WD_UINITIALIZED -1
65+
#define WD_INVALIDBUFF -2
66+
#define WD_BUFFTOOSMALL -3
67+
#define WD_NOTFOUND -4
68+
6169
// Capability flags :
6270

6371
#define CAPAB_SECURED_FLAG 0x10
6472

6573
// Information Elements IDs :
6674

6775
#define IEID_SSID 0x0
76+
#define IEID_COUNTRY 0x7
77+
#define IEID_SECURITY_RSN 0x30
6878
#define IEID_VENDORSPECIFIC 0xDD
69-
#define IEID_SECURITY 0x30
7079

7180
// Signal Strength :
7281

@@ -161,9 +170,13 @@ int WD_GetInfo(WDInfo* inf);
161170
u8 WD_GetRadioLevel(BSSDescriptor* Bss);
162171
int WD_Scan(ScanParameters *settings, u8* buff, u16 buffsize);
163172
int WD_ScanOnce(ScanParameters *settings, u8* buff, u16 buffsize);
173+
void WD_SetDefaultScanParameters(ScanParameters* set);
174+
175+
// IE related :
176+
164177
u8 WD_GetNumberOfIEs(BSSDescriptor* Bss);
165178
int WD_GetIELength(BSSDescriptor* Bss, u8 ID);
166179
int WD_GetIE(BSSDescriptor* Bss, u8 ID, u8* buff, u8 buffsize);
167-
void WD_SetDefaultScanParameters(ScanParameters* set);
180+
int WD_GetIEIDList(BSSDescriptor* Bss, u8* buff, u8 buffsize);
168181

169182
#endif

libogc/wd.c

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ void WD_SetDefaultScanParameters(ScanParameters* set) {
103103
int 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

111111
void WD_Deinit() {
@@ -116,13 +116,13 @@ void WD_Deinit() {
116116
}
117117

118118
u8 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) {
131131
int 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

151151
int 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

174174
int 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

187187
u8 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

222222
int 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

Comments
 (0)