+#define FIB_ENTRY_SRC_VFT_INVOKE(_fe, esrc, func, args) \
+{ \
+ const fib_entry_src_vft_t *_vft; \
+ fib_node_index_t _fei = fib_entry_get_index(_fe); \
+ _vft = fib_entry_src_get_vft(esrc); \
+ if (_vft->func) { \
+ (esrc)->fes_flags &= ~FIB_ENTRY_SRC_FLAG_STALE; \
+ _vft->func args; \
+ } \
+ _fe = fib_entry_get(_fei); \
+}
+
+#define FIB_ENTRY_SRC_VFT_INVOKE_AND_RETURN(esrc, func, args) \
+{ \
+ const fib_entry_src_vft_t *_vft; \
+ _vft = fib_entry_src_get_vft(esrc); \
+ if (_vft->func) { \
+ (esrc)->fes_flags &= ~FIB_ENTRY_SRC_FLAG_STALE; \
+ return (_vft->func args); \
+ } \
+}
+
+#define FIB_ENTRY_SRC_VFT_EXISTS(esrc, func) \
+ (fib_entry_src_get_vft(esrc)->func != 0)
+
+extern const fib_entry_src_vft_t*fib_entry_src_get_vft(
+ const fib_entry_src_t *esrc);
+
+extern fib_entry_src_t * fib_entry_src_find (const fib_entry_t *fib_entry,
+ fib_source_t source);