ZBLOG

如何添加一条测量规则,举例说明

要添加一条测量规则,需要使用 DPDK-Meter 库中提供的 API 完成以下步骤:

  1. 创建一个包含匹配条件和与之关联的操作列表的测量规则结构体。
  2. 使用 rte_meter_add() 函数将该规则添加到 DPDK-Meter 库中,并获取分配给该规则的唯一 ID(即 meterid)。
  3. 使用返回的 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 来配置计数器并查询特定计数器的状态。

请注意,这只是一个简单的例子,实际使用时需要根据具体情况进行调整和扩展。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=594

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?