LIBTCPIP:Cache expiration, retry count....

This commit is contained in:
Rémy GIBERT 2016-03-20 23:16:01 +01:00
parent de7341b7f9
commit f6adb05c07
7 changed files with 372 additions and 277 deletions

View File

@ -5,6 +5,91 @@ INC 1
AUTO 6
.LIST OFF
*--------------------------------------
ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE
.1 dex
stz ARP.CACHE,x
txa
bne .1
clc
rts
*--------------------------------------
* ARP.QUERY
* In:
* PULLW PTR to IP
* PULLW PTR to MAC (to fill)
* Out:
* CC: hit: MAC filled
* CS: missed
*--------------------------------------
ARP.QUERY >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
ldy #3
.1 lda (ZPPtrIP),y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
bpl .1
jsr ARP.QUERY.I
bcs .9
ldy #5
.2 lda ARP.TmpCache+S.ARPCACHE.MAC,y
sta (ZPPtrMAC),y
dey
bpl .2
clc
.9 rts
*--------------------------------------
* ARP.ADD
* In:
* PULLW PTR to IP
* PULLW PTR to MAC
*--------------------------------------
ARP.ADD >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
stz ARP.TmpCache+S.ARPCACHE.TTL
stz ARP.TmpCache+S.ARPCACHE.TTL+1
ldy #3
.1 lda (ZPPtrIP),y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
bpl .1
ldy #5
.2 lda (ZPPtrMAC),y
sta ARP.TmpCache+S.ARPCACHE.MAC,y
dey
bpl .2
lda #S.ARPCACHE.STATUS.RESOLVED+S.ARPCACHE.STATUS.STATIC
ARP.ADD.I sta ARP.TmpCache
jsr ARP.FIND.BY.IP
bcc .1
jsr ARP.FIND.FREE
.1 ldy #S.ARPCACHE-1
.2 lda ARP.TmpCache,y
sta (ZPCachePtr),y
dey
bpl .2
clc
rts
*--------------------------------------
* ARP.GETCACHE
* Out:
* Y,A = PTR to ARP.CACHE
*--------------------------------------
ARP.GETCACHE >LDYA L.ARP.CACHE
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
ARP.IN ldy #S.ARP.TPA+3
ldx #3
@ -78,53 +163,27 @@ ARP.IN.REP lda #K.ARP.TTL
clc
rts
*--------------------------------------
ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE
.1 dex
stz ARP.CACHE,x
txa
bne .1
clc
rts
*--------------------------------------
* ARP.QUERY
* In:
* PULLW PTR to IP
* PULLW PTR to MAC (to fill)
* Out:
* CC: hit: MAC filled
* CS: missed
*--------------------------------------
ARP.QUERY >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
ARP.QUERY.I jsr ARP.FIND.BY.IP
bcs .3 send an ARP request
lda (ZPCachePtr) get status...
bpl .9 Pending...
lda ZPCachePtr
clc
adc #S.ARPCACHE.MAC
sta ZPCachePtr
bcc .1
inc ZPCachePtr+1
ldy #S.ARPCACHE.MAC
.1 ldy #5
.2 lda (ZPCachePtr),y
sta (ZPPtrMAC),y
dey
bpl .2
sta ARP.TmpCache,y
iny
cpy #S.ARPCACHE.MAC+6
bne .2
clc
rts
.3 ldy #3
.3 ldx #3
.4 lda (ZPPtrIP),y
sta ARP.REQ.TPA,y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
.4 lda ARP.TmpCache+S.ARPCACHE.IP,x
sta ARP.REQ.TPA,x
dex
bpl .4
>PUSHW L.ARP.REQ
@ -140,114 +199,10 @@ ARP.QUERY.I jsr ARP.FIND.BY.IP
lda #S.ARPCACHE.STATUS.PENDING
jsr ARP.ADD.I
.9 lda #ERR.ARPPENDING
.9 lda #ERR.ARP.PENDING
sec
.99 rts
*--------------------------------------
* ARP.ADD
* In:
* PULLW PTR to IP
* PULLW PTR to MAC
*--------------------------------------
ARP.ADD >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
stz ARP.TmpCache+S.ARPCACHE.TTL
stz ARP.TmpCache+S.ARPCACHE.TTL+1
ldy #3
.1 lda (ZPPtrIP),y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
bpl .1
ldy #5
.2 lda (ZPPtrMAC),y
sta ARP.TmpCache+S.ARPCACHE.MAC,y
dey
bpl .2
lda #S.ARPCACHE.STATUS.RESOLVED+S.ARPCACHE.STATUS.STATIC
ARP.ADD.I sta ARP.TmpCache
jsr ARP.FIND.BY.IP
bcc .1
jsr ARP.FIND.FREE
.1 ldy #S.ARPCACHE-1
.2 lda ARP.TmpCache,y
sta (ZPCachePtr),y
dey
bpl .2
clc
rts
*--------------------------------------
* ARP.GETCACHE
* Out:
* Y,A = PTR to ARP.CACHE
*--------------------------------------
ARP.GETCACHE >LDYA L.ARP.CACHE
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
ARP.RESOLVE ldy #S.IP.DST
lda (ZPFrameBase1),y
iny
.1 and (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
cmp #$FF
bne .3 not a broadcast....
ldy #S.ETH.DSTMAC
.2 sta (ZPFrameBase1),y
iny
cpy #S.ETH.DSTMAC+6
bne .2
clc
rts
.3 ldy #S.IP.DST+3
ldx #3
.4 lda (ZPFrameBase1),y
eor IPCFG+S.IPCFG.IP,x
and IPCFG+S.IPCFG.MASK,x
bne .5
dey
dex
bpl .4
lda ZPFrameBase1 Same network, query ARP for dest IP
clc
adc #S.IP.DST
sta ZPPtrIP
lda ZPFrameBase1+1
adc /S.IP.DST
sta ZPPtrIP+1
bra .6
.5 lda L.IPCFG Not Same network, query ARP for GW
clc
adc #S.IPCFG.GW
sta ZPPtrIP
lda L.IPCFG+1
adc /S.IPCFG.GW
sta ZPPtrIP+1
.6 lda ZPFrameBase1
clc
adc #S.ETH.DSTMAC
sta ZPPtrMAC
lda ZPFrameBase1+1
adc /S.ETH.DSTMAC
sta ZPPtrMAC+1
jmp ARP.QUERY.I
*--------------------------------------
ARP.FIND.BY.IP >LDYA L.ARP.CACHE
>STYA ZPCachePtr
@ -260,8 +215,8 @@ ARP.FIND.BY.IP >LDYA L.ARP.CACHE
ldx #3
ldy #S.ARPCACHE.IP+3
.2 lda (ZPCachePtr),y
cmp ARP.TmpCache+S.ARPCACHE.IP,x
.2 lda ARP.TmpCache+S.ARPCACHE.IP,x
cmp (ZPCachePtr),y
bne .3
dey
dex

View File

@ -44,11 +44,11 @@ DNS.QUERY.I jsr DNS.FIND.BY.NAME
clc
rts
.9 lda #ERR.DNSPENDING
.9 lda #ERR.DNS.PENDING
sec
rts
*--------------------------------------
DNS.REQUEST jsr HST.PSTR2DNS.I
DNS.REQUEST jsr DNS.PSTR2DNS
ldx #0
ldy #DNS.MSG.NAME-DNS.MSG
@ -111,7 +111,7 @@ DNS.REQUEST jsr HST.PSTR2DNS.I
>PUSHB hDNSSocket2
jsr SKT.SEND
.3 lda #ERR.DNSPENDING
.3 lda #ERR.DNS.PENDING
.9 sec
rts
*--------------------------------------
@ -357,8 +357,9 @@ DNS.EXPIRE >LDYA L.DNS.CACHE
*--------------------------------------
DNS.FREE ldy #S.DNSCACHE.hNAME
lda (ZPCachePtr),y
beq .1
>SYSCALL SYS.FreeMemA
lda #0
.1 lda #0
sta (ZPCachePtr)
rts
*--------------------------------------
@ -398,41 +399,75 @@ DNS.DecodeMsg sta hFrame1
ldy #S.DNS.ANCOUNT+1
lda (ZPFrameBase1),y
beq .9
pha save Answer count...
ldy #S.DNS.QDCOUNT+1
lda (ZPFrameBase1),y
ldy #S.DNS Point to DATA
tax
beq .3 no QUERY to skip
ldy #S.DNS Read query
.1 lda (ZPFrameBase1),y
beq .2
bpl .11 Pointer ?
iny yes, skip 2 bytes
iny
bne .1
.2 tya
clc
adc #4 Skip QTYPE & QCLASS
bra .2
.11 tya
sec
adc (ZPFrameBase1),y Skip LEN+1 bytes
tay
dex skip another QUERY ?
bra .1
.2 iny
iny
iny Skip QTYPE & QCLASS
iny
.21 dex skip another QUERY ?
bne .1
.3 iny Skip Pointer or labels....
lda (ZPFrameBase1),y
bne .3
plx get back answer count
iny skip S.DNS.QTYPE HIGH
.3 lda (ZPFrameBase1),y
beq .32
bpl .31 Pointer ?
iny yes, skip 2 bytes
iny
bra .32
.31 tya
sec
adc (ZPFrameBase1),y Skip LEN+1 bytes
tay
bra .3
.32 iny skip S.DNS.QTYPE HIGH
lda (ZPFrameBase1),y
cmp #S.DNS.QTYPE.A
bne .9
iny skip QCLASS
beq .40
tya
clc
adc #7 skip CLASS,TTL+DATALENHIGH
tay
sec skip DATALENLO
adc (ZPFrameBase1),y add DATALEN
tay
dex
bne .3
bra .9
.40 iny skip QCLASS
iny
ldx #3
.4 iny
lda (ZPFrameBase1),y
.4 lda (ZPFrameBase1),y
sta DNS.TmpCache+S.DNSCACHE.TTL,x
iny
dex
bpl .4
@ -453,6 +488,50 @@ DNS.DecodeMsg sta hFrame1
>SYSCALL SYS.FreeMemA
rts
*--------------------------------------
DNS.PSTR2DNS lda (ZPPtrDNS)
beq .9
cmp #K.DNS.MAXLEN-1
bcs .9
tay
inc
sta DNS.HostNameLen
lda #0 Ending 0
sta DNS.HostName+1,y
ldx #0
.1 lda (ZPPtrDNS),y
and #$7f
cmp #'.'
beq .2
cmp #'A'
bcc .10
cmp #'Z'+1
bcs .10
adc #$20
.10 inx
bra .3
.2 txa
ldx #0
.3 sta DNS.HostName,y
dey
bne .1
stx DNS.HostName
clc
rts
.9 sec
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.DNS
LOAD LIB/LIBTCPIP.S

View File

@ -5,6 +5,35 @@ 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
@ -129,6 +158,7 @@ NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN
*--------------------------------------
SEND.ICMP.FRAME >PULLW ZPFrameBase1
jsr FRM.GetLen1
stz hFrame1
SEND.ICMP.FRAME.I
>PUSHW ZPFrameLen1
>PUSHWI S.ICMP.TYPE-2
@ -152,12 +182,14 @@ SEND.ICMP.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
@ -172,15 +204,15 @@ SEND.UDP.FRAME.I
*--------------------------------------
SEND.IP.FRAME >PULLW ZPFrameBase1
jsr FRM.GetLen1
stz hFrame1
SEND.IP.FRAME.I ldx #3
ldy #S.IP.SRC+3
.10 lda IPCFG+S.IPCFG.IP,x
.1 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase1),y
dey
dex
bpl .10
bpl .1
ldy #S.IP.TOTAL.LENGTH+1
lda ZPFrameLen1
@ -206,7 +238,7 @@ SEND.IP.FRAME.I ldx #3
ldy #S.IP.V.IHL.DSCP.ECN
ldx #10 10 words for IP Header
.1 lda (ZPFrameBase1),y
.2 lda (ZPFrameBase1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
@ -216,7 +248,7 @@ SEND.IP.FRAME.I ldx #3
sta IP.CHECKSUM+1
iny
dex
bne .1
bne .2
ldy #S.IP.HDR.CHECKSUM
lda IP.CHECKSUM
@ -234,64 +266,71 @@ SEND.IP.FRAME.I ldx #3
cmp #S.IP.PROTOCOL.TCP
bne .3
jsr TCP.ComputeChecksum
bra .8
bra .4
.3 cmp #S.IP.PROTOCOL.UDP
bne .8
bne .4
jsr UDP.ComputeChecksum
.8 lda DevFlags
.4 lda DevFlags
and #S.DEVINFO.NET.FLAGS.ARPOFFLOAD
bne .81
bne .5
jsr IP.SetDestMAC
bcs FRM.Queue
jsr ARP.RESOLVE
bcs .9
.81 >PUSHW ZPFrameBase1
.5 >PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jmp NetDevJmp
.9 rts
jsr NetDevJmp
bcs FRM.Queue
rts
*--------------------------------------
SEND.ARP.FRAME >PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jmp NetDevJmp
*--------------------------------------
SEND.ETH.FRAME >PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jmp NetDevJmp
*--------------------------------------
RCVD.FRAME >PULLW ZPFrameBase1
bra *
*--------------------------------------
RCVD.FRAMEA sta hFrame1
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
FRM.Queue ldx hFrame1 no hFrame, cannot queue for retry
beq .9
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
*--------------------------------------
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

View File

@ -8,12 +8,8 @@ AUTO 6
HST.GETBYNAME >PULLW ZPPtrDNS
>PULLW ZPPtrIP
jsr HST.ScanIP
bcc .1
jsr DNS.QUERY.I
bcs .9
>LDYA TmpBuffer256
>STYA ZPPtrMAC
.1 jmp ARP.QUERY.I
bcc .9
jmp DNS.QUERY.I
.9 rts
*--------------------------------------
HST.GETBYADDR >PULLW ZPPtrIP
@ -23,57 +19,6 @@ HST.GETBYADDR >PULLW ZPPtrIP
sec
rts
*--------------------------------------
HST.DNS2PSTR >PULLW ZPPtrDNS
sec
rts
*--------------------------------------
HST.PSTR2DNS >PULLW ZPPtrDNS
HST.PSTR2DNS.I lda (ZPPtrDNS)
beq .9
cmp #K.DNS.MAXLEN-1
bcs .9
tay
inc
sta DNS.HostNameLen
lda #0 Ending 0
sta DNS.HostName+1,y
ldx #0
.1 lda (ZPPtrDNS),y
and #$7f
cmp #'.'
beq .2
cmp #'A'
bcc .10
cmp #'Z'+1
bcs .10
adc #$20
.10 inx
bra .3
.2 txa
ldx #0
.3 sta DNS.HostName,y
dey
bne .1
stx DNS.HostName
clc
rts
.9 sec
rts
*--------------------------------------
HST.ScanIP stz HST.IP
lda (ZPPtrDNS)

View File

@ -94,6 +94,69 @@ IP.ComputeChecksum
eor #$FF
rts
*--------------------------------------
IP.SetDestMAC ldy #S.IP.DST
lda (ZPFrameBase1),y
iny
.1 and (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
cmp #$FF
bne .3 not a broadcast....
ldy #S.ETH.DSTMAC
.2 sta (ZPFrameBase1),y
iny
cpy #S.ETH.DSTMAC+6
bne .2
clc
rts
.3 ldy #S.IP.DST+3
ldx #3
.4 lda (ZPFrameBase1),y
eor IPCFG+S.IPCFG.IP,x
and IPCFG+S.IPCFG.MASK,x
bne .6
dey
dex
bpl .4
ldy #S.IP.DST+3 Same network, query ARP for dest IP
ldx #3
.5 lda (ZPFrameBase1),y
sta ARP.TmpCache+S.ARPCACHE.IP,x
dey
dex
bpl .5
bra .8
.6 ldx #3 Not Same network, query ARP for GW
.7 lda IPCFG+S.IPCFG.GW,x
sta ARP.TmpCache+S.ARPCACHE.IP,x
dex
bpl .7
.8 jsr ARP.QUERY.I
bcs .99
ldx #5
ldy #S.ETH.DSTMAC+5
.11 lda ARP.TmpCache+S.ARPCACHE.MAC,x
sta (ZPFrameBase1),y
dey
dex
bpl .11
clc
.99 rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.IP
LOAD LIB/LIBTCPIP.S

View File

@ -45,7 +45,7 @@ SKT.NEW >PULLW ZPTmpPtr1
cpy #S.SOCKET.DST.PORT+2
bne .3
lda ERR.SBUSY
lda #ERR.SKT.BUSY
sec
rts
@ -81,7 +81,7 @@ SKT.NEW >PULLW ZPTmpPtr1
clc
rts
.9 lda #ERR.OOS
.9 lda #ERR.SKT.OOS
sec
rts
*--------------------------------------
@ -111,7 +111,7 @@ SKT.ACCEPTA jsr SKT.GetA
clc
rts
.99 lda #ERR.SBAD
.99 lda #ERR.SKT.BAD
sec
.9 rts
*--------------------------------------
@ -214,7 +214,7 @@ SKT.SEND.UDP jsr NEW.UDP.FRAME
bra .3
.4 jsr SEND.UDP.FRAME.I
bcc .9
bcs .9
lda hFrame1
>SYSCALL SYS.FreeMemA
sec
@ -298,7 +298,7 @@ SKT.GetA stz ZPPtrSKT
>LDYA ZPPtrSKT
rts CC
.9 lda #ERR.SBAD
.9 lda #ERR.SKT.BAD
sec
rts
*--------------------------------------

View File

@ -57,8 +57,8 @@ CS.START cld
.DA SEND.TCP.FRAME
.DA SEND.UDP.FRAME
.DA SEND.IP.FRAME
.DA SEND.ARP.FRAME
.DA SEND.ETH.FRAME
.DA $ffff SEND.ARP.FRAME
.DA $ffff SEND.ETH.FRAME
.DA ARP.CLEAR
.DA ARP.QUERY
@ -71,7 +71,7 @@ CS.START cld
.DA DNS.GETCACHE
.DA RCVD.FRAMEA
.DA RCVD.FRAME
.DA PULSEA
.DA SKT.NEW
.DA $FFFF
@ -211,6 +211,15 @@ GET.IPCFG >LDYA L.IPCFG
clc
rts
*--------------------------------------
* Expire = every sec
* Retry = every 100 msec
*--------------------------------------
PULSEA asl
bpl .1
jsr ARP.EXPIRE
* jsr DNS.EXPIRE
.1 jmp FRM.RETRY
*--------------------------------------
ToLowerCaseA cmp #'A'
bcc .1
cmp #'Z'+1
@ -321,7 +330,7 @@ DNS.MSG.LEN .BS 2
DNS.MSG
DNS.MSG.ID .BS 2
.DA /S.DNS.F.RD Flags=query
.DA #S.DNS.F.RD Flags=query
.DA #S.DNS.F.RD
.DA $100 QDCOUNT
.BS 6 ANCOUNT,NSCOUNT,ARCOUNT
DNS.MSG.NAME .BS K.DNS.MAXLEN+6
@ -329,6 +338,11 @@ DNS.MSG.NAME .BS K.DNS.MAXLEN+6
ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE
DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE
SKT.TABLE .BS K.SKTTABLE.SIZE*S.SOCKET
FRM.QUEUE.Tail .BS 1
FRM.QUEUE.Head .BS 1
FRM.QUEUE.hMem .BS K.FRMQUEUE.SIZE
FRM.QUEUE.State .BS K.FRMQUEUE.SIZE
FRM.QUEUE.Retry .BS K.FRMQUEUE.SIZE
*--------------------------------------
bFirstLoad .DA #0
DevFlags .BS 1