Mailing List Archive

Support open source code!


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

interface name - module name assoc SOLVED




Ok, well, I did have to write a kernel module, but this should work on all
machines and reliably tell you "what driver module is the owner of the
interface", assuming you're using dynamic modules for your network
drivers.  Amazingly enough, I did NOT manage to crash my system while
testing this thing, I guess I got lucky this time :)

compile with:

gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -o ndmassoc.o -c ndmassoc.c

then,

insmod ./ndmassoc.o

then

cat /proc/ndmassoc

the number is the "interface index number" as seen by the kernel, if
you're wondering.

rmmod ndmassoc

will get rid of it.


--cut here--

/* ndmassoc.c
   this driver provides /proc/ndmassoc, which lets you associate network 
   devices with
   the module that owns it.

   this code released under the terms of the GNU GPL
   (C) 2001 by Scott Stone <sstone@example.com>

   This module comes with NO WARRANTY - if it breaks your kernel, reboot and 
   don't load it
   again, or try it again, and be angry.  It's really up to you, but I take 
   no responsibility either way.
*/

#include <linux/kernel.h>
#include <linux/module.h>
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/proc_fs.h>
#include <linux/netdevice.h>

#define MODNAME "ndmassoc"
#define VERSION "1.0.0"
#define COPYRIGHT "(C) 2001 by Scott Stone <sstone@example.com>"
#define MAX_INTERFACES 50
#define BUFFER_SIZE ((MAX_INTERFACES * 80) + 1)

int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data) {
	int len=0;
	static char my_buffer[BUFFER_SIZE];
	struct net_device *nd=NULL;
	static int zz;

	memset(my_buffer,0,BUFFER_SIZE);
	strcpy(my_buffer,":Interfaces:\n");
	if (offset > 0) return 0;
	for (zz=0;zz < MAX_INTERFACES;zz++) {
		nd=dev_get_by_index(zz);
		if (nd && (nd->owner) && (nd->owner->name)) {
			sprintf(my_buffer,"%s%d:%s:%s\n",
				my_buffer,
				zz,
				nd->name,
				nd->owner->name);
		}
	}
	len=strlen(my_buffer);
	*buffer_location=my_buffer;
	return len;
}

int init_module(void) {
	struct proc_dir_entry *p=NULL;
	printk("%s v%s - %s\n", MODNAME, VERSION, COPYRIGHT);
	p=create_proc_entry(MODNAME,(S_IFREG | S_IRUGO),&proc_root);
	if (!p) {
		printk("%s: error registering /proc/%s !!\n",MODNAME,MODNAME);
		return -1;
	}
	p->read_proc=procfile_read;
	p->data=NULL;
	return 0;
}

void cleanup_module(void) {
	remove_proc_entry(MODNAME,&proc_root);
	printk("%s unloaded successfully.\n",MODNAME);
}


Home | Main Index | Thread Index

Home Page Mailing List Linux and Japan TLUG Members Links