A2osX/LIB/LIBTCPIP.S.ARP.txt

382 lines
6.6 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
2015-06-03 18:30:57 +00:00
PREFIX /A2OSX.SRC
2015-03-14 21:48:35 +00:00
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
2016-03-16 16:37:02 +00:00
ARP.IN ldy #S.ARP.TPA+3
ldx #3
.1 lda (ZPFrameBase1),y
cmp IPCFG+S.IPCFG.IP,x
bne .9
dey
dex
bpl .1
ldy #S.ARP.OPERATION+1 HI byte
lda (ZPFrameBase1),y
cmp #S.ARP.OPERATION.REQ
beq ARP.IN.REQ
cmp #S.ARP.OPERATION.REP
beq ARP.IN.REP
.9 clc Discard any other ARP frames
rts
ARP.IN.REQ ldy #S.ARP.SPA+3
ldx #3
.1 lda (ZPFrameBase1),y
sta ARP.REP.TPA,x
dey
dex
bpl .1
ldy #S.ARP.SHA+5
ldx #5
.2 lda (ZPFrameBase1),y
sta ARP.REP.DSTMAC,x
sta ARP.REP.THA,x
dey
dex
bpl .2
>PUSHW L.ARP.REP
ldx #DEVMGR.NET.SEND
jsr NetDevJmp
ARP.IN.REP lda #K.ARP.TTL
sta ARP.TmpCache+S.ARPCACHE.TTL
lda /K.ARP.TTL
sta ARP.TmpCache+S.ARPCACHE.TTL+1
ldy #S.ARP.SPA+3
ldx #3
.1 lda (ZPFrameBase1),y
sta ARP.TmpCache+S.ARPCACHE.IP,x
dey
dex
bpl .1
ldy #S.ARP.SHA+5
ldx #5
.2 lda (ZPFrameBase1),y
sta ARP.TmpCache+S.ARPCACHE.MAC,x
dey
dex
bpl .2
lda #S.ARPCACHE.STATUS.RESOLVED
jsr ARP.ADD.I
clc
rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE
2016-03-16 07:19:54 +00:00
.1 dex
stz ARP.CACHE,x
txa
2015-03-14 21:48:35 +00:00
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
2016-03-16 07:19:54 +00:00
ARP.QUERY.I jsr ARP.FIND.BY.IP
2016-03-16 16:37:02 +00:00
bcs .3 send an ARP request
2016-03-16 07:19:54 +00:00
lda (ZPCachePtr) get status...
bpl .9 Pending...
lda ZPCachePtr
clc
2016-03-17 07:31:11 +00:00
adc #S.ARPCACHE.MAC
2016-03-16 07:19:54 +00:00
sta ZPCachePtr
bcc .1
inc ZPCachePtr+1
.1 ldy #5
2016-03-16 16:37:02 +00:00
2016-03-16 07:19:54 +00:00
.2 lda (ZPCachePtr),y
sta (ZPPtrMAC),y
dey
bpl .2
clc
rts
2016-03-16 16:37:02 +00:00
.3 ldy #3
.4 lda (ZPPtrIP),y
2016-03-16 07:19:54 +00:00
sta ARP.REQ.TPA,y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
2016-03-16 16:37:02 +00:00
bpl .4
2016-03-16 07:19:54 +00:00
>PUSHW L.ARP.REQ
ldx #DEVMGR.NET.SEND
jsr NetDevJmp
2016-03-16 16:37:02 +00:00
bcs .99
lda #5
sta ARP.TmpCache+S.ARPCACHE.TTL
stz ARP.TmpCache+S.ARPCACHE.TTL+1
2016-03-16 07:19:54 +00:00
lda #S.ARPCACHE.STATUS.PENDING
2016-03-16 16:37:02 +00:00
jsr ARP.ADD.I
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
.9 lda #ERR.ARPPENDING
2016-03-16 07:19:54 +00:00
sec
2016-03-16 16:37:02 +00:00
.99 rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
* ARP.ADD
* In:
* PULLW PTR to IP
* PULLW PTR to MAC
*--------------------------------------
ARP.ADD >PULLW ZPPtrIP IP
>PULLW ZPPtrMAC MAC
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
stz ARP.TmpCache+S.ARPCACHE.TTL
stz ARP.TmpCache+S.ARPCACHE.TTL+1
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
ldy #3
.1 lda (ZPPtrIP),y
sta ARP.TmpCache+S.ARPCACHE.IP,y
dey
bpl .1
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
ldy #5
.2 lda (ZPPtrMAC),y
sta ARP.TmpCache+S.ARPCACHE.MAC,y
dey
bpl .2
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
lda #S.ARPCACHE.STATUS.RESOLVED+S.ARPCACHE.STATUS.STATIC
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
ARP.ADD.I sta ARP.TmpCache
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
jsr ARP.FIND.BY.IP
bcc .1
jsr ARP.FIND.FREE
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
.1 ldy #S.ARPCACHE-1
.2 lda ARP.TmpCache,y
sta (ZPCachePtr),y
dey
bpl .2
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
clc
2016-03-16 07:19:54 +00:00
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
* 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
2015-03-14 21:48:35 +00:00
lda ZPFrameBase1+1
adc /S.IP.DST
sta ZPPtrIP+1
2015-03-14 21:48:35 +00:00
bra .6
.5 lda L.IPCFG Not Same network, query ARP for GW
clc
adc #S.IPCFG.GW
sta ZPPtrIP
2015-03-14 21:48:35 +00:00
lda L.IPCFG+1
adc /S.IPCFG.GW
sta ZPPtrIP+1
2015-03-14 21:48:35 +00:00
.6 lda ZPFrameBase1
clc
adc #S.ETH.DSTMAC
sta ZPPtrMAC
2015-03-14 21:48:35 +00:00
lda ZPFrameBase1+1
adc /S.ETH.DSTMAC
sta ZPPtrMAC+1
2016-03-17 07:31:11 +00:00
jmp ARP.QUERY.I
2015-03-14 21:48:35 +00:00
*--------------------------------------
2016-03-16 16:37:02 +00:00
ARP.FIND.BY.IP >LDYA L.ARP.CACHE
>STYA ZPCachePtr
2016-03-17 07:31:11 +00:00
ldx #K.ARPCACHE.SIZE
2015-03-14 21:48:35 +00:00
2016-03-16 16:37:02 +00:00
.1 lda (ZPCachePtr)
2016-03-17 07:31:11 +00:00
beq .2
2016-03-16 16:37:02 +00:00
2016-03-17 07:31:11 +00:00
ldy #S.ARPCACHE.IP
2016-03-16 16:37:02 +00:00
lda (ZPCachePtr),y
cmp (ZPPtrIP)
2016-03-17 07:31:11 +00:00
bne .2
2016-03-16 16:37:02 +00:00
ldy #S.ARPCACHE.IP+1
lda (ZPCachePtr),y
ldy #1
cmp (ZPPtrIP),y
2016-03-17 07:31:11 +00:00
bne .2
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
ldy #S.ARPCACHE.IP+2
lda (ZPCachePtr),y
ldy #2
cmp (ZPPtrIP),y
2016-03-17 07:31:11 +00:00
bne .2
2016-03-16 16:37:02 +00:00
ldy #S.ARPCACHE.IP+3
lda (ZPCachePtr),y
ldy #3
cmp (ZPPtrIP),y
2016-03-17 07:31:11 +00:00
bne .2
2016-03-16 16:37:02 +00:00
clc
rts
2015-03-14 21:48:35 +00:00
2016-03-17 07:31:11 +00:00
.2 lda ZPCachePtr
2016-03-16 16:37:02 +00:00
clc
adc #S.ARPCACHE
sta ZPCachePtr
bcc .8
inc ZPCachePtr+1
2016-03-16 07:19:54 +00:00
2016-03-17 07:31:11 +00:00
.8 dex
2016-03-16 16:37:02 +00:00
bne .1
sec
2015-03-14 21:48:35 +00:00
rts
2016-03-16 16:37:02 +00:00
*--------------------------------------
ARP.FIND.FREE >LDYA L.ARP.CACHE
>STYA ZPCachePtr
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
lda #$ff
sta TmpDWord
sta TmpDWord+1
ldx #K.ARPCACHE.SIZE
2015-03-14 21:48:35 +00:00
2016-03-16 16:37:02 +00:00
.1 lda (ZPCachePtr)
beq .8
bpl .6
2015-03-14 21:48:35 +00:00
2016-03-16 16:37:02 +00:00
ldy #S.ARPCACHE.TTL
lda (ZPCachePtr),y
sec
sbc TmpDWord
iny
lda (ZPCachePtr),y
sbc TmpDWord+1
bcc .6
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
lda (ZPCachePtr),y
sta TmpDWord+1
2016-03-16 07:19:54 +00:00
dey
2016-03-16 16:37:02 +00:00
lda (ZPCachePtr),y
sta TmpDWord
2016-03-16 07:19:54 +00:00
2016-03-16 16:37:02 +00:00
>LDYA ZPCachePtr
>STYA ZPTmpPtr1 save lowest TTL slot ...
2015-09-11 18:48:12 +00:00
2016-03-16 16:37:02 +00:00
.6 lda ZPCachePtr
2016-03-16 07:19:54 +00:00
clc
2016-03-16 16:37:02 +00:00
adc #S.ARPCACHE
sta ZPCachePtr
bcc .7
inc ZPCachePtr+1
2015-03-14 21:48:35 +00:00
2016-03-16 16:37:02 +00:00
.7 dex
bne .1
2015-03-14 21:48:35 +00:00
2016-03-16 16:37:02 +00:00
>LDYA ZPTmpPtr1
>STYA ZPCachePtr
lda #0
sta (ZPCachePtr)
.8 clc
2016-03-16 07:19:54 +00:00
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2016-03-16 07:19:54 +00:00
ARP.EXPIRE >LDYA L.ARP.CACHE
>STYA ZPCachePtr
2015-03-14 21:48:35 +00:00
2016-03-16 07:19:54 +00:00
ldx #K.ARPCACHE.SIZE
2015-03-14 21:48:35 +00:00
2016-03-16 07:19:54 +00:00
.1 lda (ZPCachePtr)
2016-03-16 16:37:02 +00:00
beq .3
2016-03-16 07:19:54 +00:00
ldy #S.ARPCACHE.TTL
sec
lda (ZPCachePtr),y
sbc #1
sta (ZPCachePtr),y
2015-03-14 21:48:35 +00:00
iny
2016-03-16 07:19:54 +00:00
lda (ZPCachePtr),y
sbc #0
sta (ZPCachePtr),y
bcs .2
2015-03-14 21:48:35 +00:00
2016-03-16 07:19:54 +00:00
lda #0
sta (ZPCachePtr)
.2 lda ZPCachePtr
2015-03-14 21:48:35 +00:00
clc
adc #S.ARPCACHE
2016-03-16 07:19:54 +00:00
sta ZPCachePtr
bcc .3
inc ZPCachePtr+1
2015-03-14 21:48:35 +00:00
2016-03-16 07:19:54 +00:00
.3 dex
bne .1
rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
MAN
SAVE LIB/LIBTCPIP.S.ARP
LOAD LIB/LIBTCPIP.S
ASM