8000 Merge pull request #8940 from tannewt/esp_accept_listen · adafruit/circuitpython@6c1e34e · GitHub
[go: up one dir, main page]

Skip to content

Commit 6c1e34e

Browse files
authored
Merge pull request #8940 from tannewt/esp_accept_listen
Require explicit socket port reuse
2 parents d0fec0c + 9f3987a commit 6c1e34e

File tree

7 files changed

+40
-27
lines changed

7 files changed

+40
-27
lines changed

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
334334
}
335335
}
336336

337-
bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
337+
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
338338
const char *host, size_t hostlen, uint32_t port) {
339339
struct sockaddr_in bind_addr;
340340
const char *broadcast = "<broadcast>";
@@ -351,13 +351,11 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
351351
bind_addr.sin_family = AF_INET;
352352
bind_addr.sin_port = htons(port);
353353

354-
int opt = 1;
355-
int err = lwip_setsockopt(self->num, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
356-
if (err != 0) {
357-
mp_raise_RuntimeError(MP_ERROR_TEXT("Cannot set socket options"));
358-
}
359354
int result = lwip_bind(self->num, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
360-
return result == 0;
355+
if (result == 0) {
356+
return 0;
357+
}
358+
return errno;
361359
}
362360

363361
void socketpool_socket_close(socketpool_socket_obj_t *self) {

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
865865
return MP_OBJ_FROM_PTR(accepted);
866866
}
867867

868-
bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
868+
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
869869
const char *host, size_t hostlen, uint32_t port) {
870870

871871
// get address
@@ -876,7 +876,6 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
876876
} else {
877877
bind_addr_ptr = IP_ANY_TYPE;
878878
}
879-
ip_set_option(socket->pcb.ip, SOF_REUSEADDR);
880879

881880
err_t err = ERR_ARG;
882881
switch (socket->type) {
@@ -891,10 +890,10 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
891890
}
892891

893892
if (err != ERR_OK) {
894-
mp_raise_OSError(error_lookup_table[-err]);
893+
return error_lookup_table[-err];
895894
}
896895

897-
return mp_const_none;
896+
return 0;
898897
}
899898

900899
STATIC err_t _lwip_tcp_close_poll(void *arg, struct tcp_pcb *pcb) {

shared-bindings/socketpool/Socket.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ STATIC mp_obj_t socketpool_socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
106106
mp_raise_ValueError(MP_ERROR_TEXT("port must be >= 0"));
107107
}
108108

109-
bool ok = common_hal_socketpool_socket_bind(self, host, hostlen, (uint32_t)port);
110-
if (!ok) {
111-
mp_raise_ValueError(MP_ERROR_TEXT("Error: Failure to bind"));
109+
size_t error = common_hal_socketpool_socket_bind(self, host, hostlen, (uint32_t)port);
110+
if (error != 0) {
111+
mp_raise_OSError(error);
112112
}
113113

114114
return mp_const_none;

shared-bindings/socketpool/Socket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
extern const mp_obj_type_t socketpool_socket_type;
3333

3434
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port);
35-
bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
35+
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
3636
void common_hal_socketpool_socket_close(socketpool_socket_obj_t *self);
3737
void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
3838
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t *self);

shared-bindings/socketpool/SocketPool.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ MP_DEFINE_EXCEPTION(gaierror, OSError)
7979
//| SOCK_RAW: int
8080
//| EAI_NONAME: int
8181
//|
82+
//| SOL_SOCKET: int
83+
//|
84+
//| SO_REUSEADDR: int
85+
//|
8286
//| TCP_NODELAY: int
8387
//|
8488
//| IPPROTO_IP: int
@@ -196,6 +200,10 @@ STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = {
196200
{ MP_ROM_QSTR(MP_QSTR_SOCK_DGRAM), MP_ROM_INT(SOCKETPOOL_SOCK_DGRAM) },
197201
{ MP_ROM_QSTR(MP_QSTR_SOCK_RAW), MP_ROM_INT(SOCKETPOOL_SOCK_RAW) },
198202

203+
{ MP_ROM_QSTR(MP_QSTR_SOL_SOCKET), MP_ROM_INT(SOCKETPOOL_SOL_SOCKET) },
204+
205+
{ MP_ROM_QSTR(MP_QSTR_SO_REUSEADDR), MP_ROM_INT(SOCKETPOOL_SO_REUSEADDR) },
206+
199207
{ MP_ROM_QSTR(MP_QSTR_TCP_NODELAY), MP_ROM_INT(SOCKETPOOL_TCP_NODELAY) },
200208

201209
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(SOCKETPOOL_IPPROTO_IP) },

shared-bindings/socketpool/SocketPool.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ typedef enum {
5757
SOCKETPOOL_TCP_NODELAY = 1,
5858
} socketpool_socketpool_tcpopt_t;
5959

60+
typedef enum {
61+
SOCKETPOOL_SOL_SOCKET = 0xfff,
62+
} socketpool_socketpool_optlevel_t;
63+
64+
typedef enum {
65+
SOCKETPOOL_SO_REUSEADDR = 0x0004,
66+
} socketpool_socketpool_socketopt_t;
67+
6068
typedef enum {
6169
SOCKETPOOL_IP_MULTICAST_TTL = 5,
6270
} socketpool_socketpool_ipopt_t;

