;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*- ;;; Patch file for System version 121.65 ;;; Reason: ;;; Restore commented out line in chaos:get-next-pkt that (partially) controlled ;;; when an acknowledgement was generated. ;;; Written 22-Oct-87 13:24:50 by HLC at site LMI Cambridge ;;; while running on Djinn from band 1 ;;; with Experimental System 121.64, 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, microcode 1733, SDU ROM 8, 121.35. ; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#391 at 22-Oct-87 13:24:54 #10R CHAOS#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  " (DEFUN GET-NEXT-PKT (CONN &OPTIONAL (NO-HANG-P NIL) (WHOSTATE "Chaosnet Input") (CHECK-CONN-STATE (NOT NO-HANG-P)) &AUX PKT) "Return the next input packet from connection CONN. The packet may contain data, or it may be a CLS, ANS or UNC. If the next input packet is not are available, either wait or return NIL according to NO-HANG-P. WHOSTATE is what to put in the who-line while we wait, if we wait. CHECK-CONN-STATE non-NIL says get an error now if connection is in an invalid state. Default is T unless NO-HANG-P. When you are finished with the data in the packet, use RETURN-PKT to allow the chaosnet ncp to reuse the packet." ;; Loop until we get a packet, decide not to hang, or error out (DO-FOREVER ;; Check for connection in an erroneous state (AND CHECK-CONN-STATE (OR (MEMQ (STATE CONN) '(OPEN-STATE RFC-RECEIVED-STATE ANSWERED-STATE FOREIGN-STATE)) (IF (EQ (STATE CONN) 'CLS-RECEIVED-STATE) (UNLESS (READ-PKTS CONN) (FERROR 'SYS:CONNECTION-NO-MORE-DATA "~Attempt to receive from ~S,~%~ a connection which has been closed by foreign host.~" CONN)) (REPORT-BAD-CONNECTION-STATE CONN "receive from")))) ;; Now see if there are any packets we can have (WITHOUT-INTERRUPTS (SETQ PKT (READ-PKTS CONN)) (COND (PKT ;Got packet, take off of read list (AND ( UNC-OP (PKT-OPCODE PKT)) (SETF (PKT-NUM-READ CONN) (PKT-NUM PKT))) (SETF (READ-PKTS CONN) (PKT-LINK PKT)) (COND ((NULL (READ-PKTS CONN)) (SETF (READ-PKTS-LAST CONN) NIL)))))) (AND (NOT (NULL PKT)) ;Got packet, acknowledge if necessary (EQ (STATE CONN) 'OPEN-STATE) ( (* 3 (PKTNUM-- (PKT-NUM PKT) (PKT-NUM-ACKED CONN))) (LOCAL-WINDOW-SIZE CONN)) (TRANSMIT-STS CONN 'WINDOW-FULL)) (AND PKT ;Got packet, release from NCP (RELEASE-PKT PKT)) (AND (OR PKT NO-HANG-P) (RETURN PKT)) ;If satisfied, return ;; Not satisfied, wait for something interesting to happen (PROCESS-WAIT WHOSTATE #'(LAMBDA (X) (OR (READ-PKTS X) (NOT (MEMQ (STATE X) '(OPEN-STATE FOREIGN-STATE))))) CONN))) ))