From 39f804ae07c5198bf5504efad1faf518178e5bf0 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 23 Jul 2020 11:29:45 +0200 Subject: [PATCH 1/2] esp_netif: Remove restarting DHCP client and server if it has already been started To be in line with previous behaviour in tcpip_adapter, do nothing and return appropriate error if the DHCP client/server has already been started --- components/esp_netif/lwip/esp_netif_lwip.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index 8fd274dba..e8f34c24b 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -916,6 +916,11 @@ static esp_err_t esp_netif_dhcpc_start_api(esp_netif_api_msg_t *msg) return ESP_ERR_INVALID_ARG; } + if (esp_netif->dhcpc_status == ESP_NETIF_DHCP_STARTED) { + ESP_LOGD(TAG, "dhcp client already started"); + return ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED; + } + struct netif *p_netif = esp_netif->lwip_netif; esp_netif_reset_ip_info(esp_netif); @@ -985,6 +990,11 @@ static esp_err_t esp_netif_dhcps_start_api(esp_netif_api_msg_t *msg) return ESP_ERR_INVALID_ARG; } + if (esp_netif->dhcps_status == ESP_NETIF_DHCP_STARTED) { + ESP_LOGD(TAG, "dhcp server already started"); + return ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED; + } + struct netif *p_netif = esp_netif->lwip_netif; if (p_netif != NULL && netif_is_up(p_netif)) { esp_netif_ip_info_t *default_ip = esp_netif->ip_info; From 0e6777f78bb1d14fe8679b709313dd8c95d67558 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 29 Jul 2020 11:35:28 +0200 Subject: [PATCH 2/2] esp_netif tests: Add manual DHCP state transision tests Extended test cases for DHCP server and DHCP client state transitions to include also manual transitions using esp_netif_dhcps_start/stop() esp_netif_dhcpc_start/stop() --- components/esp_netif/test/test_esp_netif.c | 26 +++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/components/esp_netif/test/test_esp_netif.c b/components/esp_netif/test/test_esp_netif.c index a3d844709..69f158cd4 100644 --- a/components/esp_netif/test/test_esp_netif.c +++ b/components/esp_netif/test/test_esp_netif.c @@ -84,8 +84,20 @@ TEST_CASE("esp_netif: test dhcp client state transitions for wifi station", "[es TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state); esp_netif_action_connected(sta, NULL, 0, NULL); TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); - TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // test manual DHCP state transitions using dhcpc-start/stop API + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_stop(sta)); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STOPPED, state); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_start(sta)); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + TEST_ASSERT_EQUAL(ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED, esp_netif_dhcpc_start(sta)); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // stop the netif and test dhcp state update esp_netif_action_stop(sta, NULL, 0, NULL); TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); @@ -117,6 +129,18 @@ TEST_CASE("esp_netif: test dhcp server state transitions for wifi soft AP", "[es TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + // test manual DHCP state transitions using dhcps-start/stop API + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_stop(ap)); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STOPPED, state); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_start(ap)); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + TEST_ASSERT_EQUAL(ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED, esp_netif_dhcps_start(ap)); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // stop the netif and test dhcp state update esp_netif_action_stop(ap, NULL, 0, NULL); TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);