电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
创作
电子发烧友网>电子资料下载>C语言|源代码>Linux驱动之虚拟网卡

Linux驱动之虚拟网卡

2017-10-12 | rar | 0.4 MB | 次下载 | 1积分

资料介绍

写网卡驱动之前我总结一下个人的一些观点:其实写驱动并不是大家想想的那么难,这里我客观评价一下内核层和应用层的区别:
  底层:
  工作在内核层的朋友应该有这种感觉,才开始学的时候真的很难,也就是说上手难,我就拿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
 
下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1电子电路原理第七版PDF电子教材免费下载
  2. 0.00 MB  |  1490次下载  |  免费
  3. 2单片机典型实例介绍
  4. 18.19 MB  |  92次下载  |  1 积分
  5. 3S7-200PLC编程实例详细资料
  6. 1.17 MB  |  27次下载  |  1 积分
  7. 4笔记本电脑主板的元件识别和讲解说明
  8. 4.28 MB  |  18次下载  |  4 积分
  9. 5开关电源原理及各功能电路详解
  10. 0.38 MB  |  10次下载  |  免费
  11. 6基于AT89C2051/4051单片机编程器的实验
  12. 0.11 MB  |  4次下载  |  免费
  13. 7蓝牙设备在嵌入式领域的广泛应用
  14. 0.63 MB  |  3次下载  |  免费
  15. 89天练会电子电路识图
  16. 5.91 MB  |  3次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234313次下载  |  免费
  3. 2PADS 9.0 2009最新版 -下载
  4. 0.00 MB  |  66304次下载  |  免费
  5. 3protel99下载protel99软件下载(中文版)
  6. 0.00 MB  |  51209次下载  |  免费
  7. 4LabView 8.0 专业版下载 (3CD完整版)
  8. 0.00 MB  |  51043次下载  |  免费
  9. 5555集成电路应用800例(新编版)
  10. 0.00 MB  |  33562次下载  |  免费
  11. 6接口电路图大全
  12. 未知  |  30320次下载  |  免费
  13. 7Multisim 10下载Multisim 10 中文版
  14. 0.00 MB  |  28588次下载  |  免费
  15. 8开关电源设计实例指南
  16. 未知  |  21539次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935053次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537791次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420026次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234313次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233045次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191183次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183277次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138039次下载  |  免费