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