C Linux内核:数据包被转发到另一个接口,但不是';t向前发送

C Linux内核:数据包被转发到另一个接口,但不是';t向前发送,c,linux-kernel,network-programming,C,Linux Kernel,Network Programming,我制作了一个虚拟网络接口,将它接收到的任何数据包转发到一个物理接口eth2,目的是将它发送到任何需要的目的地 虚拟接口的hard_start_xmit功能接收数据包,更改源MAC和IP,将处理设备设置为物理接口,并将数据包类型设置为packet\u outing static int forward_packet(struct sk_buff *skb, struct net_device *dev) { char switched_device_name[] = "eth2";

我制作了一个
虚拟网络接口
,将它接收到的任何
数据包
转发到一个物理接口
eth2
,目的是将它发送到任何需要的目的地

虚拟接口的
hard_start_xmit
功能接收数据包,更改源
MAC和IP
,将处理设备设置为物理接口,并将数据包类型设置为
packet\u outing

static int forward_packet(struct sk_buff *skb, struct net_device *dev) {
    char switched_device_name[] = "eth2";
    struct net_device *switched_device = dev_get_by_name(switched_device_name);
    int ifrx_output;
    u32 switched_device_ip;

    if (!switched_device) {
        printk("Error: Couldn't get device %s for switching.\n", switched_device_name);
        return -1;
    }

    skb->dev = switched_device;
    skb->input_dev = switched_device;
    skb->pkt_type = PACKET_OUTGOING;

    switched_device_ip = get_interface_ip(switched_device);
    change_source_mac_and_ip(skb, switched_device->dev_addr, switched_device_ip);

    ifrx_output = netif_rx(skb);
    printk("netif_rx returned %d.\n", ifrx_output);
    return 0;
}
我测试了这段代码,虽然数据包确实出现在物理接口的
tcpdump
中,但在目标计算机中没有它的踪迹

我认为这种情况会发生的唯一原因是,物理接口将其视为传入数据包,而不需要传递。然而,据我所知,只有
skb->pkt_type
决定了这一点


我可能会丢失哪些其他数据包更改?

更改\u source\u mac\u和\u ip是否正确更新数据包的ip报头校验和?否则,如果在某些计算机上进行检查,它可能会被丢弃place@Ctx是的,我将更改后转发的数据包与直接为物理接口创建的数据包进行了比较,结果是一样的。您是否尝试过调用
硬启动\u xmit(skb,交换设备)
?我猜Linux默认情况下禁止传入的数据包返回与健全性检查相同的接口。