Allowed zero-cost enforced ordering of features in startup banner
authorMichael Brown <mcb30@etherboot.org>
Thu, 2 Aug 2007 13:51:03 +0000 (14:51 +0100)
committerMichael Brown <mcb30@etherboot.org>
Thu, 2 Aug 2007 13:51:03 +0000 (14:51 +0100)
list.

Added FEATURE() macros to most relevant (non-driver) files.

13 files changed:
src/arch/i386/image/bzimage.c
src/arch/i386/image/multiboot.c
src/arch/i386/image/nbi.c
src/arch/i386/image/pxe_image.c
src/hci/shell_banner.c
src/include/gpxe/features.h
src/net/aoe.c
src/net/tcp/ftp.c
src/net/tcp/http.c
src/net/tcp/https.c
src/net/tcp/iscsi.c
src/net/udp/dns.c
src/net/udp/tftp.c

index 979eb2d..8a8b254 100644 (file)
@@ -36,6 +36,9 @@
 #include <gpxe/init.h>
 #include <gpxe/initrd.h>
 #include <gpxe/cpio.h>
+#include <gpxe/features.h>
+
+FEATURE ( FEATURE_IMAGE, "bzImage", DHCP_EB_FEATURE_BZIMAGE, 1 );
 
 struct image_type bzimage_image_type __image_type ( PROBE_NORMAL );
 
index 546de36..7611413 100644 (file)
@@ -33,6 +33,9 @@
 #include <gpxe/memmap.h>
 #include <gpxe/elf.h>
 #include <gpxe/init.h>
+#include <gpxe/features.h>
+
+FEATURE ( FEATURE_IMAGE, "Multiboot", DHCP_EB_FEATURE_MULTIBOOT, 1 );
 
 struct image_type multiboot_image_type __image_type ( PROBE_MULTIBOOT );
 
index 2de381d..a1d7455 100644 (file)
@@ -10,6 +10,7 @@
 #include <gpxe/netdevice.h>
 #include <gpxe/dhcp.h>
 #include <gpxe/image.h>
+#include <gpxe/features.h>
 
 /** @file
  *
@@ -26,6 +27,8 @@
  *
  */
 
+FEATURE ( FEATURE_IMAGE, "NBI", DHCP_EB_FEATURE_NBI, 1 );
+
 struct image_type nbi_image_type __image_type ( PROBE_NORMAL );
 
 /**
index 3da38e0..9e634f1 100644 (file)
@@ -29,6 +29,9 @@
 #include <gpxe/image.h>
 #include <gpxe/segment.h>
 #include <gpxe/netdevice.h>
+#include <gpxe/features.h>
+
+FEATURE ( FEATURE_IMAGE, "PXE", DHCP_EB_FEATURE_PXE, 1 );
 
 struct image_type pxe_image_type __image_type ( PROBE_PXE );
 
index bb8166d..d313d4d 100644 (file)
@@ -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..." );
 
index b8d2d60..a520131 100644 (file)
  *
  */
 
+/**
+ * @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
  *
  * @{
  */
 
-/** 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 */
index 2e2199b..e3f84e5 100644 (file)
@@ -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;
 
index 646638a..0e4d969 100644 (file)
@@ -11,6 +11,7 @@
 #include <gpxe/xfer.h>
 #include <gpxe/open.h>
 #include <gpxe/uri.h>
+#include <gpxe/features.h>
 #include <gpxe/ftp.h>
 
 /** @file
@@ -19,6 +20,8 @@
  *
  */
 
+FEATURE ( FEATURE_PROTOCOL, "FTP", DHCP_EB_FEATURE_FTP, 1 );
+
 /**
  * FTP states
  *
index 0aecc7b..2a5450e 100644 (file)
@@ -43,7 +43,7 @@
 #include <gpxe/features.h>
 #include <gpxe/http.h>
 
-FEATURE ( "HTTP", DHCP_EB_FEATURE_HTTP, 1 );
+FEATURE ( FEATURE_PROTOCOL, "HTTP", DHCP_EB_FEATURE_HTTP, 1 );
 
 /** HTTP receive state */
 enum http_rx_state {
index a59e94d..15ab32e 100644 (file)
@@ -29,7 +29,7 @@
 #include <gpxe/http.h>
 #include <gpxe/features.h>
 
-FEATURE ( "HTTPS", DHCP_EB_FEATURE_HTTPS, 1 );
+FEATURE ( FEATURE_PROTOCOL, "HTTPS", DHCP_EB_FEATURE_HTTPS, 1 );
 
 /**
  * Initiate an HTTPS connection
index a96331a..ccb6cff 100644 (file)
@@ -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;
index b141eea..f32b2e0 100644 (file)
@@ -31,6 +31,7 @@
 #include <gpxe/retry.h>
 #include <gpxe/tcpip.h>
 #include <gpxe/dhcp.h>
+#include <gpxe/features.h>
 #include <gpxe/dns.h>
 
 /** @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 ),
index 106c704..ea4d1df 100644 (file)
@@ -30,6 +30,7 @@
 #include <gpxe/uri.h>
 #include <gpxe/tcpip.h>
 #include <gpxe/retry.h>
+#include <gpxe/features.h>
 #include <gpxe/tftp.h>
 
 /** @file
@@ -38,6 +39,8 @@
  *
  */
 
+FEATURE ( FEATURE_PROTOCOL, "TFTP", DHCP_EB_FEATURE_TFTP, 1 );
+
 /**
  * A TFTP request
  *