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;