/* Ping using the socket ip */ static err_t 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; LWIP_ASSERT("ping_size is too big", ping_size <= 0xffff); iecho = (struct icmp_echo_hdr *)mem_malloc((mem_size_t)ping_size); if (!iecho) { return ERR_MEM; } ping_prepare_echo(iecho, (u16_t)ping_size); to.sin_len = sizeof(to); to.sin_family = AF_INET; inet_addr_from_ipaddr(&to.sin_addr, addr); err = lwip_sendto(s, iecho, ping_size, 0, (struct sockaddr*)&to, sizeof(to)); mem_free(iecho); return (err ? ERR_OK : ERR_VAL); }
static void ping_send(struct raw_pcb *raw, ip_addr_t *addr) { struct pbuf *p; struct icmp_echo_hdr *iecho; size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE; LWIP_DEBUGF( PING_DEBUG, ("ping: send ")); ip_addr_debug_print(PING_DEBUG, addr); LWIP_DEBUGF( PING_DEBUG, ("\n")); LWIP_ASSERT("ping_size <= 0xffff", ping_size <= 0xffff); p = pbuf_alloc(PBUF_IP, (u16_t)ping_size, PBUF_RAM); if (!p) { return; } if ((p->len == p->tot_len) && (p->next == NULL)) { iecho = (struct icmp_echo_hdr *)p->payload; ping_prepare_echo(iecho, (u16_t)ping_size); raw_sendto(raw, p, addr); ping_time = sys_now(); } pbuf_free(p); }
static void ping_send(struct raw_pcb *raw, struct ping_info_t* ping_info) { struct pbuf *p; struct icmp_echo_hdr *iecho; if (!(p = pbuf_alloc(PBUF_IP, ping_info->size, PBUF_RAM))) { return; } if ((p->len == p->tot_len) && (p->next == NULL)) { iecho = p->payload; ping_prepare_echo(iecho, ping_info); raw_sendto(raw, p, &ping_info->destination); if (!ping_info->first_tx_tm) ping_info->first_tx_tm = timer_get_ms(); ping_info->last_tx_tm = timer_get_ms(); ping_info->num_tx++; } pbuf_free(p); }