;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for System version 123.94
;;; Reason:
;;;  Chaosnet speedup: reinstall %blt to and from int-pkts if lambda or explorer.
;;; Written 4-Nov-87 14:51:51 by pld at site LMI Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.91, Experimental Local-File 73.0, Experimental FILE-Server 22.0, Experimental Unix-Interface 11.0, Experimental Tape 18.0, Experimental KERMIT 34.0, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, microcode 1754, SDU Boot Tape 3.12, SDU ROM 8.



; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 14:59:08
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(defun convert-to-pkt (int-pkt &optional (free-pkt-flag t)
		       &aux (pkt (allocate-pkt)) (nw (pkt-nwords int-pkt)))
  "Allocates a new packet, copies the INT-PKT to it, and then deallocates the INT-PKT"
  (select-processor
    ((:lambda :explorer)
     (without-interrupts
       (%blt (%make-pointer-offset dtp-fix int-pkt (si:array-data-offset int-pkt))
	     (%make-pointer-offset dtp-fix pkt (si:array-data-offset pkt))
	     (ceiling nw 2)
	     1)))
    (:cadr
      (copy-array-portion int-pkt 0 nw pkt 0 nw)))
  (setf (fill-pointer (pkt-string pkt)) (pkt-nbytes int-pkt))
  (and free-pkt-flag (net:free-packet int-pkt))
  pkt)

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 14:59:13
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(defun convert-to-int-pkt (pkt &optional (int-pkt (net:allocate-packet))
			   &aux (nw (pkt-nwords pkt)))
  (select-processor
    ((:lambda :explorer)
     (without-interrupts
       (%blt (%make-pointer-offset dtp-fix pkt (si:array-data-offset pkt))
	     (%make-pointer-offset dtp-fix int-pkt (si:array-data-offset int-pkt))
	     (ceiling nw 2)
	     1)))
    (:cadr
      (copy-array-portion pkt 0 nw int-pkt 0 nw)))
  (setf (fill-pointer int-pkt) nw)
  int-pkt)

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 14:59:23
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-EOF-OR-DAT (CONN INT-PKT &AUX PKT PKT-NUM PKTL-NUM PREV)
  (SETQ PKT-NUM (PKT-NUM INT-PKT))
  (COND ((NOT (PKTNUM-< (PKT-NUM-RECEIVED CONN) PKT-NUM))
	 (SETQ PKTS-DUPLICATED (1+ PKTS-DUPLICATED))
	 (TRANSMIT-STS CONN '<-NUM-RCVD int-pkt))	;This is a duplicate, receipt and ignore
	((= PKT-NUM (PKTNUM-1+ (PKT-NUM-RECEIVED CONN)))
	 ;; This is the one we were waiting for add it to READ-PKTS
	 (SETQ PKT (CONVERT-TO-PKT INT-PKT))
	 (AND (NULL (READ-PKTS CONN))
	      (INTERRUPT-CONN :INPUT CONN))
	 (WITHOUT-INTERRUPTS
	   (SETF (PKT-LINK PKT) (RECEIVED-PKTS CONN))	;Link the two lists together
	   (SETF (RECEIVED-PKTS CONN) NIL)
	   (COND ((NULL (READ-PKTS-LAST CONN))
		  (SETF (READ-PKTS CONN) PKT))
		 (T (SETF (PKT-LINK (READ-PKTS-LAST CONN)) PKT)))
	   (DO ((PKTL-NUM (PKT-NUM PKT)
			  (PKTNUM-1+ PKTL-NUM)))
	       ((OR (NULL PKT)
		    ( PKTL-NUM (PKT-NUM PKT)))
		(SETF (PKT-NUM-RECEIVED CONN) (PKTNUM-- PKTL-NUM 1))
		(SETF (RECEIVED-PKTS CONN) PKT)
		(AND PREV (SETF (PKT-LINK PREV) NIL))
		(SETF (READ-PKTS-LAST CONN) PREV))
	     (SETQ PREV PKT)
	     (SETQ PKT (PKT-LINK PKT)))))
	(T (WITHOUT-INTERRUPTS 
	     (DO ((PKTL (RECEIVED-PKTS CONN) (PKT-LINK PKTL))
		  (PREV NIL PKTL))
		 ((NULL PKTL)
		  (SETQ PKT (CONVERT-TO-PKT INT-PKT))
		  (COND ((NULL PREV) (SETF (RECEIVED-PKTS CONN) PKT))
			(T (SETF (PKT-LINK PREV) PKT)))
		  (SETF (PKT-LINK PKT) NIL))
	       (SETQ PKTL-NUM (PKT-NUM PKTL))
	       (COND ((= PKT-NUM PKTL-NUM)	;Same as existing one, forget about it.
		      (TRANSMIT-STS CONN 'ALREADY-ON-RCVD-PKTS int-pkt)	;Send a receipt
		      (RETURN NIL))
		     ((PKTNUM-< PKT-NUM PKTL-NUM)	;This is the place!
		      (SETQ PKT (CONVERT-TO-PKT INT-PKT))
		      (COND ((NULL PREV)
			     (SETF (PKT-LINK PKT) (RECEIVED-PKTS CONN))
			     (SETF (RECEIVED-PKTS CONN) PKT))
			    (T
			     (SETF (PKT-LINK PKT) (PKT-LINK PREV))
			     (SETF (PKT-LINK PREV) PKT)))
		      (RETURN NIL))))))))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 14:59:49
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-UNC (CONN INT-PKT &AUX PKT)
  (PROG ()
    (COND ((EQ (STATE CONN) 'FOREIGN-STATE))	;Foreign-protocol state--no checks
	  ((NEQ (STATE CONN) 'OPEN-STATE)
	   (RETURN (TRANSMIT-LOS-INT-PKT INT-PKT LOS-OP "Connection not open")))
	  ((NOT (= (PKT-SOURCE-INDEX-NUM INT-PKT) (FOREIGN-INDEX-NUM CONN)))
	   (RETURN (TRANSMIT-LOS-INT-PKT INT-PKT LOS-OP
			  "That is not your index number for this connection"))))
    (COND (( (LOOP FOR X = (READ-PKTS CONN) THEN (PKT-LINK X)
		    WHILE X
		    COUNT T)
	      (LOCAL-WINDOW-SIZE CONN))
	   ;; There are more packets on the list than the window size.  Discard
	   ;; this packet.  This is so that we do not allocate infinite packet
	   ;; buffers if someone throws lots of UNC packets at us.
	   (NET:FREE-PACKET INT-PKT))
	  (T
	   ;; Convert to regular packet, do INTERRUPT-CONN, and thread it on.
	   (SETQ PKT (CONVERT-TO-PKT INT-PKT))
	   (AND (NULL (READ-PKTS CONN))
		(INTERRUPT-CONN :INPUT CONN))
	   (WITHOUT-INTERRUPTS
	     (SETF (PKT-LINK PKT) (READ-PKTS CONN))
	     (SETF (READ-PKTS CONN) PKT)
	     (AND (NULL (READ-PKTS-LAST CONN))
		  (SETF (READ-PKTS-LAST CONN) PKT)))))))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 15:00:05
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-RFC (INT-PKT)
  (IF (DUPLICATE-RFC-INT-PKT-P INT-PKT)
      (NET:FREE-PACKET INT-PKT)
    (HANDLE-RFC-PKT (CONVERT-TO-PKT int-pkt nil) int-pkt T)))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 15:00:21
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-BRD (INT-PKT &AUX BIT-MAP-LENGTH BYTE-IN-MAP PKT)
  (COND ((AND *RECEIVE-BROADCAST-PACKETS-P*
	      ;; Check the subnet bit map : length in bytes multiple of 4 ?
	      (ZEROP (MOD (SETQ BIT-MAP-LENGTH (PKT-ACK-NUM INT-PKT)) 4))
	      (> BIT-MAP-LENGTH (SETQ BYTE-IN-MAP (TRUNCATE MY-SUBNET 8)))) ; big enuf ?
	 ;; Massage so it looks like an RFC: Delete bit map, decrease byte count
	 (SETF (PKT-ACK-NUM INT-PKT) 0)
	 (INCF *BRD-PKTS-IN*)
	 (SETQ PKT (CONVERT-TO-PKT INT-PKT nil))
	 (SET-PKT-STRING PKT (SUBSTRING (PKT-STRING PKT) BIT-MAP-LENGTH))
	 (HANDLE-RFC-PKT PKT int-pkt NIL))
	(T
	 (NET:FREE-PACKET INT-PKT))))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 15:00:29
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-CLS (INT-PKT &AUX PKT (INT-FLAG NIL))
  (LET ((CONN (PKT-DEST-CONN INT-PKT)))
    (COND ((NULL CONN)
	   (NET:FREE-PACKET INT-PKT))
	  ((MEMQ (STATE CONN) '(OPEN-STATE RFC-SENT-STATE))
	   (SETQ PKT (CONVERT-TO-PKT INT-PKT))
	   (WITHOUT-INTERRUPTS
	     (FREE-ALL-SEND-PKTS CONN)
	     (FREE-ALL-RECEIVED-PKTS CONN)
	     (SETF (STATE CONN) 'CLS-RECEIVED-STATE)
	     (COND ((NULL (READ-PKTS-LAST CONN))
		    (SETF (READ-PKTS CONN) PKT)
		    (SETQ INT-FLAG T))
		   (T (SETF (PKT-LINK (READ-PKTS-LAST CONN)) PKT)))
	     (SETF (READ-PKTS-LAST CONN) PKT)
	     (SETF (PKT-LINK PKT) NIL))
	   (INTERRUPT-CONN :CHANGE-OF-STATE CONN 'CLS-RECEIVED-STATE)
	   (AND INT-FLAG (INTERRUPT-CONN :INPUT CONN)))
	  (T (TRANSMIT-LOS-INT-PKT INT-PKT
				   LOS-OP
				   "You sent a CLS to the wrong kind of connection.")))))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 15:00:38
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-LOS (INT-PKT &AUX (PKT (CONVERT-TO-PKT INT-PKT)) MY-INDEX CONN (INT-FLAG NIL))
  (SETQ MY-INDEX (LDB MAXIMUM-INDEX-LOG-2-MINUS-1 (PKT-DEST-INDEX-NUM PKT)))
  (COND ((AND (< MY-INDEX MAXIMUM-INDEX)
	      (SETQ CONN (AREF INDEX-CONN MY-INDEX))
	      (EQ (STATE CONN) 'OPEN-STATE)
	      (= (PKT-SOURCE-ADDRESS INT-PKT) (FOREIGN-ADDRESS CONN))
	      (= (PKT-SOURCE-INDEX-NUM INT-PKT) (FOREIGN-INDEX-NUM CONN)))
	 (WITHOUT-INTERRUPTS
	   (FREE-ALL-SEND-PKTS CONN)
	   (FREE-ALL-RECEIVED-PKTS CONN)
	   (SETF (STATE CONN) 'LOS-RECEIVED-STATE)
	   (COND ((NULL (READ-PKTS-LAST CONN))
		  (SETF (READ-PKTS CONN) PKT)
		  (SETQ INT-FLAG T))
		 (T (SETF (PKT-LINK (READ-PKTS-LAST CONN)) PKT)))
	   (SETF (READ-PKTS-LAST CONN) PKT)
	   (SETF (PKT-LINK PKT) NIL))
	 (INTERRUPT-CONN :CHANGE-OF-STATE CONN 'LOS-RECEIVED-STATE)
	 (AND INT-FLAG (INTERRUPT-CONN :INPUT CONN)))
	(T (SETF (PKT-LINK PKT) LOS-PKTS)
	   (SETQ LOS-PKTS PKT)
	   (SETQ CURRENT-LOS-PKT-COUNT (1+ CURRENT-LOS-PKT-COUNT)))))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 15:00:47
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-FWD (CONN INT-PKT &AUX PKT)
  (COND ((NEQ (STATE CONN) 'RFC-SENT-STATE)
	 (TRANSMIT-LOS-INT-PKT INT-PKT LOS-OP "An FWD was sent to a non-RFC-SENT index."))
	(T (SETQ PKT (CONVERT-TO-PKT INT-PKT))
	   (SETF (FOREIGN-ADDRESS CONN) (PKT-ACK-NUM PKT))
	   (SETF (PKT-OPCODE PKT) RFC-OP)
	   (TRANSMIT-NORMAL-PKT CONN PKT (PKT-NUM-SENT CONN) (LOCAL-WINDOW-SIZE CONN)))))

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#398 at 4-Nov-87 15:00:52
#10R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIVE-ANS (CONN INT-PKT &AUX PKT)
    (COND ((NOT (MEMQ (STATE CONN) '(RFC-SENT-STATE BROADCAST-SENT-STATE)))
	   (NET:FREE-PACKET INT-PKT))
	  (T (SETQ PKT (CONVERT-TO-PKT INT-PKT))
             (SETF (STATE CONN) 'ANSWERED-STATE)
	     (SETF (READ-PKTS CONN) PKT)
	     (SETF (PKT-LINK PKT) NIL)
	     (INTERRUPT-CONN :CHANGE-OF-STATE CONN 'ANSWERED-STATE)
	     (INTERRUPT-CONN :INPUT CONN))))

))
