【C语言】linux内核ipoib模块 - ipoib_send

一、中文注释

int ipoib_send(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn)
{struct ipoib_dev_priv *priv = ipoib_priv(dev); // 获取IPoIB设备的私有数据struct ipoib_tx_buf *tx_req; // 发送请求结构体int hlen, rc; // 分别为头部长度和返回码void *phead; // 要发送数据包的头部指针unsigned int usable_sge = priv->max_send_sge - !!skb_headlen(skb); // 计算可用的Scatter/Gather Element的数量// 检查是否为GSO分段传输的skbif (skb_is_gso(skb)) {hlen = skb_transport_offset(skb) + tcp_hdrlen(skb); // 计算GSO的头部长度phead = skb->data; // 获取skb数据的头部指针// 如果skb_pull返回错误,则skb数据区太小if (unlikely(!skb_pull(skb, hlen))) {ipoib_warn(priv, "linear data too small\n");++dev->stats.tx_dropped; // 统计丢弃的包++dev->stats.tx_errors; // 统计错误数dev_kfree_skb_any(skb); // 释放skbreturn -1;}// 非GSO传输的处理} else {// 如果skb的长度过长,则丢弃if (unlikely(skb->len > priv->mcast_mtu + IPOIB_ENCAP_LEN)) {ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",skb->len, priv->mcast_mtu + IPOIB_ENCAP_LEN);++dev->stats.tx_dropped; // 统计丢弃的包++dev->stats.tx_errors; // 统计错误数ipoib_cm_skb_too_long(dev, skb, priv->mcast_mtu); // 处理过长的skbreturn -1;}phead = NULL; // 无需处理头部hlen  = 0; // 头部长度为0}// 检查是否存在太多的skb碎片if (skb_shinfo(skb)->nr_frags > usable_sge) {// 尝试线性化skb,如果有错误则丢弃if (skb_linearize(skb) < 0) {ipoib_warn(priv, "skb could not be linearized\n");++dev->stats.tx_dropped; // 统计丢弃的包++dev->stats.tx_errors; // 统计错误数dev_kfree_skb_any(skb); // 释放skbreturn -1;}// 即使线性化后,碎片数仍然过多则丢弃if (skb_shinfo(skb)->nr_frags > usable_sge) {ipoib_warn(priv, "too many frags after skb linearize\n");++dev->stats.tx_dropped; // 统计丢弃的包++dev->stats.tx_errors; // 统计错误数dev_kfree_skb_any(skb); // 释放skbreturn -1;}}ipoib_dbg_data(priv,"sending packet, length=%d address=%p dqpn=0x%06x\n", // 调试信息:将要发送的数据包信息skb->len, address, dqpn);// 使用tx_ring队列缓存skb,在确保所有记录和状态一致后调用post_send()tx_req = &priv->tx_ring[priv->tx_head & (priv->sendq_size - 1)];tx_req->skb = skb;// 如果skb长度小于内联阈值并且没有分段,则进行内联发送if (skb->len < ipoib_inline_thold &&!skb_shinfo(skb)->nr_frags) {tx_req->is_inline = 1;priv->tx_wr.wr.send_flags |= IB_SEND_INLINE;} else {// 处理DMA映射if (unlikely(ipoib_dma_map_tx(priv->ca, tx_req))) {++dev->stats.tx_errors; // 统计错误数dev_kfree_skb_any(skb); // 释放skbreturn -1;}tx_req->is_inline = 0;priv->tx_wr.wr.send_flags &= ~IB_SEND_INLINE;}// 设置校验和if (skb->ip_summed == CHECKSUM_PARTIAL)priv->tx_wr.wr.send_flags |= IB_SEND_IP_CSUM;elsepriv->tx_wr.wr.send_flags &= ~IB_SEND_IP_CSUM;// 如果发送队列满了,则暂停网络队列if (atomic_read(&priv->tx_outstanding) == priv->sendq_size - 1) {ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");netif_stop_queue(dev); // 停止内核网络队列}skb_orphan(skb); // 取消与所有者的关联skb_dst_drop(skb); // 丢弃路由缓存项// 如果网络队列停止,则请求在发送完CQ后通知,以便我们可以唤醒它if (netif_queue_stopped(dev))if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP |IB_CQ_REPORT_MISSED_EVENTS) < 0)ipoib_warn(priv, "request notify on send CQ failed\n");rc = post_send(priv, priv->tx_head & (priv->sendq_size - 1), // 调用post_send函数发送数据包address, dqpn, tx_req, phead, hlen);if (unlikely(rc)) {ipoib_warn(priv, "post_send failed, error %d\n", rc); // 如果post_send出现错误,记录错误信息++dev->stats.tx_errors; // 统计错误数if (!tx_req->is_inline)ipoib_dma_unmap_tx(priv, tx_req); // 如果不是内联则释放DMA映射dev_kfree_skb_any(skb); // 释放skbif (netif_queue_stopped(dev)) // 如果网络队列停止,则唤醒netif_wake_queue(dev);rc = 0; // 将返回码设置为0} else {netif_trans_update(dev); // 更新最后一个传输的时间戳rc = priv->tx_head; // 设置返回码为当前的tx_head++priv->tx_head; // tx_head自增,为下一次发送做准备atomic_inc(&priv->tx_outstanding); // 增加未决的发送操作计数}return rc; // 返回操作结果,成功发送则返回tx_head,失败返回0
}

