Resolve NDP using provided packet-generator interface :param pg_interface: interface used to resolve, if None then this interface is used :param timeout: how long to wait for response before giving up :param link_layer: resolve for global address if False (defaul
(self, pg_interface=None, timeout=1.0, link_layer=False)
| 620 | self.test.logger.info("No ARP received on port %s" % pg_interface.name) |
| 621 | |
| 622 | def resolve_ndp(self, pg_interface=None, timeout=1.0, link_layer=False): |
| 623 | """Resolve NDP using provided packet-generator interface |
| 624 | |
| 625 | :param pg_interface: interface used to resolve, if None then this |
| 626 | interface is used |
| 627 | :param timeout: how long to wait for response before giving up |
| 628 | :param link_layer: resolve for global address if False (default) |
| 629 | or for link-layer address if True |
| 630 | |
| 631 | """ |
| 632 | if pg_interface is None: |
| 633 | pg_interface = self |
| 634 | addr = self.local_ip6_ll if link_layer else self.local_ip6 |
| 635 | self.test.logger.info( |
| 636 | "Sending NDP request for %s on port %s" % (addr, pg_interface.name) |
| 637 | ) |
| 638 | ndp_req = self.create_ndp_req(addr) |
| 639 | pg_interface.add_stream(ndp_req) |
| 640 | pg_interface.enable_capture() |
| 641 | self.test.pg_start() |
| 642 | now = time.time() |
| 643 | deadline = now + timeout |
| 644 | # Enabling IPv6 on an interface can generate more than the |
| 645 | # ND reply we are looking for (namely MLD). So loop through |
| 646 | # the replies to look for want we want. |
| 647 | while now < deadline: |
| 648 | try: |
| 649 | captured_packet = pg_interface.wait_for_packet( |
| 650 | deadline - now, filter_out_fn=None |
| 651 | ) |
| 652 | except CaptureTimeoutError: |
| 653 | self.test.logger.info("Timeout while waiting for NDP response") |
| 654 | raise |
| 655 | ndp_reply = captured_packet.copy() # keep original for exception |
| 656 | try: |
| 657 | ndp_na = ndp_reply[ICMPv6ND_NA] |
| 658 | opt = ndp_na[ICMPv6NDOptDstLLAddr] |
| 659 | self.test.logger.info( |
| 660 | "VPP %s MAC address is %s " % (self.name, opt.lladdr) |
| 661 | ) |
| 662 | self._local_mac = opt.lladdr |
| 663 | self.test.logger.debug(self.test.vapi.cli("show trace")) |
| 664 | # we now have the MAC we've been after |
| 665 | return |
| 666 | except: |
| 667 | self.test.logger.info( |
| 668 | ppp("Unexpected response to NDP request:", captured_packet) |
| 669 | ) |
| 670 | now = time.time() |
| 671 | |
| 672 | self.test.logger.debug(self.test.vapi.cli("show trace")) |
| 673 | raise CaptureTimeoutError("Timeout while waiting for NDP response") |