;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for System version 123.204
;;; Reason:
;;;  A few problems with (ip:initialize-route-table):
;;;    - If called when we are not currently enabled for IP, but we do have an IP
;;;      address (e.g. when just loaded proper site files), used to get an error
;;;      in (ip:add-gateway) because we had no "default-interface"
;;;    - The Share interface ended up being our *default-interface* even when we
;;;      controlled the Ethernet.
;;; Written 8-Feb-88 17:21:45 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.203, Experimental Local-File 73.3, Experimental FILE-Server 22.1, Experimental Unix-Interface 11.0, Experimental KERMIT 34.3, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, Experimental Tape 21.1, microcode 1754, SDU Boot Tape 3.12, SDU ROM 8.



; From modified file DJ: L.NETWORK.IP-TCP.KERNEL; IP.LISP#284 at 8-Feb-88 17:21:46
#10R INTERNET#: 
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "INTERNET")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; IP-TCP; KERNEL; IP  "

(defun initialize-route-table (default-internet-address)
  (when default-internet-address
    (setq *default-gateway* nil)
    (setq *default-interface* nil)
    (when (consp default-internet-address)
      ;;If given a list of addresses, assume the first is the default
      (setq default-internet-address (first default-internet-address)))
    (let ((r (global:get-site-option :default-internet-routing))
	  (default-interface nil))
      (setq *route-table* nil)
      ;;Add entries for directly connected networks
      (setq *default-network-numbers* nil)
      (dolist (ni *network-interfaces*)
	(let ((my-address (second (assoc :internet (net:ni-address-alist ni) :test #'eq))))
	  (when my-address			;If we have an Internet address on this network...
	    (let* ((ip-on-ni (assoc :internet (net:ni-network-alist ni) :test #'eq))
		   (my-network (second ip-on-ni))
		   (mask (third ip-on-ni)))
	      (when my-network			;If this directly connects us to another network
		(when (= my-address default-internet-address)	;If this interface has my default address...
		  (setq default-interface ni))	                ;make it my default interface
		(let ((network-number (logand mask my-network)))
		  (push (cons network-number mask) *default-network-numbers*)
		  (add-gateway network-number my-address ni)))))))
      ;;Add entries for gateways listed in site files
      (when default-interface			;If we are not currently enabled for IP, nothing to do...
	(cond ((null r))
	      ((atom r)
	       (let ((parsed-address (parse-internet-address r)))
		 (if parsed-address
		     (add-gateway 0 parsed-address default-interface)
		   (tv:careful-notify nil t "Bad Internet Address in :default-internet-routing site option: ~S" r))))
	      ((listp r)
	       (dolist (elem r)
		 (let ((parsed-network (parse-internet-address (first elem)))
		       (parsed-gateway (parse-internet-address (second elem))))
		   (if (and parsed-network parsed-gateway)
		       (add-gateway parsed-network parsed-gateway default-interface)
		     (tv:careful-notify nil t "Bad entry in :default-internet-routing site option: ~S" elem)))))
	      (t nil))))
    (let ((op-address nil))
      (cond ((null si:*ethernet-hardware-controller*))	;No network interface?  Too bad...
	    ((eq si:*ethernet-hardware-controller* si:*my-op*))	;We talk directly to ethernet?  Good...
	    ((setq op-address (net:find-network-address-for-other-processor si:*ethernet-hardware-controller* :internet))
	     (add-gateway 0 op-address si:share-interface))
	    (t
	     (tv:careful-notify nil t "The si:*ethernet-hardware-controller* has no Internet Address"))))))

))
