L3DSR fix ip checksum issue and add test

Change-Id: Iedebbac71d3e694b915d6a126c80ecc3b5473a4a
Signed-off-by: Hongjun Ni <hongjun.ni@intel.com>
This commit is contained in:
Hongjun Ni
2018-06-08 07:12:05 +08:00
committed by Dave Barach
parent 8d2e9bd8d8
commit 6fb0d9b269
2 changed files with 18 additions and 9 deletions

View File

@ -387,22 +387,25 @@ lb_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame,
ip4_header_t *ip40; ip4_header_t *ip40;
tcp_header_t *th0; tcp_header_t *th0;
ip_csum_t csum; ip_csum_t csum;
u32 old_dst; u32 old_dst, new_dst;
u32 old_dscp; u8 old_tos, new_tos;
ip40 = vlib_buffer_get_current (p0); ip40 = vlib_buffer_get_current (p0);
old_dst = ip40->dst_address.as_u32; old_dst = ip40->dst_address.as_u32;
old_dscp = ip40->tos; new_dst = lbm->ass[asindex0].address.ip4.as_u32;
ip40->dst_address = lbm->ass[asindex0].address.ip4; ip40->dst_address.as_u32 = lbm->ass[asindex0].address.ip4.as_u32;
/* Get and rewrite DSCP bit */ /* Get and rewrite DSCP bit */
old_tos = ip40->tos;
new_tos = (u8) ((vip0->encap_args.dscp & 0x3F) << 2);
ip40->tos = (u8) ((vip0->encap_args.dscp & 0x3F) << 2); ip40->tos = (u8) ((vip0->encap_args.dscp & 0x3F) << 2);
csum = ip40->checksum; csum = ip40->checksum;
csum = ip_csum_sub_even (csum, old_dst); csum = ip_csum_update (csum, old_tos, new_tos,
csum = ip_csum_sub_even (csum, old_dscp); ip4_header_t,
csum = ip_csum_add_even (csum, tos /* changed member */);
lbm->ass[asindex0].address.ip4.as_u32); csum = ip_csum_update (csum, old_dst, new_dst,
csum = ip_csum_add_even (csum, ip40->tos); ip4_header_t,
dst_address /* changed member */);
ip40->checksum = ip_csum_fold (csum); ip40->checksum = ip_csum_fold (csum);
/* Recomputing L4 checksum after dst-IP modifying */ /* Recomputing L4 checksum after dst-IP modifying */

View File

@ -4,6 +4,7 @@ from scapy.layers.inet import IP, UDP
from scapy.layers.inet6 import IPv6 from scapy.layers.inet6 import IPv6
from scapy.layers.l2 import Ether, GRE from scapy.layers.l2 import Ether, GRE
from scapy.packet import Raw from scapy.packet import Raw
from scapy.data import IP_PROTOS
from framework import VppTestCase from framework import VppTestCase
from util import ppp from util import ppp
@ -145,6 +146,11 @@ class TestLB(VppTestCase):
self.assertEqual(ip.dst, "10.0.0.%u" % asid) self.assertEqual(ip.dst, "10.0.0.%u" % asid)
self.assertEqual(ip.tos, 0x1c) self.assertEqual(ip.tos, 0x1c)
self.assertEqual(len(ip.options), 0) self.assertEqual(len(ip.options), 0)
self.assert_ip_checksum_valid(p)
if ip.proto == IP_PROTOS.tcp:
self.assert_tcp_checksum_valid(p)
elif ip.proto == IP_PROTOS.udp:
self.assert_udp_checksum_valid(p)
elif (encap == 'nat4'): elif (encap == 'nat4'):
ip = p[IP] ip = p[IP]
asid = int(ip.dst.split(".")[3]) asid = int(ip.dst.split(".")[3])