Fixed MemMgr Bugs preventing TCPIP stack working properly

This commit is contained in:
Rémy GIBERT 2015-09-13 22:35:07 +02:00
parent 3c12891610
commit 7c787a2c6c
17 changed files with 282 additions and 154 deletions

Binary file not shown.

Binary file not shown.

View File

@ -10,7 +10,7 @@ SET LIB=%A2OSX%LIB/
LOAD CONSOLE.DRV
EXEC GETTY KBD CON LOGIN
LOAD SSC.DRV 9600 N 8 1 X
*EXEC GETTY COM2 COM2 LOGIN
EXEC GETTY COM2 COM2 LOGIN
*LOAD PPIC.DRV
LOAD UTHERNET.DRV 000E3A123456
EXEC TCPIP ETH3
@ -18,8 +18,8 @@ EXEC DHCPCLNT
*EXEC TELNETD
*MOUNT TFTP 192.168.1.5:/A2OSX /MNT/A2OSX
*MOUNT CIFS 192.168.1.5:/MSSHARE /MNT/MSSHARE
LOAD DHGR.DRV
LOAD MOUSE.DRV
EXEC GUI
*LOAD DHGR.DRV
*LOAD MOUSE.DRV
*EXEC GUI
MAN
TEXT A2OSX.STARTUP

View File

@ -134,7 +134,6 @@ CS.RUN lda #ARP.TIMEOUT
>PUSHW L.DST.MAC
>PUSHW L.DST.IP
>LIBCALL hLIBTCPIP,LIBTCPIP.ARP.QUERY
bra *
bcc .2 success, print & exit

View File

@ -6,27 +6,31 @@ AUTO 6
.LIST ON
.OP 65C02
.OR $2000
.TF BIN/DNS
.TF /A2OSX.BOOT/BIN/DNS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/A2OSX.API.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 No Data Segment to Allocate
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
@ -38,20 +42,20 @@ L.IP .DA IP
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT stz hHostName
stz hIP
>LIBLOADP L.LIBSTR
>LDYA L.LIBSTR
>LOADLIBYA
sta hLIBSTR
>LIBLOADP L.LIBTCPIP
>LDYA L.LIBTCPIP
>LOADLIBYA
sta hLIBTCPIP
ldy #S.PS.hARGS
lda (pPsContext),y
lda (pPs),y
bne CS.INIT.ADD
jmp CS.INIT.DUMP
@ -63,7 +67,7 @@ CS.INIT.ADD >PUSHA
sta hHostName
ldy #S.PS.hARGS
lda (pPsContext),y
lda (pPs),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 2 Push 2 for getting IP
@ -81,7 +85,9 @@ CS.INIT.ADD >PUSHA
>PUSHWI 1800 default TTL
>PUSHW L.IP
>PUSHB hHostName
lda hHostName
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.DNS.ADD
bcs .99
@ -98,12 +104,13 @@ CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldx #K.DNSCACHE.SIZE
ldx #K.DNSCACHE.SIZE
.1 phx
lda (ZPPTR1)
beq .2
ldy #S.DNSCACHE.IP+3
ldy #S.DNSCACHE.RDATA+3
lda (ZPPTR1),y
>PUSHA
dey
@ -116,13 +123,17 @@ CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE
lda (ZPPTR1),y
>PUSHA
ldy #S.DNSCACHE.TTL
ldy #S.DNSCACHE.TTL+3
>PUSHA
dey
lda (ZPPTR1),y
pha
iny
>PUSHA
dey
lda (ZPPTR1),y
ply
>PUSHYA
>PUSHA
dey
lda (ZPPTR1),y
>PUSHA
ldy #S.DNSCACHE.hNAME
lda (ZPPTR1),y
@ -170,14 +181,12 @@ LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
MSG0 >CSTRING "STS Hostname TTL IP Address\n"
MSG1 >CSTRING "$%h %32S %05D %d.%d.%d.%d\n"
DS.START
MSG1 >CSTRING "$%h %32S %09L %d.%d.%d.%d\n"
hLIBSTR .BS 1
hLIBTCPIP .BS 1
hHostName .BS 1
hIP .BS 1
IP .BS 4
DS.END
MAN
SAVE BIN/DNS.S
ASM

View File

@ -15,6 +15,7 @@ AUTO 6
.INB INC/LIBSTR.I
*--------------------------------------
PAGELEN .EQ 22
FOOTERLEN .EQ 8
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
@ -78,6 +79,11 @@ CS.RUN ldy #bCANCEL
lda (pData),y
bne .8
ldy #MEM.COUNT
lda (pData),y
cmp MemMgr.LastSlot
beq .10
ldy #LINE.COUNT
lda (pData),y
bne .1
@ -103,62 +109,61 @@ CS.RUN ldy #bCANCEL
lda (pData),y
inc
sta (pData),y
cmp MemMgr.LastSlot
beq .9
.8 clc
rts
.9 jsr CS.RUN.PRINTEND
sec
rts
*--------------------------------------
CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPs),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
ldy #bCANCEL
sta (pData),y
bra .8
.1 cmp #$13 Ctrl-S
bne .2
ldy #bSTOP
lda (pData),y
eor #$FF
sta (pData),y
bra .8
.2 ldy #bSTOP
lda #0
sta (pData),y
.8 clc
rts
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.UnloadLibA
.10 ldy #LINE.COUNT
lda (pData),y
clc
adc #FOOTERLEN
cmp #PAGELEN
bcc .11
lda #$FF
ldy #bSTOP
sta (pData),y
lda #0
ldy #LINE.COUNT
sta (pData),y
clc
rts
.11 ldy #MEM.COUNT
>PUSHB (pData),y
ldy #USED.COUNT
>PUSHB (pData),y
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MemMgr.HiMem
>PUSHW L.MSG3
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MemMgr.Free
>PUSHW L.MSG4
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MemMgr.LoMem
>PUSHW L.MSG5
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda MemMgr.Free
sec
sbc MemMgr.LoMem
tay
lda MemMgr.Free+1
sbc MemMgr.LoMem+1
>PUSHYA
>PUSHW L.MSG6
>LIBCALL hLIBSTR,LIBSTR.PRINTF
sec
rts
*--------------------------------------
CS.RUN.PRINTMEM ldy #S.MEM.LEN
@ -250,35 +255,52 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN
.5 rts
*--------------------------------------
CS.RUN.PRINTEND ldy #MEM.COUNT
>PUSHB (pData),y
ldy #USED.COUNT
>PUSHB (pData),y
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MemMgr.HiMem
>PUSHW L.MSG3
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MemMgr.Free
>PUSHW L.MSG4
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MemMgr.LoMem
>PUSHW L.MSG5
>LIBCALL hLIBSTR,LIBSTR.PRINTF
CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPs),y
bne .9
lda MemMgr.Free
sec
sbc MemMgr.LoMem
tay
lda MemMgr.Free+1
sbc MemMgr.LoMem+1
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
>PUSHYA
>PUSHW L.MSG6
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
ldy #bCANCEL
sta (pData),y
bra .8
.1 cmp #$13 Ctrl-S
bne .2
ldy #bSTOP
lda (pData),y
eor #$FF
sta (pData),y
bra .8
.2 ldy #bSTOP
lda #0
sta (pData),y
.8 clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
PRBYTE pha

View File

@ -106,7 +106,8 @@ CS.RUN >PUSHW pData DST.IP
CS.RUN.DNSQUERY >PUSHW pData DST.IP
ldy #S.PS.hARGS
lda (pPs),y
>PUSHA
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY
bcc CS.RUN.IPOK

View File

@ -108,7 +108,8 @@ CS.RUN >PUSHW pData DST.IP
CS.RUN.DNSQUERY >PUSHW pData DST.IP
ldy #S.PS.hARGS
lda (pPs),y
>PUSHA
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY
bcc CS.RUN.IPOK

View File

@ -76,10 +76,21 @@ S.DNSCACHE.STATUS .EQ 0
S.DNSCACHE.STATUS.PENDING .EQ 64
S.DNSCACHE.STATUS.RESOLVED .EQ 128
S.DNSCACHE.hNAME .EQ 1
S.DNSCACHE.TTL .EQ 2
S.DNSCACHE.IP .EQ 4
S.DNSCACHE.TYPE .EQ 2
S.DNSCACHE.TYPE.A .EQ 1
S.DNSCACHE.TYPE.NS .EQ 2
S.DNSCACHE.TYPE.CNAME .EQ 5
S.DNSCACHE.TYPE.SOA .EQ 6
S.DNSCACHE.TYPE.WKS .EQ 11
S.DNSCACHE.TYPE.PTR .EQ 12
S.DNSCACHE.TYPE.MX .EQ 15
S.DNSCACHE.TYPE.SRV .EQ 33
S.DNSCACHE.CLASS .EQ 4
S.DNSCACHE.TTL .EQ 6
S.DNSCACHE.RDLENGTH .EQ 10
S.DNSCACHE.RDATA .EQ 12
*
S.DNSCACHE .EQ 8
S.DNSCACHE .EQ 16
*--------------------------------------
S.LISTENER.PORT .EQ 0
S.LISTENER.hPS .EQ 2

