Mercurial > repos > blastem
annotate megawifi.c @ 1966:b3c2dcae7dfc
Skip setting AI_NUMERICSERV in megawifi code on Windows for now so min SDK version does not need to be bumped
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 04 May 2020 23:58:37 -0700 |
parents | 16d46ff1f620 |
children | c16dabdb0aad |
rev | line source |
---|---|
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdlib.h> |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stdint.h> |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include <string.h> |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
4 #include <sys/types.h> |
1546
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
5 #ifdef _WIN32 |
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
6 #define WINVER 0x501 |
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
7 #include <winsock2.h> |
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
8 #include <ws2tcpip.h> |
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
9 #else |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
10 #include <sys/socket.h> |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
11 #include <unistd.h> |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
12 #include <netinet/in.h> |
1961
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
13 #include <netdb.h> |
1546
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
14 #endif |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
15 #include <errno.h> |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
16 #include <fcntl.h> |
1962
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
17 #include <time.h> |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 #include "genesis.h" |
1514
4f94e0f90c83
Added support for MegaWiFi command IP_CURRENT
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
19 #include "net.h" |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 enum { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 TX_IDLE, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 TX_LEN1, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 TX_LEN2, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 TX_PAYLOAD, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 TX_WAIT_ETX |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 #define STX 0x7E |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 #define ETX 0x7E |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
30 #define MAX_RECV_SIZE 1460 |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 #define E(N) N |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 enum { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 #include "mw_commands.c" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 CMD_ERROR = 255 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 #undef E |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 #define E(N) #N |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 static const char *cmd_names[] = { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 #include "mw_commands.c" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 [255] = "CMD_ERROR" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 |
1535
2781b9551004
MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents:
1518
diff
changeset
|
44 #ifndef MSG_NOSIGNAL |
2781b9551004
MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents:
1518
diff
changeset
|
45 #define MSG_NOSIGNAL 0 |
2781b9551004
MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents:
1518
diff
changeset
|
46 #endif |
2781b9551004
MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents:
1518
diff
changeset
|
47 |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 enum { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 STATE_IDLE=1, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 STATE_AP_JOIN, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 STATE_SCAN, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 STATE_READY, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 STATE_TRANSPARENT |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
56 enum { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
57 SOCKST_NONE = 0, |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
58 SOCKST_TCP_LISTEN, |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
59 SOCKST_TCP_EST, |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
60 SOCKST_UDP_READY |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
61 }; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
62 |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
63 |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 #define FLAG_ONLINE |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 typedef struct { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 uint32_t transmit_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 uint32_t expected_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 uint32_t receive_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 uint32_t receive_read; |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
71 int sock_fds[15]; |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 uint16_t channel_flags; |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
73 uint8_t channel_state[15]; |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 uint8_t scratchpad; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 uint8_t transmit_channel; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 uint8_t transmit_state; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 uint8_t module_state; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 uint8_t flags; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 uint8_t transmit_buffer[4096]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 uint8_t receive_buffer[4096]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 } megawifi; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 static megawifi *get_megawifi(void *context) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 m68k_context *m68k = context; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 genesis_context *gen = m68k->system; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 if (!gen->extra) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 gen->extra = calloc(1, sizeof(megawifi)); |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
89 megawifi *mw = gen->extra; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
90 mw->module_state = STATE_IDLE; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
91 for (int i = 0; i < 15; i++) |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
92 { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
93 mw->sock_fds[i] = -1; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
94 } |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 return gen->extra; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 static void mw_putc(megawifi *mw, uint8_t v) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 if (mw->receive_bytes == sizeof(mw->receive_buffer)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 return; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 mw->receive_buffer[mw->receive_bytes++] = v; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 |
1515
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
107 static void mw_set(megawifi *mw, uint8_t val, uint32_t count) |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
108 { |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
109 if (count + mw->receive_bytes > sizeof(mw->receive_buffer)) { |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
110 count = sizeof(mw->receive_buffer) - mw->receive_bytes; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
111 } |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
112 memset(mw->receive_buffer + mw->receive_bytes, val, count); |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
113 mw->receive_bytes += count; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
114 } |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
115 |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
116 static void mw_copy(megawifi *mw, const uint8_t *src, uint32_t count) |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
117 { |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
118 if (count + mw->receive_bytes > sizeof(mw->receive_buffer)) { |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
119 count = sizeof(mw->receive_buffer) - mw->receive_bytes; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
120 } |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
121 memcpy(mw->receive_buffer + mw->receive_bytes, src, count); |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
122 mw->receive_bytes += count; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
123 } |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
124 |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
125 static void mw_putraw(megawifi *mw, const char *data, size_t len) |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 if ((mw->receive_bytes + len) > sizeof(mw->receive_buffer)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 return; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
130 memcpy(mw->receive_buffer + mw->receive_bytes, data, len); |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 mw->receive_bytes += len; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
134 static void mw_puts(megawifi *mw, const char *s) |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
135 { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
136 size_t len = strlen(s); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
137 mw_putraw(mw, s, len); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
138 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
139 |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
140 static void poll_socket(megawifi *mw, uint8_t channel) |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
141 { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
142 if (mw->sock_fds[channel] < 0) { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
143 return; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
144 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
145 if (mw->channel_state[channel] == SOCKST_TCP_LISTEN) { |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
146 int res = accept(mw->sock_fds[channel], NULL, NULL); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
147 if (res >= 0) { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
148 close(mw->sock_fds[channel]); |
1546
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
149 #ifndef _WIN32 |
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
150 //FIXME: Set nonblocking on Windows too |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
151 fcntl(res, F_SETFL, O_NONBLOCK); |
1546
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
152 #endif |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
153 mw->sock_fds[channel] = res; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
154 mw->channel_state[channel] = SOCKST_TCP_EST; |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
155 mw->channel_flags |= 1 << (channel + 1); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
156 } else if (errno != EAGAIN && errno != EWOULDBLOCK) { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
157 close(mw->sock_fds[channel]); |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
158 mw->channel_state[channel] = SOCKST_NONE; |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
159 mw->channel_flags |= 1 << (channel + 1); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
160 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
161 } else if (mw->channel_state[channel] == SOCKST_TCP_EST && mw->receive_bytes < sizeof(mw->receive_buffer) - 4) { |
1518
713b504dc577
Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents:
1516
diff
changeset
|
162 size_t max = sizeof(mw->receive_buffer) - 4 - mw->receive_bytes; |
713b504dc577
Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents:
1516
diff
changeset
|
163 if (max > MAX_RECV_SIZE) { |
713b504dc577
Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents:
1516
diff
changeset
|
164 max = MAX_RECV_SIZE; |
713b504dc577
Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents:
1516
diff
changeset
|
165 } |
713b504dc577
Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents:
1516
diff
changeset
|
166 int bytes = recv(mw->sock_fds[channel], mw->receive_buffer + mw->receive_bytes + 3, max, 0); |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
167 if (bytes > 0) { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
168 mw_putc(mw, STX); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
169 mw_putc(mw, bytes >> 8 | (channel+1) << 4); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
170 mw_putc(mw, bytes); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
171 mw->receive_bytes += bytes; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
172 mw_putc(mw, ETX); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
173 //should this set the channel flag? |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
174 } else if (bytes < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
175 close(mw->sock_fds[channel]); |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
176 mw->channel_state[channel] = SOCKST_NONE; |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
177 mw->channel_flags |= 1 << (channel + 1); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
178 } |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
179 } |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
180 } |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
181 |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
182 static void poll_all_sockets(megawifi *mw) |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
183 { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
184 for (int i = 0; i < 15; i++) |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
185 { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
186 poll_socket(mw, i); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
187 } |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
188 } |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
189 |
1961
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
190 |
1515
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
191 static void start_reply(megawifi *mw, uint8_t cmd) |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
192 { |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
193 mw_putc(mw, STX); |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
194 //reserve space for length |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
195 mw->receive_bytes += 2; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
196 //cmd |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
197 mw_putc(mw, 0); |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
198 mw_putc(mw, cmd); |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
199 //reserve space for length |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
200 mw->receive_bytes += 2; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
201 } |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
202 |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
203 static void end_reply(megawifi *mw) |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
204 { |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
205 uint32_t len = mw->receive_bytes - 3; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
206 //LSD packet length |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
207 mw->receive_buffer[1] = len >> 8; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
208 mw->receive_buffer[2] = len; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
209 //command length |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
210 len -= 4; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
211 mw->receive_buffer[5] = len >> 8; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
212 mw->receive_buffer[6] = len; |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
213 mw_putc(mw, ETX); |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
214 } |
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
215 |
1960
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
216 static void cmd_ap_cfg_get(megawifi *mw) |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
217 { |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
218 char ssid[32] = {0}; |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
219 char pass[64] = {0}; |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
220 uint8_t slot = mw->transmit_buffer[4]; |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
221 |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
222 sprintf(ssid, "BLASTEM! SSID %d", slot + 1); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
223 sprintf(pass, "BLASTEM! PASS %d", slot + 1); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
224 start_reply(mw, CMD_OK); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
225 mw_putc(mw, slot); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
226 mw_putc(mw, 7); /// 11bgn |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
227 mw_putraw(mw, ssid, 32); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
228 mw_putraw(mw, pass, 64); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
229 end_reply(mw); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
230 } |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
231 |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
232 static void cmd_ip_cfg_get(megawifi *mw) |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
233 { |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
234 uint32_t ipv4s[5] = {0}; |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
235 |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
236 start_reply(mw, CMD_OK); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
237 mw_putc(mw, mw->transmit_buffer[4]); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
238 mw_putc(mw, 0); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
239 mw_putc(mw, 0); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
240 mw_putc(mw, 0); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
241 mw_putraw(mw, (char*)ipv4s, sizeof(ipv4s)); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
242 end_reply(mw); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
243 } |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
244 |
1961
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
245 static void cmd_tcp_con(megawifi *mw, uint32_t size) |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
246 { |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
247 struct addrinfo hints; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
248 struct addrinfo *res = NULL; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
249 char dst_port[6]; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
250 char src_port[6]; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
251 char host[MAX_RECV_SIZE - 13]; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
252 int s; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
253 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
254 int err; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
255 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
256 uint8_t channel = mw->transmit_buffer[16]; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
257 if (!channel || channel > 15 || mw->sock_fds[channel - 1] >= 0) { |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
258 start_reply(mw, CMD_ERROR); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
259 end_reply(mw); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
260 return; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
261 } |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
262 channel--; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
263 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
264 strncpy(dst_port, (char*)&mw->transmit_buffer[4], 5); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
265 dst_port[5] = '\0'; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
266 // TODO src_port is unused |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
267 strncpy(src_port, (char*)&mw->transmit_buffer[10], 5); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
268 src_port[5] = '\0'; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
269 strncpy(host, (char*)&mw->transmit_buffer[17], MAX_RECV_SIZE - 14); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
270 host[MAX_RECV_SIZE - 14] = '\0'; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
271 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
272 memset(&hints, 0, sizeof(hints)); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
273 hints.ai_family = AF_INET; |
1966
b3c2dcae7dfc
Skip setting AI_NUMERICSERV in megawifi code on Windows for now so min SDK version does not need to be bumped
Michael Pavone <pavone@retrodev.com>
parents:
1962
diff
changeset
|
274 #ifndef _WIN32 |
1961
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
275 hints.ai_flags = AI_NUMERICSERV; |
1966
b3c2dcae7dfc
Skip setting AI_NUMERICSERV in megawifi code on Windows for now so min SDK version does not need to be bumped
Michael Pavone <pavone@retrodev.com>
parents:
1962
diff
changeset
|
276 #endif |
1961
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
277 hints.ai_socktype = SOCK_STREAM; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
278 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
279 if ((err = getaddrinfo(host, dst_port, &hints, &res)) != 0) { |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
280 printf("getaddrinfo failed: %s\n", gai_strerror(err)); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
281 start_reply(mw, CMD_ERROR); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
282 end_reply(mw); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
283 return; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
284 } |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
285 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
286 s = socket(AF_INET, SOCK_STREAM, 0); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
287 if (s < 0) { |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
288 goto err; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
289 } |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
290 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
291 // Should this be handled in a separate thread to avoid blocking emulation? |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
292 if (connect(s, res->ai_addr, res->ai_addrlen) != 0) { |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
293 goto err; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
294 } |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
295 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
296 #ifndef _WIN32 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
297 //FIXME: Set nonblocking on Windows too |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
298 fcntl(s, F_SETFL, O_NONBLOCK); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
299 #endif |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
300 mw->sock_fds[channel] = s; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
301 mw->channel_state[channel] = SOCKST_TCP_EST; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
302 mw->channel_flags |= 1 << (channel + 1); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
303 printf("Connection established on ch %d with %s:%s\n", channel + 1, host, dst_port); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
304 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
305 if (res) { |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
306 freeaddrinfo(res); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
307 } |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
308 start_reply(mw, CMD_OK); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
309 end_reply(mw); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
310 return; |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
311 |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
312 err: |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
313 freeaddrinfo(res); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
314 printf("Connection to %s:%s failed, %s\n", host, dst_port, strerror(errno)); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
315 start_reply(mw, CMD_ERROR); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
316 end_reply(mw); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
317 } |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
318 |
1962
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
319 #define AVATAR_BYTES (32 * 48 / 2) |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
320 static void cmd_gamertag_get(megawifi *mw) |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
321 { |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
322 uint32_t id = htonl(1); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
323 char buf[AVATAR_BYTES]; |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
324 |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
325 start_reply(mw, CMD_OK); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
326 // TODO Get items from config file |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
327 mw_putraw(mw, (const char*)&id, 4); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
328 strncpy(buf, "doragasu on Blastem!", 32); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
329 mw_putraw(mw, buf, 32); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
330 strncpy(buf, "My cool password", 32); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
331 mw_putraw(mw, buf, 32); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
332 strncpy(buf, "All your WiFi are belong to me!", 32); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
333 mw_putraw(mw, buf, 32); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
334 memset(buf, 0, 64); // Telegram token |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
335 mw_putraw(mw, buf, 64); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
336 mw_putraw(mw, buf, AVATAR_BYTES); // Avatar tiles |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
337 mw_putraw(mw, buf, 32); // Avatar palette |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
338 end_reply(mw); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
339 } |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
340 |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
341 static void cmd_hrng_get(megawifi *mw) |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
342 { |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
343 uint16_t len = (mw->transmit_buffer[4]<<8) + mw->transmit_buffer[5]; |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
344 if (len > (MAX_RECV_SIZE - 4)) { |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
345 start_reply(mw, CMD_ERROR); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
346 end_reply(mw); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
347 return; |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
348 } |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
349 // Pseudo-random, but who cares |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
350 start_reply(mw, CMD_OK); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
351 srand(time(NULL)); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
352 for (uint16_t i = 0; i < len; i++) { |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
353 mw_putc(mw, rand()); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
354 } |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
355 end_reply(mw); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
356 } |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
357 |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
358 static void process_command(megawifi *mw) |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
359 { |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
360 uint32_t command = mw->transmit_buffer[0] << 8 | mw->transmit_buffer[1]; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
361 uint32_t size = mw->transmit_buffer[2] << 8 | mw->transmit_buffer[3]; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
362 if (size > mw->transmit_bytes - 4) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
363 size = mw->transmit_bytes - 4; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
364 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
365 int orig_receive_bytes = mw->receive_bytes; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
366 switch (command) |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
367 { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
368 case CMD_VERSION: |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
369 start_reply(mw, CMD_OK); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
370 mw_putc(mw, 1); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
371 mw_putc(mw, 3); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
372 mw_putc(mw, 0); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
373 mw_puts(mw, "blastem"); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
374 end_reply(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
375 break; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
376 case CMD_ECHO: |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
377 mw->receive_bytes = mw->transmit_bytes; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
378 memcpy(mw->receive_buffer, mw->transmit_buffer, mw->transmit_bytes); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
379 break; |
1960
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
380 case CMD_AP_CFG_GET: |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
381 cmd_ap_cfg_get(mw); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
382 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
383 case CMD_IP_CURRENT: { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
384 iface_info i; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
385 if (get_host_address(&i)) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
386 start_reply(mw, CMD_OK); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
387 //config number and reserved bytes |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
388 mw_set(mw, 0, 4); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
389 //ip |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
390 mw_copy(mw, i.ip, sizeof(i.ip)); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
391 //net mask |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
392 mw_copy(mw, i.net_mask, sizeof(i.net_mask)); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
393 //gateway guess |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
394 mw_putc(mw, i.ip[0] & i.net_mask[0]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
395 mw_putc(mw, i.ip[1] & i.net_mask[1]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
396 mw_putc(mw, i.ip[2] & i.net_mask[2]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
397 mw_putc(mw, (i.ip[3] & i.net_mask[3]) + 1); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
398 //dns |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
399 static const uint8_t localhost[] = {127,0,0,1}; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
400 mw_copy(mw, localhost, sizeof(localhost)); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
401 mw_copy(mw, localhost, sizeof(localhost)); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
402 |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
403 } else { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
404 start_reply(mw, CMD_ERROR); |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
405 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
406 end_reply(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
407 break; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
408 } |
1960
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
409 case CMD_IP_CFG_GET: |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
410 cmd_ip_cfg_get(mw); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
411 break; |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
412 case CMD_DEF_AP_CFG_GET: |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
413 start_reply(mw, CMD_OK); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
414 mw_putc(mw, 0); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
415 end_reply(mw); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
416 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
417 case CMD_AP_JOIN: |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
418 mw->module_state = STATE_READY; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
419 start_reply(mw, CMD_OK); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
420 end_reply(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
421 break; |
1961
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
422 case CMD_TCP_CON: |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
423 cmd_tcp_con(mw, size); |
d14630883b1d
Implement CMD_TCP_CON command
doragasu <doragasu@hotmail.com>
parents:
1960
diff
changeset
|
424 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
425 case CMD_TCP_BIND:{ |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
426 if (size < 7){ |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
427 start_reply(mw, CMD_ERROR); |
1515
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
428 end_reply(mw); |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
429 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
430 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
431 uint8_t channel = mw->transmit_buffer[10]; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
432 if (!channel || channel > 15) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
433 start_reply(mw, CMD_ERROR); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
434 end_reply(mw); |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
435 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
436 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
437 channel--; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
438 if (mw->sock_fds[channel] >= 0) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
439 close(mw->sock_fds[channel]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
440 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
441 mw->sock_fds[channel] = socket(AF_INET, SOCK_STREAM, 0); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
442 if (mw->sock_fds[channel] < 0) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
443 start_reply(mw, CMD_ERROR); |
1515
3fc129eb0653
Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents:
1514
diff
changeset
|
444 end_reply(mw); |
1514
4f94e0f90c83
Added support for MegaWiFi command IP_CURRENT
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
445 break; |
4f94e0f90c83
Added support for MegaWiFi command IP_CURRENT
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
446 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
447 int value = 1; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
448 setsockopt(mw->sock_fds[channel], SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value)); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
449 struct sockaddr_in bind_addr; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
450 memset(&bind_addr, 0, sizeof(bind_addr)); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
451 bind_addr.sin_family = AF_INET; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
452 bind_addr.sin_port = htons(mw->transmit_buffer[8] << 8 | mw->transmit_buffer[9]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
453 if (bind(mw->sock_fds[channel], (struct sockaddr *)&bind_addr, sizeof(bind_addr)) != 0) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
454 close(mw->sock_fds[channel]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
455 mw->sock_fds[channel] = -1; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
456 start_reply(mw, CMD_ERROR); |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
457 end_reply(mw); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
458 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
459 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
460 int res = listen(mw->sock_fds[channel], 2); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
461 start_reply(mw, res ? CMD_ERROR : CMD_OK); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
462 if (res) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
463 close(mw->sock_fds[channel]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
464 mw->sock_fds[channel] = -1; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
465 } else { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
466 mw->channel_flags |= 1 << (channel + 1); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
467 mw->channel_state[channel] = SOCKST_TCP_LISTEN; |
1546
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
468 #ifndef _WIN32 |
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
469 //FIXME: Set nonblocking on Windows too |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
470 fcntl(mw->sock_fds[channel], F_SETFL, O_NONBLOCK); |
1546
1a09422b87a5
Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents:
1535
diff
changeset
|
471 #endif |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
472 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
473 end_reply(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
474 break; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
475 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
476 case CMD_SOCK_STAT: { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
477 uint8_t channel = mw->transmit_buffer[4]; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
478 if (!channel || channel > 15) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
479 start_reply(mw, CMD_ERROR); |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
480 end_reply(mw); |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
481 break; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
482 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
483 mw->channel_flags &= ~(1 << channel); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
484 channel--; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
485 poll_socket(mw, channel); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
486 start_reply(mw, CMD_OK); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
487 mw_putc(mw, mw->channel_state[channel]); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
488 end_reply(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
489 break; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
490 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
491 case CMD_SYS_STAT: |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
492 poll_all_sockets(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
493 start_reply(mw, CMD_OK); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
494 mw_putc(mw, mw->module_state); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
495 mw_putc(mw, mw->flags); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
496 mw_putc(mw, mw->channel_flags >> 8); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
497 mw_putc(mw, mw->channel_flags); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
498 end_reply(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
499 break; |
1962
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
500 case CMD_GAMERTAG_GET: |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
501 cmd_gamertag_get(mw); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
502 break; |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
503 case CMD_LOG: |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
504 start_reply(mw, CMD_OK); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
505 puts((char*)&mw->transmit_buffer[4]); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
506 end_reply(mw); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
507 break; |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
508 case CMD_HRNG_GET: |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
509 cmd_hrng_get(mw); |
16d46ff1f620
Implement CMD_HRNG_GET, CMD_GAMERTAG_GET and CMD_LOG.
doragasu <doragasu@hotmail.com>
parents:
1961
diff
changeset
|
510 break; |
1960
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
511 case CMD_SERVER_URL_GET: |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
512 start_reply(mw, CMD_OK); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
513 // FIXME: This should be get from config file |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
514 mw_puts(mw, "192.168.1.32"); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
515 end_reply(mw); |
f79e16d8baa4
megawifi: stub common commands to get config.
doragasu <doragasu@hotmail.com>
parents:
1959
diff
changeset
|
516 break; |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
517 default: |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
518 printf("Unhandled MegaWiFi command %s(%d) with length %X\n", cmd_names[command], command, size); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
519 break; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
520 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
521 } |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
522 |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
523 static void process_packet(megawifi *mw) |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
524 { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
525 if (mw->transmit_channel == 0) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
526 process_command(mw); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
527 } else { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
528 uint8_t channel = mw->transmit_channel - 1; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
529 int channel_state = mw->channel_state[channel]; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
530 int sock_fd = mw->sock_fds[channel]; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
531 // TODO Handle UDP type sockets |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
532 if (sock_fd >= 0 && channel_state == SOCKST_TCP_EST) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
533 int sent = send(sock_fd, mw->transmit_buffer, mw->transmit_bytes, MSG_NOSIGNAL); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
534 if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
535 close(sock_fd); |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
536 mw->sock_fds[channel] = -1; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
537 mw->channel_state[channel] = SOCKST_NONE; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
538 mw->channel_flags |= 1 << mw->transmit_channel; |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
539 } else if (sent < mw->transmit_bytes) { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
540 //TODO: save this data somewhere so it can be sent in poll_socket |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
541 printf("Sent %d bytes on channel %d, but %d were requested\n", sent, mw->transmit_channel, mw->transmit_bytes); |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
542 } |
1959
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
543 } else { |
6d99bdbf1e3e
megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents:
1546
diff
changeset
|
544 printf("Unhandled receive of MegaWiFi data on channel %d\n", mw->transmit_channel); |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
545 } |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
546 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
547 mw->transmit_bytes = mw->expected_bytes = 0; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
548 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
549 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
550 void *megawifi_write_b(uint32_t address, void *context, uint8_t value) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
551 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
552 if (!(address & 1)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
553 return context; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
554 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
555 megawifi *mw = get_megawifi(context); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
556 address = address >> 1 & 7; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
557 switch (address) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
558 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
559 case 0: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
560 switch (mw->transmit_state) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
561 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
562 case TX_IDLE: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
563 if (value == STX) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
564 mw->transmit_state = TX_LEN1; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
565 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
566 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
567 case TX_LEN1: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
568 mw->transmit_channel = value >> 4; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
569 mw->expected_bytes = value << 8 & 0xF00; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
570 mw->transmit_state = TX_LEN2; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
571 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
572 case TX_LEN2: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
573 mw->expected_bytes |= value; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
574 mw->transmit_state = TX_PAYLOAD; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
575 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
576 case TX_PAYLOAD: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
577 mw->transmit_buffer[mw->transmit_bytes++] = value; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
578 if (mw->transmit_bytes == mw->expected_bytes) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
579 mw->transmit_state = TX_WAIT_ETX; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
580 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
581 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
582 case TX_WAIT_ETX: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
583 if (value == ETX) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
584 mw->transmit_state = TX_IDLE; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
585 process_packet(mw); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
586 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
587 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
588 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
589 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
590 case 7: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
591 mw->scratchpad = value; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
592 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
593 default: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
594 printf("Unhandled write to MegaWiFi UART register %X: %X\n", address, value); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
595 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
596 return context; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
597 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
598 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
599 void *megawifi_write_w(uint32_t address, void *context, uint16_t value) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
600 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
601 return megawifi_write_b(address | 1, context, value); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
602 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
603 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
604 uint8_t megawifi_read_b(uint32_t address, void *context) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
605 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
606 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
607 if (!(address & 1)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
608 return 0xFF; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
609 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
610 megawifi *mw = get_megawifi(context); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
611 address = address >> 1 & 7; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
612 switch (address) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
613 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
614 case 0: |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
615 poll_all_sockets(mw); |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
616 if (mw->receive_read < mw->receive_bytes) { |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
617 uint8_t ret = mw->receive_buffer[mw->receive_read++]; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
618 if (mw->receive_read == mw->receive_bytes) { |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
619 mw->receive_read = mw->receive_bytes = 0; |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
620 } |
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
621 return ret; |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
622 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
623 return 0xFF; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
624 case 5: |
1516
aaab852803ac
Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents:
1515
diff
changeset
|
625 poll_all_sockets(mw); |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
626 //line status |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
627 return 0x60 | (mw->receive_read < mw->receive_bytes); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
628 case 7: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
629 return mw->scratchpad; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
630 default: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
631 printf("Unhandled read from MegaWiFi UART register %X\n", address); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
632 return 0xFF; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
633 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
634 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
635 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
636 uint16_t megawifi_read_w(uint32_t address, void *context) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
637 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
638 return 0xFF00 | megawifi_read_b(address | 1, context); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
639 } |