[Dnsmasq-discuss] [PATCH] Add DHCP6REPLY for DHCP6REBIND

Aichun Li liaichun at huawei.com
Thu Apr 8 09:16:41 UTC 2021


From: liaichun <liaichun at huawei.com>

Before this, we receive a DHCP6REBIND request and do not reply.
We should increase the number of responses to such packets.

Signed-off-by: liaichun <liaichun at huawei.com>
---
 src/rfc3315.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 99 insertions(+), 1 deletion(-)

diff --git a/src/rfc3315.c b/src/rfc3315.c
index 982c68a..f6fff34 100644
--- a/src/rfc3315.c
+++ b/src/rfc3315.c
@@ -1027,7 +1027,105 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
 	break;
 	
       }
-      
+
+    case DHCP6REBIND:
+      {
+	/* set reply message type */
+	*outmsgtypep = DHCP6REPLY;
+
+	log6_quiet(state, "DHCP6REBIND", NULL, NULL);
+
+	for (opt = state->packet_options; opt; opt = opt6_next(opt, state->end))
+	  {
+	    void *ia_option, *ia_end;
+	    unsigned int min_time = 0xffffffff;
+	    int t1cntr, iacntr;
+
+	    if (!check_ia(state, opt, &ia_end, &ia_option))
+	      continue;
+
+	    o = build_ia(state, &t1cntr);
+	    iacntr = save_counter(-1);
+
+	    for (; ia_option; ia_option = opt6_find(opt6_next(ia_option, ia_end), ia_end, OPTION6_IAADDR, 24))
+	      {
+		struct dhcp_lease *lease = NULL;
+		struct in6_addr req_addr;
+		unsigned int preferred_time =  opt6_uint(ia_option, 16, 4);
+		unsigned int valid_time =  opt6_uint(ia_option, 20, 4);
+		char *message = NULL;
+		struct dhcp_context *this_context;
+
+		memcpy(&req_addr, opt6_ptr(ia_option, 0), IN6ADDRSZ);
+
+		if (!(lease = lease6_find(state->clid, state->clid_len,
+					  state->ia_type == OPTION6_IA_NA ? LEASE_NA : LEASE_TA,
+					  state->iaid, &req_addr)))
+		  {
+		    lease = lease6_allocate(&req_addr, state->ia_type == OPTION6_IA_NA ? LEASE_NA : LEASE_TA);
+		    if (lease)
+		      lease_set_iaid(lease, state->iaid);
+		    else
+		      break;
+		  }
+
+		if ((this_context = address6_available(state->context, &req_addr, tagif, 1)) ||
+		    (this_context = address6_valid(state->context, &req_addr, tagif, 1)))
+		  {
+		    unsigned int lease_time;
+
+		    get_context_tag(state, this_context);
+
+		    if (config_implies(config, this_context, &req_addr) && have_config(config, CONFIG_TIME))
+		      lease_time = config->lease_time;
+		    else
+		      lease_time = this_context->lease_time;
+
+		    calculate_times(this_context, &min_time, &valid_time, &preferred_time, lease_time);
+
+		    lease_set_expires(lease, valid_time, now);
+		    /* Update MAC record in case it's new information. */
+		    if (state->mac_len != 0)
+		      lease_set_hwaddr(lease, state->mac, state->clid, state->mac_len, state->mac_type, state->clid_len, now, 0);
+		    if (state->ia_type == OPTION6_IA_NA && state->hostname)
+		      {
+			char *addr_domain = get_domain6(&req_addr);
+			if (!state->send_domain)
+			  state->send_domain = addr_domain;
+			lease_set_hostname(lease, state->hostname, state->hostname_auth, addr_domain, state->domain);
+			message = state->hostname;
+		      }
+
+		    if (preferred_time == 0)
+		      message = _("deprecated");
+		  }
+		else
+		  {
+		    preferred_time = valid_time = 0;
+		    message = _("address invalid");
+		  }
+
+		if (message && (message != state->hostname))
+		  log6_packet(state, "DHCPREPLY", &req_addr, message);
+		else
+		  log6_quiet(state, "DHCPREPLY", &req_addr, message);
+
+		o1 =  new_opt6(OPTION6_IAADDR);
+		put_opt6(&req_addr, sizeof(req_addr));
+		put_opt6_long(preferred_time);
+		put_opt6_long(valid_time);
+		end_opt6(o1);
+	      }
+
+	    end_ia(t1cntr, min_time, 1);
+	    end_opt6(o);
+	  }
+
+	tagif = add_options(state, 0);
+	break;
+
+      }
+
     case DHCP6CONFIRM:
       {
 	int good_addr = 0;
-- 
2.21.0.windows.1




More information about the Dnsmasq-discuss mailing list