*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,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,SORD,ASTSIZ$); END END END END # * SET UP REST OF NET/ON RESPONSE SM. SEND RESPONSE SM. # NETAN[1] = NETAN[0]; NVFUMQE(P,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,WCBUF[1],ABHBUF[1],APSM[1]); SSTAQE(P,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,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