|
11 | 11 | #include "py/mperrno.h" |
12 | 12 | #include "py/runtime.h" |
13 | 13 | #include "shared-bindings/socketpool/SocketPool.h" |
| 14 | +#include "common-hal/socketpool/__init__.h" |
14 | 15 | #if CIRCUITPY_SSL |
15 | 16 | #include "shared-bindings/ssl/SSLSocket.h" |
16 | 17 | #include "shared-module/ssl/SSLSocket.h" |
|
25 | 26 | #include "components/lwip/lwip/src/include/lwip/netdb.h" |
26 | 27 | #include "components/vfs/include/esp_vfs_eventfd.h" |
27 | 28 |
|
| 29 | +static void resolve_host_or_throw(socketpool_socket_obj_t *self, const char *hostname, struct sockaddr_storage *addr, int port) { |
| 30 | + struct addrinfo *result_i; |
| 31 | + const struct addrinfo hints = { |
| 32 | + .ai_family = self->family, |
| 33 | + .ai_socktype = self->type, |
| 34 | + }; |
| 35 | + int error = socketpool_getaddrinfo_common(hostname, port, &hints, &result_i); |
| 36 | + if (error != 0 || result_i == NULL) { |
| 37 | + common_hal_socketpool_socketpool_raise_gaierror_noname(); |
| 38 | + } |
| 39 | + memcpy(addr, result_i->ai_addr, sizeof(struct sockaddr_storage)); |
| 40 | + lwip_freeaddrinfo(result_i); |
| 41 | +} |
| 42 | + |
28 | 43 | StackType_t socket_select_stack[2 * configMINIMAL_STACK_SIZE]; |
29 | 44 |
|
30 | 45 | /* Socket state table: |
@@ -339,7 +354,7 @@ size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, |
339 | 354 | ip = inet_addr(host); |
340 | 355 | } |
341 | 356 | bind_addr.sin_addr.s_addr = ip; |
342 | | - bind_addr.sin_family = AF_INET; |
| 357 | + bind_addr.sin_family = self->family; |
343 | 358 | bind_addr.sin_port = htons(port); |
344 | 359 |
|
345 | 360 | int result = lwip_bind(self->num, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); |
@@ -382,34 +397,16 @@ void common_hal_socketpool_socket_close(socketpool_socket_obj_t *self) { |
382 | 397 |
|
383 | 398 | void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, |
384 | 399 | const char *host, size_t hostlen, uint32_t port) { |
385 | | - const struct addrinfo hints = { |
386 | | - .ai_family = self->family, |
387 | | - .ai_socktype = self->type, |
388 | | - }; |
389 | | - struct addrinfo *result_i; |
390 | | - int error = lwip_getaddrinfo(host, NULL, &hints, &result_i); |
391 | | - if (error != 0 || result_i == NULL) { |
392 | | - common_hal_socketpool_socketpool_raise_gaierror_noname(); |
393 | | - } |
394 | | - |
395 | | - // Set parameters |
396 | | - struct sockaddr_in dest_addr; |
397 | | - #pragma GCC diagnostic push |
398 | | - #pragma GCC diagnostic ignored "-Wcast-align" |
399 | | - dest_addr.sin_addr.s_addr = ((struct sockaddr_in *)result_i->ai_addr)->sin_addr.s_addr; |
400 | | - #pragma GCC diagnostic pop |
401 | | - lwip_freeaddrinfo(result_i); |
402 | | - |
403 | | - dest_addr.sin_family = AF_INET; |
404 | | - dest_addr.sin_port = htons(port); |
| 400 | + struct sockaddr_storage addr; |
| 401 | + resolve_host_or_throw(self, host, &addr, port); |
405 | 402 |
|
406 | 403 | // Replace above with function call ----- |
407 | 404 |
|
408 | 405 | // Emulate SO_CONTIMEO, which is not implemented by lwip. |
409 | 406 | // All our sockets are non-blocking, so we check the timeout ourselves. |
410 | 407 |
|
411 | 408 | int result = -1; |
412 | | - result = lwip_connect(self->num, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in)); |
| 409 | + result = lwip_connect(self->num, (struct sockaddr *)&addr, addr.s2_len); |
413 | 410 |
|
414 | 411 | if (result == 0) { |
415 | 412 | // Connected immediately. |
@@ -611,29 +608,10 @@ mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t *self, const |
611 | 608 | mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self, |
612 | 609 | const char *host, size_t hostlen, uint32_t port, const uint8_t *buf, uint32_t len) { |
613 | 610 |
|
614 | | - // Set parameters |
615 | | - const struct addrinfo hints = { |
616 | | - .ai_family = self->family, |
617 | | - .ai_socktype = self->type, |
618 | | - }; |
619 | | - struct addrinfo *result_i; |
620 | | - int error = lwip_getaddrinfo(host, NULL, &hints, &result_i); |
621 | | - if (error != 0 || result_i == NULL) { |
622 | | - common_hal_socketpool_socketpool_raise_gaierror_noname(); |
623 | | - } |
624 | | - |
625 | | - // Set parameters |
626 | | - struct sockaddr_in dest_addr; |
627 | | - #pragma GCC diagnostic push |
628 | | - #pragma GCC diagnostic ignored "-Wcast-align" |
629 | | - dest_addr.sin_addr.s_addr = ((struct sockaddr_in *)result_i->ai_addr)->sin_addr.s_addr; |
630 | | - #pragma GCC diagnostic pop |
631 | | - lwip_freeaddrinfo(result_i); |
632 | | - |
633 | | - dest_addr.sin_family = AF_INET; |
634 | | - dest_addr.sin_port = htons(port); |
| 611 | + struct sockaddr_storage addr; |
| 612 | + resolve_host_or_throw(self, host, &addr, port); |
635 | 613 |
|
636 | | - int bytes_sent = lwip_sendto(self->num, buf, len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); |
| 614 | + int bytes_sent = lwip_sendto(self->num, buf, len, 0, (struct sockaddr *)&addr, addr.s2_len); |
637 | 615 | if (bytes_sent < 0) { |
638 | 616 | mp_raise_BrokenPipeError(); |
639 | 617 | return 0; |
|
0 commit comments