mirror of
https://github.com/A2osX/A2osX.git
synced 2024-08-29 20:29:34 +00:00
325 lines
6.4 KiB
Plaintext
325 lines
6.4 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.SRC
|
||
NEW
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
RCVD.FRAMEA sta hFrame1
|
||
>SYSCALL SYS.GetMemPtrA
|
||
>STYA ZPFrameBase1
|
||
jsr FRM.GetLen1
|
||
|
||
ldy #S.ETH.ETHERTYPE
|
||
lda (ZPFrameBase1),y
|
||
tax
|
||
iny
|
||
lda (ZPFrameBase1),y
|
||
|
||
cmp #S.ETH.ETHERTYPE.ARP
|
||
bne .1
|
||
cpx /S.ETH.ETHERTYPE.ARP
|
||
bne .1
|
||
|
||
jmp ARP.IN
|
||
|
||
.1 cmp #S.ETH.ETHERTYPE.IP
|
||
bne .9
|
||
cpx /S.ETH.ETHERTYPE.IP
|
||
bne .9
|
||
|
||
jmp IP.IN
|
||
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
* Out:
|
||
* Y,A = Frame PTR
|
||
* X = hMem
|
||
*--------------------------------------
|
||
NEW.ICMP.FRAME jsr NEW.IP.FRAME
|
||
bcs .9
|
||
ldy #S.IP.PROTOCOL
|
||
lda #S.IP.PROTOCOL.ICMP
|
||
sta (ZPFrameBase1),y
|
||
>LDYA ZPFrameBase1
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
* Out:
|
||
* Y,A = Frame PTR
|
||
* X = hMem
|
||
*--------------------------------------
|
||
NEW.TCP.FRAME jsr NEW.IP.FRAME
|
||
bcs .9
|
||
ldy #S.IP.PROTOCOL
|
||
lda #S.IP.PROTOCOL.TCP
|
||
sta (ZPFrameBase1),y
|
||
>LDYA ZPFrameBase1
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
* Out:
|
||
* Y,A = Frame PTR
|
||
* X = hMem
|
||
*--------------------------------------
|
||
NEW.UDP.FRAME jsr NEW.IP.FRAME
|
||
bcs .9
|
||
ldy #S.IP.PROTOCOL
|
||
lda #S.IP.PROTOCOL.UDP
|
||
sta (ZPFrameBase1),y
|
||
>LDYA ZPFrameBase1
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
* Out:
|
||
* Y,A = Frame PTR
|
||
* X = hMem
|
||
*--------------------------------------
|
||
NEW.IP.FRAME >PUSHWI K.ETH.FRAME.LEN
|
||
>PUSHBI S.MEM.F.INIT0
|
||
>SYSCALL SYS.GetMem
|
||
bcs .9
|
||
>STYA ZPFrameBase1
|
||
|
||
ldy #S.ETH.ETHERTYPE
|
||
lda /S.ETH.ETHERTYPE.IP
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
lda #S.ETH.ETHERTYPE.IP
|
||
sta (ZPFrameBase1),y
|
||
|
||
ldy #S.IP.V.IHL.DSCP.ECN
|
||
lda #$45
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
lda #$0
|
||
sta (ZPFrameBase1),y
|
||
|
||
ldy #S.IP.IDENTIFICATION
|
||
sta (ZPFrameBase1),y
|
||
inc
|
||
iny
|
||
sta (ZPFrameBase1),y
|
||
dec
|
||
ldy #S.IP.FRAGMENT.FLAGS
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
sta (ZPFrameBase1),y
|
||
|
||
ldy #S.IP.TTL
|
||
lda #K.IP.TTL
|
||
sta (ZPFrameBase1),y
|
||
>LDYA ZPFrameBase1
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
SEND.ICMP.FRAME >PULLW ZPFrameBase1
|
||
jsr FRM.GetLen1
|
||
stz hFrame1
|
||
SEND.ICMP.FRAME.I
|
||
>PUSHW ZPFrameLen1
|
||
>PUSHWI S.ICMP.TYPE-2
|
||
|
||
ldy #S.ICMP.CHECKSUM
|
||
lda #0
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
sta (ZPFrameBase1),y
|
||
|
||
jsr IP.ComputeChecksum
|
||
|
||
phy
|
||
ldy #S.ICMP.CHECKSUM
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
pla
|
||
sta (ZPFrameBase1),y
|
||
|
||
bra SEND.IP.FRAME.I
|
||
*--------------------------------------
|
||
SEND.TCP.FRAME >PULLW ZPFrameBase1
|
||
jsr FRM.GetLen1
|
||
stz hFrame1
|
||
SEND.TCP.FRAME.I
|
||
|
||
bra SEND.IP.FRAME.I
|
||
*--------------------------------------
|
||
SEND.UDP.FRAME >PULLW ZPFrameBase1
|
||
jsr FRM.GetLen1
|
||
stz hFrame1
|
||
SEND.UDP.FRAME.I
|
||
ldy #S.UDP.LENGTH+1
|
||
lda ZPFrameLen1
|
||
sec
|
||
sbc #S.IP-2
|
||
sta (ZPFrameBase1),y
|
||
dey
|
||
lda ZPFrameLen1+1
|
||
sbc /S.IP-2
|
||
sta (ZPFrameBase1),y
|
||
bra SEND.IP.FRAME.I
|
||
*--------------------------------------
|
||
SEND.IP.FRAME >PULLW ZPFrameBase1
|
||
jsr FRM.GetLen1
|
||
stz hFrame1
|
||
SEND.IP.FRAME.I ldx #3
|
||
ldy #S.IP.SRC+3
|
||
|
||
.1 lda IPCFG+S.IPCFG.IP,x
|
||
sta (ZPFrameBase1),y
|
||
dey
|
||
dex
|
||
bpl .1
|
||
|
||
ldy #S.IP.TOTAL.LENGTH+1
|
||
lda ZPFrameLen1
|
||
sec
|
||
sbc #S.ETH-2
|
||
sta (ZPFrameBase1),y
|
||
dey
|
||
lda ZPFrameLen1+1
|
||
sbc /S.ETH-2
|
||
sta (ZPFrameBase1),y
|
||
|
||
lda #0
|
||
ldy #S.IP.HDR.CHECKSUM
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
sta (ZPFrameBase1),y
|
||
|
||
stz IP.CHECKSUM RESET.IP.CHECKSUM
|
||
stz IP.CHECKSUM+1
|
||
|
||
clc
|
||
|
||
ldy #S.IP.V.IHL.DSCP.ECN
|
||
ldx #10 10 words for IP Header
|
||
|
||
.2 lda (ZPFrameBase1),y
|
||
adc IP.CHECKSUM
|
||
sta IP.CHECKSUM
|
||
|
||
iny
|
||
lda (ZPFrameBase1),y
|
||
adc IP.CHECKSUM+1
|
||
sta IP.CHECKSUM+1
|
||
iny
|
||
dex
|
||
bne .2
|
||
|
||
ldy #S.IP.HDR.CHECKSUM
|
||
lda IP.CHECKSUM
|
||
adc #0
|
||
eor #$FF
|
||
sta (ZPFrameBase1),y
|
||
iny
|
||
lda IP.CHECKSUM+1
|
||
adc #0
|
||
eor #$FF
|
||
sta (ZPFrameBase1),y
|
||
|
||
ldy #S.IP.PROTOCOL
|
||
lda (ZPFrameBase1),y
|
||
cmp #S.IP.PROTOCOL.TCP
|
||
bne .3
|
||
jsr TCP.ComputeChecksum
|
||
bra .4
|
||
|
||
.3 cmp #S.IP.PROTOCOL.UDP
|
||
bne .4
|
||
jsr UDP.ComputeChecksum
|
||
|
||
.4 lda DevFlags
|
||
and #S.DEVINFO.NET.FLAGS.ARPOFFLOAD
|
||
bne .5
|
||
|
||
jsr IP.SetDestMAC
|
||
bcs FRM.Queue
|
||
|
||
.5 >PUSHW ZPFrameBase1
|
||
ldx #DEVMGR.NET.SEND
|
||
jsr NetDevJmp
|
||
bcs FRM.Queue
|
||
lda hFrame1
|
||
beq .9
|
||
>SYSCALL SYS.FreeMemA
|
||
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
FRM.Queue ldy hFrame1 no hFrame, cannot queue for retry
|
||
beq .9
|
||
|
||
ldx FRM.QUEUE.Head
|
||
inx
|
||
cpx #K.FRMQUEUE.SIZE
|
||
bne .1
|
||
ldx #0
|
||
.1 cpx FRM.QUEUE.Tail
|
||
beq .9
|
||
ldy FRM.QUEUE.Head
|
||
stx FRM.QUEUE.Head
|
||
|
||
sta FRM.QUEUE.State,y
|
||
lda #K.FRMSEND.RETRY
|
||
sta FRM.QUEUE.Retry,y
|
||
lda hFrame1
|
||
sta FRM.QUEUE.hMem,y
|
||
clc
|
||
rts
|
||
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
FRM.Retry ldx FRM.QUEUE.Tail
|
||
|
||
.10 cpx FRM.QUEUE.Head
|
||
beq .8 Queue is empty, exit....
|
||
lda FRM.QUEUE.hMem,x
|
||
>SYSCALL SYS.GetMemPtrA
|
||
>STYA ZPFrameBase1
|
||
|
||
ldx FRM.QUEUE.Tail
|
||
lda FRM.QUEUE.State,x
|
||
cmp #ERR.DEV+1 Device error ?
|
||
bcc .1 yes, retry sending...
|
||
jsr IP.SetDestMAC Err is ARP or higher, retry getting MAC
|
||
bcs .2 still error getting dest MAC
|
||
|
||
.1 >PUSHW ZPFrameBase1 try sending again to DRV
|
||
ldx #DEVMGR.NET.SEND
|
||
jsr NetDevJmp
|
||
bcc .3
|
||
|
||
.2 ldx FRM.QUEUE.Tail save error...
|
||
sta FRM.QUEUE.State,x
|
||
dec FRM.QUEUE.Retry,x
|
||
bne .8 exit....until next run!
|
||
|
||
.3 ldx FRM.QUEUE.Tail Success,or max retry, discard entry
|
||
lda FRM.QUEUE.hMem,x
|
||
>SYSCALL SYS.FreeMemA
|
||
|
||
.4 ldx FRM.QUEUE.Tail
|
||
inx
|
||
cpx #K.FRMQUEUE.SIZE
|
||
bne .5
|
||
ldx #0
|
||
.5 stx FRM.QUEUE.Tail
|
||
bra .10
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
FRM.GetLen1 lda (ZPFrameBase1) Get Frame Len
|
||
sta ZPFrameLen1
|
||
ldy #1
|
||
lda (ZPFrameBase1),y
|
||
sta ZPFrameLen1+1
|
||
rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE LIB/LIBTCPIP.S.FRM
|
||
LOAD LIB/LIBTCPIP.S
|
||
ASM
|