VPP-引流到自己节点的方法

  1. 截获所有的ip4报文进入我们自己的node处理
 ethernet_register_input_type (vm, ETHERNET_TYPE_IP4,
                                     my_node.index);

该函数主要是调用vlib_node_add_next函数将my_node.index添加到ethernet_input_node.index里面去:

vlib_node_add_next (vm,ethernet_input_node.index, node_index);

如果在自己的插件里调用这个节点注册函数,需要注意的是,VPP为了防止l3_next被多次初始化误覆盖,在ip4_init流程中用全局变量next_by_ethertype_register_called做断言。因为插件初始化先于ip4_init,所以如果在插件中调用ethernet_register_input_type,会导致next_by_ethertype_register_called被置1,导致ip4_init时候异常。解决方法是在自己的插件中先调用ip4_init,再调用ethernet_register_input_type
2. 动态改变某个节点的next_index:name1变为name2

node = vec_elt (nm->nodes, index);//获取node
next = vlib_get_node_by_name (vm, (u8 *)name1); 
p = hash_get (node->next_slot_by_node, next->index);//next节点是否挂在node节点下,并得到它的slot(坑)
ret = vlib_node_add_named_next_with_slot (vm, index, name2, p[0]);//用name2节点去替换name1的slot
  1. 引流某个接口的流到指定node
vnet_hw_interface_rx_redirect_to_node (vnet_main_t * vnm, u32 hw_if_index,
				       u32 node_index)

4.将出接口是bvi口的流引到自己的节点

void
l2bvi_register_input_type (vlib_main_t * vm,
                           ethernet_type_t type,
                           u32 node_index);

5.L3 重定向功能:将二层发往三层的流引到自己的节点

ethernet_register_l3_redirect(vm, my_node.index)

6.注册处理某个协议的节点到ip4_local后

  ip4_register_protocol (IP_PROTOCOL_GRE, gre4_input_node.index);

你可能感兴趣的:(VPP,基础架构)