A2osX/LIB/LIBTCPIP.S.FRM.txt

258 lines
5.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*/--------------------------------------
* #FRM.NewA
* ##In:
* A = S.IP.PROTOCOL.???
* ##Out:
* Y,A = Frame PTR
* X = hMem
*\--------------------------------------
FRM.NewA sta .1+2
>PUSHWI K.ETH.FRAME.LEN
>PUSHBI S.MEM.F.INIT0
>SYSCALL GetMem
bcs .9
>STYA ZPFrameBase
ldy #S.IP.PROTOCOL
.1 lda #$ff
sta (ZPFrameBase),y
lda DevFlags
and #S.DEVSTAT.NET.FLAGS.IPOFFLOAD
bne .9
ldy #S.ETH.ETHERTYPE
lda /S.ETH.ETHERTYPE.IP
sta (ZPFrameBase),y
iny
lda #S.ETH.ETHERTYPE.IP
sta (ZPFrameBase),y
ldy #S.IP.V.IHL.DSCP.ECN
lda #$45
sta (ZPFrameBase),y
iny
lda #$0
sta (ZPFrameBase),y
ldy #S.IP.IDENTIFICATION
sta (ZPFrameBase),y
inc
iny
sta (ZPFrameBase),y
dec
ldy #S.IP.FRAGMENT.FLAGS
sta (ZPFrameBase),y
iny
sta (ZPFrameBase),y
ldy #S.IP.TTL
lda #K.IP.TTL
sta (ZPFrameBase),y
>LDYA ZPFrameBase
.9 rts
*--------------------------------------
FRM.SendICMP >PUSHW ZPFrameLen
>PUSHWI S.ICMP.TYPE-2
ldy #S.ICMP.CHECKSUM
lda #0
sta (ZPFrameBase),y
iny
sta (ZPFrameBase),y
jsr IP.ComputeChecksum
phy
ldy #S.ICMP.CHECKSUM
sta (ZPFrameBase),y
iny
pla
sta (ZPFrameBase),y
bra FRM.SendIP
*--------------------------------------
FRM.SendTCP
bra FRM.SendIP
*--------------------------------------
FRM.SendUDP ldy #S.UDP.LENGTH+1
lda ZPFrameLen
sec
sbc #S.IP-2
sta (ZPFrameBase),y
dey
lda ZPFrameLen+1
sbc /S.IP-2
sta (ZPFrameBase),y
*--------------------------------------
FRM.SendIP ldx #3 Copy SRC.IP even if IP offload
ldy #S.IP.SRC+3 for proper UDP/TCP CRC calculation
.1 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase),y
dey
dex
bpl .1
lda DevFlags
and #S.DEVSTAT.NET.FLAGS.IPOFFLOAD
bne .21
ldy #S.IP.TOTAL.LENGTH+1
lda ZPFrameLen
sec
sbc #S.ETH-2
sta (ZPFrameBase),y
dey
lda ZPFrameLen+1
sbc /S.ETH-2
sta (ZPFrameBase),y
lda #0
ldy #S.IP.HDR.CHECKSUM
sta (ZPFrameBase),y
iny
sta (ZPFrameBase),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 (ZPFrameBase),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameBase),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 (ZPFrameBase),y
iny
lda IP.CHECKSUM+1
adc #0
eor #$FF
sta (ZPFrameBase),y
.21 ldy #S.IP.PROTOCOL
lda (ZPFrameBase),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.DEVSTAT.NET.FLAGS.ARPOFFLOAD
bne .5
jsr IP.SetDestMAC
bcs FRM.Queue
.5 >LDYA ZPFrameBase
ldx #DEVMGR.WRITEBLOCK
jsr NetDevJmp
bcs FRM.Queue
lda hFrameOut
beq .9
>SYSCALL FreeMemA
clc
.9 rts
*--------------------------------------
FRM.Queue ldy hFrameOut 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 hFrameOut
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 GetMemPtrA
>STYA ZPFrameBase
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 >LDYA ZPFrameBase try sending again to DRV
ldx #DEVMGR.WRITEBLOCK
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 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.GetLen lda (ZPFrameBase) Get Frame Len
sta ZPFrameLen
ldy #1
lda (ZPFrameBase),y
sta ZPFrameLen+1
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.FRM
LOAD LIB/LIBTCPIP.S
ASM