def test(self):
        # 1 ALL: Build and verify the topology
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[DUT_ROUTER1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')

        self.nodes[MED1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[MED1].get_state(), 'child')

        # 2 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent
        # mesh-local address X
        X = "fd00:db8:0000:0000:aa55:aa55:aa55:aa55"
        self.assertFalse(self.nodes[MED1].ping(X))

        self.simulator.go(config.AQ_TIMEOUT)

        # Verify DUT_ROUTER1 sent an Address Query Request message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(
            msg,
            self.nodes[DUT_ROUTER1],
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
        )

        # Verify DUT_ROUTER1 didn't receive an Address Query Notification
        # message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/an', False)
        self.assertTrue(msg is None)

        # 2 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent mesh-local address X before
        #         ADDRESS_QUERY_INITIAL_RETRY_DELAY timeout expires
        self.assertFalse(self.nodes[MED1].ping(X))

        self.simulator.go(config.ADDRESS_QUERY_INITIAL_RETRY_DELAY)

        # Verify DUT_ROUTER1 didn't generate an Address Query Request message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/aq', False)
        self.assertTrue(msg is None)

        # 3 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent mesh-local address X after
        #         ADDRESS_QUERY_INITIAL_RETRY_DELAY timeout expired
        self.assertFalse(self.nodes[MED1].ping(X))

        # Verify DUT_ROUTER1 sent an Address Query Request message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(
            msg,
            self.nodes[DUT_ROUTER1],
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
        )
Пример #2
0
    def test(self):
        # 1
        self.nodes[DUT_LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')

        for i in range(ROUTER1, MED3 + 1):
            self.nodes[i].start()

        self.simulator.go(5)

        for i in [ROUTER1, ROUTER2]:
            self.assertEqual(self.nodes[i].get_state(), 'router')

        for i in MTDS:
            self.assertEqual(self.nodes[i].get_state(), 'child')

        # 2
        leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
        msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
        command.check_mle_advertisement(msg)

        # 3
        self.nodes[ROUTER2].add_prefix('2001:2:0:1::/64', 'paros')
        self.nodes[ROUTER2].register_netdata()

        # Set lowpan context of sniffer
        self.simulator.set_lowpan_context(1, '2001:2:0:1::/64')

        self.nodes[MED1].add_ipaddr('2001:2:0:1::1234')
        self.nodes[SED1].add_ipaddr('2001:2:0:1::1234')

        self.simulator.go(5)

        # 4
        # Flush the message queue to avoid possible impact on follow-up
        # verification.
        self.simulator.get_messages_sent_by(DUT_LEADER)

        self.nodes[MED3].ping('2001:2:0:1::1234')

        # Verify DUT_LEADER sent an Address Query Request to the Realm local
        # address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_LEADER],
                                    config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 5 & 6
        # Verify DUT_LEADER sent an Address Error Notification to the Realm
        # local address.
        self.simulator.go(5)
        dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
        msg = dut_messages.next_coap_message('0.02', '/a/ae')
        command.check_address_error_notification(
            msg, self.nodes[DUT_LEADER],
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
    def test(self):
        # 1
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[DUT_ROUTER1].start()
        for i in MTDS:
            self.nodes[i].start()
        self.simulator.go(5)

        self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')

        for i in MTDS:
            self.assertEqual(self.nodes[i].get_state(), 'child')

        # This method flushes the message queue so calling this method again
        # will return only the newly logged messages.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)

        # 2
        for ED in [ED1, ED2, ED3, ED4]:
            ed_mleid = self.nodes[ED].get_ip6_address(
                config.ADDRESS_TYPE.ML_EID)
            self.assertTrue(self.nodes[SED1].ping(ed_mleid))
            self.simulator.go(5)

            # Verify DUT_ROUTER1 generated an Address Query Request to find
            # each node's RLOC.
            dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
            msg = dut_messages.next_coap_message('0.02', '/a/aq')
            command.check_address_query(
                msg,
                self.nodes[DUT_ROUTER1],
                config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
            )

        # 3 & 4
        # This method flushes the message queue so calling this method again
        # will return only the newly logged messages.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)

        for ED in [ED1, ED2, ED3, ED4]:
            ed_mleid = self.nodes[ED].get_ip6_address(
                config.ADDRESS_TYPE.ML_EID)
            self.assertTrue(self.nodes[SED1].ping(ed_mleid))
            self.simulator.go(5)

            # Verify DUT_ROUTER1 didn't generate an Address Query Request.
            dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
            msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
            assert (
                msg is None
            ), "Error: The DUT sent an unexpected Address Query Request"
    def test(self):
        # 1
        self.nodes[DUT_LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')

        for i in range(ROUTER1, MED3 + 1):
            self.nodes[i].start()

        self.simulator.go(5)

        for i in [ROUTER1, ROUTER2]:
            self.assertEqual(self.nodes[i].get_state(), 'router')

        for i in MTDS:
            self.assertEqual(self.nodes[i].get_state(), 'child')

        # 2
        leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
        msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
        command.check_mle_advertisement(msg)

        # 3
        self.nodes[ROUTER2].add_prefix('2001:2:0:1::/64', 'paros')
        self.nodes[ROUTER2].register_netdata()

        # Set lowpan context of sniffer
        self.simulator.set_lowpan_context(1, '2001:2:0:1::/64')

        self.nodes[MED1].add_ipaddr('2001:2:0:1::1234')
        self.nodes[SED1].add_ipaddr('2001:2:0:1::1234')

        self.simulator.go(5)

        # 4
        # Flush the message queue to avoid possible impact on follow-up verification.
        self.simulator.get_messages_sent_by(DUT_LEADER)

        self.nodes[MED3].ping('2001:2:0:1::1234')

        # Verify DUT_LEADER sent an Address Query Request to the Realm local address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 5 & 6
        # Verify DUT_LEADER sent an Address Error Notification to the Realm local address.
        self.simulator.go(5)
        dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
        msg = dut_messages.next_coap_message('0.02', '/a/ae')
        command.check_address_error_notification(msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
    def test(self):
        # 1 ALL: Build and verify the topology
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[DUT_ROUTER1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')

        self.nodes[MED1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[MED1].get_state(), 'child')

        # 2 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent mesh-local address X
        X = "fdde:ad00:beef:0000:aa55:aa55:aa55:aa55"
        self.assertFalse(self.nodes[MED1].ping(X))

        self.simulator.go(config.AQ_TIMEOUT)

        # Verify DUT_ROUTER1 sent an Address Query Request message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER1], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # Verify DUT_ROUTER1 didn't receive an Address Query Notification message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/an', False)
        self.assertTrue(msg is None)

        # 2 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent mesh-local address X before
        #         ADDRESS_QUERY_INITIAL_RETRY_DELAY timeout expires
        self.assertFalse(self.nodes[MED1].ping(X))

        self.simulator.go(config.ADDRESS_QUERY_INITIAL_RETRY_DELAY)

        # Verify DUT_ROUTER1 didn't generate an Address Query Request message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/aq', False)
        self.assertTrue(msg is None)

        # 3 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent mesh-local address X after
        #         ADDRESS_QUERY_INITIAL_RETRY_DELAY timeout expired
        self.assertFalse(self.nodes[MED1].ping(X))

        # Verify DUT_ROUTER1 sent an Address Query Request message
        dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
        msg = dut_router1_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER1], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
    def test(self):
        # 1
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[DUT_ROUTER1].start()
        for i in MTDS:
            self.nodes[i].start()
        self.simulator.go(5)

        self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')

        for i in MTDS:
            self.assertEqual(self.nodes[i].get_state(), 'child')

        # This method flushes the message queue so calling this method again will return only the newly logged messages.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)

        # 2
        for ED in [ED1, ED2, ED3, ED4]:
            ed_mleid = self.nodes[ED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
            self.assertTrue(self.nodes[SED1].ping(ed_mleid))
            self.simulator.go(5)

            # Verify DUT_ROUTER1 generated an Address Query Request to find each node's RLOC.
            dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
            msg = dut_messages.next_coap_message('0.02', '/a/aq')
            command.check_address_query(msg, self.nodes[DUT_ROUTER1], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 3 & 4
        # This method flushes the message queue so calling this method again will return only the newly logged messages.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)

        for ED in [ED1, ED2, ED3, ED4]:
            ed_mleid = self.nodes[ED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
            self.assertTrue(self.nodes[SED1].ping(ed_mleid))
            self.simulator.go(5)

            # Verify DUT_ROUTER1 didn't generate an Address Query Request.
            dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
            msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
            assert msg is None, "Error: The DUT sent an unexpected Address Query Request"
    def test(self):
        # 1
        self.nodes[LEADER].start()
        self.nodes[LEADER].set_state('leader')
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[ROUTER1].start()
        self.nodes[DUT_ROUTER2].start()
        self.nodes[ROUTER3].start()
        self.nodes[MED1].start()
        time.sleep(5)

        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
        self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
        self.assertEqual(self.nodes[MED1].get_state(), 'child')

        # 2
        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)

        router3_mleid = self.nodes[ROUTER3].get_ip6_address(
            config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2],
                                    config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 3
        # Wait the finish of address resolution traffic triggerred by previous ping.
        time.sleep(5)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)

        med1_mleid = self.nodes[MED1].get_ip6_address(
            config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 responded with an Address Notification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2],
                                           self.nodes[ROUTER1])

        # 4
        # Wait the finish of address resolution traffic triggerred by previous ping.
        time.sleep(5)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)

        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 didn't send an Address Query Request.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "The Address Query Request is not expected."

        # 5
        self.nodes[ROUTER3].stop()

        # Wait for the Leader to expire its Router ID.
        # MAX_NEIGHBOR_AGE + INFINITE_COST_TIMEOUT + ID_REUSE_DELAY + propagation time + transmission time ~ 580s.
        time.sleep(580)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2],
                                    config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 6
        self.nodes[MED1].stop()
        time.sleep(MED1_TIMEOUT)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 didn't respond with an Address Notification.
        dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an', False)
        assert msg is None, "The Address Notification is not expected."
Пример #8
0
    def test(self):
        # 1 & 2 ALL: Build and verify the topology
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        # Configure the LEADER to be a DHCPv6 Border Router for prefixes 2001::
        # & 2002::
        self.nodes[LEADER].add_prefix('2001::/64', 'pdros')
        self.nodes[LEADER].add_prefix('2002::/64', 'pdro')
        self.nodes[LEADER].register_netdata()

        # Set lowpan context of sniffer
        self.simulator.set_lowpan_context(1, '2001::/64')
        self.simulator.set_lowpan_context(2, '2002::/64')

        self.nodes[ROUTER1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')

        self.nodes[DUT_ROUTER2].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')

        self.nodes[ROUTER3].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')

        self.nodes[SED1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[SED1].get_state(), 'child')

        # 3 SED1: The SED1 sends an ICMPv6 Echo Request to ROUTER3 using GUA
        # 2001:: address
        router3_addr = self.nodes[ROUTER3].get_addr("2001::/64")
        self.assertTrue(router3_addr is not None)
        self.assertTrue(self.nodes[SED1].ping(router3_addr))

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        msg.assertSentToDestinationAddress(
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
        command.check_address_query(
            msg,
            self.nodes[DUT_ROUTER2],
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
        )

        # Verify the DUT_ROUTER2 forwarded the ICMPv6 Echo Request to ROUTER3
        msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
        assert (
            msg is not None
        ), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER3"
        msg.assertSentToNode(self.nodes[ROUTER3])

        # 4 ROUTER1: ROUTER1 sends an ICMPv6 Echo Request to the SED1 using GUA
        # 2001:: address
        sed1_addr = self.nodes[SED1].get_addr("2001::/64")
        self.assertTrue(sed1_addr is not None)
        self.assertTrue(self.nodes[ROUTER1].ping(sed1_addr))

        # Wait for sniffer got all Address Notification messages
        self.simulator.go(1)

        # Verify DUT_ROUTER2 sent an Address Notification message
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2],
                                           self.nodes[ROUTER1])

        # 5 SED1: SED1 sends an ICMPv6 Echo Request to the ROUTER3 using GUA
        # 2001:: address
        self.assertTrue(self.nodes[SED1].ping(router3_addr))

        # Wait for sniffer got the ICMPv6 Echo Reply
        self.simulator.go(1)

        # Verify DUT_ROUTER2 didn't generate Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
        assert (
            msg is None
        ), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"

        # Verify DUT_ROUTER2 forwarded the ICMPv6 Echo Reply to SED1
        msg = dut_router2_messages_temp.get_icmp_message(
            ipv6.ICMP_ECHO_RESPONSE)
        assert (
            msg is not None
        ), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
        msg.assertSentToNode(self.nodes[SED1])

        # 6 DUT_ROUTER2: Power off ROUTER3 and wait 580s to alow LEADER to
        # expire its Router ID
        self.nodes[ROUTER3].stop()
        self.simulator.go(580)

        # The SED1 sends an ICMPv6 Echo Request to ROUTER3 GUA 2001:: address
        self.assertFalse(self.nodes[SED1].ping(router3_addr))

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        msg.assertSentToDestinationAddress(
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 7 SED1: Power off SED1 and wait to allow DUT_ROUTER2 to timeout the
        # child
        self.nodes[SED1].stop()
        self.simulator.go(5)

        # ROUTER1 sends two ICMPv6 Echo Requests to SED1 GUA 2001:: address
        self.assertFalse(self.nodes[ROUTER1].ping(sed1_addr))
        self.assertFalse(self.nodes[ROUTER1].ping(sed1_addr))

        # Verify DUT_ROUTER2 didn't generate an Address Notification message
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an', False)
        assert (
            msg is None
        ), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
    def test(self):
        # 1
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[ROUTER1].start()
        self.nodes[DUT_ROUTER2].start()
        self.nodes[ROUTER3].start()
        self.nodes[MED1].start()
        self.simulator.go(5)

        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
        self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
        self.assertEqual(self.nodes[MED1].get_state(), 'child')

        # 2
        # Flush the message queue to avoid possible impact on follow-up
        # verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        router3_mleid = self.nodes[ROUTER3].get_ip6_address(
            config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local
        # address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(
            msg,
            self.nodes[DUT_ROUTER2],
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
        )

        # 3
        # Wait the finish of address resolution traffic triggerred by previous
        # ping.
        self.simulator.go(5)

        # Flush the message queue to avoid possible impact on follow-up
        # verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        med1_mleid = self.nodes[MED1].get_ip6_address(
            config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 responded with an Address Notification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2],
                                           self.nodes[ROUTER1])

        # 4
        # Wait the finish of address resolution traffic triggerred by previous
        # ping.
        self.simulator.go(5)

        # Flush the message queue to avoid possible impact on follow-up
        # verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 didn't send an Address Query Request.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "The Address Query Request is not expected."

        # 5
        # Power off ROUTER3 and wait for leader to expire its Router ID.
        # In this topology, ROUTER3 has two neighbors (Leader and DUT_ROUTER2),
        # so the wait time is (MAX_NEIGHBOR_AGE (100s) + worst propagation time (32s * 15) for bad routing +\
        # INFINITE_COST_TIMEOUT (90s) + transmission time + extra redundancy),
        # totally ~700s.
        self.nodes[ROUTER3].stop()
        self.simulator.go(700)

        # Flush the message queue to avoid possible impact on follow-up
        # verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local
        # address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(
            msg,
            self.nodes[DUT_ROUTER2],
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
        )

        # 6
        self.nodes[MED1].stop()
        self.simulator.go(MED1_TIMEOUT)

        # Flush the message queue to avoid possible impact on follow-up
        # verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 didn't respond with an Address Notification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an', False)
        assert msg is None, "The Address Notification is not expected."
    def test(self):
        # 1 & 2
        # Build and verify the topology
        self.nodes[LEADER].start()
        self.nodes[LEADER].set_state('leader')
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[BR].start()
        time.sleep(5)
        self.assertEqual(self.nodes[BR].get_state(), 'router')

        # Configure two On-Mesh Prefixes on the BR
        self.nodes[BR].add_prefix('2003::/64', 'paros')
        self.nodes[BR].add_prefix('2004::/64', 'paros')
        self.nodes[BR].register_netdata()

        # Set lowpan context of sniffer
        self.sniffer.set_lowpan_context(1, '2003::/64')
        self.sniffer.set_lowpan_context(2, '2004::/64')

        self.nodes[DUT_ROUTER2].start()
        time.sleep(5)
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')

        self.nodes[ROUTER1].start()
        time.sleep(5)
        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')

        self.nodes[MED1].start()
        time.sleep(5)
        self.assertEqual(self.nodes[MED1].get_state(), 'child')

        # 3 MED1: MED1 sends an ICMPv6 Echo Request to Router1 using GUA 2003:: address
        router1_addr = self.nodes[ROUTER1].get_addr("2003::/64")
        self.assertTrue(router1_addr is not None)
        self.assertTrue(self.nodes[MED1].ping(router1_addr))

        # Wait for sniffer got Address Notification messages
        time.sleep(1)

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2],
                                    config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # Verify the DUT_ROUTER2 forwarded ICMPv6 Echo Request to ROUTER1
        msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
        assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER1"
        msg.assertSentToNode(self.nodes[ROUTER1])

        # 4 BR: BR sends an ICMPv6 Echo Request to MED1 using GUA 2003:: address
        med1_addr = self.nodes[MED1].get_addr("2003::/64")
        self.assertTrue(med1_addr is not None)
        self.assertTrue(self.nodes[BR].ping(med1_addr))

        # Wait for sniffer got Address Notification messages
        time.sleep(1)

        # Verify DUT_ROUTER2 sent an Address Notification message
        dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2],
                                           self.nodes[BR])

        # 5 MED1: MED1 sends an ICMPv6 Echo Request to ROUTER1 using GUA 2003:: address
        addr = self.nodes[ROUTER1].get_addr("2003::/64")
        self.assertTrue(addr is not None)
        self.assertTrue(self.nodes[MED1].ping(addr))

        # Wait for sniffer got ICMPv6 Echo Reply
        time.sleep(1)

        # Verify DUT_ROUTER2 didn't generate an Address Query Request
        dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"

        # Verify DUT_ROUTER2 forwarded ICMPv6 Echo Reply to MED1
        msg = dut_router2_messages_temp.get_icmp_message(
            ipv6.ICMP_ECHO_RESPONSE)
        assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
        msg.assertSentToNode(self.nodes[MED1])

        # 6 DUT_ROUTER2: Power off ROUTER1 and wait 580 seconds to allow the LEADER to expire its Router ID
        router1_id = self.nodes[ROUTER1].get_router_id()
        self.nodes[ROUTER1].stop()
        time.sleep(580)

        # Send an ICMPv6 Echo Request from MED1 to ROUTER1 GUA 2003:: address
        self.assertFalse(self.nodes[MED1].ping(router1_addr))

        # Verify the DUT_ROUTER2 has removed all entries based on ROUTER1's Router ID
        command.check_router_id_cached(self.nodes[DUT_ROUTER2], router1_id,
                                       False)

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        msg.assertSentToDestinationAddress(
            config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the child
        self.nodes[MED1].stop()
        time.sleep(config.MLE_END_DEVICE_TIMEOUT)

        # BR sends two ICMPv6 Echo Requests to MED1 GUA 2003:: address
        self.assertFalse(self.nodes[BR].ping(med1_addr))
        self.assertFalse(self.nodes[BR].ping(med1_addr))

        # Verify DUT_ROUTER2 didn't generate an Address Notification message
        dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an/', False)
        assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
Пример #11
0
    def test(self):
        # 1 & 2 ALL: Build and verify the topology
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        # Configure the LEADER to be a DHCPv6 Border Router for prefixes 2001:: & 2002::
        self.nodes[LEADER].add_prefix('2001::/64', 'pdros')
        self.nodes[LEADER].add_prefix('2002::/64', 'pdro')
        self.nodes[LEADER].register_netdata()

        # Set lowpan context of sniffer
        self.simulator.set_lowpan_context(1, '2001::/64')
        self.simulator.set_lowpan_context(2, '2002::/64')

        self.nodes[ROUTER1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')

        self.nodes[DUT_ROUTER2].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')

        self.nodes[ROUTER3].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')

        self.nodes[SED1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[SED1].get_state(), 'child')

        # 3 SED1: The SED1 sends an ICMPv6 Echo Request to ROUTER3 using GUA 2001:: address
        router3_addr = self.nodes[ROUTER3].get_addr("2001::/64")
        self.assertTrue(router3_addr is not None)
        self.assertTrue(self.nodes[SED1].ping(router3_addr))

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
        command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # Verify the DUT_ROUTER2 forwarded the ICMPv6 Echo Request to ROUTER3
        msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
        assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER3"
        msg.assertSentToNode(self.nodes[ROUTER3])

        # 4 ROUTER1: ROUTER1 sends an ICMPv6 Echo Request to the SED1 using GUA 2001:: address
        sed1_addr = self.nodes[SED1].get_addr("2001::/64")
        self.assertTrue(sed1_addr is not None)
        self.assertTrue(self.nodes[ROUTER1].ping(sed1_addr))

        # Wait for sniffer got all Address Notification messages
        self.simulator.go(1)

        # Verify DUT_ROUTER2 sent an Address Notification message
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1])

        # 5 SED1: SED1 sends an ICMPv6 Echo Request to the ROUTER3 using GUA 2001:: address
        self.assertTrue(self.nodes[SED1].ping(router3_addr))

        # Wait for sniffer got the ICMPv6 Echo Reply
        self.simulator.go(1)

        # Verify DUT_ROUTER2 didn't generate Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"

        # Verify DUT_ROUTER2 forwarded the ICMPv6 Echo Reply to SED1
        msg = dut_router2_messages_temp.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
        assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
        msg.assertSentToNode(self.nodes[SED1])

        # 6 DUT_ROUTER2: Power off ROUTER3 and wait 580s to alow LEADER to expire its Router ID
        self.nodes[ROUTER3].stop()
        self.simulator.go(580)

        # The SED1 sends an ICMPv6 Echo Request to ROUTER3 GUA 2001:: address
        self.assertFalse(self.nodes[SED1].ping(router3_addr))

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 7 SED1: Power off SED1 and wait to allow DUT_ROUTER2 to timeout the child
        self.nodes[SED1].stop()
        self.simulator.go(5)

        # ROUTER1 sends two ICMPv6 Echo Requests to SED1 GUA 2001:: address
        self.assertFalse(self.nodes[ROUTER1].ping(sed1_addr))
        self.assertFalse(self.nodes[ROUTER1].ping(sed1_addr))

        # Verify DUT_ROUTER2 didn't generate an Address Notification message
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an', False)
        assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
Пример #12
0
    def test(self):
        # 1
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[ROUTER1].start()
        self.nodes[DUT_ROUTER2].start()
        self.nodes[ROUTER3].start()
        self.nodes[MED1].start()
        self.simulator.go(5)

        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
        self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
        self.assertEqual(self.nodes[MED1].get_state(), 'child')


        # 2
        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        router3_mleid = self.nodes[ROUTER3].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 3
        # Wait the finish of address resolution traffic triggerred by previous ping.
        self.simulator.go(5)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        med1_mleid = self.nodes[MED1].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 responded with an Address Notification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1])

        # 4
        # Wait the finish of address resolution traffic triggerred by previous ping.
        self.simulator.go(5)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 didn't send an Address Query Request.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "The Address Query Request is not expected."

        # 5
        self.nodes[ROUTER3].stop()

        # Wait for the Leader to expire its Router ID.
        # MAX_NEIGHBOR_AGE + INFINITE_COST_TIMEOUT + ID_REUSE_DELAY + propagation time + transmission time ~ 580s.
        self.simulator.go(580)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 6
        self.nodes[MED1].stop()
        self.simulator.go(MED1_TIMEOUT)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 didn't respond with an Address Notification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an', False)
        assert msg is None, "The Address Notification is not expected."
Пример #13
0
    def test(self):
        # 1
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[ROUTER1].start()
        self.nodes[DUT_ROUTER2].start()
        self.nodes[ROUTER3].start()
        self.nodes[MED1].start()
        self.simulator.go(5)

        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
        self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
        self.assertEqual(self.nodes[MED1].get_state(), 'child')


        # 2
        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        router3_mleid = self.nodes[ROUTER3].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 3
        # Wait the finish of address resolution traffic triggerred by previous ping.
        self.simulator.go(5)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        med1_mleid = self.nodes[MED1].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 responded with an Address Notification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1])

        # 4
        # Wait the finish of address resolution traffic triggerred by previous ping.
        self.simulator.go(5)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertTrue(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 didn't send an Address Query Request.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "The Address Query Request is not expected."

        # 5
        # Power off ROUTER3 and wait for leader to expire its Router ID.
        # In this topology, ROUTER3 has two neighbors (Leader and DUT_ROUTER2),
        # so the wait time is (MAX_NEIGHBOR_AGE (100s) + worst propagation time (32s * 15) for bad routing +\
        # INFINITE_COST_TIMEOUT (90s) + transmission time + extra redundancy), totally ~700s.
        self.nodes[ROUTER3].stop()
        self.simulator.go(700)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[MED1].ping(router3_mleid))

        # Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 6
        self.nodes[MED1].stop()
        self.simulator.go(MED1_TIMEOUT)

        # Flush the message queue to avoid possible impact on follow-up verification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)

        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
        self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))

        # Verify DUT_ROUTER2 didn't respond with an Address Notification.
        dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_messages.next_coap_message('0.02', '/a/an', False)
        assert msg is None, "The Address Notification is not expected."
