#ifndef _SMART_DNS_CLIENT_H #define _SMART_DNS_CLIENT_H #include "dns.h" #define DNS_SERVER_SPKI_LEN 64 #define DNS_SERVER_GROUP_DEFAULT "default" typedef enum { DNS_SERVER_UDP, DNS_SERVER_TCP, DNS_SERVER_TLS, DNS_SERVER_HTTPS, DNS_SERVER_TYPE_END, } dns_server_type_t; typedef enum dns_result_type { DNS_QUERY_ERR, DNS_QUERY_RESULT = 1, DNS_QUERY_END, } dns_result_type; #define DNSSERVER_FLAG_BLACKLIST_IP (0x1 << 0) #define DNSSERVER_FLAG_CHECK_EDNS (0x1 << 1) #define DNSSERVER_FLAG_CHECK_TTL (0x1 << 2) int dns_client_init(void); int dns_client_set_ecs(char *ip, int subnet); /* query result notify function */ typedef int (*dns_client_callback)(char *domain, dns_result_type rtype, unsigned int result_flag, struct dns_packet *packet, unsigned char *inpacket, int inpacket_len, void *user_ptr); /* query domain */ int dns_client_query(char *domain, int qtype, dns_client_callback callback, void *user_ptr, const char *group_name); void dns_client_exit(void); struct client_dns_server_flag_udp { int ttl; }; struct client_dns_server_flag_tls { char spki[DNS_SERVER_SPKI_LEN]; int spi_len; char hostname[DNS_MAX_CNAME_LEN]; }; struct client_dns_server_flag_https { char spki[DNS_SERVER_SPKI_LEN]; int spi_len; char hostname[DNS_MAX_CNAME_LEN]; char httphost[DNS_MAX_CNAME_LEN]; char path[DNS_MAX_CNAME_LEN]; }; struct client_dns_server_flags { dns_server_type_t type; unsigned int server_flag; unsigned int result_flag; union { struct client_dns_server_flag_udp udp; struct client_dns_server_flag_tls tls; struct client_dns_server_flag_https https; }; }; int dns_client_spki_decode(const char *spki, unsigned char *spki_data_out); /* add remote dns server */ int dns_client_add_server(char *server_ip, int port, dns_server_type_t server_type, struct client_dns_server_flags *flags); /* remove remote dns server */ int dns_client_remove_server(char *server_ip, int port, dns_server_type_t server_type); int dns_client_add_group(char *group_name); int dns_client_add_to_group(char *group_name, char *server_ip, int port, dns_server_type_t server_type); int dns_client_remove_from_group(char *group_name, char *server_ip, int port, dns_server_type_t server_type); int dns_client_remove_group(char *group_name); int dns_server_num(void); #endif