- 浏览: 315077 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
JQ_AK47:
...
Linux下直接发送以太包 -
winsen2009:
谢谢分享,如果能再来一个列子就更好了,刚接触看完还是不懂的用
UNPv1_r3读书笔记: SCTP编程
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
5. 流控算法的具体实现 5.1 PFIFO_FAST PFIFO_FAST是缺省的流控算法,网卡初始化时就是设置该算法为网卡的流控算法,算法比较简单,就 在net/sched/sch_generic.c中定义了,没在单独文件中定义。 5.1.1 操作结构定义 #define PFIFO_FAST_BANDS 3 static struct Qdisc_ops pfifo_fast_ops = { .id = "pfifo_fast", // 私有数据是3个skb数据包链表头 .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head), .enqueue = pfifo_fast_enqueue, .dequeue = pfifo_fast_dequeue, .requeue = pfifo_fast_requeue, .init = pfifo_fast_init, .reset = pfifo_fast_reset, .dump = pfifo_fast_dump, .owner = THIS_MODULE, }; 该算法中, 数据队列是3个, 流控算法就是将数据包输入特定的队列, 从特定队列中取数据包。 5.1.2 初始化 static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt) { int prio; // qdisc私有数据指针, 数据包链表头 struct sk_buff_head *list = qdisc_priv(qdisc); // 初始化3个链表头 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) skb_queue_head_init(list + prio); return 0; } 5.1.3 入队 static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc) { // 根据数据包的优先级参数挑一个队列头准备将数据包插入该队列 struct sk_buff_head *list = prio2list(skb, qdisc); // 如果当前队列中的数据包数量小于网卡设备允许的输出队列的数量 // 则将该数据包插入该队列 if (skb_queue_len(list) < qdisc->dev->tx_queue_len) { qdisc->q.qlen++; return __qdisc_enqueue_tail(skb, qdisc, list); } // 否则的话丢弃该数据包 return qdisc_drop(skb, qdisc); } // 选队列处理 static inline struct sk_buff_head *prio2list(struct sk_buff *skb, struct Qdisc *qdisc) { // qdisc私有数据指针, 数据包链表头 struct sk_buff_head *list = qdisc_priv(qdisc); // 根据数据包的优先权值确定队列头偏移值 // skb->priority是个32位整数, 只使用最后4位 return list + prio2band[skb->priority & TC_PRIO_MAX]; } // 优先权值到队列号的变换数组, 该数组体现算法内容, 通过修改该数组可以调整算法效果 // 该数组定义中, 优先值(低4位)为1,2,3,5时使用2号队列, 优先值(低4位)为6,7时使用0号 // 队列, 其他值为1号队列 // 在普通情况下skb->priority都是0, 所有应该只使用了1号队列 // 这个数组实际是根据RFC1349中定义的TOS类型值定义的, 在该RFC中TOS就是只有4位有效 static const u8 prio2band[TC_PRIO_MAX+1] = { 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 }; 5.1.4 出队 static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc) { int prio; struct sk_buff_head *list = qdisc_priv(qdisc); // 循环3个队列 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { // 如果队列非空, 返回队列头的那个数据包 if (!skb_queue_empty(list + prio)) { qdisc->q.qlen--; return __qdisc_dequeue_head(qdisc, list + prio); } } return NULL; } 由此可见, 0号队列有最高优先级, 2号队列优先级最低, 只有高优先级队列中的数据都发送完后才发 送低优先级队列中的数据。 5.1.5 重入队 static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc) { // 队列长度递增 qdisc->q.qlen++; // 使用标准重入队函数将数据插回队列链表 return __qdisc_requeue(skb, qdisc, prio2list(skb, qdisc)); } 5.1.6 复位 static void pfifo_fast_reset(struct Qdisc* qdisc) { int prio; struct sk_buff_head *list = qdisc_priv(qdisc); // 释放三个队列链表中的所有数据包 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) __qdisc_reset_queue(qdisc, list + prio); // 计数清零 qdisc->qstats.backlog = 0; qdisc->q.qlen = 0; } 5.1.7 输出 输出当前算法的内容信息, 由于PFIFO_FAST算法核心就是prio2band数组, 因此就是将该数组内容输 出到数据包供用户空间获取。 static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb) { // TC优先权数组结构 struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS }; // 将当前prio2band数组内容拷贝到选项数据中 memcpy(&opt.priomap, prio2band, TC_PRIO_MAX+1); // 将结构作为路由属性复制到数据包中供返回 RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt); return skb->len; rtattr_failure: return -1; } ...... 待续 ...... 发表于: 2007-07-28,修改于: 2007-07-29 15:30,已浏览3052次,有评论2条 推荐 投诉 网友: burning423 时间:2007-09-21 08:53:33 IP地址:218.108.51.★ 5.1.2 初始化 static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt) { int prio; // qdisc私有数据指针, 数据包链表头 struct sk_buff_head *list = qdisc_priv(qdisc); ........................................ struct sk_buff_head *list = qdisc_priv(qdisc);这语句是怎样得到qdisc的私有数据的?我看了qdisc_priv(qdisc)函数的定义,可还是不是很明白.你能否给我解释一下?谢谢了..刚开始看内核的东西.... 网友: yfydz 时间:2007-09-22 21:44:39 IP地址:123.116.100.★ 每种qdisc定义都包括基本的Qdisc结构和后面一些参数, 大小由prive_size指定, 那些参数就是该qdisc的私有数据, 获取私有数据的指针就是从Qdisc起始位置移动标准Qdisc大小就是了
发表评论
-
Linux内核中流量控制(24)
2011-01-10 16:33 2210本文档的Copyleft归yfydz所 ... -
Linux内核中流量控制(23)
2011-01-10 16:30 1493本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(22)
2011-01-10 16:29 1939本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(21)
2011-01-10 16:28 1357本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(20)
2011-01-10 16:27 1525本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(19)
2011-01-10 16:27 1979本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(18)
2011-01-10 16:26 1572Linux内核中流量控制(18) ... -
Linux内核中流量控制(17)
2011-01-10 16:25 1951本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(16)
2011-01-10 16:25 1807本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(15)
2011-01-10 16:24 1892本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(14)
2011-01-10 16:23 1961本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(13)
2011-01-10 16:22 2638本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(12)
2011-01-10 16:21 2110本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(11)
2011-01-10 16:21 3236本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(10)
2011-01-10 16:20 2007本文档的Copyleft归yfydz所 ... -
Linux内核中流量控制(9)
2011-01-10 16:19 1833本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(8)
2011-01-10 16:18 1498本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(7)
2011-01-10 16:18 2926本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(6)
2011-01-10 16:17 1495本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(5)
2011-01-10 16:16 1730本文档的Copyleft归yfydz所有,使用GPL发布,可以 ...
相关推荐
基于Linux内核扩展模块的P2P流量控制
基于Linux内核的BT流量控制的原理与实现.pdf
基于Linux内核扩展模块的P2P流量控制.pdf
Linux内核扩展模块的P2P流量控制方法与研究.pdf
15.8. 终极的流量控制:低延迟,高速上/下载 98 15.8.1. 为什么缺省设置不让人满意 99 15.8.2. 实际的脚本(CBQ) 100 15.8.3. 实际的脚本(HTB) 102 15.9. 为单个主机或子网限速 103 15.10. 一个完全NAT和QOS的范例...
该方法摒弃了传统方法中所运用的TC命令解析,netlink传输,内核空间执行的3层结构,而直接在Linux内核的框架下,采用LQL库直接对内核进行操控,并改进了相关U32过滤器以对IP段的流量控制,从而实现对系统的智能流量控制。...
在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。Linux的网络系统主要是基于BSD unix的socket机制 。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据...
xt_fset是linux内核netfilter子系统的内核模块和iptables扩展(插件),允许您通过发送控制ICMP数据包来远程操作linux内核ipset(在ipset中添加或删除一些ip地址)。 该插件的创建是对Linux内核netfilter子系统的...
Linux Kernel主要新特性包括:合并了来自Android项目的内核代码,支持新的架构TI C6X,改进了Btrfs...网络优先控制组允许管理员动态设置网络流量的优先次序;支持EFI引导固件;改进内存管理,等等。 Linux Kernel截图
虽然这些工具能够工作,但它们在 Linux2.2 和更高版本的内核上显 得有一些落伍。比如,现在 GRE 隧道已经成为了路由的一个主要概念,但却不 能通过上述工具来配置。 使用了 iproute2,隧道的配置与其他部分完全集成了。
资源描述:TC(Traffic Control)脚本实战指南...TC是Linux内核中强大的网络流量控制和整形工具,适用于网络测试、QoS设置及流量管理等多种场景。本教程适合网络管理员、系统工程师以及对Linux网络管理感兴趣的开发者。
流量控制和拥塞控制 此外,它还补充说: 多路复用流:通过单个连接,您可以多路复用多个信息流。 端点的多宿主:一个端点可以有多个 IP 地址,允许网络故障转移/可靠性(注意:它需要是一台机器,或者复制端点的...
15.2.3 流量控制315 15.3 缓冲区管理和并发控制315 15.4 设备实例:以太网nic316 15.5 isa网络驱动程序321 15.6 atm321 15.7 网络吞吐量322 15.7.1 驱动程序性能322 15.7.2 协议性能323 15.8 查看...
目 录 第1章 引言 1 1.1 演进 1 1.2 gnu copyleft 2 1.3 kernel.org 2 1.4 邮件列表和论坛 3 1.5 linux发行版 3 1.6 查看源代码 4 1.7 编译内核 7 1.8 可加载的模块 8 1.9 整装待发 9 第2章 内核 11 2.1...
络地址转换、流量控制及高级的包处理等。Netfilter/Iptables 系统采用模块化的架构方式,其主要模块 有:通用框架Netfilter、数据包选择系统、连接跟踪系统及NAT系统等等。 2.1 Netfilter/Iptables 系统工作原理 ...
netem 与 tc: netem 是 Linux 2.6 及以上...tc 是 Linux 系统中的一个工具,全名为traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的
如果你仍在使用net-tools,而且尤其需要跟上新版Linux内核中的最新最重要的网络特性的话,那么是时候转到iproute2的阵营了。原因就在于使用iproute2可以做很多net-tools无法做到的事情。对于那些想要转到使用iproute...
7.3. 流量控制 37. socket编程 1. 预备知识 1.1. 网络字节序 1.2. socket地址的数据类型及相关函数 2. 基于TCP协议的网络程序 2.1. 最简单的TCP网络程序 2.2. 错误处理与读写控制 2.3. 把client改为交互式输入 2.4. ...