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