mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
7541d30c9c
f52bb5b fix previous commit
18eac67 Fix entries in /etc/hosts disabling static leases.
f8c77ed Fix removal of DHCP_CLIENT_MAC options from DHCPv6 relay replies.
4bf62f6 Tidy cache_blockdata_free()
9c0d445 Fix e7bfd556c079c8b5e7425aed44abc35925b24043 to actually work.
2896e24 Check for not(DS or DNSKEY) in is_outdated_cname_pointer()
a90f09d Fix crash freeing negative SRV cache entries.
5b99eae Cache SRV records.
2daca52 Fix typo in ra-param man page section.
2c59473 File logic bug in cache-marshalling code. Introduced a couple of commits back.
cc921df Remove nested struct/union in cache records and all_addr.
ab194ed Futher address union tidying.
65a01b7
Tidy address-union handling: move class into explicit argument.
bde4647 Tidy all_addr union, merge log and rcode fields.
e7bfd55 Alter DHCP address selection after DECLINE in consec-addr mode. Avoid offering the same address after a recieving a DECLINE message to stop an infinite protocol loop. This has long been done in default address allocation mode: this adds similar behaviour when allocaing addresses consecutively.
The most relevant fix for openwrt is 18eac67 (& my own local f52bb5b
which fixes a missing bracket silly) To quote the patch:
It is possible for a config entry to have one address family specified by a
dhcp-host directive and the other added from /etc/hosts. This is especially
common on OpenWrt because it uses odhcpd for DHCPv6 and IPv6 leases are
imported into dnsmasq via a hosts file.
To handle this case there need to be separate *_HOSTS flags for IPv4 and IPv6.
Otherwise when the hosts file is reloaded it will clear the CONFIG_ADDR(6) flag
which was set by the dhcp-host directive.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
72 lines
2.5 KiB
Diff
72 lines
2.5 KiB
Diff
From 24b87607c1353e94689e8a2190571ab3f3b36f31 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
|
|
Date: Wed, 24 Oct 2018 22:30:18 +0100
|
|
Subject: [PATCH 07/30] Do not rely on dead code elimination, use array
|
|
instead. Make options bits derived from size and count. Use size of option
|
|
bits and last supported bit in computation. No new change would be required
|
|
when new options are added. Just change OPT_LAST constant.
|
|
|
|
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
|
---
|
|
src/dnsmasq.h | 11 +++++++----
|
|
src/option.c | 10 ++--------
|
|
2 files changed, 9 insertions(+), 12 deletions(-)
|
|
|
|
--- a/src/dnsmasq.h
|
|
+++ b/src/dnsmasq.h
|
|
@@ -200,9 +200,6 @@ struct event_desc {
|
|
#define EC_MISC 5
|
|
#define EC_INIT_OFFSET 10
|
|
|
|
-/* Trust the compiler dead-code eliminator.... */
|
|
-#define option_bool(x) (((x) < 32) ? daemon->options & (1u << (x)) : daemon->options2 & (1u << ((x) - 32)))
|
|
-
|
|
#define OPT_BOGUSPRIV 0
|
|
#define OPT_FILTER 1
|
|
#define OPT_LOG 2
|
|
@@ -264,6 +261,12 @@ struct event_desc {
|
|
#define OPT_UBUS 58
|
|
#define OPT_LAST 59
|
|
|
|
+#define OPTION_BITS (sizeof(unsigned int)*8)
|
|
+#define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )
|
|
+#define option_var(x) (daemon->options[(x) / OPTION_BITS])
|
|
+#define option_val(x) ((1u) << ((x) % OPTION_BITS))
|
|
+#define option_bool(x) (option_var(x) & option_val(x))
|
|
+
|
|
/* extra flags for my_syslog, we use a couple of facilities since they are known
|
|
not to occupy the same bits as priorities, no matter how syslog.h is set up. */
|
|
#define MS_TFTP LOG_USER
|
|
@@ -978,7 +981,7 @@ extern struct daemon {
|
|
config file arguments. All set (including defaults)
|
|
in option.c */
|
|
|
|
- unsigned int options, options2;
|
|
+ unsigned int options[OPTION_SIZE];
|
|
struct resolvc default_resolv, *resolv_files;
|
|
time_t last_resolv;
|
|
char *servers_file;
|
|
--- a/src/option.c
|
|
+++ b/src/option.c
|
|
@@ -1490,18 +1490,12 @@ static int parse_dhcp_opt(char *errstr,
|
|
|
|
void set_option_bool(unsigned int opt)
|
|
{
|
|
- if (opt < 32)
|
|
- daemon->options |= 1u << opt;
|
|
- else
|
|
- daemon->options2 |= 1u << (opt - 32);
|
|
+ option_var(opt) |= option_val(opt);
|
|
}
|
|
|
|
void reset_option_bool(unsigned int opt)
|
|
{
|
|
- if (opt < 32)
|
|
- daemon->options &= ~(1u << opt);
|
|
- else
|
|
- daemon->options2 &= ~(1u << (opt - 32));
|
|
+ option_var(opt) &= ~(option_val(opt));
|
|
}
|
|
|
|
static int one_opt(int option, char *arg, char *errstr, char *gen_err, int command_line, int servers_only)
|