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:

committed by
Andrew Yourtchenko

parent
77812045e7
commit
34850e0187
@@ -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;
|
||||
}
|
||||
|
@@ -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")
|
||||
|
Reference in New Issue
Block a user