Google
 

Trailing-Edge - PDP-10 Archives - TOPS-20_V6.1_DECnetSrc_7-23-85 - mcb/xpt/xptini.bli
There is 1 other file named xptini.bli in the archive. Click here to see a list.
module XPTINI	(
		IDENT = 'X01150'
		) =
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:
!
!	Contains the Transport initialization and termination modules.
!
! ENVIRONMENT:	MCB
!
! AUTHOR: L. Webber , CREATION DATE: 27-Jul-79
!
! MODIFIED BY:
!
!	L. Webber, 27-Jul-79 : VERSION 1.00
!
! 1.01	L. Webber, 20-Dec-79
!	Modify for MCB changes; take line startup out of INIT_XPT
!
! 1.02	L. Webber, 24-Jan-80
!	Combine Hop and Cost into one matrix
!
! 1.03	L. Webber, 29-Jan-80
!	Modify dispatch table to dispatch to separate routines
!
! 1.04	L. Webber, 2-Feb-80
!	Modify to accomodate node and line sub-data-bases
!	Take out dispatch table (moved to XPTITF)
!	Changed name to XPTINI from XPTMAIN
!
! 1.05	L. Webber, 27-Jun-80
!	Modify to use MCBLIB macros
!
! 1.06	A. Peckham, 15-Oct-80
!	Update for new function modifiers.
!
! 1.07	L. Webber, 11-Dec-80
!	Modify to support MCB 3.1
!
! 1.08	L. Webber, 6-Apr-81
!	Update to initialize INITtimer in line data base.
!	Also, change names of T5 and T6 to Hello_clock and T4, respectively.
!
! 1.09	L. Webber, 10-Apr-81
!	Fix call to RLS_BLK.
!
! 1.10	L. Webber, 6-May-81
!	Replace call to $LLLTM with a $MCB_ENABLE_LONG_TIMER.
!
! 1.11	L. Webber, 27-May-81
!	Add code to initialize the new circuit data base fields added
!	to support the new DLL interface.  Take out code to release
!	the node ID blocks; it would only be of use if Transport were
!	reinitialized during an MCB session.
!
! 1.12	L. Webber, 16-Jul-81
!	Add code to initialize the "Adjacent" field in the node data base.
!
! 1.13	L. Webber, 17-Sep-81
!	Add initialization for node data base field Phase2_node.
!
! 1.14	L. Webber, 23-Feb-82
!	Add initialization for DLLquota.
!
! 1.15	A. Peckham, 22-Apr-82
!	Eliminate references to GETLINE, GETNODE, RLS_BLK.
!
!--
!
! INCLUDE FILES:
!

require 'XPTMAC';

!
! TABLE OF CONTENTS
!

forward routine
	INIT_XPT: CALL$ novalue,
	TERM_XPT: CALL$ novalue;

!
! MACROS:
!

!
! EQUATED SYMBOLS:
!

!
! OWN STORAGE:
!

$MCB_PROCESS(name=XPE)

!
! EXTERNAL REFERENCES:
!
global routine INIT_XPT (CCB): CALL$ novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Initializes Transport.  All tables are set to their initial value,
!  and all lines are initialized.
!
! FORMAL PARAMETERS
!
!	CCB
!
! IMPLICIT INPUTS
!
!	All entries in the Transport Data Base
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	All lines are initialized, all nodes become unreachable,
!	and all local transport users (including NSP) will have
!	to re-identify themselves.
!
!--

begin
map CCB: ref block field (C_fields);
require 'XPTSYM';

!
!  Initialize all the quotas
!

Maxh = $MAXH;
Maxv = $MAXV;
Maxc = $MAXC;
Maxl = $MAXL;
UPDATEquota = $UPDQ;
ECLquota = $ECLQ;
INPUTquota = $INPQ;
DLLquota = $LINQ;

!
!  Initialize the Transport identification (local node address)
!

Tid = .CCB[C_PRM1];

!
! Run through the initialization password data base and
! update the TV messages.
! Also set flags if verification is needed.
!

Request_TV = false;                     ! Assume verification not needed
Request_OTV = false;

$TLI_for_each_PWDb_do_begin
    pointer PTR;
    if ch$rchar(byt$ptr(PWD2rcv)) neq 0
    then Request_OTV = true;            ! Phase II TV should be requested
    if .PWD3rcv_length neq 0
    then Request_TV = true;             ! Phase III TV should be requested
    PTR = ch$plus (PWD3TVmsg_ptr,1);
    byt$short_string(Tid,PTR);
    if (.PWDnode neq 0) and
       (.PWDlink eqla 0)
    then begin
         local CNT;
         CNT = getb(PTR);
         CNT = .CNT + ch$diff(.PTR,byt$ptr(PWD3rcv_length));
         PWDlink = vector [PWD3rcv_length,byt$allocation(.CNT)];
         end;
$TLI_next_PWDb_end;

!
! Now the archetype TI, NI, and HELLO messages
!

begin                                   !  The TI message
pointer PTR;

if (PTR = .TI_msg_ADDR) eql 0
then if $MCB_GET_DSR (10, PTR)
     then TI_msg_ADDR = PTR = byt$ptr(.PTR)
     else return signal_stop (XPT$_REE);

putb(INIT_CTLflg,PTR);                  ! Build the
byt$short_string(Tid,PTR);              !  control header
if .Request_TV                          ! Put in TV request
then putb(4+Full,PTR)                   !  and node type
else putb(0+Full,PTR);
byt$short_string(DLLsize,PTR);          ! Put in max message size
putb (1,PTR); putb(3,PTR); putb(0,ptr);	! Put in version (1,3,0)
putb (0,PTR);				! Put in (null) seed
PTR = ch$diff(.PTR,.TI_msg_ADDR);
TI_msg_CNT = .PTR;
end;

begin                                   !  The NI message
pointer PTR;

if (PTR = .NI_msg_ADDR) eql 0
then if $MCB_GET_DSR (58, PTR)
     then NI_msg_ADDR = PTR = byt$ptr(.PTR)
     else return signal_stop (XPT$_REE);

putb(OTI_CTLflg,PTR);                   ! Construct the MSGflgs
putb(INIT_SUBflg,PTR);                  !  and the "init" subflag
ex_putw(.Tid,PTR);                      ! Put in the local node address
putb(.NODEname_length,PTR);             ! Put in the node name
PTR = ch$move(.NODEname_length,         !  as an image field
    byt$ptr(NODEname,0),.PTR);
putb(OTIservices,PTR);                  ! Specify in SERVICES we have intercept
if .Request_OTV
then putb(1,PTR)                        ! Request node verification
else putb(0,PTR);                       ! Make no REQUESTS
byt$short_string(PH2size,PTR);          ! Put in the maximum blocksize
byt$short_string(PH2size,PTR);          !  and the maximum segment size
putw($MAXlk,PTR);                       !  and the maximum number of links
putb(0,PTR); putw(0,PTR);               ! Specify a routing version of (0,0,0)
putb(0,PTR); putw(0,PTR);               !  and a similar communications version
putb(0,PTR);                            ! Specify no system ID
PTR = ch$diff(.PTR,.NI_msg_ADDR);
NI_msg_CNT = .PTR;
end;

begin                                   !  The false NI message
pointer PTR;

if .False_NI_msg_ADDR eql 0
then if $MCB_GET_DSR (58, PTR)
     then False_NI_msg_ADDR = byt$ptr(.PTR)
     else return signal_stop (XPT$_REE);

False_NI_msg_CNT = 0;
end;

begin                                   !  The HELLO message
pointer PTR;

if (PTR = .Hello_msg_ADDR) eql 0
then if $MCB_GET_DSR (4 + Default_Hello_data_length, PTR)
     then Hello_msg_ADDR = PTR = byt$ptr(.PTR)
     else return signal_stop (XPT$_REE);

putb(HELLO_CTLflg,PTR);                 ! Move in control flags
byt$short_string(Tid,PTR);              !  and source node address
putb(12,PTR);                           !  and length of test data
PTR = ch$fill (%o'252',12,.PTR);        !  and test data
PTR = ch$diff(.PTR,.Hello_msg_ADDR);
Hello_msg_CNT = .PTR;
end;

!
!  Initialize the Hop/Cost matrix to "too far"/"too costly"
!

MAP$(Hopcost_bias);
begin
    pointer P;
    P = Hopcost_address;
    decr IJ from NN*(NLN+1) to 1 do begin
	.P = ((Infh^Hop_P) or (Infc^Cost_P));
	P = vector[.P,1];
	end;
    end;

!
!  Initialize the node vectors to "unreachable" and "nowhere"
!

begin
local NODEb: ref NODEblock;

if (NODEb = .XPTDB[XPTnoddb]) eqla 0
then if $MCB_GET_DSR (NN*NODEsize*%upval, NODEb)
     then XPTDB[XPTnoddb] = .NODEb
     else return signal_stop (XPT$_REE);