这个函数是一个Linux内核的网络设备发送函数,用于IP over InfiniBand (IPoIB) 模块。它负责准备并发送用户数据包(skb),并操作网络设备统计信息和发送队列。当不能正确发送或者处理数据包时,该函数将适当地释放资源,并通过相应的返回码和内部统计来标识错误的发生。

二、中文讲解

这段代码是一个InfiniBand网络设备的发送函数,用于在IP over InfiniBand(IPoIB)网络中发送数据。以下是对该函数功能的中文讲解:

int ipoib_send(struct net_device *dev, struct sk_buff *skb, struct ib_ah *address, u32 dqpn)

函数`ipoib_send`有四个参数:
- dev表示要发送数据的网络设备。
- skb是一个指向socket缓冲区(数据包)的指针。
- address是远程端点的InfiniBand地址句柄。
- dqpn是目的端口号。
函数内部的变量说明:
- priv是设备的私有数据结构。
- tx_req表示用于发送的缓冲区。
- hlen是头部的长度,表示在何处开始线性化处理(如果是GSO(大尺寸传输优化)数据包)。
- rc是函数返回码。
- phead是指向数据头部的指针。
- usable_sge是扣除头部数据后剩余可用的分散/聚集元素(Scatter/Gather Elements)数量。
代码流程梳理:
1. 首先判断是不是GSO数据包,如果是,则记录下头部信息并处理skb缓冲区。如果skb太小无法处理,则丢弃并返回。
2. 如果不是GSO数据包,但skb长度超出最大传输单元(MTU),也会丢弃数据包并返回。
3. 检查数据包中的片段(frags)数量,如果超过可用的SGE数量,则尝试线性化skb。线性化失败或线性化后frags仍然太多,则丢弃数据包。
4. 设置传输请求结构`tx_req`并决定是否以内联方式发送数据。如果数据长度小于阈值且无frags,则设为内联。
5. 如果传输队列(TX ring)快满了,停止继续入队新的数据包。
6. 为数据包的发送作最后准备,包括释放相关资源,比如删除路由相关信息,并对发送队列和完成队列进行相关的操作。
7. 调用`post_send`来实际发送数据包。
8. 根据发送结果进行处理。如果失败,释放资源,并根据队列状态恢复传输队列或者记录错误。
这段代码的关键点在于管理数据包缓冲区,并且确保数据可以被有效的发送到InfiniBand网络。涉及到内存管理,异步通信,以及在发送之前后处理网络设备状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2806285.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第22天—回溯算法02 | ● *216.组合总和III ● 17.电话号码的字母组合

*216.组合总和III 题目链接/文章讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wg411873x 考点 回溯剪枝 我的思路 回溯三要素 形参&#xff1a;目标和&#xff0c…

如何使用 NFTScan NFT API 在 Mantle 网络上开发 Web3 应用

Mantle Network 是建立在以太坊区块链之上的第 2 层扩展解决方案&#xff0c;采用了 Optimistic Rollups 技术&#xff0c;由 BitDAO 孵化&#xff0c;以提供比以太坊更快速和更经济的交易体验。由于 Mantle 基础链构建在 OP Stack 之上并与 EVM 兼容&#xff0c;因此以太坊网络…

设备树详解

设备树(Device Tree)基本概念及作用 设备树(Device Tree)基本概念 在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的…

【Java程序设计】【C00267】基于Springboot的在线考试系统(有论文)

基于Springboot的在线考试系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统是基于Springboot的在线考试系统&#xff1b;本系统主要分为管理员、教师和学生三种角色&#xff1b; 管理员登录系统后&#xff0c;可以对首页&#x…

Vue3 (unplugin-auto-import自动导入的使用)

安装 参考链接 npm i -D unplugin-auto-importvite.config.ts里面配置 import AutoImport from unplugin-auto-import/viteAutoImport({imports:[ vue,vue-router]})重新运行项目会生成一个auto-imports.d.ts的文件 /* eslint-disable */ /* prettier-ignore */ // ts-nochec…

【kubernetes】二进制部署k8s集群之,多master节点负载均衡以及高可用(下)

↑↑↑↑接上一篇继续部署↑↑↑↑ 之前已经完成了单master节点的部署&#xff0c;现在需要完成多master节点以及实现k8s集群的高可用 一、完成master02节点的初始化操作 二、在master01节点基础上&#xff0c;完成master02节点部署 步骤一&#xff1a;准备好master节点所需…

渗透测试之RCE漏洞

RCE&#xff08;remote command execute&#xff09;远程命令执行。应用程序的某些功能需要调用可以执行的系统命令的函数&#xff0c;如果这些函数或者函数的参数被用户控制&#xff0c;就可能通过命令连接符将恶意的命令拼接到函数中&#xff0c;从而执行系统命令。 常见的命…

