;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.189
;;; Reason:
;;;  Create net:network-driver-initialization-list and make it accessible to
;;;  (add-initialization) via :network-driver keyword.  Makes it easy to add
;;;  a new device driver without hacking (net:configure)
;;; Written 21-Jan-88 13:40:51 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.186, Experimental Local-File 73.3, Experimental FILE-Server 22.1, Experimental Unix-Interface 11.0, Experimental Tape 18.0, Experimental KERMIT 34.3, 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; PACKAGES.LISP#27 at 21-Jan-88 13:49:40
#10R USER#: #!:CL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "USER")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; PACKAGES  "

(defpackage network
  (:use "LISP")
  (:nicknames "NET")
  (:import-from 'global
		"ADD-INITIALIZATION"
		"ARRAY-INDEXED-P"
		"ARRAY-INITIALIZE"
		"ARRAY-LEADER"
		"ARRAY-LENGTH"
		"COPY-ARRAY-CONTENTS"
		"COPY-ARRAY-PORTION"
		"DEFSELECT"
		"DEFSELECT-INCREMENTAL"
		"DEFSUBST"
		"DELETE-INITIALIZATION"
		"FALSE"
		"INITIALIZATIONS"
		"LOCF"
		"MAKE-PROCESS"
		"NAMED-STRUCTURE-INVOKE"
		"NAMED-STRUCTURE-P"
		"NCONS"
		"PROCESS-RUN-FUNCTION"
		"PROCESS-WAIT"
		"PROCESS-WAIT-WITH-TIMEOUT"
		"SELECT-PROCESSOR"
		"STRING-APPEND"
		"STRING-LENGTH"
		"STRING-SEARCH"
		"STRING-SEARCH-CHAR"
		"STRING-SEARCH-SET"
		"SUBSTRING"
		"TIME-DIFFERENCE"
		"TIME-INCREMENT"
		"TIME-LESSP"
		"TRUE"
		"WITH-LOCK"
		"WITHOUT-INTERRUPTS"
		"ZUNDERFLOW"
		;;Flavor stuff
		"COMPILE-FLAVOR-METHODS"
		"DEFFLAVOR"
		"DEFMETHOD"
		"LEXPR-SEND"
		"MAKE-INSTANCE"
		"SELF"
		"SEND"
		;;Debugging stuff
		"EH-ARG"
		"EH-LOC"
		)
  (:export
                "ADD-INITIALIZATION"
		"ARRAY-INDEXED-P"
		"ARRAY-INITIALIZE"
		"ARRAY-LEADER"
		"ARRAY-LENGTH"
		"COPY-ARRAY-CONTENTS"
		"COPY-ARRAY-PORTION"
		"DEFSELECT"
		"DEFSELECT-INCREMENTAL"
		"DEFSUBST"
		"DELETE-INITIALIZATION"
		"FALSE"
		"INITIALIZATIONS"
		"LOCF"
		"MAKE-PROCESS"
		"NAMED-STRUCTURE-INVOKE"
		"NAMED-STRUCTURE-P"
		"NCONS"
		"PROCESS-RUN-FUNCTION"
		"PROCESS-WAIT"
		"PROCESS-WAIT-WITH-TIMEOUT"
		"SELECT-PROCESSOR"
		"STRING-APPEND"
		"STRING-LENGTH"
		"STRING-SEARCH"
		"STRING-SEARCH-CHAR"
		"STRING-SEARCH-SET"
		"SUBSTRING"
		"TIME-DIFFERENCE"
		"TIME-INCREMENT"
		"TIME-LESSP"
		"TRUE"
		"WITH-LOCK"
		"WITHOUT-INTERRUPTS"
		"ZUNDERFLOW"
		;;Flavor stuff for tcp-stream
		"COMPILE-FLAVOR-METHODS"
		"DEFFLAVOR"
		"DEFMETHOD"
		"LEXPR-SEND"
		"MAKE-INSTANCE"
		"SELF"
		"SEND"
		;;Debugging stuff
		"EH-ARG"
		"EH-LOC"
		))

))

; From modified file DJ: L.SYS; LTOP.LISP#575 at 21-Jan-88 13:41:10
#8R SYSTEM-INTERNALS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: SYS; LTOP  "

(DEFCONST INITIALIZATION-KEYWORDS
	  '((:SITE SITE-INITIALIZATION-LIST :NOW)
	    (:SITE-OPTION SITE-OPTION-INITIALIZATION-LIST :NOW)
	    (:DISABLE-SERVICES DISABLE-SERVICES-INITIALIZATION-LIST)
	    (:ENABLE-SERVICES ENABLE-SERVICES-INITIALIZATION-LIST)
	    (:SYSTEM SYSTEM-INITIALIZATION-LIST :FIRST)
	    (:FULL-GC GC::FULL-GC-INITIALIZATION-LIST)
	    (:AFTER-FULL-GC GC::AFTER-FULL-GC-INITIALIZATION-LIST)
	    (:GC-SYSTEM-RELEASE GC::GC-SYSTEM-RELEASE-INITIALIZATION-LIST)
	    (:ONCE ONCE-ONLY-INITIALIZATION-LIST :FIRST)
	    (:LOGIN LOGIN-INITIALIZATION-LIST)
	    (:LOGOUT LOGOUT-INITIALIZATION-LIST)
	    (:WARM WARM-INITIALIZATION-LIST)
	    (:COLD COLD-INITIALIZATION-LIST)
	    (:BEFORE-COLD BEFORE-COLD-INITIALIZATION-LIST)
	    (:network-driver net:network-driver-initialization-list))
  "Alist defining keywords accepted by ADD-INITIALIZATION.
