82 lines
1.5 KiB
Forth

( DNS JCB 19:44 11/27/10)
module[ dns"
: ip-dns@ ip-dns 2@ ;
\ ( offset -- offset' ) advance pointer past DNS label
\ 0 means end
\ >h# c0 means ptr to end
\ N means word of N bytes
: dns-skiplabel
begin
dup 1+ swap mac-inoffset macc@ \ offset+1 v
dup 0= if
drop exit
then
dup h# c0 >= if
drop 1+ exit
then
+
again
;
\ Query DNS. xt is a word that appends domainname to packet. id is DNS
\ id field, used to route responses.
: dns-query ( xt id -- )
>r
\ dst-port src-port dst-ip src-ip *ethaddr
d# 53 d# 31947
ip-dns@
net-my-ip
ip-dns@ arp-lookup
udp-header
r> \ IDENTIFICATION
h# 0100 \ FLAGS
d# 1 \ NOQ
mac-pkt-3,
d# 3 mac-pkt-,0
execute
d# 1 \ query type A
dup \ query class internet
mac-pkt-2,
udp-wrapup
ip-dns@ arp-lookup if
mac-send
then
;
: dns-handler ( srcport dstport -- 0 / ip. id 1 )
d# 53 d# 31947 d=
OFFSET_DNS_FLAGS packet@ 0< and
OFFSET_DNS_NOA packet@ 0<> and
if
OFFSET_DNS_QUERY
dns-skiplabel
d# 4 +
dns-skiplabel
d# 10 +
mac-inoffset d# 2 swap mac@n
OFFSET_DNS_IDENTIFICATION packet@
d# 1
else
d# 0
then
;
: dns-appendname ( str -- )
dup mac-pkt-c,
mac-pkt-s,
;
: dns-append.com ( str -- )
dns-appendname
s" com" dns-appendname
d# 0 mac-pkt-c,
;
]module