;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 121.16
;;; Reason:
;;;  Not sending the last buffer received in the STS message turns out to be a loser when talking to
;;;  machines like ANGEL that properly use that field.  Thus:  go back to including that number in the
;;;  STS message and use that number in RECEIPT to determine which send buffers to free up -- but properly
;;;  use the ACK number to decide which packets update the send window.
;;;  Note: YOU WILL LOSE when doing high bandwidth transfers FROM machines that don't have this patch.
;;; Written 29-Jan-87 13:34:05 by pld (Peter L. DeWolf) at site LMI Cambridge
;;; while running on Azathoth from band 3
;;; with Experimental System 121.15, Experimental Lambda-Diag 15.0, Experimental ZMail 70.2, Experimental KERMIT 32.0, Experimental Unix-Interface 10.0, Experimental Local-File 72.0, Experimental FILE-Server 21.0, Experimental Tape 13.0, Experimental Site Data Editor 4.0, microcode 1730, SDU Boot Tape 3.12, SDU ROM 102, the old ones.



; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#375 at 29-Jan-87 13:34:12
#8R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN TRANSMIT-STS (CONN WHY &optional PKT)
  (SETF (AREF STS-WHY-ARRAY (ARRAY-LEADER STS-WHY-ARRAY 1)) WHY)
  (SETF (ARRAY-LEADER STS-WHY-ARRAY 1) (\ (1+ (ARRAY-LEADER STS-WHY-ARRAY 1)) #o100))
  (unless pkt
    (SETQ PKT (ALLOCATE-INT-PKT)))
  (SETF (PKT-OPCODE PKT) STS-OP)
  (SETF (PKT-NBYTES-on-write PKT) 4)
  ;;Set the first-data-word to the highest packet number successfully received
  (SETF (PKT-FIRST-DATA-WORD PKT) (PKT-NUM-RECEIVED CONN))
  (SETF (PKT-SECOND-DATA-WORD PKT) (LOCAL-WINDOW-SIZE CONN))
  (TRANSMIT-INT-PKT-FOR-CONN CONN PKT))

;;;; Output-Main Program level

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#375 at 29-Jan-87 13:34:14
#8R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "

(DEFUN RECEIPT (CONN ACK-LEV &optional (rec-lev ack-lev))
 (WITHOUT-INTERRUPTS
  (LET ((SENDS (SEND-PKTS CONN))	;(Save array references...)
	(NEXT NIL)			;Prevent weird screw.
	(LENGTH (SEND-PKTS-LENGTH CONN)))
    (DO ((PKT SENDS NEXT))		;For each PKT not yet ACKed which this ACKs,
	((OR (NULL PKT) (PKTNUM-< rec-LEV (PKT-NUM PKT))))
;     (SETQ NEXT (PKT-LINK PKT))
      (SETQ NEXT (SETQ SENDS (PKT-LINK PKT)))  ;Two variables only for "clairity"
      (FREE-PKT PKT)
      (SETQ LENGTH (1- LENGTH)))
    
    (SETF (SEND-PKTS CONN) SENDS)
    (SETF (SEND-PKTS-LENGTH CONN) LENGTH)
    (COND ((NULL SENDS) (SETF (SEND-PKTS-LAST CONN) NIL))))
  (if (PKTNUM-< (SEND-PKT-ACKED CONN) ack-lev)
      (SETF (SEND-PKT-ACKED CONN) ack-lev))
  (update-window-available conn)))

;;; A new ack has come in, so adjust the amount left in the window.  If the window was
;;; full, and has now become "un-full", cause an output interrupt

))

; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#375 at 29-Jan-87 13:34:16
#8R CHAOS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  "


(DEFUN RECEIVE-STS (CONN INT-PKT)
  (SETF (FOREIGN-WINDOW-SIZE CONN) (PKT-SECOND-DATA-WORD INT-PKT))
  (RECEIPT CONN (PKT-ACK-NUM INT-PKT) (pkt-first-data-word int-pkt))
  (FREE-INT-PKT INT-PKT))

;;; When this is called, CONN is known to be in OPEN-STATE.

))
