1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-11 23:53:12 +00:00

Implement Chaosnet broadcast sending in ITS.

This commit is contained in:
Björn Victor 2024-03-16 12:05:22 +01:00 committed by Lars Brinkhoff
parent e5ee34480e
commit cfa4505c90

View File

@ -773,7 +773,7 @@ CHPKO: PUSHJ P,CHAIOS ;SET UP I, E
%COMNT::JRST IOCER3
%COEOF::JRST CHOEOF
%COUNC::JRST CHOUNC
%COBRD::JRST IOCER9 ;UNTIL I IMPLEMENT IT
%COBRD::JRST CHOBRD
%COMAX::OFFSET 0
;LOSSET ROUTINE TO RETURN BUFFER A POINTS TO.
@ -797,6 +797,25 @@ CHORFC: PUSHJ P,CHORF1 ;RE-INITIALIZE CONNECTION
MOVEI E,%CSRFS ;PUT INTO RFC-SENT STATE
JRST CHOOP1 ;GO SEND
;Sending broadcast
CHOBRD: CAIE E,%CSBRS ;Don't reinitialize if we already sent a BRD
PUSHJ P,CHORF1 ;RE-INITIALIZE CONNECTION
SETZB B,%CPKD(A) ;Clear dest host and index
MOVEM B,CHSFRN(I)
;; Check bitmap settings.
LDB T,[$CPKAN(A)] ;NUMBER OF BITMAP BYTES
SKIPN T ;Must be some
JRST IOCR10
LDB TT,[$CPKNB(A)] ;NUMBER OF TOTAL DATA BYES (INCLUDES BITMAP)
CAIG T,32. ;ACK NUMBER NO GREATER THAN 32.
TRNE T,3 ; MUST BE MULTIPLE OF 4
JRST IOCR10 ; ERROR, NO GOOD
CAMG TT,T ;MUST BE SOME TEXTUAL RFC DATA AS WELL
JRST IOCR10 ; IF NOT, ERROR
;; All OK, go ahead
MOVEI E,%CSBRS ;PUT INTO BROADCAST-SENT STATE
JRST CHOOP1 ;GO SEND
;RE-INITIALIZE CONNECTION WHEN USER OUTPUTS RFC OR LSN
;FLUSHES ANY OLD PACKET BUFFERS, CHANGES UNIQUIZER IN INDEX#
CHORF1: JUMPN E,IOCR10 .SEE %CSCLS ;CONNECTION MUST BE CLOSED
@ -831,7 +850,7 @@ CHOOPN: CAIE E,%CSRFC ;CONNECTION MUST BE RFC-RECEIVED
HLRZ B,CHSWIN(I) ;INCLUDE WINDOW SIZE
DPB B,[042000,,%CPKDT(A)]
MOVEI E,%CSOPN ;MAKE IT OPEN
;HERE TO SEND A RETRANSMITTABLE CONTROL PACKET (RFC OR OPN), NEW STATE IN E
;HERE TO SEND A RETRANSMITTABLE CONTROL PACKET (RFC, BRD OR OPN), NEW STATE IN E
;THIS PACKET WILL GET TAKEN OFF THE CHSOBF LIST BY RECEIPT IN THE NORMAL WAY
;THIS CODE COPIED FROM CHODAT WITH SOME MODIFICATIONS
CHOOP1: MOVE T,TIME ;UPDATE CHSITM SO WON'T THINK HOST IS DOWN
@ -846,7 +865,9 @@ CHOOP1: MOVE T,TIME ;UPDATE CHSITM SO WON'T THINK HOST IS DOWN
DPB B,[$CPKPN(A)]
HLRZ B,CHSPKN(I) ;GET PACKET NUMBER TO ACKNOWLEDGE
HRLM B,CHSACK(I) ;REMEMBER IT HAS BEEN
DPB B,[$CPKAN(A)] ;PIGGY-BACK THIS ACKNOWLEDGE
LDB T,[$CPKOP(A)]
CAIE T,%COBRD ;unless we're sending a BRD
DPB B,[$CPKAN(A)] ;PIGGY-BACK THIS ACKNOWLEDGE
MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
ANDM B,(A) ;CLEAR FORWARDING COUNT AND UNUSED FIELD
MOVE B,CHSLCL(I) ;SET UP SOURCE
@ -859,7 +880,8 @@ CHOOP1: MOVE T,TIME ;UPDATE CHSITM SO WON'T THINK HOST IS DOWN
;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
MOVEI Q,CHSOBF(I) ;PUT ON END OF SEND LIST
PUSHJ P,CHAQPL
CAIE T,%COBRD ;Unless if it is a BRD packet, where retrans is manual
PUSHJ P,CHAQPL
JRST CHAXM0 ;GO TRANSMIT
;SENDING CLOSE
@ -1355,6 +1377,8 @@ CHISNS: MOVEI E,%CSOPN
;INTERRUPT LEVEL PROCESSING OF RECEIVED FWD OR ANS
CHIANS: PUSHJ P,CHFNDX ;FIND CONNECTION
JRST CHABRT ;NOBODY AT OTHER END TO RECEIVE A LOS ANYWAY
CAIN E,%CSBRS ;If in broadcast-sent state,
JRST CHIANB ;don't close, and don't stop BRD transmission.
CAIE E,%CSRFS
JRST CHABRT ;NOT IN RFC-SENT STATE, LOSS
; JRST CHICL1 ;CLOSE THE CONNECTION BUT GIVE TO USER AS INPUT
@ -1363,6 +1387,8 @@ CHIANS: PUSHJ P,CHFNDX ;FIND CONNECTION
;INTERRUPT LEVEL PROCESSING OF RECEIVED CLS PACKET
CHICLS: PUSHJ P,CHFNDX ;FIND CONNECTION BEING CLOSED
JRST CHALOS ;NONE, LOSS
CAIN E,%CSBRS ;BRD should ignore CLS (cf MIT AIM 628 sec 4.5)
POPJ P,
CHICL1: MOVEI W,%CSCLS ;CLOSE THE CONNECTION
CHICL2: PUSHJ P,CHINT ;SET TO STATE IN W, INTERRUPT
PUSH P,A
@ -1377,6 +1403,21 @@ CHIC2A: MOVEI Q,CHSOBF(I) ;DISCARD TRANSMIT PACKETS, E.G. RFC WHICH RECEIVED
CHIC2B: POP P,A
JRST CHIDT1 ;GIVE PACKET TO USER AS DATA
;; For BRD connections, do the beginning of CHIDT1 to give the packet
;; to user (and interrupt them) since next ANS will be unrelated, so
;; just put them all on the receive list.
;; Note: only ANS packets are delivered to the user, who
;; as specified in MIT AIM 628 sec 4.5 must do retransmissions
;; of the BRD manually. This saves a lot of traffic, and turns
;; out not to be very awkward.
CHIANB: SKIPN CHSIBF(I)
PUSHJ P,CHINTI ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
CHIAB1: AOS CHSNBF(I)
MOVEI Q,CHSIBF(I)
PUSHJ P,CHAQPL ;PUT ON END OF RECEIVE LIST
POPJ P,
;INTERRUPT LEVEL PROCESSING OF RFC PACKET
CHIRFC: MOVE T,%CPKDT(A) ;CHECK FOR STATUS REQUEST
CAMN T,[.BYTE 8 ? "S ? "T ? "A ? "T]
@ -1567,6 +1608,8 @@ CHFNDX: MOVEI B,[ASCIZ/Connection does not exist at this end/]
HRRZ E,CHSSTA(I)
MOVE TT,%CPKD(A)
MOVE T,%CPKS(A)
CAIN E,%CSBRS ;In broadcast-sent state,
SETZ T, ; neither host nor index need match
CAIN E,%CSRFS ;IF IN RFC-SENT STATE, ONLY
AND T,[.BYTE 16. ? -1 ? 0] ;THE SOURCE HOST HAS TO MATCH
CAMN TT,CHSLCL(I) ;COMPARE LOCAL ADDRESS