]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[dhcp] Automatically generate vendor class identifier string
authorMichael Brown <mcb30@ipxe.org>
Mon, 4 Jul 2016 14:07:05 +0000 (15:07 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 4 Jul 2016 14:07:05 +0000 (15:07 +0100)
The vendor class identifier strings in DHCP_ARCH_VENDOR_CLASS_ID are
out of sync with the (correct) client architecture values in
DHCP_ARCH_CLIENT_ARCHITECTURE.

Fix by removing all definitions of DHCP_ARCH_VENDOR_CLASS_ID, and
instead generating the vendor class identifier string automatically
based on DHCP_ARCH_CLIENT_ARCHITECTURE and DHCP_ARCH_CLIENT_NDI.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/arm32/include/efi/ipxe/dhcp_arch.h
src/arch/arm64/include/efi/ipxe/dhcp_arch.h
src/arch/i386/include/efi/ipxe/dhcp_arch.h
src/arch/i386/include/pcbios/ipxe/dhcp_arch.h
src/arch/x86_64/include/efi/ipxe/dhcp_arch.h
src/arch/x86_64/include/pcbios/ipxe/dhcp_arch.h
src/include/ipxe/dhcp.h
src/net/udp/dhcp.c
src/net/udp/dhcpv6.c

index e971955badbc6d88638ffe34c9018e06ac97ad03..29a23594497e32d8f1fa131aea04391a18f2f21a 100644 (file)
@@ -33,11 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <ipxe/dhcp.h>
 
-#define DHCP_ARCH_VENDOR_CLASS_ID                              \
-       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',       \
-       'A', 'r', 'c', 'h', ':', '0', '0', '0', '0', '7', ':',  \
-       'U', 'N', 'D', 'I', ':', '0', '0', '3', '0', '1', '0'
-
 #define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_ARM32
 
 #define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
index 4ffea7f44a8a2d75895b1502c258fb646319ab5a..bb26aae4d7ff15076e6e203354aab6a254d3af67 100644 (file)
@@ -33,11 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <ipxe/dhcp.h>
 
-#define DHCP_ARCH_VENDOR_CLASS_ID                              \
-       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',       \
-       'A', 'r', 'c', 'h', ':', '0', '0', '0', '0', '7', ':',  \
-       'U', 'N', 'D', 'I', ':', '0', '0', '3', '0', '1', '0'
-
 #define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_ARM64
 
 #define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
index 74027928d30e969bbe55fb685e146fdf0467aa58..cf3dbe4999bfa0e0192fc42c530ae05ba84f6bd9 100644 (file)
@@ -33,11 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <ipxe/dhcp.h>
 
-#define DHCP_ARCH_VENDOR_CLASS_ID                              \
-       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',       \
-       'A', 'r', 'c', 'h', ':', '0', '0', '0', '0', '6', ':',  \
-       'U', 'N', 'D', 'I', ':', '0', '0', '3', '0', '1', '0'
-
 #define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_IA32
 
 #define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
index 0a7a2f7cd99c11d0e54f2c33a82ef43719313764..e22f50b37a442cc9f6e91c59ff76c309ce8d3590 100644 (file)
@@ -33,11 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <ipxe/dhcp.h>
 
-#define DHCP_ARCH_VENDOR_CLASS_ID                              \
-       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',       \
-       'A', 'r', 'c', 'h', ':', '0', '0', '0', '0', '0', ':',  \
-       'U', 'N', 'D', 'I', ':', '0', '0', '2', '0', '0', '1'
-
 #define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_X86
 
 #define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 2, 1 /* v2.1 */
index b35818efdd4fc34339cd854494658bfd1cdca362..fb85b44059c68fd771dd48ca571906f926f84abb 100644 (file)
@@ -33,11 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <ipxe/dhcp.h>
 
-#define DHCP_ARCH_VENDOR_CLASS_ID                              \
-       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',       \
-       'A', 'r', 'c', 'h', ':', '0', '0', '0', '0', '9', ':',  \
-       'U', 'N', 'D', 'I', ':', '0', '0', '3', '0', '1', '0'
-
 #define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_X86_64
 
 #define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
index 0a7a2f7cd99c11d0e54f2c33a82ef43719313764..e22f50b37a442cc9f6e91c59ff76c309ce8d3590 100644 (file)
@@ -33,11 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <ipxe/dhcp.h>
 
-#define DHCP_ARCH_VENDOR_CLASS_ID                              \
-       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',       \
-       'A', 'r', 'c', 'h', ':', '0', '0', '0', '0', '0', ':',  \
-       'U', 'N', 'D', 'I', ':', '0', '0', '2', '0', '0', '1'
-
 #define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_X86
 
 #define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 2, 1 /* v2.1 */
index 693aa7e733307c545c93ac08c3b5bd65a5e3dd98..b699b31f08292dbee996fbf39264c5fb1afc5678 100644 (file)
@@ -210,6 +210,29 @@ struct dhcp_pxe_boot_menu_item {
 /** Vendor class identifier */
 #define DHCP_VENDOR_CLASS_ID 60
 
+/** Vendor class identifier for PXE clients */
+#define DHCP_VENDOR_PXECLIENT( arch, ndi )                             \
+       'P', 'X', 'E', 'C', 'l', 'i', 'e', 'n', 't', ':',               \
+       'A', 'r', 'c', 'h', ':', DHCP_VENDOR_PXECLIENT_ARCH ( arch ),   \
+       ':', 'U', 'N', 'D', 'I', ':', DHCP_VENDOR_PXECLIENT_UNDI ( ndi )
+
+/** Vendor class identifier architecture for PXE clients */
+#define DHCP_VENDOR_PXECLIENT_ARCH( arch )                             \
+       ( '0' + ( ( (arch) / 10000 ) % 10 ) ),                          \
+       ( '0' + ( ( (arch) /  1000 ) % 10 ) ),                          \
+       ( '0' + ( ( (arch) /   100 ) % 10 ) ),                          \
+       ( '0' + ( ( (arch) /    10 ) % 10 ) ),                          \
+       ( '0' + ( ( (arch) /     1 ) % 10 ) )
+
+/** Vendor class identifier UNDI version for PXE clients */
+#define DHCP_VENDOR_PXECLIENT_UNDI( type, major, minor )               \
+       DHCP_VENDOR_PXECLIENT_UNDI_VERSION ( major ),                   \
+       DHCP_VENDOR_PXECLIENT_UNDI_VERSION ( minor )
+#define DHCP_VENDOR_PXECLIENT_UNDI_VERSION( version )                  \
+       ( '0' + ( ( (version) /   100 ) % 10 ) ),                       \
+       ( '0' + ( ( (version) /    10 ) % 10 ) ),                       \
+       ( '0' + ( ( (version) /     1 ) % 10 ) )
+
 /** Client identifier */
 #define DHCP_CLIENT_ID 61
 
index 0c6cea0f15213a028fcd5a3626c1df951e06ed5d..b9c1fd90c9375fafab04dcc2a4912bc1cd21d7af 100644 (file)
@@ -84,7 +84,9 @@ static uint8_t dhcp_request_options_data[] = {
        DHCP_WORD ( ETH_MAX_MTU - 20 /* IP header */ - 8 /* UDP header */ ),
        DHCP_CLIENT_ARCHITECTURE, DHCP_WORD ( DHCP_ARCH_CLIENT_ARCHITECTURE ),
        DHCP_CLIENT_NDI, DHCP_OPTION ( DHCP_ARCH_CLIENT_NDI ),
-       DHCP_VENDOR_CLASS_ID, DHCP_STRING ( DHCP_ARCH_VENDOR_CLASS_ID ),
+       DHCP_VENDOR_CLASS_ID,
+       DHCP_STRING ( DHCP_VENDOR_PXECLIENT ( DHCP_ARCH_CLIENT_ARCHITECTURE,
+                                             DHCP_ARCH_CLIENT_NDI ) ),
        DHCP_USER_CLASS_ID, DHCP_STRING ( 'i', 'P', 'X', 'E' ),
        DHCP_PARAMETER_REQUEST_LIST,
        DHCP_OPTION ( DHCP_SUBNET_MASK, DHCP_ROUTERS, DHCP_DNS_SERVERS,
index ef07f54e32a0721762da571a802110400a8669f9..be1ed4ec0ab58d40f36467073d57b2c2ed96df47 100644 (file)
@@ -374,7 +374,9 @@ static uint8_t dhcpv6_request_options_data[] = {
                        DHCPV6_CODE ( DHCPV6_BOOTFILE_PARAM ) ),
        DHCPV6_CODE ( DHCPV6_VENDOR_CLASS ),
        DHCPV6_OPTION ( DHCPV6_DWORD_VALUE ( DHCPV6_VENDOR_CLASS_PXE ),
-                       DHCPV6_STRING ( DHCP_ARCH_VENDOR_CLASS_ID ) ),
+                       DHCPV6_STRING (
+                         DHCP_VENDOR_PXECLIENT ( DHCP_ARCH_CLIENT_ARCHITECTURE,
+                                                 DHCP_ARCH_CLIENT_NDI ) ) ),
        DHCPV6_CODE ( DHCPV6_CLIENT_ARCHITECTURE ),
        DHCPV6_WORD ( DHCP_ARCH_CLIENT_ARCHITECTURE ),
        DHCPV6_CODE ( DHCPV6_CLIENT_NDI ),