.TITLE PMRCON - PASSTHROUGH CONNECT .IDENT /V01.04/ ; ; COPYRIGHT (C) 1980 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ; ; MODULE DESCRIPTION: ; ; SUBROUTINE TO MAKE A PASSTHROUGH CONNECTION ; ; ; DISTRIBUTED SYSTEMS SOFTWARE ENGINEERING ; ; IDENT HISTORY: ; ; 1.00 13-MAY-80 J. A. SCHRIESHEIM ; ; 1.01 17-MAY-80 J. A. SCHRIESHEIM ; ADDED ACCESS CONTROL SUPPORT ; ; 1.02 12-DEC-80 J. A. SCHRIESHEIM ; FIXED BUG IN ACCESS CONTROL FORMATTING ; ; 1.03 8-JAN-81 J. A. SCHRIESHEIM ; ADDED SUPPORT FOR OPTIONAL DATA (USED IN PMR LOGGING) ; ; 1.04 5-MAR-81 J. A. SCHRIESHEIM ; ONLY CONNECT TO LOCAL PMR TO MAP NODE NAME IF CONNECT ; ERROR WAS "NE$NOD" OR "NE$COM". .SBTTL MACRO CALLS AND LOCAL DATA ; ; MACRO LIBRARY CALLS ; .MCALL CONB$$,NETDF$,CONW$S,SNDW$S,RECW$S,DSCW$S,ALUN$S BUFFL=132. ; SEND/RECEIVE BUFFER LENGTH NETDF$ ; DEFINE DECNET SYMBOLICS ; ; CALLING PARAMETER BLOCK OFFSETS ; .ASECT .=0 P$LUN:: .BLKB 1 ; LUN FOR LINK P$EFN:: .BLKB 1 ; EVENT FLAG FOR LINK I/O P$HOP:: .BLKB 1 ; CURRENT HOP COUNT P$OBJ:: .BLKB 1 ; TARGET OBJECT TYPE P$NOD:: .BLKW 1 ; POINTER TO ASCIZ NODE LIST P$NAM:: .BLKW 1 ; POINTER TO ASCIZ TARGET TASK NAME P$ACS:: .BLKW 1 ; POINTER TO 3 ASCIZ ACS STRINGS .PSECT DATA$I D,RW ; IMPURE DATA ; ; LOCAL DATA ; $CONB:: CONB$$ ; CONNECT BLOCK $STAT:: .BLKW 2 ; I/O STATUS BLOCK $ODATA::.WORD 0 ; OUTGOING OPTIONAL DATA POINTER $OSIZE::.WORD 0 ; OUTGOING OPTIONAL DATA SIZE $IDATA::.WORD 0 ; INCOMING OPTIONAL DATA POINTER $ISIZE::.WORD 0 ; INCOMING OPTIONAL DATA SIZE $FLAG:: .BLKW 1 ; PASSTHROUGH FLAG - ; 0 = DIRECT CONNECTION TO TARGET ; 1 = CONNECTION TO OBJECT 123. ; ; **-KEEP THE NEXT LINES CONTIGUOUS-** ; .ENABL LC .NLIST BEX CONERR: .ASCII /Unable to connect to node / ; CONNECT ERROR MESSAGE $PATH:: .BLKB 20. ; ASCIZ PATH STRING BUFF: .BLKB 1 ; START OF SEND/RECEIVE BUFFER $ERROR:: ; ASCIZ ERROR MESSAGE STRING .BLKB BUFFL ; HANDY/DANDY MULTI-PURPOSE BUFFER .EVEN .LIST BEX .SBTTL $CONN - CONNECT USING PASSTHROUGH PROTOCOL ;+ ; **-$CONN-CONNECT USING PASSTHROUGH PROTOCOL ; ; THIS ROUTINE IS CALLED TO ESTABLISH A CONNECTION TO A NODE ; THROUGH INTERVENING NODES IF NECESSARY. ; ; INPUTS: ; R5 = ADDRESS OF PARAMETER BLOCK FORMATTED AS: ; .BLKB 1 LUN FOR LINK ; .BLKB 1 EVENT FLAG FOR LINK I/O ; .BLKB 1 CURRENT HOP COUNT ; .BLKB 1 TARGET OBJECT TYPE ; .BLKW 1 POINTER TO ASCIZ NODE LIST ; .BLKW 1 POINTER TO ASCIZ TARGET TASK NAME ; .BLKW 1 POINTER TO 3 ASCIZ ACCESS CONTROL STRINGS ; ; OUTPUTS: ; C-CLEAR, SUCCESS AND: ; $PATH = ASCIZ PATH TAKEN TO TARGET ; C-SET, FAILURE AND: ; $ERROR = ASCIZ ERROR MESSAGE STRING ; $STAT = I/O STATUS IF IT WAS A LOCAL CONNECT ERROR ; ;- .PSECT CODE$ I,RO ; PURE CODE $CONN:: CALL $SAVAL ; SAVE ALL REGISTERS CLR $FLAG ; ASSUME CONNECTING TO TARGET DIRECTLY CLRB BUFF ; INDICATE NO NAK IN BUFFER ALUN$S P$LUN(R5),#"NS ; TRY TO ASSIGN LUN TO NS: ; ; SET UP CONNECT BLOCK ; CALL SETCNB ; SET UP THE CONNECT BLOCK TSTB (R0) ; IS THERE ANOTHER NODE IN STRING ? BEQ 20$ ; IF EQ, NO - CONNECT DIRECTLY 10$: INC $FLAG ; ELSE, INDICATE PASSTHROUGH CONNECTION CLRB $CONB+N.RFM ; SET FORMAT 0 MOVB #123.,$CONB+N.ROT ; SET PASSTHROUGH OBJECT TYPE CLR $CONB+N.RIDC ; NO ACCESS CONTROL CLR $CONB+N.RPSC ; ... CLR $CONB+N.RACC ; ... ; ; CONNECT TO TARGET (OR NEXT PASSTHROUGH TASK) ; 20$: CONW$S P$LUN(R5),P$EFN(R5),#$STAT,,<#$CONB,#N.RQL,$ODATA,$OSIZE,$IDATA,$ISIZE> MOV $STAT+2,$ISIZE ; SET SIZE OF OPTIONAL DATA RETURNED BCS 97$ ; RETURN ON ERROR TSTB $STAT ; SUCCESS ? BPL 30$ ; IF PL, YES - CONTINUE TSTB P$HOP(R5) ; ARE WE A PMR TASK ? BNE 97$ ; IF NE, YES - INDICATE ERROR CMPB $CONB+N.RND,#' ; ARE WE TRYING A LOCAL CONNECT ? BEQ 97$ ; IF NE, YES - RETURN ERROR CMPB $STAT,#IE.NRJ ; ELSE, NETWORK REJECT ? BNE 97$ ; IF NE, NO - RETURN ERROR CMPB $STAT+2,#NE$NOD ; WAS REASON "UNRECOGNIZED NODE NAME" BEQ 25$ ; IF EQ, YES - MAYBE PMR CAN DO BETTER CMPB $STAT+2,#NE$COM ; WAS REASON "NODE UNREACHABLE" BNE 97$ ; IF NE, NO - PMR PROBABLY CAN'T CONNECT 25$: MOVB #' ,$CONB+N.RND ; ELSE, TRY TO CONNECT TO LOCAL PMR MOV P$NOD(R5),R0 ; RESET NODE STRING TO BEGINNING BR 10$ ; AND TRY LOCAL PMR 30$: CLR $STAT ; INDICATE ANY ERRORS FOUND IN $ERROR TST $FLAG ; PASSTHROUGH ? BEQ 100$ ; IF EQ, NO - FINISHED ; ; FORMAT AND SEND PASSTHROUGH DATA MESSAGE ; CALL FORMAT ; ELSE, FORMAT PASSTHROUGH MESSAGE ; (R0 POINTS TO NODE NAME STRING) SNDW$S P$LUN(R5),P$EFN(R5),#$STAT,,<#BUFF,R0> ; SEND THE MESSAGE BCS 97$ ; RETURN ON ERROR TSTB $STAT ; SUCCESS ? BMI 97$ ; IF MI, NO - RETURN WITH ERROR ; ; WAIT FOR ACK OR NAK, AND FORMAT RETURN FOR USER ; MOV #BUFF,R0 ; POINT TO RECEIVE BUFFER RECW$S P$LUN(R5),P$EFN(R5),#$STAT,, ; RECEIVE MESSAGE BCS 97$ ; RETURN ON ERROR TSTB $STAT ; SUCCESS ? BMI 97$ ; IF MI, NO - RETURN WITH ERROR ADD $STAT+2,R0 ; POINT TO END OF BUFFER CLRB (R0) ; MAKE IT ASCIZ CMPB BUFF,#1 ; IS THIS AN ACK ? BNE 97$ ; IF NE, ERROR (ASSUME NAK) MOV #$PATH,R0 ; POINT TO PATH BUFFER 40$: TSTB (R0)+ ; LOOK FOR END OF NEXT NODE NAME BNE 40$ ; ... DEC R0 ; BACK OVER NULL MOV #BUFF+1,R1 ; POINT TO RETURNED PATH 50$: MOVB (R1)+,(R0)+ ; APPEND TO FORM COMPLETE PATH BNE 50$ ; ... BR 100$ ; AND RETURN 97$: DSCW$S P$LUN(R5),P$EFN(R5) ; DISCONNECT THE LINK CMPB BUFF,#2 ; WAS A NAK RECEIVED ? BEQ 99$ ; IF EQ, YES - ERROR TEXT IS AT $ERROR MOV #CONERR,R0 ; ELSE, POINT TO CONNECT ERROR STRING MOV #$ERROR,R1 ; POINT TO ERROR TEXT BUFFER TSTB $STAT ; ERROR TO RETURN ? BMI 98$ ; IF MI, YES CLR $STAT ; ELSE, INDICATE NO 98$: MOVB (R0)+,(R1)+ ; SET ERROR MESSAGE INTO BUFFER BNE 98$ ; ... 99$: SEC ; INDICATE ERROR 100$: RETURN .SBTTL SETCNB - SET UP THE CONNECT BLOCK ;+ ; **-SETCNB-SET UP THE CONNECT BLOCK ; ; THIS ROUTINE FILES IN THE TARGET TASK NAME, NODE NAME, OBJECT ; TYPE AND ACCESS CONTROL STRINGS IN THE CONNECT BLOCK. ; ; INPUTS: ; R5 = ADDRESS OF USER SUPPLIED CONNECT PARAMETER BLOCK ; ; OUTPUTS: ; $CONB = FILLED IN CONNECT BLOCK ; $PATH = FIRST NODE IN LIST ; R0 = POINTER TO NEXT CHARACTER IN USER SUPPLIED NODE NAME LIST ; ;- SETCNB: ; ; SET THE OBJECT TYPE, TARGET TASK NAME AND ACCESS CONTROL IN THE ; CONNECT BLOCK. ; CLRB $CONB+N.RFM ; ASSUME FORMAT 0 MOVB P$OBJ(R5),$CONB+N.ROT ; ASSUME CONNECT TO TARGET OBJECT MOV P$NAM(R5),R0 ; POINT TO TASK NAME BEQ 2$ ; IF EQ, NONE THERE INCB $CONB+N.RFM ; SET FORMAT 1 MOV #$CONB+N.RDEC,R1 ; POINT TO TASK NAME WITHIN CONB$$ CALL SETASZ ; SET THE ASCIZ STRING 2$: MOV P$ACS(R5),R0 ; POINT TO ACCESS CONTROL STRINGS BEQ 5$ ; IF EQ, NONE THERE MOV #$CONB+N.RIDC,R1 ; STORE THE ID STRING CALL SETASZ ; ... MOV #$CONB+N.RPSC,R1 ; STORE THE PASSWORD STRING CALL SETASZ ; ... MOV #$CONB+N.RACC,R1 ; STORE THE ACCOUNT STRING CALL SETASZ ; ... ; ; SET NEXT NODE'S NAME IN CONNECT BLOCK AND AT $PATH (ASCIZ). ; 5$: MOV P$NOD(R5),R0 ; POINT TO NODE NAME STRING CMPB (R0),#'_ ; LEADING UNDERSCORE ? (VAX HACK) BNE 7$ ; IF NE, NO INC R0 ; YES ... STRIP IT OFF 7$: MOV #$CONB+N.RND,R1 ; POINT TO NODE NAME WITHIN CONB$$ MOV #" ,(R1) ; INIT NAME TO SPACES MOV #" ,2(R1) ; ... MOV #" ,4(R1) ; ... MOV #$PATH,R2 ; POINT TO PATH STRING SAVE AREA 10$: TSTB (R0) ; AT END OF NODE NAME STRING ? BEQ 20$ ; IF EQ, YES CMPB (R0)+,#': ; ARE WE AT THE END OF THE NODE NAME ? BNE 12$ ; IF NE, NO CMPB (R0)+,#': ; LEGAL TERMINATOR ? BEQ 20$ ; IF EQ, YES BR 125$ ; ELSE, NO 12$: CMP R1,#$CONB+N.RND+6 ; IS THE NODE NAME GREATER THAN 6 CHARS? BLO 13$ ; IF LO, NO 125$: CLRB $CONB+N.RND ; ELSE, MAKE FIRST CHAR ILLEGAL BR 15$ ; AND CONTINUE 13$: MOVB -(R0),(R1)+ ; SAVE CHARACTER 15$: MOVB (R0)+,(R2)+ ; ... BR 10$ ; AND LOOP 20$: MOVB #':,(R2) ; SET "::" AFTER NAME IN $PATH MOVB (R2)+,(R2)+ ; ... CLRB (R2) ; MAKE IT ASCIZ RETURN .SBTTL SETASZ - SET AN ASCIZ STRING IN THE CONNECT BLOCK ;+ ; **-SETASZ-SET AN ASCIZ STRING IN THE CONNECT BLOCK ; ; THIS ROUTINE MOVES A USER SUPPLIED ASCIZ STRING INTO THE CONNECT ; BLOCK AS A COUNTED FIELD. ; ; INPUTS: ; R0 = ADDRESS OF ASCIZ STRING ; R1 = ADDRESS OF STORAGE WITHIN CONNECT BLOCK ; ; OUTPUTS: ; R0 = NEXT BYTE AFTER ASCIZ STRING ; ;- SETASZ: MOV R1,R2 ; COPY FIELD POINTER CLR (R2)+ ; INIT FIELD LENGTH 10$: TSTB (R0) ; AT END OF STRING ? BEQ 20$ ; IF EQ, YES - RETURN INC (R1) ; ELSE, COUNT ANOTHER CHARACTER MOVB (R0)+,(R2)+ ; SET CHARACTER IN CONNECT BLOCK BR 10$ ; ... 20$: INC R0 ; POINT PAST NULL RETURN .SBTTL FORMAT - FORMAT A PASSTHROUGH CONNECT MESSAGE ;+ ; **-FORMAT-FORMAT A PASSSTHROUGH CONNECT MESSAGE ; ; INPUTS: ; R0 = ADDRESS OF ASCIZ NODE NAME LIST ; R5 = POINTER TO CONNECT DESCRIPTOR WITH: ; P$HOP(R5) = CURRENT HOP COUNT ; P$OBJ(R5) = TARGET OBJECT NUMBER ; P$NAM(R5) = POINTER TO ASCIZ TARGET NAME ; P$ACS(R5) = POINTER TO 3 ASCIZ ACCESS CONTROL STRINGS ; ; OUTPUTS: ; BUFF = BUFFER WITH PASSTHROUGH CONNECT MESSAGE ; R0 = LENGTH OF PASSTHROUGH MESSAGE TO SEND ; ;- FORMAT: MOV #BUFF,R4 ; POINT TO MESSAGE BUFFER MOVB P$HOP(R5),(R4)+ ; SET HOP COUNT INTO MESSAGE 10$: MOVB (R0)+,(R4)+ ; SET NODE NAME LIST INTO MESSAGE BNE 10$ ; ... CMPB -2(R4),#': ; TRAILING ":" ON NAME ? BEQ 15$ ; IF EQ, YES MOVB #':,-(R4) ; ELSE, PLANT ONE MOVB (R4)+,(R4)+ ; AND ANOTHER CLRB (R4)+ ; MAKE IT ASCIZ 15$: CALL FMTACS ; FORMAT ACCESS CONTROL IF THERE MOVB #'",-1(R4) ; SET START OF TASK DESCRIPTOR MOV R4,R0 ; COPY BUFFER POINTER CLR R1 ; COPY OBJECT TYPE WITHOUT BISB P$OBJ(R5),R1 ; ... SIGN-EXTEND CLR R2 ; ENABLE ZERO SUPPRESSION CALL $CBDMG ; CONVERT OBJECT TO ASCII MOVB #'=,(R0)+ ; SET DELIMITER TSTB P$OBJ(R5) ; NAMED OBJECT ? BNE 30$ ; IF NE, NO - SKIP NAME MOV P$NAM(R5),R1 ; ELSE, GET ADDRESS OF NAME 20$: MOVB (R1)+,(R0)+ ; SET NAME INTO BUFFER BNE 20$ ; ... DEC R0 ; BACK OVER NULL 30$: MOVB #'",(R0)+ ; PUT IN MESSAGE TERMINATOR SUB #BUFF,R0 ; CALC MESSAGE LENGTH RETURN .SBTTL FMTACS - FORMAT ACCESS CONTROL STRING ;+ ; **-FMTACS-FORMAT ACCESS CONTROL STRING ; ; THIS ROUTINE TAKES THE USERS SUPPLIED ASCIZ STRINGS AND FORMATS ; THEM INTO THE VMS STYLE DESCRIPTOR IN THE PASSTHROUGH MESSAGE. ; ; INPUTS: ; R4 = ADDRESS OF BYTE PAST MOVED ASCIZ NODE NAME STRING ; R5 = ADDRESS OF CONNECT DESCRIPTOR ; ; OUTPUTS: ; R4 = NEXT FREE BYTE IN BUFFER ; ;- FMTACS: ; ; CHECK IF ANY ACCESS CONTROL WAS SPECIFIED ; MOV P$ACS(R5),R0 ; POINT TO SUPPLIED ACS STRINGS BEQ 100$ ; IF EQ, NONE SUPPLIED TSTB (R0) ; ID ? BNE 10$ ; IF NE, YES TSTB 1(R0) ; PASSWORD ? BNE 10$ ; IF NE, YES TSTB 2(R0) ; ACCOUNT ? BEQ 100$ ; IF EQ, NO - NOTHING TO FORMAT ; ; FORMAT ID STRING ; 10$: SUB #3,R4 ; BACK OVER NULL AND "::" MOVB #'",(R4)+ ; PLANT DELIMITER FOR ACS MOVB #' ,(R4)+ ; ASSUME NULL ID STRING TSTB (R0)+ ; IS IT NULL ? BEQ 30$ ; IF EQ, YES CMPB -(R0),-(R4) ; ELSE, BACK UP POINTERS 20$: MOVB (R0)+,(R4)+ ; COPY ID STRING BNE 20$ ; ... DEC R4 ; BACK UP OVER TRAILING NULL ; ; FORMAT PASSWORD STRING ; 30$: MOVB #' ,(R4)+ ; PLANT ID DELIMITER TSTB (R0)+ ; IS IT NULL ? BNE 40$ ; IF NE, NO - COPY IT TSTB (R0) ; ELSE, IS ACCOUNT ALSO NULL ? BNE 60$ ; IF NE, NO - COPY ACCOUNT BR 80$ ; AND FINISH STRING UP 40$: DEC R0 ; BACK UP PASSWORD POINTER 50$: MOVB (R0)+,(R4)+ ; COPY PASSWORD STRING BNE 50$ ; ... ; ; FORMAT ACCOUNT STRING ; 60$: TSTB (R0) ; NULL ACCOUNT ? BEQ 80$ ; IF EQ, YES MOVB #' ,-1(R4) ; ELSE, PLANT DELIMITER 70$: MOVB (R0)+,(R4)+ ; COPY ACCOUNT STRING BNE 70$ ; ... 80$: MOVB #'",-1(R4) ; PLANT ACS DELIMITER MOVB #':,(R4) ; ... NODE NAME TERMINATOR MOVB (R4)+,(R4)+ ; ... CLRB (R4)+ ; MAKE IT ASCIZ 100$: RETURN .END