// 1.netpoll的作用:
// 用于让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包,主要用于网络控制台和远程。
// 2.netpoll机制需要驱动程序的支持:
// 使外部通过软件方式调用驱动程序的中断处理程序。
// 大部分poll_controller定义如下:
// void this_controller(struct net_device *dev)
// {
// disable_dev_interrupt(dev);
// call_interrupt_handler(dev->irq, dev);
// enable_device_interrupt(dev);
// }
// 3.netpoll运行条件:
// 3.1 以太网介质
// 3.2 本机l2地址,或者l2广播地址
// 3.3 l3协议为ip协议
// 3.4 ip数据包没有分片,且有效
// 3.5 l4协议为udp协议,且有效
// 4.netpoll在协议栈中的切入点为netif_receive_skb
// 5.static atomic_t trapped;
// trapped用于指示在netpoll_rx执行之后,netif_receive_skb是否丢弃该封包。
// 函数任务:
// 1. 如果入口封包为arp封包,且开启了trapped模式,则处理入口arp,并返回。
// 2. 检查入口skb是否可以被处理。
// 3. 在关中断的情况下,遍历已经注册的netpoll控制块,向其传递skb。
// 调用路径:netif_receive_skb->netpoll_rx
1.1 int netpoll_rx(struct sk_buff *skb)
{
int proto, len, ulen;
struct iphdr *iph;//ip头
struct udphdr *uh;//udp头
struct netpoll *np;//netpoll描述符
struct list_head *p;
unsigned long flags;
//netpoll只适用以太网设备
if (skb->dev->type != ARPHRD_ETHER)
goto out;
//trapped被设置,则由netpoll机制处理入口arp
if (skb->protocol == __constant_htons(ETH_P_ARP) &&
atomic_read(&trapped)) {
arp_r
网络子系统8_netpoll机制
最新推荐文章于 2024-05-05 23:50:22 发布