4 * Network implementation
5 * All network related functions are grouped here
7 * a Net::DNS like library for C
9 * (c) NLnet Labs, 2004-2006
11 * See the file LICENSE for the license
14 #include <ldns/config.h>
16 #include <ldns/ldns.h>
18 #ifdef HAVE_NETINET_IN_H
19 #include <netinet/in.h>
21 #ifdef HAVE_SYS_SOCKET_H
22 #include <sys/socket.h>
27 #ifdef HAVE_ARPA_INET_H
28 #include <arpa/inet.h>
35 ldns_send(ldns_pkt
**result_packet
, ldns_resolver
*r
, const ldns_pkt
*query_pkt
)
39 ldns_rdf
*tsig_mac
= NULL
;
41 qb
= ldns_buffer_new(LDNS_MIN_BUFLEN
);
43 if (query_pkt
&& ldns_pkt_tsig(query_pkt
)) {
44 tsig_mac
= ldns_rr_rdf(ldns_pkt_tsig(query_pkt
), 3);
48 ldns_pkt2buffer_wire(qb
, query_pkt
) != LDNS_STATUS_OK
) {
49 result
= LDNS_STATUS_ERR
;
51 result
= ldns_send_buffer(result_packet
, r
, qb
, tsig_mac
);
59 /* code from rdata.c */
60 static struct sockaddr_storage
*
61 ldns_rdf2native_sockaddr_storage_port(
62 const ldns_rdf
*rd
, uint16_t port
, size_t *size
)
64 struct sockaddr_storage
*data
;
65 struct sockaddr_in
*data_in
;
66 struct sockaddr_in6
*data_in6
;
68 data
= LDNS_MALLOC(struct sockaddr_storage
);
72 /* zero the structure for portability */
73 memset(data
, 0, sizeof(struct sockaddr_storage
));
75 switch(ldns_rdf_get_type(rd
)) {
78 data
->ss_family
= AF_INET
;
80 data_in
= (struct sockaddr_in
*) data
;
81 data_in
->sin_port
= (in_port_t
)htons(port
);
82 memcpy(&(data_in
->sin_addr
), ldns_rdf_data(rd
), ldns_rdf_size(rd
));
83 *size
= sizeof(struct sockaddr_in
);
85 case LDNS_RDF_TYPE_AAAA
:
87 data
->ss_family
= AF_INET6
;
89 data_in6
= (struct sockaddr_in6
*) data
;
90 data_in6
->sin6_port
= (in_port_t
)htons(port
);
91 memcpy(&data_in6
->sin6_addr
, ldns_rdf_data(rd
), ldns_rdf_size(rd
));
92 *size
= sizeof(struct sockaddr_in6
);
100 struct sockaddr_storage
*
101 ldns_rdf2native_sockaddr_storage(
102 const ldns_rdf
*rd
, uint16_t port
, size_t *size
)
104 return ldns_rdf2native_sockaddr_storage_port(
105 rd
, (port
== 0 ? (uint16_t)LDNS_PORT
: port
), size
);
108 /** best effort to set nonblocking */
110 ldns_sock_nonblock(int sockfd
)
114 if((flag
= fcntl(sockfd
, F_GETFL
)) != -1) {
116 if(fcntl(sockfd
, F_SETFL
, flag
) == -1) {
117 /* ignore error, continue blockingly */
120 #elif defined(HAVE_IOCTLSOCKET)
121 unsigned long on
= 1;
122 if(ioctlsocket(sockfd
, FIONBIO
, &on
) != 0) {
123 /* ignore error, continue blockingly */
128 /** best effort to set blocking */
130 ldns_sock_block(int sockfd
)
134 if((flag
= fcntl(sockfd
, F_GETFL
)) != -1) {
136 if(fcntl(sockfd
, F_SETFL
, flag
) == -1) {
137 /* ignore error, continue */
140 #elif defined(HAVE_IOCTLSOCKET)
141 unsigned long off
= 0;
142 if(ioctlsocket(sockfd
, FIONBIO
, &off
) != 0) {
143 /* ignore error, continue */
148 /** wait for a socket to become ready */
150 ldns_sock_wait(int sockfd
, struct timeval timeout
, int write
)
156 FD_SET(FD_SET_T sockfd
, &fds
);
158 ret
= select(sockfd
+1, NULL
, &fds
, NULL
, &timeout
);
160 ret
= select(sockfd
+1, &fds
, NULL
, NULL
, &timeout
);
163 /* timeout expired */
173 ldns_tcp_connect_from(const struct sockaddr_storage
*to
, socklen_t tolen
,
174 const struct sockaddr_storage
*from
, socklen_t fromlen
,
175 struct timeval timeout
)
180 if ((sockfd
= socket((int)((struct sockaddr
*)to
)->sa_family
, SOCK_STREAM
,
181 IPPROTO_TCP
)) == -1) {
185 if (from
&& bind(sockfd
, (const struct sockaddr
*)from
, fromlen
) == -1){
189 /* perform nonblocking connect, to be able to wait with select() */
190 ldns_sock_nonblock(sockfd
);
191 if (connect(sockfd
, (struct sockaddr
*)to
, tolen
) == -1) {
194 if(errno
!= EINPROGRESS
) {
201 #else /* USE_WINSOCK */
202 if(WSAGetLastError() != WSAEINPROGRESS
&&
203 WSAGetLastError() != WSAEWOULDBLOCK
) {
208 /* error was only telling us that it would block */
211 /* wait(write) until connected or error */
214 socklen_t len
= (socklen_t
)sizeof(error
);
216 if(!ldns_sock_wait(sockfd
, timeout
, 1)) {
225 /* check if there is a pending error for nonblocking connect */
226 if(getsockopt(sockfd
, SOL_SOCKET
, SO_ERROR
, (void*)&error
,
229 error
= errno
; /* on solaris errno is error */
231 error
= WSAGetLastError();
235 #if defined(EINPROGRESS) && defined(EWOULDBLOCK)
236 if(error
== EINPROGRESS
|| error
== EWOULDBLOCK
)
237 continue; /* try again */
239 else if(error
!= 0) {
241 /* error in errno for our user */
245 #else /* USE_WINSOCK */
246 if(error
== WSAEINPROGRESS
)
248 else if(error
== WSAEWOULDBLOCK
)
250 else if(error
!= 0) {
255 #endif /* USE_WINSOCK */
260 /* set the socket blocking again */
261 ldns_sock_block(sockfd
);
267 ldns_tcp_connect(const struct sockaddr_storage
*to
, socklen_t tolen
,
268 struct timeval timeout
)
270 return ldns_tcp_connect_from(to
, tolen
, NULL
, 0, timeout
);
274 ldns_tcp_bgsend_from(ldns_buffer
*qbin
,
275 const struct sockaddr_storage
*to
, socklen_t tolen
,
276 const struct sockaddr_storage
*from
, socklen_t fromlen
,
277 struct timeval timeout
)
281 sockfd
= ldns_tcp_connect_from(to
, tolen
, from
, fromlen
, timeout
);
287 if (ldns_tcp_send_query(qbin
, sockfd
, to
, tolen
) == 0) {
300 ldns_tcp_bgsend(ldns_buffer
*qbin
,
301 const struct sockaddr_storage
*to
, socklen_t tolen
,
302 struct timeval timeout
)
304 return ldns_tcp_bgsend_from(qbin
, to
, tolen
, NULL
, 0, timeout
);
308 /* keep in mind that in DNS tcp messages the first 2 bytes signal the
309 * amount data to expect
312 ldns_tcp_send_from(uint8_t **result
, ldns_buffer
*qbin
,
313 const struct sockaddr_storage
*to
, socklen_t tolen
,
314 const struct sockaddr_storage
*from
, socklen_t fromlen
,
315 struct timeval timeout
, size_t *answer_size
)
320 sockfd
= ldns_tcp_bgsend_from(qbin
, to
, tolen
, from
, fromlen
, timeout
);
323 return LDNS_STATUS_ERR
;
326 answer
= ldns_tcp_read_wire_timeout(sockfd
, answer_size
, timeout
);
333 if (*answer_size
== 0) {
335 return LDNS_STATUS_NETWORK_ERR
;
338 /* resize accordingly */
339 *result
= LDNS_XREALLOC(answer
, uint8_t, (size_t)*answer_size
);
342 return LDNS_STATUS_MEM_ERR
;
344 return LDNS_STATUS_OK
;
348 ldns_tcp_send(uint8_t **result
, ldns_buffer
*qbin
,
349 const struct sockaddr_storage
*to
, socklen_t tolen
,
350 struct timeval timeout
, size_t *answer_size
)
352 return ldns_tcp_send_from(result
, qbin
,
353 to
, tolen
, NULL
, 0, timeout
, answer_size
);
357 ldns_udp_connect(const struct sockaddr_storage
*to
, struct timeval
ATTR_UNUSED(timeout
))
362 if ((sockfd
= socket((int)((struct sockaddr
*)to
)->sa_family
, SOCK_DGRAM
,
372 ldns_udp_bgsend_from(ldns_buffer
*qbin
,
373 const struct sockaddr_storage
*to
, socklen_t tolen
,
374 const struct sockaddr_storage
*from
, socklen_t fromlen
,
375 struct timeval timeout
)
379 sockfd
= ldns_udp_connect(to
, timeout
);
385 if (from
&& bind(sockfd
, (const struct sockaddr
*)from
, fromlen
) == -1){
389 if (ldns_udp_send_query(qbin
, sockfd
, to
, tolen
) == 0) {
401 ldns_udp_bgsend(ldns_buffer
*qbin
,
402 const struct sockaddr_storage
*to
, socklen_t tolen
,
403 struct timeval timeout
)
405 return ldns_udp_bgsend_from(qbin
, to
, tolen
, NULL
, 0, timeout
);
409 ldns_udp_send_from(uint8_t **result
, ldns_buffer
*qbin
,
410 const struct sockaddr_storage
*to
, socklen_t tolen
,
411 const struct sockaddr_storage
*from
, socklen_t fromlen
,
412 struct timeval timeout
, size_t *answer_size
)
417 sockfd
= ldns_udp_bgsend_from(qbin
, to
, tolen
, from
, fromlen
, timeout
);
420 return LDNS_STATUS_SOCKET_ERROR
;
423 /* wait for an response*/
424 if(!ldns_sock_wait(sockfd
, timeout
, 0)) {
430 return LDNS_STATUS_NETWORK_ERR
;
433 /* set to nonblocking, so if the checksum is bad, it becomes
434 * an EGAIN error and the ldns_udp_send function does not block,
435 * but returns a 'NETWORK_ERROR' much like a timeout. */
436 ldns_sock_nonblock(sockfd
);
438 answer
= ldns_udp_read_wire(sockfd
, answer_size
, NULL
, NULL
);
445 if (*answer_size
== 0) {
447 return LDNS_STATUS_NETWORK_ERR
;
451 return LDNS_STATUS_OK
;
455 ldns_udp_send(uint8_t **result
, ldns_buffer
*qbin
,
456 const struct sockaddr_storage
*to
, socklen_t tolen
,
457 struct timeval timeout
, size_t *answer_size
)
459 return ldns_udp_send_from(result
, qbin
, to
, tolen
, NULL
, 0,
460 timeout
, answer_size
);
464 ldns_send_buffer(ldns_pkt
**result
, ldns_resolver
*r
, ldns_buffer
*qb
, ldns_rdf
*tsig_mac
)
468 struct sockaddr_storage
*src
= NULL
;
470 struct sockaddr_storage
*ns
;
478 bool all_servers_rtt_inf
;
481 uint8_t *reply_bytes
= NULL
;
482 size_t reply_size
= 0;
483 ldns_status status
, send_status
;
487 status
= LDNS_STATUS_OK
;
488 rtt
= ldns_resolver_rtt(r
);
489 ns_array
= ldns_resolver_nameservers(r
);
493 all_servers_rtt_inf
= true;
495 if (ldns_resolver_random(r
)) {
496 ldns_resolver_nameservers_randomize(r
);
499 if(ldns_resolver_source(r
)) {
500 src
= ldns_rdf2native_sockaddr_storage_port(
501 ldns_resolver_source(r
), 0, &src_len
);
504 /* loop through all defined nameservers */
505 for (i
= 0; i
< ldns_resolver_nameserver_count(r
); i
++) {
506 if (rtt
[i
] == LDNS_RESOLV_RTT_INF
) {
507 /* not reachable nameserver! */
511 /* maybe verbosity setting?
512 printf("Sending to ");
513 ldns_rdf_print(stdout, ns_array[i]);
516 ns
= ldns_rdf2native_sockaddr_storage(ns_array
[i
],
517 ldns_resolver_port(r
), &ns_len
);
521 if ((ns
->ss_family
== AF_INET
) &&
522 (ldns_resolver_ip6(r
) == LDNS_RESOLV_INET6
)) {
528 if ((ns
->ss_family
== AF_INET6
) &&
529 (ldns_resolver_ip6(r
) == LDNS_RESOLV_INET
)) {
536 all_servers_rtt_inf
= false;
538 gettimeofday(&tv_s
, NULL
);
540 send_status
= LDNS_STATUS_ERR
;
542 /* reply_bytes implicitly handles our error */
543 if (ldns_resolver_usevc(r
)) {
544 for (retries
= ldns_resolver_retry(r
); retries
> 0; retries
--) {
546 ldns_tcp_send_from(&reply_bytes
, qb
,
547 ns
, (socklen_t
)ns_len
,
548 src
, (socklen_t
)src_len
,
549 ldns_resolver_timeout(r
),
551 if (send_status
== LDNS_STATUS_OK
) {
556 for (retries
= ldns_resolver_retry(r
); retries
> 0; retries
--) {
557 /* ldns_rdf_print(stdout, ns_array[i]); */
559 ldns_udp_send_from(&reply_bytes
, qb
,
560 ns
, (socklen_t
)ns_len
,
561 src
, (socklen_t
)src_len
,
562 ldns_resolver_timeout(r
),
564 if (send_status
== LDNS_STATUS_OK
) {
570 if (send_status
!= LDNS_STATUS_OK
) {
571 ldns_resolver_set_nameserver_rtt(r
, i
, LDNS_RESOLV_RTT_INF
);
572 status
= send_status
;
575 /* obey the fail directive */
577 /* the current nameserver seems to have a problem, blacklist it */
578 if (ldns_resolver_fail(r
)) {
580 return LDNS_STATUS_ERR
;
587 status
= ldns_wire2pkt(&reply
, reply_bytes
, reply_size
);
588 if (status
!= LDNS_STATUS_OK
) {
589 LDNS_FREE(reply_bytes
);
595 gettimeofday(&tv_e
, NULL
);
598 ldns_pkt_set_querytime(reply
, (uint32_t)
599 ((tv_e
.tv_sec
- tv_s
.tv_sec
) * 1000) +
600 (tv_e
.tv_usec
- tv_s
.tv_usec
) / 1000);
601 ldns_pkt_set_answerfrom(reply
,
602 ldns_rdf_clone(ns_array
[i
]));
603 ldns_pkt_set_timestamp(reply
, tv_s
);
604 ldns_pkt_set_size(reply
, reply_size
);
607 if (ldns_resolver_fail(r
)) {
608 /* if fail is set bail out, after the first
614 /* wait retrans seconds... */
615 sleep((unsigned int) ldns_resolver_retrans(r
));
621 if (all_servers_rtt_inf
) {
622 LDNS_FREE(reply_bytes
);
623 return LDNS_STATUS_RES_NO_NS
;
626 if (tsig_mac
&& reply
&& reply_bytes
) {
627 if (!ldns_pkt_tsig_verify(reply
,
630 ldns_resolver_tsig_keyname(r
),
631 ldns_resolver_tsig_keydata(r
), tsig_mac
)) {
632 status
= LDNS_STATUS_CRYPTO_TSIG_BOGUS
;
637 #endif /* HAVE_SSL */
639 LDNS_FREE(reply_bytes
);
648 ldns_tcp_send_query(ldns_buffer
*qbin
, int sockfd
,
649 const struct sockaddr_storage
*to
, socklen_t tolen
)
654 /* add length of packet */
655 sendbuf
= LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin
) + 2);
656 if(!sendbuf
) return 0;
657 ldns_write_uint16(sendbuf
, ldns_buffer_position(qbin
));
658 memcpy(sendbuf
+ 2, ldns_buffer_begin(qbin
), ldns_buffer_position(qbin
));
660 bytes
= sendto(sockfd
, (void*)sendbuf
,
661 ldns_buffer_position(qbin
) + 2, 0, (struct sockaddr
*)to
, tolen
);
665 if (bytes
== -1 || (size_t) bytes
!= ldns_buffer_position(qbin
) + 2 ) {
671 /* don't wait for an answer */
673 ldns_udp_send_query(ldns_buffer
*qbin
, int sockfd
, const struct sockaddr_storage
*to
,
678 bytes
= sendto(sockfd
, (void*)ldns_buffer_begin(qbin
),
679 ldns_buffer_position(qbin
), 0, (struct sockaddr
*)to
, tolen
);
681 if (bytes
== -1 || (size_t)bytes
!= ldns_buffer_position(qbin
)) {
684 if ((size_t) bytes
!= ldns_buffer_position(qbin
)) {
691 ldns_udp_read_wire(int sockfd
, size_t *size
, struct sockaddr_storage
*from
,
694 uint8_t *wire
, *wireout
;
697 wire
= LDNS_XMALLOC(uint8_t, LDNS_MAX_PACKETLEN
);
703 wire_size
= recvfrom(sockfd
, (void*)wire
, LDNS_MAX_PACKETLEN
, 0,
704 (struct sockaddr
*)from
, fromlen
);
706 /* recvfrom can also return 0 */
707 if (wire_size
== -1 || wire_size
== 0) {
713 *size
= (size_t)wire_size
;
714 wireout
= LDNS_XREALLOC(wire
, uint8_t, (size_t)wire_size
);
715 if(!wireout
) LDNS_FREE(wire
);
721 ldns_tcp_read_wire_timeout(int sockfd
, size_t *size
, struct timeval timeout
)
725 ssize_t bytes
= 0, rc
= 0;
727 wire
= LDNS_XMALLOC(uint8_t, 2);
734 if(!ldns_sock_wait(sockfd
, timeout
, 0)) {
739 rc
= recv(sockfd
, (void*) (wire
+ bytes
),
740 (size_t) (2 - bytes
), 0);
741 if (rc
== -1 || rc
== 0) {
749 wire_size
= ldns_read_uint16(wire
);
752 wire
= LDNS_XMALLOC(uint8_t, wire_size
);
759 while (bytes
< (ssize_t
) wire_size
) {
760 if(!ldns_sock_wait(sockfd
, timeout
, 0)) {
765 rc
= recv(sockfd
, (void*) (wire
+ bytes
),
766 (size_t) (wire_size
- bytes
), 0);
767 if (rc
== -1 || rc
== 0) {
775 *size
= (size_t) bytes
;
780 ldns_tcp_read_wire(int sockfd
, size_t *size
)
784 ssize_t bytes
= 0, rc
= 0;
786 wire
= LDNS_XMALLOC(uint8_t, 2);
793 rc
= recv(sockfd
, (void*) (wire
+ bytes
),
794 (size_t) (2 - bytes
), 0);
795 if (rc
== -1 || rc
== 0) {
803 wire_size
= ldns_read_uint16(wire
);
806 wire
= LDNS_XMALLOC(uint8_t, wire_size
);
813 while (bytes
< (ssize_t
) wire_size
) {
814 rc
= recv(sockfd
, (void*) (wire
+ bytes
),
815 (size_t) (wire_size
- bytes
), 0);
816 if (rc
== -1 || rc
== 0) {
824 *size
= (size_t) bytes
;
830 ldns_sockaddr_storage2rdf(struct sockaddr_storage
*sock
, uint16_t *port
)
833 struct sockaddr_in
*data_in
;
834 struct sockaddr_in6
*data_in6
;
836 switch(sock
->ss_family
) {
838 data_in
= (struct sockaddr_in
*)sock
;
840 *port
= ntohs((uint16_t)data_in
->sin_port
);
842 addr
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_A
,
843 LDNS_IP4ADDRLEN
, &data_in
->sin_addr
);
846 data_in6
= (struct sockaddr_in6
*)sock
;
848 *port
= ntohs((uint16_t)data_in6
->sin6_port
);
850 addr
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_AAAA
,
851 LDNS_IP6ADDRLEN
, &data_in6
->sin6_addr
);
863 /* code from resolver.c */
865 ldns_axfr_start(ldns_resolver
*resolver
, ldns_rdf
*domain
, ldns_rr_class
class)
868 ldns_buffer
*query_wire
;
870 struct sockaddr_storage
*src
= NULL
;
872 struct sockaddr_storage
*ns
= NULL
;
877 if (!resolver
|| ldns_resolver_nameserver_count(resolver
) < 1) {
878 return LDNS_STATUS_ERR
;
881 query
= ldns_pkt_query_new(ldns_rdf_clone(domain
), LDNS_RR_TYPE_AXFR
, class, 0);
884 return LDNS_STATUS_ADDRESS_ERR
;
886 if(ldns_resolver_source(resolver
)) {
887 src
= ldns_rdf2native_sockaddr_storage_port(
888 ldns_resolver_source(resolver
), 0, &src_len
);
890 /* For AXFR, we have to make the connection ourselves */
891 /* try all nameservers (which usually would mean v4 fallback if
892 * @hostname is used */
894 ns_i
< ldns_resolver_nameserver_count(resolver
) &&
895 resolver
->_socket
== 0;
900 ns
= ldns_rdf2native_sockaddr_storage(
901 resolver
->_nameservers
[ns_i
],
902 ldns_resolver_port(resolver
), &ns_len
);
904 resolver
->_socket
= ldns_tcp_connect_from(
905 ns
, (socklen_t
)ns_len
,
906 src
, (socklen_t
)src_len
,
907 ldns_resolver_timeout(resolver
));
910 if (resolver
->_socket
== 0) {
911 ldns_pkt_free(query
);
913 return LDNS_STATUS_NETWORK_ERR
;
917 if (ldns_resolver_tsig_keyname(resolver
) && ldns_resolver_tsig_keydata(resolver
)) {
918 status
= ldns_pkt_tsig_sign(query
,
919 ldns_resolver_tsig_keyname(resolver
),
920 ldns_resolver_tsig_keydata(resolver
),
921 300, ldns_resolver_tsig_algorithm(resolver
), NULL
);
922 if (status
!= LDNS_STATUS_OK
) {
923 /* to prevent problems on subsequent calls to
924 * ldns_axfr_start we have to close the socket here! */
926 close(resolver
->_socket
);
928 closesocket(resolver
->_socket
);
930 resolver
->_socket
= 0;
932 ldns_pkt_free(query
);
935 return LDNS_STATUS_CRYPTO_TSIG_ERR
;
938 #endif /* HAVE_SSL */
940 /* Convert the query to a buffer
943 query_wire
= ldns_buffer_new(LDNS_MAX_PACKETLEN
);
945 ldns_pkt_free(query
);
948 close(resolver
->_socket
);
950 closesocket(resolver
->_socket
);
952 resolver
->_socket
= 0;
954 return LDNS_STATUS_MEM_ERR
;
956 status
= ldns_pkt2buffer_wire(query_wire
, query
);
957 if (status
!= LDNS_STATUS_OK
) {
958 ldns_pkt_free(query
);
959 ldns_buffer_free(query_wire
);
962 /* to prevent problems on subsequent calls to ldns_axfr_start
963 * we have to close the socket here! */
965 close(resolver
->_socket
);
967 closesocket(resolver
->_socket
);
969 resolver
->_socket
= 0;
974 if (ldns_tcp_send_query(query_wire
, resolver
->_socket
, ns
,
975 (socklen_t
)ns_len
) == 0) {
976 ldns_pkt_free(query
);
977 ldns_buffer_free(query_wire
);
980 /* to prevent problems on subsequent calls to ldns_axfr_start
981 * we have to close the socket here! */
984 close(resolver
->_socket
);
986 closesocket(resolver
->_socket
);
988 resolver
->_socket
= 0;
990 return LDNS_STATUS_NETWORK_ERR
;
993 ldns_pkt_free(query
);
994 ldns_buffer_free(query_wire
);
998 * The AXFR is done once the second SOA record is sent
1000 resolver
->_axfr_soa_count
= 0;
1001 return LDNS_STATUS_OK
;