CHECK(dns_peer_setforcetcp(peer, cfg_obj_asboolean(obj)));
}
+ obj = NULL;
+ (void)cfg_map_get(cpeer, "connect", &obj);
+ if (obj != NULL) {
+ (void)dns_peer_setforcetcp(peer, false);
+ //(void)dns_peer_settransport(peer, DNS_TRANSPORT_TCP);
+ }
+
obj = NULL;
(void)cfg_map_get(cpeer, "tcp-keepalive", &obj);
if (obj != NULL) {
#include <isc/netaddr.h>
#include <isc/refcount.h>
+#include <dns/transport.h>
#include <dns/types.h>
#define DNS_PEERLIST_MAGIC ISC_MAGIC('s', 'e', 'R', 'L')
isc_result_t
dns_peer_getednsversion(dns_peer_t *peer, uint8_t *ednsversion);
+
+isc_result_t
+dns_peer_settransport(dns_peer_t *peer, dns_transport_type_t type);
+
+isc_result_t
+dns_peer_gettransport(dns_peer_t *peer, dns_transport_t **transportp);
+
ISC_LANG_ENDDECLS
typedef struct dns_transport dns_transport_t;
typedef struct dns_transport_list dns_transport_list_t;
+dns_transport_t *
+dns_transport_create(dns_transport_type_t type, isc_mem_t *mctx);
+
dns_transport_t *
dns_transport_new(const dns_name_t *name, dns_transport_type_t type,
dns_transport_list_t *list);
uint8_t ednsversion; /* edns version */
uint32_t bitflags;
+ dns_transport_t *transport;
ISC_LINK(dns_peer_t) next;
};
#define FORCE_TCP_BIT 15
#define SERVER_PADDING_BIT 16
#define REQUEST_TCP_KEEPALIVE_BIT 17
+#define TRANSPORT_BIT 18
static void
peerlist_delete(dns_peerlist_t **list);
sizeof(*p->transfer_source));
}
+ if (DNS_BIT_CHECK(TRANSPORT_BIT, &p->bitflags)) {
+ INSIST(p->transport != NULL);
+ dns_transport_detach(&p->transport);
+ }
+
isc_mem_put(mem, p, sizeof(*p));
}
return (ISC_R_NOTFOUND);
}
}
+
+isc_result_t
+dns_peer_settransport(dns_peer_t *peer, dns_transport_type_t type) {
+ REQUIRE(DNS_PEER_VALID(peer));
+
+ peer->transport = dns_transport_create(type, peer->mem);
+ DNS_BIT_SET(TRANSPORT_BIT, &peer->bitflags);
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_peer_gettransport(dns_peer_t *peer, dns_transport_t **transportp) {
+ REQUIRE(DNS_PEER_VALID(peer));
+ REQUIRE(transportp != NULL && *transportp == NULL);
+
+ if (!DNS_BIT_CHECK(EDNS_VERSION_BIT, &peer->bitflags)) {
+ return (ISC_R_NOTFOUND);
+ }
+
+ *transportp = peer->transport;
+
+ return (ISC_R_SUCCESS);
+}
}
dns_transport_t *
-dns_transport_new(const dns_name_t *name, dns_transport_type_t type,
- dns_transport_list_t *list) {
- dns_transport_t *transport = isc_mem_get(list->mctx,
- sizeof(*transport));
+dns_transport_create(dns_transport_type_t type, isc_mem_t *mctx) {
+ dns_transport_t *transport;
+
+ REQUIRE(type > DNS_TRANSPORT_NONE && type < DNS_TRANSPORT_COUNT);
+
+ transport = isc_mem_get(mctx, sizeof(*transport));
*transport = (dns_transport_t){ .type = type };
isc_refcount_init(&transport->references, 1);
- isc_mem_attach(list->mctx, &transport->mctx);
+ isc_mem_attach(mctx, &transport->mctx);
transport->magic = TRANSPORT_MAGIC;
+ return (transport);
+}
+
+dns_transport_t *
+dns_transport_new(const dns_name_t *name, dns_transport_type_t type,
+ dns_transport_list_t *list) {
+ dns_transport_t *transport = dns_transport_create(type, list->mctx);
list_add(list, name, type, transport);