+#define VNET_FEATURE_ARC_ORDER(x,...) \
+ __VA_ARGS__ vnet_feature_constraint_registration_t \
+vnet_feature_constraint_##x; \
+static void __vnet_add_constraint_registration_##x (void) \
+ __attribute__((__constructor__)) ; \
+static void __vnet_add_constraint_registration_##x (void) \
+{ \
+ vnet_feature_main_t * fm = &feature_main; \
+ vnet_feature_constraint_##x.next = fm->next_constraint; \
+ fm->next_constraint = & vnet_feature_constraint_##x; \
+} \
+static void __vnet_rm_constraint_registration_##x (void) \
+ __attribute__((__destructor__)) ; \
+static void __vnet_rm_constraint_registration_##x (void) \
+{ \
+ vnet_feature_main_t * fm = &feature_main; \
+ vnet_feature_constraint_registration_t *r = &vnet_feature_constraint_##x; \
+ VLIB_REMOVE_FROM_LINKED_LIST (fm->next_constraint, r, next); \
+} \
+__VA_ARGS__ vnet_feature_constraint_registration_t vnet_feature_constraint_##x
+
+#else
+#define VNET_FEATURE_ARC_INIT(x,...) \
+extern vnet_feature_arc_registration_t __clib_unused vnet_feat_arc_##x; \
+static vnet_feature_arc_registration_t __clib_unused __clib_unused_vnet_feat_arc_##x
+#define VNET_FEATURE_INIT(x,...) \
+extern vnet_feature_registration_t __clib_unused vnet_feat_##x; \
+static vnet_feature_registration_t __clib_unused __clib_unused_vnet_feat_##x
+
+#define VNET_FEATURE_ARC_ORDER(x,...) \
+extern vnet_feature_constraint_registration_t \
+__clib_unused vnet_feature_constraint_##x; \
+static vnet_feature_constraint_registration_t __clib_unused \
+__clib_unused_vnet_feature_constraint_##x
+
+
+#endif
+