Skip to content
Snippets Groups Projects
Commit 179cb391 authored by Roman Khlopkov's avatar Roman Khlopkov 🔜
Browse files

[+] DNS client

parent 320c3f01
No related branches found
No related tags found
5 merge requests!251Master,!250Master,!162Bugs-4158,!159Bugs-4158,!156bugs-4158
Pipeline #3892 passed with stage
in 13 seconds
......@@ -78,6 +78,7 @@
#include "dap_stream_ch_chain_pkt.h"
#include "dap_stream_ch.h"
#include "dap_stream_ch_pkt.h"
#include "dap_dns_server.h"
#include "dap_module.h"
......@@ -406,6 +407,14 @@ static int s_net_states_proc(dap_chain_net_t * l_net)
case NODE_ROLE_FULL:
case NODE_ROLE_MASTER:
case NODE_ROLE_LIGHT:{
struct in_addr l_dns_addr, l_link_addr;
inet_aton("192.168.10.35", &l_dns_addr);
uint32_t l_addr = dap_dns_client_get_addr(l_dns_addr.s_addr);
l_link_addr.s_addr = l_addr;
log_it(L_DEBUG, "Root DNS returned %s", inet_ntoa(l_link_addr));
l_pvt_net->state = NET_STATE_OFFLINE;
l_pvt_net->state_target = NET_STATE_OFFLINE;
break;
// If we haven't any assigned shard - connect to root-0
if(1) { //if(l_net->pub.cell_id.uint64 == 0) {
......
......@@ -22,6 +22,8 @@
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sys/poll.h>
#include <errno.h>
#include "dap_dns_server.h"
#include "dap_udp_server.h"
#include "dap_udp_client.h"
......@@ -36,6 +38,7 @@
#define LOG_TAG "dap_dns_server"
static dap_dns_server_t *s_dns_server;
static pthread_mutex_t s_list_mutex;
static char s_root_alias[] = "dnsroot";
/**
......@@ -332,3 +335,89 @@ void dap_dns_server_stop() {
dap_udp_server_delete(s_dns_server->instance);
DAP_DELETE(s_dns_server);
}
int s_dns_get_ip(uint32_t a_addr, char *a_name, uint32_t *a_result)
{
const size_t l_buf_size = 1024;
uint8_t l_buf[l_buf_size];
dap_dns_buf_t l_dns_request = {};
l_dns_request.data = (char *)l_buf;
dap_dns_buf_put_uint16(&l_dns_request, rand() % 0xFFFF); // ID
dap_dns_message_flags_t l_flags = {};
dap_dns_buf_put_uint16(&l_dns_request, l_flags.val);
dap_dns_buf_put_uint16(&l_dns_request, 1); // we have only 1 question
dap_dns_buf_put_uint16(&l_dns_request, 0);
dap_dns_buf_put_uint16(&l_dns_request, 0);
dap_dns_buf_put_uint16(&l_dns_request, 0);
int l_ptr = 0;
uint8_t *l_cur = l_buf + l_dns_request.ptr;
for (int i = 0; i <= strlen(a_name); i++)
{
if (a_name[i] == '.' || a_name[i] == 0)
{
*l_cur++ = i - l_ptr;
for( ; l_ptr < i; l_ptr++)
{
*l_cur++ = a_name[l_ptr];
}
l_ptr++;
}
}
*l_cur++='\0';
l_dns_request.ptr = l_cur - l_buf;
dap_dns_buf_put_uint16(&l_dns_request, DNS_RECORD_TYPE_A);
dap_dns_buf_put_uint16(&l_dns_request, DNS_CLASS_TYPE_IN);
int32_t l_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (l_sock < 0 ) {
log_it ( L_ERROR, "Socket error %s", strerror(errno));
return -1;
}
struct sockaddr_in l_addr;
l_addr.sin_family = AF_INET;
l_addr.sin_port = DNS_LISTEN_PORT;
l_addr.sin_addr.s_addr = a_addr;
size_t l_portion = 0, l_len = l_dns_request.ptr;
for(size_t l_sent = 0; l_sent < l_len; l_sent += l_portion) {
l_portion = sendto(l_sock, l_buf + l_sent, l_len - l_sent, 0, (struct sockaddr *)&a_addr, sizeof(a_addr));
if (l_portion < 0 ) {
log_it(L_ERROR, "Some error occured in send() function");
break;
}
}
struct pollfd l_pfd = {};
l_pfd.fd = l_sock;
l_pfd.events = POLLIN;
int l_triggered = poll(&l_pfd, 1, 5000); // timeout 5 sec
if (!l_triggered || !l_pfd.revents & POLLIN) {
log_it(L_DEBUG, "poll() timeout");
return -2;
}
struct sockaddr_in l_clientaddr;
socklen_t l_clientlen = sizeof(l_clientaddr);
size_t l_recieved = recvfrom(l_sock, l_buf, l_buf_size, 0, (struct sockaddr *)&l_clientaddr, &l_clientlen);
int l_addr_point = DNS_HEADER_SIZE + 4 * sizeof(uint16_t) + strlen(a_name) + 1 + 2 * sizeof(uint16_t) + DNS_ANSWER_SIZE - sizeof(uint32_t);
if (l_recieved < l_addr_point) {
log_it(L_WARNING, "DNS answer incomplete");
return -4;
}
l_cur = l_buf + DNS_HEADER_SIZE + sizeof(uint16_t);
int l_answers_count = ntohs(*(uint16_t *)l_cur);
if (l_answers_count != 1) {
log_it(L_WARNING, "Incorrect DNS answer format");
return -4;
}
l_cur = l_buf + l_addr_point;
if (a_result) {
*a_result = ntohl(*(uint32_t *)l_cur);
}
return 0;
}
uint32_t dap_dns_client_get_addr(uint32_t a_dns_addr)
{
uint32_t l_res;
if (s_dns_get_ip(a_dns_addr, "kelvin.sync", &l_res)) {
return 0;
}
return l_res;
}
......@@ -123,3 +123,4 @@ void dap_dns_server_start();
void dap_dns_server_stop();
int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback);
int dap_dns_zone_unregister(char *zone);
uint32_t dap_dns_client_get_addr(uint32_t a_dns_addr);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment