From 09d0e99d5b60e5cbb2ccb0493dff2b516f2ee3eb Mon Sep 17 00:00:00 2001 From: Nick Moore Date: Thu, 2 May 2019 14:41:37 +1000 Subject: [PATCH] assign variable socket number to DHCP --- shared-module/wiznet/wiznet5k.c | 44 ++++++++++++++++++++------------- shared-module/wiznet/wiznet5k.h | 2 +- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/shared-module/wiznet/wiznet5k.c b/shared-module/wiznet/wiznet5k.c index 39b2bd3fed..660df90b75 100644 --- a/shared-module/wiznet/wiznet5k.c +++ b/shared-module/wiznet/wiznet5k.c @@ -93,6 +93,16 @@ int wiznet5k_gethostbyname(mp_obj_t nic, const char *name, mp_uint_t len, uint8_ } } +int get_available_socket(wiznet5k_obj_t *wiz) { + for (uint8_t sn = 0; sn < _WIZCHIP_SOCK_NUM_; sn++) { + if ((wiz->socket_used & (1 << sn)) == 0) { + wiz->socket_used |= (1 << sn); + return sn; + } + } + return -1; +} + int wiznet5k_socket_socket(mod_network_socket_obj_t *socket, int *_errno) { if (socket->u_param.domain != MOD_NETWORK_AF_INET) { *_errno = MP_EAFNOSUPPORT; @@ -106,14 +116,8 @@ int wiznet5k_socket_socket(mod_network_socket_obj_t *socket, int *_errno) { } if (socket->u_param.fileno == -1) { - // get first unused socket number ... 0 is reserved for DHCP - for (mp_uint_t sn = 1; sn < _WIZCHIP_SOCK_NUM_; sn++) { - if ((wiznet5k_obj.socket_used & (1 << sn)) == 0) { - wiznet5k_obj.socket_used |= (1 << sn); - socket->u_param.fileno = sn; - break; - } - } + // get first unused socket number + socket->u_param.fileno = get_available_socket(&wiznet5k_obj); if (socket->u_param.fileno == -1) { // too many open sockets *_errno = MP_EMFILE; @@ -318,33 +322,37 @@ int wiznet5k_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t request, m } void wiznet5k_socket_timer_tick(mod_network_socket_obj_t *socket) { - if (wiznet5k_obj.dhcp_active) { + if (wiznet5k_obj.dhcp_socket >= 0) { DHCP_time_handler(); DHCP_run(); } } void wiznet5k_start_dhcp(void) { + // XXX this should throw an error if DHCP fails static DHCP_INIT_BUFFER_TYPE dhcp_buf[DHCP_INIT_BUFFER_SIZE]; - if (!wiznet5k_obj.dhcp_active) { + if (wiznet5k_obj.dhcp_socket < 0) { // Set up the socket to listen on UDP 68 before calling DHCP_init - WIZCHIP_EXPORT(socket)(0, MOD_NETWORK_SOCK_DGRAM, DHCP_CLIENT_PORT, 0); - DHCP_init(0, dhcp_buf); - wiznet5k_obj.dhcp_active = 1; + wiznet5k_obj.dhcp_socket = get_available_socket(&wiznet5k_obj); + if (wiznet5k_obj.dhcp_socket < 0) return; + + WIZCHIP_EXPORT(socket)(wiznet5k_obj.dhcp_socket, MOD_NETWORK_SOCK_DGRAM, DHCP_CLIENT_PORT, 0); + DHCP_init(wiznet5k_obj.dhcp_socket, dhcp_buf); } } void wiznet5k_stop_dhcp(void) { - if (wiznet5k_obj.dhcp_active) { - wiznet5k_obj.dhcp_active = 0; + if (wiznet5k_obj.dhcp_socket >= 0) { DHCP_stop(); - WIZCHIP_EXPORT(close)(0); + WIZCHIP_EXPORT(close)(wiznet5k_obj.dhcp_socket); + wiznet5k_obj.socket_used &= ~(1 << wiznet5k_obj.dhcp_socket); + wiznet5k_obj.dhcp_socket = -1; } } bool wiznet5k_check_dhcp(void) { - return wiznet5k_obj.dhcp_active; + return wiznet5k_obj.dhcp_socket >= 0; } /// Create and return a WIZNET5K object. @@ -357,6 +365,7 @@ mp_obj_t wiznet5k_create(mp_obj_t spi_in, mp_obj_t cs_in, mp_obj_t rst_in) { common_hal_digitalio_digitalinout_construct(&wiznet5k_obj.cs, cs_in); common_hal_digitalio_digitalinout_construct(&wiznet5k_obj.rst, rst_in); wiznet5k_obj.socket_used = 0; + wiznet5k_obj.dhcp_socket = -1; /*!< SPI configuration */ // XXX probably should check if the provided SPI is already configured, and @@ -394,6 +403,7 @@ mp_obj_t wiznet5k_create(mp_obj_t spi_in, mp_obj_t cs_in, mp_obj_t rst_in) { // seems we need a small delay after init mp_hal_delay_ms(250); + // dhcp is started by default wiznet5k_start_dhcp(); // register with network module diff --git a/shared-module/wiznet/wiznet5k.h b/shared-module/wiznet/wiznet5k.h index 1284a44fd1..09f83df66f 100644 --- a/shared-module/wiznet/wiznet5k.h +++ b/shared-module/wiznet/wiznet5k.h @@ -39,7 +39,7 @@ typedef struct _wiznet5k_obj_t { digitalio_digitalinout_obj_t cs; digitalio_digitalinout_obj_t rst; uint8_t socket_used; - bool dhcp_active; + int8_t dhcp_socket; } wiznet5k_obj_t; int wiznet5k_gethostbyname(mp_obj_t nic, const char *name, mp_uint_t len, uint8_t *out_ip);