linux htb 源代码,LINUX TC:HTB相关源码

LINUX TC:HTB相关源码 收藏

HTB(hierarchy token buffer)是linux tc(traffic control)模块中的排队队列的一种。它的配置比CBQ要简单.同时实现功能也很强大。下面,就来看看,HTB在linux中的源码。

1、             Qdisc_ops的注册

先从module_init函数看起(遵从fudan_abc的建议)

static int __init htb_module_init(void)

{

return register_qdisc(&htb_qdisc_ops);

}

上面的code会调用register_qdisc函数,将htb_qdisc_ops注册到系统中,那么htb_qdisc_ops包含了那些内容:

static struct Qdisc_ops htb_qdisc_ops __read_mostly = {

.cl_ops        =     &htb_class_ops,

.id          =     "htb",

.priv_size   =     sizeof(struct htb_sched),

.enqueue     =     htb_enqueue,

.dequeue     =     htb_dequeue,

.peek            =     qdisc_peek_dequeued,

.drop            =     htb_drop,

.init              =     htb_init,

.reset           =     htb_reset,

.destroy      =     htb_destroy,

.dump          =     htb_dump,

.owner         =     THIS_MODULE,

};

可以看出,htb_qdisc_ops其实就是注册了htb管理queue的函数,最重要的莫过于:enqueue 和dequeue函数,它们作用如同它们的名字一样。那么到底将htb_qdisc_ops注册到那了呢?

这就要看看register函数了

static struct Qdisc_ops *qdisc_base;

/*

*qdisc_base 就是系统维护所以qdisc所使用的变量,系统中的所有的qdisc都要

*注册到这变量变量中

*在struct Qdisc_ops中,包含了成员(struct Qdisc_ops *)next

*也就是,所以的qdisc是以链表的形式存在的

*/

int register_qdisc(struct Qdisc_ops *qops)

{

struct Qdisc_ops *q, **qp;

int rc = -EEXIST;

write_lock(&qdisc_mod_lock);

/*

*首先,检测这个qdisc是否已经注册过了,这是通过比较id实现的,

*id的类型是char 数组:char                 id[IFNAMSIZ];IFNAMESIZ=16

*htb的id=”htb”

*/

for (qp = &qdisc_base; (q = *qp) != NULL; qp = &q->next)

if (!strcmp(qops->id, q->id))

goto out;

/*

*然后检测ops中的enqueue、dequeue、peek函数,

*如果这些函数都没有被初始化,将使用noop_qdisc_ops函数来初始化

*noop_qdisc_ops也是Qdisc_ops结构,

*它的作用就像是定义了Qdisc_ops的默认值

*/

if (qops->enqueue == NULL)

qops->enqueue = noop_qdisc_ops.enqueue;

if (qops->peek == NULL) {

if (qops->dequeue == NULL)

qops->peek = noop_qdisc_ops.peek;

else

goto out_einval;

}

if (qops->dequeue == NULL)

qops->dequeue = noop_qdisc_ops.dequeue;

/*

*然后检测cl_ops成员。

*cl_ops是结构Qdisc_class_ops,

*它定义了用于管理挂载到这个qdisc下的所有class(或者qdisc)

*/

if (qops->cl_ops) {

const struct Qdisc_class_ops *cops = qops->cl_ops;

if (!(cops->get && cops->put && cops->walk && cops->leaf))

goto out_einval;

if (cops->tcf_chain && !(cops->bind_tcf && cops->unbind_tcf))

goto out_einval;

}

/*

*最后将新的qops插入到链表的尾部:*qp = qops;

*这样就注册完成了

*/

qops->next = NULL;

*qp = qops;

rc = 0;

out:

write_unlock(&qdisc_mod_lock);

return rc;

out_einval:

rc = -EINVAL;

goto out;

}

EXPORT_SYMBOL(register_qdisc);

Qdisc_class_ops是管理这个tree的,那么看看htb的cl_ops有哪些函数:

