【VPP】 VPP之DPO

    DPO,DATA PATH OBJECTS  数据路径对象,表示通过 VPP 的数据路径切换对数据包时所应用的操作。这意味着可以创建和操作的值(通过dpo_id_t的实例),并且具有某些行为(即,它具有执行某些操作的专门方法或函数)。

    FIB 的工作是维护转发信息,以便交换机知道在哪个接口上转发数据包。使用 DPO,可以在 FIB 中添加条目,告诉 VPP 通过DPO将 数据包转发到选择的 VPP 节点。

 

1. DPO API

     使用 DPO 的典型模式是首先创建自己的 DPO 类型,然后创建要与该类型一起使用的 DPO 函数的 API。该 API 的第一部分是用于创建 DPO 实例的构造函数,例如 xxxx_dpo_create:

  dpo_type_t xxx_dpo_type;
void xxx_dpo_create (dpo_proto_t dproto, index_t aftr_index, dpo_id_t * dpo)
{
    dpo_set (dpo, xxx_dpo_type, dproto, aftr_index);
}

    dpo_set 函数采用协议常量,index_t 和dpo_id_t(标识特定DPO的结构)。如果需要也可以直接传入 xxx_dpo_type 来直接使用dpo_set。

    构造函数采用一些参数,即要使用的协议,DPO的索引和要初始化的DPO的指针。

  •     DPO可以专门用于处理具有特定协议的数据包,因为您对它们执行的操作是专门的,并且
  •     DPO可以与多种协议类型一起使用,例如IPv4和IPv6。

    还可以根据匹配的协议将数据包发送到不同的节点。这是通过 API 代码中的一些其他数据结构设置的,如下所示:

const static char *const xxx_ip4_nodes[] = {
  "xxx-encap",
  NULL,
};

const static char *const xxx_ip6_nodes[] = {
  "xxx-decap",
  NULL,
};

const static char *const *const xxx_nodes[DPO_PROTO_NUM] = {
  [DPO_PROTO_IP4] = xxx_ip4_nodes,
  [DPO_PROTO_IP6] = xxx_ip6_nodes,
  [DPO_PROTO_MPLS] = NULL
};

    上面的代码基本上构造了一个表,将 DPO 协议映射到节点名称的数组。 该表并不一定要详尽(相对于DPO使用的所有协议),但是它应该涵盖您要与特定 DPO 类型一起使用的任何协议。

    通过调用 dpo_register_new_type 函数,实际上为映射中指定的节点注册了 DPO 类型:

void xxx_dpo_module_init (void)
{
    xxx_dpo_type = dpo_register_new_type (&xxx_dpo_vft, xxx_nodes);
}

    如果编写自己的 DPO API,则需要在 VPP 插件的初始化代码中注册新的 DPO 类型。 

    在定义 DPO API 时,还定义了一个虚拟函数表结构(dpo_vft_t),该结构传递给上面显示的 dpo_register_new_type 调用。该表可能如下所示:

const static dpo_vft_t dslite_dpo_vft = {
  .dv_lock = dslite_dpo_lock,
  .dv_unlock = dslite_dpo_unlock,
  .dv_format = format_dslite_dpo,
};

    这些字段基本上是为 DPO 类型实现的方法。

 

2. 在转发中使用DPO

    定义 DPO 类型和 API 后,就可以使用它来将数据包转发到 VPP 节点。为了将 DPO 挂接到 FIB,从而可以将数据包切换到节点,需要在插件代码中构造一个 DPO 实例,然后调用注册 FIB 条目的函数。

/* FIB prefix data structure, used below */
fib_prefix_t pfx = {
  .fp_proto = FIB_PROTOCOL_IP6,
  .fp_len = 128,
  .fp_addr.ip6.as_u64[0] = addr->as_u64[0],
  .fp_addr.ip6.as_u64[1] = addr->as_u64[1],
};

/* register FIB entry for DPO */
fib_table_entry_special_dpo_add (0,
                                 &pfx,
                                 /* if you're writing a plugin you use this,
                                    some other DPO code uses other constants */
                                 FIB_SOURCE_PLUGIN_HI,
                                 FIB_ENTRY_FLAG_EXCLUSIVE,
                                 &dpo);
  • 构造一个DPO并将其放在dpo变量中,
  • 声明用于交换的FIB前缀(fib_prefix_t)(可以是IP地址或MPLS标签),以及
  • 使用DPO和FIB前缀将条目添加到FIB。

    添加了该信息后,FIB 可以开始将数据包切换到 DPO 中指定的节点(在本例中为xxx-decap)。当数据包到达您的节点时,将像在您编写的任何其他 VPP 节点中一样对它们进行处理。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值