LINUX协议栈详解 流控TC

本文深入探讨Linux协议栈中的流控技术,特别是TC(Traffic Control)。文章介绍了Qdisc_ops结构体及其在数据包发送过程中的作用,包括enqueue和dequeue操作。详细讲解了noop_qdisc、pfifo_fast_ops等默认QoS策略,并阐述了如何通过register_qdisc自定义模块进行TC操作。此外,还提及了dev_queue_xmit函数的工作流程和ingress流控的基本概念。后续将继续研究TC命令、内核实现及编写自定义流控模块。
摘要由CSDN通过智能技术生成

在数据包发送一节提到了流控TC的实现,现在进一步研究。

数据包发送是通过dev_queue_xmit实现的,
if (q->enqueue) {
 
                 rc = __dev_xmit_skb(skb, q, dev, txq);
                 goto out;
}

如果有enqueue则说明进行流控,否则直接发送。

参考函数__dev_xmit_skb,我们可以看到对skb进行了enqueue操作,并__qdisc_run开始触发软中断。

struct Qdisc_ops定义了QoS相关的操作,最主要的是enqueue和dequeue。

当一个网卡注册时,调用int register_netdevice(struct net_device *dev),负责初始化网卡TC的是

 

void dev_init_scheduler(struct net_device*dev)
{
         dev->qdisc= &noop_qdisc;
         netdev_for_each_tx_queue(dev,dev_init_scheduler_queue, &noop_qdisc);
         if(dev_ingress_queue(dev))
                   dev_init_scheduler_queue(dev,dev_ingress_queue(dev), &noop_qdisc);
 
         setup_timer(&dev->watchdog_timer,dev_watchdog, (unsigned long)dev);
}

dev的qdisc被
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值