static const struct Qdisc_class_ops htb_class_ops = {

.graft           =     htb_graft,

.leaf             =     htb_leaf,

.qlen_notify      =     htb_qlen_notify,

.get              =     htb_get,

.put              =     htb_put,

.change              =     htb_change_class,

.delete         =     htb_delete,

.walk           =     htb_walk,

.tcf_chain   =     htb_find_tcf,

.bind_tcf     =     htb_bind_filter,

.unbind_tcf =     htb_unbind_filter,

.dump          =     htb_dump_class,

.dump_stats      =     htb_dump_class_stats,

};

我们知道,tc qdisc命令添加qdisc到某个设备后,为了对数据包进行分类,需要使用tc filter 来添加fitler到某个qdisc, 当数据包来时,通过fitler来区分数据包,并转发到不同的subqdisc 或者subclass。而绑定fitler都是通过函数:bind_tcf来实现的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维码图像去噪文献调研(1)--Real Image Denoising with Feature Attention

简介 (1) 论文(包括期刊和发表时间): Real Image Denoising with Feature Attention(ICCV 2019) (2) 论文链接: https://arxiv.org/pdf/1904.07396.pdf &…

idea gui插件_给 IDEA 换了酷炫的主题,研发小姐姐看到:feel so high。。。

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]IntelliJ IDEA介绍IDEA,全称 IntelliJ IDEA ,是 Java 语言的集成开发环境, IDEA 在业界被公认为是最好的 java 开发工具之一,尤其在智能 代码助手、代码自动提示、重构、 J2E…

华为荣耀电脑第三方linux,【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏如何?某东入手评测...

这款【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏轻薄笔记本电脑(酷睿i5 8G 512G MX250 IPS)冰河银,看网上评测推荐的,后面网上种草了这款笔记本,用过一段日子了,分享使用感受如下:一、【第三方Linux版】荣耀Ma…

二维码提升对比度文献调研(1)--Fast Image Processing with Fully-Convolutional Networks

简介 (1) 论文 (期刊和发表时间) Fast Image Processing with Fully-Convolutional Networks (ICCV 会议 2017) (2) 论文链接 https://openaccess.thecvf.com/content_iccv_2017/html/Chen_Fast_Image_Processing_ICCV_2017_paper.html (3) 源代码链接 …

python的变量如何理解_Python程序中变量作用范围应该如何理解?

