*DECK NICNAPX 
USETEXT NIPDEF
USETEXT SUPMSG
USETEXT PARAMS
USETEXT LLCB
USETEXT AHEADER 
USETEXT ACKHEAD 
USETEXT NCNB
USETEXT PT
USETEXT STATTAB 
 PROC NICNAPX;               # SEND ICN/AP/R,ICN/AP/N,A OR ICN/EX/N,A  #
STARTIMS; 
 #
*1DC  NICNAPX 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        NICNAPX             A. BEN-ARTZI        82/05/05 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        SEND ICN/AP/A OR ICN/AP/N TO CCP 
* 
*     3. METHOD USED
*        ALLOCATE A BUFFER FOR THE MESSAGE
*        SET UP APPLICATION AND TEXT FIELDS 
*        LINK MESSAGE TO PIP OUTBOUND CHAIN 
*        NORMAL OR ABNORMAL ARE DETERMINED BY REASON CODE 
* 
*     4. ENTRY PARAMETERS 
*        PARAMS1 - CONNECTION NUMBER
*        PARAMS2 - LLCB ADDRESS 
*        PARAMS3 - REASON CODE FOR THE ICN/AP/A 
* 
*     5. EXIT PARAMETERS
*        NONE 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED 
*        NIPDEF     SUPMSG     PARAMS     LLCB     AHEADER
* 
*     7. ROUTINES AND OVERLAYS CALLED 
*        XTRACE - TRACE PROCEDURE CALL
*        MGETS - ALLOCATE A BUFFER
*        NFOB - LINK BUFFER TO PIP OUTBOUND CHAIN 
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION 
*        THIS PROCEDURE IS CALLED BY SECONDARY OVERLAY COMPCON. 
* 
 #
STOPIMS;
# 
      EXTERNAL REFERENCES 
# 
      XREF
        BEGIN 
        PROC MGETS;          # GET BUFFER                              #
        PROC NFOB;           # SEND DATA TO NETWORK                    #
        PROC XTRACE;         # TRACE CALL                              #
        END 
# 
      LOCAL VARIABLES 
