VPP在启动之前,首先需要生成全局的调用关系链表,在VPP启动时进行加载
这样的全局链表主要通过宏定义的方法建立
全局链表的宏定义主要包含以下几个:
注册到vlib_main_t结构体的宏定义
VLIB_INIT_FUNCTION:
注册到vlib_main_t的init_function_registrations链表,VPP启动时调用vlib_call_init_function时进行加载
VLIB_API_INIT_FUNCTION:
注册到vlib_main_t的api_init_function_registrations链表,并作为一个名为”api_rx_from_ring”的node注册到VLIB_REGISTER_NODE中,在VPP启动时调用加载
VLIB_CLI_COMMAND:
注册在vlib_main_t的cli_command_registrations链表, VLIB_INIT_FUNCTION中注册一个vlib_cli_init函数,在VPP启动调用vlib_call_init_function时进行加载
VLIB_EARLY_CONFIG_FUNCTION和VLIB_CONFIG_FUNCTION
注册到vlib_main_t的config_function_registrations链表,在VPP启动时执行vlib_call_all_config_functions进行加载
VLIB_MAIN_LOOP_ENTER_FUNCTION
注册到vlib_main_t的main_loop_enter_function_registrations链表,在VPP启动时调用vlib_call_all_main_loop_enter_functions进行加载
VLIB_MAIN_LOOP_EXIT_FUNCTION
注册到vlib_main_t的main_loop_exit_function_registrations链表,在VPP启动时调用vlib_call_all_main_loop_exit_functions进行加载
VLIB_REGISTER_NODE
注册到vlib_main_t的node_main.node_registrations链表,在启动执行vlib_register_all_static_node时进行加载
插件宏定义
VLIB_PLUGIN_REGISTER:
指定vlib_plugin_registration_t相关信息:如插件版本,描述等,在VPP启动时做判断,在调用vlib_load_new_plugins是进行加载
Feature宏定义:
VNET_FEATURE_ARC_INIT
注册到vnet_feature_main_t的next_arc链表,在VLIB_INIT_FUNCTION中增加一个加载feature的vnet_feature_init函数,在VPP启动时调用
VNET_FEATURE_INIT
注册到vnet_feature_main_t的next_feature链表,在VLIB_INIT_FUNCTION中增加一个加载feature的vnet_feature_init函数,在VPP启动时调用