|
32 | 32 | #include "py/runtime.h"
|
33 | 33 | #include "supervisor/shared/tick.h"
|
34 | 34 |
|
| 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 | + |
35 | 40 | void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t* self, mp_uint_t timeout_ms) {
|
36 | 41 | self->timeout_ms = timeout_ms;
|
37 | 42 | }
|
@@ -122,58 +127,55 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self,
|
122 | 127 | mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t* self,
|
123 | 128 | const char* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len) {
|
124 | 129 |
|
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 |
131 | 131 | const struct addrinfo hints = {
|
132 | 132 | .ai_family = AF_INET,
|
133 | 133 | .ai_socktype = SOCK_STREAM,
|
134 | 134 | };
|
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; |
139 | 139 | }
|
140 |
| - |
141 | 140 | #pragma GCC diagnostic push
|
142 | 141 | #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; |
144 | 143 | #pragma GCC diagnostic pop
|
145 | 144 | char ip_str[IP4ADDR_STRLEN_MAX];
|
146 | 145 | 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); |
150 | 147 |
|
| 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); |
151 | 153 |
|
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; |
154 | 160 | }
|
155 | 161 |
|
156 | 162 | 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) { |
158 | 164 |
|
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); |
168 | 168 |
|
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 | + } |
177 | 179 | }
|
178 | 180 |
|
179 | 181 | void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self) {
|
|
0 commit comments