Each element looks like (KEYWORD LIST-VARIABLE-NAME [TIME-TO-RUN])
TIME-TO-RUN should be NOW, FIRST, NORMAL or REDO, or omitted.
It is a default in case the ADD-INITIALIZATION doesn't specify any of them.")

))

; From modified file DJ: L.NETWORK.KERNEL; NETWORK-INTERFACE.LISP#123 at 21-Jan-88 13:41:26
#10R NETWORK#: #!:CL
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "NETWORK")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERNEL; NETWORK-INTERFACE  "

(defvar network-driver-initialization-list nil "The initialization list for network drivers")

))

; From modified file DJ: L.NETWORK.DRIVERS; LOOPBACK.LISP#18 at 21-Jan-88 13:45:33
#10R NETWORK#: #!:CL
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "NETWORK")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; DRIVERS; LOOPBACK  "

(add-initialization "Start Loopback interface" '(setup-loopback "LOOPBACK") :network-driver)

))

; From modified file DJ: L.NETWORK.DRIVERS; SHARE.LISP#73 at 21-Jan-88 13:45:38
#10R SYSTEM-INTERNALS#: #!:CL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; DRIVERS; SHARE  "

(add-initialization "Start Share interface" '(setup-share-interface "SHARE") :network-driver)

))

; From modified file DJ: L.NETWORK.DRIVERS; CADR.LISP#26 at 21-Jan-88 13:46:33
#10R CHAOS#: #!:CL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "CHAOS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; DRIVERS; CADR  "

(add-initialization "Start CADR interface" '(setup-cadr-network "ONE") :network-driver)

))

; From modified file DJ: L.NETWORK.DRIVERS; EXPLORER.LISP#23 at 21-Jan-88 13:47:14
#10R ETHERNET#: #!:CL
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "ETHERNET")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; DRIVERS; EXPLORER  "

(add-initialization "Start EXPLORER interface" '(setup-explorer-ethernet "ONE") :network-driver)

))

; From modified file DJ: L.NETWORK.KERNEL; CONFIGURE.LISP#89 at 21-Jan-88 13:54:41
#10R NETWORK#: #!:CL
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "NETWORK")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERNEL; CONFIGURE  "

(defun setup-lambda-ethernet (tag)
  (when (eq si:processor-type-code si:lambda-type-code)
    (si:set-processor-owning-ethernet :find :3com)
    (cond ((eq ethernet:*3com-owner* si:*my-op*)
	   (ethernet:setup-3com TAG)
	   (si:set-processor-owning-ethernet :give-up :excelan))
	  (t
	   (si:set-processor-owning-ethernet :find :excelan)
	   (if (eq ethernet:*excelan-owner* si:*my-op*)
	       (ethernet:setup-excelan TAG))))))

))

; From modified file DJ: L.NETWORK.KERNEL; CONFIGURE.LISP#89 at 21-Jan-88 13:55:24
#10R NETWORK#: #!:CL
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "NETWORK")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERNEL; CONFIGURE  "

(add-initialization "Start Lambda Ethernet interface" '(setup-lambda-ethernet "ONE") :network-driver)

))

; From modified file DJ: L.NETWORK.KERNEL; CONFIGURE.LISP#89 at 21-Jan-88 13:58:10
#10R NETWORK#: #!:CL
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "NETWORK")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERNEL; CONFIGURE  "

(defun configure ()
  ;; If we are in the cold load, do a mini-configuration
  (when si:*in-cold-load-p*
    (cold-load-configure)
    (return-from configure t))

  ;; Clear out current network configuration
  (deconfigure)

  ;; Reset the int-pkts
  (initialize-network-buffers)
  
  ;; Put the network clock function onto the clock list
  (without-interrupts
    (pushnew 'net:network-clock sys:clock-function-list))
  
  ;; Start the device drivers
  (initializations 'network-driver-initialization-list t)
  
  ;; Start the protocol modules
  (when (eq si:*my-op* si:*ethernet-hardware-controller*)
    (arp:setup-arp))
  (chaos:setup-chaos)

  (let ((ip-address-p (ip:setup-ip)))
    (cond (ip-address-p
	   (icmp:setup-icmp)
	   (udp:setup-udp)
	   (tcp:setup-tcp))
	  (t
	   (tv:notify nil "This processor has no Internet Address")))
  
    (select-processor
      (:lambda
	;;KLUDGE: share interface must be set up before chaos, as chaos enables itself on share device --
	;;but share interface sets %processor-conf-chaos-address, so must reset it after chaos
	;;has set its address
	(send si:share-interface :reset)
	;; for all of our other processors, set up ARP translation for share interface
	(setq *processor-forwarding-alist* nil)
	(dolist (op si:*other-processors*)
	  (push (cons op nil) *processor-forwarding-alist*)
	  (dolist (domain '(:chaos :internet))
	    (let ((address (find-network-address-for-other-processor op domain)))
	      (when address
		(add-address-info address domain si:share-interface op))))))
      ((:cadr :explorer)))

    (dolist (x (ni-address-alist *loopback-interface*))
      ;;For all protocols enabled on the loopback interface, set up address translations
      (when (second x)
	(add-address-info (second x) (first x) *loopback-interface* nil)))

    (when ip-address-p
      ;;Start the TCP/UDP server process and enable network services
      (tcp-application:initialize-tcp-server-process)
      (tcp-application:enable-all-network-services)
      (tcp-application:initialize-udp-rwho-server-process)))

  ;;Start the network receiver process
  (start-receiver)

  (setup-network-gauges)			;If Fancy-Landscape enabled, populate screen with gauges

  t)

))
