- 论坛徽章:
- 0
|
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)
|
|