View File

@ -186,8 +186,6 @@ ARP.QUERY.I ldx #0
cpy #S.ETH.DSTMAC+6
bne .75
>DEBUG
jsr SEND.ARP.FRAME.I
bcs .76

View File

@ -21,9 +21,7 @@ DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE
* CC: hit: IP filled with address
* CS: missed
*--------------------------------------
DNS.QUERY >PULLB hHOST Get host string hMem
>SYSCALL SYS.GetMemPtrA
>STYA ZPDNSHostname
DNS.QUERY >PULLW ZPDNSHostname Get host string
>PULLW ZPDNSIP Get IP address to fill
ldx #0
@ -49,7 +47,7 @@ DNS.QUERY >PULLB hHOST Get host string hMem
bpl .4 Pending...
ldy #0
.3 lda DNS.CACHE+S.DNSCACHE.IP,x
.3 lda DNS.CACHE+S.DNSCACHE.RDATA,x
sta (ZPDNSIP),y
inx
iny
@ -200,9 +198,7 @@ DNS.REQUEST jsr NEW.UDP.FRAME
* PULLW = PTR to IP
* PULLW = TTL
*--------------------------------------
DNS.ADD >PULLB hHOST Get host string hMem
>SYSCALL SYS.GetMemPtrA
>STYA ZPDNSHostname
DNS.ADD >PULLW ZPDNSHostname Get host string
>PULLW ZPDNSIP Get host IP address
>PULLW HOST.TTL
lda #S.DNSCACHE.STATUS.RESOLVED
@ -291,7 +287,7 @@ DNS.UPD.ENTRY lda Status
ldy #0
.2 lda (ZPDNSIP),y
sta DNS.CACHE+S.DNSCACHE.IP,x
sta DNS.CACHE+S.DNSCACHE.RDATA,x
inx
iny
cpy #4

View File

@ -77,7 +77,7 @@ L.DNS.CACHE .DA DNS.CACHE
.DA 0
*--------------------------------------
LIB.LOAD lda bFirstLoad
bne *
bne .8
jsr ARP.CLEAR
jsr DNS.CLEAR
inc bFirstLoad
@ -466,7 +466,6 @@ CS.END
*--------------------------------------
bFirstLoad .DA #0
Status .BS 1
hHOST .BS 1 for DNS Cache functions
HOST.TTL .BS 2 for DNS Cache functions
IP.CHECKSUM .BS 4
IPCFG .BS S.IPCFG

View File

@ -33,12 +33,20 @@ CS.START cld
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.GREETINGS .DA MSG.GREETINGS
L.MSG.USAGE .DA MSG.USAGE
L.MSG.GREETINGS .DA MSG.GREETINGS
.DA 0 End Of Reloc Table
*--------------------------------------
CS.INIT ldy #S.PS.hARGS
lda (pPs),y
>PUSHA
bne .1
>LDYA L.MSG.USAGE
jsr PRINT.MSG
sec
rts
.1 >PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 1 Push 1 for getting INDEV
>SYSCALL SYS.PStrGetTkn
@ -195,6 +203,7 @@ COUT phx
pDevJmp jmp (pDev)
*--------------------------------------
CS.END
MSG.USAGE >CSTRING "GETTY <INDEV> <OUTDEV> <PROGRAM>"
MSG.GREETINGS >CSTRING "A2osX-GeTTY on Dev="
hDEVNAME .BS 1
*--------------------------------------

View File

