*DECK NVFTCB
USETEXT TEXTNVF
USETEXT TXSMNVF
USETEXT TXTANVF
PROC NVFTCB;
# TITLE NVFTCB - CONNECTION BROKEN REQUEST (CR/CB SM) #
BEGIN # NVFTCB #
#
** NVFTCB - CONNECTION BROKEN REQUEST (CR/CB SM).
*
* E. THAVIKULWAT 81/11/10
* C. BRION 83/04/11. 83/05/10.
*
* THIS PROCEDURE'S MAIN FUNCTION IS TO RETRIEVE THE BROKEN
* CONNECTION'S TABLES AND PREPARE FOR TERMINATION. IT IS CALLED
* INTO EXECUTION BY PROCEDURE *NVFTDQE*.
*
* PROC NVFTCB
*
* ENTRY:
* CR/CB SM IN *MSGBUF*
*
* EXIT:
* CONNECTION TERMINATED.
*
* NOTES:
* 1) A CR/CB REQUEST FOR A NON-NVF CONNECTION COULD OCCUR BEFORE
* OR AFTER A CR/ACC WAS RECEIVED IN RESPONSE TO THE CR/SWH
* REQUEST. IF IT OCCURRED BEFORE A CR/ACC WAS RECEIVED, THEN
* A *PTAC* ENTRY FOR THE CONNECTION STILL EXIST. IF IT
* OCCURRED AFTER A CR/ACC WAS RECEIVED, A *PTAC* ENTRY FOR THE
* CONNECTION NO LONGER EXIST, BUT A VCB ENTRY FOR THE
* CONNECTION EXIST OUT ON THE VCB FILE.
* 2) A CR/CB REQUEST FOR AN NVF CONNECTION COULD OCCUR BEFORE OR
* AFTER A CR/SWH REQUEST WAS SENT BY *NVF*. NORMAL SITUATION
* WOULD BE BEFORE A CR/SWH REQUEST WAS SENT. CR/CB REQUEST
* FOR AN NVF CONNECTION AFTER A CR/SWH REQUEST WAS SENT
* IMPLIES THAT NVF SENT OUT THE CR/SWH REQUEST BEFORE
* REALIZING THAT THE CONNECTION WAS ALREADY BROKEN. IN BOTH
* CASES A *PTAC* ENTRY STILL EXIST FOR THE CONNECTION.
*
* METHOD:
* IF AN NVF CONNECTION IS BROKEN, GET ITS *PTAC* ENTRY. IF
* STATE OF THE *PTAC* IS AWAITING VALIDATION OR VCB DATA, THEN
* CONNECTION CANNOT BE TERMINATED AT THIS TIME. CHANGE STATE TO
* CONNECTION BROKEN SO THE PROCESSES THAT RECEIVES THE VALIDATION
* OR VCB DATA COULD PROCEED TO TERMINATE THE CONNECTION AS SOON
* AS THE CIO FUNCTION COMPLETES. OTHERWISE, PROCEED TO TERMINATE
* THE CONNECTION.
*
* IF A NON-NVF CONNECTION IS BROKEN BEFORE A CR/ACC WAS RECEIVED,
* GET ITS *PTAC* ENTRY, UPDATE WITH NEW ACN, DECREMENT T-A
* CONNECTION COUNT, AND TERMINATE THE CONNECTION.
*
* IF A NON-NVF CONNECTION IS BROKEN AFTER A CR/ACC WAS RECEIVED,
* ALLOCATE SPACE FOR A NEW *PTAC* ENTRY, MAKE VCB READ REQUEST,
* DECREMENT T-A CONNECTION COUNT, UPDATE *PTAC* WITH INFORMATION
* RECEIVED IN THE CR/CB SM, SET STATE OF THE *PTAC* TO
* AWAIT-VCB-CB, AND EXIT.
#
#
**** PROC NVFTCB - XREF LIST.
#
XREF
BEGIN
PROC NVFSCAD; # COMPLETE APPLICATION DEPARTURE #
PROC NVFTETC; # END TERMINAL CONNECTION #
PROC NVFTPVD; # PREPARE TO RECEIVE VALIDATION DATA #
PROC NVFTURT; # UPDATE *RAU* TABLE #
END
#
****
#
ITEM AS I; # SUBSCRIPT FOR ARRAY AST #
ITEM ASENTRY I; # NUMBER AST ENTRIES #
ITEM MATCH B; # EXIT LOOP VARIABLE #
ITEM NENTRY I; # NUMBER OF ENTRIES IN TABLE #
ITEM PRIAPP B; # PRIMARY APPLICATION INDICATOR #
ITEM PT I; # SUBSCRIPT FOR ARRAY PTAC #
ITEM PORD I; # PRIMARY AST ENTRY ORDIANL #
CONTROL EJECT;
#
* DETERMINE NUMBER OF AST ENTRIES.
#
ASENTRY = ASTLNGTH/ASTSIZ$;
#
* DETERMINE WHETHER OR NOT BROKEN CONNECTION BELONGS TO NVF.
#
IF CRNACN[0] NQ 0
THEN # NVF CONNECTION BROKEN #
BEGIN
#
* NVF'S CONNECTION HAS BEEN BROKEN. SEARCH *PTAC* TABLE FOR
* ENTRY THAT MATCHES ON ACN. NO MATCH IMPLIES NVF SENT OUT THE
* CR/SWH REQUEST BEFORE REALIZING THAT THE CONNECTION WAS BROKEN.
#
MATCH = FALSE;
NENTRY = PTALNGTH / PTACSIZ$; # CALCULATE NUMBER OF ENTRIES #
FOR PT = 0 STEP 1 WHILE (NOT MATCH AND PT LS NENTRY)
DO
BEGIN
IF PTA$ACN[PT] EQ CRNACN[0]
THEN # PTAC ENTRY FOUND #
BEGIN
#
* IF *PTAC* STATE IS AWAITING VALIDATION (CPM56B) OR VCB
* DATA, THEN CONNECTION CANNOT BE TERMINATED AT THIS TIME.
* OTHERWISE, PROCEED TO END TERMINAL CONNECTION.
#
PTA$RC[PT] = CRRRCN[0]; # SAVE REASON CODE #
IF (PTA$STATE[PT] EQ PTACST"AWTVAL")
OR (PTA$STATE[PT] EQ PTACST"AWTVCBR")
OR (PTA$STATE[PT] EQ PTACST"AWTVCBL")
THEN # AWAITING DATA, CAN'T TERMNATE #
BEGIN
IF PTA$STATE[PT] EQ PTACST"AWTVAL"
THEN
BEGIN
PTA$STATE[PT] = PTACST"CONBROK"; # CONN BROKEN STATE #
END
ELSE
BEGIN
PTA$STATE[PT] = PTACST"AWTVCBC"; # AWAIT-VCB-CB STATE #
END
#
* IF THE CONNECTION WAS IN THE PROCESS OF BEING LOANED FROM
* THE PRIMARY TO THE SECONDARY APPLICATION, CLEAR THE LOAN
* STATUS FROM THE PTAC AND TREAT THIS AS A NORMAL CONNECTION
* SWITCH. THIS IS TO PREVENT THE CONNECTION COUNT OF THE
* PRIMARY APPLICATION FROM BEING DECREMENTED TWICE (IN
* *NVFTRVD*).
#
IF (PTA$LRC[PT] EQ RCRC"LSA") AND
(PTA$STATE[PT] EQ PTACST"AWTVCBC")
THEN
BEGIN
PTA$LRC[PT] = 0;
PTA$LCF[PT] = FALSE;
END
END
ELSE # PROCEED TO TERMINATE CONN #
BEGIN
#
* IF THIS IS AN INITIAL LOAN CONNECTION, DELETE THE T-A
* CONNECTION COUNT FOR THE PRIMARY APPLICATION. UPDATE THE
* *RAU* TABLE, IF NECESSARY.
#
IF PTA$LRC[PT] EQ RCRC"LSA"
THEN
BEGIN
PRIAPP = TRUE;
NVFTURT(VCB$VCB[0],PT,PRIAPP);
FOR AS = 0 STEP 1 WHILE
((AS LS ASENTRY) AND
(AST$AN[AS] NQ PTA$PRIAN[PT]))
DO
BEGIN
END
IF AS LS ASENTRY
THEN
BEGIN
AST$RACN[AS] = AST$RACN[AS] - 1;
NVFSCAD(AS);
END
END
#
* IF THIS IS A RETURN OF A LOANED CONNECTION FROM THE
* SECONDARY TO THE PRIMARY APPL, UPDATE THE *RAU* TABLE OF
* THE PRIMARY (SWITCHED) APPL, IF NECESSARY. THERE IS NO
* NEED TO DECREMENT THE NUMBER OF RESERVED CONNECTIONS, AS
* THIS SHOULD ALREADY HAVE BEEN DONE IN NVFTDSP.
#
IF PTA$LRC[PT] GR RCRC"LSA"
THEN
BEGIN
PRIAPP = FALSE;
NVFTURT(VCB$VCB[0],PT,PRIAPP);
END
NVFTETC(PT); # END TERMINAL CONNECTION #
END
MATCH = TRUE; # EXIT LOOP #
END
END
IF NOT MATCH
THEN # CR/SWH REQUEST ALREADY SENT #
BEGIN
#
* CR/SWH ALREADY SENT. CALL *NVFTURT* TO GET *PTAC* ENTRY THAT
* MATCHES ON VCB, UPDATE *RAU* TABLE IT NEEDED, SAVE ACN,
* DECREMENT T-A CONNECTION COUNT, AND TERMINATE CONNECTION.
* BEFORE ALL THIS CAN BE DONE, WE MUST FIRST SEARCH THE *PTAC*
* TABLE FOR THE VCB ORDINAL IN THE CR/CB. IF NO MATCHING
* *PTAC* ENTRY CAN BE FOUND, IT MEANS NVF HAS ALREADY INITIATED
* CONNECTION TERMINATION AND THIS HAS COLLIDED WITH THE CR/CB.
* IN THIS CASE THE CR/CB SHOULD BE IGNORED. THIS SEARCH IS
* REDUNDANT WITH THAT PERFORMED BY *NVFTURT*, BUT IS NECESSARY
* TO KEEP *NVFTURT* FROM ABORTING INAPPROPRIATELY.
#
FOR PT=0 STEP 1
WHILE PTA$VCB[PT] NQ CRVCB[0]
AND PT LS NENTRY
DO # FIND *PTAC* ENTRY #
BEGIN END
IF PT EQ NENTRY
THEN # MUST IGNORE CR/CB/SM #
RETURN;
PTA$ACN[PT] = CRACN[0]; # SAVE ACN #
PTA$RC[PT] = CRRRCN[0]; # SAVE REASON CODE #
#
* LOCATE THE AST ENTRY FOR THE PTAC ENTRY.
#
FOR AS = 0 STEP 1 WHILE
(AS LS ASENTRY AND
AST$PANAM[AS] NQ PTA$SWTAPP[PT])
DO
BEGIN
END
#
* UPDATE THE RAU TABLE, IF NEEDED. DECREMENT THE NUMBER OF T-A
* CONNECTIONS FOR THE SELECTED APPLICATION.
#
PRIAPP = FALSE;
NVFTURT(CRVCB[0],PT,PRIAPP); # UPDATE *RAU* TABLE #
AST$TACN[AS] = AST$TACN[AS] - 1; # DECREMENT NUMBER OF CONN #
AST$ICCN[AS] = AST$ICCN[AS] - 1; #DECREMENT NO OF INCMG CONN#
NVFSCAD(AS); # COMPLETE APPLICATION DEPARTURE #
#
* IF THIS IS AN INITIAL LOAN, LOCATE THE AST ENTRY FOR THE PRIMARY
* APPLICATION. UPDATE THE *RAU* TABLE AND DECREMENT THE NUMBER OF
* RESERVED CONNECTIONS.
#
IF PTA$LRC[PT] EQ RCRC"LSA"
THEN
BEGIN
PRIAPP = TRUE;
NVFTURT(CRVCB[0],PT,PRIAPP);
FOR AS = 0 STEP 1 WHILE
(AS LS ASENTRY AND
AST$AN[AS] NQ PTA$PRIAN[PT])
DO
BEGIN
END
IF AS LS ASENTRY
THEN
BEGIN
AST$RACN[AS] = AST$RACN[AS] - 1;
NVFSCAD(AS);
END
END
NVFTETC(PT); # END TERMINAL CONNECTION #
END
END
ELSE # NON-NVF CONNECTION BROKEN #
BEGIN
#
* A NON-NVF CONNECTION HAS BEEN BROKEN. NO CR/TRM SM WILL BE
* SENT. DETERMINE IF CR/CB OCCURRED BEFORE ACKNOWLEDGEMENT OF
* THE CR/SWH REQUEST (I.E., CR/ACC HAS NOT YET BEEN RECEIVED).
#
IF CRLIMBO[0]
THEN # CR/CB OCCURRED BEFORE CR/ACC RECEIVED #
BEGIN
#
* CR/CB OCCURRED BEFORE CR/ACC WAS RECEIVED SO A *PTAC* ENTRY
* STILL EXIST. CALL *NVFTURT* TO FIND THE *PTAC* ENTRY AND
* UPDATE *RAU* TABLE IF NEEDED. DECREMENT T-A CONNECTION
* COUNT AND END TERMINAL CONNECTION.
#
PRIAPP = FALSE;
NVFTURT(CRVCB[0],PT,PRIAPP); # UPDATE *RAU* TABLE IF NEEDED #
#
* LOCATE AST ENTRY FOR PTAC ENTRY THEN DECREMENT NUMBER TA
* CONNECTIONS.
#
FOR AS = 0 STEP 1 WHILE
(AS LS ASENTRY AND
AST$PANAM[AS] NQ PTA$SWTAPP[PT])
DO
BEGIN
END
AST$TACN[AS] = AST$TACN[AS] - 1; # DECREMENT NUMBER OF CONN #
AST$ICCN[AS] = AST$ICCN[AS] - 1; #DECREMENT NO OF INCMG CONN#
NVFSCAD(AS); # COMPLETE APPLICATION DEPARTURE #
#
* IF THIS WAS AN INITIAL LOAN OF A CONNECTION FROM PRIMARY TO
* SECONDARY APPLICATION, LOCATE THE AST ENTRY FOR THE PRIMARY APPL
* AND DECREMENT THE NUMBER OF T-A CONNECTIONS FOR THE PRIMARY APPL.
* CALL *NVFTURT* TO UPDATE THE *RAU* TABLE FOR THE PRIMARY APPL, IF
* NEEDED.
#
IF PTA$LRC[PT] EQ RCRC"LSA"
THEN
BEGIN
PRIAPP = TRUE;
NVFTURT(CRVCB[0],PT,PRIAPP); # UPDATE *RAU* TABLE #
FOR AS = 0 STEP 1 WHILE
(AS LS ASENTRY AND
AST$AN[AS] NQ PTA$PRIAN[PT])
DO
BEGIN
END
AST$RACN[AS] = AST$RACN[AS] - 1; # DECREMENT NO. OF CONN. #
NVFSCAD(AS);
END
NVFTETC(PT); # END TERMINAL CONNECTION #
END
ELSE # CR/CB OCCURRED AFTER CR/ACC RECEIVED #
BEGIN
#
* CR/CB OCCURRED AFTER A SUCCESSFUL SWITCH SO A *PTAC* ENTRY NO
* LONGER EXIST FOR THIS CONNECTION. CALL *NVFTPVD* TO ALLOCATE
* SPACE FOR A NEW *PTAC* ENTRY AND MAKE VCB READ REQUEST ENTRY
* IN *VRQ* QUEUE. UPDATE *PTAC* WITH INFORMATION RECEIVED IN
* THE CR/CB SM.
#
NVFTPVD(CRVCB[0],CRAN[0],PT);
PTA$VCB[PT] = CRVCB[0];
PTA$DT[PT] = CRDT[0];
PTA$TC[PT] = CRCBTC[0]; # SAVE TERMINAL CLASS #
#
* SET *PTAC* STATE TO AWAIT-VCB-CB TO DIFFERENTIATE FROM
* AWAITING VCB READ BECAUSE OF A RECONNECT REQUEST.
#
PTA$STATE[PT] = PTACST"AWTVCBC";
END
END
END # END NVFTCB #
TERM