请告诉我linux中网络数据包遍历的查询

时间:2013-04-04 12:04:31

标签: network-programming linux-kernel linux-device-driver kernel

我正在链接networkkernel.pdf

上阅读了解linux网络内部一书以及Linux内核空间中的pdf 网络数据包捕获

在主题9.2.2 下的了解linux网络内部 中,它被赋予了

  

处理输入框架的代码分为两部分:首先,驱动程序将帧复制到内核可访问的输入队列中,然后内核对其进行处理(通常将其传递给专用于关联的处理程序) IP等协议。第一部分在中断上下文中执行,可以抢占第二部分的执行。

现在查询是在第二部分安排的时候?谁安排他们?调用是在中断处理程序中给出的吗?在 Linux内核空间中的网络数据包捕获中,数据包输入流程描述为: -

When working in interrupt driven model, the nic registers an
interrupt handler;
• This interrupt handler will be called when a frame is received;
• Typically in the handler, we allocate sk buff by calling

    dev alloc skb();

• Copies data from nic’s buffer to this struct just created;
• nic call generic reception routine `netif_rx();`
• `netif rx()` put frame in per cpu queue;
• if queue is full, drop!
• net rx action() decision based on skb->protocol;
• This function basically dequeues the frame and delivery a copy
for every protocol handler;
• ptype all and ptype base queues

我想知道什么时候netif rx();和net rx action()被调用?谁叫他们我的意思是谁安排他们。

请指导。

1 个答案:

答案 0 :(得分:0)

此调度由NAPI结构完成。 Packets由所描述的方法分解。当存在“活锁”问题或数据包溢出时,这种情况就会出现;这些是handled

数据包出口比数据包入口复杂得多,实现了队列管理和QOS(甚至可能是数据包整形)。 “Queue Discplines”用于实现用户可指定的QOS policies


NAPI结构安排:

对于NAPI结构,defined为;它的司机Design & Hardware Architecture

Linux使用kso​​ftirqd作为一般解决方案来安排softirq在下一次中断之前运行并将它们置于调度程序控制之下。这也可以防止连续的softirq独占CPU。这也会导致在运行CPU密集型应用程序和网络时需要考虑ksoftirq的优先级,以实现softirq /用户平衡的适当平衡。据报道,将ksoftirq优先级提高到0(最终更多)可以解决高CPU负载下网络性能低的问题。

还有一篇关于NAPI Scheduling的研究论文。