通常网卡驱动代码量比较大,但是都离不开发送与接收,掌握好骨干也就好理解与调试了。

数据发送 :

发送函数:xxx_start_xmit()

上层封装好了sk_buff丢进kernel后,buf存储在skb->data中,通 过 xxx_start_xmit(),发送出去。
下面的实例是通过写入某个设备节点发送出去,当然这个设备肯定是串口或者sdio等传输设备,
也可以直接调用写入函数将buf送出去。

比如sdio的写入:
sdio_memcpy_toio(xxx->func, addr, buf, sizeof(buf));

net_device_ops结构体的填充,在里实现了open与发送等操作:

static const struct net_device_ops xxx_netdev_ops = {.ndo_open = xxx_net_open,.ndo_stop = xxx_net_stop,.ndo_start_xmit = xxx_start_xmit,.ndo_get_stats =  xxx_get_stats,.ndo_tx_timeout = xxx_tx_timeout,
};static int xxx_start_xmit(struct sk_buff *skb, struct net_device *dev){---------nwrite = filep->f_op->write(filep, skb->data, skb->len, &filep->f_pos);set_fs(old_fs);if (nwrite == skb->len) {priv->stats.tx_packets++;priv->stats.tx_bytes +=skb->len;priv->netdev->trans_start = jiffies;}-----------
}

数据接收:

目前我所看到的接收触发都是在中断(低速串口与sdio card)里面读取到buf后异步调用netif_rx()提交到网络栈,
对于sdio card的接收数据是host端接收到中断后调用到card里面的中断处理函数而读取buf的。另外一种就是软中断来接收,
比如usb与高速串口的数据接收。
netif_rx()是标准的网卡上交sk_buff数据流,通常网卡驱动代码量很大当你找不到接收函数时,搜netif_rx()是最 好的 选择。

下面接收处理函数:首先分配skb数据空间,再将读取的buf存入skb中,再调用netif_rx(),数据报入网络栈。

static int xxx_submit_skb(void *data)
{--------skb = netdev_alloc_skb(ndev, pkt_len + NET_IP_ALIGN); /* NET_IP_ALIGN is 2 */if (!skb) {printk(KERN_INFO "error: out of memory for rx'd frame\n");priv->stats.rx_dropped++;ret = -ENOMEM;goto error;} skb_reserve(skb, NET_IP_ALIGN);memcpy((skb_put(skb, pkt_len), pkt_len),buf,sizeof(buf);skb->dev = priv->netdev;skb->protocol = eth_type_trans(skb, priv->netdev);priv->stats.rx_packets++;priv->stats.rx_bytes += pkt_len;ret = netif_rx(skb);if (ret != 0)printk(KERN_INFO "%s: netif_rx error\n", __func__);--------
}

linux网卡数据流 发送与接收相关推荐

  1. linux snmptrap的发送与接收。

    需求是这样的. 由于需要管理服务器的一些参数,比如CPU使用率,IOwait之类的指标,管理方通过snmpwalk进行五分钟一次对受管服务器的轮询. 此类指标为业务指标,是必须了解的一些参数,另需要有 ...

  2. linux网卡发送数据包流程,linux内核Ethernet以太网卡驱动收发数据过程

    linux内核Ethernet以太网卡驱动收发数据过程 linux内核Ethernet以太网卡驱动收发数据过程 下图简单描述了网卡驱动与Linux内核之间的联系: 关于上图的一些说明: 系统初始化: ...

  3. linux网卡rss支持,ETHTOOL设置网卡接收哈希(RSS)

    ethtool命令设置接收端哈希功能,按照哈希结果将数据流分发到网卡的不同接收队列中.例如以下命令,指定ipv4的tcp数据流中参与哈希的字段(sdfn): / # ethtool --config- ...

  4. (二)树莓派Linux环境串口通信编程--AT指令集的发送和接收

    文章目录 一.前言 二.要了解的知识 2.1 termios结构体 2.2 tcflush() 2.3 cfsetispeed()与cfsetospeed() 三.流程图设计与代码实现 serial_ ...

  5. 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP...

    需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP 需求:过滤下面这个网页里共723行 校对中里 行数为两位数 ...

  6. TX2/Linux下can总线的接收与发送详解!(回环测试)

    https://blog.csdn.net/hhlenergystory/article/details/81976069 TX2具有两个can设备,分别为can0和can1.这两个can设备自带ca ...

  7. Linux串口编程 —— 发送的数据无法被接收,且被原封不动返回

    Linux串口编程--发送的数据无法被接收,且被原封不动返回 问题描述 使用 #include <fcntl.h> /*文件控制定义*/ #include <termios.h> ...

  8. 如何在Linux命令行下发送和接收UDP数据包

    众所周知,在传输层有两个常用的协议 TCP 和 UDP,本文介绍在 Linux 命令行下,如何使用 nc 命令发送或接收 UDP 数据包,这些命令的用法对调试 UDP 通信程序将有所帮助. 1. 问题 ...

  9. linux ibm mq 安装,消息发送与接收

    下载地址 http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/ 安装 1.2 解压并安装 1.2 ...

最新文章

  1. html制作虚拟人物,一种虚拟人物角色直播系统的制作方法
  2. Linux System and Performance Monitoring
  3. 数值分析 pdf_统计分析前,要做哪些数据准备工作?
  4. python中的列表生成式_生成器中的列表推导式
  5. scss-!optional
  6. new Date(date).getTime()的兼容问题
  7. python资料-Python资料汇总(建议收藏)
  8. MySQL优化详解(五)——MySQL分库分表
  9. debug [LTS]
  10. android ukey,Tenorshare 4uKey for Android
  11. 自控原理学习笔记-反馈控制系统动态模型(2)-结构图及信号流图
  12. 【教学类-20-02】20221203《世界杯16强国旗-定量版》(大班)
  13. 匆匆那年—2014年终总结
  14. OpenCV——绘制等高线
  15. 玩回合制手游《问道》心得
  16. 直接存储器存取(DMA)有哪3种工作方式?
  17. 极客日报:Twitter 正谈判收购印度初创公司 ShareChat:欲打造 TikTok 竞品;华为 Mate X2 正式发布...
  18. 剑指 Offer 46. 把数字翻译成字符串(javascript)
  19. 自动化测试脚本-帐号注册到激活
  20. 山东二本学校计算机专业排名,山东二本大学排名及分析

热门文章

  1. springboot+activiti7+react实现模仿钉钉功能的审批流(八、流程面板:待我审批、我已审批、我发起的、抄送我的、所有审批单)
  2. Hadoop的改进实验(中文分词词频统计及英文词频统计)(2/4)
  3. 赚钱 36 计 - 第三十三计:众筹计
  4. Matlab和Python 画矩阵的非零元分布图
  5. 计算机 我们一起学猫叫歌词,我们一起学猫叫歌词 我们一起学猫叫Lrc歌词
  6. 即时通讯工具(IM)的网络营销价值
  7. ipv6端口阻塞(例如比特彗星黄灯)
  8. 数独算法+文件读取+结果保存到文件+Python3版本
  9. 苹果电脑可以进行数据恢复吗
  10. python Ubuntu14.04+SQLSERVER在线显卡DIAG测试+BIOS升级(源码)