2012-06-15 10 views
5

Quiero capturar fotogramas cuando los recibe un determinado NIC; extraer algo de información de ellos (actualmente necesito capturar el MAC fuente y las direcciones IP de origen); guarde esta información en alguna estructura de datos pública; y deje que el cuadro suba en su camino hacia la pila de TCP/IP.
Cómo capturar marcos de red en un módulo kernel

He usado Netfilter anteriormente, pero aparentemente no proporciona ganchos de capa de enlace.
¿Hay alguna manera de que pueda hacer esto?

Estoy escribiendo esto como un Kernel Module; ejecutando Linux kernel 2.6.32

Respuesta

6

En realidad Netfilter debería funcionar bien porque recibe el paquete completo (almacenado internamente como un sk_buff que incluye la información de la capa Link). Aquí hay un código de muestra que debería comenzar. Este código intercepta todos los paquetes entrantes para un dispositivo dado e imprime el src MAC y src IP.

static struct nf_hook_ops nfin; 

static unsigned int hook_func_in(unsigned int hooknum, 
      struct sk_buff *skb, 
          const struct net_device *in, 
          const struct net_device *out, 
          int (*okfn)(struct sk_buff *)) 
{ 
    struct ethhdr *eth; 
    struct iphdr *ip_header; 
    /* check *in is the correct device */ 
    if (in is not the correct device) 
      return NF_ACCEPT;   

    eth = (struct ethhdr*)skb_mac_header(skb); 
    ip_header = (struct iphdr *)skb_network_header(skb); 
    printk("src mac %pM, dst mac %pM\n", eth->h_source, eth->h_dest); 
    printk("src IP addr:=%d.%d.%d.%d:%d\n", NIPQUAD(ip_headr->saddr)); 
    return NF_ACCEPT; 
} 

static int __init init_main(void) 
{ 
    nfin.hook  = hook_func_in; 
    nfin.hooknum = NF_IP_LOCAL_IN; 
    nfin.pf  = PF_INET; 
    nfin.priority = NF_IP_PRI_FIRST; 
    nf_register_hook(&nfin); 

    return 0; 
} 



static void __exit cleanup_main(void) 
{ 
    nf_unregister_hook(&nfin); 
} 
module_init(init_main); 
module_exit(cleanup_main); 
+0

lol, me siento un poco tonto por no probar esto; muchas gracias señor ^^ – Fingolfin

+0

@Adel Me alegro de que funcione para usted! – ajpyles

+0

debe ser: printk ("dirección de IP src: =% d.% D.% D.% D:% d \ n", NIPQUAD (ip_header-> saddr)); – Raman

Cuestiones relacionadas