“ネットリンク”を作成するにはどうすればよいですかカーネルとユーザースペースの間?
-
03-07-2019 - |
質問
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
を唯一の引数として取り、受信したネットリンクメッセージを処理する関数です。
他のヒント
はい、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インターフェースは標準であり、カーネル間で更新される可能性はわずかです。
所属していません StackOverflow