shared-module/ssl/SSLSocket.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ STATIC void mbedtls_debug(void *ctx, int level, const char *file, int line, cons
5757
(void)level;
5858
mp_printf(&mp_plat_print, "DBG:%s:%04d: %s\n", file, line, str);
5959
}
60-
#define DEBUG(fmt, ...) mp_printf(&mp_plat_print, "DBG:%s:%04d: " fmt "\n", __FILE__, __LINE__,##__VA_ARGS__)
60+
#define DEBUG_PRINT(fmt, ...) mp_printf(&mp_plat_print, "DBG:%s:%04d: " fmt "\n", __FILE__, __LINE__,##__VA_ARGS__)
6161
#else
62-
#define DEBUG(...) do {} while (0)
62+
#define DEBUG_PRINT(...) do {} while (0)
6363
#endif
6464

6565
STATIC NORETURN void mbedtls_raise_error(int err) {
@@ -107,10 +107,10 @@ STATIC int _mbedtls_ssl_send(void *ctx, const byte *buf, size_t len) {
107107

108108
// mp_uint_t out_sz = sock_stream->write(sock, buf, len, &err);
109109
mp_int_t out_sz = socketpool_socket_send(sock, buf, len);
110-
DEBUG("socket_send() -> %d", out_sz);
110+
DEBUG_PRINT("socket_send() -> %d", out_sz);
111111
if (out_sz < 0) {
112112
int err = -out_sz;
113-
DEBUG("sock_stream->write() -> %d nonblocking? %d", out_sz, mp_is_nonblocking_error(err));
113+
DEBUG_PRINT("sock_stream->write() -> %d nonblocking? %d", out_sz, mp_is_nonblocking_error(err));
114114
if (mp_is_nonblocking_error(err)) {
115115
return MBEDTLS_ERR_SSL_WANT_WRITE;
116116
}
@@ -125,7 +125,7 @@ STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
125125
mp_obj_t sock = *(mp_obj_t *)ctx;
126126

127127
mp_int_t out_sz = socketpool_socket_recv_into(sock, buf, len);
128-
DEBUG("socket_recv() -> %d", out_sz);
128+
DEBUG_PRINT("socket_recv() -> %d", out_sz);
129129
if (out_sz < 0) {
130130
int err = -out_sz;
131131
if (mp_is_nonblocking_error(err)) {
@@ -261,14 +261,14 @@ ssl_sslsocket_obj_t *common_hal_ssl_sslcontext_wrap_socket(ssl_sslcontext_obj_t
261261

262262
mp_uint_t common_hal_ssl_sslsocket_recv_into(ssl_sslsocket_obj_t *self, uint8_t *buf, uint32_t len) {
263263
int ret = mbedtls_ssl_read(&self->ssl, buf, len);
264-
DEBUG("recv_into mbedtls_ssl_read() -> %d\n", ret);
264+
DEBUG_PRINT("recv_into mbedtls_ssl_read() -> %d\n", ret);
265265
if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
266-
DEBUG("returning %d\n", 0);
266+
DEBUG_PRINT("returning %d\n", 0);
267267
// end of stream
268268
return 0;
269269
}
270270
if (ret >= 0) {
271-
DEBUG("returning %d\n", ret);
271+
DEBUG_PRINT("returning %d\n", ret);
272272
return ret;
273273
}
274274
if (ret == MBEDTLS_ERR_SSL_WANT_READ) {
@@ -279,15 +279,15 @@ mp_uint_t common_hal_ssl_sslsocket_recv_into(ssl_sslsocket_obj_t *self, uint8_t
279279
// renegotiation.
280280
ret = MP_EWOULDBLOCK;
281281
}
282-
DEBUG("raising errno [error case] %d\n", ret);
282+
DEBUG_PRINT("raising errno [error case] %d\n", ret);
283283
mp_raise_OSError(ret);
284284
}
285285

286286
mp_uint_t common_hal_ssl_sslsocket_send(ssl_sslsocket_obj_t *self, const uint8_t *buf, uint32_t len) {
287287
int ret = mbedtls_ssl_write(&self->ssl, buf, len);
288-
DEBUG("send mbedtls_ssl_write() -> %d\n", ret);
288+
DEBUG_PRINT("send mbedtls_ssl_write() -> %d\n", ret);
289289
if (ret >= 0) {
290-
DEBUG("returning %d\n", ret);
290+
DEBUG_PRINT("returning %d\n", ret);
291291
return ret;
292292
}
293293
if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
@@ -298,7 +298,7 @@ mp_uint_t common_hal_ssl_sslsocket_send(ssl_sslsocket_obj_t *self, const uint8_t
298298
// renegotiation.
299299
ret = MP_EWOULDBLOCK;
300300
}
301-
DEBUG("raising errno [error case] %d\n", ret);
301+
DEBUG_PRINT("raising errno [error case] %d\n", ret);
302302
mp_raise_OSError(ret);
303303
}
304304

0 commit comments

Comments
 (0)
0