linux内核网卡中断收发包

1、网卡中断收发包上半部注册

        1.1、网卡驱动调用request_irq(dev->irq, i596_interrupt, 0, "i82596", dev)函数申请中断号并传入中断上半部处理函数;

        1.2、request_irq将网卡驱动注册的中断号和中断上半部处理函数添加到ino_buket中断链表;

2、中断上半部的执行

        2.1、cpu在收到硬件发出的中断时,通过在ino_buket中断链表查找对应中断号的中断上半部处理函数并执行;

        2.2、中断上半部处理函数读取网卡寄存器状态:

                a、若为发包中断:

                        1、读取发包状态,发包成功调dev_kfree_skb_irq置位发包中断下半部标志,发包失败进行统计计数后调dev_kfree_skb_irq置位发包中断下半部标志;

                         2、清除硬件中断标记;

                b、若为收包中断:

                         1、读取收包状态:若网卡硬件收包成功,申请skb_buffer,将网卡硬件中的包拷贝到skb并在skb中记录网卡设备和以太协议类型后调netif_rx;

                         2、netif_rx函数

                                 a、若为轮询收包调轮询收包接口进行收包后释放skb;

                                 b、若为中断收包,中断收包队列有空闲空间将skb入队到中断收包队列后退出;若中断收包队列无空

猜你喜欢

转载自blog.csdn.net/qq_29044159/article/details/107447782