obj = NULL;
(void)cfg_map_get(cpeer, "connect", &obj);
if (obj != NULL) {
+ dns_transport_t *transport = NULL;
+ const cfg_obj_t *obj_port = NULL, *obj_transport = NULL;
+ const char *transport_name = NULL;
+
(void)dns_peer_setforcetcp(peer, false);
- //(void)dns_peer_settransport(peer, DNS_TRANSPORT_TCP);
+ INSIST(cfg_obj_istuple(obj));
+
+ obj_transport = cfg_tuple_get(obj, "transport");
+ if (cfg_obj_isstring(obj_transport)) {
+ transport_name = cfg_obj_asstring(obj_transport);
+
+ if (strcasecmp(transport_name, "tcp") == 0) {
+ transport = dns_transport_create(
+ DNS_TRANSPORT_TCP, mctx);
+ } else if (strcasecmp(transport_name, "tls") == 0) {
+ transport = dns_transport_create(
+ DNS_TRANSPORT_TLS, mctx);
+ } else {
+ INSIST(0);
+ ISC_UNREACHABLE();
+ }
+ }
+
+ obj_port = cfg_tuple_get(obj, "port");
+ if (cfg_obj_isuint32(obj_port)) {
+ dns_transport_set_port(
+ transport,
+ (in_port_t)cfg_obj_asuint32(obj_port));
+ }
+
+ if (transport != NULL) {
+ (void)dns_peer_settransport(peer, transport);
+ dns_transport_detach(&transport);
+ }
}
obj = NULL;
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);
+dns_peer_settransport(dns_peer_t *peer, dns_transport_t *transport);
isc_result_t
dns_peer_gettransport(dns_peer_t *peer, dns_transport_t **transportp);
*\li 'transport' is of type DNS_TRANSPORT_HTTP (for endpoint or mode).
*/
+uint16_t
+dns_transport_get_port(const dns_transport_t *transport);
+
+void
+dns_transport_set_port(dns_transport_t *transport, const uint16_t port);
+
void
dns_transport_attach(dns_transport_t *source, dns_transport_t **targetp);
/*%<
}
isc_result_t
-dns_peer_settransport(dns_peer_t *peer, dns_transport_type_t type) {
+dns_peer_settransport(dns_peer_t *peer, dns_transport_t *transport) {
REQUIRE(DNS_PEER_VALID(peer));
- peer->transport = dns_transport_create(type, peer->mem);
+ dns_transport_attach(transport, &peer->transport);
DNS_BIT_SET(TRANSPORT_BIT, &peer->bitflags);
return (ISC_R_SUCCESS);
}
char *endpoint;
dns_http_mode_t mode;
} doh;
+ uint16_t port;
};
static void
return (transport);
}
+uint16_t
+dns_transport_get_port(const dns_transport_t *transport) {
+ REQUIRE(VALID_TRANSPORT(transport));
+ return (transport->port);
+}
+
+void
+dns_transport_set_port(dns_transport_t *transport, const uint16_t port) {
+ REQUIRE(VALID_TRANSPORT(transport));
+ transport->port = port;
+}
+
dns_transport_list_t *
dns_transport_list_new(isc_mem_t *mctx) {
dns_transport_list_t *list = isc_mem_get(mctx, sizeof(*list));