[Dnsmasq-discuss] [PATCH] Add DHCP6REPLY for DHCP6REBIND
liaichun
liaichun at huawei.com
Fri Apr 9 07:30:51 UTC 2021
>On Apr 8, 2021, at 16:01, Simon Kelley <si... at thekelleys.org.uk> wrote:
>> Before this, we receive a DHCP6REBIND request and do not reply.
>> We should increase the number of responses to such packets.
>>
>
>Not good to have omitted this for so long. Thanks for the patch.
>
>Since most of the code is the same for DHCPRENEW and DHCPREBIND, I
>prefer to share it. Also, reading RFC8415 18.3.5, if no lease exists or
>can be created for any of the IAs, there should be an error status of no
>addresses available in the reply.
>
>The attached patch make these changes. Please could you check that it
>works OK for you?
Yes, It's ok. Thank you for your reply.
Cheers,
Aichun Li
>
>
>Cheers,
>
>Simon.
>
>diff --git a/src/rfc3315.c b/src/rfc3315.c
>index 982c68a..5c2ff97 100644
>--- a/src/rfc3315.c
>+++ b/src/rfc3315.c
>@@ -919,11 +919,14 @@ static int dhcp6_no_relay(struct state *state, int
>msg_type, void *inbuff, size_
>
>
> case DHCP6RENEW:
>+ case DHCP6REBIND:
> {
>+ int address_assigned = 0;
>+
> /* set reply message type */
> *outmsgtypep = DHCP6REPLY;
>
>- log6_quiet(state, "DHCPRENEW", NULL, NULL);
>+ log6_quiet(state, msg_type == DHCP6RENEW ? "DHCPRENEW" : "DHCPREBIND",
>NULL, NULL);
>
> for (opt = state->packet_options; opt; opt = opt6_next(opt, state->end))
> {
>@@ -952,24 +955,35 @@ static int dhcp6_no_relay(struct state *state, int
>msg_type, void *inbuff, size_
> state->ia_type == OPTION6_IA_NA ?
>LEASE_NA : LEASE_TA,
> state->iaid, &req_addr)))
> {
>- /* If the server cannot find a client entry for the IA the
>server
>- returns the IA containing no addresses with a Status
>Code option set
>- to NoBinding in the Reply message. */
>- save_counter(iacntr);
>- t1cntr = 0;
>-
>- log6_packet(state, "DHCPREPLY", &req_addr, _("lease not
>found"));
>-
>- o1 = new_opt6(OPTION6_STATUS_CODE);
>- put_opt6_short(DHCP6NOBINDING);
>- put_opt6_string(_("no binding found"));
>- end_opt6(o1);
>-
>- preferred_time = valid_time = 0;
>- break;
>+ if (msg_type == DHCP6REBIND)
>+ {
>+ /* When rebinding, we can create a lease if it doesn't
>exist. */
>+ 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;
>+ }
>+ else
>+ {
>+ /* If the server cannot find a client entry for the IA
>the server
>+ returns the IA containing no addresses with a Status
>Code option set
>+ to NoBinding in the Reply message. */
>+ save_counter(iacntr);
>+ t1cntr = 0;
>+
>+ log6_packet(state, "DHCPREPLY", &req_addr, _("lease not
>found"));
>+
>+ o1 = new_opt6(OPTION6_STATUS_CODE);
>+ put_opt6_short(DHCP6NOBINDING);
>+ put_opt6_string(_("no binding found"));
>+ end_opt6(o1);
>+
>+ preferred_time = valid_time = 0;
>+ break;
>+ }
> }
>
>-
> if ((this_context = address6_available(state->context,
>&req_addr, tagif, 1)) ||
> (this_context = address6_valid(state->context, &req_addr,
>tagif, 1)))
> {
>@@ -1000,6 +1014,8 @@ static int dhcp6_no_relay(struct state *state, int
>msg_type, void *inbuff, size_
>
> if (preferred_time == 0)
> message = _("deprecated");
>+
>+ address_assigned = 1;
> }
> else
> {
>@@ -1022,10 +1038,18 @@ static int dhcp6_no_relay(struct state *state, int
>msg_type, void *inbuff, size_
> end_ia(t1cntr, min_time, 1);
> end_opt6(o);
> }
>+
>+ if (!address_assigned && msg_type == DHCP6REBIND)
>+ {
>+ /* can't create lease for any address, return error */
>+ o1 = new_opt6(OPTION6_STATUS_CODE);
>+ put_opt6_short(DHCP6NOADDRS);
>+ put_opt6_string(_("no addresses available"));
>+ end_opt6(o1);
>+ }
>
> tagif = add_options(state, 0);
> break;
>-
> }
>
> case DHCP6CONFIRM:
More information about the Dnsmasq-discuss
mailing list