免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4231 | 回复: 2
打印 上一主题 下一主题

虚拟网卡驱动实现问题--IP发包时没调用自己写的_start_xmit()函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-18 09:24 |只看该作者 |倒序浏览
本帖最后由 llhao86 于 2011-11-18 09:27 编辑

我写了一个简单的虚拟设备驱动,想用来接收IP包,在代码中我只实现了dev这个结构体,并把它注册到系统上去,之后用路由命令让IP层把包发送到该设备上,看看系统是否调用了sim_dri_start_xmit()这个接收函数.
在编译完该程序,我把该模块加载到系统上,而且在/proc/net/dev中也能查看到该设备,说明设备应该正确注册到系统了.


接着我用
  sudo ifconfig sim_dri0 192.168.4.1 netmask 255.255.255.0 up   
配置该设备的IP并激活它,在系统消息中可以看到系统调用了sim_dri_open()这个函数.


但当我
  ping 192.168.4.1
时,虽然可以ping得通,但系统并没调用sim_dri_start_xmit()这个接收函数.
而且,当我想指定一条路由到该设备时
  sudo route add 192.168.155.155 dev sim_dri0
它总是提示"SIOCADDRT: Network is down"


我想请教下,我在代码里的做法是不是有问题,在做这个dev结构的时候是不是还有些东西没考虑呀,导致系统一直没调用我写的接收函数,谢谢!

环境:VMware+内核版本2.6.32.46
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/netdevice.h>
  5. #include <linux/etherdevice.h>
  6. #include <linux/ethtool.h>


  7. MODULE_LICENSE("Dual BSD/GPL");

  8. static int sim_dri_open (struct net_device *dev);
  9. static int sim_dri_start_xmit (struct sk_buff *skb, struct net_device *dev);
  10. static int sim_dri_close (struct net_device *dev);

  11. static LIST_HEAD(sim_dri_list);  

  12. static int sim_dri_open (struct net_device *dev)
  13. {
  14.         printk(KERN_ALERT "sim_dri_open run\n");
  15.         return 1;
  16. }

  17. static int sim_dri_start_xmit (struct sk_buff *skb, struct net_device *dev)
  18. {
  19.         printk(KERN_ALERT "sim_dri_start_xmit run\n");
  20.         kfree_skb(skb);
  21.         return 1;
  22. }

  23. static int sim_dri_close (struct net_device *dev)
  24. {
  25.         printk(KERN_ALERT "sim_dri_close run\n");
  26.         return 1;
  27. }

  28. //设备私有数据
  29. struct sim_dri_struct{  
  30.         struct list_head list; //设备链表  
  31.         struct net_device *dev; //net_device  
  32. };  

  33. //设备操作函数
  34. static const struct net_device_ops sim_dri_netdev_ops = {
  35.         .ndo_open         = sim_dri_open,
  36.         .ndo_stop         = sim_dri_close,
  37.         .ndo_start_xmit         = sim_dri_start_xmit,
  38. };

  39. //设置设备
  40. void sim_dri_setup(struct net_device *dev){  

  41.         struct sim_dri_struct *sim_dri = netdev_priv(dev); //获取net_device私有数据   

  42.         ether_setup(dev); //设置设备为以太网设备,定义部分以太网络的参数  
  43. /*  
  44. 以下为设置网络设备的操作函数  
  45. */  
  46.         dev->netdev_ops = &sim_dri_netdev_ops;
  47.         
  48.         random_ether_addr(dev->dev_addr); //随机源地址

  49.         sim_dri->dev = dev; //设置私有数据的net_device成员  

  50.         list_add(&sim_dri->list, &sim_dri_list); //将新建sim_dri_struct加入到设备链表  
  51. }  


  52. //申请,设置,注册设备
  53. struct net_device *sim_dri_setup_dev(void){  

  54.         struct net_device *dev;  
  55. //分配net_device,并调用初始化函数sim_dri_setup()
  56.         dev = alloc_netdev(sizeof(struct sim_dri_struct), "sim_dri%d", sim_dri_setup);   

  57.         if(dev == NULL){  
  58.                 printk(KERN_ALERT "alloc net device failed\n");  
  59.                 return NULL;  
  60.         }  
  61.         if(register_netdev(dev) != 0){ //注册网络设备  
  62.                 printk(KERN_ALERT "register net device failed\n");  
  63.                 return NULL;  
  64.         }  
  65.         return dev;  
  66. }  

  67. //卸载设备
  68. int sim_dri_shutdown_dev(void){  

  69.         struct sim_dri_struct *sim_dri;
  70.         struct sim_dri_struct        *next;  

  71.         list_for_each_entry_safe(sim_dri, next, &sim_dri_list, list){ //遍历所有sim_dri_struct  

  72.         list_del(&sim_dri->list); //将当前sim_dri_struct从队列中删除  

  73.         unregister_netdev(sim_dri->dev); //注销网络设备  

  74.         free_netdev(sim_dri->dev); //释放网络设备  
  75.         }  

  76.         return 0;  
  77. }  

  78. static int sim_driver_init(void)
  79. {
  80.         printk(KERN_ALERT "sim_driver_init run\n");

  81.         struct net_device *dev;

  82.         if((dev = sim_dri_setup_dev()) == NULL){  

  83.                 printk(KERN_ALERT "setup net device failed\n");  

  84.                 return -1;  

  85.         }
  86.         return 0;

  87. }



  88. static void sim_driver_exit(void)
  89. {
  90.         printk(KERN_ALERT"sim_driver_exit run\n");

  91.         if(sim_dri_shutdown_dev() == -1){  

  92.                 printk(KERN_ALERT "shutdown net device failed\n");  

  93.         }
  94. }

  95. module_init(sim_driver_init);
  96. module_exit(sim_driver_exit);
复制代码

2.jpg (9.58 KB, 下载次数: )

2.jpg

3.jpg (10.04 KB, 下载次数: )

3.jpg

论坛徽章:
0
2 [报告]
发表于 2014-01-12 23:23 |只看该作者
我执行之后,怎么内核里什么也没有?只有这一句[ 7857.320134] net: module license 'unspecified' taints kernel.

求解释?

论坛徽章:
0
3 [报告]
发表于 2014-01-12 23:43 |只看该作者
本帖最后由 jhkkhtd 于 2014-01-12 23:45 编辑

还有总是提示nss-myhostname 未安装,该怎样解决?   我在/proc/net/dev下也没有见到这个设备的挂载成功。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP