要添加一条测量规则,需要使用 DPDK-Meter 库中提供的 API 完成以下步骤:
- 创建一个包含匹配条件和与之关联的操作列表的测量规则结构体。
- 使用
rte_meter_add()
函数将该规则添加到 DPDK-Meter 库中,并获取分配给该规则的唯一 ID(即meterid
)。 - 使用返回的
meterid
和其他参数来配置计数器或更新已有计数器。
下面是一个简单的例子,演示如何在 DPDK-Meter 库中添加一个基于 IP 地址和端口号匹配的测量规则:
#include <rte_meter.h>
...
// 定义匹配条件
struct rte_meter_trtcm_params trtcm_params = {
.cir = 1000, // 承诺信息速率
.pir = 2000, // 峰值信息速率
.cbs = 8000, // 承诺字节大小
.pbs = 16000, // 峰值字节大小
};
struct rte_meter_trtcm_profile trtcm_profile;
rte_meter_trtcm_config(&trtcm_profile, &trtcm_params);
// 创建一个新的测量规则结构体并初始化它
struct rte_meter_srtcm_params srtcm_params;
memset(&srtcm_params, 0, sizeof(struct rte_meter_srtcm_params));
srtcm_params.cir = 500; // 承诺信息速率
struct rte_meter_srtcm_profile srtcm_profile;
rte_meter_srtcm_config(&srtcm_profile, &srtcm_params);
struct rte_meter_policy policy = {
.alg = RTE_METER_TRTCM,
.trtcm_params = trtcm_params,
};
struct rte_meter_trtcm *mtr;
// 将测量规则添加到 DPDK-Meter 库中并获取唯一 ID
uint32_t meter_id = rte_meter_add(RTE_METER_TRTCM, &policy);
if (meter_id == 0) {
printf("Failed to add meter rule\n");
}
// 使用返回的 ID 配置计数器
struct rte_red_config red_cfg;
memset(&red_cfg, 0, sizeof(struct rte_red_config));
red_cfg.min_th = 10;
red_cfg.max_th = 20;
red_cfg.maxp_inv = 10;
struct rte_meter_trtcm_config mcfg = {
.trtcm_profile.sr_tck_hz = hz,
.trtcm_profile.trtcm_params = trtcm_params,
.tc_ticks_per_sec =
mtr->params.trtcm_profile.sr_tck_hz / mtr->params.trtcm_params.cir,
};
struct rte_meter_stats stats;
memset(&stats, 0, sizeof(stats));
struct rte_meter_trtcm_result result;
for (;;) {
// 处理输入包,匹配规则并更新对应的计数器
...
// 查询特定计数器并显示其状态
int rc = rte_meter_trtcm_color_blind_check(mtr, &result);
if (rc < 0) {
printf("Failed to check traffic color\n");
return -1;
}
printf("Meter ID: %u\n", meter_id);
printf("CIR: %u, CBS: %u\n", trtcm_params.cir, trtcm_params.cbs);
printf("PIR: %u, PBS: %u\n", trtcm_params.pir, trtcm_params.pbs);
printf("Tc ticks per second: %lu\n", mtr->params.tc_ticks_per_sec);
printf("Packet color: ");
switch (result.color) {
case RTE_COLOR_GREEN:
printf("GREEN");
break;
case RTE_COLOR_YELLOW:
printf("YELLOW");
break;
case RTE_COLOR_RED:
printf("RED");
break;
default:
printf("UNKNOWN");
break;
}
}
在上面的示例中,我们首先定义了一个 rte_meter_trtcm_profile
结构体,该结构体包含 TCM 流量控制算法的参数。 然后我们创建了一个新的测量规则,并使用 rte_meter_add()
函数将其添加到 DPDK-Meter 库中。最后,我们使用返回的唯一 ID 来配置计数器并查询特定计数器的状态。
请注意,这只是一个简单的例子,实际使用时需要根据具体情况进行调整和扩展。