]> granicus.if.org Git - esp-idf/commitdiff
add ping length and QoS
authorzhangyanjiao <zhangyanjiao@espressif.com>
Thu, 6 Jun 2019 06:28:50 +0000 (14:28 +0800)
committerzhangyanjiao <zhangyanjiao@espressif.com>
Thu, 6 Jun 2019 06:29:42 +0000 (14:29 +0800)
components/lwip/apps/ping/esp_ping.c
components/lwip/apps/ping/esp_ping.h
components/lwip/apps/ping/ping.c

index cae4c866b1f2335b46625f832231a97eddec1042..75b669412d7af4386b84c74197fd2c17665ccc1a 100644 (file)
@@ -22,7 +22,9 @@ typedef struct _ping_option {
     uint32_t ping_count;
     uint32_t ping_rcv_timeout;
     uint32_t ping_delay;
+    size_t ping_data_len;
     uint16_t ping_id;
+    u8_t ping_tos;
     esp_ping_found_fn ping_res_fn;
     esp_ping_found    ping_res;
     void    *ping_reserve;
@@ -55,10 +57,18 @@ esp_err_t esp_ping_set_target(ping_target_id_t opt_id, void *opt_val, uint32_t o
         ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
         ping_option_info->ping_delay = (*(uint32_t *)opt_val);
         break;
+    case PING_TARGET_DATA_LEN:
+        ESP_PING_CHECK_OPTLEN(opt_len, size_t);
+        ping_option_info->ping_data_len = (*(size_t *)opt_val);
+        break;
     case PING_TARGET_ID:
         ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
         ping_option_info->ping_id = *(uint16_t *)opt_val;
         break;
+    case PING_TARGET_IP_TOS:
+        ESP_PING_CHECK_OPTLEN(opt_len, u8_t);
+        ping_option_info->ping_tos = *(u8_t *)opt_val;
+        break;
     case PING_TARGET_RES_FN:
         ping_option_info->ping_res_fn = opt_val;
         break;
@@ -98,10 +108,18 @@ esp_err_t esp_ping_get_target(ping_target_id_t opt_id, void *opt_val, uint32_t o
         ESP_PING_CHECK_OPTLEN(opt_len, uint32_t);
         *(uint32_t *)opt_val = ping_option_info->ping_delay;
         break;
+    case PING_TARGET_DATA_LEN:
+        ESP_PING_CHECK_OPTLEN(opt_len, size_t);
+        *(size_t *)opt_val = ping_option_info->ping_data_len;
+        break;
     case PING_TARGET_ID:
         ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
         *(uint16_t *)opt_val = ping_option_info->ping_id;
         break;
+    case PING_TARGET_IP_TOS:
+        ESP_PING_CHECK_OPTLEN(opt_len, uint16_t);
+        *(uint16_t *)opt_val = ping_option_info->ping_tos;
+        break;
     default:
         ret = ESP_ERR_PING_INVALID_PARAMS;
         break;
index d83c5b367b7260a73e31f1b7009c1e76e4c1d268..399093cbd548706f7739d93618ba2396b53a981c 100644 (file)
@@ -49,7 +49,9 @@ typedef enum {
     PING_TARGET_DELAY_TIME          = 53,   /**< delay time in milliseconds */
     PING_TARGET_ID                  = 54,   /**< identifier */
     PING_TARGET_RES_FN              = 55,   /**< ping result callback function */
-    PING_TARGET_RES_RESET           = 56    /**< ping result statistic reset */
+    PING_TARGET_RES_RESET           = 56,   /**< ping result statistic reset */
+    PING_TARGET_DATA_LEN            = 57,   /**< ping data length*/
+    PING_TARGET_IP_TOS              = 58    /**< ping QOS*/
 } ping_target_id_t;
 
 typedef enum {
index 8799832db68da7211393f466cfe8daa40c34b09c..db6aefa001c9c71e04f88dcaeb1fe18d6c2ceded 100644 (file)
@@ -142,7 +142,21 @@ ping_send(int s, ip_addr_t *addr)
   int err;
   struct icmp_echo_hdr *iecho;
   struct sockaddr_in to;
-  size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
+  size_t ping_size;
+
+#ifdef ESP_PING
+  size_t ping_data_len = 0;
+  esp_ping_get_target(PING_TARGET_DATA_LEN, &ping_data_len, sizeof(ping_data_len));
+
+  if (ping_data_len > 0) {
+    ping_size = sizeof(struct icmp_echo_hdr) + ping_data_len;
+  } else {
+    ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
+  }
+#else
+  ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
+#endif
+
   LWIP_ASSERT("ping_size is too big", ping_size <= 0xffff);
   LWIP_ASSERT("ping: expect IPv4 address", !IP_IS_V6(addr));
 
@@ -262,6 +276,17 @@ ping_thread(void *arg)
   LWIP_ASSERT("setting receive timeout failed", ret == 0);
   LWIP_UNUSED_ARG(ret);
 
+#ifdef ESP_PING
+  int tos = 0;
+  esp_ping_get_target(PING_TARGET_IP_TOS, &tos, sizeof(int));
+  if (tos > 0) {
+    tos <<= 5;
+    ret = setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
+    LWIP_ASSERT("setting IP_TOS failed", ret == 0);
+    LWIP_UNUSED_ARG(ret);
+  }
+#endif
+
   while (1) {
 #ifdef ESP_PING
     if (ping_count_cur++ >= ping_count_max) {