Android内核 netdevices.txt文档说明

来源:互联网 发布:c语言if else多个 编辑:程序博客网 时间:2024/06/05 23:59

最近在做can总线驱动开发,趁有时间把英文文档翻译成中文,方便阅读。本文使用的是fsl imx536开发板,英文文档地址:myandroid/kernel_imx/Documentation/networking/netdevices.txt


由于本人刚接触CAN等网络驱动以及英语水平有限,肯定有很多地方翻译的不是很恰当,望高手不吝赐教。


网络设备、内核

 

介绍

下文是随机收集的关于网络设备的文档。

 

net_device结构体分配规则

即使卸载模块后也是继续需要网络设备结构体,而且使用kmalloc函数分配。如果设备注册成功,最后会使用free_netdev释放。还需要利索地解决出错情况(例如:mmod mydriver </sys/class/net/myeth/mtu)。

 

Net_init.c中有处理alloc_etherdev,alloc_netdev常见情况的程序。当网络设备被释放时,需为被释放的驱动私有数据预留额外的地址空间。如果单独分配的数据与网络设备连接(netdev_priv(dev)),则由模块退出处理程序(module exit handler)来释放。

 

MTU

每个网络设备都有一个最大传输单元(MTU),MTU不包含任一链路层协议开销。上层协议不能传递给设备超过MTU的socket缓存数据。MTU不包含链路层头信息开销,因此,例如在以太网上,如果标准的MTU值是1500字节,由于以太网报文头,实际socket缓存将包含高达1514字节。设备应该也考虑到4字节的VLAN报文头。

 

分段卸载(GSO,TSO)是一个例外。上层协议可向设备发送程序传输一个大的socket缓存,然后设备给予当前的MTU把缓存数据打包成单独的数据包。

 

MTU是对称的,同时适用于接收和发送。设备必须能够接收至少由MTU允许的最大的数据包。网络设备可以使用MTU作为接收缓存区大小的机制,但该设备应允许VLAN报头的数据包。与1500字节的标准以太网MTU一样,该设备应允许最多1518字节数据包(1500+14报文头+4标签)。设备可以:drop、truncate或拒绝过大的数据包,但丢弃的过大数据包优先。

 

 

net_device结构体同步规则

dev->open:

                     Synchronization:rtnl_lock() semaphore.

                     Context:process

 

dev->stop:

                     Synchronization:rtnl_lock() semaphore.

                     Context:process

                     Note1:netif_running() is guaranteed false

                     Note2:dev->poll() is guaranteed to be stopped

 

dev->do_ioctl:

                     Synchronization:rtnl_lock() semaphore.

                     Context:process

 

dev->get_stats:

                     Synchronization:dev_base_lock rwlock.

                     Context:nominally process, but don't sleep inside an rwlock

 

dev->hard_start_xmit:

                     Synchronization:netif_tx_lock spinlock.

 

当驱动对dev->features设置为NETIF_F_LLTX,这就是所谓的无固定netif_tx_lock。在此情况下,驱动在需要时必须具备自锁功能。建议在此使用try锁,当自旋锁失败就返回NETDEV_TX_LOCKED。锁定也应该正确地免受set_multicast_list影响。注意:NETIF_F_LLTX的用法被弃用,请勿将其用于新驱动。

 

设备上下文:与主干通讯点相关的进程禁用或BH(定时器),

                          将调用netconsole禁用的中断。

 

返回代码:

NETDEV_TX_OK:一切ok;

NETDEV_TX_BUSY:不能传输数据包,尝试后通常是一个bug,是指队列启动/停止流控制在驱动程序中损坏。注意:驱动程序必须不把socket缓存放在DMA环中。

NETDEV_TX_LOCKED:锁失败,请重试。只有设置了NETIF_F_LLTX,才有效。

 

dev->tx_timeout:

                     Synchronization:netif_tx_lock spinlock.

                     Context: BHsdisabled

                     Notes:netif_queue_stopped() is guaranteed true

 

dev->set_multicast_list:

                     Synchronization:netif_tx_lock spinlock.

                     Context: BHsdisabled

 

napi_struct结构体同步规则

napi->poll:

                     Synchronization:NAPI_STATE_SCHED bit in napi->state. Device

                     driver'sdev->close method will invoke napi_disable() on

                     all NAPIinstances which will do a sleeping poll on the

                     NAPI_STATE_SCHEDnapi->state bit, waiting for all pending

                     NAPI activityto cease.

                     Context: 软中断

                                    将调用netconsole禁用的中断。

 


0 0
原创粉丝点击