2013-04-10 21 views
9

Otrzymuję komunikat o błędzie kompilatora podczas kompilacji mojego starego modułu kernel, który używa funkcji netlink.netlink_kernel_create nie działa z najnowszym jądrem 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; 
    } 
.... 

Poprzednio działa poprawnie, ale teraz otrzymuję ten błąd.

error: too many arguments to function 'netlink_kernel_create' 

OS Informacja

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 

Odpowiedz

11

Wystarczy zastąpić

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

z następującym

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

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

i powinno działać. Wpadłem na te same problemy.

+0

Dziękuję bardzo, przyjacielu, bardzo mi to pomogło! –

6

To dlatego, że w 3.8 netlink_kernel_create prototyp został zmieniony:

netlink_kernel_create (struct netto * Net, int jednostka, struct netlink_kernel_cfg * cfg)

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

Nie masz opcji, ale musisz przerobić moduł jądra i usunąć ten dodatkowy argument (THIS_MODULE), a także zaimplementować strukturę netlink_kernel_cfg.

+1

Czy jest dostępny przykład? –

+1

Z takim nowym jądrem, prawdopodobnie nie. Chociaż modyfikacja implementacji powinna być dość prosta, aby dostosować ją do nowszych interfejsów API. Niestety, jest to również coś, z czym musieliśmy sobie poradzić w przeszłości (ponieważ interfejsy API jądra Linux ewoluują i często są dość niestabilne) – Technologeeks