查询方式(发送)
netpoll_poll_dev实际上调用netpoll_send_skb_on_dev,后者依次完成以下工作:
1、如果该接口上没有待输出的数据包,则直接调用底层驱动的ndo_start_xmit方法发出数据包,此过程重复1个时钟节拍,操作间隔为50us;
2、如果在第一步中每一次尝试发出数据包没有获得成功的话,则调用netpoll_poll_dev去处理该接口上的其他查询任务;
3、如果该接口上已经有待处理的数据包或者当前的数据包没有成功的发出去,则把当前的数据包加入到npinfo的txp队列尾部,然后调度queue_process去处理那些没有发出去的数据包;
注意:netpoll_send_skb_on_dev直接发送数据包和queue_process发送数据包不能同时运行。
queue_process函数实际上就是持续发出npinfo的txp队列上的数据包直到以下条件满足:
1、如果SKB所在的传输队列被停掉或者底层网卡已经无法再继续处理数据包时,则延时调度queue_process函数在至少HZ/10时间以后再来处理剩余的数据包;
2、如果所有的数据包都顺利的处理完成的话,则停止该工作的运行;
netpoll_poll_dev完成的工作包括:
1、调用底层驱动函数的ndo_poll_controller方法查看网卡的收发情况以及是否出错,然后进行相应的处理;
2、执行所有在该接口上注册的NAPI任务;