From 5a3891650fea3ba345eec2b006ca394d7cdf09ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 16 Mar 2016 08:19:54 +0100 Subject: [PATCH] LBTCPIP:ARP rewrite --- A2OSX.BOOT.DSK | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/ARP.S.txt | 69 +++--- INC/LIBTCPIP.I.txt | 14 +- LIB/LIBTCPIP.S.ARP.txt | 456 ++++++++++++++++++++++------------------ LIB/LIBTCPIP.S.ICMP.txt | 11 +- LIB/LIBTCPIP.S.SKT.txt | 14 +- LIB/LIBTCPIP.S.txt | 5 +- SBIN/TCPIP.S.txt | 7 +- 9 files changed, 311 insertions(+), 265 deletions(-) diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index 42c7a0bc8eb467f44ddb557361d82d7bd39ee44a..b5458ea2dea6620cf873d8815c0b650c0959d74e 100644 GIT binary patch delta 3754 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 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 27a394cc3c943963f84c12a01335c723401ecdfe..cad884cfa61f97387ce41658adb6b59afc8be421 100644 GIT binary patch delta 29328 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 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 diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index aca2d2c1..8a95b564 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -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 diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index 00a6732f..16b4d079 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -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 diff --git a/LIB/LIBTCPIP.S.ICMP.txt b/LIB/LIBTCPIP.S.ICMP.txt index 6739acdd..a33ad149 100644 --- a/LIB/LIBTCPIP.S.ICMP.txt +++ b/LIB/LIBTCPIP.S.ICMP.txt @@ -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 diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index f3b169c4..9dc221b8 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -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 diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 949d1f1a..a045d8f7 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -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 diff --git a/SBIN/TCPIP.S.txt b/SBIN/TCPIP.S.txt index 75edc754..063e6454 100644 --- a/SBIN/TCPIP.S.txt +++ b/SBIN/TCPIP.S.txt @@ -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) *--------------------------------------