Google
 

Trailing-Edge - PDP-10 Archives - BB-R595B-SM_11-9-85 - mcb/sc/scxres.bli
There is 1 other file named scxres.bli in the archive. Click here to see a list.
module SCXRES (				! Resource-Wait Processing
		ident = 'X01190'
		) =
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:	Task Session Control
!
! ABSTRACT:	This module performs resource-wait processing,
!		such as encountered when a buffer cannot be
!		obtained for a data transfer.
!
! ENVIRONMENT:	MCB (RSX-11 user)
!
! AUTHOR:	Buren Hoffman		CREATION DATE: 6-Aug-80
!
! MODIFIED BY:
!	X01010	Changed code to use $byt_ptr macro in place of the
!		ch$ptr macro.
!	X01020	Fixed routine entry binding problems.
!	X01030	Disconnect flag was not being set for case of
!		disconnect received.
!	X01040	Added AST activation on receipt of disconnect or
!		interrupt data.
!	X01050	Using local own queueing routines because CMQxx$ routines
!		are for CCBs only.
!	X01060	Use new Comm/Exec to process linkage (.CRDAT for database)
!	X01070	Upgraded GLN support
!	X01080	Updated to use library calls, instead of requires.
!	X01090	Repaired missing forward reference.
!	X01100	Fixed reject processing to return proper reject code.
!	X01110	Added call to QUEAST to queue ASTs.
!	X01120	Fixed link counter keeping.
!	X01130	Updated disconnect-received processing to correspond
!		to modified system interface definition.
!	X01140	Set proper lun in MB packet for interrupt or disconnect
!		received.
!	X01150	Separate abort and disconnect processing into separate
!		routines.
!	X01160	Memory management cleanup.
!	X01170	Optimization work.
!	X01180	Identified bug in processing CLOSE - $HEADR may not be
!		set up right. Problem not yet fixed.
!
!	x01190  Use DSR space instead or an LDB for connect info.
!
!--
!
! INCLUDE FILES:
!
library 'SCPRM';
library 'MCB:MCBLIB';
library 'MCB:RSXLIB';
library 'MCB:XPORTX';
library 'MCB:SCSYS';

require 'SCRSX';

!
! TABLE OF CONTENTS:
!

forward routine
    SRUDSW: novalue,		! Disconnect received
    SRUINW: novalue,		! Interrupt received

    U$ABW: novalue,		! Abort
    U$ACW: novalue,		! Accept
    U$ARQ: novalue,		! * Abort wait *
    U$CLW: novalue,		! Close
    U$CNW: novalue,		! Connect
    U$DSW: novalue,		! Disconnect
    U$GLW: novalue,		! Get local node info
    U$IO:  novalue,		! I/O handler for U$RCW, U$SNW, and U$XMW
    U$IRQ: novalue,		! * Interrupt request wait *
!   U$RCW: novalue,		! Receive data (See U$IO)
    U$RJW: novalue;		! Reject
!   U$SNW: novalue		! Send data (See U$IO)
!   U$XMW: novalue		! Xmit interrupt data (See U$IO)

!
! MACROS:
!
!
! EQUATED SYMBOLS:
!
global bind routine
    U$RCW = U$IO: novalue,
    U$SNW = U$IO: novalue,
    U$XMW = U$IO: novalue;

!
! OWN STORAGE:
!

!
! EXTERNAL REFERENCES:
!
external routine
    $C5TA: novalue,		! Convert rad50 to ascii
    QUEAST,			! Queue an AST to RSX
    ULARD;			! Determine LCB address from ULA
%sbttl 'System Interface';
global routine SRUDSW (TNB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain Mailbox memory to store arriving disconnect.
!
! FORMAL PARAMETERS:
!	TNB	The Task Networking block
!
! IMPLICIT INPUTS:
!	First CCB on the input queue
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	APR6 is modified
!--

    begin
    $scx_get_data_base (SCXDB);
    map TNB: ref block field (TNB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	LCB: ref block field (LCB_FIELDS),
	MB: ref block field (MBP_FIELDS);
    bind
	QUICK_LOOK_CCB = TNB [TN_IQHD]: ref block field (C_FIELDS);

    if not $MCB_GET_DSR (MBP_SIZE*bytes_word + .QUICK_LOOK_CCB [C_CNT], MB)
    then $SCX_WAIT;

    $SCX_DEQUEUE (TNB [TN_IQUE], CCB);	! Get CCB off queue
    MAP$ (.CCB [C_BIAS]);
    ch$move (.CCB [C_CNT], .CCB [C_ADDR], byt$ptr (MB [MB_DATA]));
    MB [MB_CNT] = .CCB [C_CNT];
    MB [MB_LLA] = .CCB [C_LIX];
    MB [MB_ULA] = .CCB [$sub_field (C_PRM1, LO_BYTE)];
    LCB = ULARD (.MB [MB_ULA]);
    MB [MB_LUN] = .LCB [LC_LUN];
    LCB [LCF_DSC] = true;
    MB [MB_FNC] =
	begin
	    selectone .CCB [C_PRM2] of
		set
		[-S_EDBO]:	MB$DSC;		! Disconnect
		[-S_EABM]:	MB$ABO;		! Abort by management
		[-S_EABO]:	MB$ABT;		! Abort by object
		[otherwise]:	MB$ABT;
		tes
	end;

    $SCX_ENQUEUE (TNB [TN_MBXQ], .MB);	! Queue the MB
    QUEAST (.TNB);			! Queue the AST
    $SCX_DO_RCE (.CCB)
    end;
global routine SRUINW (TNB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain Mailbox memory to store arriving interrupt message
!
! FORMAL PARAMETERS:
!	TNB	The Task Networking Block address
!
! IMPLICIT INPUTS:
!	First CCB on the input queue
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map TNB: ref block field (TNB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	LCB: ref block field (LCB_FIELDS),
	MB: ref block field (MBP_FIELDS);
    bind
	QUICK_LOOK_CCB = TNB [TN_IQHD]: ref block field (C_FIELDS);

    if not $MCB_GET_DSR (MBP_SIZE*bytes_word + .QUICK_LOOK_CCB [C_CNT], MB)
    then $SCX_WAIT;

    $SCX_DEQUEUE (TNB [TN_IQUE], CCB);	! Get CCB off queue
    MFBF$S (.CCB [C_CNT], .CCB [C_BIAS],.CCB [C_ADDR], byt$ptr (MB [MB_DATA]));
    MB [MB_CNT] = .CCB [C_CNT] ;
    MB [MB_LLA] = .CCB [C_LIX];
    MB [MB_ULA] = .CCB [$sub_field (C_PRM1, LO_BYTE)];
    LCB = ULARD (.MB [MB_ULA]);
    MB [MB_LUN] = .LCB [LC_LUN];
    MB [MB_FNC] = MB$INT;
    $SCX_ENQUEUE (TNB [TN_MBXQ], .MB);	! Queue the MB
    QUEAST (.TNB);			! Queue the AST
    $SCX_DO_RCE (.CCB)
    end;
%sbttl 'User Interface';
global routine U$ABW (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Get resources to finish processing a link abort
!
! FORMAL PARAMETERS:
!	LCB	The link control block
!
! IMPLICIT INPUTS:
!	IOP contents
!	 I_PRM1 = Optional-data bias
!	 I_PRM2 = Optional-data address
!	 I_PRM3 = Optional-data length
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);

    if not CCBGT$ (CCB) then $SCX_WAIT;

    $SCX_DEQUEUE (LCB [LC_NQUE], IOP);
    $SCX_DO_XME (.CCB, S$ABO, .IOP, .LCB, IOP [I_PRM1])
    end;
global routine U$ACW (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to finish processing of link acceptance.
!
! FORMAL PARAMETERS:
!	LCB	The link control block
!
! IMPLICIT INPUTS:
!	IOP contents
!	 I_PRM1	Connect block bias
!	 I_PRM2	Connect block address
!	 I_PRM3	Output buffer bias
!	 I_PRM4	  "      "    address
!	 I_PRM5   "      "    length
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);

    if not CCBGT$ (CCB) then $SCX_WAIT;

    $SCX_DEQUEUE (LCB [LC_OQUE], IOP);
    CCB [$sub_field (C_PRM1, HI_BYTE)] = S$PMSG;
    $SCX_DO_XME (.CCB, S$ACC, .IOP, .LCB, IOP [I_PRM3])
    end;
global routine U$ARQ (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to verify link abort
!
! FORMAL PARAMETERS:
!	LCB	LCB address
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CCB: ref block field (C_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);

    if not CCBGT$ (CCB) then (LCB [LCF_ARES] = true; $SCX_WAIT);

    CCB [C_ADDR] = CCB [C_CNT] = CCB [C_PRM5] = 0;
    $SCX_DO_XME (.CCB, S$ABO, 0, .LCB, 0)
    end;
global routine U$CLW (TNB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to complete network close.
!
! FORMAL PARAMETERS:
!	TNB	The task networking block address
!
! IMPLICIT INPUTS:
!	IOP contents
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    external
	$HEADR: ref block field (HDR_FIELDS);	!!**** Problems here
						! This may not be set up
    map TNB: ref block field (TNB_FIELDS);
    local
	MB: ref block field (MBP_FIELDS),
	IOP: ref block field (IOP_FIELDS),
	LIOP: ref block field (IOP_FIELDS),
	CCB: ref block field (C_FIELDS),
	LCB: ref block field (LCB_FIELDS);

    if .TNB [TN_LCB] neq 0
    then
	! ** Abort all links
	begin
	LCB = TNB [TN_LCB];		! Scan all LCBs
	while (LCB = .LCB [LC_LINK]) neq 0 do
	    begin
	    if not .LCB [LCF_CLS]	! Abort already started ?
	    then
		begin
		LCB [LCF_ARES] = false;		! Assure this flag is cleared
		U$ARQ (.LCB);			! Initiate the abort
		if .LCB [LCF_ARES]		! Did we get it ?
		then exitloop			!  No, so quit banging
		else LCB [LCF_CLS] = true	!  Yes, mark it
		end
	    end
	end
    else
	! ** All links are aborted
	begin
	local
	    THIS_TNB: ref block field (TNB_FIELDS),
	    PREV_TNB: ref block field (TNB_FIELDS);

	THIS_TNB = SCXDB [SCX_TNB];		! Find our TNB in list
	while (PREV_TNB = .THIS_TNB; THIS_TNB = .THIS_TNB [TN_LINK]) neq 0 do
	    begin
	    if .THIS_TNB eql .TNB then exitloop
	    end;

	if .THIS_TNB eql 0 then SIGNAL_STOP (SCX$_ILE);
	PREV_TNB [TN_LINK] = .TNB [TN_LINK];	! Unlink our TNB
	$HEADR [H_NML] = 0;			! No more networking LUN
	$SCX_DEQUEUE (TNB [TN_OQHD], IOP);	! Get IOP we are processing
	.(IOP [I_LN2]) = 0;			! Kill the LUN

	! ** Flush the queues
	while $SCX_DEQUEUE (TNB [TN_IQHD], CCB) do $SCX_DO_RCE (.CCB);
	while $SCX_DEQUEUE (TNB [TN_OQHD], LIOP) do IOFIN$ (.SCXDB [SCX_UCB], .LIOP, IE_ABO, 0);
	while $SCX_DEQUEUE (TNB [TN_MBXQ], MB) do $MCB_RETURN_DSR (MBP_SIZE*bytes_word + .MB [MB_CNT], .MB);
	IOFIN$ (.SCXDB [SCX_UCB], .IOP, IS_SUC, 0)
	end
    end;
global routine U$CNW (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to complete connect processing
!
! FORMAL PARAMETERS:
!	LCB	LCB address
!
! IMPLICIT INPUTS:
!	IOP contents
!	 I_PRM1	Connect block bias
!	 I_PRM2	Connect block address
!	 I_PRM3	Output buffer bias
!	 I_PRM4	  "      "    address
!	 I_PRM5   "      "    length
!	 I_PRM6	Input buffer bias
!	 I_PRM7	  "     "    address
!	 I_PRM8	  "     "    length
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CNT,
	PTR,
	CB: ref block field (CB_FIELDS),
	CBU: ref block field (CBU_FIELDS),
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS),
	TCB: ref block field (TCB_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);
    literal
	CB_L1 = (%fieldexpand (CB_SFMT, 0) - %fieldexpand (CB_NODE, 0)) * bytes_word,
	CB_L2 = (%fieldexpand (CB_OPDL, 0) - %fieldexpand (CB_RQDL, 0)) * bytes_word;

    if
	begin
	if CCBGT$( CCB) then true else false
	end
	and
	begin
	if $MCB_GET_DSR( DSR_CONNECT_BLOCK_SIZE, CCB[C_ADDR])
	then true 
	else 
		begin
		CCBRT$( .CCB);
		false
		end
	end
    then
	CCB[C_BIAS] = 0
    else
	$SCX_WAIT;

    CB = .CCB [C_ADDR];
    $SCX_DEQUEUE (LCB [LC_OQUE], IOP);
    CBU = .IOP [I_PRM2];
    TCB = .IOP [I_TCB];

    CCB [$sub_field (C_PRM1, HI_BYTE)] = S$PMSG;
    CCB [C_PRM2] = .IOP [I_PRM6];		! Input buffer bias
    CCB [C_PRM3] = .IOP [I_PRM7];		!   "     "    address
    CCB [C_PRM4] = .IOP [I_PRM8];		!   "     "    length

    ! ** Now build connect block
    CCB [C_CNT] = CB_SIZE*bytes_word;
    MAP$ (.IOP [I_PRM1]);
    MTBF$S (CB_L1, CBU [CBU_NODE], .CCB [C_BIAS], byt$ptr (CB [CB_NODE]));
    MTBF$S (CB_L2, CBU [CBU_RQDL], .CCB [C_BIAS], byt$ptr (CB [CB_RQDL]));
    MAP$ (.IOP [I_PRM3]);
    MTBF$S (.IOP [I_PRM5], .IOP [I_PRM4], .CCB [C_BIAS], byt$ptr (CB [CB_OPTD]));
    MAP$ (.CCB [C_BIAS]);
    CB [CB_OPDL] = .IOP [I_PRM5];
    CB [CB_SFMT] = 1;
    CB [CB_SOBJ] = 0;

    CNT = 0;
    PTR = byt$ptr (CB [CB_SPR1]);
    %if %bliss (bliss36)
    %then
	$C5TA (.TCB [T_NAM], PTR, CNT);
    %else
	$C5TA (.TCB [T_NM1], PTR, CNT);
	if .TCB [T_NM2] neq 0 then $C5TA (.TCB [T_NM2], PTR, CNT);
    %fi
    CB [CB_SPL1] = .CNT;
    $SCX_DO_XME (.CCB, S$CON, .IOP, .LCB, 0)
    end;
global routine U$DSW (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Get resources to finish processing a link disconnect.
!
! FORMAL PARAMETERS:
!	LCB	The link control block
!
! IMPLICIT INPUTS:
!	IOP contents
!	 I_PRM1 = Optional-data bias
!	 I_PRM2 = Optional-data address
!	 I_PRM3 = Optional-data length
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);

    if not CCBGT$ (CCB) then $SCX_WAIT;

    $SCX_DEQUEUE (LCB [LC_OQUE], IOP);
    $SCX_DO_XME (.CCB, S$DIS, .IOP, .LCB, IOP [I_PRM1])
    end;
global routine U$GLW (TNB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to complete "Get-Local-Node-Information"
!
! FORMAL PARAMETERS:
!	TNB	The task networking block address
!
! IMPLICIT INPUTS:
!	IOP contents
!	 I_PRM1 = Buffer bias
!	 I_PRM2 = Buffer address
!	 I_PRM3 = Buffer length
!	 I_PRM4 = Option selector
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map TNB: ref block field (TNB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS);

    if not CCBGT$ (CCB) then $SCX_WAIT;

    $SCX_DEQUEUE (TNB [TN_OQUE], IOP);
    CCB [C_PRM1] = .IOP [I_PRM4];
    $SCX_DO_XME (.CCB, S$GLN, .IOP, 0, IOP [I_PRM1])
    end;
global routine U$IO (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:	U$RCW & U$SNW & U$XMW
!	Obtain resources to queue a send/receive buffer to SC
!
! FORMAL PARAMETERS:
!	LCB	LCB address
!
! IMPLICIT INPUTS:
!	IOP Contents
!	 I_PRM1 = Buffer bias
!	 I_PRM2 = Buffer address
!	 I_PRM3 = Buffer length
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);
    label
	IO_SELECT;

    if not CCBGT$ (CCB) then $SCX_WAIT;

    IO_SELECT:
	begin
	if (IOP = .LCB [LC_NQUE]) neq 0
	then
	    begin
	    if .IOP [I_FNC] eql IOP_XMT
	    then
		begin
		$SCX_DEQUEUE (LCB [LC_NQUE], CCB [C_PRM5]);
		CCB [C_MOD] = S$SNI;
		leave IO_SELECT
		end
	    end;

	if (IOP = .LCB [LC_OQUE]) neq 0
	then
	    begin
	    if .IOP [I_FNC] eql IOP_XMT
	    then
		begin
		$SCX_DEQUEUE (LCB [LC_OQUE], CCB [C_PRM5]);
		CCB [C_MOD] = S$SND;
		CCB [$sub_field (C_PRM1, HI_BYTE)] = S$PEOM;
		leave IO_SELECT
		end
	    end;

	if (IOP = .LCB [LC_OQUE]) neq 0
	then
	    begin
	    if .IOP [I_FNC] eql IOP_RCV
	    then
		begin
		$SCX_DEQUEUE (LCB [LC_OQUE], CCB [C_PRM5]);
		CCB [C_MOD] = S$MRQ;
		leave IO_SELECT
		end
	    end
	end;

    $SCX_DO_XME (.CCB, .CCB [C_MOD], .CCB [C_PRM5], .LCB, IOP [I_PRM1])
    end;
global routine U$IRQ (LCB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to request an interrupt
!
! FORMAL PARAMETERS:
!	LCB	LCB address
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map LCB: ref block field (LCB_FIELDS);
    local
	CCB: ref block field (C_FIELDS);
    bind
	TNB = LCB [LC_TNB]: ref block field (TNB_FIELDS);

    if not CCBGT$ (CCB) then (LCB [LCF_NRES] = true; $SCX_WAIT);

    CCB [$sub_field (C_PRM1, HI_BYTE)] = 1;
    $SCX_DO_XME (.CCB, S$IRQ, 0, .LCB, 0)
    end;
global routine U$RJW (TNB): novalue =

!++
! FUNCTIONAL DESCRIPTION:
!	Obtain resources to effect link rejection.
!
! FORMAL PARAMETERS:
!	TNB	TNB address
!
! IMPLICIT INPUTS:
!	IOP contents
!	 I_PRM1	Connect block bias
!	 I_PRM2	Connect block address
!	 I_PRM3	Output buffer bias
!	 I_PRM4	  "      "    address
!	 I_PRM5   "      "    length
!	 I_PRM6 Logical link address of rejected link
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin
    $scx_get_data_base (SCXDB);
    map TNB: ref block field (TNB_FIELDS);
    local
	CCB: ref block field (C_FIELDS),
	IOP: ref block field (IOP_FIELDS);

    if not CCBGT$ (CCB) then $SCX_WAIT;

    $SCX_DEQUEUE (TNB [TN_OQUE], IOP);
    CCB [C_LIX] = .IOP [I_PRM6];
    CCB [C_PRM2] = S_ERBO;
    CCB [C_PRM4] = .TNB;
    $SCX_DO_XME (.CCB, S$REJ, .IOP, 0, IOP [I_PRM3])
    end;

end
eludom