Skip to content

Commit ea1a366

Browse files
committed
Add socket buffer layer to increase read performance
1 parent e956da0 commit ea1a366

File tree

5 files changed

+247
-48
lines changed

5 files changed

+247
-48
lines changed

src/WiFiClient.cpp

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ extern "C" {
2525
#include "utility/debug.h"
2626
}
2727

28-
#include "WiFi.h"
29-
#include "WiFiClient.h"
30-
#include "WiFiServer.h"
28+
3129
#include "utility/server_drv.h"
3230
#include "utility/wifi_drv.h"
31+
#include "utility/WiFiSocketBuffer.h"
3332

33+
#include "WiFi.h"
34+
#include "WiFiClient.h"
3435

3536
uint16_t WiFiClient::_srcport = 1024;
3637

@@ -50,6 +51,11 @@ int WiFiClient::connect(const char* host, uint16_t port) {
5051
}
5152

5253
int WiFiClient::connect(IPAddress ip, uint16_t port) {
54+
if (_sock != NO_SOCKET_AVAIL)
55+
{
56+
stop();
57+
}
58+
5359
_sock = ServerDrv::getSocket();
5460
if (_sock != NO_SOCKET_AVAIL)
5561
{
@@ -74,6 +80,11 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) {
7480

7581
int WiFiClient::connectSSL(IPAddress ip, uint16_t port)
7682
{
83+
if (_sock != NO_SOCKET_AVAIL)
84+
{
85+
stop();
86+
}
87+
7788
_sock = ServerDrv::getSocket();
7889
if (_sock != NO_SOCKET_AVAIL)
7990
{
@@ -125,7 +136,7 @@ size_t WiFiClient::write(uint8_t b) {
125136
}
126137

127138
size_t WiFiClient::write(const uint8_t *buf, size_t size) {
128-
if (_sock >= WIFI_MAX_SOCK_NUM)
139+
if (_sock == NO_SOCKET_AVAIL)
129140
{
130141
setWriteError();
131142
return 0;
@@ -154,38 +165,32 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) {
154165
int WiFiClient::available() {
155166
if (_sock != 255)
156167
{
157-
return ServerDrv::availData(_sock);
168+
return WiFiSocketBuffer.available(_sock);
158169
}
159170

160171
return 0;
161172
}
162173

163174
int WiFiClient::read() {
164-
uint8_t b;
165175
if (!available())
176+
{
166177
return -1;
178+
}
179+
180+
uint8_t b;
181+
182+
WiFiSocketBuffer.read(_sock, &b, sizeof(b));
167183

168-
ServerDrv::getData(_sock, &b);
169184
return b;
170185
}
171186

172187

173188
int WiFiClient::read(uint8_t* buf, size_t size) {
174-
// sizeof(size_t) is architecture dependent
175-
// but we need a 16 bit data type here
176-
uint16_t _size = size;
177-
if (!ServerDrv::getDataBuf(_sock, buf, &_size))
178-
return -1;
179-
return _size;
189+
return WiFiSocketBuffer.read(_sock, buf, size);
180190
}
181191

182192
int WiFiClient::peek() {
183-
uint8_t b;
184-
if (!available())
185-
return -1;
186-
187-
ServerDrv::getData(_sock, &b, 1);
188-
return b;
193+
return WiFiSocketBuffer.peek(_sock);
189194
}
190195

191196
void WiFiClient::flush() {
@@ -204,20 +209,30 @@ void WiFiClient::stop() {
204209
while (status() != CLOSED && ++count < 50)
205210
delay(100);
206211

212+
WiFiSocketBuffer.close(_sock);
207213
_sock = 255;
208214
}
209215

210216
uint8_t WiFiClient::connected() {
211217

212218
if (_sock == 255) {
213219
return 0;
220+
} else if (available()) {
221+
return 1;
214222
} else {
215223
uint8_t s = status();
216224

217-
return !(s == LISTEN || s == CLOSED || s == FIN_WAIT_1 ||
218-
s == FIN_WAIT_2 || s == TIME_WAIT ||
219-
s == SYN_SENT || s== SYN_RCVD ||
220-
(s == CLOSE_WAIT));
225+
uint8_t result = !(s == LISTEN || s == CLOSED || s == FIN_WAIT_1 ||
226+
s == FIN_WAIT_2 || s == TIME_WAIT ||
227+
s == SYN_SENT || s== SYN_RCVD ||
228+
(s == CLOSE_WAIT));
229+
230+
if (result == 0) {
231+
WiFiSocketBuffer.close(_sock);
232+
_sock = 255;
233+
}
234+
235+
return result;
221236
}
222237
}
223238

src/WiFiUdp.cpp

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1919
*/
2020

21+
#include <string.h>
22+
2123
extern "C" {
2224
#include "utility/debug.h"
2325
#include "utility/wifi_spi.h"
2426
}
25-
#include <string.h>
27+
2628
#include "utility/server_drv.h"
2729
#include "utility/wifi_drv.h"
30+
#include "utility/WiFiSocketBuffer.h"
2831

2932
#include "WiFi.h"
3033
#include "WiFiUdp.h"
@@ -33,30 +36,40 @@ extern "C" {
3336

3437

3538
/* Constructor */
36-
WiFiUDP::WiFiUDP() : _sock(NO_SOCKET_AVAIL) {}
39+
WiFiUDP::WiFiUDP() : _sock(NO_SOCKET_AVAIL), _parsed(0) {}
3740

3841
/* Start WiFiUDP socket, listening at local port PORT */
3942
uint8_t WiFiUDP::begin(uint16_t port) {
43+
if (_sock != NO_SOCKET_AVAIL)
44+
{
45+
stop();
46+
}
4047

4148
uint8_t sock = ServerDrv::getSocket();
4249
if (sock != NO_SOCKET_AVAIL)
4350
{
4451
ServerDrv::startServer(port, sock, UDP_MODE);
4552
_sock = sock;
4653
_port = port;
54+
_parsed = 0;
4755
return 1;
4856
}
4957
return 0;
5058
}
5159

5260
uint8_t WiFiUDP::beginMulticast(IPAddress ip, uint16_t port) {
61+
if (_sock != NO_SOCKET_AVAIL)
62+
{
63+
stop();
64+
}
5365

5466
uint8_t sock = ServerDrv::getSocket();
5567
if (sock != NO_SOCKET_AVAIL)
5668
{
5769
ServerDrv::startServer(ip, port, sock, UDP_MULTICAST_MODE);
5870
_sock = sock;
5971
_port = port;
72+
_parsed = 0;
6073
return 1;
6174
}
6275
return 0;
@@ -65,11 +78,7 @@ uint8_t WiFiUDP::beginMulticast(IPAddress ip, uint16_t port) {
6578
/* return number of bytes available in the current packet,
6679
will return zero if parsePacket hasn't been called yet */
6780
int WiFiUDP::available() {
68-
if (_sock != NO_SOCKET_AVAIL)
69-
{
70-
return ServerDrv::availData(_sock);
71-
}
72-
return 0;
81+
return _parsed;
7382
}
7483

7584
/* Release any resources being used by this WiFiUDP instance */
@@ -80,6 +89,7 @@ void WiFiUDP::stop()
8089

8190
ServerDrv::stopClient(_sock);
8291

92+
WiFiSocketBuffer.close(_sock);
8393
_sock = NO_SOCKET_AVAIL;
8494
}
8595

@@ -125,42 +135,59 @@ size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
125135

126136
int WiFiUDP::parsePacket()
127137
{
128-
return available();
138+
while (_parsed--)
139+
{
140+
// discard previously parsed packet data
141+
uint8_t b;
142+
143+
WiFiSocketBuffer.read(_sock, &b, sizeof(b));
144+
}
145+
146+
_parsed = ServerDrv::availData(_sock);
147+
148+
return _parsed;
129149
}
130150

131151
int WiFiUDP::read()
132152
{
133-
uint8_t b;
134-
if (available())
153+
if (_parsed < 1)
135154
{
136-
ServerDrv::getData(_sock, &b);
137-
return b;
138-
}else{
139-
return -1;
155+
return -1;
140156
}
157+
158+
uint8_t b;
159+
160+
WiFiSocketBuffer.read(_sock, &b, sizeof(b));
161+
_parsed--;
162+
163+
return b;
141164
}
142165

143166
int WiFiUDP::read(unsigned char* buffer, size_t len)
144167
{
145-
if (available())
168+
if (_parsed < 1)
146169
{
147-
uint16_t size = len;
148-
if (!ServerDrv::getDataBuf(_sock, buffer, &size))
149-
return -1;
150-
return size;
151-
}else{
152-
return -1;
170+
return 0;
153171
}
172+
173+
int result = WiFiSocketBuffer.read(_sock, buffer, len);
174+
175+
if (result > 0)
176+
{
177+
_parsed -= result;
178+
}
179+
180+
return result;
154181
}
155182

156183
int WiFiUDP::peek()
157184
{
158-
uint8_t b;
159-
if (!available())
185+
if (_parsed < 1)
186+
{
160187
return -1;
188+
}
161189

162-
ServerDrv::getData(_sock, &b, 1);
163-
return b;
190+
return WiFiSocketBuffer.peek(_sock);
164191
}
165192

166193
void WiFiUDP::flush()

src/WiFiUdp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class WiFiUDP : public UDP {
2929
private:
3030
uint8_t _sock; // socket ID for Wiz5100
3131
uint16_t _port; // local port to listen on
32+
int _parsed;
3233

3334
public:
3435
WiFiUDP(); // Constructor

0 commit comments

Comments
 (0)