db485bc277d397bbb117f90a652fca92f1d8850e
[people/pravin/gpxe.git] / src / include / gpxe / features.h
1 #ifndef _GPXE_FEATURES_H
2 #define _GPXE_FEATURES_H
3
4 #include <stdint.h>
5 #include <gpxe/tables.h>
6 #include <gpxe/dhcp.h>
7
8 /** @file
9  *
10  * Feature list
11  *
12  */
13
14 FILE_LICENCE ( GPL2_OR_LATER );
15
16 /**
17  * @defgroup featurecat Feature categories
18  * @{
19  */
20
21 #define FEATURE_PROTOCOL                01 /**< Network protocols */
22 #define FEATURE_IMAGE                   02 /**< Image formats */
23 #define FEATURE_MISC                    03 /**< Miscellaneous */
24
25 /** @} */
26
27 /**
28  * @defgroup dhcpfeatures DHCP feature option tags
29  *
30  * DHCP feature option tags are Etherboot encapsulated options in the
31  * range 0x10-0x7f.
32  *
33  * @{
34  */
35
36 #define DHCP_EB_FEATURE_PXE_EXT         0x10 /**< PXE API extensions */
37 #define DHCP_EB_FEATURE_ISCSI           0x11 /**< iSCSI protocol */
38 #define DHCP_EB_FEATURE_AOE             0x12 /**< AoE protocol */
39 #define DHCP_EB_FEATURE_HTTP            0x13 /**< HTTP protocol */
40 #define DHCP_EB_FEATURE_HTTPS           0x14 /**< HTTPS protocol */
41 #define DHCP_EB_FEATURE_TFTP            0x15 /**< TFTP protocol */
42 #define DHCP_EB_FEATURE_FTP             0x16 /**< FTP protocol */
43 #define DHCP_EB_FEATURE_DNS             0x17 /**< DNS protocol */
44 #define DHCP_EB_FEATURE_BZIMAGE         0x18 /**< bzImage format */
45 #define DHCP_EB_FEATURE_MULTIBOOT       0x19 /**< Multiboot format */
46 #define DHCP_EB_FEATURE_SLAM            0x1a /**< SLAM protocol */
47 #define DHCP_EB_FEATURE_NBI             0x20 /**< NBI format */
48 #define DHCP_EB_FEATURE_PXE             0x21 /**< PXE format */
49 #define DHCP_EB_FEATURE_ELF             0x22 /**< ELF format */
50 #define DHCP_EB_FEATURE_COMBOOT         0x23 /**< COMBOOT format */
51 #define DHCP_EB_FEATURE_EFI             0x24 /**< EFI format */
52
53 /** @} */
54
55 /** DHCP feature table */
56 #define DHCP_FEATURES __table ( uint8_t, "dhcp_features" )
57
58 /** Declare a feature code for DHCP */
59 #define __dhcp_feature __table_entry ( DHCP_FEATURES, 01 )
60
61 /** Construct a DHCP feature table entry */
62 #define DHCP_FEATURE( feature_opt, ... )                                    \
63         _DHCP_FEATURE ( OBJECT, feature_opt, __VA_ARGS__ )
64 #define _DHCP_FEATURE( _name, feature_opt, ... )                            \
65         __DHCP_FEATURE ( _name, feature_opt, __VA_ARGS__ )
66 #define __DHCP_FEATURE( _name, feature_opt, ... )                           \
67         uint8_t __dhcp_feature_ ## _name [] __dhcp_feature = {              \
68                 feature_opt, DHCP_OPTION ( __VA_ARGS__ )                    \
69         };
70
71 /** A named feature */
72 struct feature {
73         /** Feature name */
74         char *name;
75 };
76
77 /** Named feature table */
78 #define FEATURES __table ( struct feature, "features" )
79
80 /** Declare a named feature */
81 #define __feature_name( category ) __table_entry ( FEATURES, category )
82
83 /** Construct a named feature */
84 #define FEATURE_NAME( category, text )                                      \
85         _FEATURE_NAME ( category, OBJECT, text )
86 #define _FEATURE_NAME( category, _name, text )                              \
87         __FEATURE_NAME ( category, _name, text )
88 #define __FEATURE_NAME( category, _name, text )                             \
89         struct feature __feature_ ## _name __feature_name ( category ) = {  \
90                 .name = text,                                               \
91         };
92
93 /** Declare a feature */
94 #define FEATURE( category, text, feature_opt, version )                     \
95         FEATURE_NAME ( category, text );                                    \
96         DHCP_FEATURE ( feature_opt, version );
97
98 /** Declare the version number feature */
99 #define FEATURE_VERSION( ... )                                              \
100         DHCP_FEATURE ( DHCP_ENCAPSULATED ( DHCP_EB_VERSION ), __VA_ARGS__ )
101
102 #endif /* _GPXE_FEATURES_H */