Skip to content

Commit 0bbdf05

Browse files
committed
Implement recvfrom_into and sendto for UDP
1 parent 21ca1b8 commit 0bbdf05

File tree

4 files changed

+45
-40
lines changed

4 files changed

+45
-40
lines changed

ports/esp32s2/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ SRC_C += \
188188
lib/utils/pyexec.c \
189189
lib/utils/stdout_helpers.c \
190190
lib/utils/sys_stdio_mphal.c \
191+
lib/netutils/netutils.c \
191192
peripherals/pcnt.c \
192193
peripherals/pins.c \
193194
peripherals/rmt.c \

ports/esp32s2/common-hal/socketpool/Socket.c

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
#include "py/runtime.h"
3333
#include "supervisor/shared/tick.h"
3434

35+
#include "components/lwip/lwip/src/include/lwip/err.h"
36+
#include "components/lwip/lwip/src/include/lwip/sockets.h"
37+
#include "components/lwip/lwip/src/include/lwip/sys.h"
38+
#include "components/lwip/lwip/src/include/lwip/netdb.h"
39+
3540
void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t* self, mp_uint_t timeout_ms) {
3641
self->timeout_ms = timeout_ms;
3742
}
@@ -122,58 +127,55 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self,
122127
mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t* self,
123128
const char* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len) {
124129

125-
struct sockaddr_in dest_addr;
126-
dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
127-
dest_addr.sin_family = AF_INET;
128-
dest_addr.sin_port = htons(port);
129-
130-
130+
// Get the IP address string
131131
const struct addrinfo hints = {
132132
.ai_family = AF_INET,
133133
.ai_socktype = SOCK_STREAM,
134134
};
135-
struct addrinfo *res;
136-
int err = getaddrinfo(host, NULL, &hints, &res);
137-
if (err != 0 || res == NULL) {
138-
return mp_const_none;
135+
struct addrinfo *result;
136+
int error = lwip_getaddrinfo(host, NULL, &hints, &result);
137+
if (error != 0 || result == NULL) {
138+
return 0;
139139
}
140-
141140
#pragma GCC diagnostic push
142141
#pragma GCC diagnostic ignored "-Wcast-align"
143-
struct in_addr *addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
142+
struct in_addr *addr = &((struct sockaddr_in *)result->ai_addr)->sin_addr;
144143
#pragma GCC diagnostic pop
145144
char ip_str[IP4ADDR_STRLEN_MAX];
146145
inet_ntoa_r(*addr, ip_str, IP4ADDR_STRLEN_MAX);
147-
mp_obj_t ip_obj = mp_obj_new_str(ip_str, strlen(ip_str));
148-
freeaddrinfo(res);
149-
146+
freeaddrinfo(result);
150147

148+
// Set parameters
149+
struct sockaddr_in dest_addr;
150+
dest_addr.sin_addr.s_addr = inet_addr((const char *)ip_str);
151+
dest_addr.sin_family = AF_INET;
152+
dest_addr.sin_port = htons(port);
151153

152-
int err = lwip_sendto(self->num, buf, len, 0 /* flags */,
153-
(struct sockaddr *)&dest_addr, sizeof(dest_addr));
154+
int bytes_sent = lwip_sendto(self->num, buf, len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
155+
if (bytes_sent < 0) {
156+
mp_raise_BrokenPipeError();
157+
return 0;
158+
}
159+
return bytes_sent;
154160
}
155161

156162
mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t* self,
157-
const uint8_t* buf, mp_uint_t len, uint8_t* ip, uint8_t port) {
163+
uint8_t* buf, mp_uint_t len, uint8_t* ip, uint *port) {
158164

159-
const struct addrinfo hints = {
160-
.ai_family = AF_INET,
161-
.ai_socktype = SOCK_STREAM,
162-
};
163-
struct addrinfo *res;
164-
int err = getaddrinfo(host, NULL, &hints, &res);
165-
if (err != 0 || res == NULL) {
166-
return mp_const_none;
167-
}
165+
struct sockaddr_in source_addr;
166+
socklen_t socklen = sizeof(source_addr);
167+
int bytes_received = lwip_recvfrom(self->num, buf, len - 1, 0, (struct sockaddr *)&source_addr, &socklen);
168168

169-
#pragma GCC diagnostic push
170-
#pragma GCC diagnostic ignored "-Wcast-align"
171-
struct in_addr *addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
172-
#pragma GCC diagnostic pop
173-
char ip_str[IP4ADDR_STRLEN_MAX];
174-
inet_ntoa_r(*addr, ip_str, IP4ADDR_STRLEN_MAX);
175-
mp_obj_t ip_obj = mp_obj_new_str(ip_str, strlen(ip_str));
176-
freeaddrinfo(res);
169+
memcpy((void *)ip, (void*)&source_addr.sin_addr.s_addr, sizeof source_addr.sin_addr.s_addr);
170+
*port = source_addr.sin_port;
171+
172+
if (bytes_received < 0) {
173+
mp_raise_BrokenPipeError();
174+
return 0;
175+
} else {
176+
buf[bytes_received] = 0; // Null-terminate whatever we received
177+
return bytes_received;
178+
}
177179
}
178180

179181
void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self) {

shared-bindings/socketpool/Socket.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
#include "py/runtime.h"
3737
#include "py/mperrno.h"
3838

39+
#include "lib/netutils/netutils.h"
40+
3941
//| class Socket:
4042
//| """TCP, UDP and RAW socket. Cannot be created directly. Instead, call
4143
//| `SocketPool.socket()`.
@@ -298,7 +300,7 @@ STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_
298300
mp_int_t port = mp_obj_get_int(addr_items[1]);
299301

300302
mp_int_t ret = common_hal_socketpool_socket_sendto(self, host, hostlen, port, bufinfo.buf, bufinfo.len);
301-
if (!ok) {
303+
if (!ret) {
302304
mp_raise_OSError(0);
303305
}
304306

@@ -324,11 +326,11 @@ STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t data_
324326
byte ip[4];
325327
mp_uint_t port;
326328
mp_int_t ret = common_hal_socketpool_socket_recvfrom_into(self,
327-
(byte*)bufinfo.buf, len, ip, &port);
329+
(byte*)bufinfo.buf, bufinfo.len, ip, &port);
328330
mp_obj_t tuple_contents[2];
329331
tuple_contents[0] = mp_obj_new_int_from_uint(ret);
330332
tuple_contents[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
331-
return mp_obj_new_tuple(2, tuple);
333+
return mp_obj_new_tuple(2, tuple_contents);
332334
}
333335
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);
334336

shared-bindings/socketpool/Socket.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ bool common_hal_socketpool_socket_connect(socketpool_socket_obj_t* self, const c
3636
mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
3737
mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
3838
mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t* self,
39-
const uint8_t* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len);
39+
const char* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len);
4040
mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t* self,
41-
const uint8_t* buf, mp_uint_t len, uint8_t* ip, uint8_t port);
41+
uint8_t* buf, mp_uint_t len, uint8_t* ip, uint *port);
4242
void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self);
4343
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t* self);
4444
bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t* self);

0 commit comments

Comments
 (0)