LBTCPIP:ARP rewrite

This commit is contained in:
Rémy GIBERT 2016-03-16 08:19:54 +01:00
parent 93fade265f
commit 5a3891650f
9 changed files with 311 additions and 265 deletions

Binary file not shown.

Binary file not shown.

View File

@ -13,7 +13,7 @@ AUTO 6
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ARP.TIMEOUT .EQ 50 50*100ms = 5 sec.
TIMEOUT.MAX .EQ 40 40*100ms = 4 sec.
*--------------------------------------
ZPPTR1 .EQ ZPBIN
*--------------------------------------
@ -55,7 +55,7 @@ CS.INIT >LDYA L.LIBSTR
ldy #S.PS.hARGS
lda (pPs),y
beq CS.INIT.CACHE
beq CS.INIT.DUMP
pha
>PUSHW L.DST.IP
@ -78,33 +78,31 @@ CS.INIT >LDYA L.LIBSTR
.9 lda #SYSMGR.ERRSYN
sec
rts
CS.INIT.CACHE >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE
*--------------------------------------
CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE
>STYA ZPPTR1
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldx #K.ARPCACHE.SIZE
.1 lda (ZPPTR1)
* beq .8
ldy #S.ARPCACHE.IP+4
.2 dey
lda (ZPPTR1),y
>PUSHA
>PUSHB (ZPPTR1),y
cpy #S.ARPCACHE.IP
bne .2
ldy #S.ARPCACHE.MAC+6
.3 dey
lda (ZPPTR1),y
>PUSHA
>PUSHB (ZPPTR1),y
cpy #S.ARPCACHE.MAC
bne .3
ldy #S.ARPCACHE.RETRYCNT
lda (ZPPTR1),y
>PUSHA
ldy #S.ARPCACHE.TTL+1
>PUSHB (ZPPTR1),y
dey
>PUSHB (ZPPTR1),y
>PUSHB (ZPPTR1)
@ -112,6 +110,7 @@ CS.INIT.CACHE >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE
phx
>LIBCALL hLIBSTR,LIBSTR.PRINTF
plx
lda ZPPTR1
clc
adc #S.ARPCACHE
@ -119,13 +118,13 @@ CS.INIT.CACHE >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE
bcc .4
inc ZPPTR1+1
.4 dex
bne .1
bne .1
.8 lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN lda #ARP.TIMEOUT
sta TimeOut
CS.RUN jsr Init.Timeout
.1 lda bCTRLC
bne .9
@ -135,8 +134,9 @@ CS.RUN lda #ARP.TIMEOUT
bcc .2 success, print & exit
lda TimeOut
beq .9
jsr Wait.TimeOut
bcs .9
>SYSCALL SYS.Sleep
bra .1
@ -157,14 +157,15 @@ CS.RUN lda #ARP.TIMEOUT
rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
and #S.EVT.F.TIMER is it a TIMER event?
beq .1 no....
bpl .1 is it a TIMER event?
lda TimeOut
ldy #TimeOut
lda (pData),y
beq .9
dec TimeOut
bra .9
dec
sta (pData),y
.9 sec do not discard TIMER event
rts
.1 lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
@ -189,9 +190,6 @@ CS.DOEVENT lda (pEvent)
sta bCTRLC
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
@ -200,12 +198,27 @@ CS.QUIT lda hLIBTCPIP
clc
rts
*--------------------------------------
Init.Timeout ldy #TimeOut
lda #TIMEOUT.MAX
sta (pData),y
rts
*--------------------------------------
Wait.TimeOut sec
ldy #TimeOut
lda (pData),y
beq .9
ldy #bCTRLC
lda (pData),y
bmi .9
clc
.9 rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
MSG0 >CSTRING "STS RET MAC Address IP Address\n"
MSG1 >CSTRING "$%h %03d %h:%h:%h:%h:%h:%h %d.%d.%d.%d\n"
MSG0 >CSTRING "STS TTL MAC Address IP Address\n"
MSG1 >CSTRING "$%h %5d %h:%h:%h:%h:%h:%h %d.%d.%d.%d\n"
MSG2 >CSTRING "%d.%d.%d.%d is at %h:%h:%h:%h:%h:%h\n"
*--------------------------------------
DS.START

