linux 网络设备驱动之报文接收

这篇具有很好参考价值的文章主要介绍了linux 网络设备驱动之报文接收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从网络上接收报文比发送它要难一些, 因为必须分配一个 sk_buff 并从一个原子性上下
文中递交给上层. 网络驱动可以实现 2 种报文接收的模式: 中断驱动和查询. 大部分驱
动采用中断驱动技术, 这是我们首先要涉及的. 有些高带宽适配卡的驱动也可能采用查询
技术; 我们在"接收中断缓解"一节中了解这个方法.
snull 的实现将"硬件"细节从设备独立的常规事务中分离. 因此, 函数 snull_rx 在硬件
收到报文后从 snull 的"中断"处理中调用, 并且报文现在已经在计算机的内存中.
snull_rx 收到一个数据指针和报文长度; 它唯一的责任是发走这个报文和运行附加信息
给上层的网络代码. 这个代码独立于获得数据指针和长度的方式.
void snull_rx(struct net_device *dev, struct snull_packet *pkt)
{
struct sk_buff *skb;
struct snull_priv *priv = netdev_priv(dev);

/*
*
The packet has been retrieved from the transmission
*
medium. Build an skb around it, so upper layers can handle it
*/
skb = dev_alloc_skb(pkt->datalen + 2);
if (!skb) {
if (printk_ratelimit())
printk(KERN_NOTICE "snull rx: low on mem - packet dropped\n"); priv-
>stats.rx_dropped++; goto out;
}
memcpy(skb_put(skb, pkt->datalen), pkt->data, pkt->datalen);
/* Write metadata, and then pass to the receive level */
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
skb->ip_summed = CHECKSUM_UNNECESSARY; /* don't check it */
priv->stats.rx_packets++;
priv->stats.rx_bytes += pkt->datalen;
netif_rx(skb);
out:
return;
}
这个函数足够普通以作为任何网络驱动的一个模板, 但是在你有信心重用这个代码段前需
要一些解释.
第一步是分配一个缓存区来保存报文. 注意缓存分配函数 (dev_alloc_skb) 需要知道数
据长度. 函数用这些信息来给缓存区分配空间. dev_alloc_skb 使用 atomic 优先级调用
kmalloc , 因此它可以在中断时间安全使用. 内核提供了其他接口给 socket 缓存分配,
但是它们不值得在此介绍; socket 缓存在"socket 缓存"一节中详细介绍.
当然, dev_alloc_skb 的返回值必须检查, snull 这样做了. 我们调用
printk_ratelimit 在抱怨失败之前, 但是. 每秒钟产生成百上千的控制台消息是完全陷
死系统和隐藏问题的真正源头的好方法; printk_ratelimit 帮助阻止这个问题, 通过在
有太多输出到了控制台时返回 0, 事情需要慢下来一点.
一旦有一个有效的 skb 指针, 通过调用 memcpy, 报文数据被拷贝到缓存区; skb_put 函
数更新缓存中的数据末尾指针并返回指向新建空间的指针.
如果你在编写一个高性能驱动, 为一个可以进行完全总线占据 I/O 的接口, 一个可能的
优化值得在此考虑下. 一些驱动在报文接收前分配 sokcet 缓存, 接着使接口将报文数据
直接放入 socket 缓存空间. 网络层通过在可 DMA 的空间( 如果你的设备设置了
NETIF_F_HIGHDMA 标志, 这个空间有可能在高端内存)中分配所有 socket 缓存来配合这
个策略. 这样避免了单独的填充 socket 缓存的拷贝操作, 但是需要小心缓存区的大小,
因为你无法提前知道进来的报文大小. change_mtu 方法的实现在这种情况下也重要, 因
为它允许驱动对最大报文大小改变作出响应.

网络层在搞懂报文的意思前需要清楚一些事情. 为此, dev 和 protocol 成员必须在缓存
向上传递前赋值. 以太网支持代码输出一个帮助函数( eth_type_trans ), 它发现一个合
适值来赋给 protocol. 接着我们需要指出校验和要如何进行或者已经在报文上完成
( snull 不需要做任何校验和 ). 对于 skb->ip_summed 可能的策略有:
CHECKSUM_HW
设备已经在硬件里做了校验. 一个硬件校验的例子使 APARC HME 接口.
CHECKSUM_NONE
校验和还没被验证, 必须由系统软件来完成这个任务. 这个是缺省的, 在新分配的
缓存中.
CHECKSUM_UNNECESSARY
不要做任何校验. 这是 snull 和 环回接口的策略.
你可能奇怪为什么校验和状态必须在这里指定, 当我们已经在我们的 net_device 结构的
特性成员中设置了标志. 答案是特性标志告诉内核我们的设备如何对待外出的报文. 它不
用于进入的报文, 相反, 进入报文必须单独标记.
最后, 驱动更新它的统计计数来记录收到一个报文。 统计结构由几个成员组成; 最重要
的是 rx_packet, rx_bytes, 和 tx_bytes, 分别含有收到的报文数目, 发送的数目, 和
发送的字节总数. 所有的成员在"统计信息"一节中完全描述.
报文接收的最后一步由 netif_rx 进行, 它递交 socket 缓存给上层. 实际上 netif_rx
返回一个整数; NET_RX_SUCCESS(0) 意思是报文成功接收; 任何其他值指示错误. 有 3
个返回值 (NET_RX_CN_LOW, NET_RX_CN_MOD, 和 NET_RX_CN_HIGH )指出网络子系统的递
增的拥塞级别; NET_RX_DROP 意思是报文被丢弃. 一个驱动在拥塞变高时可能使用这些值
来停止输送报文给内核, 但是, 实际上, 大部分驱动忽略从 netif_rx 的返回值. 如果你
在编写一个高带宽设备的驱动, 并且希望正确处理拥塞, 最好的办法是实现 NAPI, 我们
在快速讨论中断处理后讨论它.文章来源地址https://www.toymoban.com/news/detail-787985.html

