;;; -*- 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. ))