Configuración de interfaces de red a bajo nivel. [Solucionado]

Hola a todos.

Estoy realizando una aplicación que permita la configuración de los interfaces de red en un entorno de texto ncurses y me gustaría saber si existe alguna biblioteca de C/C++ que me ayude a gestionar la configuración de los interfaces de red en Debian.

El tema de la configuración inalámbrica está solucionado con "iwlib", que permite la configuración del punto de acceso, la frecuencia y todos los parámetros de una red wifi, el problema viene en el siguiente paso, una vez establecida la configuración inalámbrica, cuando hay que configurar los parámetros de acceso a la red. No encuentro la manera de asignar la dirección ip a un adaptador, o la máscara de red, si no es a través de llamadas al sistema con la función system(), utilizando la orden ifconfig.

En definitiva, lo que busco es una biblioteca que facilite la configuración de red de los interfaces del sistema.

Espero haberme explicado con claridad, si hay alguna duda, por favor preguntadme.

Un saludo.

Hola marmaraba

Si, con libpcap se puede hacer esto y unas cuantas cosillas más, puedes ver en la página 10 de este manual como obtener algunos datos sobre las interfaces, así pues deduzco que te será posible configurarlas (y dado que la mayoría de sniffers se basan en esta librería es más que seguro...)

Aquí el ejemplo:

