【版权声明:转载请保留出处:blog.csdn.net/gentleliu。邮箱:shallnew*163.com】

网卡驱动为每一个新的接口在一个全局的网络设备列表里插入一个数据结构.每一个接口由一个结构 net_device 项来描写叙述, 它在 <linux/netdevice.h> 里定义。该结构必须动态分配。

进行这样的分配的内核函数是 alloc_netdev, 它有下列原型:

struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *));

sizeof_priv 是驱动的的"私有数据"区的大小;name 是这个接口的名子;这个名子能够有一个 printf 风格的 %d 在里面. 内核用下一个可用的接口号来替换这个 %d。setup 是一个初始化函数的指针, 被调用来设置 net_device 结构的剩余部分。

网络子系统为各种接口提供了一些帮助函数, 包裹着 alloc_netdev。最通用的是 alloc_etherdev, 定义在 <linux/etherdevice.h>,还有其它网络设备接口,如alloc_fcdev ( 定义在 <linux/fcdevice.h> ) 为 fiber-channel 设备, alloc_fddidev (<linux/fddidevice.h>) 为 FDDI 设备, 或者 aloc_trdev (<linux/trdevice.h>) 为令牌环设备。

alloc_etherdev函数原型为:

struct net_device *alloc_etherdev(int sizeof_priv);

当中sizeof_priv 是驱动的的"私有数据"区的大小;这个函数分配一个网络设备使用 eth%d 作为參数 name. 它提供了自己的初始化函数 ( ether_setup )来设置几个 net_device 字段, 使用对以太网设备合适的值。 因此, 没有驱动提供的初始化函数给 alloc_etherdev;

他自己提供的初始化函数ether_setup为:

/**
* ether_setup - setup Ethernet network device
* @dev: network device
* Fill in the fields of the device structure with Ethernet-generic values.
*/
void ether_setup(struct net_device *dev)
{
dev->header_ops = ð_header_ops;
dev->type = ARPHRD_ETHER;
dev->hard_header_len = ETH_HLEN;
dev->mtu = ETH_DATA_LEN;
dev->addr_len = ETH_ALEN;
dev->tx_queue_len = 1000; /* Ethernet wants good queues */
dev->flags = IFF_BROADCAST|IFF_MULTICAST; memset(dev->broadcast, 0xFF, ETH_ALEN); }

EXPORT_SYMBOL(ether_setup);

实际上该函数也是不过负责了一些以太网范围中的缺省值而已。一般alloc_netdev函数提供的setup函数也会调用该函数来设置这些缺省值。

事实上无论使用alloc_netdev函数还是alloc_etherdev函数都不只设置这些缺省值就够了。

既然是编写网络设备驱动,就要完毕网卡的基本功能:收发数据包,统计网卡数据等,所以一般还要设置该结构体里面的这些功能函数指针,而这些函数正是网络设备驱动须要实现的基本功能。所以假设使用函数alloc_netdev分配空间,那么setup函数一般实现为:

{
ether_setup(dev); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29))
dev->netdev_ops = &xxx_netdev_ops;
#else
dev->open = xxx_open;
dev->stop = xxx_stop;
dev->hard_start_xmit = xxx_tx;
dev->get_stats = xxx_stats;
// dev->change_mtu = xxx_change_mtu;
...
#endif
}

假设使用alloc_etherdev函数分配,那么在该函数之后还须要作例如以下设置:

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29))
dev->netdev_ops = &xxx_netdev_ops;
#else
dev->open = xxx_open;
dev->stop = xxx_stop;
dev->hard_start_xmit = xxx_tx;
dev->get_stats = xxx_stats;
// dev->change_mtu = xxx_change_mtu;
...
#endif

事实上二者的区别就是alloc_etherdev函数默认自己主动调用ether_setup函数而且自己主动分配一个网络设备使用 eth%d 作为參数 name,而函数alloc_netdev须要自己传入參数来设置这些项而已。

net_device 结构初始化之后, 传递这个结构给 register_netdev函数完毕注冊。

