プロトコルスタックのIP層から作成して登録したデバイスドライバーにsk_buffパケットを渡そうとしています。デバイスドライバのコードは次のとおりです。
#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);
しかし、パケットが渡されておらず、このテストモジュールをロードしようとすると、システムに致命的なエラーが表示され、プロセスが終了します。これを解決するための良いアプローチを教えていただけますか?