mirror of
https://github.com/espressif/openthread.git
synced 2026-08-04 09:57:47 +00:00
[style] apply google python style guide (#4501)
This commit applies and enforces Google's python style for tests.
This commit is contained in:
@@ -39,6 +39,7 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -110,9 +111,7 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
# 4 - Router
|
||||
msg = router_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg = router_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[LEADER])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
@@ -125,8 +124,7 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
|
||||
# 5 - Leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -162,8 +160,7 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
|
||||
# 9 - Leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST
|
||||
)
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
|
||||
@@ -42,6 +42,7 @@ MTDS = [ED, SED]
|
||||
|
||||
|
||||
class Cert_5_1_02_ChildAddressTimeout(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -124,8 +125,7 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
# Leader or Router1 can be parent of Router2
|
||||
if leader_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -134,11 +134,8 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
elif router1_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
msg.assertCoapMessageRequestUriPath("/a/as")
|
||||
@@ -154,8 +151,7 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
# Router1 make two attempts to reconnect to its current Partition.
|
||||
for _ in range(4):
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST
|
||||
)
|
||||
mle.CommandType.PARENT_REQUEST)
|
||||
msg.assertSentWithHopLimit(255)
|
||||
msg.assertSentToDestinationAddress("ff02::2")
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -182,8 +178,7 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
# 7 - Router1
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -123,8 +124,7 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
# Leader or Router1 can be parent of Router2
|
||||
if leader_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -133,11 +133,8 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
elif router1_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
msg.assertCoapMessageRequestUriPath("/a/as")
|
||||
@@ -153,8 +150,7 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
# Router1 make two attempts to reconnect to its current Partition.
|
||||
for _ in range(4):
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST
|
||||
)
|
||||
mle.CommandType.PARENT_REQUEST)
|
||||
msg.assertSentWithHopLimit(255)
|
||||
msg.assertSentToDestinationAddress("ff02::2")
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -184,9 +180,7 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# 9 - Router1
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -199,8 +193,7 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
|
||||
@@ -39,6 +39,7 @@ ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_1_05_RouterAddressTimeout(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -105,8 +106,7 @@ class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
|
||||
command.check_parent_request(msg, is_first_request=True)
|
||||
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[LEADER]
|
||||
)
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[LEADER])
|
||||
command.check_child_id_request(
|
||||
msg,
|
||||
tlv_request=CheckType.CONTAIN,
|
||||
|
||||
@@ -38,6 +38,7 @@ SED1 = 7
|
||||
|
||||
|
||||
class Cert_5_1_07_MaxChildCount(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ ROUTER4 = 5
|
||||
|
||||
|
||||
class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -135,20 +136,15 @@ class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 3 - Router2, Router3
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER4])
|
||||
|
||||
msg = router3_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router3_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER4])
|
||||
|
||||
# 4 - Router4
|
||||
msg = router4_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -41,6 +41,7 @@ ROUTER2 = 5
|
||||
|
||||
|
||||
class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -161,8 +162,7 @@ class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
|
||||
|
||||
# 6 - Router2
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER3 = 4
|
||||
|
||||
|
||||
class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -63,9 +64,8 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_panid(0xface)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ROUTER3].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER3].get_addr64(),
|
||||
rssi=-85)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -142,20 +142,15 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
# 4 - Router1, Router2
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
# 5 - Router3
|
||||
msg = router3_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER1 = 4
|
||||
|
||||
|
||||
class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -63,9 +64,8 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_panid(0xface)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ROUTER1].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64(),
|
||||
rssi=-85)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -141,9 +141,7 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 4 - Router2
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
|
||||
# 5 - Router1
|
||||
@@ -161,8 +159,7 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
|
||||
# 6 - Router1
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
|
||||
@@ -39,6 +39,7 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -70,21 +71,17 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def verify_step_4(
|
||||
self, router1_messages, router2_messages, req_receiver, accept_receiver
|
||||
):
|
||||
def verify_step_4(self, router1_messages, router2_messages, req_receiver,
|
||||
accept_receiver):
|
||||
if router2_messages.contains_mle_message(
|
||||
mle.CommandType.LINK_REQUEST
|
||||
) and (
|
||||
router1_messages.contains_mle_message(mle.CommandType.LINK_ACCEPT)
|
||||
or router1_messages.contains_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST
|
||||
)
|
||||
):
|
||||
mle.CommandType.LINK_REQUEST) and (
|
||||
router1_messages.contains_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT) or
|
||||
router1_messages.contains_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST)):
|
||||
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.LINK_REQUEST
|
||||
)
|
||||
mle.CommandType.LINK_REQUEST)
|
||||
|
||||
msg.assertSentToNode(self.nodes[req_receiver])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
@@ -154,13 +151,10 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
|
||||
# 4 - Router1, Router2
|
||||
self.assertTrue(
|
||||
self.verify_step_4(
|
||||
router1_messages, router2_messages, ROUTER1, ROUTER2
|
||||
)
|
||||
or self.verify_step_4(
|
||||
router2_messages, router1_messages, ROUTER2, ROUTER1
|
||||
)
|
||||
)
|
||||
self.verify_step_4(router1_messages, router2_messages, ROUTER1,
|
||||
ROUTER2) or
|
||||
self.verify_step_4(router2_messages, router1_messages, ROUTER2,
|
||||
ROUTER1))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -38,6 +38,7 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_1_13_RouterReset(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@ import mle
|
||||
import config
|
||||
import command
|
||||
|
||||
|
||||
LEADER = 1
|
||||
DUT_ROUTER1 = 2
|
||||
REED1 = 3
|
||||
@@ -42,6 +41,7 @@ MED1 = 4
|
||||
|
||||
|
||||
class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -102,16 +102,13 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
|
||||
# 3 DUT_ROUTER1: Verify MLE Parent Response
|
||||
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
command.check_parent_response(msg)
|
||||
|
||||
# 4 DUT_ROUTER1: Verify MLE Child ID Response
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
command.check_child_id_response(msg)
|
||||
|
||||
@@ -126,8 +123,7 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
reed1_messages = self.simulator.get_messages_sent_by(REED1)
|
||||
msg = reed1_messages.next_coap_message('0.02')
|
||||
reed1_ipv6_address = (
|
||||
msg.ipv6_packet.ipv6_header.source_address.compressed
|
||||
)
|
||||
msg.ipv6_packet.ipv6_header.source_address.compressed)
|
||||
msg.assertSentToNode(self.nodes[DUT_ROUTER1])
|
||||
msg.assertCoapMessageRequestUriPath('/a/as')
|
||||
|
||||
|
||||
@@ -41,14 +41,13 @@ ROUTER_32 = 33
|
||||
|
||||
|
||||
class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
|
||||
self.nodes[DUT_LEADER] = node.Node(
|
||||
DUT_LEADER, simulator=self.simulator
|
||||
)
|
||||
self.nodes[DUT_LEADER] = node.Node(DUT_LEADER, simulator=self.simulator)
|
||||
self.nodes[DUT_LEADER].set_panid(0xface)
|
||||
self.nodes[DUT_LEADER].set_mode('rsdn')
|
||||
self.nodes[DUT_LEADER].enable_whitelist()
|
||||
@@ -126,9 +125,8 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
|
||||
msg.assertCoapMessageContainsTlv(network_layer.Status)
|
||||
|
||||
status_tlv = msg.get_coap_message_tlv(network_layer.Status)
|
||||
self.assertEqual(
|
||||
network_layer.StatusValues.NO_ADDRESS_AVAILABLE, status_tlv.status
|
||||
)
|
||||
self.assertEqual(network_layer.StatusValues.NO_ADDRESS_AVAILABLE,
|
||||
status_tlv.status)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -46,6 +46,7 @@ ROUTER_SELECTION_JITTER = 1
|
||||
|
||||
|
||||
class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -115,9 +116,8 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
msg.assertMleMessageDoesNotContainTlv(mle.Route64)
|
||||
|
||||
# 4 Wait for DUT_REED to send the second packet.
|
||||
self.simulator.go(
|
||||
REED_ADVERTISEMENT_INTERVAL + REED_ADVERTISEMENT_MAX_JITTER
|
||||
)
|
||||
self.simulator.go(REED_ADVERTISEMENT_INTERVAL +
|
||||
REED_ADVERTISEMENT_MAX_JITTER)
|
||||
|
||||
# 5 DUT_REED: Verify the second MLE Advertisement.
|
||||
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
|
||||
@@ -166,10 +166,8 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
# Leader.
|
||||
mleid = None
|
||||
for addr in self.nodes[LEADER].get_addrs():
|
||||
if (
|
||||
addr.find(MESH_LOCAL_PREFIX) != -1
|
||||
and addr.find(ROUTING_LACATOR) == -1
|
||||
):
|
||||
if (addr.find(MESH_LOCAL_PREFIX) != -1 and
|
||||
addr.find(ROUTING_LACATOR) == -1):
|
||||
mleid = addr
|
||||
break
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ ROUTER_SELECTION_JITTER = 1
|
||||
|
||||
|
||||
class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -126,9 +127,7 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
|
||||
# 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
|
||||
)
|
||||
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
|
||||
@@ -136,17 +135,15 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
|
||||
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]
|
||||
)
|
||||
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
|
||||
):
|
||||
config.ADDRESS_TYPE.GLOBAL):
|
||||
if global_address[0:4] == '2001':
|
||||
flag2001 += 1
|
||||
elif global_address[0:4] == '2002':
|
||||
@@ -160,9 +157,8 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
|
||||
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]
|
||||
)
|
||||
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."
|
||||
|
||||
@@ -41,6 +41,7 @@ ROUTER24 = 24
|
||||
|
||||
|
||||
class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -99,8 +100,7 @@ class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
|
||||
|
||||
# 4 & 5
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
self.assertTrue(self.nodes[LEADER].ping(router1_rloc))
|
||||
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ MLE_MIN_LINKS = 3
|
||||
|
||||
|
||||
class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -74,9 +75,8 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
|
||||
# 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].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)
|
||||
@@ -85,9 +85,8 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
# 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"
|
||||
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.
|
||||
@@ -104,29 +103,24 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
|
||||
link_accept_count = 0
|
||||
destination_link_local = self.nodes[DUT_REED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
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
|
||||
)
|
||||
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
|
||||
):
|
||||
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"
|
||||
assert (link_accept_count >= MLE_MIN_LINKS
|
||||
) is True, "Error: too few Link Accept sent to DUT_REED"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -37,6 +37,7 @@ DUT_ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -69,8 +70,7 @@ class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
|
||||
# 2 & 3
|
||||
link_local = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
self.assertTrue(self.nodes[LEADER].ping(link_local, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(link_local))
|
||||
|
||||
@@ -83,11 +83,8 @@ class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff02::2'))
|
||||
|
||||
# 8
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
config.LINK_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS
|
||||
)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(
|
||||
config.LINK_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -39,6 +39,7 @@ SED1 = 4
|
||||
|
||||
|
||||
class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -97,15 +98,14 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
|
||||
# 2 & 3
|
||||
mleid = self.nodes[DUT_ROUTER2].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(self.nodes[LEADER].ping(mleid, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(mleid))
|
||||
|
||||
# 4 & 5
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::1',
|
||||
num_responses=2,
|
||||
size=256))
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
@@ -114,9 +114,9 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
# 6 & 7
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping('ff03::2', num_responses=2, size=256)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::2',
|
||||
num_responses=2,
|
||||
size=256))
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
@@ -125,23 +125,19 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
# 8
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS,
|
||||
num_responses=3,
|
||||
size=256,
|
||||
)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(
|
||||
config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS,
|
||||
num_responses=3,
|
||||
size=256,
|
||||
))
|
||||
self.simulator.go(2)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertTrue(sed_messages.contains_icmp_message())
|
||||
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS,
|
||||
num_responses=3,
|
||||
)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(
|
||||
config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS,
|
||||
num_responses=3,
|
||||
))
|
||||
self.simulator.go(2)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertTrue(sed_messages.contains_icmp_message())
|
||||
|
||||
@@ -42,6 +42,7 @@ MED1_TIMEOUT = 3
|
||||
|
||||
|
||||
class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -112,8 +113,7 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
router3_mleid = self.nodes[ROUTER3].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
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
|
||||
@@ -136,16 +136,14 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
med1_mleid = self.nodes[MED1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
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]
|
||||
)
|
||||
command.check_address_notification(msg, self.nodes[DUT_ROUTER2],
|
||||
self.nodes[ROUTER1])
|
||||
|
||||
# 4
|
||||
# Wait the finish of address resolution traffic triggerred by previous
|
||||
|
||||
@@ -45,6 +45,7 @@ MTDS = [SED1, ED1, ED2, ED3, ED4]
|
||||
|
||||
|
||||
class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -112,8 +113,7 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
# 2
|
||||
for ED in [ED1, ED2, ED3, ED4]:
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -134,17 +134,15 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
|
||||
for ED in [ED1, ED2, ED3, ED4]:
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
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"
|
||||
assert (msg is None
|
||||
), "Error: The DUT sent an unexpected Address Query Request"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER3 = 4
|
||||
|
||||
|
||||
class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -95,8 +96,7 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
|
||||
# 2 & 3
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the least cost path.
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
@@ -104,12 +104,10 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
# 4 & 5
|
||||
self.nodes[LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_1']
|
||||
)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(),
|
||||
config.RSSI['LINK_QULITY_1'])
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64(),
|
||||
config.RSSI['LINK_QULITY_1'])
|
||||
self.simulator.go(3 * config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the longer path because it cost
|
||||
@@ -119,12 +117,10 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
# 6 & 7
|
||||
self.nodes[LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_2']
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_2']
|
||||
)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(),
|
||||
config.RSSI['LINK_QULITY_2'])
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64(),
|
||||
config.RSSI['LINK_QULITY_2'])
|
||||
self.simulator.go(3 * config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# Verify the direct neighbor would be prioritized when there are two
|
||||
@@ -134,18 +130,15 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
# 8 & 9
|
||||
self.nodes[LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_0']
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_0']
|
||||
)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(),
|
||||
config.RSSI['LINK_QULITY_0'])
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64(),
|
||||
config.RSSI['LINK_QULITY_0'])
|
||||
self.simulator.go(3 * config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the longer path.
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
path = [ROUTER3, DUT_ROUTER1, ROUTER2, LEADER]
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -111,8 +112,7 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(
|
||||
mle.CommandType.ADVERTISEMENT, False
|
||||
)
|
||||
mle.CommandType.ADVERTISEMENT, False)
|
||||
if msg is None:
|
||||
continue
|
||||
|
||||
@@ -123,9 +123,8 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
break
|
||||
self.assertTrue(routing_cost == 0)
|
||||
|
||||
self.simulator.go(
|
||||
config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL
|
||||
)
|
||||
self.simulator.go(config.INFINITE_COST_TIMEOUT +
|
||||
config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
self.assertFalse(command.check_id_set(msg, router2_id))
|
||||
@@ -150,16 +149,14 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
router1_id = self.nodes[ROUTER1].get_router_id()
|
||||
router2_id = self.nodes[ROUTER2].get_router_id()
|
||||
|
||||
self.simulator.go(
|
||||
config.MAX_NEIGHBOR_AGE + config.MAX_ADVERTISEMENT_INTERVAL
|
||||
)
|
||||
self.simulator.go(config.MAX_NEIGHBOR_AGE +
|
||||
config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
self.assertEqual(command.get_routing_cost(msg, router1_id), 0)
|
||||
|
||||
self.simulator.go(
|
||||
config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL
|
||||
)
|
||||
self.simulator.go(config.INFINITE_COST_TIMEOUT +
|
||||
config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
self.assertFalse(command.check_id_set(msg, router1_id))
|
||||
|
||||
@@ -38,6 +38,7 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ MTDS = [MED1, SED1, MED3]
|
||||
|
||||
|
||||
class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -139,9 +140,8 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
|
||||
# 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
|
||||
)
|
||||
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
|
||||
@@ -150,8 +150,7 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
|
||||
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
|
||||
)
|
||||
msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -44,6 +44,7 @@ MTDS = [MED1, MED2]
|
||||
|
||||
|
||||
class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -109,8 +110,7 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
|
||||
# 4 MED1: MED1 send an ICMPv6 Echo Request to the MED2 ML-EID
|
||||
med2_ml_eid = self.nodes[MED2].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(med2_ml_eid is not None)
|
||||
self.assertTrue(self.nodes[MED1].ping(med2_ml_eid))
|
||||
|
||||
@@ -127,9 +127,8 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
# 5 MED1: MED1 send an ICMPv6 Echo Request to the MED2 2001::GUA
|
||||
addr = self.nodes[MED2].get_addr("2001::/64")
|
||||
@@ -149,9 +148,8 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
# 6 MED1: MED1 send an ICMPv6 Echo Request to the MED2 2002::GUA
|
||||
addr = self.nodes[MED2].get_addr("2002::/64")
|
||||
@@ -171,9 +169,8 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
# 7 MED1: MED1 send an ICMPv6 Echo Request to the MED2 2003::GUA
|
||||
addr = self.nodes[MED2].get_addr("2003::/64")
|
||||
@@ -193,9 +190,8 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -43,6 +43,7 @@ SED1 = 5
|
||||
|
||||
|
||||
class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -130,8 +131,7 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
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
|
||||
)
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER2],
|
||||
@@ -157,9 +157,8 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
# 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]
|
||||
)
|
||||
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
|
||||
@@ -178,8 +177,7 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
|
||||
# Verify DUT_ROUTER2 forwarded the ICMPv6 Echo Reply to SED1
|
||||
msg = dut_router2_messages_temp.get_icmp_message(
|
||||
ipv6.ICMP_ECHO_RESPONSE
|
||||
)
|
||||
ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
|
||||
@@ -197,8 +195,7 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
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
|
||||
)
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
|
||||
# 7 SED1: Power off SED1 and wait to allow DUT_ROUTER2 to timeout the
|
||||
# child
|
||||
|
||||
@@ -43,6 +43,7 @@ MED1 = 5
|
||||
|
||||
|
||||
class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -158,9 +159,8 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
# 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]
|
||||
)
|
||||
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
|
||||
@@ -181,8 +181,7 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
|
||||
# Verify DUT_ROUTER2 forwarded ICMPv6 Echo Reply to MED1
|
||||
msg = dut_router2_messages_temp.get_icmp_message(
|
||||
ipv6.ICMP_ECHO_RESPONSE
|
||||
)
|
||||
ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
|
||||
@@ -199,16 +198,14 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
|
||||
# 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
|
||||
)
|
||||
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
|
||||
)
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
|
||||
# 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the
|
||||
# child
|
||||
|
||||
@@ -39,6 +39,7 @@ MED1 = 3
|
||||
|
||||
|
||||
class Cert_5_3_11_AddressQueryTimeoutIntervals(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ DUT_ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -54,15 +55,13 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
self.nodes[DUT_ROUTER1].set_panid(0xface)
|
||||
self.nodes[DUT_ROUTER1].set_mode('rsdn')
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[DUT_LEADER].get_addr64()
|
||||
)
|
||||
self.nodes[DUT_LEADER].get_addr64())
|
||||
self.nodes[DUT_ROUTER1].enable_whitelist()
|
||||
self.nodes[DUT_ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
def _setUpLeader(self):
|
||||
self.nodes[DUT_LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64()
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].get_addr64())
|
||||
self.nodes[DUT_LEADER].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
@@ -93,13 +92,11 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
|
||||
# Send a harness helper ping to the DUT
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
self.assertTrue(self.nodes[DUT_LEADER].ping(router1_rloc))
|
||||
|
||||
leader_rloc = self.nodes[DUT_LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
self.assertTrue(self.nodes[DUT_ROUTER1].ping(leader_rloc))
|
||||
|
||||
# 3 DUT_LEADER: Reset DUT_LEADER
|
||||
@@ -116,9 +113,8 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
|
||||
# Verify DUT_LEADER didn't send MLE Advertisement messages
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.ADVERTISEMENT, False
|
||||
)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT,
|
||||
False)
|
||||
self.assertTrue(msg is None)
|
||||
|
||||
self.nodes[DUT_LEADER].start()
|
||||
@@ -153,8 +149,7 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
)
|
||||
else:
|
||||
msg = router1_messages_temp.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST
|
||||
)
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
self.assertTrue(msg is not None)
|
||||
command.check_link_accept(
|
||||
msg,
|
||||
@@ -167,18 +162,14 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
|
||||
# 6 DUT_LEADER: Verify DUT_LEADER didn't send a Parent Request message
|
||||
msg = leader_messages_temp.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST, False
|
||||
)
|
||||
mle.CommandType.PARENT_REQUEST, False)
|
||||
self.assertTrue(msg is None)
|
||||
|
||||
# 7 ALL: Verify connectivity by sending an ICMPv6 Echo Request from
|
||||
# DUT_LEADER to DUT_ROUTER1 link local address
|
||||
router1_link_local_address = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
self.assertTrue(
|
||||
self.nodes[DUT_LEADER].ping(router1_link_local_address)
|
||||
)
|
||||
config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
self.assertTrue(self.nodes[DUT_LEADER].ping(router1_link_local_address))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -38,6 +38,7 @@ ED = 3
|
||||
|
||||
|
||||
class Cert_5_5_2_LeaderReboot(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ MTDS = [ED1, ED2, ED3]
|
||||
|
||||
|
||||
class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER4 = 5
|
||||
|
||||
|
||||
class Cert_5_5_4_SplitMergeRouters(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ REED1 = 17
|
||||
|
||||
|
||||
class Cert_5_5_5_SplitMergeREED(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ ROUTER3 = 4
|
||||
|
||||
|
||||
class Cert_5_5_7_SplitMergeThreeWay(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ ED1 = 5
|
||||
|
||||
|
||||
class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_3_NetworkDataRegisterAfterAttachLeader(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_4_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ REED = 3
|
||||
|
||||
|
||||
class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ ED = 3
|
||||
|
||||
|
||||
class Cert_5_6_8_ContextManagement(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ MTDS = [ED, SED]
|
||||
|
||||
|
||||
class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_5_8_1_KeySynchronization(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_8_2_KeyIncrement(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_8_3_KeyIncrementRollOver(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_1_1_RouterAttach(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -109,8 +110,7 @@ class Cert_6_1_1_RouterAttach(unittest.TestCase):
|
||||
|
||||
# 5 - leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
# 6 - leader
|
||||
|
||||
@@ -43,6 +43,7 @@ MED = 3
|
||||
|
||||
|
||||
class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -99,9 +100,8 @@ class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
check_parent_request(msg, is_first_request=False)
|
||||
|
||||
# Step 6 - DUT sends Child ID Request
|
||||
msg = med_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[REED]
|
||||
)
|
||||
msg = med_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST,
|
||||
sent_to_node=self.nodes[REED])
|
||||
check_child_id_request(
|
||||
msg,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
@@ -117,8 +117,7 @@ class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
|
||||
# Step 8 - DUT sends Child Update messages
|
||||
msg = med_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg,
|
||||
source_address=CheckType.CONTAIN,
|
||||
|
||||
@@ -44,6 +44,7 @@ SED = 3
|
||||
|
||||
|
||||
class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -100,9 +101,8 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
check_parent_request(msg, is_first_request=False)
|
||||
|
||||
# Step 6 - DUT sends Child ID Request
|
||||
msg = sed_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[REED]
|
||||
)
|
||||
msg = sed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST,
|
||||
sent_to_node=self.nodes[REED])
|
||||
check_child_id_request(
|
||||
msg,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
@@ -119,9 +119,8 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
|
||||
# Step 11 - SED sends periodic 802.15.4 Data Request messages
|
||||
msg = sed_messages.next_message()
|
||||
self.assertEqual(
|
||||
False, msg.isMacAddressTypeLong()
|
||||
) # Extra check, keep-alive messages are of short types of mac address
|
||||
self.assertEqual(False, msg.isMacAddressTypeLong(
|
||||
)) # Extra check, keep-alive messages are of short types of mac address
|
||||
self.assertEqual(msg.type, message.MessageType.COMMAND)
|
||||
self.assertEqual(
|
||||
msg.mac_header.command_type,
|
||||
|
||||
@@ -40,6 +40,7 @@ ED = 5
|
||||
|
||||
|
||||
class Cert_6_1_3_RouterAttachConnectivity(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ ED = 5
|
||||
|
||||
|
||||
class Cert_6_1_4_REEDAttachConnectivity(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ ED = 4
|
||||
|
||||
|
||||
class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -62,9 +63,7 @@ class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_panid(0xface)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ED].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ED].get_addr64(), rssi=-85)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ ED = 4
|
||||
|
||||
|
||||
class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -63,9 +64,7 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_panid(0xface)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ED].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ED].get_addr64(), rssi=-85)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -140,9 +139,7 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 4 - Router2
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
# 5 - ED
|
||||
@@ -159,9 +156,7 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
self.assertEqual(1, scan_mask_tlv.end_device)
|
||||
|
||||
# 6 - REED
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
|
||||
@@ -40,6 +40,7 @@ SED = 4
|
||||
|
||||
|
||||
class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -63,9 +64,8 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_panid(0xface)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[SED].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[SED].get_addr64(),
|
||||
rssi=-85)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -141,9 +141,7 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 4 - Router2
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[SED])
|
||||
|
||||
# 5 - SED
|
||||
@@ -160,9 +158,7 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
self.assertEqual(1, scan_mask_tlv.end_device)
|
||||
|
||||
# 6 - REED
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[SED])
|
||||
|
||||
msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
|
||||
@@ -40,6 +40,7 @@ ROUTER3 = 5
|
||||
|
||||
|
||||
class Cert_6_1_7_EDSynchronization(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ ED = 3
|
||||
|
||||
|
||||
class Cert_6_2_1_NewPartition(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ ED = 4
|
||||
|
||||
|
||||
class Cert_6_2_2_NewPartition(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ ED = 3
|
||||
|
||||
|
||||
class Cert_6_3_1_OrphanReattach(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_3_2_NetworkDataUpdate(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_4_1_LinkLocal(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ ED = 3
|
||||
|
||||
|
||||
class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -87,21 +88,15 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::1',
|
||||
num_responses=2,
|
||||
size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::1', num_responses=2))
|
||||
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2, size=256
|
||||
)
|
||||
)
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2
|
||||
)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_5_1_ChildResetSynchronize(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_6_1_KeyIncrement(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ ED = 2
|
||||
|
||||
|
||||
class Cert_6_6_2_KeyIncrement1(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ MTDS = [SED1, MED1]
|
||||
|
||||
|
||||
class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -138,68 +139,52 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE)
|
||||
check_data_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(prefix=b'2001000200000001'),
|
||||
SinglePrefixCheck(prefix=b'2001000200000002'),
|
||||
]
|
||||
)
|
||||
),
|
||||
network_data_check=NetworkDataCheck(prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(prefix=b'2001000200000001'),
|
||||
SinglePrefixCheck(prefix=b'2001000200000002'),
|
||||
])),
|
||||
)
|
||||
|
||||
# Step 4 - DUT sends a MLE Child ID Response to Router1
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
check_child_id_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_cnt=2)
|
||||
),
|
||||
network_data_check=NetworkDataCheck(prefixes_check=PrefixesCheck(
|
||||
prefix_cnt=2)),
|
||||
)
|
||||
|
||||
# Step 6 - DUT sends a MLE Child ID Response to SED1
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
check_child_id_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(border_router_16=0xfffe)
|
||||
]
|
||||
)
|
||||
),
|
||||
network_data_check=NetworkDataCheck(prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[SinglePrefixCheck(
|
||||
border_router_16=0xfffe)])),
|
||||
)
|
||||
|
||||
# For Step 10
|
||||
msg_chd_upd_res_to_sed = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE)
|
||||
|
||||
# Step 8 - DUT sends a MLE Child ID Response to MED1
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
check_child_id_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_cnt=2)
|
||||
),
|
||||
network_data_check=NetworkDataCheck(prefixes_check=PrefixesCheck(
|
||||
prefix_cnt=2)),
|
||||
)
|
||||
|
||||
# Step 10 - DUT sends Child Update Response
|
||||
msg_chd_upd_res_to_med = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE)
|
||||
msg = med1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2]
|
||||
)
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
|
||||
check_child_update_response(
|
||||
msg_chd_upd_res_to_med,
|
||||
@@ -208,11 +193,9 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
|
||||
)
|
||||
|
||||
msg = sed1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1]
|
||||
)
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
check_child_update_response(
|
||||
msg_chd_upd_res_to_sed,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED2, SED2]
|
||||
|
||||
|
||||
class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ MTDS = [SED1, MED1]
|
||||
|
||||
|
||||
class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -143,24 +144,19 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE)
|
||||
check_data_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(b'2001000200000001'),
|
||||
SinglePrefixCheck(b'2001000200000002'),
|
||||
]
|
||||
)
|
||||
),
|
||||
network_data_check=NetworkDataCheck(prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(b'2001000200000001'),
|
||||
SinglePrefixCheck(b'2001000200000002'),
|
||||
])),
|
||||
)
|
||||
|
||||
# 4 - N/A
|
||||
# Get addresses registered by MED1
|
||||
msg = med1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2]
|
||||
)
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
|
||||
# 5 - Leader
|
||||
# Make a copy of leader's messages to ensure that we don't miss
|
||||
@@ -170,9 +166,9 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE,
|
||||
sent_to_node=self.nodes[MED1],
|
||||
)
|
||||
check_child_update_response(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[1, 2]
|
||||
)
|
||||
check_child_update_response(msg,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
CIDs=[1, 2])
|
||||
|
||||
# 6A & 6B - Leader
|
||||
if config.LEADER_NOTIFY_SED_BY_CHILD_UPDATE_REQUEST:
|
||||
@@ -188,27 +184,24 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
)
|
||||
else:
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.DATA_RESPONSE, sent_to_node=self.nodes[SED1]
|
||||
)
|
||||
mle.CommandType.DATA_RESPONSE, sent_to_node=self.nodes[SED1])
|
||||
check_data_response(msg, network_data_check=NetworkDataCheck())
|
||||
|
||||
# 7 - N/A
|
||||
# Get addresses registered by SED1
|
||||
msg = sed1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1]
|
||||
)
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
|
||||
# 8 - Leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE,
|
||||
sent_to_node=self.nodes[SED1],
|
||||
)
|
||||
check_child_update_response(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[1]
|
||||
)
|
||||
check_child_update_response(msg,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
CIDs=[1])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [SED2, ED2]
|
||||
|
||||
|
||||
class Cert_7_1_4_BorderRouterAsRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MTDS = [ED2, SED2]
|
||||
|
||||
|
||||
class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -127,11 +128,8 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.assertTrue(any('2001:2:0:2' in addr[0:10] for addr in addrs))
|
||||
self.assertTrue(any('2001:2:0:3' in addr[0:10] for addr in addrs))
|
||||
for addr in addrs:
|
||||
if (
|
||||
addr[0:10] == '2001:2:0:1'
|
||||
or addr[0:10] == '2001:2:0:2'
|
||||
or addr[0:10] == '2001:2:0:3'
|
||||
):
|
||||
if (addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2' or
|
||||
addr[0:10] == '2001:2:0:3'):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
addrs = self.nodes[SED2].get_addrs()
|
||||
@@ -139,11 +137,8 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.assertFalse(any('2001:2:0:2' in addr[0:10] for addr in addrs))
|
||||
self.assertTrue(any('2001:2:0:3' in addr[0:10] for addr in addrs))
|
||||
for addr in addrs:
|
||||
if (
|
||||
addr[0:10] == '2001:2:0:1'
|
||||
or addr[0:10] == '2001:2:0:2'
|
||||
or addr[0:10] == '2001:2:0:3'
|
||||
):
|
||||
if (addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2' or
|
||||
addr[0:10] == '2001:2:0:3'):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ JOINER = 2
|
||||
|
||||
|
||||
class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -52,8 +53,7 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'00112233445566778899aabbccddeeff'
|
||||
)
|
||||
'00112233445566778899aabbccddeeff')
|
||||
|
||||
self.nodes[JOINER].set_mode('rsdn')
|
||||
self.nodes[JOINER].set_masterkey('deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
@@ -73,15 +73,13 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD')
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('OPENTHREAD')
|
||||
self.simulator.go(10)
|
||||
self.simulator.read_cert_messages_in_commissioning_log(
|
||||
[COMMISSIONER, JOINER]
|
||||
)
|
||||
[COMMISSIONER, JOINER])
|
||||
self.assertEqual(
|
||||
self.nodes[JOINER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
@@ -89,66 +87,55 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
|
||||
joiner_messages = self.simulator.get_messages_sent_by(JOINER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(
|
||||
COMMISSIONER
|
||||
)
|
||||
COMMISSIONER)
|
||||
|
||||
# 2 - N/A
|
||||
|
||||
# 3 - Joiner_1
|
||||
msg = joiner_messages.next_mle_message(
|
||||
mle.CommandType.DISCOVERY_REQUEST
|
||||
)
|
||||
mle.CommandType.DISCOVERY_REQUEST)
|
||||
command.check_discovery_request(msg)
|
||||
request_src_addr = msg.mac_header.src_address
|
||||
|
||||
# 4 - Commissioner
|
||||
msg = commissioner_messages.next_mle_message(
|
||||
mle.CommandType.DISCOVERY_RESPONSE
|
||||
)
|
||||
command.check_discovery_response(
|
||||
msg, request_src_addr, steering_data=CheckType.CONTAIN
|
||||
)
|
||||
mle.CommandType.DISCOVERY_RESPONSE)
|
||||
command.check_discovery_response(msg,
|
||||
request_src_addr,
|
||||
steering_data=CheckType.CONTAIN)
|
||||
udp_port_set_by_commissioner = command.get_joiner_udp_port_in_discovery_response(
|
||||
msg)
|
||||
|
||||
# 5.2 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_HELLO
|
||||
)
|
||||
msg = joiner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE,
|
||||
dtls.HandshakeType.CLIENT_HELLO)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
|
||||
# 5.3 - Commissioner
|
||||
msg = commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.HELLO_VERIFY_REQUEST
|
||||
)
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.HELLO_VERIFY_REQUEST)
|
||||
commissioner_cookie = msg.dtls.body.cookie
|
||||
|
||||
# 5.4 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_HELLO
|
||||
)
|
||||
msg = joiner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE,
|
||||
dtls.HandshakeType.CLIENT_HELLO)
|
||||
self.assertEqual(commissioner_cookie, msg.dtls.body.cookie)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
|
||||
# 5.5 - Commissioner
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE,
|
||||
dtls.HandshakeType.SERVER_HELLO)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO
|
||||
)
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_KEY_EXCHANGE)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_KEY_EXCHANGE
|
||||
)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO_DONE
|
||||
)
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO_DONE)
|
||||
|
||||
# 5.6 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_KEY_EXCHANGE
|
||||
)
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_KEY_EXCHANGE)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC
|
||||
)
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here.
|
||||
@@ -156,8 +143,7 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
|
||||
# 5.7 - Commissioner
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC
|
||||
)
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC)
|
||||
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here.
|
||||
# Currently not handled as it is encrypted.
|
||||
@@ -165,16 +151,13 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
# 5.8,9,10,11
|
||||
# - Joiner_1
|
||||
command.check_joiner_commissioning_messages(
|
||||
joiner_messages.commissioning_messages
|
||||
)
|
||||
joiner_messages.commissioning_messages)
|
||||
# - Commissioner
|
||||
command.check_commissioner_commissioning_messages(
|
||||
commissioner_messages.commissioning_messages
|
||||
)
|
||||
commissioner_messages.commissioning_messages)
|
||||
# As commissioner is also joiner router
|
||||
command.check_joiner_router_commissioning_messages(
|
||||
commissioner_messages.commissioning_messages
|
||||
)
|
||||
commissioner_messages.commissioning_messages)
|
||||
|
||||
self.nodes[JOINER].thread_start()
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -37,6 +37,7 @@ JOINER = 2
|
||||
|
||||
|
||||
class Cert_8_1_02_Commissioning(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -47,8 +48,7 @@ class Cert_8_1_02_Commissioning(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef'
|
||||
)
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
|
||||
self.nodes[JOINER].set_mode('rsdn')
|
||||
self.nodes[JOINER].set_masterkey('00112233445566778899aabbccddeeff')
|
||||
@@ -68,8 +68,7 @@ class Cert_8_1_02_Commissioning(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD')
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('DAERHTNEPO')
|
||||
|
||||
@@ -38,6 +38,7 @@ JOINER = 3
|
||||
|
||||
|
||||
class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -48,15 +49,13 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef'
|
||||
)
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[JOINER_ROUTER].set_mode('rsdn')
|
||||
self.nodes[JOINER_ROUTER].set_masterkey(
|
||||
'00112233445566778899aabbccddeeff'
|
||||
)
|
||||
'00112233445566778899aabbccddeeff')
|
||||
self.nodes[JOINER_ROUTER].enable_whitelist()
|
||||
self.nodes[JOINER_ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
@@ -80,19 +79,15 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(5)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD2'
|
||||
)
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD2')
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].get_joiner_id())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[COMMISSIONER].get_addr64()
|
||||
)
|
||||
self.nodes[COMMISSIONER].get_addr64())
|
||||
|
||||
self.nodes[JOINER_ROUTER].interface_up()
|
||||
self.nodes[JOINER_ROUTER].joiner_start('OPENTHREAD')
|
||||
@@ -103,19 +98,15 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
self.nodes[JOINER_ROUTER].thread_start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_state(), 'router')
|
||||
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[JOINER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
self.nodes[JOINER].get_joiner_id())
|
||||
self.nodes[JOINER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('OPENTHREAD2')
|
||||
@@ -125,9 +116,7 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[JOINER].get_addr64()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(self.nodes[JOINER].get_addr64())
|
||||
|
||||
self.nodes[JOINER].thread_start()
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -38,6 +38,7 @@ JOINER = 3
|
||||
|
||||
|
||||
class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -48,15 +49,13 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef'
|
||||
)
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[JOINER_ROUTER].set_mode('rsdn')
|
||||
self.nodes[JOINER_ROUTER].set_masterkey(
|
||||
'00112233445566778899aabbccddeeff'
|
||||
)
|
||||
'00112233445566778899aabbccddeeff')
|
||||
self.nodes[JOINER_ROUTER].enable_whitelist()
|
||||
self.nodes[JOINER_ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
@@ -80,19 +79,15 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(5)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD2'
|
||||
)
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD2')
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].get_joiner_id())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[COMMISSIONER].get_addr64()
|
||||
)
|
||||
self.nodes[COMMISSIONER].get_addr64())
|
||||
|
||||
self.nodes[JOINER_ROUTER].interface_up()
|
||||
self.nodes[JOINER_ROUTER].joiner_start('OPENTHREAD')
|
||||
@@ -103,19 +98,15 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
self.nodes[JOINER_ROUTER].thread_start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_state(), 'router')
|
||||
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[JOINER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
self.nodes[JOINER].get_joiner_id())
|
||||
self.nodes[JOINER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('2DAERHTNEPO')
|
||||
|
||||
@@ -41,6 +41,7 @@ LEADER = 2
|
||||
|
||||
|
||||
class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -88,15 +89,13 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04', assert_enabled=True)
|
||||
commissioner_session_id_tlv = command.get_sub_tlv(
|
||||
msg.coap.payload, mesh_cop.CommissionerSessionId
|
||||
)
|
||||
msg.coap.payload, mesh_cop.CommissionerSessionId)
|
||||
|
||||
# Step 2 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
steering_data_tlv = mesh_cop.SteeringData(bytes([0xff]))
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[steering_data_tlv]
|
||||
)
|
||||
[steering_data_tlv])
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 3 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
@@ -105,19 +104,16 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
# (mesh_cop.State(mesh_cop.MeshCopState.REJECT),) <- this a tuple, don't delete the comma
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
self.simulator.get_messages_sent_by(COMMISSIONER) # Skip LEAD_PET.req
|
||||
|
||||
# Step 4 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[steering_data_tlv, commissioner_session_id_tlv]
|
||||
)
|
||||
[steering_data_tlv, commissioner_session_id_tlv])
|
||||
self.simulator.go(5)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(
|
||||
COMMISSIONER
|
||||
)
|
||||
COMMISSIONER)
|
||||
msg = commissioner_messages.next_coap_message('0.02', uri_path='/c/cs')
|
||||
rloc = ip_address(self.nodes[LEADER].get_rloc())
|
||||
leader_aloc = ip_address(self.nodes[LEADER].get_addr_leader_aloc())
|
||||
@@ -131,8 +127,7 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)]
|
||||
)
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)])
|
||||
|
||||
# Step 6 - Leader sends a multicast MLE Data Response
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE)
|
||||
@@ -146,16 +141,14 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
mesh_cop.SteeringData,
|
||||
mesh_cop.BorderAgentLocator,
|
||||
],
|
||||
)
|
||||
),
|
||||
)),
|
||||
)
|
||||
|
||||
# Step 7 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
border_agent_locator_tlv = mesh_cop.BorderAgentLocator(0x0400)
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[commissioner_session_id_tlv, border_agent_locator_tlv]
|
||||
)
|
||||
[commissioner_session_id_tlv, border_agent_locator_tlv])
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 8 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
@@ -163,18 +156,15 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
|
||||
# Step 9 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[
|
||||
steering_data_tlv,
|
||||
commissioner_session_id_tlv,
|
||||
border_agent_locator_tlv,
|
||||
]
|
||||
)
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs([
|
||||
steering_data_tlv,
|
||||
commissioner_session_id_tlv,
|
||||
border_agent_locator_tlv,
|
||||
])
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 10 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
@@ -182,14 +172,12 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
|
||||
# Step 11 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[mesh_cop.CommissionerSessionId(0xffff), steering_data_tlv]
|
||||
)
|
||||
[mesh_cop.CommissionerSessionId(0xffff), steering_data_tlv])
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 12 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
@@ -197,18 +185,15 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
|
||||
# Step 13 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[
|
||||
commissioner_session_id_tlv,
|
||||
steering_data_tlv,
|
||||
mesh_cop.Channel(0x0, 0x0),
|
||||
]
|
||||
)
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs([
|
||||
commissioner_session_id_tlv,
|
||||
steering_data_tlv,
|
||||
mesh_cop.Channel(0x0, 0x0),
|
||||
])
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 14 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
@@ -216,8 +201,7 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)]
|
||||
)
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)])
|
||||
|
||||
# Step 15 - Send ICMPv6 Echo Request to Leader
|
||||
leader_rloc = self.nodes[LEADER].get_rloc()
|
||||
|
||||
@@ -37,6 +37,7 @@ LEADER = 2
|
||||
|
||||
|
||||
class Cert_9_2_04_ActiveDataset(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -45,14 +46,12 @@ class Cert_9_2_04_ActiveDataset(unittest.TestCase):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f'
|
||||
)
|
||||
10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f')
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f'
|
||||
)
|
||||
10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f')
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ COMMISSIONER_PENDING_PANID = 0xafce
|
||||
|
||||
|
||||
class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -70,9 +71,8 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER].set_active_dataset(ROUTER_ACTIVE_TIMESTAMP)
|
||||
self.nodes[ROUTER].set_pending_dataset(
|
||||
ROUTER_PENDING_TIMESTAMP, ROUTER_PENDING_ACTIVE_TIMESTAMP
|
||||
)
|
||||
self.nodes[ROUTER].set_pending_dataset(ROUTER_PENDING_TIMESTAMP,
|
||||
ROUTER_PENDING_ACTIVE_TIMESTAMP)
|
||||
self.nodes[ROUTER].set_mode('rsdn')
|
||||
self.nodes[ROUTER].set_panid(PANID_INIT)
|
||||
self.nodes[ROUTER].set_partition_id(0x1)
|
||||
@@ -122,26 +122,21 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
panid=COMMISSIONER_PENDING_PANID,
|
||||
)
|
||||
self.simulator.go(40)
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(self.nodes[LEADER].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[ROUTER].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(self.nodes[LEADER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL,
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(self.nodes[ROUTER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL)
|
||||
|
||||
ipaddrs = self.nodes[ROUTER].get_addrs()
|
||||
for ipaddr in ipaddrs:
|
||||
|
||||
@@ -49,6 +49,7 @@ MTDS = [ED, SED]
|
||||
|
||||
|
||||
class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -56,17 +57,17 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP,
|
||||
panid=PANID_INIT,
|
||||
channel=CHANNEL_INIT)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP,
|
||||
panid=PANID_INIT,
|
||||
channel=CHANNEL_INIT)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER].get_addr64())
|
||||
@@ -74,9 +75,9 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[SED].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
|
||||
self.nodes[ROUTER].set_active_dataset(
|
||||
LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT
|
||||
)
|
||||
self.nodes[ROUTER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP,
|
||||
panid=PANID_INIT,
|
||||
channel=CHANNEL_INIT)
|
||||
self.nodes[ROUTER].set_mode('rsdn')
|
||||
self._setUpRouter()
|
||||
|
||||
@@ -149,16 +150,13 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
|
||||
self.simulator.go(60)
|
||||
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(self.nodes[LEADER].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(self.nodes[LEADER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL,
|
||||
@@ -186,25 +184,18 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
|
||||
self.simulator.go(10)
|
||||
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ED].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[SED].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(self.nodes[ROUTER].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[ED].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[SED].get_panid(),
|
||||
COMMISSIONER_PENDING_PANID)
|
||||
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ED].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[SED].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(self.nodes[ROUTER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[ED].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[SED].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL)
|
||||
|
||||
self.simulator.go(5)
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ ROUTER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -52,17 +53,17 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -70,18 +71,18 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER2].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
|
||||
@@ -48,6 +48,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -55,17 +56,17 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -73,9 +74,9 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ED1].get_addr64())
|
||||
|
||||
@@ -48,6 +48,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -55,26 +56,29 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(10,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ED1].get_addr64())
|
||||
|
||||
@@ -48,6 +48,7 @@ DATASET2_PANID = 0xafce
|
||||
|
||||
|
||||
class Cert_9_2_12_Announce(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -55,34 +56,34 @@ class Cert_9_2_12_Announce(unittest.TestCase):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == MED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER1].set_active_dataset(
|
||||
DATASET1_TIMESTAMP, channel=DATASET1_CHANNEL, panid=DATASET1_PANID
|
||||
)
|
||||
self.nodes[LEADER1].set_active_dataset(DATASET1_TIMESTAMP,
|
||||
channel=DATASET1_CHANNEL,
|
||||
panid=DATASET1_PANID)
|
||||
self.nodes[LEADER1].set_mode('rsdn')
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER1].enable_whitelist()
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
DATASET1_TIMESTAMP, channel=DATASET1_CHANNEL, panid=DATASET1_PANID
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(DATASET1_TIMESTAMP,
|
||||
channel=DATASET1_CHANNEL,
|
||||
panid=DATASET1_PANID)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER1].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER2].set_active_dataset(
|
||||
DATASET2_TIMESTAMP, channel=DATASET2_CHANNEL, panid=DATASET2_PANID
|
||||
)
|
||||
self.nodes[LEADER2].set_active_dataset(DATASET2_TIMESTAMP,
|
||||
channel=DATASET2_CHANNEL,
|
||||
panid=DATASET2_PANID)
|
||||
self.nodes[LEADER2].set_mode('rsdn')
|
||||
self.nodes[LEADER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER2].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[LEADER2].enable_whitelist()
|
||||
self.nodes[LEADER2].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
DATASET2_TIMESTAMP, channel=DATASET2_CHANNEL, panid=DATASET2_PANID
|
||||
)
|
||||
self.nodes[ROUTER2].set_active_dataset(DATASET2_TIMESTAMP,
|
||||
channel=DATASET2_CHANNEL,
|
||||
panid=DATASET2_PANID)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER2].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[MED].get_addr64())
|
||||
|
||||
@@ -39,6 +39,7 @@ ED1 = 4
|
||||
|
||||
|
||||
class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -101,9 +102,7 @@ class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
break
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
self.nodes[COMMISSIONER].energy_scan(
|
||||
0x50000, 0x02, 0x20, 0x3E8, ipaddr
|
||||
)
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3E8, ipaddr)
|
||||
|
||||
ipaddrs = self.nodes[ED1].get_addrs()
|
||||
for ipaddr in ipaddrs:
|
||||
@@ -111,13 +110,10 @@ class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
break
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
self.nodes[COMMISSIONER].energy_scan(
|
||||
0x50000, 0x02, 0x20, 0x3E8, ipaddr
|
||||
)
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3E8, ipaddr)
|
||||
|
||||
self.nodes[COMMISSIONER].energy_scan(
|
||||
0x50000, 0x02, 0x20, 0x3E8, 'ff33:0040:fdde:ad00:beef:0:0:1'
|
||||
)
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3E8,
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1')
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ LEADER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_14_PanIdQuery(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -48,17 +49,13 @@ class Cert_9_2_14_PanIdQuery(unittest.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[LEADER1].get_addr64()
|
||||
)
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER1].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER1].set_panid(0xface)
|
||||
self.nodes[LEADER1].set_mode('rsdn')
|
||||
self.nodes[LEADER1].add_whitelist(
|
||||
self.nodes[COMMISSIONER].get_addr64()
|
||||
)
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER1].enable_whitelist()
|
||||
|
||||
@@ -106,9 +103,8 @@ class Cert_9_2_14_PanIdQuery(unittest.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff, ipaddr)
|
||||
|
||||
self.nodes[COMMISSIONER].panid_query(
|
||||
0xdead, 0xffffffff, 'ff33:0040:fdde:ad00:beef:0:0:1'
|
||||
)
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff,
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1')
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ ROUTER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -51,17 +52,17 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -69,18 +70,18 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER2].set_active_dataset(15,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self._setUpRouter2()
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ ROUTER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -52,17 +53,17 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -70,18 +71,18 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER2].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self._setUpRouter2()
|
||||
|
||||
@@ -135,27 +136,22 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=15, network_name='threadCert'
|
||||
)
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=15,
|
||||
network_name='threadCert')
|
||||
self.simulator.go(100)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER1].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER2].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_network_name(),
|
||||
NETWORK_NAME_FINAL)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(),
|
||||
NETWORK_NAME_FINAL)
|
||||
self.assertEqual(self.nodes[ROUTER1].get_network_name(),
|
||||
NETWORK_NAME_FINAL)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_network_name(),
|
||||
NETWORK_NAME_FINAL)
|
||||
|
||||
self.simulator.go(100)
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ ED1 = 3
|
||||
|
||||
|
||||
class Cert_9_2_17_Orphan(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -50,17 +51,19 @@ class Cert_9_2_17_Orphan(unittest.TestCase):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER1].set_active_dataset(
|
||||
10, channel=CHANNEL1, panid=PANID_INIT, channel_mask=CHANNEL_MASK
|
||||
)
|
||||
self.nodes[LEADER1].set_active_dataset(10,
|
||||
channel=CHANNEL1,
|
||||
panid=PANID_INIT,
|
||||
channel_mask=CHANNEL_MASK)
|
||||
self.nodes[LEADER1].set_mode('rsdn')
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[ED1].get_addr64())
|
||||
self.nodes[LEADER1].enable_whitelist()
|
||||
self.nodes[LEADER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER2].set_active_dataset(
|
||||
20, channel=CHANNEL2, panid=PANID_INIT, channel_mask=CHANNEL_MASK
|
||||
)
|
||||
self.nodes[LEADER2].set_active_dataset(20,
|
||||
channel=CHANNEL2,
|
||||
panid=PANID_INIT,
|
||||
channel_mask=CHANNEL_MASK)
|
||||
self.nodes[LEADER2].set_mode('rsdn')
|
||||
self.nodes[LEADER2].enable_whitelist()
|
||||
self.nodes[LEADER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -49,6 +49,7 @@ MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -56,17 +57,19 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
for i in range(1, 7):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[LEADER].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -74,9 +77,10 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[ROUTER1].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
@@ -85,9 +89,10 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[ROUTER2].set_active_dataset(1,
|
||||
channel=CHANNEL_INIT,
|
||||
panid=PANID_INIT,
|
||||
master_key=KEY1)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
@@ -136,9 +141,8 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=20000, network_name='GRL'
|
||||
)
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=20000,
|
||||
network_name='GRL')
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
|
||||
@@ -35,6 +35,7 @@ LEADER = 1
|
||||
|
||||
|
||||
class Cert_Cli(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.nodes = {}
|
||||
self.nodes[LEADER] = node.Node(LEADER)
|
||||
|
||||
@@ -37,6 +37,7 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Test_MacScan(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.nodes = {}
|
||||
for i in range(1, 3):
|
||||
|
||||
@@ -61,7 +61,6 @@ class CoapOptionsTypes(IntEnum):
|
||||
|
||||
|
||||
class CoapOptionHeader(object):
|
||||
|
||||
""" Class representing CoAP optiona header. """
|
||||
|
||||
def __init__(self, delta, length):
|
||||
@@ -104,7 +103,6 @@ class CoapOptionHeader(object):
|
||||
|
||||
|
||||
class CoapOption(object):
|
||||
|
||||
""" Class representing CoAP option. """
|
||||
|
||||
def __init__(self, _type, value):
|
||||
@@ -120,13 +118,11 @@ class CoapOption(object):
|
||||
return self._value
|
||||
|
||||
def __repr__(self):
|
||||
return "CoapOption(type={}, value={})".format(
|
||||
self.type, hexlify(self.value)
|
||||
)
|
||||
return "CoapOption(type={}, value={})".format(self.type,
|
||||
hexlify(self.value))
|
||||
|
||||
|
||||
class CoapOptionsFactory(object):
|
||||
|
||||
""" Factory that produces CoAP options. """
|
||||
|
||||
def parse(self, data, message_info):
|
||||
@@ -148,7 +144,6 @@ class CoapOptionsFactory(object):
|
||||
|
||||
|
||||
class CoapCode(object):
|
||||
|
||||
""" Class representing CoAP code. """
|
||||
|
||||
def __init__(self, code):
|
||||
@@ -182,8 +177,7 @@ class CoapCode(object):
|
||||
@property
|
||||
def dotted(self):
|
||||
return ".".join(
|
||||
["{:01d}".format(self._class), "{:02d}".format(self.detail)]
|
||||
)
|
||||
["{:01d}".format(self._class), "{:02d}".format(self.detail)])
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, int):
|
||||
@@ -196,16 +190,14 @@ class CoapCode(object):
|
||||
return self.code == other.code
|
||||
|
||||
else:
|
||||
raise TypeError(
|
||||
"Could not compare {} and {}".format(type(self), type(other))
|
||||
)
|
||||
raise TypeError("Could not compare {} and {}".format(
|
||||
type(self), type(other)))
|
||||
|
||||
def __repr__(self):
|
||||
return self.dotted
|
||||
|
||||
|
||||
class CoapMessage(object):
|
||||
|
||||
""" Class representing CoAP message. """
|
||||
|
||||
def __init__(
|
||||
@@ -266,21 +258,21 @@ class CoapMessage(object):
|
||||
|
||||
def __repr__(self):
|
||||
options_str = ", ".join([repr(opt) for opt in self.options])
|
||||
return ("CoapMessage(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={},",
|
||||
"uri-path='{}')").format(
|
||||
self.version,
|
||||
CoapMessageType.name[self.type],
|
||||
self.code,
|
||||
self.message_id,
|
||||
hexlify(self.token),
|
||||
options_str,
|
||||
self.payload,
|
||||
self.uri_path,
|
||||
)
|
||||
return (
|
||||
"CoapMessage(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={},",
|
||||
"uri-path='{}')").format(
|
||||
self.version,
|
||||
CoapMessageType.name[self.type],
|
||||
self.code,
|
||||
self.message_id,
|
||||
hexlify(self.token),
|
||||
options_str,
|
||||
self.payload,
|
||||
self.uri_path,
|
||||
)
|
||||
|
||||
|
||||
class CoapMessageProxy(object):
|
||||
|
||||
""" Proxy class of CoAP message.
|
||||
|
||||
The main idea behind this class is to delay parsing payload. Due to architecture of the existing solution
|
||||
@@ -299,8 +291,7 @@ class CoapMessageProxy(object):
|
||||
self._message_info = message_info
|
||||
self._mid_to_uri_path_binder = mid_to_uri_path_binder
|
||||
self._uri_path_based_payload_factories = (
|
||||
uri_path_based_payload_factories
|
||||
)
|
||||
uri_path_based_payload_factories)
|
||||
|
||||
@property
|
||||
def version(self):
|
||||
@@ -334,14 +325,12 @@ class CoapMessageProxy(object):
|
||||
def payload(self):
|
||||
try:
|
||||
binded_uri_path = self._mid_to_uri_path_binder.get_uri_path_for(
|
||||
self.message_id, self.token
|
||||
)
|
||||
self.message_id, self.token)
|
||||
|
||||
factory = self._uri_path_based_payload_factories[binded_uri_path]
|
||||
|
||||
return factory.parse(
|
||||
io.BytesIO(self._coap_message.payload), self._message_info
|
||||
)
|
||||
return factory.parse(io.BytesIO(self._coap_message.payload),
|
||||
self._message_info)
|
||||
|
||||
except RuntimeError:
|
||||
return self._coap_message.payload
|
||||
@@ -352,14 +341,21 @@ class CoapMessageProxy(object):
|
||||
|
||||
def __repr__(self):
|
||||
options_str = ", ".join([repr(opt) for opt in self.options])
|
||||
return ("CoapMessageProxy(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={},",
|
||||
"uri-path='{}')").format(
|
||||
self.version, self.type, self.code, self.message_id, hexlify(self.token), options_str, self.payload,
|
||||
self.uri_path, )
|
||||
return (
|
||||
"CoapMessageProxy(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={},",
|
||||
"uri-path='{}')").format(
|
||||
self.version,
|
||||
self.type,
|
||||
self.code,
|
||||
self.message_id,
|
||||
hexlify(self.token),
|
||||
options_str,
|
||||
self.payload,
|
||||
self.uri_path,
|
||||
)
|
||||
|
||||
|
||||
class CoapMessageIdToUriPathBinder:
|
||||
|
||||
""" Class binds message id and token with URI path. """
|
||||
|
||||
def __init__(self):
|
||||
@@ -373,12 +369,11 @@ class CoapMessageIdToUriPathBinder:
|
||||
return self._uri_path_binds[message_id][hexlify(token)]
|
||||
except KeyError:
|
||||
raise RuntimeError(
|
||||
"Could not find URI PATH for message_id: {} and token: {}".format(
|
||||
message_id, hexlify(token)))
|
||||
"Could not find URI PATH for message_id: {} and token: {}".
|
||||
format(message_id, hexlify(token)))
|
||||
|
||||
|
||||
class CoapMessageFactory(object):
|
||||
|
||||
""" Factory that produces CoAP messages. """
|
||||
|
||||
def __init__(
|
||||
@@ -389,8 +384,7 @@ class CoapMessageFactory(object):
|
||||
):
|
||||
self._options_factory = options_factory
|
||||
self._uri_path_based_payload_factories = (
|
||||
uri_path_based_payload_factories
|
||||
)
|
||||
uri_path_based_payload_factories)
|
||||
self._mid_to_uri_path_binder = message_id_to_uri_path_binder
|
||||
|
||||
def _uri_path_from(self, options):
|
||||
@@ -416,8 +410,7 @@ class CoapMessageFactory(object):
|
||||
|
||||
def parse(self, data, message_info):
|
||||
version, _type, token_length = self._parse_initial_byte(
|
||||
data, message_info
|
||||
)
|
||||
data, message_info)
|
||||
|
||||
code = CoapCode(ord(data.read(1)))
|
||||
message_id = struct.unpack(">H", data.read(2))[0]
|
||||
@@ -428,8 +421,7 @@ class CoapMessageFactory(object):
|
||||
uri_path = self._uri_path_from(options)
|
||||
if uri_path is not None:
|
||||
self._mid_to_uri_path_binder.add_uri_path_for(
|
||||
message_id, token, uri_path
|
||||
)
|
||||
message_id, token, uri_path)
|
||||
|
||||
coap_message = CoapMessage(
|
||||
version,
|
||||
|
||||
@@ -58,22 +58,19 @@ def check_address_query(command_msg, source_node, destination_address):
|
||||
|
||||
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)
|
||||
)
|
||||
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."
|
||||
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_notification(command_msg, source_node, destination_node):
|
||||
@@ -86,22 +83,20 @@ def check_address_notification(command_msg, source_node, destination_node):
|
||||
|
||||
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
|
||||
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
|
||||
)
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
assert (
|
||||
ipv6.ip_address(destination_rloc)
|
||||
== command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
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_address_error_notification(
|
||||
command_msg, source_node, destination_address
|
||||
):
|
||||
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')
|
||||
@@ -110,27 +105,23 @@ def check_address_error_notification(
|
||||
|
||||
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)
|
||||
)
|
||||
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)
|
||||
)
|
||||
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_solicit(command_msg, was_router):
|
||||
@@ -151,12 +142,10 @@ def check_address_release(command_msg, destination_node):
|
||||
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"
|
||||
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_tlv_request_tlv(command_msg, check_type, tlv_id):
|
||||
@@ -165,14 +154,12 @@ def check_tlv_request_tlv(command_msg, check_type, tlv_id):
|
||||
tlv_request_tlv = command_msg.get_mle_message_tlv(mle.TlvRequest)
|
||||
|
||||
if check_type == CheckType.CONTAIN:
|
||||
assert (
|
||||
tlv_request_tlv is not None
|
||||
), "Error: The msg doesn't contain TLV Request TLV"
|
||||
assert (tlv_request_tlv is
|
||||
not None), "Error: The msg doesn't contain TLV Request TLV"
|
||||
assert any(
|
||||
tlv_id == tlv for tlv in tlv_request_tlv.tlvs
|
||||
), "Error: The msg doesn't contain TLV Request TLV ID: {}".format(
|
||||
tlv_id
|
||||
)
|
||||
tlv_id)
|
||||
|
||||
elif check_type == CheckType.NOT_CONTAIN:
|
||||
if tlv_request_tlv is not None:
|
||||
@@ -186,8 +173,7 @@ def check_tlv_request_tlv(command_msg, check_type, tlv_id):
|
||||
print("TLV Request TLV contains TLV ID: {}".format(tlv_id))
|
||||
else:
|
||||
print(
|
||||
"TLV Request TLV doesn't contain TLV ID: {}".format(tlv_id)
|
||||
)
|
||||
"TLV Request TLV doesn't contain TLV ID: {}".format(tlv_id))
|
||||
else:
|
||||
print("The msg doesn't contain TLV Request TLV")
|
||||
|
||||
@@ -211,15 +197,11 @@ def check_link_request(
|
||||
check_mle_optional_tlv(command_msg, source_address, mle.SourceAddress)
|
||||
check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData)
|
||||
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_address16, mle.TlvType.ADDRESS16
|
||||
)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_route64, mle.TlvType.ROUTE64
|
||||
)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN
|
||||
)
|
||||
check_tlv_request_tlv(command_msg, tlv_request_address16,
|
||||
mle.TlvType.ADDRESS16)
|
||||
check_tlv_request_tlv(command_msg, tlv_request_route64, mle.TlvType.ROUTE64)
|
||||
check_tlv_request_tlv(command_msg, tlv_request_link_margin,
|
||||
mle.TlvType.LINK_MARGIN)
|
||||
|
||||
|
||||
def check_link_accept(
|
||||
@@ -247,17 +229,14 @@ def check_link_accept(
|
||||
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
|
||||
)
|
||||
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
|
||||
)
|
||||
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"
|
||||
ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.
|
||||
ipv6_header.destination_address), "Error: The destination is unexpected"
|
||||
|
||||
|
||||
def check_icmp_path(sniffer, path, nodes, icmp_type=ipv6.ICMP_ECHO_REQUEST):
|
||||
@@ -273,9 +252,8 @@ def check_icmp_path(sniffer, path, nodes, icmp_type=ipv6.ICMP_ECHO_REQUEST):
|
||||
if i < len_path - 1:
|
||||
next_node = nodes[path[i + 1]]
|
||||
next_node_rloc16 = next_node.get_addr16()
|
||||
assert (
|
||||
next_node_rloc16 == node_icmp_msg.mac_header.dest_address.rloc
|
||||
), "Error: The path is unexpected."
|
||||
assert (next_node_rloc16 == node_icmp_msg.mac_header.dest_address.
|
||||
rloc), "Error: The path is unexpected."
|
||||
else:
|
||||
return True
|
||||
|
||||
@@ -327,8 +305,7 @@ def check_mle_optional_tlv(command_msg, type, tlv):
|
||||
def check_mle_advertisement(command_msg):
|
||||
command_msg.assertSentWithHopLimit(255)
|
||||
command_msg.assertSentToDestinationAddress(
|
||||
config.LINK_LOCAL_ALL_NODES_ADDRESS
|
||||
)
|
||||
config.LINK_LOCAL_ALL_NODES_ADDRESS)
|
||||
command_msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
command_msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Route64)
|
||||
@@ -344,8 +321,7 @@ def check_parent_request(command_msg, is_first_request):
|
||||
|
||||
command_msg.assertSentWithHopLimit(255)
|
||||
command_msg.assertSentToDestinationAddress(
|
||||
config.LINK_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
config.LINK_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Challenge)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Version)
|
||||
@@ -398,21 +374,15 @@ def check_child_id_request(
|
||||
|
||||
check_mle_optional_tlv(command_msg, tlv_request, mle.TlvRequest)
|
||||
check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, address_registration,
|
||||
mle.AddressRegistration)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, pending_timestamp, mle.PendingTimestamp
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, pending_timestamp, mle.PendingTimestamp)
|
||||
check_mle_optional_tlv(command_msg, route64, mle.Route64)
|
||||
|
||||
check_tlv_request_tlv(
|
||||
command_msg, CheckType.CONTAIN, mle.TlvType.ADDRESS16
|
||||
)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, CheckType.CONTAIN, mle.TlvType.NETWORK_DATA
|
||||
)
|
||||
check_tlv_request_tlv(command_msg, CheckType.CONTAIN, mle.TlvType.ADDRESS16)
|
||||
check_tlv_request_tlv(command_msg, CheckType.CONTAIN,
|
||||
mle.TlvType.NETWORK_DATA)
|
||||
|
||||
|
||||
def check_child_id_response(
|
||||
@@ -434,36 +404,29 @@ def check_child_id_response(
|
||||
|
||||
check_mle_optional_tlv(command_msg, route64, mle.Route64)
|
||||
check_mle_optional_tlv(command_msg, network_data, mle.NetworkData)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, address_registration,
|
||||
mle.AddressRegistration)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, pending_timestamp, mle.PendingTimestamp
|
||||
)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, active_operational_dataset, mle.ActiveOperationalDataset
|
||||
)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, pending_operational_dataset, mle.PendingOperationalDataset
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, pending_timestamp, mle.PendingTimestamp)
|
||||
check_mle_optional_tlv(command_msg, active_operational_dataset,
|
||||
mle.ActiveOperationalDataset)
|
||||
check_mle_optional_tlv(command_msg, pending_operational_dataset,
|
||||
mle.PendingOperationalDataset)
|
||||
|
||||
if network_data_check is not None:
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(
|
||||
mle.NetworkData
|
||||
)
|
||||
mle.NetworkData)
|
||||
network_data_check.check(network_data_tlv)
|
||||
|
||||
|
||||
def check_prefix(prefix):
|
||||
"""Verify if a prefix contains 6loWPAN sub-TLV and border router sub-TLV
|
||||
"""
|
||||
assert contains_tlv(prefix.sub_tlvs, network_data.BorderRouter
|
||||
), 'Prefix doesn\'t contain a border router sub-TLV!'
|
||||
assert contains_tlv(
|
||||
prefix.sub_tlvs, network_data.BorderRouter
|
||||
), 'Prefix doesn\'t contain a border router sub-TLV!'
|
||||
assert contains_tlv(
|
||||
prefix.sub_tlvs, network_data.LowpanId
|
||||
), 'Prefix doesn\'t contain a LowpanId sub-TLV!'
|
||||
prefix.sub_tlvs,
|
||||
network_data.LowpanId), 'Prefix doesn\'t contain a LowpanId sub-TLV!'
|
||||
|
||||
|
||||
def check_child_update_request_from_child(
|
||||
@@ -483,9 +446,8 @@ def check_child_update_request_from_child(
|
||||
check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData)
|
||||
check_mle_optional_tlv(command_msg, challenge, mle.Challenge)
|
||||
check_mle_optional_tlv(command_msg, time_out, mle.Timeout)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, address_registration,
|
||||
mle.AddressRegistration)
|
||||
check_mle_optional_tlv(command_msg, tlv_request_tlv, mle.TlvRequest)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
|
||||
@@ -510,13 +472,10 @@ def check_router_id_cached(node, router_id, cached=True):
|
||||
eidcaches = node.get_eidcaches()
|
||||
if cached:
|
||||
assert any(
|
||||
router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches
|
||||
)
|
||||
router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches)
|
||||
else:
|
||||
assert (
|
||||
any(router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches)
|
||||
is False
|
||||
)
|
||||
assert (any(router_id == (int(rloc, 16) >> 10)
|
||||
for (_, rloc) in eidcaches) is False)
|
||||
|
||||
|
||||
def contains_tlv(sub_tlvs, tlv_type):
|
||||
@@ -528,10 +487,9 @@ def contains_tlv(sub_tlvs, tlv_type):
|
||||
def contains_tlvs(sub_tlvs, tlv_types):
|
||||
"""Verify if all types of tlv in a list are included in a sub-tlv list.
|
||||
"""
|
||||
return all(
|
||||
(any(isinstance(sub_tlv, tlv_type) for sub_tlv in sub_tlvs))
|
||||
for tlv_type in tlv_types
|
||||
)
|
||||
return all((any(isinstance(sub_tlv, tlv_type)
|
||||
for sub_tlv in sub_tlvs))
|
||||
for tlv_type in tlv_types)
|
||||
|
||||
|
||||
def check_secure_mle_key_id_mode(command_msg, key_id_mode):
|
||||
@@ -541,9 +499,9 @@ def check_secure_mle_key_id_mode(command_msg, key_id_mode):
|
||||
assert command_msg.mle.aux_sec_hdr.key_id_mode == key_id_mode
|
||||
|
||||
|
||||
def check_data_response(
|
||||
command_msg, network_data_check=None, active_timestamp=CheckType.OPTIONAL
|
||||
):
|
||||
def check_data_response(command_msg,
|
||||
network_data_check=None,
|
||||
active_timestamp=CheckType.OPTIONAL):
|
||||
"""Verify a properly formatted Data Response command message.
|
||||
"""
|
||||
check_secure_mle_key_id_mode(command_msg, 0x02)
|
||||
@@ -552,8 +510,7 @@ def check_data_response(
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
if network_data_check is not None:
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(
|
||||
mle.NetworkData
|
||||
)
|
||||
mle.NetworkData)
|
||||
network_data_check.check(network_data_tlv)
|
||||
|
||||
|
||||
@@ -596,16 +553,14 @@ def check_child_update_response(
|
||||
command_msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
check_mle_optional_tlv(command_msg, timeout, mle.Timeout)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, address_registration,
|
||||
mle.AddressRegistration)
|
||||
check_mle_optional_tlv(command_msg, address16, mle.Address16)
|
||||
check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData)
|
||||
check_mle_optional_tlv(command_msg, network_data, mle.NetworkData)
|
||||
check_mle_optional_tlv(command_msg, response, mle.Response)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, link_layer_frame_counter, mle.LinkLayerFrameCounter
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, link_layer_frame_counter,
|
||||
mle.LinkLayerFrameCounter)
|
||||
check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter)
|
||||
|
||||
if (address_registration == CheckType.CONTAIN) and len(CIDs) > 0:
|
||||
@@ -614,8 +569,7 @@ def check_child_update_response(
|
||||
|
||||
def _check_address_registration(command_msg, CIDs=[]):
|
||||
addresses = command_msg.assertMleMessageContainsTlv(
|
||||
mle.AddressRegistration
|
||||
).addresses
|
||||
mle.AddressRegistration).addresses
|
||||
for cid in CIDs:
|
||||
found = False
|
||||
for address in addresses:
|
||||
@@ -623,9 +577,7 @@ def _check_address_registration(command_msg, CIDs=[]):
|
||||
if cid == address.cid:
|
||||
found = True
|
||||
break
|
||||
assert found, "AddressRegistration TLV doesn't have CID {} ".format(
|
||||
cid
|
||||
)
|
||||
assert found, "AddressRegistration TLV doesn't have CID {} ".format(cid)
|
||||
|
||||
|
||||
def get_sub_tlv(tlvs, tlv_type):
|
||||
@@ -637,9 +589,8 @@ def get_sub_tlv(tlvs, tlv_type):
|
||||
def check_address_registration_tlv(addr_reg_tlv, address_set):
|
||||
"""Verify all addresses contained in address_set are contained in add_reg_tlv
|
||||
"""
|
||||
assert all(
|
||||
addr in addr_reg_tlv.addresses for addr in address_set
|
||||
), 'Some addresses are not included in AddressRegistration TLV'
|
||||
assert all(addr in addr_reg_tlv.addresses for addr in address_set
|
||||
), 'Some addresses are not included in AddressRegistration TLV'
|
||||
|
||||
|
||||
def assert_contains_tlv(tlvs, check_type, tlv_type):
|
||||
@@ -663,36 +614,32 @@ def check_discovery_request(command_msg):
|
||||
"""
|
||||
assert not isinstance(command_msg.mle, mle.MleMessageSecured)
|
||||
tlvs = command_msg.assertMleMessageContainsTlv(mle.ThreadDiscovery).tlvs
|
||||
request = assert_contains_tlv(
|
||||
tlvs, CheckType.CONTAIN, mesh_cop.DiscoveryRequest
|
||||
)
|
||||
request = assert_contains_tlv(tlvs, CheckType.CONTAIN,
|
||||
mesh_cop.DiscoveryRequest)
|
||||
assert request.version == config.PROTOCOL_VERSION
|
||||
|
||||
|
||||
def check_discovery_response(
|
||||
command_msg, request_src_addr, steering_data=CheckType.OPTIONAL
|
||||
):
|
||||
def check_discovery_response(command_msg,
|
||||
request_src_addr,
|
||||
steering_data=CheckType.OPTIONAL):
|
||||
"""Verify a properly formatted Thread Discovery Response command message.
|
||||
"""
|
||||
assert not isinstance(command_msg.mle, mle.MleMessageSecured)
|
||||
assert (
|
||||
command_msg.mac_header.src_address.type == common.MacAddressType.LONG
|
||||
)
|
||||
command_msg.mac_header.src_address.type == common.MacAddressType.LONG)
|
||||
assert command_msg.mac_header.dest_address == request_src_addr
|
||||
|
||||
tlvs = command_msg.assertMleMessageContainsTlv(mle.ThreadDiscovery).tlvs
|
||||
response = assert_contains_tlv(
|
||||
tlvs, CheckType.CONTAIN, mesh_cop.DiscoveryResponse
|
||||
)
|
||||
response = assert_contains_tlv(tlvs, CheckType.CONTAIN,
|
||||
mesh_cop.DiscoveryResponse)
|
||||
assert response.version == config.PROTOCOL_VERSION
|
||||
assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.ExtendedPanid)
|
||||
assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.NetworkName)
|
||||
assert_contains_tlv(tlvs, steering_data, mesh_cop.SteeringData)
|
||||
assert_contains_tlv(tlvs, steering_data, mesh_cop.JoinerUdpPort)
|
||||
|
||||
check_type = (
|
||||
CheckType.CONTAIN if response.native_flag else CheckType.OPTIONAL
|
||||
)
|
||||
check_type = (CheckType.CONTAIN
|
||||
if response.native_flag else CheckType.OPTIONAL)
|
||||
assert_contains_tlv(tlvs, check_type, mesh_cop.CommissionerUdpPort)
|
||||
|
||||
|
||||
@@ -700,9 +647,8 @@ def get_joiner_udp_port_in_discovery_response(command_msg):
|
||||
"""Get the udp port specified in a DISCOVERY RESPONSE message
|
||||
"""
|
||||
tlvs = command_msg.assertMleMessageContainsTlv(mle.ThreadDiscovery).tlvs
|
||||
udp_port_tlv = assert_contains_tlv(
|
||||
tlvs, CheckType.CONTAIN, mesh_cop.JoinerUdpPort
|
||||
)
|
||||
udp_port_tlv = assert_contains_tlv(tlvs, CheckType.CONTAIN,
|
||||
mesh_cop.JoinerUdpPort)
|
||||
return udp_port_tlv.udp_port
|
||||
|
||||
|
||||
@@ -713,9 +659,8 @@ def check_joiner_commissioning_messages(commissioning_messages):
|
||||
assert len(commissioning_messages) >= 2
|
||||
join_fin_req = commissioning_messages[0]
|
||||
assert join_fin_req.type == mesh_cop.MeshCopMessageType.JOIN_FIN_REQ
|
||||
assert_contains_tlv(
|
||||
join_fin_req.tlvs, CheckType.NOT_CONTAIN, mesh_cop.ProvisioningUrl
|
||||
)
|
||||
assert_contains_tlv(join_fin_req.tlvs, CheckType.NOT_CONTAIN,
|
||||
mesh_cop.ProvisioningUrl)
|
||||
join_ent_rsp = commissioning_messages[1]
|
||||
assert join_ent_rsp.type == mesh_cop.MeshCopMessageType.JOIN_ENT_RSP
|
||||
|
||||
@@ -723,19 +668,15 @@ def check_joiner_commissioning_messages(commissioning_messages):
|
||||
def check_commissioner_commissioning_messages(commissioning_messages):
|
||||
"""Verify COAP messages sent by commissioner while commissioning process.
|
||||
"""
|
||||
assert any(
|
||||
msg.type == mesh_cop.MeshCopMessageType.JOIN_FIN_RSP
|
||||
for msg in commissioning_messages
|
||||
)
|
||||
assert any(msg.type == mesh_cop.MeshCopMessageType.JOIN_FIN_RSP
|
||||
for msg in commissioning_messages)
|
||||
|
||||
|
||||
def check_joiner_router_commissioning_messages(commissioning_messages):
|
||||
"""Verify COAP messages sent by joiner router while commissioning process.
|
||||
"""
|
||||
assert any(
|
||||
msg.type == mesh_cop.MeshCopMessageType.JOIN_ENT_NTF
|
||||
for msg in commissioning_messages
|
||||
)
|
||||
assert any(msg.type == mesh_cop.MeshCopMessageType.JOIN_ENT_NTF
|
||||
for msg in commissioning_messages)
|
||||
return None
|
||||
|
||||
|
||||
@@ -746,9 +687,9 @@ def check_payload_same(tp1, tp2):
|
||||
assert len(tp1) == len(tp2)
|
||||
for tlv in tp2:
|
||||
peer_tlv = get_sub_tlv(tp1, type(tlv))
|
||||
assert (
|
||||
peer_tlv is not None and peer_tlv == tlv
|
||||
), 'peer_tlv:{}, tlv:{} type:{}'.format(peer_tlv, tlv, type(tlv))
|
||||
assert (peer_tlv is not None and
|
||||
peer_tlv == tlv), 'peer_tlv:{}, tlv:{} type:{}'.format(
|
||||
peer_tlv, tlv, type(tlv))
|
||||
|
||||
|
||||
def check_coap_message(msg, payloads, dest_addrs=None):
|
||||
@@ -763,28 +704,28 @@ def check_coap_message(msg, payloads, dest_addrs=None):
|
||||
|
||||
|
||||
class SinglePrefixCheck:
|
||||
|
||||
def __init__(self, prefix=None, border_router_16=None):
|
||||
self._prefix = prefix
|
||||
self._border_router_16 = border_router_16
|
||||
|
||||
def check(self, prefix_tlv):
|
||||
border_router_tlv = assert_contains_tlv(
|
||||
prefix_tlv.sub_tlvs, CheckType.CONTAIN, network_data.BorderRouter
|
||||
)
|
||||
assert_contains_tlv(
|
||||
prefix_tlv.sub_tlvs, CheckType.CONTAIN, network_data.LowpanId
|
||||
)
|
||||
border_router_tlv = assert_contains_tlv(prefix_tlv.sub_tlvs,
|
||||
CheckType.CONTAIN,
|
||||
network_data.BorderRouter)
|
||||
assert_contains_tlv(prefix_tlv.sub_tlvs, CheckType.CONTAIN,
|
||||
network_data.LowpanId)
|
||||
result = True
|
||||
if self._prefix is not None:
|
||||
result &= self._prefix == binascii.hexlify(prefix_tlv.prefix)
|
||||
if self._border_router_16 is not None:
|
||||
result &= (
|
||||
self._border_router_16 == border_router_tlv.border_router_16
|
||||
)
|
||||
self._border_router_16 == border_router_tlv.border_router_16)
|
||||
return result
|
||||
|
||||
|
||||
class PrefixesCheck:
|
||||
|
||||
def __init__(self, prefix_cnt=0, prefix_check_list=[]):
|
||||
self._prefix_cnt = prefix_cnt
|
||||
self._prefix_check_list = prefix_check_list
|
||||
@@ -792,9 +733,8 @@ class PrefixesCheck:
|
||||
def check(self, prefix_tlvs):
|
||||
# if prefix_cnt is given, then check count only
|
||||
if self._prefix_cnt > 0:
|
||||
assert (
|
||||
len(prefix_tlvs) >= self._prefix_cnt
|
||||
), 'prefix count is less than expected'
|
||||
assert (len(prefix_tlvs) >=
|
||||
self._prefix_cnt), 'prefix count is less than expected'
|
||||
else:
|
||||
for prefix_check in self._prefix_check_list:
|
||||
found = False
|
||||
@@ -806,21 +746,22 @@ class PrefixesCheck:
|
||||
|
||||
|
||||
class CommissioningDataCheck:
|
||||
|
||||
def __init__(self, stable=None, sub_tlv_type_list=[]):
|
||||
self._stable = stable
|
||||
self._sub_tlv_type_list = sub_tlv_type_list
|
||||
|
||||
def check(self, commissioning_data_tlv):
|
||||
if self._stable is not None:
|
||||
assert (
|
||||
self._stable == commissioning_data_tlv.stable
|
||||
), 'Commissioning Data stable flag is not correct'
|
||||
assert contains_tlvs(
|
||||
commissioning_data_tlv.sub_tlvs, self._sub_tlv_type_list
|
||||
), 'Some sub tlvs are missing in Commissioning Data'
|
||||
assert (self._stable == commissioning_data_tlv.stable
|
||||
), 'Commissioning Data stable flag is not correct'
|
||||
assert contains_tlvs(commissioning_data_tlv.sub_tlvs,
|
||||
self._sub_tlv_type_list
|
||||
), 'Some sub tlvs are missing in Commissioning Data'
|
||||
|
||||
|
||||
class NetworkDataCheck:
|
||||
|
||||
def __init__(self, prefixes_check=None, commissioning_data_check=None):
|
||||
self._prefixes_check = prefixes_check
|
||||
self._commissioning_data_check = commissioning_data_check
|
||||
@@ -828,8 +769,7 @@ class NetworkDataCheck:
|
||||
def check(self, network_data_tlv):
|
||||
if self._prefixes_check is not None:
|
||||
prefix_tlvs = [
|
||||
tlv
|
||||
for tlv in network_data_tlv.tlvs
|
||||
tlv for tlv in network_data_tlv.tlvs
|
||||
if isinstance(tlv, network_data.Prefix)
|
||||
]
|
||||
self._prefixes_check.check(prefix_tlvs)
|
||||
|
||||
@@ -37,14 +37,12 @@ import ipaddress
|
||||
|
||||
def expect_the_same_class(self, other):
|
||||
if not isinstance(other, self.__class__):
|
||||
raise TypeError(
|
||||
"Expected the same class. Got {} and {}".format(
|
||||
type(self), type(other)
|
||||
)
|
||||
)
|
||||
raise TypeError("Expected the same class. Got {} and {}".format(
|
||||
type(self), type(other)))
|
||||
|
||||
|
||||
class MessageInfo(object):
|
||||
|
||||
def __init__(self):
|
||||
self.aux_sec_hdr = None
|
||||
self.aux_sec_hdr_bytes = None
|
||||
@@ -109,6 +107,7 @@ class MacAddressType(IntEnum):
|
||||
|
||||
|
||||
class MacAddress(object):
|
||||
|
||||
def __init__(self, mac_address, _type, big_endian=True):
|
||||
if _type == MacAddressType.SHORT:
|
||||
length = 2
|
||||
@@ -135,15 +134,11 @@ class MacAddress(object):
|
||||
|
||||
def convert_to_iid(self):
|
||||
if self._type == MacAddressType.SHORT:
|
||||
return (
|
||||
bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00])
|
||||
+ self._mac_address[:2]
|
||||
)
|
||||
return (bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00]) +
|
||||
self._mac_address[:2])
|
||||
elif self._type == MacAddressType.LONG:
|
||||
return (
|
||||
bytearray([self._mac_address[0] ^ 0x02])
|
||||
+ self._mac_address[1:]
|
||||
)
|
||||
return (bytearray([self._mac_address[0] ^ 0x02]) +
|
||||
self._mac_address[1:])
|
||||
else:
|
||||
raise RuntimeError(
|
||||
"Could not convert to IID. Invalid MAC address type: {}".format(
|
||||
@@ -153,8 +148,8 @@ class MacAddress(object):
|
||||
def from_eui64(cls, eui64, big_endian=True):
|
||||
if not isinstance(eui64, bytearray):
|
||||
raise RuntimeError(
|
||||
"Could not create MAC address from EUI64. Invalid data type: {}".format(
|
||||
type(eui64)))
|
||||
"Could not create MAC address from EUI64. Invalid data type: {}"
|
||||
.format(type(eui64)))
|
||||
|
||||
return cls(eui64, MacAddressType.LONG)
|
||||
|
||||
@@ -166,17 +161,15 @@ class MacAddress(object):
|
||||
mac_address = rloc16[:2]
|
||||
else:
|
||||
raise RuntimeError(
|
||||
"Could not create MAC address from RLOC16. Invalid data type: {}".format(
|
||||
type(rloc16)))
|
||||
"Could not create MAC address from RLOC16. Invalid data type: {}"
|
||||
.format(type(rloc16)))
|
||||
|
||||
return cls(mac_address, MacAddressType.SHORT)
|
||||
|
||||
def __eq__(self, other):
|
||||
return (self.type == other.type) and (
|
||||
self.mac_address == other.mac_address
|
||||
)
|
||||
self.mac_address == other.mac_address)
|
||||
|
||||
def __repr__(self):
|
||||
return "MacAddress(mac_address=b'{}', type={})".format(
|
||||
hexlify(self.mac_address), MacAddressType(self._type)
|
||||
)
|
||||
hexlify(self.mac_address), MacAddressType(self._type))
|
||||
|
||||
+275
-178
@@ -56,30 +56,27 @@ REALM_LOCAL_ALL_ROUTERS_ADDRESS = 'ff03::2'
|
||||
LINK_LOCAL_ALL_NODES_ADDRESS = 'ff02::1'
|
||||
LINK_LOCAL_ALL_ROUTERS_ADDRESS = 'ff02::2'
|
||||
|
||||
DEFAULT_MASTER_KEY = bytearray(
|
||||
[
|
||||
0x00,
|
||||
0x11,
|
||||
0x22,
|
||||
0x33,
|
||||
0x44,
|
||||
0x55,
|
||||
0x66,
|
||||
0x77,
|
||||
0x88,
|
||||
0x99,
|
||||
0xaa,
|
||||
0xbb,
|
||||
0xcc,
|
||||
0xdd,
|
||||
0xee,
|
||||
0xff,
|
||||
]
|
||||
)
|
||||
DEFAULT_MASTER_KEY = bytearray([
|
||||
0x00,
|
||||
0x11,
|
||||
0x22,
|
||||
0x33,
|
||||
0x44,
|
||||
0x55,
|
||||
0x66,
|
||||
0x77,
|
||||
0x88,
|
||||
0x99,
|
||||
0xaa,
|
||||
0xbb,
|
||||
0xcc,
|
||||
0xdd,
|
||||
0xee,
|
||||
0xff,
|
||||
])
|
||||
|
||||
ADDRESS_TYPE = Enum(
|
||||
'ADDRESS_TYPE', ('LINK_LOCAL', 'GLOBAL', 'RLOC', 'ALOC', 'ML_EID')
|
||||
)
|
||||
ADDRESS_TYPE = Enum('ADDRESS_TYPE',
|
||||
('LINK_LOCAL', 'GLOBAL', 'RLOC', 'ALOC', 'ML_EID'))
|
||||
RSSI = {
|
||||
'LINK_QULITY_0': -100,
|
||||
'LINK_QULITY_1': -95,
|
||||
@@ -108,19 +105,21 @@ PROTOCOL_VERSION = 2
|
||||
|
||||
def create_default_network_data_prefix_sub_tlvs_factories():
|
||||
return {
|
||||
network_data.TlvType.HAS_ROUTE: network_data.HasRouteFactory(
|
||||
routes_factory=network_data.RoutesFactory(
|
||||
route_factory=network_data.RouteFactory()
|
||||
)
|
||||
),
|
||||
network_data.TlvType.BORDER_ROUTER: network_data.BorderRouterFactory(),
|
||||
network_data.TlvType.LOWPAN_ID: network_data.LowpanIdFactory(),
|
||||
network_data.TlvType.HAS_ROUTE:
|
||||
network_data.HasRouteFactory(
|
||||
routes_factory=network_data.RoutesFactory(
|
||||
route_factory=network_data.RouteFactory())),
|
||||
network_data.TlvType.BORDER_ROUTER:
|
||||
network_data.BorderRouterFactory(),
|
||||
network_data.TlvType.LOWPAN_ID:
|
||||
network_data.LowpanIdFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_network_data_prefix_sub_tlvs_factory():
|
||||
return network_data.PrefixSubTlvsFactory(
|
||||
sub_tlvs_factories=create_default_network_data_prefix_sub_tlvs_factories())
|
||||
sub_tlvs_factories=create_default_network_data_prefix_sub_tlvs_factories(
|
||||
))
|
||||
|
||||
|
||||
def create_default_network_data_service_sub_tlvs_factories():
|
||||
@@ -129,53 +128,62 @@ def create_default_network_data_service_sub_tlvs_factories():
|
||||
|
||||
def create_default_network_data_service_sub_tlvs_factory():
|
||||
return network_data.ServiceSubTlvsFactory(
|
||||
sub_tlvs_factories=create_default_network_data_service_sub_tlvs_factories())
|
||||
sub_tlvs_factories=
|
||||
create_default_network_data_service_sub_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_network_data_commissioning_data_sub_tlvs_factories():
|
||||
return {
|
||||
mesh_cop.TlvType.CHANNEL: mesh_cop.ChannelFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.BORDER_AGENT_LOCATOR: mesh_cop.BorderAgentLocatorFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_SESSION_ID: mesh_cop.CommissionerSessionIdFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
|
||||
mesh_cop.TlvType.CHANNEL:
|
||||
mesh_cop.ChannelFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA:
|
||||
mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.BORDER_AGENT_LOCATOR:
|
||||
mesh_cop.BorderAgentLocatorFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_SESSION_ID:
|
||||
mesh_cop.CommissionerSessionIdFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT:
|
||||
mesh_cop.CommissionerUdpPortFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_network_data_commissioning_data_sub_tlvs_factory():
|
||||
return network_data.CommissioningDataSubTlvsFactory(
|
||||
sub_tlvs_factories=create_default_network_data_commissioning_data_sub_tlvs_factories())
|
||||
sub_tlvs_factories=
|
||||
create_default_network_data_commissioning_data_sub_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_network_data_tlvs_factories():
|
||||
return {
|
||||
network_data.TlvType.PREFIX: network_data.PrefixFactory(
|
||||
sub_tlvs_factory=create_default_network_data_prefix_sub_tlvs_factory()
|
||||
),
|
||||
network_data.TlvType.SERVICE: network_data.ServiceFactory(
|
||||
sub_tlvs_factory=create_default_network_data_service_sub_tlvs_factory()
|
||||
),
|
||||
network_data.TlvType.COMMISSIONING: network_data.CommissioningDataFactory(
|
||||
sub_tlvs_factory=create_default_network_data_commissioning_data_sub_tlvs_factory()
|
||||
),
|
||||
network_data.TlvType.PREFIX:
|
||||
network_data.PrefixFactory(
|
||||
sub_tlvs_factory=
|
||||
create_default_network_data_prefix_sub_tlvs_factory()),
|
||||
network_data.TlvType.SERVICE:
|
||||
network_data.ServiceFactory(
|
||||
sub_tlvs_factory=
|
||||
create_default_network_data_service_sub_tlvs_factory()),
|
||||
network_data.TlvType.COMMISSIONING:
|
||||
network_data.CommissioningDataFactory(
|
||||
sub_tlvs_factory=
|
||||
create_default_network_data_commissioning_data_sub_tlvs_factory(
|
||||
)),
|
||||
}
|
||||
|
||||
|
||||
def create_default_network_data_tlvs_factory():
|
||||
return network_data.NetworkDataTlvsFactory(
|
||||
sub_tlvs_factories=create_default_network_data_tlvs_factories()
|
||||
)
|
||||
sub_tlvs_factories=create_default_network_data_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_mle_tlv_route64_factory():
|
||||
return mle.Route64Factory(
|
||||
link_quality_and_route_data_factory=mle.LinkQualityAndRouteDataFactory())
|
||||
return mle.Route64Factory(link_quality_and_route_data_factory=mle.
|
||||
LinkQualityAndRouteDataFactory())
|
||||
|
||||
|
||||
def create_default_mle_tlv_network_data_factory():
|
||||
return mle.NetworkDataFactory(
|
||||
network_data_tlvs_factory=create_default_network_data_tlvs_factory()
|
||||
)
|
||||
network_data_tlvs_factory=create_default_network_data_tlvs_factory())
|
||||
|
||||
|
||||
def create_default_mle_tlv_address_registration_factory():
|
||||
@@ -187,148 +195,226 @@ def create_default_mle_tlv_address_registration_factory():
|
||||
|
||||
def create_default_mle_tlv_thread_discovery_factory():
|
||||
return mle.ThreadDiscoveryFactory(
|
||||
thread_discovery_tlvs_factory=create_default_thread_discovery_tlvs_factory())
|
||||
thread_discovery_tlvs_factory=
|
||||
create_default_thread_discovery_tlvs_factory())
|
||||
|
||||
|
||||
def create_default_thread_discovery_tlvs_factory():
|
||||
return mesh_cop.ThreadDiscoveryTlvsFactory(
|
||||
sub_tlvs_factories=create_default_thread_discovery_sub_tlvs_factories()
|
||||
)
|
||||
sub_tlvs_factories=create_default_thread_discovery_sub_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_thread_discovery_sub_tlvs_factories():
|
||||
return {
|
||||
mesh_cop.TlvType.DISCOVERY_REQUEST: mesh_cop.DiscoveryRequestFactory(),
|
||||
mesh_cop.TlvType.DISCOVERY_RESPONSE: mesh_cop.DiscoveryResponseFactory(),
|
||||
mesh_cop.TlvType.EXTENDED_PANID: mesh_cop.ExtendedPanidFactory(),
|
||||
mesh_cop.TlvType.NETWORK_NAME: mesh_cop.NetworkNameFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.JOINER_UDP_PORT: mesh_cop.JoinerUdpPortFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
|
||||
mesh_cop.TlvType.DISCOVERY_REQUEST:
|
||||
mesh_cop.DiscoveryRequestFactory(),
|
||||
mesh_cop.TlvType.DISCOVERY_RESPONSE:
|
||||
mesh_cop.DiscoveryResponseFactory(),
|
||||
mesh_cop.TlvType.EXTENDED_PANID:
|
||||
mesh_cop.ExtendedPanidFactory(),
|
||||
mesh_cop.TlvType.NETWORK_NAME:
|
||||
mesh_cop.NetworkNameFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA:
|
||||
mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.JOINER_UDP_PORT:
|
||||
mesh_cop.JoinerUdpPortFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT:
|
||||
mesh_cop.CommissionerUdpPortFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_mle_tlvs_factories():
|
||||
return {
|
||||
mle.TlvType.SOURCE_ADDRESS: mle.SourceAddressFactory(),
|
||||
mle.TlvType.MODE: mle.ModeFactory(),
|
||||
mle.TlvType.TIMEOUT: mle.TimeoutFactory(),
|
||||
mle.TlvType.CHALLENGE: mle.ChallengeFactory(),
|
||||
mle.TlvType.RESPONSE: mle.ResponseFactory(),
|
||||
mle.TlvType.LINK_LAYER_FRAME_COUNTER: mle.LinkLayerFrameCounterFactory(),
|
||||
mle.TlvType.MLE_FRAME_COUNTER: mle.MleFrameCounterFactory(),
|
||||
mle.TlvType.ROUTE64: create_default_mle_tlv_route64_factory(),
|
||||
mle.TlvType.ADDRESS16: mle.Address16Factory(),
|
||||
mle.TlvType.LEADER_DATA: mle.LeaderDataFactory(),
|
||||
mle.TlvType.NETWORK_DATA: create_default_mle_tlv_network_data_factory(),
|
||||
mle.TlvType.TLV_REQUEST: mle.TlvRequestFactory(),
|
||||
mle.TlvType.SCAN_MASK: mle.ScanMaskFactory(),
|
||||
mle.TlvType.CONNECTIVITY: mle.ConnectivityFactory(),
|
||||
mle.TlvType.LINK_MARGIN: mle.LinkMarginFactory(),
|
||||
mle.TlvType.STATUS: mle.StatusFactory(),
|
||||
mle.TlvType.VERSION: mle.VersionFactory(),
|
||||
mle.TlvType.ADDRESS_REGISTRATION: create_default_mle_tlv_address_registration_factory(),
|
||||
mle.TlvType.CHANNEL: mle.ChannelFactory(),
|
||||
mle.TlvType.PANID: mle.PanIdFactory(),
|
||||
mle.TlvType.ACTIVE_TIMESTAMP: mle.ActiveTimestampFactory(),
|
||||
mle.TlvType.PENDING_TIMESTAMP: mle.PendingTimestampFactory(),
|
||||
mle.TlvType.ACTIVE_OPERATIONAL_DATASET: mle.ActiveOperationalDatasetFactory(),
|
||||
mle.TlvType.PENDING_OPERATIONAL_DATASET: mle.PendingOperationalDatasetFactory(),
|
||||
mle.TlvType.TIME_REQUEST: mle.TimeRequestFactory(),
|
||||
mle.TlvType.TIME_PARAMETER: mle.TimeParameterFactory(),
|
||||
mle.TlvType.THREAD_DISCOVERY: create_default_mle_tlv_thread_discovery_factory(),
|
||||
mle.TlvType.SOURCE_ADDRESS:
|
||||
mle.SourceAddressFactory(),
|
||||
mle.TlvType.MODE:
|
||||
mle.ModeFactory(),
|
||||
mle.TlvType.TIMEOUT:
|
||||
mle.TimeoutFactory(),
|
||||
mle.TlvType.CHALLENGE:
|
||||
mle.ChallengeFactory(),
|
||||
mle.TlvType.RESPONSE:
|
||||
mle.ResponseFactory(),
|
||||
mle.TlvType.LINK_LAYER_FRAME_COUNTER:
|
||||
mle.LinkLayerFrameCounterFactory(),
|
||||
mle.TlvType.MLE_FRAME_COUNTER:
|
||||
mle.MleFrameCounterFactory(),
|
||||
mle.TlvType.ROUTE64:
|
||||
create_default_mle_tlv_route64_factory(),
|
||||
mle.TlvType.ADDRESS16:
|
||||
mle.Address16Factory(),
|
||||
mle.TlvType.LEADER_DATA:
|
||||
mle.LeaderDataFactory(),
|
||||
mle.TlvType.NETWORK_DATA:
|
||||
create_default_mle_tlv_network_data_factory(),
|
||||
mle.TlvType.TLV_REQUEST:
|
||||
mle.TlvRequestFactory(),
|
||||
mle.TlvType.SCAN_MASK:
|
||||
mle.ScanMaskFactory(),
|
||||
mle.TlvType.CONNECTIVITY:
|
||||
mle.ConnectivityFactory(),
|
||||
mle.TlvType.LINK_MARGIN:
|
||||
mle.LinkMarginFactory(),
|
||||
mle.TlvType.STATUS:
|
||||
mle.StatusFactory(),
|
||||
mle.TlvType.VERSION:
|
||||
mle.VersionFactory(),
|
||||
mle.TlvType.ADDRESS_REGISTRATION:
|
||||
create_default_mle_tlv_address_registration_factory(),
|
||||
mle.TlvType.CHANNEL:
|
||||
mle.ChannelFactory(),
|
||||
mle.TlvType.PANID:
|
||||
mle.PanIdFactory(),
|
||||
mle.TlvType.ACTIVE_TIMESTAMP:
|
||||
mle.ActiveTimestampFactory(),
|
||||
mle.TlvType.PENDING_TIMESTAMP:
|
||||
mle.PendingTimestampFactory(),
|
||||
mle.TlvType.ACTIVE_OPERATIONAL_DATASET:
|
||||
mle.ActiveOperationalDatasetFactory(),
|
||||
mle.TlvType.PENDING_OPERATIONAL_DATASET:
|
||||
mle.PendingOperationalDatasetFactory(),
|
||||
mle.TlvType.TIME_REQUEST:
|
||||
mle.TimeRequestFactory(),
|
||||
mle.TlvType.TIME_PARAMETER:
|
||||
mle.TimeParameterFactory(),
|
||||
mle.TlvType.THREAD_DISCOVERY:
|
||||
create_default_mle_tlv_thread_discovery_factory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_mle_crypto_engine(master_key):
|
||||
return net_crypto.CryptoEngine(
|
||||
crypto_material_creator=net_crypto.MleCryptoMaterialCreator(master_key)
|
||||
)
|
||||
crypto_material_creator=net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
|
||||
|
||||
def create_default_mle_message_factory(master_key):
|
||||
return mle.MleMessageFactory(
|
||||
aux_sec_hdr_factory=net_crypto.AuxiliarySecurityHeaderFactory(),
|
||||
mle_command_factory=mle.MleCommandFactory(
|
||||
tlvs_factories=create_default_mle_tlvs_factories()
|
||||
),
|
||||
tlvs_factories=create_default_mle_tlvs_factories()),
|
||||
crypto_engine=create_default_mle_crypto_engine(master_key),
|
||||
)
|
||||
|
||||
|
||||
def create_deafult_network_tlvs_factories():
|
||||
return {
|
||||
network_layer.TlvType.TARGET_EID: network_layer.TargetEidFactory(),
|
||||
network_layer.TlvType.MAC_EXTENDED_ADDRESS: network_layer.MacExtendedAddressFactory(),
|
||||
network_layer.TlvType.RLOC16: network_layer.Rloc16Factory(),
|
||||
network_layer.TlvType.ML_EID: network_layer.MlEidFactory(),
|
||||
network_layer.TlvType.STATUS: network_layer.StatusFactory(),
|
||||
network_layer.TlvType.TIME_SINCE_LAST_TRANSACTION: network_layer.TimeSinceLastTransactionFactory(),
|
||||
network_layer.TlvType.ROUTER_MASK: network_layer.RouterMaskFactory(),
|
||||
network_layer.TlvType.ND_OPTION: network_layer.NdOptionFactory(),
|
||||
network_layer.TlvType.ND_DATA: network_layer.NdDataFactory(),
|
||||
network_layer.TlvType.THREAD_NETWORK_DATA: network_layer.ThreadNetworkDataFactory(
|
||||
create_default_network_data_tlvs_factory()
|
||||
),
|
||||
network_layer.TlvType.XTAL_ACCURACY: network_layer.XtalAccuracyFactory(),
|
||||
network_layer.TlvType.TARGET_EID:
|
||||
network_layer.TargetEidFactory(),
|
||||
network_layer.TlvType.MAC_EXTENDED_ADDRESS:
|
||||
network_layer.MacExtendedAddressFactory(),
|
||||
network_layer.TlvType.RLOC16:
|
||||
network_layer.Rloc16Factory(),
|
||||
network_layer.TlvType.ML_EID:
|
||||
network_layer.MlEidFactory(),
|
||||
network_layer.TlvType.STATUS:
|
||||
network_layer.StatusFactory(),
|
||||
network_layer.TlvType.TIME_SINCE_LAST_TRANSACTION:
|
||||
network_layer.TimeSinceLastTransactionFactory(),
|
||||
network_layer.TlvType.ROUTER_MASK:
|
||||
network_layer.RouterMaskFactory(),
|
||||
network_layer.TlvType.ND_OPTION:
|
||||
network_layer.NdOptionFactory(),
|
||||
network_layer.TlvType.ND_DATA:
|
||||
network_layer.NdDataFactory(),
|
||||
network_layer.TlvType.THREAD_NETWORK_DATA:
|
||||
network_layer.ThreadNetworkDataFactory(
|
||||
create_default_network_data_tlvs_factory()),
|
||||
network_layer.TlvType.XTAL_ACCURACY:
|
||||
network_layer.XtalAccuracyFactory(),
|
||||
# Routing information are distributed in a Thread network by MLE Routing TLV
|
||||
# which is in fact MLE Route64 TLV. Thread specificaton v1.1. - Chapter 5.20
|
||||
network_layer.TlvType.MLE_ROUTING: create_default_mle_tlv_route64_factory(),
|
||||
network_layer.TlvType.MLE_ROUTING:
|
||||
create_default_mle_tlv_route64_factory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_network_tlvs_factory():
|
||||
return SubTlvsFactory(
|
||||
sub_tlvs_factories=create_deafult_network_tlvs_factories()
|
||||
)
|
||||
sub_tlvs_factories=create_deafult_network_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_mesh_cop_tlvs_factories():
|
||||
return {
|
||||
mesh_cop.TlvType.CHANNEL: mesh_cop.ChannelFactory(),
|
||||
mesh_cop.TlvType.PAN_ID: mesh_cop.PanidFactory(),
|
||||
mesh_cop.TlvType.EXTENDED_PANID: mesh_cop.ExtendedPanidFactory(),
|
||||
mesh_cop.TlvType.NETWORK_NAME: mesh_cop.NetworkNameFactory(),
|
||||
mesh_cop.TlvType.PSKC: mesh_cop.PSKcFactory(),
|
||||
mesh_cop.TlvType.NETWORK_MASTER_KEY: mesh_cop.NetworkMasterKeyFactory(),
|
||||
mesh_cop.TlvType.NETWORK_KEY_SEQUENCE_COUNTER: mesh_cop.NetworkKeySequenceCounterFactory(),
|
||||
mesh_cop.TlvType.NETWORK_MESH_LOCAL_PREFIX: mesh_cop.NetworkMeshLocalPrefixFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.BORDER_AGENT_LOCATOR: mesh_cop.BorderAgentLocatorFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_ID: mesh_cop.CommissionerIdFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_SESSION_ID: mesh_cop.CommissionerSessionIdFactory(),
|
||||
mesh_cop.TlvType.SECURITY_POLICY: mesh_cop.SecurityPolicyFactory(),
|
||||
mesh_cop.TlvType.GET: mesh_cop.GetFactory(),
|
||||
mesh_cop.TlvType.ACTIVE_TIMESTAMP: mesh_cop.ActiveTimestampFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
|
||||
mesh_cop.TlvType.STATE: mesh_cop.StateFactory(),
|
||||
mesh_cop.TlvType.JOINER_DTLS_ENCAPSULATION: mesh_cop.JoinerDtlsEncapsulationFactory(),
|
||||
mesh_cop.TlvType.JOINER_UDP_PORT: mesh_cop.JoinerUdpPortFactory(),
|
||||
mesh_cop.TlvType.JOINER_IID: mesh_cop.JoinerIIDFactory(),
|
||||
mesh_cop.TlvType.JOINER_ROUTER_LOCATOR: mesh_cop.JoinerRouterLocatorFactory(),
|
||||
mesh_cop.TlvType.JOINER_ROUTER_KEK: mesh_cop.JoinerRouterKEKFactory(),
|
||||
mesh_cop.TlvType.PROVISIONING_URL: mesh_cop.ProvisioningUrlFactory(),
|
||||
mesh_cop.TlvType.VENDOR_NAME: mesh_cop.VendorNameFactory(),
|
||||
mesh_cop.TlvType.VENDOR_MODEL: mesh_cop.VendorModelFactory(),
|
||||
mesh_cop.TlvType.VENDOR_SW_VERSION: mesh_cop.VendorSWVersionFactory(),
|
||||
mesh_cop.TlvType.VENDOR_DATA: mesh_cop.VendorDataFactory(),
|
||||
mesh_cop.TlvType.VENDOR_STACK_VERSION: mesh_cop.VendorStackVersionFactory(),
|
||||
mesh_cop.TlvType.UDP_ENCAPSULATION: mesh_cop.UdpEncapsulationFactory(),
|
||||
mesh_cop.TlvType.IPV6_ADDRESS: mesh_cop.Ipv6AddressFactory(),
|
||||
mesh_cop.TlvType.PENDING_TIMESTAMP: mesh_cop.PendingTimestampFactory(),
|
||||
mesh_cop.TlvType.DELAY_TIMER: mesh_cop.DelayTimerFactory(),
|
||||
mesh_cop.TlvType.CHANNEL_MASK: mesh_cop.ChannelMaskFactory(),
|
||||
mesh_cop.TlvType.COUNT: mesh_cop.CountFactory(),
|
||||
mesh_cop.TlvType.PERIOD: mesh_cop.PeriodFactory(),
|
||||
mesh_cop.TlvType.SCAN_DURATION: mesh_cop.ScanDurationFactory(),
|
||||
mesh_cop.TlvType.ENERGY_LIST: mesh_cop.EnergyListFactory(),
|
||||
mesh_cop.TlvType.CHANNEL:
|
||||
mesh_cop.ChannelFactory(),
|
||||
mesh_cop.TlvType.PAN_ID:
|
||||
mesh_cop.PanidFactory(),
|
||||
mesh_cop.TlvType.EXTENDED_PANID:
|
||||
mesh_cop.ExtendedPanidFactory(),
|
||||
mesh_cop.TlvType.NETWORK_NAME:
|
||||
mesh_cop.NetworkNameFactory(),
|
||||
mesh_cop.TlvType.PSKC:
|
||||
mesh_cop.PSKcFactory(),
|
||||
mesh_cop.TlvType.NETWORK_MASTER_KEY:
|
||||
mesh_cop.NetworkMasterKeyFactory(),
|
||||
mesh_cop.TlvType.NETWORK_KEY_SEQUENCE_COUNTER:
|
||||
mesh_cop.NetworkKeySequenceCounterFactory(),
|
||||
mesh_cop.TlvType.NETWORK_MESH_LOCAL_PREFIX:
|
||||
mesh_cop.NetworkMeshLocalPrefixFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA:
|
||||
mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.BORDER_AGENT_LOCATOR:
|
||||
mesh_cop.BorderAgentLocatorFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_ID:
|
||||
mesh_cop.CommissionerIdFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_SESSION_ID:
|
||||
mesh_cop.CommissionerSessionIdFactory(),
|
||||
mesh_cop.TlvType.SECURITY_POLICY:
|
||||
mesh_cop.SecurityPolicyFactory(),
|
||||
mesh_cop.TlvType.GET:
|
||||
mesh_cop.GetFactory(),
|
||||
mesh_cop.TlvType.ACTIVE_TIMESTAMP:
|
||||
mesh_cop.ActiveTimestampFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT:
|
||||
mesh_cop.CommissionerUdpPortFactory(),
|
||||
mesh_cop.TlvType.STATE:
|
||||
mesh_cop.StateFactory(),
|
||||
mesh_cop.TlvType.JOINER_DTLS_ENCAPSULATION:
|
||||
mesh_cop.JoinerDtlsEncapsulationFactory(),
|
||||
mesh_cop.TlvType.JOINER_UDP_PORT:
|
||||
mesh_cop.JoinerUdpPortFactory(),
|
||||
mesh_cop.TlvType.JOINER_IID:
|
||||
mesh_cop.JoinerIIDFactory(),
|
||||
mesh_cop.TlvType.JOINER_ROUTER_LOCATOR:
|
||||
mesh_cop.JoinerRouterLocatorFactory(),
|
||||
mesh_cop.TlvType.JOINER_ROUTER_KEK:
|
||||
mesh_cop.JoinerRouterKEKFactory(),
|
||||
mesh_cop.TlvType.PROVISIONING_URL:
|
||||
mesh_cop.ProvisioningUrlFactory(),
|
||||
mesh_cop.TlvType.VENDOR_NAME:
|
||||
mesh_cop.VendorNameFactory(),
|
||||
mesh_cop.TlvType.VENDOR_MODEL:
|
||||
mesh_cop.VendorModelFactory(),
|
||||
mesh_cop.TlvType.VENDOR_SW_VERSION:
|
||||
mesh_cop.VendorSWVersionFactory(),
|
||||
mesh_cop.TlvType.VENDOR_DATA:
|
||||
mesh_cop.VendorDataFactory(),
|
||||
mesh_cop.TlvType.VENDOR_STACK_VERSION:
|
||||
mesh_cop.VendorStackVersionFactory(),
|
||||
mesh_cop.TlvType.UDP_ENCAPSULATION:
|
||||
mesh_cop.UdpEncapsulationFactory(),
|
||||
mesh_cop.TlvType.IPV6_ADDRESS:
|
||||
mesh_cop.Ipv6AddressFactory(),
|
||||
mesh_cop.TlvType.PENDING_TIMESTAMP:
|
||||
mesh_cop.PendingTimestampFactory(),
|
||||
mesh_cop.TlvType.DELAY_TIMER:
|
||||
mesh_cop.DelayTimerFactory(),
|
||||
mesh_cop.TlvType.CHANNEL_MASK:
|
||||
mesh_cop.ChannelMaskFactory(),
|
||||
mesh_cop.TlvType.COUNT:
|
||||
mesh_cop.CountFactory(),
|
||||
mesh_cop.TlvType.PERIOD:
|
||||
mesh_cop.PeriodFactory(),
|
||||
mesh_cop.TlvType.SCAN_DURATION:
|
||||
mesh_cop.ScanDurationFactory(),
|
||||
mesh_cop.TlvType.ENERGY_LIST:
|
||||
mesh_cop.EnergyListFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_mesh_cop_tlvs_factory():
|
||||
return SubTlvsFactory(
|
||||
sub_tlvs_factories=create_default_mesh_cop_tlvs_factories()
|
||||
)
|
||||
sub_tlvs_factories=create_default_mesh_cop_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_uri_path_based_payload_factories():
|
||||
@@ -349,7 +435,8 @@ def create_default_uri_path_based_payload_factories():
|
||||
def create_default_coap_message_factory():
|
||||
return coap.CoapMessageFactory(
|
||||
options_factory=coap.CoapOptionsFactory(),
|
||||
uri_path_based_payload_factories=create_default_uri_path_based_payload_factories(),
|
||||
uri_path_based_payload_factories=
|
||||
create_default_uri_path_based_payload_factories(),
|
||||
message_id_to_uri_path_binder=coap.CoapMessageIdToUriPathBinder(),
|
||||
)
|
||||
|
||||
@@ -360,8 +447,7 @@ def create_default_ipv6_hop_by_hop_options_factories():
|
||||
|
||||
def create_default_ipv6_hop_by_hop_options_factory():
|
||||
return ipv6.HopByHopOptionsFactory(
|
||||
options_factories=create_default_ipv6_hop_by_hop_options_factories()
|
||||
)
|
||||
options_factories=create_default_ipv6_hop_by_hop_options_factories())
|
||||
|
||||
|
||||
def create_default_based_on_src_dst_ports_udp_payload_factory(master_key):
|
||||
@@ -375,8 +461,7 @@ def create_default_based_on_src_dst_ports_udp_payload_factory(master_key):
|
||||
61631: coap_message_factory,
|
||||
1000: dtls_message_factory,
|
||||
5684: dtls_message_factory,
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
def create_default_dtls_message_factory():
|
||||
@@ -385,35 +470,48 @@ def create_default_dtls_message_factory():
|
||||
|
||||
def create_default_ipv6_icmp_body_factories():
|
||||
return {
|
||||
ipv6.ICMP_DESTINATION_UNREACHABLE: ipv6.ICMPv6DestinationUnreachableFactory(),
|
||||
ipv6.ICMP_ECHO_REQUEST: ipv6.ICMPv6EchoBodyFactory(),
|
||||
ipv6.ICMP_ECHO_RESPONSE: ipv6.ICMPv6EchoBodyFactory(),
|
||||
"default": ipv6.BytesPayloadFactory(),
|
||||
ipv6.ICMP_DESTINATION_UNREACHABLE:
|
||||
ipv6.ICMPv6DestinationUnreachableFactory(),
|
||||
ipv6.ICMP_ECHO_REQUEST:
|
||||
ipv6.ICMPv6EchoBodyFactory(),
|
||||
ipv6.ICMP_ECHO_RESPONSE:
|
||||
ipv6.ICMPv6EchoBodyFactory(),
|
||||
"default":
|
||||
ipv6.BytesPayloadFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_ipv6_upper_layer_factories(master_key):
|
||||
return {
|
||||
ipv6.IPV6_NEXT_HEADER_UDP: ipv6.UDPDatagramFactory(
|
||||
udp_header_factory=ipv6.UDPHeaderFactory(),
|
||||
udp_payload_factory=create_default_based_on_src_dst_ports_udp_payload_factory(
|
||||
master_key
|
||||
ipv6.IPV6_NEXT_HEADER_UDP:
|
||||
ipv6.UDPDatagramFactory(
|
||||
udp_header_factory=ipv6.UDPHeaderFactory(),
|
||||
udp_payload_factory=
|
||||
create_default_based_on_src_dst_ports_udp_payload_factory(
|
||||
master_key),
|
||||
),
|
||||
),
|
||||
ipv6.IPV6_NEXT_HEADER_ICMP: ipv6.ICMPv6Factory(
|
||||
body_factories=create_default_ipv6_icmp_body_factories()
|
||||
),
|
||||
ipv6.IPV6_NEXT_HEADER_ICMP:
|
||||
ipv6.ICMPv6Factory(
|
||||
body_factories=create_default_ipv6_icmp_body_factories()),
|
||||
}
|
||||
|
||||
|
||||
def create_default_lowpan_extension_headers_factories():
|
||||
return {ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP: lowpan.LowpanHopByHopFactory(
|
||||
hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())}
|
||||
return {
|
||||
ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP:
|
||||
lowpan.LowpanHopByHopFactory(
|
||||
hop_by_hop_options_factory=
|
||||
create_default_ipv6_hop_by_hop_options_factory())
|
||||
}
|
||||
|
||||
|
||||
def create_default_ipv6_extension_headers_factories():
|
||||
return {ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP: ipv6.HopByHopFactory(
|
||||
hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())}
|
||||
return {
|
||||
ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP:
|
||||
ipv6.HopByHopFactory(
|
||||
hop_by_hop_options_factory=
|
||||
create_default_ipv6_hop_by_hop_options_factory())
|
||||
}
|
||||
|
||||
|
||||
def create_default_ipv6_packet_factory(master_key):
|
||||
@@ -426,11 +524,10 @@ def create_default_ipv6_packet_factory(master_key):
|
||||
def create_default_lowpan_decompressor(context_manager):
|
||||
return lowpan.LowpanDecompressor(
|
||||
lowpan_ip_header_factory=lowpan.LowpanIpv6HeaderFactory(
|
||||
context_manager=context_manager
|
||||
),
|
||||
context_manager=context_manager),
|
||||
lowpan_extension_headers_factory=lowpan.LowpanExtensionHeadersFactory(
|
||||
ext_headers_factories=create_default_lowpan_extension_headers_factories()
|
||||
),
|
||||
ext_headers_factories=
|
||||
create_default_lowpan_extension_headers_factories()),
|
||||
lowpan_udp_header_factory=lowpan.LowpanUdpHeaderFactory(),
|
||||
)
|
||||
|
||||
@@ -442,13 +539,13 @@ def create_default_thread_context_manager():
|
||||
return context_manager
|
||||
|
||||
|
||||
def create_default_lowpan_parser(
|
||||
context_manager, master_key=DEFAULT_MASTER_KEY
|
||||
):
|
||||
def create_default_lowpan_parser(context_manager,
|
||||
master_key=DEFAULT_MASTER_KEY):
|
||||
return lowpan.LowpanParser(
|
||||
lowpan_mesh_header_factory=lowpan.LowpanMeshHeaderFactory(),
|
||||
lowpan_decompressor=create_default_lowpan_decompressor(context_manager),
|
||||
lowpan_fragements_buffers_manager=lowpan.LowpanFragmentsBuffersManager(),
|
||||
lowpan_fragements_buffers_manager=lowpan.LowpanFragmentsBuffersManager(
|
||||
),
|
||||
ipv6_packet_factory=create_default_ipv6_packet_factory(master_key),
|
||||
)
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
|
||||
from builtins import input
|
||||
|
||||
|
||||
|
||||
@@ -91,9 +91,9 @@ class AlertDescription(IntEnum):
|
||||
|
||||
|
||||
class Record(ConvertibleToBytes, BuildableFromBytes):
|
||||
def __init__(
|
||||
self, content_type, version, epoch, sequence_number, length, fragment
|
||||
):
|
||||
|
||||
def __init__(self, content_type, version, epoch, sequence_number, length,
|
||||
fragment):
|
||||
self.content_type = content_type
|
||||
self.version = version
|
||||
self.epoch = epoch
|
||||
@@ -102,14 +102,10 @@ class Record(ConvertibleToBytes, BuildableFromBytes):
|
||||
self.fragment = fragment
|
||||
|
||||
def to_bytes(self):
|
||||
return (
|
||||
struct.pack(">B", self.content_type)
|
||||
+ self.version.to_bytes()
|
||||
+ struct.pack(">H", self.epoch)
|
||||
+ self.sequence_number.to_bytes(6, byteorder='big')
|
||||
+ struct.pack(">H", self.length)
|
||||
+ self.fragment
|
||||
)
|
||||
return (struct.pack(">B", self.content_type) + self.version.to_bytes() +
|
||||
struct.pack(">H", self.epoch) +
|
||||
self.sequence_number.to_bytes(6, byteorder='big') +
|
||||
struct.pack(">H", self.length) + self.fragment)
|
||||
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
@@ -119,16 +115,21 @@ class Record(ConvertibleToBytes, BuildableFromBytes):
|
||||
sequence_number = struct.unpack(">Q", b'\x00\x00' + data.read(6))[0]
|
||||
length = struct.unpack(">H", data.read(2))[0]
|
||||
fragment = bytes(data.read(length))
|
||||
return cls(
|
||||
content_type, version, epoch, sequence_number, length, fragment
|
||||
)
|
||||
return cls(content_type, version, epoch, sequence_number, length,
|
||||
fragment)
|
||||
|
||||
def __repr__(self):
|
||||
return "Record(content_type={}, version={}, epoch={}, sequence_number={}, length={})".format(
|
||||
str(self.content_type), self.version, self.epoch, self.sequence_number, self.length, )
|
||||
str(self.content_type),
|
||||
self.version,
|
||||
self.epoch,
|
||||
self.sequence_number,
|
||||
self.length,
|
||||
)
|
||||
|
||||
|
||||
class Message(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
def __init__(self, content_type):
|
||||
self.content_type = content_type
|
||||
|
||||
@@ -141,6 +142,7 @@ class Message(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
|
||||
class HandshakeMessage(Message):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
handshake_type,
|
||||
@@ -159,14 +161,12 @@ class HandshakeMessage(Message):
|
||||
self.body = body
|
||||
|
||||
def to_bytes(self):
|
||||
return (
|
||||
struct.pack(">B", self.handshake_type)
|
||||
+ struct.pack(">I", self.length)[1:]
|
||||
+ struct.pack(">H", self.message_seq)
|
||||
+ struct.pack(">I", self.fragment_offset)[1:]
|
||||
+ struct.pack(">I", self.fragment_length)[1:]
|
||||
+ self.body.to_bytes()
|
||||
)
|
||||
return (struct.pack(">B", self.handshake_type) +
|
||||
struct.pack(">I", self.length)[1:] +
|
||||
struct.pack(">H", self.message_seq) +
|
||||
struct.pack(">I", self.fragment_offset)[1:] +
|
||||
struct.pack(">I", self.fragment_length)[1:] +
|
||||
self.body.to_bytes())
|
||||
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
@@ -196,22 +196,19 @@ class HandshakeMessage(Message):
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return "Handshake(type={}, length={})".format(
|
||||
str(self.handshake_type), self.length
|
||||
)
|
||||
return "Handshake(type={}, length={})".format(str(self.handshake_type),
|
||||
self.length)
|
||||
|
||||
|
||||
class ProtocolVersion(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
def __init__(self, major, minor):
|
||||
self.major = major
|
||||
self.minor = minor
|
||||
|
||||
def __eq__(self, other):
|
||||
return (
|
||||
isinstance(self, type(other))
|
||||
and self.major == other.major
|
||||
and self.minor == other.minor
|
||||
)
|
||||
return (isinstance(self, type(other)) and self.major == other.major and
|
||||
self.minor == other.minor)
|
||||
|
||||
def to_bytes(self):
|
||||
return struct.pack(">BB", self.major, self.minor)
|
||||
@@ -223,8 +220,7 @@ class ProtocolVersion(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
def __repr__(self):
|
||||
return "ProtocolVersion(major={}, minor={})".format(
|
||||
self.major, self.minor
|
||||
)
|
||||
self.major, self.minor)
|
||||
|
||||
|
||||
class Random(ConvertibleToBytes, BuildableFromBytes):
|
||||
@@ -237,11 +233,9 @@ class Random(ConvertibleToBytes, BuildableFromBytes):
|
||||
assert len(self.random_bytes) == Random.random_bytes_length
|
||||
|
||||
def __eq__(self, other):
|
||||
return (
|
||||
isinstance(self, type(other))
|
||||
and self.gmt_unix_time == other.gmt_unix_time
|
||||
and self.random_bytes == other.random_bytes
|
||||
)
|
||||
return (isinstance(self, type(other)) and
|
||||
self.gmt_unix_time == other.gmt_unix_time and
|
||||
self.random_bytes == other.random_bytes)
|
||||
|
||||
def to_bytes(self):
|
||||
return struct.pack(">I", self.gmt_unix_time) + (self.random_bytes)
|
||||
@@ -254,6 +248,7 @@ class Random(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
|
||||
class VariableVector(ConvertibleToBytes):
|
||||
|
||||
def __init__(self, subrange, ele_cls, elements):
|
||||
self.subrange = subrange
|
||||
self.ele_cls = ele_cls
|
||||
@@ -264,12 +259,10 @@ class VariableVector(ConvertibleToBytes):
|
||||
return len(self.elements)
|
||||
|
||||
def __eq__(self, other):
|
||||
return (
|
||||
isinstance(self, type(other))
|
||||
and self.subrange == other.subrange
|
||||
and self.ele_cls == other.ele_cls
|
||||
and self.elements == other.elements
|
||||
)
|
||||
return (isinstance(self, type(other)) and
|
||||
self.subrange == other.subrange and
|
||||
self.ele_cls == other.ele_cls and
|
||||
self.elements == other.elements)
|
||||
|
||||
def to_bytes(self):
|
||||
data = reduce(lambda ele, acc: acc + ele.to_bytes(), self.elements)
|
||||
@@ -308,6 +301,7 @@ class VariableVector(ConvertibleToBytes):
|
||||
|
||||
|
||||
class Opaque(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
def __init__(self, byte):
|
||||
self.byte = byte
|
||||
|
||||
@@ -323,6 +317,7 @@ class Opaque(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
|
||||
class CipherSuite(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
def __init__(self, cipher):
|
||||
self.cipher = cipher
|
||||
|
||||
@@ -361,33 +356,29 @@ class CompressionMethod(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
|
||||
class Extension(ConvertibleToBytes, BuildableFromBytes):
|
||||
|
||||
def __init__(self, extension_type, extension_data):
|
||||
self.extension_type = extension_type
|
||||
self.extension_data = extension_data
|
||||
|
||||
def __eq__(self, other):
|
||||
return (
|
||||
isinstance(self, type(other))
|
||||
and self.extension_type == other.extension_type
|
||||
and self.extension_data == other.extension_data
|
||||
)
|
||||
return (isinstance(self, type(other)) and
|
||||
self.extension_type == other.extension_type and
|
||||
self.extension_data == other.extension_data)
|
||||
|
||||
def to_bytes(self):
|
||||
return (
|
||||
struct.pack(">H", self.extension_type)
|
||||
+ self.extension_data.to_bytes()
|
||||
)
|
||||
return (struct.pack(">H", self.extension_type) +
|
||||
self.extension_data.to_bytes())
|
||||
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
extension_type = struct.unpack(">H", data.read(2))[0]
|
||||
extension_data = VariableVector.from_bytes(
|
||||
Opaque, (0, 2 ** 16 - 1), data
|
||||
)
|
||||
extension_data = VariableVector.from_bytes(Opaque, (0, 2**16 - 1), data)
|
||||
return cls(extension_type, extension_data)
|
||||
|
||||
|
||||
class ClientHello(HandshakeMessage):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
client_version,
|
||||
@@ -407,33 +398,26 @@ class ClientHello(HandshakeMessage):
|
||||
self.extensions = extensions
|
||||
|
||||
def to_bytes(self):
|
||||
return (
|
||||
self.client_version.to_bytes()
|
||||
+ self.random.to_bytes()
|
||||
+ self.session_id.to_bytes()
|
||||
+ self.cookie.to_bytes()
|
||||
+ self.cipher_suites.to_bytes()
|
||||
+ self.compression_methods.to_bytes()
|
||||
+ self.extensions.to_bytes()
|
||||
)
|
||||
return (self.client_version.to_bytes() + self.random.to_bytes() +
|
||||
self.session_id.to_bytes() + self.cookie.to_bytes() +
|
||||
self.cipher_suites.to_bytes() +
|
||||
self.compression_methods.to_bytes() +
|
||||
self.extensions.to_bytes())
|
||||
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
client_version = ProtocolVersion.from_bytes(data)
|
||||
random = Random.from_bytes(data)
|
||||
session_id = VariableVector.from_bytes(Opaque, (0, 32), data)
|
||||
cookie = VariableVector.from_bytes(Opaque, (0, 2 ** 8 - 1), data)
|
||||
cipher_suites = VariableVector.from_bytes(
|
||||
CipherSuite, (2, 2 ** 16 - 1), data
|
||||
)
|
||||
compression_methods = VariableVector.from_bytes(
|
||||
CompressionMethod, (1, 2 ** 8 - 1), data
|
||||
)
|
||||
cookie = VariableVector.from_bytes(Opaque, (0, 2**8 - 1), data)
|
||||
cipher_suites = VariableVector.from_bytes(CipherSuite, (2, 2**16 - 1),
|
||||
data)
|
||||
compression_methods = VariableVector.from_bytes(CompressionMethod,
|
||||
(1, 2**8 - 1), data)
|
||||
extensions = None
|
||||
if data.tell() < len(data.getvalue()):
|
||||
extensions = VariableVector.from_bytes(
|
||||
Extension, (0, 2 ** 16 - 1), data
|
||||
)
|
||||
extensions = VariableVector.from_bytes(Extension, (0, 2**16 - 1),
|
||||
data)
|
||||
return cls(
|
||||
client_version,
|
||||
random,
|
||||
@@ -446,6 +430,7 @@ class ClientHello(HandshakeMessage):
|
||||
|
||||
|
||||
class HelloVerifyRequest(HandshakeMessage):
|
||||
|
||||
def __init__(self, server_version, cookie):
|
||||
self.server_version = server_version
|
||||
self.cookie = cookie
|
||||
@@ -456,11 +441,12 @@ class HelloVerifyRequest(HandshakeMessage):
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
server_version = ProtocolVersion.from_bytes(data)
|
||||
cookie = VariableVector.from_bytes(Opaque, (0, 2 ** 8 - 1), data)
|
||||
cookie = VariableVector.from_bytes(Opaque, (0, 2**8 - 1), data)
|
||||
return cls(server_version, cookie)
|
||||
|
||||
|
||||
class ServerHello(HandshakeMessage):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
server_version,
|
||||
@@ -478,14 +464,9 @@ class ServerHello(HandshakeMessage):
|
||||
self.extensions = extensions
|
||||
|
||||
def to_bytes(self):
|
||||
return (
|
||||
self.server_version.to_bytes()
|
||||
+ self.random.to_bytes()
|
||||
+ self.session_id.to_bytes()
|
||||
+ self.cipher_suite.to_bytes()
|
||||
+ self.compression_method.to_bytes()
|
||||
+ self.extensions.to_bytes()
|
||||
)
|
||||
return (self.server_version.to_bytes() + self.random.to_bytes() +
|
||||
self.session_id.to_bytes() + self.cipher_suite.to_bytes() +
|
||||
self.compression_method.to_bytes() + self.extensions.to_bytes())
|
||||
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
@@ -496,9 +477,8 @@ class ServerHello(HandshakeMessage):
|
||||
compression_method = CompressionMethod.from_bytes(data)
|
||||
extensions = None
|
||||
if data.tell() < len(data.getvalue()):
|
||||
extensions = VariableVector.from_bytes(
|
||||
Extension, (0, 2 ** 16 - 1), data
|
||||
)
|
||||
extensions = VariableVector.from_bytes(Extension, (0, 2**16 - 1),
|
||||
data)
|
||||
return cls(
|
||||
server_version,
|
||||
random,
|
||||
@@ -510,6 +490,7 @@ class ServerHello(HandshakeMessage):
|
||||
|
||||
|
||||
class ServerHelloDone(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@@ -522,41 +503,49 @@ class ServerHelloDone(HandshakeMessage):
|
||||
|
||||
|
||||
class HelloRequest(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class Certificate(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class ServerKeyExchange(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class CertificateRequest(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class CertificateVerify(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class ClientKeyExchange(HandshakeMessage):
|
||||
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class Finished(HandshakeMessage):
|
||||
|
||||
def __init__(self, verify_data):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class AlertMessage(Message):
|
||||
|
||||
def __init__(self, level, description):
|
||||
super(AlertMessage, self).__init__(ContentType.ALERT)
|
||||
self.level = level
|
||||
@@ -576,16 +565,15 @@ class AlertMessage(Message):
|
||||
return cls(None, None)
|
||||
|
||||
def __repr__(self):
|
||||
return "Alert(level={}, description={})".format(
|
||||
str(self.level), str(self.description)
|
||||
)
|
||||
return "Alert(level={}, description={})".format(str(self.level),
|
||||
str(self.description))
|
||||
|
||||
|
||||
class ChangeCipherSpecMessage(Message):
|
||||
|
||||
def __init__(self):
|
||||
super(ChangeCipherSpecMessage, self).__init__(
|
||||
ContentType.CHANGE_CIPHER_SPEC
|
||||
)
|
||||
super(ChangeCipherSpecMessage,
|
||||
self).__init__(ContentType.CHANGE_CIPHER_SPEC)
|
||||
|
||||
def to_bytes(self):
|
||||
return struct.pack(">B", 1)
|
||||
@@ -600,10 +588,10 @@ class ChangeCipherSpecMessage(Message):
|
||||
|
||||
|
||||
class ApplicationDataMessage(Message):
|
||||
|
||||
def __init__(self, raw):
|
||||
super(ApplicationDataMessage, self).__init__(
|
||||
ContentType.APPLICATION_DATA
|
||||
)
|
||||
super(ApplicationDataMessage,
|
||||
self).__init__(ContentType.APPLICATION_DATA)
|
||||
self.raw = raw
|
||||
self.body = None
|
||||
|
||||
@@ -638,7 +626,6 @@ handshake_map = {
|
||||
HandshakeType.FINISHED: None, # Finished
|
||||
}
|
||||
|
||||
|
||||
content_map = {
|
||||
ContentType.CHANGE_CIPHER_SPEC: ChangeCipherSpecMessage,
|
||||
ContentType.ALERT: AlertMessage,
|
||||
@@ -665,11 +652,9 @@ class MessageFactory(object):
|
||||
raise ValueError("DTLS version error, expect DTLSv1.2")
|
||||
|
||||
last_msg_is_change_cipher_spec = type(
|
||||
self
|
||||
).last_msg_is_change_cipher_spec
|
||||
self).last_msg_is_change_cipher_spec
|
||||
type(self).last_msg_is_change_cipher_spec = (
|
||||
record.content_type == ContentType.CHANGE_CIPHER_SPEC
|
||||
)
|
||||
record.content_type == ContentType.CHANGE_CIPHER_SPEC)
|
||||
|
||||
# FINISHED message immediately follows CHANGE_CIPHER_SPEC message
|
||||
# We skip FINISHED message as it is encrypted
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user