esp_ping.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #include <string.h>
  14. #include "esp_ping.h"
  15. #include "lwip/ip_addr.h"
  16. typedef struct _ping_option {
  17. ip_addr_t ping_target;
  18. uint32_t ping_count;
  19. uint32_t ping_rcv_timeout;
  20. uint32_t ping_delay;
  21. uint32_t interface;
  22. size_t ping_data_len;
  23. uint16_t ping_id;
  24. u8_t ping_tos;
  25. esp_ping_found_fn ping_res_fn;
  26. esp_ping_found ping_res;
  27. void *ping_reserve;
  28. } ping_option;
  29. static ping_option ping_option_info[1];
  30. esp_err_t esp_ping_set_target(ping_target_id_t opt_id, void *opt_val, uint32_t opt_len)
  31. {
  32. esp_err_t ret = ESP_OK;
  33. if (opt_val == NULL) {
  34. return ESP_ERR_PING_INVALID_PARAMS;
  35. }
  36. switch (opt_id) {
  37. case PING_TARGET_IP_ADDRESS:
  38. ipaddr_aton(opt_val, &(ping_option_info->ping_target));
  39. break;
  40. case PING_TARGET_IP_ADDRESS_COUNT:
  41. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  42. ping_option_info->ping_count = *(uint32_t *)opt_val;
  43. break;
  44. case PING_TARGET_IF_INDEX:
  45. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  46. ping_option_info->interface = *(uint32_t *)opt_val;
  47. break;
  48. case PING_TARGET_RCV_TIMEO:
  49. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  50. ping_option_info->ping_rcv_timeout = (*(uint32_t *)opt_val);
  51. break;
  52. case PING_TARGET_DELAY_TIME:
  53. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  54. ping_option_info->ping_delay = (*(uint32_t *)opt_val);
  55. break;
  56. case PING_TARGET_DATA_LEN:
  57. ESP_PING_CHECK_OPTLEN(opt_len, size_t);
  58. ping_option_info->ping_data_len = (*(size_t *)opt_val);
  59. break;
  60. case PING_TARGET_ID:
  61. ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
  62. ping_option_info->ping_id = *(uint16_t *)opt_val;
  63. break;
  64. case PING_TARGET_IP_TOS:
  65. ESP_PING_CHECK_OPTLEN(opt_len, u8_t);
  66. ping_option_info->ping_tos = *(u8_t *)opt_val;
  67. break;
  68. case PING_TARGET_RES_FN:
  69. ping_option_info->ping_res_fn = opt_val;
  70. break;
  71. case PING_TARGET_RES_RESET:
  72. memset(&ping_option_info->ping_res, 0, sizeof(ping_option_info->ping_res));
  73. break;
  74. default:
  75. ret = ESP_ERR_PING_INVALID_PARAMS;
  76. break;
  77. }
  78. return ret;
  79. }
  80. esp_err_t esp_ping_get_target(ping_target_id_t opt_id, void *opt_val, uint32_t opt_len)
  81. {
  82. esp_err_t ret = ESP_OK;
  83. if (opt_val == NULL) {
  84. return ESP_ERR_PING_INVALID_PARAMS;
  85. }
  86. switch (opt_id) {
  87. case PING_TARGET_IP_ADDRESS:
  88. ip_addr_copy(*(ip_addr_t*)opt_val, ping_option_info->ping_target);
  89. break;
  90. case PING_TARGET_IP_ADDRESS_COUNT:
  91. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  92. *(uint32_t *)opt_val = ping_option_info->ping_count;
  93. break;
  94. case PING_TARGET_IF_INDEX:
  95. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  96. *(uint32_t *)opt_val = ping_option_info->interface;
  97. break;
  98. case PING_TARGET_RCV_TIMEO:
  99. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  100. *(uint32_t *)opt_val = ping_option_info->ping_rcv_timeout;
  101. break;
  102. case PING_TARGET_DELAY_TIME:
  103. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  104. *(uint32_t *)opt_val = ping_option_info->ping_delay;
  105. break;
  106. case PING_TARGET_DATA_LEN:
  107. ESP_PING_CHECK_OPTLEN(opt_len, size_t);
  108. *(size_t *)opt_val = ping_option_info->ping_data_len;
  109. break;
  110. case PING_TARGET_ID:
  111. ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
  112. *(uint16_t *)opt_val = ping_option_info->ping_id;
  113. break;
  114. case PING_TARGET_IP_TOS:
  115. ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
  116. *(uint16_t *)opt_val = ping_option_info->ping_tos;
  117. break;
  118. default:
  119. ret = ESP_ERR_PING_INVALID_PARAMS;
  120. break;
  121. }
  122. return ret;
  123. }
  124. esp_err_t esp_ping_result(uint8_t res_val, uint16_t ping_len, uint32_t ping_time)
  125. {
  126. esp_err_t ret = ESP_OK;
  127. ping_option_info->ping_res.ping_err = res_val;
  128. if (res_val != PING_RES_FINISH) {
  129. ping_option_info->ping_res.bytes = ping_len;
  130. ping_option_info->ping_res.resp_time = ping_time;
  131. ping_option_info->ping_res.total_bytes += ping_len;
  132. ping_option_info->ping_res.send_count ++;
  133. if (res_val == PING_RES_TIMEOUT) {
  134. ping_option_info->ping_res.timeout_count ++;
  135. } else {
  136. if (!ping_option_info->ping_res.min_time || (ping_time < ping_option_info->ping_res.min_time)) {
  137. ping_option_info->ping_res.min_time = ping_time;
  138. }
  139. if (ping_time > ping_option_info->ping_res.max_time) {
  140. ping_option_info->ping_res.max_time = ping_time;
  141. }
  142. ping_option_info->ping_res.total_time += ping_time;
  143. ping_option_info->ping_res.recv_count ++;
  144. }
  145. }
  146. if (ping_option_info->ping_res_fn) {
  147. ping_option_info->ping_res_fn(PING_TARGET_RES_FN, &ping_option_info->ping_res);
  148. if (res_val == PING_RES_FINISH) {
  149. memset(&ping_option_info->ping_res, 0, sizeof(esp_ping_found));
  150. }
  151. }
  152. return ret;
  153. }