Intention is to write character device which registers a logical network device with the kernel.
-Ravi
Megharaj wrote:
u r trying to register netdev
i = register_netdevice((pTestStruct->dev));
and trying to unregister chardev....
unregister_chrdev(16,"test");
so check out which device u want to regiter this perticular driver for netdev or chardev.....
Megharaj.
----- Original Message ----- From: "Ravi Kumar" <ravivsn@rocsys.com> To: <kernelnewbies@nl.linux.org> Sent: Monday, April 19, 2004 10:53 AM Subject: problem in initilisation
HI, I wrote one character device which should create network device. When I do insmod it gave a segmentation fault and lsmod shows initializing.
A dmesg shows:
EIP is at init_module [testdriver] 0xa6 (2.4.18-14) eax: 00000000 ebx: ffffffea ecx: c05b6000 edx: c8e7f4d3 esi: 00000000 edi: 00000000 ebp: c672df18 esp: c672df00 ds: 0018 es: 0018 ss: 0018 Process insmod (pid: 9922, stackpage=c672d000) Stack: 00200206 ffffffff 00002f3f c05b6940 00000000 00000000 c8e7f000 c011bf79 c8e7f060 08075228 00000908 00000000 080756f4 0000052c 00000060 00000060 0000000a c05b6c40 c6231000 c6e7e000 00000060 c8def000 c8e7f060 00000968 Call Trace: [<c011bf79>] sys_init_module [kernel] 0x4d9 (0xc672df1c)) [<c8e7f060>] test_open [testdriver] 0x0 (0xc672df20)) [<c8e7f060>] test_open [testdriver] 0x0 (0xc672df58)) [<c010910f>] system_call [kernel] 0x33 (0xc672dfc0))
Code: c7 40 34 fe f0 e7 c8 83 ec 08 68 d4 f4 e7 c8 8b 45 f4 ff 30
I am attaching the code, pls help me to solve this problem. Thanks a lot, -Ravi
---------------------------------------------------------------------------- ----
test_struct),GFP_KERNEL);#ifndef __KERNEL__ # define __KERNEL__ #endif
#ifndef MODULE # define MODULE #endif
#define DEVNAME "testdev"
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/slab.h>
#include <linux/netdevice.h> #include <linux/if_ether.h>
int test_open(struct inode *,struct file *); int test_release(struct inode *,struct file*);
struct test_struct{ struct net_device *dev; char name[IFNAMSIZ]; };
struct file_operations test_fop={ llseek: NULL, read: NULL, write: NULL, ioctl: NULL, open: test_open, release: test_release, };
int test_open(struct inode *inode, struct file *filep) { MOD_INC_USE_COUNT; return 0; }
int test_release(struct inode *inode, struct file *filep) { MOD_DEC_USE_COUNT; return 0; }
int testdev_open(struct net_device *dev) { MOD_INC_USE_COUNT; return 0; }
int testdev_close(struct net_device *dev) { unregister_netdev(dev); MOD_DEC_USE_COUNT; return 0; }
static int test_init_dev(struct net_device *dev) { struct test_struct *c;
dev->priv = kmalloc(sizeof(struct net_device),GFP_KERNEL); if(!dev->priv) { printk(KERN_ERR "out of memory while allocating to dev->priv\n"); return -ENOMEM; } c = (struct test_struct *)dev->priv; if(!c) return -ENODEV;
memset(c,0,sizeof(struct test_struct)); c->dev = dev; ether_setup(dev);
dev->open = testdev_open; dev->stop = testdev_close; dev->mtu = ETH_DATA_LEN; dev_init_buffers(dev); return 0; }
int init_module(void) { int result,i;
struct test_struct *pTestStruct;
result = register_chrdev(16,"test",&test_fop);
if( result < 0 ){
printk(KERN_WARNING "test: cant get major\n");
return result;
}
pTestStruct = (struct test_struct *)kmalloc(sizeof( struct
if(!pTestStruct) { printk(KERN_ERR "failed to allocate memory\n"); return -ENOMEM; }
memset((void *)pTestStruct,0,sizeof(pTestStruct)); sprintf(pTestStruct->name, DEVNAME); //pTestStruct->dev->priv = pTestStruct; pTestStruct->dev->init = test_init_dev;
i = dev_alloc_name(pTestStruct->dev,"testdev%d"); if(i < 0 ) { printk(KERN_ERR "cant allocate device\n"); return -ENODEV; } i = register_netdevice((pTestStruct->dev)); if( i < 0 ) printk(KERN_ERR "register netdevice failed\n");
return 0; }
void cleanup_module(void) {
unregister_chrdev(16,"test"); }
-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/
-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/