def check_address_error_notification(command_msg, source_node, destination_address): """Verify source_node sent a properly formatted Address Error Notification command message to destination_address. """ command_msg.assertCoapMessageRequestUriPath('/a/ae') command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid) command_msg.assertCoapMessageContainsTlv(network_layer.MlEid) source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ( ipv6.ip_address( source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address ), ("Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " + str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " + str(command_msg.ipv6_packet.ipv6_header.source_address)) if isinstance(destination_address, bytearray): destination_address = bytes(destination_address) assert ( ipv6.ip_address(destination_address) == command_msg.ipv6_packet.ipv6_header.destination_address ), ("Error: The IPv6 destination address is not expected. The destination node's rloc is: " + str(ipv6.ip_address(destination_address)) + ", but the destination_address in command msg is: " + str(command_msg.ipv6_packet.ipv6_header.destination_address))
def check_address_query(command_msg, source_node, destination_address): """Verify source_node sent a properly formatted Address Query Request message to the destination_address. """ command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid) source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address, \ "Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " \ + str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " \ + str(command_msg.ipv6_packet.ipv6_header.source_address) assert ipv6.ip_address(destination_address.decode('utf-8')) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The IPv6 destination address is not expected."
def check_address_notification(command_msg, source_node, destination_node): """Verify source_node sent a properly formatted Address Notification command message to destination_node. """ command_msg.assertCoapMessageRequestUriPath('/a/an') command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid) command_msg.assertCoapMessageContainsTlv(network_layer.Rloc16) command_msg.assertCoapMessageContainsTlv(network_layer.MlEid) source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address, "Error: The IPv6 source address is not the RLOC of the originator." destination_rloc = destination_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ipv6.ip_address(destination_rloc) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The IPv6 destination address is not the RLOC of the destination."
def check_link_accept(command_msg, destination_node, \ leader_data = CheckType.OPTIONAL, link_margin = CheckType.OPTIONAL, mle_frame_counter = CheckType.OPTIONAL, \ challenge = CheckType.OPTIONAL, address16 = CheckType.OPTIONAL, route64 = CheckType.OPTIONAL, \ tlv_request_link_margin = CheckType.OPTIONAL): """verify a properly formatted link accept command message. """ command_msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter) command_msg.assertMleMessageContainsTlv(mle.SourceAddress) command_msg.assertMleMessageContainsTlv(mle.Response) command_msg.assertMleMessageContainsTlv(mle.Version) check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData) check_mle_optional_tlv(command_msg, link_margin, mle.LinkMargin) check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter) check_mle_optional_tlv(command_msg, challenge, mle.Challenge) check_mle_optional_tlv(command_msg, address16, mle.Address16) check_mle_optional_tlv(command_msg, route64, mle.Route64) check_tlv_request_tlv(command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN) destination_link_local = destination_node.get_ip6_address( config.ADDRESS_TYPE.LINK_LOCAL) assert ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.ipv6_header.destination_address, \ "Error: The destination is unexpected"
def check_address_release(command_msg, destination_node): """Verify the message is a properly formatted address release destined to the given node. """ command_msg.assertCoapMessageRequestUriPath('/a/ar') command_msg.assertCoapMessageContainsTlv(network_layer.Rloc16) command_msg.assertCoapMessageContainsTlv(network_layer.MacExtendedAddress) destination_rloc = destination_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ipv6.ip_address(destination_rloc) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The destination is not RLOC address"
def check_link_accept(command_msg, destination_node): """Verify a properly formatted Link Accept command message. """ command_msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter) command_msg.assertMleMessageContainsTlv(mle.SourceAddress) command_msg.assertMleMessageContainsTlv(mle.Response) command_msg.assertMleMessageContainsTlv(mle.Version) command_msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter) destination_link_local = destination_node.get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL) assert ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The destination is unexpected"
def test(self): # 1. Ensure topology is formed correctly without DUT_ROUTER1. self.nodes[LEADER].start() self.simulator.go(5) self.assertEqual(self.nodes[LEADER].get_state(), 'leader') for i in range(2, 17): self.nodes[i].start() self.simulator.go(5) for i in range(2, 17): self.assertEqual(self.nodes[i].get_state(), 'router') # 2. DUT_REED: Attach to network. Verify it didn't send an Address Solicit Request. # Avoid DUT_REED attach to DUT_ROUTER1. self.nodes[DUT_REED].add_whitelist( self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']) self.nodes[DUT_REED].start() self.simulator.go(5) self.assertEqual(self.nodes[DUT_REED].get_state(), 'child') # The DUT_REED must not send a coap message here. reed_messages = self.simulator.get_messages_sent_by(DUT_REED) msg = reed_messages.does_not_contain_coap_message() assert msg is True, "Error: The DUT_REED sent an Address Solicit Request" # 3. DUT_REED: Verify sent a Link Request to at least 3 neighboring Routers. for i in range(0, 3): msg = reed_messages.next_mle_message(mle.CommandType.LINK_REQUEST) command.check_link_request(msg, source_address = command.CheckType.CONTAIN, \ leader_data = command.CheckType.CONTAIN) # 4. DUT_ROUTER1: Verify sent a Link Accept to DUT_REED. self.simulator.go(30) dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1) flag_link_accept = False while True: msg = dut_messages.next_mle_message(mle.CommandType.LINK_ACCEPT, False) if msg == None: break destination_link_local = self.nodes[DUT_REED].get_ip6_address( config.ADDRESS_TYPE.LINK_LOCAL) if ipv6.ip_address( destination_link_local ) == msg.ipv6_packet.ipv6_header.destination_address: flag_link_accept = True break assert flag_link_accept is True, "Error: DUT_ROUTER1 didn't send a Link Accept to DUT_REED" command.check_link_accept(msg, self.nodes[DUT_REED])
def check_address_query(command_msg, source_node, destination_address): """Verify source_node sent a properly formatted Address Query Request message to the destination_address. """ command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid) source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ( ipv6.ip_address( source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address ), ("Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " + str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " + str(command_msg.ipv6_packet.ipv6_header.source_address)) if isinstance(destination_address, bytearray): destination_address = bytes(destination_address) elif isinstance(destination_address, str) and sys.version_info[0] == 2: destination_address = destination_address.decode("utf-8") assert (ipv6.ip_address(destination_address) == command_msg.ipv6_packet.ipv6_header.destination_address ), "Error: The IPv6 destination address is not expected."
def check_address_error_notification(command_msg, source_node, destination_address): """Verify source_node sent a properly formatted Address Error Notification command message to destination_address. """ command_msg.assertCoapMessageRequestUriPath('/a/ae') command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid) command_msg.assertCoapMessageContainsTlv(network_layer.MlEid) source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC) assert ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address, \ "Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " \ + str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " \ + str(command_msg.ipv6_packet.ipv6_header.source_address) if isinstance(destination_address, bytearray): destination_address = bytes(destination_address) elif isinstance(destination_address, str) and sys.version_info[0] == 2: destination_address = destination_address.decode("utf-8") assert ipv6.ip_address(destination_address) == command_msg.ipv6_packet.ipv6_header.destination_address, \ "Error: The IPv6 destination address is not expected. The destination node's rloc is: " \ + str(ipv6.ip_address(destination_address)) + ", but the destination_address in command msg is: " \ + str(command_msg.ipv6_packet.ipv6_header.destination_address)
def test(self): # 1. Ensure topology is formed correctly without DUT_ROUTER1. self.nodes[LEADER].start() self.simulator.go(5) self.assertEqual(self.nodes[LEADER].get_state(), 'leader') for i in range(2, 17): self.nodes[i].start() self.simulator.go(10) for i in range(2, 17): self.assertEqual(self.nodes[i].get_state(), 'router') # 2. DUT_REED: Attach to network. Verify it didn't send an Address Solicit Request. # Avoid DUT_REED attach to DUT_ROUTER1. self.nodes[DUT_REED].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']) self.nodes[DUT_REED].start() self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL) self.assertEqual(self.nodes[DUT_REED].get_state(), 'child') # The DUT_REED must not send a coap message here. reed_messages = self.simulator.get_messages_sent_by(DUT_REED) msg = reed_messages.does_not_contain_coap_message() assert msg is True, "Error: The DUT_REED sent an Address Solicit Request" # 3. DUT_REED: Verify sent a Link Request to at least 3 neighboring Routers. for i in range(0, MLE_MIN_LINKS): msg = reed_messages.next_mle_message(mle.CommandType.LINK_REQUEST) command.check_link_request(msg, source_address = command.CheckType.CONTAIN, \ leader_data = command.CheckType.CONTAIN) # 4. DUT_REED: Verify at least 3 Link Accept messages sent to DUT_REED. self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL) link_accept_count = 0 destination_link_local = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL) for i in range(1, DUT_REED): dut_messages = self.simulator.get_messages_sent_by(i) while True: msg = dut_messages.next_mle_message(mle.CommandType.LINK_ACCEPT, False) if msg == None: break if ipv6.ip_address(destination_link_local) == msg.ipv6_packet.ipv6_header.destination_address: command.check_link_accept(msg, self.nodes[DUT_REED]) link_accept_count += 1 break assert (link_accept_count >= MLE_MIN_LINKS) is True, "Error: too few Link Accept sent to DUT_REED"
def test(self): # 1. Ensure topology is formed correctly without DUT_ROUTER1. self.nodes[LEADER].start() self.nodes[LEADER].set_state('leader') self.assertEqual(self.nodes[LEADER].get_state(), 'leader') for i in range(2, 17): self.nodes[i].start() time.sleep(5) for i in range(2, 17): self.assertEqual(self.nodes[i].get_state(), 'router') # 2. DUT_REED: Attach to network. Verify it didn't send an Address Solicit Request. # Avoid DUT_REED attach to DUT_ROUTER1. self.nodes[DUT_REED].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']) self.nodes[DUT_REED].start() time.sleep(5) self.assertEqual(self.nodes[DUT_REED].get_state(), 'child') # The DUT_REED must not send a coap message here. reed_messages = self.sniffer.get_messages_sent_by(DUT_REED) msg = reed_messages.does_not_contain_coap_message() assert msg is True, "Error: The DUT_REED sent an Address Solicit Request" # 3. DUT_REED: Verify sent a Link Request to at least 3 neighboring Routers. for i in range(0, 3): msg = reed_messages.next_mle_message(mle.CommandType.LINK_REQUEST) command.check_link_request(msg) # 4. DUT_ROUTER1: Verify sent a Link Accept to DUT_REED. time.sleep(30) dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1) flag_link_accept = False while True: msg = dut_messages.next_mle_message(mle.CommandType.LINK_ACCEPT, False) if msg == None : break destination_link_local = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL) if ipv6.ip_address(destination_link_local) == msg.ipv6_packet.ipv6_header.destination_address: flag_link_accept = True break assert flag_link_accept is True, "Error: DUT_ROUTER1 didn't send a Link Accept to DUT_REED" command.check_link_accept(msg, self.nodes[DUT_REED])
def check_link_accept(command_msg, destination_node, \ leader_data = CheckType.OPTIONAL, link_margin = CheckType.OPTIONAL, mle_frame_counter = CheckType.OPTIONAL, \ challenge = CheckType.OPTIONAL, address16 = CheckType.OPTIONAL, route64 = CheckType.OPTIONAL, \ tlv_request_link_margin = CheckType.OPTIONAL): """verify a properly formatted link accept command message. """ command_msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter) command_msg.assertMleMessageContainsTlv(mle.SourceAddress) command_msg.assertMleMessageContainsTlv(mle.Response) command_msg.assertMleMessageContainsTlv(mle.Version) check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData) check_mle_optional_tlv(command_msg, link_margin, mle.LinkMargin) check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter) check_mle_optional_tlv(command_msg, challenge, mle.Challenge) check_mle_optional_tlv(command_msg, address16, mle.Address16) check_mle_optional_tlv(command_msg, route64, mle.Route64) check_tlv_request_tlv(command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN) destination_link_local = destination_node.get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL) assert ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.ipv6_header.destination_address, \ "Error: The destination is unexpected"
def test(self): # 1. Ensure topology is formed correctly without DUT_ROUTER1. self.nodes[LEADER].start() self.simulator.go(5) self.assertEqual(self.nodes[LEADER].get_state(), 'leader') for i in range(2, 17): self.nodes[i].start() self.simulator.go(10) for i in range(2, 17): self.assertEqual(self.nodes[i].get_state(), 'router') # 2. DUT_REED: Attach to network. Verify it didn't send an Address Solicit Request. # Avoid DUT_REED attach to DUT_ROUTER1. self.nodes[DUT_REED].add_allowlist( self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']) self.nodes[DUT_REED].start() self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL) self.assertEqual(self.nodes[DUT_REED].get_state(), 'child') # The DUT_REED must not send a coap message here. reed_messages = self.simulator.get_messages_sent_by(DUT_REED) msg = reed_messages.does_not_contain_coap_message() assert (msg is True), "Error: The DUT_REED sent an Address Solicit Request" # 3. DUT_REED: Verify sent a Link Request to at least 3 neighboring # Routers. for i in range(0, MLE_MIN_LINKS): msg = reed_messages.next_mle_message(mle.CommandType.LINK_REQUEST) command.check_link_request( msg, source_address=command.CheckType.CONTAIN, leader_data=command.CheckType.CONTAIN, ) # 4. DUT_REED: Verify at least 3 Link Accept messages sent to DUT_REED. self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL) link_accept_count = 0 destination_link_local = self.nodes[DUT_REED].get_ip6_address( config.ADDRESS_TYPE.LINK_LOCAL) for i in range(1, DUT_REED): dut_messages = self.simulator.get_messages_sent_by(i) while True: msg = dut_messages.next_mle_message( mle.CommandType.LINK_ACCEPT, False) if msg is None: break if (ipv6.ip_address(destination_link_local) == msg.ipv6_packet.ipv6_header.destination_address): command.check_link_accept(msg, self.nodes[DUT_REED]) link_accept_count += 1 break assert (link_accept_count >= MLE_MIN_LINKS ) is True, "Error: too few Link Accept sent to DUT_REED"