--- nemesis-proto_icmp.c.orig	Mon Oct  9 18:28:38 2000
+++ nemesis-proto_icmp.c	Mon Oct  9 18:29:34 2000
@@ -70,7 +70,7 @@ buildicmp()
 				0,	/* IP payload size */
 				pkt + LIBNET_ETH_H);	/* packet header memory */
 
-		if (type == ICMP_ECHOREPLY)	/* type = 0 */
+		if (type == ICMP_ECHOREPLY)	{ /* type = 0 */
 			libnet_build_icmp_echo(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
@@ -78,8 +78,11 @@ buildicmp()
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet memory header */
-
-		if (type == ICMP_UNREACH)	/* type = 3 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_ECHO_H + payload_s);
+		}
+		if (type == ICMP_UNREACH)	{ /* type = 3 */
 			libnet_build_icmp_unreach(type,	/* ICMP type */
 						  code,	/* ICMP code */
 						  0,	/* ICMP original length */
@@ -93,8 +96,12 @@ buildicmp()
 						  payload,	/* ICMP payload pointer */
 						  payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet memory header */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_UNREACH_H + payload_s);
+    }
 
-		if (type == ICMP_REDIRECT)	/* type = 5 */
+		if (type == ICMP_REDIRECT) {	/* type = 5 */
 			libnet_build_icmp_redirect(type,	/* ICMP type */
 						   code,	/* ICMP code */
 						   gwy,	/* preferred gateway */
@@ -109,8 +116,11 @@ buildicmp()
 						   payload,	/* ICMP payload pointer */
 						   payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-
-		if (type == ICMP_ECHO)	/* type = 8 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_REDIRECT_H + payload_s);
+    }
+		if (type == ICMP_ECHO) {	/* type = 8 */
 			libnet_build_icmp_echo(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
@@ -118,7 +128,11 @@ buildicmp()
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-		if (type == ICMP_TIMXCEED)	/* type = 11 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_ECHO_H + payload_s);
+    }
+		if (type == ICMP_TIMXCEED) {	/* type = 11 */
 			libnet_build_icmp_timeexceed(type,	/* ICMP type */
 						     code,	/* ICMP code */
 						     0,	/* ICMP orig length */
@@ -132,7 +146,11 @@ buildicmp()
 						     payload,	/* ICMP payload pointer */
 						     payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-		if (type == ICMP_TSTAMP)	/* type = 13 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_TIMXCEED_H + payload_s);
+    }
+		if (type == ICMP_TSTAMP) {	/* type = 13 */
 			libnet_build_icmp_timestamp(type,	/* ICMP type */
 						    0,	/* ICMP code */
 						    id,	/* ICMP id */
@@ -143,8 +161,11 @@ buildicmp()
 						    payload,	/* ICMP payload pointer */
 						    payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-
-		if (type == ICMP_TSTAMPREPLY)	/* type = 14 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_TS_H + payload_s);
+    }
+		if (type == ICMP_TSTAMPREPLY)	{ /* type = 14 */
 			libnet_build_icmp_timestamp(type,	/* ICMP type */
 						    0,	/* ICMP code */
 						    id,	/* ICMP id */
@@ -155,7 +176,11 @@ buildicmp()
 						    payload,	/* ICMP payload pointer */
 						    payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-		if (type == ICMP_MASKREQ)	/* type = 17 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_TS_H + payload_s);
+		}
+		if (type == ICMP_MASKREQ)	{ /* type = 17 */
 			libnet_build_icmp_mask(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
@@ -164,7 +189,11 @@ buildicmp()
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-		if (type == ICMP_MASKREPLY)	/* type = 18 */
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+      libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+        LIBNET_ICMP_MASK_H + payload_s);
+		}
+		if (type == ICMP_MASKREPLY)	{ /* type = 18 */
 			libnet_build_icmp_mask(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
@@ -173,10 +202,10 @@ buildicmp()
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
 					  pkt + LIBNET_ETH_H + LIBNET_IP_H);	/* packet header memory */
-
-		libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
-		libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP, ICMP_S +
-			payload_s);
+			libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+			libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+				LIBNET_ICMP_MASK_H + payload_s);
+		}
 		memcpy(ipopt.ipopt_list, options, option_s);
 		*(ipopt.ipopt_list) = IPOPT_SECURITY;
 		*(ipopt.ipopt_list + 1) = 1;
@@ -211,16 +240,17 @@ buildicmp()
 				0,	/* IP payload size */
 				pkt);	/* packet header memory */
 
-		if (type == ICMP_ECHOREPLY)	/* type = 0 */
+		if (type == ICMP_ECHOREPLY)	{ /* type = 0 */
 			libnet_build_icmp_echo(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
 					       seq,	/* sequence number */
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
-					       pkt + IP_H);	/* packet memory header */
-
-		if (type == ICMP_UNREACH)	/* type = 3 */
+					       pkt + LIBNET_IP_H);	/* packet memory header */
+			libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_ECHO_H + payload_s);
+		}
+		if (type == ICMP_UNREACH)	{ /* type = 3 */
 			libnet_build_icmp_unreach(type,	/* ICMP type */
 						  code,	/* ICMP code */
 						  0,	/* ICMP original length */
@@ -233,9 +263,10 @@ buildicmp()
 						  source,	/* source address */
 						  payload,	/* ICMP payload pointer */
 						  payload_s,	/* ICMP payload size */
-						  pkt + IP_H);	/* packet memory header */
-
-		if (type == ICMP_REDIRECT)	/* type = 5 */
+						  pkt + LIBNET_IP_H);	/* packet memory header */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_UNREACH_H + payload_s);
+		}
+		if (type == ICMP_REDIRECT) {	/* type = 5 */
 			libnet_build_icmp_redirect(type,	/* ICMP type */
 						   code,	/* ICMP code */
 						   gwy,	/* preferred gateway */
@@ -249,18 +280,21 @@ buildicmp()
 						   source,	/* source address */
 						   payload,	/* ICMP payload pointer */
 						   payload_s,	/* ICMP payload size */
-						   pkt + IP_H);	/* packet header memory */
-
-		if (type == ICMP_ECHO)	/* type = 8 */
+						   pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_REDIRECT_H + payload_s);
+		}
+		if (type == ICMP_ECHO) {	/* type = 8 */
 			libnet_build_icmp_echo(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
 					       seq,	/* sequence number */
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
-					       pkt + IP_H);	/* packet header memory */
+					       pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_ECHO_H + payload_s);
 
