Browse Source

Plan 9 from Bell Labs 2007-01-19

David du Colombier 17 years ago
parent
commit
18bd4166c8

+ 11 - 9
dist/replica/_plan9.db

@@ -302,7 +302,7 @@
 386/bin/ip/httpfile - 775 sys sys 1168402324 284262
 386/bin/ip/imap4d - 775 sys sys 1169006128 238175
 386/bin/ip/ipconfig - 775 sys sys 1168402325 139510
-386/bin/ip/ping - 775 sys sys 1168402325 76725
+386/bin/ip/ping - 775 sys sys 1169151814 84622
 386/bin/ip/ppp - 775 sys sys 1168402326 220383
 386/bin/ip/pppoe - 775 sys sys 1168402326 77787
 386/bin/ip/pptp - 775 sys sys 1168402326 127175
@@ -420,7 +420,7 @@
 386/bin/swap - 775 sys sys 1168402350 62373
 386/bin/syscall - 775 sys sys 1130594788 73568
 386/bin/tail - 775 sys sys 1168402351 66406
-386/bin/tar - 775 sys sys 1168402351 93474
+386/bin/tar - 775 sys sys 1169151814 94824
 386/bin/tbl - 775 sys sys 1131302431 113308
 386/bin/tcs - 775 sys sys 1161026500 320293
 386/bin/tee - 775 sys sys 1148500692 38463
@@ -7745,7 +7745,7 @@ sys/man/8/newuser - 664 sys sys 1116954242 2418
 sys/man/8/nfsserver - 664 sys sys 1163208425 3587
 sys/man/8/pcmcia - 664 sys sys 944959679 408
 sys/man/8/pem - 664 sys sys 1060263669 1189
-sys/man/8/ping - 664 sys sys 1169091081 3639
+sys/man/8/ping - 664 sys sys 1169105315 3650
 sys/man/8/plan9.ini - 664 sys sys 1167276434 22689
 sys/man/8/pop3 - 664 sys sys 1063854676 2720
 sys/man/8/ppp - 664 sys sys 1125530075 4414
@@ -12324,9 +12324,9 @@ sys/src/cmd/ip/dhcpd/dat.h - 664 sys sys 1084471353 2522
 sys/src/cmd/ip/dhcpd/db.c - 664 sys sys 1143670612 7466
 sys/src/cmd/ip/dhcpd/dhcpd.c - 664 sys sys 1161483751 33248
 sys/src/cmd/ip/dhcpd/dhcpleases.c - 664 sys sys 1032655001 779
-sys/src/cmd/ip/dhcpd/mkfile - 664 sys sys 1063897571 433
+sys/src/cmd/ip/dhcpd/mkfile - 664 sys sys 1169162185 443
 sys/src/cmd/ip/dhcpd/ndb.c - 664 sys sys 1084471375 6063
-sys/src/cmd/ip/dhcpd/ping.c - 664 sys sys 956275654 1881
+sys/src/cmd/ip/dhcpd/ping.c - 664 sys sys 1169162185 1163
 sys/src/cmd/ip/dhcpd/testlook.c - 664 sys sys 950389140 4640
 sys/src/cmd/ip/dhcpd/testlookup.c - 664 sys sys 950389140 3195
 sys/src/cmd/ip/dhcpd/testping.c - 664 sys sys 950389141 352
@@ -12339,7 +12339,7 @@ sys/src/cmd/ip/ftpfs/mkfile - 664 sys sys 1048312050 173
 sys/src/cmd/ip/ftpfs/proto.c - 664 sys sys 1124935667 30337
 sys/src/cmd/ip/glob.c - 664 sys sys 1101155057 3290
 sys/src/cmd/ip/glob.h - 664 sys sys 1101155058 308
-sys/src/cmd/ip/gping.c - 664 sys sys 1166824873 20476
+sys/src/cmd/ip/gping.c - 664 sys sys 1169165326 19784
 sys/src/cmd/ip/hogports.c - 664 sys sys 1118623129 989
 sys/src/cmd/ip/httpd - 20000000775 sys sys 1083771060 0
 sys/src/cmd/ip/httpd/anonymous.c - 664 sys sys 984773807 195
@@ -12364,6 +12364,7 @@ sys/src/cmd/ip/httpd/webls.c - 664 sys sys 1120737502 7658
 sys/src/cmd/ip/httpd/webls.denied - 664 sys sys 1064887847 3
 sys/src/cmd/ip/httpd/wikipost.c - 664 sys sys 1083771074 5913
 sys/src/cmd/ip/httpfile.c - 664 sys sys 1128556975 10037