初学Python,自己尝试着写了一个爬虫,主要代码如下import jsonimport scrapyfrom bs4 import BeautifulSoupfrom docx import Documentfrom docx.shared import Ptclass BidsSpider(scrapy.Spider):name bids_spiderallowed_domains [deal.ggzy.gov.cn,…

linux下 c语言 用write open二进制写文件,Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作-Go语言中文社区...

一、前言在做一个镜头的初始化操作,需要加载一个648*522像素大小的文件,厂商提供的是一个excel表,如果要加载数据,可用加载txt文本的方式,我选用二进制方式加载文件;大家都知道电脑真正执行的不是高级语言&…

二维码提升对比度文献调研(2)--Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement

简介 论文 (期刊和发表时间) Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement (CVPR 会议 2020)论文链接 https://openaccess.thecvf.com/content_CVPR_2020/html/Guo_Zero-Reference_Deep_Curve_Estimation_for_Low-Light_Imag…

python打开是什么样子的图片_黑洞6问:黑洞内部是什么样子?黑洞图片发布,理论和实测的碰撞...

在科学领域,没有什么比你在第一次观察或实验结果中验证一个长期的理论预测时更令人兴奋的了。2012年,大型强子对撞机揭示了希格斯玻色子——标准模型中最后未发现的基本粒子的存在。 几年前,LIGO合作直接探测到了引力波,证实了对爱…

linux初学文档,51CTO博客-专业IT技术博客创作平台-技术成就梦想

linux 里 一切皆文件7种文件类型:普通文件 fd 目录b 块设备 /dev/sda /dev/sda1 /dev/sr0c 字符设备 /dev/pts/0 /dev/ tty0#tty 查看字符设备名称l symbolic link 符号链接 软链接(快捷方式)s socket 套接字 网络进程通信的一种方式p pipe 管道 本地进程间的一种通…

二维码提升对比度文献调研(3)--A Low-Complexity Algorithm for Contrast Enhancement of Digital Images

简介 (1)论文(包括期刊和发表时间):A Low-Complexity Algorithm for Contrast Enhancement of Digital Images (2)论文链接: http://www.mecs-press.net/ijigsp/ijigsp-v10-n2/IJIG…

安卓checkbox无响应_【安卓手机】无法连接电脑的解决方法

转自:广西南宁平衡信息技术有限公司,作者:平衡LivY一般在对手机的数据采集过程中,尤其是安卓手机,最令人头疼的就是手机接入电脑后无法识别。相信以下窗口是大家在做手机取证的时候最不想看到的。那么这里大伙就会有疑…

linux s删除第一行,Linux文本处理三驾马车之一sed

sed对"行"操作动作含义a :新增, a 接字串,而这些字串会在新的一行出现(目前的下一行)~sed 1a\llll llllllll \n lllllll t.txtnl /etc/passwd | sed 2a drink teased -i $a# This is a test regular_express.txt ####文…

二维码提升对比度文献调研(4)--Attention Guided Low-light Image Enhancement

简介 (1)论文2: Attention Guided Low-light Image Enhancement with a Large Scale Low-light Simulation Dataset (2)论文链接: https://arxiv.org/pdf/1908.00682v3.pdf (3)源代…

函数传参string_C/C++的三种函数传值方式及其区别

C/C函数传参方式我想很多朋友应该都知道,但是不同传参方式的背后他们的区别是什么我想很多人并不那么清楚。本文就给大家揭露一下各传参方式的区别。传参方式有这三种:值传递、引用传递、指针传递大家可以去看三种传递方式的写法的区别,关于写…

二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement

简介 (1)论文名称: DeepLPF: Deep Local Parametric Filters for Image Enhancement CVPR 2020 (2)论文链接: https://arxiv.org/abs/2003.13985 (3)源代码: https://gi…

c语言单选题大全,C语言单选题(五)

1.C语言结构体类型变量在程序执行期间(C)。A.部分成员驻留在内存中B.只有一个成员驻留在内存中C.所有成员一直驻留在内存中D.没有成员驻留在内存中2.当定义一个结构体变量时,系统分配给它的内存是(D)。A.结构中最后一个成员所需内存量B.结构中第一个成员所需内存量C…

java 匿名函数_Java 理论与实践,闭包之争

Java 语言是否应增加闭包以及如何添加?在跨越边界 系列最近的一篇文章中,我的朋友兼同事 Bruce Tate 以 Ruby 为例描述了闭包的强大功能。最近在安特卫普召开的 JavaPolis 会议上,听众人数最多的演讲是 Neal Gafter 的 “向 Java 语言增加闭包…

二维码识别中面临的主要问题

问题描述 下面有两个二维码的图片: 这两个二维码其实是一样的,也就是二维码码制在设计的时候,其实不需要那么大的黑点,只需要中心一小部分即可。 问题一:在优化二维码的过程中,能否考虑优化边缘部分&…

java对象与c网络语言通信,JAVA与C语言的网络通信代码案例.pdf

java socket 与linux c 通信问题97w211 : 2010-2-09 18:08 :发表于 来源 科技复兴如题,用java 做客户端,linux 的c 程序做服务器端。目前客户端向服务器端发送信息已经没问题,但是在添加服务器端向客户端发送信息的功能时却出现了死循环。在E…

lia人是什么意思_69年属鸡人终身灾难是什么意思

69年属鸡人终身灾难是什么意思69年出生的生肖鸡,他们为人正直,有一颗转速飞快的脑袋,做事勤快,对生活非常乐观,但是因为过于自信总是做一些自己能力还不够的事,有句老话说的好“大难不死,必有后…