-		if (type == ICMP_TIMXCEED)	/* type = 11 */
+		}
+		if (type == ICMP_TIMXCEED) {	/* type = 11 */
 			libnet_build_icmp_timeexceed(type,	/* ICMP type */
 						     code,	/* ICMP code */
 						     0,	/* ICMP orig length */
@@ -273,9 +307,10 @@ buildicmp()
 						     source,	/* source address */
 						     payload,	/* ICMP payload pointer */
 						     payload_s,	/* ICMP payload size */
-						     pkt + IP_H);	/* packet header memory */
-
-		if (type == ICMP_TSTAMP)	/* type = 13 */
+						     pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TIMXCEED_H + payload_s);
+		}
+		if (type == ICMP_TSTAMP) {	/* type = 13 */
 			libnet_build_icmp_timestamp(type,	/* ICMP type */
 						    0,	/* ICMP code */
 						    id,	/* ICMP id */
@@ -285,9 +320,10 @@ buildicmp()
 						    0,	/* transmit timestamp */
 						    payload,	/* ICMP payload pointer */
 						    payload_s,	/* ICMP payload size */
-						    pkt + IP_H);	/* packet header memory */
-
-		if (type == ICMP_TSTAMPREPLY)	/* type = 14 */
+						    pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TS_H + payload_s);
+		}
+		if (type == ICMP_TSTAMPREPLY)	{ /* type = 14 */
 			libnet_build_icmp_timestamp(type,	/* ICMP type */
 						    0,	/* ICMP code */
 						    id,	/* ICMP id */
@@ -297,9 +333,10 @@ buildicmp()
 						    ttime,	/* transmit timestamp */
 						    payload,	/* ICMP payload pointer */
 						    payload_s,	/* ICMP payload size */
-						    pkt + IP_H);	/* packet header memory */
-
-		if (type == ICMP_MASKREQ)	/* type = 17 */
+						    pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TS_H + payload_s);
+		}
+		if (type == ICMP_MASKREQ)	{ /* type = 17 */
 			libnet_build_icmp_mask(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
@@ -307,9 +344,10 @@ buildicmp()
 					       mask,	/* address mask */
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
-					       pkt + IP_H);	/* packet header memory */
-
-		if (type == ICMP_MASKREPLY)	/* type = 18 */
+					       pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_MASK_H + payload_s);
+		}
+		if (type == ICMP_MASKREPLY)	{ /* type = 18 */
 			libnet_build_icmp_mask(type,	/* ICMP type */
 					       0,	/* ICMP code */
 					       id,	/* ICMP id */
@@ -317,10 +355,9 @@ buildicmp()
 					       mask,	/* address mask */
 					       payload,	/* ICMP payload pointer */
 					       payload_s,	/* ICMP payload size */
-					       pkt + IP_H);	/* packet header memory */
-
-		libnet_do_checksum(pkt, IPPROTO_ICMP, ICMP_H + IP_H + payload_s);
-
+					       pkt + LIBNET_IP_H);	/* packet header memory */
+      libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_MASK_H + payload_s);
+		}
 		memcpy(ipopt.ipopt_list, options, option_s);
 		*(ipopt.ipopt_list) = IPOPT_SECURITY;
 		*(ipopt.ipopt_list + 1) = 1;
