All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.