vpp中的lcp_itf_pair_create函数用于创建LCP接口对。LCP是链路控制协议,主要用于PPP连接建立时进行参数协商和状态维护。
函数原型如下:
int lcp_itf_pair_create (vlib_main_t * vm, u32 sw_if_index);
函数参数说明:
- vm:VPP主循环。
- sw_if_index:接口的软件索引。
函数返回值为0表示成功,否则表示失败。
函数实现过程如下:
先检查指定接口是否存在,如果不存在直接返回错误。
检查指定接口是否已经有对应的LCP接口对,如果已经存在则直接返回成功。
创建一个新的LCP接口对,并把它与指定接口相关联。
初始化LCP接口对的状态信息。
标记指定接口已经有了LCP接口对。
返回成功。
函数实现代码如下:
int
lcp_itf_pair_create (vlib_main_t * vm, u32 sw_if_index)
{
vnet_main_t *vnm = vnet_get_main ();
lcp_itf_pair_t *lip;
vnet_sw_interface_t *si;
/* Check if interface exists */
si = vnet_get_sw_interface_safe (vnm, sw_if_index);
if (!si)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
/* Check if it has LCP pair already */
if (lcp_itf_pair_find (sw_if_index))
return 0;
/* Allocate LCP pair */
pool_get (lcp_itf_pair_pool, lip);
memset (lip, 0, sizeof (*lip));
/* Associate with interface */
lip->sw_if_index = sw_if_index;
/* Initialize state */
lip->state = LCP_STATE_INITIAL;
lip->config_options_sent = 0;
lip->config_options_received = 0;
lip->magic_number_local = LCP_MAGIC_NUMBER;
lip->magic_number_remote = 0;
lip->peer_mru = PPP_MRU;
lip->local_mru = PPP_MRU;
lip->last_real_frame_time = vlib_time_now (vm);
/* Mark interface as having LCP pair */
si->lcp_pair_index = lip - lcp_itf_pair_pool;
return 0;
}