/*********************************************************************
*
* Fichero: lsdevs.c
* Fecha: Alejandro Lopez Monge
* Orignal: Martin Casado http://www.cet.nau.edu/˜mc8/Socket/Tutorials/section1.html
*
* Compilacion: gcc lsdevs.c -lpcap
*
* Descripcion:
* Buscamos la primera interfaz de red disponible y lista su direccion de red
* (que no su direccion IP) y su mascara de subred.
*
*********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pcap.h>

int main(int argc, char **argv) {
  char *net;
  char *mask;
  char *dev;
  int ret;
  char errbuf[PCAP_ERRBUF_SIZE];
  bpf_u_int32 netp;
  bpf_u_int32 maskp;
  struct in_addr addr;

  if ((dev = pcap_lookupdev(errbuf))== NULL) {
    printf("ERROR %s\n",errbuf);
    return -1;
  }
 
  printf("Nombre del dispositivo: %s\n",dev);
 
  if ((ret = pcap_lookupnet(dev, &netp, &maskp, errbuf)) == -1) {
    printf("ERROR %s\n",errbuf);
    return -1;
  }
 
  addr.s_addr = netp;
 
  if ((net = inet_ntoa(addr))==NULL) {
    perror("inet_ntoa");
    return -1;
  }
 
  printf("Direccion de Red: %s\n",net);
  addr.s_addr = maskp;
  mask = inet_ntoa(addr);
 
  if ((net=inet_ntoa(addr))==NULL) {
    perror("inet_ntoa");
    return -1;
  }
 
  printf("Mascara de Red: %s\n",mask);
  return 0;
}

EDITO

Más fácil:
http://www.fys.uio.no/studier/kurs/fys4220/docs/vxworks/ref/ifLib.html

Gracias por tu respuesta E0N.

He estado echando un vistazo a las librerías que me has recomendado.

Te agradezco mucho el interés, he estado echando un vistazo a la información que me has pasado. Por lo que veo libpcap es una biblioteca para capturar los paquetes que circulan a través de un interfaz de red, he estado investigando el API y no he encontrado ninguna función para configurar un interfaz, tan solo he visto que hay funciones para consultar información de la configuración actual. El resto son para realizar la captura de los paquetes.

En cuanto a la otra biblioteca, iflib, tiene muy buena pinta, son exactamente las funciones que necesito, la única pega que encuentro es que se trata de una implementación, por lo que he podido averiguar, para WxWorks, un sistema operativo para sistemas embebidos. O si existe una versión portada a Linux yo no he sido capaz de encontrarla.

Agradecería cualquier información que me pudierais ofrecer sobre el tema.

Un saludo.

Huy si, perdona

Efectivamente pcap (packet capture) es una librería usada para sniffar paquetes, siempre que la he usado para obtener datos de las interfaces con pcap_findalldevs(), así que había presupuesto que también se podrían modificar, y si, en lo de iflib tienes razón, perdona, fallo mio...

Lo único de provecho que he encontrado googleando ha sido el código de ifconfig, donde hay funciones del tipo set_netmask...

Me auto-contesto...

Tras mucho investigar, ayer, en el IRC de debian, charlando con DrDub (gracias por la inspiración) descubrimos que desde el propio código de net-tools se puede compilar una librería perfectamente utilizable con acceso a las todas las funcionalidades disponibles.

Aunque la interfaz que te ofrece no es muy amigable sí que se puede realizar cualquier funcionalidad, al menos lo que he probado hasta ahora... No da las funciones que serían, por decirlo de alguna forma, lógicas como if_set_config() o if_get_config(), pero no parece difícil crear una biblioteca a medida para un uso personalizado.

El proceso es sencillo, lo primero es obtener el código fuente de net-tools, por ejemplo desde http://ftp.de.debian.org/debian/pool/main/n/net-tools/net-tools_1.60.ori..., es la versión 1.60. Al descomprimirlo (tar xvfz net-tools_1.60.orig.tar.gz) obtenemos la estructura de directorios típica de un paquete de código fuente con los directorios include de ficheros de cabecera, lib con bibliotecas utilizadas, man con ficheros de manual, en este caso po con ficheros para internacionalización, etc.

Lo que tenemos que hacer es compilar, directamente, en este caso no hay que utilizar el típico ./configure, pues la configuración es "manual" al ejecutar make. Lo hacemos, pues, lo primero que hacemos es decir que protocolos queremos utilizar y alugnas cosas más, podemos dejar las opciones por defecto pulsando unos cuantos intros y amén.

Cuando comienza la compilación nos encontramos con que nos sale con errores. Es extraño que un código tan "trillado" como el que nos ocupa dé errores durante la compilación, pero para lo que necesitamos no es difícil de solventar. Como lo primero que compila son las librerías vemos en el directorio lib nos ha creado unos cuantos ficheros .o, vamos pues a solucionar los problemas. El primero fichero que nos falla es lib/inet_sr.c, sólo tenemos que introducir tras el default: de la línea 107 un break;. El otro fichero que falla (al menos en mi caso) es lib/x25_sr.c, en este tenemos que cambiar la línea 80 ( memcpy(&rt.address, &sx25.sx25_addr, sizeof(x25_address)); ) por memcpy(&rt.address, &sx25.sx25_addr, sizeof(struct x25_address));.

Con estos pequeños cambios ya podemos compilar la librería que necesitamos, pero esta vez no vamos a utilizar el Makefile del directorio raíz sino el que hay dentro del directorio lib. Primero limpiamos, make clean y después compilamos con make. No olvidemos hacerlo desde dentro del directorio lib.

Tras este proceso tendremos dentro del directorio lib el fichero libnet-tools.a que será el que finalmente utilizaremos para nuestro proyecto. Los ficheros de cabecera los obtenemos del directorio include.

Es importante al menos ejecutar una vez make en el directorio raíz para establecer la configuración de compilación posterior, el Makefile del directorio lib también utiliza el fichero config.h que se crea al ejecutar el primer make. Si tras hacer los cambios mencionados en el código vemos que no acaba de compilar el proyecto completo es por que hay otros errores, pero no me he puesto a intentar resolverlos.

Espero que sea de ayuda para alguien, me ha llevado un buen tiempo encontrarlo.

Un saludo.
MarMarAba

marmaraba escribió:

[...] Espero que sea de ayuda para alguien, me ha llevado un buen tiempo encontrarlo.

Un saludo.
MarMarAba

No soy desarrollador y dudo que yo vaya a usar esto alguna vez, pero te agradezco mucho el tiempo y detalle para haber compartido la solución .... no parece difícil arreglarlo según como lo has explicado.

Saludos y éxito en tu proyecto,
Sidd.