2013-04-10 5 views
9

netlink関数を使用している古いkernelモジュールをコンパイルする際にコンパイルエラーが発生します。netlink_kernel_createが最新の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; 
    } 
.... 

以前はうまくいきましたが、今はこのエラーが発生しています。 3.8にnetlink_kernel_createプロトタイプが変更されたためだ

error: too many arguments to function 'netlink_kernel_create' 

OS情報

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 

答えて

11

ただ、次

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

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

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

を交換し、それが動作するはずです。私は同じ問題に遭遇した。

+0

ありがとう、友人、それは私を大いに助けました! –

6

netlink_kernel_create(構造体のネット*ネット、int型のユニット、構造体netlink_kernel_cfg * CFG)

(およびqv http://lxr.linux.no/linux+v3.8/include/linux/netlink.h#L48

あなたは、カーネルモジュールを書き直して余分な引数(THIS_MODULE)を削除するだけでなく、netlink_kernel_cfg構造体を実装することもできます。

+1

使用可能な例はありますか? –

+1

このような新しいカーネルでは、おそらくそうではありません。より新しいAPIに対応するように実装を変更するのは、かなり簡単なプロセスです。残念ながら、これは過去にも対処しなければならなかったものです(LinuxカーネルAPIが進化しており、しばしばかなり不安定なため) – Technologeeks

関連する問題