summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: c3150e6)
raw | patch | inline | side by side (parent: c3150e6)
author | Thomas Guyot-Sionnest <dermoth@aei.ca> | |
Wed, 14 Oct 2009 23:41:20 +0000 (19:41 -0400) | ||
committer | Thomas Guyot-Sionnest <dermoth@aei.ca> | |
Fri, 16 Oct 2009 01:52:18 +0000 (21:52 -0400) |
NEWS | patch | blob | history | |
plugins-root/check_icmp.c | patch | blob | history |
index 414ec679ec329189a90e5656581089878515bfab..a20dbbef5a72483dac43f0853811836443d23a4a 100644 (file)
--- a/NEWS
+++ b/NEWS
FIXES
Fix check_ircd binding to wrong interface (#668778)
Add proxy-authorization option to check_http (Marcel Kuiper - #1323230, Bryan Irvine - #2863925)
+ check_icmp now increment the sequence counter in each packet
WARNINGS
Updated developer documentation to say that performance labels should not have an equals sign or
single quote in the label
index cba7c4400eeb4ae47c6ac8b148abad08aef403da..1dde4478936afc8df47549d1da12da28b2eb40ca 100644 (file)
* to RFC 792). If it isn't, just ignore it */
memcpy(&sent_icmp, packet + 28, sizeof(sent_icmp));
if(sent_icmp.icmp_type != ICMP_ECHO || sent_icmp.icmp_id != pid ||
- sent_icmp.icmp_seq >= targets)
+ sent_icmp.icmp_seq >= targets*packets)
{
if(debug) printf("Packet is no response to a packet we sent\n");
return 0;
}
/* it is indeed a response for us */
- host = table[sent_icmp.icmp_seq];
+ host = table[sent_icmp.icmp_seq/packets];
if(debug) {
printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n",
get_icmp_error_msg(p.icmp_type, p.icmp_code),
table = malloc(sizeof(struct rta_host **) * (argc - 1));
i = 0;
while(host) {
- host->id = i;
+ host->id = i*packets;
table[i] = host;
host = host->next;
i++;
/* check the response */
memcpy(&icp, buf + hlen, sizeof(icp));
- if(icp.icmp_id != pid) {
- handle_random_icmp(buf + hlen, &resp_addr);
- continue;
- }
-
- if(icp.icmp_type != ICMP_ECHOREPLY || icp.icmp_seq >= targets) {
+ if(icp.icmp_id != pid || icp.icmp_type != ICMP_ECHOREPLY || icp.icmp_seq >= targets*packets) {
if(debug > 2) printf("not a proper ICMP_ECHOREPLY\n");
handle_random_icmp(buf + hlen, &resp_addr);
continue;
/* this is indeed a valid response */
memcpy(&data, icp.icmp_data, sizeof(data));
+ if (debug > 2)
+ printf("ICMP echo-reply of len %u, id %u, seq %u, cksum 0x%X\n",
+ sizeof(data), icp.icmp_id, icp.icmp_seq, icp.icmp_cksum);
- host = table[icp.icmp_seq];
+ host = table[icp.icmp_seq/packets];
gettimeofday(&now, &tz);
tdiff = get_timevaldiff(&data.stime, &now);
packet.icp->icmp_code = 0;
packet.icp->icmp_cksum = 0;
packet.icp->icmp_id = pid;
- packet.icp->icmp_seq = host->id;
+ packet.icp->icmp_seq = host->id++;
packet.icp->icmp_cksum = icmp_checksum(packet.cksum_in, icmp_pkt_size);
+ if (debug > 2)
+ printf("Sending ICMP echo-request of len %u, id %u, seq %u, cksum 0x%X to host %s\n",
+ sizeof(data), packet.icp->icmp_id, packet.icp->icmp_seq, packet.icp->icmp_cksum, host->name);
+
len = sendto(sock, packet.buf, icmp_pkt_size, 0, (struct sockaddr *)addr,
sizeof(struct sockaddr));