我正在尝试注册一个新的net_device
在linux中...我可以正确分配和注册它并且ifconfig
显示它。当我尝试打开界面时,问题出现了:
ifconfig my_dev up
发生内核冻结...问题仅出现在 x86 计算机上,我无法找出原因...在 pcc 计算机上一切正常。代码很简单:
static struct net_device *my_dev;
static int veth_dev_init(struct net_device *dev);
static int veth_open(struct net_device *dev);
static int veth_close(struct net_device *dev);
static int veth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
static struct veth_priv
{
...
};
static struct net_device_ops veth_ops =
{
.ndo_init = veth_dev_init,
.ndo_open = veth_open,
.ndo_stop = veth_close,
.ndo_do_ioctl = veth_ioctl
};
static int __init veth_init()
{
my_dev = alloc_netdev(sizeof(struct veth_priv), "my_dev", ether_setup);
if (my_dev == NULL)
return -ENOMEM;
my_dev->netdev_ops = &veth_ops;
register_netdev(my_dev);
return 0;
}
static void __exit veth_exit()
{
unregister_netdev(my_dev);
free_netdev(my_dev);
}
module_init(veth_init);
module_exit(veth_exit);
前四个函数veth_dev_init, veth_open, veth_close
and veth_ioctl
只需返回 0。
也许有一个缺失的字段veth_ops
结构?
谢谢你们!
是的,你错过了一个元素结构体net_device_ops
Add .ndo_start_xmit另外,该函数必须返回 NETDEV_TX_OK 或 NETDEV_TX_BUSY。
使用如下
static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
return NETDEV_TX_OK;
}
并且还改变open as
static int veth_open(struct net_device *dev)
{
memcpy(dev->dev_addr, "\0ABCD0", ETH_ALEN);
netif_start_queue(dev);
return 0;
}
Then in veth_ops
static struct net_device_ops veth_ops = {
.ndo_init = veth_dev_init,
.ndo_open = veth_open,
.ndo_stop = veth_close,
.ndo_start_xmit = veth_xmit,
.ndo_do_ioctl = veth_ioctl,
};
然后插入模块后
给 ifconfig my_dev 192.168.10.98 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)