Google
 

Trailing-Edge - PDP-10 Archives - TOPS-20_V6.1_DECnetSrc_7-23-85 - mcb/xpt/xptupd.bli
There is 1 other file named xptupd.bli in the archive. Click here to see a list.
module XPTUPD	(
		IDENT = 'X01110'
		) =
begin

!
!                    COPYRIGHT (c) 1980, 1981, 1982
!                    DIGITAL EQUIPMENT CORPORATION
!                        Maynard, Massachusetts
!
!     This software is furnished under a license and may  be  used
!     and copied only in accordance with the terms of such license
!     and with the inclusion of the above copyright notice.   This
!     software  or any other copies thereof may not be provided or
!     otherwise made available to any other person.  No  title  to
!     and ownership of the software is hereby transferred.
!
!     The information  in  this  software  is  subject  to  change
!     without  notice  and should not be construed as a commitment
!     by DIGITAL EQUIPMENT CORPORATION.
!
!     DIGITAL assumes no responsibility for the use or reliability
!     of  its  software  on  equipment  which  is  not supplied by
!     DIGITAL.
!

!++
! FACILITY:	Transport
!
! ABSTRACT:
!
!	Transport update module; responsible for the propagation of
!	routing messages.
!
! ENVIRONMENT:	MCB
!
! AUTHOR: L. Webber , CREATION DATE: 20-Jul-79
!
! MODIFIED BY:
!
!	L. Webber, 20-Jul-79 : VERSION 01
!
! 1.01	L. Webber, 23-Oct-79
!	Rewrote routines UPDTIM and UPDFMT
!
! 1.02	L. Webber, 1-Apr-80
!	Modified Transport data base structure; added
!	Node and Line sub-data-bases.
!
! 1.03	L. Webber, 30-Jun-80
!	Modify to use MCBLIB macros
!
! 1.04	L. Webber, 21-Nov-80
!	Fix UPDTIM to clear SRM after sending a message
!
! 1.05	L. Webber, 11-Dec-80
!	Modify to support MCB 3.1
!
! 1.06	L. Webber, 9-Feb-81
!	Change references to SNDBUF to CALL$E
!
! 1.07	L. Webber, 9-Feb-81
!	Change back to direct call; an interface routine has been added.
!
! 1.08	L. Webber, 10-Feb-81
!	This module is now in XPE; SNDBUF now becomes _SNDBUF and CALL$,
!	while UPDTIM itself becomes CALL$.
!
! 1.09	L. Webber, 3-Jun-81
!	Allocate a buffer of a specific size rather than an LDB.
!
! 1.10	A. Peckham, 22-Apr-82
!       Eliminate GETLINE, GETNODE references.
!
! 1.11	A. Peckham, 23-Sep-82
!       Send shortened routing messages to nodes with fences.
!
!--
!
! INCLUDE FILES:
!

require 'XPTMAC';

!
! TABLE OF CONTENTS
!

forward routine
	UPDFMT: LINKAGE_DB_CCB novalue;

!
! MACROS:
!

!
! EQUATED SYMBOLS:
!

!
! OWN STORAGE:
!

!
! EXTERNAL REFERENCES:
!

external routine
    _SNDBUF: CALL$ novalue;
routine UPDFMT (LINEb,CCB): LINKAGE_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Formats and sends a routing message over the specified line.
!
! FORMAL PARAMETERS
!
!       LINEb   Line over which to send the message
!	CCB	LDB in which to build the routing message
!
! IMPLICIT INPUTS
!
!	Minhop,Mincost.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
map CCB: ref block field (C_XPT_fields);
require 'XPTSYM';
pointer PTR;
local NO_NODES,SUM;

begin                          ! Get number of nodes to process
bind MXA = NO_NODES: ref vector;

if (MXA = .NODEmaximum_address_vector) neqa 0
then begin
     if (MXA = .MXA [.Nid - 1]) neq 0
     then begin
          if .MXA gtr NN
          then MXA = NN;
          end
     else MXA = NN;
     end
else MXA = NN;
end;
CCB[C_XPT_TYPE] = UPDATEcode;           ! Move buffer type into CCB
CCB[C_XPT_SUBTYPE] = UPDATEcode;	!  (subtype also)
MAPBUF(.CCB,PTR);                       ! Map to buffer and get address
putb(7,PTR);				! Put in control flags
putb(.(Tid)<0,8>,PTR);			! Put in source node (us)
putb(.(Tid)<8,8>,PTR);
SUM = 0;				! Initialize checksum
$XPT_for_each_NODEb_do_begin
    local WORK;
    if .NODEaddress gtr .NO_NODES then exitloop;
    WORK = .Minhop^Hop_P+.Mincost^Cost_P; !  hop/cost word
    putb(.WORK<0,8>,PTR);               !  and add word
    putb(.WORK<8,8>,PTR);
    checksum(SUM,.WORK);                !  into checksum
$XPT_next_NODEb_end;
putb(.SUM<0,8>,PTR);			! Store checksum into message
putb(.SUM<8,8>,PTR);
CCB[C_CNT] = ch$diff(.PTR,.CCB[C_ADDR]);! Calculate message length;
CCB[C_XPT_ALLOCATION] = .CCB[C_CNT];    !  also store it as buffer length
end;				!End of UPDFMT
global routine UPDTIM: CALL$ novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Processes calls from the Transport timer routine.
!  If the Update_clock has expired, sends a routing message
!  on each line with Srm set.
!
! FORMAL PARAMETERS
!
!	NONE.
!
! IMPLICIT INPUTS
!
!	Update_clock, Srm, UPDATEquota, NEXTline
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	If Update_clock is expired, Update_clock is reset.
!	If a routing message is sent on a line, Srm is cleared for the line.
!
!--

begin
require 'XPTSYM';
label LINE_CHECKER;
local CCB,LIN;

LIN = .NEXTline;			! Start scan at end of last time's

    do
LINE_CHECKER:
        begin				!Scan each line
        local LINEb: ref LINEblock;
	LINEb = $XPT_GET_LINE_DB(.LIN); !  Address line data base entry

	if .LINEstate neq RU then leave LINE_CHECKER;

        if .Nty neq Full then leave LINE_CHECKER;

	if not .Srm then leave LINE_CHECKER;

        if .UPDATEquota eql 0 then exitloop;    !  If no congestion
                                        ! and
	if not $MCB_GET_CCB_AND_BUFFER (NN*2 + 5, CCB)  ! resource available,
        then exitloop;

        UPDATEquota = .UPDATEquota - 1; ! Update the Update quota
        UPDFMT(.LINEb,.CCB);            !    build the routing message
        _SNDBUF(.LINEb,.CCB);           !    and send it out
        Srm = false;
	end
    while
        begin
	LIN = .LIN + 1;			!  Try next line,
	if .LIN gtr NLN then LIN = 1;	!    wrapping around if necessary
        .LIN neq .NEXTline
        end;

NEXTline = .LIN;
end;				!End of UPDTIM

end				!End of module XPTUPD
eludom