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, )
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."
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"
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 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."
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.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"