网卡驱动程序框架

news/2024/10/30 23:18:50/

我们这里说的是网卡驱动程序,不是网络驱动程序,网络有七层,我们写的只是最底层的东西,网络这么多层,但是最终你还是要操作硬件啊

所以上面肯定有个硬件相关层,我们要写的就是硬件相关的驱动程序这一小块。

网卡你不需要打开什么设备,你只需要socket编程就行了

怎么写

1、分配某个结构体

2、设置

3、注册

4、硬件相关的操作


然而这个重点在设置这里

首先你得提供发包函数 提供收包的功能


我们随便看一个网卡驱动程序 如cs89x0.c

这是一个真实的网卡驱动程序



分配一个net_device

然后调用了下面这个函数


进去


有个这个

我们看看net_ops


有open和stop函数

还有ndo_start_xmit 硬件启动传输,这个发包函数就在这里


然后注册这个结构体



但是收到数据之后做什么事情,你怎么告诉我收到数据了呢,肯定会有个中断

我们来看看


假设收到数据之后


net_rx 进去看一下


从芯片里面读出来

分配一个skbuf


然后用下面的函数上报



然后我们再看一下发包函数是怎么回事


它发的是什么东西,它的参数是怎样,它的参数是sk_buf


从这里我们可以知道,硬件相关的这层和上层怎么打交道呢?

它们之间就是通过sk_buf,上面这几层构造好包之后,放到sk_buf里面扔给你,调用你的发包函数,你收到数据之后,在你的中断程序收到数据之后,你从芯片里面把数据读出来,构造一个sk_buf,然后用netif_rx来上报这个数据给我


说到这块,写一个网卡驱动很简单,我们先写一个虚拟的网卡

参考/driver/net/cs89x0.c


框架如图



我们来看一下范例里面分配的


但是我们不想用alloc_etherdev这个宏,我们进去看一下这个宏


进入alloc_etherdev_mqs这个函数里面去


这里的名字用的是eth0啊 eth1这种,我不想用这个名字,我想换一个名字,所以我们直接用alloc_netdev_mqs这个函数来做



我们写一个最简单的网络驱动 代码如下

#include <linux/module.h>
#include <linux/errno.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/in.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/gfp.h>
#include <asm/system.h>
#include <asm/io.h>a
#include <asm/irq.h>
static struct net_device *vnet_dev;


static int gh_start_xmit(struct sk_buff *skb, struct net_device *dev)
{


static int cnt = 0;
printk("virt_net_send_packet cnt = %d\n", ++cnt);
return 0;
}


static const struct net_device_ops gh_netdev_ops = {
.ndo_start_xmit= gh_start_xmit,
};


static int virtnet_init(void)
{


/*1.分配一个net_device结构体**/
vnet_dev=alloc_netdev(0, "ghnet%d", ether_setup);
/*2.设置*/
vnet_dev->netdev_ops= &gh_netdev_ops;
/*3.注册*/
register_netdev(vnet_dev);
return 0;
}


static void virtnet_exit(void)
{
unregister_netdev(vnet_dev);
free_netdev(vnet_dev);
}


module_init(virtnet_init);
module_exit(virtnet_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EIGHT");


测试如下

1.insmod virt_net.ko

2.ifconfig ghnet0 3.3.3.3

3.ping 3.3.3.3


效果如图


ping 自己是不会进入那个发包的函数的,我们ping下别人 3.3.3.4

效果如图


这上面说我发了20个包 

我们ifconfig来看一下


但是我们这里写的发的包是0,因为我们代码中还没有设置统计信息

在我们net_device结构体中有个net_device_stats这个结构体就是统计信息













http://www.ppmy.cn/news/271269.html

相关文章

驱动精灵-万能网卡版

驱动管理&#xff0c;网络修复工具&#xff0c;修复网络配置&#xff0c;重启。

万能驱动VIP版(EasyDrv) v7.23.317.2 正式版

万能驱动VIP版(简称EasyDrv)是IT天空出品的一款智能识别电脑硬件并自动安装驱动的驱动安装工具.它拥有简约友好的用户界面,驱动覆盖面广泛,智能精确识别硬件设备,万能驱动搭载了IT天空团队精心整理制作的离线驱动包.这是到目前为止,针对当前主流硬件设备收集和整理得最为全面的…

驱动精灵万能网卡版单文件版 v9.61

电脑因为缺少各种.Net、VC运行库致使程序无法运行怎么办&#xff1f;电脑卡顿无法运行怎么办&#xff1f;无须担心&#xff0c;今天为大家带来的是驱动精灵万能网卡版&#xff0c;这是一款集驱动管理和硬件检测于一体的驱动管理和维护工具&#xff0c;通过它可以快速找到相关运…

巧用万能驱动包安装驱动

本人从事系统维护工作的总结&#xff0c;希望对大家有用&#xff0c;不足的地方希望大家提出来&#xff0c;共同进步&#xff0c;欢迎拍砖&#xff01; 其实做维护是很枯燥的&#xff0c;但要做到高效是要动脑经的&#xff0c;否则永远都是老一套。 以前安装系统设备的驱动都是…

接口和抽象类区别

抽象类和接口都是 Java 中的重要概念&#xff0c;它们在面向对象编程中都扮演着重要角色&#xff0c;但是它们之间有许多不同点。下面在概念、用法、特性、设计等方面详细比较抽象类和接口的区别。 这里先列举接口和抽象类的区别 抽象类可以有构造方法&#xff0c;而接口不能有…

【OpenMMLab AI实战营第二期】目标检测与MMDetection

目标检测 目标检测的基本范式 划窗 使用卷积实现密集预测 锚框 多尺度检测与FPN 单阶段&无锚框检测器选讲 RPN YOLO、SSD Focal Loss与RetinaNet FCOS YOLO系列选讲 什么是目标检测 目标检测&#xff1a;给定一张图片&#xff0c;用矩形框框出所有感兴趣物体同…

【PWN · ret2libc | Canary】[2021 鹤城杯]littleof

最近比较忙&#xff0c;这道题用了好长时间来debug&#xff0c;甚至贡献了第一次在csdn上提问。。。 目录 前言 一、题目重述&思路分析 二、exp 三、Canary 四、萌新遇到的困难 总结 前言 Canary作为经典且基本的栈保护措施&#xff0c;在后期的题目中必然是基本标…

[Java水平分表?这个表是怎么来的?]

目录 前言: 记录一个小笔记 背景: 示例代码&#xff0c;使用 ShardingSphere 创建和删除水平分表&#xff1a; 需要注意的是&#xff0c;在使用水平分表时&#xff0c;需要考虑数据的一致性和查询效率等问题 前言: 记录一个小笔记 背景: 水平分表是通过代码创建的&#xf…