Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mistake in the ICMP Echo documentation (IDFGH-2563) #4648

Closed
nopnop2002 opened this issue Jan 20, 2020 · 7 comments
Closed

mistake in the ICMP Echo documentation (IDFGH-2563) #4648

nopnop2002 opened this issue Jan 20, 2020 · 7 comments
Assignees

Comments

@nopnop2002
Copy link

nopnop2002 commented Jan 20, 2020

I found a mistake in the ICMP Echo documentation.
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/protocols/icmp_echo.html

Error:

void initialize_ping()
{
    /* convert URL to IP address */
    getaddrinfo("www.espressif.com", NULL, &hint, &res) == 0);
    struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr;
    inet_addr_to_ip4addr(ip_2_ip4(&target_addr), &addr4);
    freeaddrinfo(res);

    esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
    ping_config.target_addr = target_addr;          // target IP address
    ping_config.count = ESP_PING_COUNT_INFINITE;    // ping in infinite mode, esp_ping_stop can stop it

    /* set callback functions */
    esp_ping_callbacks_t cbs;
    cbs.on_ping_success = test_on_ping_success;
    cbs.on_ping_timeout = test_on_ping_timeout;
    cbs.on_ping_end = test_on_ping_end;
    cbs.cb_args = "foo";  // arguments that will feed to all callback functions, can be NULL
    cbs.cb_args = eth_event_group;

    esp_ping_handle_t ping;
    esp_ping_new_session(&ping_config, &cbs, &ping);
}

Correct:

void initialize_ping()
{
    /* convert URL to IP address */
    ip_addr_t target_addr;
    struct addrinfo hint;
    struct addrinfo *res = NULL;
    getaddrinfo("www.espressif.com", NULL, &hint, &res);
    struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr;
    inet_addr_to_ip4addr(ip_2_ip4(&target_addr), &addr4);
    freeaddrinfo(res);

    esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
    ping_config.target_addr = target_addr;          // target IP address
    ping_config.count = ESP_PING_COUNT_INFINITE;    // ping in infinite mode, esp_ping_stop can stop it

    /* set callback functions */
    esp_ping_callbacks_t cbs = {
        .on_ping_success = cmd_ping_on_ping_success,
        .on_ping_timeout = cmd_ping_on_ping_timeout,
        .on_ping_end = cmd_ping_on_ping_end,
        .cb_args = NULL
    };
    esp_ping_handle_t ping;
    esp_ping_new_session(&ping_config, &cbs, &ping);
    esp_ping_start(ping);
}
@github-actions github-actions bot changed the title mistake in the ICMP Echo documentation mistake in the ICMP Echo documentation (IDFGH-2563) Jan 20, 2020
@suda-morris
Copy link
Collaborator

@nopnop2002 Well spotted! Thank you.

@suda-morris suda-morris self-assigned this Jan 20, 2020
@nopnop2002
Copy link
Author

@suda-morris
Is this related to this issue? ?
#4479 (comment)

@suda-morris
Copy link
Collaborator

@nopnop2002 Nope.

@nopnop2002
Copy link
Author

nopnop2002 commented Jan 20, 2020

OK
Please check anker of this document.

WiFi Station: examples/wifi/getting_started/station/main/station_example_main.c
WiFi Access Point: examples/wifi/getting_started/softAP/main/softap_example_main.c
Ethernet examples/ethernet/basic/main/ethernet_example_main.c

@nopnop2002
Copy link
Author

nopnop2002 commented Jan 20, 2020

I tested initialize_ping().

My environment:

freeRTOS version:V8.2.0
NEWLIB version:3.0.0
lwIP version:2-1-3-0
ESP-IDF version:v4.1-dev-1935-g647cb628a

Case 1
hint variables are not initialized.

void initialize_ping()
{
    /* convert URL to IP address */
    ip_addr_t target_addr;
#if 1
    struct addrinfo hint;
#else
    const struct addrinfo hint = {
        .ai_family = AF_INET,
        .ai_socktype = SOCK_STREAM,
    };
#endif
    struct addrinfo *res = NULL;
    int err = getaddrinfo("www.espressif.com", NULL, &hint, &res);
    if(err != 0 || res == NULL) {
        ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
        return;
    } else {
        ESP_LOGI(TAG, "DNS lookup success");
    }

    //struct in_addr addr4 = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
    struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr;

    inet_addr_to_ip4addr(ip_2_ip4(&target_addr), &addr4);
    freeaddrinfo(res);
    ESP_LOGI(TAG, "target_addr.type=%d", target_addr.type);
    ESP_LOGI(TAG, "target_addr=%s", ip4addr_ntoa(&(target_addr.u_addr.ip4)));

    esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
    ping_config.target_addr = target_addr;          // target IP address
    ping_config.count = ESP_PING_COUNT_INFINITE;    // ping in infinite mode, esp_ping_stop can stop it

    /* set callback functions */
    esp_ping_callbacks_t cbs = {
        .on_ping_success = cmd_ping_on_ping_success,
        .on_ping_timeout = cmd_ping_on_ping_timeout,
        .on_ping_end = cmd_ping_on_ping_end,
        .cb_args = NULL
    };
    esp_ping_handle_t ping;
    esp_ping_new_session(&ping_config, &cbs, &ping);
    esp_ping_start(ping);
}

I got this error.

E (2612) wifi station: DNS lookup failed err=204 res=0x0

Case 2
hint variables are initialized.

void initialize_ping()
{
    /* convert URL to IP address */
    ip_addr_t target_addr;
#if 0
    struct addrinfo hint;
#else
    const struct addrinfo hint = {
        .ai_family = AF_INET,
        .ai_socktype = SOCK_STREAM,
    };
#endif
    struct addrinfo *res = NULL;
    int err = getaddrinfo("www.espressif.com", NULL, &hint, &res);
    if(err != 0 || res == NULL) {
        ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
        return;
    } else {
        ESP_LOGI(TAG, "DNS lookup success");
    }

    //struct in_addr addr4 = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
    struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr;

    inet_addr_to_ip4addr(ip_2_ip4(&target_addr), &addr4);
    freeaddrinfo(res);
    ESP_LOGI(TAG, "target_addr.type=%d", target_addr.type);
    ESP_LOGI(TAG, "target_addr=%s", ip4addr_ntoa(&(target_addr.u_addr.ip4)));

    esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
    ping_config.target_addr = target_addr;          // target IP address
    ping_config.count = ESP_PING_COUNT_INFINITE;    // ping in infinite mode, esp_ping_stop can stop it

    /* set callback functions */
    esp_ping_callbacks_t cbs = {
        .on_ping_success = cmd_ping_on_ping_success,
        .on_ping_timeout = cmd_ping_on_ping_timeout,
        .on_ping_end = cmd_ping_on_ping_end,
        .cb_args = NULL
    };
    esp_ping_handle_t ping;
    esp_ping_new_session(&ping_config, &cbs, &ping);
    esp_ping_start(ping);
}

I got this error:

I (4181) wifi station: DNS lookup success
I (4181) wifi station: target_addr.type=80
I (4181) wifi station: target_addr=119.9.92.99
lwip_sendto: invalid address
E (4191) ping_sock: send error=0
From 119.9.92.99 icmp_seq=1 timeout
lwip_sendto: invalid address
E (5191) ping_sock: send error=0
From 119.9.92.99 icmp_seq=2 timeout
lwip_sendto: invalid address
E (6191) ping_sock: send error=0
From 119.9.92.99 icmp_seq=3 timeout
lwip_sendto: invalid address
E (7191) ping_sock: send error=0

Finaly

void initialize_ping()
{
    /* convert URL to IP address */
    ip_addr_t target_addr;
    memset(&target_addr, 0, sizeof(target_addr));
    struct addrinfo hint;
    memset(&hint, 0, sizeof(hint));
    struct addrinfo *res = NULL;
    int err = getaddrinfo("www.espressif.com", NULL, &hint, &res);
    if(err != 0 || res == NULL) {
        ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
        return;
    } else {
        ESP_LOGI(TAG, "DNS lookup success");
    }

   if (res->ai_family == AF_INET) {
        struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr;
        inet_addr_to_ip4addr(ip_2_ip4(&target_addr), &addr4);
    } else {
        struct in6_addr addr6 = ((struct sockaddr_in6 *) (res->ai_addr))->sin6_addr;
        inet6_addr_to_ip6addr(ip_2_ip6(&target_addr), &addr6);
    }
    freeaddrinfo(res);
    ESP_LOGI(TAG, "target_addr.type=%d", target_addr.type);
    ESP_LOGI(TAG, "target_addr=%s", ip4addr_ntoa(&(target_addr.u_addr.ip4)));

    esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
    ping_config.target_addr = target_addr;          // target IP address

    ping_config.count = ESP_PING_COUNT_INFINITE;    // ping in infinite mode, esp_ping_stop can stop it

    /* set callback functions */
    esp_ping_callbacks_t cbs = {
        .on_ping_success = cmd_ping_on_ping_success,
        .on_ping_timeout = cmd_ping_on_ping_timeout,
        .on_ping_end = cmd_ping_on_ping_end,
        .cb_args = NULL
    };
    esp_ping_handle_t ping;
    esp_ping_new_session(&ping_config, &cbs, &ping);
    esp_ping_start(ping);
    ESP_LOGI(TAG, "esp_ping_start");
}

It' work fine.

64 bytes from 119.9.92.99 icmp_seq=36 ttl=51 time=201 ms
64 bytes from 119.9.92.99 icmp_seq=37 ttl=51 time=206 ms
64 bytes from 119.9.92.99 icmp_seq=38 ttl=51 time=618 ms
From 119.9.92.99 icmp_seq=39 timeout
64 bytes from 119.9.92.99 icmp_seq=40 ttl=51 time=175 ms
64 bytes from 119.9.92.99 icmp_seq=41 ttl=51 time=110 ms
From 119.9.92.99 icmp_seq=42 timeout

Maybe these examples also need modification.

-example/protocols/http_request
-example/system/select

@suda-morris
Copy link
Collaborator

Thanks @nopnop2002 for your detailed experiment. We will fix the broken link ASAP.

@nopnop2002
Copy link
Author

nopnop2002 commented Jan 20, 2020

I have one more question.
What is ping_config.count ??

According to the documentation:
struct esp_ping_config_t
uint32_t count
A “ping” session contains count procedures

I can't understand.

(EDIT1)
I understood.

#define ESP_PING_COUNT_INFINITE (0) /*!< Set ping count to zero will ping target infinitely */

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants