コード例 #1
0
    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."
コード例 #2
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"
コード例 #3
0
    def test(self):
        # 1. LEADER: DHCPv6 Server for prefix 2001::/64.
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
        self.nodes[LEADER].add_prefix('2001::/64', 'pdros')
        self.nodes[LEADER].register_netdata()
        self.simulator.set_lowpan_context(1, '2001::/64')

        # 2. BR: SLAAC Server for prefix 2002::/64.
        self.nodes[BR].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[BR].get_state(), 'router')
        self.nodes[BR].add_prefix('2002::/64', 'paros')
        self.nodes[BR].register_netdata()
        self.simulator.set_lowpan_context(2, '2002::/64')

        # 3. Bring up remaining devices except DUT_REED.
        for i in range(2, 17):
            if i == BR:
                continue
            self.nodes[i].start()
            self.simulator.go(5)
            self.assertEqual(self.nodes[i].get_state(), 'router')

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

        # 4. Bring up DUT_REED.
        self.nodes[DUT_REED].start()
        self.simulator.go(5)
        self.simulator.go(ROUTER_SELECTION_JITTER)

        reed_messages = self.simulator.get_messages_sent_by(DUT_REED)

        # Verify DUT_REED doesn't try to become router.
        msg = reed_messages.does_not_contain_coap_message()
        assert msg is True, "Error: The REED sent an Address Solicit Request"

        # 5. Enable a link between the DUT and BR to create a one-way link.
        self.nodes[DUT_REED].add_allowlist(self.nodes[BR].get_addr64())
        self.nodes[BR].add_allowlist(self.nodes[DUT_REED].get_addr64())

        # 6. Verify DUT_REED would send Address Notification when ping to its
        # ML-EID.
        mleid = self.nodes[DUT_REED].get_ip6_address(
            config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[ED1].ping(mleid))

        # Wait for sniffer collecting packets
        self.simulator.go(1)

        reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
        msg = reed_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_REED],
                                           self.nodes[LEADER])

        # 7 & 8. Verify DUT_REED would send Address Notification when ping to
        # its 2001::EID and 2002::EID.
        flag2001 = 0
        flag2002 = 0
        for global_address in self.nodes[DUT_REED].get_ip6_address(
                config.ADDRESS_TYPE.GLOBAL):
            if global_address[0:4] == '2001':
                flag2001 += 1
            elif global_address[0:4] == '2002':
                flag2002 += 1
            else:
                raise "Error: Address is unexpected."
            self.assertTrue(self.nodes[ED1].ping(global_address))

            # Wait for sniffer collecting packets
            self.simulator.go(1)

            reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
            msg = reed_messages.next_coap_message('0.02', '/a/an')
            command.check_address_notification(msg, self.nodes[DUT_REED],
                                               self.nodes[LEADER])

        assert flag2001 == 1, "Error: Expecting address 2001::EID not appear."
        assert flag2002 == 1, "Error: Expecting address 2002::EID not appear."
コード例 #4
0
    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"
コード例 #5
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."
コード例 #6
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"
コード例 #7
0
    def test(self):
        # 1. LEADER: DHCPv6 Server for prefix 2001::/64.
        self.nodes[LEADER].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
        self.nodes[LEADER].add_prefix('2001::/64', 'pdros')
        self.nodes[LEADER].register_netdata()

        # 2. BR: SLAAC Server for prefix 2002::/64.
        self.nodes[BR].start()
        self.simulator.go(5)
        self.assertEqual(self.nodes[BR].get_state(), 'router')
        self.nodes[BR].add_prefix('2002::/64', 'paros')
        self.nodes[BR].register_netdata()

        # 3. Bring up remaining devices except DUT_REED.
        for i in range(2, 17):
            if i == BR:
                continue
            self.nodes[i].start()
            self.simulator.go(5)
            self.assertEqual(self.nodes[i].get_state(), 'router')

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

        # 4. Bring up DUT_REED.
        self.nodes[DUT_REED].start()
        self.simulator.go(5)
        self.simulator.go(ROUTER_SELECTION_JITTER)

        reed_messages = self.simulator.get_messages_sent_by(DUT_REED)

        # Verify DUT_REED doesn't try to become router.
        msg = reed_messages.does_not_contain_coap_message()
        assert msg is True, "Error: The REED sent an Address Solicit Request"

        # 5. Enable a link between the DUT and BR to create a one-way link.
        self.nodes[DUT_REED].add_whitelist(self.nodes[BR].get_addr64())
        self.nodes[BR].add_whitelist(self.nodes[DUT_REED].get_addr64())

        # 6. Verify DUT_REED would send Address Notification when ping to its ML-EID.
        mleid = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
        self.assertTrue(self.nodes[ED1].ping(mleid))

        # Wait for sniffer collecting packets
        self.simulator.go(1)

        reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
        msg = reed_messages.next_coap_message('0.02', '/a/an')
        command.check_address_notification(msg, self.nodes[DUT_REED], self.nodes[LEADER])

        # 7 & 8. Verify DUT_REED would send Address Notification when ping to its 2001::EID and 2002::EID.
        flag2001 = 0
        flag2002 = 0
        for global_address in self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.GLOBAL):
            if global_address[0:4] == '2001':
                flag2001 += 1
            elif global_address[0:4] == '2002':
                flag2002 += 1
            else:
                raise "Error: Address is unexpected."
            self.assertTrue(self.nodes[ED1].ping(global_address))

            # Wait for sniffer collecting packets
            self.simulator.go(1)

            reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
            msg = reed_messages.next_coap_message('0.02', '/a/an')
            command.check_address_notification(msg, self.nodes[DUT_REED], self.nodes[LEADER])

        assert flag2001 == 1 , "Error: Expecting address 2001::EID not appear."
        assert flag2002 == 1 , "Error: Expecting address 2002::EID not appear."
コード例 #8
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."
コード例 #9
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."
コード例 #10
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"