(FILECREATED " 9-Feb-85 16:13:09" {ERIS}<LISPCORE>LIBRARY>LLICMP.;1 8725         changes to:  (VARS LLICMPCOMS)      previous date: "27-Jan-85 17:15:10" {ERIS}<SCHOEN>LLICMP.;6)(* Copyright (c) 1984, 1985 by Xerox Corporation. All rights reserved.)(PRETTYCOMPRINT LLICMPCOMS)(RPAQQ LLICMPCOMS ((COMS (* * ICMP functions)			 (DECLARE: DONTCOPY (EXPORT (RECORDS ICMP ICMPECHO ICMPDESTUN)						    (CONSTANTS * ICMPTYPES)						    (CONSTANTS * ICMPUNREACHABLES)						    (CONSTANTS \ICMPOVLEN)						    (MACROS ICMPLENGTH)))			 (INITVARS (\ICMP.ECHO.REPLY.QUEUE (NCREATE (QUOTE SYSQUEUE)))				   (\ICMP.ECHO.REPLY.EVENT (CREATE.EVENT "ICMP Echo reply"))				   (\ICMP.ECHOING))			 (GLOBALVARS \ICMP.ECHO.REPLY.QUEUE \ICMP.ECHO.REPLY.EVENT \ICMP.ECHOING)			 (FNS PRINTICMP \ICMP.DEST.UNREACHABLE \ICMP.ECHO.TEST 			      \ICMP.HANDLE.ECHO.REPLY \ICMP.INPUT \ICMP.REPLY.TO.ECHO \ICMP.SETUPICMP 			      \ICMP.TRANSMIT)			 (ADDVARS (IPPRINTMACROS (1 . PRINTICMP))))))(* * ICMP functions)(DECLARE: DONTCOPY (* FOLLOWING DEFINITIONS EXPORTED)[DECLARE: EVAL@COMPILE (ACCESSFNS ICMP ((ICMPBASE (\IPDATABASE DATUM)))		(BLOCKRECORD ICMPBASE ((ICMPTYPE BYTE)			      (ICMPCODE BYTE)			      (ICMPCHECKSUM WORD)			      (ICMPDATASTART WORD)))		(ACCESSFNS ICMP ((ICMPCONTENTS (LOCF (fetch (ICMP ICMPDATASTART) of DATUM))))))(ACCESSFNS ICMPECHO ((ICMPECHOBASE (fetch (ICMP ICMPCONTENTS) of DATUM)))		    (BLOCKRECORD ICMPECHOBASE ((ICMPECHOID WORD)				  (ICMPECHOSEQNO WORD)				  (ICMPECHODATA BYTE))))(ACCESSFNS ICMPDESTUN ((ICMPECHOBASE (fetch (ICMP ICMPCONTENTS) of DATUM)))		      (BLOCKRECORD ICMPECHOBASE ((NIL FIXP)				    (ICMPIPHEADER WORD))))](RPAQQ ICMPTYPES ((\ICMP.ECHO.REPLY 0)		  (\ICMP.DEST.UNREACHABLE 3)		  (\ICMP.SOURCE.QUENCH 4)		  (\ICMP.REDIRECT 5)		  (\ICMP.ECHO 8)		  (\ICMP.TIME.EXCEEDED 11)		  (\ICMP.PARAMETER.PROBLEM 12)		  (\ICMP.TIMESTAMP 13)		  (\ICMP.TIMESTAMP.REPLY 14)		  (\ICMP.INFO.REQUEST 15)		  (\ICMP.INFO.REPLY 16)))(DECLARE: EVAL@COMPILE (RPAQQ \ICMP.ECHO.REPLY 0)(RPAQQ \ICMP.DEST.UNREACHABLE 3)(RPAQQ \ICMP.SOURCE.QUENCH 4)(RPAQQ \ICMP.REDIRECT 5)(RPAQQ \ICMP.ECHO 8)(RPAQQ \ICMP.TIME.EXCEEDED 11)(RPAQQ \ICMP.PARAMETER.PROBLEM 12)(RPAQQ \ICMP.TIMESTAMP 13)(RPAQQ \ICMP.TIMESTAMP.REPLY 14)(RPAQQ \ICMP.INFO.REQUEST 15)(RPAQQ \ICMP.INFO.REPLY 16)(CONSTANTS (\ICMP.ECHO.REPLY 0)	   (\ICMP.DEST.UNREACHABLE 3)	   (\ICMP.SOURCE.QUENCH 4)	   (\ICMP.REDIRECT 5)	   (\ICMP.ECHO 8)	   (\ICMP.TIME.EXCEEDED 11)	   (\ICMP.PARAMETER.PROBLEM 12)	   (\ICMP.TIMESTAMP 13)	   (\ICMP.TIMESTAMP.REPLY 14)	   (\ICMP.INFO.REQUEST 15)	   (\ICMP.INFO.REPLY 16)))(RPAQQ ICMPUNREACHABLES ((\ICMP.NET.UNREACHABLE 0)			 (\ICMP.HOST.UNREACHABLE 1)			 (\ICMP.PROTOCOL.UNREACHABLE 2)			 (\ICMP.PORT.UNREACHABLE 3)			 (\ICMP.CANT.FRAGMENT 4)			 (\ICMP.SOURCE.ROUTE 5)))(DECLARE: EVAL@COMPILE (RPAQQ \ICMP.NET.UNREACHABLE 0)(RPAQQ \ICMP.HOST.UNREACHABLE 1)(RPAQQ \ICMP.PROTOCOL.UNREACHABLE 2)(RPAQQ \ICMP.PORT.UNREACHABLE 3)(RPAQQ \ICMP.CANT.FRAGMENT 4)(RPAQQ \ICMP.SOURCE.ROUTE 5)(CONSTANTS (\ICMP.NET.UNREACHABLE 0)	   (\ICMP.HOST.UNREACHABLE 1)	   (\ICMP.PROTOCOL.UNREACHABLE 2)	   (\ICMP.PORT.UNREACHABLE 3)	   (\ICMP.CANT.FRAGMENT 4)	   (\ICMP.SOURCE.ROUTE 5)))(DECLARE: EVAL@COMPILE (RPAQQ \ICMPOVLEN 4)(CONSTANTS \ICMPOVLEN))(DECLARE: EVAL@COMPILE (PUTPROPS ICMPLENGTH MACRO (LAMBDA (ICMP)			     (IDIFFERENCE (fetch (IP IPTOTALLENGTH) of ICMP)					  (LLSH (fetch (IP IPHEADERLENGTH) of ICMP)						2)))))(* END EXPORTED DEFINITIONS))(RPAQ? \ICMP.ECHO.REPLY.QUEUE (NCREATE (QUOTE SYSQUEUE)))(RPAQ? \ICMP.ECHO.REPLY.EVENT (CREATE.EVENT "ICMP Echo reply"))(RPAQ? \ICMP.ECHOING )(DECLARE: DOEVAL@COMPILE DONTCOPY(GLOBALVARS \ICMP.ECHO.REPLY.QUEUE \ICMP.ECHO.REPLY.EVENT \ICMP.ECHOING))(DEFINEQ(PRINTICMP  [LAMBDA (ICMP FILE)                                        (* ejs: "28-Dec-84 09:56")    (PRINTCONSTANT (fetch (ICMP ICMPTYPE) of ICMP)		   ICMPTYPES FILE "ICMP: ")    (TERPRI FILE])(\ICMP.DEST.UNREACHABLE  (LAMBDA (PACKET CODE)                                      (* ejs: "27-Jan-85 15:48")          (* * Returns an ICMP unreachable packet of proper code to sender)    (PROG ((ICMP (\ALLOCATE.ETHERPACKET))	   NWORDS)          (\IP.SETUPIP ICMP (fetch (IP IPSOURCEADDRESS) of PACKET)		       0		       (\IP.FIND.PROTOCOL \ICMP.PROTOCOL))          (\ICMP.SETUPICMP ICMP \ICMP.DEST.UNREACHABLE CODE)          (SETQ NWORDS (IPLUS 4 (LLSH (fetch (IP IPHEADERLENGTH) of PACKET)				      2)))          (\BLT (LOCF (fetch (ICMPDESTUN ICMPIPHEADER) of ICMP))		(fetch (IP IPBASE) of PACKET)		NWORDS)          (add (fetch (IP IPTOTALLENGTH) of ICMP)	       (LLSH NWORDS 1))          (\ICMP.TRANSMIT ICMP)          (\RELEASE.ETHERPACKET PACKET))))(\ICMP.ECHO.TEST  (LAMBDA (IPADDRESS ECHOSTREAM)                             (* ejs: " 3-Jan-85 17:09")          (* * An ICMP echo tester)    (RESETVAR \ICMP.ECHOING T (PROG (ICMP (IPSOCKET (\IP.FIND.PROTOCOL \ICMP.PROTOCOL)))				    (for SEQUENCE from 0 do ((SETQ ICMP (\ALLOCATE.ETHERPACKET))							     (\IP.SETUPIP ICMP IPADDRESS 0 IPSOCKET)							     (\ICMP.SETUPICMP ICMP \ICMP.ECHO 0)							     (replace (ICMPECHO ICMPECHOID)								of ICMP with 0)							     (replace (ICMPECHO ICMPECHOSEQNO)								of ICMP with SEQUENCE)							     (add (fetch (IP IPTOTALLENGTH)								     of ICMP)								  4)							     (printout ECHOSTREAM "!")							     (\ICMP.TRANSMIT ICMP)							     (AWAIT.EVENT \ICMP.ECHO.REPLY.EVENT 									  \ETHERTIMEOUT)							     (COND							       ((SETQ ICMP (\DEQUEUE 									   \ICMP.ECHO.REPLY.QUEUE))								 (COND								   ((IGREATERP (fetch (ICMPECHO											ICMPECHOSEQNO)										  of ICMP)									       SEQUENCE)								     (printout T 								      "ICMP echo out of sequence"									       T)								     (PRINTPACKET ICMP (QUOTE GET)										  ECHOSTREAM)								     (RETURN ICMP))								   (T (printout ECHOSTREAM "+")								      (\RELEASE.ETHERPACKET ICMP))))							       (T (printout ECHOSTREAM ".")))))))))(\ICMP.HANDLE.ECHO.REPLY  [LAMBDA (ICMP)                                             (* ejs: "28-Dec-84 09:02")    (COND      (\ICMP.ECHOING (\ENQUEUE \ICMP.ECHO.REPLY.QUEUE ICMP)		     (NOTIFY.EVENT \ICMP.ECHO.REPLY.EVENT))      (T (\RELEASE.ETHERPACKET ICMP])(\ICMP.INPUT  (LAMBDA (ICMP)                                             (* ejs: "31-Dec-84 13:58")          (* * ICMP packet received)    (COND      ((\IP.CHECKSUM.OK (\IPCHECKSUM ICMP (fetch (ICMP ICMPBASE) of ICMP)				     (\IPDATALENGTH ICMP)))	(SELECTC (fetch (ICMP ICMPTYPE) of ICMP)		 (\ICMP.ECHO.REPLY (\ICMP.HANDLE.ECHO.REPLY ICMP))		 (\ICMP.ECHO (\ICMP.REPLY.TO.ECHO ICMP))		 (\RELEASE.ETHERPACKET ICMP)))      (T (AND IPTRACEFLG (PRINTPACKET ICMP (QUOTE ICMPGET)				      IPTRACEFILE "[dropping packet--bad ICMP checksum]"))))))(\ICMP.REPLY.TO.ECHO  [LAMBDA (ICMP)                                             (* ejs: "27-Dec-84 19:44")          (* * Reply to an echo request)    (swap (fetch (IP IPSOURCEADDRESS) of ICMP)	  (fetch (IP IPDESTINATIONADDRESS) of ICMP))    (replace (ICMP ICMPTYPE) of ICMP with \ICMP.ECHO.REPLY)    (replace EPREQUEUE of ICMP with (QUOTE FREE))    (\ICMP.TRANSMIT ICMP])(\ICMP.SETUPICMP  [LAMBDA (ICMP TYPE CODE)                                   (* ejs: "27-Dec-84 19:00")    (replace (ICMP ICMPTYPE) of ICMP with TYPE)    (replace (ICMP ICMPCODE) of ICMP with CODE)    (add (fetch (IP IPTOTALLENGTH) of ICMP)	 \ICMPOVLEN])(\ICMP.TRANSMIT  (LAMBDA (ICMP)                                             (* ejs: "31-Dec-84 14:27")          (* * Checksum and transmit an ICMP packet)    (\IP.SET.CHECKSUM ICMP (fetch (ICMP ICMPBASE) of ICMP)		      (\IPDATALENGTH ICMP)		      (LOCF (fetch (ICMP ICMPCHECKSUM) of ICMP)))    (\IP.TRANSMIT ICMP))))(ADDTOVAR IPPRINTMACROS (1 . PRINTICMP))(PUTPROPS LLICMP COPYRIGHT ("Xerox Corporation" 1984 1985))(DECLARE: DONTCOPY  (FILEMAP (NIL (4024 8597 (PRINTICMP 4034 . 4256) (\ICMP.DEST.UNREACHABLE 4258 . 5138) (\ICMP.ECHO.TEST 5140 . 6604) (\ICMP.HANDLE.ECHO.REPLY 6606 . 6896) (\ICMP.INPUT 6898 . 7487) (\ICMP.REPLY.TO.ECHO 7489 . 7935) (\ICMP.SETUPICMP 7937 . 8240) (\ICMP.TRANSMIT 8242 . 8595)))))STOP