mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
Scale the DNS random scket pool on the value of dns-forward-max.
This commit is contained in:
@@ -62,6 +62,9 @@ version 2.85
|
|||||||
behaviour can be restored using the min-port and max-port config
|
behaviour can be restored using the min-port and max-port config
|
||||||
switches should that be a concern.
|
switches should that be a concern.
|
||||||
|
|
||||||
|
Scale the size of the DNS random-port pool based on the
|
||||||
|
value of the --dns-forward-max configuration.
|
||||||
|
|
||||||
|
|
||||||
version 2.84
|
version 2.84
|
||||||
Fix a problem, introduced in 2.83, which could see DNS replies
|
Fix a problem, introduced in 2.83, which could see DNS replies
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
#define UDP_TEST_TIME 60 /* How often to reset our idea of max packet size. */
|
#define UDP_TEST_TIME 60 /* How often to reset our idea of max packet size. */
|
||||||
#define SERVERS_LOGGED 30 /* Only log this many servers when logging state */
|
#define SERVERS_LOGGED 30 /* Only log this many servers when logging state */
|
||||||
#define LOCALS_LOGGED 8 /* Only log this many local addresses when logging state */
|
#define LOCALS_LOGGED 8 /* Only log this many local addresses when logging state */
|
||||||
#define RANDOM_SOCKS 64 /* max simultaneous random ports */
|
|
||||||
#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
|
#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
|
||||||
#define CACHESIZ 150 /* default cache size */
|
#define CACHESIZ 150 /* default cache size */
|
||||||
#define TTL_FLOOR_LIMIT 3600 /* don't allow --min-cache-ttl to raise TTL above this under any circumstances */
|
#define TTL_FLOOR_LIMIT 3600 /* don't allow --min-cache-ttl to raise TTL above this under any circumstances */
|
||||||
|
|||||||
@@ -399,6 +399,14 @@ int main (int argc, char **argv)
|
|||||||
cache_init();
|
cache_init();
|
||||||
blockdata_init();
|
blockdata_init();
|
||||||
hash_questions_init();
|
hash_questions_init();
|
||||||
|
|
||||||
|
/* Scale random socket pool by ftabsize, but
|
||||||
|
limit it based on available fds. */
|
||||||
|
daemon->numrrand = daemon->ftabsize/2;
|
||||||
|
if (daemon->numrrand > max_fd/3)
|
||||||
|
daemon->numrrand = max_fd/3;
|
||||||
|
/* safe_malloc returns zero'd memory */
|
||||||
|
daemon->randomsocks = safe_malloc(daemon->numrrand * sizeof(struct randfd));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_INOTIFY
|
#ifdef HAVE_INOTIFY
|
||||||
@@ -987,7 +995,7 @@ int main (int argc, char **argv)
|
|||||||
a single file will be sent to may clients (the file only needs
|
a single file will be sent to may clients (the file only needs
|
||||||
one fd). */
|
one fd). */
|
||||||
|
|
||||||
max_fd -= 30; /* use other than TFTP */
|
max_fd -= 30 + daemon->numrrand; /* use other than TFTP */
|
||||||
|
|
||||||
if (max_fd < 0)
|
if (max_fd < 0)
|
||||||
max_fd = 5;
|
max_fd = 5;
|
||||||
@@ -1700,7 +1708,7 @@ static int set_dns_listeners(time_t now)
|
|||||||
for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
|
for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
|
||||||
poll_listen(serverfdp->fd, POLLIN);
|
poll_listen(serverfdp->fd, POLLIN);
|
||||||
|
|
||||||
for (i = 0; i < RANDOM_SOCKS; i++)
|
for (i = 0; i < daemon->numrrand; i++)
|
||||||
if (daemon->randomsocks[i].refcount != 0)
|
if (daemon->randomsocks[i].refcount != 0)
|
||||||
poll_listen(daemon->randomsocks[i].fd, POLLIN);
|
poll_listen(daemon->randomsocks[i].fd, POLLIN);
|
||||||
|
|
||||||
@@ -1752,7 +1760,7 @@ static void check_dns_listeners(time_t now)
|
|||||||
if (poll_check(serverfdp->fd, POLLIN))
|
if (poll_check(serverfdp->fd, POLLIN))
|
||||||
reply_query(serverfdp->fd, now);
|
reply_query(serverfdp->fd, now);
|
||||||
|
|
||||||
for (i = 0; i < RANDOM_SOCKS; i++)
|
for (i = 0; i < daemon->numrrand; i++)
|
||||||
if (daemon->randomsocks[i].refcount != 0 &&
|
if (daemon->randomsocks[i].refcount != 0 &&
|
||||||
poll_check(daemon->randomsocks[i].fd, POLLIN))
|
poll_check(daemon->randomsocks[i].fd, POLLIN))
|
||||||
reply_query(daemon->randomsocks[i].fd, now);
|
reply_query(daemon->randomsocks[i].fd, now);
|
||||||
|
|||||||
@@ -1130,7 +1130,8 @@ extern struct daemon {
|
|||||||
pid_t tcp_pids[MAX_PROCS];
|
pid_t tcp_pids[MAX_PROCS];
|
||||||
int tcp_pipes[MAX_PROCS];
|
int tcp_pipes[MAX_PROCS];
|
||||||
int pipe_to_parent;
|
int pipe_to_parent;
|
||||||
struct randfd randomsocks[RANDOM_SOCKS];
|
int numrrand;
|
||||||
|
struct randfd *randomsocks;
|
||||||
struct randfd_list *rfl_spare, *rfl_poll;
|
struct randfd_list *rfl_spare, *rfl_poll;
|
||||||
int v6pktinfo;
|
int v6pktinfo;
|
||||||
struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */
|
struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */
|
||||||
|
|||||||
@@ -2218,7 +2218,7 @@ int allocate_rfd(struct randfd_list **fdlp, struct server *serv)
|
|||||||
|
|
||||||
/* limit the number of sockets we have open to avoid starvation of
|
/* limit the number of sockets we have open to avoid starvation of
|
||||||
(eg) TFTP. Once we have a reasonable number, randomness should be OK */
|
(eg) TFTP. Once we have a reasonable number, randomness should be OK */
|
||||||
for (i = 0; i < RANDOM_SOCKS; i++)
|
for (i = 0; i < daemon->numrrand; i++)
|
||||||
if (daemon->randomsocks[i].refcount == 0)
|
if (daemon->randomsocks[i].refcount == 0)
|
||||||
{
|
{
|
||||||
if ((fd = random_sock(serv)) != -1)
|
if ((fd = random_sock(serv)) != -1)
|
||||||
@@ -2233,9 +2233,9 @@ int allocate_rfd(struct randfd_list **fdlp, struct server *serv)
|
|||||||
|
|
||||||
/* No free ones or cannot get new socket, grab an existing one */
|
/* No free ones or cannot get new socket, grab an existing one */
|
||||||
if (!rfd)
|
if (!rfd)
|
||||||
for (j = 0; j < RANDOM_SOCKS; j++)
|
for (j = 0; j < daemon->numrrand; j++)
|
||||||
{
|
{
|
||||||
i = (j + finger) % RANDOM_SOCKS;
|
i = (j + finger) % daemon->numrrand;
|
||||||
if (daemon->randomsocks[i].refcount != 0 &&
|
if (daemon->randomsocks[i].refcount != 0 &&
|
||||||
server_isequal(serv, daemon->randomsocks[i].serv) &&
|
server_isequal(serv, daemon->randomsocks[i].serv) &&
|
||||||
daemon->randomsocks[i].refcount != 0xfffe)
|
daemon->randomsocks[i].refcount != 0xfffe)
|
||||||
@@ -2247,7 +2247,7 @@ int allocate_rfd(struct randfd_list **fdlp, struct server *serv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j == RANDOM_SOCKS)
|
if (j == daemon->numrrand)
|
||||||
{
|
{
|
||||||
struct randfd_list *rfl_poll;
|
struct randfd_list *rfl_poll;
|
||||||
|
|
||||||
@@ -2538,7 +2538,7 @@ void server_gone(struct server *server)
|
|||||||
|
|
||||||
/* If any random socket refers to this server, NULL the reference.
|
/* If any random socket refers to this server, NULL the reference.
|
||||||
No more references to the socket will be created in the future. */
|
No more references to the socket will be created in the future. */
|
||||||
for (i = 0; i < RANDOM_SOCKS; i++)
|
for (i = 0; i < daemon->numrrand; i++)
|
||||||
if (daemon->randomsocks[i].refcount != 0 && daemon->randomsocks[i].serv == server)
|
if (daemon->randomsocks[i].refcount != 0 && daemon->randomsocks[i].serv == server)
|
||||||
daemon->randomsocks[i].serv = NULL;
|
daemon->randomsocks[i].serv = NULL;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user