调用Linux 内核提供的 netif_stop_queue( ) 函数,停止设备传输包。 释放设备所使用的I/O区域、中断和 DMA 资源。 Linux 内核提供的 netif_start_queue( ) 和 netif_stop_queue( ) 连个函数的原型为: staticinlinevoidnetif_tx_start_queue(structnetdev_queue *dev_queue) { clear_bit(__QUEUE_STATE_DRV_...
netif_start_queue()函数主要用来使能设备使用的硬件资源, 比如申请I/O区域、 中断和DMA通道等,激活设备发送队列;netif_stop_queue()函数主要用来停止设备传输,释放申请的资源。 四、数据发送流程 Linux网络子系统在启动发送流程时, 会调用驱动程序提供的hard_start_transmit()函数, 该函数用于启动数据包的发送。 在...
例如,在网络队列子系统停止一个设备队列时,它调用函数 netif_stop_queue,这个函数的定义如下: static inline void netif_stop_queue(struct net_device *dev) { ... set_bit(_ _LINK_STATE_XOFF, &dev->state); } trans_start: 最后一个帧开始发送的时间(用jiffies度量)。设备驱动在发送之前设置这个变量。
&dev_queue->state);}voidnetif_start_queue(structnet_device*dev){netif_tx_start_queue(netdev_get_tx_queue(dev,0));}/*开启全部发送队列:*/voidnetif_tx_start_all_queues(structnet_device*dev){unsignedinti;for(i=0;i<dev->num_tx_queues;i++){structnetdev_queue*txq=netdev_get_tx_queue...
netif_start_queue打开输出队列,这个和普通设备没有区别(具体参考《UNLI》)。然后是Multicast和STP部分,这就不细说了。br_dev_close是br_dev_open的反过程。 static int br_dev_open(struct net_device *dev) { struct net_bridge *br = netdev_priv(dev); netdev_update_features(dev); netif_start_...
网络协议栈处理://file: net/core/dev.cint netif_receive_skb(struct sk_buff *skb){//RPS处理逻辑,先忽略 ... return __netif_receive_skb(skb);}static int __netif_receive_skb(struct sk_buff *skb){ ... ret = __netif_receive_skb_core(skb, false);}static int __netif_re...
4.2 所以,hard_start_xmit()发包函数处理步骤如下所示: 1)把数据包发出去之前,需要使用netif_stop_queue()来停止上层传下来的数据包, 2)设置寄存器,通过网络设备硬件,来发送数据 2)当数据包发出去后, 再调用dev_kfree_skb()函数来释放sk_buff,该函数原型如下: ...
2、调用网卡驱动发送报文时,使用锁dev->dev_queue->_xmit_lock来保护,防止多个cpu核同时操作网络设备。使用宏HARD_TX_LOCK来上锁。 dev->dev_queue->xmt_lock_owner记录持有该锁的cpu id. staticinlinevoid__netif_tx_lock(structnetdev_queue*txq,intcpu){spin_lock(&txq->_xmit_lock);txq->xmit_lock...
struct net_device *dev, struct netdev_queue *txq, spinlock_t *root_lock) { //调用驱动程序来发送数据 ret = dev_hard_start_xmit(skb, dev, txq); } 4.6 软中断调度 在4.5 咱们看到了如果系统态 CPU 发送网络包不够用的时候,会调用 __netif_schedule 触发一个软中断。该函数会进入到 __netif_...
struct net_device *dev, struct netdev_queue *txq, spinlock_t *root_lock) { //调用驱动程序来发送数据 ret = dev_hard_start_xmit(skb, dev, txq); } 4.6 软中断调度 在4.5 咱们看到了如果系统态 CPU 发送网络包不够用的时候,会调用 __netif_schedule 触发一个软中断。该函数会进入到 __netif_...