利用DPDK的l2fwd例程创建二口交换机

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 = &eth->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], &eth->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的值由零开始。

 

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值