博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DPDK的meter库(双速率三色算法)
阅读量:4205 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
Spring 之依赖注入DI
查看>>
Spring 注解总结
查看>>
Spring 面向切面编程AOP
查看>>
数据库优化 SQL语句优化
查看>>
Spring 各个jar包的作用
查看>>
SpringMVC 出现ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
查看>>
SpringMVC 过滤器HiddenHttpMethodFilter
查看>>
SpringMVC 返回json数据报错IllegalArgumentException: No converter found for return value of type:xxx
查看>>
SpringMVC 基本配置文件
查看>>
Velocity 模板出现NestedIOException: Cannot find Velocity template for URL [layout.vm]
查看>>
Velocity 模板基本用法
查看>>
SpringMVC 使用总结
查看>>
Mybatis 出现Mapped Statements collection does not contain value for xxx
查看>>
Mybatis 解决字段名与实体类属性名不相同的冲突
查看>>
Mybatis Generator最完整配置详解
查看>>
Mybatis 一级缓存和二级缓存
查看>>
Hibernate 出现Unsupported major.minor version 52.0 [duplicate]
查看>>
Hibernate 使用Intellij IDEA自动生成.hbm.xml文件
查看>>
Hibernate 出现org.hibernate.MappingNotFoundException: resource:**.hbm.xml not found问题的解决方案
查看>>
Hibernate 注解使用总结
查看>>