Skip to content

Commit 5bd96db

Browse files
committed
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
2 parents cbe7bff + 1a0e7d8 commit 5bd96db

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

components/esp_netif/lwip/esp_netif_lwip.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,11 @@ static esp_err_t esp_netif_dhcpc_start_api(esp_netif_api_msg_t *msg)
950950
return ESP_ERR_INVALID_ARG;
951951
}
952952

953+
if (esp_netif->dhcpc_status == ESP_NETIF_DHCP_STARTED) {
954+
ESP_LOGD(TAG, "dhcp client already started");
955+
return ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED;
956+
}
957+
953958
struct netif *p_netif = esp_netif->lwip_netif;
954959

955960
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)
10191024
return ESP_ERR_INVALID_ARG;
10201025
}
10211026

1027+
if (esp_netif->dhcps_status == ESP_NETIF_DHCP_STARTED) {
1028+
ESP_LOGD(TAG, "dhcp server already started");
1029+
return ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED;
1030+
}
1031+
10221032
struct netif *p_netif = esp_netif->lwip_netif;
10231033
if (p_netif != NULL && netif_is_up(p_netif)) {
10241034
esp_netif_ip_info_t *default_ip = esp_netif->ip_info;

components/esp_netif/test/test_esp_netif.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,20 @@ TEST_CASE("esp_netif: test dhcp client state transitions for wifi station", "[es
8484
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);
8585
esp_netif_action_connected(sta, NULL, 0, NULL);
8686
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
87+
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
8788

89+
// test manual DHCP state transitions using dhcpc-start/stop API
90+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_stop(sta));
91+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
92+
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STOPPED, state);
93+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_start(sta));
94+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
8895
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
96+
TEST_ASSERT_EQUAL(ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED, esp_netif_dhcpc_start(sta));
97+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
98+
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
99+
100+
// stop the netif and test dhcp state update
89101
esp_netif_action_stop(sta, NULL, 0, NULL);
90102
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
91103

@@ -117,6 +129,18 @@ TEST_CASE("esp_netif: test dhcp server state transitions for wifi soft AP", "[es
117129
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
118130
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
119131

132+
// test manual DHCP state transitions using dhcps-start/stop API
133+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_stop(ap));
134+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
135+
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STOPPED, state);
136+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_start(ap));
137+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
138+
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
139+
TEST_ASSERT_EQUAL(ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED, esp_netif_dhcps_start(ap));
140+
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
141+
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
142+
143+
// stop the netif and test dhcp state update
120144
esp_netif_action_stop(ap, NULL, 0, NULL);
121145
TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
122146
TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);

0 commit comments

Comments
 (0)