mirror of
https://github.com/PDP-10/its.git
synced 2026-04-24 19:40:28 +00:00
WIP: Feeds packets into IP, and gets back to ETHTXI
This commit is contained in:
@@ -15,6 +15,8 @@
|
|||||||
;;; You should have received a copy of the GNU General Public License
|
;;; You should have received a copy of the GNU General Public License
|
||||||
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;FIXME The big one - interrupts? Compare with CHAOS...
|
||||||
|
|
||||||
;;; Generic Ethernet support
|
;;; Generic Ethernet support
|
||||||
|
|
||||||
%NE32==37777777777
|
%NE32==37777777777
|
||||||
@@ -88,11 +90,6 @@ ETHATS: 0 ;Number of entries in ARP table
|
|||||||
|
|
||||||
BBLK
|
BBLK
|
||||||
|
|
||||||
IPOGO: BUG INFO,[ipogo]
|
|
||||||
POPJ P,
|
|
||||||
IPKSNE: BUG INFO,[ipksne]
|
|
||||||
POPJ P,
|
|
||||||
|
|
||||||
;Process a received packet.
|
;Process a received packet.
|
||||||
;R is buffer. Length in bytes is I. May clobber A-I, R.
|
;R is buffer. Length in bytes is I. May clobber A-I, R.
|
||||||
;
|
;
|
||||||
@@ -104,7 +101,7 @@ ETHRX: MOVEI TT,ETHHBF ;Unpack Ethernet header into ETHHBF
|
|||||||
ADDI R,%NEH"WORDS ;R points to data
|
ADDI R,%NEH"WORDS ;R points to data
|
||||||
|
|
||||||
LDB A,[%NEH"TYPE+ETHHBF]
|
LDB A,[%NEH"TYPE+ETHHBF]
|
||||||
BUG INFO,[etype=],OCT,A
|
;BUG INFO,[etype=],OCT,A
|
||||||
CAIN A,%NETYP"IP
|
CAIN A,%NETYP"IP
|
||||||
JRST ETHRXI
|
JRST ETHRXI
|
||||||
CAIN A,%NETYP"ARP
|
CAIN A,%NETYP"ARP
|
||||||
@@ -114,7 +111,7 @@ ETHRX: MOVEI TT,ETHHBF ;Unpack Ethernet header into ETHHBF
|
|||||||
|
|
||||||
;Process an ARP packet.
|
;Process an ARP packet.
|
||||||
;
|
;
|
||||||
ETHRXA: BUG INFO,[ARP length ],OCT,I
|
ETHRXA: ;BUG INFO,[ARP length ],OCT,I
|
||||||
CAIGE I,%NEAH"LENGTH ;Check size first
|
CAIGE I,%NEAH"LENGTH ;Check size first
|
||||||
JRST ETHRAS
|
JRST ETHRAS
|
||||||
|
|
||||||
@@ -138,13 +135,13 @@ ETHRXA: BUG INFO,[ARP length ],OCT,I
|
|||||||
LSH A,16.
|
LSH A,16.
|
||||||
LDB B,[%NEAH"SPA1+ETHABF]
|
LDB B,[%NEAH"SPA1+ETHABF]
|
||||||
IOR A,B
|
IOR A,B
|
||||||
BUG INFO,[ARP source addr ],OCT,A
|
;BUG INFO,[ARP source addr ],OCT,A
|
||||||
|
|
||||||
MOVE E,ETHATS ;Is the IP address in the table already?
|
MOVE E,ETHATS ;Is the IP address in the table already?
|
||||||
SOS E
|
SOS E
|
||||||
ETHRX1: JUMPL E,ETHRX2 ;Any more entries to check?
|
ETHRX1: JUMPL E,ETHRX2 ;Any more entries to check?
|
||||||
LDB B,[%NEAT"PA+ETHAT(E)]
|
LDB B,[%NEAT"PA+ETHAT(E)]
|
||||||
BUG INFO,[ARP table entry ],OCT,E,[ of ],OCT,ETHATS,[ is ],OCT,B
|
;BUG INFO,[ARP table entry ],OCT,E,[ of ],OCT,ETHATS,[ is ],OCT,B
|
||||||
CAMN A,B ;Match?
|
CAMN A,B ;Match?
|
||||||
JRST ETHRX3 ; Yes - update it
|
JRST ETHRX3 ; Yes - update it
|
||||||
SOJA E,ETHRX1 ;Prev entry
|
SOJA E,ETHRX1 ;Prev entry
|
||||||
@@ -165,7 +162,7 @@ ETHRX3: DPB A,[%NEAT"PA+ETHAT(E)] ;Store IP address
|
|||||||
BUG INFO,[Set ARP table entry ],OCT,E,[ to ip ],OCT,A,[ mac ],OCT,C,[ ],OCT,D
|
BUG INFO,[Set ARP table entry ],OCT,E,[ to ip ],OCT,A,[ mac ],OCT,C,[ ],OCT,D
|
||||||
|
|
||||||
LDB E,[%NEAH"OP+ETHABF] ;Get op
|
LDB E,[%NEAH"OP+ETHABF] ;Get op
|
||||||
BUG INFO,[ARP op ],OCT,E
|
;BUG INFO,[ARP op ],OCT,E
|
||||||
CAIE E,%NEAOP"REQ ;Is this a request?
|
CAIE E,%NEAOP"REQ ;Is this a request?
|
||||||
POPJ P, ;No - nothing more to do
|
POPJ P, ;No - nothing more to do
|
||||||
|
|
||||||
@@ -173,7 +170,7 @@ ETHRX3: DPB A,[%NEAT"PA+ETHAT(E)] ;Store IP address
|
|||||||
CAME B,[ETHUS] ;Is it our address?
|
CAME B,[ETHUS] ;Is it our address?
|
||||||
POPJ P, ;No - nothing more to do
|
POPJ P, ;No - nothing more to do
|
||||||
|
|
||||||
BUG INFO,[ARP reply]
|
;BUG INFO,[ARP reply]
|
||||||
MOVEI E,%NEAOP"REPLY ;Construct reply packet
|
MOVEI E,%NEAOP"REPLY ;Construct reply packet
|
||||||
DPB E,[%NEAH"OP+ETHABF]
|
DPB E,[%NEAH"OP+ETHABF]
|
||||||
DPB A,[%NEAH"TPA+ETHABF] ;Set sender PA as target PA
|
DPB A,[%NEAH"TPA+ETHABF] ;Set sender PA as target PA
|
||||||
@@ -205,9 +202,47 @@ ETHRAP: BUG INFO,[ARP wrong protocol ],OCT,B
|
|||||||
POPJ P,
|
POPJ P,
|
||||||
|
|
||||||
;Process an IPv4 packet.
|
;Process an IPv4 packet.
|
||||||
|
;May clobber A-I, R.
|
||||||
;
|
;
|
||||||
ETHRXI:
|
ETHRXI: PUSH P,Q ;IP can clobber all of these...
|
||||||
BUG INFO,[IP]
|
PUSH P,J
|
||||||
|
PUSH P,R
|
||||||
|
PUSH P,W
|
||||||
|
PUSH P,H
|
||||||
|
|
||||||
|
MOVE A,I ;Compute number of words
|
||||||
|
AOS A
|
||||||
|
LSH A,-2
|
||||||
|
MOVE C,A
|
||||||
|
;BUG INFO,[IP ipgipt A=],OCT,A
|
||||||
|
PUSHJ P,IPGIPT ;Get IP buffer -> A=datagram struct
|
||||||
|
JRST ETHRX5 ; No buffers
|
||||||
|
|
||||||
|
MOVE B,PK.BUF(A) ;IPGIPT does return this, but in BLKI form...
|
||||||
|
BUG INFO,[IP rx allocated A=],OCT,A,[ B=],OCT,B
|
||||||
|
HRL B,R
|
||||||
|
ADDI C,-1(B)
|
||||||
|
BLTUB B,(C) ;Copy packet
|
||||||
|
|
||||||
|
MOVE B,C ;Words in datagram
|
||||||
|
SETZM C ;Offset to header
|
||||||
|
SETZM J ;Host table index of address (not used)
|
||||||
|
PUSHJ P,IPRDGM
|
||||||
|
|
||||||
|
;BUG INFO,[IP rdgm done]
|
||||||
|
|
||||||
|
ETHRX5: POP P,H
|
||||||
|
POP P,W
|
||||||
|
POP P,R
|
||||||
|
POP P,J
|
||||||
|
POP P,Q
|
||||||
|
POPJ P,
|
||||||
|
|
||||||
|
;Send an IP packet (like IPKSNC for CHAOS).
|
||||||
|
;A contains datagram struct.
|
||||||
|
;
|
||||||
|
ETHTXI: MOVE B,PK.DST(A)
|
||||||
|
BUG INFO,[ethtxi A=],OCT,A,[ dest=],OCT,B
|
||||||
POPJ P,
|
POPJ P,
|
||||||
|
|
||||||
;Send an Ethernet packet (if possible).
|
;Send an Ethernet packet (if possible).
|
||||||
@@ -218,7 +253,7 @@ ETHRXI:
|
|||||||
ETHTX: BUG INFO,[ethtx ptr ],OCT,R,[ len ],OCT,I
|
ETHTX: BUG INFO,[ethtx ptr ],OCT,R,[ len ],OCT,I
|
||||||
PUSHJ P,UNAFF ;Find a free transmit buffer
|
PUSHJ P,UNAFF ;Find a free transmit buffer
|
||||||
POPJ P, ;None left. Give up.
|
POPJ P, ;None left. Give up.
|
||||||
BUG INFO,[ethtx buf ],OCT,B,[ desc ],OCT,D,[ len ],OCT,I
|
;BUG INFO,[ethtx buf ],OCT,B,[ desc ],OCT,D,[ len ],OCT,I
|
||||||
|
|
||||||
MOVE TT,B ;Convert header
|
MOVE TT,B ;Convert header
|
||||||
HRLI TT,ETHHBF
|
HRLI TT,ETHHBF
|
||||||
@@ -232,17 +267,18 @@ ETHTX: BUG INFO,[ethtx ptr ],OCT,R,[ len ],OCT,I
|
|||||||
LSH A,-2
|
LSH A,-2
|
||||||
ADD A,B
|
ADD A,B
|
||||||
MOVE C,TT ;XXX
|
MOVE C,TT ;XXX
|
||||||
BUG INFO,[ethtx data bltbu tt ],OCT,C,[ a ],OCT,A
|
;BUG INFO,[ethtx data bltbu tt ],OCT,C,[ a ],OCT,A
|
||||||
BLTBU TT,(A)
|
BLTBU TT,(A)
|
||||||
|
|
||||||
ADDI I,%NEH"LENGTH-%NEH"PAD ;Add length of header
|
ADDI I,%NEH"LENGTH-%NEH"PAD ;Add length of header
|
||||||
BUG INFO,[ethtx end desc ],OCT,D,[ len ],OCT,I
|
;BUG INFO,[ethtx end desc ],OCT,D,[ len ],OCT,I
|
||||||
JRST UNATX ;Transmit it
|
JRST UNATX ;Transmit it
|
||||||
|
|
||||||
;Check whether the interface is able to send a packet.
|
;Check whether the interface is able to send a packet.
|
||||||
;Skip-return if it is.
|
;Skip-return if it is.
|
||||||
;
|
;
|
||||||
ETHCTS:
|
ETHCTS:
|
||||||
|
BUG INFO,[ethcts]
|
||||||
;FIXME check if we have an ARP entry, and if not, send a request
|
;FIXME check if we have an ARP entry, and if not, send a request
|
||||||
AOS (P)
|
AOS (P)
|
||||||
POPJ P,
|
POPJ P,
|
||||||
@@ -262,6 +298,8 @@ EBLK
|
|||||||
;address and the two Unibus addresses. We could then
|
;address and the two Unibus addresses. We could then
|
||||||
;allocate on the fly while setting up the rings.
|
;allocate on the fly while setting up the rings.
|
||||||
;FIXME The setup stuff might also be cleaner with byte ptrs as above.
|
;FIXME The setup stuff might also be cleaner with byte ptrs as above.
|
||||||
|
;FIXME Or should we just use IP buffers for all of this? They seem to be
|
||||||
|
;half-page-aligned...
|
||||||
|
|
||||||
UNPAGS: BLOCK %UNNPG ;PDP-10 pages: 0,,addr
|
UNPAGS: BLOCK %UNNPG ;PDP-10 pages: 0,,addr
|
||||||
UNPAGU: BLOCK %UNNPG ;Unibus pages: first-addr,,second-addr
|
UNPAGU: BLOCK %UNNPG ;Unibus pages: first-addr,,second-addr
|
||||||
@@ -370,6 +408,7 @@ IFE 0,[
|
|||||||
MOVEI A,%UN0"DNI+%UNCMD"GETPCB ;Ack DNI as it's on after reset
|
MOVEI A,%UN0"DNI+%UNCMD"GETPCB ;Ack DNI as it's on after reset
|
||||||
PUSHJ P,UNACMD ;We've really returned to the caller here
|
PUSHJ P,UNACMD ;We've really returned to the caller here
|
||||||
|
|
||||||
|
;FIXME put IP address in too, use in ARP above
|
||||||
;Get the MAC address for ARP to use
|
;Get the MAC address for ARP to use
|
||||||
MOVE A,UNPAGS
|
MOVE A,UNPAGS
|
||||||
MOVSI TT,%UNAF"RDDPA
|
MOVSI TT,%UNAF"RDDPA
|
||||||
@@ -385,10 +424,10 @@ IFE 0,[
|
|||||||
LSH A,16.
|
LSH A,16.
|
||||||
ILDB B,TT
|
ILDB B,TT
|
||||||
IOR A,B
|
IOR A,B
|
||||||
BUG INFO,[my MAC 01 =],OCT,A
|
;BUG INFO,[my MAC 01 =],OCT,A
|
||||||
DPB A,[%NEAT"HA01+ETHME]
|
DPB A,[%NEAT"HA01+ETHME]
|
||||||
ILDB A,TT
|
ILDB A,TT
|
||||||
BUG INFO,[my MAC 2 =],OCT,A
|
;BUG INFO,[my MAC 2 =],OCT,A
|
||||||
DPB A,[%NEAT"HA2+ETHME]
|
DPB A,[%NEAT"HA2+ETHME]
|
||||||
|
|
||||||
;Set up transmit and receive rings
|
;Set up transmit and receive rings
|
||||||
@@ -600,7 +639,7 @@ UNAFF1: HRRZ A,E ;Wrap index around
|
|||||||
|
|
||||||
HLRZ D,UNTXRP(E) ;Descriptor
|
HLRZ D,UNTXRP(E) ;Descriptor
|
||||||
MOVE A,1(D) ;Is this buffer free? (OWN=0)
|
MOVE A,1(D) ;Is this buffer free? (OWN=0)
|
||||||
BUG INFO,[unaff checking slot ],OCT,E,[ status ],OCT,A
|
;BUG INFO,[unaff checking slot ],OCT,E,[ status ],OCT,A
|
||||||
TLNE A,%UNTD"OWN
|
TLNE A,%UNTD"OWN
|
||||||
JRST [ AOBJN E,UNAFF1 ;Try the next one
|
JRST [ AOBJN E,UNAFF1 ;Try the next one
|
||||||
POPJ P,] ;No buffers free.
|
POPJ P,] ;No buffers free.
|
||||||
@@ -609,7 +648,7 @@ UNAFF1: HRRZ A,E ;Wrap index around
|
|||||||
AOS UNTXRI ; (Doesn't matter if it wraps.)
|
AOS UNTXRI ; (Doesn't matter if it wraps.)
|
||||||
|
|
||||||
HRRZ B,UNTXRP(E) ;Buffer
|
HRRZ B,UNTXRP(E) ;Buffer
|
||||||
BUG INFO,[unaff found free buffer ],OCT,E,[ desc ],OCT,D,[ buff ],OCT,B
|
;BUG INFO,[unaff found free buffer ],OCT,E,[ desc ],OCT,D,[ buff ],OCT,B
|
||||||
AOS (P) ;Skip return
|
AOS (P) ;Skip return
|
||||||
POPJ P,
|
POPJ P,
|
||||||
|
|
||||||
@@ -617,7 +656,7 @@ UNAFF1: HRRZ A,E ;Wrap index around
|
|||||||
;Descriptor in D, data length in bytes in I.
|
;Descriptor in D, data length in bytes in I.
|
||||||
;Clobbers A.
|
;Clobbers A.
|
||||||
;
|
;
|
||||||
UNATX: BUG INFO,[unatx desc ],OCT,D,[ length ],OCT,I
|
UNATX: ;BUG INFO,[unatx desc ],OCT,D,[ length ],OCT,I
|
||||||
HRLM I,0(D) ;Set SLEN
|
HRLM I,0(D) ;Set SLEN
|
||||||
MOVSI A,%UNTD"OWN+%UNTD"STF+%UNTD"ENF
|
MOVSI A,%UNTD"OWN+%UNTD"STF+%UNTD"ENF
|
||||||
IORM A,1(D) ;Set flags
|
IORM A,1(D) ;Set flags
|
||||||
|
|||||||
@@ -799,7 +799,9 @@ IPQCLS: HLRZ I,(R) ; Get IQ idx
|
|||||||
IPQCL1: MOVEI Q,IPUQHD(I)
|
IPQCL1: MOVEI Q,IPUQHD(I)
|
||||||
CALL PKQGF(PK.IP) ; Get first thing queued up
|
CALL PKQGF(PK.IP) ; Get first thing queued up
|
||||||
JUMPE A,[CONO PI,NETON ; Exit if no more.
|
JUMPE A,[CONO PI,NETON ; Exit if no more.
|
||||||
CALRET IPOGO] ; Ensure output fired up.
|
IFN IMPP, CALRET IPOGO ; Ensure output fired up.
|
||||||
|
IFE IMPP, RET
|
||||||
|
]
|
||||||
MOVEI Q,IPOUTQ
|
MOVEI Q,IPOUTQ
|
||||||
CALL PKQPL(PK.IP) ; Put at end of real output queue
|
CALL PKQPL(PK.IP) ; Put at end of real output queue
|
||||||
JRST IPQCL1
|
JRST IPQCL1
|
||||||
@@ -1245,7 +1247,7 @@ IPSNI1: MOVE T,TIME ; Remember that this gateway entry was used
|
|||||||
|
|
||||||
EBLK
|
EBLK
|
||||||
|
|
||||||
; Network Interface tables. Currently only knows about IMP and CHAOS.
|
; Network Interface tables. Currently knows about IMP, CHAOS and Ethernet.
|
||||||
|
|
||||||
NIFIPA: ; IP Address for network interface
|
NIFIPA: ; IP Address for network interface
|
||||||
IFN IMPP, IMPUS3 ; IP address on IMP interface
|
IFN IMPP, IMPUS3 ; IP address on IMP interface
|
||||||
@@ -1268,7 +1270,7 @@ IFN .-NIFIPN-NNIFS, .ERR Wrong size table - NIFIPN
|
|||||||
NIFIPO: ; IP Output routine for network interface
|
NIFIPO: ; IP Output routine for network interface
|
||||||
IFN IMPP, IPKSNA ; Send IP dgm to IMP output
|
IFN IMPP, IPKSNA ; Send IP dgm to IMP output
|
||||||
IFN CHAOSP, IPKSNC ; Send IP dgm to Chaos, may fragment
|
IFN CHAOSP, IPKSNC ; Send IP dgm to Chaos, may fragment
|
||||||
IFN ETHERP, IPKSNE ; Send IP dgm to Ethernet, may fragment
|
IFN ETHERP, ETHTXI ; Send IP dgm to Ethernet, may fragment
|
||||||
IFN .-NIFIPO-NNIFS, .ERR Wrong size table - NIFIPO
|
IFN .-NIFIPO-NNIFS, .ERR Wrong size table - NIFIPO
|
||||||
|
|
||||||
;NIFNAM: ; Interface name (in case of PEEKing someday?)
|
;NIFNAM: ; Interface name (in case of PEEKing someday?)
|
||||||
@@ -1434,13 +1436,6 @@ IPKSC9: MOVE A,J ; The PE
|
|||||||
|
|
||||||
] ; IFN CHAOSP
|
] ; IFN CHAOSP
|
||||||
|
|
||||||
IFN ETHERP,[
|
|
||||||
|
|
||||||
; FIXME write IPKSNE
|
|
||||||
; IFE CHAOSP,with IPOGO
|
|
||||||
|
|
||||||
] ; IFN ETHERP
|
|
||||||
|
|
||||||
IPKSN5: MOVEI Q,IPUQHD+1 ; Put on System Output queue
|
IPKSN5: MOVEI Q,IPUQHD+1 ; Put on System Output queue
|
||||||
MOVE B,(Q) ; Save prev contents of header
|
MOVE B,(Q) ; Save prev contents of header
|
||||||
CALL PKQPL(PK.IP)
|
CALL PKQPL(PK.IP)
|
||||||
|
|||||||
Reference in New Issue
Block a user