Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Libretro
melonDS
Commits
dff14ca8
Unverified
Commit
dff14ca8
authored
Jul 27, 2020
by
Arisotura
Committed by
GitHub
Jul 27, 2020
Browse files
Merge pull request #682 from nadiaholmquist/slirp-merge
Merge slirp branch into master
parents
17ce4d2a
6a682a8e
Changes
30
Hide whitespace changes
Inline
Side-by-side
.github/workflows/build-ubuntu-aarch64.yml
View file @
dff14ca8
...
...
@@ -26,7 +26,7 @@ jobs:
&& sudo rm /etc/apt/sources.list \
&& sudo mv /etc/apt/sources.list{.new,} \
&& sudo apt-get update \
&& sudo apt-get install {gcc-10,g++-10,pkg-config}-aarch64-linux-gnu libsdl2-dev:arm64 qtbase5-dev:arm64
&& sudo apt-get install {gcc-10,g++-10,pkg-config}-aarch64-linux-gnu libsdl2-dev:arm64 qtbase5-dev:arm64
libslirp-dev:arm64
-
name
:
Create build environment
run
:
mkdir ${{runner.workspace}}/build
-
name
:
Configure
...
...
.github/workflows/build-ubuntu.yml
View file @
dff14ca8
...
...
@@ -23,17 +23,15 @@ jobs:
shell
:
bash
working-directory
:
${{runner.workspace}}
run
:
|
# Fetch a new version of CMake, because the default is too old.
wget -nv https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-Linux-x86_64.tar.gz \
&& tar -zxf cmake-$CMAKE_VERSION-Linux-x86_64.tar.gz \
&& sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list \
sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list \
&& sudo apt-get update \
&& sudo apt-get install
gtk+-3.0
libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qt5-default
&& sudo apt-get install
cmake
libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qt5-default
libslirp-dev
-
name
:
Create build environment
run
:
mkdir ${{runner.workspace}}/build
-
name
:
Configure
shell
:
bash
working-directory
:
${{runner.workspace}}/build
run
:
${{runner.workspace}}/cmake-$CMAKE_VERSION-Linux-x86_64/bin/
cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE
run
:
cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE
-
name
:
Make
shell
:
bash
working-directory
:
${{runner.workspace}}/build
...
...
.github/workflows/build-windows.yml
View file @
dff14ca8
...
...
@@ -24,7 +24,7 @@ jobs:
choco install msys2
C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Syuq --noconfirm"
-
name
:
Install dependencies
run
:
C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Sq --noconfirm git make mingw-w64-x86_64-{cmake,mesa,SDL2,qt5-static,toolchain}"
run
:
C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Sq --noconfirm git make mingw-w64-x86_64-{cmake,mesa,SDL2,qt5-static,
libslirp,
toolchain}"
-
name
:
Create build environment
run
:
|
New-Item -ItemType directory -Path ${{runner.workspace}}\melonDS\build
...
...
src/CP15.cpp
View file @
dff14ca8
...
...
@@ -635,7 +635,10 @@ void ARMv5::CP15Write(u32 id, u32 val)
}
if
((
id
&
0xF00
)
!=
0x700
)
if
((
id
&
0xF00
)
==
0xF00
)
// test/debug shit?
return
;
if
((
id
&
0xF00
)
!=
0x700
)
printf
(
"unknown CP15 write op %03X %08X
\n
"
,
id
,
val
);
}
...
...
@@ -729,6 +732,9 @@ u32 ARMv5::CP15Read(u32 id)
return
ITCMSetting
;
}
if
((
id
&
0xF00
)
==
0xF00
)
// test/debug shit?
return
0
;
printf
(
"unknown CP15 read op %03X
\n
"
,
id
);
return
0
;
}
...
...
src/DSi.cpp
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi.h
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_AES.cpp
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
@@ -165,9 +165,37 @@ void ProcessBlock_CCM_Decrypt()
//printf("AES-CCM: "); _printhex2(data, 16);
Swap16
(
data_rev
,
data
);
AES_CTR_xcrypt_buffer
(
&
Ctx
,
data_rev
,
16
);
for
(
int
i
=
0
;
i
<
16
;
i
++
)
CurMAC
[
i
]
^=
data_rev
[
i
];
AES_ECB_encrypt
(
&
Ctx
,
CurMAC
);
Swap16
(
data
,
data_rev
);
//printf(" -> "); _printhex2(data, 16);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
data
[
0
]);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
data
[
4
]);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
data
[
8
]);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
data
[
12
]);
}
void
ProcessBlock_CCM_Encrypt
()
{
u8
data
[
16
];
u8
data_rev
[
16
];
*
(
u32
*
)
&
data
[
0
]
=
InputFIFO
->
Read
();
*
(
u32
*
)
&
data
[
4
]
=
InputFIFO
->
Read
();
*
(
u32
*
)
&
data
[
8
]
=
InputFIFO
->
Read
();
*
(
u32
*
)
&
data
[
12
]
=
InputFIFO
->
Read
();
//printf("AES-CCM: "); _printhex2(data, 16);
Swap16
(
data_rev
,
data
);
for
(
int
i
=
0
;
i
<
16
;
i
++
)
CurMAC
[
i
]
^=
data_rev
[
i
];
AES_CTR_xcrypt_buffer
(
&
Ctx
,
data_rev
,
16
);
AES_ECB_encrypt
(
&
Ctx
,
CurMAC
);
Swap16
(
data
,
data_rev
);
...
...
@@ -232,7 +260,6 @@ void WriteCnt(u32 val)
OutputDMASize
=
dmasize_out
[(
val
>>
14
)
&
0x3
];
AESMode
=
(
val
>>
28
)
&
0x3
;
if
(
AESMode
==
1
)
printf
(
"AES-CCM TODO
\n
"
);
if
(
val
&
(
1
<<
24
))
{
...
...
@@ -245,6 +272,8 @@ void WriteCnt(u32 val)
// transfer start (checkme)
RemBlocks
=
BlkCnt
>>
16
;
if
(
AESMode
==
0
&&
(
!
(
val
&
(
1
<<
20
))))
printf
(
"AES: CCM-DECRYPT MAC FROM WRFIFO, TODO
\n
"
);
if
(
RemBlocks
>
0
)
{
u8
key
[
16
];
...
...
@@ -365,14 +394,9 @@ void Update()
switch
(
AESMode
)
{
case
0
:
ProcessBlock_CCM_Decrypt
();
break
;
case
1
:
ProcessBlock_CCM_Encrypt
();
break
;
case
2
:
case
3
:
ProcessBlock_CTR
();
break
;
default:
// dorp
OutputFIFO
->
Write
(
InputFIFO
->
Read
());
OutputFIFO
->
Write
(
InputFIFO
->
Read
());
OutputFIFO
->
Write
(
InputFIFO
->
Read
());
OutputFIFO
->
Write
(
InputFIFO
->
Read
());
}
RemBlocks
--
;
...
...
@@ -398,6 +422,24 @@ void Update()
if
(
CurMAC
[
15
-
i
]
!=
MAC
[
i
])
Cnt
&=
~
(
1
<<
21
);
}
}
else
if
(
AESMode
==
1
)
{
Ctx
.
Iv
[
13
]
=
0x00
;
Ctx
.
Iv
[
14
]
=
0x00
;
Ctx
.
Iv
[
15
]
=
0x00
;
AES_CTR_xcrypt_buffer
(
&
Ctx
,
CurMAC
,
16
);
u8
finalmac
[
16
];
Swap16
(
finalmac
,
CurMAC
);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
finalmac
[
0
]);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
finalmac
[
4
]);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
finalmac
[
8
]);
OutputFIFO
->
Write
(
*
(
u32
*
)
&
finalmac
[
12
]);
// CHECKME
Cnt
&=
~
(
1
<<
21
);
}
else
{
// CHECKME
...
...
src/DSi_AES.h
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_Camera.cpp
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_Camera.h
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_I2C.cpp
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_I2C.h
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_NDMA.cpp
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_NDMA.h
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
src/DSi_NWifi.cpp
View file @
dff14ca8
/*
Copyright 2016-20
19
Arisotura
Copyright 2016-20
20
Arisotura
This file is part of melonDS.
...
...
@@ -21,6 +21,8 @@
#include "DSi.h"
#include "DSi_NWifi.h"
#include "SPI.h"
#include "WifiAP.h"
#include "Platform.h"
const
u8
CIS0
[
256
]
=
...
...
@@ -111,15 +113,37 @@ const u8 CIS1[256] =
};
// hax
DSi_NWifi
*
hax_wifi
;
void
triggerirq
(
u32
param
)
DSi_NWifi
*
Ctx
=
nullptr
;
DSi_NWifi
::
DSi_NWifi
(
DSi_SDHost
*
host
)
:
DSi_SDDevice
(
host
)
{
hax_wifi
->
SetIRQ_F1_Counter
(
0
);
// HACK
// the mailboxes are supposed to be 0x80 bytes
// however, as we do things instantly, emulating this is meaningless
// and only adds complication
for
(
int
i
=
0
;
i
<
8
;
i
++
)
Mailbox
[
i
]
=
new
FIFO
<
u8
>
(
0x600
);
//0x80);
// extra mailbox acting as a bigger RX buffer
Mailbox
[
8
]
=
new
FIFO
<
u8
>
(
0x8000
);
// this seems to control whether the firmware upload is done
EEPROMReady
=
0
;
Ctx
=
this
;
}
DSi_NWifi
::~
DSi_NWifi
()
{
for
(
int
i
=
0
;
i
<
9
;
i
++
)
delete
Mailbox
[
i
];
DSi_NWifi
::
DSi_NWifi
(
DSi_SDHost
*
host
)
:
DSi_SDDevice
(
host
)
NDS
::
CancelEvent
(
NDS
::
Event_DSi_NWifi
);
Ctx
=
nullptr
;
}
void
DSi_NWifi
::
Reset
()
{
TransferCmd
=
0xFFFFFFFF
;
RemSize
=
0
;
...
...
@@ -134,9 +158,8 @@ DSi_NWifi::DSi_NWifi(DSi_SDHost* host) : DSi_SDDevice(host)
WindowReadAddr
=
0
;
WindowWriteAddr
=
0
;
// TODO: check the actual mailbox size (presumably 0x200)
for
(
int
i
=
0
;
i
<
8
;
i
++
)
Mailbox
[
i
]
=
new
FIFO
<
u8
>
(
0x200
);
for
(
int
i
=
0
;
i
<
9
;
i
++
)
Mailbox
[
i
]
->
Clear
();
u8
*
mac
=
SPI_Firmware
::
GetWifiMAC
();
printf
(
"NWifi MAC: %02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
...
...
@@ -158,15 +181,17 @@ DSi_NWifi::DSi_NWifi(DSi_SDHost* host) : DSi_SDDevice(host)
*
(
u16
*
)
&
EEPROM
[
0x004
]
=
chk
;
EEPROMReady
=
0
;
// TODO: SDIO reset shouldn't reset this
// this is reset by the internal reset register, and that also resets EEPROM init
BootPhase
=
0
;
}
DSi_NWifi
::~
DSi_NWifi
()
{
for
(
int
i
=
0
;
i
<
8
;
i
++
)
delete
Mailbox
[
i
];
ErrorMask
=
0
;
ScanTimer
=
0
;
BeaconTimer
=
0x10A2220ULL
;
ConnectionStatus
=
0
;
NDS
::
CancelEvent
(
NDS
::
Event_DSi_NWifi
);
}
...
...
@@ -283,6 +308,7 @@ u8 DSi_NWifi::F1_Read(u32 addr)
if
(
addr
<
0x100
)
{
u8
ret
=
Mailbox
[
4
]
->
Read
();
if
(
addr
==
0xFF
)
DrainRXBuffer
();
UpdateIRQ_F1
();
return
ret
;
}
...
...
@@ -348,6 +374,7 @@ u8 DSi_NWifi::F1_Read(u32 addr)
else
if
(
addr
<
0x1000
)
{
u8
ret
=
Mailbox
[
4
]
->
Read
();
if
(
addr
==
0xFFF
)
DrainRXBuffer
();
UpdateIRQ_F1
();
return
ret
;
}
...
...
@@ -372,11 +399,12 @@ u8 DSi_NWifi::F1_Read(u32 addr)
else
{
u8
ret
=
Mailbox
[
4
]
->
Read
();
if
(
addr
==
0x3FFF
)
DrainRXBuffer
();
UpdateIRQ_F1
();
return
ret
;
}
printf
(
"NWIFI: unknown func1 read %05X
\n
"
,
addr
);
//
printf("NWIFI: unknown func1 read %05X\n", addr);
return
0
;
}
...
...
@@ -663,13 +691,13 @@ void DSi_NWifi::HandleCommand()
switch
(
BootPhase
)
{
case
0
:
return
BMI_Command
();
case
1
:
return
WMI_Command
();
case
1
:
return
HTC_Command
();
case
2
:
return
WMI_Command
();
}
}
void
DSi_NWifi
::
BMI_Command
()
{
// HLE command handling stub
u32
cmd
=
MB_Read32
(
0
);
switch
(
cmd
)
...
...
@@ -678,8 +706,8 @@ void DSi_NWifi::BMI_Command()
{
printf
(
"BMI_DONE
\n
"
);
EEPROMReady
=
1
;
// GROSS FUCKING HACK
u8
ready_msg
[
8
]
=
{
0x0
1
,
0x00
,
0x0
1
,
0x0
0
,
0x
01
,
0x00
,
0x00
,
0x00
};
SendWMI
Frame
(
ready_msg
,
8
,
0
,
0x00
,
0x0000
);
u8
ready_msg
[
6
]
=
{
0x0
A
,
0x00
,
0x0
8
,
0x0
6
,
0x
16
,
0x00
};
SendWMI
Event
(
0
,
0x0001
,
ready_msg
,
6
);
BootPhase
=
1
;
}
return
;
...
...
@@ -743,7 +771,7 @@ void DSi_NWifi::BMI_Command()
{
u32
len
=
MB_Read32
(
0
);
printf
(
"BMI LZ write %08X
\n
"
,
len
);
//FILE* f = fopen("wififirm.bin", "ab");
//FILE* f = fopen("
debug/
wififirm.bin", "ab");
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
...
...
@@ -762,15 +790,13 @@ void DSi_NWifi::BMI_Command()
}
}
void
DSi_NWifi
::
WMI
_Command
()
void
DSi_NWifi
::
HTC
_Command
()
{
// HLE command handling stub
u16
h0
=
MB_Read16
(
0
);
u16
len
=
MB_Read16
(
0
);
u16
h2
=
MB_Read16
(
0
);
u16
cmd
=
MB_Read16
(
0
);
printf
(
"WMI: cmd %04X
\n
"
,
cmd
);
switch
(
cmd
)
{
...
...
@@ -778,59 +804,631 @@ void DSi_NWifi::WMI_Command()
{
u16
svc_id
=
MB_Read16
(
0
);
u16
conn_flags
=
MB_Read16
(
0
);
u8
svc_resp
[
10
];
*
(
u16
*
)
&
svc_resp
[
0
]
=
0x0003
;
*
(
u16
*
)
&
svc_resp
[
2
]
=
svc_id
;
svc_resp
[
4
]
=
0
;
svc_resp
[
5
]
=
(
svc_id
&
0xFF
)
+
1
;
*
(
u16
*
)
&
svc_resp
[
6
]
=
0x0001
;
*
(
u16
*
)
&
svc_resp
[
8
]
=
0x0001
;
SendWMIFrame
(
svc_resp
,
10
,
0
,
0x00
,
0x0000
);
printf
(
"service connect %04X %04X %04X
\n
"
,
svc_id
,
conn_flags
,
MB_Read16
(
0
));
u8
svc_resp
[
8
];
// responses from hardware:
// 0003 0100 00 01 0602 00 00
// 0003 0101 00 02 0600 00 00
// 0003 0102 00 03 0600 00 00
// 0003 0103 00 04 0600 00 00
// 0003 0104 00 05 0600 00 00
*
(
u16
*
)
&
svc_resp
[
0
]
=
svc_id
;
svc_resp
[
2
]
=
0
;
svc_resp
[
3
]
=
(
svc_id
&
0xFF
)
+
1
;
*
(
u16
*
)
&
svc_resp
[
4
]
=
(
svc_id
==
0x0100
)
?
0x0602
:
0x0600
;
// max message size
*
(
u16
*
)
&
svc_resp
[
6
]
=
0x0000
;
SendWMIEvent
(
0
,
0x0003
,
svc_resp
,
8
);
}
break
;
case
0x0004
:
// setup complete
{
u8
ready_evt
[
14
];
memset
(
ready_evt
,
0
,
14
);
*
(
u16
*
)
&
ready_evt
[
0
]
=
0x1001
;
memcpy
(
&
ready_evt
[
2
],
SPI_Firmware
::
GetWifiMAC
(),
6
);
ready_evt
[
8
]
=
0x02
;
*
(
u32
*
)
&
ready_evt
[
10
]
=
0x23000024
;
// ctrl[0] = trailer size
// trailer[1] = trailer extra size
// trailer[0] = trailer type???
SendWMIFrame
(
ready_evt
,
14
,
1
,
0x00
,
0x0000
);
u8
ready_evt
[
12
];
memcpy
(
&
ready_evt
[
0
],
SPI_Firmware
::
GetWifiMAC
(),
6
);
ready_evt
[
6
]
=
0x02
;
ready_evt
[
7
]
=
0
;
*
(
u32
*
)
&
ready_evt
[
8
]
=
0x2300006C
;
SendWMIEvent
(
1
,
0x1001
,
ready_evt
,
12
);
u8
regdomain_evt
[
4
];
*
(
u32
*
)
&
regdomain_evt
[
0
]
=
0x80000000
|
(
*
(
u16
*
)
&
EEPROM
[
0x008
]
&
0x0FFF
);
SendWMIEvent
(
1
,
0x1006
,
regdomain_evt
,
4
);
BootPhase
=
2
;
NDS
::
ScheduleEvent
(
NDS
::
Event_DSi_NWifi
,
true
,
33611
,
MSTimer
,
0
);
}
break
;
default:
printf
(
"unknown WMI command %04X
\n
"
,
cmd
);
printf
(
"unknown HTC command %04X
\n
"
,
cmd
);
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
printf
(
"%02X "
,
Mailbox
[
0
]
->
Read
());
if
((
i
&
0xF
)
==
0xF
)
printf
(
"
\n
"
);
}
printf
(
"
\n
"
);
break
;
}
MB_Drain
(
0
);
}
void
DSi_NWifi
::
SendWMIFrame
(
u8
*
data
,
u32
len
,
u8
ep
,
u8
flags
,
u16
ctrl
)
void
DSi_NWifi
::
WMI_Command
()
{
u16
h0
=
MB_Read16
(
0
);
u16
len
=
MB_Read16
(
0
);
u16
h2
=
MB_Read16
(
0
);
u8
ep
=
h0
&
0xFF
;
if
(
ep
>
0x01
)
// data endpoints
{
WMI_SendPacket
(
len
);
}
else
{
u16
cmd
=
MB_Read16
(
0
);
switch
(
cmd
)
{
case
0x0001
:
// connect to network
{
WMI_ConnectToNetwork
();
}
break
;
case
0x0003
:
// disconnect
{
if
(
ConnectionStatus
!=
1
)
printf
(
"WMI: ?? trying to disconnect while not connected
\n
"
);
printf
(
"WMI: disconnect
\n
"
);
ConnectionStatus
=
0
;
u8
reply
[
11
];
*
(
u16
*
)
&
reply
[
0
]
=
3
;
// checkme
memcpy
(
&
reply
[
2
],
WifiAP
::
APMac
,
6
);
reply
[
8
]
=
3
;
// disconnect reason (via cmd)
reply
[
9
]
=
0
;
// assoc-response length (none here)
reply
[
10
]
=
0
;
// we need atleast one byte here, even if there is no assoc-response
SendWMIEvent
(
1
,
0x1003
,
reply
,
11
);
}
break
;
case
0x0004
:
// synchronize
{
Mailbox
[
0
]
->
Read
();
// TODO??
}
break
;
case
0x0005
:
// create priority stream
{
// TODO???
// there's a lot of crap in there.
}
break
;
case
0x0007
:
// start scan
{
u32
forcefg
=
MB_Read32
(
0
);
u32
legacy
=
MB_Read32
(
0
);
u32
scantime
=
MB_Read32
(
0
);
u32
forceinterval
=
MB_Read32
(
0
);
u8
scantype
=
Mailbox
[
0
]
->
Read
();
u8
nchannels
=
Mailbox
[
0
]
->
Read
();
printf
(
"WMI: start scan, forceFG=%d, legacy=%d, scanTime=%d, interval=%d, scanType=%d, chan=%d
\n
"
,
forcefg
,
legacy
,
scantime
,
forceinterval
,
scantype
,
nchannels
);
if
(
ScanTimer
>
0
)
{
printf
(
"!! CHECKME: START SCAN BUT WAS ALREADY SCANNING (%d)
\n
"
,
ScanTimer
);
}
// checkme
ScanTimer
=
scantime
*
5
;
}
break
;
case
0x0008
:
// set scan params
{
// TODO: do something with the params!!
}
break
;
case
0x0009
:
// set BSS filter
{
// TODO: do something with the params!!
u8
bssfilter
=
Mailbox
[
0
]
->
Read
();
Mailbox
[
0
]
->
Read
();
Mailbox
[
0
]
->
Read
();
Mailbox
[
0
]
->
Read
();
u32
iemask
=
MB_Read32
(
0
);
printf
(
"WMI: set BSS filter, filter=%02X, iemask=%08X
\n
"
,
bssfilter
,
iemask
);
}
break
;
case
0x000A
:
// set probed BSSID
{
u8
id
=
Mailbox
[
0
]
->
Read
();
u8
flags
=
Mailbox
[
0
]
->
Read
();
u8
len
=
Mailbox
[
0
]
->
Read
();
char
ssid
[
33
]
=
{
0
};
for
(
int
i
=
0
;
i
<
len
&&
i
<
32
;
i
++
)
ssid
[
i
]
=
Mailbox
[
0
]
->
Read
();
// TODO: store it somewhere
printf
(
"WMI: set probed SSID: id=%d, flags=%02X, len=%d, SSID=%s
\n
"
,
id
,
flags
,
len
,
ssid
);
}
break
;
case
0x000D
:
// set disconnect timeout
{
Mailbox
[
0
]
->
Read
();
// TODO??
}
break
;
case
0x000E
:
// get channel list
{
int
nchan
=
11
;
// TODO: customize??
u8
reply
[
2
+
(
nchan
*
2
)
+
2
];
reply
[
0
]
=
0
;
reply
[
1
]
=
nchan
;
for
(
int
i
=
0
;
i
<
nchan
;
i
++
)
*
(
u16
*
)
&
reply
[
2
+
(
i
*
2
)]
=
2412
+
(
i
*
5
);
*
(
u16
*
)
&
reply
[
2
+
(
nchan
*
2
)]
=
0
;
SendWMIEvent
(
1
,
0x000E
,
reply
,
4
+
(
nchan
*
2
));
}
break
;
case
0x0011
:
// set channel params
{
Mailbox
[
0
]
->
Read
();
u8
scan
=
Mailbox
[
0
]
->
Read
();
u8
phymode
=
Mailbox
[
0
]
->
Read
();
u8
len
=
Mailbox
[
0
]
->
Read
();
u16
channels
[
32
];
for
(
int
i
=
0
;
i
<
len
&&
i
<
32
;
i
++
)
channels
[
i
]
=
MB_Read16
(
0
);