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:
@ -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 */
|
||||||
|
@ -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])
|
||||||
|
Reference in New Issue
Block a user