dns.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef HV_DNS_H_
  2. #define HV_DNS_H_
  3. #include "hexport.h"
  4. #include "hplatform.h"
  5. #define DNS_PORT 53
  6. #define DNS_QUERY 0
  7. #define DNS_RESPONSE 1
  8. #define DNS_TYPE_A 1 // ipv4
  9. #define DNS_TYPE_NS 2
  10. #define DNS_TYPE_CNAME 5
  11. #define DNS_TYPE_SOA 6
  12. #define DNS_TYPE_WKS 11
  13. #define DNS_TYPE_PTR 12
  14. #define DNS_TYPE_HINFO 13
  15. #define DNS_TYPE_MX 15
  16. #define DNS_TYPE_AAAA 28 // ipv6
  17. #define DNS_TYPE_AXFR 252
  18. #define DNS_TYPE_ANY 255
  19. #define DNS_CLASS_IN 1
  20. #define DNS_NAME_MAXLEN 256
  21. // sizeof(dnshdr_t) = 12
  22. typedef struct dnshdr_s {
  23. uint16_t transaction_id;
  24. // flags
  25. #if BYTE_ORDER == LITTLE_ENDIAN
  26. uint8_t rd:1;
  27. uint8_t tc:1;
  28. uint8_t aa:1;
  29. uint8_t opcode:4;
  30. uint8_t qr:1;
  31. uint8_t rcode:4;
  32. uint8_t cd:1;
  33. uint8_t ad:1;
  34. uint8_t res:1;
  35. uint8_t ra:1;
  36. #elif BYTE_ORDER == BIG_ENDIAN
  37. uint8_t qr:1; // DNS_QUERY or DNS_RESPONSE
  38. uint8_t opcode:4;
  39. uint8_t aa:1; // authoritative
  40. uint8_t tc:1; // truncated
  41. uint8_t rd:1; // recursion desired
  42. uint8_t ra:1; // recursion available
  43. uint8_t res:1; // reserved
  44. uint8_t ad:1; // authenticated data
  45. uint8_t cd:1; // checking disable
  46. uint8_t rcode:4;
  47. #else
  48. #error "BYTE_ORDER undefined!"
  49. #endif
  50. uint16_t nquestion;
  51. uint16_t nanswer;
  52. uint16_t nauthority;
  53. uint16_t naddtional;
  54. } dnshdr_t;
  55. typedef struct dns_rr_s {
  56. char name[DNS_NAME_MAXLEN]; // original domain, such as www.example.com
  57. uint16_t rtype;
  58. uint16_t rclass;
  59. uint32_t ttl;
  60. uint16_t datalen;
  61. char* data;
  62. } dns_rr_t;
  63. typedef struct dns_s {
  64. dnshdr_t hdr;
  65. dns_rr_t* questions;
  66. dns_rr_t* answers;
  67. dns_rr_t* authorities;
  68. dns_rr_t* addtionals;
  69. } dns_t;
  70. BEGIN_EXTERN_C
  71. // www.example.com => 3www7example3com
  72. HV_EXPORT int dns_name_encode(const char* domain, char* buf);
  73. // 3www7example3com => www.example.com
  74. HV_EXPORT int dns_name_decode(const char* buf, char* domain);
  75. HV_EXPORT int dns_rr_pack(dns_rr_t* rr, char* buf, int len);
  76. HV_EXPORT int dns_rr_unpack(char* buf, int len, dns_rr_t* rr, int is_question);
  77. HV_EXPORT int dns_pack(dns_t* dns, char* buf, int len);
  78. HV_EXPORT int dns_unpack(char* buf, int len, dns_t* dns);
  79. // NOTE: free dns->rrs
  80. HV_EXPORT void dns_free(dns_t* dns);
  81. // dns_pack -> sendto -> recvfrom -> dns_unpack
  82. HV_EXPORT int dns_query(dns_t* query, dns_t* response, const char* nameserver DEFAULT("127.0.1.1"));
  83. // domain -> dns_t query; -> dns_query -> dns_t response; -> addrs
  84. HV_EXPORT int nslookup(const char* domain, uint32_t* addrs, int naddr, const char* nameserver DEFAULT("127.0.1.1"));
  85. END_EXTERN_C
  86. #endif // HV_DNS_H_