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

本文标签: 网卡芯片 数据包 编程