背景
在使用dpdk做流转发的时候,期望将部分流量转到tap设备,以供Linux协议栈消费。
做测试的时候发现两个问题,
问题一: 报文超过MTU 1500的报文,在tap设备上抓不到报文。
问题二: ifconfig 修改tap设备的MTU为 2000,在tap设备上依旧抓不到报文,猜测这个地方只是修改了Linux本身的限制,并没有修改dpdk运行时代码的限制。
dpdk版本: 22.11
发包分析
dpdk发送报文到tap设备的接口为rte_eth_tx_burst,对应的tap pmd的接口为 pmd_tx_burst,查看代码发现报文长度大于MTU长度是直接返回,不执行后面的发包操作。所以问题一,问题二都得到了解释,dpdk发包报文大小是根据自己的MTU配置来的。
pmd_tx_burst 代码位置 drivers/net/tap/rte_eth_tap.c
static uint16_t
pmd_tx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
{
...max_size = *txq->mtu + (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + 4);for (i = 0; i < nb_pkts; i++)