* [PATCH v2] dhcpv6: support rapid commit dhcp6 option [not found] <"<53437d4c-a21d-496c-9587-c9832d76a1de@arm.com> @ 2026-08-25 17:53 ` Yuxiao Zhang 2026-09-03 9:00 ` Jerome Forissier 2026-09-11 13:17 ` Jerome Forissier 0 siblings, 2 replies; 5+ messages in thread From: Yuxiao Zhang @ 2026-08-25 17:53 UTC (permalink / raw) To: u-boot Cc: Yuxiao Zhang, Francois Berder, Jerome Forissier, Johan Jonker, Simon Glass, Tom Rini, u-boot Support rapid commit option code 14 which bypass the advertise and request state. The option is enabled by DHCP6_RAPID_COMMIT. Signed-off-by: Yuxiao Zhang <yuxiaozhang@google.com> --- Changes in v2: - Reject rapid commit option if option_len != 0 - Drop redundant NULL check on dhcp6_hdr cmd/Kconfig | 8 ++++++++ net/dhcpv6.c | 43 ++++++++++++++++++++++++++++++++++++------- net/dhcpv6.h | 2 ++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/cmd/Kconfig b/cmd/Kconfig index ff90a87024c..b3cf3a6d8b6 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1996,6 +1996,14 @@ config DHCP6_ENTERPRISE_ID int "Enterprise ID to send in DHCPv6 Vendor Class Option" default 0 +config DHCP6_RAPID_COMMIT + bool "Request Rapid Commit (2-message exchange) from DHCPv6 server" + default n + help + Request the Rapid Commit option (option 14) in DHCPv6 Solicit + messages to enable a 2-message exchange (Solicit-Reply) rather + than the default 4-message exchange. + endif config BOOTP_MAY_FAIL diff --git a/net/dhcpv6.c b/net/dhcpv6.c index 640f089a2e1..5ed8449edb5 100644 --- a/net/dhcpv6.c +++ b/net/dhcpv6.c @@ -115,6 +115,9 @@ static int dhcp6_add_option(int option_id, uchar *pkt) opt_len = sizeof(struct dhcp6_option_ia_na); break; + case DHCP6_OPTION_RAPID_COMMIT: + opt_len = 0; + break; case DHCP6_OPTION_ORO: oro_opt = (struct dhcp6_option_oro *)dhcp_option_start; oro_opt->req_option_code[num_oro++] = htons(DHCP6_OPTION_OPT_BOOTFILE_URL); @@ -194,6 +197,8 @@ static void dhcp6_send_solicit_packet(void) pkt += dhcp6_add_option(DHCP6_OPTION_ELAPSED_TIME, pkt); pkt += dhcp6_add_option(DHCP6_OPTION_IA_NA, pkt); pkt += dhcp6_add_option(DHCP6_OPTION_ORO, pkt); + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) + pkt += dhcp6_add_option(DHCP6_OPTION_RAPID_COMMIT, pkt); if (CONFIG_DHCP_PXE_CLIENTARCH != 0xFF) pkt += dhcp6_add_option(DHCP6_OPTION_CLIENT_ARCH_TYPE, pkt); pkt += dhcp6_add_option(DHCP6_OPTION_VENDOR_CLASS, pkt); @@ -448,6 +453,16 @@ static void dhcp6_parse_options(uchar *rx_pkt, unsigned int len) } sm_params.rx_status.preference = *option_ptr; break; + case DHCP6_OPTION_RAPID_COMMIT: + if (option_len != 0) { + debug("Invalid rapid commit option length\n"); + break; + } + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) { + debug("DHCP6_OPTION_RAPID_COMMIT FOUND\n"); + sm_params.rx_status.rapid_commit_found = true; + } + break; default: debug("Unknown Option ID: %d, skipping parsing\n", ntohs(option_hdr->option_id)); @@ -618,14 +633,28 @@ static void dhcp6_state_machine(bool timeout, uchar *rx_pkt, unsigned int len) break; case DHCP6_SOLICIT: if (!timeout) { - /* check the rx packet and determine if we can transition to next - * state. - */ - if (dhcp6_check_advertise_packet(rx_pkt, len)) - return; + struct dhcp6_hdr *dhcp6_hdr = (struct dhcp6_hdr *)rx_pkt; + + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT) && + dhcp6_hdr->msg_type == DHCP6_MSG_REPLY) { + if (dhcp6_check_reply_packet(rx_pkt, len)) + return; + if (!sm_params.rx_status.rapid_commit_found) { + debug("[DHCPv6] REPLY received without Rapid Commit option, ignoring\n"); + return; + } + debug("REPLY (Rapid Commit) good, transition to DONE\n"); + sm_params.next_state = DHCP6_DONE; + } else { + /* check the rx packet and determine if we can transition to next + * state. + */ + if (dhcp6_check_advertise_packet(rx_pkt, len)) + return; - debug("ADVERTISE good, transition to REQUEST\n"); - sm_params.next_state = DHCP6_REQUEST; + debug("ADVERTISE good, transition to REQUEST\n"); + sm_params.next_state = DHCP6_REQUEST; + } } else if (sm_params.retry_cnt == 1) { /* If a server UID was received in the first SOLICIT period * transition to REQUEST diff --git a/net/dhcpv6.h b/net/dhcpv6.h index d41a3c30615..49f20390730 100644 --- a/net/dhcpv6.h +++ b/net/dhcpv6.h @@ -24,6 +24,7 @@ #define DHCP6_OPTION_PREFERENCE 7 #define DHCP6_OPTION_ELAPSED_TIME 8 #define DHCP6_OPTION_STATUS_CODE 13 +#define DHCP6_OPTION_RAPID_COMMIT 14 #define DHCP6_OPTION_OPT_BOOTFILE_URL 59 #define DHCP6_OPTION_OPT_BOOTFILE_PARAM 60 #define DHCP6_OPTION_SOL_MAX_RT 82 @@ -152,6 +153,7 @@ struct dhcp6_rx_pkt_status { enum dhcp6_status ia_status_code; enum dhcp6_status status_code; u8 preference; + bool rapid_commit_found; }; /** --- base-commit: 527115ef6783cec49e5610c523c124b399011361 branch: main -- 2.55.0.860.g4b6b3295ed-goog ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2] dhcpv6: support rapid commit dhcp6 option 2026-08-25 17:53 ` [PATCH v2] dhcpv6: support rapid commit dhcp6 option Yuxiao Zhang @ 2026-09-03 9:00 ` Jerome Forissier 2026-09-08 20:55 ` Yuxiao Zhang 2026-09-11 13:17 ` Jerome Forissier 1 sibling, 1 reply; 5+ messages in thread From: Jerome Forissier @ 2026-09-03 9:00 UTC (permalink / raw) To: Yuxiao Zhang, u-boot Cc: Francois Berder, Johan Jonker, Simon Glass, Tom Rini, u-boot, nd Hi Yuxiao, On 25/08/2026 19:53, Yuxiao Zhang wrote: > Support rapid commit option code 14 which bypass the advertise and > request state. The option is enabled by DHCP6_RAPID_COMMIT. > > Signed-off-by: Yuxiao Zhang <yuxiaozhang@google.com> > --- > > Changes in v2: > - Reject rapid commit option if option_len != 0 > - Drop redundant NULL check on dhcp6_hdr > > cmd/Kconfig | 8 ++++++++ > net/dhcpv6.c | 43 ++++++++++++++++++++++++++++++++++++------- > net/dhcpv6.h | 2 ++ > 3 files changed, 46 insertions(+), 7 deletions(-) > > diff --git a/cmd/Kconfig b/cmd/Kconfig > index ff90a87024c..b3cf3a6d8b6 100644 > --- a/cmd/Kconfig > +++ b/cmd/Kconfig > @@ -1996,6 +1996,14 @@ config DHCP6_ENTERPRISE_ID > int "Enterprise ID to send in DHCPv6 Vendor Class Option" > default 0 > > +config DHCP6_RAPID_COMMIT > + bool "Request Rapid Commit (2-message exchange) from DHCPv6 server" > + default n > + help > + Request the Rapid Commit option (option 14) in DHCPv6 Solicit > + messages to enable a 2-message exchange (Solicit-Reply) rather > + than the default 4-message exchange. > + > endif > > config BOOTP_MAY_FAIL > diff --git a/net/dhcpv6.c b/net/dhcpv6.c > index 640f089a2e1..5ed8449edb5 100644 > --- a/net/dhcpv6.c > +++ b/net/dhcpv6.c > @@ -115,6 +115,9 @@ static int dhcp6_add_option(int option_id, uchar *pkt) > > opt_len = sizeof(struct dhcp6_option_ia_na); > break; > + case DHCP6_OPTION_RAPID_COMMIT: > + opt_len = 0; > + break; > case DHCP6_OPTION_ORO: > oro_opt = (struct dhcp6_option_oro *)dhcp_option_start; > oro_opt->req_option_code[num_oro++] = htons(DHCP6_OPTION_OPT_BOOTFILE_URL); > @@ -194,6 +197,8 @@ static void dhcp6_send_solicit_packet(void) > pkt += dhcp6_add_option(DHCP6_OPTION_ELAPSED_TIME, pkt); > pkt += dhcp6_add_option(DHCP6_OPTION_IA_NA, pkt); > pkt += dhcp6_add_option(DHCP6_OPTION_ORO, pkt); > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) > + pkt += dhcp6_add_option(DHCP6_OPTION_RAPID_COMMIT, pkt); > if (CONFIG_DHCP_PXE_CLIENTARCH != 0xFF) > pkt += dhcp6_add_option(DHCP6_OPTION_CLIENT_ARCH_TYPE, pkt); > pkt += dhcp6_add_option(DHCP6_OPTION_VENDOR_CLASS, pkt); > @@ -448,6 +453,16 @@ static void dhcp6_parse_options(uchar *rx_pkt, unsigned int len) > } > sm_params.rx_status.preference = *option_ptr; > break; > + case DHCP6_OPTION_RAPID_COMMIT: > + if (option_len != 0) { > + debug("Invalid rapid commit option length\n"); > + break; > + } > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) { > + debug("DHCP6_OPTION_RAPID_COMMIT FOUND\n"); > + sm_params.rx_status.rapid_commit_found = true; > + } > + break; > default: > debug("Unknown Option ID: %d, skipping parsing\n", > ntohs(option_hdr->option_id)); > @@ -618,14 +633,28 @@ static void dhcp6_state_machine(bool timeout, uchar *rx_pkt, unsigned int len) > break; > case DHCP6_SOLICIT: > if (!timeout) { > - /* check the rx packet and determine if we can transition to next > - * state. > - */ > - if (dhcp6_check_advertise_packet(rx_pkt, len)) > - return; > + struct dhcp6_hdr *dhcp6_hdr = (struct dhcp6_hdr *)rx_pkt; > + > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT) && > + dhcp6_hdr->msg_type == DHCP6_MSG_REPLY) { > + if (dhcp6_check_reply_packet(rx_pkt, len)) > + return; > + if (!sm_params.rx_status.rapid_commit_found) { > + debug("[DHCPv6] REPLY received without Rapid Commit option, ignoring\n"); > + return; > + } dhcp6_check_reply_packet() calls dhcp6_parse_options(), which has side effects such as updating the bootfile information. I think the Rapid Commit check needs to happen before applying the other reply options. > + debug("REPLY (Rapid Commit) good, transition to DONE\n"); > + sm_params.next_state = DHCP6_DONE; > + } else { > + /* check the rx packet and determine if we can transition to next > + * state. > + */ > + if (dhcp6_check_advertise_packet(rx_pkt, len)) > + return; > > - debug("ADVERTISE good, transition to REQUEST\n"); > - sm_params.next_state = DHCP6_REQUEST; > + debug("ADVERTISE good, transition to REQUEST\n"); > + sm_params.next_state = DHCP6_REQUEST; > + } > } else if (sm_params.retry_cnt == 1) { > /* If a server UID was received in the first SOLICIT period > * transition to REQUEST > diff --git a/net/dhcpv6.h b/net/dhcpv6.h > index d41a3c30615..49f20390730 100644 > --- a/net/dhcpv6.h > +++ b/net/dhcpv6.h > @@ -24,6 +24,7 @@ > #define DHCP6_OPTION_PREFERENCE 7 > #define DHCP6_OPTION_ELAPSED_TIME 8 > #define DHCP6_OPTION_STATUS_CODE 13 > +#define DHCP6_OPTION_RAPID_COMMIT 14 > #define DHCP6_OPTION_OPT_BOOTFILE_URL 59 > #define DHCP6_OPTION_OPT_BOOTFILE_PARAM 60 > #define DHCP6_OPTION_SOL_MAX_RT 82 > @@ -152,6 +153,7 @@ struct dhcp6_rx_pkt_status { > enum dhcp6_status ia_status_code; > enum dhcp6_status status_code; > u8 preference; > + bool rapid_commit_found; > }; > > /** > --- > base-commit: 527115ef6783cec49e5610c523c124b399011361 > branch: main > Thanks, -- Jerome ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] dhcpv6: support rapid commit dhcp6 option 2026-09-03 9:00 ` Jerome Forissier @ 2026-09-08 20:55 ` Yuxiao Zhang 2026-09-09 9:42 ` Jerome Forissier 0 siblings, 1 reply; 5+ messages in thread From: Yuxiao Zhang @ 2026-09-08 20:55 UTC (permalink / raw) To: Jerome Forissier Cc: u-boot, Francois Berder, Johan Jonker, Simon Glass, Tom Rini, u-boot, nd [-- Attachment #1: Type: text/plain, Size: 7219 bytes --] On Thu, Sep 3, 2026 at 2:01 AM Jerome Forissier <jerome.forissier@arm.com> wrote: > Hi Yuxiao, > > On 25/08/2026 19:53, Yuxiao Zhang wrote: > > Support rapid commit option code 14 which bypass the advertise and > > request state. The option is enabled by DHCP6_RAPID_COMMIT. > > > > Signed-off-by: Yuxiao Zhang <yuxiaozhang@google.com> > > --- > > > > Changes in v2: > > - Reject rapid commit option if option_len != 0 > > - Drop redundant NULL check on dhcp6_hdr > > > > cmd/Kconfig | 8 ++++++++ > > net/dhcpv6.c | 43 ++++++++++++++++++++++++++++++++++++------- > > net/dhcpv6.h | 2 ++ > > 3 files changed, 46 insertions(+), 7 deletions(-) > > > > diff --git a/cmd/Kconfig b/cmd/Kconfig > > index ff90a87024c..b3cf3a6d8b6 100644 > > --- a/cmd/Kconfig > > +++ b/cmd/Kconfig > > @@ -1996,6 +1996,14 @@ config DHCP6_ENTERPRISE_ID > > int "Enterprise ID to send in DHCPv6 Vendor Class Option" > > default 0 > > > > +config DHCP6_RAPID_COMMIT > > + bool "Request Rapid Commit (2-message exchange) from DHCPv6 server" > > + default n > > + help > > + Request the Rapid Commit option (option 14) in DHCPv6 Solicit > > + messages to enable a 2-message exchange (Solicit-Reply) rather > > + than the default 4-message exchange. > > + > > endif > > > > config BOOTP_MAY_FAIL > > diff --git a/net/dhcpv6.c b/net/dhcpv6.c > > index 640f089a2e1..5ed8449edb5 100644 > > --- a/net/dhcpv6.c > > +++ b/net/dhcpv6.c > > @@ -115,6 +115,9 @@ static int dhcp6_add_option(int option_id, uchar > *pkt) > > > > opt_len = sizeof(struct dhcp6_option_ia_na); > > break; > > + case DHCP6_OPTION_RAPID_COMMIT: > > + opt_len = 0; > > + break; > > case DHCP6_OPTION_ORO: > > oro_opt = (struct dhcp6_option_oro *)dhcp_option_start; > > oro_opt->req_option_code[num_oro++] = > htons(DHCP6_OPTION_OPT_BOOTFILE_URL); > > @@ -194,6 +197,8 @@ static void dhcp6_send_solicit_packet(void) > > pkt += dhcp6_add_option(DHCP6_OPTION_ELAPSED_TIME, pkt); > > pkt += dhcp6_add_option(DHCP6_OPTION_IA_NA, pkt); > > pkt += dhcp6_add_option(DHCP6_OPTION_ORO, pkt); > > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) > > + pkt += dhcp6_add_option(DHCP6_OPTION_RAPID_COMMIT, pkt); > > if (CONFIG_DHCP_PXE_CLIENTARCH != 0xFF) > > pkt += dhcp6_add_option(DHCP6_OPTION_CLIENT_ARCH_TYPE, > pkt); > > pkt += dhcp6_add_option(DHCP6_OPTION_VENDOR_CLASS, pkt); > > @@ -448,6 +453,16 @@ static void dhcp6_parse_options(uchar *rx_pkt, > unsigned int len) > > } > > sm_params.rx_status.preference = *option_ptr; > > break; > > + case DHCP6_OPTION_RAPID_COMMIT: > > + if (option_len != 0) { > > + debug("Invalid rapid commit option > length\n"); > > + break; > > + } > > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) { > > + debug("DHCP6_OPTION_RAPID_COMMIT FOUND\n"); > > + sm_params.rx_status.rapid_commit_found = > true; > > + } > > + break; > > default: > > debug("Unknown Option ID: %d, skipping parsing\n", > > ntohs(option_hdr->option_id)); > > @@ -618,14 +633,28 @@ static void dhcp6_state_machine(bool timeout, > uchar *rx_pkt, unsigned int len) > > break; > > case DHCP6_SOLICIT: > > if (!timeout) { > > - /* check the rx packet and determine if we can > transition to next > > - * state. > > - */ > > - if (dhcp6_check_advertise_packet(rx_pkt, len)) > > - return; > > + struct dhcp6_hdr *dhcp6_hdr = (struct dhcp6_hdr > *)rx_pkt; > > + > > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT) && > > + dhcp6_hdr->msg_type == DHCP6_MSG_REPLY) { > > + if (dhcp6_check_reply_packet(rx_pkt, len)) > > + return; > > + if > (!sm_params.rx_status.rapid_commit_found) { > > + debug("[DHCPv6] REPLY received > without Rapid Commit option, ignoring\n"); > > + return; > > + } > > dhcp6_check_reply_packet() calls dhcp6_parse_options(), which has side > effects such as updating the bootfile information. I think the Rapid > Commit check > needs to happen before applying the other reply options. > > > + debug("REPLY (Rapid Commit) good, > transition to DONE\n"); > > + sm_params.next_state = DHCP6_DONE; > > + } else { > > + /* check the rx packet and determine if we > can transition to next > > + * state. > > + */ > > + if (dhcp6_check_advertise_packet(rx_pkt, > len)) > > + return; > > > > - debug("ADVERTISE good, transition to REQUEST\n"); > > - sm_params.next_state = DHCP6_REQUEST; > > + debug("ADVERTISE good, transition to > REQUEST\n"); > > + sm_params.next_state = DHCP6_REQUEST; > > + } > > } else if (sm_params.retry_cnt == 1) { > > /* If a server UID was received in the first > SOLICIT period > > * transition to REQUEST > > diff --git a/net/dhcpv6.h b/net/dhcpv6.h > > index d41a3c30615..49f20390730 100644 > > --- a/net/dhcpv6.h > > +++ b/net/dhcpv6.h > > @@ -24,6 +24,7 @@ > > #define DHCP6_OPTION_PREFERENCE 7 > > #define DHCP6_OPTION_ELAPSED_TIME 8 > > #define DHCP6_OPTION_STATUS_CODE 13 > > +#define DHCP6_OPTION_RAPID_COMMIT 14 > > #define DHCP6_OPTION_OPT_BOOTFILE_URL 59 > > #define DHCP6_OPTION_OPT_BOOTFILE_PARAM 60 > > #define DHCP6_OPTION_SOL_MAX_RT 82 > > @@ -152,6 +153,7 @@ struct dhcp6_rx_pkt_status { > > enum dhcp6_status ia_status_code; > > enum dhcp6_status status_code; > > u8 preference; > > + bool rapid_commit_found; > > }; > > > > /** > > --- > > base-commit: 527115ef6783cec49e5610c523c124b399011361 > > branch: main > > > > Thanks, > -- > Jerome > Hi Jerome, The rapid commit validation relies on dhcp6_check_reply_packet to set rapid_commit_found field so it cannot run before dhcp6_check_reply_packet. If we want early return we can add a rapid_commit parameter in dhcp6_check_advertise_packet and do the validation inside it. Let me know your preference. Thanks, -Yuxiao [-- Attachment #2: Type: text/html, Size: 9693 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] dhcpv6: support rapid commit dhcp6 option 2026-09-08 20:55 ` Yuxiao Zhang @ 2026-09-09 9:42 ` Jerome Forissier 0 siblings, 0 replies; 5+ messages in thread From: Jerome Forissier @ 2026-09-09 9:42 UTC (permalink / raw) To: Yuxiao Zhang Cc: u-boot, Francois Berder, Johan Jonker, Simon Glass, Tom Rini, u-boot, nd Hi Yuxiao, On 08/09/2026 22:55, Yuxiao Zhang wrote: > On Thu, Sep 3, 2026 at 2:01 AM Jerome Forissier <jerome.forissier@arm.com <mailto:jerome.forissier@arm.com>> wrote: > > Hi Yuxiao, > > On 25/08/2026 19:53, Yuxiao Zhang wrote: > > Support rapid commit option code 14 which bypass the advertise and > > request state. The option is enabled by DHCP6_RAPID_COMMIT. > > > > Signed-off-by: Yuxiao Zhang <yuxiaozhang@google.com <mailto:yuxiaozhang@google.com>> > > --- > > > > Changes in v2: > > - Reject rapid commit option if option_len != 0 > > - Drop redundant NULL check on dhcp6_hdr > > > > cmd/Kconfig | 8 ++++++++ > > net/dhcpv6.c | 43 ++++++++++++++++++++++++++++++++++++------- > > net/dhcpv6.h | 2 ++ > > 3 files changed, 46 insertions(+), 7 deletions(-) > > > > diff --git a/cmd/Kconfig b/cmd/Kconfig > > index ff90a87024c..b3cf3a6d8b6 100644 > > --- a/cmd/Kconfig > > +++ b/cmd/Kconfig > > @@ -1996,6 +1996,14 @@ config DHCP6_ENTERPRISE_ID > > int "Enterprise ID to send in DHCPv6 Vendor Class Option" > > default 0 > > > > +config DHCP6_RAPID_COMMIT > > + bool "Request Rapid Commit (2-message exchange) from DHCPv6 server" > > + default n > > + help > > + Request the Rapid Commit option (option 14) in DHCPv6 Solicit > > + messages to enable a 2-message exchange (Solicit-Reply) rather > > + than the default 4-message exchange. > > + > > endif > > > > config BOOTP_MAY_FAIL > > diff --git a/net/dhcpv6.c b/net/dhcpv6.c > > index 640f089a2e1..5ed8449edb5 100644 > > --- a/net/dhcpv6.c > > +++ b/net/dhcpv6.c > > @@ -115,6 +115,9 @@ static int dhcp6_add_option(int option_id, uchar *pkt) > > > > opt_len = sizeof(struct dhcp6_option_ia_na); > > break; > > + case DHCP6_OPTION_RAPID_COMMIT: > > + opt_len = 0; > > + break; > > case DHCP6_OPTION_ORO: > > oro_opt = (struct dhcp6_option_oro *)dhcp_option_start; > > oro_opt->req_option_code[num_oro++] = htons(DHCP6_OPTION_OPT_BOOTFILE_URL); > > @@ -194,6 +197,8 @@ static void dhcp6_send_solicit_packet(void) > > pkt += dhcp6_add_option(DHCP6_OPTION_ELAPSED_TIME, pkt); > > pkt += dhcp6_add_option(DHCP6_OPTION_IA_NA, pkt); > > pkt += dhcp6_add_option(DHCP6_OPTION_ORO, pkt); > > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) > > + pkt += dhcp6_add_option(DHCP6_OPTION_RAPID_COMMIT, pkt); > > if (CONFIG_DHCP_PXE_CLIENTARCH != 0xFF) > > pkt += dhcp6_add_option(DHCP6_OPTION_CLIENT_ARCH_TYPE, pkt); > > pkt += dhcp6_add_option(DHCP6_OPTION_VENDOR_CLASS, pkt); > > @@ -448,6 +453,16 @@ static void dhcp6_parse_options(uchar *rx_pkt, unsigned int len) > > } > > sm_params.rx_status.preference = *option_ptr; > > break; > > + case DHCP6_OPTION_RAPID_COMMIT: > > + if (option_len != 0) { > > + debug("Invalid rapid commit option length\n"); > > + break; > > + } > > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT)) { > > + debug("DHCP6_OPTION_RAPID_COMMIT FOUND\n"); > > + sm_params.rx_status.rapid_commit_found = true; > > + } > > + break; > > default: > > debug("Unknown Option ID: %d, skipping parsing\n", > > ntohs(option_hdr->option_id)); > > @@ -618,14 +633,28 @@ static void dhcp6_state_machine(bool timeout, uchar *rx_pkt, unsigned int len) > > break; > > case DHCP6_SOLICIT: > > if (!timeout) { > > - /* check the rx packet and determine if we can transition to next > > - * state. > > - */ > > - if (dhcp6_check_advertise_packet(rx_pkt, len)) > > - return; > > + struct dhcp6_hdr *dhcp6_hdr = (struct dhcp6_hdr *)rx_pkt; > > + > > + if (IS_ENABLED(CONFIG_DHCP6_RAPID_COMMIT) && > > + dhcp6_hdr->msg_type == DHCP6_MSG_REPLY) { > > + if (dhcp6_check_reply_packet(rx_pkt, len)) > > + return; > > + if (!sm_params.rx_status.rapid_commit_found) { > > + debug("[DHCPv6] REPLY received without Rapid Commit option, ignoring\n"); > > + return; > > + } > > dhcp6_check_reply_packet() calls dhcp6_parse_options(), which has side > effects such as updating the bootfile information. I think the Rapid Commit check > needs to happen before applying the other reply options. > > > + debug("REPLY (Rapid Commit) good, transition to DONE\n"); > > + sm_params.next_state = DHCP6_DONE; > > + } else { > > + /* check the rx packet and determine if we can transition to next > > + * state. > > + */ > > + if (dhcp6_check_advertise_packet(rx_pkt, len)) > > + return; > > > > - debug("ADVERTISE good, transition to REQUEST\n"); > > - sm_params.next_state = DHCP6_REQUEST; > > + debug("ADVERTISE good, transition to REQUEST\n"); > > + sm_params.next_state = DHCP6_REQUEST; > > + } > > } else if (sm_params.retry_cnt == 1) { > > /* If a server UID was received in the first SOLICIT period > > * transition to REQUEST > > diff --git a/net/dhcpv6.h b/net/dhcpv6.h > > index d41a3c30615..49f20390730 100644 > > --- a/net/dhcpv6.h > > +++ b/net/dhcpv6.h > > @@ -24,6 +24,7 @@ > > #define DHCP6_OPTION_PREFERENCE 7 > > #define DHCP6_OPTION_ELAPSED_TIME 8 > > #define DHCP6_OPTION_STATUS_CODE 13 > > +#define DHCP6_OPTION_RAPID_COMMIT 14 > > #define DHCP6_OPTION_OPT_BOOTFILE_URL 59 > > #define DHCP6_OPTION_OPT_BOOTFILE_PARAM 60 > > #define DHCP6_OPTION_SOL_MAX_RT 82 > > @@ -152,6 +153,7 @@ struct dhcp6_rx_pkt_status { > > enum dhcp6_status ia_status_code; > > enum dhcp6_status status_code; > > u8 preference; > > + bool rapid_commit_found; > > }; > > > > /** > > --- > > base-commit: 527115ef6783cec49e5610c523c124b399011361 > > branch: main > > > > Thanks, > -- > Jerome > > > Hi Jerome, > > The rapid commit validation relies on dhcp6_check_reply_packet to set rapid_commit_found field so it cannot run before dhcp6_check_reply_packet. If we want early return we can add a rapid_commit parameter in dhcp6_check_advertise_packet and do the validation inside it. Let me know your preference. You’re right. Looking at this again, I don’t think we need to complicate the code. So this is: Acked-by: Jerome Forissier <jerome.forissier@arm.com> Thanks, -- Jerome > > Thanks, > -Yuxiao ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] dhcpv6: support rapid commit dhcp6 option 2026-08-25 17:53 ` [PATCH v2] dhcpv6: support rapid commit dhcp6 option Yuxiao Zhang 2026-09-03 9:00 ` Jerome Forissier @ 2026-09-11 13:17 ` Jerome Forissier 1 sibling, 0 replies; 5+ messages in thread From: Jerome Forissier @ 2026-09-11 13:17 UTC (permalink / raw) To: u-boot, Yuxiao Zhang Cc: Francois Berder, Johan Jonker, Simon Glass, Tom Rini, u-boot, nd On Tue, 25 Aug 2026 10:53:56 -0700, Yuxiao Zhang wrote: > Support rapid commit option code 14 which bypass the advertise and > request state. The option is enabled by DHCP6_RAPID_COMMIT. > > Applied to u-boot-net branch for-main, thanks! [1/1] dhcpv6: support rapid commit dhcp6 option commit: 111691af75455c96fca2c9f2336e64ae17c4660f Best regards, -- Jerome Forissier <jerome.forissier@arm.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-11 13:18 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <"<53437d4c-a21d-496c-9587-c9832d76a1de@arm.com>
2026-08-25 17:53 ` [PATCH v2] dhcpv6: support rapid commit dhcp6 option Yuxiao Zhang
2026-09-03 9:00 ` Jerome Forissier
2026-09-08 20:55 ` Yuxiao Zhang
2026-09-09 9:42 ` Jerome Forissier
2026-09-11 13:17 ` Jerome Forissier
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.