esp_ping.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. ip4_addr_t ping_target;
  18. uint32_t ping_count;
  19. uint32_t ping_rcv_timeout;
  20. uint32_t ping_delay;
  21. uint16_t ping_id;
  22. esp_ping_found_fn ping_res_fn;
  23. esp_ping_found ping_res;
  24. void *ping_reserve;
  25. } ping_option;
  26. static ping_option ping_option_info[1];
  27. esp_err_t esp_ping_set_target(ping_target_id_t opt_id, void *opt_val, uint32_t opt_len)
  28. {
  29. esp_err_t ret = ESP_OK;
  30. if (opt_val == NULL) {
  31. return ESP_ERR_PING_INVALID_PARAMS;
  32. }
  33. switch (opt_id) {
  34. case PING_TARGET_IP_ADDRESS:
  35. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  36. ping_option_info->ping_target.addr = *(uint32_t *)opt_val;
  37. break;
  38. case PING_TARGET_IP_ADDRESS_COUNT:
  39. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  40. ping_option_info->ping_count = *(uint32_t *)opt_val;
  41. break;
  42. case PING_TARGET_RCV_TIMEO:
  43. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  44. ping_option_info->ping_rcv_timeout = (*(uint32_t *)opt_val) * 1000;
  45. break;
  46. case PING_TARGET_DELAY_TIME:
  47. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  48. ping_option_info->ping_delay = (*(uint32_t *)opt_val) * 1000;
  49. break;
  50. case PING_TARGET_ID:
  51. ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
  52. ping_option_info->ping_id = *(uint16_t *)opt_val;
  53. break;
  54. case PING_TARGET_RES_FN:
  55. ping_option_info->ping_res_fn = opt_val;
  56. break;
  57. default:
  58. ret = ESP_ERR_PING_INVALID_PARAMS;
  59. break;
  60. }
  61. return ret;
  62. }
  63. esp_err_t esp_ping_get_target(ping_target_id_t opt_id, void *opt_val, uint32_t opt_len)
  64. {
  65. esp_err_t ret = ESP_OK;
  66. if (opt_val == NULL) {
  67. return ESP_ERR_PING_INVALID_PARAMS;
  68. }
  69. switch (opt_id) {
  70. case PING_TARGET_IP_ADDRESS:
  71. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  72. *(uint32_t *)opt_val = ping_option_info->ping_target.addr;
  73. break;
  74. case PING_TARGET_IP_ADDRESS_COUNT:
  75. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  76. *(uint32_t *)opt_val = ping_option_info->ping_count;
  77. break;
  78. case PING_TARGET_RCV_TIMEO:
  79. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  80. *(uint32_t *)opt_val = ping_option_info->ping_rcv_timeout;
  81. break;
  82. case PING_TARGET_DELAY_TIME:
  83. ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
  84. *(uint32_t *)opt_val = ping_option_info->ping_delay;
  85. break;
  86. case PING_TARGET_ID:
  87. ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
  88. *(uint16_t *)opt_val = ping_option_info->ping_id;
  89. break;
  90. default:
  91. ret = ESP_ERR_PING_INVALID_PARAMS;
  92. break;
  93. }
  94. return ret;
  95. }
  96. esp_err_t esp_ping_result(uint8_t res_val, uint16_t ping_len, uint32_t ping_time)
  97. {
  98. esp_err_t ret = ESP_OK;
  99. ping_option_info->ping_res.bytes = ping_len;
  100. ping_option_info->ping_res.ping_err = res_val;
  101. ping_option_info->ping_res.resp_time = ping_time;
  102. ping_option_info->ping_res.total_time += ping_time;
  103. ping_option_info->ping_res.total_bytes += ping_len;
  104. if (res_val == 0) {
  105. ping_option_info->ping_res.timeout_count ++;
  106. }
  107. if (--ping_option_info->ping_count != 0 && ping_option_info->ping_res_fn) {
  108. ping_option_info->ping_res_fn(PING_TARGET_RES_FN, &ping_option_info->ping_res);
  109. } else {
  110. memset(&ping_option_info->ping_res, 0, sizeof(esp_ping_found));
  111. }
  112. return ret;
  113. }