2013-04-10 13 views
9

Ricevo un errore del compilatore durante la compilazione del mio vecchio modulo kernel che utilizza le funzioni netlink.netlink_kernel_create non funziona con l'ultimo kernel linux

int 
init_module() 
{ 
    /* Initialize the Netlink kernel interface */ 
    nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE); 
    if(!nl_sk) 
    { 
      printk(KERN_INFO "failed to initialize system (error: 1001)\n"); 
      return -ENOMEM; 
    } 
.... 

In precedenza funziona correttamente, ma ora sto ricevendo questo errore.

error: too many arguments to function 'netlink_kernel_create' 

OS Informazioni

uname -a 

Linux ibrar-ahmed 3.8.0-17-generiC#27-Ubuntu SMP Sun Apr 7 19:39:35 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 

risposta

11

basta sostituire

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE); 

con il seguente

struct netlink_kernel_cfg cfg = { 
    .input = recv_cmd, 
}; 

nl_sk = netlink_kernel_create(&init_net, 17, &cfg); 

e dovrebbe funzionare. Ho incontrato gli stessi problemi.

+0

Grazie mille, amico, mi ha aiutato molto! –

6

Questo perché nel 3.8 il prototipo netlink_kernel_create è stata modificata:

netlink_kernel_create (struct netta * al netto, unità int, struct netlink_kernel_cfg * CFG)

(e qv http://lxr.linux.no/linux+v3.8/include/linux/netlink.h#L48)

Non hai altra scelta che riscrivere il modulo del kernel e rimuovere quell'argomento extra (THIS_MODULE), oltre a implementare la struct netlink_kernel_cfg.

+1

C'è qualche esempio disponibile? –

+1

Con un nuovo kernel, probabilmente no. Anche se dovrebbe essere un processo abbastanza semplice per modificare l'implementazione per ospitare le nuove API. Sfortunatamente, questo è qualcosa che abbiamo avuto a che fare in passato, anche (come le API del kernel di Linux si stanno evolvendo, e spesso abbastanza instabili) – Technologeeks

Problemi correlati