A2osX/LIB/LIBTCPIP.S.FRM.txt

348 lines
6.3 KiB
Plaintext
Raw Normal View History

2017-12-22 21:24:30 +00:00
NEW
PREFIX /A2OSX.BUILD
2017-12-22 21:24:30 +00:00
AUTO 4,1
.LIST OFF
*--------------------------------------
2018-10-08 15:41:00 +00:00
FRM.GetTargetSKT.TCPUDP
2018-10-01 05:48:42 +00:00
ldy #S.TCPUDP.SRCPORT
lda (ZPFrameInPtr),y
sta SKT.REM.ADDR+S.SOCKADDR.PORT+1
iny
lda (ZPFrameInPtr),y
sta SKT.REM.ADDR+S.SOCKADDR.PORT
iny #S.TCPUDP.DSTPORT
lda (ZPFrameInPtr),y
sta SKT.LOC.ADDR+S.SOCKADDR.PORT+1
iny
lda (ZPFrameInPtr),y
sta SKT.LOC.ADDR+S.SOCKADDR.PORT
2018-10-08 15:41:00 +00:00
FRM.GetTargetSKT.RAW
2018-10-01 05:48:42 +00:00
ldy #S.IP.SRC+3
ldx #3
2018-10-08 15:41:00 +00:00
2018-10-01 05:48:42 +00:00
.1 lda (ZPFrameInPtr),y
sta SKT.REM.ADDR+S.SOCKADDR.ADDR,x
dey
dex
bpl .1
ldy #S.IP.DST+3
ldx #3
2018-10-08 15:41:00 +00:00
2018-10-01 05:48:42 +00:00
.2 lda (ZPFrameInPtr),y
sta SKT.LOC.ADDR+S.SOCKADDR.ADDR,x
dey
dex
bpl .2
2018-10-08 15:41:00 +00:00
2018-10-01 05:48:42 +00:00
rts
*--------------------------------------
2018-09-21 15:28:46 +00:00
* FRM.NewIP
2017-02-13 07:26:18 +00:00
* In:
* Y,A = DataLen
* X = S.IP.PROTOCOL.xxx
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
2017-02-13 07:26:18 +00:00
FRM.NewIP stx .8+1
>STYA ZPDataOutLen
cpx #S.IP.PROTOCOL.TCP
2017-02-13 07:26:18 +00:00
bne .1
2018-07-23 06:28:47 +00:00
lda #S.TCP
2017-02-13 07:26:18 +00:00
bra .4
.1 cpx #S.IP.PROTOCOL.UDP
bne .2
2018-07-23 06:28:47 +00:00
lda #S.UDP
2017-02-13 07:26:18 +00:00
bra .4
2018-07-23 06:28:47 +00:00
.2 lda #S.IP
2017-02-13 07:26:18 +00:00
bra .4
2018-07-24 06:24:23 +00:00
.4 sta .5+1 save Header len for reset later
2017-02-13 07:26:18 +00:00
clc
adc ZPDataOutLen
sta ZPFrameOutLen
2018-07-23 06:28:47 +00:00
tay
2017-02-13 07:26:18 +00:00
lda #0
adc ZPDataOutLen+1
sta ZPFrameOutLen+1
2018-07-20 11:51:08 +00:00
>SYSCALL getmem
bcs .9
stx hFrameOut
>STYA ZPFrameOutPtr
2018-07-23 06:28:47 +00:00
ldy #0
2017-02-13 07:26:18 +00:00
.5 ldx #$ff Self Modified, header length
lda #0
.6 sta (ZPFrameOutPtr),y
iny
dex
bne .6
tya
* clc
adc ZPFrameOutPtr
sta ZPDataOutPtr
lda #0
adc ZPFrameOutPtr+1
sta ZPDataOutPtr+1
2018-07-23 06:28:47 +00:00
lda DCB.NIC+S.DCB.NIC.FLAGS
and #S.DCB.NIC.FLAGS.IPOFFLOAD
2017-02-13 07:26:18 +00:00
bne .7
2016-04-18 20:16:54 +00:00
ldy #S.ETH.ETHERTYPE
lda /S.ETH.ETHERTYPE.IP
sta (ZPFrameOutPtr),y
iny
lda #S.ETH.ETHERTYPE.IP
sta (ZPFrameOutPtr),y
ldy #S.IP.V.IHL.DSCP.ECN
lda #$45
sta (ZPFrameOutPtr),y
* iny
* lda #$0
* sta (ZPFrameOutPtr),y
2017-02-13 07:26:18 +00:00
* ldy #S.IP.FRAGMENT.FLAGS
* sta (ZPFrameOutPtr),y
* iny
* sta (ZPFrameOutPtr),y
2017-02-13 07:26:18 +00:00
ldy #S.IP.IDENTIFICATION+1
lda IP.ID
ldx IP.ID+1
inc
bne .61
inx
stx IP.ID+1
.61 sta IP.ID
sta (ZPFrameOutPtr),y
dey
txa
sta (ZPFrameOutPtr),y
ldy #S.IP.TTL
lda #K.IP.TTL
sta (ZPFrameOutPtr),y
2017-02-13 07:26:18 +00:00
.7 ldy #S.IP.PROTOCOL
.8 lda #$ff
sta (ZPFrameOutPtr),y
.9 rts
*--------------------------------------
FRM.SendIP ldx #3 Copy SRC.IP even if IP offload
2016-04-18 20:16:54 +00:00
ldy #S.IP.SRC+3 for proper UDP/TCP CRC calculation
.1 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameOutPtr),y
dey
dex
bpl .1
2018-07-23 06:28:47 +00:00
lda DCB.NIC+S.DCB.NIC.FLAGS
and #S.DCB.NIC.FLAGS.IPOFFLOAD
2016-04-18 20:16:54 +00:00
bne .21
ldy #S.IP.TOTAL.LENGTH+1
lda ZPFrameOutLen
sec
2018-07-26 06:03:49 +00:00
sbc #S.ETH
sta (ZPFrameOutPtr),y
dey
lda ZPFrameOutLen+1
2018-07-26 06:03:49 +00:00
sbc /S.ETH
sta (ZPFrameOutPtr),y
lda #0
ldy #S.IP.HDR.CHECKSUM
sta (ZPFrameOutPtr),y
iny
sta (ZPFrameOutPtr),y
2018-09-25 06:25:32 +00:00
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 (ZPFrameOutPtr),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameOutPtr),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 (ZPFrameOutPtr),y
iny
lda IP.CHECKSUM+1
adc #0
eor #$FF
sta (ZPFrameOutPtr),y
2016-04-18 20:16:54 +00:00
.21 ldy #S.IP.PROTOCOL
lda (ZPFrameOutPtr),y
cmp #S.IP.PROTOCOL.TCP
bne .3
2018-09-21 15:28:46 +00:00
jsr IP.ComputeTCPChecksum
2017-02-13 07:26:18 +00:00
bra .5
.3 cmp #S.IP.PROTOCOL.UDP
bne .4
lda ZPFrameOutLen
sec
2018-07-23 06:28:47 +00:00
sbc #S.IP
ldy #S.UDP.LENGTH+1
sta (ZPFrameOutPtr),y
lda ZPFrameOutLen+1
2018-07-23 06:28:47 +00:00
sbc /S.IP
dey
sta (ZPFrameOutPtr),y
2018-09-21 15:28:46 +00:00
jsr IP.ComputeUDPChecksum
2017-02-13 07:26:18 +00:00
bra .5
2017-02-13 07:26:18 +00:00
.4 cmp #S.IP.PROTOCOL.ICMP
bne .5
2018-09-21 15:28:46 +00:00
jsr IP.ComputeICMPChecksum
2017-02-13 07:26:18 +00:00
2018-07-23 06:28:47 +00:00
.5 lda DCB.NIC+S.DCB.NIC.FLAGS
and #S.DCB.NIC.FLAGS.ARPOFFLOAD
2017-02-13 07:26:18 +00:00
bne .6
jsr IP.SetDestMAC
bcs FRM.Queue
2018-08-08 15:13:37 +00:00
.6 jsr FRM.Send
bcs FRM.Queue
2017-01-29 21:47:19 +00:00
lda hFrameOut
beq .9
2018-07-18 15:30:42 +00:00
>SYSCALL FreeMem
2018-09-21 15:28:46 +00:00
stz hFrameOut
clc
.9 rts
*--------------------------------------
2017-01-29 21:47:19 +00:00
FRM.Queue ldy hFrameOut no hFrame, cannot queue for retry
beq .9
ldx FRM.QUEUE.Head
inx
cpx #K.FRMQUEUE.SIZE
bne .1
2018-09-03 06:01:07 +00:00
ldx #0
2018-09-03 06:01:07 +00:00
.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
2017-01-29 21:47:19 +00:00
lda hFrameOut
sta FRM.QUEUE.hMem,y
2018-07-23 15:28:42 +00:00
lda ZPFrameOutLen
2018-09-03 06:01:07 +00:00
sta FRM.QUEUE.LenL,y
2018-07-23 15:28:42 +00:00
lda ZPFrameOutLen+1
2018-09-03 06:01:07 +00:00
sta FRM.QUEUE.LenH,y
clc
rts
.9 sec
rts
*--------------------------------------
FRM.Retry ldx FRM.QUEUE.Tail
.10 cpx FRM.QUEUE.Head
2018-07-24 06:24:23 +00:00
beq .8 Queue is empty, exit...
lda FRM.QUEUE.hMem,x
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
>STYA ZPFrameOutPtr
ldx FRM.QUEUE.Tail
2018-08-08 15:13:37 +00:00
lda FRM.QUEUE.LenL,x
sta ZPFrameOutLen
lda FRM.QUEUE.LenH,x
sta ZPFrameOutLen+1
lda FRM.QUEUE.State,x
2018-09-03 06:01:07 +00:00
cmp #ERR.ARP.PENDING
bne .1
jsr IP.SetDestMAC Err is ARP or higher, retry getting MAC
bcs .2 still error getting dest MAC
2018-08-08 15:13:37 +00:00
.1 jsr FRM.Send try sending again to DRV
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
2018-07-18 15:30:42 +00:00
>SYSCALL FreeMem
2018-09-03 06:01:07 +00:00
ldx FRM.QUEUE.Tail
inx
cpx #K.FRMQUEUE.SIZE
bne .5
2018-09-03 06:01:07 +00:00
ldx #0
2018-09-03 06:01:07 +00:00
.5 stx FRM.QUEUE.Tail
bra .10
2016-03-16 16:37:02 +00:00
.8 rts
*--------------------------------------
2018-08-08 15:13:37 +00:00
FRM.Send >PUSHW ZPFrameOutLen
>PUSHW ZPFrameOutPtr
lda IPCFG+S.IPCFG.hFD
2018-07-23 06:28:47 +00:00
2018-08-08 15:13:37 +00:00
>SYSCALL write
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/LIB/LIBTCPIP.S.FRM
LOAD /A2OSX.SRC/LIB/LIBTCPIP.S
ASM