1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-20 16:38:16 +00:00

WIP: Transmits first packet back successfully

This commit is contained in:
Adam Sampson
2018-08-10 16:49:55 +01:00
parent 8dfde72949
commit 038c153291

View File

@@ -16,6 +16,7 @@
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;FIXME The big one - interrupts? Compare with CHAOS...
;FIXME Use the style from TCP - this is a bit of a mix at the moment
;;; Generic Ethernet support
@@ -240,14 +241,103 @@ ETHRX5: POP P,H
;Send an IP packet (like IPKSNC for CHAOS).
;A contains datagram struct.
;Clobbers A, B.
;
ETHTXI: MOVE B,PK.DST(A)
BUG INFO,[ethtxi A=],OCT,A,[ dest=],OCT,B
ETHTXI:
PUSH P,C
PUSH P,D
PUSH P,E
PUSH P,I
PUSH P,R
; We'll either send this packet, or send an ARP request.
; Either way we'll need our MAC address in the Ethernet header.
LDB I,[%NEAT"HA01+ETHME]
LDB R,[%NEAT"HA2+ETHME]
DPB I,[%NEH"SMAC01+ETHHBF]
DPB R,[%NEH"SMAC2+ETHHBF]
; Search the ARP table for the destination address.
MOVE C,PK.DST(A)
BUG INFO,[ethtxi A=],OCT,A,[ dest=],OCT,C
;FIXME would this loop (and at ETHRX1) be simpler with AOBJN?
MOVE E,ETHATS
SOS E
ETHTX1: JUMPL E,ETHTX2 ;Any more entries to check?
LDB B,[%NEAT"PA+ETHAT(E)]
CAMN B,C ;Match?
JRST ETHTX3 ; Yes
SOJA E,ETHTX1
ETHTX2: ;Not found in ARP table
; Destination address wasn't in the ARP table.
; Send an ARP request instead.
DPB C,[%NEAH"TPA+ETHABF]
MOVEI C,[ETHUS] ;FIXME use ETHME
DPB C,[%NEAH"SPA1+ETHABF]
LSH C,-16.
DPB C,[%NEAH"SPA0+ETHABF]
MOVEI C,%NETYP"ARP ;Ethernet type = ARP
DPB C,[%NEH"TYPE+ETHHBF]
SETOM C ;Destination MAC is all 1s
DPB C,[%NEH"DMAC0+ETHHBF]
DPB C,[%NEH"DMAC12+ETHHBF]
;FIXME Given this is so short, we could keep a separate buffer set up for ARP
;requests rather than building it each time...
DPB C,[%NEAH"THA0+ETHABF]
DPB C,[%NEAH"THA12+ETHABF]
DPB I,[%NEAH"SHA01+ETHABF]
DPB R,[%NEAH"SHA2+ETHABF]
MOVEI C,%NEAHR"ETHER
DPB C,[%NEAH"HRD+ETHABF]
MOVEI C,%NETYPE"IP
DPB C,[%NEAH"PRO+ETHABF]
MOVEI C,6
DPB C,[%NEAH"HLN+ETHABF]
MOVEI C,4
DPB C,[%NEAH"PLN+ETHABF]
MOVEI C,%NEAOP"REQ
DPB C,[%NEAH"OP+ETHABF]
MOVEI R,ETHABF ;Data pointer
MOVEI I,%NEAH"LENGTH ;Length in bytes
JRST ETHTX5 ;Send it!
ETHTX3: ;Found MAC in ARP table
; Found the destination address in the ARP table. Send it!
LDB C,[%NEAT"HA01+ETHAT(E)]
LDB D,[%NEAT"HA2+ETHAT(E)]
BUG INFO,[found MAC in ARP table ],OCT,C,[ ],OCT,D
MOVE E,C
LSH C,16.
DPB C,[%NEH"DMAC0+ETHHBF]
LSH E,-16.
IOR D,E
DPB D,[%NEH"DMAC12+ETHHBF]
MOVEI C,%NETYP"IP
DPB C,[%NEH"TYPE+ETHHBF]
MOVE R,PK.BUF(A) ;Data pointer
LDB I,[IP$TOL(R)] ;Length in bytes, from the IP header
ETHTX5: PUSHJ P,ETHTX ;Send it!
POP P,R
POP P,I
POP P,E
POP P,D
POP P,C
POPJ P,
;Send an Ethernet packet (if possible).
;Unpacked header is in ETHHBF. R contains pointer to unpacked data.
;I contains data length in bytes.
;Clobbers A, B, C, TT, I.
;
;FIXME IFN UNAP,...
ETHTX: BUG INFO,[ethtx ptr ],OCT,R,[ len ],OCT,I
@@ -666,10 +756,4 @@ UNATX: ;BUG INFO,[unatx desc ],OCT,D,[ length ],OCT,I
POPJ P,
;FIXME
;Stylewise, trying to match IMP...
;See:
;receive packet - IMPRM (uses IPGIPT, IPRDGM)
;send packet - IMPOB0 (uses IPGIOQ)
] ;UNAP