Linux内核中流控制.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核中流控制

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性, 严禁用于任何商业用途。 msn: yfydz_no1@ 来源: 1. 前言 linux内核中提供了流量控制的相关处理功能,相关代码在net/sched目录下;而应用层上的控制是通过iproute2软件包中的tc来实现,tc和sched的关系就好象iptables和netfilter的关系一样,一个是用户层接口,一个是具体实现,关于tc的使用方法可详将Linux Advanced Routing HOWTO,本文主要分析内核中的具体实现。 流控包括几个部分: 流控算法, 通常在net/sched/sch_*.c中实现, 缺省的是FIFO, 是比较典型的黑盒模式, 对外只看到入队和出对两个操作; 流控结构的操作处理; 和用户空间的控制接口, 是通过 rtnetlink实现的。 以下内核代码版本为。 2. 控制入口 2.1 控制入口 linux流控功能反映为网卡设备的属性,表明是网络最底层的处理部分, 已经和上层的网络协议栈无关了: /* include/linux/netdevice.h */ struct net_device { /* ?* Cache line mostly used on queue transmit path (qdisc) ?*/ ?/* device queue lock */ ?spinlock_t??queue_lock ____cacheline_aligned_in_smp; // 这是发送数据时的队列处理 ?struct Qdisc??*qdisc; // 网卡停止时保存网卡活动时的队列处理方法 ?struct Qdisc??*qdisc_sleeping; // 网卡处理的数据队列链表 ?struct list_head?qdisc_list; // 最大队列长度 ?unsigned long??tx_queue_len;?/* Max frames per queue allowed */ ?/* Partially transmitted GSO packet. */ ?struct sk_buff??*gso_skb; ?/* ingress path synchronizer */ // 输入流控锁 ?spinlock_t??ingress_lock; // 这是对于接收数据时的队列处理 ?struct Qdisc??*qdisc_ingress; 2.1.2 输出流控 数据发出流控处理时,上层的所有处理已经完成,数据包已经交到网卡设备进行发送,在数据发送时进行相关的流控处理网络数据的出口函数为dev_queue_xmit(); 如果是接收流控, 数据只是刚从网卡设备中收到, 还未交到网络上层处理, 不过网卡的输入流控不是必须的, 缺省情况下并不进行流控,输入流控入口函数为ing_filter()函数,该函数被skb_receive_skb()调用: /* net/core/dev.c */ int dev_queue_xmit(struct sk_buff *skb) { ?struct net_device *dev = skb-dev; ?struct Qdisc *q; ?int rc = -ENOMEM; ?/* Updates of qdisc are serialized by queue_lock. ? * The struct Qdisc which is pointed to by qdisc is now a ? * rcu structure - it may be accessed without acquiring ? * a lock (but the structure may be stale.) The freeing of the ? * qdisc will be deferred until its known that there are no ? * more references to it. ? * ? * If the qdisc has an enqueue function, we still need to ? * hold the queue_lock before calling it, since queue_lock ? * also serializes access to the device queue. ? */ // 获取网卡的qdisc指针, 此出不需要锁, 是各个CPU的私有数据 ?q = rcu_dereference(dev-qdisc); #ifdef C

文档评论(0)

jiuqie957379 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档