149 lines
6.2 KiB
Diff
149 lines
6.2 KiB
Diff
From fc7ad95ef2ffd09098a9687f08efb9ef39f5d830 Mon Sep 17 00:00:00 2001
|
|
From: huyizhen <huyizhen2@huawei.com>
|
|
Date: Thu, 13 Feb 2025 22:41:17 +0800
|
|
Subject: [PATCH] adapt bugfix allow binding mac with ipv6
|
|
|
|
fix bind-mac-with-ip6 function failure.
|
|
---
|
|
src/rfc3315.c | 62 +++++++++++++++++----------------------------------
|
|
1 file changed, 20 insertions(+), 42 deletions(-)
|
|
|
|
diff --git a/src/rfc3315.c b/src/rfc3315.c
|
|
index cdb4b64..e6f3664 100644
|
|
--- a/src/rfc3315.c
|
|
+++ b/src/rfc3315.c
|
|
@@ -48,9 +48,8 @@ static int build_ia(struct state *state, int *t1cntr);
|
|
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 int check_address(struct dhcp_config *config, struct state *state, struct in6_addr *addr, time_t now, int preempte);
|
|
+static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state, time_t now, int preempte);
|
|
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,
|
|
unsigned int *min_time, struct in6_addr *addr, time_t now);
|
|
@@ -681,7 +680,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|
/* If the client asks for an address on the same network as a configured address,
|
|
offer the configured address instead, to make moving to newly-configured
|
|
addresses automatic. */
|
|
- if (!(c->flags & CONTEXT_CONF_USED) && config_valid(config, c, &addr, state, now))
|
|
+ if (!(c->flags & CONTEXT_CONF_USED) && config_valid(config, c, &addr, state, now, 0))
|
|
{
|
|
req_addr = addr;
|
|
mark_config_used(c, &addr);
|
|
@@ -690,7 +689,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|
}
|
|
else if (!(c = address6_available(state->context, &req_addr, solicit_tags, plain_range)))
|
|
continue; /* not an address we're allowed */
|
|
- else if (!check_address(state, &req_addr))
|
|
+ else if (!check_address(config, state, &req_addr, now, 0))
|
|
continue; /* address leased elsewhere */
|
|
|
|
/* add address to output packet */
|
|
@@ -705,8 +704,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|
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) &&
|
|
- check_and_try_preempte_address(state, &addr, now, config))
|
|
+ config_valid(config, c, &addr, state, now, 1))
|
|
{
|
|
mark_config_used(state->context, &addr);
|
|
if (have_config(config, CONFIG_TIME))
|
|
@@ -862,7 +860,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|
put_opt6_string(_("address unavailable"));
|
|
end_opt6(o1);
|
|
}
|
|
- else if (!check_address(state, &req_addr))
|
|
+ else if (!check_address(config, state, &req_addr, now, 0))
|
|
{
|
|
/* Address leased to another DUID/IAID */
|
|
o1 = new_opt6(OPTION6_STATUS_CODE);
|
|
@@ -1319,37 +1317,6 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|
|
|
}
|
|
|
|
-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;
|
|
@@ -1760,13 +1727,24 @@ static void mark_config_used(struct dhcp_context *context, struct in6_addr *addr
|
|
}
|
|
|
|
/* make sure address not leased to another CLID/IAID */
|
|
-static int check_address(struct state *state, struct in6_addr *addr)
|
|
+static int check_address(struct dhcp_config *config, struct state *state, struct in6_addr *addr, time_t now, int preempte)
|
|
{
|
|
struct dhcp_lease *lease;
|
|
|
|
if (!(lease = lease6_find_by_addr(addr, 128, 0)))
|
|
return 1;
|
|
|
|
+ if (preempte && 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)
|
|
@@ -1806,7 +1784,7 @@ static struct addrlist *config_implies(struct dhcp_config *config, struct dhcp_c
|
|
return NULL;
|
|
}
|
|
|
|
-static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state, time_t now)
|
|
+static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state, time_t now, int preempte)
|
|
{
|
|
u64 addrpart, i, addresses;
|
|
struct addrlist *addr_list;
|
|
@@ -1840,7 +1818,7 @@ static int config_valid(struct dhcp_config *config, struct dhcp_context *context
|
|
{
|
|
setaddr6part(addr, addrpart+i);
|
|
|
|
- if (check_address(state, addr))
|
|
+ if (check_address(config, state, addr, now, preempte))
|
|
return 1;
|
|
}
|
|
}
|
|
--
|
|
2.33.0
|
|
|