View File

@ -6,10 +6,11 @@ AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
K.ARPCACHE.SIZE .EQ 10
K.ARPCACHE.SIZE .EQ 16
K.DNSCACHE.SIZE .EQ 10
K.SKTTABLE.SIZE .EQ 64
K.ETH.FRAME.LEN .EQ 1514
K.ARP.TTL .EQ 600
K.IP.TTL .EQ 64
K.DNS.MAXLEN .EQ 64
K.DYNPORT.START .EQ 49152
@ -94,13 +95,14 @@ S.IPCFG.DOMAIN .EQ 48 1+35 char PSTR
S.IPCFG .EQ 128
*--------------------------------------
S.ARPCACHE.STATUS .EQ 0
S.ARPCACHE.STATUS.PENDING .EQ 64
S.ARPCACHE.STATUS.PENDING .EQ 1
S.ARPCACHE.STATUS.STATIC .EQ 2
S.ARPCACHE.STATUS.RESOLVED .EQ 128
S.ARPCACHE.RETRYCNT .EQ 1
S.ARPCACHE.IP .EQ 2
S.ARPCACHE.MAC .EQ 6
S.ARPCACHE.TTL .EQ 2
S.ARPCACHE.IP .EQ 6
S.ARPCACHE.MAC .EQ 10
*
S.ARPCACHE .EQ 12
S.ARPCACHE .EQ 16
*--------------------------------------
S.DNSCACHE.STATUS .EQ 0
S.DNSCACHE.STATUS.PENDING .EQ 1

View File

@ -5,6 +5,215 @@ 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
ARP.QUERY.I jsr ARP.FIND.BY.IP
bcs ARP.REQUEST
lda (ZPCachePtr) get status...
bpl .9 Pending...
lda ZPCachePtr
clc
adc S.ARPCACHE.MAC
sta ZPCachePtr
bcc .1
inc ZPCachePtr+1
.1 ldy #5
.2 lda (ZPCachePtr),y
sta (ZPPtrMAC),y
dey
bpl .2
clc
rts
.9 lda #ERR.ARPPENDING
sec
rts
*--------------------------------------
ARP.REQUEST ldy #3
.1 lda (ZPPtrIP),y
sta ARP.REQ.TPA,y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
bpl .1
>PUSHW L.ARP.REQ
ldx #DEVMGR.NET.SEND
jsr NetDevJmp
bcs .9
lda #S.ARPCACHE.STATUS.PENDING
jsr ARP.ADD.I ZPPtrIP still pointing IP
lda #ERR.ARPPENDING
sec
.9 rts
*--------------------------------------
* ARP.ADD
* In:
* PULLW PTR to IP
* PULLW PTR to MAC
*--------------------------------------
ARP.ADD >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
lda #S.ARPCACHE.STATUS.RESOLVED+S.ARPCACHE.STATUS.STATIC
ARP.ADD.I sta ARP.TmpCache
jsr ARP.FIND.BY.IP
bcc .5
jsr DNS.FIND.FREE
.1 lda ARP.CACHE,x get status
beq .7 empty ARP cache entry
phx
ldy #0
.2 lda (ZPPtrIP),y
cmp ARP.CACHE+S.ARPCACHE.IP,x
bne .4
inx
iny
cpy #4
bne .2
plx
bra .7 same IP,update MAC
.4 pla get back index in ARP.CACHE
clc
adc #S.ARPCACHE
cmp #K.ARPCACHE.SIZE*S.ARPCACHE
beq .5 Cache is full ?
tax
bra .1
.5 bra *
ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE
.6 lda ARP.CACHE+S.ARPCACHE-1,x
sta ARP.CACHE-1,x
dex
bne .6
ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE
.7 lda Status
sta ARP.CACHE,x mark ARP entry Status
lda #K.ARP.TTL
sta ARP.CACHE+S.ARPCACHE.TTL,x
lda /K.ARP.TTL
sta ARP.CACHE+S.ARPCACHE.TTL+1,x
ldy #0
phx
.8 lda (ZPPtrIP),y store IP in cache
sta ARP.CACHE+S.ARPCACHE.IP,x
iny
inx
cpy #4
bne .8
plx
lda Status
bpl .82 no MAC if "pending"
ldy #0
.81 lda (ZPPtrMAC),y store MAC in cache
sta ARP.CACHE+S.ARPCACHE.MAC,x
iny
inx
cpy #6
bne .81
.82 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
*--------------------------------------
*--------------------------------------
*--------------------------------------
ARP.IN ldy #S.ARP.TPA
ldx #S.IPCFG.IP
@ -71,228 +280,69 @@ ARP.IN.REP lda #S.ARP.SHA
clc
rts
*--------------------------------------
ARP.EXPIRE
clc
rts
*--------------------------------------
* ARP.CLEAR
*--------------------------------------
ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE
.1 stz ARP.CACHE-1,x
dex
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
jmp ARP.QUERY.I
*--------------------------------------
* ARP.ADD
* In:
* PULLW PTR to IP
* PULLW PTR to MAC
*--------------------------------------
ARP.ADD >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
lda #S.ARPCACHE.STATUS.RESOLVED
jmp ARP.ADD.I
*--------------------------------------
* 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
ARP.EXPIRE >LDYA L.ARP.CACHE
>STYA ZPCachePtr
ldx #K.ARPCACHE.SIZE
.1 lda (ZPCachePtr)
beq .7
ldy #S.ARPCACHE.TTL
sec
lda (ZPCachePtr),y
sbc #1
sta (ZPCachePtr),y
iny
.1 and (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
cmp #$FF
bne .3 not a broadcast....
lda (ZPCachePtr),y
sbc #0
sta (ZPCachePtr),y
bcs .2
ldy #S.ETH.DSTMAC
.2 sta (ZPFrameBase1),y
iny
cpy #S.ETH.DSTMAC+6
bne .2
clc
rts
lda #0
sta (ZPCachePtr)
.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
*--------------------------------------
ARP.QUERY.I ldx #0
.1 phx
lda ARP.CACHE,x
beq .5 empty ARP Cache entry, try next...
ldy #0
.2 lda ARP.CACHE+S.ARPCACHE.IP,x
cmp (ZPPtrIP),y
bne .5 wrong IP, try next...
inx
iny
cpy #4
bne .2
plx
lda ARP.CACHE,x get back status
bpl .4 Pending...
ldy #0 already resolved, get MAC
.3 lda ARP.CACHE+S.ARPCACHE.MAC,x
sta (ZPPtrMAC),y
inx
iny
cpy #6
bne .3
clc
rts
.4 inc ARP.CACHE+S.ARPCACHE.RETRYCNT,x Pending, increase Retry Count
bne .41
stz ARP.CACHE,x reached max retry,mark as free
.41 sec
rts
.5 pla
.2 lda ZPCachePtr
clc
adc #S.ARPCACHE
tax
cmp #K.ARPCACHE.SIZE*S.ARPCACHE
sta ZPCachePtr
bcc .3
inc ZPCachePtr+1
.3 dex
bne .1
rts
*--------------------------------------
ARP.REQUEST.I ldy #3
.1 lda (ZPPtrIP),y
sta ARP.REQ.TPA,y
dey
bpl .1
>PUSHW L.ARP.REQ
ldx #DEVMGR.NET.SEND
jsr NetDevJmp
ARP.FIND.BY.IP >LDYA L.ARP.CACHE
>STYA ZPCachePtr
bcs .9
lda #K.ARPCACHE.SIZE
sta TmpOffset
jsr ARP.ADD.PENDING ZPPtrIP still pointing IP
sec
.9 rts
*--------------------------------------
ARP.ADD.PENDING lda #S.ARPCACHE.STATUS.PENDING
.1 lda (ZPCachePtr)
beq .7
ARP.ADD.I sta Status
ldy #S.ARPCACHE.IP
lda (ZPCachePtr),y
ldx #0
.1 lda ARP.CACHE,x get status
beq .7 empty ARP cache entry
phx
ldy #0
.2 lda (ZPPtrIP),y
cmp ARP.CACHE+S.ARPCACHE.IP,x
bne .4
inx
iny
cpy #4
bne .2
plx
bra .7 same IP,update MAC
.4 pla get back index in ARP.CACHE
.7 lda ZPCachePtr
clc
adc #S.ARPCACHE
cmp #K.ARPCACHE.SIZE*S.ARPCACHE
beq .5 Cache is full ?
tax
bra .1
sta ZPCachePtr
bcc .8
inc ZPCachePtr+1
.5 ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE
.8 dec TmpOffset
bne .1
.6 lda ARP.CACHE+S.ARPCACHE-1,x
sta ARP.CACHE-1,x
dex
bne .6
ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE
.7 lda Status
sta ARP.CACHE,x mark ARP entry Status
inx
stz ARP.CACHE,x Init retry count
inx
ldy #0
.8 lda (ZPPtrIP),y store IP in cache
sta ARP.CACHE,x
inx
iny
cpy #4
bne .8
lda Status
bpl .82 no MAC if "pending"
ldy #0
.81 lda (ZPPtrMAC),y store MAC in cache
sta ARP.CACHE,x
inx
iny
cpy #6
bne .81
.82 clc
sec
rts
*--------------------------------------
ARP.FIND.FREE
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.ARP
LOAD LIB/LIBTCPIP.S

View File

@ -28,7 +28,7 @@ ICMP.IN ldy #S.ICMP.TYPE
ldx #3
.2 lda (ZPFrameBase1),y
sta TmpIP,x
sta ARP.TmpCache+S.ARPCACHE.IP,x
dey
dex
bpl .2
@ -36,7 +36,7 @@ ICMP.IN ldy #S.ICMP.TYPE
ldy #S.IP.DST+3
ldx #3
.3 lda TmpIP,x
.3 lda ARP.TmpCache+S.ARPCACHE.IP,x
sta (ZPFrameBase1),y
dey
dex
@ -46,14 +46,13 @@ ICMP.IN ldy #S.ICMP.TYPE
ldx #5
.4 lda (ZPFrameBase1),y
sta TmpMAC,x
sta ARP.TmpCache+S.ARPCACHE.MAC,x
dey
dex
bpl .4
>PUSHW L.TmpMAC
>PUSHW L.TmpIP
jsr ARP.ADD
lda #S.ARPCACHE.STATUS.RESOLVED
jsr ARP.ADD.I
jmp SEND.ICMP.FRAME.I
.9 sec

View File

@ -76,19 +76,7 @@ SKT.NEW >PULLW ZPTmpPtr1
dey
bpl .7
lda ZPTmpPtr1
clc
adc #S.SOCKET.DST.ADDR
sta ZPPtrIP
lda ZPTmpPtr1+1
adc /S.SOCKET.DST.ADDR
sta ZPPtrIP+1
lda (ZPPtrIP)
beq .8
jsr ARP.REQUEST.I
.8 ldx TmpOffset
ldx TmpOffset
>LDYA ZPTmpPtr3
clc
rts

View File

@ -95,8 +95,6 @@ L.DNS.MSG .DA DNS.MSG
L.ARP.CACHE .DA ARP.CACHE
L.DNS.CACHE .DA DNS.CACHE
L.SKT.TABLE .DA SKT.TABLE
L.TmpMAC .DA TmpMAC
L.TmpIP .DA TmpIP
L.TmpSocket .DA TmpSocket
L.TCP.MSG .DA TCP.MSG
.DA 0
@ -340,8 +338,7 @@ hDNSSocket2 .BS 1
DNS.HostNameLen .BS 1
DNS.HostName .BS K.DNS.MAXLEN+1
DNS.TmpCache .BS S.DNSCACHE
TmpMAC .BS 6
TmpIP .BS 4
ARP.TmpCache .BS S.ARP
TmpDWord .BS 4
TmpSocket .BS S.SOCKET
hFrame1 .BS 1

View File

@ -12,11 +12,8 @@ AUTO 6
.INB INC/A2OSX.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
ZPIPCfgPtr .EQ ZPBIN+12
ZPIPDevPtr .EQ ZPBIN+14
ZPIPCfgPtr .EQ ZPBIN
ZPIPDevPtr .EQ ZPBIN+2
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------