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);
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]);
}
PD: Recuerden que la función se llama desde el macro la __ es para uso intero.