本文共 2650 字,大约阅读时间需要 8 分钟。
前面一篇讲了dpdk的单速率三色桶算法,这篇解析一下双速率三色桶。
流程和单速率完全相同,区别在于数据结构以及颜色判断的逻辑上。仍然看色盲模式
相比于单速率模式,我感觉双速率模式更好理解,有两个桶C和P以及两个令牌产生速率。两个桶同时跟随时间增加令牌数,超过容量则丢弃。报文速率如果介于cir和pir,超过cir部分的报文返回黄色,低于cir的返回绿色。
报文速率超过pir,所有超过pir部分的报文都返回红色,介于cir和pir部门的返回黄色,低于cir的返回绿色
报文速率低于cir,所有的报文绿色~
struct rte_meter_trtcm { uint64_t time_tc; /* 上次更新C桶的时间 */ uint64_t time_tp; /* 上次更新P桶的时间 */ uint64_t tc; /* C桶当前可用令牌数*/ uint64_t tp; /* P桶当前可用令牌数*/ uint64_t cbs; /* C桶容量*/ uint64_t pbs; /* P桶容量 */ uint64_t cir_period; /* 每隔cir_period*cpu周期,更新C桶 */ uint64_t cir_bytes_per_period; /* 每次更新C桶所需添加的令牌数*/ uint64_t pir_period; /* 每隔pir_period*cpu周期,更新P桶 */ uint64_t pir_bytes_per_period; /* 每次更新P桶所需添加的令牌数*/};PARAMS:struct rte_meter_trtcm_params app_trtcm_params[] = { {.cir = 1000000 * 46, .pir = 1500000 * 46, .cbs = 2048, .pbs = 2048},};初始化:intrte_meter_trtcm_config(struct rte_meter_trtcm *m, struct rte_meter_trtcm_params *params){ uint64_t hz; /* Check input parameters */ if ((m == NULL) || (params == NULL)) { return -1; } if ((params->cir == 0) || (params->pir == 0) || (params->pir < params->cir) || (params->cbs == 0) || (params->pbs == 0)) { return -2; } /* Initialize trTCM run-time structure */ hz = rte_get_tsc_hz(); m->time_tc = m->time_tp = rte_get_tsc_cycles(); m->tc = m->cbs = params->cbs; m->tp = m->pbs = params->pbs; rte_meter_get_tb_params(hz, params->cir, &m->cir_period, &m->cir_bytes_per_period); rte_meter_get_tb_params(hz, params->pir, &m->pir_period, &m->pir_bytes_per_period); RTE_LOG(INFO, METER, "Low level trTCM config: \n" "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 "\n" "\tPIR period = %" PRIu64 ", PIR bytes per period = %" PRIu64 "\n", m->cir_period, m->cir_bytes_per_period, m->pir_period, m->pir_bytes_per_period); return 0;}//颜色判断函数。static inline enum rte_meter_colorrte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m, uint64_t time, uint32_t pkt_len){ uint64_t time_diff_tc, time_diff_tp, n_periods_tc, n_periods_tp, tc, tp; /* Bucket update */ time_diff_tc = time - m->time_tc; time_diff_tp = time - m->time_tp; n_periods_tc = time_diff_tc / m->cir_period; n_periods_tp = time_diff_tp / m->pir_period; m->time_tc += n_periods_tc * m->cir_period; m->time_tp += n_periods_tp * m->pir_period; tc = m->tc + n_periods_tc * m->cir_bytes_per_period; if (tc > m->cbs) tc = m->cbs; tp = m->tp + n_periods_tp * m->pir_bytes_per_period; if (tp > m->pbs) tp = m->pbs; /* Color logic */ if (tp < pkt_len) { m->tc = tc; m->tp = tp; return e_RTE_METER_RED; } if (tc < pkt_len) { m->tc = tc; m->tp = tp - pkt_len; return e_RTE_METER_YELLOW; } m->tc = tc - pkt_len; m->tp = tp - pkt_len; return e_RTE_METER_GREEN;}
转载地址:http://fyali.baihongyu.com/