admin 管理员组文章数量: 1184232
目录
一、网卡设备简介
网卡设备主要负责对网络数据包进行收发操作。网卡主要有两个功能: 接收数据 和 发送数据 。它将上层协议传递下来的数据包传递给Linux内核,并且将Linux内核的数据发送出去。
与字符设备不同,网卡设备在/dev目录下没有对应文件,但在/sys/class/net目录下可以查看网卡。接下来,我们简单介绍一下网卡的收发包流程。
(1)网卡收包
step1:网卡芯片获取网线上的物理帧,并检查物理帧的CRC,保证完整性;
step2:网卡芯片去除物理帧头,得到MAC数据包;
step3:网卡芯片检查MAC包中的目的MAC地址,如果和本网卡MAC不一致则丢弃(混杂模式除外);
step4:网卡芯片将MAC帧拷贝到内部缓冲区,触发硬件中断;
step5:网卡驱动程序通过中断处理函数,构造sk_buff,将其拷贝到内存中,交付内核处理。
(2)网卡发包
step1:网卡驱动程序将上层协议传递下来的数据包(IP数据包)构造成MAC包;
step2:网卡驱动程序将MAC包拷贝至网卡芯片内部缓冲区;
step3:网卡芯片将MAC包封装成物理帧,添加同步信息和CRC校验,通过网线发送出去(网线上所有网卡都能收到该帧)。
二、虚拟网卡驱动程序编写
本章节编写一个虚拟网卡驱动程序,利用ping命令发包,然后构造一个发包函数伪造一个收的ping包函数,实现该虚拟网卡能ping通任何ip地址。
2.1 init初始函数编写( vir_dev_register() )
(1)使用alloc_netdev()函数分配一个net_device结构体;
(2)设置net_device结构体成员;
(3)使用register_netdev()来注册net_device结构体;
static const struct net_device_ops vnet_ops = {
.ndo_open = vnet_open,
.ndo_stop = vnet_stop,
.ndo_start_xmit = vnet_tx,
};
static int vir_dev_register(void)
{
int ret = 0;
vir_dev = alloc_netdev(sizeof(str版权声明:本文标题:[Linux驱动开发九] 简单虚拟网卡制作_linux创建虚拟网卡 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1774272595a3569823.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论