問題タブ [netlink]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 一般的なネットリンクのポリシーと属性の概念は何ですか?
私はnetlink
プログラミングが初めてです。プロトコルファミリgeneric
netlink
を作成するためのプログラムを書いています。インターネットで多くのドキュメントを検索したところ、家族netlink
を定義するための「属性とポリシー」のようなものが見つかりました。netlink
私はこれらのことで完全に混乱しています。
の属性について次のようなものを見つけましたlinux/netlink.h
ポリシーはnla_policy
構造体の配列です。私の質問は次のとおりです。
- ヘッダーと属性の関係は何ですか? 「属性」について説明してください。
- ポリシーとは何ですか? その必要性は何ですか? なぜこれに配列を使用するのでしょうか?
「属性のタイプを定義する」などのポリシーについて見つけましたが、
これはどういう意味ですか? 「属性の型の意味は何ですか?」という意味です。
ナンセンスな質問かもしれませんが、私は完全に混乱しています。私はこれらのことを 3 日以上理解しようとしてきました。助けてください。
ありがとう..
c - rtnetlink を使用して、メッセージ タイプを RTM_GETROUTE メッセージに返信しますか?
netlink ソケットを使用して RTM_GETROUTE メッセージをカーネルに送信しました。今、カーネルのメッセージを聞いています。
カーネルは、応答として netlink ソケットを介してnlmsghdr構造体を送信します。そのメッセージ タイプ ( nlmsg_type )を知る必要がありますか? (私のコードは、ルーティングの削除/作成イベントもリッスンしています。区別したい)。
返信はまたRTM_GETROUTEですか?コード例やリンクは大歓迎です。
ルーティングについては、NEWROUTE、DELROUTE、および GETROUTE メッセージしか見つかりませんでしたが、3 つすべてに他の目的があるようです。(1回目はルート作成時、2回目は削除時、3回目は私が使っていたリクエスト時です。)
これがメッセージを送信するための私のコードです。
受信したメッセージを解析する例がありますが、他のメッセージを除外するには、必要なメッセージ タイプ ( nlmsg_type )を知る必要があります。
c - NETLINK_ROUTE チャネルを使用してカーネル モジュールからユーザー アプリケーションに送信されたカスタマイズされたメッセージを受信できません
私は、Netlink ソケットを使用して、イーサネット インターフェイスの状態に関するカスタマイズされた通知をカーネル モジュールからユーザー空間アプリケーションにNETLINK_ROUTE
チャネル経由で送信しています。私はいくつかの記事や論文を読んできましたが、それらはすべて、独自のファミリを定義する必要があるアプローチを示しています。たとえば、netlink.h
ヘッダーで NETLINK_TEST を使用するか、NETLINK_GENERIC
. NETLINK_ROUTE を使用するソケットは既にカーネルによって所有されているため、カーネル モジュールで作成することはできません。ユーザー空間でメッセージを受信できません。どんなガイダンスも高く評価されます。したがって、ここに2つのコードがあります:
カーネル モジュール:
ユーザー空間アプリケーション:
c - カーネルとユーザー側で Netlink Socket を開いたままにする
netlink ソケットに関するいくつかの記事を読んだ後、この回答をNetlink SOに採用しようとしました。
ユーザー空間プログラムに無限ループを追加しました。
より多くのメッセージを取得するには (リンクされた回答のプログラムは、メッセージを 1 つ受信すると停止します)。
また、カーネル モジュールにタイマーを追加しました。これは、カーネル モジュールからユーザー空間プログラムに 60 秒ごとにメッセージを送信します (次のステップは、応答を返すことです)。メッセージを送信するだけでなく、printk を使用してカーネル ログに書き込み、カーネル モジュールがまだ有効かどうかを確認しているため、これは機能します。
私のユーザー空間プログラムは現在メッセージをリッスンしていますが (そうであることを願っています)、カーネルから送信された時間指定メッセージを受信していません。
だから私の質問は、両側のソケットを開いたままにして、ユーザー空間プログラムがカーネルモジュールによるメッセージをリッスンできるようにすることは可能ですか?
linux - IPC に netlink を使っている人はいますか?
2 つのユーザーランド プロセス間の通信に netlink を使用する予定です。netlink にうるさい理由の一部は、プロセスの 1 つの処理のほとんどが最終的にカーネル空間で行われ、netlink ベースの通信をそのまま使用できることです (うまくいけば)。
私が取っているアプローチは、新しいジェネリック Netlink ファミリーを定義することです (そのファミリーをサポートするためだけにカーネル モジュールを作成する必要があります - 現時点ではそのように見えます)。それは結構です。カーネルが本質的に異なるプロセス間でメッセージをルーティングするだけで、実際には何の作業もしていないサンプルコードを見ていました.これらのメッセージの実際の人口はプロセスによって処理されます.
私の質問は - プロジェクトのいずれかで同様の方法で netlink を使用している人はいますか? また、上記のアプローチは理にかなっていますか?
netlink ベースの DBUS に関する提案について読みました。しかし、その実装は見つかりませんでした。それは私の要件に最も近いものです。
ありがとう。
c - Netlink マルチキャスト カーネル グループ
私が達成しようとしているタスクは、実際には非常に単純です (文字列 "TEST" をユーザーランド デーモンにマルチキャストします) が、カーネル モジュールはコンパイルされません。エラーで停止します:
しかし、それは私が定義したマルチキャスト グループだけであってはなりませんか?
「明確化」のコードは次のとおりです。
ご協力いただきありがとうございます。
編集
これはクライアント側のコードです:
c - 汎用ネットリンク経由でカーネルからユーザーランドに 2 つ以上のフィールドを持つ構造体を受信する際の問題
この例http://www.electronicsfaq.com/2014/02/generic-netlink-sockets-example-codeに基づいて、LKM からユーザーランド (およびその逆) に構造体を送受信しようとしています。 html .
構造体をカーネルに送信します。構造体を受け取り、情報を処理し、構造体をユーザーランドに送り返します。ただし、構造体に 2 つのフィールドがある場合、送受信は問題ありませんが、もう 1 つのフィールドを追加すると、空の構造体を受け取ります。2 日前からいくつかの亜種を調査してきましたが、うまくいきませんでした。私は非常に混乱していて、どこに問題があるのか わかりません。これはコードです:
nl_user.c:
}
nl_kernel.c:
グローバル.h
注: Oracle VB で Debian 2.6.32-5 (必須) を使用しています。