TC bpf数据包通过更新校验和转发到其他设备

问题描述

我想将UDP / TCP数据包转发到连接到同一路由器的其他设备。我只是编写通过检查数据包类型及其有效负载将数据包转发到其他接口的代码。这工作正常,但是当我尝试将同一数据包转发到其他设备时,我在其他设备上未收到该数据包。 我通过使用辅助函数更新了校验和,并重定向到其他设备对我不起作用。 TC_ACT_REDIRECTXDP_TX类似吗?

这是一段代码 (如果c的值为1,它将更新目标地址并将数据包转发到目标):

if (c == 1) {
    int ipaddr = htonl(3232260738);  // Dest: 192.168.98.130

    sum = bpf_csum_diff((void *)&old1_daddr,4,(void *)&ipaddr,0);

    bpf_skb_store_bytes(skb,ETH_HLEN + offsetof(struct iphdr,daddr),0);
    bpf_l3_csum_replace(skb,IP_CSUM_OFFSET,sum,0);
    bpf_l4_csum_replace(skb,IP_CSUM_OFFSET1,BPF_F_PSEUDO_HDR);

    bpf_clone_redirect(skb,skb->ifindex,0 );

    return TC_ACT_REDIRECT;
}

这是入口tc命令

sudo tc filter add dev ens33 ingress bpf da obj tcbpf1_kern.o sec classifier

使用上面的代码,我可以将数据包重定向到虚拟接口,但不能重定向到更新的目的地。

解决方法

如果我没记错的话,则说明您缺少目标设备的MAC地址。您还需要更新MAC地址。您正在虚拟机上接收数据包,因为它没有mac地址。请检查mac地址,您的问题将得到解决。