net: consolidate PXE processor architecture type Kconfig

DHCP and DHCPv6 use the same value defined in
https://www.iana.org/assignments/dhcpv6-parameters#processor-architecture
to encode the processor architecture type. We should only use a single
Kconfig symbol for both protocols.

Furthermore we should make the value customizable. This allows for instance
to choose between "x86 BIOS" or "x64 UEFI".

As "x86 BIOS" is encoded as 0, we should not use this value to switch
off transmission of the DHCP option. Use 0xFF instead.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
diff --git a/cmd/Kconfig b/cmd/Kconfig
index c335ece..4eb0140 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1864,12 +1864,6 @@
 
 if CMD_DHCP6
 
-config DHCP6_PXE_CLIENTARCH
-	hex
-	default 0x16 if ARM64
-	default 0x15 if ARM
-	default 0xFF
-
 config DHCP6_PXE_DHCP_OPTION
 	bool "Request & store 'pxe_configfile' from DHCP6 server"
 
@@ -1977,12 +1971,22 @@
 	help
 	  Supported for ARM, ARM64, and x86 for now.
 
+config DHCP_PXE_CLIENTARCH
+	hex "DCHCP client system architecture type"
+	depends on BOOTP_PXE || CMD_DHCP6
+	default 0x16 if ARM64 # arm 64 uboot
+	default 0x15 if ARM   # arm 32 uboot
+	default 0x0 if X86    # x86 BIOS
+	default 0xFF          # DHCP option not sent
+	help
+	  DHCP option 93 (defined in RFC4578) or DHCPv6 option 61 (defined in
+	  RFC 5970) is used to transmit the client system architecture type
+	  to the DHCP server. The DHCP server may use this information to
+	  choose the boot file. For a complete list of assigned values see
+	  https://www.iana.org/assignments/dhcpv6-parameters#processor-architecture.
+
-config BOOTP_PXE_CLIENTARCH
-	hex
-	depends on BOOTP_PXE
-	default 0x16 if ARM64
-	default 0x15 if ARM
-	default 0x0 if X86
+	  If the value is set to the reserved value 0xFF, the DHCP option will
+	  not be sent by U-Boot.
 
 config BOOTP_PXE_DHCP_OPTION
 	bool "Request & store 'pxe_configfile' from BOOTP/DHCP server"
diff --git a/net/bootp.c b/net/bootp.c
index f22921e..95d906e 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -545,14 +545,14 @@
 	}
 #endif
 
-#ifdef CONFIG_BOOTP_PXE_CLIENTARCH
-	clientarch = CONFIG_BOOTP_PXE_CLIENTARCH;
+#ifdef CONFIG_DHCP_PXE_CLIENTARCH
+	clientarch = CONFIG_DHCP_PXE_CLIENTARCH;
 #endif
 
 	if (env_get("bootp_arch"))
 		clientarch = env_get_ulong("bootp_arch", 16, clientarch);
 
-	if (clientarch > 0) {
+	if (clientarch != 0xff) {
 		*e++ = 93;	/* Client System Architecture */
 		*e++ = 2;
 		*e++ = (clientarch >> 8) & 0xff;
diff --git a/net/dhcpv6.c b/net/dhcpv6.c
index 0c2de75..5bf935c 100644
--- a/net/dhcpv6.c
+++ b/net/dhcpv6.c
@@ -128,7 +128,7 @@
 		break;
 	case DHCP6_OPTION_CLIENT_ARCH_TYPE:
 		client_arch_opt = (struct dhcp6_option_client_arch *)dhcp_option_start;
-		client_arch_opt->arch_type[num_client_arch++] = htons(CONFIG_DHCP6_PXE_CLIENTARCH);
+		client_arch_opt->arch_type[num_client_arch++] = htons(CONFIG_DHCP_PXE_CLIENTARCH);
 
 		opt_len = sizeof(__be16) * num_client_arch;
 		break;
@@ -194,7 +194,7 @@
 	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 (CONFIG_DHCP6_PXE_CLIENTARCH != 0xFF)
+	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);
 	pkt += dhcp6_add_option(DHCP6_OPTION_NII, pkt);
@@ -244,7 +244,7 @@
 		memcpy(pkt, sm_params.server_uid.uid_ptr, sm_params.server_uid.uid_size);
 		pkt += sm_params.server_uid.uid_size;
 	}
-	if (CONFIG_DHCP6_PXE_CLIENTARCH != 0xFF)
+	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);
 	pkt += dhcp6_add_option(DHCP6_OPTION_NII, pkt);