annotate megawifi.c @ 1968:c16dabdb0aad

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