Line data Source code
1 : #ifndef HEADER_fd_src_flamenco_features_fd_features_h 2 : #define HEADER_fd_src_flamenco_features_fd_features_h 3 : 4 : #include "../fd_flamenco_base.h" 5 : #include "../types/fd_types.h" 6 : #include "fd_features_generated.h" 7 : #include "../../funk/fd_funk_base.h" 8 : 9 : /* Macro FEATURE_ID_CNT expands to the number of features in 10 : fd_features_t. */ 11 : 12 : //#define FD_FEATURE_ID_CNT (... see generated.h ...) 13 : 14 : /* FD_FEATURE_DISABLED is the sentinel value of the feature activation 15 : slot when the feature has not yet been activated. */ 16 : 17 1909341 : #define FD_FEATURE_DISABLED (ULONG_MAX) 18 : 19 : /* Convenience macros for checking features */ 20 : 21 16365 : #define FD_FEATURE_ACTIVE_(_slot, _features, _feature_name) ( _slot >= (_features)-> _feature_name ) 22 : #define FD_FEATURE_JUST_ACTIVATED_(_slot, _features, _feature_name) ( _slot == (_features)-> _feature_name ) 23 0 : #define FD_FEATURE_ACTIVE_OFFSET_(_slot, _features, _offset) ( _slot >= (_features)->f[_offset>>3] ) 24 0 : #define FD_FEATURE_JUST_ACTIVATED_OFFSET_(_slot, _features, _offset) ( _slot == (_features)->f[_offset>>3] ) 25 : 26 : #define FD_FEATURE_SET_ACTIVE(_features, _feature_name, _slot) ( (_features)-> _feature_name = _slot ) 27 0 : #define FD_FEATURE_ACTIVE_OFFSET(_slot, _features, _offset) FD_FEATURE_ACTIVE_OFFSET_( _slot, _features, _offset ) 28 0 : #define FD_FEATURE_JUST_ACTIVATED_OFFSET(_bank, _offset) FD_FEATURE_JUST_ACTIVATED_OFFSET_( fd_bank_slot_get( _bank ), fd_bank_features_query( _bank ), _offset ) 29 675 : #define FD_FEATURE_ACTIVE(_slot, _features, _feature_name) FD_FEATURE_ACTIVE_( _slot, _features, _feature_name ) 30 15690 : #define FD_FEATURE_ACTIVE_BANK(_bank, _feature_name) FD_FEATURE_ACTIVE_( fd_bank_slot_get( _bank ), fd_bank_features_query( _bank ), _feature_name ) 31 0 : #define FD_FEATURE_ACTIVE_BANK_OFFSET(_bank, _offset) FD_FEATURE_ACTIVE_OFFSET_( fd_bank_slot_get( _bank ), fd_bank_features_query( _bank ), _offset ) 32 : 33 : 34 : /* fd_features_t is the current set of enabled feature flags. 35 : 36 : Each feature has a corresponding account in the account database, 37 : which are used to control activation. This structure contains an 38 : ulong of the activation slots of each feature for convenience (or 39 : FD_FEATURE_DISABLED if not yet activated). The feature params 40 : contained in this structure change over time, as activated features 41 : become default, and as new pending feature activations get added. 42 : 43 : Usage: 44 : 45 : fd_features_t * features; 46 : 47 : // Direct API 48 : ulong activation_slot = features->FEATURE_NAME; 49 : 50 : // Indirect API 51 : fd_feature_id_t const * id; 52 : ulong activation_slot = fd_features_get( id ); 53 : ... id->index safe in [0,FD_FEATURE_CNT) ... */ 54 : 55 : typedef union fd_features fd_features_t; 56 : 57 : /* fd_feature_id_t maps a feature ID (account address) to the byte 58 : offset in fd_features_t. */ 59 : 60 : struct fd_feature_id { 61 : ulong index; /* index of feature in fd_features_t */ 62 : fd_pubkey_t id; /* pubkey of feature */ 63 : char const * name; /* feature name cstr */ 64 : uint cleaned_up[3]; /* cleaned_up cluster version for feature */ 65 : uchar reverted; /* if the feature was reverted */ 66 : uchar hardcode_for_fuzzing; /* if the should be treated as hardcoded in the firedancer fuzzing harness */ 67 : }; 68 : typedef struct fd_feature_id fd_feature_id_t; 69 : 70 : FD_PROTOTYPES_BEGIN 71 : 72 : /* fd_feature_ids is the list of known feature IDs. 73 : The last element has offset==ULONG_MAX. */ 74 : extern fd_feature_id_t const ids[]; 75 : 76 : /* fd_features_disable_all disables all features (cleaned_up or not). */ 77 : 78 : void 79 : fd_features_disable_all( fd_features_t * f ); 80 : 81 : /* fd_features_enable_all enables all features (supported or not). */ 82 : 83 : void 84 : fd_features_enable_all( fd_features_t * ); 85 : 86 : /* fd_features_enable_cleaned_up enables all features marked as "hard 87 : coded". These are features that are baked into the current version 88 : of the Firedancer software and can't be disabled. */ 89 : 90 : void 91 : fd_features_enable_cleaned_up( fd_features_t *, fd_cluster_version_t const * ); 92 : 93 : /* fd_features_enable_one_offs enables all manually passed in features. */ 94 : 95 : void 96 : fd_features_enable_one_offs( fd_features_t * features, 97 : char const * * one_offs, 98 : uint one_offs_cnt, 99 : ulong slot ); 100 : 101 : /* fd_feature_iter_{...} is an iterator-style API over all supported 102 : features in this version of Firedancer. Usage: 103 : 104 : for( fd_feature_id_t const * id = fd_feature_iter_init(); 105 : !fd_feature_iter_done( id ); 106 : id = fd_feature_iter_next( id ) ) { 107 : ... 108 : } */ 109 : 110 : static inline fd_feature_id_t const * 111 7695 : fd_feature_iter_init( void ) { 112 7695 : return ids; 113 7695 : } 114 : 115 : static inline int 116 1923750 : fd_feature_iter_done( fd_feature_id_t const * id ) { 117 1923750 : return id->index == ULONG_MAX; 118 1923750 : } 119 : 120 : static inline fd_feature_id_t const * 121 1916055 : fd_feature_iter_next( fd_feature_id_t const * id ) { 122 1916055 : return id+1; 123 1916055 : } 124 : 125 : /* fd_features_set sets the activation slot of the given feature ID. */ 126 : 127 : static inline void 128 : fd_features_set( fd_features_t * features, 129 : fd_feature_id_t const * id, 130 1918491 : ulong slot ) { 131 1918491 : features->f[ id->index ] = slot; 132 1918491 : } 133 : 134 : /* fd_features_get returns the activation slot of the given feature ID. 135 : Returns ULONG_MAX if the feature is not scheduled for activation. */ 136 : 137 : static inline ulong 138 : fd_features_get( fd_features_t const * features, 139 747 : fd_feature_id_t const * id ) { 140 747 : return features->f[ id->index ]; 141 747 : } 142 : 143 : /* fd_feature_id_query queries a feature ID given the first 8 bytes of 144 : the feature address (little-endian order). Returns pointer to ID in 145 : `ids` array on success, or NULL on failure. */ 146 : 147 : FD_FN_CONST fd_feature_id_t const * 148 : fd_feature_id_query( ulong prefix ); 149 : 150 : /* fd_features_restore loads all known feature accounts from the 151 : accounts database. This is used when initializing bank from a 152 : snapshot. */ 153 : 154 : void 155 : fd_features_restore( fd_bank_t * bank, 156 : fd_funk_t * funk, 157 : fd_funk_txn_xid_t const * xid ); 158 : 159 : FD_PROTOTYPES_END 160 : 161 : #endif /* HEADER_fd_src_flamenco_features_fd_features_h */