@ -213,8 +213,22 @@ CS.DOEVENT.NET ldy #S.EVT.DATALO Get Frame hMem
rts
.2 cmp #S.IP.PROTOCOL.UDP
bne .21
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DNS
cmp (ZPFrameBase1),y
bne .3
>PUSHW ZPFrameLen1
iny
lda #UDP.PORT.DNS
cmp (ZPFrameBase1),y
bne .3
jsr DNSListener
bcc .89
rts
.21 >PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.UDP.LISTENER
bcc .89
@ -380,6 +394,53 @@ ICMPListener ldy #S.ICMP.TYPE
.9 sec
rts
*--------------------------------------
DNSListener ldy #S.DNS.F+1
lda (ZPFrameBase1),y
and /S.DNS.F.QR
beq .9
ldy #S.DNS.QDCOUNT
lda (ZPFrameBase1),y
tax
beq .3 no QUERY to skip
ldy #S.DNS Read query
.1 lda (ZPFrameBase1),y
beq .2
iny
bne .1
.2 tya
clc
adc #4 Skip QTYPE & QCLASS
tay
dex skip another QUERY ?
bne .1
.3 lda (ZPFrameBase1),y get offset of NAME
phy save current offset in frame
tay
ldx #0
.4 lda (ZPFrameBase1),y compute len of NAME
beq .5
inx
iny
bne .4
.5 inx X=length of NAME
txa
f
sdf
sdf
>STYA ZPQuickPtr1
clc
rts
.9 sec
rts
*--------------------------------------
GetIPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
>STYA ZPQuickPtr1

View File

@ -14,9 +14,27 @@ AUTO 6
* X = hMem of Code Segment
*--------------------------------------
S.LoadBinA sta S.LoadBinA.hFilename save file path
jsr S.GetMemByNameA
bcs .1 not already loaded
jsr S.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
tay
.1 lda (ZPQuickPtr1),y convert to UPPERCASE
cmp #$61 "a"
bmi .2
cmp #$7B "z"+1
bpl .2
sec
sbc #$20
sta (ZPQuickPtr1),y
.2 dey
bne .1
lda S.LoadBinA.hFilename
jsr S.GetMemByNameA
bcs .3 not already loaded
>STYA ZPQuickPtr1 Save base address
ldy #S.MEM.REFCNT
lda (ZPQuickPtr1),y
@ -32,12 +50,12 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path
clc
rts
.1 lda S.LoadBinA.hFilename
.3 lda S.LoadBinA.hFilename
jsr S.LoadFileA
bcc .2
bcc .4
rts Error Loading file
.2 >STYA S.LoadBinA.FileLen
.4 >STYA S.LoadBinA.FileLen
stx S.LoadBinA.hMem save hMem
txa
jsr S.GetMemPtrA
@ -87,6 +105,7 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path
bcs .98
pha save copy of bin path
lda S.LoadBinA.hMem
jsr S.GetMemByIDA
>STYA ZPQuickPtr1

View File

@ -383,47 +383,50 @@ S.GetMemByNameA jsr S.GetMemPtrA
bcs *
S.GetMemByNameYA
>STYA ZPMemMgrTmp1 save BINPATH
>LDYAI MemMgr.Table+S.MEM.SIZE
>STYA ZPMemMgrSPtr
>LDYAI MemMgr.Table
>STYA ZPMemMgrTmp2
ldx #0
.1 cpx MemMgr.LastSlot
beq .9
inx
lda (ZPMemMgrSPtr)
lda (ZPMemMgrTmp2)
bpl .6 In Use?
ldy #S.MEM.BIN any BIN PATH in this slot?
lda (ZPMemMgrSPtr),y
lda (ZPMemMgrTmp2),y
beq .6
jsr S.GetMemPtrA get pathname
>STYA ZPMemMgrTmp2
bcs *
>STYA ZPMemMgrTmp3
ldy #0
lda (ZPMemMgrTmp1)
cmp (ZPMemMgrTmp3)
bne .6
tay
.2 lda (ZPMemMgrTmp1),y
cmp (ZPMemMgrTmp2),y
cmp (ZPMemMgrTmp3),y
bne .6
tya
iny
cmp (ZPMemMgrTmp1)
dey
bne .2
>LDYA ZPMemMgrSPtr
bra *
>LDYA ZPMemMgrTmp2
clc
rts
.6 lda ZPMemMgrSPtr
.6 lda ZPMemMgrTmp2
clc
adc #S.MEM.SIZE
sta ZPMemMgrSPtr
bcc .1
inc ZPMemMgrSPtr+1
sta ZPMemMgrTmp2
bcc .7
inc ZPMemMgrTmp2+1
.7 inx
bra .1
.9 sec

View File

@ -466,7 +466,7 @@ S.InitProcessA >PUSHA Push Cmd Line
lda (pCode),y
>PUSHAX Push DS.SIZE
>PUSHBI 0 no option
>PUSHBI S.MEM.F.INIT0 Clear DS
jsr S.GetMem
bcs .97