我们知道对应每一个设备都有一个或几个发送的队列,它们是在驱动加载的时候就初始化的。
RTL8139的发送队列只有一个,在alloc_netdev_mq中初始化:
tx = kcalloc(queue_count, sizeof(struct netdev_queue), GFP_KERNEL);
if (!tx) {
printk(KERN_ERR "alloc_netdev: Unable to allocate "
"tx qdiscs./n");
kfree(p);
return NULL;
}
。。。。。。。。。。。
dev->_tx = tx;
………………………………………………………
而对应于队列有2个状态位:
enum netdev_queue_state_t
{
__QUEUE_STATE_XOFF, 这是个和流控相关的状态,netif_stop_queue,netif_start_queue,netif_wake_queue都是和它有关
__QUEUE_STATE_FROZEN,
};
而对应于每个队列都有个Qdisc结构,它是真正描述队列的数据结构,像排队发送的数据包都存放这里,数据包的出队,入队等策略都是它描述的。
这个是在调用注册函数register_netdevice的时候初始化的dev_init_scheduler 》netdev_for_each_tx_queue。
同时Qdisc也有几个状态位:
enum qdisc_state_t