Vpp 与 app 建立消息通道和资源映射流程解析
一、调用 vppcom_worker_register---与 vpp 建立通信、在 vpp 端创建 app_wrk
1、vcl_worker_alloc_and_init( 同 vppcom_app_create 中的流程)
从 vcm->worker 申请 worker;调 vppcom_epoll_create 创建 wrk->mqs_epfd;
2、vppcom_connect_to_vpp( 同 vppcom_app_create 中的流程)
与 vpp 建 立 连 接 ( /usr/local/vpp/vpp-api.sock ) , vpp 端 创 建 共 享 内 存 :
wrk->vl_input_queue = am->shmem_hdr->vl_input_queue;(sockctl)、wrk->my_client_index =
(u32) am->my_client_index;(memctl)
3、vcl_worker_register_with_vpp
3.1、vcl_send_app_worker_add_del
封 装 VL_API_APP_WORKER_ADD_DEL 消 息 , 填 充 wrk->my_client_index 、
vcm->app_index(main app wrk 在 vpp 端申请的 app 对应的 app_index)、 wrk->wrk_index,
将消息放 wrk->vl_input_queue:mp->_vl_msg_id = ntohs (VL_API_APP_WORKER_ADD_DEL)、
mp->client_index = wrk->my_client_index 、 mp->app_index = clib_host_to_net_u32
(vcm->app_index)、 mp->context = wrk->wrk_index、 mp->is_add = is_add;
3.2、vpp 端 vl_api_app_worker_add_del_t_handler
3.2.1、根据 app_index 查找 app(main app wrk 在 vpp 端申请的 app);
3.2.2、vnet_app_worker_add_del
3.2.2.1、根据 app_index 查找 app(main app wrk 在 vpp 端申请
的 app)
3.2.2.2 、 application_alloc_worker_and_init ( 同
vppcom_app_create-》vppcom_app_attach 中为 app 创建 app_wrk 流程)
从 app_workers 池 子 获 取 app_wrk ,
app_wrk->wrk_index 为 其 在 app_workers 池 子 中 的 索 引 、 app_wrk->app_index =
app->app_index(记录 main worker 申请的 app 的 app_index);
app->worker_maps 池 子 申 请 wrk_map ,
wrk_map->wrk_index = app_wrk->wrk_index 、 app_wrk->wrk_map_index 记 录 wrk_map 在
app->worker_maps 中的索引;
从 segment_manager_main_t *smm = &sm_main 申
评论3