143 lines
5.2 KiB
Diff
143 lines
5.2 KiB
Diff
From 53e1a09a06e11317bbde0e236837e5daa8d40593 Mon Sep 17 00:00:00 2001
|
|
From: liaichun <liaichun@huawei.com>
|
|
Date: Mon, 20 Apr 2020 16:06:51 +0800
|
|
Subject: [PATCH] bugfix-allow-binding-mac-with-ipv6
|
|
|
|
Conflict: NA
|
|
Reference: NA
|
|
|
|
---
|
|
src/dnsmasq.c | 2 +-
|
|
src/dnsmasq.h | 4 ++-
|
|
src/option.c | 5 +++-
|
|
src/rfc3315.c | 35 +++++++++++++++++++++++++-
|
|
4 files changed, 46 insertions(+)
|
|
|
|
diff --git a/src/dnsmasq.c b/src/dnsmasq.c
|
|
index fc085eb..e44c360 100644
|
|
--- a/src/dnsmasq.c
|
|
+++ b/src/dnsmasq.c
|
|
@@ -260,7 +260,7 @@ int main (int argc, char **argv)
|
|
if (daemon->dhcp6)
|
|
{
|
|
daemon->doing_ra = option_bool(OPT_RA);
|
|
-
|
|
+ daemon->bind_mac_with_ip6 = option_bool(OPT_BIND_MAC_IP6);
|
|
for (context = daemon->dhcp6; context; context = context->next)
|
|
{
|
|
if (context->flags & CONTEXT_DHCP)
|
|
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
|
|
index 68e6287..e7f1a0d 100644
|
|
--- a/src/dnsmasq.h
|
|
+++ b/src/dnsmasq.h
|
|
@@ -269,7 +269,8 @@ struct event_desc {
|
|
#define OPT_SINGLE_PORT 60
|
|
#define OPT_LEASE_RENEW 61
|
|
#define OPT_LOG_DEBUG 62
|
|
-#define OPT_LAST 63
|
|
+#define OPT_BIND_MAC_IP6 63
|
|
+#define OPT_LAST 64
|
|
|
|
#define OPTION_BITS (sizeof(unsigned int)*8)
|
|
#define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )
|
|
@@ -1049,6 +1050,7 @@ extern struct daemon {
|
|
int override;
|
|
int enable_pxe;
|
|
int doing_ra, doing_dhcp6;
|
|
+ int bind_mac_with_ip6;
|
|
struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *dhcp_gen_names;
|
|
struct dhcp_netid_list *force_broadcast, *bootp_dynamic;
|
|
struct hostsfile *dhcp_hosts_file, *dhcp_opts_file, *dynamic_dirs;
|
|
diff --git a/src/option.c b/src/option.c
|
|
index 1f698da..f02d389 100644
|
|
--- a/src/option.c
|
|
+++ b/src/option.c
|
|
@@ -167,7 +167,8 @@ struct myoption {
|
|
#define LOPT_PXE_VENDOR 361
|
|
#define LOPT_DYNHOST 362
|
|
#define LOPT_LOG_DEBUG 363
|
|
-
|
|
+#define LOPT_BIND_MAC_IP6 364
|
|
+
|
|
#ifdef HAVE_GETOPT_LONG
|
|
static const struct option opts[] =
|
|
#else
|
|
@@ -339,6 +340,7 @@ static const struct myoption opts[] =
|
|
{ "dhcp-ignore-clid", 0, 0, LOPT_IGNORE_CLID },
|
|
{ "dynamic-host", 1, 0, LOPT_DYNHOST },
|
|
{ "log-debug", 0, 0, LOPT_LOG_DEBUG },
|
|
+ { "bind-mac-with-ip6", 0, 0 , LOPT_BIND_MAC_IP6 },
|
|
{ NULL, 0, 0, 0 }
|
|
};
|
|
|
|
@@ -518,6 +520,7 @@ static struct {
|
|
{ LOPT_DUMPFILE, ARG_ONE, "<path>", gettext_noop("Path to debug packet dump file"), NULL },
|
|
{ LOPT_DUMPMASK, ARG_ONE, "<hex>", gettext_noop("Mask which packets to dump"), NULL },
|
|
{ LOPT_SCRIPT_TIME, OPT_LEASE_RENEW, NULL, gettext_noop("Call dhcp-script when lease expiry changes."), NULL },
|
|
+ { LOPT_BIND_MAC_IP6, OPT_BIND_MAC_IP6, NULL, gettext_noop("Bind mac with ipv6 address. This is an experimental feature and it conflicts with rfc3315."), NULL },
|
|
{ 0, 0, NULL, NULL, NULL }
|
|
};
|
|
|
|
diff --git a/src/rfc3315.c b/src/rfc3315.c
|
|
index b3f0a0a..a5a092c 100644
|
|
--- a/src/rfc3315.c
|
|
+++ b/src/rfc3315.c
|
|
@@ -49,6 +49,7 @@ static void end_ia(int t1cntr, unsigned int min_time, int do_fuzz);
|
|
static void mark_context_used(struct state *state, struct in6_addr *addr);
|
|
static void mark_config_used(struct dhcp_context *context, struct in6_addr *addr);
|
|
static int check_address(struct state *state, struct in6_addr *addr);
|
|
+static int check_and_try_preempte_address(struct state *state, struct in6_addr *addr, time_t now, struct dhcp_config *config);
|
|
static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state, time_t now);
|
|
static struct addrlist *config_implies(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr);
|
|
static void add_address(struct state *state, struct dhcp_context *context, unsigned int lease_time, void *ia_option,
|
|
@@ -703,7 +704,8 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
|
for (c = state->context; c; c = c->current)
|
|
if (!(c->flags & CONTEXT_CONF_USED) &&
|
|
match_netid(c->filter, solicit_tags, plain_range) &&
|
|
- config_valid(config, c, &addr, state, now))
|
|
+ config_valid(config, c, &addr, state, now) &&
|
|
+ check_and_try_preempte_address(state, &addr, now, config))
|
|
{
|
|
mark_config_used(state->context, &addr);
|
|
if (have_config(config, CONFIG_TIME))
|
|
@@ -1259,6 +1261,37 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
|
|
|
}
|
|
|
|
+static int check_and_try_preempte_address(struct state *state, struct in6_addr *addr, time_t now, struct dhcp_config *config)
|
|
+{
|
|
+ struct dhcp_lease *lease;
|
|
+
|
|
+ if (!(lease = lease6_find_by_addr(addr, 128, 0)))
|
|
+ {
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+
|
|
+ if(daemon->bind_mac_with_ip6) {
|
|
+ // break rfc3315 here
|
|
+ // bind mac address with a lease
|
|
+ if ((state->mac) && !(config->flags & CONFIG_CLID) &&
|
|
+ config_has_mac(config, state->mac, state->mac_len, state->mac_type)) {
|
|
+ lease_prune(lease, now);
|
|
+ return 1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // what rfc3315 do
|
|
+ if (lease->clid_len != state->clid_len ||
|
|
+ memcmp(lease->clid, state->clid, state->clid_len) != 0 ||
|
|
+ lease->iaid != state->iaid)
|
|
+ {
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ return 1;
|
|
+}
|
|
+
|
|
static struct dhcp_netid *add_options(struct state *state, int do_refresh)
|
|
{
|
|
void *oro;
|
|
--
|
|
2.23.0
|