aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOle Troan <otroan@employees.org>2023-09-01 14:15:39 +0200
committerAndrew Yourtchenko <ayourtch@gmail.com>2023-09-04 15:14:46 +0000
commit34850e01876005422ba9523df5ae0400964e1c91 (patch)
treeb0d538e9dd54d6fa183e9e8fedb587edd41bae79
parent77812045e720d1434dd36a1db90c35daad0c8e00 (diff)
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>
-rw-r--r--src/plugins/npt66/npt66_node.c4
-rw-r--r--test/test_npt66.py45
2 files changed, 28 insertions, 21 deletions
diff --git a/src/plugins/npt66/npt66_node.c b/src/plugins/npt66/npt66_node.c
index 95fe8594dbb..21dddee3951 100644
--- a/src/plugins/npt66/npt66_node.c
+++ b/src/plugins/npt66/npt66_node.c
@@ -121,7 +121,6 @@ static int
npt66_translate (ip6_header_t *ip, npt66_binding_t *binding, int dir)
{
int rv = 0;
- clib_warning ("npt66_translate: before: %U", format_ip6_header, ip, 40);
if (dir == VLIB_TX)
{
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,
binding->internal_plen);
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:
return rv;
}
diff --git a/test/test_npt66.py b/test/test_npt66.py
index 5173c62d44f..6565c38aae0 100644
--- a/test/test_npt66.py
+++ b/test/test_npt66.py
@@ -29,35 +29,43 @@ class TestNPT66(VppTestCase):
i.admin_down()
super(TestNPT66, self).tearDown()
- def send_and_verify(self, in2out, internal, external):
- if in2out:
- sendif = self.pg0
- recvif = self.pg1
- local_mac = self.pg0.local_mac
- remote_mac = self.pg0.remote_mac
- src = ipaddress.ip_interface(internal).ip + 1
- 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
+ def send_and_verify(self, internal):
+ sendif = self.pg0
+ recvif = self.pg1
+ local_mac = self.pg0.local_mac
+ remote_mac = self.pg0.remote_mac
+ src = ipaddress.ip_interface(internal).ip + 1
+ dst = self.pg1.remote_ip6
p = (
Ether(dst=local_mac, src=remote_mac)
/ IPv6(src=src, dst=dst)
/ ICMPv6EchoRequest()
+ / Raw(b"Request")
)
rxs = self.send_and_expect(sendif, p, recvif)
for rx in rxs:
- rx.show2()
original_cksum = rx[ICMPv6EchoRequest].cksum
del rx[ICMPv6EchoRequest].cksum
rx = rx.__class__(bytes(rx))
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):
self.vapi.npt66_binding_add_del(
sw_if_index=self.pg1.sw_if_index,
@@ -65,10 +73,10 @@ class TestNPT66(VppTestCase):
external=external,
is_add=True,
)
+ ## TODO use route api
self.vapi.cli(f"ip route add {internal} via {self.pg0.remote_ip6}")
- self.send_and_verify(True, internal, external)
- self.send_and_verify(False, internal, external)
+ self.send_and_verify(internal)
self.vapi.npt66_binding_add_del(
sw_if_index=self.pg1.sw_if_index,
@@ -80,6 +88,7 @@ class TestNPT66(VppTestCase):
def test_npt66_simple(self):
"""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:1234::/32", "2001:db8:1::/32")
self.do_test("fc00:1234::/63", "2001:db8:1::/56")