Skip to content

Commit 4b64a7b

Browse files
committed
socket emulation
1 parent 2c42382 commit 4b64a7b

6 files changed

Lines changed: 131 additions & 54 deletions

File tree

RPi-Pico/config/lwipopts.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@
2828
#define LWIP_PROVIDE_ERRNO
2929
#define LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX 1
3030

31+
/* wolfTCP config */
32+
#define WOLF_SOCKET 1
33+
3134
#endif

RPi-Pico/config/user_settings.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ extern time_t myTime(time_t *);
7272
// #define WOLFSSL_SP_384 /* Enable ECC 384-bit SECP384R1 support */
7373

7474
// #define WOLFSSL_SP_CACHE_RESISTANT
75-
// #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */
75+
#define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */
7676
#define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */
7777

7878
// #define WOLFSSL_SP_NO_MALLOC
@@ -254,8 +254,9 @@ extern time_t myTime(time_t *);
254254
#if 1
255255
#define HAVE_CURVE448
256256
#define HAVE_ED448 /* ED448 Requires SHA512 */
257+
#define WOLFSSL_SHAKE256
257258

258-
/* Optionally use small math (less flash usage, but much slower) */
259+
/* Optionally use small math (less flash usage, but much slower) */
259260
#if 0
260261
#define CURVED448_SMALL
261262
#endif

RPi-Pico/include/wolf/tcp.h

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,38 @@
2828
#include "wolf/blink.h"
2929
#include "wolf/common.h"
3030

31+
/* This is just for, inet_pton, sockaddr_in */
32+
#undef LWIP_SOCKET
33+
#define LWIP_SOCKET 1
34+
#define LWIP_IPV4 1
35+
36+
#include "lwip/sockets.h"
37+
#include "lwip/inet.h"
38+
39+
#if WOLF_SOCKET
40+
41+
#undef SOCKET_T
42+
#undef socket
43+
#undef close
44+
#undef inet_pton
45+
#undef connect
46+
#undef recv
47+
#undef send
48+
#define SOCKET_T WOLF_SOCKET_T
49+
#define socket wolf_TCPsocket
50+
#define close wolf_TCPclose
51+
#define inet_pton wolf_inet_pton
52+
#define connect wolf_TCPconnect
53+
#define recv wolf_TCPread
54+
#define send wolf_TCPwrite
55+
56+
#endif
57+
3158
#define DEBUG_printf printf
3259
#define BUF_SIZE (4096*2)
3360

61+
typedef u32_t socklen_t;
62+
3463
typedef struct {
3564
struct tcp_pcb *tcp_pcb;
3665
ip_addr_t remote_addr;
@@ -40,10 +69,13 @@ typedef struct {
4069
bool complete;
4170
int run_count;
4271
bool connected;
43-
} WOLF_SOCKET_T;
72+
} *WOLF_SOCKET_T;
73+
74+
4475

45-
WOLF_SOCKET_T *wolf_TCPsocket(void);
46-
static err_t wolf_TCPfree(WOLF_SOCKET_T *);
47-
bool wolf_TCPconnect(WOLF_SOCKET_T *, const char*, uint32_t);
48-
int wolf_TCPread (WOLF_SOCKET_T *, unsigned char *, long unsigned int);
49-
int wolf_TCPwrite(WOLF_SOCKET_T *, const unsigned char *, long unsigned int);
76+
WOLF_SOCKET_T wolf_TCPsocket(void);
77+
int wolf_inet_pton(int af, const char *ip_str, void *ip_dst);
78+
int wolf_TCPclose(WOLF_SOCKET_T sock);
79+
int wolf_TCPconnect(WOLF_SOCKET_T, const struct sockaddr *addr, socklen_t addrlen);
80+
int wolf_TCPread (WOLF_SOCKET_T, unsigned char *, unsigned long);
81+
int wolf_TCPwrite(WOLF_SOCKET_T, const unsigned char *, unsigned long);

RPi-Pico/src/tcp.c

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static void dump_bytes(const uint8_t *p, uint32_t len)
4343
}
4444

4545

46-
err_t wolf_TCPclose(WOLF_SOCKET_T *sock)
46+
int wolf_TCPclose(WOLF_SOCKET_T sock)
4747
{
4848
err_t err = ERR_OK;
4949
if (sock->tcp_pcb != NULL)
@@ -65,7 +65,7 @@ err_t wolf_TCPclose(WOLF_SOCKET_T *sock)
6565
return err;
6666
}
6767

