問題:
bpf_xdp_adjust_meta(ctx, -delta);
は、デルタ > 32 の場合にエラー コード -13 (許可が拒否されました) を返してい
ます。
それで、私は何かを誤解しましたか、それともメタデータに 256 バイトを使用するにはどうすればよいですか?
プログラム:
int xdp_prog_simple(struct xdp_md *ctx)
{
bpf_printk("---BPF DEBUG--- adjust_meta: %d\n", bpf_xdp_adjust_meta(ctx, -36));
return XDP_PASS;
}
設定:
カーネル:
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 バイトであると推測しています。