目录

DPDK示例片段解读

/* check port mask to possible port mask */
if (l2fwd_enabled_port_mask & ~((1 << nb_ports) - 1))
    rte_exit(EXIT_FAILURE, "Invalid portmask; possible (0x%x)\n",
        (1 << nb_ports) - 1);
  1. (1 « nb_ports) - 1: 这个表达式生成一个具有 nb_ports 个低位为 1 的掩码。例如,如果 nb_ports 为 3,那么 (1 « 3) - 1 计算结果为 7(二进制表示为 00000111)。这个值用来表示所有可能的有效端口掩码。 1 « nb_ports 计算结果是一个只有第 nb_ports 位为 1 的整数,其余位为 0。减去 1 会将所有低于第 nb_ports 位的位都设置为 1,表示所有有效端口的掩码。

  2. ((1 « nb_ports) - 1): ~ 是按位取反操作符。这个表达式生成一个掩码,其中只有 nb_ports 位以外的位为 1。即, 之后的结果中,低 nb_ports 位是 0,其他位是 1。

  3. l2fwd_enabled_port_mask & ~((1 « nb_ports) - 1): 这个表达式用来检查 l2fwd_enabled_port_mask 中是否有无效的位。通过按位与操作,检查 l2fwd_enabled_port_mask 中是否有 nb_ports 之外的位被设置为 1。 如果结果不为 0,意味着 l2fwd_enabled_port_mask 包含了无效的端口位(即超出了有效范围)。

  1. 网卡与端口的关系 1)物理网络接口卡(NIC)中,通常每个网卡有一个或多个物理端口。每个物理端口对应一个网络连接。

在 Linux 系统上,通过 ip addr 命令查询时,每个物理端口会显示一个单独的网络接口名,如 eth0、eth1。

  1. 端口对的用途
  • 流量镜像:将某个端口的数据复制并转发到另一个端口,能用于监控或分析流量

  • 负载均衡:实现对流量的均匀分配

  • 虚拟局域网(VLAN):实现不同 VLAN 间的数据包转发

  • 网络地址转化(NAT):将流量从某端口映射到内部网络的端口,通常用于公网IP与私网IP的映射

    此处应是做不同 VLAN 转发

  1. 片段
	if (port_pair_params != NULL) {
	  uint16_t idx, p;

	  for (idx = 0; idx < (nb_port_pair_params << 1); idx++) {
		p = idx & 1;
		portid = port_pair_params[idx >> 1].port[p];
		l2fwd_dst_ports[portid] =
			port_pair_params[idx >> 1].port[p ^ 1];
	  }
	}

1)nb_port_pair_params « 1 端口对的总数(每对包含两个端口) 2)p = idx & 1 计算当前端口对中的端口位置。idx 是索引,p 是 0 或 1,表示当前端口对中的第一个或第二个端口。为了对应端口配置中 FLD_PORT1 和 FLD_PORT2 的关联。

	 enum fieldnames {
	   FLD_PORT1 = 0,
	   FLD_PORT2,
	   _NUM_FLD
	 };
	   ...
	 {
	   ...
	   port_pair_params_array[nb_port_pair_params].port[0] =
		   (uint16_t)int_fld[FLD_PORT1];
	   port_pair_params_array[nb_port_pair_params].port[1] =
		   (uint16_t)int_fld[FLD_PORT2];
	   ++nb_port_pair_params;
	 }
	 port_pair_params = port_pair_params_array;

3)port_pair_params[idx » 1].port[p ^ 1] 设置目的端口。p ^ 1 是当前端口对中另一个端口的索引(0 对应 1,1 对应 0)。这将端口对中的一个端口映射到另一个端口,设置 l2fwd_dst_ports 数组中的目的端口

l2fwd-cat结合了 L2FWD 和 CPU 归属技术(CAT, Cache Allocation Technology)。它优化了缓存管理,提高了在多核处理器上转发数据包的效率。通过利用 CAT,l2fwd-cat 能够更好地分配缓存资源,从而降低缓存争用和提高性能。