68-
static err_t tcp_result(WOLF_SOCKET_T *sock, int status)
68+
static err_t tcp_result(WOLF_SOCKET_T sock, int status)
6969
{
7070
if (status == 0) {
7171
DEBUG_printf("test success\n");
@@ -78,7 +78,7 @@ static err_t tcp_result(WOLF_SOCKET_T *sock, int status)
7878

7979
static err_t lwip_cb_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
8080
{
81-
WOLF_SOCKET_T *sock = (WOLF_SOCKET_T *)arg;
81+
WOLF_SOCKET_T sock = (WOLF_SOCKET_T)arg;
8282

8383
sock->sent_len += len;
8484

@@ -102,7 +102,8 @@ static err_t lwip_cb_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
102102

103103
static err_t lwip_cb_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
104104
{
105-
WOLF_SOCKET_T *sock = (WOLF_SOCKET_T *)arg;
105+
WOLF_SOCKET_T sock = (WOLF_SOCKET_T)arg;
106+
106107
if (err != ERR_OK)
107108
{
108109
DEBUG_printf("connect failed %d\n", err);
@@ -127,14 +128,13 @@ static void lwip_cb_client_err(void *arg, err_t err)
127128

128129
static err_t lwip_cb_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
129130
{
130-
WOLF_SOCKET_T *sock = (WOLF_SOCKET_T *)arg;
131+
WOLF_SOCKET_T sock = (WOLF_SOCKET_T)arg;
131132
if (!p) {
132133
return ERR_OK;
133134
}
134135

135136
cyw43_arch_lwip_check();
136-
if (p->tot_len > 0)
137-
{
137+
if (p->tot_len > 0) {
138138
const uint16_t buffer_left = BUF_SIZE - sock->buffer_len;
139139
sock->buffer_len += pbuf_copy_partial(p, sock->buffer + sock->buffer_len,
140140
p->tot_len > buffer_left ? buffer_left : p->tot_len, 0);
@@ -144,10 +144,26 @@ static err_t lwip_cb_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p
144144
return ERR_OK;
145145
}
146146

147-
bool wolf_TCPconnect(WOLF_SOCKET_T *sock, const char *ip, uint32_t port)
147+
int wolf_inet_pton(int af, const char *ip_str, void *ip_dst)
148+
{
149+
(void)af;
150+
struct sockaddr_in *addr = (struct sockaddr_in *)ip_dst;
151+
152+
return ip4addr_aton(ip_str, ip_dst);
153+
}
154+
155+
static u32_t swapBytes(u16_t a)
156+
{
157+
u8_t *p = (u8_t *)&a;
158+
return p[0] << 8 | p[1];
159+
}
160+
161+
int wolf_TCPconnect(WOLF_SOCKET_T sock, const struct sockaddr *addr, socklen_t addrlen)
148162
{
149-
ip4addr_aton(ip, &sock->remote_addr);
150-
sock->tcp_pcb = tcp_new_ip_type(IP_GET_TYPE(&sock->remote_addr));
163+
int err;
164+
struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
165+
166+
sock->tcp_pcb = tcp_new_ip_type(IP_GET_TYPE(&addr_in->sin_addr));
151167
if (!sock->tcp_pcb) {
152168
DEBUG_printf("failed to create pcb\n");
153169
return false;
@@ -162,32 +178,35 @@ bool wolf_TCPconnect(WOLF_SOCKET_T *sock, const char *ip, uint32_t port)
162178
sock->buffer_len = 0;
163179

164180
cyw43_arch_lwip_begin();
165-
err_t err = tcp_connect(sock->tcp_pcb, &sock->remote_addr, port, lwip_cb_client_connected);
181+
err = tcp_connect(sock->tcp_pcb, (const ip_addr_t *)&addr_in->sin_addr,
182+
swapBytes(addr_in->sin_port), lwip_cb_client_connected);
166183
cyw43_arch_lwip_end();
167184
if (err != ERR_OK) {
168185
DEBUG_printf("wolf_TCPconnect: Failed");
169186
return WOLF_FAIL;
170187
}
171-
while (sock->connected != true) {
188+
sock->connected = false;
189+
190+
while (sock->connected != true)
191+
{
172192
cyw43_arch_poll();
173193
cyw43_arch_wait_for_work_until(make_timeout_time_ms(1000));
174194
}
175195
return WOLF_SUCCESS;
176196
}
177197

178198
// get a new TCP client
179-
WOLF_SOCKET_T *wolf_TCPsocket()
199+
WOLF_SOCKET_T wolf_TCPsocket()
180200
{
181-
WOLF_SOCKET_T *sock = calloc(1, sizeof(WOLF_SOCKET_T));
201+
WOLF_SOCKET_T sock = calloc(1, sizeof(*sock));
182202
if (!sock) {
183203
DEBUG_printf("failed to allocate state\n");
184204
return NULL;
185205
}
186-
187206
return sock;
188207
}
189208

190-
int wolf_TCPwrite(WOLF_SOCKET_T *sock, const unsigned char *buff, long unsigned int len)
209+
int wolf_TCPwrite(WOLF_SOCKET_T sock, const unsigned char *buff, long unsigned int len)
191210
{
192211
int ret;
193212
int i;
@@ -198,23 +217,19 @@ int wolf_TCPwrite(WOLF_SOCKET_T *sock, const unsigned char *buff, long unsigned
198217
if (ret == ERR_OK) {
199218
tcp_output(sock->tcp_pcb);
200219
}
201-
while(sock->sent_len < len) {
202-
cyw43_arch_poll();
203-
cyw43_arch_wait_for_work_until(make_timeout_time_ms(1000));
204-
}
220+
sock->sent_len = 0;
205221
return (int)len;
206222
}
207223

208-
int wolf_TCPread(WOLF_SOCKET_T *sock, unsigned char *buff, long unsigned int len)
224+
int wolf_TCPread(WOLF_SOCKET_T sock, unsigned char *buff, long unsigned int len)
209225
{
210226
int recv_len;
211227
int remained;
212228
int i;
213-
#define POLLING 200
214229

215-
for(i=0; i<POLLING; i++) {
230+
while (1) { /* no timeout for now */
216231
if(sock->buffer_len > 0) {
217-
recv_len = len < sock->buffer_len ? len : sock->buffer_len;
232+
recv_len = len <= sock->buffer_len ? len : sock->buffer_len;
218233
memcpy(buff, sock->buffer, recv_len);
219234
if(recv_len >= len) {
220235
remained = sock->buffer_len - recv_len;
@@ -226,6 +241,6 @@ int wolf_TCPread(WOLF_SOCKET_T *sock, unsigned char *buff, long unsigned int len
226241
return recv_len;
227242
}
228243
cyw43_arch_poll();
229-
cyw43_arch_wait_for_work_until(make_timeout_time_ms(1000));
244+
cyw43_arch_wait_for_work_until(make_timeout_time_ms(10));
230245
}
231246
}

RPi-Pico/src/tcpClient_main.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,46 +27,58 @@
2727
#include "wolf/tcp.h"
2828
#include "wolf/wifi.h"
2929
#include "wolf/blink.h"
30-
#include "lwip/tcp.h"
3130

3231
#define TCP_PORT 1111
3332

3433
void tcpClient_test(void)
3534
{
3635
int i;
37-
int err;
36+
int ret;
3837
#define BUFF_SIZE 2048
3938
char buffer[BUFF_SIZE];
4039
#define SIZE_OF_CLIENT_HELLO 815
4140
char msg[SIZE_OF_CLIENT_HELLO] = "\026\003\003\003\052\001\000\003\046 Fake Client Hello";
4241

43-
WOLF_SOCKET_T *sock = wolf_TCPsocket();
42+
SOCKET_T sock;
43+
struct sockaddr_in servAddr;
44+
45+
sock = socket();
4446
if (!sock)
4547
{
4648
printf("ERROR:wolf_TCPsocke()\n");
4749
return;
4850
}
49-
if (wolf_TCPconnect(sock, TEST_TCP_SERVER_IP, TCP_PORT) != WOLF_SUCCESS) {
51+
52+
memset(&servAddr, 0, sizeof(servAddr));
53+
servAddr.sin_family = AF_INET; /* using IPv4 */
54+
servAddr.sin_port = htons(TCP_PORT); /* on DEFAULT_PORT */
55+
56+
if (inet_pton(AF_INET, TEST_TCP_SERVER_IP, &servAddr.sin_addr) != 1) {
57+
fprintf(stderr, "ERROR: invalid address\n");
58+
goto exit;
59+
}
60+
61+
if (connect(sock,(struct sockaddr*) &servAddr, sizeof(servAddr)) != WOLF_SUCCESS) {
5062
printf("ERROR:wolf_TCPconnect()\n");
5163
goto exit;
5264
}
5365

5466
printf("Writing to server: %s\n", msg);
55-
err = wolf_TCPwrite(sock, msg, sizeof(msg));
56-
if (err < 0) {
57-
DEBUG_printf("Failed to write data. err=%d\n", err);
67+
ret = send(sock, msg, sizeof(msg));
68+
if (ret < 0) {
69+
DEBUG_printf("Failed to write data. err=%d\n", ret);
5870
goto exit;
5971
}
6072

61-
err = wolf_TCPread(sock, buffer, BUFF_SIZE);
62-
if (err < 0) {
63-
DEBUG_printf("Failed to read data. err=%d\n", err);
73+
ret = recv(sock, buffer, BUFF_SIZE);
74+
if (ret < 0) {
75+
DEBUG_printf("Failed to read data. err=%d\n", ret);
6476
goto exit;
6577
}
6678
printf("Message: %s\n", buffer);
6779

6880
exit:
69-
free(sock);
81+
close(sock);
7082
}
7183

7284
void main(void)

RPi-Pico/src/tlsClient_main.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,18 @@ int wolf_cb_TCPwrite(WOLFSSL *ssl, const unsigned char *buff, long unsigned int
4545
{
4646
(void)ssl;
4747
unsigned long ret;
48-
WOLF_SOCKET_T *sock = (WOLF_SOCKET_T *)ctx;
49-
ret = wolf_TCPwrite(sock, buff, len);
50-
48+
SOCKET_T sock = (SOCKET_T)ctx;
49+
ret = send(sock, buff, len);
5150
return ret;
5251
}
5352

5453
int wolf_cb_TCPread(WOLFSSL *ssl, unsigned char *buff, long unsigned int len, void *ctx)
5554
{
5655
(void)ssl;
57-
WOLF_SOCKET_T *sock = (WOLF_SOCKET_T *)ctx;
56+
SOCKET_T sock = (SOCKET_T)ctx;
5857
int ret;
5958

60-
ret = wolf_TCPread(sock, buff, len);
59+
ret = recv(sock, buff, len);
6160
return ret;
6261
}
6362

@@ -69,7 +68,9 @@ void tlsClient_test(void)
6968
static char buffer[BUFF_SIZE];
7069
char msg[] = "Hello Server";
7170

72-
WOLF_SOCKET_T *sock = NULL;
71+
SOCKET_T sock;
72+
struct sockaddr_in servAddr;
73+
7374
WOLFSSL_CTX *ctx = NULL;
7475
WOLFSSL *ssl = NULL;
7576

@@ -91,16 +92,28 @@ void tlsClient_test(void)
9192
wolfSSL_SetIORecv(ctx, (CallbackIORecv)wolf_cb_TCPread);
9293
wolfSSL_SetIOSend(ctx, (CallbackIOSend)wolf_cb_TCPwrite);
9394

94-
if ((sock = wolf_TCPsocket()) == NULL) {
95+
sock = socket();
96+
if (!sock)
97+
{
9598
printf("ERROR:wolf_TCPsocke()\n");
9699
return;
97100
}
98101

99-
if ((ret = wolf_TCPconnect(sock, TEST_TCP_SERVER_IP, TCP_PORT) != WOLF_SUCCESS)) {
100-
printf("ERROR:wolf_TCPconnect\n");
102+
memset(&servAddr, 0, sizeof(servAddr));
103+
servAddr.sin_family = AF_INET; /* using IPv4 */
104+
servAddr.sin_port = htons(TCP_PORT); /* on DEFAULT_PORT */
105+
106+
if (inet_pton(AF_INET, TEST_TCP_SERVER_IP, &servAddr.sin_addr) != 1) {
107+
fprintf(stderr, "ERROR: invalid address\n");
101108
goto exit;
102109
}
103110

111+
if (connect(sock,(struct sockaddr*) &servAddr, sizeof(servAddr)) != WOLF_SUCCESS) {
112+
printf("ERROR:wolf_TCPconnect()\n");
113+
goto exit;
114+
}
115+
116+
104117
if ((ssl = wolfSSL_new(ctx)) == NULL) {
105118
fprintf(stderr, "ERROR: failed to create WOLFSSL object\n");
106119
ret = -1;
@@ -110,7 +123,8 @@ void tlsClient_test(void)
110123
wolfSSL_SetIOReadCtx(ssl, sock);
111124
wolfSSL_SetIOWriteCtx(ssl, sock);
112125

113-
if ((ret = wolfSSL_connect(ssl)) != WOLFSSL_SUCCESS) {
126+
printf("TLS Connecting\n");
127+
if ((ret = wolfSSL_connect(ssl)) != WOLFSSL_SUCCESS) {
114128
fprintf(stderr, "ERROR: failed to connect to wolfSSL(%d)\n",
115129
wolfSSL_get_error(ssl, ret));
116130
goto exit;

0 commit comments

Comments
 (0)