e->qstate = q;
e->qsent = outnet_serviced_query(worker->back, qname,
qnamelen, qtype, qclass, flags, dnssec, want_dnssec,
- q->env->cfg->tcp_upstream || q->env->cfg->ssl_upstream, addr,
+ q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr,
addrlen, zone, zonelen, worker_handle_service_reply, e,
worker->back->udp_buff, &outbound_entry_compare);
if(!e->qsent) {
e->qstate = q;
e->qsent = outnet_serviced_query(w->back, qname,
qnamelen, qtype, qclass, flags, dnssec, want_dnssec,
- q->env->cfg->tcp_upstream || q->env->cfg->ssl_upstream, addr,
+ q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr,
addrlen, zone, zonelen, libworker_handle_service_reply, e,
w->back->udp_buff, &outbound_entry_compare);
if(!e->qsent) {
return 0;
}
}
- if(w->outnet->sslctx) {
+ if(w->outnet->sslctx && w->ssl_upstream) {
pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s);
if(!pend->c->ssl) {
pend->c->fd = s;
struct waiting_tcp*
pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
struct sockaddr_storage* addr, socklen_t addrlen, int timeout,
- comm_point_callback_t* callback, void* callback_arg)
+ comm_point_callback_t* callback, void* callback_arg, int ssl_upstream)
{
struct pending_tcp* pend = outnet->tcp_free;
struct waiting_tcp* w;
w->outnet = outnet;
w->cb = callback;
w->cb_arg = callback_arg;
+ w->ssl_upstream = ssl_upstream;
#ifndef S_SPLINT_S
tv.tv_sec = timeout;
tv.tv_usec = 0;
/** Create new serviced entry */
static struct serviced_query*
serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec,
- int want_dnssec, int tcp_upstream, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen)
+ int want_dnssec, int tcp_upstream, int ssl_upstream,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen)
{
struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
#ifdef UNBOUND_DEBUG
sq->dnssec = dnssec;
sq->want_dnssec = want_dnssec;
sq->tcp_upstream = tcp_upstream;
+ sq->ssl_upstream = ssl_upstream;
memcpy(&sq->addr, addr, addrlen);
sq->addrlen = addrlen;
sq->outnet = outnet;
log_err("Out of memory caching no edns for host");
sq->status = serviced_query_TCP;
}
- if(sq->tcp_upstream) {
+ if(sq->tcp_upstream || sq->ssl_upstream) {
struct timeval now = *sq->outnet->now_tv;
if(now.tv_sec > sq->last_sent_time.tv_sec ||
(now.tv_sec == sq->last_sent_time.tv_sec &&
sq->last_sent_time = *sq->outnet->now_tv;
sq->pending = pending_tcp_query(outnet, buff, &sq->addr,
sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback,
- sq);
+ sq, sq->ssl_upstream);
if(!sq->pending) {
/* delete from tree so that a retry by above layer does not
* clash with this entry */
sq->last_sent_time = *sq->outnet->now_tv;
sq->pending = pending_tcp_query(sq->outnet, buff, &sq->addr,
sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback,
- sq);
+ sq, sq->ssl_upstream);
return sq->pending != NULL;
}
outnet_serviced_query(struct outside_network* outnet,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream,
- struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
- ldns_buffer* buff, int (*arg_compare)(void*,void*))
+ int ssl_upstream, struct sockaddr_storage* addr, socklen_t addrlen,
+ uint8_t* zone, size_t zonelen, comm_point_callback_t* callback,
+ void* callback_arg, ldns_buffer* buff, int (*arg_compare)(void*,void*))
{
struct serviced_query* sq;
struct service_callback* cb;
if(!sq) {
/* make new serviced query entry */
sq = serviced_create(outnet, buff, dnssec, want_dnssec,
- tcp_upstream, addr, addrlen, zone, zonelen);
+ tcp_upstream, ssl_upstream, addr, addrlen, zone,
+ zonelen);
if(!sq) {
free(cb);
return NULL;
}
/* perform first network action */
- if(outnet->do_udp && !tcp_upstream) {
+ if(outnet->do_udp && !(tcp_upstream || ssl_upstream)) {
if(!serviced_udp_send(sq, buff)) {
(void)rbtree_delete(outnet->serviced, sq);
free(sq->qbuf);
comm_point_callback_t* cb;
/** callback user argument */
void* cb_arg;
+ /** if it uses ssl upstream */
+ int ssl_upstream;
};
/**
int dnssec;
/** We want signatures, or else the answer is likely useless */
int want_dnssec;
- /** tcp upstream used, use tcp */
- int tcp_upstream;
+ /** tcp upstream used, use tcp, or ssl_upstream for SSL */
+ int tcp_upstream, ssl_upstream;
/** where to send it */
struct sockaddr_storage addr;
/** length of addr field in use. */
* without any query been sent to the server yet.
* @param callback: function to call on error, timeout or reply.
* @param callback_arg: user argument for callback function.
+ * @param ssl_upstream: if the tcp connection must use SSL.
* @return: false on error for malloc or socket. Else the pending TCP object.
*/
struct waiting_tcp* pending_tcp_query(struct outside_network* outnet,
ldns_buffer* packet, struct sockaddr_storage* addr,
socklen_t addrlen, int timeout, comm_point_callback_t* callback,
- void* callback_arg);
+ void* callback_arg, int ssl_upstream);
/**
* Delete pending answer.
* @param want_dnssec: signatures are needed, without EDNS the answer is
* likely to be useless.
* @param tcp_upstream: use TCP for upstream queries.
+ * @param ssl_upstream: use SSL for upstream queries.
* @param callback: callback function.
* @param callback_arg: user argument to callback function.
* @param addr: to which server to send the query.
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream,
- struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
- ldns_buffer* buff, int (*arg_compare)(void*,void*));
+ int ssl_upstream, struct sockaddr_storage* addr, socklen_t addrlen,
+ uint8_t* zone, size_t zonelen, comm_point_callback_t* callback,
+ void* callback_arg, ldns_buffer* buff,
+ int (*arg_compare)(void*,void*));
/**
* Remove service query callback.
struct waiting_tcp*
pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
struct sockaddr_storage* addr, socklen_t addrlen, int timeout,
- comm_point_callback_t* callback, void* callback_arg)
+ comm_point_callback_t* callback, void* callback_arg,
+ int ATTR_UNUSED(ssl_upstream))
{
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
struct fake_pending* pend = (struct fake_pending*)calloc(1,
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(tcp_upstream), struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t ATTR_UNUSED(zonelen),
- comm_point_callback_t* callback, void* callback_arg,
- ldns_buffer* ATTR_UNUSED(buff), int (*arg_compare)(void*,void*))
+ int ATTR_UNUSED(tcp_upstream), int ATTR_UNUSED(ssl_upstream),
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t ATTR_UNUSED(zonelen), comm_point_callback_t* callback,
+ void* callback_arg, ldns_buffer* ATTR_UNUSED(buff),
+ int (*arg_compare)(void*,void*))
{
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
struct fake_pending* pend = (struct fake_pending*)calloc(1,