Google
 

Trailing-Edge - PDP-10 Archives - BB-R595B-SM_11-9-85 - mcb/xpt/xptitf.bli
There is 1 other file named xptitf.bli in the archive. Click here to see a list.
module XPTITF	(
		IDENT = 'X01270'
		) =
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 Interface Routines: takes a CCB and, based on the function/
!	modifier codes, routes it to a processing routine.  Some of the func-
!	tions require no preprocessing; the function handler is called direct-
!	ly.  Other routines require preprocessing or are handled entirely in
!	this module; all Network Management interface routines are contained
!	here.
!
! ENVIRONMENT:	MCB
!
! AUTHOR: L. Webber , CREATION DATE: 31-Jul-79
!
! MODIFIED BY:
!
!	L. Webber, 31-Jul-79 : VERSION 01
!
! 1.01	L. Webber, 1-Nov-79
!	Brought module into conformance with design specification
!
! 1.02	L. Webber, 20-Dec-79
!	Modifications associated with splitting Transport Line Interface out
!
! 1.03	L. Webber, 29-Jan-80
!	Rewrote dispatch code to go through two levels of dispatch tables.
!
! 1.04	L. Webber, 3-Apr-80
!	Modified to support node and line sub-data-bases
!	Added dispatch table (previously in XPTINI)
!	Modified all calls to the XPTDEC and XPTINI routines to be
!	  extension process calls; added interface routines LINE$DN,
!	  LINE$UP, OPEN$T, CLOSE$T, INIT$XPT, and CLOSE$XPT to do the calls
!
! 1.05	L. Webber, 15-Apr-80
!	Add $XPTDB, the address of the Transport Data Base
!
! 1.06	L. Webber, 23-May-80
!	Translate between LIX and Transport line index at the DLL and
!	Network Management interfaces
!
! 1.07  L. Webber, 23-Jun-80
!       Convert MCB interfaces to MCBLIB macros
!
! 1.08	A. Peckham, 15-Oct-80
!	Update to use dispatch TABLE$ macro.
!	Use symbolic function modifiers.
!
! 1.09	A. Peckham, 21-Oct-80
!	Change CE_ERR returns to SIGNAL_STOP.
!
! 1.10	A. Peckham, 24-Oct-80
!	Change some CE_ERRs back from SIGNAL_STOPs.
!
! 1.11	L. Webber, 2-Dec-80
!	Switch first two parameters of DISPATCH$ macros to
!	match macro definition
!
! 1.12	L. Webber, 11-Dec-80
!	Modify to support MCB 3.1
!
! 1.13	L. Webber, 12-Jan-81
!	Take out old NM code and modify to call XPTNMI.
!
! 1.14	L. Webber, 20-Jan-81
!	Take out $XPTDB and $NLN to make XPT read-only.
!
! 1.15	L. Webber, 6-Feb-81
!	Forwarding is moving to XPE; CALL$E routine TERMINATE.
!
! 1.16	L. Webber, 9-Feb-81
!	Put back the direct calls; an interface module has been added.
!
! 1.17	L. Webber, 18-Feb-81
!	Fix maintenance of INPUTquota.
!	Add calls to the BUFCHK debugging routine.
!
! 1.18	L. Webber, 19-Feb-81
!	Fix TERMINATE not to be CALL$
!
! 1.19	L. Webber, 27-Feb-81
!	Fix ECL_RTN to handle locally looped packets
!
! 1.20	L. Webber, 3-Mar-81
!	Add global literals for the data base sizes
!
! 1.21	L. Webber, 9-Mar-81
!	Fix bug in handling of admission quota
!
! 1.22	L. Webber, 20-Mar-81
!	The return of a HELLO packet should not affect the Update quota.
!
! 1.23	L. Webber, 14-May-81
!	Add _ROUTES to call ROUTES in XPE on a SYNCH redispatch.
!
! 1.24	L. Webber, 3-Jun-81
!	Modify to support new DLL interface (which also changed some modifier
!	codes in the TLI interface).
!	Modify all buffer releases to use $MCB_RETURN_CCB_AND_BUFFER.
!
! 1.25	L. Webber, 9-Jun-81
!	Fix glitch in DLL_RTN which was always releasing an input CCB, no
!	matter whom it belonged to.
!
! 1.26	L. Webber, 25-Jun-81
!	Add DLL_RTN processing of "uncounted" message type (used at present
!	only for sending "line down" DC's).
!
! 1.27	A. Peckham, 16-Apr-82
!	Add NM$XPT to CALL$E to get to XPT_NM which has been moved to XPE.
!       Optimize linkages.
!
!--
!
! TABLE OF CONTENTS
!

require 'XPTMAC';
%if %bliss (BLISS16)
%then
    linkage XPT_LKG_ADR_DB_CCB =
        jsr (register = 1, register = 5, register = 4) :
        nopreserve (0, 1, 2, 3, 4, 5);
%else macro XPT_LKG_DB_CCB_ADR = BLISS36C %;
%fi

forward routine
	XMEDSP: MCB_DB_CCB_MOD novalue,
	RCEDSP: MCB_DB_CCB_MOD novalue,
	CTLDSP: MCB_DB_CCB_MOD novalue,
	XCPDSP: MCB_DB_CCB_MOD novalue,
	RCPDSP: MCB_DB_CCB_MOD novalue,
	CCPDSP: MCB_DB_CCB_MOD novalue,
	ECL_XMT: MCB_DB_CCB novalue,
	ECL_RTN: MCB_DB_CCB novalue,
	DLL_RTN: MCB_DB_CCB novalue,
	REINIT_CMP: MCB_DB_CCB novalue,
	TERM_CMP: MCB_DB_CCB novalue,
	UNKNOWN: novalue,
	LINE$DN: novalue,
	LINE$UP: novalue,
	OPEN$T: MCB_DB_CCB novalue,
	CLOSE$T: MCB_DB_CCB novalue,
	INIT$XPT: MCB_DB_CCB novalue,
	NM$XPT: MCB_DB_CCB novalue,
	TERM$XPT: MCB_DB_CCB novalue,
	_ROUTES: novalue,
        CALL$XPE: XPT_LKG_ADR_DB_CCB novalue;

!
! INCLUDE FILES:
!

!
! MACROS:
!

!
! EQUATED SYMBOLS:
!

global literal				!	(in bytes)
    XPT$SX = XPTDB_length * %upval,	! Main data base length
    XPT$SN = NODElength,		! Node data base entry length
    XPT$SL = LINElength;		! Line data base entry length

!
! OWN STORAGE:
!
!	See $XPTLL below.
!


!
! EXTERNAL REFERENCES:
!

external routine
    RCVECL,
    TERMINATE: novalue,
    OPENT: novalue,
    CLOSET: novalue,
    LINEUP: novalue,
    LINEDN: novalue,
    INIT_XPT: novalue,
    TERM_XPT: novalue,
    RCVBUF: novalue,
    COSTCH: novalue,
    XPE_NM: novalue,
    XPTTIM: novalue;
!++
!
!		TRANSPORT DISPATCH VECTOR
!
!  NAME: $XPTLL
!
!  This vector is the main MCB dispatch vector which dispatches
!  received CCBs to the interface routines in this module.
!
!--
external routine $DSPCR : novalue;

global
bind $XPTLL = TABLE$ ($DSPCR, FC_CCP,

	(FC_XME, XMEDSP),	!Transmit enable
	(FC_RCE, RCEDSP),	!Receive enable
	(FC_CTL, CTLDSP),	!Control
	(FC_TIM, XPTTIM),	!Timeout/process initialization
	(FC_XCP, XCPDSP),	!Transmit complete
	(FC_RCP, RCPDSP),	!Receive complete
	(FC_CCP, CCPDSP));	!Control complete

!++
!
!		PROCESS HEADER
!
!  NAME OF PROCESS: XPT
!
!--

$MCB_PROCESS(name=XPT,llc_dispatch=$XPTLL)
global
routine XMEDSP (XPTDB,CCB,MODIFIER): MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Routine to dispatch "transmit enable" CCBs
!
! FORMAL PARAMETERS
!
!	XPTDB   	Address of Transport's data base
!	CCB		CCB to pass to dispatched routine.
!	MODIFIER	Subfunction code; used to select routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
DISPATCH$(.MODIFIER,
          TABLE$ ($DSPCR, FD_XME,
                  (XM_DAT, ECL_XMT)),
          (.XPTDB,.CCB),
          MCB_DB_CCB);
BUFCHK();
end;				!End of XMEDSP
global
routine RCEDSP (XPTDB,CCB,MODIFIER): MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Routine to dispatch "receive enable" CCBs
!
! FORMAL PARAMETERS
!
!	XPTDB   	Address of Transport's data base
!	CCB		CCB to pass to dispatched routine.
!	MODIFIER	Subfunction code; used to select routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
DISPATCH$(.MODIFIER,
          TABLE$ ($DSPCR, FD_RCE,
                  (XM_DAT, ECL_RTN)),
          (.XPTDB,.CCB),
          MCB_DB_CCB);
BUFCHK();
end;				!End of RCEDSP
global
routine CTLDSP (XPTDB,CCB,MODIFIER): MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Routine to dispatch "control" CCBs
!
! FORMAL PARAMETERS
!
!	XPTDB   	Address of Transport's data base
!	CCB		CCB to pass to dispatched routine.
!	MODIFIER	Subfunction code; used to select routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
DISPATCH$(.MODIFIER,
          TABLE$ ($DSPCR, FD_CTL,
                  (NM_INI, INIT$XPT),
                  (XM_STR, OPEN$T),
                  (XM_STP, CLOSE$T),
                  (FM_NM,  NM$XPT),
                  (NM_TRM, TERM$XPT)),
          (.XPTDB,.CCB),
          MCB_DB_CCB);
BUFCHK();
end;				!End of CTLDSP
global
routine XCPDSP (XPTDB,CCB,MODIFIER): MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Routine to dispatch "transmit complete" CCBs
!
! FORMAL PARAMETERS
!
!	XPTDB   	Address of Transport's data base
!	CCB		CCB to pass to dispatched routine.
!	MODIFIER	Subfunction code; used to select routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
DISPATCH$(.MODIFIER,
          TABLE$ ($DSPCR, FD_XCP,
                  (TM_DAT, DLL_RTN)),
          (.XPTDB,.CCB),
          MCB_DB_CCB);
BUFCHK();
end;				!End of XCPDSP
global
routine RCPDSP (XPTDB,CCB,MODIFIER): MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Routine to dispatch "receive complete" CCBs
!
! FORMAL PARAMETERS
!
!	XPTDB   	Address of Transport's data base
!	CCB		CCB to pass to dispatched routine.
!	MODIFIER	Subfunction code; used to select routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
DISPATCH$(.MODIFIER,
          TABLE$ ($DSPCR, FD_RCP,
                  (TM_INI, LINE$UP),
                  (TM_DAT, RCVBUF),
                  (TM_TRM, LINE$DN)),
          .CCB);
BUFCHK();
end;				!End of RCPDSP
global
routine CCPDSP (XPTDB,CCB,MODIFIER): MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Routine to dispatch "control complete" CCBs
!
! FORMAL PARAMETERS
!
!	XPTDB   	Address of Transport's data base
!	CCB		CCB to pass to dispatched routine.
!	MODIFIER	Subfunction code; used to select routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
DISPATCH$(.MODIFIER,
          TABLE$ ($DSPCR, FD_CCP,
                  (TM_STR, REINIT_CMP),
                  (TM_STP, TERM_CMP)),
          (.XPTDB,.CCB),
          MCB_DB_CCB);
BUFCHK();
end;				!End of CCPDSP
routine ECL_XMT (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Handles Transmit requests from a Transport user
!
! FORMAL PARAMETERS
!
!	XPTDB - Address of Transport's data base
!	CCB - CCB given by the Transport user to be transmitted
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';
require 'MCBCOM';
local RET;

!
!  If Transport isn't active or the admission quota is exhausted,
!  reject the packet
!

INPUTquota = .INPUTquota - 1;			!Decrement admission quota
if bitoff(.XPTflags,Running) then		!Transport not running
    TERMINATE(.CCB,CE_NTE)
else if .INPUTquota eql -1 then			!Admission quota exhausted
    TERMINATE(.CCB,CE_RTE)

!
!  Send the message out
!

else begin
    RET = RCVECL(.CCB);


!
!  Failed - return function CCB now
!

    if .RET neq CS_SUC then begin
	TERMINATE(.CCB,.RET);
	end;
    end;
end;				!End of ECL_XMT
routine ECL_RTN (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Processes a data buffer returned from a Transport user.  If the buffer
!  belongs to Transport, the routine releases it.  Otherwise, it dequeues
!  the transport header CCB and returns it, returns the data CCB to
!  the Data Link Layer, and updates the ECL quota.
!
! FORMAL PARAMETERS
!
!	XPTDB - Address of Transport's data base
!	CCB - CCB being returned.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

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

!
!  Increase the quota of buffers allowed to the ECL
!

ECLquota = .ECLquota + 1;

!
!  Return the data buffer to the DLL, or the ECL, or release it
!

if .CCB[C_STK] eql 0 then begin			!Transport's buffer:
    $MCB_RETURN_CCB_AND_BUFFER(.CCB[C_XPT_ALLOCATION],	!  release it
	.CCB);					!  and return
    INPUTquota = .INPUTquota + 1;		!  admission
    end						!  permit
else if .CCB[C_STS] eql 0 then 			!Normal buffer:
    TERMINATE(.CCB,CS_SUC)			!  return "success"
else 						!Otherwise,
    TERMINATE(.CCB,CE_DIS);			!  return "no path"
end;				!End of ECL_RTN
routine DLL_RTN (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Processes "transmit complete" returns from the Data Link Layer.
!  If there is a routing header, the header CCB is detached and released.
!  The buffer is then returned to its owner.
!
! FORMAL PARAMETERS
!
!	XPTDB - Address of Transport's data base
!	CCB - CCB returned from the DLL
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
map CCB: ref block field(C_XPT_fields);
local LINEb;
require 'XPTSYM';
local RET;
bind LINE = .CCB[C_LIN];		! Line over which buffer was received
bind TYPE = .CCB[C_XPT_TYPE];
bind SUBTYPE = .CCB[C_XPT_SUBTYPE];
LINEb = $XPT_GET_LINE_DB(LINE);         ! Address line data base entry

!
!  Data packet - increase the output quota for the input line
!  and terminate the packet
!

if TYPE eql FWDcode then begin
    LINEquota = .LINEquota + 1;
    TERMINATE(.CCB,CS_SUC);
    end

!
!  Routing message - increase the update quota and get rid of the packet
!

else if TYPE eql UPDATEcode then begin
    if SUBTYPE eql UPDATEcode then
	UPDATEquota = .UPDATEquota + 1;
    if .CCB[C_XPT_ALLOCATION] neq 0
    then begin
         MAP$(.CCB[C_BIAS]);
         $MCB_RETURN_BUFFER(.CCB[C_XPT_ALLOCATION],.CCB[C_ADDR]);
         end;
    $MCB_RETURN_CCB(.CCB);
    end

!
!  Other (non-counted) type - just terminate it
!

else TERMINATE(.CCB,CS_SUC);

end;				!End of DLL_RTN
routine UNKNOWN (CCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!  Processes an unknown function; flags the CCB in error and returns it.
!
! FORMAL PARAMETERS
!
!	CCB
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';
require 'MCBCOM';

!
!  Log a Invalid Message event
!

%( TBS )%

!
!  Get rid of the CCB
!

TERMINATE(.CCB,CS_SUC);
end;				!End of UNKNOWN
routine REINIT_CMP (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Processes a completed "Reinitialize Line" CCB.  Since the
! Reinitialize function is not synchronized with any Transport
! activity (the synchronization is provided by Line Up and Line
! Down signals), the CCB is terminated without processing.
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB returned from Transport Line Interface
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

CCBRT$(.CCB);

end;				!End of REINIT_CMP
routine TERM_CMP (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! This routine processes a completed Terminate Line CCB.  For reasons
! similar to those for REINIT_CMP above, the CCB is terminated without
! processing.  If Transport is not running and all lines have been
! terminated, the "Terminate Transport" function CCB which was stored
! in Tid by TERM$XPT will be returned to its sender.
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Terminate CCB, returned from Transport Line Interface
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

local LINEb;
require 'XPTSYM';
require 'MCBCOM';

!
!  Get rid of the completed CCB
!

TERMINATE(.CCB,0);

!
!  If Transport is terminating and all lines are down, return the
!  Terminate Transport function CCB.
!

if .XPTflags eql 0 then
if (decr J from NLN to 1 do begin
    LINEb = $XPT_GET_LINE_DB(.J);
    if .LINEstate neq HA
	then exitloop 0
    end)
    eql -1 then begin
	CCB = .Tid;		!Pick up the function CCB
	CCB[C_FNC] = FC_CCP;	!Flag it "complete"
	CCB[C_STS] = CS_SUC;	!  and "success"
	LLCRS$(.CCB);		!  and send it off
	end;

end;				!End of TERM_CMP
routine LINE$DN (CCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! Calls the LINEDN routine in the Transport extension process.
!
! FORMAL PARAMETERS
!
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(LINEDN,.XPTDB,.CCB);

end;				!End of LINE$DN
routine LINE$UP (CCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(LINEUP,.XPTDB,.CCB);

end;				!End of LINE$UP
routine OPEN$T (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(OPENT,.XPTDB,.CCB);

end;				!End of OPEN$T
routine CLOSE$T (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(CLOSET,.XPTDB,.CCB);

end;				!End of CLOSE$T
routine INIT$XPT (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(INIT_XPT,.XPTDB,.CCB);
ROUTESaddr = _ROUTES;

end;				!End of INIT$XPT
routine NM$XPT (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(XPE_NM,.XPTDB,.CCB);

end;				!End of NM$XPT
routine TERM$XPT (XPTDB,CCB): MCB_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';

CALL$XPE(TERM_XPT,.XPTDB,.CCB);

end;				!End of TERM$XPT
global
routine _ROUTES: novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
! This routine is redispatched on a SYNCH when ROUTES can't do all its work
! in one try.  It does a CALL$E to ROUTES.
!
! FORMAL PARAMETERS
!
!	NONE.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin

require 'XPTSYM';
external routine ROUTES;

CALL$E(ROUTES,PD_XPE);

end;				!End of _ROUTES
routine CALL$XPE (ADR,XPTDB,CCB): XPT_LKG_ADR_DB_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS
!
!       ADR     Address of routine to call in XPE
!	XPTDB  	Address of Transport's data base
!	CCB	Function CCB to be passed to the routine.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

begin
bind routine XPE_RTN = .ADR;
require 'XPTSYM';

CALL$E(XPE_RTN,(PD_XPE),.CCB);

end;				!End of CALL$XPE

end				!End of module XPTITF
eludom