> 文章列表 > vpp中的lcp_itf_pair_create函数解析

vpp中的lcp_itf_pair_create函数解析

vpp中的lcp_itf_pair_create函数解析

VPP(Vector Packet Processing)中的lcp_itf_pair_create函数用于创建LCP(Link Control Protocol)接口对。该函数定义在vpp/src/plugins/lcp/lcp_api.c文件中。

具体来说,LCP是一种协议,用于在点到点链接中协商连接参数。LCP接口对是VPP中用于实现L2TP(Layer 2 Tunneling Protocol)协议的一个结构体,包含了两个LCP接口,用于建立和维护隧道通信。

下面是lcp_itf_pair_create函数的代码:

int
lcp_itf_pair_create (u32 parent_sw_if_index, u32 lcp_sw_if_index,u32 *lcp_pair_sw_if_index)
{vnet_sw_interface_t *sw;lcp_main_t *lm = &lcp_main;lcp_itf_pair_t *pair;int rv;/* Only create LCP interface pairs on Ethernet sub-interfaces */sw = vnet_get_sw_interface_safe (lm->vnet_main, parent_sw_if_index);if (sw == NULL || sw->type != VNET_SW_INTERFACE_TYPE_SUB)return VNET_API_ERROR_INVALID_SW_IF_INDEX;pair = lcp_itf_pair_alloc ();pair->parent_sw_if_index = parent_sw_if_index;pair->lcp_sw_if_index = lcp_sw_if_index;/* Construct the API message */vl_api_lcp_add_del_tunnel_t *mp;mp = vl_msg_api_alloc (sizeof (*mp));memset (mp, 0, sizeof (*mp));mp->_vl_msg_id = ntohs (VL_API_LCP_ADD_DEL_TUNNEL);mp->client_index = lm->my_client_index;mp->context = htonl (0xfeedface);mp->is_add = 1;mp->parent_sw_if_index = htonl (pair->parent_sw_if_index);mp->lcp_sw_if_index = htonl (pair->lcp_sw_if_index);/* Send the API message */rv = vpp_api_write_msg (lm->vl_input_queue, (u8 *) mp);if (rv){clib_warning ("API message failed to write");return -1;}*lcp_pair_sw_if_index = pair - lm->itf_pairs + LCP_ITF_PAIR_ID_OFFSET;return 0;
}

该函数接收3个参数:父接口的索引,LCP接口的索引和LCP接口对的索引。其中,父接口指的是需要建立隧道通信的物理接口或虚拟接口。

首先,函数会通过vnet_get_sw_interface_safe获取父接口的信息,判断其类型是否为VNET_SW_INTERFACE_TYPE_SUB(即以太网子接口)。如果不是,则返回VNET_API_ERROR_INVALID_SW_IF_INDEX错误;否则,继续执行。

接下来,函数会调用lcp_itf_pair_alloc函数分配一个LCP接口对结构体,并将父接口和LCP接口的索引值保存到该结构体中。

然后,函数会构造一个VL_API_LCP_ADD_DEL_TUNNEL类型的API消息。该消息包含以下字段:

  • _vl_msg_id:消息ID,表示该消息的类型。
  • client_index:客户端索引,用于标识消息的来源。
  • context:消息的上下文信息,这里设置为固定值0xfeedface。
  • is_add:表示是添加接口对还是删除接口对。这里设置为1,表示添加。
  • parent_sw_if_index:父接口的索引。
  • lcp_sw_if_index:LCP接口的索引。

最后,函数会调用vpp_api_write_msg函数将API消息写入VPP的输入队列中,并计算出LCP接口对的索引值并返回。

总体来说,lcp_itf_pair_create函数主要用于创建LCP接口对结构体,并将其保存到全局变量lcp_main中,同时向VPP发送一个消息,以便VPP可以在内部建立L2TP隧道通信。

Dpdk/网络协议栈/vpp 相关学习资料、视频教程学习群:739729163