diff --git a/src/arch/i386/image/bzimage.c b/src/arch/i386/image/bzimage.c index 979eb2d7..8a8b254b 100644 --- a/src/arch/i386/image/bzimage.c +++ b/src/arch/i386/image/bzimage.c @@ -36,6 +36,9 @@ #include #include #include +#include + +FEATURE ( FEATURE_IMAGE, "bzImage", DHCP_EB_FEATURE_BZIMAGE, 1 ); struct image_type bzimage_image_type __image_type ( PROBE_NORMAL ); diff --git a/src/arch/i386/image/multiboot.c b/src/arch/i386/image/multiboot.c index 546de365..76114130 100644 --- a/src/arch/i386/image/multiboot.c +++ b/src/arch/i386/image/multiboot.c @@ -33,6 +33,9 @@ #include #include #include +#include + +FEATURE ( FEATURE_IMAGE, "Multiboot", DHCP_EB_FEATURE_MULTIBOOT, 1 ); struct image_type multiboot_image_type __image_type ( PROBE_MULTIBOOT ); diff --git a/src/arch/i386/image/nbi.c b/src/arch/i386/image/nbi.c index 2de381d0..a1d74553 100644 --- a/src/arch/i386/image/nbi.c +++ b/src/arch/i386/image/nbi.c @@ -10,6 +10,7 @@ #include #include #include +#include /** @file * @@ -26,6 +27,8 @@ * */ +FEATURE ( FEATURE_IMAGE, "NBI", DHCP_EB_FEATURE_NBI, 1 ); + struct image_type nbi_image_type __image_type ( PROBE_NORMAL ); /** diff --git a/src/arch/i386/image/pxe_image.c b/src/arch/i386/image/pxe_image.c index 3da38e09..9e634f14 100644 --- a/src/arch/i386/image/pxe_image.c +++ b/src/arch/i386/image/pxe_image.c @@ -29,6 +29,9 @@ #include #include #include +#include + +FEATURE ( FEATURE_IMAGE, "PXE", DHCP_EB_FEATURE_PXE, 1 ); struct image_type pxe_image_type __image_type ( PROBE_PXE ); diff --git a/src/hci/shell_banner.c b/src/hci/shell_banner.c index bb8166db..d313d4dd 100644 --- a/src/hci/shell_banner.c +++ b/src/hci/shell_banner.c @@ -34,8 +34,8 @@ #define BOLD "\033[1m" #define CYAN "\033[36m" -static char * features[0] __table_start ( char *, features ); -static char * features_end[0] __table_end ( char *, features ); +static struct feature features[0] __table_start ( struct feature, features ); +static struct feature features_end[0] __table_end ( struct feature, features ); /** * Print shell banner and prompt for shell entry @@ -44,7 +44,7 @@ static char * features_end[0] __table_end ( char *, features ); */ int shell_banner ( void ) { unsigned long timeout = ( currticks() + BANNER_TIMEOUT ); - char **feature; + struct feature *feature; int key; int enter_shell = 0; @@ -54,7 +54,7 @@ int shell_banner ( void ) { CYAN "http://etherboot.org" NORMAL "\n" "Features:" ); for ( feature = features ; feature < features_end ; feature++ ) { - printf ( " %s", *feature ); + printf ( " %s", feature->name ); } printf ( "\nPress Ctrl-B for the gPXE command line..." ); diff --git a/src/include/gpxe/features.h b/src/include/gpxe/features.h index b8d2d604..a520131f 100644 --- a/src/include/gpxe/features.h +++ b/src/include/gpxe/features.h @@ -11,6 +11,17 @@ * */ +/** + * @defgroup featurecat Feature categories + * @{ + */ + +#define FEATURE_PROTOCOL 01 /**< Network protocols */ +#define FEATURE_IMAGE 02 /**< Image formats */ +#define FEATURE_MISC 03 /**< Miscellaneous */ + +/** @} */ + /** * @defgroup dhcpfeatures DHCP feature option tags * @@ -20,50 +31,58 @@ * @{ */ -/** PXE API extensions */ -#define DHCP_EB_FEATURE_PXE_EXT 0x10 - -/** iSCSI */ -#define DHCP_EB_FEATURE_ISCSI 0x11 - -/** AoE */ -#define DHCP_EB_FEATURE_AOE 0x12 - -/** HTTP */ -#define DHCP_EB_FEATURE_HTTP 0x13 - -/** HTTPS */ -#define DHCP_EB_FEATURE_HTTPS 0x14 +#define DHCP_EB_FEATURE_PXE_EXT 0x10 /**< PXE API extensions */ +#define DHCP_EB_FEATURE_ISCSI 0x11 /**< iSCSI protocol */ +#define DHCP_EB_FEATURE_AOE 0x12 /**< AoE protocol */ +#define DHCP_EB_FEATURE_HTTP 0x13 /**< HTTP protocol */ +#define DHCP_EB_FEATURE_HTTPS 0x14 /**< HTTPS protocol */ +#define DHCP_EB_FEATURE_TFTP 0x15 /**< TFTP protocol */ +#define DHCP_EB_FEATURE_FTP 0x16 /**< FTP protocol */ +#define DHCP_EB_FEATURE_DNS 0x17 /**< DNS protocol */ +#define DHCP_EB_FEATURE_BZIMAGE 0x18 /**< bzImage format */ +#define DHCP_EB_FEATURE_MULTIBOOT 0x19 /**< Multiboot format */ +#define DHCP_EB_FEATURE_NBI 0x20 /**< NBI format */ +#define DHCP_EB_FEATURE_PXE 0x21 /**< PXE format */ /** @} */ /** Declare a feature code for DHCP */ -#define __dhcp_feature __table ( uint8_t, dhcp_features, 01 ) +#define __dhcp_feature( category ) \ + __table ( uint8_t, dhcp_features, category ) /** Construct a DHCP feature table entry */ -#define DHCP_FEATURE( feature_opt, version ) \ - _DHCP_FEATURE ( OBJECT, feature_opt, version ) -#define _DHCP_FEATURE( _name, feature_opt, version ) \ - __DHCP_FEATURE ( _name, feature_opt, version ) -#define __DHCP_FEATURE( _name, feature_opt, version ) \ - uint8_t __dhcp_feature_ ## _name [] __dhcp_feature = { \ - feature_opt, DHCP_BYTE ( version ) \ +#define DHCP_FEATURE( category, feature_opt, version ) \ + _DHCP_FEATURE ( category, OBJECT, feature_opt, version ) +#define _DHCP_FEATURE( category, _name, feature_opt, version ) \ + __DHCP_FEATURE ( category, _name, feature_opt, version ) +#define __DHCP_FEATURE( category, _name, feature_opt, version ) \ + uint8_t __dhcp_feature_ ## _name [] __dhcp_feature ( category ) = { \ + feature_opt, DHCP_BYTE ( version ) \ }; +/** A named feature */ +struct feature { + /** Feature name */ + char *name; +}; + /** Declare a named feature */ -#define __feature_name __table ( char *, features, 01 ) +#define __feature_name( category ) \ + __table ( struct feature, features, category ) /** Construct a named feature */ -#define FEATURE_NAME( text ) \ - _FEATURE_NAME ( OBJECT, text ) -#define _FEATURE_NAME( _name, text ) \ - __FEATURE_NAME ( _name, text ) -#define __FEATURE_NAME( _name, text ) \ - char * __feature_ ## _name __feature_name = text; +#define FEATURE_NAME( category, text ) \ + _FEATURE_NAME ( category, OBJECT, text ) +#define _FEATURE_NAME( category, _name, text ) \ + __FEATURE_NAME ( category, _name, text ) +#define __FEATURE_NAME( category, _name, text ) \ + struct feature __feature_ ## _name __feature_name ( category ) = { \ + .name = text, \ + }; /** Declare a feature */ -#define FEATURE( text, feature_opt, version ) \ - FEATURE_NAME ( text ); \ - DHCP_FEATURE ( feature_opt, version ); +#define FEATURE( category, text, feature_opt, version ) \ + FEATURE_NAME ( category, text ); \ + DHCP_FEATURE ( category, feature_opt, version ); #endif /* _GPXE_FEATURES_H */ diff --git a/src/net/aoe.c b/src/net/aoe.c index 2e2199b3..e3f84e5a 100644 --- a/src/net/aoe.c +++ b/src/net/aoe.c @@ -40,7 +40,7 @@ * */ -FEATURE ( "AoE", DHCP_EB_FEATURE_AOE, 1 ); +FEATURE ( FEATURE_PROTOCOL, "AoE", DHCP_EB_FEATURE_AOE, 1 ); struct net_protocol aoe_protocol; diff --git a/src/net/tcp/ftp.c b/src/net/tcp/ftp.c index 646638ab..0e4d969f 100644 --- a/src/net/tcp/ftp.c +++ b/src/net/tcp/ftp.c @@ -11,6 +11,7 @@ #include #include #include +#include #include /** @file @@ -19,6 +20,8 @@ * */ +FEATURE ( FEATURE_PROTOCOL, "FTP", DHCP_EB_FEATURE_FTP, 1 ); + /** * FTP states * diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c index 0aecc7b5..2a5450ed 100644 --- a/src/net/tcp/http.c +++ b/src/net/tcp/http.c @@ -43,7 +43,7 @@ #include #include -FEATURE ( "HTTP", DHCP_EB_FEATURE_HTTP, 1 ); +FEATURE ( FEATURE_PROTOCOL, "HTTP", DHCP_EB_FEATURE_HTTP, 1 ); /** HTTP receive state */ enum http_rx_state { diff --git a/src/net/tcp/https.c b/src/net/tcp/https.c index a59e94dc..15ab32ef 100644 --- a/src/net/tcp/https.c +++ b/src/net/tcp/https.c @@ -29,7 +29,7 @@ #include #include -FEATURE ( "HTTPS", DHCP_EB_FEATURE_HTTPS, 1 ); +FEATURE ( FEATURE_PROTOCOL, "HTTPS", DHCP_EB_FEATURE_HTTPS, 1 ); /** * Initiate an HTTPS connection diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c index a96331a6..ccb6cffe 100644 --- a/src/net/tcp/iscsi.c +++ b/src/net/tcp/iscsi.c @@ -41,7 +41,7 @@ * */ -FEATURE ( "iSCSI", DHCP_EB_FEATURE_ISCSI, 1 ); +FEATURE ( FEATURE_PROTOCOL, "iSCSI", DHCP_EB_FEATURE_ISCSI, 1 ); /** iSCSI initiator name (explicitly specified) */ static char *iscsi_explicit_initiator_iqn; diff --git a/src/net/udp/dns.c b/src/net/udp/dns.c index b141eea4..f32b2e05 100644 --- a/src/net/udp/dns.c +++ b/src/net/udp/dns.c @@ -31,6 +31,7 @@ #include #include #include +#include #include /** @file @@ -39,6 +40,8 @@ * */ +FEATURE ( FEATURE_PROTOCOL, "DNS", DHCP_EB_FEATURE_DNS, 1 ); + /** The DNS server */ static struct sockaddr_tcpip nameserver = { .st_port = htons ( DNS_PORT ), diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c index 106c7047..ea4d1df3 100644 --- a/src/net/udp/tftp.c +++ b/src/net/udp/tftp.c @@ -30,6 +30,7 @@ #include #include #include +#include #include /** @file @@ -38,6 +39,8 @@ * */ +FEATURE ( FEATURE_PROTOCOL, "TFTP", DHCP_EB_FEATURE_TFTP, 1 ); + /** * A TFTP request *