资料介绍
写网卡驱动之前我总结一下个人的一些观点:其实写驱动并不是大家想想的那么难,这里我客观评价一下内核层和应用层的区别:
底层:
工作在内核层的朋友应该有这种感觉,才开始学的时候真的很难,也就是说上手难,我就拿Linux驱动来说吧,写一个完整的驱动,你得装一个虚拟机跑Linux吧,用来编译驱动程序,虚拟机里面需要安装一些库和工具,驱动程序必须跑在一个完整的系统上,所以首先你得搭建好整个系统,你还得了解硬件时序等,这些东西对新手来说真的是够头痛了,但是你会发现你真正的成为一个驱动开发人员后你就有一种豁然开朗的感觉,原来写驱动程序这么简单,框架是不变的。所以说工作在底层的软件开发朋友们也不要觉得自己是多厉害,只是起点稍微高了一点。
应用层:
应用层相对来说上手就简单一点了,主要有以下几个方面的体现:
第一、用到的工具很少,写应用程序基本都是集成开发环境下,就那么一个工具,编译成功基本就可以使用。
第二、调试代码的时候是最方便的,加一些打印语句,然后运行就能够找到逻辑结构的错误。非常节省时间
第三、出现错误了,网上一贴,基本上问题就解决了。
难点:写一个应用程序逻辑结构思维是非常强的,你的代码量也相对的多每天接触的东西有可能不一样,需要不断的去更新自己的知识。
以上只是个人的观点,如有不同见解的可以留言。
写这个代码时遇到了一个问题,至今没有得到解决,问题叙述如下:我ping其他ip地址都是能够ping通的,就是不能够ping通自己,我目前也不知道原因,有知道原因的朋友,希望能够分享一下。
虚拟网卡驱动总结如下:
/*
* 参考 drivers\net\cs89x0.c
*/
static struct net_device *vnet_dev;
static void emulator_rx_packet(struct sk_buff *skb, struct net_device *dev)
{
/* 参考LDD3 */
unsigned char *type;
struct iphdr *ih;
__be32 *saddr, *daddr, tmp;
unsigned char tmp_dev_addr[ETH_ALEN];
struct ethhdr *ethhdr;
struct sk_buff *rx_skb;
// 从硬件读出/保存数据
/* 对调”源/目的”的mac地址 */
ethhdr = (struct ethhdr *)skb-》data;
memcpy(tmp_dev_addr, ethhdr-》h_dest, ETH_ALEN);
memcpy(ethhdr-》h_dest, ethhdr-》h_source, ETH_ALEN);
memcpy(ethhdr-》h_source, tmp_dev_addr, ETH_ALEN);
/* 对调”源/目的”的ip地址 */
ih = (struct iphdr *)(skb-》data + sizeof(struct ethhdr));
saddr = &ih-》saddr;
daddr = &ih-》daddr;
tmp = *saddr;
*saddr = *daddr;
*daddr = tmp;
//((u8 )saddr)[2] ^= 1; /change the third octet (class C) */
//((u8 *)daddr)[2] ^= 1;
type = skb-》data + sizeof(struct ethhdr) + sizeof(struct iphdr);
//printk(“tx package type = x\n”, *type);
// 修改类型, 原来0x8表示ping
type = 0; /0表示reply */
ih-》check = 0; /* and rebuild the checksum (ip needs it) */
ih-》check = ip_fast_csum((unsigned char *)ih,ih-》ihl);
// 构造一个sk_buff
rx_skb = dev_alloc_skb(skb-》len + 2);
skb_reserve(rx_skb, 2); /* align IP on 16B boundary */
memcpy(skb_put(rx_skb, skb-》len), skb-》data, skb-》len);
/* Write metadata, and then pass to the receive level */
rx_skb-》dev = dev;
rx_skb-》protocol = eth_type_trans(rx_skb, dev);
rx_skb-》ip_summed = CHECKSUM_UNNECESSARY; /* don’t check it */
dev-》stats.rx_packets++;
dev-》stats.rx_bytes += skb-》len;
// 提交sk_buff
netif_rx(rx_skb);
}
static int virt_net_send_packet(struct sk_buff *skb, struct net_device *dev)
{
static int cnt = 0;
printk(“virt_net_send_packet cnt = %d\n”, ++cnt);
/* 对于真实的网卡, 把skb里的数据通过网卡发送出去 */
netif_stop_queue(dev); /* 停止该网卡的队列 */
/* …… / /把skb的数据写入网卡 */
/* 构造一个假的sk_buff,上报 */
emulator_rx_packet(skb, dev);
dev_kfree_skb (skb); /* 释放skb */
netif_wake_queue(dev); /* 数据全部发送出去后,唤醒网卡的队列 */
/* 更新统计信息 */
dev-》stats.tx_packets++;
dev-》stats.tx_bytes += skb-》len;
return 0;
}
static int virt_net_init(void)
{
/* 1. 分配一个net_device结构体 */
vnet_dev = alloc_netdev(0, “vnet%d”, ether_setup);; /* alloc_etherdev */
/* 2. 设置 */
vnet_dev-》hard_start_xmit = virt_net_send_packet;
/* 设置MAC地址 */
vnet_dev-》dev_addr[0] = 0x08;
vnet_dev-》dev_addr[1] = 0x89;
vnet_dev-》dev_addr[2] = 0x89;
vnet_dev-》dev_addr[3] = 0x89;
vnet_dev-》dev_addr[4] = 0x89;
vnet_dev-》dev_addr[5] = 0x11;
/* 设置下面两项才能ping通 */
vnet_dev-》flags |= IFF_NOARP;
vnet_dev-》features |= NETIF_F_NO_CSUM;
/* 3. 注册 */
//register_netdevice(vnet_dev);
register_netdev(vnet_dev);
return 0;
}
static void virt_net_exit(void)
{
unregister_netdev(vnet_dev);
free_netdev(vnet_dev);
}
原文地址:http://blog.csdn.net/qq_21792169/article/details/48954467
底层:
工作在内核层的朋友应该有这种感觉,才开始学的时候真的很难,也就是说上手难,我就拿Linux驱动来说吧,写一个完整的驱动,你得装一个虚拟机跑Linux吧,用来编译驱动程序,虚拟机里面需要安装一些库和工具,驱动程序必须跑在一个完整的系统上,所以首先你得搭建好整个系统,你还得了解硬件时序等,这些东西对新手来说真的是够头痛了,但是你会发现你真正的成为一个驱动开发人员后你就有一种豁然开朗的感觉,原来写驱动程序这么简单,框架是不变的。所以说工作在底层的软件开发朋友们也不要觉得自己是多厉害,只是起点稍微高了一点。
应用层:
应用层相对来说上手就简单一点了,主要有以下几个方面的体现:
第一、用到的工具很少,写应用程序基本都是集成开发环境下,就那么一个工具,编译成功基本就可以使用。
第二、调试代码的时候是最方便的,加一些打印语句,然后运行就能够找到逻辑结构的错误。非常节省时间
第三、出现错误了,网上一贴,基本上问题就解决了。
难点:写一个应用程序逻辑结构思维是非常强的,你的代码量也相对的多每天接触的东西有可能不一样,需要不断的去更新自己的知识。
以上只是个人的观点,如有不同见解的可以留言。
写这个代码时遇到了一个问题,至今没有得到解决,问题叙述如下:我ping其他ip地址都是能够ping通的,就是不能够ping通自己,我目前也不知道原因,有知道原因的朋友,希望能够分享一下。
虚拟网卡驱动总结如下:
/*
* 参考 drivers\net\cs89x0.c
*/
static struct net_device *vnet_dev;
static void emulator_rx_packet(struct sk_buff *skb, struct net_device *dev)
{
/* 参考LDD3 */
unsigned char *type;
struct iphdr *ih;
__be32 *saddr, *daddr, tmp;
unsigned char tmp_dev_addr[ETH_ALEN];
struct ethhdr *ethhdr;
struct sk_buff *rx_skb;
// 从硬件读出/保存数据
/* 对调”源/目的”的mac地址 */
ethhdr = (struct ethhdr *)skb-》data;
memcpy(tmp_dev_addr, ethhdr-》h_dest, ETH_ALEN);
memcpy(ethhdr-》h_dest, ethhdr-》h_source, ETH_ALEN);
memcpy(ethhdr-》h_source, tmp_dev_addr, ETH_ALEN);
/* 对调”源/目的”的ip地址 */
ih = (struct iphdr *)(skb-》data + sizeof(struct ethhdr));
saddr = &ih-》saddr;
daddr = &ih-》daddr;
tmp = *saddr;
*saddr = *daddr;
*daddr = tmp;
//((u8 )saddr)[2] ^= 1; /change the third octet (class C) */
//((u8 *)daddr)[2] ^= 1;
type = skb-》data + sizeof(struct ethhdr) + sizeof(struct iphdr);
//printk(“tx package type = x\n”, *type);
// 修改类型, 原来0x8表示ping
type = 0; /0表示reply */
ih-》check = 0; /* and rebuild the checksum (ip needs it) */
ih-》check = ip_fast_csum((unsigned char *)ih,ih-》ihl);
// 构造一个sk_buff
rx_skb = dev_alloc_skb(skb-》len + 2);
skb_reserve(rx_skb, 2); /* align IP on 16B boundary */
memcpy(skb_put(rx_skb, skb-》len), skb-》data, skb-》len);
/* Write metadata, and then pass to the receive level */
rx_skb-》dev = dev;
rx_skb-》protocol = eth_type_trans(rx_skb, dev);
rx_skb-》ip_summed = CHECKSUM_UNNECESSARY; /* don’t check it */
dev-》stats.rx_packets++;
dev-》stats.rx_bytes += skb-》len;
// 提交sk_buff
netif_rx(rx_skb);
}
static int virt_net_send_packet(struct sk_buff *skb, struct net_device *dev)
{
static int cnt = 0;
printk(“virt_net_send_packet cnt = %d\n”, ++cnt);
/* 对于真实的网卡, 把skb里的数据通过网卡发送出去 */
netif_stop_queue(dev); /* 停止该网卡的队列 */
/* …… / /把skb的数据写入网卡 */
/* 构造一个假的sk_buff,上报 */
emulator_rx_packet(skb, dev);
dev_kfree_skb (skb); /* 释放skb */
netif_wake_queue(dev); /* 数据全部发送出去后,唤醒网卡的队列 */
/* 更新统计信息 */
dev-》stats.tx_packets++;
dev-》stats.tx_bytes += skb-》len;
return 0;
}
static int virt_net_init(void)
{
/* 1. 分配一个net_device结构体 */
vnet_dev = alloc_netdev(0, “vnet%d”, ether_setup);; /* alloc_etherdev */
/* 2. 设置 */
vnet_dev-》hard_start_xmit = virt_net_send_packet;
/* 设置MAC地址 */
vnet_dev-》dev_addr[0] = 0x08;
vnet_dev-》dev_addr[1] = 0x89;
vnet_dev-》dev_addr[2] = 0x89;
vnet_dev-》dev_addr[3] = 0x89;
vnet_dev-》dev_addr[4] = 0x89;
vnet_dev-》dev_addr[5] = 0x11;
/* 设置下面两项才能ping通 */
vnet_dev-》flags |= IFF_NOARP;
vnet_dev-》features |= NETIF_F_NO_CSUM;
/* 3. 注册 */
//register_netdevice(vnet_dev);
register_netdev(vnet_dev);
return 0;
}
static void virt_net_exit(void)
{
unregister_netdev(vnet_dev);
free_netdev(vnet_dev);
}
原文地址:http://blog.csdn.net/qq_21792169/article/details/48954467
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 基于ARM的USB无线网卡Linux设备驱动设计
- Kali Linux安装Java 安装显卡驱动 安装网卡补丁 并发线程限制 电源优化
- 电气信息工程丛书之Linux PowerPC详解-核心篇 0次下载
- Linux虚拟机之tcpdump命令操作详解 23次下载
- COM335X Linux开发板如何进行无线USB网卡移植的手册说明 12次下载
- 基于Linux虚拟网卡的测试系统 2次下载
- linux下网卡配置详解 0次下载
- Linux下8019网卡驱动程序 13次下载
- 基于Linux支持802.11e的无线网卡驱动分析 4次下载
- usb ethernet网卡驱动
- pci网卡驱动下载
- acer TravelMate 6410系列 网卡驱动下载
- acer TravelMate 8210系列 网卡驱动下载
- acer Aspire 4520网卡驱动+无线网卡驱动下载
- usb网卡驱动程序下载(万能全集)
- 无线网卡驱动怎么安装 无线网卡怎么连接台式电脑 2315次阅读
- 一文总结linux的platform驱动 783次阅读
- 使用Ansible构建虚拟机部署Linux的最佳实践 951次阅读
- 虚拟机:Linux查看线程信息的步骤 3422次阅读
- Linux:测试进程占用的虚拟内存大小 2762次阅读
- 虚拟机:Linux查看tar包文件内容的方法 6541次阅读
- 虚拟机:Linux改变打开文件的个数 2173次阅读
- 虚拟机:Linux如何测试 DBUS Daemon 4191次阅读
- 虚拟机:linux 进程的最大线程个数 2624次阅读
- 虚拟机:Linux查找网卡所用的驱动 3443次阅读
- 虚拟机:Linux查看路由信息的几种方法 8105次阅读
- Linux桌面虚拟化威廉希尔官方网站 KVM的详细资料说明 4315次阅读
- linux高级技巧:服务器集群之keepalived 4932次阅读
- Linux容器和虚拟机之间的区别差异分析 8936次阅读
- Linux下读取网卡默认MAC地址的方法 4983次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1490次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 92次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 10次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7蓝牙设备在嵌入式领域的广泛应用
- 0.63 MB | 3次下载 | 免费
- 89天练会电子电路识图
- 5.91 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多