+sys/src/cmd/ip/icmp.h - 664 sys sys 1169162039 1563
 sys/src/cmd/ip/imap4d - 20000000775 sys sys 1066325859 0
 sys/src/cmd/ip/imap4d/auth.c - 664 sys sys 1015013075 3510
 sys/src/cmd/ip/imap4d/copy.c - 664 sys sys 1062298855 4597
@@ -12386,8 +12387,8 @@ sys/src/cmd/ip/imap4d/store.c - 664 sys sys 1066317059 1910
 sys/src/cmd/ip/imap4d/utils.c - 664 sys sys 1168894057 2587
 sys/src/cmd/ip/ipconfig.c - 664 sys sys 1166761782 35168
 sys/src/cmd/ip/measure.c - 664 sys sys 944961011 3733
-sys/src/cmd/ip/mkfile - 664 sys sys 1131110598 1243
-sys/src/cmd/ip/ping.c - 664 sys sys 1169091087 8437
+sys/src/cmd/ip/mkfile - 664 sys sys 1169163575 1250
+sys/src/cmd/ip/ping.c - 664 sys sys 1169162049 9673
 sys/src/cmd/ip/ppp - 20000000775 sys sys 1065963823 0
 sys/src/cmd/ip/ppp/block.c - 664 sys sys 1015090266 5353
 sys/src/cmd/ip/ppp/compress.c - 664 sys sys 1072729513 11774
@@ -12454,7 +12455,7 @@ sys/src/cmd/ip/telnet.c - 664 sys sys 1162416789 8621
 sys/src/cmd/ip/telnet.h - 664 sys sys 1015090250 5902
 sys/src/cmd/ip/telnetd.c - 664 sys sys 1135487948 11772
 sys/src/cmd/ip/tftpd.c - 664 sys sys 1106943821 7646
-sys/src/cmd/ip/traceroute.c - 664 sys sys 1032060124 9370
+sys/src/cmd/ip/traceroute.c - 664 sys sys 1169162086 8637
 sys/src/cmd/ip/udpecho.c - 664 sys sys 1050714674 855
 sys/src/cmd/join.c - 664 sys sys 1158251357 7550
 sys/src/cmd/jpg - 20000000775 sys sys 1132458749 0
@@ -15677,3 +15678,4 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
+386/bin/ip/traceroute - 775 sys sys 1169179342 74185

+ 11 - 10
dist/replica/plan9.db

@@ -302,7 +302,7 @@
 386/bin/ip/httpfile - 775 sys sys 1168402324 284262
 386/bin/ip/imap4d - 775 sys sys 1169006128 238175
 386/bin/ip/ipconfig - 775 sys sys 1168402325 139510
-386/bin/ip/ping - 775 sys sys 1168402325 76725
+386/bin/ip/ping - 775 sys sys 1169151814 84622
 386/bin/ip/ppp - 775 sys sys 1168402326 220383
 386/bin/ip/pppoe - 775 sys sys 1168402326 77787
 386/bin/ip/pptp - 775 sys sys 1168402326 127175
@@ -313,7 +313,7 @@
 386/bin/ip/rlogind - 775 sys sys 1168402328 67654
 386/bin/ip/telnetd - 775 sys sys 1168402329 123319
 386/bin/ip/tftpd - 775 sys sys 1168402329 132043
-386/bin/ip/traceroute - 775 sys sys 1168402329 73973
+386/bin/ip/traceroute - 775 sys sys 1169179342 74185
 386/bin/ip/udpecho - 775 sys sys 1148500666 43190
 386/bin/join - 775 sys sys 1168402330 114382
 386/bin/jpg - 775 sys sys 1168402330 174923
@@ -420,7 +420,7 @@
 386/bin/swap - 775 sys sys 1168402350 62373
 386/bin/syscall - 775 sys sys 1130594788 73568
 386/bin/tail - 775 sys sys 1168402351 66406
-386/bin/tar - 775 sys sys 1168402351 93474
+386/bin/tar - 775 sys sys 1169151814 94824
 386/bin/tbl - 775 sys sys 1131302431 113308
 386/bin/tcs - 775 sys sys 1161026500 320293
 386/bin/tee - 775 sys sys 1148500692 38463
@@ -7745,7 +7745,7 @@ sys/man/8/newuser - 664 sys sys 1116954242 2418
 sys/man/8/nfsserver - 664 sys sys 1163208425 3587
 sys/man/8/pcmcia - 664 sys sys 944959679 408
 sys/man/8/pem - 664 sys sys 1060263669 1189
-sys/man/8/ping - 664 sys sys 1169091081 3639
+sys/man/8/ping - 664 sys sys 1169105315 3650
 sys/man/8/plan9.ini - 664 sys sys 1167276434 22689
 sys/man/8/pop3 - 664 sys sys 1063854676 2720
 sys/man/8/ppp - 664 sys sys 1125530075 4414