incr I from 1 to NN do begin
    NODEaddress = .I;                   ! The node address
    Minhop = Infh;                      ! Too many hops away
    Mincost = Infc;                     !  and too costly.
    OL = -1;                            ! No output line.
    Reach = false;                      ! Not reachable.
    Phase2_node = false;                ! Not a phase II node.
    Local_node = false;                 ! Not a local address
    NODEb = vector [.NODEb, NODEsize];
    end;
end;

!
!  Initialize the line vectors and quotas
!

begin
local LINEb: ref LINEblock;

if (LINEb = .XPTDB[XPTlindb]) eqla 0
then if $MCB_GET_DSR (NLN*LINEsize*%upval, LINEb)
     then XPTDB[XPTlindb] = .LINEb
     else return signal_stop (XPT$_REE);

incr J from 1 to NLN do begin
    Nty = 0;                            ! No adjacent node, no type
    Nid = 0;                            !  and no address
    Nnml = 0;
    DTEcircuit = false;
    Send_hello = false;
    Srm = false;
    Freeing = false;
    Ph2only = false;
    Intercept = false;
    OWNED = false;                      ! Initialize the
    NMstate = OFF;                      !  various
    LINEstate = HA;                     !  circuit states
    XPTstate = OFF;
    DLLstate = DLL_FREE;
    LINEnumber = .J;
    XPThandle = PD_XPT^8 + .LINEnumber;
    TLIhandle = PD_TLI^8 + .LINEnumber;
    DLLhandle = 0;
    LINEquota = max($LINQ / (if NLN lss 3
                             then 1
                             else if NLN lss 7
                                  then 2
                                  else 3),
                    1);
    LINEccb = 0;
    LINEstate_desired = .LINEstate;
    LINEfunction = 0;
    Hello_clock = 0;
    Listen_clock = 0;
    LINEb = vector [.LINEb, LINEsize];
    end;
end;

!
!  Initialize the link translate table
!

begin
local LTT: ref LTTblock;

if (LTT = .Ph2link_table) eqla 0
then if $MCB_GET_DSR (.Ph2link_allocated*4*%upval, LTT)
     then Ph2link_table = .LTT
     else return signal_stop (XPT$_REE);

decru I from .Ph2link_allocated to 1 do
    begin
    LTT[LTTnode1] = -1;
    LTT[LTTlink1] = -1;
    LTT[LTTnode2] = -1;
    LTT[LTTlink2] = -1;
    LTT = LTT[LTTlen];
    end;
end;

!
!  Initialize the retry queue
!

$MCB_INITIALIZE_QUEUE(REqueue);

!
!  Set up the Transport flags
!

XPTflags = Running;

!
!  Start up the timers
!

Routing_clock = .Routing_timer;
Update_clock = .Update_timer;

$MCB_ENABLE_LONG_TIMER();
Timer = 1;

!
!  Return "complete" to calling process
!

CCB[C_STS] = CS_SUC;
CCB[C_FNC] = FC_CCP;
$MCB_SCHEDULE_CCB(.CCB);
end;				!End of INIT_XPT
global routine TERM_XPT (CCB): CALL$ novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Terminates Transport without bringing it back up.  This is
!  done by terminating all the lines.
!
! FORMAL PARAMETERS
!
!	CCB
!
! IMPLICIT INPUTS
!
!	XPTflags
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
map CCB: ref block field (C_fields);
require 'XPTSYM';

!
!  If Transport isn't up, return an error
!

if .XPTflags eql 0
then begin
     CCB[C_STS] = CE_DIS;
     CCB[C_FNC] = FC_CCP;
     $MCB_SCHEDULE_CCB(.CCB);
     return;
     end;

!
!  Declare a "Transport Terminating" event
!

%( TBS )%

!
!  Clear out the retry queue
!

while true do
    begin                               ! Terminate each CCB on the queue
    local RETRY_CCB: ref block field (C_XPT_FIELDS);
    if not $MCB_DEQUEUE_CCB(REqueue, RETRY_CCB) then exitloop;
    RETRY_CCB[C_FNC] = FC_CCP;
    RETRY_CCB[C_STS] = CE_DIS;
    $MCB_SCHEDULE_CCB(.RETRY_CCB);
    end;

!
!  Flag Transport as down
!

XPTflags = 0;
Routing_clock = 0;
Update_clock = 0;

!
!  Save the function CCB
!

Tid = .CCB;				!Note this destroys the Transport ID

!
!  Bring each line down
!

$XPT_for_each_LINEb_do_begin
    Service_line = true;                ! Flag for line service.
$XPT_next_LINEb_end;

end;				!End of TERM_XPT
end				!End of Module XPTMAIN
eludom