diff --git a/extmod/modlwip.c b/extmod/modlwip.c index afe5ca9e73..fdbbb08bcd 100644 --- a/extmod/modlwip.c +++ b/extmod/modlwip.c @@ -199,8 +199,12 @@ typedef struct _lwip_socket_obj_t { uint8_t domain; uint8_t type; - // 0 = unconnected, 1 = connecting, 2 = connected, 3 = other side closed - int8_t connected; + #define STATE_NEW 0 + #define STATE_CONNECTING 1 + #define STATE_CONNECTED 2 + #define STATE_PEER_CLOSED 3 + // Negative value is lwIP error + int8_t state; } lwip_socket_obj_t; static inline void poll_sockets(void) { @@ -231,7 +235,7 @@ STATIC void _lwip_tcp_error(void *arg, err_t err) { lwip_socket_obj_t *socket = (lwip_socket_obj_t*)arg; // Pass the error code back via the connection variable. - socket->connected = err; + socket->state = err; // If we got here, the lwIP stack either has deallocated or will deallocate the pcb. socket->pcb.tcp = NULL; } @@ -240,7 +244,7 @@ STATIC void _lwip_tcp_error(void *arg, err_t err) { STATIC err_t _lwip_tcp_connected(void *arg, struct tcp_pcb *tpcb, err_t err) { lwip_socket_obj_t *socket = (lwip_socket_obj_t*)arg; - socket->connected = 2; + socket->state = STATE_CONNECTED; return ERR_OK; } @@ -264,7 +268,7 @@ STATIC err_t _lwip_tcp_recv(void *arg, struct tcp_pcb *tcpb, struct pbuf *p, err if (p == NULL) { // Other side has closed connection. - socket->connected = 3; + socket->state = STATE_PEER_CLOSED; return ERR_OK; } else if (socket->incoming.pbuf != NULL) { // No room in the inn, let LWIP know it's still responsible for delivery later @@ -378,7 +382,7 @@ STATIC mp_uint_t lwip_tcp_send(lwip_socket_obj_t *socket, const byte *buf, mp_ui // Helper function for recv/recvfrom to handle TCP packets STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) { - if (socket->connected == 3) { + if (socket->state == STATE_PEER_CLOSED) { return 0; } @@ -463,7 +467,7 @@ STATIC mp_obj_t lwip_socket_make_new(mp_obj_t type_in, mp_uint_t n_args, socket->incoming.pbuf = NULL; socket->timeout = -1; - socket->connected = 0; + socket->state = STATE_NEW; socket->leftover_count = 0; return socket; } @@ -489,7 +493,7 @@ STATIC mp_obj_t lwip_socket_close(mp_obj_t self_in) { //case MOD_NETWORK_SOCK_RAW: raw_remove(socket->pcb.raw); break; } socket->pcb.tcp = NULL; - socket->connected = -16; // EBADF + socket->state = -16; // EBADF if (socket->incoming.pbuf != NULL) { if (!socket_is_listener) { pbuf_free(socket->incoming.pbuf); @@ -599,7 +603,7 @@ STATIC mp_obj_t lwip_socket_accept(mp_obj_t self_in) { socket2->type = MOD_NETWORK_SOCK_STREAM; socket2->incoming.pbuf = NULL; socket2->timeout = socket->timeout; - socket2->connected = 2; + socket2->state = STATE_CONNECTED; socket2->leftover_count = 0; tcp_arg(socket2->pcb.tcp, (void*)socket2); tcp_err(socket2->pcb.tcp, _lwip_tcp_error); @@ -636,8 +640,8 @@ STATIC mp_obj_t lwip_socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { err_t err = ERR_ARG; switch (socket->type) { case MOD_NETWORK_SOCK_STREAM: { - if (socket->connected != 0) { - if (socket->connected == 2) { + if (socket->state != STATE_NEW) { + if (socket->state == STATE_CONNECTED) { nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EALREADY))); } else { nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EINPROGRESS))); @@ -645,11 +649,10 @@ STATIC mp_obj_t lwip_socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { } // Register our recieve callback. tcp_recv(socket->pcb.tcp, _lwip_tcp_recv); - // Mark us as "connecting" - socket->connected = 1; + socket->state = STATE_CONNECTING; err = tcp_connect(socket->pcb.tcp, &dest, port, _lwip_tcp_connected); if (err != ERR_OK) { - socket->connected = 0; + socket->state = STATE_NEW; nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(error_lookup_table[-err]))); } socket->peer_port = (mp_uint_t)port; @@ -658,20 +661,20 @@ STATIC mp_obj_t lwip_socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { if (socket->timeout != -1) { for (mp_uint_t retries = socket->timeout / 100; retries--;) { mp_hal_delay_ms(100); - if (socket->connected != 1) break; + if (socket->state != STATE_CONNECTING) break; } - if (socket->connected == 1) { + if (socket->state == STATE_CONNECTING) { nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(ETIMEDOUT))); } } else { - while (socket->connected == 1) { + while (socket->state == STATE_CONNECTING) { mp_hal_delay_ms(100); } } - if (socket->connected == 2) { + if (socket->state == STATE_CONNECTED) { err = ERR_OK; } else { - err = socket->connected; + err = socket->state; } break; } @@ -695,8 +698,8 @@ STATIC mp_obj_t lwip_socket_send(mp_obj_t self_in, mp_obj_t buf_in) { if (socket->pcb.tcp == NULL) { // not connected - _errno = error_lookup_table[-(socket->connected)]; - socket->connected = -16; + _errno = error_lookup_table[-(socket->state)]; + socket->state = -16; nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno))); } @@ -728,8 +731,8 @@ STATIC mp_obj_t lwip_socket_recv(mp_obj_t self_in, mp_obj_t len_in) { if (socket->pcb.tcp == NULL) { // not connected - _errno = error_lookup_table[-(socket->connected)]; - socket->connected = -16; + _errno = error_lookup_table[-(socket->state)]; + socket->state = -16; nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno))); } @@ -766,8 +769,8 @@ STATIC mp_obj_t lwip_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t if (socket->pcb.tcp == NULL) { // not connected - _errno = error_lookup_table[-(socket->connected)]; - socket->connected = -16; + _errno = error_lookup_table[-(socket->state)]; + socket->state = -16; nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno))); } @@ -802,8 +805,8 @@ STATIC mp_obj_t lwip_socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) { if (socket->pcb.tcp == NULL) { // not connected - _errno = error_lookup_table[-(socket->connected)]; - socket->connected = -16; + _errno = error_lookup_table[-(socket->state)]; + socket->state = -16; nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno))); }