;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*- ;;; Private patches made by bobp ;;; Reason: ;;; ;;; Written 29-May-86 14:44:07 by bobp (Bob Powell) at site LMI Cambridge ;;; while running on Poindexter from band 2 ;;; with Experimental System 110.246, Experimental Lambda-Diag 7.23, Experimental Local-File 68.8, Experimental FILE-Server 18.4, Experimental Unix-Interface 9.1, Experimental ZMail 65.14, Experimental Object Lisp 3.4, Experimental Tape 6.38, Experimental Site Data Editor 3.3, Experimental Tiger 24.0, Experimental KERMIT 31.3, Experimental Window-Maker 1.1, Experimental Gateway 4.8, Experimental TCP-Kernel 39.7, Experimental TCP-User 62.8, Experimental TCP-Server 45.5, Experimental MEDIUM-RESOLUTION-COLOR 3.4, Experimental MICRO-COMPILATION-TOOLS 3.2, Experimental IMicro 10.0, microcode 1509, SDU Boot Tape 3.10, SDU ROM 103, Alpha IV. ; From modified file DJ: L.NETWORK.CHAOS; CHSNCP.LISP#365 at 29-May-86 14:44:12 #8R CHAOS#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; CHSNCP  " (DEFUN LAMBDA-TRANSMIT-INT-PKT (INT-PKT &OPTIONAL HOST SUBNET (broadcast-if-necessary t) &aux other-local-procs hardware-p local-proc out-of-this-machine-via-share (free-int-pkt t)) (if (null host) (setq host (pkt-dest-address int-pkt))) (if (null subnet) (setq subnet (pkt-dest-subnet int-pkt))) (COND ((AND (NOT (= SUBNET MY-SUBNET)) (NOT (MEMBER SUBNET MY-OTHER-SUBNETS))) (AND ( SUBNET (ARRAY-LENGTH ROUTING-TABLE)) (SETQ SUBNET 0)) (SETQ HOST (AR-1 ROUTING-TABLE SUBNET)))) (SETF (INT-PKT-WORD-COUNT INT-PKT) (1+ (PKT-NWORDS INT-PKT))) (ASET HOST INT-PKT (1- (INT-PKT-WORD-COUNT INT-PKT))) (if (not (int-pkt-in-correct-area-p int-pkt)) (ferror "Attempt to transmit non-interrupt packet ~A." INT-PKT)) (if (BIT-TEST #o200 (PKT-OPCODE INT-PKT)) (SETQ DATA-PKTS-OUT (1+ DATA-PKTS-OUT))) (COND ((= host my-address) (without-interrupts (setq free-int-pkt nil) (setf (int-pkt-thread int-pkt) fake-receive-list) (incf (int-pkt-word-count int-pkt) 2) (setf (int-pkt-hardware-dest int-pkt) my-address) (setf (int-pkt-bit-count int-pkt) ethernet:chaos-ethernet-type) (setq fake-receive-list int-pkt)) ) ((and (null broadcast-if-necessary) (zerop host))) ((AND si:*share-code-ready* (SI:SHARE-MODE-ACTIVE-P)) (COND ((ZEROP HOST) (SETQ HARDWARE-P (EQ SI:*ETHERNET-HARDWARE-CONTROLLER* SI:*MY-OP*)) (if (zerop (pkt-dest-address int-pkt)) ; really broadcast ? (SETQ OTHER-LOCAL-PROCS SI:*OTHER-PROCESSORS*) (unless hardware-p (setq out-of-this-machine-via-share t) (SETQ LOCAL-PROC SI:*ETHERNET-HARDWARE-CONTROLLER*)))) ;;if he's local, just send to him ((SETQ LOCAL-PROC (SI:PROCESSOR-FOR-HOST-IF-ON-MY-NUBUS HOST))) ;;it's definitely going out of this machine - give it to ;;the hardware controller ((EQ SI:*ETHERNET-HARDWARE-CONTROLLER* SI:*MY-OP*) (SETQ HARDWARE-P T)) (T (setq out-of-this-machine-via-share t) (SETQ LOCAL-PROC SI:*ETHERNET-HARDWARE-CONTROLLER*)))) (T (SETQ HARDWARE-P T))) (DOLIST (OP OTHER-LOCAL-PROCS) (si:TRANSMIT-INT-PKT-TO-SHARING-HOST INT-PKT OP out-of-this-machine-via-share)) (when (not (and (eq chaos:my-address #.(address-parse "bobp")) (eq host #.(address-parse "drac")) (not (eq (pkt-source-address int-pkt) #.(address-parse "bobp"))))) (IF LOCAL-PROC (si:TRANSMIT-INT-PKT-TO-SHARING-HOST INT-PKT LOCAL-PROC out-of-this-machine-via-share))) (when hardware-p (let ((ether-address (ethernet:get-ethernet-address host))) (cond ((null ether-address) (INCF ETHERNET:*ETHERNET-CHAOS-PKTS-NOT-TRANSMITTED-LACKING-ETHERNET-ADDRESS*)) (t (setq free-int-pkt nil) (transmit-int-pkt-on-ethernet int-pkt ether-address ethernet:chaos-ethernet-type) (incf ethernet:*ethernet-chaos-pkts-transmitted*) (incf pkts-transmitted))))) (if free-int-pkt (free-int-pkt int-pkt)) ) ))