*DECK RELLLCB 
USETEXT LLCB
USETEXT NHEADER 
USETEXT NIPDEF
USETEXT AHEADER 
USETEXT AT
USETEXT SUPMSG
USETEXT PARAMS
USETEXT PT
USETEXT TNT 
USETEXT KDIS
USETEXT KSTTAB
PRGM RELLLCB; 
#     DELETE LOGICAL LINK CONTROL BLOCK                                #
  
 STARTIMS;
 #
*1DC  RELLLCB 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        RELLLCB             E.T. WAN            81/03/28 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        THIS ROUTINE RELEASES A LOGICAL LINK CONTROL BLOCK.
* 
*     3. METHOD USED
*        CALL MGETS TO RELEASE THE LOGICAL LINK CONTROL BLOCK.
*        IF ONLY ONE LINK EXISTS FOR THE TERMINAL NODE, CLEAR THE 
*        TNT ENTRY. IF MORE THAN ONE LINK EXIST, UPDATE ALL AFFECTED
*        FORWARD AND BACKWARD POINTERS. 
*        DECREMENT THE NUMBER OF LOGICAL LINKS IN TNT ENTRY.
*        INFORM NVF THAT A LINK WENT DOWN (FOR THE LID/PID MANEGMENT) 
* 
*     4. ENTRY PARAMETERS 
*        PARAMS1             NETWORK BLOCK HEADER ADDRESS 
*        PARAMS2             ADDRESS OF LOGICAL LINK CONTROL BLOCK TO 
*                            BE DELETED.
* 
*     5. EXIT PARAMETERS
*        NONE 
* 
*     6. COMDECKS CALLED
*        LLCB 
*        NHEADER
*        NIPDEF 
*        PARAMS 
*        PT                AT 
*        TNT                AHEADER 
*        KDIS                SUPMSG 
*        OSSIZE 
* 
*     7. ROUTINES AND OVERLAYS CALLED 
*        MRELS               RELEASE BUFFER SPACE 
*        XTRACE              TRACE CALL 
*        BLINK           LINK A MESSAGE TO APPLICATION
*        MGETS           GET A BUFFER SPACE 
*        OSCHAPP         SCHEDULE APPLICATION 
*        KDEL                DELETE A LINE FROM STATUS DISPLAY
* 
*     8. DAYFILE MESSAGES 
*        NONE 
* 
*        THIS PROGRAM IS A SECONDARY OVERLAY LOADED BY SUBROUTINE 
*        OVLCALL. WHEN EXECUTION HAS COMPLETED, A JUMP IS MADE TO 
*        LOCATION RJMAIN TO RETURN TO THE CALLING PROGRAM.
* 
*        W A R N I N G - THIS PROGRAM CANNOT EXCEED THE SECONDARY 
*CALL OSSIZE
* 
*        THIS OVERLAY IS CALLED BY NPREGLL, NPREGCP.
* 
 #
 STOPIMS; 
  
# 
****  EXTERNAL ENTRY POINTS 
# 
  
      XREF
        BEGIN 
        PROC MRELS;          # RELEASE BUFFER SPACE                    #
        PROC MGETS ;
        PROC OSCHAPP ;
        PROC BLINK ;
        LABEL RJMAIN;        # RETURN ADDRESS IN OVLCALL               #
        PROC XTRACE;         # RECORD TRACE                            #
        PROC BLDKWL;         # FORMAT KWL TO DELETE LLK ENTRY          #
        END 
  
# 
*     LOCAL VARIABLES 
# 
  
      ITEM IDXTN;            # TNT ENTRY INDEX                         #
      ITEM SAVBP;            # SAVE LLCB BACKWARD POINTER              #
      ITEM BUFADDR ;
      ITEM SAVFP;            # SAVE LLCB FORWARD POINTER               #
  
  
  
  
  
      BEGIN # RELLLCB # 
      CONTROL IFEQ DEBUG,1 ;
        XTRACE("RLLCB") ; 
      CONTROL FI; 
  
      P<LLCB> = PARAMS2;     # LOCATION OF LOGICAL LINK CONTROL BLOCK  #
      IDXTN = LLCBTN[0] ;    # INDEX INTO TNT                          #
      IF ATACBA[NVFAN] NQ 0 
      THEN
        BEGIN                      # NVF ALREADY NETTED ON             #
# 
        GET A BUFFER FOR MESSAGE TO INFORM NVF
# 
        MGETS( LCRSLL + ABHSIZE + BLKHSIZE , BUFADDR , TRUE ) ; 
# 
        SET UP APPLICATION HEADER 
# 
        P<AHEADER> = BUFADDR + BLKHSIZE  ;
        ABHABT[0] = APPCMD ;
        ABHACT[0] = CT60TRANS ; 
        ABHTLC[0] = LCRSLL    ; 
# 
        SET-UP THE MESSAGE ITSELF 
# 
        P<SUPMSG> = BUFADDR + ABHSIZE + BLKHSIZE ;
#                                                                      #
        PFCSFC[0] = CRSLL     ; 
        P<SMNVF>  = P<SUPMSG> ; 
#                                                                      #
        CRSLDN [0] = LLCBTN[0] ;   # DESTINATION NODE NUMBER           #
        CRSLSN [0] = LLCBHN[0] ;   # SOURCE NODE NUMBER                #
        CRSLST [0] = 0         ;   # LOGICAL LINK DOWN SIGNAL          #
# 
        AND LINK MESSAGE TO NVF 
# 
        BLINK ( BUFADDR,ATACBA[NVFAN]) ;  # QUEUE TO NVF               #
        OSCHAPP (ATACBA[NVFAN]) ; 
        END                        # NVF ALREADY NETTED ON             #
  
      IF KDST[0]
        AND LLCBHN[0] NQ 0 # NOT INTRA-HOST LOGICAL LINK               #
        AND LLCBTN[0] NQ 0
      THEN # DELETE LOGICAL LINK ENTRY FROM STATUS DISPLAY             #
        BLDKWL(KST"LLK",LLCBKNDX[0],0,KDELIDVALUE); 
#                                                                      #
      IF TNTNLL[IDXTN] EQ 1  # ONE LLCB EXISTS                         #
      THEN
        BEGIN 
        MRELS(P<LLCB>);      # RELEASE LLCB SPACE                      #
        IF IDXTN NQ 0 
        THEN
          TNTWD[IDXTN] = 0;  # CLEAR TNT ENTRY                         #
        ELSE
          BEGIN  # ZEROETH ENTRY   A-A LOGICAL LINK                    #
          TNTNLL[IDXTN] = 0;
          TNTLLAD[IDXTN] = 0; 
          END 
        END 
  
      ELSE
        BEGIN 
        SAVBP = LLCBBP[0];   # SAVE BACKWARD POINTER                   #
        SAVFP = LLCBFP[0];   # SAVE FORWARD POINTER                    #
        MRELS(P<LLCB>);      # RELEASE LLCB SPACE                      #
  
        IF SAVBP EQ 0        # FIRST LLCB TO BE DELETED                #
        THEN
          BEGIN 
          TNTLLAD[IDXTN] = SAVFP;  # UPDATE LLCB ADDRESS IN TNT        #
          P<LLCB> = SAVFP;   # MOVE TO THE FOLLOWING LLCB              #
          LLCBBP[0] = 0;     # CLEAR BACKWARD POINTER                  #
          END 
  
        ELSE
          BEGIN 
          IF SAVFP EQ 0      # LAST LLCB TO BE DELETED                 #
          THEN
            BEGIN 
            P<LLCB> = SAVBP; # MOVE TO THE PREVIOUS LLCB               #
            LLCBFP[0] = 0;   # CLEAR FORWARD POINTER                   #
            END 
  
          ELSE               # NOT FIRST OR LAST LLCB TO BE DELETED    #
            BEGIN 
            P<LLCB> = SAVFP;     # MOVE TO THE FOLLOWING LLCB          #
            LLCBBP[0] = SAVBP;   # UPDATE BACKWARD POINTER             #
            P<LLCB> = SAVBP;     # MOVE TO THE PREVIOUS LLCB           #
            LLCBFP[0] = SAVFP;   # UPDATE FORWARD POINTER              #
            END 
  
          END 
  
        TNTNLL[IDXTN] = TNTNLL[IDXTN] - 1;  # DECREMENT LINK NUMBER    #
        END;
  
      GOTO RJMAIN;           # RETURN TO CALLING PROGRAM               #
  
      END # RELLLCB # 
  
TERM
