Просмотр исходного кода

Increment per-host sequence in check_icmp

Thomas Guyot-Sionnest 16 лет назад
Родитель
Сommit
c2d9c59dc9
2 измененных файлов с 14 добавлено и 11 удалено
  1. 1 0
      NEWS
  2. 13 11
      plugins-root/check_icmp.c

+ 1 - 0
NEWS

@@ -5,6 +5,7 @@ This file documents the major additions and syntax changes between releases.
 	FIXES
 	FIXES
 	Fix check_ircd binding to wrong interface (#668778)
 	Fix check_ircd binding to wrong interface (#668778)
 	Add proxy-authorization option to check_http (Marcel Kuiper - #1323230, Bryan Irvine - #2863925)
 	Add proxy-authorization option to check_http (Marcel Kuiper - #1323230, Bryan Irvine - #2863925)
+	check_icmp now increment the sequence counter in each packet
 	WARNINGS
 	WARNINGS
 	Updated developer documentation to say that performance labels should not have an equals sign or
 	Updated developer documentation to say that performance labels should not have an equals sign or
 	single quote in the label
 	single quote in the label

+ 13 - 11
plugins-root/check_icmp.c

@@ -333,14 +333,14 @@ handle_random_icmp(unsigned char *packet, struct sockaddr_in *addr)
 	 * to RFC 792). If it isn't, just ignore it */
 	 * to RFC 792). If it isn't, just ignore it */
 	memcpy(&sent_icmp, packet + 28, sizeof(sent_icmp));
 	memcpy(&sent_icmp, packet + 28, sizeof(sent_icmp));
 	if(sent_icmp.icmp_type != ICMP_ECHO || sent_icmp.icmp_id != pid ||
 	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");
 		if(debug) printf("Packet is no response to a packet we sent\n");
 		return 0;
 		return 0;
 	}
 	}
 
 
 	/* it is indeed a response for us */
 	/* it is indeed a response for us */
-	host = table[sent_icmp.icmp_seq];
+	host = table[sent_icmp.icmp_seq/packets];
 	if(debug) {
 	if(debug) {
 		printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n",
 		printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n",
 			   get_icmp_error_msg(p.icmp_type, p.icmp_code),
 			   get_icmp_error_msg(p.icmp_type, p.icmp_code),
@@ -624,7 +624,7 @@ main(int argc, char **argv)
 	table = malloc(sizeof(struct rta_host **) * (argc - 1));
 	table = malloc(sizeof(struct rta_host **) * (argc - 1));
 	i = 0;
 	i = 0;
 	while(host) {
 	while(host) {
-		host->id = i;
+		host->id = i*packets;
 		table[i] = host;
 		table[i] = host;
 		host = host->next;
 		host = host->next;
 		i++;
 		i++;
@@ -763,12 +763,7 @@ wait_for_reply(int sock, u_int t)
 		/* check the response */
 		/* check the response */
 		memcpy(&icp, buf + hlen, sizeof(icp));
 		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");
 			if(debug > 2) printf("not a proper ICMP_ECHOREPLY\n");
 			handle_random_icmp(buf + hlen, &resp_addr);
 			handle_random_icmp(buf + hlen, &resp_addr);
 			continue;
 			continue;
@@ -776,8 +771,11 @@ wait_for_reply(int sock, u_int t)
 
 
 		/* this is indeed a valid response */
 		/* this is indeed a valid response */
 		memcpy(&data, icp.icmp_data, sizeof(data));
 		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);
 		gettimeofday(&now, &tz);
 		tdiff = get_timevaldiff(&data.stime, &now);
 		tdiff = get_timevaldiff(&data.stime, &now);
 
 
@@ -848,9 +846,13 @@ send_icmp_ping(int sock, struct rta_host *host)
 	packet.icp->icmp_code = 0;
 	packet.icp->icmp_code = 0;
 	packet.icp->icmp_cksum = 0;
 	packet.icp->icmp_cksum = 0;
 	packet.icp->icmp_id = pid;
 	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);
 	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,
 	len = sendto(sock, packet.buf, icmp_pkt_size, 0, (struct sockaddr *)addr,
 				 sizeof(struct sockaddr));
 				 sizeof(struct sockaddr));