4

問題:

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):

  1. Linux/サンプル/bpf
  2. xdp-チュートリアル/basic01

バックグラウンド:

フィールドを介してデータを渡してxdp_md->data_meta、テールコールされた eBPF プログラムがデータにアクセスできるようにしようとしています。data_meta ポインターを調整するために、eBPF ヘルパー関数を呼び出しますbpf_xdp_adjust_meta(ctx, -delta);。ここで、delta はメタデータを保持する構造体のサイズです。これは、デルタが <= 32 である限り、正常に機能しています。これよりも大きい場合、ヘルパー関数は -13 (許可が拒否されました) を返します。そのため、メタデータのヘッドルームは、 BPF および XDP リファレンス ガイドに記載されている 256 バイトではなく、私の場合は 32 バイトであると推測しています。

4

1 に答える 1