Merge branch 'bugfix/esp_netif_restart_dhcpc' into 'master'

esp_netif: Remove restarting DHCP client/server if it has already been started

Closes IDF-1978

See merge request espressif/esp-idf!9760
This commit is contained in:
David Čermák
2020-07-30 17:16:49 +08:00
2 changed files with 35 additions and 1 deletions

View File

@@ -950,6 +950,11 @@ static esp_err_t esp_netif_dhcpc_start_api(esp_netif_api_msg_t *msg)
return ESP_ERR_INVALID_ARG; 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; struct netif *p_netif = esp_netif->lwip_netif;
esp_netif_reset_ip_info(esp_netif); esp_netif_reset_ip_info(esp_netif);
@@ -1019,6 +1024,11 @@ static esp_err_t esp_netif_dhcps_start_api(esp_netif_api_msg_t *msg)
return ESP_ERR_INVALID_ARG; 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; struct netif *p_netif = esp_netif->lwip_netif;
if (p_netif != NULL && netif_is_up(p_netif)) { if (p_netif != NULL && netif_is_up(p_netif)) {
esp_netif_ip_info_t *default_ip = esp_netif->ip_info; esp_netif_ip_info_t *default_ip = esp_netif->ip_info;

View File

@@ -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); TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);
esp_netif_action_connected(sta, NULL, 0, NULL); esp_netif_action_connected(sta, NULL, 0, NULL);
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, 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); esp_netif_action_stop(sta, NULL, 0, NULL);
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); 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_OK, esp_netif_dhcps_get_status(ap, &state));
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, 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); esp_netif_action_stop(ap, NULL, 0, NULL);
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state); TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);