Realmente no había encontrado una función similar, y los pocos códigos que se pueden encontrar en la
red están incompletos y mal hechos, así que después de estudiarme las estructuras del kernel y los headers logre programarlo!

La función ademas de conseguir las interfaces de red no produce fallos de segmentos, ni kernel panics, ni desbordamientos, y si
la cantidad del buffer no es suficiente tampoco falla.


Aca los resultados:
/*--------------------------------------------

	Autor: NvK
	Descripción: Obtener las interfaces de red disponibles(con prevención de fallos de segmentos y buffers pequeños).
	Fecha: 20-1-2014

----------------------------------------------*/

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/proc_fs.h>
#include <linux/netdevice.h>

static unsigned short int __attribute__((__section__(".text.init")))
__get_network_interface(char *net_buf[], unsigned int buf_len){
	struct net_device *dev;
	struct net *net;
	unsigned short int i;
	
	__asm__(
		"xor %eax, %eax"
	);
	dev= first_net_device(&init_net);
	net= dev->nd_net;
	if(buf_len>i){
		list_for_each_entry(dev, &(net)->dev_base_head, dev_list)
			net_buf[i++]= (*dev).name;
		--i; // alinear
	}else {
		net_buf[buf_len]= (*dev).name;
	}
	return(i);
}
#define get_network_interface(net_buf)(__get_network_interface(net_buf, (sizeof(net_buf)/sizeof(net_buf[0]))))

Ejemplo 1:
#define NET_BUFF_LEN 13

static int __section(.init.text) __cold notrace INIT_KERNEL(void)
{
	char *net_buf[NET_BUFF_LEN];
	int i= 0;
	
	printk("Interfaces de red encontradas:\n");
	for(;i<=get_network_interface(net_buf);i++){
		printk("\t[+] %s\n", net_buf[i]);
	}
	
	return 0x0;
}

inline static void __section(.exit.data) EXIT_KERNEL(void){}

module_init(INIT_KERNEL);
module_exit(EXIT_KERNEL);
Imagen


Ejemplo 2 - como pueden ver el buffer es muy pequeño lo que hubiera provocado un fallo
de segmento al buscar una zona nula(que no existe o no ha sido asignada).
Pero gracias a la función se pudo prevenir.
char *net_buf[0]; // esto en teoría provocaría un crasheo en el kernel
	int i= 0;
	
	printk("Interfaces de red encontradas:\n");
	for(;i<=get_network_interface(net_buf);i++){
		printk("\t[+] %s\n", net_buf[i]);
	}
Imagen


PD: Recuerden que la función se llama desde el macro la __ es para uso intero.
Responder

Volver a “Fuentes”