mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 01:19:17 +00:00
1801 lines
63 KiB
Plaintext
1801 lines
63 KiB
Plaintext
TITLE ETHUUO - ETHERNET USER INTERFACE V25
|
||
SUBTTL WILLIAM C. DAVENPORT/WXD 11-AUG-87
|
||
|
||
SEARCH F,S,ETHPRM,MACSYM
|
||
$RELOC
|
||
$HIGH
|
||
|
||
;THIS MODULE IMPLEMENTS THE ETHNT. UUO INTERFACE TO ETHERNET
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1985,1988>
|
||
|
||
|
||
XP VETHUU,25 ;ETHUUO VERSION NUMBER
|
||
|
||
ETHUUO::!ENTRY ETHUUO ;LOAD IF LIBRARY SEARCH
|
||
|
||
|
||
;LOCAL DEFINITIONS
|
||
|
||
NU.WAI==000000,,400000 ;ETHERNET FUNCTION COMPLETION WAIT
|
||
SUBTTL TABLE OF CONTENTS
|
||
|
||
|
||
; TABLE OF CONTENTS FOR ETHUUO
|
||
;
|
||
;
|
||
; SECTION PAGE
|
||
; 1. TABLE OF CONTENTS......................................... 2
|
||
; 2. DATA STRUCTURES
|
||
; 2.1 QUEUE HEADER BLOCK................................ 3
|
||
; 2.2 MONITOR BUFFER DESCRIPTOR BLOCK................... 4
|
||
; 2.3 ETHERNET JOB BLOCK................................ 5
|
||
; 2.4 USER PORTAL BLOCK................................. 6
|
||
; 3. ETHNT. UUO SUPPORT
|
||
; 3.1 RESET UUO......................................... 7
|
||
; 3.2 PSI INTERRUPTS.................................... 8
|
||
; 3.3 ETHNT. UUO DISPATCH............................... 9
|
||
; 3.4 ETHNT. UUO DISPATCH TABLES........................ 12
|
||
; 4. ETHNT. UUO FUNCTIONS
|
||
; 4.1 OPEN USER PORTAL.................................. 15
|
||
; 4.2 CLOSE USER PORTAL................................. 16
|
||
; 4.3 QUEUE RECEIVE DATAGRAM BUFFER..................... 17
|
||
; 4.4 READ RECEIVE DATAGRAM QUEUE....................... 18
|
||
; 4.5 QUEUE TRANSMIT DATAGRAM BUFFER.................... 20
|
||
; 4.6 READ TRANSMIT DATAGRAM QUEUE...................... 21
|
||
; 4.7 ENABLE/DISABLE MULTI-CAST ADDRESS................. 22
|
||
; 4.8 READ CHANNEL LIST................................. 23
|
||
; 4.9 READ CHANNEL INFORMATION.......................... 24
|
||
; 4.10 READ CHANNEL COUNTERS............................. 25
|
||
; 4.11 SET CHANNEL ADDRESS............................... 26
|
||
; 4.12 READ PORTAL LIST.................................. 27
|
||
; 4.13 READ PORTAL INFORMATION........................... 28
|
||
; 4.14 READ PORTAL COUNTERS.............................. 29
|
||
; 4.15 READ KONTROLLER LIST.............................. 30
|
||
; 4.16 READ KONTROLLER INFORMATION....................... 31
|
||
; 4.17 READ KONTROLLER COUNTERS.......................... 32
|
||
; 5. ETHNT. UUO FUNCTION SUPPORT
|
||
; 5.1 READ ETHERNET LIST................................ 33
|
||
; 5.2 READ ETHERNET INFORMATION......................... 34
|
||
; 5.3 READ ETHERNET COUNTERS............................ 35
|
||
; 5.4 READ ETHERNET DATA................................ 36
|
||
; 5.5 ETHSER INTERFACE.................................. 37
|
||
; 5.6 ETHSER ERROR CODE CONVERSION...................... 38
|
||
; 6. ETHNT. UUO COMPLETION INTERRUPT
|
||
; 6.1 INTERRUPT DISPATCH................................ 39
|
||
; 6.2 DISPATCH TABLE.................................... 40
|
||
; 6.3 RECEIVE DATAGRAM.................................. 42
|
||
; 6.4 TRANSMIT DATAGRAM................................. 43
|
||
; 6.5 READ ETHERNET DATA................................ 44
|
||
; 7. ETHNT. UUO SUPPORT
|
||
; 7.1 ETHERNET JOB BLOCK MANIPULATION................... 45
|
||
; 7.2 USER PORTAL BLOCK MANIPULATION.................... 47
|
||
; 7.3 MONITOR BUFFER MANIPULATION....................... 50
|
||
; 7.4 INFORMATION PORTAL MANIPULATION................... 55
|
||
; 7.5 FUNCTION COMPLETION EVENT WAIT.................... 57
|
||
; 7.6 PORTAL STATUS UPDATE.............................. 59
|
||
; 7.7 QUEUE MANIPULATION................................ 60
|
||
; 8. PRIVILEGE CHECKING........................................ 65
|
||
; 9. BYTE POINTERS............................................. 66
|
||
; 10. DEFAULT VALUE STORAGE..................................... 67
|
||
; 11. THE END................................................... 68
|
||
SUBTTL DATA STRUCTURES -- QUEUE HEADER BLOCK
|
||
|
||
|
||
;A QUEUE HEADER BLOCK IS USED TO MAINTAIN TRANSMIT AND RECEIVE
|
||
;DATAGRAM QUEUES.
|
||
|
||
$PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
.QHFLI:! BLOCK 1 ;ADDRESS OF FIRST QUEUE ENTRY
|
||
|
||
.QHBLI:! BLOCK 1 ;ADDRESS OF LAST QUEUE ENTRY
|
||
|
||
.QHCNT:! BLOCK 1 ;COUNT OF ENTRIES IN QUEUE
|
||
|
||
.QHLEN:! ;LENGTH OF QUEUE HEADER BLOCK
|
||
|
||
$DEPHASE
|
||
|
||
|
||
;A QUEUE ENTRY BLOCK IS THE FIRST PART OF ANY QUEUE ENTRY
|
||
|
||
$PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
.QEFLI:! BLOCK 1 ;ADDRESS OF NEXT QUEUE ENTRY
|
||
|
||
.QELEN:! ;LENGTH OF QUEUE ENTRY BLOCK
|
||
|
||
$DEPHASE
|
||
SUBTTL DATA STRUCTURES -- MONITOR BUFFER DESCRIPTOR BLOCK
|
||
|
||
|
||
;SINCE ETHERNET ACCESS HAS NO GUARANTEED RESPONSE TIME, DATA IS NOT
|
||
;DIRECTLY RECEIVED INTO OR TRANSMITTED FROM USER BUFFERS. INSTEAD,
|
||
;A MONITOR BUFFER IS ALLOCATED AND USED FOR RECEIPT AND TRANSMISSION
|
||
;OF DATAGRAMS. USER DATA IS COPIED TO/FROM THE MONITOR BUFFER AT
|
||
;UUO LEVEL. THE MONITOR BUFFER DESCRIPTOR BLOCK IS USED TO REMEMBER
|
||
;INFORMATION ABOUT THE USER'S BUFFER AND THE MONITOR'S BUFFER.
|
||
|
||
$PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
.MBQEB:! BLOCK .QELEN ;QUEUE ENTRY BLOCK
|
||
|
||
.MBUBD:! BLOCK .UBLEN ;SAVED USER BUFFER DESCRIPTOR
|
||
|
||
.MBDBS:! BLOCK 1 ;DATAGRAM BUFFER SIZE (IN WORDS)
|
||
.MBUBA:! BLOCK 1 ;USER DATAGRAM BUFFER ADDRESS
|
||
.MBMBA:! BLOCK 1 ;MONITOR DATAGRAM BUFFER ADDRESS
|
||
.MBMSD:! BLOCK MD.LEN ;MONITOR BUFFER MSD
|
||
|
||
.MBLEN:! ;LENGTH OF USER BUFFER DESCRIPTOR BLOCK
|
||
|
||
$DEPHASE
|
||
SUBTTL DATA STRUCTURES -- ETHERNET JOB BLOCK
|
||
|
||
|
||
;EACH USER OF THE ETHERNET HAS AN ETHERNET JOB BLOCK CONTAINING JOB
|
||
;WIDE PARAMETERS, QUOTAS, AND A POINTER TO A TABLE OF USER PORTAL
|
||
;BLOCKS. THE ETHERNET JOB BLOCK IS POINTED TO BY .PDEJB.
|
||
|
||
$PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
EJBJCH:! BLOCK 1 ;JCH OF JOB BLOCK OWNER
|
||
|
||
EJBUPQ:! BLOCK 1 ;USER PORTAL QUOTA
|
||
|
||
EJBBQT:! BLOCK 1 ;DATAGRAM BUFFER QUOTAS
|
||
EJQXBQ==777777,,000000 ;TRANSMIT BUFFER QUOTA
|
||
EJQRBQ==000000,,777777 ;RECEIVE BUFFER QUOTA
|
||
|
||
EJBINF:! BLOCK 1 ;ADDRESS OF INFORMATION PORTAL BLOCK
|
||
|
||
EJBUPC:! BLOCK 1 ;COUNT OF USER PORTAL TABLE ENTRIES
|
||
EJBUPT:! BLOCK 1 ;ADDRESS OF USER PORTAL TABLE
|
||
|
||
EJBPSQ:! BLOCK .QHLEN ;USER PORTAL PSI PENDING QUEUE
|
||
|
||
EJBUNB:! BLOCK UN.LEN ;UN BLOCK FOR UUO LEVEL
|
||
|
||
EJBLEN:! ;LENGTH OF ETHERNET JOB BLOCK
|
||
|
||
$DEPHASE
|
||
SUBTTL DATA STRUCTURES -- USER PORTAL BLOCK
|
||
|
||
|
||
;EACH PORTAL THAT A USER PROCESS HAS OPENED HAS A USER PORTAL BLOCK.
|
||
;THIS BLOCK KEEPS TRACK OF USER RECEIVE AND TRANSMIT DATAGRAMS, AND
|
||
;MAINTAINS INFORMATION NEEDED TO INTERFACE TO ETHSER.
|
||
|
||
$PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
UPBNAM:! BLOCK 1 ;PORTAL DEVICE NAME (SAME PLACE AS DEVNAM)
|
||
|
||
UPBEJB:! BLOCK 1 ;ADDRESS OF ETHERNET JOB BLOCK
|
||
|
||
UPBFWC:! BLOCK 1 ;ETHERNET FUNCTION WAIT CODE
|
||
|
||
UPBPIW:! BLOCK 1 ;PROTOCOL IDENTIFICATION WORD
|
||
; (SAME FORMAT AT .ETPIW WORD)
|
||
|
||
UPBPSW:! BLOCK 1 ;PORTAL STATUS WORD
|
||
; (SAME FORMAT AT .ETPSW WORD)
|
||
UPBPPS:! BLOCK 1 ;PREVIOUS PORTAL STATUS WORD
|
||
|
||
UPBCSW:! BLOCK 1 ;CHANNEL STATUS WORD
|
||
; (SAME FORMAT AT .ETCSW WORD)
|
||
|
||
UPBXBC:! BLOCK 1 ;TRANSMIT DATAGRAM BUFFER COUNT
|
||
UPBRBC:! BLOCK 1 ;RECEIVE DATAGRAM BUFFER COUNT
|
||
|
||
UPBBQT:! BLOCK 1 ;DATAGRAM BUFFER QUOTAS
|
||
UPQXBQ==777777,,000000 ;TRANSMIT BUFFER QUOTA
|
||
UPQRBQ==000000,,777777 ;RECEIVE BUFFER QUOTA
|
||
|
||
UPBPSQ:! BLOCK .QELEN ;PSI PENDING QUEUE LINKAGE
|
||
|
||
UPBXQH:! BLOCK .QHLEN ;TRANSMIT DONE QUEUE HEADER
|
||
UPBRQH:! BLOCK .QHLEN ;RECEIVE DONE QUEUE HEADER
|
||
|
||
UPBLEN:! ;LENGTH OF USER PROTOCOL BLOCK
|
||
|
||
$DEPHASE
|
||
SUBTTL ETHNT. UUO SUPPORT -- RESET UUO
|
||
|
||
|
||
;ROUTINE CALLED UPON A RESET UUO
|
||
;LINKAGE:
|
||
; PUSHJ P,ENTRST
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
ENTRST::PUSHJ P,FNDPDS## ;SET UP JOB'S PDB
|
||
SKIPN .PDEJB##(W) ;JOB HAVE AN ETHERNET JOB BLOCK?
|
||
POPJ P, ;NO, RETURN NOW
|
||
SE1ENT ;RUN IN SECTION 1
|
||
PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
PUSHJ P,SAVJW## ;SAVE J AND W
|
||
MOVE J,.PDEJB##(W) ;GET ADDRESS OF ETHERNET JOB BLOCK
|
||
XMOVEI U,EJBUNB(J) ;GET ADDRESS OF UN BLOCK
|
||
MOVE P1,EJBUPQ(J) ;GET USER PORTAL QUOTA
|
||
MOVE P2,EJBUPT(J) ;AND ADDRESS OF USER PORTAL TABLE
|
||
ENTRS1: JUMPE P1,ENTRS3 ;EXIT LOOP AT END OF TABLE
|
||
SKIPN F,(P2) ;GET ADDRESS OF NEXT USER PORTAL BLOCK
|
||
JRST ENTRS2 ;NONE, CONTINUE WITH NEXT TABLE ENTRY
|
||
PUSHJ P,ENTCLS ;CLOSE THIS PORTAL
|
||
JFCL ;ERROR, NOT MUCH CAN DO ABOUT IT
|
||
ENTRS2: XMOVEI P2,1(P2) ;INCREMENT USER PORTAL TABLE ADDRESS
|
||
SOJA P1,ENTRS1 ;LOOP BACK FOR ENTIRE TABLE
|
||
ENTRS3: PJRST KILEJB ;RELEASE ETHERNET JOB BLOCK AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- PSI INTERRUPTS
|
||
|
||
|
||
;ROUTINE CALLED UPON ETHERNET PSI INTERRUPT TO RETURN PORTAL STATUS WORD
|
||
;LINKAGE:
|
||
; J/ JOB NUMBER
|
||
; PUSHJ P,ENTPSI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS WITH:
|
||
; T2/ PORTAL STATUS WORD
|
||
|
||
ENTPSI::SE1ENT ;RUN IN SECTION 1
|
||
PUSHJ P,SAVJW## ;SAVE J AND W
|
||
PUSHJ P,FNDPDB## ;GET ADDRESS OF JOB'S PDB
|
||
JRST ENTPS2 ;NONE, RETURN ZERO
|
||
SKIPN J,.PDEJB##(W) ;GET ADDRESS OF ETHERNET JOB BLOCK
|
||
JRST ENTPS2 ;NONE, RETURN ZERO
|
||
XMOVEI T1,EJBPSQ(J) ;GET ADDRESS OF PSI QUEUE HEADER
|
||
PUSHJ P,REMQUE ;REMOVE USER PORTAL BLOCK FROM PSI QUEUE
|
||
JRST ENTPS2 ;NONE, RETURN ZERO
|
||
XMOVEI F,-UPBPSQ(T2) ;...
|
||
XMOVEI T1,EJBPSQ(J) ;GET ADDRESS OF PSI QUEUE HEADER
|
||
PUSHJ P,CHKQUE ;IS QUEUE EMPTY?
|
||
JRST ENTPS1 ;YES, DON'T SIGNAL ANOTHER PSI
|
||
PUSH P,J ;SAVE J
|
||
MOVE J,EJBJCH(J) ;GET JCH OF JOB BLOCK OWNER
|
||
SIGNAL C$ETH ;SIGNAL ETHERNET EVENT
|
||
JFCL ;...
|
||
POP P,J ;RESTORE J
|
||
ENTPS1: SKIPA T2,UPBPSW(F) ;GET PORTAL STATUS WORD
|
||
ENTPS2: SETZ T2, ;GET STATUS WORD OF ZERO
|
||
POPJ P, ;RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- ETHNT. UUO DISPATCH
|
||
|
||
|
||
;UUO FOR USER ACCESS TO ETHERNET
|
||
;LINKAGE:
|
||
; XMOVEI AC,ADDR
|
||
; ETHNT. AC,
|
||
; ERROR RETURN, CODE IN AC
|
||
; NORMAL RETURN
|
||
;
|
||
;ADDR: LENGTH,,FUNCTION CODE
|
||
; ARGUMENTS
|
||
|
||
ERCODX ETEPRV,ETPRV% ;INSUFFICIENT PRIVILEGES
|
||
ERCODX ETEADC,ETADC% ;ADDRESS CHECK
|
||
ERCODX ETEIAL,ETIAL% ;ILLEGAL ARGUMENT LIST LENGTH
|
||
ERCODX ETEILF,ETILF% ;ILLEGAL FUNCTION
|
||
ERCODX ETEUEE,ETUEE% ;UNEXPECTED ETHERNET ERROR
|
||
ERCODX ETERES,ETRES% ;INSUFFICIENT RESOURCES
|
||
ERCODX ETEIPI,ETIPI% ;INVALID PORTAL ID
|
||
ERCODX ETEICI,ETICI% ;INVALID CHANNEL ID
|
||
ERCODX ETEIPT,ETIPT% ;INVALID PROTOCOL TYPE
|
||
ERCODX ETEPIU,ETPIU% ;PROTOCOL TYPE IN USE
|
||
ERCODX ETEPRA,ETPRA% ;PROMISCUOUS RECEIVER ACTIVE
|
||
ERCODX ETEBAC,ETBAC% ;BUFFER ADDRESS CHECK
|
||
ERCODX ETEIBS,ETIBS% ;ILLEGAL BUFFER SIZE
|
||
ERCODX ETEIBP,ETIBP% ;ILLEGAL BYTE POINTER
|
||
ERCODX ETEIEA,ETIEA% ;ILLEGAL ETHERNET ADDRESS
|
||
ERCODX ETEPQE,ETPQE% ;PORTAL QUOTA EXCEEDED
|
||
ERCODX ETEBQE,ETBQE% ;BUFFER QUOTA EXCEEDED
|
||
|
||
UETHNT::PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
PUSHJ P,SSPCS## ;SAVE CURRENT PCS
|
||
PUSHJ P,SXPCS## ;SET UP PCS FOR USER ARGUMENT
|
||
PJRST ETEADC ;ADDRESS CHECK
|
||
MOVE M,T1 ;SET UP FOR GETEWD
|
||
EXCTUX <MOVE T1,.ETFCN(M)> ;GET FUNCTION CODE WORD
|
||
ERJMP ETEADC ;HANDLE POSSIBLE ADDRESS CHECK
|
||
MOVE P4,T1 ;SAVE FUNCTION CODE WORD
|
||
HRRE P2,P4 ;ISOLATE ARGUMENT BLOCK LENGTH
|
||
JUMPLE P2,ETEIAL ;VALIDITY CHECK ARGUMENT BLOCK LENGTH
|
||
LDB P3,[POINTR (P4,ET.FFN)] ;GET FUNCTION CODE
|
||
SKIPLE P3 ;RANGE CHECK FUNCTION CODE
|
||
CAILE P3,ENTMAX ;...
|
||
PJRST ETEILF ;ILLEGAL FUNCTION CODE
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
LDB T1,[POINTR (ENTDSF(P3),DF.ABL)] ;GET MINIMUM BLOCK LENGTH
|
||
CAMLE T1,P2 ;USER'S ARGUMENT BLOCK LARGE ENOUGH?
|
||
PJRST ETEIAL ;NO, ILLEGAL ARGUMENT LIST LENGTH
|
||
MOVE T1,M ;GET ARGUMENT BLOCK ADDRESS
|
||
MOVE T2,P2 ;AND USER SPECIFIED LENGTH
|
||
PUSHJ P,ARNGE## ;ADDRESS CHECK THE ARGUMENT BLOCK
|
||
PJRST ETEADC ;ADDRESS CHECK
|
||
JFCL ;ADDRESS ILLEGAL FOR I/O
|
||
SKIPE J,.PDEJB##(W) ;JOB ALREADY HAVE AN ETHERNET JOB BLOCK?
|
||
JRST ETHNT1 ;YES, CONTINUE
|
||
PUSHJ P,CREEJB ;CREATE AN ETHERNET JOB BLOCK
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
ETHNT1: XMOVEI U,EJBUNB(J) ;GET ADDRESS OF UN BLOCK
|
||
MOVE F,EJBINF(J) ;GET ADDRESS OF INFORMATION USER PORTAL
|
||
MOVX T1,DF.PID ;NEED TO SPECIFY A USER PORTAL ID?
|
||
TDNN T1,ENTDSF(P3) ;...
|
||
JRST ETHNT2 ;NO, CONTINUE
|
||
EXCTUX <MOVE T1,.ETPSW(M)> ;GET PORTAL STATUS WORD
|
||
ANDX T1,ET.PID ;MASK TO PORTAL ID
|
||
PUSHJ P,FNDUPB ;FIND USER PORTAL BLOCK
|
||
PJRST ETEIPI ;ERROR, INVALID PORTAL ID
|
||
ETHNT2: MOVX T1,DF.AUB ;NEED TO ADDRESS CHECK USER BUFFER?
|
||
TDNN T1,ENTDSF(P3) ;...
|
||
JRST ETHNT3 ;NO, JUST DISPATCH
|
||
EXCTUX <DMOVE P1,.ETBFL(M)> ;GET SIZE AND ADDRESS OF USER BUFFER
|
||
DMOVE T1,P1 ;GET SIZE AND ADDRESS OF USER BUFFER
|
||
EXCH T1,T2 ;SET UP TO ADDRESS CHECK USER BUFFER
|
||
PUSHJ P,ARNGE## ;ADDRESS CHECK USER BUFFER
|
||
PJRST ETEBAC ;BUFFER ADDRESS CHECK
|
||
PJRST ETEBAC ;ADDRESS ILLEGAL FOR I/O
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
ETHNT3: MOVE T1,ENTDSP(P3) ;GET ADDRESS OF FUNCTION SPECIFIC ROUTINE
|
||
PUSHJ P,(T1) ;DISPATCH TO FUNCTION SPECIFIC ROUTINE
|
||
POPJ P, ;ERROR, RETURN, ERROR CODE ALREADY STORED
|
||
MOVX T1,DF.UPS ;NEED TO RETURN UPDATED PORTAL STATUS?
|
||
TDNN T1,ENTDSF(P3) ;...
|
||
PJRST CPOPJ1## ;NO, RETURN
|
||
PUSHJ P,UPDPSW ;UPDATE CURRENT PORTAL STATUS
|
||
MOVE T1,UPBPSW(F) ;GET UPDATED PORTAL STATUS
|
||
EXCTXU <MOVEM T1,.ETPSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- ETHNT. UUO DISPATCH TABLES
|
||
|
||
|
||
;ETHNT. UUO DISPATCH TABLE
|
||
|
||
DEFINE FNC,<
|
||
|
||
XALL ;;LIST GENERATED TABLE
|
||
|
||
DISP 0, 0, 0, ETEILF ;;(0) ILLEGAL, PLACE HOLDER
|
||
DISP DF.UPS, .ETOPN, 4, ENTOPN ;;(1) OPEN PORTAL
|
||
DISP DF.PID, .ETCLS, 2, ENTCLS ;;(2) CLOSE PORTAL
|
||
DISP DF.PID!DF.UPS, .ETQRB, 3, ENTQRB ;;(3) QUEUE RECEIVE DATAGRAM BUFFER
|
||
DISP DF.PID!DF.UPS, .ETRRQ, 3, ENTRRQ ;;(4) READ RECEIVE QUEUE
|
||
DISP DF.PID!DF.UPS, .ETQXB, 3, ENTQXB ;;(5) QUEUE TRANSMIT DATAGRAM BUFFER
|
||
DISP DF.PID!DF.UPS, .ETRXQ, 3, ENTRXQ ;;(6) READ TRANSMIT QUEUE
|
||
DISP DF.PID!DF.UPS, .ETEMA, 4, ENTEMA ;;(7) ENABLE MULTI-CAST ADDRESS
|
||
DISP DF.PID!DF.UPS, .ETDMA, 4, ENTDMA ;;(10) DISABLE MULTI-CAST ADDRESS
|
||
|
||
DISP DF.AUB, .ETRCL, 4, ENTRCL ;;(11) READ CHANNEL LIST
|
||
DISP DF.AUB, .ETRCI, 4, ENTRCI ;;(12) READ CHANNEL INFORMATION
|
||
DISP DF.AUB, .ETRCC, 4, ENTRCC ;;(13) READ CHANNEL COUNTERS
|
||
DISP 0, .ETSCA, 4, ENTSCA ;;(14) SET CHANNEL ADDRESS
|
||
|
||
DISP DF.AUB, .ETRPL, 4, ENTRPL ;;(15) READ PORTAL LIST
|
||
DISP DF.AUB, .ETRPI, 4, ENTRPI ;;(16) READ PORTAL INFORMATION
|
||
DISP DF.AUB, .ETRPC, 4, ENTRPC ;;(17) READ PORTAL COUNTERS
|
||
|
||
DISP DF.AUB, .ETRKL, 4, ENTRKL ;;(20) READ KONTROLLER LIST
|
||
DISP DF.AUB, .ETRKI, 4, ENTRKI ;;(21) READ KONTROLLER INFORMATION
|
||
DISP DF.AUB, .ETRKC, 4, ENTRKC ;;(22) READ KONTROLLER COUNTERS
|
||
|
||
SALL ;;TURN LISTING BACK OFF
|
||
|
||
>; END DEFINE FNC
|
||
;GENERATE FUNCTION FLAGS TABLE
|
||
|
||
DF.PID==400000,,000000 ;PORTAL ID REQUIRED
|
||
DF.AUB==200000,,000000 ;ADDRESS CHECK USER BUFFER
|
||
DF.UPS==100000,,000000 ;UPDATE USER PORTAL STATUS WORD
|
||
DF.ABL==000000,,000777 ;MINIMUM ARGUMENT BLOCK LENGTH
|
||
|
||
DEFINE DISP(FLAG,CODE,ABLN,ADDR),<
|
||
EXP FLAG!ABLN ;(CODE) ADDR
|
||
>; END DEFINE DISP
|
||
|
||
ENTDSF: FNC ;GENERATE FUNCTION FLAGS TABLE
|
||
;GENERATE FUNCTION DISPATCH TABLE
|
||
|
||
DEFINE DISP(FLAG,CODE,ABLN,ADDR),<
|
||
IF1,<IFN <CODE-<.-ENTDSP>>,<PRINTX ?Table ENTDSP entry CODE is out of order>>
|
||
IFIW ADDR ;(CODE) ADDR
|
||
>; END DEFINE DISP
|
||
|
||
ENTDSP: FNC ;GENERATE FUNCTION DISPATCH TABLE
|
||
ENTMAX==.-ENTDSP-1 ;MAXIMUM ETHNT. UUO FUNCTION CODE
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- OPEN USER PORTAL
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION OPEN USER PORTAL
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTOPN
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTOPN: PUSHJ P,ENTPRV ;JOB HAVE SUFFICIENT PRIVILEGES?
|
||
PJRST ETEPRV ;NO, GIVE ERROR RETURN
|
||
PUSHJ P,CREUPB ;CREATE A NEW USER PORTAL BLOCK
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
EXCTUX <MOVE T1,.ETCIW(M)> ;GET CHANNEL IDENTIFICATION WORD
|
||
ANDX T1,ET.CID ;MASK TO CHANNEL ID
|
||
DPB T1,UPPCID ;STORE IN USER PORTAL BLOCK
|
||
EXCTUX <MOVE T1,.ETPIW(M)> ;GET PROTOCOL IDENTIFICATION WORD
|
||
MOVEM T1,UPBPIW(F) ;STORE IN USER PORTAL BLOCK
|
||
LDB T1,UPPCID ;GET CHANNEL ID
|
||
STOR T1,UNCHN,(U) ;STORE IN UN BLOCK
|
||
LDB T1,UPPPTY ;GET PROTOCOL TYPE
|
||
STOR T1,UNPRO,(U) ;STORE IN UN BLOCK
|
||
LDB T1,UPPPAD ;GET PADDING FLAG
|
||
STOR T1,UNPAD,(U) ;STORE IN UN BLOCK
|
||
MOVE T1,EJBJCH(J) ;GET JCH OF PORTAL OWNER
|
||
STOR T1,UNJCH,(U) ;SAVE IN UN BLOCK
|
||
STOR F,UNUID,(U) ;SAVE CALLBACK ID IN UN BLOCK
|
||
XMOVEI T1,ENCINT ;GET CALLBACK ADDRESS
|
||
STOR T1,UNCBA,(U) ;SAVE IN UN BLOCK
|
||
MOVEI T1,NU.OPN ;GET ETHERNET OPEN PORTAL FUNCTION CODE
|
||
PUSHJ P,CALETH ;CALL ETHSER TO OPEN PORTAL
|
||
JRST ENEOPN ;ERROR, GO FREE UP PORTAL AND RETURN
|
||
LOAD T1,UNPID,(U) ;GET PORTAL ID ASSIGNED BY ETHSER
|
||
DPB T1,UPPPID ;SAVE IN PORTAL STATUS WORD
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
;HERE ON AN ERROR RETURN FROM OPEN PORTAL FUNCTION
|
||
|
||
ENEOPN: PUSH P,T1 ;SAVE ETHSER ERROR CODE
|
||
PUSHJ P,KILUPB ;DELETE THIS USER PORTAL BLOCK
|
||
POP P,T1 ;RESTORE ETHSER ERROR CODE
|
||
PJRST ETEETH ;CONVERT ERROR CODE AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- CLOSE USER PORTAL
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION CLOSE USER PORTAL
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTCLS
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTCLS: MOVEI T1,NU.CLO!NU.WAI ;GET ETHERNET CLOSE PORTAL FUNCTION CODE
|
||
PUSHJ P,CALETH ;CALL ETHSER TO CLOSE PORTAL
|
||
JFCL ;...
|
||
ENTCL1: XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE QUEUE HEADER
|
||
PUSHJ P,REMQUE ;DEQUEUE NEXT MONTITOR BUFFER DESCRIPTOR
|
||
JRST ENTCL2 ;NONE LEFT, GO EMPTY TRANSMIT QUEUE
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER AND DESCRIPTOR
|
||
JRST ENTCL1 ;LOOP BACK FOR ENTIRE RECEIVE QUEUE
|
||
ENTCL2: XMOVEI T1,UPBXQH(F) ;GET ADDRESS OF TRANSMIT QUEUE HEADER
|
||
PUSHJ P,REMQUE ;DEQUEUE NEXT MONTITOR BUFFER DESCRIPTOR
|
||
JRST ENTCL3 ;NONE LEFT, GO RELEASE USER PORTAL BLOCK
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER AND DESCRIPTOR
|
||
JRST ENTCL2 ;LOOP BACK FOR ENTIRE TRANSMIT QUEUE
|
||
ENTCL3: PUSHJ P,KILUPB ;DELETE USER PORTAL BLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- QUEUE RECEIVE DATAGRAM BUFFER
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION QUEUE RECEIVE DATAGRAM BUFFER
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTQRB
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTQRB: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
EXCTUX <SKIPA P2,.ETUBL(M)> ;GET FIRST USER BUFFER DESCRIPTOR
|
||
ENTQR1: EXCTUX <MOVE P2,.UBNXT(P2)> ;GET NEXT USER BUFFER DESCRIPTOR
|
||
EXCTXU <MOVEM P2,.ETUBL(M)> ;SAVE CURRENT USER BUFFER DESCRIPTOR
|
||
PJUMPE P2,CPOPJ1## ;RETURN SUCCESS AT END OF LIST
|
||
LDB T1,UPPRBQ ;GET RECEIVE DATAGRAM BUFFER QUOTA
|
||
CAMG T1,UPBRBC(F) ;PORTAL WITHIN ITS QUOTA?
|
||
PJRST ETEBQE ;NO, BUFFER QUOTA EXCEEDED
|
||
MOVE T1,P2 ;GET ADDRESS OF USER BUFFER DESCRIPTOR
|
||
PUSHJ P,GETMBD ;GET A MONITOR BUFFER AND DESCRIPTOR
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
MOVE P1,T2 ;SAVE ADDRESS IN P1
|
||
;$ SETZ T1, ;CLEAR BYTE COUNT FOR MSD STYLE BUFFER
|
||
;$ STOR T1,UNBSZ,(U) ;...
|
||
;$ XMOVEI T1,.MBMSD(P1) ;GET ADDRESS OF MONITOR BUFFER'S MSD
|
||
;$ STOR T1,UNBFA,(U) ;SAVE IN UN BLOCK
|
||
MOVE T1,.MBUBD+.UBBSZ(P1) ;$ GET USER DATAGRAM BYTE COUNT
|
||
STOR T1,UNBSZ,(U) ;$ ...
|
||
MOVE T1,MD.AUX+.MBMSD(P1) ;$ GET TWO WORD BYTE POINTER TO BUFFER
|
||
MOVE T2,MD.ALA+.MBMSD(P1) ;$ ...
|
||
DMOVEM T1,UN.BFA(U) ;$ SAVE IN UN BLOCK
|
||
STOR P1,UNRID,(U) ;SAVE MONITOR BUFFER DESCRIPTOR IN UN BLOCK
|
||
MOVEI T1,NU.RCV ;ETHERNET QUEUE RECEIVE DATAGRAM FUNCTION
|
||
PUSHJ P,CALETH ;CALL ETHSER TO QUEUE RECEIVE BUFFER
|
||
JRST ENEQRB ;ERROR, ERROR CODE IN T1
|
||
AOS UPBRBC(F) ;INCREMENT RECEIVE DATAGRAM BUFFER COUNT
|
||
JRST ENTQR1 ;LOOP BACK TO PROCESS ENTIRE BUFFER LIST
|
||
|
||
;HERE ON AN ERROR RETURN FROM QUEUE RECEIVE DATAGRAM FUNCTION
|
||
|
||
ENEQRB: PUSH P,T1 ;SAVE ETHSER ERROR CODE
|
||
MOVE T2,P1 ;GET ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER AND DESCRIPTOR
|
||
POP P,T1 ;RESTORE ETHSER ERROR CODE
|
||
PJRST ETEETH ;CONVERT ERROR CODE AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ RECEIVE DATAGRAM QUEUE
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ RECEIVE DATAGRAM QUEUE
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRRQ
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRRQ: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
EXCTUX <SKIPA P2,.ETUBL(M)> ;GET FIRST USER BUFFER DESCRIPTOR
|
||
ENTRR1: EXCTUX <MOVE P2,.UBNXT(P2)> ;GET NEXT USER BUFFER DESCRIPTOR
|
||
EXCTXU <MOVEM P2,.ETUBL(M)> ;SAVE CURRENT USER BUFFER DESCRIPTOR
|
||
PJUMPE P2,CPOPJ1## ;RETURN SUCCESS AT END OF LIST
|
||
MOVE T1,P2 ;GET ADDRESS OF USER BUFFER DESCRIPTOR
|
||
MOVEI T2,.UBLEN ;AND LENGTH OF DESCRIPTOR
|
||
PUSHJ P,ARNGE## ;ADDRESS CHECK USER BUFFER DESCRIPTOR
|
||
PJRST ETEBAC ;BUFFER ADDRESS CHECK
|
||
JFCL ;ADDRESS ILLEGAL FOR I/O
|
||
XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE QUEUE
|
||
PUSHJ P,CHKQUE ;CHECK RECEIVE DATAGRAM QUEUE
|
||
PJRST CPOPJ1## ;EMPTY, RETURN
|
||
MOVE P1,T2 ;SAVE ADDRESS OF FIRST ENTRY IN P1
|
||
MOVEI T1,.UBLEN-1 ;GET LENGTH OF SAVED USER BUFFER DESCRIPTOR
|
||
XMOVEI T2,.MBUBD+1(P1) ;GET ADDRESS OF SAVED USER BUFFER DESCRIPTOR
|
||
MOVE T3,P2 ;AND ADDRESS OF CURRENT USER BUFFER DESCIPTOR
|
||
AOJ T3, ;...
|
||
XBLTXU <T1> ;COPY SAVED DESCRIPTOR TO USER DESCRIPTOR
|
||
MOVE T1,.MBUBA(P1) ;GET USER DATAGRAM BUFFER ADDRESS
|
||
MOVE T2,.MBDBS(P1) ;GET LENGTH OF DATAGRAM BUFFER
|
||
PUSHJ P,ARNGE## ;ADDRESS CHECK USER DATAGRAM BUFFER
|
||
PJRST ENERRQ ;BUFFER ADDRESS CHECK
|
||
PJRST ENERRQ ;BUFFER ADDRESS CHECK
|
||
MOVE T1,.MBDBS(P1) ;GET SIZE OF BUFFER IN WORDS
|
||
MOVE T2,.MBMBA(P1) ;GET MONITOR BUFFER ADDRESS
|
||
MOVE T3,.MBUBA(P1) ;GET ADDRESS OF USER DATAGRAM BUFFER
|
||
XBLTXU <T1> ;COPY MONITOR BUFFER INTO USER DATAGRAM
|
||
XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE QUEUE
|
||
PUSHJ P,REMQUE ;REMOVE ENTRY FROM QUEUE
|
||
JFCL ;CAN'T HAPPEN
|
||
SOS UPBRBC(F) ;DECREMENT RECEIVE DATAGRAM BUFFER COUNT
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER AND DESCRIPTOR
|
||
JRST ENTRR1 ;LOOP BACK TO PROCESS ENTIRE BUFFER LIST
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
;HERE ON A BUFFER ADDRESS CHECK
|
||
|
||
ENERRQ: XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE QUEUE
|
||
PUSHJ P,REMQUE ;REMOVE ENTRY FROM QUEUE
|
||
JFCL ;CAN'T HAPPEN
|
||
SOS UPBRBC(F) ;DECREMENT RECEIVE DATAGRAM BUFFER COUNT
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER AND DESCRIPTOR
|
||
PJRST ETEBAC ;RETURN BUFFER ADDRESS CHECK ERROR
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- QUEUE TRANSMIT DATAGRAM BUFFER
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION QUEUE TRANSMIT DATAGRAM BUFFER
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTQXB
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTQXB: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
EXCTUX <SKIPA P2,.ETUBL(M)> ;GET FIRST USER BUFFER DESCRIPTOR
|
||
ENTQX1: EXCTUX <MOVE P2,.UBNXT(P2)> ;GET NEXT USER BUFFER DESCRIPTOR
|
||
EXCTXU <MOVEM P2,.ETUBL(M)> ;SAVE CURRENT USER BUFFER DESCRIPTOR
|
||
PJUMPE P2,CPOPJ1## ;RETURN SUCCESS AT END OF LIST
|
||
LDB T1,UPPXBQ ;GET TRANSMIT DATAGRAM BUFFER QUOTA
|
||
CAMG T1,UPBXBC(F) ;PORTAL WITHIN ITS QUOTA?
|
||
PJRST ETEBQE ;NO, BUFFER QUOTA EXCEEDED
|
||
MOVE T1,P2 ;GET ADDRESS OF USER BUFFER DESCRIPTOR
|
||
PUSHJ P,GETMBD ;GET A MONITOR BUFFER AND DESCRIPTOR
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
MOVE P1,T2 ;SAVE ADDRESS IN P1
|
||
MOVE T1,.MBDBS(P1) ;GET SIZE OF BUFFER IN WORDS
|
||
MOVE T2,.MBUBA(P1) ;GET ADDRESS OF USER DATAGRAM BUFFER
|
||
MOVE T3,.MBMBA(P1) ;GET MONITOR BUFFER ADDRESS
|
||
XBLTUX <T1> ;COPY USER DATAGRAM INTO MONITOR BUFFER
|
||
SETZ T1, ;CLEAR BYTE COUNT FOR MSD STYLE BUFFER
|
||
STOR T1,UNBSZ,(U) ;...
|
||
XMOVEI T1,.MBMSD(P1) ;GET ADDRESS OF MONITOR BUFFER'S MSD
|
||
STOR T1,UNBFA,(U) ;SAVE IN UN BLOCK
|
||
DMOVE T1,.MBUBD+.UBDEA(P1) ;GET DESTINATION ETHERNET ADDRESS
|
||
DMOVEM T1,UN.DAD(U) ;SAVE IN UN BLOCK
|
||
STOR P1,UNRID,(U) ;SAVE MONITOR BUFFER DESCRIPTOR IN UN BLOCK
|
||
MOVEI T1,NU.XMT ;ETHERNET QUEUE TRANSMIT DATAGRAM FUNCTION
|
||
PUSHJ P,CALETH ;CALL ETHSER TO QUEUE RECEIVE BUFFER
|
||
JRST ENEQXB ;ERROR, ERROR CODE IN T1
|
||
AOS UPBXBC(F) ;INCREMENT TRANSMIT DATAGRAM BUFFER COUNT
|
||
JRST ENTQX1 ;LOOP BACK TO PROCESS ENTIRE BUFFER LIST
|
||
|
||
;HERE ON AN ERROR RETURN FROM QUEUE TRANSMIT DATAGRAM FUNCTION
|
||
|
||
ENEQXB: PUSH P,T1 ;SAVE ETHSER ERROR CODE
|
||
MOVE T2,P1 ;GET ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER DESCRIPTOR
|
||
POP P,T1 ;RESTORE ETHSER ERROR CODE
|
||
PJRST ETEETH ;CONVERT ERROR CODE AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ TRANSMIT DATAGRAM QUEUE
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ TRANSMIT DATAGRAM QUEUE
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRXQ
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRXQ: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
EXCTUX <SKIPA P2,.ETUBL(M)> ;GET FIRST USER BUFFER DESCRIPTOR
|
||
ENTRX1: EXCTUX <MOVE P2,.UBNXT(P2)> ;GET NEXT USER BUFFER DESCRIPTOR
|
||
EXCTXU <MOVEM P2,.ETUBL(M)> ;SAVE CURRENT USER BUFFER DESCRIPTOR
|
||
PJUMPE P2,CPOPJ1## ;RETURN SUCCESS AT END OF LIST
|
||
MOVE T1,P2 ;GET ADDRESS OF USER BUFFER DESCRIPTOR
|
||
MOVEI T2,.UBLEN ;AND LENGTH OF DESCRIPTOR
|
||
PUSHJ P,ARNGE## ;ADDRESS CHECK USER BUFFER DESCRIPTOR
|
||
PJRST ETEBAC ;BUFFER ADDRESS CHECK
|
||
JFCL ;ADDRESS ILLEGAL FOR I/O
|
||
XMOVEI T1,UPBXQH(F) ;GET ADDRESS OF TRANSMIT QUEUE
|
||
PUSHJ P,CHKQUE ;CHECK TRANSMIT DATAGRAM QUEUE
|
||
PJRST CPOPJ1## ;EMPTY, RETURN
|
||
MOVE P1,T2 ;SAVE ADDRESS OF FIRST ENTRY IN P1
|
||
MOVEI T1,.UBLEN-1 ;GET LENGTH OF SAVED USER BUFFER DESCRIPTOR
|
||
XMOVEI T2,.MBUBD+1(P1) ;GET ADDRESS OF SAVED USER BUFFER DESCRIPTOR
|
||
MOVE T3,P2 ;AND ADDRESS OF CURRENT USER BUFFER DESCIPTOR
|
||
AOJ T3, ;...
|
||
XBLTXU <T1> ;COPY SAVED DESCRIPTOR TO USER DESCRIPTOR
|
||
XMOVEI T1,UPBXQH(F) ;GET ADDRESS OF TRANSMIT QUEUE
|
||
PUSHJ P,REMQUE ;REMOVE ENTRY FROM QUEUE
|
||
JFCL ;CAN'T HAPPEN
|
||
SOS UPBXBC(F) ;DECREMENT TRANSMIT DATAGRAM BUFFER COUNT
|
||
PUSHJ P,GIVMBD ;FREE UP MONITOR BUFFER AND DESCRIPTOR
|
||
JRST ENTRX1 ;LOOP BACK TO PROCESS ENTIRE BUFFER LIST
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- ENABLE/DISABLE MULTI-CAST ADDRESS
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. MULTI-CAST ADDRESS FUNCTIONS
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTEMA/ENTDMA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTEMA: SKIPA T1,[NU.EMA] ;GET ENABLE MULTI-CAST FUNCTION CODE
|
||
ENTDMA: MOVEI T1,NU.DMA ;GET DISABLE MULTI-CAST FUNCTION CODE
|
||
EXCTUX <DMOVE T2,.ETMCA(M)> ;GET MULTI-CAST ADDRESS
|
||
DMOVEM T2,UN.DAD(U) ;STORE INTO UN BLOCK
|
||
PUSHJ P,CALETH ;CALL ETHSER
|
||
PJRST ETEETH ;GO CONVERT ERROR CODE AND RETURN
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ CHANNEL LIST
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ CHANNEL LIST
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRCL
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRCL: MOVEI T1,NU.RCL ;ETHERNET READ CHANNEL LIST FUNCTION
|
||
PJRST ENTRXL ;READ LIST INTO USER BUFFER AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ CHANNEL INFORMATION
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ CHANNEL INFORMATION
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRCI
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRCI: EXCTUX <MOVE T1,.ETCSW(M)> ;GET CHANNEL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RCI ;ETHERNET READ CHANNEL INFORMATION FUNCTION
|
||
PUSHJ P,ENTRXI ;READ DATA INTO USER BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
LOAD T1,UNSID,(U) ;GET UPDATED CHANNEL STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETCSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ CHANNEL COUNTERS
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ CHANNEL COUNTERS
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRCC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRCC: EXCTUX <MOVE T1,.ETCSW(M)> ;GET CHANNEL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RCC!NU.WAI ;ETHERNET READ CHANNEL COUNTERS FUNCTION
|
||
PUSHJ P,ENTRXC ;READ DATA INTO USER BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
LOAD T1,UNSID,(U) ;GET UPDATED CHANNEL STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETCSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- SET CHANNEL ADDRESS
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION SET CHANNEL ADDRESS
|
||
;LINKAGE:
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTSCA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTSCA: EXCTUX <MOVE T1,.ETCSW(M)> ;GET CHANNEL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
EXCTUX <DMOVE T2,.ETEAD(M)> ;GET ETHERNET ADDRESS
|
||
DMOVEM T2,UN.DAD(U) ;STORE INTO UN BLOCK
|
||
MOVEI T1,NU.SCA!NU.WAI ;GET SET CHANNEL ADDRESS FUNCTION CODE
|
||
PUSHJ P,CALETH ;CALL ETHSER TO SET CHANNEL ADDRESS AND RETURN
|
||
PJRST ETEETH ;ERROR, CONVERT ERROR CODE AND RETURN
|
||
LOAD T1,UNSID,(U) ;GET UPDATED CHANNEL STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETCSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ PORTAL LIST
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ PORTAL LIST
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRPL
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRPL: EXCTUX <MOVE T1,.ETCSW(M)> ;GET CHANNEL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RPL ;ETHERNET READ PORTAL LIST FUNCTION
|
||
PJRST ENTRXL ;READ LIST INTO USER BUFFER AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ PORTAL INFORMATION
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ PORTAL INFORMATION
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRPI
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRPI: EXCTUX <MOVE T1,.ETPSW(M)> ;GET PORTAL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RPI ;ETHERNET READ PORTAL INFORMATION FUNCTION
|
||
PUSHJ P,ENTRXI ;READ DATA INTO USER BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
LOAD T1,UNSID,(U) ;GET UPDATED PORTAL STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETPSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ PORTAL COUNTERS
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ PORTAL COUNTERS
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRPC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRPC: EXCTUX <MOVE T1,.ETPSW(M)> ;GET PORTAL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RPC!NU.WAI ;ETHERNET READ PORTAL COUNTERS FUNCTION
|
||
PUSHJ P,ENTRXC ;READ DATA INTO USER BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
LOAD T1,UNSID,(U) ;GET UPDATED PORTAL STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETPSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ KONTROLLER LIST
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ KONTROLLER LIST
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRKL
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRKL: EXCTUX <MOVE T1,.ETCSW(M)> ;GET CHANNEL STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RKL ;ETHERNET READ KONTROLLER LIST FUNCTION
|
||
PJRST ENTRXL ;READ LIST INTO USER BUFFER AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ KONTROLLER INFORMATION
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ KONTROLLER INFORMATION
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRKI
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRKI: EXCTUX <MOVE T1,.ETKSW(M)> ;GET KONTROLLER STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RKI ;ETHERNET READ KONTROLLER INFORMATION FUNCTION
|
||
PUSHJ P,ENTRXI ;READ DATA INTO USER BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
LOAD T1,UNSID,(U) ;GET UPDATED KONTROLLER STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETKSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTIONS -- READ KONTROLLER COUNTERS
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS ETHNT. FUNCTION READ KONTROLLER COUNTERS
|
||
;LINKAGE:
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRKC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ENTRKC: EXCTUX <MOVE T1,.ETKSW(M)> ;GET KONTROLLER STATUS WORD
|
||
STOR T1,UNSID,(U) ;STORE IN UN BLOCK
|
||
MOVEI T1,NU.RKC!NU.WAI ;ETHERNET READ KONTROLLER COUNTERS FUNCTION
|
||
PUSHJ P,ENTRXC ;READ DATA INTO USER BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE ALREADY STORED
|
||
LOAD T1,UNSID,(U) ;GET UPDATED KONTROLLER STATUS WORD
|
||
EXCTXU <MOVEM T1,.ETKSW(M)> ;STORE IN USER ARGUMENT BLOCK
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL ETHNT. UUO FUNCTION SUPPORT -- READ ETHERNET LIST
|
||
|
||
|
||
;ROUTINE CALLED TO READ ETHERNET LIST INTO USER BUFFER
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRXL
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; USER AC/ SIZE OF RETURNED DATA
|
||
|
||
ENTRXL: PJRST ENTRXD ;READ ETHERNET LIST
|
||
SUBTTL ETHNT. UUO FUNCTION SUPPORT -- READ ETHERNET INFORMATION
|
||
|
||
|
||
;ROUTINE CALLED TO READ ETHERNET INFORMATION INTO USER BUFFER
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRXI
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; USER AC/ SIZE OF RETURNED DATA
|
||
|
||
ENTRXI: PJRST ENTRXD ;READ ETHERNET INFORMATION
|
||
SUBTTL ETHNT. UUO FUNCTION SUPPORT -- READ ETHERNET COUNTERS
|
||
|
||
|
||
;ROUTINE CALLED TO READ ETHERNET COUNTERS INTO USER BUFFER
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRXC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; USER AC/ SIZE OF RETURNED DATA
|
||
|
||
ENTRXC: TXNN P4,ET.FZC ;IS THIS A READ/ZERO COUNTERS FUNCTION
|
||
TDZA T2,T2 ;NO, CLEAR ZERO COUNTERS FLAG AND SKIP
|
||
MOVEI T2,1 ;YES, SET ZERO COUNTERS FLAGS
|
||
STOR T2,UNZRO,(U) ;SET/CLEAR ZERO COUNTERS FLAG IN UN BLOCK
|
||
PJUMPE T2,ENTRXD ;CONTINUE IF JUST READ COUNTERS
|
||
PUSH P,T1 ;SAVE ETHERNET FUNCTION CODE
|
||
PUSHJ P,ENTPRV ;JOB HAVE SUFFICIENT PRIVILEGES?
|
||
JRST [POP P,(P) ;NO, CLEAR STACK
|
||
PJRST ETEPRV] ;AND GIVE ERROR RETURN
|
||
POP P,T1 ;RESTORE ETHERNET FUNCTION CODE
|
||
PJRST ENTRXD ;AND CONTINUE
|
||
SUBTTL ETHNT. UUO FUNCTION SUPPORT -- READ ETHERNET DATA
|
||
|
||
|
||
;ROUTINE CALLED TO READ ETHERNET DATA INTO USER BUFFER
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; P1/ SIZE OF USER BUFFER
|
||
; P2/ ADDRESS OF USER BUFFER
|
||
; P4/ FUNCTION CODE WORD
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; M/ ADDRESS OF ARGUMENT BLOCK
|
||
; PUSHJ P,ENTRXD
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; USER AC/ SIZE OF RETURNED DATA
|
||
|
||
ENTRXD: PUSH P,T1 ;SAVE ETHERNET FUNCTION CODE
|
||
MOVE T2,P1 ;GET SIZE OF USER BUFFER
|
||
PUSHJ P,GETEWZ## ;ALLOCATE ZEROED MONITOR CORE FOR BUFFER
|
||
JRST [POP P,(P) ;ERROR, CLEAR STACK
|
||
PJRST ETERES] ;AND RETURN INSUFFICIENT RESOURCES ERROR
|
||
STOR P1,UNBSZ,(U) ;STORE BUFFER SIZE IN UN BLOCK
|
||
STOR T1,UNBFA,(U) ;AND BUFFER ADDRESS IN UN BLOCK
|
||
STOR U,UNRID,(U) ;STORE ADDRESS OF UN BLOCK AS REQUEST ID
|
||
POP P,T1 ;GET BACK ETHERNET FUNCTION CODE
|
||
PUSHJ P,CALETH ;CALL ETHSER TO READ ETHERNET LIST
|
||
JRST ENERXD ;ERROR, GO FREE UP BUFFER AND RETURN
|
||
MOVE T1,P1 ;GET SIZE OF USER BUFFER
|
||
LOAD T2,UNBFA,(U) ;GET ADDRESS OF MONITOR BUFFER
|
||
MOVE T3,P2 ;AND ADDRESS OF USER BUFFER
|
||
XBLTXU <T1> ;COPY MONITOR BUFFER INTO USER BUFFER
|
||
LOAD T1,UNBSZ,(U) ;GET COUNT OF ENTRIES STORED
|
||
PUSHJ P,STOTAC## ;STORE IN USER AC
|
||
MOVE T1,P1 ;GET SIZE OF MONITOR BUFFER
|
||
LOAD T2,UNBFA,(U) ;AND ADDRESS OF MONITOR BUFFER
|
||
PUSHJ P,GIVEWS## ;RELEASE MONITOR BUFFER
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
;HERE ON AN ERROR RETURN FROM READ ETHERNET DATA FUNCTION
|
||
|
||
ENERXD: PUSH P,T1 ;SAVE ETHSER ERROR CODE
|
||
MOVE T1,P1 ;GET SIZE OF MONITOR BUUFER
|
||
LOAD T2,UNBFA,(U) ;AND ADDRESS OF MONITOR BUFFER
|
||
PUSHJ P,GIVEWS## ;RELEASE MONITOR BUFFER
|
||
POP P,T1 ;RESTORE ETHSER ERROR CODE
|
||
PJRST ETEETH ;CONVERT ERROR CODE AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTION SUPPORT -- ETHSER INTERFACE
|
||
|
||
|
||
;ROUTINE CALLED TO INTERFACE TO ETHSER
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,CALETH
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
CALETH: LDB T2,UPPPID ;GET PORTAL ID
|
||
STOR T2,UNPID,(U) ;STORE IN UN BLOCK
|
||
MOVE T2,U ;GET ADDRESS OF UN BLOCK
|
||
TXZN T1,NU.WAI ;WAIT FOR FUNCTION COMPLETION?
|
||
PJRST ETHSER## ;NO, DISPATCH TO ETHSER AND RETURN
|
||
MOVEM T1,UPBFWC(F) ;SAVE ETHERNET FUNCTION WAIT CODE
|
||
PUSHJ P,ETHSER## ;CALL ETHSER FOR FUNCTION
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
AOS (P) ;PRESET FOR SKIP RETURN
|
||
PJRST ENTSLP ;WAIT FOR FUNCTION COMPLETION AND RETURN
|
||
SUBTTL ETHNT. UUO FUNCTION SUPPORT -- ETHSER ERROR CODE CONVERSION
|
||
|
||
|
||
;ROUTINE CALLED TO CONVERT ETHSER ERROR CODE INTO ETHNT. ERROR CODE
|
||
;LINKAGE:
|
||
; T1/ ETHSER ERROR CODE (UNXXX%)
|
||
; PUSHJ P,ETEETH
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
|
||
ETEETH: MOVEI T3,ETETLN ;GET LENGTH OF ERROR TABLE
|
||
XMOVEI T4,ETETAB ;AND ADDRESS OF ERROR TABLE
|
||
ETEET1: HLRZ T2,(T4) ;GET NEXT ETHSER ERROR CODE FROM TABLE
|
||
CAMN T1,T2 ;MATCH TARGET ERROR CODE?
|
||
JRST ETEET2 ;YES, EXIT LOOP
|
||
XMOVEI T4,1(T4) ;INCREMENT ERROR TABLE ADDRESS
|
||
SOJG T3,ETEET1 ;LOOP BACK TO CHECK COMPLETE TABLE
|
||
STOPCD ETEUEE,DEBUG,ENTUEE ;++UNEXPECTED ETHSER ERROR CODE
|
||
ETEET2: HRRZ T1,(T4) ;PICK UP CORRECT ETHNT. ERROR CODE
|
||
PJRST STOTAC## ;STORE ERROR CODE IN USER AC AND RETURN
|
||
|
||
|
||
;TABLE OF ETHSER TO ETHNT ERROR CODE CORRESPONDENCE
|
||
|
||
ETETAB: UNRES%,,ETRES% ;NO RESOUCES
|
||
UNNSC%,,ETICI% ;NO SUCH CHANNEL
|
||
UNIVP%,,ETIPT% ;ILLEGAL PROTOCOL TYPE
|
||
UNPIU%,,ETPIU% ;PROTOCOL TYPE IN USE
|
||
UNPRA%,,ETPRA% ;PROMISCUOUS RECEIVER ACTIVE
|
||
UNNSP%,,ETIPI% ;NO SUCH PORTAL
|
||
UNIBS%,,ETIBS% ;ILLEGAL BUFFER SIZE
|
||
UNIBP%,,ETIBP% ;ILLEGAL BYTE POINTER
|
||
UNNRE%,,ETRES% ;NO ROOM FOR ENTRY
|
||
UNIMA%,,ETIEA% ;ILLEGAL MULTICAST ADDRESS
|
||
UNICA%,,ETIEA% ;ILLEGAL CHANNEL ADDRESS
|
||
UNPWS%,,ETPWS% ;PROTOCOL IN WRONG STATE
|
||
UNNSK%,,ETIKI% ;NO SUCH KONTROLLER
|
||
ETETLN==.-ETETAB ;LENGTH OF ERROR CODE TABLE
|
||
SUBTTL ETHNT. UUO COMPLETION INTERRUPT -- INTERRUPT DISPATCH
|
||
|
||
|
||
;ROUTINE CALLED BY ETHERNET SUPPORT ON COMPLETION OF A FUNCTION
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; T2/ ADDRESS OF UN BLOCK
|
||
; T3/ FUNCTION SPECIFIC DATA
|
||
; PUSHJ P,ENCINT
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
ENCINT::PUSHJ P,SAVJW## ;SAVE J AND W
|
||
PUSH P,F ;AND F
|
||
PUSH P,U ;AND U
|
||
MOVE U,T2 ;SAVE UN BLOCK ADDRESS IN U
|
||
LOAD F,UNUID,(U) ;GET ADDRESS OF USER PORTAL BLOCK
|
||
MOVE J,UPBEJB(F) ;GET ADDRESS OF ETHERNET JOB BLOCK
|
||
PUSH P,T1 ;SAVE ETHERNET FUNCTION CODE
|
||
PUSHJ P,ENTWAK ;WAKE UP ANY WAITING JOB
|
||
POP P,T1 ;RESTORE ETHERNET FUNCTION CODE
|
||
MOVE T1,ENCDSP(T1) ;GET ADDRESS OF FUNCTION SPECIFIC ROUTINE
|
||
PUSHJ P,(T1) ;DISPATCH
|
||
POP P,U ;AND U
|
||
POP P,F ;AND F
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL ETHNT. UUO COMPLETION INTERRUPT -- DISPATCH TABLE
|
||
|
||
|
||
;FUNCTION SPECIFIC COMPLETION ROUTINE DISPATCH TABLE
|
||
|
||
DEFINE FNC,<
|
||
|
||
XALL ;;LIST GENERATED TABLE
|
||
|
||
DISP 0,CPOPJ## ;;PLACE HOLDER
|
||
DISP NU.OPN, CPOPJ## ;;OPEN PORTAL
|
||
DISP NU.CLO, CPOPJ## ;;CLOSE PORTAL
|
||
DISP NU.RCV, ENCRDG ;;RECEIVE DATAGRAM
|
||
DISP NU.XMT, ENCXDG ;;TRANSMIT DATAGRAM
|
||
DISP NU.EMA, CPOPJ## ;;ENABLE MULTI-CAST
|
||
DISP NU.DMA, CPOPJ## ;;DISABLE MULTI-CAST
|
||
|
||
DISP NU.RCL, ENCRXD ;;READ CHANNEL LIST
|
||
DISP NU.RCI, ENCRXD ;;READ CHANNEL INFORMATION
|
||
DISP NU.RCC, ENCRXD ;;READ CHANNEL COUNTERS
|
||
DISP NU.SCA, CPOPJ## ;;SET CHANNEL ADDRESS
|
||
|
||
DISP NU.RPL, ENCRXD ;;READ PORTAL LIST
|
||
DISP NU.RPI, ENCRXD ;;READ PORTAL INFORMATION
|
||
DISP NU.RPC, ENCRXD ;;READ PORTAL COUNTERS
|
||
|
||
DISP NU.RKL, ENCRXD ;;READ KONTROLLER LIST
|
||
DISP NU.RKI, ENCRXD ;;READ KONTROLLER INFORMATION
|
||
DISP NU.RKC, ENCRXD ;;READ KONTROLLER COUNTERS
|
||
|
||
SALL ;;TURN LISTING BACK OFF
|
||
|
||
>; END DEFINE FNC
|
||
;GENERATE FUNCTION DISPATCH TABLE
|
||
|
||
DEFINE DISP(CODE,ADDR),<
|
||
IF1,<IFN <CODE-<.-ENCDSP>>,<PRINTX ?Table ENCDSP entry CODE is out of order>>
|
||
IFIW ADDR ;CODE
|
||
>; END DEFINE DISP
|
||
|
||
ENCDSP: FNC ;GENERATE FUNCTION DISPATCH TABLE
|
||
IF1,<IFN <NU.MAX-<.-ENCDSP-1>>,<PRINTX ?Table ENCDSP is missing entries>>
|
||
SUBTTL ETHNT. UUO COMPLETION INTERRUPT -- RECEIVE DATAGRAM
|
||
|
||
|
||
;ROUTINE CALLED BY ETHSER ON COMPLETION OF RECEIVE DATAGRAM FUNCTION
|
||
;LINKAGE:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,ENCRDG
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
ENCRDG: PUSHJ P,SAVE1## ;SAVE P1
|
||
LOAD P1,UNRID,(U) ;GET ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
SETZ T1, ;GET DEFAULT DATAGRAM STATUS
|
||
SKIPE T3 ;ANY ERRORS?
|
||
TXO T1,UB.ERR ;YES, SET ERROR FLAG
|
||
MOVEM T1,.MBUBD+.UBSTS(P1) ;SAVE IN USER BUFFER DESCRIPTOR BLOCK
|
||
LOAD T1,UNBSZ,(U) ;GET SIZE OF RECEIVED DATAGRAM
|
||
MOVEM T1,.MBUBD+.UBBSZ(P1) ;SAVE IN USER BUFFER DESCRIPTOR BLOCK
|
||
LOAD T1,UNPRO,(U) ;GET PROTOCOL TYPE
|
||
MOVEM T1,.MBUBD+.UBPTY(P1) ;SAVE IN USER BUFFER DESCRIPTOR BLOCK
|
||
DMOVE T1,UN.SAD(U) ;GET SOURCE ETHERNET ADDRESS
|
||
DMOVEM T1,.MBUBD+.UBSEA(P1) ;SAVE IN USER BUFFER DESCRIPTOR BLOCK
|
||
DMOVE T1,UN.DAD(U) ;GET DESTINATION ETHERNET ADDRESS
|
||
DMOVEM T1,.MBUBD+.UBDEA(P1) ;SAVE IN USER BUFFER DESCRIPTOR BLOCK
|
||
MOVE T1,MD.AUX+.MBMSD(P1) ;$ GET ORIGINAL BYTE POINTER
|
||
MOVE T2,MD.ALA+.MBMSD(P1) ;$ ...
|
||
ENCRD1: CAMLE T2,UN.BFA+1(U) ;$ GONE TOO FAR?
|
||
JRST ENCRD2 ;$ YES, EXIT LOOP AND GIVE UP
|
||
CAMN T2,UN.BFA+1(U) ;$ GONE FAR ENOUGH?
|
||
CAME T1,UN.BFA(U) ;$ ...
|
||
SKIPA ;$ NO, CONTINUE UPDATING BYTE POINTERS
|
||
JRST ENCRD2 ;$ YES, EXIT LOOP
|
||
IBP T1 ;$ UPDATE MONITOR BUFFER BYTE POINTER
|
||
IBP .MBUBD+.UBBFA(P1) ;$ AND USER BUFFER BYTE POINTER
|
||
JRST ENCRD1 ;$ LOOP BACK UNTIL ALIGNED THE SAME
|
||
ENCRD2: XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE DATAGRAM QUEUE
|
||
MOVE T2,P1 ;AND ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PUSHJ P,PUTQUE ;ADD MONITOR BUFFER DESCRIPTOR TO QUEUE
|
||
PJRST UPDPSW ;UPDATE PORTAL STATUS AND RETURN
|
||
SUBTTL ETHNT. UUO COMPLETION INTERRUPT -- TRANSMIT DATAGRAM
|
||
|
||
|
||
;ROUTINE CALLED BY ETHSER ON COMPLETION OF TRANSMIT DATAGRAM FUNCTION
|
||
;LINKAGE:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,ENCXDG
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
ENCXDG: PUSHJ P,SAVE1## ;SAVE P1
|
||
LOAD P1,UNRID,(U) ;GET ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
SETZ T1, ;GET DEFAULT DATAGRAM STATUS
|
||
SKIPE T3 ;ANY ERRORS?
|
||
TXO T1,UB.ERR ;YES, SET ERROR FLAG
|
||
XMOVEI T1,UPBXQH(F) ;GET ADDRESS OF TRANSMIT DATAGRAM QUEUE
|
||
MOVE T2,P1 ;AND ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PUSHJ P,PUTQUE ;ADD MONITOR BUFFER DESCRIPTOR TO QUEUE
|
||
PJRST UPDPSW ;UPDATE PORTAL STATUS AND RETURN
|
||
SUBTTL ETHNT. UUO COMPLETION INTERRUPT -- READ ETHERNET DATA
|
||
|
||
|
||
;ROUTINE CALLED BY ETHSER ON COMPLETION OF READ ETHERNET DATA FUNCTIONS
|
||
;LINKAGE:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,ENCRXD
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
ENCRXD: LOAD T2,UNRID,(U) ;GET ADDRESS OF ORIGINAL UN BLOCK
|
||
PJUMPE T2,ENCRCI ;PROCESS DIFFERENTLY IF UNSOLICITED CALLBACK
|
||
LOAD T1,UNBSZ,(U) ;GET UPDATED BUFFER SIZE
|
||
STOR T1,UNBSZ,(T2) ;STORE IN ORIGINAL UN BLOCK
|
||
POPJ P, ;AND RETURN
|
||
|
||
|
||
;HERE ON UNSOLICITED READ CHANNEL INFORMATION CALLBACK
|
||
|
||
ENCRCI: LOAD T1,UNRUN,(U) ;GET PORTAL RUN FLAG
|
||
DPB T1,[POINTR (UPBPSW(F),ET.PON)] ;STORE PORTAL ONLINE STATUS
|
||
PJRST UPDPSW ;UPDATE PORTAL STATUS AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- ETHERNET JOB BLOCK MANIPULATION
|
||
|
||
|
||
;ROUTINE CALLED TO CREATE AN ETHERNET JOB BLOCK
|
||
;LINKAGE:
|
||
; W/ ADDRESS OF JOB'S PDB
|
||
; PUSHJ P,CREEJB
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; F/ ADDRESS OF INFORMATION PORTAL BLOCK
|
||
|
||
CREEJB: MOVEI T2,EJBLEN ;GET LENGTH OF ETHERNET JOB BLOCK
|
||
PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR JOB BLOCK
|
||
PJRST ETERES ;ERROR, INSUFFICIENT RESOURCES
|
||
MOVE J,T1 ;SAVE ADDRESS OF JOB BLOCK IN J
|
||
MOVE T1,.CPJCH## ;GET JCH OF JOB BLOCK OWNER
|
||
MOVEM T1,EJBJCH(J) ;STORE IN ETHERNET JOB BLOCK
|
||
MOVEM J,.PDEJB##(W) ;SET UP POINTER TO JOB'S EJB
|
||
XMOVEI T1,EJBPSQ(J) ;GET ADDRESS OF PSI QUEUE HEADER
|
||
PUSHJ P,INIQUE ;INITIALIZE QUEUE
|
||
MOVEI T2,UPBLEN ;GET LENGTH OF USER PORTAL BLOCK
|
||
PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR INFORMATION PORTAL
|
||
JRST CREEJ1 ;ERROR, INSUFFICIENT RESOURCES
|
||
MOVEM T1,EJBINF(J) ;SAVE ADDRESS OF INFORMATION PORTAL BLOCK
|
||
MOVEM J,UPBEJB(T1) ;SAVE ADDRESS OF ETHERNET JOB BLOCK
|
||
XMOVEI U,EJBUNB(J) ;GET ADDRESS OF UN BLOCK
|
||
PUSHJ P,OPNINF ;OPEN THE INFORMATION PORTAL
|
||
PJRST KILEJB ;ERROR, ERROR CODE ALREADY STORED
|
||
MOVE T1,ENTUPQ ;GET DEFAULT USER PORTAL QUOTA
|
||
MOVEM T1,EJBUPQ(J) ;SET UP IN ETHERNET JOB BLOCK
|
||
MOVE T1,ENTBQT ;GET DEFAULT BUFFER QUOTAS
|
||
MOVEM T1,EJBBQT(J) ;SET UP IN ETHERNET JOB BLOCK
|
||
MOVE T2,EJBUPQ(J) ;GET USER PORTAL QUOTA
|
||
JUMPE T2,CPOPJ1## ;ALL DONE IF ZERO PORTAL QUOTA
|
||
PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR PORTAL TABLE
|
||
JRST CREEJ1 ;ERROR, INSUFFICIENT RESOURCES
|
||
MOVEM T1,EJBUPT(J) ;SAVE ADDRESS OF USER PORTAL TABLE
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
;HERE ON RESOURCE ERROR ALLOCATING INFORMATION PORTAL OR USER PORTAL TABLE
|
||
|
||
CREEJ1: PUSHJ P,KILEJB ;RELEASE ETHERNET JOB BLOCK
|
||
PJRST ETERES ;AND RETURN INSUFFICIENT RESOURCES ERROR
|
||
;ROUTINE CALLED TO RELEASE AN ETHERNET JOB BLOCK
|
||
;LINKAGE:
|
||
; W/ ADDRESS OF JOB'S PDB
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,KILEJB
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KILEJB: SKIPN J,.PDEJB##(W) ;GET POINTER TO JOB'S EJB
|
||
POPJ P, ;NONE, RETURN
|
||
SETZM .PDEJB##(W) ;ZERO POINTER TO ETHERNET JOB BLOCK
|
||
SKIPE EJBUPC(J) ;MAKE SURE USER PORTAL COUNT ZERO
|
||
STOPCD .+1,DEBUG,ENTPCN ;++USER PORTAL COUNT NON-ZERO
|
||
PUSHJ P,CLSINF ;CLOSE THE INFORMATION PORTAL
|
||
MOVEI T1,UPBLEN ;GET LENGTH OF USER PORTAL BLOCK
|
||
SKIPE T2,EJBINF(J) ;AND ADDRESS OF INFORMATION PORTAL BLOCK
|
||
PUSHJ P,GIVEWS## ;RELEASE INFORMATION PORTAL BLOCK
|
||
MOVE T2,EJBUPT(J) ;GET ADDRESS OF USER PORTAL TABLE
|
||
SKIPE T1,EJBUPQ(J) ;AND USER PORTAL QUOTA
|
||
PUSHJ P,GIVEWS## ;RELEASE USER PORTAL TABLE
|
||
MOVEI T1,EJBLEN ;GET LENGTH OF ETHERNET JOB BLOCK
|
||
MOVE T2,J ;AND ADDRESS OF JOB BLOCK
|
||
PJRST GIVEWS## ;RELEASE ETHERNET JOB BLOCK AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- USER PORTAL BLOCK MANIPULATION
|
||
|
||
|
||
;ROUTINE CALLED TO FIND A USER PORTAL BLOCK
|
||
;LINKAGE:
|
||
; T1/ PORTAL ID
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; PUSHJ P,FNDUPB
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
|
||
FNDUPB: MOVE T3,EJBUPQ(J) ;GET USER PORTAL QUOTA
|
||
MOVE T4,EJBUPT(J) ;AND ADDRESS OF USER PORTAL TABLE
|
||
FNDUP1: PJUMPE T3,CPOPJ## ;RETURN AT END OF USER PORTAL TABLE
|
||
SKIPN F,(T4) ;GET ADDRESS OF NEXT USER PORTAL BLOCK
|
||
JRST FNDUP2 ;NONE, CONTINUE SEARCHING TABLE
|
||
LDB T2,UPPPID ;GET PORTAL ID
|
||
CAMN T1,T2 ;A MATCH?
|
||
PJRST CPOPJ1## ;YES, RETURN
|
||
FNDUP2: XMOVEI T4,1(T4) ;INCREMENT USER PORTAL TABLE ADDRESS
|
||
SOJA T3,FNDUP1 ;LOOP BACK FOR ENTIRE TABLE
|
||
;ROUTINE CALLED TO CREATE A USER PORTAL BLOCK
|
||
;LINKAGE:
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; PUSHJ P,CREUPB
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
|
||
CREUPB: MOVE T1,EJBUPC(J) ;GET CURRENT USER PORTAL COUNT
|
||
CAML T1,EJBUPQ(J) ;BELOW PORTAL QUOTA?
|
||
PJRST ETEPQE ;NO, PORTAL QUOTA EXCEEDED
|
||
MOVEI T2,UPBLEN ;GET LENGTH OF PORTAL BLOCK
|
||
PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR PORTAL BLOCK
|
||
PJRST ETERES ;ERROR, INSUFFICIENT RESOURCES
|
||
MOVE F,T1 ;SAVE ADDRESS OF PORTAL BLOCK
|
||
MOVEM J,UPBEJB(F) ;SAVE ADDRESS OF ETHERNET JOB BLOCK
|
||
XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE DATAGRAM QUEUE
|
||
PUSHJ P,INIQUE ;INITIALIZE QUEUE HEADER
|
||
XMOVEI T1,UPBXQH(F) ;GET ADDRESS OF TRANSMIT DATAGRAM QUEUE
|
||
PUSHJ P,INIQUE ;INITIALIZE QUEUE HEADER
|
||
MOVE T1,EJBBQT(J) ;GET JOB WIDE PORTAL BUFFER QUOTAS
|
||
MOVEM T1,UPBBQT(F) ;SAVE IN PORTAL BLOCK
|
||
MOVE T3,EJBUPQ(J) ;GET USER PORTAL QUOTA
|
||
MOVE T4,EJBUPT(J) ;AND ADDRESS OF USER PORTAL TABLE
|
||
CREUP1: SKIPN (T4) ;FOUND AN EMPTY SLOT IN USER PORTAL TABLE
|
||
JRST CREUP2 ;YES, EXIT LOOP
|
||
XMOVEI T4,1(T4) ;INCREMENT USER PORTAL TABLE ADDRESS
|
||
SOJG T3,CREUP1 ;LOOP BACK FOR ENTIRE TABLE
|
||
STOPCD .+1,DEBUG,ENTPTF ;++USER PORTAL TABLE FULL
|
||
MOVEI T1,UPBLEN ;GET LENGTH OF USER PORTAL BLOCK
|
||
MOVE T2,F ;AND ADDDRESS OF USER PORTAL BLOCK
|
||
PUSHJ P,GIVEWS## ;RELEASE PORTAL BLOCK MEMORY
|
||
PJRST ETEPQE ;AND RETURN PORTAL QUOTA EXCEEDED ERROR
|
||
CREUP2: AOS EJBUPC(J) ;INCREMENT USER PORTAL COUNT
|
||
MOVEM F,(T4) ;SAVE USER PORTAL IN USER PORTAL TABLE
|
||
PJRST CPOPJ1## ;RETURN
|
||
;ROUTINE CALLED TO RELEASE A USER PORTAL BLOCK
|
||
;LINKAGE:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; PUSHJ P,KILUPB
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KILUPB: MOVE T3,EJBUPQ(J) ;GET USER PORTAL QUOTA
|
||
MOVE T4,EJBUPT(J) ;AND ADDRESS OF USER PORTAL TABLE
|
||
KILUP1: CAMN F,(T4) ;FOUND USER PORTAL BEING DELETED?
|
||
JRST KILUP2 ;YES, EXIT LOOP
|
||
XMOVEI T4,1(T4) ;INCREMENT USER PORTAL TABLE ADDRESS
|
||
SOJG T3,KILUP1 ;LOOP BACK FOR ENTIRE TABLE
|
||
STOPCD KILUP3,DEBUG,ENTMPB ;++MISSING USER PORTAL BLOCK
|
||
KILUP2: SETZM (T4) ;CLEAR USER PORTAL TABLE ENTRY
|
||
SOS EJBUPC(J) ;DECREMENT USER PORTAL COUNT
|
||
KILUP3: XMOVEI T1,EJBPSQ(J) ;GET ADDRESS OF PSI PENDING QUEUE
|
||
XMOVEI T2,UPBPSQ(F) ;AND ADDRESS OF PSI QUEUE LINKAGE
|
||
PUSHJ P,DELQUE ;DELETE PORTAL FROM PSI PENDING QUEUE
|
||
MOVEI T1,UPBLEN ;GET LENGTH OF PORTAL BLOCK
|
||
MOVE T2,F ;AND ADDRESS
|
||
PJRST GIVEWS## ;RELEASE MEMORY AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- MONITOR BUFFER MANIPULATION
|
||
|
||
|
||
;ROUTINE CALLED TO CREATE A MONITOR BUFFER AND DESCRIPTOR
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF USER BUFFER DESCRIPTOR
|
||
; PUSHJ P,GETMBD
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; T2/ ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
|
||
GETMBD: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
MOVE P2,T1 ;SAVE ADDRESS OF USER BUFFER DESCRIPTOR
|
||
MOVEI T2,.UBLEN ;GET LENGTH OF USER BUFFER DESCRIPTOR
|
||
PUSHJ P,ARNGE## ;ADDRESS CHECK USER BUFFER DESCRIPTOR
|
||
PJRST ETEBAC ;BUFFER ADDRESS CHECK
|
||
JFCL ;ADDRESS ILLEGAL FOR I/O
|
||
PUSH P,M ;SAVE M FOR A BIT
|
||
EXCTUX <DMOVE T1,.UBBFA(P2)> ;GET USER BYTE POINTER
|
||
EXCTUX <MOVE T3,.UBBSZ(P2)> ;AND USER BYTE COUNT
|
||
MOVE M,P2 ;USE .UBSTS WORD FOR SCRATCH LOCATION
|
||
ADDI M,.UBSTS ;...
|
||
PUSHJ P,QRNGE## ;ADDRESS CHECK USER DATAGRAM BUFFER
|
||
JRST GETMB1 ;BUFFER ADDRESS CHECK
|
||
JRST GETMB1 ;ADDRESS ILLEGAL FOR I/O
|
||
POP P,M ;RESTORE M
|
||
PUSHJ P,GTWGBP## ;GENERATE TWO WORD GLOBAL USER BYTE POINTER
|
||
DMOVE P3,T1 ;SAVE RESOLVED USER BYTE POINTER
|
||
MOVEI T2,.MBLEN ;GET SIZE OF MONITOR BUFFER DESCRIPTOR
|
||
PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR DESCRIPTOR
|
||
PJRST ETERES ;ERROR, INSUFFICIENT RESOURCES
|
||
MOVE P1,T1 ;SAVE ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
MOVEI T1,.UBLEN-1 ;GET LENGTH OF SAVED USER BUFFER DESCRIPTOR
|
||
MOVE T2,P2 ;GET ADDRESS OF CURRENT USER BUFFER DESCRIPTOR
|
||
ADDI T2,.UBNXT+1 ;COPY ALL BUT POINTER TO NEXT BUFFER DESCRIPTOR
|
||
XMOVEI T3,.MBUBD+.UBNXT+1(P1) ;GET ADDRESS OF SAVED BUFFER DESCRIPTOR
|
||
XBLTUX <T1> ;COPY USER DESCRIPTOR TO SAVED DESCRIPTOR
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
MOVEM P3,MD.AUX+.MBMSD(P1) ;SET UP P&S PORTION OF MSD
|
||
MOVEM P4,.MBUBA(P1) ;SAVE USER BUFFER ADDRESS
|
||
LDB T2,[POINT 6,P3,5] ;GET POSITION FIELD FROM BYTE POINTER
|
||
IDIVI T2,^D8 ;COMPUTE BYTE OFFSET
|
||
SUBI T2,4 ;...
|
||
MOVMS T2 ;...
|
||
TRZN T2,4 ;WORD ALIGNED ON SECOND WORD?
|
||
TDZA T1,T1 ;NO, GET A ZERO
|
||
MOVEI T1,1 ;YES, GET A ONE
|
||
MOVNM T1,MD.ALA+.MBMSD(P1) ;PRESET MONITOR BUFFER BYTE POINTER
|
||
ADDM T1,.MBUBA(P1) ;ADJUST USER BUFFER ADDRESS
|
||
ADD T2,.MBUBD+.UBBSZ(P1) ;ADD USER BYTE COUNT TO BYTE OFFSET
|
||
ADDI T2,3 ;CONVERT TO WORD COUNT
|
||
ASH T2,-2 ;...
|
||
MOVEM T2,.MBDBS(P1) ;SAVE AS DATAGRAM BUFFER SIZE
|
||
PUSHJ P,GETMBF ;ALLOCATE MONITOR BUFFER
|
||
JRST GETMB2 ;ERROR, INSUFFICIENT RESOURCES
|
||
MOVEM T1,.MBMBA(P1) ;SAVE ADDRESS OF MONITOR BUFFER
|
||
ADDM T1,MD.ALA+.MBMSD(P1) ;SET UP MONITOR BUFFER BYTE POINTER
|
||
MOVE T1,.MBUBD+.UBBSZ(P1) ;GET USER DATAGRAM BYTE COUNT
|
||
MOVEM T1,MD.BYT+.MBMSD(P1) ;SAVE IN MONITOR BUFFER MSD
|
||
MOVE T2,P1 ;GET ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;HERE ON USER BUFFER ADDRESS CHECK
|
||
|
||
GETMB1: POP P,M ;RESTORE M
|
||
PJRST ETEBAC ;GIVE BUFFER ADDRESS CHECK ERROR
|
||
|
||
|
||
;HERE ON RESOURCE ERROR ALLOCATING MONITOR BUFFER
|
||
|
||
GETMB2: MOVE T2,P1 ;GET ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PUSHJ P,GIVMBD ;RELEASE MONITOR BUFFER AND DESCRIPTOR
|
||
PJRST ETERES ;GIVE INSUFFICIENT RESOURCES ERROR
|
||
;ROUTINE CALLED TO RELEASE A MONITOR BUFFER AND DESCRIPTOR
|
||
;LINKAGE:
|
||
; T2/ ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
; PUSHJ P,GIVMBD
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
GIVMBD: PUSHJ P,SAVE1## ;SAVE P1
|
||
MOVE P1,T2 ;SAVE ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
MOVE T1,.MBDBS(P1) ;GET DATAGRAM BUFFER SIZE
|
||
SKIPE T2,.MBMBA(P1) ;AND ADDRESS OF MONITOR BUFFER
|
||
PUSHJ P,GIVMBF ;RELEASE MONITOR BUFFER
|
||
MOVEI T1,.MBLEN ;GET LENGTH OF MONITOR BUFFER DESCRIPTOR
|
||
MOVE T2,P1 ;AND ADDRESS OF MONITOR BUFFER DESCRIPTOR
|
||
PJRST GIVEWS## ;RELEASE MONITOR BUFFER DESCRIPTOR AND RETURN
|
||
;ROUTINE CALLED TO ALLOCATE A MONITOR BUFFER
|
||
;LINKAGE:
|
||
; T2/ SIZE OF MONITOR BUFFER
|
||
; PUSHJ P,GETMBF
|
||
;RETURNS:
|
||
; CPOPJ ON RESOURCE ERROR
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; T1/ ADDRESS OF MONITOR BUFFER
|
||
|
||
GETMBF: PUSH P,J ;SAVE J
|
||
MOVE J,.CPJOB## ;GET OUR JOB NUMBER
|
||
PUSHJ P,GFWNZS## ;ALLOCATE MONITOR BUFFER
|
||
PJRST JPOPJ## ;ERROR, RESTORE J AND RETURN
|
||
PJRST JPOPJ1## ;RESTORE J AND RETURN
|
||
;ROUTINE CALLED TO DEALLOCATE A MONITOR BUFFER
|
||
;LINKAGE:
|
||
; T1/ SIZE OF MONITOR BUFFER
|
||
; T2/ ADDRESS OF MONITOR BUFFER
|
||
; PUSHJ P,GIVMBF
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
GIVMBF: PUSH P,J ;SAVE J
|
||
MOVE J,.CPJOB## ;GET OUR JOB NUMBER
|
||
PUSHJ P,GVFWDS## ;DEALLOCATE MONITOR BUFFER
|
||
PJRST JPOPJ## ;RESTORE J AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- INFORMATION PORTAL MANIPULATION
|
||
|
||
|
||
;ROUTINE CALLED TO OPEN AN INFORMATION PORTAL
|
||
;LINKAGE:
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,OPNINF
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (ETXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
OPNINF: MOVE F,EJBINF(J) ;GET ADDRESS OF INFORMATION USER PORTAL
|
||
SETZ T1, ;USE ETHERNET CHANNEL ZERO
|
||
STOR T1,UNCHN,(U) ;STORE IN UN BLOCK
|
||
MOVX T1,PT%INF ;GET INFORMATION PSEUDO-PROTOCOL TYPE
|
||
STOR T1,UNPRO,(U) ;STORE IN UN BLOCK
|
||
MOVE T1,EJBJCH(J) ;GET JCH OF PORTAL OWNER
|
||
STOR T1,UNJCH,(U) ;SAVE IN UN BLOCK
|
||
STOR F,UNUID,(U) ;SAVE CALLBACK ID IN UN BLOCK
|
||
XMOVEI T1,ENCINT ;GET CALLBACK ADDRESS
|
||
STOR T1,UNCBA,(U) ;SAVE IN UN BLOCK
|
||
MOVEI T1,NU.OPN ;GET ETHERNET OPEN PORTAL FUNCTION CODE
|
||
PUSHJ P,CALETH ;CALL ETHSER TO OPEN PORTAL
|
||
PJRST ETEETH ;ERROR, GO CONVERT ERROR CODE AND RETURN
|
||
LOAD T1,UNPID,(U) ;GET PORTAL ID ASSIGNED BY ETHSER
|
||
DPB T1,UPPPID ;SAVE IN PORTAL STATUS WORD
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
;ROUTINE CALLED TO CLOSE AN INFORMATION PORTAL
|
||
;LINKAGE:
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; U/ ADDRESS OF UN BLOCK
|
||
; PUSHJ P,CLSINF
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
CLSINF: MOVE F,EJBINF(J) ;GET ADDRESS OF INFORMATION PORTAL
|
||
MOVEI T1,NU.CLO ;GET ETHERNET CLOSE PORTAL FUNCTION CODE
|
||
PUSHJ P,CALETH ;CALL ETHSER TO CLOSE PORTAL
|
||
JFCL ;ERROR, CAN'T DO MUCH
|
||
POPJ P, ;RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- FUNCTION COMPLETION EVENT WAIT
|
||
|
||
|
||
;ROUTINE CALLED TO WAIT FOR FUNCTION COMPLETION
|
||
;LINKAGE:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; PUSHJ P,ENTSLP
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS UPON FUNCTION COMPLETION
|
||
|
||
ENTSLP: MOVEI T1,EV.ETH ;GET ETHERNET EVENT WAIT CODE
|
||
PUSH P,J ;SAVE J
|
||
MOVE J,EJBJCH(J) ;GET JCH OF PORTAL OWNER
|
||
ANDI J,JOBMSK## ;MASK TO JUST JOB NUMBER
|
||
PUSHJ P,FSLEEP## ;WAIT FOR FUNCTION COMPLETION
|
||
POP P,J ;RESTORE J
|
||
SKIPE UPBFWC(F) ;FUNCTION COMPLETED?
|
||
JRST ENTSLP ;NO, WAIT TILL FUNCTION COMPLETES
|
||
POPJ P, ;RETURN
|
||
;ROUTINE CALLED TO SIGNAL FUNCTION COMPLETION
|
||
;LINKAGE:
|
||
; T1/ ETHERNET FUNCTION CODE (NU.XXX)
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; PUSHJ P,ENTWAK
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
ENTWAK: CAME T1,UPBFWC(F) ;FUNCTION WE'RE WAITING FOR?
|
||
POPJ P, ;NO, RETURN
|
||
SETZM UPBFWC(F) ;YES, INDICATE FUNCTION HAS COMPLETED
|
||
MOVE T1,EJBJCH(J) ;GET JCH OF PORTAL OWNER
|
||
PUSHJ P,CTXEWK## ;WAKE UP CONTEXT
|
||
JFCL ;SHOULD SKIP
|
||
POPJ P, ;RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- PORTAL STATUS UPDATE
|
||
|
||
|
||
;ROUTINE CALLED TO UPDATE PORTAL STATUS
|
||
;LINKAGE:
|
||
; F/ ADDRESS OF USER PORTAL BLOCK
|
||
; J/ ADDRESS OF ETHERNET JOB BLOCK
|
||
; PUSHJ P,UPDPSW
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
UPDPSW: ETHLOK ;INTERLOCK AGAINST RACES
|
||
PUSH P,S ;SAVE S
|
||
MOVE S,UPBPSW(F) ;GET CURRENT PORTAL STATUS
|
||
TXO S,ET.PRB!ET.PXB ;SET DATAGRAM BUFFER AVAILABLE FLAGS
|
||
XMOVEI T1,UPBRQH(F) ;GET ADDRESS OF RECEIVE QUEUE HEADER
|
||
PUSHJ P,CHKQUE ;IS QUEUE EMPTY?
|
||
TXZ S,ET.PRB ;YES, CLEAR RECEIVE DATAGRAM AVAILABLE FLAG
|
||
XMOVEI T1,UPBXQH(F) ;GET ADDRESS OF TRANSMIT QUEUE HEADER
|
||
PUSHJ P,CHKQUE ;IS QUEUE EMPTY?
|
||
TXZ S,ET.PXB ;YES, CLEAR TRANSMIT DATAGRAM AVAILABLE FLAG
|
||
MOVEM S,UPBPSW(F) ;STORE UPDATED PORTAL STATUS
|
||
EXCH S,UPBPPS(F) ;GET AND UPDATE PREVIOUS PORTAL STATUS
|
||
XOR S,UPBPPS(F) ;MASK TO CHECK DIFFERENCES
|
||
TXNE S,ET.PST ;PORTAL STATUS CHANGED?
|
||
SKIPE UPBPSQ(F) ;YES, USER PORTAL ALREADY ON PSI QUEUE?
|
||
JRST STOPS1 ;NO CHANGE OR ALREADY ON PSI QUEUE
|
||
XMOVEI T1,EJBPSQ(J) ;GET ADDRESS OF PSI QUEUE HEADER
|
||
XMOVEI T2,UPBPSQ(F) ;AND ADDRESS OF QUEUE LINKAGE
|
||
PUSHJ P,PUTQUE ;ADD PORTAL TO PSI QUEUE
|
||
PUSH P,J ;SAVE J
|
||
MOVE J,EJBJCH(J) ;GET JCH OF PORTAL OWNER
|
||
SIGNAL C$ETH ;SIGNAL ETHERNET EVENT
|
||
JFCL ;...
|
||
POP P,J ;RESTORE J
|
||
STOPS1:
|
||
ETHULK ;RELEASE INTERLOCK
|
||
POP P,S ;RESTORE S
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL ETHNT. UUO SUPPORT -- QUEUE MANIPULATION
|
||
|
||
|
||
;ROUTINE CALLED TO INITIALIZE A QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,INIQUE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIQUE: MOVEM T1,.QHFLI(T1) ;POINT QUEUE AT ITSELF
|
||
MOVEM T1,.QHBLI(T1) ;...
|
||
SETZM .QHCNT(T1) ;ZERO QUEUE ENTRY COUNT
|
||
POPJ P, ;AND RETURN
|
||
;ROUTINE CALLED TO CHECK FOR EMPTY QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,CHKQUE
|
||
;RETURNS:
|
||
; CPOPJ ON EMPTY QUEUE
|
||
; CPOPJ1 ON NON-EMPTY QUEUE WITH:
|
||
; T2/ ADDRESS OF FIRST QUEUE ENTRY
|
||
|
||
CHKQUE: MOVE T2,.QHFLI(T1) ;GET ADDRESS OF FIRST QUEUE ENTRY
|
||
CAME T1,T2 ;IS QUEUE EMPTY?
|
||
AOS (P) ;NO, PRESET SKIP RETURN
|
||
POPJ P, ;RETURN
|
||
;ROUTINE CALLED TO DELETE AN ENTRY FROM A QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; T2/ ADDRESS OF QUEUE ENTRY
|
||
; PUSHJ P,DELQUE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
DELQUE: ETHLOK ;INTERLOCK QUEUE ACCESS
|
||
XMOVEI T4,.QHFLI-.QEFLI(T1) ;PRESET ADDRESS OF "PREVIOUS" ENTRY
|
||
DELQU1: MOVE T3,T4 ;SAVE ADDRESS OF PREVIOUS QUEUE ENTRY
|
||
MOVE T4,.QEFLI(T4) ;GET ADDRESS OF NEXT QUEUE ENTRY
|
||
CAMN T4,.QHFLI(T1) ;AT END OF QUEUE?
|
||
PJRST UNLETH## ;YES, RETURN
|
||
CAME T4,T2 ;FOUND SUBJECT QUEUE ENTRY?
|
||
JRST DELQU1 ;NO, LOOP BACK FOR ENTIRE QUEUE
|
||
MOVE T4,.QEFLI(T4) ;GET ADDRESS OF NEXT QUEUE ENTRY
|
||
MOVEM T4,.QEFLI(T3) ;UNLINK SUBJECT QUEUE ENTRY
|
||
SETZM .QEFLI(T2) ;CLEAR LINK WORD
|
||
PJRST UNLETH## ;RELEASE INTERLOCK AND RETURN
|
||
;ROUTINE CALLED TO REMOVE AN ENTRY FROM A QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,REMQUE
|
||
;RETURNS:
|
||
; CPOPJ IF QUEUE EMPTY
|
||
; CPOPJ1 IF SUCCESS WITH:
|
||
; T2/ ADDRESS OF QUEUE ENTRY
|
||
|
||
REMQUE: ETHLOK ;INTERLOCK QUEUE ACCESS
|
||
CAMN T1,.QHFLI(T1) ;QUEUE EMPTY?
|
||
PJRST UNLETH## ;YES, RELEASE INTERLOCK AND RETURN
|
||
MOVE T2,.QHFLI(T1) ;GET ADDRESS OF FIRST QUEUE ENTRY
|
||
MOVE T3,.QEFLI(T2) ;GET ADDRESS OF NEXT QUEUE ENTRY
|
||
MOVEM T3,.QHFLI(T1) ;STORE AS NEW FIRST ENTRY IN QUEUE
|
||
CAMN T1,.QHFLI(T1) ;QUEUE NOW EMPTY?
|
||
MOVEM T1,.QHBLI(T1) ;YES, RESET POINTER TO LAST ENTRY
|
||
SOS .QHCNT(T1) ;DECREMENT COUNT OF ENTRIES IN QUEUE
|
||
ETHULK ;RELEASE INTERLOCK
|
||
SETZM .QEFLI(T2) ;CLEAR ENTRY'S FORWARD QUEUE LINK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
;ROUTINE CALLED TO ADD AN ENTRY TO A QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; T2/ ADDRESS OF QUEUE ENTRY
|
||
; PUSHJ P,PUTQUE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
PUTQUE: ETHLOK ;INTERLOCK QUEUE ACCESS
|
||
MOVE T3,.QHBLI(T1) ;GET ADDRESS OF LAST ENTRY ON QUEUE
|
||
MOVEM T2,.QEFLI(T3) ;POINT IT AT NEW ENTRY
|
||
MOVEM T2,.QHBLI(T1) ;MAKE NEW ENTRY THE LAST ENTRY ON QUEUE
|
||
MOVEM T1,.QEFLI(T2) ;...
|
||
AOS .QHCNT(T1) ;INCREMENT COUNT OF ENTRIES IN QUEUE
|
||
PJRST UNLETH## ;RELEASE INTERLOCK AND RETURN
|
||
SUBTTL PRIVILEGE CHECKING
|
||
|
||
|
||
;ROUTINE CALLED TO CHECK IF A JOB HAS ETHERNET PRIVILEGES
|
||
;(TRANSLATES TO POKE PRIVILEGES)
|
||
;LINKAGE:
|
||
; PUSHJ P,ENTPRV
|
||
;RETURNS:
|
||
; CPOPJ IF UNPRIVILEGED
|
||
; CPOPJ1 IF PRIVILEGED
|
||
|
||
ENTPRV: PUSH P,J ;SAVE J
|
||
MOVE J,.CPJOB## ;PRVBIT WANTS JOB NUMBER IN J
|
||
MOVSI T1,JP.POK ;GET THE BIT
|
||
PUSHJ P,PRVBIT## ;SEE IF PRIVILEGED
|
||
JRST JPOPJ1## ;YES, RESTORE J AND SKIP RETURN
|
||
JRST JPOPJ## ;NO, RESTORE J AND NON-SKIP RETURN
|
||
SUBTTL BYTE POINTERS
|
||
|
||
|
||
;BYTE POINTERS FOR USER PORTAL BLOCK
|
||
|
||
UPPCID: POINTR (UPBCSW(F),ET.CID) ;ETHERNET CHANNEL ID
|
||
UPPPAD: POINTR (UPBPIW(F),ET.PAD) ;PADDING FLAG
|
||
UPPPTY: POINTR (UPBPIW(F),ET.PTY) ;PROTOCOL TYPE CODE
|
||
UPPPID: POINTR (UPBPSW(F),ET.PID) ;PORTAL ID
|
||
|
||
UPPXBQ: POINTR (UPBBQT(F),UPQXBQ) ;TRANSMIT BUFFER QUOTA
|
||
UPPRBQ: POINTR (UPBBQT(F),UPQRBQ) ;RECEIVE BUFFER QUOTA
|
||
SUBTTL DEFAULT VALUE STORAGE
|
||
|
||
|
||
;ETHERNET JOB BLOCK DEFAULTS
|
||
|
||
ENTUPQ: EXP %ETUPQ## ;USER PORTAL QUOTA
|
||
ENTBQT: EXP %ETBQT## ;DATAGRAM BUFFER QUOTAS
|
||
SUBTTL THE END
|
||
|
||
|
||
ENTLIT:!XLIST ;LITERALS
|
||
LIT
|
||
LIST
|
||
|
||
ENTEND:!END
|