到了这里,关于linux 网络设备驱动之报文接收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络驱动器设备:ISCSI服务器

    主机名 IP ISCSI服务端 192.168.200.10 ISCSI客户端 192.168.200.20 Windows客户端 192.168.200.30 iSCSI(Internet Small Computer System Interface)是一种将SCSI(Small Computer System Interface)存储协议运行在TCP/IP网络上的技术。它通过使用IP网络来传输SCSI命令和数据,并将存储设备的逻辑单元(LUN)暴露给

    2024年04月28日
    浏览(51)
  • linux usb设备网络共享 usb/ip

    USB设备的网络共享可以通过USB/IP来实现, USB/IP把USB I/O信息封装成TCP/IP格式在网络端传输 ,可以实现usb的全部功能,且跨平台,是个透明的设备共享机制。 -b 后为上面列出的busid ip地址和端口号换成自已的 可以看出串口usb设备已经在客户端显示出来了

    2024年01月23日
    浏览(51)
  • 「Linux系列」Linux网络通讯/系统管理/系统设置/备份压缩/设备管理命令

    Linux网络通讯命令是Linux系统中用于管理和调试网络功能的一系列工具。这些命令可以帮助用户查看网络状态、测试网络连接、查询DNS记录以及进行其他网络相关操作。以下是一些常用的Linux网络通讯命令及其案例: ping命令 功能 :用于检查与目标主机之间的连接是否正常,通

    2024年04月10日
    浏览(49)
  • 深入理解Linux网络技术内幕(八)——设备注册和初始化

    经过前面所学,我们已经知道内核如何验证NIC,以及内核所做的初始化,使得NIC得以和其他设备驱动程序对话。下面我们将讨论初始化的其他步骤: 网络设备何时以及如何在内核注册 网络设备如何利用网络设备数据库注册,并指派一个 net_device 结构的实例。 net_device 结构如

    2024年02月08日
    浏览(51)
  • 网络设备中VRRP协议和Linux服务器中keepalived的两个区别

    VRRP全称是Virtual Router Redundancy Protocol,即虚拟路由冗余协议。它的主要目的是在一个网络中提供冗余的路由。当一个三层网络设备或服务器出现故障时,VRRP可以确保网络仍能正常工作。VRRP通过在这些设备之间使用IP组播或单播通信来实现冗余。它可以确保在网络中有多个物理

    2024年02月02日
    浏览(45)
  • 【完美解决】无线网卡、以太网驱动消失,“没网络”并且重新下载驱动仍然出现感叹号(windows仍在设置此设备的类配置,代码56)解决方法,绝对绝对有效

    最近在玩以前的单机游戏,虐杀原形2,在一个全球做单机游戏的网站购买下载的,自带了作弊器,但是觉得没意思,于是想把作弊器恢复掉,误以为它里面的注册表恢复是恢复外挂的,结果就导致了一系列的问题。 完全没想到,一个注册表恢复让我的以太网驱动以及无线网

    2024年02月09日
    浏览(66)
  • 网络设备的分类和功能、机柜布局、网络设备安装

    1、网络传输介质互联设备 2、网络物理层互联设备 3、数据链路层互联设备 4、网络层互联设备 5、应用层互联设备 中继器是局域网互连的最简单设备,它工作在OSI体系结构的物理层,它接收并识别网络信号,然后再生信号并将其发送到网络的其他分支上。要保证中继器能够正

    2024年01月20日
    浏览(44)
  • 网络设备和网络软件

    网络接口卡又称网络适配器,简称网卡。网卡完成物理层和数据链路层的大部分功能,包括网卡与网络电缆的物理连接、介质访问控制、数据帧的拆装、帧的发送与接收、错误校验、数据信号的编解码、数据的串并行转换等功能。网卡就像一个装卸货的小码头,负责计算机和

    2024年02月22日
    浏览(48)
  • 电脑/设备网络共享给其他设备上网

    现在有如下几种情况: 设备本身不能上网,需要通过电脑上网 笔记本WIFI连热点上网,然后设置网络共享;设备配同网段IP、 网关配电脑的IP。 手机USB网络共享 A设备本身能上网,电脑/其他设备需要通过设备上网 A设备SIM卡上报,其他电脑设备通过连接A的WIFI上网 A设备SIM卡上

    2024年01月22日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包