linux网卡数据流 发送与接收

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

数据发送 :

发送函数: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__);

    --------
}
时间: 2024-07-29 12:08:52

linux网卡数据流 发送与接收的相关文章

linux snmptrap的发送与接收

由于需要管理服务器的一些参数,比如CPU使用率,IOwait之类的指标,管理方通过snmpwalk进行五分钟一次对受管服务器的轮询. 此类指标为业务指标,是必须了解的一些参数,另需要有告警指标信息. 但由于告警信息一般是由受管服务器进行主动告警,这时候就不能通过管理方主动使用snmpwalk来进行,而是由受管服务器通过snmptrap进行. 以下是对双方进行snmptrap的一些设置. 首先是管理方,需要先配置snmptrapd.conf,可以将之放在与snmpd.conf同一个路径下,在我本地

Linux系统下UDP发送和接收广播

// 发送端   02.#include 03.#include 04.#include<sys/socket.h>05.#include 06.#include<sys/types.h>07.#include 08.#include<netinet/in.h>09.#include<arpa/inet.h>10.#include 11.   12.   13.using namespace std;   14.   15.int main()   16.{

Linux网卡bond的七种模式详解

像Samba.Nfs这种共享文件系统,网络的吞吐量非常大,就造成网卡的压力很大,网卡bond是通过把多个物理网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,具体的功能取决于采用的哪种模式. 一.bond的七种模式介绍:1.mode=0(balance-rr)(平衡抡循环策略)链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路.交换机需要配置聚合口,思科叫port channel.特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1-.一直循环

Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函数创建一个套接字: fd = socket(AF_INET, SOCK_STREAM, 0); 以上指定了连接协议,socket调用返回一个文件句柄,与socket文件相应的inode不在磁盘上,而是存在于内存. 之后我们指定监听的port.同意与哪些ip建立连接,并调用bind完毕port绑定:

转:Linux网卡驱动程序编写

Linux网卡驱动程序编写 [摘自 LinuxAID] 工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱.真希望她能在中国迅速成长.把程序文档贴出来,希望和大家探讨Linux技术和应用,促进Linux在中国的普及. Linux操作系统网络驱动程序编写 一.Linux系统设备驱动程序概述 1.1 Linux设备驱动程序分类 1.2 编写驱动程序的一些基本概念 二.Linux系统网络设备驱动程序

Postfix邮件发送和接收实验

Postfix邮件发送和接收实验首先打开三台虚拟机分别是linux.windows7(两台).把三台虚拟机的网卡设置成仅主机模式,linux虚拟机做dns服务器,给两台windows7配置IP和dns地址,IP地址的网段要和dns的地址在同一网段.两台Windows7虚拟机能够ping通dns服务器的地址1.安装dns包bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm2.进行主配置文件的配置3.区域配置文件的配置4.指定邮件交换记录5.开启named服务和关闭防火墙及

Linux网卡高级命令、IP别名及多网卡绑定 转

http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/26/3100065.html 本篇随笔将详细讲解Linux系统的网卡高级命令.IP别名以及Linux下多网卡绑定的知识 一.网卡高级命令 在之前的一篇随笔里Linux学习之CentOS(九)--Linux系统的网络环境配置,详细讲解了Linux系统下的网络环境配置等知识,我们了解了一些关于网络配置的一些基本命令.在这里将补充一些Linux系统下有关网卡的一些高级命令. ①mii-to

L2CAP数据发送和接收

ACL 链路在 Bluetooth 中非常重要,一些重要的应用如 A2DP, 基于 RFCOMM 的应用.BNEP等都要建立 ACL 链路,发送/接收ACL 包.跟大家一起来分析 ACL 包发送/接收流程,以及涉及到的重要 command/event. (一) ACL包发送 以下的图是各种应用层使用 L2CAP 的 API:L2CA_DataWrite 发送数据流的过程,此API继续往下走,我仅分析了正常数据流的走向(临时没有考虑别的情况). watermark/2/text/aHR0cDovL

Linux 网卡驱动学习(二)(网络驱动接口小结)

[摘要]前文我们分析了一个虚拟硬件的网络驱动样例.从中我们看到了网络设备的一些接口.事实上网络设备驱动和块设备驱动的功能比較相似,都是发送和接收数据包(数据请求). 当然它们实际是有非常多不同的. 1.引言 首先块设备在/dev文件夹下有设备节点.而网络设备没有这种设备入口. read,write等常规的文件接口在网络设备下也没有意义. 最大的差别在于:块设备仅仅响应内核的数据请求:而网络设备驱动要异步地接收来自外部的数据包.简单地说.块设备驱动是被要求数据传输而网络设备是主动请求数据传输.网络