問題タブ [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-kernel - Generic netlink - PID がスレッド固有ではない
一般的なネットリンクを介してユーザー空間からメッセージを受信するカーネル モジュールを作成しています。カーネルのコールバック関数で、genl_info->snd_pid にアクセスすると、プロセス ID を取得します。
libnl のドキュメントによると:
libnl は、プロセス識別子に基づいて一意のポート番号を生成し、それにオフセットを追加して、複数のソケットを使用できるようにします。初期ソケットは、下位互換性の理由からプロセス識別子と同じままです。
私のユーザー空間アプリケーションは複数のスレッドを使用しており、それらを区別する必要があります。助けてくれてありがとう。
linux - 特定の近隣の IPv6 NDP (近隣探索プロトコル) テーブルを照会する方法
私は Linux を使用しており、特定のエントリの NDP テーブルを (API 経由で) クエリする方法を見つけようとしています。これまでに (iproute2 のソースで) 見つけた唯一の例は、Netlink を使用してテーブル全体を取得します。特定のインターフェイスで特定の IPv6 アドレスについて Netlink にクエリを実行する方法はありますか? または、Netlink を使用する以外の別の方法がありますか?
c++ - boost::asio を使用した AF_NETLINK (ネットリンク) ソケット
thisおよびthisに基づいて、マルチキャスト クライアント/サーバー アプリケーションを作成しています。うまく機能します。
ただし、コンピューター内のアクティブなネットワーク インターフェイスの数が変化した場合は、このページの例のセクションのプログラムのように何かを行う必要もあります。
boost::asio::local のツールを使用する必要があると思いますが、使用するboost::asio::local::datagram_protocol
か、boost::asio::local::stream_protocol
または...
できるだけ似たようなことをする方法の例は本当に役に立ちます。ありがとう。
linux - IP キュー使用中の Netlink エラー
IP キューに問題があるようです。
いくつかの実験を実行するために使用している Linux マシンがあります。Linux マシンはルーターとして構成され、2 つの NIC を持ち、他の 2 台のコンピューターを接続し、それらのネットワーク トラフィックを管理します。すべての着信パッケージは、iptables を使用してキャプチャされ、C アプリケーションによって分析されます。
実験の一環として、パケットを分析するアプリケーションには遅延が組み込まれています。
そのため、Linuxルーターを介してパケットを送信する1台の非常に高速なコンピューターと、パケットを1つずつ分析して処理する(比較的)遅いLinuxルーターがあります。
この状況は、linux-router に接続されたコンピューターの 1 つで送信側アプリケーションを起動すると、linux-router の IP キューが (ほぼ) 瞬時にいっぱいになるという事実につながります。
IP キューの最大長は現在 1024 に設定されており、オーバーフローした場合、パケットはドロップされます。これは想定内であり、問題ありません。
しかし、(ここが興味深いところです)、時々次のエラーが発生します。
「netlink メッセージを受信できませんでした: 利用可能なバッファ領域がありません」
最初は、これは IP キューのオーバーフローが原因だと思っていましたが、いくつかの分析の結果、IP キューのバッファーがオーバーフローしていなくてもエラーが発生することがあり、バッファーが DID であってもメッセージが表示されない場合があることがわかりました。オーバーフロー。
を実行する> cat /proc/net/ip_queue
と、次の表が表示されます (IP キューのオーバーフローの監視にも使用されます)。
最後の 2 つの値を見るとQueue dropped
、バッファがいっぱいだったために IP キューに入れられなかったパケットを参照しているようです。linux-router を攻撃すると、この値が上昇するのがわかります。Netlink dropped
(その名前が示すように:))私が得ているエラーに関係しているようです。
このエラーに関する資料を検索するために最善を尽くしましたが、必要な方向に私を向けているように見えるものを見つけることができませんでした.
結論:このエラーが発生するのはなぜですか? また、エラーを回避するにはどうすればよいですか?
linux - libnl-3 インクルードが壊れていますか?
IPv6ネイバーキャッシュから情報を取得するために、Ubuntuでlibnl 3(http://www.infradead.org/~tgr/libnl/ )を使用してnetlinkを使用しようとしています。
この lib に一連のヘッダーを含めていますが、gcc は最初のヘッダーで既に失敗しています。
libnl.h のような「メイン ヘッダー」はありません。
ファイル netlink.h には、「netlink/netlink-compat.h」が含まれています。残念ながら、「/usr/include/netlink/」フォルダはありません。「/usr/include/libnl3/netlink/」しかありません
したがって、「netlink/netlink.h」を含めると、次のようになります。
Ubuntu 12.04 に次のパッケージをインストールしました。
ここで何かが欠けていますか、それとも本当に壊れていますか?
linux - netlink ソケットを使用して qdisc をセットアップする権限をユーザーに付与します
Libnl を使用し、netlink ソケットを介していくつかの qdisc をセットアップしようとするプログラムがあります。
プログラムを管理して qdisc をセットアップする権限を取得するにはどうすればよいですか?
私はそれを実行できることを知ってsudo
いますが、これは私にとってオプションではありません。limits.conf
特定のユーザーに権限を付与するような構成ファイルはありますか?
netlink - netlink でリンク ステータスの変更を引き起こしたインターフェイスを知る
Netlink ソケットを使用してプログラムを作成しました。リンク ステータスの変化 (つまり、ネットワーク ケーブルのプラグが差し込まれた/抜かれたとき) を正常に検出できます。しかし、どちらの場合も、RTM_NEWLINK
イベントを取得しています。
getifaddrs システム コールを使用して、ステータスを照会しSIOCGIFFLAGS
てステータスを取得できると考えました。IFF_UP
そのためには、リンク イベントの原因となったインターフェイスを知りたいと思います。それを知る方法はありますか?現在、構造体のメンバーnlmsghdr
やsockaddr_nl
、リンクの変更を引き起こしたインターフェイスを提供するメンバーを認識していません。
c++ - netlink経由でネットワークリンクL2アドレスを取得するには?
インターフェイス、その名前、タイプなどを取得するために使用netlink
していますが、L2 アドレスを取得できません ( ugly_data
is nlmsghdr*
):
type_
から得たのid_
とname_
同じように、正しい値が含まれていますが、ifconfig
常にaddress_
空です。何が間違っているのか、アドレスを取得する方法は?
sockets - ネットリンク コネクタ ソケット
私は以前にネットワークプログラミングを扱ったことがあります。しかし、これはネットリンクソケットへの私の最初の進出です。
私は「コネクタ」タイプの netlink ソケットを研究することにしました。他のカーネル コンポーネントと同様に、対応するユーザー コンポーネントもあります。Linux カーネルには、ucon.cというサンプル プログラムがあり、これを使用して、前述のコネクタ netlink ソケットに基づいてユーザー空間プログラムを構築できます。
そこで、ここでは、プログラムの理解を確認したい部分と、論理に従っていないプログラムの部分を特定したいと思います。十分な話。どうぞ。私が間違っているところはどこでも訂正してください。
私が理解している限り、netlink ソケットは同じマシン上のプロセスを接続するために使用される IPC メソッドであるため、プロセス ID が識別子として使用されます。また、netlink メッセージは理想的にはマルチキャストできるため、netlink ソケットが必要とするもう 1 つの識別子はメッセージ グループです。同じメッセージ グループに接続されているすべてのコンポーネントは、実際には関連しています。したがって、IPv4 の場合はsockaddrの代わりにsockaddr_inを使用しますが、ここでは上記の識別子を含むsockaddr_nlを使用します。
ここで、カーネルの TCP/IP スタックを使用しないため、netlink メッセージの場合、netlinkパケットはrawと見なすことができます(間違っている場合はここで訂正してください)。したがって、ネットリンク パケットが通過する唯一のカプセル化は、nlmsghdrとして定義されたネットリンク メッセージ ヘッダーです。
さて、プログラムの ucon に移ります。まず、コネクタプロトコルを使用main()
して NETLINK ファミリ ソケットを作成します。次に、前述の netlink socketaddress 構造体に関連情報を入力します。ここで少し実験的にするために、connector.h ファイルにエントリを追加しました。ここで私の最初の質問です。
コネクタ メッセージには、connector.h で定義された特定のタイプがあります。このコネクタのメッセージ構造は、完全に netlink の内部にあるものですよね? 同様に、netlink に関する限り、これはペイロード以外のすべてです。右?
続けて、netlink メッセージ ヘッダー構造内のnl-groupフィールドは正確には何を意味するのでしょうか? 定義には、この名前の要素は実際には含まれていません。では、ネットリンク メッセージ ヘッダーの特定のフィールドを埋めるためにオーバーレイ技術を使用しているのでしょうか? もしそうなら、対応は正確には何ですか?どこにも見つからないようです。
したがって、ソケット アドレスをソケットにバインドした後、10,000 個の一意のコネクタ ベースのデータを送信します。これは、netlink に関する限り、純粋なペイロードです。しかし、これらのメッセージに関する限り奇妙なのは、それらのすべてが同じシーケンス番号を持っているように見えることです。
次に進むと、netlink_sendサブルーチンで、上記でバインドされたソケットを介してこれらのパケットを送信することに気づきます。このサブルーチンは、さまざまな netlink ヘルパー マクロを使用して、送信するデータを操作します。上で述べたように、このmain()
関数は 10,000 個のデータを送信します。それぞれの長さは 0 であり、ack フィールドが 0 であるため確認応答は必要ありません (ここで間違っている場合は訂正してください)。したがって、各「パケット」は、何も含まれていないコネクタ メッセージ ヘッダーにすぎません。右?
ここで驚くべきことは、グローバル変数であるため、netlink_Send 関数が main() と同じシーケンス番号を使用することです。ただし、main() でのポスト インクリメントの後、現在は「1」です。したがって、基本的に私たちのネットリンクの話は、シーケンス番号「1」から始まります。それでいいですか?
linux/netlink.h で定義されているいくつかのヘルパー マクロを調べて、このプログラムで直接的または間接的に使用されているものについて、私の理解を要約しようと思います。
そのため、このマクロは最初に netlink メッセージ ヘッダーの長さを調整し、次にペイロードの長さをそれに追加します。この場合、netlink ペイロードは、独自のペイロードを持たないコネクタ ヘッダーです。私たちの場合、このマイクロは次のように使用されます
ここで、私が理解していないのは、netlink メッセージの実際のペイロードです。上記の場合、コネクタ メッセージ ヘッダーのサイズ (コネクタ メッセージ自体には独自のペイロードが含まれていないため) からポインタ (netlink メッセージの最初のバイト、したがって netlink メッセージ ヘッダーを指している) を引いたものです。そして、このポインターは (他のポインター変数と同様に) 機械語のサイズに等しく、私の場合は 4 バイトです。これをコネクタ メッセージ ヘッダーから差し引くのはなぜですか?
その後、他の IPv4 ソケットと同様に、この netlink ソケットを介してメッセージを送信します。上記の質問に関して、皆さんからのご連絡をお待ちしております。私の投稿はかなり長いので、実際の質問の前にいくつかの文を含めると役立ちます. しかし、それが私だけでなく人々に役立つことを願っています。
よろしく。
c++ - デバイス タイプ定数の説明はどこで入手できますか?
netlink ソケットを介してシステム ネットワーク デバイスに関する情報を取得しています。構造体で定義された3 つのメッセージ タイプRTM_NEWLINK
、を解析しています。RTM_DELLINK
RTM_GETLINK
ifinfomsg
定義はここからですhttp://www.kernel.org/doc/man-pages/online/pages/man7/rtnetlink.7.html
しかし、デバイス タイプ フィールドの説明はありませんifi_type
。可能な値を説明する定数はどこにありますか?
ここでも説明はありません http://www.foxprofr.com/rfc/RFC3549-LINUX-NETLINK-AS-AN-IP-SERVICES-PROTOCOL/3549.aspx
これ1
でイーサネットで772
ループバックであることがわかりましたが、可能なすべての値を知りたいです。答えは非常に明白かもしれませんが、グーグルは私に有益なことを教えたくないのです。