3.4 数据接收流程
网络驱动程序实现了两种模式接收数据包:中断和轮询。?
大多数驱动程序实现了中断驱动技术,中断处理函数判断中断的类型,如果为接收中断,则读取接收到的数据,分配一个保存数据包的sk_buff套接字缓冲区,将接收到的数据复制到缓冲区,并调用netif_rx()函数将数据包交给上层协议。netif_rx()里数据放入处理队列然后返回,真正的处理是在中断返回以后,这样可以减少中断时间。调用netif_rx()以后,驱动程序就不能再存取数据缓冲区skb。
Static void xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)
{
…
switch(status &IRQ_EVENT_MASK)
{
Case IRQ_EVENT_MASK:
Xxx_rx(dev);break;
…
}
}
Static void xxx_rx(struct xxx_device *dev)
{
…
Length = get_rev_len(…);
Skb = dev_alloc_skb(length + 2);
Skb_reserve(skb,2);
Skb -> dev = dev;
Insw(ioaddr + rx_frame_port,skb_put(skb,length),length>>1);
If(length &1)
Skb->data[length-1] = inw(ioaddr+rx_frame_port);
Skb->protocal = eth_type_trans(skb_dev);
Netif_rx(skb);
Dev->last_rx = jiffies;
…
}
3.5 网络连接状态
网络设备驱动程序中往往设置一个定时器来对链路状态进行周期性的检查。当定时器到期之后,在定时器处理函数中读取物理设备的相关寄存器获得载波状态,从而更新设备的连接状态。
有的驱动程序也通过中断寄存器来检查链路状态的变化,网络适配器硬件电路可以检测出链路上是否有载波,载波反映了网络的连接是否正常。网络设备驱动可以通过netif_carrier_on()和netif_carrier_off()函数改变设备的连接状态,如果驱动检测到连接状态发生变化,也应该以netif_carrier_on()和netif_carrier_off()函数显示的通知内核,而函数netif_carrier_ok()可以用于向条用着返回链路上的载波信号是否存在。
Void netif_carrier_on(struct net_device *dev);
Void netif_carrier_off(struct net_device *dev);
Void netif_carrier_ok(struct net_device *dev);
文章评论(0条评论)
登录后参与讨论