Merge branch 'fix/sntp_getreachability_v5.1' into 'release/v5.1'

fix(netif): Add missing SNTP get-reachablitiy API (v5.1)

See merge request espressif/esp-idf!30033
This commit is contained in:
Jiang Jiang Jian 2024-06-04 11:37:05 +08:00
commit 85fd3f397d
7 changed files with 91 additions and 8 deletions

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -107,6 +107,17 @@ void esp_netif_sntp_deinit(void);
*/
esp_err_t esp_netif_sntp_sync_wait(TickType_t tout);
/**
* @brief Returns SNTP server's reachability shift register as described in RFC 5905.
*
* @param index Index of the SERVER
* @param reachability reachability shift register
* @return ESP_OK on success,
* ESP_ERR_INVALID_STATE if SNTP not initialized
* ESP_ERR_INVALID_ARG if invalid arguments
*/
esp_err_t esp_netif_sntp_reachability(unsigned int index, unsigned int *reachability);
/**
* @}
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -91,6 +91,7 @@ void esp_netif_sntp_renew_servers(void *handler_args, esp_event_base_t base, int
esp_err_t esp_netif_sntp_init(const esp_sntp_config_t * config)
{
esp_err_t ret = ESP_OK;
ESP_RETURN_ON_FALSE(s_storage == NULL, ESP_ERR_INVALID_STATE, TAG, "esp_netif_sntp already initialized");
s_storage = calloc(1, sizeof(sntp_storage_t) + // allocate space for servers only if we are supposed to refresh the settings
(config->renew_servers_after_new_IP ? config->num_of_servers * sizeof(char*) : 0));
ESP_GOTO_ON_FALSE(s_storage != NULL, ESP_ERR_NO_MEM, err, TAG, "Failed to allocate SNTP storage");
@ -177,3 +178,15 @@ esp_err_t esp_netif_sntp_start(void)
{
return esp_netif_tcpip_exec(sntp_start_api, NULL);
}
esp_err_t esp_netif_sntp_reachability(unsigned int index, unsigned int *reachability)
{
if (index >= SNTP_MAX_SERVERS || reachability == NULL) {
return ESP_ERR_INVALID_ARG;
}
if (s_storage == NULL || sntp_enabled() == 0) {
return ESP_ERR_INVALID_STATE;
}
*reachability = sntp_getreachability(index);
return ESP_OK;
}

View File

@ -48,7 +48,20 @@ TEST(esp_netif, init_and_destroy_sntp)
{
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("127.0.0.1");
config.start = false;
esp_netif_sntp_init(&config);
TEST_ESP_OK(esp_netif_sntp_init(&config));
// Cannot initialize multiple times
TEST_ASSERT_NOT_EQUAL(ESP_OK, esp_netif_sntp_init(&config));
// Try again to see that the state didn't change
TEST_ASSERT_NOT_EQUAL(ESP_OK, esp_netif_sntp_init(&config));
esp_netif_sntp_deinit();
// Can initialize again once it's destroyed
TEST_ESP_OK(esp_netif_sntp_init(&config));
// Test the reachability API
size_t reachability = 0;
// Invalid state is expected since SNTP service didn't start
TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_netif_sntp_reachability(0, &reachability));
esp_netif_sntp_deinit();
}

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -243,6 +243,20 @@ const ip_addr_t* esp_sntp_getserver(u8_t idx)
return sntp_getserver(idx);
}
uint8_t esp_sntp_getreachability(uint8_t idx)
{
#if SNTP_MONITOR_SERVER_REACHABILITY
return sntp_getreachability(idx);
#endif
LWIP_ERROR("sntp_getreachability() in not enabled in lwipopts", false, );
return 0;
}
esp_sntp_operatingmode_t esp_sntp_getoperatingmode(void)
{
return (esp_sntp_operatingmode_t)sntp_getoperatingmode();
}
#if LWIP_DHCP_GET_NTP_SRV
static void do_servermode_dhcp(void* ctx)
{

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -218,6 +218,20 @@ const ip_addr_t* esp_sntp_getserver(u8_t idx);
*/
bool esp_sntp_enabled(void);
/**
* @brief Gets the server reachability shift register as described in RFC 5905.
* @param idx Index of the SNTP server
* @return reachability shift register
*/
uint8_t esp_sntp_getreachability(uint8_t idx);
/**
* @brief Get the configured operating mode
*
* @return operating mode enum
*/
esp_sntp_operatingmode_t esp_sntp_getoperatingmode(void);
#if LWIP_DHCP_GET_NTP_SRV
/**
* @brief Enable acquiring SNTP server from DHCP
@ -269,6 +283,16 @@ const ip_addr_t* sntp_getserver(u8_t idx)
return esp_sntp_getserver(idx);
}
static inline uint8_t sntp_getreachability(uint8_t idx)
{
return esp_sntp_getreachability(idx);
}
static inline esp_sntp_operatingmode_t sntp_getoperatingmode(void)
{
return esp_sntp_getoperatingmode();
}
#endif /* ESP_LWIP_COMPONENT_BUILD */

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -294,8 +294,16 @@ void test_sntp_timestamps(int year, bool msb_flag)
localtime_r(&now, &timeinfo);
TEST_ASSERT_EQUAL(year, 1900 + timeinfo.tm_year);
// Check that the server 0 was reachable
TEST_ASSERT_EQUAL(1, esp_sntp_getreachability(0));
// close the SNTP and the fake server
esp_sntp_stop();
// Test some other SNTP APIs
TEST_ASSERT_EQUAL(0, esp_sntp_getreachability(0));
TEST_ASSERT_EQUAL(ESP_SNTP_OPMODE_POLL, esp_sntp_getoperatingmode());
const ip_addr_t *server_ip = esp_sntp_getserver(0);
TEST_ASSERT_EQUAL(PP_HTONL(IPADDR_LOOPBACK), server_ip->u_addr.ip4.addr);
close(sock);
}

View File

@ -253,8 +253,8 @@ You can find a brief introduction to SNTP in general, its initialization code an
This section provides more details about specific use cases of SNTP service, with statically configured servers, or using DHCP provided servers, or both.
The workflow is usually very simple:
1) Initialize and configure the service using :cpp:func:`esp_netif_sntp_init()`.
2) Start the service via :cpp:func:`esp_netif_sntp_start()`. This step is not needed if we auto-started the service in the previous step (default). It's useful to start the service explicitly after connecting, if we want to use DHCP obtained NTP servers. (This option needs to be enabled before connecting, but SNTP service should be started after)
1) Initialize and configure the service using :cpp:func:`esp_netif_sntp_init()`. This operations can only be called once (unless the SNTP service has been destroyed by :cpp:func:`esp_netif_sntp_deinit()`)
2) Start the service via :cpp:func:`esp_netif_sntp_start()`. This step is not needed if we auto-started the service in the previous step (default). It is useful to start the service explicitly after connecting if we want to use the DHCP-obtained NTP servers. Please note, this option needs to be enabled before connecting, but the SNTP service should be started after.
3) Wait for the system time to synchronize using :cpp:func:`esp_netif_sntp_sync_wait()` (only if needed).
4) Stop and destroy the service using :cpp:func:`esp_netif_sntp_deinit()`.