Files
smartdns/src/dns_client.h
2019-12-15 01:26:48 +08:00

88 lines
2.3 KiB
C

#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