From 4707f2257213a56b588fe2aeeed920917a059762 Mon Sep 17 00:00:00 2001 From: Yusuke Tatsumi Date: Mon, 5 Mar 2018 13:01:04 +0900 Subject: LB plugin: Fix Layer-4 checksum error in L3DSR. Though dst-IP address would be change in LB plugin with L3DSR method, layer-4 checksum would not be recomputed after this change. Related changes: - L3DSR: https://gerrit.fd.io/r/#/c/10203/ Change-Id: I98de7b8d80186ac77608a68050208c08d90b7c3b Signed-off-by: Yusuke Tatsumi --- src/plugins/lb/node.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/plugins/lb/node.c') diff --git a/src/plugins/lb/node.c b/src/plugins/lb/node.c index 22ba3104f92..529da73bcff 100644 --- a/src/plugins/lb/node.c +++ b/src/plugins/lb/node.c @@ -306,12 +306,17 @@ 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; ip40 = vlib_buffer_get_current(p0); ip40->dst_address = lbm->ass[asindex0].address.ip4; /* Get and rewrite DSCP bit */ ip40->tos = (u8)((vip0->dscp & 0x3F)<<2); ip40->checksum = ip4_header_checksum (ip40); + /* 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 (PREDICT_FALSE (p0->flags & VLIB_BUFFER_IS_TRACED)) -- cgit 1.2.3-korg