Add address searching to dns_disptach_find().
This commit is contained in:
@@ -67,12 +67,16 @@ struct dns_dispentry {
|
|||||||
|
|
||||||
typedef ISC_LIST(dns_dispentry_t) dns_displist_t;
|
typedef ISC_LIST(dns_dispentry_t) dns_displist_t;
|
||||||
|
|
||||||
|
#define DISPATCHFLAG_CONNECTED 0x00000001U
|
||||||
|
|
||||||
struct dns_dispatch {
|
struct dns_dispatch {
|
||||||
/* Unlocked. */
|
/* Unlocked. */
|
||||||
unsigned int magic; /* magic */
|
unsigned int magic; /* magic */
|
||||||
dns_dispatchmgr_t *mgr; /* dispatch manager */
|
dns_dispatchmgr_t *mgr; /* dispatch manager */
|
||||||
isc_task_t *task; /* internal task */
|
isc_task_t *task; /* internal task */
|
||||||
isc_socket_t *socket; /* isc socket attached to */
|
isc_socket_t *socket; /* isc socket attached to */
|
||||||
|
isc_sockaddr_t local; /* local address */
|
||||||
|
isc_sockaddr_t remote; /* remote address */
|
||||||
unsigned int buffersize; /* size of each buffer */
|
unsigned int buffersize; /* size of each buffer */
|
||||||
unsigned int maxrequests; /* max requests */
|
unsigned int maxrequests; /* max requests */
|
||||||
unsigned int maxbuffers; /* max buffers */
|
unsigned int maxbuffers; /* max buffers */
|
||||||
@@ -84,6 +88,7 @@ struct dns_dispatch {
|
|||||||
/* Locked by "lock". */
|
/* Locked by "lock". */
|
||||||
isc_mutex_t lock; /* locks all below */
|
isc_mutex_t lock; /* locks all below */
|
||||||
unsigned int refcount; /* number of users */
|
unsigned int refcount; /* number of users */
|
||||||
|
unsigned int flags;
|
||||||
isc_mempool_t *epool; /* memory pool for events */
|
isc_mempool_t *epool; /* memory pool for events */
|
||||||
isc_mempool_t *bpool; /* memory pool for buffers */
|
isc_mempool_t *bpool; /* memory pool for buffers */
|
||||||
isc_mempool_t *rpool; /* memory pool request/reply */
|
isc_mempool_t *rpool; /* memory pool request/reply */
|
||||||
@@ -969,9 +974,38 @@ dns_dispatchmgr_destroy(dns_dispatchmgr_t **mgrp)
|
|||||||
|
|
||||||
#define ATTRMATCH(_a1, _a2, _mask) (((_a1) & (_mask)) == ((_a2) & (_mask)))
|
#define ATTRMATCH(_a1, _a2, _mask) (((_a1) & (_mask)) == ((_a2) & (_mask)))
|
||||||
|
|
||||||
|
static isc_boolean_t
|
||||||
|
local_addr_match(dns_dispatch_t *disp, isc_sockaddr_t *addr)
|
||||||
|
{
|
||||||
|
in_port_t port;
|
||||||
|
|
||||||
|
if (addr == NULL)
|
||||||
|
return (ISC_TRUE);
|
||||||
|
|
||||||
|
port = isc_sockaddr_getport(addr);
|
||||||
|
if (port == 0)
|
||||||
|
return (isc_sockaddr_eqaddr(&disp->local, addr));
|
||||||
|
else
|
||||||
|
return (isc_sockaddr_equal(&disp->local, addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_boolean_t
|
||||||
|
remote_addr_match(dns_dispatch_t *disp, isc_sockaddr_t *addr)
|
||||||
|
{
|
||||||
|
if (addr == NULL)
|
||||||
|
return (ISC_TRUE);
|
||||||
|
|
||||||
|
if ((disp->flags & DISPATCHFLAG_CONNECTED) == 0)
|
||||||
|
return (ISC_TRUE);
|
||||||
|
|
||||||
|
return (isc_sockaddr_equal(&disp->remote, addr));
|
||||||
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dns_dispatchmgr_find(dns_dispatchmgr_t *mgr, unsigned int attributes,
|
dns_dispatchmgr_find(dns_dispatchmgr_t *mgr,
|
||||||
unsigned int mask, dns_dispatch_t **dispp)
|
isc_sockaddr_t *local, isc_sockaddr_t *remote,
|
||||||
|
unsigned int attributes, unsigned int mask,
|
||||||
|
dns_dispatch_t **dispp)
|
||||||
{
|
{
|
||||||
dns_dispatch_t *disp;
|
dns_dispatch_t *disp;
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
@@ -983,7 +1017,9 @@ dns_dispatchmgr_find(dns_dispatchmgr_t *mgr, unsigned int attributes,
|
|||||||
disp = ISC_LIST_HEAD(mgr->list);
|
disp = ISC_LIST_HEAD(mgr->list);
|
||||||
while (disp != NULL) {
|
while (disp != NULL) {
|
||||||
if (!IS_PRIVATE(disp)
|
if (!IS_PRIVATE(disp)
|
||||||
&& ATTRMATCH(disp->attributes, attributes, mask))
|
&& ATTRMATCH(disp->attributes, attributes, mask)
|
||||||
|
&& local_addr_match(disp, local)
|
||||||
|
&& remote_addr_match(disp, remote))
|
||||||
break;
|
break;
|
||||||
disp = ISC_LIST_NEXT(disp, link);
|
disp = ISC_LIST_NEXT(disp, link);
|
||||||
}
|
}
|
||||||
@@ -1016,6 +1052,7 @@ dns_dispatch_create(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
|||||||
isc_result_t res;
|
isc_result_t res;
|
||||||
isc_sockettype_t socktype;
|
isc_sockettype_t socktype;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
isc_sockaddr_t local;
|
||||||
|
|
||||||
REQUIRE(VALID_DISPATCHMGR(mgr));
|
REQUIRE(VALID_DISPATCHMGR(mgr));
|
||||||
REQUIRE(sock != NULL);
|
REQUIRE(sock != NULL);
|
||||||
@@ -1030,7 +1067,10 @@ dns_dispatch_create(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
|||||||
REQUIRE(socktype == isc_sockettype_udp ||
|
REQUIRE(socktype == isc_sockettype_udp ||
|
||||||
socktype == isc_sockettype_tcp);
|
socktype == isc_sockettype_tcp);
|
||||||
|
|
||||||
res = ISC_R_SUCCESS;
|
memset(&local, 0, sizeof local);
|
||||||
|
res = isc_socket_getsockname(sock, &local);
|
||||||
|
if (res != ISC_R_SUCCESS)
|
||||||
|
return (res);
|
||||||
|
|
||||||
disp = isc_mem_get(mgr->mctx, sizeof(dns_dispatch_t));
|
disp = isc_mem_get(mgr->mctx, sizeof(dns_dispatch_t));
|
||||||
if (disp == NULL)
|
if (disp == NULL)
|
||||||
@@ -1049,6 +1089,11 @@ dns_dispatch_create(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
|||||||
} else {
|
} else {
|
||||||
disp->recvs_wanted = 1;
|
disp->recvs_wanted = 1;
|
||||||
}
|
}
|
||||||
|
memset(&disp->remote, 0, sizeof disp->remote);
|
||||||
|
res = isc_socket_getpeername(sock, &disp->remote);
|
||||||
|
if (res == ISC_R_SUCCESS)
|
||||||
|
disp->flags = DISPATCHFLAG_CONNECTED;
|
||||||
|
disp->local = local;
|
||||||
disp->shutting_down = 0;
|
disp->shutting_down = 0;
|
||||||
disp->shutdown_out = 0;
|
disp->shutdown_out = 0;
|
||||||
disp->shutdown_why = ISC_R_UNEXPECTED;
|
disp->shutdown_why = ISC_R_UNEXPECTED;
|
||||||
@@ -1758,3 +1803,19 @@ dns_dispatch_changeattributes(dns_dispatch_t *disp,
|
|||||||
UNLOCK(&disp->lock);
|
UNLOCK(&disp->lock);
|
||||||
UNLOCK(&disp->mgr->lock);
|
UNLOCK(&disp->mgr->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
void
|
||||||
|
dns_dispatchmgr_dump(dns_dispatchmgr_t *mgr)
|
||||||
|
{
|
||||||
|
dns_dispatch_t *disp;
|
||||||
|
char foo[1024];
|
||||||
|
|
||||||
|
disp = ISC_LIST_HEAD(mgr->list);
|
||||||
|
while (disp != NULL) {
|
||||||
|
sockaddr_format(&disp->local, foo, sizeof foo);
|
||||||
|
printf("dispatch %p, addr %s\n", disp, foo);
|
||||||
|
disp = ISC_LIST_NEXT(disp, link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -118,12 +118,17 @@ typedef struct dns_dispatchmethods dns_dispatchmethods_t;
|
|||||||
* _IPV4, _IPV6
|
* _IPV4, _IPV6
|
||||||
* The dispatcher uses an ipv4 or ipv6 socket.
|
* The dispatcher uses an ipv4 or ipv6 socket.
|
||||||
*
|
*
|
||||||
* _REQUEST
|
* _ACCEPTREQUEST
|
||||||
* The dispatcher can be used to accept requests.
|
* The dispatcher can be used to accept requests.
|
||||||
*
|
*
|
||||||
* _RESPONSE
|
* _MAKEQUERY
|
||||||
* The dispatcher can be used to issue queries to other servers, and
|
* The dispatcher can be used to issue queries to other servers, and
|
||||||
* accept replies from them.
|
* accept replies from them.
|
||||||
|
*
|
||||||
|
* _CONNECTED
|
||||||
|
* The socket the dispatcher uses is a connected socket, and can
|
||||||
|
* only send to a specific host. This will disallow wildcarded
|
||||||
|
* remote addresses.
|
||||||
*/
|
*/
|
||||||
#define DNS_DISPATCHATTR_PRIVATE 0x00000001U
|
#define DNS_DISPATCHATTR_PRIVATE 0x00000001U
|
||||||
#define DNS_DISPATCHATTR_TCP 0x00000002U
|
#define DNS_DISPATCHATTR_TCP 0x00000002U
|
||||||
@@ -164,8 +169,10 @@ dns_dispatchmgr_destroy(dns_dispatchmgr_t **mgrp);
|
|||||||
|
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dns_dispatchmgr_find(dns_dispatchmgr_t *mgr, unsigned int attributes,
|
dns_dispatchmgr_find(dns_dispatchmgr_t *mgr,
|
||||||
unsigned int mask, dns_dispatch_t **dispp);
|
isc_sockaddr_t *local, isc_sockaddr_t *remote,
|
||||||
|
unsigned int attributes, unsigned int mask,
|
||||||
|
dns_dispatch_t **dispp);
|
||||||
/*
|
/*
|
||||||
* Search for a dispatcher that has the attributes specified by
|
* Search for a dispatcher that has the attributes specified by
|
||||||
* (attributes & mask)
|
* (attributes & mask)
|
||||||
|
|||||||
Reference in New Issue
Block a user