vxlan unit test - minor fixes
[vpp.git] / test / vpp_pg_interface.py
index a79af03..eeb9c1a 100644 (file)
@@ -1,5 +1,6 @@
 import os
 import time
+import socket
 from traceback import format_exc
 from scapy.utils import wrpcap, rdpcap, PcapReader
 from vpp_interface import VppInterface
@@ -9,12 +10,14 @@ from scapy.layers.inet6 import IPv6, ICMPv6ND_NS, ICMPv6ND_NA,\
     ICMPv6NDOptSrcLLAddr, ICMPv6NDOptDstLLAddr, ICMPv6ND_RA, RouterAlert, \
     IPv6ExtHdrHopByHop
 from util import ppp, ppc
-
+from scapy.utils6 import in6_getnsma, in6_getnsmac, in6_ismaddr
+from scapy.utils import inet_pton, inet_ntop
 
 def is_ipv6_misc(p):
     """ Is packet one of uninteresting IPv6 broadcasts? """
     if p.haslayer(ICMPv6ND_RA):
-        return True
+        if in6_ismaddr(p[IPv6].dst):
+            return True
     if p.haslayer(IPv6ExtHdrHopByHop):
         for o in p[IPv6ExtHdrHopByHop].options:
             if isinstance(o, RouterAlert):
@@ -142,13 +145,13 @@ class VppPGInterface(VppInterface):
             output = rdpcap(self.out_path)
             self.test.logger.debug("Capture has %s packets" % len(output.res))
         except:
-            self.test.logger.debug("Exception in scapy.rdpcap(%s): %s" %
+            self.test.logger.debug("Exception in scapy.rdpcap (%s): %s" %
                                    (self.out_path, format_exc()))
             return None
         before = len(output.res)
         if filter_out_fn:
             output.res = [p for p in output.res if not filter_out_fn(p)]
-        removed = len(output.res) - before
+        removed = before - len(output.res)
         if removed:
             self.test.logger.debug(
                 "Filtered out %s packets from capture (returning %s)" %
@@ -179,7 +182,7 @@ class VppPGInterface(VppInterface):
             if expected_count == 0:
                 raise Exception(
                     "Internal error, expected packet count for %s is 0!" % name)
-        self.test.logger.debug("Expecting to capture %s(%s) packets on %s" % (
+        self.test.logger.debug("Expecting to capture %s (%s) packets on %s" % (
             expected_count, based_on, name))
         while remaining_time > 0:
             before = time.time()
@@ -210,22 +213,20 @@ class VppPGInterface(VppInterface):
             try:
                 capture = self.get_capture(
                     0, remark=remark, filter_out_fn=filter_out_fn)
-                if capture:
-                    if len(capture.res) == 0:
-                        # junk filtered out, we're good
-                        return
-                    self.test.logger.error(
-                        ppc("Unexpected packets captured:", capture))
+                if not capture:
+                    # junk filtered out, we're good
+                    return
+                self.test.logger.error(
+                    ppc("Unexpected packets captured:", capture))
             except:
                 pass
             if remark:
                 raise AssertionError(
-                    "Non-empty capture file present for interface %s(%s)" %
+                    "Non-empty capture file present for interface %s (%s)" %
                     (self.name, remark))
             else:
-                raise AssertionError(
-                    "Non-empty capture file present for interface %s" %
-                    self.name)
+                raise AssertionError("Capture file present for interface %s" %
+                                     self.name)
 
     def wait_for_capture_file(self, timeout=1):
         """
@@ -304,8 +305,11 @@ class VppPGInterface(VppInterface):
 
     def create_ndp_req(self):
         """Create NDP - NS applicable for this interface"""
-        return (Ether(dst="ff:ff:ff:ff:ff:ff", src=self.remote_mac) /
-                IPv6(src=self.remote_ip6, dst=self.local_ip6) /
+        nsma = in6_getnsma(inet_pton(socket.AF_INET6, self.local_ip6))
+        d = inet_ntop(socket.AF_INET6, nsma)
+
+        return (Ether(dst=in6_getnsmac(nsma)) /
+                IPv6(dst=d, src=self.remote_ip6) /
                 ICMPv6ND_NS(tgt=self.local_ip6) /
                 ICMPv6NDOptSrcLLAddr(lladdr=self.remote_mac))