From fc7ad95ef2ffd09098a9687f08efb9ef39f5d830 Mon Sep 17 00:00:00 2001 From: huyizhen 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