@@ -12324,9 +12324,9 @@ sys/src/cmd/ip/dhcpd/dat.h - 664 sys sys 1084471353 2522
 sys/src/cmd/ip/dhcpd/db.c - 664 sys sys 1143670612 7466
 sys/src/cmd/ip/dhcpd/dhcpd.c - 664 sys sys 1161483751 33248
 sys/src/cmd/ip/dhcpd/dhcpleases.c - 664 sys sys 1032655001 779
-sys/src/cmd/ip/dhcpd/mkfile - 664 sys sys 1063897571 433
+sys/src/cmd/ip/dhcpd/mkfile - 664 sys sys 1169162185 443
 sys/src/cmd/ip/dhcpd/ndb.c - 664 sys sys 1084471375 6063
-sys/src/cmd/ip/dhcpd/ping.c - 664 sys sys 956275654 1881
+sys/src/cmd/ip/dhcpd/ping.c - 664 sys sys 1169162185 1163
 sys/src/cmd/ip/dhcpd/testlook.c - 664 sys sys 950389140 4640
 sys/src/cmd/ip/dhcpd/testlookup.c - 664 sys sys 950389140 3195
 sys/src/cmd/ip/dhcpd/testping.c - 664 sys sys 950389141 352
@@ -12339,7 +12339,7 @@ sys/src/cmd/ip/ftpfs/mkfile - 664 sys sys 1048312050 173
 sys/src/cmd/ip/ftpfs/proto.c - 664 sys sys 1124935667 30337
 sys/src/cmd/ip/glob.c - 664 sys sys 1101155057 3290
 sys/src/cmd/ip/glob.h - 664 sys sys 1101155058 308
-sys/src/cmd/ip/gping.c - 664 sys sys 1166824873 20476
+sys/src/cmd/ip/gping.c - 664 sys sys 1169165326 19784
 sys/src/cmd/ip/hogports.c - 664 sys sys 1118623129 989
 sys/src/cmd/ip/httpd - 20000000775 sys sys 1083771060 0
 sys/src/cmd/ip/httpd/anonymous.c - 664 sys sys 984773807 195
@@ -12364,6 +12364,7 @@ sys/src/cmd/ip/httpd/webls.c - 664 sys sys 1120737502 7658
 sys/src/cmd/ip/httpd/webls.denied - 664 sys sys 1064887847 3
 sys/src/cmd/ip/httpd/wikipost.c - 664 sys sys 1083771074 5913
 sys/src/cmd/ip/httpfile.c - 664 sys sys 1128556975 10037
+sys/src/cmd/ip/icmp.h - 664 sys sys 1169162039 1563
 sys/src/cmd/ip/imap4d - 20000000775 sys sys 1066325859 0
 sys/src/cmd/ip/imap4d/auth.c - 664 sys sys 1015013075 3510
 sys/src/cmd/ip/imap4d/copy.c - 664 sys sys 1062298855 4597
@@ -12386,8 +12387,8 @@ sys/src/cmd/ip/imap4d/store.c - 664 sys sys 1066317059 1910
 sys/src/cmd/ip/imap4d/utils.c - 664 sys sys 1168894057 2587
 sys/src/cmd/ip/ipconfig.c - 664 sys sys 1166761782 35168
 sys/src/cmd/ip/measure.c - 664 sys sys 944961011 3733
-sys/src/cmd/ip/mkfile - 664 sys sys 1131110598 1243
-sys/src/cmd/ip/ping.c - 664 sys sys 1169091087 8437
+sys/src/cmd/ip/mkfile - 664 sys sys 1169163575 1250
+sys/src/cmd/ip/ping.c - 664 sys sys 1169162049 9673
 sys/src/cmd/ip/ppp - 20000000775 sys sys 1065963823 0
 sys/src/cmd/ip/ppp/block.c - 664 sys sys 1015090266 5353
 sys/src/cmd/ip/ppp/compress.c - 664 sys sys 1072729513 11774
@@ -12454,7 +12455,7 @@ sys/src/cmd/ip/telnet.c - 664 sys sys 1162416789 8621
 sys/src/cmd/ip/telnet.h - 664 sys sys 1015090250 5902
 sys/src/cmd/ip/telnetd.c - 664 sys sys 1135487948 11772
 sys/src/cmd/ip/tftpd.c - 664 sys sys 1106943821 7646
-sys/src/cmd/ip/traceroute.c - 664 sys sys 1032060124 9370
+sys/src/cmd/ip/traceroute.c - 664 sys sys 1169162086 8637
 sys/src/cmd/ip/udpecho.c - 664 sys sys 1050714674 855
 sys/src/cmd/join.c - 664 sys sys 1158251357 7550
 sys/src/cmd/jpg - 20000000775 sys sys 1132458749 0

+ 14 - 0
dist/replica/plan9.log

@@ -47374,3 +47374,17 @@
 1169092806 1 c sys/man/1/rc - 664 sys sys 1169092054 20021
 1169092806 2 c sys/man/4/snap - 664 sys sys 1169092032 1908
 1169092806 3 c sys/src/cmd/tar.c - 664 sys sys 1169092124 25725
+1169105406 0 c sys/man/8/ping - 664 sys sys 1169105315 3650
+1169105406 1 c sys/src/cmd/ip/ping.c - 664 sys sys 1169105376 10470
+1169148606 0 c sys/src/cmd/ip/ping.c - 664 sys sys 1169147036 10657
+1169152207 0 c 386/bin/ip/ping - 775 sys sys 1169151814 84622
+1169152207 1 c 386/bin/tar - 775 sys sys 1169151814 94824
+1169163006 0 c sys/src/cmd/ip/dhcpd/mkfile - 664 sys sys 1169162185 443
+1169163006 1 c sys/src/cmd/ip/dhcpd/ping.c - 664 sys sys 1169162185 1163
+1169163006 2 c sys/src/cmd/ip/gping.c - 664 sys sys 1169162059 19764
+1169163006 3 a sys/src/cmd/ip/icmp.h - 664 sys sys 1169162039 1563
+1169163006 4 c sys/src/cmd/ip/ping.c - 664 sys sys 1169162049 9673
+1169163006 5 c sys/src/cmd/ip/traceroute.c - 664 sys sys 1169162086 8637
+1169164807 0 c sys/src/cmd/ip/mkfile - 664 sys sys 1169163575 1250
+1169166606 0 c sys/src/cmd/ip/gping.c - 664 sys sys 1169165326 19784
+1169181137 0 c 386/bin/ip/traceroute - 775 sys sys 1169179342 74185

+ 3 - 4
sys/man/8/ping

@@ -70,9 +70,11 @@ returns successfully. Otherwise it returns an error status of
 The options are:
 .TP
 .B 6
-use IPv6's ICMP,
+force the use of IPv6's ICMP,
 .BR icmpv6 ,
 instead of IPv4's ICMP.
+.I Ping
+tries to determine which version of IP to use automatically.
 .TP
 .B a
 adds the IP source and destination addresses to each report.
@@ -193,6 +195,3 @@ the network mounted at
 .B /sys/src/cmd/ip/hogports.c
 .SH SEE ALSO
 .IR ip (3)
-.SH BUGS
-.I Ping
-should be able to adapt automatically to IP v4 or v6.

+ 1 - 1
sys/src/cmd/ip/dhcpd/mkfile

@@ -14,7 +14,7 @@ IOFILES=\
 	db.$O\
 	ping.$O\
 
-HFILES=dat.h ../dhcp.h
+HFILES=dat.h ../dhcp.h ../icmp.h
 
 BIN=/$objtype/bin/ip
 

+ 1 - 38
sys/src/cmd/ip/dhcpd/ping.c

@@ -1,44 +1,7 @@
 #include <u.h>
 #include <libc.h>
 #include <ip.h>
-
-
-typedef struct Icmp Icmp;
-struct Icmp
-{
-	uchar	vihl;		/* Version and header length */
-	uchar	tos;		/* Type of service */
-	uchar	length[2];	/* packet length */
-	uchar	id[2];		/* Identification */
-	uchar	frag[2];	/* Fragment information */
-	uchar	ttl;		/* Time to live */
-	uchar	proto;		/* Protocol */
-	uchar	ipcksum[2];	/* Header checksum */
-	uchar	src[4];		/* Ip source */
-	uchar	dst[4];		/* Ip destination */
-	uchar	type;
-	uchar	code;
-	uchar	cksum[2];
-	uchar	icmpid[2];
-	uchar	seq[2];
-	uchar	data[1];
-};
-
-enum
-{			/* Packet Types */
-	EchoReply	= 0,
-	Unreachable	= 3,
-	SrcQuench	= 4,
-	EchoRequest	= 8,
-	TimeExceed	= 11,
-	Timestamp	= 13,
-	TimestampReply	= 14,
-	InfoRequest	= 15,
-	InfoReply	= 16,
-
-	ICMP_IPSIZE	= 20,
-	ICMP_HDRSIZE	= 8,
-};
+#include "../icmp.h"
 
 static void
 catch(void *a, char *msg)

+ 12 - 45
sys/src/cmd/ip/gping.c

@@ -6,13 +6,13 @@
 #include <draw.h>
 #include <event.h>
 #include <ip.h>
