Select one of the symbols to view example projects that use it.
 
Outline
#include <stdio.h>
#include <string.h>
#include "sdkconfig.h"
#include "lwip/inet.h"
#include "lwip/netdb.h"
#include "lwip/sockets.h"
#include "esp_console.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "argtable3/argtable3.h"
#include "protocol_examples_common.h"
#include "ping/ping_sock.h"
#include "esp_check.h"
TAG
cmd_ping_on_ping_success(esp_ping_handle_t, void *)
cmd_ping_on_ping_timeout(esp_ping_handle_t, void *)
cmd_ping_on_ping_end(esp_ping_handle_t, void *)
ping_args
do_ping_cmd(int, char **)
register_ping()
s_repl
do_cmd_quit(int, char **)
register_quit()
app_main()
Files
loading...
SourceVuESP-IDF Framework and Examplesicmp_echo samplemain/echo_example_main.c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* ICMP echo example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *//* ... */ #include <stdio.h> #include <string.h> #include "sdkconfig.h" #include "lwip/inet.h" #include "lwip/netdb.h" #include "lwip/sockets.h" #include "esp_console.h" #include "esp_event.h" #include "nvs_flash.h" #include "argtable3/argtable3.h" #include "protocol_examples_common.h" #include "ping/ping_sock.h" #include "esp_check.h"13 includes const static char *TAG = "echo_example"; static void cmd_ping_on_ping_success(esp_ping_handle_t hdl, void *args) { uint8_t ttl; uint16_t seqno; uint32_t elapsed_time, recv_len; ip_addr_t target_addr; esp_ping_get_profile(hdl, ESP_PING_PROF_SEQNO, &seqno, sizeof(seqno)); esp_ping_get_profile(hdl, ESP_PING_PROF_TTL, &ttl, sizeof(ttl)); esp_ping_get_profile(hdl, ESP_PING_PROF_IPADDR, &target_addr, sizeof(target_addr)); esp_ping_get_profile(hdl, ESP_PING_PROF_SIZE, &recv_len, sizeof(recv_len)); esp_ping_get_profile(hdl, ESP_PING_PROF_TIMEGAP, &elapsed_time, sizeof(elapsed_time)); printf("%" PRIu32 " bytes from %s icmp_seq=%" PRIu16 " ttl=%" PRIu16 " time=%" PRIu32 " ms\n", recv_len, ipaddr_ntoa((ip_addr_t*)&target_addr), seqno, ttl, elapsed_time); }{ ... } static void cmd_ping_on_ping_timeout(esp_ping_handle_t hdl, void *args) { uint16_t seqno; ip_addr_t target_addr; esp_ping_get_profile(hdl, ESP_PING_PROF_SEQNO, &seqno, sizeof(seqno)); esp_ping_get_profile(hdl, ESP_PING_PROF_IPADDR, &target_addr, sizeof(target_addr)); printf("From %s icmp_seq=%d timeout\n",ipaddr_ntoa((ip_addr_t*)&target_addr), seqno); }{ ... } static void cmd_ping_on_ping_end(esp_ping_handle_t hdl, void *args) { ip_addr_t target_addr; uint32_t transmitted; uint32_t received; uint32_t total_time_ms; uint32_t loss; esp_ping_get_profile(hdl, ESP_PING_PROF_REQUEST, &transmitted, sizeof(transmitted)); esp_ping_get_profile(hdl, ESP_PING_PROF_REPLY, &received, sizeof(received)); esp_ping_get_profile(hdl, ESP_PING_PROF_IPADDR, &target_addr, sizeof(target_addr)); esp_ping_get_profile(hdl, ESP_PING_PROF_DURATION, &total_time_ms, sizeof(total_time_ms)); if (transmitted > 0) { loss = (uint32_t)((1 - ((float)received) / transmitted) * 100); }{...} else { loss = 0; }{...} #ifdef CONFIG_LWIP_IPV4 if (IP_IS_V4(&target_addr)) { printf("\n--- %s ping statistics ---\n", inet_ntoa(*ip_2_ip4(&target_addr))); }{...} #endif/* ... */ #ifdef CONFIG_LWIP_IPV6 if (IP_IS_V6(&target_addr)) { printf("\n--- %s ping statistics ---\n", inet6_ntoa(*ip_2_ip6(&target_addr))); }{...} #endif/* ... */ printf("%" PRIu32 " packets transmitted, %" PRIu32 " received, %" PRIu32 "%% packet loss, time %" PRIu32 "ms\n", transmitted, received, loss, total_time_ms); // delete the ping sessions, so that we clean up all resources and can create a new ping session // we don't have to call delete function in the callback, instead we can call delete function from other tasks esp_ping_delete_session(hdl); }{ ... } static struct { struct arg_dbl *timeout; struct arg_dbl *interval; struct arg_int *data_size; struct arg_int *count; struct arg_int *tos; struct arg_int *ttl; struct arg_int *interface; struct arg_str *host; struct arg_end *end; }{ ... } ping_args; static int do_ping_cmd(int argc, char **argv) { esp_ping_config_t config = ESP_PING_DEFAULT_CONFIG(); int nerrors = arg_parse(argc, argv, (void **)&ping_args); if (nerrors != 0) { arg_print_errors(stderr, ping_args.end, argv[0]); return 1; }{...} if (ping_args.timeout->count > 0) { config.timeout_ms = (uint32_t)(ping_args.timeout->dval[0] * 1000); }{...} if (ping_args.interval->count > 0) { config.interval_ms = (uint32_t)(ping_args.interval->dval[0] * 1000); }{...} if (ping_args.data_size->count > 0) { config.data_size = (uint32_t)(ping_args.data_size->ival[0]); }{...} if (ping_args.count->count > 0) { config.count = (uint32_t)(ping_args.count->ival[0]); }{...} if (ping_args.tos->count > 0) { config.tos = (uint32_t)(ping_args.tos->ival[0]); }{...} if (ping_args.ttl->count > 0) { config.ttl = (uint32_t)(ping_args.ttl->ival[0]); }{...} if (ping_args.interface->count > 0) { config.interface = (uint32_t)(ping_args.interface->ival[0]); }{...} // parse IP address struct sockaddr_in6 sock_addr6; ip_addr_t target_addr; memset(&target_addr, 0, sizeof(target_addr)); if (inet_pton(AF_INET6, ping_args.host->sval[0], &sock_addr6.sin6_addr) == 1) { /* convert ip6 string to ip6 address */ ipaddr_aton(ping_args.host->sval[0], &target_addr); }{...} else { struct addrinfo hint; struct addrinfo *res = NULL; memset(&hint, 0, sizeof(hint)); /* convert ip4 string or hostname to ip4 or ip6 address */ if (getaddrinfo(ping_args.host->sval[0], NULL, &hint, &res) != 0) { printf("ping: unknown host %s\n", ping_args.host->sval[0]); return 1; }{...} #ifdef CONFIG_LWIP_IPV4 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); }{...} #endif/* ... */ #ifdef CONFIG_LWIP_IPV6 if (res->ai_family == AF_INET6) { struct in6_addr addr6 = ((struct sockaddr_in6 *) (res->ai_addr))->sin6_addr; inet6_addr_to_ip6addr(ip_2_ip6(&target_addr), &addr6); }{...} #endif/* ... */ freeaddrinfo(res); }{...} config.target_addr = target_addr; /* set callback functions */ esp_ping_callbacks_t cbs = { .cb_args = NULL, .on_ping_success = cmd_ping_on_ping_success, .on_ping_timeout = cmd_ping_on_ping_timeout, .on_ping_end = cmd_ping_on_ping_end }{...}; esp_ping_handle_t ping; ESP_RETURN_ON_FALSE(esp_ping_new_session(&config, &cbs, &ping) == ESP_OK, -1, TAG, "esp_ping_new_session failed"); ESP_RETURN_ON_FALSE(esp_ping_start(ping) == ESP_OK, -1, TAG, "esp_ping_start() failed"); return 0; }{ ... } static void register_ping(void) { ping_args.timeout = arg_dbl0("W", "timeout", "<t>", "Time to wait for a response, in seconds"); ping_args.interval = arg_dbl0("i", "interval", "<t>", "Wait interval seconds between sending each packet"); ping_args.data_size = arg_int0("s", "size", "<n>", "Specify the number of data bytes to be sent"); ping_args.count = arg_int0("c", "count", "<n>", "Stop after sending count packets"); ping_args.tos = arg_int0("Q", "tos", "<n>", "Set Type of Service related bits in IP datagrams"); ping_args.ttl = arg_int0("T", "ttl", "<n>", "Set Time to Live related bits in IP datagrams"); ping_args.interface = arg_int0("I", "interface", "<n>", "Set Interface number"); ping_args.host = arg_str1(NULL, NULL, "<host>", "Host address"); ping_args.end = arg_end(1); const esp_console_cmd_t ping_cmd = { .command = "ping", .help = "send ICMP ECHO_REQUEST to network hosts", .hint = NULL, .func = &do_ping_cmd, .argtable = &ping_args }{...}; ESP_ERROR_CHECK(esp_console_cmd_register(&ping_cmd)); }{ ... } static esp_console_repl_t *s_repl = NULL; /* handle 'quit' command */ static int do_cmd_quit(int argc, char **argv) { printf("ByeBye\r\n"); s_repl->del(s_repl); return 0; }{ ... } static esp_err_t register_quit(void) { esp_console_cmd_t command = { .command = "quit", .help = "Quit REPL environment", .func = &do_cmd_quit }{...}; return esp_console_cmd_register(&command); }{ ... } void app_main(void) { ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); // install console REPL environment #if CONFIG_ESP_CONSOLE_UART esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &s_repl));/* ... */ #elif CONFIG_ESP_CONSOLE_USB_CDC esp_console_dev_usb_cdc_config_t cdc_config = ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_console_new_repl_usb_cdc(&cdc_config, &repl_config, &s_repl));/* ... */ #elif CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG esp_console_dev_usb_serial_jtag_config_t usbjtag_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&usbjtag_config, &repl_config, &repl));/* ... */ #endif /* Use either WiFi console commands or menuconfig options to connect to WiFi/Ethernet * * Please disable `Provide wifi connect commands` in `Example Connection Configuration` * to connect immediately using configured interface and settings (WiFi/Ethernet). *//* ... */ #if defined(CONFIG_EXAMPLE_PROVIDE_WIFI_CONSOLE_CMD) /* register wifi connect commands */ example_register_wifi_connect_commands();/* ... */ #elif defined(CONFIG_EXAMPLE_CONNECT_WIFI) || defined(CONFIG_EXAMPLE_CONNECT_ETHERNET) /* automatic connection per menuconfig */ ESP_ERROR_CHECK(example_connect());/* ... */ #endif struct ifreq ifr; ESP_ERROR_CHECK(esp_netif_get_netif_impl_name(EXAMPLE_INTERFACE, ifr.ifr_name)); printf("Connected on interface: %s (%d)", ifr.ifr_name, esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE)); /* register command `ping` */ register_ping(); /* register command `quit` */ register_quit(); // start console REPL ESP_ERROR_CHECK(esp_console_start_repl(s_repl)); }{ ... }
Details
Show:
from
Types: Columns:
This file uses the notable symbols shown below. Click anywhere in the file to view more details.