*DECK NVFSNON
USETEXT TEXTNVF
USETEXT TXSMNVF
USETEXT TXTAPSS
USETEXT TXTSUSS
USETEXT TEXTSS
USETEXT TXTANVF
PROC NVFSNON;
# TITLE NVFSNON - APPLICATION NETON REQUEST (NET/ON SM) #
BEGIN # NVFSNON #
#
** NVFSNON - APPLICATION NETON REQUEST (NET/ON SM).
*
* E. THAVIKULWAT 81/12/31
* C. BRION 83/04/15, 83/06/23, 83/11/09.
*
* THIS PROCEDURE VERIFIES THE NET/ON REQUEST. IT IS CALLED INTO
* EXECUTION BY PROCEDURE *NVFSDQE*.
*
* PROC NVFSNON
*
* ENTRY:
* NET/ON SM IN *MSGBUF*
*
* EXIT:
* NET/ON/N OR NET/ON/A RESPONSE SENT TO *OTQ* QUEUE.
* NET/ON/N OR NET/ON/A ENTRY MAY BE SENT TO THE TAINPQ OR THE
* AAINPQ.
*
* INTERNAL PROCEDURES:
*
* NORMNET - PROCESS NORMAL NETON REQUESTS.
* SPECNET - PROCESS SPECIAL NETON REQUESTS.
* GENAST - GENERATE AST ENTRY.
*
* METHOD:
*
* IF A NORMAL NETON IS RECEIVED, A CALL IS MADE TO THE
* INTERNAL PROCEDURE NORMNET TO PROCESS THE NETON REQUEST.
*
* IF A SPECIAL NETON IS RECEIVED (A NETON FOR A REQUEST START-
* ABLE APPLICATION, A SOLICITED NETON FOR A REQUEST STARTABLE
* APPLICATION OR A REQUEST FOR A MAX COPY GREATER THAN 1 TYPE
* OF APPLICATION) A CALL IS MADE TO SPECNET FOR PROCESSING.
#
#
**** PROC NVFSNON - XREF LIST.
#
XREF
BEGIN
PROC SSTAQE; # SS - ACCEPT QUEUE ENTRY #
PROC NVFUMQE; # TRANSFER SM OR TEXT TO QUEUE #
PROC SSTETS; # SS - ENLARGE TABLE SPACE #
PROC SSTRTS; # SS - RELEASE TABLE SPACE #
PROC NVFUGSN; # GENERATE SECONDARY APPLICATION NAME #
PROC SSCCTR; # SS - CANCEL TIMER #
END
#
****
#
*CALL SMSGNVF
ITEM AS I; # SUBSCRIPT FOR ARRAY AST #
ITEM I I; # LOOP VARIABLE #
ITEM MATCH B; # EXIT LOOP VARIABLE #
ITEM NENTRY I; # NUMBER OF ENTRIES IN TABLE #
ITEM SORD I; # SEC AST ORDINAL #
ITEM SECMATCH B; # SEC AST MATCH FLAG #
ITEM PORD I; # PRI AST ORDINAL #
ITEM LORD I; # LOOP AST ORDINAL #
ITEM RSTART B; # REQUEST STARTABLE INDICATOR #
ITEM RCNET I; # LOCAL NETON REASON CODE #
ITEM CANOK B; # TIMER CANCEL OK FLAG #
CONTROL EJECT;
#
* CLEAR RESPONSE BUFFER, PRESET ERROR CODE TO "INVALID
* APPLICATION", SET REQUEST STATABLE INDICATOR.
#
SPMSG0[1] = 0;
SPMSG1[1] = 0;
NETANAM[1] = NETANAM[0];
NETRC[1] = RNO"IA";
RSTART = FALSE;
#
* SEARCH *AST* TABLE FOR ENTRY THAT MATCHES THE APPLICATION NAME.
#
NENTRY = ASTLNGTH / ASTSIZ$; # CALCULATE NUMBER OF ENTRIES #
FOR I = 0 STEP 1 WHILE
(I LS NENTRY) AND
(AST$ANAM[I] NQ NETANAM[0])
DO
BEGIN
END
#
* IF NO MATCH FOUND, THEN INVALID APPLICATION NETON.
* GOTO END EXIT TO COMPLETE ABNORMAL NETON PROCESSING.
#
IF I EQ NENTRY
THEN
GOTO ENDEXIT;
#
* MATCHING AST ENTRY FOUND.
* SET THE AST ENTRY ORDINALS (LOCAL, PRIMARY,SECONDARY).
* CLEAR THE NETON REASON CODE.
* CLASSIFY THE NETON REQUEST AND CALL THE APPROPRIATE
* PROCEDURE FOR PROCESSING.
#
AS = I;
PORD = AS;
SORD = AS;
RCNET = 0;
IF ((NOT AST$SNPF[PORD]) AND
(NOT AST$RS[PORD]) AND
(AST$MXCOP[PORD] EQ 1))
THEN
#
* UNSOLICITED NETON REQUEST.
#
BEGIN
NORMNET(PORD,RCNET);
NETRC[1] = RCNET;
END
ELSE
#
* SOLICITED REQUEST MEANING THAT EITHER NVF CAUSED THE NETON VIA
* A ROUTE OF A REQUEST STARTABLE APPLICATION OR A REQUEST STARTABLE
* APPLICATION NETTED ON ON ITS OWN OR THE NETTING ON APPLICATION
* IS A MXCOPYS GREATER THAN 1 TYPE OF APPLICATION.
#
BEGIN
SPECNET(PORD,SORD,RCNET);
NETRC[1] = RCNET;
END
ENDEXIT:
#
* CHECK THE REASON CODE. IF NO ERRORS, CHECK FOR SECONDARY AST
* ENTRY. IF IT EXISTS, SET THE SEC AST ENTRY FROM THE NET/ON/R SM.
* IF NO SEC AST ENTRY, SET THE PRIMARY AST ENTRY.
#
IF NETRC[1] EQ 0
THEN
BEGIN
IF SORD NQ PORD
THEN
BEGIN
AST$AN[SORD] = NETAN[0];
AST$JSN[SORD] = NETJSN[0];
AST$AAL[SORD] = NETACCL[0];
AST$MCN[SORD] = NETMCN[0];
AST$CUCOP[SORD] = 1;
# IF THE NUMBER OF THE REVERVED-CONNECTION IS NOT 0, THE APP#
# WANTS TO RESERVE SOME CONNECTIONS FOR OUTGOING. SET FLAG #
# TO REMEMBER THIS FACT. #
IF NETNRCN[0] NQ 0
THEN
BEGIN # CALCULATE INCOMING CONNECTIONS ALLOWED #
AST$MXICN[SORD] = NETMCN[0] - NETNRCN[0];
AST$RICN[SORD] = TRUE; #THIS APP RESTRICTS INCOMING CON#
END
AST$MCN[PORD] = (NETMCN[0] * AST$CUCOP[PORD]);
END
ELSE # NO SEC AST ENTRY #
BEGIN
AST$AN[PORD] = NETAN[0];
AST$JSN[PORD] = NETJSN[0];
AST$AAL[PORD] = NETACCL[0];
AST$MCN[PORD] = NETMCN[0];
IF NETNRCN[0] NQ 0
THEN
BEGIN # CALCULATE INCOMING CONNECTIONS ALLOWED #
AST$MXICN[PORD] = NETMCN[0] - NETNRCN[0];
AST$RICN[PORD] = TRUE; #THIS APP RESTRICTS INCOMING CON#
END
END
IF AST$SNPF[PORD]
THEN
BEGIN
AST$SNPF[PORD] = FALSE;
AST$PNCOP[PORD] = 0;
END
#
* SET UP THE EVENT FOR THE TA AND AA INPUT QUEUE AS WELL AS
* THE NET/ON/N SM.
#
WCB$SMID[1] = CTQSTAT"SNETN";
PFCSFC[1] = NETONN;
NETPRU[1] = AST$PRUF[PORD];
NETXFER[1] = AST$XFERF[PORD];
NETK[1] = AST$KDSPF[PORD];
ASM$TYPE[0] = "NETTED ON";
IF SORD NQ PORD
THEN
BEGIN
ASM$ANAME[0] = AST$PANAM[SORD];
NETANAM[1] = AST$PANAM[SORD];
END
ELSE
BEGIN
ASM$ANAME[0] = AST$PANAM[PORD];
NETANAM[1] = AST$PANAM[PORD];
END
#
* ROUTE EVENT TO UNSOLICITED EVENT QUEUE.
#
NVFUMQE(P<USQ>,ASMBUF[0],APMSG,0,LMSH40$);
END
ELSE # ERROR OCCURRED #
#
* ERROR HAS OCCURRED. SET NET/ON/A PFC-SFC, CHECK FOR CASES WHERE
* AN AST ENTRY WAS FOUND (NON RNO"IA" CASES). IF SEC AST ENTRY EXISTS
* AND NOT A REQUEST START BY NVF, RELEASE THE AST ENTRY.
#
BEGIN
PFCSFC[1] = NETONA;
WCB$SMID[1] = CTQSTAT"SNETA";
IF NETRC[1] NQ RNO"IA"
THEN
BEGIN
IF SORD NQ PORD
THEN
BEGIN
IF NOT RSTART
THEN
BEGIN
SORD = SORD * ASTSIZ$;
SSTRTS(P<AST>,SORD,ASTSIZ$);
END
END
END
END
#
* SET UP REST OF NET/ON RESPONSE SM. SEND RESPONSE SM.
#
NETAN[1] = NETAN[0];
NVFUMQE(P<OTQ>,APSM[1],APPCMD,0,LNETONR);
#
* IF REQUEST START BY NVF, THEN MUST SEND THE EVENT TO THE TA
* AND AA INPUT QUEUES FOR PROCESSING OF POSSIBLE PENDING CON-
* NECTIONS.
#
IF RSTART
THEN
BEGIN
IF AST$TCAN[SORD] NQ 0 THEN
BEGIN
SSCCTR(AST$TCAN[SORD],CANOK);
AST$TCAN[SORD] = 0;
END
WCB$WC[1] = LNETONR + 2;
ABHABT[1] = APPCMD;
SSTAQE(P<TAINPQ>,WCBUF[1],ABHBUF[1],APSM[1]);
SSTAQE(P<AAINPQ>,WCBUF[1],ABHBUF[1],APSM[1]);
END
RETURN;
CONTROL EJECT;
PROC NORMNET(PAI,ERRSTAT);
# TITLE - NORMNET - PROCESS NORMAL NETON REQUEST #
BEGIN # NORMNET #
#
** NORMNET - PROCESS NORMAL NETON REQUEST.
*
* C. BRION 83/10/19.
*
* THIS INTERNAL PROCEDURE PROCESSES NETON REQUESTS THAT ARE
* NOT A RESULT OF AN NVF ROUTE REQUEST OR FROM A REQUEST
* STARTABLE TYPE OF APPLICATION OR FROM A MXCOPY GREATER
* THAN 1 TYPE OF APPLICATION.
*
* NORMNET(PIA,ERRSTAT)
*
* ENTRY:
* PAI = PRIMARY AST ENTRY INDEX.
*
* THE GLOBAL DEFINITIONS IN EFFECT FOR NORMNET.
*
* EXIT:
* ERRSTAT = ERROR STATUS. NON=ZERO INDICATES A NETON ABNORMAL.
#
CONTROL EJECT;
ITEM PAI I; # LOCAL PRI AST ENTRY INDEX #
ITEM ERRSTAT I; # ERROR STATUS (NETON RC) #
ERRSTAT = 0;
IF (NETANAM[0] EQ "CS" OR
NETANAM[0] EQ "NS") AND
(NOT NETPU[0])
THEN
BEGIN
ERRSTAT = RNO"NPR"; # CS AND NS MUST BE A SYSTEM #
END # CONTROL POINT JOB #
ELSE IF (AST$PPF[PAI]) AND
(NOT NETPP[0])
THEN
BEGIN
ERRSTAT = RNO"NPR"; # APPL MUST BE PRIVILEDGED #
END # AND IS NOT #
ELSE IF (AST$AN[PAI] NQ 0)
THEN
BEGIN
ERRSTAT = RNO"DUP"; # APPLICATION ALREADY ON #
END
ELSE IF AST$DIF[PAI]
THEN
BEGIN
ERRSTAT = RNO"DIS"; # APPL DISABLED #
END
ELSE IF AST$DNF[PAI]
THEN
BEGIN
ERRSTAT = RNO"NNA"; # APPL DOWN, LAST NETOFF OR #
END # FAIL APPL NOT DONE #
#
* IF NO ERRORS, INCREMENT NUMBER CURRENT COPIES FOR APPL.
#
IF ERRSTAT EQ 0
THEN
AST$CUCOP[PAI] = 1;
END # NORMNET #
CONTROL EJECT;
PROC SPECNET(PAI,SAI,RC);
# TITLE - SPECNET - PROCESS SPECIAL NETON REQUEST #
BEGIN # SPECNET #
#
** SPECNET - PROCESS SPECIAL NETON REQUEST.
*
* C. BRION 83/10/19.
*
* THIS INTERNAL PROCEDURE PROCESSES NETON REQUESTS THAT ARE FROM
* EITHER A REQUEST STARTABLE TYPE OF APPLICATION, A MXCOPY
* GREATER THAN 1 TYPE OF APPLICATION OR FROM A REQUEST STARTABLE
* APPLICATION THAT WAS INITIATED BY AN NVF ROUTE REQUEST.
*
* SPECNET(PAI,SAI,RC)
*
* ENTRY:
* PAI = PRIMARY AST ENTRY INDEX
*
* EXIT:
* SAI = SECONDARY AST ENTRY INDEX
* RC = RETURN CODE (NON-ZERO INDICATES ERROR.
* RSTART = REQUEST STARTABLE INDICATOR.
*
* THE GLOBAL DEFINITIONS OF NVFSNON ARE IN EFFECT.
#
CONTROL EJECT;
ITEM PAI I; # PRIMARY AST ENTRY INDEX #
ITEM SAI I; # SECONDARY AST ENTRY INDEX #
ITEM RC I; # RETURN ERROR CODE #
ITEM LAI I; # LOCAL AST ENTRY INDEX #
ITEM SECFOUND B; # SEC AST ENTRY FOUND FLAG #
#
* ATTEMPT TO LOCATE A SECONDARY AST ENTRY BY MATCHING THE PRIMARY
* APPLICATION NAME OF THE PRIMARY AST TO THE SECONDARY NAME OF THE
* OTHER AST ENTRIES AND MAKE SURE THE PRIMARY NAMES DO NOT MATCH
* SO AS TO AVOID MATCHING ON THE PRIMARY ENTRY.
#
SAI = PAI;
SECFOUND = FALSE;
RSTART = FALSE;
FOR LAI = 0 STEP 1 WHILE
((LAI LS NENTRY) AND
(NOT SECFOUND))
DO
BEGIN
IF ((AST$UPANAM[PAI] EQ AST$USANAM[LAI]) AND
(AST$USANAM[LAI] NQ AST$UPANAM[LAI]) AND
(AST$AN[LAI] EQ 0))
THEN
BEGIN
SECFOUND = TRUE;
AST$AN[LAI] = NETAN[0];
SAI = LAI;
END
END
#
* CHECK IF PRIMARY APPLICATION IS EITHER DISABLED, DOWN OR
* AT MAX COPIES.
* IF SO, THEN NETON ABNORMAL MUST BE SENT. SET RETURN CODE.
#
IF AST$DIF[PAI]
THEN
BEGIN
RC = RNO"DIS";
GOTO ERREXIT;
END
IF AST$DNF[PAI]
THEN
BEGIN
RC = RNO"NNA";
GOTO ERREXIT;
END
IF ((AST$MXCOP[PAI] EQ AST$CUCOP[PAI]) AND NOT AST$SNPF[PAI])
THEN
BEGIN
RC = RNO"DUP";
GOTO ERREXIT;
END
IF AST$PPF[PAI] AND NOT NETPP[0]
THEN
BEGIN # APPL MUST BE PRIVILEDGED #
RC = RNO"NPR"; # AND IS NOT, REJECT NETON.#
GOTO ERREXIT;
END
#
* IF NO NETON PENDING AND MXCOPY GREATER THAN 1 WHICH INDICATES
* THAT A SECONDARY AST ENTRY MUST BE BUILT. CALL INTERNAL PROC
* GENAST TO BUILD AND INITIALIZE THE SECONDARY AST ENTRY. RESET
* RSTART GLOBAL SO AS TO KNOW IN MAINLINE IF SEC AST ENTRY BUILT
* OR NOT. CALL NVFUGSN TO BUILD AND INSTALL SECONDARY APPLICATION
* NAME IN SEC AST ENTRY IF MAX COPIES GR THAN 1.
#
IF AST$MXCOP[PAI] GR 1
THEN
BEGIN
IF NOT AST$SNPF[PAI]
THEN
BEGIN
GENAST(PAI,SAI);
AST$AN[SAI] = NETAN[0];
END
ELSE
BEGIN
RSTART = TRUE;
AST$CUCOP[PAI] = AST$CUCOP[PAI] + 1;
END
NVFUGSN(SAI);
END
ELSE
#
* IF MAX COPY EQUAL 1 THEN A PRIMARY REQUEST STARTABLE TYPE
* OF APPLICATION NETTING ON. SET THE NUMBER OF CURRENT COPIES
* TO 1. CHECK IF THE APPL WAS CAUSED TO START UP BY
* NVF. IF SO, SET THE REQUEST START FLAG FOR LATER.
#
BEGIN
AST$CUCOP[PAI] = 1;
IF AST$SNPF[PAI]
THEN
BEGIN
RSTART = TRUE;
END
END
ERREXIT:
END # SPECNET #
CONTROL EJECT;
PROC GENAST(PAST,SAST);
# TITLE - GENAST - GENERATE AST ENTRY. #
BEGIN # GENAST #
#
** GENAST - GENERATE AST ENTRY.
*
* C. BRION 83/05/20, 10/21/83.
*
* THIS PROCEDURE IS INTERNAL TO NVFSNON. IT GENERATES A SECONDARY
* AST ENTRY FOR A PRIMARY MULTIPLE COPY TYPE OF APPLICATION.
*
* GENAST(PAST,SAST)
*
* ENTRY:
* PAST = THE PRIMARY AST ENTRY ORDINAL.
* SAST = THE SECONDARY AST ENTRY ORDIANL.
*
* EXIT:
* SAST = THE ORDINAL OF THE NEWLY GENERATED AST ENTRY.
#
CONTROL EJECT;
ITEM POSAST I; # AST POS FOR SSTETS CALL #
ITEM PAST I; # PRIMARY AST ENTRY ORDINAL #
ITEM SAST I; # SECONDARY AST ENTRY ORDINAL #
#
* CALCULATE POSITION IN AST WHERE SEC AST ENTRY SHOULD BE TO
* FOLLOW THE PRIMARY AST ENTRY.
* SET THE ENTRY ORDINAL.
* ENLARGE TABLE SPACE.
#
POSAST = (PAST + 1) * ASTSIZ$;
SAST = (POSAST/ASTSIZ$);
SSTETS(P<AST>,POSAST,ASTSIZ$);
#
* INITIALIZE SEC AST ENTRY.
* INCREMENT NUMBER CURRENT COPIES OF PRI AST ENTRY.
#
AST$WORD1[SAST] = AST$WORD1[PAST];
AST$WORD2[SAST] = AST$WORD2[PAST];
AST$TACN[SAST] = 0;
AST$AACN[SAST] = 0;
AST$RACN[SAST] = 0;
AST$ICCN[SAST] = 0;
AST$RS[SAST] = FALSE;
AST$WORD0[SAST] = 0;
AST$WORD3[SAST] = 0;
AST$WORD4[SAST] = 0;
AST$SANAM[SAST] = AST$PANAM[PAST];
AST$MXCOP[SAST] = 1;
AST$CUCOP[SAST] = 1;
AST$JSN[SAST] = " ";
AST$AN[SAST] = NETAN[0];
AST$CUCOP[PAST] = AST$CUCOP[PAST] + 1;
NENTRY = (ASTLNGTH/ASTSIZ$);
END # GENAST #
END # NVFSNON #
TERM