dns.fs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. ( DNS JCB 19:44 11/27/10)
  2. module[ dns"
  3. : ip-dns@ ip-dns 2@ ;
  4. \ ( offset -- offset' ) advance pointer past DNS label
  5. \ 0 means end
  6. \ >h# c0 means ptr to end
  7. \ N means word of N bytes
  8. : dns-skiplabel
  9. begin
  10. dup 1+ swap mac-inoffset macc@ \ offset+1 v
  11. dup 0= if
  12. drop exit
  13. then
  14. dup h# c0 >= if
  15. drop 1+ exit
  16. then
  17. +
  18. again
  19. ;
  20. \ Query DNS. xt is a word that appends domainname to packet. id is DNS
  21. \ id field, used to route responses.
  22. : dns-query ( xt id -- )
  23. >r
  24. \ dst-port src-port dst-ip src-ip *ethaddr
  25. d# 53 d# 31947
  26. ip-dns@
  27. net-my-ip
  28. ip-dns@ arp-lookup
  29. udp-header
  30. r> \ IDENTIFICATION
  31. h# 0100 \ FLAGS
  32. d# 1 \ NOQ
  33. mac-pkt-3,
  34. d# 3 mac-pkt-,0
  35. execute
  36. d# 1 \ query type A
  37. dup \ query class internet
  38. mac-pkt-2,
  39. udp-wrapup
  40. ip-dns@ arp-lookup if
  41. mac-send
  42. then
  43. ;
  44. : dns-handler ( srcport dstport -- 0 / ip. id 1 )
  45. d# 53 d# 31947 d=
  46. OFFSET_DNS_FLAGS packet@ 0< and
  47. OFFSET_DNS_NOA packet@ 0<> and
  48. if
  49. OFFSET_DNS_QUERY
  50. dns-skiplabel
  51. d# 4 +
  52. dns-skiplabel
  53. d# 10 +
  54. mac-inoffset d# 2 swap mac@n
  55. OFFSET_DNS_IDENTIFICATION packet@
  56. d# 1
  57. else
  58. d# 0
  59. then
  60. ;
  61. : dns-appendname ( str -- )
  62. dup mac-pkt-c,
  63. mac-pkt-s,
  64. ;
  65. : dns-append.com ( str -- )
  66. dns-appendname
  67. s" com" dns-appendname
  68. d# 0 mac-pkt-c,
  69. ;
  70. ]module