問題タブ [xdp-bpf]
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.
gcc - ip コマンドを使用して XDP プログラムをインストールするとエラーが発生する
ネットワークドライバーに XDP プログラムをインストールしようとしていますが、セクション 4 を指しているエントリ 0 に、{map,call} 関連の relo データが含まれていない ELFというエラーが表示されます。コンパイラのバグ?! プログラム/マップのフェッチ中にエラーが発生しました!
私が実行しようとしているコード:
コンパイルコマンド: clang -O2 -g -Wall -target bpf -c filter.c -o filter.oでOK!
インストールに使用するコマンド: ip link set enp0s3 xdpgeneric obj filter.oその後、上記のエラーが発生します。
このメッセージが何を意味するのかわかりません。何か見逃していましたか?
linux-kernel - bpf_xdp_adjust_meta() がエラーコード -13 を返します (許可が拒否されました)
問題:
bpf_xdp_adjust_meta(ctx, -delta);
は、デルタ > 32 の場合にエラー コード -13 (許可が拒否されました) を返してい
ます。
それで、私は何かを誤解しましたか、それともメタデータに 256 バイトを使用するにはどうすればよいですか?
プログラム:
設定:
カーネル:
uname -rv
5.8.0-63-generic #71-Ubuntu SMP Tue Jul 13 15:59:12 UTC 2021
デバイス: xdp-tutorial/testenv の
veth 。ハードウェア ドライバーがネイティブの xdp モードをサポートしていないためです。を搭載しました:
ip link set dev test xdp obj xdp_pass_kern.o sec xdp
プログラムがxdpネイティブモードでアタッチされていることを確認しました。bpf_set_link_xdp_fd()
ユーザー空間プログラムから
また、さまざまなコンパイル環境を使用しようとしました(デフォルトでMakefile
):
バックグラウンド:
フィールドを介してデータを渡してxdp_md->data_meta
、テールコールされた eBPF プログラムがデータにアクセスできるようにしようとしています。data_meta ポインターを調整するために、eBPF ヘルパー関数を呼び出しますbpf_xdp_adjust_meta(ctx, -delta);
。ここで、delta はメタデータを保持する構造体のサイズです。これは、デルタが <= 32 である限り、正常に機能しています。これよりも大きい場合、ヘルパー関数は -13 (許可が拒否されました) を返します。そのため、メタデータのヘッドルームは、 BPF および XDP リファレンス ガイドに記載されている 256 バイトではなく、私の場合は 32 バイトであると推測しています。
c - エラーをデバッグするために bpf カーネル検証ツールの分析を読んで理解するにはどうすればよいですか?
XDP eBPF は初めてです。UDP パケットをドロップすることを目的とした BPF プログラムがありますが、カーネル検証ツールによって拒否されるため、ロードできません。以下はコードです:
プログラムをロードすると、次のように表示されます。
UDP チェック ステートメント if にエラーが表示されることがわかりました(ip->protocol == IPPROTO_UDP)
。これは、チェックにコメントを付けると、エラーなしで読み込まれるためです。
そのため、カーネル検証ツールが (前述のように) UDP チェック ステートメントを拒否する理由と、それを解決してエラーを解決するために何ができるかを知る必要があります。
ありがとう。
kernel - 2 つのカーネル空間 BPF プログラム間で BPF マップを共有する方法は?
私の問題を提示する前に。以前に質問されたさまざまな ebpf プログラム タイプ間のマップ共有を読みまし たが、私の質問には答えていないようです。
今、私がやっていることは、XDP 用と TC (No Userspace プログラム) 用の 2 つの BPF プログラムがあることです。TC プログラムでマップを作成し、グローバル名前空間に固定しました
ここで、XDP コードで同じマップにアクセスしたいと考えています。ドキュメントには、ピン留めされたオブジェクトは を使用して取得できると書かれていますがBPF_OBJ_GET
、私が見つけたのはこれのユーザー空間バージョンだけです。
では、どうすれば 2 つのカーネル空間 BPF プログラムがマップを共有できるのでしょうか? BPF_OBJ_GET
ピン留めされたオブジェクト (私の場合はマップ) を取得できる場合は、どうすればよいでしょうか? または、それを行う他の方法はありますか?
私は XDP/BPF または tc/BPF を初めて使用するので、他のカーネル空間の BPF プログラムで固定されたオブジェクトにアクセスする方法のコード例は非常に高く評価されています。
ありがとう。