# 
      ITEM CN;               # CONNECTION NUMBER                       #
      ITEM ACKQSIZE;         # ACK QUEUE BUFFER SIZE                   #
      ITEM BUFADDR;          # ACK QUEUE BUFFER ADDRESS                #
      ITEM TLC;              # TEXT LENGTH  IN CHARACTERS              #
      ARRAY SMWORD[0:0] S(1); 
        BEGIN # FIRST WORD OF INCOMING SM                              #
        ITEM PFCSFCV U(00,00,16); # PFC/SFC                            #
        ITEM PFCSFCA B(00,08,01); # ERROR RESPONSE BIT                 #
        ITEM PFCSFCN B(00,09,01); # NORMAL RESPONSE BIT                #
        END 
      BEGIN # NICNAPX # 
  
      CONTROL EJECT;
  
      CONTROL IFEQ DEBUG,1; 
      XTRACE("CNAPX");       # TRACE CALL                              #
      CONTROL FI; 
  
      P<AHEADER> = PARAMS1+BLKHSIZE; # FWA OF SM ABH                   #
      P<SUPMSG> = P<AHEADER>+ABHSIZE; # FWA OF SM                      #
      P<SMNIP> = P<SUPMSG>; 
      P<SMNVF> = P<SUPMSG>; 
      P<NCNB> = PARAMS4; # FWA OF NCNB                                 #
      P<LLCB> = PARAMS2;
      IF P<NCNB> NQ 0 
      THEN # NCNB EXISTS, CR/IAP/N OR CR/RAP/N OR CR/RAP/A             #
        BEGIN 
        CN = NCNBCN[0]; # CONNECTION NUMBER                            #
        IF SFC[0] EQ IAP
        THEN # ITS A CR/IAP/N#
          PFCSFCV[0] = ICNAP; 
        ELSE # ITS A CR/RAP/N OR CR/RAP/A                              #
          BEGIN # SEND ICN/EX OR ICN/AP RESPONSE                       #
          IF NCNBX25[0] 
          THEN # ITS A X.25 A-A CONNECTION                             #
            PFCSFCV[0] = ICNEXN; # PRESET TO ICN/EX/N                  #
          ELSE # ITS A A-A CONNECTION OVER H-H LINK                    #
            PFCSFCV[0] = ICNAPN; # PRESET TO ICN/AP/N                  #
          IF RB[0]
          THEN # ITS A CR/RAP/N FROM NVF                               #
            BEGIN # SET DOWNLINE BLOCK LIMIT, BUILD ACK QUEUE          #
            NCNBDBL[0] = ICNADBL[0]; # ICN FORMAT = CR FORMAT          #
            ACKQSIZE = NCNBDBL[0]+ACKHSIZE; # ACK QUEUE SIZE           #
            MGETS(ACKQSIZE,BUFADDR,TRUE); # GET ACK QUEUE BUFFER       #
            P<ACKHEAD> = BUFADDR; # FWA OF ACK QUEUE                   #
            ACKQID[0] = ACKQIDVALUE; # SET BLOCK IDENTIFIER            #
            ACKNCNB[0] = P<NCNB>; # SET CORR NCNB ADDRESS              #
            NCNBAKIN[0] = 0; # SET IN PTR                              #
            NCNBAKOU[0] = 0; # SET OUT PTR                             #
            NCNBACKQ[0] = BUFADDR; # SET ADDRESS OF ACK QUEUE          #
            IF CRAPRI[0]
            THEN # ITS A HIGH PRIORITY CONNECTION                      #
              NCNBPRI[0] = 1; 
            ELSE # ITS A LOW PRIORITY CONNECTION                       #
              NCNBPRI[0] = 2; 
            IF LLCBNRL[0] EQ BUFLSM# BUFFER REGULATION LEVEL 1         #
            THEN
              BEGIN 
              NCNBNR[0] = TRUE;     # PUT NCNB IN REGULATION           #
              END 
            ELSE
              BEGIN 
              IF LLCBNRL[0] EQ BUFLHDS   # BUFFER REGULATION LEVEL 2  # 
              THEN
                BEGIN 
                IF NCNBPRI[0] EQ 2       # LOW PRIORITY DATA          # 
                THEN
                  BEGIN 
                  NCNBNR[0] = TRUE;  # PUT NCNB IN REGULATION         # 
                  END 
                END 
              END 
            CONTROL IFEQ STAT,1;
            ST$AQ = ST$AQ+1; # INCREMENT ACK QUEUE COUNT               #
            CONTROL FI; 
            END 
          END 
        END 
  
      ELSE # SET ERROR RESPONSE, REJECT ICN/AP/R OR ICN/EX/R           #
        BEGIN 
        PFCSFCV[0] = PFCSFC[0] ;
        CN = ICNCN[0] ; 
        END 
  
      IF PARAMS3 NQ 0 
      THEN # ERROR RESPONSE REASON CODE                                #
        BEGIN 
        PFCSFCN[0] = FALSE; # CLEAR NORMAL RESPONSE BIT                #
        PFCSFCA[0] = TRUE; # SET ERROR RESPONSE BIT                    #
        END 
  
      IF PFCSFCV[0] NQ ICNAP # NOT AN ICN/AP/R FROM NIP                #
        AND PFCSFCV[0] NQ ICNEXN # NOT AN ICN/EX/N TO NETWORK          #
      THEN # SEND ONE WORD RESPONSE ONLY                               #
        BEGIN # SEND ICN/AP/N OR ICN/EX/A OR ICN/AP/A                  #
        MGETS(LICNAP+BLKHSIZE+ABHSIZE,BUFADDR,TRUE);
        TLC = LICNAPA;
        END 
      ELSE # ITS ICN/AP/R OR ICN/EX/N                                  #
        BEGIN # USE CR/IAP/N OR CR/RAP/N BUFFER                        #
        TLC = (ABHTLC[0]*15)/2; # CONVERT TO ASCII CHARACTER COUNT     #
        IF PFCSFCV[0] EQ ICNEXN 
        THEN
          BEGIN 
          TLC = TLC - 1;         # LESS ONE EXTRA OCTET FOR A 3 WORD   #
          END                    # INCNEXN                             #
        ELSE
          BEGIN 
          IF PFCSFCV[0] EQ ICNAP   # IF ICNAP                          #
          THEN
            BEGIN 
            TLC = CRBYTE;          # EXTRACT CHARACTER COUNT FROM      #
            END                    # CRIAPN                            #
          END 
        BUFADDR = PARAMS1; # REUSE CR/IAP/N OR CR/RAP/N BUFFER         #
        END 
  
      P<AHEADER> = BUFADDR+BLKHSIZE;
      P<SUPMSG> = P<AHEADER>+ABHSIZE; 
      P<SMNIP> = P<SUPMSG>; # RESET BASED POINTERS                     #
      ABHABT[0] = APPCMD; 
      ABHACT[0] = CT8ASCII; 
      ABHTLC[0] = TLC;
      PFCSFC[0] = PFCSFCV[0]; 
      ICNCN[0] = CN;
      ICNRAP[0] = PARAMS3; # REASON CODE IF AN ERROR RESPONSE          #
      NFOB(BUFADDR,PARAMS2); # SEND SM TO NETWORK                      #
  
      RETURN; 
      END # NICNAPX # 
      TERM
