+/* Adds a next node to ip4 or ip6 lookup node which can be then used in adjacencies.
+ * @param vlib_main pointer
+ * @param lm ip4_main.lookup_main or ip6_main.lookup_main
+ * @param reg registration structure
+ * @param next_node_index Returned index to be used in adjacencies.
+ * @return 0 on success. -1 on failure.
+ */
+int ip_register_adjacency(vlib_main_t *vm, u8 is_ip4,
+ ip_adj_register_t *reg);
+
+/*
+ * Construction helpers to add IP adjacency at init.
+ */
+#define VNET_IP_REGISTER_ADJACENCY(ip,x,...) \
+ __VA_ARGS__ ip_adj_register_t ip##adj_##x; \
+static void __vnet_##ip##_register_adjacency_##x (void) \
+ __attribute__((__constructor__)) ; \
+static void __vnet_##ip##_register_adjacency_##x (void) \
+{ \
+ ip_lookup_main_t *lm = &ip##_main.lookup_main; \
+ ip##adj_##x.next = lm->registered_adjacencies; \
+ lm->registered_adjacencies = &ip##adj_##x; \
+} \
+__VA_ARGS__ ip_adj_register_t ip##adj_##x
+
+#define VNET_IP4_REGISTER_ADJACENCY(x,...) \
+ VNET_IP_REGISTER_ADJACENCY(ip4, x, __VA_ARGS__)
+
+#define VNET_IP6_REGISTER_ADJACENCY(x,...) \
+ VNET_IP_REGISTER_ADJACENCY(ip6, x, __VA_ARGS__)
+