基于DPDK实现二层交换

上次分析了DPDK的l2fwd的源码,l2fwd实现了相邻两个端口之间的二层交换,入端口和出端口的关系是通过一个数组来实现的,从某一个端口进只能从一个固定的端口出。于是想到对其转发的规则做出修改就能实现一个二层交换机,也就是说在l2fwd中创建一个mac表,这个表中存储了每一个端口上的主机的mac地址,然后当l2fwd收到一个数据包的时候就能够根据mac表将数据包从对应的端口转发出去从而实现了二层交换的功能,当然这个mac表的内容是需要l2fwd根据实际网络来自学习的,结合上次总结的两个主机在二层交换情况下的通信过程可以知道,交换机是根据主机的ARP数据包的源mac地址来学习主机的位置的,所以只要按照这样的逻辑对l2fwd改造就能实现一个二层交换机。

实现步骤

1. 创建mac表

mac表主要记录了每一个端口上的主机的mac地址,因此可以创建如下的结构体来实现

// 添加结构体
#define MAX_HOST_PER_PORT 100
struct host_in_this_port{
	unsigned nb_host; // host的数量
	struct ether_addr host_list[MAX_HOST_PER_PORT]; // mac地址的数组
};
struct host_in_this_port all_port_host[RTE_MAX_ETHPORTS];// 创建一个host_in_this_port结构体数组 存放这个端口的host列表

并且要初始化这个结构体的一个全局的数组来存放每一个端口上的主机的mac地址

2. 交换机自学习过程

自学习过程也就是填充刚刚创建的all_port_host数组的过程,根据二层交换的过程,对主机的位置的学习主要是根据ARP包的源地址来实现的,也就是说在哪个端口上收到了ARP包,那么这个ARP包的源MAC所对应的主机的位置就在这个端口上,代码如下

    struct ether_addr eth_src = eth->s_addr;
    struct ether_addr eth_dst = eth->d_addr;
    uint16_t type = eth->ether_type;    

    struct host_in_this_port *this_port = NULL;
    if (type = 0x0806)
    {

        // 根据数据链路层的源mac学习每一个主机的位置
        // 将这个源mac添加到portid的host_in_this_port的结构体中
        this_port = &all_port_host[portid];
        int host_nb = this_port->nb_host;
        int count = 0;
        int exist = 0;
        for (count = 0; count < host_nb; count++)
        {
            if (isMacAddrEqual(this_port -> host_list[count], eth_src))
            {
                exist = 1;
          
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值