Пример #14
0
    def test(self):
        # 1 & 2
        # Build and verify the topology
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')

        self.nodes[BR].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[BR].get_state(), 'router')

        # Configure two On-Mesh Prefixes on the BR
        self.nodes[BR].add_prefix('2003::/64', 'paros')
        self.nodes[BR].add_prefix('2004::/64', 'paros')
        self.nodes[BR].register_netdata()

        # Set lowpan context of sniffer
        self.simulator.set_lowpan_context(1, '2003::/64')
        self.simulator.set_lowpan_context(2, '2004::/64')

        self.nodes[DUT_ROUTER2].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')

        self.nodes[ROUTER1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')

        self.nodes[MED1].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[MED1].get_state(), 'child')

        # 3 MED1: MED1 sends an ICMPv6 Echo Request to Router1 using GUA 2003:: address
        router1_addr = self.nodes[ROUTER1].get_addr("2003::/64")
        self.assertTrue(router1_addr is not None)
        self.assertTrue(self.nodes[MED1].ping(router1_addr))

        # Wait for sniffer got Address Notification messages
        self.simulator.go(1)

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # Verify the DUT_ROUTER2 forwarded ICMPv6 Echo Request to ROUTER1
        msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
        assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER1"
        msg.assertSentToNode(self.nodes[ROUTER1])

        # 4 BR: BR sends an ICMPv6 Echo Request to MED1 using GUA 2003:: address
        med1_addr = self.nodes[MED1].get_addr("2003::/64")
        self.assertTrue(med1_addr is not None)
        self.assertTrue(self.nodes[BR].ping(med1_addr))

        # Wait for sniffer got Address Notification messages
        self.simulator.go(1)

        # Verify DUT_ROUTER2 sent an Address Notification message
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[BR])

        # 5 MED1: MED1 sends an ICMPv6 Echo Request to ROUTER1 using GUA 2003:: address
        addr = self.nodes[ROUTER1].get_addr("2003::/64")
        self.assertTrue(addr is not None)
        self.assertTrue(self.nodes[MED1].ping(addr))

        # Wait for sniffer got ICMPv6 Echo Reply
        self.simulator.go(1)

        # Verify DUT_ROUTER2 didn't generate an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
        assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"

        # Verify DUT_ROUTER2 forwarded ICMPv6 Echo Reply to MED1
        msg = dut_router2_messages_temp.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
        assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
        msg.assertSentToNode(self.nodes[MED1])

        # 6 DUT_ROUTER2: Power off ROUTER1 and wait 580 seconds to allow the LEADER to expire its Router ID
        router1_id = self.nodes[ROUTER1].get_router_id()
        self.nodes[ROUTER1].stop()
        self.simulator.go(580)

        # Send an ICMPv6 Echo Request from MED1 to ROUTER1 GUA 2003:: address
        self.assertFalse(self.nodes[MED1].ping(router1_addr))

        # Verify the DUT_ROUTER2 has removed all entries based on ROUTER1's Router ID
        command.check_router_id_cached(self.nodes[DUT_ROUTER2], router1_id, False)

        # Verify DUT_ROUTER2 sent an Address Query Request
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
        msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)

        # 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the child
        self.nodes[MED1].stop()
        self.simulator.go(config.MLE_END_DEVICE_TIMEOUT)

        # BR sends two ICMPv6 Echo Requests to MED1 GUA 2003:: address
        self.assertFalse(self.nodes[BR].ping(med1_addr))
        self.assertFalse(self.nodes[BR].ping(med1_addr))

        # Verify DUT_ROUTER2 didn't generate an Address Notification message
        dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
        msg = dut_router2_messages.next_coap_message('0.02', '/a/an/', False)
        assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"