DPDK-VPP 学习笔记-04 Load Balancer plugin nat4 PATCH

DPDK-VPP 学习笔记-04 Load Balancer plugin nat4 PATCH

此patch主要修改以下问题:

1) NAT4 模式下RS回包经SNAT后端口错误问题;
2) NAT4 添加TCP SNAT支持;
3) NAT4 添加相同TCP/UDP port 失败问题;
diff --git a/src/plugins/lb/lb.c b/src/plugins/lb/lb.c
index ab5e808..5bec0d2 100644
--- a/src/plugins/lb/lb.c
+++ b/src/plugins/lb/lb.c
@@ -228,7 +228,7 @@ u8 *format_lb_vip_detailed (u8 * s, va_list * args)
          format_white_space, indent,
          (vip->encap_args.srv_type == LB_SRV_TYPE_CLUSTERIP)?"clusterip":
              "nodeport",
-         ntohs(vip->port), ntohs(vip->encap_args.target_port));
+         (vip->port), ntohs(vip->encap_args.target_port));
     }
 
   //Print counters
@@ -688,7 +688,7 @@ next:
             clib_bihash_kv_8_8_t kv4;
             m_key4.addr = as->address.ip4;
             m_key4.port = vip->encap_args.target_port;
-            m_key4.protocol = 0;
+            m_key4.protocol = vip->protocol;
             m_key4.fib_index = 0;
 
             if (vip->encap_args.srv_type == LB_SRV_TYPE_CLUSTERIP)
diff --git a/src/plugins/lb/node.c b/src/plugins/lb/node.c
index a2c35bd..85a0552 100644
--- a/src/plugins/lb/node.c
+++ b/src/plugins/lb/node.c
@@ -495,7 +495,15 @@ lb_node_fn (vlib_main_t * vm,
                           csum, lbm->ass[asindex0].address.ip4.as_u32);
                       uh->checksum = ip_csum_fold (csum);
                     }
-                  else
+                  else if (ip40->protocol == IP_PROTOCOL_TCP)
+                    {
+                      tcp_header_t *th0;
+                      th0 = (tcp_header_t *)(ip40 + 1);
+                      th0->dst_port = vip0->encap_args.target_port;
+                      th0->checksum = 0;
+                      th0->checksum = ip4_tcp_udp_compute_checksum (vm, p0, ip40);
+                    }
+                  else 
                     {
                       asindex0 = 0;
                     }
@@ -792,7 +800,8 @@ lb_nat_in2out_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
               ip40 = vlib_buffer_get_current (b0);
               udp0 = ip4_next_header (ip40);
               tcp0 = (tcp_header_t *) udp0;
-              proto0 = lb_ip_proto_to_nat_proto (ip40->protocol);
+              //proto0 = lb_ip_proto_to_nat_proto (ip40->protocol);
+              proto0 = ip40->protocol;
 
               key40.addr = ip40->src_address;
               key40.protocol = proto0;
@@ -807,7 +816,7 @@ lb_nat_in2out_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
 
               sm40 = pool_elt_at_index(lbm->snat_mappings, index40);
               new_addr0 = sm40->src_ip.ip4.as_u32;
-              new_port0 = sm40->src_port;
+              new_port0 = clib_host_to_net_u16(sm40->src_port);
               vnet_buffer(b0)->sw_if_index[VLIB_TX] = sm40->fib_index;
               old_addr0 = ip40->src_address.as_u32;
               ip40->src_address.as_u32 = new_addr0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值