<p>Removed the <em>non_peers</em> action. See the Cache Manager
<ref id="mgr" name="section"> for details.
+ <tag>dns_packet_max</tag>
+ <p>Honor positive <em>dns_packet_max</em> values when sending DNS A queries
+ and PTR queries containing IPv4 addresses. Prior to this change, Squid did
+ not add EDNS extension (RFC 6891) to those DNS queries because 2010 tests
+ revealed compatibility problems with some DNS resolvers. We hope that those
+ problems are now sufficiently rare to enable this useful optimization for
+ all DNS queries, as originally intended. Squid still sends EDNS extension
+ with DNS AAAA queries and PTR queries containing IPv6 addresses (when
+ dns_packet_max is set to a positive value). Rare deployments that must use
+ buggy DNS resolvers should not set <em>dns_packet_max</em>.
+
<tag>access_log</tag>
<p>Built-in <em>common</em> and <em>combined</em> logformats now always
receive a dash character ("-") in the position of what used to be a
#include "squid.h"
#include "dns/rfc2671.h"
#include "dns/rfc3596.h"
+#include "SquidConfig.h"
#include "util.h"
#if HAVE_UNISTD_H
* Returns the size of the query
*/
ssize_t
-rfc3596BuildHostQuery(const char *hostname, char *buf, size_t sz, unsigned short qid, rfc1035_query * query, int qtype, ssize_t edns_sz)
+rfc3596BuildHostQuery(const char *hostname, char *buf, size_t sz, unsigned short qid, rfc1035_query * query, int qtype)
{
static rfc1035_message h;
size_t offset = 0;
h.rd = 1;
h.opcode = 0; /* QUERY */
h.qdcount = (unsigned int) 1;
+
+ const auto edns_sz = Config.dns.packet_max;
h.arcount = (edns_sz > 0 ? 1 : 0);
+
offset += rfc1035HeaderPack(buf + offset, sz - offset, &h);
offset += rfc1035QuestionPack(buf + offset,
sz - offset,
* \return the size of the query
*/
ssize_t
-rfc3596BuildAQuery(const char *hostname, char *buf, size_t sz, unsigned short qid, rfc1035_query * query, ssize_t edns_sz)
+rfc3596BuildAQuery(const char *hostname, char *buf, size_t sz, unsigned short qid, rfc1035_query * query)
{
- return rfc3596BuildHostQuery(hostname, buf, sz, qid, query, RFC1035_TYPE_A, edns_sz);
+ return rfc3596BuildHostQuery(hostname, buf, sz, qid, query, RFC1035_TYPE_A);
}
/**
* \return the size of the query
*/
ssize_t
-rfc3596BuildAAAAQuery(const char *hostname, char *buf, size_t sz, unsigned short qid, rfc1035_query * query, ssize_t edns_sz)
+rfc3596BuildAAAAQuery(const char *hostname, char *buf, size_t sz, unsigned short qid, rfc1035_query * query)
{
- return rfc3596BuildHostQuery(hostname, buf, sz, qid, query, RFC1035_TYPE_AAAA, edns_sz);
+ return rfc3596BuildHostQuery(hostname, buf, sz, qid, query, RFC1035_TYPE_AAAA);
}
/**
* \return the size of the query
*/
ssize_t
-rfc3596BuildPTRQuery4(const struct in_addr addr, char *buf, size_t sz, unsigned short qid, rfc1035_query * query, ssize_t edns_sz)
+rfc3596BuildPTRQuery4(const struct in_addr addr, char *buf, size_t sz, unsigned short qid, rfc1035_query * query)
{
static char rev[RFC1035_MAXHOSTNAMESZ];
unsigned int i;
(i >> 16) & 255,
(i >> 24) & 255);
- return rfc3596BuildHostQuery(rev, buf, sz, qid, query, RFC1035_TYPE_PTR, edns_sz);
+ return rfc3596BuildHostQuery(rev, buf, sz, qid, query, RFC1035_TYPE_PTR);
}
ssize_t
-rfc3596BuildPTRQuery6(const struct in6_addr addr, char *buf, size_t sz, unsigned short qid, rfc1035_query * query, ssize_t edns_sz)
+rfc3596BuildPTRQuery6(const struct in6_addr addr, char *buf, size_t sz, unsigned short qid, rfc1035_query * query)
{
static char rev[RFC1035_MAXHOSTNAMESZ];
const uint8_t* r = addr.s6_addr;
snprintf(p,10,"ip6.arpa.");
- return rfc3596BuildHostQuery(rev, buf, sz, qid, query, RFC1035_TYPE_PTR, edns_sz);
+ return rfc3596BuildHostQuery(rev, buf, sz, qid, query, RFC1035_TYPE_PTR);
}
char *buf,
size_t sz,
unsigned short qid,
- rfc1035_query * query,
- ssize_t edns_sz);
+ rfc1035_query *);
ssize_t rfc3596BuildAAAAQuery(const char *hostname,
char *buf,
size_t sz,
unsigned short qid,
- rfc1035_query * query,
- ssize_t edns_sz);
+ rfc1035_query *);
ssize_t rfc3596BuildPTRQuery4(const struct in_addr,
char *buf,
size_t sz,
unsigned short qid,
- rfc1035_query * query,
- ssize_t edns_sz);
+ rfc1035_query *);
ssize_t rfc3596BuildPTRQuery6(const struct in6_addr,
char *buf,
size_t sz,
unsigned short qid,
- rfc1035_query * query,
- ssize_t edns_sz);
+ rfc1035_query *);
/* RFC3596 library implements RFC1035 generic host interface */
ssize_t rfc3596BuildHostQuery(const char *hostname,
size_t sz,
unsigned short qid,
rfc1035_query * query,
- int qtype,
- ssize_t edns_sz);
+ int qtype);
/* RFC3596 section 2.1 defines new RR type AAAA as 28 */
#define RFC1035_TYPE_AAAA 28
/*
* Notes on EDNS:
*
- * IPv4:
- * EDNS as specified may be sent as an additional record for any request.
- * early testing has revealed that it works on common devices, but cannot
- * be reliably used on any A or PTR requet done for IPv4 addresses.
- *
- * As such the IPv4 packets are still hard-coded not to contain EDNS (0)
- *
* Squid design:
* Squid is optimized to generate one packet and re-send it to all NS
* due to this we cannot customize the EDNS size per NS.
// Build new query
q->query_id = idnsQueryID();
debugs(78, 3, "idnsGrokReply: Trying A Query for " << q->name);
- // see EDNS notes at top of file why this sends 0
- q->sz = rfc3596BuildAQuery(q->name, q->buf, sizeof(q->buf), q->query_id, &q->query, 0);
+ q->sz = rfc3596BuildAQuery(q->name, q->buf, sizeof(q->buf), q->query_id, &q->query);
if (q->sz < 0) {
/* problem with query data -- query not sent */
idnsCallback(q, "Internal error");
memcpy(q->orig, master->orig, sizeof(q->orig));
q->master = master;
q->query_id = idnsQueryID();
- q->sz = rfc3596BuildAAAAQuery(q->name, q->buf, sizeof(q->buf), q->query_id, &q->query, Config.dns.packet_max);
+ q->sz = rfc3596BuildAAAAQuery(q->name, q->buf, sizeof(q->buf), q->query_id, &q->query);
debugs(78, 3, "buf is " << q->sz << " bytes for " << q->name <<
", id = 0x" << asHex(q->query_id));
debugs(78, 3, "idnsALookup: searchpath used for " << q->name);
}
- // see EDNS notes at top of file why this sends 0
- q->sz = rfc3596BuildAQuery(q->name, q->buf, sizeof(q->buf), q->query_id, &q->query, 0);
+ q->sz = rfc3596BuildAQuery(q->name, q->buf, sizeof(q->buf), q->query_id, &q->query);
if (q->sz < 0) {
/* problem with query data -- query not sent */
if (addr.isIPv6()) {
struct in6_addr addr6;
addr.getInAddr(addr6);
- q->sz = rfc3596BuildPTRQuery6(addr6, q->buf, sizeof(q->buf), q->query_id, &q->query, Config.dns.packet_max);
+ q->sz = rfc3596BuildPTRQuery6(addr6, q->buf, sizeof(q->buf), q->query_id, &q->query);
} else {
struct in_addr addr4;
addr.getInAddr(addr4);
- // see EDNS notes at top of file why this sends 0
- q->sz = rfc3596BuildPTRQuery4(addr4, q->buf, sizeof(q->buf), q->query_id, &q->query, 0);
+ q->sz = rfc3596BuildPTRQuery4(addr4, q->buf, sizeof(q->buf), q->query_id, &q->query);
}
if (q->sz < 0) {