ffmpeg深度学习滤镜

环境搭建 安装显卡驱动 当前所用显卡为NVIDIA的P6000,在英伟达的官网上查看对应的驱动, 下载NVIDIA-Linux-x86_64-535.104.05.run并安装。 sudo ./NVIDIA-Linux-x86_64-535.104.05.run 安装成功后用nvidia-smi命令后查看 安装的cuda版本不能超过12.2,选择安装cuda11.8。…

CloudFlare免费内网穿透

介绍 Cloudflare Tunnel是Cloudflare零信任网络的一个产品&#xff0c;用于打通企业、员工、设备之间的边界&#xff0c;从而摒弃掉VPN之类的过时技术&#xff08;其实也不是过时&#xff0c;只不过是相对来说安全性、可控性较差&#xff09; 通过Cloudflare Tunnel&#xff0c…

AOSP10 替换系统launcher

本文实现将原生的launcher 移除&#xff0c;替换成我们自己写的launcher。 分以下几个步骤&#xff1a; 一、新建一个自己的launcher项目。 1.直接使用android studio 新建一个项目。 2.修改AndroidManifest.xml <applicationandroid:persistent"true"androi…

腾讯文档(excel也一样)设置单元格的自动行高列宽

1. 选中单元格 可选择任意一个或者几个 2. 设置自动 行高和列宽 即可生效

ubuntu22.04@Jetson Orin Nano之OpenCV安装

ubuntu22.04Jetson Orin Nano之OpenCV安装 1. 源由2. 分析3. 证实3.1 jtop安装3.2 jtop指令3.3 GPU支持情况 4. 安装OpenCV4.1 修改内容4.2 Python2环境【不需要】4.3 ubuntu22.04环境4.4 国内/本地环境问题4.5 cudnn版本问题 5. 总结6. 参考资料 1. 源由 昨天用Jetson跑demo程…

【加密周报】中美非“出手”压制比特币?以太坊飙涨震醒沉睡8年巨鲸!“AI热潮”刺激相关代币集体拉涨!

回顾本周&#xff0c;中美非三国出现压制加密货币行动&#xff0c;比特币空头暂获胜利&#xff0c;币价最低触及50521美元。以太币表现跑赢比特币&#xff0c;牛市回归下震醒沉睡8年的ICO巨鲸。美国人工智能(AI)热潮下&#xff0c;刺激世界币(Worldcoin)突破历史新高&#xff0…

BlackberryQ10 是可以安装 Android 4.3 应用的,Web UserAgent 版本信息

BlackberryQ10 是可以安装 Android 4.3 应用的 最近淘了个 Q10 手机&#xff0c;非常稀罕它&#xff0c;拿着手感一流。这么好的东西&#xff0c;就想给它装点东西&#xff0c;但目前所有的应用都已经抛弃这个安卓版本了。 一、开发环境介绍 BlackBerry Q10 的 安卓版本是 4.…

智慧应急的未来:物联网技术引领智慧应急发展新趋势

一、引言 随着社会的快速发展&#xff0c;各类突发事件频繁发生&#xff0c;对社会的安全稳定构成了严重威胁。传统的应急管理模式已难以满足现代社会对安全保障的需求&#xff0c;急需探索新型的应急管理手段。在这个背景下&#xff0c;智慧应急应运而生&#xff0c;以其高效…

C语言:指针(一)

目录 1.内存和地址2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 解引用操作符&#xff08;*&#xff09; 2.3 指针变量的大小 3.指针变量的类型和意义3.1 指针的解引用3.2 指针 -指…

4.寻找两个正序数组的中位数

题目&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解题思路&#xff1a;用二分法查找。使用归并的方式&#xff0c;合并两个有序数组&#xff0c;得到一个大的有序数组。大的…

Tomcat信创平替之TongWEB(东方通),安装步骤

我的系统: 银河麒麟桌面系统V10(SP1) 开局先吐槽一下(当然国产也是需要大量时间与金钱的投入),感觉国产软件进入死循环:国家推动国产→国产收费→还要钱?→用国外开源→国产无发普及→靠国家推动 正题: 1.先进入东方通申请使用 2.客服会发送一个TongWEB包与license.dat给你…

匿名+有名管道

管道 相关概念 4种情况 正常情况&#xff0c;如果管道没有数据&#xff0c;读端陷入等待&#xff0c;直到有数据才能唤醒正常情况&#xff0c;如果管道被写满&#xff0c;写端陷入等待&#xff0c;直到有空间才能唤醒写段关闭&#xff0c;读端一直读取&#xff0c;read返回0…

【YOLO v5 v7 v8 小目标改进】归一化高斯 Wasserstein 距离(NWD损失函数)

归一化高斯 Wasserstein 距离&#xff08;NWD损失函数&#xff09; 提出背景归一化Wasserstein距离效果 YOLO v5 小目标改进YOLO v7 小目标改进YOLO v8 小目标改进 提出背景 论文&#xff1a;https://arxiv.org/pdf/2110.13389.pdf 代码&#xff1a;https://github.com/jwwan…