Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
D
Dnsmasq
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
Dnsmasq
Commits
c1a4e257
Commit
c1a4e257
authored
Jan 19, 2018
by
Simon Kelley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Try to be a little more clever at falling back to smaller DNS packet sizes.
parent
4fe6744a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
20 additions
and
8 deletions
+20
-8
src/config.h
src/config.h
+1
-0
src/dnsmasq.h
src/dnsmasq.h
+1
-0
src/forward.c
src/forward.c
+18
-8
No files found.
src/config.h
View file @
c1a4e257
...
...
@@ -26,6 +26,7 @@
#define TIMEOUT 10
/* drop UDP queries after TIMEOUT seconds */
#define FORWARD_TEST 50
/* try all servers every 50 queries */
#define FORWARD_TIME 20
/* or 20 seconds */
#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 LOCALS_LOGGED 8
/* Only log this many local addresses when logging state */
#define RANDOM_SOCKS 64
/* max simultaneous random ports */
...
...
src/dnsmasq.h
View file @
c1a4e257
...
...
@@ -520,6 +520,7 @@ struct server {
struct
serverfd
*
sfd
;
char
*
domain
;
/* set if this server only handles a domain. */
int
flags
,
tcpfd
,
edns_pktsz
;
time_t
pktsz_reduced
;
unsigned
int
queries
,
failed_queries
;
#ifdef HAVE_LOOP
u32
uid
;
...
...
src/forward.c
View file @
c1a4e257
...
...
@@ -272,14 +272,13 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
while
(
forward
->
blocking_query
)
forward
=
forward
->
blocking_query
;
forward
->
flags
|=
FREC_TEST_PKTSZ
;
blockdata_retrieve
(
forward
->
stash
,
forward
->
stash_len
,
(
void
*
)
header
);
plen
=
forward
->
stash_len
;
forward
->
flags
|=
FREC_TEST_PKTSZ
;
if
(
find_pseudoheader
(
header
,
plen
,
NULL
,
&
pheader
,
&
is_sign
,
NULL
)
&&
!
is_sign
)
PUTSHORT
(
SAFE_PKTSZ
,
pheader
);
if
(
forward
->
sentto
->
addr
.
sa
.
sa_family
==
AF_INET
)
log_query
(
F_NOEXTRA
|
F_DNSSEC
|
F_IPV4
,
"retry"
,
(
struct
all_addr
*
)
&
forward
->
sentto
->
addr
.
in
.
sin_addr
,
"dnssec"
);
#ifdef HAVE_IPV6
...
...
@@ -401,7 +400,8 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
int
subnet
,
forwarded
=
0
;
size_t
edns0_len
;
unsigned
char
*
oph
=
find_pseudoheader
(
header
,
plen
,
NULL
,
NULL
,
NULL
,
NULL
);
unsigned
char
*
pheader
;
/* If a query is retried, use the log_id for the retry when logging the answer. */
forward
->
log_id
=
daemon
->
log_id
;
...
...
@@ -423,7 +423,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
}
#endif
if
(
find_pseudoheader
(
header
,
plen
,
&
edns0_len
,
NULL
,
NULL
,
NULL
))
if
(
find_pseudoheader
(
header
,
plen
,
&
edns0_len
,
&
pheader
,
NULL
,
NULL
))
{
/* If there wasn't a PH before, and there is now, we added it. */
if
(
!
oph
)
...
...
@@ -432,6 +432,10 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
/* If we're sending an EDNS0 with any options, we can't recreate the query from a reply. */
if
(
edns0_len
>
11
)
forward
->
flags
|=
FREC_HAS_EXTRADATA
;
/* Reduce udp size on retransmits. */
if
(
forward
->
flags
&
FREC_TEST_PKTSZ
)
PUTSHORT
(
SAFE_PKTSZ
,
pheader
);
}
while
(
1
)
...
...
@@ -764,7 +768,11 @@ void reply_query(int fd, int family, time_t now)
if
(
!
server
)
return
;
/* If sufficient time has elapsed, try and expand UDP buffer size again. */
if
(
difftime
(
now
,
server
->
pktsz_reduced
)
>
UDP_TEST_TIME
)
server
->
edns_pktsz
=
daemon
->
edns_pktsz
;
#ifdef HAVE_DNSSEC
hash
=
hash_questions
(
header
,
n
,
daemon
->
namebuff
);
#else
...
...
@@ -853,14 +861,16 @@ void reply_query(int fd, int family, time_t now)
/* We tried resending to this server with a smaller maximum size and got an answer.
Make that permanent. To avoid reduxing the packet size for a single dropped packet,
only do this when we get a truncated answer, or one larger than the safe size. */
if
(
server
&&
(
forward
->
flags
&
FREC_TEST_PKTSZ
)
&&
if
(
server
&&
server
->
edns_pktsz
>
SAFE_PKTSZ
&&
(
forward
->
flags
&
FREC_TEST_PKTSZ
)
&&
((
header
->
hb3
&
HB3_TC
)
||
n
>=
SAFE_PKTSZ
))
{
server
->
edns_pktsz
=
SAFE_PKTSZ
;
server
->
pktsz_reduced
=
now
;
prettyprint_addr
(
&
server
->
addr
,
daemon
->
addrbuff
);
my_syslog
(
LOG_WARNING
,
_
(
"reducing DNS packet size for nameserver %s to %d"
),
daemon
->
addrbuff
,
SAFE_PKTSZ
);
}
/* If the answer is an error, keep the forward record in place in case
we get a good reply from another server. Kill it when we've
had replies from all to avoid filling the forwarding table when
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment