书接 eBPF Talk: 揭秘 XDP 转发网络包 未竟的内容,看看最后 generic_xdp_tx() 函数中的发包详情。

1
2
3
4
5
6
// ${KERNEL}/net/core/dev.c

generic_xdp_tx()
|-->netdev_start_xmit()
    |-->__netdev_start_xmit()
        |-->ops->ndo_start_xmit(skb, dev);

由以上函数调用栈可知,XDP_REDIRECTXDP_TX 的处理办法是直接调用目标网络设备的 ndo_start_xmit() 发包函数直接将网络包发送出去。

因为不是调用 dev_queue_xmit() 设备层的发包函数进行发包,所以该网络包不会经过目标设备在内核协议栈设备层的 egress 处理阶段。

意即,经过 XDP 重定向的网络包无法在目标网络设备的 tc egress 中再处理一遍。

小结

这么一分析,就觉得 XDP_REDIRECT + tc egress 搭配工作的想法特别不靠谱。

但如果没这么分析一下,又怎么知道这想法不可行呢?