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