aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/lb
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/lb')
-rw-r--r--src/plugins/lb/node.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/plugins/lb/node.c b/src/plugins/lb/node.c
index 870201d18eb..b5e9da71376 100644
--- a/src/plugins/lb/node.c
+++ b/src/plugins/lb/node.c
@@ -435,7 +435,6 @@ lb_node_fn (vlib_main_t * vm,
else if (encap_type == LB_ENCAP_TYPE_L3DSR) /* encap L3DSR*/
{
ip4_header_t *ip40;
- tcp_header_t *th0;
ip_csum_t csum;
u32 old_dst, new_dst;
u8 old_tos, new_tos;
@@ -459,9 +458,20 @@ lb_node_fn (vlib_main_t * vm,
ip40->checksum = ip_csum_fold (csum);
/* Recomputing L4 checksum after dst-IP modifying */
- th0 = ip4_next_header (ip40);
- th0->checksum = 0;
- th0->checksum = ip4_tcp_udp_compute_checksum (vm, p0, ip40);
+ if (ip40->protocol == IP_PROTOCOL_TCP)
+ {
+ tcp_header_t *th0;
+ th0 = ip4_next_header (ip40);
+ th0->checksum = 0;
+ th0->checksum = ip4_tcp_udp_compute_checksum (vm, p0, ip40);
+ }
+ else if (ip40->protocol == IP_PROTOCOL_UDP)
+ {
+ udp_header_t *uh0;
+ uh0 = ip4_next_header (ip40);
+ uh0->checksum = 0;
+ uh0->checksum = ip4_tcp_udp_compute_checksum (vm, p0, ip40);
+ }
}
else if ((encap_type == LB_ENCAP_TYPE_NAT4)
|| (encap_type == LB_ENCAP_TYPE_NAT6))