然后你必需要做的就是实现之前注冊的那些函数,收发函数的具体分析会在后面具体解说。

linux内核数据包转发流程(一):网络设备驱动的更多相关文章

  1. linux内核数据包转发流程(三)网卡帧接收分析

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧,都有其数据结构来处理入口和出口流量,因此,不 ...

  2. linux内核数据包转发流程(二):中断

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 内核在处理2层数据包之前,必须先处理中断系统.设立中断系统,才有可能每秒处理成千的 ...

  3. Linux内核数据包的发送传输

    本文主要讲解了Linux内核数据包的传输流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包发送传输的流程,希望可以对大家有所帮助. ...

  4. [Docker]Docker与Linux ip_forward数据包转发

    背景 今天在一台新虚拟机上需要临时启动一个consul服务,安装Docker后使用docker启动,但是在执行启动命令后发现docker有一个警告: WARNING: IPv4 forwarding ...

  5. Linux内核二层数据包接收流程

    本文主要讲解了Linux内核二层数据包接收流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包接收的流程,希望可以对大家有所帮助.阅 ...

  6. LINUX下的远端主机登入 校园网络注册 网络数据包转发和捕获

    第一部分:LINUX 下的远端主机登入和校园网注册 校园网内目的主机远程管理登入程序 本程序为校园网内远程登入,管理功能,该程序分服务器端和客户端两部分:服务器端为remote_server_udp. ...

  7. Linux内核网络数据包处理流程

    Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...

  8. linux 内核网络数据包接收流程

    转:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面 ...

  9. Linux内核网络报文简单流程

    转:http://blog.csdn.net/adamska0104/article/details/45397177 Linux内核网络报文简单流程2014-08-12 10:05:09 分类: L ...

随机推荐

  1. Atom编辑器试用(Win7)

     看到Atom的官网(https://atom.io/)上说,Atom是A hackable text editor for the 21st Century,是一个基于V8引擎的editor,于是决 ...

  2. 跟我一起学WPF(1):WPF的UI设计语言——XAML

    XAML是什么 XAML全称是Extensible Application Markup Language (可扩展应用程序标记语言),是专门用于WPF技术中的UI设计语言. XAML基础 XAML是 ...

  3. 修改linux下默认的python版本

    首先在终端输入:python --verison 查看本机默认采用的python 版本 接着进入/usr/local/lib 目录查看当前系统中安装了多少个python版本 如果只有一个,就安装你需要 ...

  4. MVC设计模式一

    一:基础知识 1.mvc model view control 2.模型 是应用程序的主体部分,模型表示业务数据与业务逻辑. 一个模型可以为多个视图提供数据 提高了代码的可重用性 3.视图 用户看到的 ...

  5. Servlet中保存的cookie值读取不到

    在设计登录时记住密码功能时,很多时候回使用cookie,在Servlet中保存cookie时,再次访问登录页面,没有读取到保存的cookie值,代码如下: 1 Cookie idCookie = ne ...

  6. merge into issue

    ORA-30926: unable to get a stable set of rows in the source tables 一.经检查,这个错误是由于数据来源表(即语句中,using后面的f ...

  7. sqlldr errors

    sqlldr myUser/myPWD@myCONN control='d:/sqlload/new/test/loader1.ctl' errors=1000000

  8. web服务端安全之暴力破解

    一.暴力破解 指攻击者通过遍历或字典的方式,向目标发起大量请求,通过判断返回数据包的特征来找出正确的验证信息,从而绕过验证机制. 二.常见场景 用户登录处的账号密码暴力破解: 人机验证机制容易绕过,如 ...

  9. Revit二次开发示例:DeleteObject

    在本例中,通过命令可以删除选中的元素. 需要注意的是要在代码中加入Transaction,否则的话会出现Modifying  is forbidden because the document has ...

  10. Git 统计提交代码行数

    指定用户名 git log --author="your_name_here" --pretty=tformat: --numstat | awk '{ add += $1; su ...