“ネットリンク”を作成するにはどうすればよいですかカーネルとユーザースペースの間?

StackOverflow https://stackoverflow.com/questions/805634

質問

netlinkを使用して、アプリケーションとカーネル空間の間で通信したい。私のLinuxカーネルバージョンは2.6.28で、次は私の間違ったコードです。

nf_sock=netlink_kernel_create(NL_PROTO,0,nl_user_skb,THIS_MODULE);

省略されたエラーメッセージは次のとおりです。

error: too few arguments to function 'netlink_kernel_create'

ファイル< linux / netlink.h> では、関数 netlink_kernel_create()

として定義されています
extern struct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups,void (*input)(struct sk_buff *skb),struct mutex *cb_mutex,struct module *module)

最初の引数 net に何を使用すべきかわかりません。誰かがここで何を使うべきか説明できますか?

役に立ちましたか?

解決

struct net には、ネットワーク名前空間、プロセスで利用可能なネットワークリソースのセットに関する情報が含まれています。複数のネットワーク名前空間(つまり、ネットワークスタックの複数のインスタンス)が存在する可能性がありますが、ほとんどのドライバーはinit_net名前空間を使用します。

あなたの呼び出しはおそらく次のようになります

nf_sock = netlink_kernel_create(&init_net,
                                NETLINK_USERSOCK,
                                0,
                                nl_rcv_func,
                                NULL,
                                THIS_MODULE);

nl_rcv_func は、 struct sk_buff * skb を唯一の引数として取り、受信したネットリンクメッセージを処理する関数です。

他のヒント

このなどのガイドに従っているようです。 2005年以降)は、カーネルの開発によって追い越された可能性があります。カーネル側からネットリンクを作成する内部APIが変更されたようです。

ローカルカーネルツリーのDocumentation /フォルダでいくつかの(できれば新しい)ドキュメントを確認するか、コード自体を読んでください。また、Linuxカーネルのメーリングリストアーカイブをトロールすることにより、起こったようです。

ここは、現在の実際の実装です2.6.29、逆方向にパズルを解く場合(もちろん、自分のツリーでこれをまだチェックしていない場合)。

はい、struct netは確かにネット名前空間用ですが、常にinit_netを使用するのは適切ではありません。次のように独自のpernet_operationsを登録する必要があります。

static struct pernet_operations fib_net_ops = {
        .init = fib_net_init,
        .exit = fib_net_exit,
};

static int __net_init fib_net_init(struct net *net)
{
        int error;

#ifdef CONFIG_IP_ROUTE_CLASSID
        net->ipv4.fib_num_tclassid_users = 0;
#endif
        error = ip_fib_net_init(net);
        if (error < 0)
                goto out;
        error = nl_fib_lookup_init(net);
        if (error < 0)
                goto out_nlfl;
        error = fib_proc_init(net);
        if (error < 0)
                goto out_proc;
out:
        return error;

out_proc:
        nl_fib_lookup_exit(net);
out_nlfl:
        ip_fib_net_exit(net);
        goto out;
}

static int __net_init nl_fib_lookup_init(struct net *net)
{
        struct sock *sk;
        struct netlink_kernel_cfg cfg = {
                .input  = nl_fib_input,
        };

        sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg);
        if (sk == NULL)
                return -EAFNOSUPPORT;
        net->ipv4.fibnl = sk;
        return 0;
}

そして最後に:

register_pernet_subsys(&fib_net_ops);

カーネル/ユーザー通信には、 ioctl をお勧めします。 ioctlインターフェースは標準であり、カーネル間で更新される可能性はわずかです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top