ZBLOG

逐步分析一下这段代码 static void dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_, uint32_t meter_id, long long int now) { struct dp_meter *meter; struct dp_meter_band *band; struct dp_packet *packet...

  1. 定义了一些变量,包括流量计指针 meter,带宽指针 band 和数据包指针 packet 等。
  2. 获取数据包数量 cnt,并对 exceeded_band 和 exceeded_rate 数组进行初始化。
  3. 判断输入的 meter_id 是否超出了最大值 MAX_METERS,如果超出了,直接返回。
  4. 调用 meter_lock 函数锁定流量计,然后获取该流量计的结构体。
  5. 计算时间差 long_delta_t 和 delta_t,分别表示当前时间与上次使用时间的差和使用时间的最大间隔。
  6. 更新流量计的统计信息,包括使用时间、数据包数量和字节数。
  7. 根据流量计的配置信息确定每个数据包的体积 volume,即数据包数或比特数。
  8. 遍历所有的带宽,并更新每个带宽的存储桶,同时检查存储桶中的数据包是否超过了带宽限制。如果超过了限制,就记录下第一个超过限制的数据包的序号,并将 exceeded_band 和 exceeded_rate 数组中的相应元素设置为当前带宽的序号和速率。
  9. 遍历所有的数据包,在 exceeded_band 数组中查找是否有带宽被超过的数据包,并根据 exceeded_band 和 exceeded_rate 数组的值来确定应该如何处理每个数据包:如果超过了限制,则将该数据包丢弃或者修改标志位,并统计相关的流量计信息;否则将该数据包加入到输出数据包中。
  10. 最后调用 meter_unlock 函数解锁流量计。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?