|
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