第十一章 流量控制
linux使用TC作为流量控制工具. 排队规则Qdisc是流量控制的基础.
11.1 排队规则的初始化
struct Qdisc {
...
} noop_qdisc = { ... };
struct Qdisc_ops {
...
} pfifo_fast_ops __read_mostly = {
...
};
网络设备初始化
cs89x0_probe()-->cs89x0_probe1()-->register_netdev()
dm9000_probe()-->register_netdev()
rtl8169_init_module()-->pci_register_driver()-->rtl_init_one()-->register_netdev()-->register_netdevice()-->dev_init_scheduler()
ioctl()-->sock_ioctl()-->dev_ioctl()-->SIOCSIFFLAGS-->dev_ifsioc()-->dev_change_flags()-->IFF_UP-->dev_open()-->dev_activate()-->qdisc_create_dflt()-->qdisc_alloc()
-->pfifo_fast_init()
dev_init_scheduler()为3种网卡设备设置排队规则noop_qdisc
qdisc_alloc()创建排队规则结构
11.2 排队规则的入队和发送
pfifo_fast_enqueue()-->prio2list()
-->__qdisc_enqueue_tail()
-->qdisc_drop()
pfifo_fast_dequeue()-->__qdisc_dequeue_head()
prio2list()根据数据包的优先级选择排队规则的队列头
__qdisc_enqueue_tail()将数据包链入排队规则队列
qdisc_drop()释放数据包
__qdisc_dequeue_head()从队列中摘取数据包
qdisc_run()-->__qdisc_run()-->qdisc_restart()-->dev_hard_start_xmit()
-->dev_requeue_skb()
qdisc_restart()发送数据包
dev_hard_start_xmit()开始发送
dev_requeue_skb()数据包重新入队
阅读(504) | 评论(0) | 转发(0) |