+#include "icmp.h"
 
 #define	MAXNUM	8	/* maximum number of numbers on data line */
 
 typedef struct Graph	Graph;
 typedef struct Machine	Machine;
 typedef struct Req	Req;
-typedef struct Icmp	Icmp;
 
 enum {
 	Gmsglen	= 16,
@@ -36,41 +36,8 @@ struct Graph
 	int		vmax;
 };
 
-struct Icmp
-{
-	uchar	vihl;		/* Version and header length */
-	uchar	tos;		/* Type of service */
-	uchar	length[2];	/* packet length */
-	uchar	id[2];		/* Identification */
-	uchar	frag[2];	/* Fragment information */
-	uchar	ttl;		/* Time to live */
-	uchar	proto;		/* Protocol */
-	uchar	ipcksum[2];	/* Header checksum */
-	uchar	src[4];		/* Ip source */
-	uchar	dst[4];		/* Ip destination */
-	uchar	type;
-	uchar	code;
-	uchar	cksum[2];
-	uchar	icmpid[2];
-	uchar	seq[2];
-	uchar	data[1];
-};
-
 enum
-{			/* Packet Types */
-	EchoReply	= 0,
-	Unreachable	= 3,
-	SrcQuench	= 4,
-	EchoRequest	= 8,
-	TimeExceed	= 11,
-	Timestamp	= 13,
-	TimestampReply	= 14,
-	InfoRequest	= 15,
-	InfoReply	= 16,
-
-	ICMP_IPSIZE	= 20,
-	ICMP_HDRSIZE	= 8,
-
+{
 	MSGLEN		= 64,
 
 	Rttmax		= 50,
@@ -78,10 +45,10 @@ enum
 
 struct Req
 {
-	int	seq;	// sequence number
-	vlong	time;	// time sent
+	int	seq;	/* sequence number */
+	vlong	time;	/* time sent */
 	int	rtt;
-	Req	 *next;
+	Req	*next;
 };
 
 struct Machine
@@ -104,7 +71,7 @@ struct Machine
 	Req	*first;
 	Req	*last;
 	Req	*rcvd;
-	
+
 	char	buf[1024];
 	char	*bufp;
 	char	*ebufp;
@@ -395,10 +362,10 @@ drawmsg(Graph *g, char *msg)
 	if(g->overtmp == nil)
 		return;
 
-	// save previous contents of screen
+	/* save previous contents of screen */
 	draw(g->overtmp, g->overtmp->r, screen, nil, g->overtmp->r.min);
 
-	// draw message
+	/* draw message */
 	if(strlen(msg) > g->overtmplen)
 		msg[g->overtmplen] = 0;
 	string(screen, g->overtmp->r.min, display->black, ZP, mediumfont, msg);
@@ -437,7 +404,7 @@ update1(Graph *g, long v, long vmax, long mark)
 {
 	char buf[Gmsglen];
 
-	// put back screen value sans message
+	/* put back screen value sans message */
 	if(g->overflow || *g->msg){
 		clearmsg(g);
 		g->overflow = 0;
@@ -466,7 +433,7 @@ update1(Graph *g, long v, long vmax, long mark)
 			}
 		}
 	}
-	
+
 }
 
 void
@@ -945,7 +912,7 @@ dobutton1(Mouse *m)
 	if(g->overtmp == nil)
 		return;
 
