パケットの内容を変更しながら、XDP_TX を使用して受信したパケットを再送信したいと考えています。dst と src の IP アドレスを交換したので、送信者に正常に送り返されました。これですべて完璧に機能しています。
ただし、パケットのペイロードを別のものに変更したいのですが、私が直面していて頭を包むことができない問題は、受信したパケットのサイズまでしかコンテンツを変更できず、それ以上のデータを追加できないことです(たとえば、26 バイトも送信した場合は、26 バイトのペイロードのみを返送します)。
データに到達するまで、通常の IP ヘッダーに沿って進むことで、UDP パケットのペイロードを取得できます。
uint8_t *udp_bytes = data + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr);
これに加えて、境界チェックを行って、パケットが期待どおりの長さであることを確認します。
if (!(udp_bytes + 25 > (uint8_t *)data_end)) {
このタイプのパケットは、常に合計 26 バイトになります。次に、次の方法でパケットの内容を (悪い方法ではありますが) 変更できます。
*udp_bytes++ = 0xff;
*udp_bytes++ = 0xff;
*udp_bytes++ = 0xff;
*udp_bytes++ = 0xff;
*udp_bytes++ = 0x80;
*udp_bytes++ = 0x17;
*udp_bytes++ = 0xe2;
*udp_bytes++ = 0x98;
*udp_bytes++ = 0xa0;
*udp_bytes++ = 0x20;
*udp_bytes++ = 0x97;
*udp_bytes++ = 0x20;
*udp_bytes++ = 0x60;
*udp_bytes++ = 0x6c;
*udp_bytes++ = 0x69;
*udp_bytes++ = 0x60;
*udp_bytes++ = 0x79;
*udp_bytes++ = 0x52;
*udp_bytes++ = 0x6f;
*udp_bytes++ = 0x6c;
*udp_bytes++ = 0x65;
*udp_bytes++ = 0x70;
*udp_bytes++ = 0x6c;
*udp_bytes++ = 0x61;
*udp_bytes++ = 0x70;
ただし、着信パケットのバイト数に制限されています。別のバイトを追加しようとすると、ベリファイアがロードを妨げます。より多くのペイロードを許可するようにパケットを拡張することは可能ですか? 私は見ましbpf_xdp_adjust_head
たが、これが私が必要としているものかどうかはわかりません!