A2osX/LIB/LIBTCPIP.S.DNS.txt

376 lines
6.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE
.1 stz DNS.CACHE-1,x
dex
bne .1
clc
rts
*--------------------------------------
* DNS.QUERY
* In:
* PULLW = hostname PTR to PSTR
* PULLW = PTR to IP to fill with cached data
* Out:
* CC: hit: IP filled with address
* CS: missed
*--------------------------------------
DNS.QUERY >PULLYA Get host string
jsr PSTR2DNSHostName
>PULLW ZPPtrIP Get IP address to fill
ldx #0
.1 lda DNS.CACHE,x
beq .6 empty DNS cache entry?
phx
lda DNS.CACHE+S.DNSCACHE.hNAME,x
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtrDNS
plx
ldy #0
.2 lda DNSHostname,y
bne .21
lda (ZPPtrDNS),y
beq .22
.21 cmp (ZPPtrDNS),y
bne .6
iny
bne .2
.22 lda DNS.CACHE,x get back status...
bpl .4 Pending...
ldy #0
.3 lda DNS.CACHE+S.DNSCACHE.RDATA,x
sta (ZPPtrIP),y
inx
iny
cpy #4
bne .3
clc
rts
.4 sec
rts
.6 txa
clc
adc #S.DNSCACHE
tax
cmp #K.DNSCACHE.SIZE*S.DNSCACHE
bne .1
DNS.REQUEST jsr NEW.UDP.FRAME
bcc .1
bra *
rts
.1 phx
ldy #S.UDP.SRCPORT
lda /UDP.PORT.DNS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DNS
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DNS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DNS
sta (ZPFrameBase1),y
ldy #S.DNS.ID
lda A2osX.RANDOM16
sta (ZPFrameBase1),y
sta DNSMessageID
iny
lda A2osX.RANDOM16+1
sta (ZPFrameBase1),y
sta DNSMessageID+1
* ldy #S.DNS.F
* lda /S.DNS.F.RD
* sta (ZPFrameBase1),y
* iny
* lda #S.DNS.F.RD
* sta (ZPFrameBase1),y
ldy #S.DNS.QDCOUNT
lda /1
sta (ZPFrameBase1),y
iny
lda #1
sta (ZPFrameBase1),y
lda #S.DNS
clc
adc ZPFrameBase1
sta ZPFramePtr1
lda /S.DNS
adc ZPFrameBase1+1
sta ZPFramePtr1+1
ldy #0
.2 lda DNSHostname,y
sta (ZPFramePtr1),y
beq .3
iny
bne .2
.3 iny
lda /S.DNS.QTYPE.A
sta (ZPFramePtr1),y
iny
lda #S.DNS.QTYPE.A
sta (ZPFramePtr1),y
iny
lda /S.DNS.QCLASS.IN
sta (ZPFramePtr1),y
iny
lda #S.DNS.QCLASS.IN
sta (ZPFramePtr1),y
lda DNSHostnameLen Get hostname len again (QNAME)
clc
adc #6 (len+1) + Ending 0 + QTYPE + QCLASS
adc #S.DNS
sta ZPFrameLen1
lda #0
adc /S.DNS
sta ZPFrameLen1+1
ldx #S.IPCFG.DNS
ldy #S.IP.DST
lda IPCFG,x
beq .5
.4 lda IPCFG,x
sta (ZPFrameBase1),y
iny
inx
cpx #S.IPCFG.DNS+4
bne .4
jsr SEND.UDP.FRAME.I
bcs .8
.5 ldx #S.IPCFG.DNS+4
ldy #S.IP.DST
lda IPCFG,x
beq .7
.6 lda IPCFG,x
sta (ZPFrameBase1),y
iny
inx
cpx #S.IPCFG.DNS+8
bne .6
jsr SEND.UDP.FRAME.I
bcs .8
.7 jsr DNS.ADD.PENDING.I
.8 pla
>SYSCALL SYS.FreeMemA
sec
rts
*--------------------------------------
* DNS.ADD
* In:
* PULLW = hostname PSTR to Add
* PULLW = PTR to IP
*--------------------------------------
DNS.ADD >PULLYA Get host string
jsr PSTR2DNSHostName
>PULLW ZPPtrIP Get host IP address
lda #$80
sta DNSHostTTL+3
stz DNSHostTTL+2
stz DNSHostTTL+1
stz DNSHostTTL
lda #S.DNSCACHE.STATUS.RESOLVED
bra DNS.ADD.I
DNS.ADD.PENDING.I
lda #S.DNSCACHE.STATUS.PENDING
DNS.ADD.I sta Status
ldx #0
.1 lda DNS.CACHE,x
beq DNS.ADD.ENTRY free ?
lda DNS.CACHE+S.DNSCACHE.hNAME,x
phx
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtrDNS
plx
ldy #0
.2 lda DNSHostname,y
cmp (ZPPtrDNS),y
bne .4
and #$FF End Of String?
beq DNS.UPD.ENTRY
iny
bne .2
.4 txa
clc
adc #S.DNSCACHE
tax
cmp #K.DNSCACHE.SIZE*S.DNSCACHE
bne .1
lda DNS.CACHE+S.DNSCACHE.hNAME discard oldest entry hNAME
>SYSCALL SYS.FreeMemA
ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE
.6 lda DNS.CACHE+S.DNSCACHE-1,x
sta DNS.CACHE-1,x
dex
bne .6
ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE
DNS.ADD.ENTRY phx
ldy DNSHostnameLen
iny add 1 for Ending 00
lda #0
>PUSHYA push PSTR len
>PUSHBI 0 no option
>SYSCALL SYS.GetMem
bcc .10
plx
rts
.10 >STYA ZPPtrDNS
txa
plx
sta DNS.CACHE+S.DNSCACHE.hNAME,x
ldy #0
.1 lda DNSHostname,y
sta (ZPPtrDNS),y
iny
cpy DNSHostnameLen
bne .1
lda #0
sta (ZPPtrDNS),y
DNS.UPD.ENTRY lda Status
sta DNS.CACHE+S.DNSCACHE.STATUS,x
bmi .1 pending?
lda DNSMessageID
sta DNS.CACHE+S.DNSCACHE.ID,x
lda DNSMessageID+1
sta DNS.CACHE+S.DNSCACHE.ID+1,x
bra .9
.1 lda DNSHostTTL
sta DNS.CACHE+S.DNSCACHE.TTL,x
lda DNSHostTTL+1
sta DNS.CACHE+S.DNSCACHE.TTL+1,x
lda DNSHostTTL+2
sta DNS.CACHE+S.DNSCACHE.TTL+2,x
lda DNSHostTTL+3
sta DNS.CACHE+S.DNSCACHE.TTL+3,x
ldy #0
.2 lda (ZPPtrIP),y
sta DNS.CACHE+S.DNSCACHE.RDATA,x
inx
iny
cpy #4
bne .2
clc
rts
.9 sec
rts
*--------------------------------------
DNS.GETCACHE >LDYA L.DNS.CACHE
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
PSTR2DNSHostName >STYA ZPTmpPtr1
lda (ZPTmpPtr1)
beq .9
cmp #K.DNS.MAXLEN-1
bcs .9
tay
inc
sta DNSHostNameLen
lda #0 Ending 0
sta DNSHostName+1,y
ldx #0
.1 lda (ZPTmpPtr1),y
and #$7f
cmp #'.'
beq .2
cmp #'A'
bcc .10
cmp #'Z'+1
bcs .10
adc #$20
.10 inx
bra .3
.2 txa
ldx #0
.3 sta DNSHostName,y
dey
bne .1
stx DNSHostName
clc
rts
.9 sec
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.DNS
LOAD LIB/LIBTCPIP.S
ASM