-	// clear any previous message and cursor
+	/* clear any previous message and cursor */
 	if(g->overflow || *g->msg){
 		clearmsg(g);
 		*g->msg = 0;
@@ -1020,7 +987,7 @@ main(int argc, char *argv[])
 	fmtinstall('V', eipfmt);
 
 	f = flags;
-	pinginterval = 5000;		// 5 seconds
+	pinginterval = 5000;		/* 5 seconds */
 	ARGBEGIN{
 	case 'i':
 		p = ARGF();

+ 83 - 0
sys/src/cmd/ip/icmp.h

@@ -0,0 +1,83 @@
+/* ICMP for IP v4 and v6 */
+enum
+{
+	/* Packet Types, icmp v4 (rfc 792) */
+	EchoReply	= 0,
+	Unreachable	= 3,
+	SrcQuench	= 4,
+	Redirect	= 5,
+	EchoRequest	= 8,
+	TimeExceed	= 11,
+	InParmProblem	= 12,
+	Timestamp	= 13,
+	TimestampReply	= 14,
+	InfoRequest	= 15,
+	InfoReply	= 16,
+	AddrMaskRequest = 17,
+	AddrMaskReply   = 18,
+	Traceroute	= 30,
+	IPv6WhereAreYou	= 33,
+	IPv6IAmHere	= 34,
+
+	/* packet types, icmp v6 (rfc 2463) */
+
+        /* error messages */
+	UnreachableV6	= 1,
+	PacketTooBigV6	= 2,
+	TimeExceedV6	= 3,
+	ParamProblemV6	= 4,
+
+        /* informational messages (rfc 2461 also) */
+	EchoRequestV6	= 128,
+	EchoReplyV6	= 129,
+	RouterSolicit	= 133,
+	RouterAdvert	= 134,
+	NbrSolicit	= 135,
+	NbrAdvert	= 136,
+	RedirectV6	= 137,
+
+	Maxtype6	= 137,
+
+	ICMP_IPSIZE	= 20,
+	ICMP_HDRSIZE	= 8,
+};
+
+typedef struct Icmp Icmp;
+struct Icmp
+{
+	uchar	vihl;		/* Version and header length */
+	uchar	tos;		/* Type of service */
+	uchar	length[2];	/* packet length */
+	uchar	id[2];		/* Identification */
+	uchar	frag[2];	/* Fragment information */
+	uchar	ttl;		/* Time to live */
+	uchar	proto;		/* Protocol */
+	uchar	ipcksum[2];	/* Header checksum */
+	uchar	src[4];		/* Ip source */
+	uchar	dst[4];		/* Ip destination */
+
+	uchar	type;
+	uchar	code;
+	uchar	cksum[2];
+	uchar	icmpid[2];
+	uchar	seq[2];
+	uchar	data[1];
+};
+
+typedef struct Icmp6 Icmp6;
+struct Icmp6
+{
+	uchar	vcf[4];
+	uchar	ploadlen[2];
+	uchar	proto;
+	uchar	ttl;
+	uchar	src[16];		/* Ip source */
+	uchar	dst[16];		/* Ip destination */
+
+	uchar	type;
+	uchar	code;
+	uchar	cksum[2];
+	uchar	icmpid[2];
+	uchar	seq[2];
+	uchar	data[1];
+};

+ 1 - 1
sys/src/cmd/ip/mkfile

@@ -23,7 +23,7 @@ TARG = 	dhcpclient\
 DIRS=ftpfs dhcpd httpd ppp imap4d snoopy
 
 BIN=/$objtype/bin/ip
-HFILES=dhcp.h arp.h glob.h telnet.h
+HFILES=dhcp.h arp.h glob.h icmp.h telnet.h
 
 UPDATE=\
 	mkfile\

+ 139 - 55
sys/src/cmd/ip/ping.c

@@ -1,24 +1,13 @@
 /* ping for ip v4 and v6 */
 #include <u.h>
 #include <libc.h>
+#include <ctype.h>
 #include <ip.h>
+#include <bio.h>
+#include <ndb.h>
+#include "icmp.h"
 
-enum
-{
-	/* Packet Types */
-	EchoReply	= 0,
-	Unreachable	= 3,
-	SrcQuench	= 4,
-	EchoRequest	= 8,
-	TimeExceed	= 11,
-	Timestamp	= 13,
-	TimestampReply	= 14,
-	InfoRequest	= 15,
-	InfoReply	= 16,
-
-	EchoReplyV6	= 129,
-	EchoRequestV6	= 128,
-
+enum {
 	MAXMSG		= 32,
 	SLEEPMS		= 1000,
 
@@ -26,44 +15,6 @@ enum
 	MINUTE		= 60*SECOND,
 };
 
-typedef struct Icmp Icmp;
-struct Icmp
-{
-	uchar	vihl;		/* Version and header length */
-	uchar	tos;		/* Type of service */
-	uchar	length[2];	/* packet length */
-	uchar	id[2];		/* Identification */
-	uchar	frag[2];	/* Fragment information */
-	uchar	ttl;		/* Time to live */
-	uchar	proto;		/* Protocol */
-	uchar	ipcksum[2];	/* Header checksum */
-	uchar	src[4];		/* Ip source */
-	uchar	dst[4];		/* Ip destination */
-	uchar	type;
-	uchar	code;
-	uchar	cksum[2];
-	uchar	icmpid[2];
-	uchar	seq[2];
-	uchar	data[1];
-};
-
-typedef struct Icmp6 Icmp6;
-struct Icmp6
-{
-	uchar	vcf[4];
-	uchar	ploadlen[2];
-	uchar	proto;
-	uchar	ttl;
-	uchar	src[16];		/* Ip source */
-	uchar	dst[16];		/* Ip destination */
-	uchar	type;
-	uchar	code;
-	uchar	cksum[2];
-	uchar	icmpid[2];
-	uchar	seq[2];
-	uchar	data[1];
-};
-
 typedef struct Req Req;
 struct Req
 {
@@ -286,6 +237,7 @@ static Proto v6pr = {
 
 static Proto *proto = &v4pr;
 
+
 void
 clean(ushort seq, vlong now, void *v)
 {
@@ -403,7 +355,7 @@ rcvr(int fd, int msglen, int interval, int nmsg)
 		}
 		clean(x, now, buf);
 	}
-	
+
 	lock(&listlock);
 	for(r = first; r; r = r->next)
 		if(r->replied == 0)
@@ -415,6 +367,135 @@ rcvr(int fd, int msglen, int interval, int nmsg)
 			lostmsgs+rcvdmsgs);
 }
 
+static int
+isdottedquad(char *name)
+{
+	int dot = 0, digit = 0;
+
+	for (; *name != '\0'; name++)
+		if (*name == '.')
+			dot++;
+		else if (isdigit(*name))
+			digit++;
+		else
+			return 0;
+	return dot && digit;
+}
+
+static int
+isv6lit(char *name)
+{
+	int colon = 0, hex = 0;
+
+	for (; *name != '\0'; name++)
+		if (*name == ':')
+			colon++;
+		else if (isxdigit(*name))
+			hex++;
+		else
+			return 0;
+	return colon;
+}
+
+/* from /sys/src/libc/9sys/dial.c */
+
+enum
+{
+	Maxstring	= 128,
+	Maxpath		= 256,
+};
+
+typedef struct DS DS;
+struct DS {
+	/* dist string */
+	char	buf[Maxstring];
+	char	*netdir;
+	char	*proto;
+	char	*rem;
+
+	/* other args */
+	char	*local;
+	char	*dir;
+	int	*cfdp;
+};
+
+/*
+ *  parse a dial string
+ */
+static void
+_dial_string_parse(char *str, DS *ds)
+{
+	char *p, *p2;
+
+	strncpy(ds->buf, str, Maxstring);
+	ds->buf[Maxstring-1] = 0;
+
+	p = strchr(ds->buf, '!');
+	if(p == 0) {
+		ds->netdir = 0;
+		ds->proto = "net";
+		ds->rem = ds->buf;
+	} else {
+		if(*ds->buf != '/' && *ds->buf != '#'){
+			ds->netdir = 0;
+			ds->proto = ds->buf;
+		} else {
+			for(p2 = p; *p2 != '/'; p2--)
+				;
+			*p2++ = 0;
+			ds->netdir = ds->buf;
+			ds->proto = p2;
+		}
+		*p = 0;
+		ds->rem = p + 1;
+	}
+}
+
+static int
+isv4name(char *name)
+{
+	int r = 1;
+	char *root, *ip, *pr;
+	DS ds;
+
+	_dial_string_parse(name, &ds);
+
+	/* cope with leading /net.alt/icmp! and the like */
+	root = nil;
+	if (ds.netdir != nil) {
+		pr = strrchr(ds.netdir, '/');
+		if (pr == nil)
+			pr = ds.netdir;
+		else {
+			*pr++ = '\0';
+			root = ds.netdir;
+		}
+		if (strcmp(pr, v4pr.net) == 0)
+			return 1;
+		if (strcmp(pr, v6pr.net) == 0)
+			return 0;
+	}
+
+	/* if it's a literal, it's obvious from syntax which proto it is */
+	if (isdottedquad(ds.rem))
+		return 1;
+	else if (isv6lit(ds.rem))
+		return 0;
+
+	/* map name to ip and look at its syntax */
+	ip = csgetvalue(root, "sys", ds.rem, "ip", nil);
+	if (ip == nil)
+		ip = csgetvalue(root, "dom", ds.rem, "ip", nil);
+	if (ip == nil)
+		ip = csgetvalue(root, "sys", ds.rem, "ipv6", nil);
+	if (ip == nil)
+		ip = csgetvalue(root, "dom", ds.rem, "ipv6", nil);
+	if (ip != nil)
+		r = isv4name(ip);
+	free(ip);
+	return r;
+}
+
 void
 main(int argc, char **argv)
 {
@@ -424,6 +505,7 @@ main(int argc, char **argv)
 	nsec();		/* make sure time file is already open */
 
 	fmtinstall('V', eipfmt);
+	fmtinstall('I', eipfmt);
 
 	msglen = interval = 0;
 	nmsg = MAXMSG;
@@ -477,6 +559,8 @@ main(int argc, char **argv)
 
 	notify(catch);
 
+	if (!isv4name(argv[0]))
+		proto = &v6pr;
 	ds = netmkaddr(argv[0], proto->net, "1");
 	fd = dial(ds, 0, 0, 0);
 	if(fd < 0){

+ 22 - 66
sys/src/cmd/ip/traceroute.c

@@ -3,6 +3,7 @@
 #include <ctype.h>
 #include <bio.h>
 #include <ndb.h>
+#include "icmp.h"
 
 enum{
 	Maxstring=	128,
@@ -11,50 +12,13 @@ enum{
 
 typedef struct DS DS;
 struct DS {
-	/* dist string */
+	/* dial string */
 	char	buf[Maxstring];
 	char	*netdir;
 	char	*proto;
 	char	*rem;
 };
 
-typedef struct Icmp Icmp;
-struct Icmp
-{
-	uchar	vihl;		/* Version and header length */
-	uchar	tos;		/* Type of service */
-	uchar	length[2];	/* packet length */
-	uchar	id[2];		/* Identification */
-	uchar	frag[2];	/* Fragment information */
-	uchar	ttl;		/* Time to live */
-	uchar	proto;		/* Protocol */
-	uchar	ipcksum[2];	/* Header checksum */
-	uchar	src[4];		/* Ip source */
-	uchar	dst[4];		/* Ip destination */
-	uchar	type;
-	uchar	code;
-	uchar	cksum[2];
-	uchar	icmpid[2];
-	uchar	seq[2];
-	uchar	data[1];
-};
-
-enum
-{			/* Packet Types */
-	EchoReply	= 0,
-	Unreachable	= 3,
-	SrcQuench	= 4,
-	EchoRequest	= 8,
-	TimeExceed	= 11,
-	Timestamp	= 13,
-	TimestampReply	= 14,
-	InfoRequest	= 15,
-	InfoReply	= 16,
-
-	ICMP_IPSIZE	= 20,
-	ICMP_HDRSIZE	= 8,
-};
-
 char *argv0;
 int debug;
 
@@ -63,7 +27,9 @@ void	histogram(long *t, int n, int buckets, long lo, long hi);
 void
 usage(void)
 {
-	fprint(2, "usage: %s [-n] [protocol!]destination\n", argv0);
+	fprint(2,
+"usage: %s [-n][-a tries][-h buckets][-t ttl][-x net] [protocol!]destination\n",
+		argv0);
 	exits("usage");
 }
 
@@ -237,11 +203,11 @@ icmpprobe(int cfd, int dfd, char *dest, int interval)
 		ip->seq[0] = MAGIC;
 		ip->seq[1] = MAGIC>>8;
 		len = ICMP_IPSIZE+ICMP_HDRSIZE+sizeof(MSG);
-	
+
 		/* send a request */
 		if(write(dfd, buf, len) < len)
 			break;
-	
+
 		/* wait for reply */
 		n = read(dfd, buf, sizeof(buf));
 		alarm(0);
@@ -362,22 +328,19 @@ dial_string_parse(char *str, DS *ds)
 		ds->rem = p + 1;
 	}
 	if(strchr(ds->rem, '!') == 0)
-		strcat(ds->rem, "!32767");	
+		strcat(ds->rem, "!32767");
 }
 
 void
 main(int argc, char **argv)
 {
-	int j, done;
-	DS ds;
-	char clone[Maxpath], dest[Maxstring], hop[Maxstring], dom[Maxstring];
-	char err[Maxstring];
+	int buckets, ttl, j, done, tries, notranslate;
 	long lo, hi, sum, x;
-	char *p;
-	int tries, notranslate;
-	char *net;
-	int buckets, ttl;
 	long *t;
+	char *net, *p;
+	char clone[Maxpath], dest[Maxstring], hop[Maxstring], dom[Maxstring];
+	char err[Maxstring];
+	DS ds;
 
 	buckets = 0;
 	tries = 3;
@@ -385,26 +348,20 @@ main(int argc, char **argv)
 	net = "/net";
 	ttl = 1;
 	ARGBEGIN{
-	case 't':
-		p = ARGF();
-		if(p)
-			ttl = atoi(p);
-		break;
-	case 'h':
-		p = ARGF();
-		if(p)
-			buckets = atoi(p);
+	case 'a':
+		tries = atoi(EARGF(usage()));
 		break;
 	case 'd':
 		debug++;
 		break;
+	case 'h':
+		buckets = atoi(EARGF(usage()));
+		break;
 	case 'n':
 		notranslate++;
 		break;
-	case 'a':
-		p = ARGF();
-		if(p)
-			tries = atoi(p);
+	case 't':
+		ttl = atoi(EARGF(usage()));
 		break;
 	case 'x':
 		net = ARGF();
@@ -454,9 +411,9 @@ main(int argc, char **argv)
 				if(p)
 					*p = 0;
 				done = 1;
-			} else if(strncmp(err, "ttl exceeded at ", 16) == 0){
+			} else if(strncmp(err, "ttl exceeded at ", 16) == 0)
 				strcpy(hop, err+16);
-			} else {
+			else {
 				strcpy(hop, "*");
 				break;
 			}
@@ -486,7 +443,6 @@ main(int argc, char **argv)
 		if(done)
 			break;
 	}
-
 	exits(0);
 }