免费注册 查看新帖 |

Chinaunix

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

[虚拟化] 虚拟网卡驱动问题急求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-29 14:13 |只看该作者 |倒序浏览
linux 驱动 虚拟网卡 .在win7上的VMWare下安装Ubunt14.0系统,在虚拟linux系统上开发驱动,参照网上说明创建了一个虚拟网卡,现在有如下问题急待大侠指点,在线急等啊,谢谢

1、虚拟网卡创建成功后,通过ifconfig -a能发现,如果给虚拟接口priv0配置ip地址后接口也能UP,但是
在系统回调XGDev_open函数时,传入的net_device *dev指针为空,为什么?

2、在驱动执行sudo insmod gbs10.ko时,注册成功,但是有如下告警信息,是否是导致问题1的原因? 如何消除?
couldn't determine device driver; ignoring...这个是不是导致问题1的原因?

lover@ubuntu:~/src/gbs10$ cat /var/log/syslog | tail
Apr 29 09:12:10 ubuntu kernel: [  338.763216] /home/lover/src/gbs10/gbs10.c[1409] [Fun:XGDev_setup] begin ****** .(dev[0xe7382800])
Apr 29 09:12:10 ubuntu kernel: [  338.763586] /home/lover/src/gbs10/gbs10.c[1456] [Fun:XGhold_realdev] begin ****** .(dev[0xe7382800], p[0xe7382d00])
Apr 29 09:12:10 ubuntu kernel: [  338.763630] /home/lover/src/gbs10/gbs10.c[1470] [Fun:XGhold_realdev] real_dev[0xf59fe800].
Apr 29 09:12:10 ubuntu kernel: [  338.764060] /home/lover/src/gbs10/gbs10.c[886] [Fun:XGDev_init] begin ****** .
Apr 29 09:12:10 ubuntu kernel: [  338.764075] /home/lover/src/gbs10/gbs10.c[889] [Fun:XGDev_init] dev[0xe7382800], priv[0xe7382d00], real_dev[0xf59fe800].
Apr 29 09:12:10 ubuntu kernel: [  338.770996] /home/lover/src/gbs10/gbs10.c[1516] [Fun:XGDev_Register] priv0 register successful.
Apr 29 09:12:10 ubuntu NetworkManager[883]: <warn> /sys/devices/virtual/net/priv0: couldn't determine device driver; ignoring...Apr 29 09:12:10 ubuntu NetworkManager[883]:    SCPlugin-Ifupdown: devices added (path: /sys/devices/virtual/net/priv0, iface: priv0)
Apr 29 09:12:10 ubuntu NetworkManager[883]:    SCPlugin-Ifupdown: device added (path: /sys/devices/virtual/net/priv0, iface: priv0): no ifupdown configuration found.


static int XGDev_open(struct net_device *dev)
{
    printk("%s[%d] [Fun:%s] begin ****** .(dev[0x%x]) \n",
    __FILE__, __LINE__,__func__, dev);
    #if 0
    struct xg_dev_private *priv = netdev_priv(dev);
    struct net_device *real_dev = priv->dev;
    int err;

printk("%s[%d] [Fun:%s] begin ****** .(dev[0x%x],priv[0x%x],real_dev[0x%x]) \n",
    __FILE__, __LINE__,__func__, dev, priv, real_dev);

    //netif_carrier_on(dev);
    #endif
    return 0;
}


static netdev_tx_t XGDev_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
    struct xg_dev_private *priv  = netdev_priv(dev);
    struct net_device *real_dev = priv->dev;
    struct sk_buff *skbTx       = NULL;
    struct iphdr *iph           = ip_hdr(skb);
    int ret;

printk("%s[%d] [Fun:%s] begin ****** .(protocol[%d]) \n",
    __FILE__, __LINE__,__func__, iph->protocol);

    printk("%s[%d] [Fun:%s] data_len[%d], mac_len[%d], truesize[%d] \n",
            __FILE__, __LINE__,__func__, skb->data_len, skb->mac_len,skb->truesize);


    /* 对于真实的网卡, 把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 ret;
}
static int XGDev_stop(struct net_device *dev)
{
printk("%s[%d] [Fun:%s] begin ****** .(dev[0x%x]) \n",
    __FILE__, __LINE__,__func__, dev);

    //netif_carrier_off(dev);
return 0;
}

static struct net_device_ops XG_netdev_ops =
{
    .ndo_init           = XGDev_init,
    .ndo_uninit         = XGDev_uninit,
    .ndo_open           = XGDev_open,
    .ndo_stop           = XGDev_stop,
    .ndo_start_xmit     = XGDev_start_xmit,
    //.ndo_validate_addr  = eth_validate_addr,
    //.ndo_do_ioctl       = XGDev_ioctl,
    //.ndo_set_mac_address= XGDev_set_mac_address,
    //.ndo_neigh_setup    = XGDev_neigh_setup,
    //.ndo_get_stats      = XGDev_get_stats,
    //.ndo_set_rx_mode    = XGDev_rx_mode,
};


static void XGDev_setup(struct net_device *dev)
{
    printk("%s[%d] [Fun:%s] begin ****** .(dev[0x%x])\n", __FILE__, __LINE__,__func__, dev);

    ether_setup(dev);
   
    dev->tx_queue_len       = 1000;
    dev->netdev_ops         = &XG_netdev_ops;

//dev->hard_start_xmit    = XGhard_start_xmit;

    dev->dev_addr[0] = 0x00;
    dev->dev_addr[1] = 0x12;
    dev->dev_addr[2] = 0x34;
    dev->dev_addr[3] = 0x56;
    dev->dev_addr[4] = 0x78;
    dev->dev_addr[5] = 0x9a;

    //dev->flags      |= IFF_NOARP;
//dev->features   |= NETIF_F_NO_CSUM;

dev->mtu = 64 * 1024;
dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */
dev->tx_queue_len = 0;
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
dev->flags = IFF_LOOPBACK;

    dev->priv_flags        &= ~IFF_XMIT_DST_RELEASE;
    dev->hw_features = NETIF_F_ALL_TSO | NETIF_F_UFO;
    dev->features  = NETIF_F_SG | NETIF_F_FRAGLIST
     | NETIF_F_ALL_TSO
     | NETIF_F_UFO
     | NETIF_F_HW_CSUM
     | NETIF_F_RXCSUM
     | NETIF_F_HIGHDMA
     | NETIF_F_LLTX
     | NETIF_F_NETNS_LOCAL
     | NETIF_F_VLAN_CHALLENGED
     | NETIF_F_LOOPBACK;

