mirror of
https://github.com/PDP-10/its.git
synced 2026-04-26 12:17:41 +00:00
Ethernet and ARP support from Dave Conroy.
This commit is contained in:
1
src/dcg/-read-.-this-
Normal file
1
src/dcg/-read-.-this-
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Files to support an Ethernet interface, from Dave Conroy's ITS.
|
||||||
201
src/dcg/arp.4
Normal file
201
src/dcg/arp.4
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
;ARP/ETH TABLE MANAGEMENT (CALLED BY ETH)
|
||||||
|
;DGC 14-SEP-2014
|
||||||
|
|
||||||
|
NAI==2
|
||||||
|
NAO==10
|
||||||
|
|
||||||
|
EBLK
|
||||||
|
|
||||||
|
;INBOUND (REMOTE TO LOCAL) ARP TABLE (AIIA[X] NON-0 => IN USE)
|
||||||
|
AIIA: BLOCK NAI ;00..31, HW FMT
|
||||||
|
AIEA0: BLOCK NAI ;00..31, HW FMT
|
||||||
|
AIEA1: BLOCK NAI ;32..47, HW FMT
|
||||||
|
|
||||||
|
;OUTBOUND (LOCAL TO REMOTE) ARP TABLE (AOIA[X] NON-0 => IN USE)
|
||||||
|
AOIA: BLOCK NAO ;00..31, HW FMT
|
||||||
|
AOEA0: BLOCK NAO ;00..31, HW FMT
|
||||||
|
AOEA1: BLOCK NAO ;32..47, HW FMT
|
||||||
|
AOSTS: BLOCK NAO ;<0 SEND-REQ, 0 WAIT-ACK, >0 VALID
|
||||||
|
AOCLK: BLOCK NAO ;IN 0.5 SECOND TICKS
|
||||||
|
AOCNT: BLOCK NAO ;RETRY COUNT FOR WAIT-ACK
|
||||||
|
|
||||||
|
BBLK
|
||||||
|
|
||||||
|
;CALLED TO INITIALIZE (FLUSH) THE ARP TABLES
|
||||||
|
;ONLY THE AIIA/AOIA ENTRIES NEED TO BE SET TO 0, BECAUSE IF THESE
|
||||||
|
;ENTRIES ARE 0, NOTHING ELSE IN THE TABLE MATTERS AT ALL
|
||||||
|
;AN ARPCLK IN THE MIDDLE IF THIS IS HARMLESS (AND ETHINI KNOWS THIS)
|
||||||
|
ARPINI: MOVSI H,-NAI
|
||||||
|
AINI0: SETZM AIIA(H) ;FREE
|
||||||
|
AOBJN H,AINI0
|
||||||
|
MOVSI H,-NAO
|
||||||
|
AINI1: SETZM AOIA(H) ;FREE
|
||||||
|
AOBJN H,AINI1
|
||||||
|
POPJ P,
|
||||||
|
|
||||||
|
;CALLED FROM NETCLK EVERY 0.5 SECOND TO AGE ENTRIES
|
||||||
|
;IN THE OUTBOUND ARP TABLE AND TO REQUEST RETRIES AT THE APPROPRIATE
|
||||||
|
;TIME. RAISES PI LEVEL TO PROTECT THE ARP TABLES FROM DEVICE PI.
|
||||||
|
ARPCLK: CONI PI,TT ;TT = SPL(NETLVL)
|
||||||
|
CONO PI,NETOFF
|
||||||
|
MOVSI H,-NAO
|
||||||
|
ACLK0: SKIPN AOIA(H)
|
||||||
|
JRST ACLK3 ;FREE
|
||||||
|
SKIPE AOCLK(H)
|
||||||
|
SOSE AOCLK(H)
|
||||||
|
JRST ACLK3 ;NOT END-OF-LIFE
|
||||||
|
;IF A VALID ENTRY HAS EA0/EA1=0/0 (ARP FAIL) FLUSH IT AT END-OF-LIFE
|
||||||
|
SKIPG AOSTS(H)
|
||||||
|
JRST ACLK1 ;NOT VALID
|
||||||
|
SKIPN AOEA0(H)
|
||||||
|
SKIPE AOEA1(H)
|
||||||
|
JRST ACLK3
|
||||||
|
SETZM AOIA(H) ;FREE
|
||||||
|
JRST ACLK3
|
||||||
|
;IF A WAIT-ACK ENTRY STILL HAS RETRIES MAKE IT A SEND-REQ
|
||||||
|
;OTHERWISE MAKE IT VALID, BUT WITH EA0/EA1=0/0, AND A 5 SEC TIME-TO-LIVE (SO
|
||||||
|
;THAT A PKT ALREADY IN THE XMQ, OR ONE THAT ARRIVES SOON, IS THROWN AWAY)
|
||||||
|
ACLK1: SKIPE AOSTS(H)
|
||||||
|
JRST ACLK3 ;NOT WAIT-ACK
|
||||||
|
PUSHJ P,ETHIOS ;ALWAYS GET OUTPUT SIDE RUNNING
|
||||||
|
SOSN AOCNT(H)
|
||||||
|
JRST ACLK2 ;NO MORE WAIT-ACK RETRIES
|
||||||
|
SETOM AOSTS(H) ;MAKE SEND-REQ
|
||||||
|
JRST ACLK3
|
||||||
|
ACLK2: SETZM AOEA0(H) ;0/0 (ARP FAIL)
|
||||||
|
SETZM AOEA1(H)
|
||||||
|
MOVEI T,1 ;MAKE VALID
|
||||||
|
MOVEM T,AOSTS(H)
|
||||||
|
MOVEI T,2.*5. ;LIVE FOR 5 SEC
|
||||||
|
MOVEM AOCLK(H)
|
||||||
|
ACLK3: AOBJN H,ACLK0
|
||||||
|
ANDI TT,177 ;SPLX(TT)
|
||||||
|
CONO PI,PICON(TT)
|
||||||
|
POPJ P,
|
||||||
|
|
||||||
|
;CALLED TO FIND AN IA->EA MAPPING IN THE OUTBOUND ARP TABLE
|
||||||
|
;ON ENTRY C HOLDS THE IA (HW FMT) THAT NEEDS TO BE FOUND
|
||||||
|
;RTN+1 NOT FOUND
|
||||||
|
;RTN+2 FOUND, BUT WAITING FOR ARP-ACK
|
||||||
|
;RTN+3 FOUND, D/E IS EA0/EA1 (WHICH MIGHT BE 0/0)
|
||||||
|
ARPFND: MOVSI H,-NAO
|
||||||
|
AFND0: SKIPE T,AOIA(H) ;FIND IA
|
||||||
|
CAME C,T
|
||||||
|
AOBJN H,AFND0
|
||||||
|
JUMPGE H,AFND2 ;NOT FOUND, RTN+1
|
||||||
|
AOS (P)
|
||||||
|
SKIPG AOSTS(H) ;VALID ?
|
||||||
|
JRST AFND2 ;NO, RTN+2
|
||||||
|
AOS (P)
|
||||||
|
MOVE D,AOEA0(H) ;GOT EA0/EA1, RTN+3
|
||||||
|
MOVE E,AOEA1(H)
|
||||||
|
JUMPN D,AFND1 ;LIVE FOR (ANOTHER) 60 MIN
|
||||||
|
JUMPE E,AFND2 ;IF EA0/EA1 NOT 0/0
|
||||||
|
AFND1: MOVEI T,2.*60.*60.
|
||||||
|
MOVEM T,AOCLK(H)
|
||||||
|
AFND2: POPJ P,
|
||||||
|
|
||||||
|
;CALLED TO ADD AN ENTRY TO THE OUTBOUND ARP TABLE
|
||||||
|
;THE STS/CLK/CNT ARE RESET, IN ANTICIPATION OF CALLER SENDING AN ARP-REQ
|
||||||
|
;ON ENTRY C HOLDS THE IA (HW FMT) THAT NEEDS TO BE ADDED (WHICH IS
|
||||||
|
;ASSUMED TO NOT BE IN THE OUTBOUND ARP TABLE; THE CALLER HAS CHECKED)
|
||||||
|
;RTN+1 CAN'T ADD AN ENTRY TO THE TABLE
|
||||||
|
;RTN+2 ENTRY ADDED TO THE TABLE
|
||||||
|
ARPADD: SETZ TT, ;OLDEST (GE => NO OLDEST)
|
||||||
|
MOVSI H,-NAO
|
||||||
|
AADD0: SKIPN AOIA(H) ;IS THIS A FREE ENTRY ?
|
||||||
|
JRST AADD2 ;YES, RECYCLE
|
||||||
|
SKIPG AOSTS(H) ;VALID ?
|
||||||
|
JRST AADD1 ;NO, LEAVE ALONE
|
||||||
|
SKIPN T,AOCLK(H) ;IS THIS A FULLY AGED ENTRY ?
|
||||||
|
JRST AADD2 ;YES, RECYCLE
|
||||||
|
SKIPGE TT ;IF NO OLDEST OR NEW ENTRY
|
||||||
|
CAMGE T,AOCLK(TT) ;OLDER THAN THE CURRENT OLDEST ?
|
||||||
|
MOVE TT,H ;YES, NEW OLDEST
|
||||||
|
AADD1: AOBJN H,AADD0
|
||||||
|
SKIPL H,TT ;FOUND A REUSABLE OLDEST ?
|
||||||
|
JRST AADD3 ;NO, RTN+1
|
||||||
|
AADD2: MOVEM C,AOIA(H) ;FILL IN NEW ENTRY
|
||||||
|
SETZM AOSTS(H) ;WAIT-ACK
|
||||||
|
MOVEI T,2.*5. ;WAIT 5 SEC FOR ACK
|
||||||
|
MOVEM T,AOCLK(H)
|
||||||
|
MOVEI T,2. ;2 TRIES
|
||||||
|
MOVEM T,AOCNT(H)
|
||||||
|
AOS (P) ;RTN+2
|
||||||
|
AADD3: POPJ P,
|
||||||
|
|
||||||
|
;CALLED TO CHECK IF AN ARP-REQ FROM OUTBOUND IS NEEDED
|
||||||
|
;THE STS/CLK ARE RESET, IN ANTICIPATION OF CALLER SENDING AN ARP-REQ (CNT
|
||||||
|
;IS LEFT ALONG, BECAUSE IT IS BEING USED TO COUNT THE RETRIES)
|
||||||
|
;RTN+1 NO ARP-REQ NEEDED
|
||||||
|
;RTN+2 ARP-REQ NEEDED, C IS IA (HW FMT)
|
||||||
|
ARPORQ: MOVSI H,-NAO
|
||||||
|
AORQ0: SKIPE C,AOIA(H) ;FIND NON-FREE ENTRY
|
||||||
|
SKIPL AOSTS(H) ;IN STATE SEND-REQ (<0)
|
||||||
|
AOBJN H,AORQ0
|
||||||
|
JUMPGE H,AORQ1 ;NO NON-FREE ENTRY, RTN+1
|
||||||
|
SETZM AOSTS(H) ;WAIT-ACK
|
||||||
|
MOVEI T,2.*5. ;WAIT 5 SEC FOR ACK
|
||||||
|
MOVEM T,AOCLK(H)
|
||||||
|
AOS (P) ;RTN+2
|
||||||
|
AORQ1: POPJ P,
|
||||||
|
|
||||||
|
;CALLED TO CHECK IF AN ARP-ACK FROM INBOUND IS NEEDED
|
||||||
|
;RTN+1 NO ARP-ACK NEEDED
|
||||||
|
;RTN+2 ARP-ACK NEEDED, C IS IA (HW FMT), D/E IS EA0/EA1 (HW FMT)
|
||||||
|
ARPOAK: MOVSI H,-NAI
|
||||||
|
AOAK0: SKIPN C,AIIA(H) ;FIND NON-FREE ENTRY
|
||||||
|
AOBJN H,AOAK0
|
||||||
|
JUMPGE H,AOAK1 ;NO NON-FREE ENTRY, RTN+1
|
||||||
|
SETZM AIIA(H) ;FREE
|
||||||
|
MOVE D,AIEA0(H)
|
||||||
|
MOVE E,AIEA1(H)
|
||||||
|
AOS (P) ;RTN+2
|
||||||
|
AOAK1: POPJ P,
|
||||||
|
|
||||||
|
;CALLED TO PROCESS AN ARP-REQ THAT HAS BEEN RECEIVED
|
||||||
|
;ON ENTRY A/B HOLD THE FIRST TWO WORDS OF THE ARP PKT (WHICH ARE UNUSED
|
||||||
|
;BUT WHICH NEED TO BE PRESERVED), C HOLDS THE ARC IA (HW FMT), AND
|
||||||
|
;D/E HOLD THE SRC EA0/EA1 (FOR WHICH THERE ISN'T A SW FMT)
|
||||||
|
ARPIRQ: MOVSI H,-NAI
|
||||||
|
AIRQ0: SKIPE AIIA(H) ;FIND FREE ENTRY
|
||||||
|
AOBJN H,AIRQ0
|
||||||
|
JUMPGE H,AIAK2 ;NO FREE ENTRY, DONE
|
||||||
|
MOVEM C,AIIA(H) ;SRC IA
|
||||||
|
MOVEM D,AIEA0(H) ;SRC EA
|
||||||
|
MOVEM E,AIEA1(H)
|
||||||
|
;IF A REMOTE HOST ASKS FOR MY EA, IT WANTS TO SEND ME SOMETHING,
|
||||||
|
;AND THERE IS A GOOD CHANCE THAT I WILL WANT TO SEND SOMETHING BACK, SO IF
|
||||||
|
;IT'S EASY, SAVE THE IA/EA OF THE REMOTE HOST IN THE OUTBOUND ARP TABLE
|
||||||
|
MOVSI H,-NAO
|
||||||
|
AIRQ1: SKIPE T,AOIA(H) ;ALREADY KNOWN ?
|
||||||
|
CAME C,T
|
||||||
|
AOBJN H,AIRQ1
|
||||||
|
JUMPL H,AIAK2 ;YES, DONE
|
||||||
|
MOVSI H,-NAO
|
||||||
|
AIRQ2: SKIPN AOIA(H) ;NO, LOOK FOR A FREE ENTRY
|
||||||
|
JRST AIRQ3
|
||||||
|
SKIPLE AOSTS(H) ;OR A VALID ENTRY THAT HAS AGED OUT
|
||||||
|
SKIPE AOCLK(H)
|
||||||
|
AOBJN H,AIRQ2
|
||||||
|
AIRQ3: JUMPGE H,AIAK2 ;NO ENTRY, DONE
|
||||||
|
MOVEM C,AOIA(H) ;SRC IA
|
||||||
|
JRST AIAK1 ;FINISH IN COMMON CODE
|
||||||
|
|
||||||
|
;CALLED TO PROCESS AN ARP-ACK THAT HAS BEEN RECEIVED
|
||||||
|
;ON ENTRY A/B HOLD THE FIRST TWO WORDS OF THE ARP PKT (WHICH ARE UNUSED
|
||||||
|
;BUT WHICH NEED TO BE PRESERVED), C HOLDS THE ARC IA (HW FMT), AND
|
||||||
|
;D/E HOLD THE SRC EA0/EA1 (FOR WHICH THERE ISN'T A SW FMT)
|
||||||
|
ARPIAK: MOVSI H,-NAO
|
||||||
|
AIAK0: SKIPE T,AOIA(H) ;FIND MATCH
|
||||||
|
CAME C,T
|
||||||
|
AOBJN H,AIAK0
|
||||||
|
JUMPGE H,AIAK2 ;NO ENTRY, IGNORE
|
||||||
|
;ARPIRQ/ARPIAK COME HERE TO FINISH FILLING IN AN OUTBOUND ARP TABLE ENTRY
|
||||||
|
AIAK1: MOVEM D,AOEA0(H) ;SRC EA
|
||||||
|
MOVEM E,AOEA1(H)
|
||||||
|
MOVEI T,1 ;VALID
|
||||||
|
MOVEM T,AOSTS(H)
|
||||||
|
MOVEI T,2.*60.*60. ;LIVE FOR 60 MIN
|
||||||
|
MOVEM T,AOCLK(H)
|
||||||
|
AIAK2: POPJ P,
|
||||||
701
src/dcg/kxeth.11
Normal file
701
src/dcg/kxeth.11
Normal file
@@ -0,0 +1,701 @@
|
|||||||
|
;ETH INTERFACE, PDP-10/X (KX) USING WIZNET W5300
|
||||||
|
;DGC 26-DEC-2014
|
||||||
|
|
||||||
|
;IF KXETH IS IN THE CONFIG, IT BETTER BE DOING SOMETHING
|
||||||
|
IFE INETHP\CHETHP,.ERR KXETH DOING NOTHING
|
||||||
|
|
||||||
|
ETH==600 ;DEVICE ADDRESS
|
||||||
|
|
||||||
|
EBCEA0==777777777760 ;BROADCAST HARDWARE ADDRESS
|
||||||
|
EBCEA1==777774000000 ;FF:FF:FF:FF:FF:FF
|
||||||
|
|
||||||
|
NPDLX==64. ;SIZE OF PDL (ETHLVL)
|
||||||
|
|
||||||
|
EBLK
|
||||||
|
|
||||||
|
ETHUP: 0 ;<0 UP, >=0 DOWN/DEAD
|
||||||
|
|
||||||
|
EOBSY: 0 ;<0 BUSY, >=0 IDLE
|
||||||
|
EOSAV: 0 ;SAVED PKT
|
||||||
|
EOCHS: 0 ;SAVED PKT TYPE (<0 CHAOS, >=IP)
|
||||||
|
EACS: BLOCK 16. ;AC SAVE AREA (ETHLVL)
|
||||||
|
EPDLX: BLOCK NPDLX ;PDL (ETHLVL)
|
||||||
|
|
||||||
|
BBLK
|
||||||
|
|
||||||
|
IFN INETHP,[
|
||||||
|
;ORIGINALLY THE NETHST AND NETIMP SYSTEM CALLS WERE ONLY FOR IMP,
|
||||||
|
;BUT NETHST WITH ARG1 OF -1 IS HOW THE NETWRK LIBRARY EXPECTS TO BE ABLE TO
|
||||||
|
;GET THE INET ADDRESS OF THE LOCAL SYSTEM, SO ETH INCLUDES A VERSION OF
|
||||||
|
;NETHST THAT CAN HANDLE THIS CASE (AND ONLY THIS CASE)
|
||||||
|
;NOTE THAT WE JUST RETURN ETHUP3 AS VAL2, EVEN THOUGH VAL2 IS ACTUALLY IN
|
||||||
|
;HOSTS2 FORMAT, SIMPLY ASSUMING THAT DOING SO WON'T BE TROUBLESOME
|
||||||
|
ANETHST:HRRE T,A ;HW -1 => FW -1
|
||||||
|
AOJN T,OPNL25 ;ONLY ALLOW ARG1 OF -1 (LOCAL HOST)
|
||||||
|
MOVEI A,0 ;4.2-4.1-00 (DOWN), NO REASON
|
||||||
|
SKIPGE ETHUP
|
||||||
|
TLO A,2000 ;4.2-4.1=10 (UP)
|
||||||
|
MOVE B,[ETHUS3]
|
||||||
|
JRST POPJ1
|
||||||
|
]
|
||||||
|
|
||||||
|
IFN CHETHP,[
|
||||||
|
;THESE TABLES ARE USED TO MAP A CHAOS ADDRESS (FOUND IN ECHCA) INTO
|
||||||
|
;A MATCHING INET ADDRESS (FOUND IN THE MATCHING ENTRY IN ECHIA). TABLE LOOKUP
|
||||||
|
;SEEMS LIKE THE BEST SCHEME, ALTHOUGH IT MIGHT BE BETTER TO MAP CHAOS
|
||||||
|
;NETWORKS INTO INET NETWORKS, RATHER THAN CHAOS ADDRESSES INTO INET ADDRESSES,
|
||||||
|
;IF SOME FUTURE VERSION OF KXETH TRIES TO DO SOMETHING WITH BRD PKTS.
|
||||||
|
ECHCA: 402 ;TX (1.2)
|
||||||
|
403 ;N1 (1.3)
|
||||||
|
NECHCA=.-ECHCA
|
||||||
|
ECHIA: IPADDR 192,168,1,2 ;TX.LOCAL
|
||||||
|
IPADDR 192,168,1,3 ;UBUNTU-NUC-01.LOCAL
|
||||||
|
NECHIA=.-ECHIA
|
||||||
|
IFN NECHCA-NECHIA,.ERR ECHCA/ECHIA LENGTH MISMATCH
|
||||||
|
]
|
||||||
|
|
||||||
|
;CALLED (SYSJOB) WHEN THE SYSTEM IS STARTED
|
||||||
|
;CHECK TO SEE IF A W5300 IS ATTCHED TO THE ETH, AND IF IT IS,
|
||||||
|
;INITIALIZE THE W5300, TURN ON THE PI, AND MARK IT AS UP.
|
||||||
|
;THIS ROUTINE CAN BE CALLED AT ANY TIME, EVEN THOUGH THE SYSTEM CURRENTLY
|
||||||
|
;DOES NOT DO SO (THE SYSJOB COULD BE MODIFIED SO THAT "LOCK NET"
|
||||||
|
;CALLED ETHINI AND DID THE SAME THING ON ETH AS IT CURRENTLY DOES ON IMP).
|
||||||
|
ETHINI: CONO ETH,0 ;DISABLE ETH PI
|
||||||
|
SETZM ETHUP ;MARK AS DOWN/DEAD
|
||||||
|
PUSHJ P,ARPINI ;CLEAR OUT THE ARP TABLES
|
||||||
|
SETZM EOBSY ;MARK AS IDLE
|
||||||
|
SKIPN A,EOSAV ;A <- SAVED PKT
|
||||||
|
JRST EINI1
|
||||||
|
SETZM EOSAV
|
||||||
|
SKIPGE EOCHS ;CHECK THE SAVED PKT TYPE
|
||||||
|
JRST EINI0 ;CHAOS
|
||||||
|
IFE INETHP,[
|
||||||
|
;WE HAVE AN IP PKT, BUT INETHP ISN'T TRUE. CAN'T HAPPEN.
|
||||||
|
BUG HALT,[ETHINI-INETHP]
|
||||||
|
]
|
||||||
|
IFN INETHP,[
|
||||||
|
PUSHJ P,EIPFR ;FREE IP PKT
|
||||||
|
JRST EINI1
|
||||||
|
]
|
||||||
|
IFE CHETHP,[
|
||||||
|
;WE HAVE A CHAOS PKT, BUT CHETHP ISN'T TRUE. CAN'T HAPPEN.
|
||||||
|
EINI0: BUG HALT,[ETHINI-CHETHP]
|
||||||
|
]
|
||||||
|
IFN CHETHP,[
|
||||||
|
EINI0: PUSHJ P,ECHFR ;FREE CHAOS PKT
|
||||||
|
]
|
||||||
|
;RESET SOME POSSIBLE W5300, THEN LOOK TO SEE IF IT'S THERE
|
||||||
|
;THE (BADLY DOCUMENTED) PB FLAG TELLS THE W5300 NOT TO RESPOND TO ICMP ECHO PKTS
|
||||||
|
EINI1: DATAO ETH,[161000,,0] ;MR <- WDF2, WDF1, WDF0, RST
|
||||||
|
MOVE T,TIME ;1-2 TICK (32-64MS) DELAY TO ENSURE
|
||||||
|
ADDI T,2 ;PLL LOCKED (10MS IS ENOUGH)
|
||||||
|
CAMLE T,TIME
|
||||||
|
PUSHJ P,UFLS
|
||||||
|
DATAO ETH,[160104,,0] ;MR <- WDF2, WDF1, WDF0, PB, IND
|
||||||
|
DATAO ETH+4*1,[001770,,0] ;AR <- IDR
|
||||||
|
DATAI ETH+4*2,T
|
||||||
|
CAME T,[246000000000]
|
||||||
|
JRST EINI2 ;NO W5300
|
||||||
|
;W5300 IS THERE, ENABLE SOCKET 0 INTERRUPTS, LOAD HARDWARE ADDRESS
|
||||||
|
DATAO ETH+4*1,[000020,,0] ;IMR <- S0INT
|
||||||
|
DATAO ETH+4*2,[000004,,0]
|
||||||
|
DATAO ETH+4*1,[000040,,0] ;SHAR <- ETHEA0/ETHEA1
|
||||||
|
DATAO ETH+4*2,[ETHEA0&777774000000]
|
||||||
|
DATAO ETH+4*1,[000050,,0]
|
||||||
|
DATAO ETH+4*2,[<ETHEA0_16.>&777774000000]
|
||||||
|
DATAO ETH+4*1,[000060,,0]
|
||||||
|
DATAO ETH+4*2,[ETHEA1&777774000000]
|
||||||
|
;ALLOCATE ALL OF THE PKT MEMORY TO SOCKET 0 (8K TO TX, 120K TO RX)
|
||||||
|
DATAO ETH+4*1,[000200,,0] ;TMS01R <- 8K/0K
|
||||||
|
DATAO ETH+4*2,[020000,,0]
|
||||||
|
DATAO ETH+4*1,[000210,,0] ;TMS23R <- 0K/0K
|
||||||
|
DATAO ETH+4*2,[000000,,0]
|
||||||
|
DATAO ETH+4*1,[000220,,0] ;TMS45R <- 0K/0K
|
||||||
|
DATAO ETH+4*2,[000000,,0]
|
||||||
|
DATAO ETH+4*1,[000230,,0] ;TMS67R <- 0K/0K
|
||||||
|
DATAO ETH+4*2,[000000,,0]
|
||||||
|
DATAO ETH+4*1,[000240,,0] ;RMS01R <- 120K/0K
|
||||||
|
DATAO ETH+4*2,[360000,,0]
|
||||||
|
DATAO ETH+4*1,[000250,,0] ;RMS23R <- 0K/0K
|
||||||
|
DATAO ETH+4*2,[000000,,0]
|
||||||
|
DATAO ETH+4*1,[000260,,0] ;RMS45R <- 0K/0K
|
||||||
|
DATAO ETH+4*2,[000000,,0]
|
||||||
|
DATAO ETH+4*1,[000270,,0] ;RMS67R <- 0K/0K
|
||||||
|
DATAO ETH+4*2,[000000,,0]
|
||||||
|
DATAO ETH+4*1,[000300,,0] ;MTYPER <- 1
|
||||||
|
DATAO ETH+4*2,[000004,,0]
|
||||||
|
;ENABLE SOCKET 0 IN LOW-LEVEL ETHERNET (MACRAW) MODE
|
||||||
|
DATAO ETH+4*1,[004020,,0] ;S0IMR <- SENDOK, RECV
|
||||||
|
DATAO ETH+4*2,[000120,,0]
|
||||||
|
DATAO ETH+4*1,[004000,,0] ;S0MR <- MF, MACRAW
|
||||||
|
DATAO ETH+4*2,[000420,,0]
|
||||||
|
DATAO ETH+4*1,[004010,,0] ;S0CR <- OPEN
|
||||||
|
DATAO ETH+4*2,[000004,,0]
|
||||||
|
DATAO ETH+4*1,[004040,,0] ;SOCK_MACRAW
|
||||||
|
DATAI ETH+4*2,T
|
||||||
|
TLZ T,776000
|
||||||
|
CAME T,[000410000000]
|
||||||
|
BUG HALT,[NOT SOCK_MACRAW]
|
||||||
|
SETOM ETHUP ;MARK AS UP
|
||||||
|
CONO ETH,20+ETHCHN ;ENABLE ETH PI ON ETHCHN
|
||||||
|
EINI2: POPJ P,
|
||||||
|
|
||||||
|
IFN INETHP,[
|
||||||
|
;CALLED TO FREE THE IP PKT BUF POINTED TO BY A
|
||||||
|
;IPIODN ONLY USES T/Q, SO THE OLD LEVEL CAN BE HELD IN TT OVER THE CALL
|
||||||
|
;PKQPF/PKQBL LOOK LIKE THEY PROTECT THEMSELVES, SO IS THIS NEEDED ?
|
||||||
|
EIPFR: CONI PI,TT ;TT <- SPL(NETLVL)
|
||||||
|
CONO PI,NETOFF
|
||||||
|
MOVSI T,(%PKPIL) ;CLR PI-LEVEL LOCK, FREE PKT
|
||||||
|
ANDCAM T,PK.FLG(A)
|
||||||
|
PUSHJ P,IPIODN
|
||||||
|
ANDI TT,177 ;SPLX(TT)
|
||||||
|
CONO PI,PICON(TT)
|
||||||
|
POPJ P,
|
||||||
|
]
|
||||||
|
|
||||||
|
IFN CHETHP,[
|
||||||
|
;CALLED TO FREE THE CHAOS PKT BUF POINTED TO BY A
|
||||||
|
;THERE IS NO NEED TO HACK PI LEVELS BECAUSE CHABRT DOES A PIOFF/PION
|
||||||
|
ECHFR: HRROS T,-2(A) ;NOT ON TX LIST (LH=1'S)
|
||||||
|
AOJN T,ECHFR0 ;IN ANY LIST (LH=1'S, RH=1'S) ?
|
||||||
|
PUSHJ P,CHABRT ;NO, RETURN TO FREE
|
||||||
|
ECHFR0: POPJ P,
|
||||||
|
]
|
||||||
|
|
||||||
|
;CALLED (MANY PLACES) TO ENSURE THE OUTPUT SIDE IS RUNNING
|
||||||
|
;BECAUSE THIS CAN BE CALLED AT MAIN LEVEL AND AT DIFFERENT PI LEVELS IT
|
||||||
|
;SIMPLY MAKES A SW REQ AND LETS ETHBRK DO ALL THE REAL WORK
|
||||||
|
;THIS MUST NOT BE CALLED IF ETHUP>=0 (DOWN/DEAD) BECAUSE ETHBRK DOES NOT CHECK
|
||||||
|
ETHIOS: CONO PI,4000\<200_-ETHCHN>
|
||||||
|
POPJ P,
|
||||||
|
|
||||||
|
;CALLED FROM THE JSR IN LOCATION 40+2*ETHCHN (ETHCHN=6)
|
||||||
|
;ONLY S0_INT.RECV AND S0_INT.SENDOK SHOULD BE ENABLED IN THE W5300
|
||||||
|
;NOTE THAT BECAUSE ETHLVL IS LOWER PRIORITY THAN NETLVL CARE MUST BE TAKEN
|
||||||
|
;WHEN THIS CODE CALLS INTO ANY OF THE COMMON NETWORKING CODE
|
||||||
|
EBLK
|
||||||
|
ETHBRK: 0
|
||||||
|
BBLK
|
||||||
|
MOVEM 17,EACS+17 ;SAVE REGS
|
||||||
|
MOVEI 17,EACS
|
||||||
|
BLT 17,EACS+16
|
||||||
|
MOVE P,[-NPDLX,,EPDLX-1] ;SET UP ETHLVL'S PDL
|
||||||
|
CONO PI,20000\<200_-ETHCHN> ;CLR (POSSIBLE) SW REQ ON ETHCHN
|
||||||
|
DATAO ETH+4*1,[004030,,0] ;T <- S0_IR
|
||||||
|
DATAI ETH+4*2,T
|
||||||
|
TLNN T,120 ;RECV OR SENDOK REQ ?
|
||||||
|
JRST EBRK0 ;NO
|
||||||
|
DATAO ETH+4*2,T ;CLEAR REQ
|
||||||
|
TLNE T,100 ;SENDOK, MARK OUTPUT IDLE
|
||||||
|
SETZM EOBSY
|
||||||
|
TLNE T,20 ;RECV, INPUT PKTS
|
||||||
|
PUSHJ P,EIPKT
|
||||||
|
EBRK0: SKIPL EOBSY ;IF IDLE, TRY AND OUTPUT PKTS
|
||||||
|
PUSHJ P,EOPKT
|
||||||
|
MOVSI 17,EACS ;RESTORE REGS
|
||||||
|
BLT 17,17
|
||||||
|
JRST 12,@ETHBRK ;DISMISS PI, RETURN
|
||||||
|
|
||||||
|
;CALLED (ETHBRK) TO INPUT ALL PKTS IN FIFO
|
||||||
|
;ARP-REQ AND ARP-ACK PACKETS UPDATE THE ARP TABLES, WHICH MAY HAVE
|
||||||
|
;THE SIDE EFFECT OF UNBLOCKING THE OUTPUT SIDE
|
||||||
|
;INET PKTS ARE INPUT, AND FED EITHER TO THE CHAOS STACK (IF THE PROTOCOL
|
||||||
|
;TYPE IS THAT OF A CHAOS PKT) OR TO THE INET STACK (DEFAULT).
|
||||||
|
;CHAOS PKTS ARE PROCESSED USING DO-IT-YOURSELF INET CODE BECAUSE IT'S
|
||||||
|
;LEGAL TO CONFIGURE CHAOS WITHOUT CONFIGURING INET.
|
||||||
|
;THIS ROUTINE CAN SMASH ALL THE ACS BECAUSE IT'S REALLY JUST A PART OF ETHBRK.
|
||||||
|
EIPKT: DATAO ETH+4*1,[004250,,0] ;T <- S0_RX_RSR0:S0_RX_RSR2
|
||||||
|
DATAI ETH+4*2,T
|
||||||
|
LSH T,-20.
|
||||||
|
DATAO ETH+4*1,[004240,,0]
|
||||||
|
DATAI ETH+4*2,TT
|
||||||
|
TLNE TT,4
|
||||||
|
TRO T,200000
|
||||||
|
JUMPE T,EIPKT9 ;0 => DONE
|
||||||
|
DATAO ETH+4*1,[004300,,0] ;S0_RX_FIFOR
|
||||||
|
DATAI ETH+4*2,R ;R <- 2-BYTE PKT SIZE
|
||||||
|
LSH R,-20.
|
||||||
|
;PULL THE DST-EA AND SRC-EA OUT OF THE RX FIFO
|
||||||
|
CAIGE R,12. ;ENOUGH FOR 2*ETHADDR
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
SUBI R,12.
|
||||||
|
DATAI ETH+4*10+4*2,A ;A/B <- PKT DST ETHADDR
|
||||||
|
DATAI ETH+4*2,B
|
||||||
|
DATAI ETH+4*10+4*2,T ;PKT SRC ETHADDR
|
||||||
|
DATAI ETH+4*2,T
|
||||||
|
;THIS CHECK IS PURE PARANOIA, SINCE THE HW SHOULD HAVE DONE THE SAME CHECK
|
||||||
|
CAME A,[ETHEA0] ;DST ETHADDR = ME
|
||||||
|
JRST EIPKT1 ;NO
|
||||||
|
CAMN B,[ETHEA1]
|
||||||
|
JRST EIPKT2 ;YES
|
||||||
|
EIPKT1: CAME A,[EBCEA0] ;DST ETHADDR = BROADCAST
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
CAME B,[EBCEA1]
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
;PULL THE ETHTYPE OUT OF THE RX FIFO
|
||||||
|
EIPKT2: CAIGE R,2. ;ENOUGH FOR ETHTYPE
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
SUBI R,2.
|
||||||
|
DATAI ETH+4*2,A ;A <- ETHTYPE
|
||||||
|
;CHECK FOR ARP PKTS, AND PROCESS THEM
|
||||||
|
;WE ONLY UNDERSTAND THE 28-BYTE PKTS THAT MAP AN IP ADDR (V4) TO AN ETH ADDR
|
||||||
|
CAME A,[20030000000] ;ETHTYPE ARP (HEX 0806) ?
|
||||||
|
JRST EIPKT3
|
||||||
|
CAIGE R,28. ;IS THE PKT LONG ENOUGH ?
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
SUBI R,28.
|
||||||
|
DATAI ETH+4*10+4*2,A ;HW TYPE, PROTO TYPE
|
||||||
|
DATAI ETH+4*10+4*2,B ;HW ADDR LEN, PROTO ADDR LEN, OPER
|
||||||
|
DATAI ETH+4*10+4*2,D ;SRC-EA, SRC-IA
|
||||||
|
DATAI ETH+4*2,E
|
||||||
|
DATAI ETH+4*10+4*2,C
|
||||||
|
DATAI ETH+4*10+4*2,T ;DST-EA (FLUSHED), DST-IA
|
||||||
|
DATAI ETH+4*2,T
|
||||||
|
DATAI ETH+4*10+4*2,I
|
||||||
|
;AN ETH PKT IS AT LEAST 46 BYTES LONG, SO THERE IS PADDING TO FLUSH
|
||||||
|
ADDI R,1.+4. ;R <- # OF 16-BIT WORDS (PAD+CRC)
|
||||||
|
LSH R,-1
|
||||||
|
EIPKTM: DATAI ETH+4*2,T ;FLUSH PAD+CRC
|
||||||
|
SOJG R,EIPKTM
|
||||||
|
CAME A,[4100000] ;HW-TYPE=0001 (ETH), SW-TYPE=0800 (IP)
|
||||||
|
JRST EIPKT ;NO, FLUSH
|
||||||
|
CAME I,[ETHUS3_4] ;IS THE DST-IA MINE (MAINLY FOR ARP-REQ) ?
|
||||||
|
JRST EIPKT ;NO, FLUSH
|
||||||
|
CAMN B,[14020000020] ;06, 04, 0001 (ARP-REQ)
|
||||||
|
PUSHJ P,ARPIRQ
|
||||||
|
CAMN B,[14020000040] ;06, 04, 0002 (ARP-ACK)
|
||||||
|
PUSHJ P,ARPIAK
|
||||||
|
JRST EIPKT
|
||||||
|
;CHECK FOR IP (V4) PKTS AND PROCESS THEM
|
||||||
|
EIPKT3: CAME A,[20000000000] ;ETHTYPE IP (HEX 0800) ?
|
||||||
|
JRST EIPKT6
|
||||||
|
CAIGE R,20. ;ENOUGH FOR THE IP HDR ?
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
SUBI R,12. ;WORDS 0-2 TO C/D/E
|
||||||
|
DATAI ETH+4*10+4*2,C ;CHOSEN BECAUSE IPGIPT USES A/B
|
||||||
|
DATAI ETH+4*10+4*2,D
|
||||||
|
DATAI ETH+4*10+4*2,E
|
||||||
|
IFN CHETHP,[
|
||||||
|
;AN IP PKT WITH A PROTOCOL TYPE OF CHAOS, GETS SENT TO THE CHAOS CODE
|
||||||
|
LDB T,[241000,,E] ;CHAOS PKT ?
|
||||||
|
CAIN T,16.
|
||||||
|
JRST EIPKTA ;YES
|
||||||
|
]
|
||||||
|
IFN INETHP,[
|
||||||
|
;AN IP PKT; ALLOCATE A PKT BUF, COPY PKT TO BUF, SEND TO IP
|
||||||
|
;IPGIPT ONLY USES T/Q, SO THE OLD LEVEL CAN BE HELD IN TT OVER THE CALL
|
||||||
|
;PKQGF/PKBAL LOOK LIKE THEY PROTECT THEMSELVES, SO IS THIS NEEDED ?
|
||||||
|
;IPRDGM USES JUST ABOUT EVERYTHING, SO THE OLD PI LEVEL IS SAVED ON THE PDL
|
||||||
|
MOVE A,R ;A <- PKT LEN (WORDS)
|
||||||
|
ADDI A,12.+3. ;12. BECAUSE 3. WORDS ALREADY READ
|
||||||
|
LSH A,-2
|
||||||
|
CONI PI,TT ;TT <- SPL(NETLVL)
|
||||||
|
CONO PI,NETOFF
|
||||||
|
PUSHJ P,IPGIPT ;A <- IP PKT BUF (USES B, T, Q)
|
||||||
|
MOVEI A,0 ;A <- 0 ON FAILURE (RTN+1)
|
||||||
|
ANDI TT,177 ;SPLX(TT)
|
||||||
|
CONO PI,PICON(TT)
|
||||||
|
JUMPE A,EIPKT6 ;NO PKT BUF, FLUSH
|
||||||
|
HRRZ T,PK.BUF(A) ;MOVE THE 3 WORDS ALREADY READ
|
||||||
|
MOVEM C,0(T) ;INTO THE IP PKT BUF
|
||||||
|
MOVEM D,1(T)
|
||||||
|
MOVEM E,2(T)
|
||||||
|
MOVE B,R ;B <- WORDS (AOBJN)
|
||||||
|
LSH B,-2
|
||||||
|
MOVN B,B
|
||||||
|
HRLZ B,B
|
||||||
|
HRRI B,3(T)
|
||||||
|
MOVE C,R ;C <- BYTES (0 - 3)
|
||||||
|
ANDI C,3
|
||||||
|
JUMPGE B,EIPKT5
|
||||||
|
EIPKT4: DATAI ETH+4*10+4*2,(B) ;READ WORDS
|
||||||
|
AOBJN B,EIPKT4
|
||||||
|
EIPKT5: XCT EIPKT8(C) ;READ FINAL 0-3 BYTES
|
||||||
|
DATAI ETH+4*10+4*2,T ;FLUSH 4 BYTE CRC
|
||||||
|
MOVE B,R ;B <- PKT LEN (WORDS)
|
||||||
|
ADDI B,12.+3. ;12. BECAUSE 3. WORDS ALREADY READ
|
||||||
|
LSH B,-2
|
||||||
|
MOVEI C,0 ;C <- IP HDR OFFS INTO PKT
|
||||||
|
CONI PI,T ;PUSH(SPL(NETLVL))
|
||||||
|
PUSH P,T
|
||||||
|
CONO PI,NETOFF
|
||||||
|
PUSHJ P,IPRDGM ;SEND PKT TO IP STACK
|
||||||
|
POP P,T ;SPLX(POP())
|
||||||
|
ANDI T,177
|
||||||
|
CONO PI,PICON(T)
|
||||||
|
JRST EIPKT
|
||||||
|
]
|
||||||
|
;FLUSH UNKNOWN OR MALFORMED PKT (R = DATA LEN IN FIFO)
|
||||||
|
EIPKT6: ADDI R,1.+4. ;R <- # OF 16-BIT WORDS (DATA + CRC)
|
||||||
|
LSH R,-1
|
||||||
|
EIPKT7: DATAI ETH+4*2,T ;FLUSH DATA + CRC
|
||||||
|
SOJG R,EIPKT7
|
||||||
|
JRST EIPKT
|
||||||
|
;XCT EIPKT8(C) TO READ THE FINAL 0-3 BYTES OF IP OR NORMAL-CHAOS PKT
|
||||||
|
EIPKT8: JFCL ;0
|
||||||
|
DATAI ETH+4*2,(B) ;1, READ 2, 0XXX
|
||||||
|
DATAI ETH+4*2,(B) ;2, READ 2, 01XX
|
||||||
|
DATAI ETH+4*10+4*2,(B) ;3, READ 4, 012X
|
||||||
|
;RETURN THROUGH HERE
|
||||||
|
EIPKT9: POPJ P,
|
||||||
|
IFN CHETHP,[
|
||||||
|
;A CHAOS-IN-IP PKT; ALLOCATE A PKT BUF, COPY PKT TO BUF, SEND TO CHAOS
|
||||||
|
;NO FRAGS BECAUSE 524 BYTES (20+16+488) IS LESS THAN 576 BYTES
|
||||||
|
;CHABGI PROTECTS ITSELF, SO THERE IS NO NEED TO HACK THE PI LEVELS AT THE CALL
|
||||||
|
;CHAPII USES JUST ABOUT EVERYTHING, SO THE OLD PI LEVEL IS SAVED ON THE PDL
|
||||||
|
EIPKTA: SUBI R,8. ;WORDS 3-4 TO I/J
|
||||||
|
DATAI ETH+4*10+4*2,I
|
||||||
|
DATAI ETH+4*10+4*2,J
|
||||||
|
PUSHJ P,EIPCS ;TT <- IP CHECKSUM OF C/D/E/I/J
|
||||||
|
JUMPN TT,EIPKT6 ;NOT 0, FLUSH
|
||||||
|
LDB T,[400400,,C] ;IF NOT IP (V4), FLUSH
|
||||||
|
CAIE T,4
|
||||||
|
JRST EIPKT6
|
||||||
|
;BROADCASTS CAN BE IGNORED BECAUSE CURRENTLY NOBODY SENDS THEM ON CHAOS
|
||||||
|
; CAMN J,[<ETHUS3\<NM%ETH#37777777777>>_4]
|
||||||
|
; JRST EIPKTB
|
||||||
|
; CAMN J,[37777777777_4]
|
||||||
|
; JRST EIPKTB
|
||||||
|
CAME J,[ETHUS3_4] ;IS THIS SENT TO ME ?
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
EIPKTB: LDB T,[041600,,D] ;IF FRAG, FLUSH
|
||||||
|
JUMPN T,EIPKT6
|
||||||
|
LDB T,[340400,,C] ;IP HEADER LENGTH
|
||||||
|
SUBI T,5.
|
||||||
|
JUMPL T,EIPKT6 ;<5 => BAD HDR, FLUSH
|
||||||
|
JUMPE T,EIPKTD ;=5 => NO OPTIONS
|
||||||
|
MOVE TT,T
|
||||||
|
LSH TT,2
|
||||||
|
CAMGE R,TT ;ARE THE OPTION WORDS THERE ?
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
SUB R,TT
|
||||||
|
EIPKTC: DATAI ETH+4*10+4*2,TT ;EAT OPTION WORDS
|
||||||
|
SOJG T,EIPKTC
|
||||||
|
EIPKTD: CAIL R,4*%CPKDT ;LEGAL PKT SIZE ?
|
||||||
|
CAILE R,<4*%CPKDT>+%CPMXC
|
||||||
|
JRST EIPKT6 ;NO, FLUSH
|
||||||
|
PUSHJ P,CHABGI ;A <- CH PKT BUF FROM FREE LIST
|
||||||
|
JRST EIPKT6 ;NONE, FLUSH
|
||||||
|
SUBI R,4*%CPKDT
|
||||||
|
DATAI ETH+4*14+4*2,0(A) ;READ IN PKT HDR, ALWAYS BYTE-SWAPPED
|
||||||
|
DATAI ETH+4*14+4*2,1(A)
|
||||||
|
DATAI ETH+4*14+4*2,2(A)
|
||||||
|
DATAI ETH+4*14+4*2,3(A)
|
||||||
|
MOVE B,R ;B <- AOBJN WORD, 4-BYTE CHUNKS
|
||||||
|
LSH B,-2
|
||||||
|
MOVN B,B
|
||||||
|
HRLZ B,B
|
||||||
|
HRRI B,%CPKDT(A)
|
||||||
|
MOVE C,R ;C <- 0-3 BYTES AT THE END
|
||||||
|
ANDI C,3
|
||||||
|
PUSHJ P,CHSWAB ;READ PKT IN BYTE-SWAPPED MODE ?
|
||||||
|
JRST EIPKTG ;RTN+1 => NO, RTN+2 => YES
|
||||||
|
JUMPGE B,EIPKTF ;READ PKT, BYTE-SWAPPED MODE
|
||||||
|
EIPKTE: DATAI ETH+4*14+4*2,(B)
|
||||||
|
AOBJN B,EIPKTE
|
||||||
|
EIPKTF: XCT EIPKTK(C)
|
||||||
|
JRST EIPKTJ
|
||||||
|
EIPKTG: JUMPGE B,EIPKTI ;READ PKT, NORMAL MODE
|
||||||
|
EIPKTH: DATAI ETH+4*10+4*2,(B)
|
||||||
|
AOBJN B,EIPKTH
|
||||||
|
EIPKTI: XCT EIPKT8(C)
|
||||||
|
EIPKTJ: DATAI ETH+4*10+4*2,T ;FLUSH 4 BYTE CRC
|
||||||
|
;FLUSH PKT IF SA IS NOT KNOWN, MAKING IT IMPOSSIBLE TO EVER TALK BACK
|
||||||
|
;ADDING AN NEW ENTRY TO THE ECHCA->ECHIA TABLE MIGHT BE A BETTER THING TO DO
|
||||||
|
LDB T,[$CPKSA(A)]
|
||||||
|
MOVSI TT,-NECHCA
|
||||||
|
EIPKTN: CAME T,ECHCA(TT) ;IS THIS SA KNOWN ?
|
||||||
|
AOBJN TT,EIPKTN
|
||||||
|
JUMPL TT,EIPKTO ;YES
|
||||||
|
PUSHJ P,ECHFR ;FLUSH PKT
|
||||||
|
JRST EIPKT
|
||||||
|
;WE KNOW WE CAN TALK BACK, SO SEND THE PKT TO THE CHAOS STACK
|
||||||
|
EIPKTO: CONI PI,T ;PUSH(SPL(NETLVL))
|
||||||
|
PUSH P,T
|
||||||
|
CONO PI,NETOFF
|
||||||
|
PUSHJ P,CHAPII ;SEND PKT TO CHAOS
|
||||||
|
POP P,T ;SPLX(POP())
|
||||||
|
ANDI T,177
|
||||||
|
CONO PI,PICON(T)
|
||||||
|
JRST EIPKT
|
||||||
|
;XCT EIPKTK(C) TO READ THE FINAL 0-3 BYTES OF BYTE-SWAPPED CHAOS PKT
|
||||||
|
EIPKTK: JFCL ;0
|
||||||
|
DATAI ETH+4*2,(B) ;1, READ 2, 0XXX
|
||||||
|
DATAI ETH+4*4+4*2,(B) ;2, READ 2, 10XX
|
||||||
|
PUSHJ P,EIPKTL ;3, READ 4, 10X2 -> 102X
|
||||||
|
EIPKTL: DATAI ETH+4*14+4*2,(B)
|
||||||
|
LDB T,[041000,(B)] ;THIS ISN'T VERY EFFICIENT, BUT
|
||||||
|
DPB T,[141000,(B)] ;IT'S ALSO VERY UNCOMMON
|
||||||
|
POPJ P,
|
||||||
|
]
|
||||||
|
|
||||||
|
;CALLED (ETHBRK) WHEN THE OUTPUT SIDE IS IDLE TO ENSURE THAT
|
||||||
|
;THE OUTPUT SIDE IS RUNNING IF THERE IS ACTUALLY SOMETHING THAT CAN BE OUTPUT
|
||||||
|
;CHAOS PKTS ARE PROCESSED USING DO-IT-YOURSELF INET CODE BECAUSE IT'S
|
||||||
|
;LEGAL TO CONFIGURE CHAOS WITHOUT CONFIGURING INET.
|
||||||
|
;THIS ROUTINE CAN SMASH ALL THE ACS BECAUSE IT'S REALLY JUST A PART OF ETHBRK.
|
||||||
|
;CHECK IF THERE IS AN ARP-ACK THAT NEEDS TO BE SENT
|
||||||
|
EOPKT: PUSHJ P,ARPOAK ;IS THERE AN ARP-ACK TO OUTPUT ?
|
||||||
|
JRST EOPKT0 ;NO
|
||||||
|
DATAO ETH+4*1,[004270,,0] ;S0_TX_FIFOR
|
||||||
|
DATAO ETH+4*10+4*2,D ;DST ETH ADDR (REMOTE)
|
||||||
|
DATAO ETH+4*2,E
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC ETH ADDR (ME)
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*2,[20030000000] ;0806 (ARP)
|
||||||
|
DATAO ETH+4*10+4*2,[4100000] ;0001 (ETH), 0800 (IP)
|
||||||
|
DATAO ETH+4*10+4*2,[14020000040];06, 04, 0002 (ARP-ACK)
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC ETH/IP ADDRS (ME)
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*10+4*2,[ETHUS3_4]
|
||||||
|
DATAO ETH+4*10+4*2,D ;DST ETH/IP ADDRS (REMOTE)
|
||||||
|
DATAO ETH+4*2,E
|
||||||
|
DATAO ETH+4*10+4*2,C
|
||||||
|
MOVEI R,12.+2.+28. ;SEND PKT
|
||||||
|
JRST EOPKTS
|
||||||
|
;CHECK IF THERE IS AN ARP-REQ THAT NEEDS TO BE SENT (RE-SENT)
|
||||||
|
EOPKT0: PUSHJ P,ARPORQ ;IS THERE AN ARP-REQ TO OUTPUT ?
|
||||||
|
JRST EOPKT1 ;NO
|
||||||
|
DATAO ETH+4*1,[004270,,0] ;S0_TX_FIFOR
|
||||||
|
DATAO ETH+4*10+4*2,[EBCEA0] ;DST ETH ADDR (BROADCAST)
|
||||||
|
DATAO ETH+4*2,[EBCEA1]
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC ETH ADDR (ME)
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*2,[20030000000] ;0806 (ARP)
|
||||||
|
DATAO ETH+4*10+4*2,[4100000] ;0001 (ETH), 0800 (IP)
|
||||||
|
DATAO ETH+4*10+4*2,[14020000020];06, 04, 0001 (ARP-REQ)
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC ETH/IP ADDRS (ME)
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*10+4*2,[ETHUS3_4]
|
||||||
|
DATAO ETH+4*10+4*2,[0] ;DST ETH/IP ADDRS (IA=REMOTE, EA=0)
|
||||||
|
DATAO ETH+4*2,[0]
|
||||||
|
DATAO ETH+4*10+4*2,C
|
||||||
|
MOVEI R,12.+2.+28. ;SEND PKT
|
||||||
|
JRST EOPKTS
|
||||||
|
;GET A PACKET TO WORK ON, EITHER SAVED FROM LAST TIME, OR FRESH FROM AN XMQ
|
||||||
|
;IPGXMQ/CHGXMQ ONLY USE T/Q, SO THE OLD LEVEL CAN BE HELD IN TT OVER THE CALL
|
||||||
|
EOPKT1: SKIPN A,EOSAV ;A <- SAVED PKT
|
||||||
|
JRST EOPKT2 ;NONE
|
||||||
|
SETZM EOSAV
|
||||||
|
SKIPGE B,EOCHS ;B <- SAVED PKT TYPE (<0 CHAOS, >=0 IP)
|
||||||
|
JRST EOPKT7 ;CHAOS
|
||||||
|
JRST EOPKT4 ;IP
|
||||||
|
EOPKT2: CONI PI,TT ;TT <- SPL(NETLVL)
|
||||||
|
CONO PI,NETOFF
|
||||||
|
IFN INETHP,[
|
||||||
|
PUSHJ P,IPGXMQ ;A <- PKT FROM IPXMQ
|
||||||
|
MOVEI B,0 ;B <- IP (>=0)
|
||||||
|
JUMPN A,EOPKT3
|
||||||
|
]
|
||||||
|
IFN CHETHP,[
|
||||||
|
PUSHJ P,CHGXMQ ;A <- PKT FROM CHXMQ
|
||||||
|
MOVNI B,1 ;B <- CHAOS (<0)
|
||||||
|
JUMPN A,EOPKT3
|
||||||
|
]
|
||||||
|
MOVEI A,0 ;A <- NO PKT
|
||||||
|
EOPKT3: ANDI TT,177 ;SPLX(TT)
|
||||||
|
CONO PI,PICON(TT)
|
||||||
|
JUMPE A,EOPKTX ;NO PKT, RETURN
|
||||||
|
SKIPGE B
|
||||||
|
JRST EOPKT7 ;CHAOS
|
||||||
|
IFE INETHP,[
|
||||||
|
;WE HAVE AN IP PKT, BUT INETHP ISN'T TRUE. CAN'T HAPPEN.
|
||||||
|
EOPKT4: BUG HALT,[EOPKT-INETHP]
|
||||||
|
]
|
||||||
|
IFN INETHP,[
|
||||||
|
;LOOK UP THE IP IA->EA MAPPING USING ARP
|
||||||
|
;INET SHOULD HAVE ARRANGED THAT PK.DST(A) IS ON THE LOCAL NET,
|
||||||
|
;BUT IF IT ISN'T, USE THE GATEWAY (DON'T DISCARD THE PKT OR CRASH THE SYSTEM)
|
||||||
|
EOPKT4: MOVE T,PK.DST(A) ;T <- DST IA (SW FMT)
|
||||||
|
MOVE C,T ;C <- HOP IA (DIRECT, HW FMT)
|
||||||
|
LSH C,4
|
||||||
|
GETNET T ;T <- NET #
|
||||||
|
CAME T,[ETHUS3&NM%ETH] ;CHECK IF SAME NET # AS ME
|
||||||
|
MOVE C,[ETHGW3_4] ;C <- HOP IA (INDIRECT VIA GW, HW FMT)
|
||||||
|
PUSHJ P,ARPFND ;QUERY IA->EA MAPPING
|
||||||
|
JRST EOPKTL ;NOT FOUND, SEND ARP-REQ
|
||||||
|
JRST EOPKTK ;FOUND, BUT MAPPING NOT VALID YET
|
||||||
|
JUMPN D,EOPKT5 ;FOUND, SEND IF EA NOT 0/0
|
||||||
|
JUMPN E,EOPKT5
|
||||||
|
PUSHJ P,EIPFR ;FREE PKT
|
||||||
|
JRST EOPKT
|
||||||
|
;SEND A PKT FOR IP, A IS PKT, C IS HOP IA, D/E IS HOP EA0/EA1
|
||||||
|
EOPKT5: DATAO ETH+4*1,[004270,,0] ;S0_TX_FIFOR
|
||||||
|
DATAO ETH+4*10+4*2,D ;DST EA
|
||||||
|
DATAO ETH+4*2,E
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC EA
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*2,[20000000000] ;0800 (IP)
|
||||||
|
HLRZ R,PK.BUF(A) ;R <- # OF 4-BYTE CHUNKS (>=5)
|
||||||
|
MOVN B,R ;B <- AOBJN WORD (IN 4-BYTE CHUNKS)
|
||||||
|
HRLZ B,B
|
||||||
|
HRR B,PK.BUF(A)
|
||||||
|
EOPKT6: DATAO ETH+4*10+4*2,(B) ;COPY PKT INTO FIFO
|
||||||
|
AOBJN B,EOPKT6
|
||||||
|
PUSHJ P,EIPFR ;FREE PKT
|
||||||
|
LSH R,2 ;R <- # OF BYTES
|
||||||
|
ADDI R,12.+2.
|
||||||
|
JRST EOPKTS
|
||||||
|
]
|
||||||
|
IFE CHETHP,[
|
||||||
|
;WE HAVE A CHAOS PKT, BUT CHETHP ISN'T TRUE. CAN'T HAPPEN.
|
||||||
|
EOPKT7: BUG HALT,[EOPKT-CHETHP]
|
||||||
|
]
|
||||||
|
IFN CHETHP,[
|
||||||
|
;IF THE PKT IS A BRD YOU CAN'T JUST MAP IT'S DA, BUT SINCE NOBODY REALLY
|
||||||
|
;USES BRD PKTS, IT'S OK TO JUST THROW THEM AWAY (A BETTER IMPLEMENTATION MIGHT
|
||||||
|
;LOOP OVER THE ECHCA/ECHIA, AND DO THE APPROPRIATE UNICASTS)
|
||||||
|
EOPKT7: LDB T,[$CPKOP(A)] ;BRD PKT ?
|
||||||
|
CAIN T,%COBRD
|
||||||
|
JRST EOPKT9 ;YES, FLUSH
|
||||||
|
;LOOKUP THE CHAOS CA->IA->EA MAPPING USING THE ECHCA/ECHIA TABLES AND ARP
|
||||||
|
LDB T,[$CPKDA(A)]
|
||||||
|
MOVSI TT,-NECHCA
|
||||||
|
EOPKT8: CAME T,ECHCA(TT) ;SEARCH THE ECHCA TABLE
|
||||||
|
AOBJN TT,EOPKT8
|
||||||
|
JUMPGE TT,EOPKT9 ;NOT FOUND, FLUSH
|
||||||
|
MOVE T,ECHIA(TT) ;T <- DST IA (SW FMT)
|
||||||
|
MOVE J,T ;J <- DST IA (HW FMT)
|
||||||
|
LSH J,4
|
||||||
|
MOVE C,J ;C <- HOP IA (DIRECT, HW FMT)
|
||||||
|
GETNET T ;T <- NET #
|
||||||
|
CAME T,[ETHUS3&NM%ETH] ;CHECK IF SAME NET # AS ME
|
||||||
|
MOVE C,[ETHGW3_4] ;C <- HOP IA (INDIRECT VIA GATEWAY, HW FMT)
|
||||||
|
PUSHJ P,ARPFND ;HOP IA -> EA
|
||||||
|
JRST EOPKTL ;NOT FOUND, SEND ARP-REQ
|
||||||
|
JRST EOPKTK ;FOUND, BUT MAPPING NOT VALID YET
|
||||||
|
JUMPN D,EOPKTA ;FOUND, SEND IF EA NOT 0/0
|
||||||
|
JUMPN E,EOPKTA
|
||||||
|
EOPKT9: PUSHJ P,ECHFR ;FREE PKT
|
||||||
|
JRST EOPKT
|
||||||
|
;SEND A PKT FOR CHAOS, A IS PKT, J IS DST IA, C IS HOP IA, D/E IS HOP EA0/EA1
|
||||||
|
EOPKTA: DATAO ETH+4*1,[004270,,0] ;S0_TX_FIFOR
|
||||||
|
DATAO ETH+4*10+4*2,D ;DST EA
|
||||||
|
DATAO ETH+4*2,E
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC EA
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*2,[20000000000] ;0800 (IP)
|
||||||
|
LDB R,[$CPKNB(A)] ;R <- # OF BYTES OF DATA
|
||||||
|
CAILE R,%CPMXC ;MAKE SURE IT'S NOT TOO LONG
|
||||||
|
MOVEI R,%CPMXC
|
||||||
|
;BUILD 5-WORD IP HDR IN C/D/E/I/J, CHECKSUM IT, AND COPY IT INTO TX FIFO
|
||||||
|
;NOTE THAT J IS DST IA, AND SO WORD 4 OF THE IP HDR IS ALREADY IN THE RIGHT PLACE
|
||||||
|
MOVE I,[ETHUS3_4] ;WORD 3, SRC IA
|
||||||
|
MOVSI E,200100 ;WORD 2, TTL=64, CHAOS, CS=0
|
||||||
|
MOVSI D,000001 ;WORD 1, DF=1
|
||||||
|
MOVE C,R ;WORD 0, IPV4, 5-WORDS, LEN
|
||||||
|
ADDI C,20.+16.
|
||||||
|
LSH C,4
|
||||||
|
TLO C,212000
|
||||||
|
PUSHJ P,EIPCS ;COMPUTE CHECKSUM
|
||||||
|
DPB TT,[042000,,E] ;PUT CHECKSUM IN WORD 2
|
||||||
|
DATAO ETH+4*10+4*2,C ;COPY INTO TX FIFO
|
||||||
|
DATAO ETH+4*10+4*2,D
|
||||||
|
DATAO ETH+4*10+4*2,E
|
||||||
|
DATAO ETH+4*10+4*2,I
|
||||||
|
DATAO ETH+4*10+4*2,J
|
||||||
|
;COPY CHAOS HDR (BYTE-SWAPPED) AND DATA (NORMAL, BYTE-SWAPPED) INTO TX FIFO
|
||||||
|
DATAO ETH+4*14+4*2,0(A) ;HDR, BYTE-SWAPPED
|
||||||
|
DATAO ETH+4*14+4*2,1(A)
|
||||||
|
DATAO ETH+4*14+4*2,2(A)
|
||||||
|
DATAO ETH+4*14+4*2,3(A)
|
||||||
|
MOVE B,R ;B <- AOBJN WORD, 4-BYTE WORDS
|
||||||
|
LSH B,-2
|
||||||
|
MOVN B,B
|
||||||
|
HRLZ B,B
|
||||||
|
HRRI B,%CPKDT(A)
|
||||||
|
MOVE C,R ;C <- END, 0-3 BYTES
|
||||||
|
ANDI C,3
|
||||||
|
PUSHJ P,CHSWAB ;WRITE DATA IN BYTE-SWAPPED MODE ?
|
||||||
|
JRST EOPKTD ;RTN+1 NO, RTN+2 YES
|
||||||
|
JUMPGE B,EOPKTC ;WRITE DATA, BYTE-SWAPPED MODE
|
||||||
|
EOPKTB: DATAO ETH+4*14+4*2,(B)
|
||||||
|
AOBJN B,EOPKTB
|
||||||
|
EOPKTC: XCT EOPKTH(C)
|
||||||
|
JRST EOPKTG
|
||||||
|
EOPKTD: JUMPGE B,EOPKTF ;WRITE DATA, NORMAL MODE
|
||||||
|
EOPKTE: DATAO ETH+4*10+4*2,(B)
|
||||||
|
AOBJN B,EOPKTE
|
||||||
|
EOPKTF: XCT EOPKTJ(C)
|
||||||
|
EOPKTG: PUSHJ P,ECHFR ;FREE PKT
|
||||||
|
ADDI R,12.+2.+20.+16.
|
||||||
|
JRST EOPKTS
|
||||||
|
;XCT EOPKTH(C) TO WRITE THE FINAL 0-3 BYTES OF DATA IN BYTE-SWAPPED MODE
|
||||||
|
EOPKTH: JFCL ;0
|
||||||
|
DATAO ETH+4*2,(B) ;1, WRITE 2, 0XXX
|
||||||
|
DATAO ETH+4*4+4*2,(B) ;2, WRITE 2, 10XX
|
||||||
|
PUSHJ P,EOPKTI ;3, WRITE 4, 102X -> 10X2
|
||||||
|
EOPKTI: LDB T,[141000,(B)]
|
||||||
|
DPB T,[041000,(B)]
|
||||||
|
DATAO ETH+4*14+4*2,(B)
|
||||||
|
POPJ P,
|
||||||
|
;XCT EOPKTJ(C) TO WRITE THE FINAL 0-3 BYTES OF DATA IN NORMAL MODE
|
||||||
|
EOPKTJ: JFCL ;0
|
||||||
|
DATAO ETH+4*2,(B) ;1, WRITE 2, 0XXX
|
||||||
|
DATAO ETH+4*2,(B) ;2, WRITE 2, 01XX
|
||||||
|
DATAO ETH+4*10+4*2,(B) ;3, WRITE 4, 012X
|
||||||
|
]
|
||||||
|
;AN ARP-REQ IS ALREADY IN FLIGHT
|
||||||
|
EOPKTK: MOVEM A,EOSAV ;SAVE PKT FOR NEXT TIME WE ARE HERE
|
||||||
|
MOVEM B,EOCHS
|
||||||
|
JRST EOPKTX
|
||||||
|
;WE KNOW NOTHING ABOUT THIS IA, START GETTING AN IA->EA MAPPING
|
||||||
|
EOPKTL: MOVEM A,EOSAV ;SAVE PKT FOR NEXT TIME WE ARE HERE
|
||||||
|
MOVEM B,EOCHS
|
||||||
|
PUSHJ P,ARPADD ;MAKE AN ENTRY IN THE ARP TABLE
|
||||||
|
JRST EOPKTX ;CAN'T, TRY AGAIN LATER
|
||||||
|
DATAO ETH+4*1,[004270,,0] ;S0_TX_FIFOR
|
||||||
|
DATAO ETH+4*10+4*2,[EBCEA0] ;DST ETH ADDR (BROADCAST)
|
||||||
|
DATAO ETH+4*2,[EBCEA1]
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC ETH ADDR (ME)
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*2,[20030000000] ;0806 (ARP)
|
||||||
|
DATAO ETH+4*10+4*2,[4100000] ;0001 (ETH), 0800 (IP)
|
||||||
|
DATAO ETH+4*10+4*2,[14020000020];06 (HW LEN), 04 (SW LEN), 0001 (REQ)
|
||||||
|
DATAO ETH+4*10+4*2,[ETHEA0] ;SRC ETH/IP ADDRS (ME)
|
||||||
|
DATAO ETH+4*2,[ETHEA1]
|
||||||
|
DATAO ETH+4*10+4*2,[ETHUS3_4]
|
||||||
|
DATAO ETH+4*10+4*2,[0] ;DST ETH/IP ADDRS (IA=REMOTE, EA=0)
|
||||||
|
DATAO ETH+4*2,[0]
|
||||||
|
DATAO ETH+4*10+4*2,C
|
||||||
|
MOVEI R,12.+2.+28. ;SEND PKT
|
||||||
|
;SEND A PKT. THE DATA IS IN THE TX FIFO. THE LEN IS IN R.
|
||||||
|
EOPKTS: DATAO ETH+4*1,[004200,,0] ;S0_TX_WRSR0:S0_TX_WRSR2 <- 0:LEN
|
||||||
|
DATAO ETH+4*2,[0]
|
||||||
|
DATAO ETH+4*1,[004210,,0]
|
||||||
|
LSH R,20.
|
||||||
|
DATAO ETH+4*2,R
|
||||||
|
DATAO ETH+4*1,[004010,,0] ;S0_CR <- SEND
|
||||||
|
DATAO ETH+4*2,[000200,,0]
|
||||||
|
SETOM EOBSY ;MARK OUTPUT SIDE AS BUSY
|
||||||
|
;EVERYTHING COMES HERE TO RESTORE AND RETURN
|
||||||
|
EOPKTX: POPJ P,
|
||||||
|
|
||||||
|
IFN CHETHP,[
|
||||||
|
;CALLED TO PUT THE IP CHECKSUM OF C/D/E/I/J (AN IP HDR) INTO TT
|
||||||
|
;THE WORDS IN C/D/E/I/J ARE IN HW FMT, BUT ARE CONVERTED TO SW FMT BEFORE THEY GET
|
||||||
|
;ADDED INTO THE CHECKSUM, SO THAT CARRIES CAN PILE UP IN BITS 00..03
|
||||||
|
EIPCS: MOVE TT,C ;WORD 0
|
||||||
|
LSH TT,-4
|
||||||
|
MOVE T,D ;WORD 1
|
||||||
|
LSH T,-4
|
||||||
|
ADD TT,T
|
||||||
|
MOVE T,E ;WORD 2
|
||||||
|
LSH T,-4
|
||||||
|
ADD TT,T
|
||||||
|
MOVE T,I ;WORD 3
|
||||||
|
LSH T,-4
|
||||||
|
ADD TT,T
|
||||||
|
MOVE T,J ;WORD 4
|
||||||
|
LSH T,-4
|
||||||
|
EIPCS0: ADD TT,T
|
||||||
|
CAIG TT,177777 ;FOLD INTO LO HALF
|
||||||
|
JRST EIPCS1
|
||||||
|
MOVE T,TT
|
||||||
|
LSH T,-16. ;HI HALF + CARRIES
|
||||||
|
ANDI TT,177777 ;LO HALF
|
||||||
|
JRST EIPCS0
|
||||||
|
EIPCS1: XORI TT,177777 ;FINAL 1'S COMPLEMENT
|
||||||
|
POPJ P,
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user