dns_dispatchmgr_t *mgr = disp->mgr;
unsigned int nports;
in_port_t *ports = NULL;
- in_port_t port;
+ in_port_t port = *portp;
if (resp->retries++ > 5) {
return (ISC_R_FAILURE);
resp->local = disp->local;
resp->peer = *dest;
- port = ports[isc_random_uniform(nports)];
- isc_sockaddr_setport(&resp->local, port);
+ if (port == 0) {
+ port = ports[isc_random_uniform(nports)];
+ isc_sockaddr_setport(&resp->local, port);
+ *portp = port;
+ }
resp->port = port;
- *portp = port;
-
return (ISC_R_SUCCESS);
}
dns_dispentry_t **respp) {
dns_dispentry_t *resp = NULL;
dns_qid_t *qid = NULL;
- in_port_t localport = 0;
+ in_port_t dispport, localport = 0;
dns_messageid_t id;
unsigned int bucket;
bool ok = false;
qid = disp->mgr->qid;
- resp = isc_mem_get(disp->mgr->mctx, sizeof(*resp));
+ dispport = isc_sockaddr_getport(&disp->local);
+ if (dispport != 0) {
+ localport = dispport;
+ }
+ resp = isc_mem_get(disp->mgr->mctx, sizeof(*resp));
*resp = (dns_dispentry_t){
.port = localport,
.timeout = timeout,