return;
}

static void XGhold_realdev(struct net_device *dev)
{
    struct xg_dev_private *p = netdev_priv(dev);
    struct net_device *real_dev;

printk("%s[%d] [Fun:%s] begin ****** .(dev[0x%x], p[0x%x]) \n", __FILE__, __LINE__,__func__, dev, p);

    if (p == NULL)
    {
printk("%s[%d] [Fun:%s] call netdev_priv return NULL. \n", __FILE__, __LINE__,__func__);
        goto out;
    }

    if ((real_dev = dev_get_by_name(&init_net, "eth0")) == NULL)
    {
printk("%s[%d] [Fun:%s] dev_get_by_name. \n", __FILE__, __LINE__,__func__);
        goto out;
    }

    printk("%s[%d] [Fun:%s] real_dev[0x%x].\n", __FILE__, __LINE__,__func__, real_dev);

    p->dev = real_dev;
out:
    return;
}

static void XGrelease_realdev(struct net_device *dev)
{
    struct xg_dev_private *p = netdev_priv(dev);

printk("%s[%d] [Fun:%s] begin ****** . \n", __FILE__, __LINE__,__func__);

    if (p == NULL)
    {
printk("%s[%d] [Fun:%s] netdev_priv return NULL. \n", __FILE__, __LINE__,__func__);
        goto out;
    }

    dev_put(p->dev);
out:
    return;
}

static int __init XGDev_Register(void)
{
    printk("%s[%d] [Fun:%s] begin ******.\n", __FILE__, __LINE__,__func__);

    pXG_NetDev = alloc_netdev(sizeof(struct xg_dev_private), "priv%d", XGDev_setup);
    if (pXG_NetDev == NULL)
    {
printk("%s[%d] [Fun:%s] alloc_netdev failure.\n", __FILE__, __LINE__,__func__);
        goto out;
    }
   
    //dev_net_set(pXG_NetDev, &init_net);
    XGhold_realdev(pXG_NetDev);
    if (register_netdev(pXG_NetDev) < 0)
    {
printk("%s[%d] [Fun:%s] register_netdevice failure.\n", __FILE__, __LINE__,__func__);
        goto err;
    }

    dev_add_pack(&gXGDev_arp_pack_type);
    dev_add_pack(&gXGDev_ip_pack_type);

printk("%s[%d] [Fun:%s] priv0 register successful.\n", __FILE__, __LINE__,__func__);
    return 0;
err:
    XGrelease_realdev(pXG_NetDev);
    free_netdev(pXG_NetDev);
out:
    return -ENOMEM;
}

static void __exit XGDev__unregister(void)
{
    printk("%s[%d] [Fun:%s] begin ****** .\n", __FILE__, __LINE__,__func__);

    dev_remove_pack(&gXGDev_ip_pack_type);
    dev_remove_pack(&gXGDev_arp_pack_type);
    unregister_netdev(pXG_NetDev);
    XGrelease_realdev(pXG_NetDev);
    free_netdev(pXG_NetDev);

printk("%s[%d] [Fun:%s] priv0 unregister successful.\n", __FILE__, __LINE__,__func__);

return;
}

module_init(XGDev_Register);
module_exit(XGDev__unregister);
MODULE_LICENSE("GPL");


查询信息
lover@ubuntu:~/src/gbs10$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:0c:29:fe:25:00  
          inet addr:192.168.10.133  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fefe:2500/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39943 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25068 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:51430436 (51.4 MB)  TX bytes:1398972 (1.3 MB)
          Interrupt:19 Base address:0x2000

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:309 errors:0 dropped:0 overruns:0 frame:0
          TX packets:309 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:39427 (39.4 KB)  TX bytes:39427 (39.4 KB)

priv0     Link encap:Local Loopback  
          BROADCAST MULTICAST  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-04-29 15:51 |只看该作者
目测楼主是程序员出身.

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
3 [报告]
发表于 2014-04-29 16:18 |只看该作者
楼主是程序猿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP