mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-02 18:32:20 +00:00
LBTCPIP:ARP rewrite
This commit is contained in:
parent
93fade265f
commit
5a3891650f
BIN
A2OSX.BOOT.DSK
BIN
A2OSX.BOOT.DSK
Binary file not shown.
BIN
A2OSX.SRC.po
BIN
A2OSX.SRC.po
Binary file not shown.
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
*--------------------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user