我想使用 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
但不确定这是否是我需要的!