summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--plugins-root/check_icmp.c24
2 files changed, 14 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index 414ec679..a20dbbef 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ This file documents the major additions and syntax changes between releases.
5 FIXES 5 FIXES
6 Fix check_ircd binding to wrong interface (#668778) 6 Fix check_ircd binding to wrong interface (#668778)
7 Add proxy-authorization option to check_http (Marcel Kuiper - #1323230, Bryan Irvine - #2863925) 7 Add proxy-authorization option to check_http (Marcel Kuiper - #1323230, Bryan Irvine - #2863925)
8 check_icmp now increment the sequence counter in each packet
8 WARNINGS 9 WARNINGS
9 Updated developer documentation to say that performance labels should not have an equals sign or 10 Updated developer documentation to say that performance labels should not have an equals sign or
10 single quote in the label 11 single quote in the label
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
index cba7c440..1dde4478 100644
--- a/plugins-root/check_icmp.c
+++ b/plugins-root/check_icmp.c
@@ -333,14 +333,14 @@ handle_random_icmp(unsigned char *packet, struct sockaddr_in *addr)
333 * to RFC 792). If it isn't, just ignore it */ 333 * to RFC 792). If it isn't, just ignore it */
334 memcpy(&sent_icmp, packet + 28, sizeof(sent_icmp)); 334 memcpy(&sent_icmp, packet + 28, sizeof(sent_icmp));
335 if(sent_icmp.icmp_type != ICMP_ECHO || sent_icmp.icmp_id != pid || 335 if(sent_icmp.icmp_type != ICMP_ECHO || sent_icmp.icmp_id != pid ||
336 sent_icmp.icmp_seq >= targets) 336 sent_icmp.icmp_seq >= targets*packets)
337 { 337 {
338 if(debug) printf("Packet is no response to a packet we sent\n"); 338 if(debug) printf("Packet is no response to a packet we sent\n");
339 return 0; 339 return 0;
340 } 340 }
341 341
342 /* it is indeed a response for us */ 342 /* it is indeed a response for us */
343 host = table[sent_icmp.icmp_seq]; 343 host = table[sent_icmp.icmp_seq/packets];
344 if(debug) { 344 if(debug) {
345 printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n", 345 printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n",
346 get_icmp_error_msg(p.icmp_type, p.icmp_code), 346 get_icmp_error_msg(p.icmp_type, p.icmp_code),
@@ -624,7 +624,7 @@ main(int argc, char **argv)
624 table = malloc(sizeof(struct rta_host **) * (argc - 1)); 624 table = malloc(sizeof(struct rta_host **) * (argc - 1));
625 i = 0; 625 i = 0;
626 while(host) { 626 while(host) {
627 host->id = i; 627 host->id = i*packets;
628 table[i] = host; 628 table[i] = host;
629 host = host->next; 629 host = host->next;
630 i++; 630 i++;
@@ -763,12 +763,7 @@ wait_for_reply(int sock, u_int t)
763 /* check the response */ 763 /* check the response */
764 memcpy(&icp, buf + hlen, sizeof(icp)); 764 memcpy(&icp, buf + hlen, sizeof(icp));
765 765
766 if(icp.icmp_id != pid) { 766 if(icp.icmp_id != pid || icp.icmp_type != ICMP_ECHOREPLY || icp.icmp_seq >= targets*packets) {
767 handle_random_icmp(buf + hlen, &resp_addr);
768 continue;
769 }
770
771 if(icp.icmp_type != ICMP_ECHOREPLY || icp.icmp_seq >= targets) {
772 if(debug > 2) printf("not a proper ICMP_ECHOREPLY\n"); 767 if(debug > 2) printf("not a proper ICMP_ECHOREPLY\n");
773 handle_random_icmp(buf + hlen, &resp_addr); 768 handle_random_icmp(buf + hlen, &resp_addr);
774 continue; 769 continue;
@@ -776,8 +771,11 @@ wait_for_reply(int sock, u_int t)
776 771
777 /* this is indeed a valid response */ 772 /* this is indeed a valid response */
778 memcpy(&data, icp.icmp_data, sizeof(data)); 773 memcpy(&data, icp.icmp_data, sizeof(data));
774 if (debug > 2)
775 printf("ICMP echo-reply of len %u, id %u, seq %u, cksum 0x%X\n",
776 sizeof(data), icp.icmp_id, icp.icmp_seq, icp.icmp_cksum);
779 777
780 host = table[icp.icmp_seq]; 778 host = table[icp.icmp_seq/packets];
781 gettimeofday(&now, &tz); 779 gettimeofday(&now, &tz);
782 tdiff = get_timevaldiff(&data.stime, &now); 780 tdiff = get_timevaldiff(&data.stime, &now);
783 781
@@ -848,9 +846,13 @@ send_icmp_ping(int sock, struct rta_host *host)
848 packet.icp->icmp_code = 0; 846 packet.icp->icmp_code = 0;
849 packet.icp->icmp_cksum = 0; 847 packet.icp->icmp_cksum = 0;
850 packet.icp->icmp_id = pid; 848 packet.icp->icmp_id = pid;
851 packet.icp->icmp_seq = host->id; 849 packet.icp->icmp_seq = host->id++;
852 packet.icp->icmp_cksum = icmp_checksum(packet.cksum_in, icmp_pkt_size); 850 packet.icp->icmp_cksum = icmp_checksum(packet.cksum_in, icmp_pkt_size);
853 851
852 if (debug > 2)
853 printf("Sending ICMP echo-request of len %u, id %u, seq %u, cksum 0x%X to host %s\n",
854 sizeof(data), packet.icp->icmp_id, packet.icp->icmp_seq, packet.icp->icmp_cksum, host->name);
855
854 len = sendto(sock, packet.buf, icmp_pkt_size, 0, (struct sockaddr *)addr, 856 len = sendto(sock, packet.buf, icmp_pkt_size, 0, (struct sockaddr *)addr,
855 sizeof(struct sockaddr)); 857 sizeof(struct sockaddr));
856 858