npt66: checksum applied to src address instead of dst address on rx

Applied the checksum delta to the source address instead of the destination address
in the RX direction.

Cleaned up tests a little.

Type: fix
Change-Id: I871f3448365587e5319dfbca6ea356935321ff9b
Signed-off-by: Ole Troan <otroan@employees.org>
This commit is contained in:
Ole Troan
2023-09-01 14:15:39 +02:00
committed by Andrew Yourtchenko
parent 77812045e7
commit 34850e0187
2 changed files with 28 additions and 21 deletions

View File

@@ -121,7 +121,6 @@ static int
npt66_translate (ip6_header_t *ip, npt66_binding_t *binding, int dir) npt66_translate (ip6_header_t *ip, npt66_binding_t *binding, int dir)
{ {
int rv = 0; int rv = 0;
clib_warning ("npt66_translate: before: %U", format_ip6_header, ip, 40);
if (dir == VLIB_TX) if (dir == VLIB_TX)
{ {
if (!ip6_prefix_cmp (ip->src_address, binding->internal, if (!ip6_prefix_cmp (ip->src_address, binding->internal,
@@ -147,9 +146,8 @@ npt66_translate (ip6_header_t *ip, npt66_binding_t *binding, int dir)
ip->dst_address = ip6_prefix_copy (ip->dst_address, binding->internal, ip->dst_address = ip6_prefix_copy (ip->dst_address, binding->internal,
binding->internal_plen); binding->internal_plen);
rv = npt66_adjust_checksum (binding->internal_plen, true, binding->delta, rv = npt66_adjust_checksum (binding->internal_plen, true, binding->delta,
&ip->src_address); &ip->dst_address);
} }
clib_warning ("npt66_translate: after: %U", format_ip6_header, ip, 40);
done: done:
return rv; return rv;
} }

View File

@@ -29,35 +29,43 @@ class TestNPT66(VppTestCase):
i.admin_down() i.admin_down()
super(TestNPT66, self).tearDown() super(TestNPT66, self).tearDown()
def send_and_verify(self, in2out, internal, external): def send_and_verify(self, internal):
if in2out: sendif = self.pg0
sendif = self.pg0 recvif = self.pg1
recvif = self.pg1 local_mac = self.pg0.local_mac
local_mac = self.pg0.local_mac remote_mac = self.pg0.remote_mac
remote_mac = self.pg0.remote_mac src = ipaddress.ip_interface(internal).ip + 1
src = ipaddress.ip_interface(internal).ip + 1 dst = self.pg1.remote_ip6
dst = self.pg1.remote_ip6
else:
sendif = self.pg1
recvif = self.pg0
local_mac = self.pg1.local_mac
remote_mac = self.pg1.remote_mac
src = self.pg1.remote_ip6
dst = ipaddress.ip_interface(external).ip + 1
p = ( p = (
Ether(dst=local_mac, src=remote_mac) Ether(dst=local_mac, src=remote_mac)
/ IPv6(src=src, dst=dst) / IPv6(src=src, dst=dst)
/ ICMPv6EchoRequest() / ICMPv6EchoRequest()
/ Raw(b"Request")
) )
rxs = self.send_and_expect(sendif, p, recvif) rxs = self.send_and_expect(sendif, p, recvif)
for rx in rxs: for rx in rxs:
rx.show2()
original_cksum = rx[ICMPv6EchoRequest].cksum original_cksum = rx[ICMPv6EchoRequest].cksum
del rx[ICMPv6EchoRequest].cksum del rx[ICMPv6EchoRequest].cksum
rx = rx.__class__(bytes(rx)) rx = rx.__class__(bytes(rx))
self.assertEqual(original_cksum, rx[ICMPv6EchoRequest].cksum) self.assertEqual(original_cksum, rx[ICMPv6EchoRequest].cksum)
# Generate a replies
reply = (
Ether(dst=rx[Ether].src, src=local_mac)
/ IPv6(src=rx[IPv6].dst, dst=rx[IPv6].src)
/ ICMPv6EchoRequest()
/ Raw(b"Reply")
)
replies = self.send_and_expect(recvif, reply, sendif)
for r in replies:
self.assertEqual(str(p[IPv6].src), r[IPv6].dst)
original_cksum = r[ICMPv6EchoRequest].cksum
del r[ICMPv6EchoRequest].cksum
r = r.__class__(bytes(r))
self.assertEqual(original_cksum, r[ICMPv6EchoRequest].cksum)
def do_test(self, internal, external): def do_test(self, internal, external):
self.vapi.npt66_binding_add_del( self.vapi.npt66_binding_add_del(
sw_if_index=self.pg1.sw_if_index, sw_if_index=self.pg1.sw_if_index,
@@ -65,10 +73,10 @@ class TestNPT66(VppTestCase):
external=external, external=external,
is_add=True, is_add=True,
) )
## TODO use route api
self.vapi.cli(f"ip route add {internal} via {self.pg0.remote_ip6}") self.vapi.cli(f"ip route add {internal} via {self.pg0.remote_ip6}")
self.send_and_verify(True, internal, external) self.send_and_verify(internal)
self.send_and_verify(False, internal, external)
self.vapi.npt66_binding_add_del( self.vapi.npt66_binding_add_del(
sw_if_index=self.pg1.sw_if_index, sw_if_index=self.pg1.sw_if_index,
@@ -80,6 +88,7 @@ class TestNPT66(VppTestCase):
def test_npt66_simple(self): def test_npt66_simple(self):
"""Send and receive a packet through NPT66""" """Send and receive a packet through NPT66"""
self.do_test("fd00:0000:0000::/48", "2001:4650:c3ed::/48")
self.do_test("fc00:1::/48", "2001:db8:1::/48") self.do_test("fc00:1::/48", "2001:db8:1::/48")
self.do_test("fc00:1234::/32", "2001:db8:1::/32") self.do_test("fc00:1234::/32", "2001:db8:1::/32")
self.do_test("fc00:1234::/63", "2001:db8:1::/56") self.do_test("fc00:1234::/63", "2001:db8:1::/56")