mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-06 15:51:41 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d07d77e75 | ||
|
|
62018e1f72 | ||
|
|
7c0f2543a7 | ||
|
|
ca85a28241 | ||
|
|
585840b033 | ||
|
|
dec180ac00 | ||
|
|
86fa104692 | ||
|
|
b059c96dc6 | ||
|
|
a77cec8d58 | ||
|
|
64bcff1c7c | ||
|
|
2ed162ac20 | ||
|
|
e66b4dff3c | ||
|
|
8efd731cc4 | ||
|
|
a5ae1f8587 |
No files matched your search
@@ -103,7 +103,23 @@ version 2.73
|
|||||||
Previously we provided correct answers to PTR queries
|
Previously we provided correct answers to PTR queries
|
||||||
in such zones (including NS and SOA) but not direct
|
in such zones (including NS and SOA) but not direct
|
||||||
NS and SOA queries. Thanks to Johnny S. Lee for
|
NS and SOA queries. Thanks to Johnny S. Lee for
|
||||||
pointing out the problem.
|
pointing out the problem.
|
||||||
|
|
||||||
|
Fix logging of DHCPREPLY which should be suppressed
|
||||||
|
by quiet-dhcp6. Thanks to J. Pablo Abonia for
|
||||||
|
spotting the problem.
|
||||||
|
|
||||||
|
Try and handle net connections with broken fragmentation
|
||||||
|
that lose large UDP packets. If a server times out,
|
||||||
|
reduce the maximum UDP packet size field in the EDNS0
|
||||||
|
header to 1280 bytes. If it then answers, make that
|
||||||
|
change permanent.
|
||||||
|
|
||||||
|
Check IPv4-mapped IPv6 addresses when --stop-rebind
|
||||||
|
is active. Thanks to Jordan Milne for spotting this.
|
||||||
|
|
||||||
|
Allow DHCPv4 options T1 and T2 to be set using --dhcp-option.
|
||||||
|
Thanks to Kevin Benton for patches and work on this.
|
||||||
|
|
||||||
|
|
||||||
version 2.72
|
version 2.72
|
||||||
|
|||||||
+3
-2
@@ -11,8 +11,9 @@
|
|||||||
# If there is more than one v[0-9].* tag, sort them and use the
|
# If there is more than one v[0-9].* tag, sort them and use the
|
||||||
# first. This favours, eg v2.63 over 2.63rc6.
|
# first. This favours, eg v2.63 over 2.63rc6.
|
||||||
|
|
||||||
if which git >/dev/null 2>&1 && [ -d $1/.git ]; then
|
if which git >/dev/null 2>&1 && \
|
||||||
cd $1; git describe | sed 's/^v//'
|
([ -d $1/.git ] || grep '^gitdir:' $1/.git >/dev/null 2>&1); then
|
||||||
|
cd $1; git describe | sed 's/^v//'
|
||||||
elif grep '\$Format:%d\$' $1/VERSION >/dev/null 2>&1; then
|
elif grep '\$Format:%d\$' $1/VERSION >/dev/null 2>&1; then
|
||||||
# unsubstituted VERSION, but no git available.
|
# unsubstituted VERSION, but no git available.
|
||||||
echo UNKNOWN
|
echo UNKNOWN
|
||||||
|
|||||||
Vendored
+1
@@ -5,6 +5,7 @@ dnsmasq (2.73-1) unstable; urgency=low
|
|||||||
addresses. (closes: #771557)
|
addresses. (closes: #771557)
|
||||||
* Add newline at the end of example config file. (LP: #1416895)
|
* Add newline at the end of example config file. (LP: #1416895)
|
||||||
* Make Debian package build reproducible. (closes: #777323)
|
* Make Debian package build reproducible. (closes: #777323)
|
||||||
|
* Add Requires=network.target to systemd unit.
|
||||||
|
|
||||||
-- Simon Kelley <simon@thekelleys.org.uk> Wed, 11 Feb 2015 21:59:42 +0000
|
-- Simon Kelley <simon@thekelleys.org.uk> Wed, 11 Feb 2015 21:59:42 +0000
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
@@ -1,5 +1,6 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=dnsmasq - A lightweight DHCP and caching DNS server
|
Description=dnsmasq - A lightweight DHCP and caching DNS server
|
||||||
|
Requires=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=forking
|
Type=forking
|
||||||
|
|||||||
@@ -345,6 +345,14 @@
|
|||||||
# Ask client to poll for option changes every six hours. (RFC4242)
|
# Ask client to poll for option changes every six hours. (RFC4242)
|
||||||
#dhcp-option=option6:information-refresh-time,6h
|
#dhcp-option=option6:information-refresh-time,6h
|
||||||
|
|
||||||
|
# Set option 58 client renewal time (T1). Defaults to half of the
|
||||||
|
# lease time if not specified. (RFC2132)
|
||||||
|
#dhcp-option=option:T1:1m
|
||||||
|
|
||||||
|
# Set option 59 rebinding time (T2). Defaults to 7/8 of the
|
||||||
|
# lease time if not specified. (RFC2132)
|
||||||
|
#dhcp-option=option:T2:2m
|
||||||
|
|
||||||
# Set the NTP time server address to be the same machine as
|
# Set the NTP time server address to be the same machine as
|
||||||
# is running dnsmasq
|
# is running dnsmasq
|
||||||
#dhcp-option=42,0.0.0.0
|
#dhcp-option=42,0.0.0.0
|
||||||
|
|||||||
@@ -74,7 +74,9 @@ for details.
|
|||||||
There is a dnsmasq mailing list at <A
|
There is a dnsmasq mailing list at <A
|
||||||
HREF="http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss">
|
HREF="http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss">
|
||||||
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss</A> which should be the
|
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss</A> which should be the
|
||||||
first location for queries, bugreports, suggestions etc.
|
first location for queries, bugreports, suggestions etc. The list is mirrored, with a
|
||||||
|
search facility, at <A HREF="https://www.mail-archive.com/dnsmasq-discuss@lists.thekelleys.org.uk/">
|
||||||
|
https://www.mail-archive.com/dnsmasq-discuss@lists.thekelleys.org.uk/</A>.
|
||||||
You can contact me at <A
|
You can contact me at <A
|
||||||
HREF="mailto:simon@thekelleys.org.uk">simon@thekelleys.org.uk</A>.
|
HREF="mailto:simon@thekelleys.org.uk">simon@thekelleys.org.uk</A>.
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
|
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
|
||||||
#define TCP_MAX_QUERIES 100 /* Maximum number of queries per incoming TCP connection */
|
#define TCP_MAX_QUERIES 100 /* Maximum number of queries per incoming TCP connection */
|
||||||
#define EDNS_PKTSZ 4096 /* default max EDNS.0 UDP packet from RFC5625 */
|
#define EDNS_PKTSZ 4096 /* default max EDNS.0 UDP packet from RFC5625 */
|
||||||
|
#define SAFE_PKTSZ 1280 /* "go anywhere" UDP packet size */
|
||||||
#define KEYBLOCK_LEN 40 /* choose to mininise fragmentation when storing DNSSEC keys */
|
#define KEYBLOCK_LEN 40 /* choose to mininise fragmentation when storing DNSSEC keys */
|
||||||
#define DNSSEC_WORK 50 /* Max number of queries to validate one question */
|
#define DNSSEC_WORK 50 /* Max number of queries to validate one question */
|
||||||
#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
|
#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
|
||||||
|
|||||||
+2
-2
@@ -545,8 +545,8 @@ static const struct opttab_t {
|
|||||||
{ "parameter-request", 55, OT_INTERNAL },
|
{ "parameter-request", 55, OT_INTERNAL },
|
||||||
{ "message", 56, OT_INTERNAL },
|
{ "message", 56, OT_INTERNAL },
|
||||||
{ "max-message-size", 57, OT_INTERNAL },
|
{ "max-message-size", 57, OT_INTERNAL },
|
||||||
{ "T1", 58, OT_INTERNAL | OT_TIME},
|
{ "T1", 58, OT_TIME},
|
||||||
{ "T2", 59, OT_INTERNAL | OT_TIME},
|
{ "T2", 59, OT_TIME},
|
||||||
{ "vendor-class", 60, 0 },
|
{ "vendor-class", 60, 0 },
|
||||||
{ "client-id", 61, OT_INTERNAL },
|
{ "client-id", 61, OT_INTERNAL },
|
||||||
{ "nis+-domain", 64, OT_NAME },
|
{ "nis+-domain", 64, OT_NAME },
|
||||||
|
|||||||
+7
-5
@@ -504,7 +504,7 @@ struct server {
|
|||||||
char interface[IF_NAMESIZE+1];
|
char interface[IF_NAMESIZE+1];
|
||||||
struct serverfd *sfd;
|
struct serverfd *sfd;
|
||||||
char *domain; /* set if this server only handles a domain. */
|
char *domain; /* set if this server only handles a domain. */
|
||||||
int flags, tcpfd;
|
int flags, tcpfd, edns_pktsz;
|
||||||
unsigned int queries, failed_queries;
|
unsigned int queries, failed_queries;
|
||||||
#ifdef HAVE_LOOP
|
#ifdef HAVE_LOOP
|
||||||
u32 uid;
|
u32 uid;
|
||||||
@@ -594,6 +594,7 @@ struct hostsfile {
|
|||||||
#define FREC_DO_QUESTION 64
|
#define FREC_DO_QUESTION 64
|
||||||
#define FREC_ADDED_PHEADER 128
|
#define FREC_ADDED_PHEADER 128
|
||||||
#define FREC_CHECK_NOSIGN 256
|
#define FREC_CHECK_NOSIGN 256
|
||||||
|
#define FREC_TEST_PKTSZ 512
|
||||||
|
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
#define HASH_SIZE 20 /* SHA-1 digest size */
|
#define HASH_SIZE 20 /* SHA-1 digest size */
|
||||||
@@ -1148,7 +1149,7 @@ int in_zone(struct auth_zone *zone, char *name, char **cut);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* dnssec.c */
|
/* dnssec.c */
|
||||||
size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr);
|
size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr, int edns_pktsz);
|
||||||
int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t n, char *name, char *keyname, int class);
|
int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t n, char *name, char *keyname, int class);
|
||||||
int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
|
int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
|
||||||
int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer, int *nons);
|
int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer, int *nons);
|
||||||
@@ -1304,9 +1305,10 @@ void lease_update_slaac(time_t now);
|
|||||||
void lease_set_iaid(struct dhcp_lease *lease, int iaid);
|
void lease_set_iaid(struct dhcp_lease *lease, int iaid);
|
||||||
void lease_make_duid(time_t now);
|
void lease_make_duid(time_t now);
|
||||||
#endif
|
#endif
|
||||||
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
|
void lease_set_hwaddr(struct dhcp_lease *lease, const unsigned char *hwaddr,
|
||||||
unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force);
|
const unsigned char *clid, int hw_len, int hw_type,
|
||||||
void lease_set_hostname(struct dhcp_lease *lease, char *name, int auth, char *domain, char *config_domain);
|
int clid_len, time_t now, int force);
|
||||||
|
void lease_set_hostname(struct dhcp_lease *lease, const char *name, int auth, char *domain, char *config_domain);
|
||||||
void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
|
void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
|
||||||
void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now);
|
void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now);
|
||||||
struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
|
struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
|
||||||
|
|||||||
+9
-2
@@ -2162,10 +2162,12 @@ int dnskey_keytag(int alg, int flags, unsigned char *key, int keylen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr)
|
size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class,
|
||||||
|
int type, union mysockaddr *addr, int edns_pktsz)
|
||||||
{
|
{
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
char *types = querystr("dnssec-query", type);
|
char *types = querystr("dnssec-query", type);
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
if (addr->sa.sa_family == AF_INET)
|
if (addr->sa.sa_family == AF_INET)
|
||||||
log_query(F_NOEXTRA | F_DNSSEC | F_IPV4, name, (struct all_addr *)&addr->in.sin_addr, types);
|
log_query(F_NOEXTRA | F_DNSSEC | F_IPV4, name, (struct all_addr *)&addr->in.sin_addr, types);
|
||||||
@@ -2194,7 +2196,12 @@ size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, i
|
|||||||
PUTSHORT(type, p);
|
PUTSHORT(type, p);
|
||||||
PUTSHORT(class, p);
|
PUTSHORT(class, p);
|
||||||
|
|
||||||
return add_do_bit(header, p - (unsigned char *)header, end);
|
ret = add_do_bit(header, p - (unsigned char *)header, end);
|
||||||
|
|
||||||
|
if (find_pseudoheader(header, ret, NULL, &p, NULL))
|
||||||
|
PUTSHORT(edns_pktsz, p);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Go through a domain name, find "pointers" and fix them up based on how many bytes
|
/* Go through a domain name, find "pointers" and fix them up based on how many bytes
|
||||||
|
|||||||
+36
-12
@@ -253,6 +253,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
|
|||||||
void *hash = &crc;
|
void *hash = &crc;
|
||||||
#endif
|
#endif
|
||||||
unsigned int gotname = extract_request(header, plen, daemon->namebuff, NULL);
|
unsigned int gotname = extract_request(header, plen, daemon->namebuff, NULL);
|
||||||
|
unsigned char *pheader;
|
||||||
|
|
||||||
(void)do_bit;
|
(void)do_bit;
|
||||||
|
|
||||||
@@ -261,19 +262,32 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
|
|||||||
forward = NULL;
|
forward = NULL;
|
||||||
else if (forward || (hash && (forward = lookup_frec_by_sender(ntohs(header->id), udpaddr, hash))))
|
else if (forward || (hash && (forward = lookup_frec_by_sender(ntohs(header->id), udpaddr, hash))))
|
||||||
{
|
{
|
||||||
|
/* If we didn't get an answer advertising a maximal packet in EDNS,
|
||||||
|
fall back to 1280, which should work everywhere on IPv6.
|
||||||
|
If that generates an answer, it will become the new default
|
||||||
|
for this server */
|
||||||
|
forward->flags |= FREC_TEST_PKTSZ;
|
||||||
|
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
/* If we've already got an answer to this query, but we're awaiting keys for validation,
|
/* If we've already got an answer to this query, but we're awaiting keys for validation,
|
||||||
there's no point retrying the query, retry the key query instead...... */
|
there's no point retrying the query, retry the key query instead...... */
|
||||||
if (forward->blocking_query)
|
if (forward->blocking_query)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
forward->flags &= ~FREC_TEST_PKTSZ;
|
||||||
|
|
||||||
while (forward->blocking_query)
|
while (forward->blocking_query)
|
||||||
forward = forward->blocking_query;
|
forward = forward->blocking_query;
|
||||||
|
|
||||||
|
forward->flags |= FREC_TEST_PKTSZ;
|
||||||
|
|
||||||
blockdata_retrieve(forward->stash, forward->stash_len, (void *)header);
|
blockdata_retrieve(forward->stash, forward->stash_len, (void *)header);
|
||||||
plen = forward->stash_len;
|
plen = forward->stash_len;
|
||||||
|
|
||||||
|
if (find_pseudoheader(header, plen, NULL, &pheader, NULL))
|
||||||
|
PUTSHORT((forward->flags & FREC_TEST_PKTSZ) ? SAFE_PKTSZ : forward->sentto->edns_pktsz, pheader);
|
||||||
|
|
||||||
if (forward->sentto->addr.sa.sa_family == AF_INET)
|
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");
|
log_query(F_NOEXTRA | F_DNSSEC | F_IPV4, "retry", (struct all_addr *)&forward->sentto->addr.in.sin_addr, "dnssec");
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
@@ -417,7 +431,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
|
|||||||
plen = new_plen;
|
plen = new_plen;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
/* only send to servers dealing with our domain.
|
/* only send to servers dealing with our domain.
|
||||||
@@ -464,6 +478,9 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (find_pseudoheader(header, plen, NULL, &pheader, NULL))
|
||||||
|
PUTSHORT((forward->flags & FREC_TEST_PKTSZ) ? SAFE_PKTSZ : start->edns_pktsz, pheader);
|
||||||
|
|
||||||
if (retry_send(sendto(fd, (char *)header, plen, 0,
|
if (retry_send(sendto(fd, (char *)header, plen, 0,
|
||||||
&start->addr.sa,
|
&start->addr.sa,
|
||||||
@@ -760,7 +777,6 @@ void reply_query(int fd, int family, time_t now)
|
|||||||
}
|
}
|
||||||
|
|
||||||
server = forward->sentto;
|
server = forward->sentto;
|
||||||
|
|
||||||
if ((forward->sentto->flags & SERV_TYPE) == 0)
|
if ((forward->sentto->flags & SERV_TYPE) == 0)
|
||||||
{
|
{
|
||||||
if (RCODE(header) == REFUSED)
|
if (RCODE(header) == REFUSED)
|
||||||
@@ -781,7 +797,14 @@ void reply_query(int fd, int family, time_t now)
|
|||||||
if (!option_bool(OPT_ALL_SERVERS))
|
if (!option_bool(OPT_ALL_SERVERS))
|
||||||
daemon->last_server = server;
|
daemon->last_server = server;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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 an 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) &&
|
||||||
|
((header->hb3 & HB3_TC) || n >= SAFE_PKTSZ))
|
||||||
|
server->edns_pktsz = SAFE_PKTSZ;
|
||||||
|
|
||||||
/* If the answer is an error, keep the forward record in place in case
|
/* 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
|
we get a good reply from another server. Kill it when we've
|
||||||
had replies from all to avoid filling the forwarding table when
|
had replies from all to avoid filling the forwarding table when
|
||||||
@@ -890,7 +913,7 @@ void reply_query(int fd, int family, time_t now)
|
|||||||
{
|
{
|
||||||
new->flags |= FREC_DNSKEY_QUERY;
|
new->flags |= FREC_DNSKEY_QUERY;
|
||||||
nn = dnssec_generate_query(header, ((char *) header) + daemon->packet_buff_sz,
|
nn = dnssec_generate_query(header, ((char *) header) + daemon->packet_buff_sz,
|
||||||
daemon->keyname, forward->class, T_DNSKEY, &server->addr);
|
daemon->keyname, forward->class, T_DNSKEY, &server->addr, server->edns_pktsz);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -899,7 +922,7 @@ void reply_query(int fd, int family, time_t now)
|
|||||||
else
|
else
|
||||||
new->flags |= FREC_DS_QUERY;
|
new->flags |= FREC_DS_QUERY;
|
||||||
nn = dnssec_generate_query(header,((char *) header) + daemon->packet_buff_sz,
|
nn = dnssec_generate_query(header,((char *) header) + daemon->packet_buff_sz,
|
||||||
daemon->keyname, forward->class, T_DS, &server->addr);
|
daemon->keyname, forward->class, T_DS, &server->addr, server->edns_pktsz);
|
||||||
}
|
}
|
||||||
if ((hash = hash_questions(header, nn, daemon->namebuff)))
|
if ((hash = hash_questions(header, nn, daemon->namebuff)))
|
||||||
memcpy(new->hash, hash, HASH_SIZE);
|
memcpy(new->hash, hash, HASH_SIZE);
|
||||||
@@ -1526,7 +1549,7 @@ static int tcp_check_for_unsigned_zone(time_t now, struct dns_header *header, s
|
|||||||
|
|
||||||
/* Can't find it in the cache, have to send a query */
|
/* Can't find it in the cache, have to send a query */
|
||||||
|
|
||||||
m = dnssec_generate_query(header, ((char *) header) + 65536, name_start, class, T_DS, &server->addr);
|
m = dnssec_generate_query(header, ((char *) header) + 65536, name_start, class, T_DS, &server->addr, server->edns_pktsz);
|
||||||
|
|
||||||
*length = htons(m);
|
*length = htons(m);
|
||||||
|
|
||||||
@@ -1638,7 +1661,7 @@ static int tcp_key_recurse(time_t now, int status, struct dns_header *header, si
|
|||||||
|
|
||||||
another_tcp_key:
|
another_tcp_key:
|
||||||
m = dnssec_generate_query(new_header, ((char *) new_header) + 65536, keyname, class,
|
m = dnssec_generate_query(new_header, ((char *) new_header) + 65536, keyname, class,
|
||||||
new_status == STAT_NEED_KEY ? T_DNSKEY : T_DS, &server->addr);
|
new_status == STAT_NEED_KEY ? T_DNSKEY : T_DS, &server->addr, server->edns_pktsz);
|
||||||
|
|
||||||
*length = htons(m);
|
*length = htons(m);
|
||||||
|
|
||||||
@@ -1996,8 +2019,9 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
result = (status == STAT_SECURE ? "SECURE" : (status == STAT_INSECURE ? "INSECURE" : "BOGUS"));
|
result = (status == STAT_SECURE ? "SECURE" : (status == STAT_INSECURE ? "INSECURE" : "BOGUS"));
|
||||||
if (status == STAT_BOGUS && extract_request(header, m, daemon->namebuff, NULL))
|
|
||||||
domain = daemon->namebuff;
|
if (status == STAT_BOGUS && extract_request(header, m, daemon->namebuff, NULL))
|
||||||
|
domain = daemon->namebuff;
|
||||||
|
|
||||||
log_query(F_KEYTAG | F_SECSTAT, domain, NULL, result);
|
log_query(F_KEYTAG | F_SECSTAT, domain, NULL, result);
|
||||||
|
|
||||||
@@ -2040,8 +2064,8 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
m = process_reply(header, now, last_server, (unsigned int)m,
|
m = process_reply(header, now, last_server, (unsigned int)m,
|
||||||
option_bool(OPT_NO_REBIND) && !norebind, no_cache_dnssec, bogusanswer,
|
option_bool(OPT_NO_REBIND) && !norebind, no_cache_dnssec, cache_secure, bogusanswer,
|
||||||
cache_secure, ad_question, do_bit, added_pheader, check_subnet, &peer_addr);
|
ad_question, do_bit, added_pheader, check_subnet, &peer_addr);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -813,9 +813,9 @@ void lease_set_iaid(struct dhcp_lease *lease, int iaid)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
|
void lease_set_hwaddr(struct dhcp_lease *lease, const unsigned char *hwaddr,
|
||||||
unsigned char *clid, int hw_len, int hw_type, int clid_len,
|
const unsigned char *clid, int hw_len, int hw_type,
|
||||||
time_t now, int force)
|
int clid_len, time_t now, int force)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
int change = force;
|
int change = force;
|
||||||
@@ -897,7 +897,7 @@ static void kill_name(struct dhcp_lease *lease)
|
|||||||
lease->hostname = lease->fqdn = NULL;
|
lease->hostname = lease->fqdn = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lease_set_hostname(struct dhcp_lease *lease, char *name, int auth, char *domain, char *config_domain)
|
void lease_set_hostname(struct dhcp_lease *lease, const char *name, int auth, char *domain, char *config_domain)
|
||||||
{
|
{
|
||||||
struct dhcp_lease *lease_tmp;
|
struct dhcp_lease *lease_tmp;
|
||||||
char *new_name = NULL, *new_fqdn = NULL;
|
char *new_name = NULL, *new_fqdn = NULL;
|
||||||
|
|||||||
@@ -1396,6 +1396,7 @@ void add_update_server(int flags,
|
|||||||
serv->domain = domain_str;
|
serv->domain = domain_str;
|
||||||
serv->next = next;
|
serv->next = next;
|
||||||
serv->queries = serv->failed_queries = 0;
|
serv->queries = serv->failed_queries = 0;
|
||||||
|
serv->edns_pktsz = daemon->edns_pktsz;
|
||||||
#ifdef HAVE_LOOP
|
#ifdef HAVE_LOOP
|
||||||
serv->uid = rand32();
|
serv->uid = rand32();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+11
-7
@@ -4498,15 +4498,19 @@ void read_opts(int argc, char **argv, char *compile_opts)
|
|||||||
{
|
{
|
||||||
struct server *tmp;
|
struct server *tmp;
|
||||||
for (tmp = daemon->servers; tmp; tmp = tmp->next)
|
for (tmp = daemon->servers; tmp; tmp = tmp->next)
|
||||||
if (!(tmp->flags & SERV_HAS_SOURCE))
|
{
|
||||||
{
|
tmp->edns_pktsz = daemon->edns_pktsz;
|
||||||
if (tmp->source_addr.sa.sa_family == AF_INET)
|
|
||||||
tmp->source_addr.in.sin_port = htons(daemon->query_port);
|
if (!(tmp->flags & SERV_HAS_SOURCE))
|
||||||
|
{
|
||||||
|
if (tmp->source_addr.sa.sa_family == AF_INET)
|
||||||
|
tmp->source_addr.in.sin_port = htons(daemon->query_port);
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
else if (tmp->source_addr.sa.sa_family == AF_INET6)
|
else if (tmp->source_addr.sa.sa_family == AF_INET6)
|
||||||
tmp->source_addr.in6.sin6_port = htons(daemon->query_port);
|
tmp->source_addr.in6.sin6_port = htons(daemon->query_port);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (daemon->if_addrs)
|
if (daemon->if_addrs)
|
||||||
|
|||||||
+32
-24
@@ -94,8 +94,8 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
|
|||||||
count = 256;
|
count = 256;
|
||||||
digs = ((count-1)>>2)+1;
|
digs = ((count-1)>>2)+1;
|
||||||
|
|
||||||
/* output is \[x<hex>/siz]. which is digs+6/7/8 chars */
|
/* output is \[x<hex>/siz]. which is digs+7/8/9 chars */
|
||||||
namelen += digs+6;
|
namelen += digs+7;
|
||||||
if (count > 9)
|
if (count > 9)
|
||||||
namelen++;
|
namelen++;
|
||||||
if (count > 99)
|
if (count > 99)
|
||||||
@@ -125,8 +125,8 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* label_type = 0 -> label. */
|
{ /* label_type = 0 -> label. */
|
||||||
namelen += l;
|
namelen += l + 1; /* include period */
|
||||||
if (namelen+1 >= MAXDNAME)
|
if (namelen >= MAXDNAME)
|
||||||
return 0;
|
return 0;
|
||||||
if (!CHECK_LEN(header, p, plen, l))
|
if (!CHECK_LEN(header, p, plen, l))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -552,7 +552,7 @@ static size_t add_pseudoheader(struct dns_header *header, size_t plen, unsigned
|
|||||||
return plen;
|
return plen;
|
||||||
*p++ = 0; /* empty name */
|
*p++ = 0; /* empty name */
|
||||||
PUTSHORT(T_OPT, p);
|
PUTSHORT(T_OPT, p);
|
||||||
PUTSHORT(daemon->edns_pktsz, p); /* max packet length */
|
PUTSHORT(SAFE_PKTSZ, p); /* max packet length, this will be overwritten */
|
||||||
PUTSHORT(0, p); /* extended RCODE and version */
|
PUTSHORT(0, p); /* extended RCODE and version */
|
||||||
PUTSHORT(set_do ? 0x8000 : 0, p); /* DO flag */
|
PUTSHORT(set_do ? 0x8000 : 0, p); /* DO flag */
|
||||||
lenp = p;
|
lenp = p;
|
||||||
@@ -1117,10 +1117,23 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
|
|||||||
memcpy(&addr, p1, addrlen);
|
memcpy(&addr, p1, addrlen);
|
||||||
|
|
||||||
/* check for returned address in private space */
|
/* check for returned address in private space */
|
||||||
if (check_rebind &&
|
if (check_rebind)
|
||||||
(flags & F_IPV4) &&
|
{
|
||||||
private_net(addr.addr.addr4, !option_bool(OPT_LOCAL_REBIND)))
|
if ((flags & F_IPV4) &&
|
||||||
return 1;
|
private_net(addr.addr.addr4, !option_bool(OPT_LOCAL_REBIND)))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
if ((flags & F_IPV6) &&
|
||||||
|
IN6_IS_ADDR_V4MAPPED(&addr.addr.addr6))
|
||||||
|
{
|
||||||
|
struct in_addr v4;
|
||||||
|
v4.s_addr = ((const uint32_t *) (&addr.addr.addr6))[3];
|
||||||
|
if (private_net(v4, !option_bool(OPT_LOCAL_REBIND)))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_IPSET
|
#ifdef HAVE_IPSET
|
||||||
if (ipsets && (flags & (F_IPV4 | F_IPV6)))
|
if (ipsets && (flags & (F_IPV4 | F_IPV6)))
|
||||||
@@ -1537,7 +1550,6 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
|
|||||||
unsigned short flag;
|
unsigned short flag;
|
||||||
int q, ans, anscount = 0, addncount = 0;
|
int q, ans, anscount = 0, addncount = 0;
|
||||||
int dryrun = 0, sec_reqd = 0, have_pseudoheader = 0;
|
int dryrun = 0, sec_reqd = 0, have_pseudoheader = 0;
|
||||||
int is_sign;
|
|
||||||
struct crec *crecp;
|
struct crec *crecp;
|
||||||
int nxdomain = 0, auth = 1, trunc = 0, sec_data = 1;
|
int nxdomain = 0, auth = 1, trunc = 0, sec_data = 1;
|
||||||
struct mx_srv_record *rec;
|
struct mx_srv_record *rec;
|
||||||
@@ -1557,28 +1569,19 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
|
|||||||
forward rather than answering from the cache, which doesn't include
|
forward rather than answering from the cache, which doesn't include
|
||||||
security information, unless we're in DNSSEC validation mode. */
|
security information, unless we're in DNSSEC validation mode. */
|
||||||
|
|
||||||
if (find_pseudoheader(header, qlen, NULL, &pheader, &is_sign))
|
if (find_pseudoheader(header, qlen, NULL, &pheader, NULL))
|
||||||
{
|
{
|
||||||
unsigned short udpsz, flags;
|
unsigned short flags;
|
||||||
unsigned char *psave = pheader;
|
|
||||||
|
|
||||||
have_pseudoheader = 1;
|
have_pseudoheader = 1;
|
||||||
|
|
||||||
GETSHORT(udpsz, pheader);
|
pheader += 4; /* udp size, ext_rcode */
|
||||||
pheader += 2; /* ext_rcode */
|
|
||||||
GETSHORT(flags, pheader);
|
GETSHORT(flags, pheader);
|
||||||
|
|
||||||
if ((sec_reqd = flags & 0x8000))
|
if ((sec_reqd = flags & 0x8000))
|
||||||
*do_bit = 1;/* do bit */
|
*do_bit = 1;/* do bit */
|
||||||
|
|
||||||
*ad_reqd = 1;
|
*ad_reqd = 1;
|
||||||
|
|
||||||
/* If our client is advertising a larger UDP packet size
|
|
||||||
than we allow, trim it so that we don't get an overlarge
|
|
||||||
response from upstream */
|
|
||||||
|
|
||||||
if (!is_sign && (udpsz > daemon->edns_pktsz))
|
|
||||||
PUTSHORT(daemon->edns_pktsz, psave);
|
|
||||||
|
|
||||||
dryrun = 1;
|
dryrun = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1608,6 +1611,11 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
|
|||||||
GETSHORT(qtype, p);
|
GETSHORT(qtype, p);
|
||||||
GETSHORT(qclass, p);
|
GETSHORT(qclass, p);
|
||||||
|
|
||||||
|
/* Don't filter RRSIGS from answers to ANY queries, even if do-bit
|
||||||
|
not set. */
|
||||||
|
if (qtype == T_ANY)
|
||||||
|
*do_bit = 1;
|
||||||
|
|
||||||
ans = 0; /* have we answered this question */
|
ans = 0; /* have we answered this question */
|
||||||
|
|
||||||
if (qtype == T_TXT || qtype == T_ANY)
|
if (qtype == T_TXT || qtype == T_ANY)
|
||||||
|
|||||||
+52
-23
@@ -52,7 +52,9 @@ static void do_options(struct dhcp_context *context,
|
|||||||
int null_term, int pxearch,
|
int null_term, int pxearch,
|
||||||
unsigned char *uuid,
|
unsigned char *uuid,
|
||||||
int vendor_class_len,
|
int vendor_class_len,
|
||||||
time_t now);
|
time_t now,
|
||||||
|
unsigned int lease_time,
|
||||||
|
unsigned short fuzz);
|
||||||
|
|
||||||
|
|
||||||
static void match_vendor_opts(unsigned char *opt, struct dhcp_opt *dopt);
|
static void match_vendor_opts(unsigned char *opt, struct dhcp_opt *dopt);
|
||||||
@@ -610,7 +612,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
|
|||||||
|
|
||||||
clear_packet(mess, end);
|
clear_packet(mess, end);
|
||||||
do_options(context, mess, end, NULL, hostname, get_domain(mess->yiaddr),
|
do_options(context, mess, end, NULL, hostname, get_domain(mess->yiaddr),
|
||||||
netid, subnet_addr, 0, 0, -1, NULL, vendor_class_len, now);
|
netid, subnet_addr, 0, 0, -1, NULL, vendor_class_len, now, 0xffffffff, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -886,10 +888,10 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
|
|||||||
|
|
||||||
option_put(mess, end, OPTION_MESSAGE_TYPE, 1,
|
option_put(mess, end, OPTION_MESSAGE_TYPE, 1,
|
||||||
mess_type == DHCPDISCOVER ? DHCPOFFER : DHCPACK);
|
mess_type == DHCPDISCOVER ? DHCPOFFER : DHCPACK);
|
||||||
option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, htonl(context->local.s_addr));
|
option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, htonl(tmp->local.s_addr));
|
||||||
pxe_misc(mess, end, uuid);
|
pxe_misc(mess, end, uuid);
|
||||||
prune_vendor_opts(tagif_netid);
|
prune_vendor_opts(tagif_netid);
|
||||||
do_encap_opts(pxe_opts(pxearch, tagif_netid, context->local, now), OPTION_VENDOR_CLASS_OPT, DHOPT_VENDOR_MATCH, mess, end, 0);
|
do_encap_opts(pxe_opts(pxearch, tagif_netid, tmp->local, now), OPTION_VENDOR_CLASS_OPT, DHOPT_VENDOR_MATCH, mess, end, 0);
|
||||||
|
|
||||||
log_packet("PXE", NULL, emac, emac_len, iface_name, ignore ? "proxy-ignored" : "proxy", NULL, mess->xid);
|
log_packet("PXE", NULL, emac, emac_len, iface_name, ignore ? "proxy-ignored" : "proxy", NULL, mess->xid);
|
||||||
log_tags(tagif_netid, ntohl(mess->xid));
|
log_tags(tagif_netid, ntohl(mess->xid));
|
||||||
@@ -1042,13 +1044,8 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
|
|||||||
option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
|
option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
|
||||||
option_put(mess, end, OPTION_LEASE_TIME, 4, time);
|
option_put(mess, end, OPTION_LEASE_TIME, 4, time);
|
||||||
/* T1 and T2 are required in DHCPOFFER by HP's wacky Jetdirect client. */
|
/* T1 and T2 are required in DHCPOFFER by HP's wacky Jetdirect client. */
|
||||||
if (time != 0xffffffff)
|
|
||||||
{
|
|
||||||
option_put(mess, end, OPTION_T1, 4, (time/2));
|
|
||||||
option_put(mess, end, OPTION_T2, 4, (time*7)/8);
|
|
||||||
}
|
|
||||||
do_options(context, mess, end, req_options, offer_hostname, get_domain(mess->yiaddr),
|
do_options(context, mess, end, req_options, offer_hostname, get_domain(mess->yiaddr),
|
||||||
netid, subnet_addr, fqdn_flags, borken_opt, pxearch, uuid, vendor_class_len, now);
|
netid, subnet_addr, fqdn_flags, borken_opt, pxearch, uuid, vendor_class_len, now, time, fuzz);
|
||||||
|
|
||||||
return dhcp_packet_size(mess, agent_id, real_end);
|
return dhcp_packet_size(mess, agent_id, real_end);
|
||||||
|
|
||||||
@@ -1367,15 +1364,8 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
|
|||||||
option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPACK);
|
option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPACK);
|
||||||
option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
|
option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
|
||||||
option_put(mess, end, OPTION_LEASE_TIME, 4, time);
|
option_put(mess, end, OPTION_LEASE_TIME, 4, time);
|
||||||
if (time != 0xffffffff)
|
|
||||||
{
|
|
||||||
while (fuzz > (time/16))
|
|
||||||
fuzz = fuzz/2;
|
|
||||||
option_put(mess, end, OPTION_T1, 4, (time/2) - fuzz);
|
|
||||||
option_put(mess, end, OPTION_T2, 4, ((time/8)*7) - fuzz);
|
|
||||||
}
|
|
||||||
do_options(context, mess, end, req_options, hostname, get_domain(mess->yiaddr),
|
do_options(context, mess, end, req_options, hostname, get_domain(mess->yiaddr),
|
||||||
netid, subnet_addr, fqdn_flags, borken_opt, pxearch, uuid, vendor_class_len, now);
|
netid, subnet_addr, fqdn_flags, borken_opt, pxearch, uuid, vendor_class_len, now, time, fuzz);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dhcp_packet_size(mess, agent_id, real_end);
|
return dhcp_packet_size(mess, agent_id, real_end);
|
||||||
@@ -1440,7 +1430,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
|
|||||||
}
|
}
|
||||||
|
|
||||||
do_options(context, mess, end, req_options, hostname, get_domain(mess->ciaddr),
|
do_options(context, mess, end, req_options, hostname, get_domain(mess->ciaddr),
|
||||||
netid, subnet_addr, fqdn_flags, borken_opt, pxearch, uuid, vendor_class_len, now);
|
netid, subnet_addr, fqdn_flags, borken_opt, pxearch, uuid, vendor_class_len, now, 0xffffffff, 0);
|
||||||
|
|
||||||
*is_inform = 1; /* handle reply differently */
|
*is_inform = 1; /* handle reply differently */
|
||||||
return dhcp_packet_size(mess, agent_id, real_end);
|
return dhcp_packet_size(mess, agent_id, real_end);
|
||||||
@@ -2137,7 +2127,9 @@ static void do_options(struct dhcp_context *context,
|
|||||||
int null_term, int pxe_arch,
|
int null_term, int pxe_arch,
|
||||||
unsigned char *uuid,
|
unsigned char *uuid,
|
||||||
int vendor_class_len,
|
int vendor_class_len,
|
||||||
time_t now)
|
time_t now,
|
||||||
|
unsigned int lease_time,
|
||||||
|
unsigned short fuzz)
|
||||||
{
|
{
|
||||||
struct dhcp_opt *opt, *config_opts = daemon->dhcp_opts;
|
struct dhcp_opt *opt, *config_opts = daemon->dhcp_opts;
|
||||||
struct dhcp_boot *boot;
|
struct dhcp_boot *boot;
|
||||||
@@ -2261,7 +2253,42 @@ static void do_options(struct dhcp_context *context,
|
|||||||
/* rfc3011 says this doesn't need to be in the requested options list. */
|
/* rfc3011 says this doesn't need to be in the requested options list. */
|
||||||
if (subnet_addr.s_addr)
|
if (subnet_addr.s_addr)
|
||||||
option_put(mess, end, OPTION_SUBNET_SELECT, INADDRSZ, ntohl(subnet_addr.s_addr));
|
option_put(mess, end, OPTION_SUBNET_SELECT, INADDRSZ, ntohl(subnet_addr.s_addr));
|
||||||
|
|
||||||
|
if (lease_time != 0xffffffff)
|
||||||
|
{
|
||||||
|
unsigned int t1val = lease_time/2;
|
||||||
|
unsigned int t2val = (lease_time*7)/8;
|
||||||
|
unsigned int hval;
|
||||||
|
|
||||||
|
/* If set by user, sanity check, so not longer than lease. */
|
||||||
|
if ((opt = option_find2(OPTION_T1)))
|
||||||
|
{
|
||||||
|
hval = ntohl(*((unsigned int *)opt->val));
|
||||||
|
if (hval < lease_time && hval > 2)
|
||||||
|
t1val = hval;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((opt = option_find2(OPTION_T2)))
|
||||||
|
{
|
||||||
|
hval = ntohl(*((unsigned int *)opt->val));
|
||||||
|
if (hval < lease_time && hval > 2)
|
||||||
|
t2val = hval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ensure T1 is still < T2 */
|
||||||
|
if (t2val <= t1val)
|
||||||
|
t1val = t2val - 1;
|
||||||
|
|
||||||
|
while (fuzz > (t1val/8))
|
||||||
|
fuzz = fuzz/2;
|
||||||
|
|
||||||
|
t1val -= fuzz;
|
||||||
|
t2val -= fuzz;
|
||||||
|
|
||||||
|
option_put(mess, end, OPTION_T1, 4, t1val);
|
||||||
|
option_put(mess, end, OPTION_T2, 4, t2val);
|
||||||
|
}
|
||||||
|
|
||||||
/* replies to DHCPINFORM may not have a valid context */
|
/* replies to DHCPINFORM may not have a valid context */
|
||||||
if (context)
|
if (context)
|
||||||
{
|
{
|
||||||
@@ -2356,12 +2383,14 @@ static void do_options(struct dhcp_context *context,
|
|||||||
if (!(opt->flags & DHOPT_FORCE) && !in_list(req_options, optno))
|
if (!(opt->flags & DHOPT_FORCE) && !in_list(req_options, optno))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* prohibit some used-internally options */
|
/* prohibit some used-internally options. T1 and T2 already handled. */
|
||||||
if (optno == OPTION_CLIENT_FQDN ||
|
if (optno == OPTION_CLIENT_FQDN ||
|
||||||
optno == OPTION_MAXMESSAGE ||
|
optno == OPTION_MAXMESSAGE ||
|
||||||
optno == OPTION_OVERLOAD ||
|
optno == OPTION_OVERLOAD ||
|
||||||
optno == OPTION_PAD ||
|
optno == OPTION_PAD ||
|
||||||
optno == OPTION_END)
|
optno == OPTION_END ||
|
||||||
|
optno == OPTION_T1 ||
|
||||||
|
optno == OPTION_T2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (optno == OPTION_SNAME && done_server)
|
if (optno == OPTION_SNAME && done_server)
|
||||||
|
|||||||
+2
-2
@@ -1047,9 +1047,9 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
|||||||
{
|
{
|
||||||
preferred_time = valid_time = 0;
|
preferred_time = valid_time = 0;
|
||||||
message = _("address invalid");
|
message = _("address invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message)
|
if (message && (message != state->hostname))
|
||||||
log6_packet(state, "DHCPREPLY", req_addr, message);
|
log6_packet(state, "DHCPREPLY", req_addr, message);
|
||||||
else
|
else
|
||||||
log6_quiet(state, "DHCPREPLY", req_addr, message);
|
log6_quiet(state, "DHCPREPLY", req_addr, message);
|
||||||
|
|||||||
Reference in new issue
Block a user