我正在尝试将 sk_buff 数据包从协议栈的 IP 层传递到我创建并注册的设备驱动程序。设备驱动程序代码如下:
#include<linux/module.h>
#include<linux/netdevice.h>
#include<linux/kernel.h>
#include<linux/skbuff.h>
#include<linux/pci.h>
#include<linux/interrupt.h>
struct net_device *my_dev;
static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
printk(KERN_INFO "I got a packet");
return NETDEV_TX_OK;
}
static int veth_open(struct net_device *dev)
{
memcpy(dev->dev_addr, "\0ABCD0", ETH_ALEN);
netif_start_queue(dev);
return 0;
}
int veth_close(struct net_device *dev)
{
printk("releasing mydev\n");
netif_stop_queue(dev);
return 0;
}
int veth_dev_init(struct net_device *dev)
{
printk("initialising\n");
return 0;
}
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,
};
int veth_init()
{
int ret,i;
my_dev = alloc_netdev(sizeof(struct net_device), "my_dev", ether_setup);
if (my_dev == NULL)
return -ENOMEM;
my_dev->netdev_ops = &veth_ops;
register_netdev(my_dev);
return 0;
}
void veth_exit()
{
unregister_netdev(my_dev);
free_netdev(my_dev);
}
module_init(veth_init);
module_exit(veth_exit);
然后在加载此模块并使用“ifconfig”为其分配 IP 地址后,我尝试使用 dev_queue_xmit() 函数传递数据包。代码如下:
struct sk_buff *skb;
void generate_send()
{
skb=alloc_skb(skb,2);
skb->data[0]='m';//just to check
skb->dev="my_dev";
dev_queue_xmit(skb);
}
static int testing_init(void)
{
//time=4;
generate_send();
return 0;
}
static void testing_exit(void)
{
printk(KERN_INFO "Goodbye, world 2\n");
}
module_init(testing_init);
module_exit(testing_exit);
但是数据包没有通过,当我尝试加载这个测试模块时,系统显示致命错误并终止进程。你能给我一个解决这个问题的好方法吗?