|
@@ -1074,6 +1074,7 @@ static int _dns_client_server_add(char *server_ip, char *server_host, int port,
|
|
char port_s[8];
|
|
char port_s[8];
|
|
int sock_type = 0;
|
|
int sock_type = 0;
|
|
char skip_check_cert = 0;
|
|
char skip_check_cert = 0;
|
|
|
|
+ char ifname[IFNAMSIZ * 2] = {0};
|
|
|
|
|
|
switch (server_type) {
|
|
switch (server_type) {
|
|
case DNS_SERVER_UDP: {
|
|
case DNS_SERVER_UDP: {
|
|
@@ -1110,8 +1111,10 @@ static int _dns_client_server_add(char *server_ip, char *server_host, int port,
|
|
sock_type = SOCK_STREAM;
|
|
sock_type = SOCK_STREAM;
|
|
break;
|
|
break;
|
|
case DNS_SERVER_MDNS: {
|
|
case DNS_SERVER_MDNS: {
|
|
- struct client_dns_server_flag_mdns *flag_mdns = &flags->mdns;
|
|
|
|
- safe_strncpy(flag_mdns->ifname, server_host, DNS_MAX_CNAME_LEN);
|
|
|
|
|
|
+ if (flags->ifname[0] == '\0') {
|
|
|
|
+ tlog(TLOG_ERROR, "mdns server must set ifname.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
sock_type = SOCK_DGRAM;
|
|
sock_type = SOCK_DGRAM;
|
|
} break;
|
|
} break;
|
|
default:
|
|
default:
|
|
@@ -1220,7 +1223,12 @@ static int _dns_client_server_add(char *server_ip, char *server_host, int port,
|
|
|
|
|
|
_dns_server_inc_server_num(server_info);
|
|
_dns_server_inc_server_num(server_info);
|
|
freeaddrinfo(gai);
|
|
freeaddrinfo(gai);
|
|
- tlog(TLOG_INFO, "add server %s:%d, type: %s", server_ip, port, _dns_server_get_type_string(server_info->type));
|
|
|
|
|
|
+
|
|
|
|
+ if (flags->ifname[0]) {
|
|
|
|
+ snprintf(ifname, sizeof(ifname), "@%s", flags->ifname);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ tlog(TLOG_INFO, "add server %s:%d%s, type: %s", server_ip, port, ifname, _dns_server_get_type_string(server_info->type));
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
errout:
|
|
errout:
|
|
@@ -1876,6 +1884,17 @@ static int _dns_client_create_socket_udp_proxy(struct dns_server_info *server_in
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (server_info->flags.ifname[0] != '\0') {
|
|
|
|
+ struct ifreq ifr;
|
|
|
|
+ memset(&ifr, 0, sizeof(struct ifreq));
|
|
|
|
+ safe_strncpy(ifr.ifr_name, server_info->flags.ifname, sizeof(ifr.ifr_name));
|
|
|
|
+ ioctl(fd, SIOCGIFINDEX, &ifr);
|
|
|
|
+ if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)) < 0) {
|
|
|
|
+ tlog(TLOG_ERROR, "bind socket to device %s failed, %s\n", ifr.ifr_name, strerror(errno));
|
|
|
|
+ goto errout;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
set_fd_nonblock(fd, 1);
|
|
set_fd_nonblock(fd, 1);
|
|
set_sock_keepalive(fd, 30, 3, 5);
|
|
set_sock_keepalive(fd, 30, 3, 5);
|
|
|
|
|
|
@@ -1932,6 +1951,17 @@ static int _dns_client_create_socket_udp(struct dns_server_info *server_info)
|
|
goto errout;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (server_info->flags.ifname[0] != '\0') {
|
|
|
|
+ struct ifreq ifr;
|
|
|
|
+ memset(&ifr, 0, sizeof(struct ifreq));
|
|
|
|
+ safe_strncpy(ifr.ifr_name, server_info->flags.ifname, sizeof(ifr.ifr_name));
|
|
|
|
+ ioctl(fd, SIOCGIFINDEX, &ifr);
|
|
|
|
+ if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)) < 0) {
|
|
|
|
+ tlog(TLOG_ERROR, "bind socket to device %s failed, %s\n", ifr.ifr_name, strerror(errno));
|
|
|
|
+ goto errout;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
server_info->fd = fd;
|
|
server_info->fd = fd;
|
|
server_info->status = DNS_SERVER_STATUS_CONNECTIONLESS;
|
|
server_info->status = DNS_SERVER_STATUS_CONNECTIONLESS;
|
|
|
|
|
|
@@ -2005,7 +2035,7 @@ static int _dns_client_create_socket_udp_mdns(struct dns_server_info *server_inf
|
|
|
|
|
|
struct ifreq ifr;
|
|
struct ifreq ifr;
|
|
memset(&ifr, 0, sizeof(struct ifreq));
|
|
memset(&ifr, 0, sizeof(struct ifreq));
|
|
- safe_strncpy(ifr.ifr_name, server_info->flags.mdns.ifname, sizeof(ifr.ifr_name));
|
|
|
|
|
|
+ safe_strncpy(ifr.ifr_name, server_info->flags.ifname, sizeof(ifr.ifr_name));
|
|
ioctl(fd, SIOCGIFINDEX, &ifr);
|
|
ioctl(fd, SIOCGIFINDEX, &ifr);
|
|
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)) < 0) {
|
|
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)) < 0) {
|
|
tlog(TLOG_ERROR, "bind socket to device %s failed, %s\n", ifr.ifr_name, strerror(errno));
|
|
tlog(TLOG_ERROR, "bind socket to device %s failed, %s\n", ifr.ifr_name, strerror(errno));
|
|
@@ -2074,6 +2104,17 @@ static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info)
|
|
goto errout;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (server_info->flags.ifname[0] != '\0') {
|
|
|
|
+ struct ifreq ifr;
|
|
|
|
+ memset(&ifr, 0, sizeof(struct ifreq));
|
|
|
|
+ safe_strncpy(ifr.ifr_name, server_info->flags.ifname, sizeof(ifr.ifr_name));
|
|
|
|
+ ioctl(fd, SIOCGIFINDEX, &ifr);
|
|
|
|
+ if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)) < 0) {
|
|
|
|
+ tlog(TLOG_ERROR, "bind socket to device %s failed, %s\n", ifr.ifr_name, strerror(errno));
|
|
|
|
+ goto errout;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (set_fd_nonblock(fd, 1) != 0) {
|
|
if (set_fd_nonblock(fd, 1) != 0) {
|
|
tlog(TLOG_ERROR, "set socket non block failed, %s", strerror(errno));
|
|
tlog(TLOG_ERROR, "set socket non block failed, %s", strerror(errno));
|
|
goto errout;
|
|
goto errout;
|
|
@@ -2172,6 +2213,17 @@ static int _DNS_client_create_socket_tls(struct dns_server_info *server_info, ch
|
|
fd = socket(server_info->ai_family, SOCK_STREAM, 0);
|
|
fd = socket(server_info->ai_family, SOCK_STREAM, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (server_info->flags.ifname[0] != '\0') {
|
|
|
|
+ struct ifreq ifr;
|
|
|
|
+ memset(&ifr, 0, sizeof(struct ifreq));
|
|
|
|
+ safe_strncpy(ifr.ifr_name, server_info->flags.ifname, sizeof(ifr.ifr_name));
|
|
|
|
+ ioctl(fd, SIOCGIFINDEX, &ifr);
|
|
|
|
+ if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)) < 0) {
|
|
|
|
+ tlog(TLOG_ERROR, "bind socket to device %s failed, %s\n", ifr.ifr_name, strerror(errno));
|
|
|
|
+ goto errout;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
ssl = SSL_new(server_info->ssl_ctx);
|
|
ssl = SSL_new(server_info->ssl_ctx);
|
|
if (ssl == NULL) {
|
|
if (ssl == NULL) {
|
|
tlog(TLOG_ERROR, "new ssl failed, %s", server_info->ip);
|
|
tlog(TLOG_ERROR, "new ssl failed, %s", server_info->ip);
|
|
@@ -4611,15 +4663,16 @@ static int _dns_client_add_mdns_server(void)
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef TEST
|
|
#ifdef TEST
|
|
- ret = _dns_client_server_add(DNS_MDNS_IP, "lo", DNS_MDNS_PORT, DNS_SERVER_MDNS, &server_flags);
|
|
|
|
|
|
+ safe_strncpy(server_flags.ifname, "lo", sizeof(server_flags.ifname));
|
|
|
|
+ ret = _dns_client_server_add(DNS_MDNS_IP, "", DNS_MDNS_PORT, DNS_SERVER_MDNS, &server_flags);
|
|
if (ret != 0) {
|
|
if (ret != 0) {
|
|
- tlog(TLOG_ERROR, "add mdns server failed.");
|
|
|
|
|
|
+ tlog(TLOG_ERROR, "add mdns server to %s failed.", "lo");
|
|
goto errout;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
|
|
if (dns_client_add_to_group(DNS_SERVER_GROUP_MDNS, DNS_MDNS_IP, DNS_MDNS_PORT, DNS_SERVER_MDNS, &server_flags) !=
|
|
if (dns_client_add_to_group(DNS_SERVER_GROUP_MDNS, DNS_MDNS_IP, DNS_MDNS_PORT, DNS_SERVER_MDNS, &server_flags) !=
|
|
0) {
|
|
0) {
|
|
- tlog(TLOG_ERROR, "add mdns server to group failed.");
|
|
|
|
|
|
+ tlog(TLOG_ERROR, "add mdns server to group %s failed.", DNS_SERVER_GROUP_MDNS);
|
|
goto errout;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4654,7 +4707,8 @@ static int _dns_client_add_mdns_server(void)
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = _dns_client_server_add(DNS_MDNS_IP, ifa->ifa_name, DNS_MDNS_PORT, DNS_SERVER_MDNS, &server_flags);
|
|
|
|
|
|
+ safe_strncpy(server_flags.ifname, ifa->ifa_name, sizeof(server_flags.ifname));
|
|
|
|
+ ret = _dns_client_server_add(DNS_MDNS_IP, "", DNS_MDNS_PORT, DNS_SERVER_MDNS, &server_flags);
|
|
if (ret != 0) {
|
|
if (ret != 0) {
|
|
tlog(TLOG_ERROR, "add mdns server failed.");
|
|
tlog(TLOG_ERROR, "add mdns server failed.");
|
|
goto errout;
|
|
goto errout;
|