LB plugin: Fix Layer-4 checksum error in L3DSR. 51/10951/2
authorYusuke Tatsumi <ytatsumi@yahoo-corp.jp>
Mon, 5 Mar 2018 04:01:04 +0000 (13:01 +0900)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 6 Mar 2018 15:55:07 +0000 (15:55 +0000)
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 <ytatsumi@yahoo-corp.jp>
src/plugins/lb/node.c

index 22ba310..529da73 100644 (file)
@@ -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))