l2fwd示例程序默认情况下会改变数据包的MAC地址,如下:
源MAC地址替换为发送端口的MAC地址;
目的MAC地址替换为02:00:00:00:00:TX_PORT_ID。
static void l2fwd_mac_updating(struct rte_mbuf *m, unsigned dest_portid)
{
struct ether_hdr *eth;
void *tmp;
eth = rte_pktmbuf_mtod(m, struct ether_hdr *);
/* 02:00:00:00:00:xx */
tmp = ð->d_addr.addr_bytes[0];
*((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_portid << 40);
/* src addr */
ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], ð->s_addr);
}
但是如果增加命令行选项--no-mac-updating,数据包的源和目的MAC地址将保持不变。此时如果添加2个接口,如portmask为0x3,l2fwd例程将在port0和port1直接执行二层的数据转发,相当于一个交换机的功能。但是由于l2fwd只是简单的在两个相邻口直接转发,并没有交换机所需的MAC转发表,仅可做为一个演示程序,对于一个只有两个网口的交换机来说并没有实际用处,但是可用来测试两个网口之间的二层转发性能。
int main(int argc, char **argv)
{
RTE_ETH_FOREACH_DEV(portid) {
/* skip ports that are not enabled */
if ((l2fwd_enabled_port_mask & (1 << portid)) == 0)
continue;
if (nb_ports_in_mask % 2) {
l2fwd_dst_ports[portid] = last_port;
l2fwd_dst_ports[last_port] = portid;
}
else
last_port = portid;
nb_ports_in_mask++;
}
}
以上可见其转发逻辑,portid为偶数的接口将数据包发送到加一的portid为基数接口;portid为基数的接口将数据包发送对减一的portid为偶数的接口,portid的值由零开始。