int ping_xmit (PING *p) { int i, buflen; if (_ping_setbuf (p)) return -1; buflen = _ping_packetsize (p); /* Mark sequence number as sent */ _PING_CLR (p, p->ping_num_xmit % p->ping_cktab_size); /* Encode ICMP header */ switch (p->ping_type) { case ICMP_ECHO: icmp_echo_encode (p->ping_buffer, buflen, p->ping_ident, p->ping_num_xmit); break; case ICMP_TIMESTAMP: icmp_timestamp_encode (p->ping_buffer, buflen, p->ping_ident, p->ping_num_xmit); break; case ICMP_ADDRESS: icmp_address_encode (p->ping_buffer, buflen, p->ping_ident, p->ping_num_xmit); break; default: icmp_generic_encode (p->ping_buffer, buflen, p->ping_type, p->ping_ident, p->ping_num_xmit); break; } i = sendto (p->ping_fd, (char *)p->ping_buffer, buflen, 0, (struct sockaddr*) &p->ping_dest, sizeof (struct sockaddr_in)); if (i < 0) { perror ("ping: sendto"); } else { p->ping_num_xmit++; if (i != buflen) printf ("ping: wrote %s %d chars, ret=%d\n", p->ping_hostname, buflen, i); } return 0; }
static int ping_xmit (PING * p) { int i, buflen; struct icmp6_hdr *icmp6; if (_ping_setbuf (p, USE_IPV6)) return -1; buflen = p->ping_datalen + sizeof (struct icmp6_hdr); /* Mark sequence number as sent */ _PING_CLR (p, p->ping_num_xmit); icmp6 = (struct icmp6_hdr *) p->ping_buffer; icmp6->icmp6_type = ICMP6_ECHO_REQUEST; icmp6->icmp6_code = 0; /* The checksum will be calculated by the TCP/IP stack. */ icmp6->icmp6_cksum = 0; icmp6->icmp6_id = htons (p->ping_ident); icmp6->icmp6_seq = htons (p->ping_num_xmit); i = sendto (p->ping_fd, (char *) p->ping_buffer, buflen, 0, (struct sockaddr *) &p->ping_dest.ping_sockaddr6, sizeof (p->ping_dest.ping_sockaddr6)); if (i < 0) perror ("ping: sendto"); else { p->ping_num_xmit++; if (i != buflen) printf ("ping: wrote %s %d chars, ret=%d\n", p->ping_hostname, buflen, i); } return 0; }