shithub: riscv

Download patch

ref: 0272fa04fd5da396d5f2b29d8c6c988822d2147b
parent: 3e60d7127d8bec7c5ac1361881c173ed0daf422e
author: cinap_lenrek <[email protected]>
date: Tue Apr 10 15:06:34 EDT 2018

ip/traceroute: icmpv6 support

--- a/sys/src/cmd/ip/traceroute.c
+++ b/sys/src/cmd/ip/traceroute.c
@@ -180,9 +180,8 @@
 #define MSG "traceroute probe"
 #define MAGIC 0xdead
 
-/* ICMPv4 only */
 static int
-icmpprobe(int cfd, int dfd, char *dest, int interval)
+icmpprobe(int cfd, int dfd, int version, char *dest, int interval)
 {
 	int x, i, n, len, rv;
 	char buf[512], err[ERRMAX], msg[Maxstring];
@@ -194,15 +193,16 @@
 		return -1;
 
 	rv = -1;
-	ip = (Icmphdr *)(buf + IPV4HDR_LEN);
+	len = (version == 4)? IPV4HDR_LEN: IPV6HDR_LEN;
+	ip = (Icmphdr *)(buf + len);
+	len += ICMP_HDRSIZE + sizeof(MSG);
 	for(i = 0; i < 3; i++){
 		alarm(interval/3);
-		ip->type = EchoRequest;
+		ip->type = (version == 4)? EchoRequest: EchoRequestV6;
 		ip->code = 0;
 		strcpy((char*)ip->data, MSG);
 		ip->seq[0] = MAGIC;
 		ip->seq[1] = MAGIC>>8;
-		len = IPV4HDR_LEN + ICMP_HDRSIZE + sizeof(MSG);
 
 		/* send a request */
 		if(write(dfd, buf, len) < len)
@@ -222,7 +222,7 @@
 			continue;
 		}
 		x = (ip->seq[1]<<8) | ip->seq[0];
-		if(n >= len && ip->type == EchoReply && x == MAGIC &&
+		if(n >= len && ip->type == ((version == 4)? EchoReply: EchoReplyV6) && x == MAGIC &&
 		    strcmp((char*)ip->data, MSG) == 0){
 			rv = 0;
 			break;
@@ -283,7 +283,9 @@
 	if(strcmp(ds->proto, "udp") == 0)
 		rv = udpprobe(cfd, dfd, dest, 3000);
 	else if(strcmp(ds->proto, "icmp") == 0)
-		rv = icmpprobe(cfd, dfd, dest, 3000);
+		rv = icmpprobe(cfd, dfd, 4, dest, 3000);
+	else if(strcmp(ds->proto, "icmpv6") == 0)
+		rv = icmpprobe(cfd, dfd, 6, dest, 3000);
 	else	/* il and tcp */
 		rv = tcpilprobe(cfd, dfd, dest, 3000);
 out: