*DECK NVFATAC USETEXT TEXTNVF; USETEXT TEXTSS; USETEXT TXSMNVF; USETEXT TXTANVF; USETEXT TXTAPSS; USETEXT TXTSUSS; PROC NVFATAC; # TITLE NVFATAC - TERMINATE A-A CONNECTION # BEGIN # NVFATAC # # ** NVFATAC - TERMINATE A-A CONNECTION. * * C. BRION 82/06/03, 83/12/12. * * THIS PROCEDURE PROCESSES THE CR/CB/U, CR/RCN/R AND FC/INACT * (TIMEOUT) SMS. * * PROC NVFATAC * ENTRY: * THE INPUT SM RESIDES IN MSGBUF. * * EXIT: * THERE ARE THREE POSSIBLE EXIT CONDITIONS: * 1) WHEN A CR/CB FOR A NON-NVF CONNECTION OR A CR/RCN IS * RECEIVED, A VCB READ REQUEST IS MADE AND THE PAAC ENTRY * CREATED. * * 2) WHEN A CR/CB FOR A NVF CONNECTION IS RECEIVED, A CR/TRM * SM IS ISSUED, THE NUMBER OF A-A CONNECTIONS FOR THE AP- * PLICATION IS DECREMENTED, APPLICATION DEPARTURE PROCESSING * IS PERFORMED, A CALL TO PROCEDURE NVFACTC IS MADE * IN ORDER TO RELEASE THE ACTIVE PID TABLE (IF NEEDED), * RELEASE THE PAAC ENTRY AND RELEASE THE VCB ORDINAL. * * 3) WHEN A TIMEOUT IS RECEIVED, A CR/RAP/A SM IS ISSUED FOR THE * CONNECTION ONLY IF THE CANCELLATION NUMBER AND ACN OF THE * TIMEOUT SM AND A PAAC ENTRY MATCH. * THE NUMBER OF PENDING A-A CONNECTIONS OF THE PAAC ENTRY IS * DECREMENTED AND APPLICATION DEPARTURE PROCESSING IS PERFORMED. * A CALL IS THEN MADE TO NVFACTC AS STATED ABOVE. # CONTROL EJECT; # **** PROC NVFATAC XREF LIST # XREF BEGIN PROC ABORT; # MACREL - ABORT TASK # PROC MESSAGE; # ISSUE MESSAGE TO DAYFILE # PROC SSTRTS; # SS-REMOVE TABLE SPACE # PROC SSTATS; # SS - ALLOCATE TABLE SPACE # PROC NVFAPVD; # PREPARE VCB REQUEST # PROC NVFSCAD; # COMPLETE APPL DEPARTURE # PROC NVFUMQE; # MAKE QUEUE ENTRY # PROC NVFUFVO; # FREE UP VCB ORDINAL # PROC NVFACTC; # CLEANUP TERMINATING CONN # END # **** # # * ITEM DEFINITIONS. # ITEM PAC I; # PAAC ENTRY ORDINAL # ITEM NENTRY I; # NUMBER TABLE ENTRY VAR # ITEM VCBIN I; # VCB ORDINAL # ITEM ANIN I; # APPL NUMBER # ITEM AORD I; # APPL AST ORDINAL # ITEM ASENTRY I; # NUMBER AST ENTRIES # ITEM PORD I; # PRIMARY APPL AST ORDINAL # ITEM VCBREL B; # VCB RELEASE FLAG # $BEGIN # * NOAST - NO AST ENTRY WAS FOUND. # ARRAY NOAST [00:00] S(4); BEGIN ITEM NO$MSG C(00,00,31) = [" NVFATAC - AST ENTRY NOT FOUND."]; ITEM NO$ZERO U(03,06,54) = [0]; END $END CONTROL EJECT; # * * MAIN NVFATAC PROCEDURE START * # ASENTRY = ASTLNGTH/ASTSIZ$; VCBREL = TRUE; # * CHECK IF TIMEOUT. IF SO, PROCEED TO LOCATE PAAC ENTRY. # IF WCB$SMID[0] EQ CTQSTAT"SINA" THEN BEGIN NENTRY = PACLNGTH/PAACSIZ$; FOR PAC = 0 STEP 1 WHILE NOT (PA$NACN[PAC] EQ FCACN[0] AND PA$CNUM[PAC] EQ ABHABN[0]) AND (PAC LS NENTRY) DO BEGIN END IF PAC NQ NENTRY THEN BEGIN # * PAAC ENTRY FOUND, TIMEOUT IS GOOD. ATTEMPT TO FIND AST * ENTRY OF THE PAAC ENTRY. # FOR AORD = 0 STEP 1 WHILE ((PA$SWAP[PAC] NQ AST$PANAM[AORD]) AND (AORD NQ ASENTRY)) DO BEGIN END IF AORD NQ ASENTRY THEN # * AST ENTRY FOUND. * PERFORM DEPARTURE PROCESSING FOR APPLICATION. # NVFSCAD(AORD); # * SEND CR/RAP/A SM. * RELEASE PAC ENTRY, ACPID TABLE SPACE AND VCB ORDINAL VIA * CALL TO NVFACTC. # SPMSG0[1] = 0; PFCSFC[1] = CRRAPA; CRNACN[1] = PA$NACN[PAC]; CRRRAP[1] = RCRA"ANA"; NVFUMQE(P,APSM[1],APPPR$,0,LCRRAPA); NVFACTC(PAC,VCBREL); GOTO ENDEXIT; END GOTO ENDEXIT; END # * NOT A TIMEOUT, CONTINUE FOR CB OR RECONNECT. * GET VCB ORDINAL AND APPL NUMBER FROM SM. # VCBIN = CRVCB[0]; ANIN = CRAN[0]; # * IF THE APPLICATION NUMBER IS 1, THAT IS NVF. DO NOT LOOK FOR AN * AST ENTRY BECAUSE NVF DOESN'T HAVE ONE. SET UP THE AST ORDINAL * TO BYPASS FURTHER AST CHECKS. # IF ANIN EQ 1 THEN BEGIN AORD = ASENTRY; PORD = AORD; END ELSE # * DETERMINE THE AST ORDINAL OF THE APPLICATION. CHECK IF A * SECONDARY TYPE OF APPLICATION AND THEN DETERMINE THE PRIMARY * AST ORDINAL. # BEGIN FOR AORD = 0 STEP 1 WHILE ((AORD LS ASENTRY) AND (AST$AN[AORD] NQ ANIN)) DO BEGIN END IF AORD NQ ASENTRY THEN BEGIN PORD = AORD; IF AST$PANAM[AORD] NQ AST$SANAM[AORD] THEN BEGIN FOR PORD = 0 STEP 1 WHILE ((PORD LS ASENTRY) AND (AST$SANAM[AORD] NQ AST$PANAM[PORD])) DO BEGIN END IF PORD EQ ASENTRY THEN PORD = AORD; END END END # * CHECK THE SFC OF THE INCOMING SM. IF CB (CONNECTION BROKEN), * CHECK IF NVFS CONNECTION OR NOT. # IF SFC[0] EQ CB THEN BEGIN IF (CRNACN[0] EQ 0 AND NOT CRLIMBO[0]) THEN # * NON-NVF CONNECTION HAS RECEIVED A CR/CB. ISSUE READ VCB REQUEST. * A PAAC ENTRY CREATED AND SET THE STATE. # BEGIN # * IF NO AST ENTRY WAS FOUND, SOMETHING IS WRONG -- ABORT. # $BEGIN IF (AORD EQ ASENTRY) AND (ANIN NQ 1) THEN BEGIN MESSAGE(NOAST[0],0); ABORT; END $END NVFAPVD(VCBIN,ANIN,PAC); PA$STATE[PAC] = PAACST"PACB"; PA$IAPRC[PAC] = CRRCB[0]; PA$VCB[PAC] = VCBIN; END ELSE # MEMORY RESIDENT PAAC - NO CR/ACC SEEN # # * NVF CONNECTION NEVER REACHED THE SWITCHED STATE. A PAAC EXISTS. * LOCATE PAAC ENTRY, THEN THE APPLICATION TABLE ENTRY BASED ON THE * SWITCHED APPLICATION NUMBER IN THE PAAC ENTRY. # BEGIN NENTRY = PACLNGTH / PAACSIZ$; FOR PAC = 0 STEP 1 WHILE ((PAC LS NENTRY) AND (PA$VCB[PAC] NQ CRVCB[0])) DO BEGIN END # * A PAAC ENTRY MAY NOT BE FOUND SINCE IT MAY HAVE BEEN DELETED BY * FAIL/APPL PROCESSING. IF THIS IS THE CASE, JUST IGNORE THE CR/CB. # IF PAC EQ NENTRY THEN GOTO ENDEXIT; # * CHECK IF CONNECTION AWAITING VCB DATA ON RECONNECT. IF NOT, * THEN PROCEED. OTHERWISE, THE RECONNECT VCB PROCESSING WILL * FINISH CONNECTION PROCESSING AND ISSUE A CR/TRM/R SM. # IF PA$STATE[PAC] NQ PAACST"PARCN" THEN BEGIN # * IF THE APPL NUMBER IS 1 (FOR NVF), GET THE SWITCHED APPL NAME * FROM THE PAAC ENTRY INSTEAD OF THE SM. # IF ANIN EQ 1 THEN BEGIN FOR AORD = 0 STEP 1 WHILE (AORD LS ASENTRY) AND (AST$PANAM[AORD] NQ PA$SWAP[PAC]) DO BEGIN END IF AORD NQ ASENTRY THEN BEGIN PORD = AORD; IF AST$PANAM[AORD] NQ AST$SANAM[AORD] THEN BEGIN FOR PORD = 0 STEP 1 WHILE ((PORD LS ASENTRY) AND (AST$SANAM[AORD] NQ AST$PANAM[PORD])) DO BEGIN END IF PORD EQ ASENTRY THEN PORD = AORD; END END END # * DECREMENT NUMBER OF A-A CONNECTIONS FOR THE SECONDARY * AST ENTRY AND THE PRIMARY AST ENTRY IF NOT THE SAME ENTRY. # IF AORD NQ ASENTRY THEN BEGIN AST$AACN[AORD] = AST$AACN[AORD] - 1; IF AORD NQ PORD THEN AST$AACN[PORD] = AST$AACN[PORD] - 1; END # * ISSUE A CT/TRM/R SM ONLY FOR NVF CONNECTION. # IF NOT CRLIMBO[0] THEN BEGIN SPMSG0[1] = 0; PFCSFC[1] = CRTRM; RC[1] = CRRCB[0]; CRNACN[1] = CRNACN[0]; NVFUMQE(P,APSM[1],APPPR$,0,LCRTRM); END # * CALL NVFACTC TO RELEASE ACPID TABLE SPACE, THE PAAC ENTRY AND * THE ASSIGNED VCB ORDINAL. PROCEED TO COMPLETE APPLICATION DE- * PARTURE FOR SECONDARY AST ENTRY AND THE PRIMARY AST ENTRY IF * NOT THE SAME ENTRY. # NVFACTC(PAC,VCBREL); IF AORD NQ ASENTRY THEN BEGIN NVFSCAD(AORD); IF AORD NQ PORD THEN NVFSCAD(PORD); END END END END ELSE # CR/RCN/R SM RECEIVED # BEGIN # * CR/RCN RECEIVED. CHECK IF LIMBO STATE MEANING THAT * THE SWITCH NEVER ACTUALLY TOOK PLACE. # IF NOT CRLIMBO[0] THEN BEGIN # * IF NO AST ENTRY WAS FOUND, SOMETHING IS WRONG -- ABORT. # $BEGIN IF (AORD EQ ASENTRY) AND (ANIN NQ 1) THEN BEGIN MESSAGE(NOAST[0],0); ABORT; END $END # * RECONNECT FOR NON-NVF CONNECTION. MUST GET PAAC ENTRY BUILT, * THEN ISSUE A VCB READ REQUEST FOR THE VCB DATA. # NVFAPVD(VCBIN,ANIN,PAC); PA$STATE[PAC] = PAACST"PARCN"; PA$VCB[PAC] = VCBIN; PA$IAPRC[PAC] = CRRRCN[0]; PA$NACN[PAC] = CRNACN[0]; END # * CHECK IF LIMBO STATE. IF SO, THEN THE CONNECTION NEVER WAS * SUCCESSFULLY SWITCHED. A CR/ACC SM NEVER RECEIVED THEREFORE * THE PAAC ENTRY IS STILL RESIDENT RATHER THAN ON VCB DISK FILE. * LOCATE THE PAAC ENTRY, DECREMENT THE NUMBER OF AA CONNECTIONS * FOR THE SWITCHED APPLICATION, ISSUE A CR/TRM SM, CALL NVFACTC * IN ORDER TO RELEASE ACPID TABLE ENTRY FOR PAAC ENTRY, THE PAAC * ENTRY ITSELF AND THE ASSIGNED VCB ORDINAL. COMPLETE APPLICATION * DEPARTURE VIA CALL TO NVFSCAD. # IF CRLIMBO[0] THEN BEGIN NENTRY = PACLNGTH / PAACSIZ$; FOR PAC = 0 STEP 1 WHILE ((PAC LS NENTRY) AND (PA$VCB[PAC] NQ CRVCB[0])) DO BEGIN END IF PAC EQ NENTRY THEN GOTO ENDEXIT; # * DECREMENT NUMBER A-A CONNECTIONS FOR SECONDARY AST ENTRY AND * THE PRIMARY AST ENTRY IF NOT THE SAME ENTRY. # IF AORD NQ ASENTRY THEN BEGIN AST$AACN[AORD] = AST$AACN[AORD] - 1; IF AORD NQ PORD THEN AST$AACN[PORD] = AST$AACN[PORD] - 1; END # * ISSUE THE CT/TRM/R SM. # SPMSG0[1] = 0; PFCSFC[1] = CRTRM; RC[1] = CRRRCN[0]; CRNACN[1] = CRNACN[0]; CRTRAN[1] = 1; NVFUMQE(P,APSM[1],APPPR$,0,LCRTRM); # * CALL NVFACTC AND NVFSCAD TO CLEAN THINGS UP. # NVFACTC(PAC,VCBREL); IF AORD NQ ASENTRY THEN BEGIN NVFSCAD(AORD); IF AORD NQ PORD THEN NVFSCAD(PORD); END END END ENDEXIT: END # NVFATAC # TERM