Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98090
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 384
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-06 16:52
文章分类

全部博文(38)

文章存档

2014年(38)

我的朋友

分类: 嵌入式

2014-05-13 15:56:29

目的:给虚拟网卡驱动添加发包函数,使其能ping通3.3.3.4
代码如下

点击(此处)折叠或打开

  1. /*
  2.  * 参考drivers\net\dm9000.c
  3.  */
  4. #include <linux/module.h>
  5. #include <linux/ioport.h>
  6. #include <linux/netdevice.h>
  7. #include <linux/etherdevice.h>
  8. #include <linux/init.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/skbuff.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/crc32.h>
  13. #include <linux/mii.h>
  14. #include <linux/ethtool.h>
  15. #include <linux/dm9000.h>
  16. #include <linux/delay.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/irq.h>
  19. #include <linux/slab.h>

  20. #include <asm/delay.h>
  21. #include <asm/irq.h>
  22. #include <asm/io.h>

  23. static struct net_device *vnet_dev;

  24. static int vnet_send_packet(struct sk_buff *skb, struct net_device *dev)//发包函数
  25. {
  26.     /* 对于真实的网卡,应该把skb里的数据通过网卡发送出去,这里我们简单起见,只打印信息 */
  27.     static int cnt = 0;
  28.     printk("vnet_send_packet %d\n", ++cnt);
  29.     
  30.     /*更新统计信息*/
  31.     dev->stats.tx_bytes += skb->len;//发送的字节数
  32.     dev->stats.tx_packets++;//发送的包个数
  33.     return 0;
  34. }

  35. static struct net_device_ops vnet_dev_ops =
  36. {
  37.     /* 2.1 在结构体net_device_ops中定义发包函数:nodo_start_xmit */
  38.     .ndo_start_xmit        = vnet_send_packet,
  39. };

  40. static int vnet_init(void)
  41. {
  42.     /* 1. 分配一个net_device */
  43.     vnet_dev = alloc_netdev(0, "vnet%d", ether_setup); // alloc_etherdev;

  44.     /* 2. 设置: */
  45.     /* 2.2 其他信息 */
  46.     /*设置mac地址*/
  47.     vnet_dev->dev_addr[0] = 0x00;
  48.     vnet_dev->dev_addr[1] = 0xE0;
  49.     vnet_dev->dev_addr[2] = 0x4A;
  50.     vnet_dev->dev_addr[3] = 0xbc;
  51.     vnet_dev->dev_addr[4] = 0x15;
  52.     vnet_dev->dev_addr[5] = 0xe8;

  53.     /* 3. 硬件相关的: request_irq, 在中断函数里得到数据后用netif_rx上报 */

  54.     /* 4. 注册net_device */
  55.     vnet_dev->netdev_ops = &vnet_dev_ops;//必须添加,否则会注册失败
  56.     register_netdev(vnet_dev);

  57.     
  58.     return 0;
  59. }

  60. static void vnet_exit(void)
  61. {
  62.     unregister_netdev(vnet_dev);
  63.     free_netdev(vnet_dev);
  64. }

  65. module_init(vnet_init);
  66. module_exit(vnet_exit);

  67. MODULE_LICENSE("GPL");


测试:
加载驱动设置ip后,ping 3.3.3.4,发现调用了vnet_send_packet函数发包,打印出了信息
通过ifconfig查看网卡,可以看到发包信息和我们设置的mac地址

阅读(1361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~