mirror of
https://github.com/espressif/openthread.git
synced 2026-07-24 13:04:07 +00:00
[style] change python yapf column_limit to 119 (#5339)
This commit is contained in:
+1
-1
@@ -188,4 +188,4 @@
|
||||
|
||||
## Format and Style
|
||||
|
||||
- All code should adhere to [Google Python Style Guide](http://google.github.io/styleguide/pyguide.html).
|
||||
- All code should adhere to [Google Python Style Guide](http://google.github.io/styleguide/pyguide.html) except maximum line length being 119.
|
||||
|
||||
+2
-2
@@ -114,7 +114,7 @@ do_python_format()
|
||||
echo -e '======================'
|
||||
|
||||
git ls-files "${OT_PYTHON_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
|
||||
| xargs -n10 -P"$OT_BUILD_JOBS" python3 -m yapf --verbose --style google -ipr
|
||||
| xargs -n10 -P"$OT_BUILD_JOBS" python3 -m yapf --verbose --style '{based_on_style: google, column_limit: 119}' -ipr
|
||||
}
|
||||
|
||||
do_python_check()
|
||||
@@ -124,7 +124,7 @@ do_python_check()
|
||||
echo -e '====================='
|
||||
|
||||
git ls-files "${OT_PYTHON_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
|
||||
| xargs -n10 -P"$OT_BUILD_JOBS" python3 -m yapf --verbose --style google -dpr
|
||||
| xargs -n10 -P"$OT_BUILD_JOBS" python3 -m yapf --verbose --style '{based_on_style: google, column_limit: 119}' -dpr
|
||||
}
|
||||
|
||||
do_shell_format()
|
||||
|
||||
@@ -37,8 +37,7 @@ from ipaddress import ip_address
|
||||
|
||||
|
||||
def get_maddrs():
|
||||
lines = subprocess.run(['ot-ctl', 'ipmaddr'],
|
||||
stdout=subprocess.PIPE).stdout.decode().split()
|
||||
lines = subprocess.run(['ot-ctl', 'ipmaddr'], stdout=subprocess.PIPE).stdout.decode().split()
|
||||
return [ip_address(l) for l in lines if l.startswith('ff')]
|
||||
|
||||
|
||||
@@ -48,20 +47,16 @@ def main():
|
||||
|
||||
with socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) as s:
|
||||
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, if_index)
|
||||
s.setsockopt(
|
||||
socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP,
|
||||
struct.pack('16si', socket.inet_pton(socket.AF_INET6, group),
|
||||
if_index))
|
||||
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP,
|
||||
struct.pack('16si', socket.inet_pton(socket.AF_INET6, group), if_index))
|
||||
time.sleep(2)
|
||||
maddrs = get_maddrs()
|
||||
print(maddrs)
|
||||
if not any(addr == ip_address(group) for addr in maddrs):
|
||||
return -1
|
||||
|
||||
s.setsockopt(
|
||||
socket.IPPROTO_IPV6, socket.IPV6_LEAVE_GROUP,
|
||||
struct.pack('16si', socket.inet_pton(socket.AF_INET6, group),
|
||||
if_index))
|
||||
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_LEAVE_GROUP,
|
||||
struct.pack('16si', socket.inet_pton(socket.AF_INET6, group), if_index))
|
||||
|
||||
time.sleep(2)
|
||||
maddrs = get_maddrs()
|
||||
|
||||
@@ -111,8 +111,7 @@ class Cert_5_1_01_RouterAttach(thread_cert.TestCase):
|
||||
msg.assertMleMessageDoesNotContainTlv(mle.AddressRegistration)
|
||||
|
||||
# 5 - Leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -147,8 +146,7 @@ class Cert_5_1_01_RouterAttach(thread_cert.TestCase):
|
||||
self.assertIn(mle.TlvType.LINK_MARGIN, tlv_request.tlvs)
|
||||
|
||||
# 9 - Leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
|
||||
@@ -109,8 +109,7 @@ class Cert_5_1_03_RouterAddressReallocation(thread_cert.TestCase):
|
||||
router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# Leader or Router1 can be parent of Router2
|
||||
if leader_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
if leader_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -118,8 +117,7 @@ class Cert_5_1_03_RouterAddressReallocation(thread_cert.TestCase):
|
||||
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
elif router1_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
elif router1_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -135,8 +133,7 @@ class Cert_5_1_03_RouterAddressReallocation(thread_cert.TestCase):
|
||||
# 5 - Router1
|
||||
# Router1 make two attempts to reconnect to its current Partition.
|
||||
for _ in range(4):
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
msg.assertSentWithHopLimit(255)
|
||||
msg.assertSentToDestinationAddress("ff02::2")
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -162,8 +159,7 @@ class Cert_5_1_03_RouterAddressReallocation(thread_cert.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 7 - Router1
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -108,8 +108,7 @@ class Cert_5_1_04_RouterAddressReallocation(thread_cert.TestCase):
|
||||
router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# Leader or Router1 can be parent of Router2
|
||||
if leader_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
if leader_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -117,8 +116,7 @@ class Cert_5_1_04_RouterAddressReallocation(thread_cert.TestCase):
|
||||
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
elif router1_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE):
|
||||
elif router1_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -134,8 +132,7 @@ class Cert_5_1_04_RouterAddressReallocation(thread_cert.TestCase):
|
||||
# 5 - Router1
|
||||
# Router1 make two attempts to reconnect to its current Partition.
|
||||
for _ in range(4):
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
msg.assertSentWithHopLimit(255)
|
||||
msg.assertSentToDestinationAddress("ff02::2")
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -177,8 +174,7 @@ class Cert_5_1_04_RouterAddressReallocation(thread_cert.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Connectivity)
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
|
||||
@@ -93,8 +93,7 @@ class Cert_5_1_06_RemoveRouterId(thread_cert.TestCase):
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
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])
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[LEADER])
|
||||
command.check_child_id_request(
|
||||
msg,
|
||||
tlv_request=CheckType.CONTAIN,
|
||||
|
||||
@@ -125,8 +125,7 @@ class Cert_5_1_08_RouterAttachConnectivity(thread_cert.TestCase):
|
||||
msg.assertSentToNode(self.nodes[ROUTER4])
|
||||
|
||||
# 4 - Router4
|
||||
msg = router4_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router4_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -143,8 +143,7 @@ class Cert_5_1_09_REEDAttachConnectivity(thread_cert.TestCase):
|
||||
)
|
||||
|
||||
# 6 - Router2
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -132,8 +132,7 @@ class Cert_5_1_10_RouterAttachLinkQuality(thread_cert.TestCase):
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
# 5 - Router3
|
||||
msg = router3_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router3_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -141,8 +141,7 @@ class Cert_5_1_11_REEDAttachLinkQuality(thread_cert.TestCase):
|
||||
self.assertEqual(1, scan_mask_tlv.end_device)
|
||||
|
||||
# 6 - Router1
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
|
||||
@@ -58,17 +58,12 @@ class Cert_5_1_12_NewRouterSync(thread_cert.TestCase):
|
||||
},
|
||||
}
|
||||
|
||||
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)):
|
||||
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)):
|
||||
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.LINK_REQUEST)
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.LINK_REQUEST)
|
||||
|
||||
msg.assertSentToNode(self.nodes[req_receiver])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
@@ -138,10 +133,8 @@ class Cert_5_1_12_NewRouterSync(thread_cert.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__':
|
||||
|
||||
@@ -95,8 +95,7 @@ class Cert_5_2_01_REEDAttach(thread_cert.TestCase):
|
||||
command.check_parent_response(msg)
|
||||
|
||||
# 4 DUT_ROUTER1: Verify MLE Child ID Response
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
command.check_child_id_response(msg)
|
||||
|
||||
@@ -110,8 +109,7 @@ class Cert_5_2_01_REEDAttach(thread_cert.TestCase):
|
||||
# 7 REED1: Verify sending Address Solicit Request to DUT_ROUTER1
|
||||
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)
|
||||
reed1_ipv6_address = (msg.ipv6_packet.ipv6_header.source_address.compressed)
|
||||
msg.assertSentToNode(self.nodes[DUT_ROUTER1])
|
||||
msg.assertCoapMessageRequestUriPath('/a/as')
|
||||
|
||||
|
||||
@@ -51,9 +51,8 @@ class Cert_5_2_3_LeaderReject2Hops(thread_cert.TestCase):
|
||||
'router_upgrade_threshold':
|
||||
32,
|
||||
'whitelist': [
|
||||
ROUTER_1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||
ROUTER_31
|
||||
ROUTER_1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
||||
28, 29, 30, 31, ROUTER_31
|
||||
]
|
||||
},
|
||||
ROUTER_1: {
|
||||
@@ -358,8 +357,7 @@ class Cert_5_2_3_LeaderReject2Hops(thread_cert.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__':
|
||||
|
||||
@@ -47,13 +47,9 @@ ROUTER_SELECTION_JITTER = 1
|
||||
class Cert_5_2_4_REEDUpgrade(thread_cert.TestCase):
|
||||
TOPOLOGY = {
|
||||
LEADER: {
|
||||
'mode':
|
||||
'rsdn',
|
||||
'panid':
|
||||
0xface,
|
||||
'whitelist': [
|
||||
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ROUTER
|
||||
]
|
||||
'mode': 'rsdn',
|
||||
'panid': 0xface,
|
||||
'whitelist': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ROUTER]
|
||||
},
|
||||
2: {
|
||||
'mode': 'rsdn',
|
||||
@@ -189,8 +185,7 @@ class Cert_5_2_4_REEDUpgrade(thread_cert.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)
|
||||
@@ -239,8 +234,7 @@ class Cert_5_2_4_REEDUpgrade(thread_cert.TestCase):
|
||||
# Leader.
|
||||
mleid = None
|
||||
for addr in self.nodes[LEADER].get_addrs():
|
||||
if (addr.startswith(MESH_LOCAL_PREFIX) and
|
||||
addr.find(ROUTING_LOCATOR) == -1):
|
||||
if (addr.startswith(MESH_LOCAL_PREFIX) and addr.find(ROUTING_LOCATOR) == -1):
|
||||
mleid = addr
|
||||
break
|
||||
|
||||
|
||||
@@ -44,13 +44,9 @@ ROUTER_SELECTION_JITTER = 1
|
||||
class Cert_5_2_5_AddressQuery(thread_cert.TestCase):
|
||||
TOPOLOGY = {
|
||||
LEADER: {
|
||||
'mode':
|
||||
'rsdn',
|
||||
'panid':
|
||||
0xface,
|
||||
'whitelist': [
|
||||
ROUTER1, BR, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ED1
|
||||
]
|
||||
'mode': 'rsdn',
|
||||
'panid': 0xface,
|
||||
'whitelist': [ROUTER1, BR, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ED1]
|
||||
},
|
||||
ROUTER1: {
|
||||
'mode': 'rsdn',
|
||||
@@ -210,15 +206,13 @@ class Cert_5_2_5_AddressQuery(thread_cert.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):
|
||||
for global_address in self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.GLOBAL):
|
||||
if global_address[0:4] == '2001':
|
||||
flag2001 += 1
|
||||
elif global_address[0:4] == '2002':
|
||||
@@ -232,8 +226,7 @@ class Cert_5_2_5_AddressQuery(thread_cert.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."
|
||||
|
||||
@@ -248,8 +248,7 @@ class Cert_5_2_06_RouterDowngrade(thread_cert.TestCase):
|
||||
command.check_address_release(msg, self.nodes[LEADER])
|
||||
|
||||
# 4 & 5
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
self.assertTrue(self.nodes[LEADER].ping(router1_rloc))
|
||||
|
||||
|
||||
|
||||
@@ -146,8 +146,7 @@ class Cert_5_2_7_REEDSynchronization(thread_cert.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)
|
||||
@@ -156,8 +155,7 @@ class Cert_5_2_7_REEDSynchronization(thread_cert.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.
|
||||
@@ -173,25 +171,21 @@ class Cert_5_2_7_REEDSynchronization(thread_cert.TestCase):
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
link_accept_count = 0
|
||||
destination_link_local = self.nodes[DUT_REED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
destination_link_local = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
|
||||
for i in range(1, DUT_REED):
|
||||
dut_messages = self.simulator.get_messages_sent_by(i)
|
||||
|
||||
while True:
|
||||
msg = dut_messages.next_mle_message(mle.CommandType.LINK_ACCEPT,
|
||||
False)
|
||||
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__':
|
||||
|
||||
@@ -60,8 +60,7 @@ class Cert_5_3_1_LinkLocal(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
|
||||
|
||||
# 2 & 3
|
||||
link_local = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
link_local = self.nodes[DUT_ROUTER1].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
self.assertTrue(self.nodes[LEADER].ping(link_local, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(link_local))
|
||||
|
||||
@@ -74,8 +73,7 @@ class Cert_5_3_1_LinkLocal(thread_cert.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__':
|
||||
|
||||
@@ -85,15 +85,12 @@ class Cert_5_3_2_RealmLocal(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
# 2 & 3
|
||||
mleid = self.nodes[DUT_ROUTER2].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
mleid = self.nodes[DUT_ROUTER2].get_ip6_address(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())
|
||||
|
||||
@@ -102,9 +99,7 @@ class Cert_5_3_2_RealmLocal(thread_cert.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())
|
||||
|
||||
|
||||
@@ -97,8 +97,7 @@ class Cert_5_3_3_AddressQuery(thread_cert.TestCase):
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
router3_mleid = self.nodes[ROUTER3].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
router3_mleid = self.nodes[ROUTER3].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(self.nodes[MED1].ping(router3_mleid))
|
||||
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request to the Realm local
|
||||
@@ -120,15 +119,13 @@ class Cert_5_3_3_AddressQuery(thread_cert.TestCase):
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
med1_mleid = self.nodes[MED1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
med1_mleid = self.nodes[MED1].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(med1_mleid))
|
||||
|
||||
# Verify DUT_ROUTER2 responded with an Address Notification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/an')
|
||||
command.check_address_notification(msg, self.nodes[DUT_ROUTER2],
|
||||
self.nodes[ROUTER1])
|
||||
command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1])
|
||||
|
||||
# 4
|
||||
# Wait the finish of address resolution traffic triggerred by previous
|
||||
|
||||
@@ -112,8 +112,7 @@ class Cert_5_3_4_AddressMapCache(thread_cert.TestCase):
|
||||
|
||||
# 2
|
||||
for ED in [ED1, ED2, ED3, ED4]:
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -133,16 +132,14 @@ class Cert_5_3_4_AddressMapCache(thread_cert.TestCase):
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
|
||||
for ED in [ED1, ED2, ED3, ED4]:
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
|
||||
self.simulator.go(5)
|
||||
|
||||
# Verify DUT_ROUTER1 didn't generate an Address Query Request.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (msg is None
|
||||
), "Error: The DUT sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT sent an unexpected Address Query Request"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -80,8 +80,7 @@ class Cert_5_3_5_RoutingLinkQuality(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[router].get_state(), 'router')
|
||||
|
||||
# 2 & 3
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the least cost path.
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
@@ -89,10 +88,8 @@ class Cert_5_3_5_RoutingLinkQuality(thread_cert.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
|
||||
@@ -102,10 +99,8 @@ class Cert_5_3_5_RoutingLinkQuality(thread_cert.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
|
||||
@@ -115,15 +110,12 @@ class Cert_5_3_5_RoutingLinkQuality(thread_cert.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)
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(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)
|
||||
|
||||
@@ -101,8 +101,7 @@ class Cert_5_3_6_RouterIdMask(thread_cert.TestCase):
|
||||
print("%ss" % ((i + 1) * 30))
|
||||
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(
|
||||
mle.CommandType.ADVERTISEMENT, False)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT, False)
|
||||
if msg is None:
|
||||
continue
|
||||
|
||||
@@ -113,8 +112,7 @@ class Cert_5_3_6_RouterIdMask(thread_cert.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))
|
||||
@@ -139,14 +137,12 @@ class Cert_5_3_6_RouterIdMask(thread_cert.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))
|
||||
|
||||
@@ -128,8 +128,7 @@ class Cert_5_3_7_DuplicateAddress(thread_cert.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
|
||||
@@ -137,8 +136,7 @@ class Cert_5_3_7_DuplicateAddress(thread_cert.TestCase):
|
||||
self.simulator.go(5)
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/ae')
|
||||
command.check_address_error_notification(
|
||||
msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_error_notification(msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -102,17 +102,14 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[i].get_state(), 'child')
|
||||
|
||||
# 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)
|
||||
med2_ml_eid = self.nodes[MED2].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(med2_ml_eid is not None)
|
||||
self.assertTrue(self.nodes[MED1].ping(med2_ml_eid))
|
||||
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -120,8 +117,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.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")
|
||||
@@ -131,9 +127,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.TestCase):
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -141,8 +135,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.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")
|
||||
@@ -152,9 +145,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.TestCase):
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -162,8 +153,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.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")
|
||||
@@ -173,9 +163,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.TestCase):
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -183,8 +171,7 @@ class Cert_5_3_8_ChildAddressSet(thread_cert.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__':
|
||||
|
||||
@@ -117,8 +117,7 @@ class Cert_5_3_09_AddressQuery(thread_cert.TestCase):
|
||||
# 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)
|
||||
msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER2],
|
||||
@@ -127,9 +126,7 @@ class Cert_5_3_09_AddressQuery(thread_cert.TestCase):
|
||||
|
||||
# Verify the DUT_ROUTER2 forwarded the ICMPv6 Echo Request to ROUTER3
|
||||
msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER3"
|
||||
assert (msg is not None), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER3"
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
# 4 ROUTER1: ROUTER1 sends an ICMPv6 Echo Request to the SED1 using GUA
|
||||
@@ -144,8 +141,7 @@ class Cert_5_3_09_AddressQuery(thread_cert.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
|
||||
@@ -158,16 +154,11 @@ class Cert_5_3_09_AddressQuery(thread_cert.TestCase):
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
|
||||
# Verify DUT_ROUTER2 forwarded the ICMPv6 Echo Reply to SED1
|
||||
msg = dut_router2_messages_temp.get_icmp_message(
|
||||
ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
|
||||
msg = dut_router2_messages_temp.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (msg is not None), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
|
||||
msg.assertSentToNode(self.nodes[SED1])
|
||||
|
||||
# 6 DUT_ROUTER2: Power off ROUTER3 and wait 580s to alow LEADER to
|
||||
@@ -181,8 +172,7 @@ class Cert_5_3_09_AddressQuery(thread_cert.TestCase):
|
||||
# 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)
|
||||
msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
|
||||
# 7 SED1: Power off SED1 and wait to allow DUT_ROUTER2 to timeout the
|
||||
# child
|
||||
@@ -196,9 +186,7 @@ class Cert_5_3_09_AddressQuery(thread_cert.TestCase):
|
||||
# Verify DUT_ROUTER2 didn't generate an Address Notification message
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/an', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
assert (msg is None), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -129,9 +129,7 @@ class Cert_5_3_10_AddressQuery(thread_cert.TestCase):
|
||||
|
||||
# Verify the DUT_ROUTER2 forwarded ICMPv6 Echo Request to ROUTER1
|
||||
msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER1"
|
||||
assert (msg is not None), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER1"
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
|
||||
# 4 BR: BR sends an ICMPv6 Echo Request to MED1 using GUA 2003::
|
||||
@@ -146,8 +144,7 @@ class Cert_5_3_10_AddressQuery(thread_cert.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
|
||||
@@ -162,16 +159,11 @@ class Cert_5_3_10_AddressQuery(thread_cert.TestCase):
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
assert (msg is None), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
|
||||
# Verify DUT_ROUTER2 forwarded ICMPv6 Echo Reply to MED1
|
||||
msg = dut_router2_messages_temp.get_icmp_message(
|
||||
ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
|
||||
msg = dut_router2_messages_temp.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert (msg is not None), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
|
||||
msg.assertSentToNode(self.nodes[MED1])
|
||||
|
||||
# 6 DUT_ROUTER2: Power off ROUTER1 and wait 580 seconds to allow the
|
||||
@@ -185,14 +177,12 @@ class Cert_5_3_10_AddressQuery(thread_cert.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)
|
||||
msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
|
||||
# 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the
|
||||
# child
|
||||
@@ -206,9 +196,7 @@ class Cert_5_3_10_AddressQuery(thread_cert.TestCase):
|
||||
# Verify DUT_ROUTER2 didn't generate an Address Notification message
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/an/', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
assert (msg is None), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -55,8 +55,7 @@ class Cert_5_5_1_LeaderReboot(thread_cert.TestCase):
|
||||
}
|
||||
|
||||
def _setUpLeader(self):
|
||||
self.nodes[DUT_LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64())
|
||||
self.nodes[DUT_LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64())
|
||||
self.nodes[DUT_LEADER].enable_whitelist()
|
||||
|
||||
def test(self):
|
||||
@@ -80,12 +79,10 @@ class Cert_5_5_1_LeaderReboot(thread_cert.TestCase):
|
||||
command.check_mle_advertisement(msg)
|
||||
|
||||
# Send a harness helper ping to the DUT
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(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)
|
||||
leader_rloc = self.nodes[DUT_LEADER].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
self.assertTrue(self.nodes[DUT_ROUTER1].ping(leader_rloc))
|
||||
|
||||
# 3 DUT_LEADER: Reset DUT_LEADER
|
||||
@@ -102,8 +99,7 @@ class Cert_5_5_1_LeaderReboot(thread_cert.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()
|
||||
@@ -137,8 +133,7 @@ class Cert_5_5_1_LeaderReboot(thread_cert.TestCase):
|
||||
route64=command.CheckType.CONTAIN,
|
||||
)
|
||||
else:
|
||||
msg = router1_messages_temp.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg = router1_messages_temp.next_mle_message(mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
self.assertTrue(msg is not None)
|
||||
command.check_link_accept(
|
||||
msg,
|
||||
@@ -150,14 +145,12 @@ class Cert_5_5_1_LeaderReboot(thread_cert.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)
|
||||
msg = leader_messages_temp.next_mle_message(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)
|
||||
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))
|
||||
|
||||
|
||||
|
||||
@@ -42,14 +42,9 @@ REED1 = 17
|
||||
class Cert_5_5_5_SplitMergeREED(thread_cert.TestCase):
|
||||
TOPOLOGY = {
|
||||
LEADER: {
|
||||
'mode':
|
||||
'rsdn',
|
||||
'panid':
|
||||
0xface,
|
||||
'whitelist': [
|
||||
ROUTER2, ROUTER3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
ROUTER15
|
||||
]
|
||||
'mode': 'rsdn',
|
||||
'panid': 0xface,
|
||||
'whitelist': [ROUTER2, ROUTER3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ROUTER15]
|
||||
},
|
||||
ROUTER1: {
|
||||
'mode': 'rsdn',
|
||||
|
||||
@@ -109,10 +109,8 @@ class Cert_5_7_01_CoapDiagCommands_A(thread_cert.TestCase):
|
||||
|
||||
# 2 - Leader sends DIAG_GET.req
|
||||
tlv_types = [
|
||||
TlvType.EXT_ADDRESS, TlvType.ADDRESS16, TlvType.MODE,
|
||||
TlvType.CONNECTIVITY, TlvType.ROUTE64, TlvType.LEADER_DATA,
|
||||
TlvType.NETWORK_DATA, TlvType.IPV6_ADDRESS_LIST,
|
||||
TlvType.CHANNEL_PAGES
|
||||
TlvType.EXT_ADDRESS, TlvType.ADDRESS16, TlvType.MODE, TlvType.CONNECTIVITY, TlvType.ROUTE64,
|
||||
TlvType.LEADER_DATA, TlvType.NETWORK_DATA, TlvType.IPV6_ADDRESS_LIST, TlvType.CHANNEL_PAGES
|
||||
]
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc, tlv_types)
|
||||
self.simulator.go(2)
|
||||
@@ -120,8 +118,7 @@ class Cert_5_7_01_CoapDiagCommands_A(thread_cert.TestCase):
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
|
||||
diag_get_rsp = dut_messages.next_coap_message(code='2.04')
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(
|
||||
network_layer.MacExtendedAddress)
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(network_layer.MacExtendedAddress)
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(mle.Address16)
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(mle.Mode)
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(mle.Connectivity)
|
||||
@@ -132,19 +129,16 @@ class Cert_5_7_01_CoapDiagCommands_A(thread_cert.TestCase):
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(network_diag.ChannelPages)
|
||||
|
||||
# 3 - Leader sends DIAG_GET.req (MAC Counters TLV type included)
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc,
|
||||
[TlvType.MAC_COUNTERS])
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc, [TlvType.MAC_COUNTERS])
|
||||
self.simulator.go(2)
|
||||
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
diag_get_rsp = dut_messages.next_coap_message(code='2.04')
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(network_diag.MacCounters)
|
||||
mac_counters = diag_get_rsp.get_coap_message_tlv(
|
||||
network_diag.MacCounters)
|
||||
mac_counters = diag_get_rsp.get_coap_message_tlv(network_diag.MacCounters)
|
||||
|
||||
# 4 - Leader sends DIAG_GET.req (Timeout/Polling Period TLV type included)
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc,
|
||||
[TlvType.POLLING_PERIOD])
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc, [TlvType.POLLING_PERIOD])
|
||||
self.simulator.go(2)
|
||||
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
@@ -152,20 +146,16 @@ class Cert_5_7_01_CoapDiagCommands_A(thread_cert.TestCase):
|
||||
diag_get_rsp.assertCoapMessageDoesNotContainTlv(mle.Timeout)
|
||||
|
||||
# 5 - Leader sends DIAG_GET.req (Battery Level and Supply Voltage TLV types included)
|
||||
self.nodes[LEADER].send_network_diag_get(
|
||||
dut_rloc, [TlvType.BATTERY_LEVEL, TlvType.SUPPLY_VOLTAGE])
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc, [TlvType.BATTERY_LEVEL, TlvType.SUPPLY_VOLTAGE])
|
||||
self.simulator.go(2)
|
||||
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
diag_get_rsp = dut_messages.next_coap_message(code='2.04')
|
||||
diag_get_rsp.assertCoapMessageContainsOptionalTlv(
|
||||
network_diag.BatteryLevel)
|
||||
diag_get_rsp.assertCoapMessageContainsOptionalTlv(
|
||||
network_diag.SupplyVoltage)
|
||||
diag_get_rsp.assertCoapMessageContainsOptionalTlv(network_diag.BatteryLevel)
|
||||
diag_get_rsp.assertCoapMessageContainsOptionalTlv(network_diag.SupplyVoltage)
|
||||
|
||||
# 6 - Leader sends DIAG_GET.req (Child Table TLV types included)
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc,
|
||||
[TlvType.CHILD_TABLE])
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc, [TlvType.CHILD_TABLE])
|
||||
self.simulator.go(2)
|
||||
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
@@ -176,8 +166,7 @@ class Cert_5_7_01_CoapDiagCommands_A(thread_cert.TestCase):
|
||||
# TODO(wgtdkp): more validations
|
||||
|
||||
# 7 - Leader sends DIAG_RST.ntf (MAC Counters TLV type included)
|
||||
self.nodes[LEADER].send_network_diag_reset(dut_rloc,
|
||||
[TlvType.MAC_COUNTERS])
|
||||
self.nodes[LEADER].send_network_diag_reset(dut_rloc, [TlvType.MAC_COUNTERS])
|
||||
self.simulator.go(2)
|
||||
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
@@ -186,20 +175,16 @@ class Cert_5_7_01_CoapDiagCommands_A(thread_cert.TestCase):
|
||||
dut_messages.next_coap_message(code='2.04')
|
||||
|
||||
# 8 - Leader Sends DIAG_GET.req (MAC Counters TLV type included)
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc,
|
||||
[TlvType.MAC_COUNTERS])
|
||||
self.nodes[LEADER].send_network_diag_get(dut_rloc, [TlvType.MAC_COUNTERS])
|
||||
self.simulator.go(2)
|
||||
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT)
|
||||
diag_get_rsp = dut_messages.next_coap_message(code='2.04')
|
||||
diag_get_rsp.assertCoapMessageContainsTlv(network_diag.MacCounters)
|
||||
reset_mac_counters = diag_get_rsp.get_coap_message_tlv(
|
||||
network_diag.MacCounters)
|
||||
reset_mac_counters = diag_get_rsp.get_coap_message_tlv(network_diag.MacCounters)
|
||||
|
||||
self.assertEqual(len(mac_counters.counters),
|
||||
len(reset_mac_counters.counters))
|
||||
for old_counter, new_counter in zip(mac_counters.counters,
|
||||
reset_mac_counters.counters):
|
||||
self.assertEqual(len(mac_counters.counters), len(reset_mac_counters.counters))
|
||||
for old_counter, new_counter in zip(mac_counters.counters, reset_mac_counters.counters):
|
||||
self.assertTrue(new_counter == 0 or new_counter < old_counter)
|
||||
|
||||
|
||||
|
||||
@@ -98,8 +98,7 @@ class Cert_6_1_1_RouterAttach(thread_cert.TestCase):
|
||||
msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter)
|
||||
|
||||
# 5 - leader
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
# 6 - leader
|
||||
|
||||
@@ -89,8 +89,7 @@ class Cert_6_1_2_REEDAttach_MED(thread_cert.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,
|
||||
@@ -105,8 +104,7 @@ class Cert_6_1_2_REEDAttach_MED(thread_cert.TestCase):
|
||||
med_messages = self.simulator.get_messages_sent_by(MED)
|
||||
|
||||
# Step 8 - DUT sends Child Update messages
|
||||
msg = med_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
msg = med_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg,
|
||||
source_address=CheckType.CONTAIN,
|
||||
|
||||
@@ -90,8 +90,7 @@ class Cert_6_1_2_REEDAttach_SED(thread_cert.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,
|
||||
@@ -108,8 +107,8 @@ class Cert_6_1_2_REEDAttach_SED(thread_cert.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,
|
||||
|
||||
@@ -77,16 +77,11 @@ class Cert_5_3_2_RealmLocal(thread_cert.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:fd00:db8:0:0:0:1',
|
||||
num_responses=2,
|
||||
size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff33:0040:fd00:db8:0:0:0:1',
|
||||
num_responses=2))
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff33:0040:fd00:db8:0:0:0:1', num_responses=2, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff33:0040:fd00:db8:0:0:0:1', num_responses=2))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -128,52 +128,41 @@ class Cert_7_1_1_BorderRouterAsLeader(thread_cert.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)
|
||||
msg = leader_messages.next_mle_message(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)
|
||||
msg = leader_messages.next_mle_message(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)])),
|
||||
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)
|
||||
msg_chd_upd_res_to_sed = leader_messages.next_mle_message(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)
|
||||
msg = leader_messages.next_mle_message(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)
|
||||
msg = med1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
msg_chd_upd_res_to_med = leader_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_RESPONSE)
|
||||
msg = med1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
|
||||
check_child_update_response(
|
||||
msg_chd_upd_res_to_med,
|
||||
@@ -181,10 +170,8 @@ class Cert_7_1_1_BorderRouterAsLeader(thread_cert.TestCase):
|
||||
CIDs=[1, 2],
|
||||
)
|
||||
|
||||
msg = sed1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
msg = sed1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
check_child_update_response(
|
||||
msg_chd_upd_res_to_sed,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
|
||||
@@ -133,19 +133,16 @@ class Cert_7_1_3_BorderRouterAsLeader(thread_cert.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)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
msg = med1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(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
|
||||
@@ -155,9 +152,7 @@ class Cert_7_1_3_BorderRouterAsLeader(thread_cert.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:
|
||||
@@ -172,25 +167,20 @@ class Cert_7_1_3_BorderRouterAsLeader(thread_cert.TestCase):
|
||||
active_timestamp=CheckType.CONTAIN,
|
||||
)
|
||||
else:
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.DATA_RESPONSE, sent_to_node=self.nodes[SED1])
|
||||
msg = leader_messages.next_mle_message(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)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
msg = sed1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(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__':
|
||||
|
||||
@@ -117,8 +117,7 @@ class Cert_7_1_5_BorderRouterAsRouter(thread_cert.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()
|
||||
@@ -126,8 +125,7 @@ class Cert_7_1_5_BorderRouterAsRouter(thread_cert.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))
|
||||
|
||||
|
||||
|
||||
@@ -63,92 +63,73 @@ class Cert_8_1_01_Commissioning(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'PSKD01')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'PSKD01')
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('PSKD01')
|
||||
self.simulator.go(10)
|
||||
self.simulator.read_cert_messages_in_commissioning_log(
|
||||
[COMMISSIONER, JOINER])
|
||||
self.simulator.read_cert_messages_in_commissioning_log([COMMISSIONER, JOINER])
|
||||
self.assertEqual(
|
||||
self.nodes[JOINER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
joiner_messages = self.simulator.get_messages_sent_by(JOINER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(
|
||||
COMMISSIONER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(COMMISSIONER)
|
||||
|
||||
# 2 - N/A
|
||||
|
||||
# 3 - Joiner_1
|
||||
msg = joiner_messages.next_mle_message(
|
||||
mle.CommandType.DISCOVERY_REQUEST)
|
||||
msg = joiner_messages.next_mle_message(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)
|
||||
udp_port_set_by_commissioner = command.get_joiner_udp_port_in_discovery_response(
|
||||
msg)
|
||||
msg = commissioner_messages.next_mle_message(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)
|
||||
msg = commissioner_messages.next_dtls_message(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_KEY_EXCHANGE)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO_DONE)
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO)
|
||||
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)
|
||||
|
||||
# 5.6 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_KEY_EXCHANGE)
|
||||
msg = joiner_messages.next_dtls_message(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)
|
||||
msg = joiner_messages.next_dtls_message(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.
|
||||
# Currently not handled as it is encrypted.
|
||||
|
||||
# 5.7 - Commissioner
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC)
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.CHANGE_CIPHER_SPEC)
|
||||
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here.
|
||||
# Currently not handled as it is encrypted.
|
||||
|
||||
# 5.8,9,10,11
|
||||
# - Joiner_1
|
||||
command.check_joiner_commissioning_messages(
|
||||
joiner_messages.commissioning_messages)
|
||||
command.check_joiner_commissioning_messages(joiner_messages.commissioning_messages)
|
||||
# - Commissioner
|
||||
command.check_commissioner_commissioning_messages(
|
||||
commissioner_messages.commissioning_messages)
|
||||
command.check_commissioner_commissioning_messages(commissioner_messages.commissioning_messages)
|
||||
# As commissioner is also joiner router
|
||||
command.check_joiner_router_commissioning_messages(
|
||||
commissioner_messages.commissioning_messages)
|
||||
command.check_joiner_router_commissioning_messages(commissioner_messages.commissioning_messages)
|
||||
|
||||
self.nodes[JOINER].thread_start()
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -58,8 +58,7 @@ class Cert_8_1_02_Commissioning(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'PSKD01')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'PSKD01')
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('10DKSP')
|
||||
|
||||
@@ -66,10 +66,8 @@ class Cert_8_2_01_JoinerRouter(thread_cert.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(5)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'PSKD01')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'PSKD02')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER_ROUTER].get_eui64(), 'PSKD01')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'PSKD02')
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[JOINER_ROUTER].interface_up()
|
||||
@@ -85,8 +83,7 @@ class Cert_8_2_01_JoinerRouter(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_state(), 'router')
|
||||
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
self.nodes[JOINER].enable_whitelist()
|
||||
self.nodes[JOINER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
@@ -66,10 +66,8 @@ class Cert_8_2_02_JoinerRouter(thread_cert.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(5)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'PSKD01')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'PSKD02')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER_ROUTER].get_eui64(), 'PSKD01')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'PSKD02')
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[JOINER_ROUTER].interface_up()
|
||||
@@ -85,8 +83,7 @@ class Cert_8_2_02_JoinerRouter(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_state(), 'router')
|
||||
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
self.nodes[JOINER].enable_whitelist()
|
||||
self.nodes[JOINER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
|
||||
@@ -78,14 +78,12 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
# Get CommissionerSessionId from LEAD_PET.rsp
|
||||
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)
|
||||
commissioner_session_id_tlv = command.get_sub_tlv(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])
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs([steering_data_tlv])
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 3 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
@@ -93,17 +91,14 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
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)])
|
||||
command.check_coap_message(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])
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs([steering_data_tlv, commissioner_session_id_tlv])
|
||||
self.simulator.go(5)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(
|
||||
COMMISSIONER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(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())
|
||||
@@ -116,22 +111,20 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
# Step 5 - Leader sends MGMT_COMMISSIONER_SET.rsp to commissioner
|
||||
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)])
|
||||
command.check_coap_message(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)
|
||||
command.check_data_response(
|
||||
msg,
|
||||
command.NetworkDataCheck(
|
||||
commissioning_data_check=command.CommissioningDataCheck(
|
||||
stable=0,
|
||||
sub_tlv_type_list=[
|
||||
mesh_cop.CommissionerSessionId,
|
||||
mesh_cop.SteeringData,
|
||||
mesh_cop.BorderAgentLocator,
|
||||
],
|
||||
)),
|
||||
command.NetworkDataCheck(commissioning_data_check=command.CommissioningDataCheck(
|
||||
stable=0,
|
||||
sub_tlv_type_list=[
|
||||
mesh_cop.CommissionerSessionId,
|
||||
mesh_cop.SteeringData,
|
||||
mesh_cop.BorderAgentLocator,
|
||||
],
|
||||
)),
|
||||
)
|
||||
|
||||
# Step 7 - Harness instructs commissioner to send
|
||||
@@ -145,8 +138,7 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
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)])
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
|
||||
# Step 9 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
@@ -161,8 +153,7 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
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)])
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
|
||||
# Step 11 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
@@ -174,8 +165,7 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
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)])
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
|
||||
# Step 13 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
@@ -190,8 +180,7 @@ class Cert_9_2_02_MGMTCommissionerSet(thread_cert.TestCase):
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
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)])
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)])
|
||||
|
||||
# Step 15 - Send ICMPv6 Echo Request to Leader
|
||||
leader_rloc = self.nodes[LEADER].get_rloc()
|
||||
|
||||
@@ -118,21 +118,16 @@ class Cert_9_2_7_DelayTimer(thread_cert.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:
|
||||
|
||||
@@ -153,13 +153,10 @@ class Cert_9_2_8_PersistentDatasets(thread_cert.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,
|
||||
@@ -187,18 +184,13 @@ class Cert_9_2_8_PersistentDatasets(thread_cert.TestCase):
|
||||
|
||||
self.simulator.go(10)
|
||||
|
||||
self.assertEqual(self.nodes[ROUTER].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[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)
|
||||
|
||||
|
||||
@@ -101,8 +101,7 @@ class Cert_9_2_13_EnergyScan(thread_cert.TestCase):
|
||||
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,
|
||||
'ff33:0040:fd00:db8:0:0:0:1')
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3E8, 'ff33:0040:fd00:db8:0:0:0:1')
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
|
||||
|
||||
@@ -91,8 +91,7 @@ class Cert_9_2_14_PanIdQuery(thread_cert.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff, ipaddr)
|
||||
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff,
|
||||
'ff33:0040:fd00:db8:0:0:0:1')
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff, 'ff33:0040:fd00:db8:0:0:0:1')
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
|
||||
|
||||
@@ -134,22 +134,17 @@ class Cert_9_2_16_ActivePendingPartition(thread_cert.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)
|
||||
|
||||
|
||||
@@ -139,8 +139,7 @@ class Cert_9_2_18_RollBackActiveTimestamp(thread_cert.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(
|
||||
|
||||
@@ -118,8 +118,7 @@ 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):
|
||||
@@ -176,8 +175,7 @@ class CoapCode(object):
|
||||
|
||||
@property
|
||||
def dotted(self):
|
||||
return ".".join(
|
||||
["{:01d}".format(self._class), "{:02d}".format(self.detail)])
|
||||
return ".".join(["{:01d}".format(self._class), "{:02d}".format(self.detail)])
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, int):
|
||||
@@ -190,8 +188,7 @@ 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
|
||||
@@ -258,18 +255,17 @@ 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):
|
||||
@@ -290,8 +286,7 @@ class CoapMessageProxy(object):
|
||||
self._coap_message = coap_message
|
||||
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)
|
||||
self._uri_path_based_payload_factories = (uri_path_based_payload_factories)
|
||||
|
||||
@property
|
||||
def version(self):
|
||||
@@ -324,13 +319,11 @@ class CoapMessageProxy(object):
|
||||
@property
|
||||
def payload(self):
|
||||
try:
|
||||
binded_uri_path = self._mid_to_uri_path_binder.get_uri_path_for(
|
||||
self.message_id, self.token)
|
||||
binded_uri_path = self._mid_to_uri_path_binder.get_uri_path_for(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
|
||||
@@ -341,18 +334,17 @@ 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:
|
||||
@@ -368,9 +360,8 @@ class CoapMessageIdToUriPathBinder:
|
||||
try:
|
||||
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)))
|
||||
raise RuntimeError("Could not find URI PATH for message_id: {} and token: {}".format(
|
||||
message_id, hexlify(token)))
|
||||
|
||||
|
||||
class CoapMessageFactory(object):
|
||||
@@ -383,8 +374,7 @@ class CoapMessageFactory(object):
|
||||
message_id_to_uri_path_binder,
|
||||
):
|
||||
self._options_factory = options_factory
|
||||
self._uri_path_based_payload_factories = (
|
||||
uri_path_based_payload_factories)
|
||||
self._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):
|
||||
@@ -409,8 +399,7 @@ class CoapMessageFactory(object):
|
||||
return version, _type, token_length
|
||||
|
||||
def parse(self, data, message_info):
|
||||
version, _type, token_length = self._parse_initial_byte(
|
||||
data, message_info)
|
||||
version, _type, token_length = self._parse_initial_byte(data, message_info)
|
||||
|
||||
code = CoapCode(ord(data.read(1)))
|
||||
message_id = struct.unpack(">H", data.read(2))[0]
|
||||
@@ -420,8 +409,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)
|
||||
self._mid_to_uri_path_binder.add_uri_path_for(message_id, token, uri_path)
|
||||
|
||||
coap_message = CoapMessage(
|
||||
version,
|
||||
|
||||
@@ -58,19 +58,15 @@ def check_address_query(command_msg, source_node, destination_address):
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid)
|
||||
|
||||
source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert (
|
||||
ipv6.ip_address(
|
||||
source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), ("Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: "
|
||||
+ str(ipv6.ip_address(source_rloc)) +
|
||||
", but the source_address in command msg is: " +
|
||||
assert (ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address), (
|
||||
"Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " +
|
||||
str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " +
|
||||
str(command_msg.ipv6_packet.ipv6_header.source_address))
|
||||
|
||||
if isinstance(destination_address, bytearray):
|
||||
destination_address = bytes(destination_address)
|
||||
|
||||
assert (ipv6.ip_address(destination_address) ==
|
||||
command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
assert (ipv6.ip_address(destination_address) == command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The IPv6 destination address is not expected."
|
||||
|
||||
|
||||
@@ -83,21 +79,15 @@ def check_address_notification(command_msg, source_node, destination_node):
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.MlEid)
|
||||
|
||||
source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert (
|
||||
ipv6.ip_address(
|
||||
source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), "Error: The IPv6 source address is not the RLOC of the originator."
|
||||
assert (ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), "Error: The IPv6 source address is not the RLOC of the originator."
|
||||
|
||||
destination_rloc = destination_node.get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
assert (
|
||||
ipv6.ip_address(destination_rloc) ==
|
||||
command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The IPv6 destination address is not the RLOC of the destination."
|
||||
destination_rloc = destination_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert (ipv6.ip_address(destination_rloc) == command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The IPv6 destination address is not the RLOC of the destination."
|
||||
|
||||
|
||||
def check_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')
|
||||
@@ -105,23 +95,17 @@ def check_address_error_notification(command_msg, source_node,
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.MlEid)
|
||||
|
||||
source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert (
|
||||
ipv6.ip_address(
|
||||
source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), ("Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: "
|
||||
+ str(ipv6.ip_address(source_rloc)) +
|
||||
", but the source_address in command msg is: " +
|
||||
assert (ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address), (
|
||||
"Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " +
|
||||
str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " +
|
||||
str(command_msg.ipv6_packet.ipv6_header.source_address))
|
||||
|
||||
if isinstance(destination_address, bytearray):
|
||||
destination_address = bytes(destination_address)
|
||||
|
||||
assert (
|
||||
ipv6.ip_address(destination_address) ==
|
||||
command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), ("Error: The IPv6 destination address is not expected. The destination node's rloc is: "
|
||||
+ str(ipv6.ip_address(destination_address)) +
|
||||
", but the destination_address in command msg is: " +
|
||||
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))
|
||||
|
||||
|
||||
@@ -142,10 +126,8 @@ def check_address_release(command_msg, destination_node):
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.Rloc16)
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.MacExtendedAddress)
|
||||
|
||||
destination_rloc = destination_node.get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC)
|
||||
assert (ipv6.ip_address(destination_rloc) ==
|
||||
command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
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"
|
||||
|
||||
|
||||
@@ -155,26 +137,22 @@ 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 == tlv
|
||||
for tlv in tlv_request_tlv.tlvs), "Error: The msg doesn't contain TLV Request TLV ID: {}".format(tlv_id)
|
||||
|
||||
elif check_type == CheckType.NOT_CONTAIN:
|
||||
if tlv_request_tlv is not None:
|
||||
assert (
|
||||
any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs) is False
|
||||
), "Error: The msg contains TLV Request TLV ID: {}".format(tlv_id)
|
||||
assert (any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs) is
|
||||
False), "Error: The msg contains TLV Request TLV ID: {}".format(tlv_id)
|
||||
|
||||
elif check_type == CheckType.OPTIONAL:
|
||||
if tlv_request_tlv is not None:
|
||||
if any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs):
|
||||
print("TLV Request TLV contains TLV ID: {}".format(tlv_id))
|
||||
else:
|
||||
print(
|
||||
"TLV Request TLV doesn't contain TLV ID: {}".format(tlv_id))
|
||||
print("TLV Request TLV doesn't contain TLV ID: {}".format(tlv_id))
|
||||
else:
|
||||
print("The msg doesn't contain TLV Request TLV")
|
||||
|
||||
@@ -198,11 +176,9 @@ 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_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_link_margin, mle.TlvType.LINK_MARGIN)
|
||||
|
||||
|
||||
def check_link_accept(
|
||||
@@ -230,14 +206,11 @@ 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)
|
||||
assert (
|
||||
ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.
|
||||
ipv6_header.destination_address), "Error: The destination is unexpected"
|
||||
destination_link_local = destination_node.get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
assert (ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The destination is unexpected"
|
||||
|
||||
|
||||
def check_icmp_path(sniffer, path, nodes, icmp_type=ipv6.ICMP_ECHO_REQUEST):
|
||||
@@ -253,8 +226,7 @@ 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
|
||||
|
||||
@@ -305,8 +277,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)
|
||||
command_msg.assertSentToDestinationAddress(config.LINK_LOCAL_ALL_NODES_ADDRESS)
|
||||
command_msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
command_msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Route64)
|
||||
@@ -316,13 +287,10 @@ def check_parent_request(command_msg, is_first_request):
|
||||
"""Verify a properly formatted Parent Request command message.
|
||||
"""
|
||||
if command_msg.mle.aux_sec_hdr.key_id_mode != 0x2:
|
||||
raise ValueError(
|
||||
"The Key Identifier Mode of the Security Control Field SHALL be set to 0x02"
|
||||
)
|
||||
raise ValueError("The Key Identifier Mode of the Security Control Field SHALL be set to 0x02")
|
||||
|
||||
command_msg.assertSentWithHopLimit(255)
|
||||
command_msg.assertSentToDestinationAddress(
|
||||
config.LINK_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command_msg.assertSentToDestinationAddress(config.LINK_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Challenge)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Version)
|
||||
@@ -363,9 +331,7 @@ def check_child_id_request(
|
||||
"""Verify a properly formatted Child Id Request command message.
|
||||
"""
|
||||
if command_msg.mle.aux_sec_hdr.key_id_mode != 0x2:
|
||||
raise ValueError(
|
||||
"The Key Identifier Mode of the Security Control Field SHALL be set to 0x02"
|
||||
)
|
||||
raise ValueError("The Key Identifier Mode of the Security Control Field SHALL be set to 0x02")
|
||||
|
||||
command_msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -375,15 +341,13 @@ 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, 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.NETWORK_DATA)
|
||||
|
||||
|
||||
def check_child_id_response(
|
||||
@@ -405,29 +369,22 @@ 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, 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)
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(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.LowpanId), 'Prefix doesn\'t contain a LowpanId 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!'
|
||||
|
||||
|
||||
def check_child_update_request_from_child(
|
||||
@@ -447,8 +404,7 @@ 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)
|
||||
|
||||
@@ -472,11 +428,9 @@ 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)
|
||||
assert any(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):
|
||||
@@ -488,9 +442,7 @@ 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):
|
||||
@@ -500,9 +452,7 @@ 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)
|
||||
@@ -510,8 +460,7 @@ def check_data_response(command_msg,
|
||||
command_msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
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)
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(mle.NetworkData)
|
||||
network_data_check.check(network_data_tlv)
|
||||
|
||||
|
||||
@@ -554,14 +503,12 @@ 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:
|
||||
@@ -569,8 +516,7 @@ def check_child_update_response(
|
||||
|
||||
|
||||
def _check_address_registration(command_msg, CIDs=()):
|
||||
addresses = command_msg.assertMleMessageContainsTlv(
|
||||
mle.AddressRegistration).addresses
|
||||
addresses = command_msg.assertMleMessageContainsTlv(mle.AddressRegistration).addresses
|
||||
for cid in CIDs:
|
||||
found = False
|
||||
for address in addresses:
|
||||
@@ -595,22 +541,17 @@ def check_address_registration_tlv(
|
||||
"""
|
||||
found = False
|
||||
addr = ipaddress.ip_address(full_address)
|
||||
addresses = command_msg.assertMleMessageContainsTlv(
|
||||
mle.AddressRegistration).addresses
|
||||
addresses = command_msg.assertMleMessageContainsTlv(mle.AddressRegistration).addresses
|
||||
|
||||
for item in addresses:
|
||||
if isinstance(item, mle.AddressFull) and ipaddress.ip_address(
|
||||
item.ipv6_address) == addr:
|
||||
if isinstance(item, mle.AddressFull) and ipaddress.ip_address(item.ipv6_address) == addr:
|
||||
found = True
|
||||
break
|
||||
|
||||
return found
|
||||
|
||||
|
||||
def check_compressed_address_registration_tlv(command_msg,
|
||||
cid,
|
||||
iid,
|
||||
cid_present_once=False):
|
||||
def check_compressed_address_registration_tlv(command_msg, cid, iid, cid_present_once=False):
|
||||
'''Check whether or not a compressed IPv6 address in AddressRegistrationTlv.
|
||||
note: only compare the iid part of the address.
|
||||
|
||||
@@ -624,8 +565,7 @@ def check_compressed_address_registration_tlv(command_msg,
|
||||
found = False
|
||||
cid_cnt = 0
|
||||
|
||||
addresses = command_msg.assertMleMessageContainsTlv(
|
||||
mle.AddressRegistration).addresses
|
||||
addresses = command_msg.assertMleMessageContainsTlv(mle.AddressRegistration).addresses
|
||||
|
||||
for item in addresses:
|
||||
if isinstance(item, mle.AddressCompressed):
|
||||
@@ -634,12 +574,10 @@ def check_compressed_address_registration_tlv(command_msg,
|
||||
if iid == item.iid.hex():
|
||||
found = True
|
||||
break
|
||||
assert found, 'Error: Expected (cid, iid):({},{}) Not Found'.format(
|
||||
cid, iid)
|
||||
assert found, 'Error: Expected (cid, iid):({},{}) Not Found'.format(cid, iid)
|
||||
|
||||
assert cid_present_once == (
|
||||
cid_cnt == 1), 'Error: Expected cid present {} but present {}'.format(
|
||||
'once' if cid_present_once else '', cid_cnt)
|
||||
assert cid_present_once == (cid_cnt == 1), 'Error: Expected cid present {} but present {}'.format(
|
||||
'once' if cid_present_once else '', cid_cnt)
|
||||
|
||||
|
||||
def assert_contains_tlv(tlvs, check_type, tlv_type):
|
||||
@@ -663,32 +601,26 @@ 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)
|
||||
assert (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)
|
||||
|
||||
|
||||
@@ -696,8 +628,7 @@ 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
|
||||
|
||||
|
||||
@@ -708,8 +639,7 @@ 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
|
||||
|
||||
@@ -717,15 +647,13 @@ 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
|
||||
|
||||
|
||||
@@ -737,8 +665,7 @@ def check_payload_same(tp1, 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))
|
||||
peer_tlv == tlv), 'peer_tlv:{}, tlv:{} type:{}'.format(peer_tlv, tlv, type(tlv))
|
||||
|
||||
|
||||
def check_coap_message(msg, payloads, dest_addrs=None):
|
||||
@@ -759,17 +686,13 @@ class SinglePrefixCheck:
|
||||
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)
|
||||
result &= (self._border_router_16 == border_router_tlv.border_router_16)
|
||||
return result
|
||||
|
||||
|
||||
@@ -782,8 +705,7 @@ 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
|
||||
@@ -802,11 +724,9 @@ class CommissioningDataCheck:
|
||||
|
||||
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 (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'
|
||||
self._sub_tlv_type_list), 'Some sub tlvs are missing in Commissioning Data'
|
||||
|
||||
|
||||
class NetworkDataCheck:
|
||||
@@ -817,10 +737,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
|
||||
if isinstance(tlv, network_data.Prefix)
|
||||
]
|
||||
prefix_tlvs = [tlv for tlv in network_data_tlv.tlvs if isinstance(tlv, network_data.Prefix)]
|
||||
self._prefixes_check.check(prefix_tlvs)
|
||||
if self._commissioning_data_check is not None:
|
||||
commissioning_data_tlv = assert_contains_tlv(
|
||||
|
||||
@@ -47,8 +47,7 @@ def map_pp(pp_byte):
|
||||
|
||||
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):
|
||||
@@ -144,22 +143,16 @@ 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(
|
||||
self._type))
|
||||
raise RuntimeError("Could not convert to IID. Invalid MAC address type: {}".format(self._type))
|
||||
|
||||
@classmethod
|
||||
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)))
|
||||
raise RuntimeError("Could not create MAC address from EUI64. Invalid data type: {}".format(type(eui64)))
|
||||
|
||||
return cls(eui64, MacAddressType.LONG)
|
||||
|
||||
@@ -170,16 +163,12 @@ class MacAddress(object):
|
||||
elif isinstance(rloc16, bytearray):
|
||||
mac_address = rloc16[:2]
|
||||
else:
|
||||
raise RuntimeError(
|
||||
"Could not create MAC address from RLOC16. Invalid data type: {}"
|
||||
.format(type(rloc16)))
|
||||
raise RuntimeError("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)
|
||||
return (self.type == other.type) and (self.mac_address == other.mac_address)
|
||||
|
||||
def __repr__(self):
|
||||
return "MacAddress(mac_address=b'{}', type={})".format(
|
||||
hexlify(self.mac_address), MacAddressType(self._type))
|
||||
return "MacAddress(mac_address=b'{}', type={})".format(hexlify(self.mac_address), MacAddressType(self._type))
|
||||
|
||||
+126
-258
@@ -86,8 +86,7 @@ DEFAULT_MASTER_KEY = bytearray([
|
||||
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,
|
||||
@@ -117,9 +116,8 @@ 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.HasRouteFactory(routes_factory=network_data.RoutesFactory(
|
||||
route_factory=network_data.RouteFactory())),
|
||||
network_data.TlvType.BORDER_ROUTER:
|
||||
network_data.BorderRouterFactory(),
|
||||
network_data.TlvType.LOWPAN_ID:
|
||||
@@ -129,8 +127,7 @@ def create_default_network_data_prefix_sub_tlvs_factories():
|
||||
|
||||
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():
|
||||
@@ -139,62 +136,46 @@ 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.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.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(
|
||||
)),
|
||||
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())
|
||||
return network_data.NetworkDataTlvsFactory(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())
|
||||
return mle.NetworkDataFactory(network_data_tlvs_factory=create_default_network_data_tlvs_factory())
|
||||
|
||||
|
||||
def create_default_mle_tlv_address_registration_factory():
|
||||
@@ -205,104 +186,65 @@ 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())
|
||||
return mle.ThreadDiscoveryFactory(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())
|
||||
return mesh_cop.ThreadDiscoveryTlvsFactory(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))
|
||||
return net_crypto.CryptoEngine(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()),
|
||||
mle_command_factory=mle.MleCommandFactory(tlvs_factories=create_default_mle_tlvs_factories()),
|
||||
crypto_engine=create_default_mle_crypto_engine(master_key),
|
||||
)
|
||||
|
||||
@@ -328,8 +270,7 @@ def create_deafult_network_tlvs_factories():
|
||||
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.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
|
||||
@@ -342,134 +283,78 @@ def create_deafult_network_tlvs_factories():
|
||||
|
||||
|
||||
def create_default_network_tlvs_factory():
|
||||
return SubTlvsFactory(
|
||||
sub_tlvs_factories=create_deafult_network_tlvs_factories())
|
||||
return SubTlvsFactory(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())
|
||||
return SubTlvsFactory(sub_tlvs_factories=create_default_mesh_cop_tlvs_factories())
|
||||
|
||||
|
||||
def create_default_network_diag_tlv_factories():
|
||||
return {
|
||||
network_diag.TlvType.EXT_ADDRESS:
|
||||
network_layer.MacExtendedAddressFactory(),
|
||||
network_diag.TlvType.ADDRESS16:
|
||||
mle.Address16Factory(),
|
||||
network_diag.TlvType.MODE:
|
||||
mle.ModeFactory(),
|
||||
network_diag.TlvType.POLLING_PERIOD:
|
||||
mle.TimeoutFactory(),
|
||||
network_diag.TlvType.CONNECTIVITY:
|
||||
mle.ConnectivityFactory(),
|
||||
network_diag.TlvType.ROUTE64:
|
||||
create_default_mle_tlv_route64_factory(),
|
||||
network_diag.TlvType.LEADER_DATA:
|
||||
mle.LeaderDataFactory(),
|
||||
network_diag.TlvType.NETWORK_DATA:
|
||||
create_default_mle_tlv_network_data_factory(),
|
||||
network_diag.TlvType.IPV6_ADDRESS_LIST:
|
||||
network_diag.Ipv6AddressListFactory(),
|
||||
network_diag.TlvType.MAC_COUNTERS:
|
||||
network_diag.MacCountersFactory(),
|
||||
network_diag.TlvType.BATTERY_LEVEL:
|
||||
network_diag.BatteryLevelFactory(),
|
||||
network_diag.TlvType.SUPPLY_VOLTAGE:
|
||||
network_diag.SupplyVoltageFactory(),
|
||||
network_diag.TlvType.CHILD_TABLE:
|
||||
network_diag.ChildTableFactory(),
|
||||
network_diag.TlvType.CHANNEL_PAGES:
|
||||
network_diag.ChannelPagesFactory(),
|
||||
network_diag.TlvType.TYPE_LIST:
|
||||
network_diag.TypeListFactory(),
|
||||
network_diag.TlvType.MAX_CHILD_TIMEOUT:
|
||||
network_diag.MaxChildTimeoutFactory()
|
||||
network_diag.TlvType.EXT_ADDRESS: network_layer.MacExtendedAddressFactory(),
|
||||
network_diag.TlvType.ADDRESS16: mle.Address16Factory(),
|
||||
network_diag.TlvType.MODE: mle.ModeFactory(),
|
||||
network_diag.TlvType.POLLING_PERIOD: mle.TimeoutFactory(),
|
||||
network_diag.TlvType.CONNECTIVITY: mle.ConnectivityFactory(),
|
||||
network_diag.TlvType.ROUTE64: create_default_mle_tlv_route64_factory(),
|
||||
network_diag.TlvType.LEADER_DATA: mle.LeaderDataFactory(),
|
||||
network_diag.TlvType.NETWORK_DATA: create_default_mle_tlv_network_data_factory(),
|
||||
network_diag.TlvType.IPV6_ADDRESS_LIST: network_diag.Ipv6AddressListFactory(),
|
||||
network_diag.TlvType.MAC_COUNTERS: network_diag.MacCountersFactory(),
|
||||
network_diag.TlvType.BATTERY_LEVEL: network_diag.BatteryLevelFactory(),
|
||||
network_diag.TlvType.SUPPLY_VOLTAGE: network_diag.SupplyVoltageFactory(),
|
||||
network_diag.TlvType.CHILD_TABLE: network_diag.ChildTableFactory(),
|
||||
network_diag.TlvType.CHANNEL_PAGES: network_diag.ChannelPagesFactory(),
|
||||
network_diag.TlvType.TYPE_LIST: network_diag.TypeListFactory(),
|
||||
network_diag.TlvType.MAX_CHILD_TIMEOUT: network_diag.MaxChildTimeoutFactory()
|
||||
}
|
||||
|
||||
|
||||
def create_default_network_diag_tlvs_factory():
|
||||
return SubTlvsFactory(
|
||||
sub_tlvs_factories=create_default_network_diag_tlv_factories())
|
||||
return SubTlvsFactory(sub_tlvs_factories=create_default_network_diag_tlv_factories())
|
||||
|
||||
|
||||
def create_default_uri_path_based_payload_factories():
|
||||
@@ -499,8 +384,7 @@ 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(),
|
||||
)
|
||||
|
||||
@@ -510,8 +394,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())
|
||||
return ipv6.HopByHopOptionsFactory(options_factories=create_default_ipv6_hop_by_hop_options_factories())
|
||||
|
||||
|
||||
def create_default_based_on_src_dst_ports_udp_payload_factory(master_key):
|
||||
@@ -535,14 +418,10 @@ 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(),
|
||||
}
|
||||
|
||||
|
||||
@@ -551,31 +430,24 @@ def create_default_ipv6_upper_layer_factories(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),
|
||||
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.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())
|
||||
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())
|
||||
ipv6.HopByHopFactory(hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())
|
||||
}
|
||||
|
||||
|
||||
@@ -588,11 +460,9 @@ 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),
|
||||
lowpan_ip_header_factory=lowpan.LowpanIpv6HeaderFactory(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(),
|
||||
)
|
||||
|
||||
@@ -604,13 +474,11 @@ 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),
|
||||
)
|
||||
|
||||
|
||||
@@ -92,8 +92,7 @@ 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,10 +101,8 @@ 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):
|
||||
@@ -115,8 +112,7 @@ 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(
|
||||
@@ -161,12 +157,9 @@ 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,8 +189,7 @@ 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):
|
||||
@@ -207,8 +199,7 @@ class ProtocolVersion(ConvertibleToBytes, BuildableFromBytes):
|
||||
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)
|
||||
@@ -219,8 +210,7 @@ class ProtocolVersion(ConvertibleToBytes, BuildableFromBytes):
|
||||
return cls(major, minor)
|
||||
|
||||
def __repr__(self):
|
||||
return "ProtocolVersion(major={}, minor={})".format(
|
||||
self.major, self.minor)
|
||||
return "ProtocolVersion(major={}, minor={})".format(self.major, self.minor)
|
||||
|
||||
|
||||
class Random(ConvertibleToBytes, BuildableFromBytes):
|
||||
@@ -233,8 +223,7 @@ 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
|
||||
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):
|
||||
@@ -259,9 +248,7 @@ 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
|
||||
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):
|
||||
@@ -362,13 +349,11 @@ class Extension(ConvertibleToBytes, BuildableFromBytes):
|
||||
self.extension_data = extension_data
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(self, type(other)) and
|
||||
self.extension_type == other.extension_type and
|
||||
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):
|
||||
@@ -398,10 +383,8 @@ 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() +
|
||||
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
|
||||
@@ -410,14 +393,11 @@ class ClientHello(HandshakeMessage):
|
||||
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)
|
||||
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,
|
||||
@@ -464,9 +444,8 @@ 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):
|
||||
@@ -477,8 +456,7 @@ 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,
|
||||
@@ -565,15 +543,13 @@ 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)
|
||||
@@ -590,8 +566,7 @@ 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
|
||||
|
||||
@@ -651,10 +626,8 @@ class MessageFactory(object):
|
||||
if record.version.major != 0xfe or record.version.minor != 0xFD:
|
||||
raise ValueError("DTLS version error, expect DTLSv1.2")
|
||||
|
||||
last_msg_is_change_cipher_spec = type(
|
||||
self).last_msg_is_change_cipher_spec
|
||||
type(self).last_msg_is_change_cipher_spec = (
|
||||
record.content_type == ContentType.CHANGE_CIPHER_SPEC)
|
||||
last_msg_is_change_cipher_spec = type(self).last_msg_is_change_cipher_spec
|
||||
type(self).last_msg_is_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
|
||||
|
||||
@@ -78,10 +78,7 @@ def calculate_checksum(data):
|
||||
"""
|
||||
# Create halfwords from data bytes. Example: data[0] = 0x01, data[1] =
|
||||
# 0xb2 => 0x01b2
|
||||
halfwords = [
|
||||
((byte0 << 8) | byte1)
|
||||
for byte0, byte1 in zip_longest(data[::2], data[1::2], fillvalue=0x00)
|
||||
]
|
||||
halfwords = [((byte0 << 8) | byte1) for byte0, byte1 in zip_longest(data[::2], data[1::2], fillvalue=0x00)]
|
||||
|
||||
checksum = 0
|
||||
for halfword in halfwords:
|
||||
@@ -202,11 +199,9 @@ class IPv6PseudoHeader(ConvertibleToBytes):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, source_address, destination_address, payload_length,
|
||||
next_header):
|
||||
def __init__(self, source_address, destination_address, payload_length, next_header):
|
||||
self._source_address = self._convert_to_ipaddress(source_address)
|
||||
self._destination_address = self._convert_to_ipaddress(
|
||||
destination_address)
|
||||
self._destination_address = self._convert_to_ipaddress(destination_address)
|
||||
self.payload_length = payload_length
|
||||
self.next_header = next_header
|
||||
|
||||
@@ -261,8 +256,7 @@ class IPv6Header(ConvertibleToBytes, BuildableFromBytes):
|
||||
):
|
||||
self.version = self._version
|
||||
self._source_address = self._convert_to_ipaddress(source_address)
|
||||
self._destination_address = self._convert_to_ipaddress(
|
||||
destination_address)
|
||||
self._destination_address = self._convert_to_ipaddress(destination_address)
|
||||
self.traffic_class = traffic_class
|
||||
self.flow_label = flow_label
|
||||
self.hop_limit = hop_limit
|
||||
@@ -290,8 +284,7 @@ class IPv6Header(ConvertibleToBytes, BuildableFromBytes):
|
||||
def to_bytes(self):
|
||||
data = bytearray([
|
||||
((self.version & 0x0F) << 4) | ((self.traffic_class >> 4) & 0x0F),
|
||||
((self.traffic_class & 0x0F) << 4) |
|
||||
((self.flow_label >> 16) & 0x0F),
|
||||
((self.traffic_class & 0x0F) << 4) | ((self.flow_label >> 16) & 0x0F),
|
||||
((self.flow_label >> 8) & 0xff),
|
||||
((self.flow_label & 0xff)),
|
||||
])
|
||||
@@ -388,16 +381,12 @@ class IPv6Packet(ConvertibleToBytes):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
ipv6_header,
|
||||
upper_layer_protocol,
|
||||
extension_headers=None):
|
||||
def __init__(self, ipv6_header, upper_layer_protocol, extension_headers=None):
|
||||
self.ipv6_header = ipv6_header
|
||||
|
||||
self.upper_layer_protocol = upper_layer_protocol
|
||||
|
||||
self.extension_headers = (extension_headers
|
||||
if extension_headers is not None else [])
|
||||
self.extension_headers = (extension_headers if extension_headers is not None else [])
|
||||
|
||||
self._update_next_header_values_in_headers()
|
||||
|
||||
@@ -409,16 +398,13 @@ class IPv6Packet(ConvertibleToBytes):
|
||||
|
||||
if self.upper_layer_protocol.checksum != checksum:
|
||||
raise RuntimeError("Could not create IPv6 packet. "
|
||||
"Invalid checksum: {}!={}".format(
|
||||
self.upper_layer_protocol.checksum,
|
||||
checksum))
|
||||
"Invalid checksum: {}!={}".format(self.upper_layer_protocol.checksum, checksum))
|
||||
|
||||
self.upper_layer_protocol.checksum = checksum
|
||||
|
||||
def _update_payload_length_value_in_ipv6_header(self):
|
||||
self.ipv6_header.payload_length = len(self.upper_layer_protocol) + sum([
|
||||
len(extension_header) for extension_header in self.extension_headers
|
||||
])
|
||||
self.ipv6_header.payload_length = len(self.upper_layer_protocol) + sum(
|
||||
[len(extension_header) for extension_header in self.extension_headers])
|
||||
|
||||
def _update_next_header_values_in_headers(self):
|
||||
last_header = self.ipv6_header
|
||||
@@ -445,8 +431,7 @@ class IPv6Packet(ConvertibleToBytes):
|
||||
self.upper_layer_protocol.type,
|
||||
)
|
||||
|
||||
return calculate_checksum(pseudo_header.to_bytes() +
|
||||
upper_layer_protocol_bytes)
|
||||
return calculate_checksum(pseudo_header.to_bytes() + upper_layer_protocol_bytes)
|
||||
|
||||
def to_bytes(self):
|
||||
self._update_payload_length_value_in_ipv6_header()
|
||||
@@ -463,8 +448,7 @@ class IPv6Packet(ConvertibleToBytes):
|
||||
return ipv6_packet
|
||||
|
||||
def __repr__(self):
|
||||
return "IPv6Packet(header={}, upper_layer_protocol={})".format(
|
||||
self.ipv6_header, self.upper_layer_protocol)
|
||||
return "IPv6Packet(header={}, upper_layer_protocol={})".format(self.ipv6_header, self.upper_layer_protocol)
|
||||
|
||||
|
||||
class UDPHeader(ConvertibleToBytes, BuildableFromBytes):
|
||||
@@ -568,8 +552,7 @@ class ICMPv6Header(ConvertibleToBytes, BuildableFromBytes):
|
||||
self.checksum = checksum
|
||||
|
||||
def to_bytes(self):
|
||||
return bytearray([self.type, self.code]) + struct.pack(
|
||||
">H", self.checksum)
|
||||
return bytearray([self.type, self.code]) + struct.pack(">H", self.checksum)
|
||||
|
||||
@classmethod
|
||||
def from_bytes(cls, data):
|
||||
@@ -643,11 +626,7 @@ class FragmentHeader(ExtensionHeader):
|
||||
def offset(self):
|
||||
return self._fragm_offset
|
||||
|
||||
def __init__(self,
|
||||
next_header=None,
|
||||
fragm_offset=0,
|
||||
more_flag=False,
|
||||
identification=0):
|
||||
def __init__(self, next_header=None, fragm_offset=0, more_flag=False, identification=0):
|
||||
super(FragmentHeader, self).__init__(next_header, 0)
|
||||
self._fragm_offset = fragm_offset
|
||||
self._more_flag = more_flag
|
||||
@@ -658,10 +637,7 @@ class FragmentHeader(ExtensionHeader):
|
||||
|
||||
def to_bytes(self):
|
||||
data = bytearray([self.next_header, 0x00])
|
||||
data += bytearray([
|
||||
self._fragm_offset >> 5,
|
||||
((self._fragm_offset << 3) | self._more_flag) & 0xff
|
||||
])
|
||||
data += bytearray([self._fragm_offset >> 5, ((self._fragm_offset << 3) | self._more_flag) & 0xff])
|
||||
data += struct.pack(">I", self._identification)
|
||||
|
||||
return data
|
||||
@@ -783,8 +759,7 @@ class HopByHopOptionHeader(ConvertibleToBytes, BuildableFromBytes):
|
||||
return self._header_length
|
||||
|
||||
def __repr__(self):
|
||||
return "HopByHopOptionHeader(type={}, length={})".format(
|
||||
self.type, self.length)
|
||||
return "HopByHopOptionHeader(type={}, length={})".format(self.type, self.length)
|
||||
|
||||
|
||||
class HopByHopOption(ConvertibleToBytes):
|
||||
@@ -814,8 +789,7 @@ class HopByHopOption(ConvertibleToBytes):
|
||||
return len(self.header) + len(self.value)
|
||||
|
||||
def __repr__(self):
|
||||
return "HopByHopOption(header={}, value={})".format(
|
||||
self.header, self.value)
|
||||
return "HopByHopOption(header={}, value={})".format(self.header, self.value)
|
||||
|
||||
|
||||
class MPLOption(ConvertibleToBytes):
|
||||
@@ -833,8 +807,7 @@ class MPLOption(ConvertibleToBytes):
|
||||
self.seed_id = seed_id
|
||||
|
||||
def to_bytes(self):
|
||||
smv = (((self.S & 0x03) << 6) | ((self.M & 0x01) << 5) |
|
||||
((self.V & 0x01) << 4))
|
||||
smv = (((self.S & 0x03) << 6) | ((self.M & 0x01) << 5) | ((self.V & 0x01) << 4))
|
||||
|
||||
return bytearray([smv, self.sequence]) + self.seed_id
|
||||
|
||||
@@ -855,8 +828,8 @@ class MPLOption(ConvertibleToBytes):
|
||||
return self._header_length + self._seed_id_length[self.S]
|
||||
|
||||
def __repr__(self):
|
||||
return "MPLOption(S={}, M={}, V={}, sequence={}, seed_id={})".format(
|
||||
self.S, self.M, self.V, self.sequence, hexlify(self.seed_id))
|
||||
return "MPLOption(S={}, M={}, V={}, sequence={}, seed_id={})".format(self.S, self.M, self.V, self.sequence,
|
||||
hexlify(self.seed_id))
|
||||
|
||||
|
||||
class IPv6PacketFactory(PacketFactory):
|
||||
@@ -919,17 +892,13 @@ class IPv6PacketFactory(PacketFactory):
|
||||
try:
|
||||
return self._ehf[next_header]
|
||||
except KeyError:
|
||||
raise RuntimeError(
|
||||
"Could not get Extension Header factory for next_header={}.".
|
||||
format(next_header))
|
||||
raise RuntimeError("Could not get Extension Header factory for next_header={}.".format(next_header))
|
||||
|
||||
def _get_upper_layer_protocol_factory_for(self, next_header):
|
||||
try:
|
||||
return self._ulpf[next_header]
|
||||
except KeyError:
|
||||
raise RuntimeError(
|
||||
"Could not get Upper Layer Protocol factory for next_header={}."
|
||||
.format(next_header))
|
||||
raise RuntimeError("Could not get Upper Layer Protocol factory for next_header={}.".format(next_header))
|
||||
|
||||
def _parse_extension_headers(self, data, next_header, message_info):
|
||||
extension_headers = []
|
||||
@@ -956,11 +925,9 @@ class IPv6PacketFactory(PacketFactory):
|
||||
message_info.source_ipv6 = ipv6_header.source_address
|
||||
message_info.destination_ipv6 = ipv6_header.destination_address
|
||||
|
||||
next_header, extension_headers = self._parse_extension_headers(
|
||||
data, ipv6_header.next_header, message_info)
|
||||
next_header, extension_headers = self._parse_extension_headers(data, ipv6_header.next_header, message_info)
|
||||
|
||||
upper_layer_protocol = self._parse_upper_layer_protocol(
|
||||
data, next_header, message_info)
|
||||
upper_layer_protocol = self._parse_upper_layer_protocol(data, next_header, message_info)
|
||||
|
||||
return IPv6Packet(ipv6_header, upper_layer_protocol, extension_headers)
|
||||
|
||||
@@ -972,16 +939,13 @@ class HopByHopOptionsFactory(object):
|
||||
_many_bytes_padding = 0x01
|
||||
|
||||
def __init__(self, options_factories=None):
|
||||
self._options_factories = (options_factories
|
||||
if options_factories is not None else {})
|
||||
self._options_factories = (options_factories if options_factories is not None else {})
|
||||
|
||||
def _get_HopByHopOption_value_factory(self, _type):
|
||||
try:
|
||||
return self._options_factories[_type]
|
||||
except KeyError:
|
||||
raise RuntimeError(
|
||||
"Could not find HopByHopOption value factory for type={}.".
|
||||
format(_type))
|
||||
raise RuntimeError("Could not find HopByHopOption value factory for type={}.".format(_type))
|
||||
|
||||
def parse(self, data, message_info):
|
||||
options = []
|
||||
@@ -998,8 +962,7 @@ class HopByHopOptionsFactory(object):
|
||||
data.read(option_header.length)
|
||||
|
||||
else:
|
||||
factory = self._get_HopByHopOption_value_factory(
|
||||
option_header.type)
|
||||
factory = self._get_HopByHopOption_value_factory(option_header.type)
|
||||
|
||||
option_data = data.read(option_header.length)
|
||||
|
||||
@@ -1029,13 +992,11 @@ class HopByHopFactory(PacketFactory):
|
||||
|
||||
# Note! Two bytes were read (next_header and hdr_ext_len) so they must
|
||||
# be substracted from header length
|
||||
hop_by_hop_length = (
|
||||
self._calculate_extension_header_length(hdr_ext_len) - 2)
|
||||
hop_by_hop_length = (self._calculate_extension_header_length(hdr_ext_len) - 2)
|
||||
|
||||
hop_by_hop_data = data.read(hop_by_hop_length)
|
||||
|
||||
options = self._hop_by_hop_options_factory.parse(
|
||||
io.BytesIO(hop_by_hop_data), message_info)
|
||||
options = self._hop_by_hop_options_factory.parse(io.BytesIO(hop_by_hop_data), message_info)
|
||||
|
||||
hop_by_hop = HopByHop(next_header, options, hdr_ext_len)
|
||||
|
||||
@@ -1103,8 +1064,7 @@ class UDPDatagramFactory(PacketFactory):
|
||||
header = self._udp_header_factory.parse(data, message_info)
|
||||
|
||||
# Update message payload length: UDP header (8B) + payload length
|
||||
message_info.payload_length += len(header) + (len(data.getvalue()) -
|
||||
data.tell())
|
||||
message_info.payload_length += len(header) + (len(data.getvalue()) - data.tell())
|
||||
|
||||
message_info.src_port = header.src_port
|
||||
message_info.dst_port = header.dst_port
|
||||
@@ -1118,8 +1078,7 @@ class ICMPv6Factory(PacketFactory):
|
||||
""" Factory that produces ICMPv6 messages from data. """
|
||||
|
||||
def __init__(self, body_factories=None):
|
||||
self._body_factories = (body_factories
|
||||
if body_factories is not None else {})
|
||||
self._body_factories = (body_factories if body_factories is not None else {})
|
||||
|
||||
def _get_icmpv6_body_factory(self, _type):
|
||||
try:
|
||||
@@ -1127,9 +1086,8 @@ class ICMPv6Factory(PacketFactory):
|
||||
|
||||
except KeyError:
|
||||
if "default" not in self._body_factories:
|
||||
raise RuntimeError(
|
||||
"Could not find specialized factory to parse ICMP body. "
|
||||
"Unsupported ICMP type: {}".format(_type))
|
||||
raise RuntimeError("Could not find specialized factory to parse ICMP body. "
|
||||
"Unsupported ICMP type: {}".format(_type))
|
||||
|
||||
default_factory = self._body_factories["default"]
|
||||
|
||||
@@ -1143,8 +1101,7 @@ class ICMPv6Factory(PacketFactory):
|
||||
|
||||
factory = self._get_icmpv6_body_factory(header.type)
|
||||
|
||||
message_info.payload_length += len(header) + (len(data.getvalue()) -
|
||||
data.tell())
|
||||
message_info.payload_length += len(header) + (len(data.getvalue()) - data.tell())
|
||||
|
||||
return ICMPv6(header, factory.parse(data, message_info))
|
||||
|
||||
@@ -1233,8 +1190,7 @@ class ICMPv6DestinationUnreachable(ConvertibleToBytes, BuildableFromBytes):
|
||||
unused = struct.unpack(">I", data.read(4))[0]
|
||||
if unused != 0:
|
||||
raise RuntimeError(
|
||||
"Invalid value of unused field in the ICMPv6 Destination Unreachable data. Expected value: 0."
|
||||
)
|
||||
"Invalid value of unused field in the ICMPv6 Destination Unreachable data. Expected value: 0.")
|
||||
|
||||
return cls(bytearray(data.read()))
|
||||
|
||||
|
||||
@@ -220,8 +220,7 @@ class LowpanHopByHopFactory:
|
||||
|
||||
ext_header_data = data.read(ext_header_length)
|
||||
|
||||
options = self._hop_by_hop_options_factory.parse(
|
||||
io.BytesIO(ext_header_data), message_info)
|
||||
options = self._hop_by_hop_options_factory.parse(io.BytesIO(ext_header_data), message_info)
|
||||
|
||||
ext_header = ipv6.HopByHop(next_header, options)
|
||||
|
||||
@@ -237,8 +236,7 @@ class LowpanExtensionHeadersFactory:
|
||||
NHC_NH_COMPRESSED = 1
|
||||
|
||||
def __init__(self, ext_headers_factories):
|
||||
self._ext_headers_factories = (
|
||||
ext_headers_factories if ext_headers_factories is not None else {})
|
||||
self._ext_headers_factories = (ext_headers_factories if ext_headers_factories is not None else {})
|
||||
|
||||
def _decompress_nh(self, hc, data):
|
||||
if hc.nh == self.NHC_NH_INLINE:
|
||||
@@ -252,9 +250,7 @@ class LowpanExtensionHeadersFactory:
|
||||
return self._ext_headers_factories[eid]
|
||||
|
||||
except BaseException:
|
||||
raise RuntimeError(
|
||||
"Could not find an extension header factory for the EID type: {}"
|
||||
.format(eid))
|
||||
raise RuntimeError("Could not find an extension header factory for the EID type: {}".format(eid))
|
||||
|
||||
def parse(self, data, message_info):
|
||||
nhc = LowpanNHC.from_bytes(bytearray(data.read(1)))
|
||||
@@ -332,8 +328,7 @@ class Context:
|
||||
|
||||
elif isinstance(prefix, bytearray):
|
||||
self._prefix = prefix
|
||||
self._prefix_length = (prefix_length if prefix_length is not None
|
||||
else len(self._prefix) * 8)
|
||||
self._prefix_length = (prefix_length if prefix_length is not None else len(self._prefix) * 8)
|
||||
|
||||
@property
|
||||
def prefix(self):
|
||||
@@ -368,9 +363,7 @@ class ContextManager(dict):
|
||||
|
||||
def __check_index(self, index):
|
||||
if index < 0 or index > 15:
|
||||
raise IndexError(
|
||||
"Invalid index: {}. Valid index is in range [0, 15]".format(
|
||||
index))
|
||||
raise IndexError("Invalid index: {}. Valid index is in range [0, 15]".format(index))
|
||||
|
||||
def __check_type(self, value):
|
||||
if not isinstance(value, Context):
|
||||
@@ -391,8 +384,7 @@ class ContextManager(dict):
|
||||
class LowpanIpv6HeaderFactory:
|
||||
""" Factory that produces IPv6 header. """
|
||||
|
||||
IPV6_LINKLOCAL_PREFIX = bytearray(
|
||||
[0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
||||
IPV6_LINKLOCAL_PREFIX = bytearray([0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
||||
|
||||
SHORT_ADDR_PADDING_BYTES = bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00])
|
||||
|
||||
@@ -546,8 +538,7 @@ class LowpanIpv6HeaderFactory:
|
||||
return self.IPV6_LINKLOCAL_PREFIX + bytearray(data.read(8))
|
||||
|
||||
elif iphc.sam == self.IPHC_SAM_16B:
|
||||
return (self.IPV6_LINKLOCAL_PREFIX + self.SHORT_ADDR_PADDING_BYTES +
|
||||
bytearray(data.read(2)))
|
||||
return (self.IPV6_LINKLOCAL_PREFIX + self.SHORT_ADDR_PADDING_BYTES + bytearray(data.read(2)))
|
||||
|
||||
elif iphc.sam == self.IPHC_SAM_ELIDED:
|
||||
return self.IPV6_LINKLOCAL_PREFIX + src_mac_addr.convert_to_iid()
|
||||
@@ -587,10 +578,8 @@ class LowpanIpv6HeaderFactory:
|
||||
prefix_overlapping_byte = prefix[prefix_length_all_bytes - 1]
|
||||
address_overlapping_byte = address_bytes[-required_bytes]
|
||||
|
||||
overlapping_byte = prefix_overlapping_byte & ~(
|
||||
0xff >> prefix_length_rest_bits)
|
||||
overlapping_byte |= address_overlapping_byte & (
|
||||
0xff >> prefix_length_rest_bits)
|
||||
overlapping_byte = prefix_overlapping_byte & ~(0xff >> prefix_length_rest_bits)
|
||||
overlapping_byte |= address_overlapping_byte & (0xff >> prefix_length_rest_bits)
|
||||
|
||||
src_addr += bytearray([overlapping_byte])
|
||||
required_bytes -= 1
|
||||
@@ -602,8 +591,7 @@ class LowpanIpv6HeaderFactory:
|
||||
required_bytes -= prefix_length_all_bytes
|
||||
required_bytes -= len(address_bytes)
|
||||
|
||||
src_addr = (prefix[:prefix_length_all_bytes] +
|
||||
bytearray([0x00] * required_bytes) + address_bytes)
|
||||
src_addr = (prefix[:prefix_length_all_bytes] + bytearray([0x00] * required_bytes) + address_bytes)
|
||||
|
||||
return src_addr
|
||||
|
||||
@@ -622,8 +610,7 @@ class LowpanIpv6HeaderFactory:
|
||||
|
||||
elif iphc.sam == self.IPHC_SAM_16B:
|
||||
context = self._context_manager[sci]
|
||||
address_bytes = self.SHORT_ADDR_PADDING_BYTES + bytearray(
|
||||
data.read(2))
|
||||
address_bytes = self.SHORT_ADDR_PADDING_BYTES + bytearray(data.read(2))
|
||||
|
||||
return self._merge_prefix_with_address(
|
||||
prefix=context.prefix,
|
||||
@@ -645,8 +632,7 @@ class LowpanIpv6HeaderFactory:
|
||||
return self._decompress_src_addr_stateless(iphc, src_mac_addr, data)
|
||||
|
||||
elif iphc.sac == self.IPHC_SAC_STATEFUL:
|
||||
return self._decompress_src_addr_stateful(iphc, src_mac_addr, sci,
|
||||
data)
|
||||
return self._decompress_src_addr_stateful(iphc, src_mac_addr, sci, data)
|
||||
|
||||
def _decompress_unicast_dst_addr_stateless(self, iphc, dst_mac_addr, data):
|
||||
if iphc.dam == self.IPHC_DAM_128B:
|
||||
@@ -656,14 +642,12 @@ class LowpanIpv6HeaderFactory:
|
||||
return self.IPV6_LINKLOCAL_PREFIX + bytearray(data.read(8))
|
||||
|
||||
elif iphc.dam == self.IPHC_DAM_16B:
|
||||
return (self.IPV6_LINKLOCAL_PREFIX + self.SHORT_ADDR_PADDING_BYTES +
|
||||
bytearray(data.read(2)))
|
||||
return (self.IPV6_LINKLOCAL_PREFIX + self.SHORT_ADDR_PADDING_BYTES + bytearray(data.read(2)))
|
||||
|
||||
elif iphc.dam == self.IPHC_DAM_ELIDED:
|
||||
return self.IPV6_LINKLOCAL_PREFIX + dst_mac_addr.convert_to_iid()
|
||||
|
||||
def _decompress_unicast_dst_addr_stateful(self, iphc, dst_mac_addr, dci,
|
||||
data):
|
||||
def _decompress_unicast_dst_addr_stateful(self, iphc, dst_mac_addr, dci, data):
|
||||
if iphc.dam == self.IPHC_DAM_128B:
|
||||
raise RuntimeError("Reserved")
|
||||
|
||||
@@ -678,8 +662,7 @@ class LowpanIpv6HeaderFactory:
|
||||
|
||||
elif iphc.dam == self.IPHC_DAM_16B:
|
||||
context = self._context_manager[dci]
|
||||
address_bytes = self.SHORT_ADDR_PADDING_BYTES + bytearray(
|
||||
data.read(2))
|
||||
address_bytes = self.SHORT_ADDR_PADDING_BYTES + bytearray(data.read(2))
|
||||
|
||||
return self._merge_prefix_with_address(
|
||||
prefix=context.prefix,
|
||||
@@ -698,12 +681,10 @@ class LowpanIpv6HeaderFactory:
|
||||
|
||||
def _decompress_unicast_dst_addr(self, iphc, dst_mac_addr, dci, data):
|
||||
if iphc.dac == self.IPHC_DAC_STATELESS:
|
||||
return self._decompress_unicast_dst_addr_stateless(
|
||||
iphc, dst_mac_addr, data)
|
||||
return self._decompress_unicast_dst_addr_stateless(iphc, dst_mac_addr, data)
|
||||
|
||||
elif iphc.dac == self.IPHC_DAC_STATEFUL:
|
||||
return self._decompress_unicast_dst_addr_stateful(
|
||||
iphc, dst_mac_addr, dci, data)
|
||||
return self._decompress_unicast_dst_addr_stateful(iphc, dst_mac_addr, dci, data)
|
||||
|
||||
def _decompress_multicast_dst_addr_stateless(self, iphc, data):
|
||||
if iphc.dam == self.IPHC_DAM_128B:
|
||||
@@ -711,17 +692,14 @@ class LowpanIpv6HeaderFactory:
|
||||
|
||||
elif iphc.dam == self.IPHC_DAM_48B:
|
||||
addr48b = bytearray(data.read(6))
|
||||
return (bytearray([0xff, addr48b[0]]) + bytearray([0x00] * 9) +
|
||||
addr48b[1:])
|
||||
return (bytearray([0xff, addr48b[0]]) + bytearray([0x00] * 9) + addr48b[1:])
|
||||
|
||||
elif iphc.dam == self.IPHC_DAM_32B:
|
||||
addr32b = bytearray(data.read(4))
|
||||
return (bytearray([0xff, addr32b[0]]) + bytearray([0x00] * 11) +
|
||||
addr32b[1:])
|
||||
return (bytearray([0xff, addr32b[0]]) + bytearray([0x00] * 11) + addr32b[1:])
|
||||
|
||||
elif iphc.dam == self.IPHC_DAM_8B:
|
||||
return (bytearray([0xff, 0x02]) + bytearray([0x00] * 13) +
|
||||
data.read(1))
|
||||
return (bytearray([0xff, 0x02]) + bytearray([0x00] * 13) + data.read(1))
|
||||
|
||||
def _decompress_multicast_dst_addr_stateful(self, iphc, dci, data):
|
||||
if iphc.dam == self.IPHC_M_DAM_00:
|
||||
@@ -739,8 +717,7 @@ class LowpanIpv6HeaderFactory:
|
||||
if missing_bytes > 0:
|
||||
prefix += bytearray([0x00] * missing_bytes)
|
||||
|
||||
return (bytearray([0xff]) + addr48b[:2] +
|
||||
bytearray([prefix_length]) + prefix + addr48b[2:])
|
||||
return (bytearray([0xff]) + addr48b[:2] + bytearray([prefix_length]) + prefix + addr48b[2:])
|
||||
|
||||
elif iphc.dam == self.IPHC_M_DAM_01:
|
||||
raise RuntimeError("Reserved")
|
||||
@@ -760,8 +737,7 @@ class LowpanIpv6HeaderFactory:
|
||||
|
||||
def _decompress_dst_addr(self, iphc, dst_mac_addr, dci, data):
|
||||
if iphc.m == self.IPHC_M_NO:
|
||||
return self._decompress_unicast_dst_addr(iphc, dst_mac_addr, dci,
|
||||
data)
|
||||
return self._decompress_unicast_dst_addr(iphc, dst_mac_addr, dci, data)
|
||||
|
||||
elif iphc.m == self.IPHC_M_YES:
|
||||
return self._decompress_multicast_dst_addr(iphc, dci, data)
|
||||
@@ -780,15 +756,11 @@ class LowpanIpv6HeaderFactory:
|
||||
|
||||
hop_limit = self._decompress_hlim(iphc, data)
|
||||
|
||||
src_address = self._decompress_src_addr(iphc,
|
||||
message_info.source_mac_address,
|
||||
sci, data)
|
||||
src_address = self._decompress_src_addr(iphc, message_info.source_mac_address, sci, data)
|
||||
|
||||
dst_address = self._decompress_dst_addr(
|
||||
iphc, message_info.destination_mac_address, dci, data)
|
||||
dst_address = self._decompress_dst_addr(iphc, message_info.destination_mac_address, dci, data)
|
||||
|
||||
header = ipv6.IPv6Header(src_address, dst_address, traffic_class,
|
||||
flow_label, hop_limit)
|
||||
header = ipv6.IPv6Header(src_address, dst_address, traffic_class, flow_label, hop_limit)
|
||||
|
||||
header.next_header = next_header
|
||||
|
||||
@@ -805,8 +777,7 @@ class LowpanDecompressor:
|
||||
lowpan_udp_header_factory,
|
||||
):
|
||||
self._lowpan_ip_header_factory = lowpan_ip_header_factory
|
||||
self._lowpan_extension_headers_factory = (
|
||||
lowpan_extension_headers_factory)
|
||||
self._lowpan_extension_headers_factory = (lowpan_extension_headers_factory)
|
||||
self._lowpan_udp_header_factory = lowpan_udp_header_factory
|
||||
|
||||
def _is_ipv6_extension_header(self, header_first_byte):
|
||||
@@ -840,8 +811,7 @@ class LowpanDecompressor:
|
||||
header_first_byte = ord(self._peek_n_bytes(data, 1))
|
||||
|
||||
if self._is_ipv6_extension_header(header_first_byte):
|
||||
extension_header = self._lowpan_extension_headers_factory.parse(
|
||||
data, message_info)
|
||||
extension_header = self._lowpan_extension_headers_factory.parse(data, message_info)
|
||||
extension_headers.append(extension_header)
|
||||
|
||||
# Update next header field in the previous header
|
||||
@@ -853,8 +823,7 @@ class LowpanDecompressor:
|
||||
break
|
||||
|
||||
elif self._is_udp_header(header_first_byte):
|
||||
udp_header = self._lowpan_udp_header_factory.parse(
|
||||
data, message_info)
|
||||
udp_header = self._lowpan_udp_header_factory.parse(data, message_info)
|
||||
|
||||
# Update next header field in the previous header
|
||||
previous_header.next_header = udp_header.type
|
||||
@@ -868,8 +837,7 @@ class LowpanDecompressor:
|
||||
class LowpanMeshHeader(object):
|
||||
""" Class representing 6LoWPAN mesh header (RFC 4944 5.2). """
|
||||
|
||||
def __init__(self, hops_left, originator_address,
|
||||
final_destination_address):
|
||||
def __init__(self, hops_left, originator_address, final_destination_address):
|
||||
self._hops_left = hops_left
|
||||
self._originator_address = originator_address
|
||||
self._final_destination_address = final_destination_address
|
||||
@@ -906,13 +874,10 @@ class LowpanMeshHeaderFactory:
|
||||
else:
|
||||
hops_left = ord(data.read(1))
|
||||
|
||||
originator_address = self._parse_address(data,
|
||||
is_short_originator_address)
|
||||
final_destination_address = self._parse_address(
|
||||
data, is_short_final_destination_address)
|
||||
originator_address = self._parse_address(data, is_short_originator_address)
|
||||
final_destination_address = self._parse_address(data, is_short_final_destination_address)
|
||||
|
||||
return LowpanMeshHeader(hops_left, originator_address,
|
||||
final_destination_address)
|
||||
return LowpanMeshHeader(hops_left, originator_address, final_destination_address)
|
||||
|
||||
|
||||
class LowpanFragmentationHeader(object):
|
||||
@@ -961,9 +926,7 @@ class LowpanFragmentsBuffer(object):
|
||||
|
||||
def write(self, data):
|
||||
if (self._position + len(data)) > len(self._buffer):
|
||||
raise ValueError(
|
||||
"Write failure. Data length is bigger than the destination buffer length."
|
||||
)
|
||||
raise ValueError("Write failure. Data length is bigger than the destination buffer length.")
|
||||
|
||||
for i, byte in enumerate(data):
|
||||
self._buffer[self._position + i] = byte
|
||||
@@ -973,9 +936,7 @@ class LowpanFragmentsBuffer(object):
|
||||
|
||||
def seek(self, offset):
|
||||
if offset >= len(self._buffer):
|
||||
raise ValueError(
|
||||
"Could not seek current offset. Offset value is bigger than the buffer length."
|
||||
)
|
||||
raise ValueError("Could not seek current offset. Offset value is bigger than the buffer length.")
|
||||
|
||||
self._position = offset
|
||||
|
||||
@@ -987,8 +948,7 @@ class LowpanFragmentsBuffer(object):
|
||||
|
||||
def read(self):
|
||||
if not self.whole_packet_received():
|
||||
raise ValueError(
|
||||
"Only a part of the packet has been stored in the buffer.")
|
||||
raise ValueError("Only a part of the packet has been stored in the buffer.")
|
||||
|
||||
return bytearray(self._buffer)
|
||||
|
||||
@@ -1003,25 +963,19 @@ class LowpanFragmentsBuffersManager(object):
|
||||
|
||||
def _create_key(self, message_info, datagram_tag):
|
||||
key = (bytes(message_info.source_mac_address.mac_address) +
|
||||
bytes(message_info.destination_mac_address.mac_address) +
|
||||
bytes(datagram_tag))
|
||||
bytes(message_info.destination_mac_address.mac_address) + bytes(datagram_tag))
|
||||
return key
|
||||
|
||||
def _allocate_fragments_buffer(self, key, datagram_size):
|
||||
if datagram_size is None or datagram_size < 0:
|
||||
raise ValueError(
|
||||
"Could not allocate fragments buffer. Invalid datagram size: {}"
|
||||
.format(datagram_size))
|
||||
raise ValueError("Could not allocate fragments buffer. Invalid datagram size: {}".format(datagram_size))
|
||||
|
||||
fragments_buffer = LowpanFragmentsBuffer(datagram_size)
|
||||
|
||||
self._fragments_buffers[key] = fragments_buffer
|
||||
return fragments_buffer
|
||||
|
||||
def get_fragments_buffer(self,
|
||||
message_info,
|
||||
datagram_tag,
|
||||
datagram_size=None):
|
||||
def get_fragments_buffer(self, message_info, datagram_tag, datagram_size=None):
|
||||
key = self._create_key(message_info, datagram_tag)
|
||||
|
||||
if key not in self._fragments_buffers:
|
||||
@@ -1046,8 +1000,7 @@ class LowpanParser(object):
|
||||
):
|
||||
self._lowpan_mesh_header_factory = lowpan_mesh_header_factory
|
||||
self._lowpan_decompressor = lowpan_decompressor
|
||||
self._lowpan_fragments_buffers_manager = (
|
||||
lowpan_fragements_buffers_manager)
|
||||
self._lowpan_fragments_buffers_manager = (lowpan_fragements_buffers_manager)
|
||||
self._ipv6_packet_factory = ipv6_packet_factory
|
||||
|
||||
def _peek_n_bytes(self, data, n):
|
||||
@@ -1079,14 +1032,12 @@ class LowpanParser(object):
|
||||
fragmentation_header.datagram_size,
|
||||
)
|
||||
|
||||
ipv6_header, extension_headers, udp_header = self._decompress_iphc(
|
||||
data, message_info)
|
||||
ipv6_header, extension_headers, udp_header = self._decompress_iphc(data, message_info)
|
||||
|
||||
uncompressed_data = data.read()
|
||||
|
||||
# Update payload lengths
|
||||
ipv6_header.payload_length = fragmentation_header.datagram_size - len(
|
||||
ipv6_header)
|
||||
ipv6_header.payload_length = fragmentation_header.datagram_size - len(ipv6_header)
|
||||
|
||||
fragments_buffer.seek(0)
|
||||
fragments_buffer.write(ipv6_header.to_bytes())
|
||||
@@ -1102,8 +1053,8 @@ class LowpanParser(object):
|
||||
if fragments_buffer.whole_packet_received():
|
||||
data = io.BytesIO(fragments_buffer.read())
|
||||
|
||||
self._lowpan_fragments_buffers_manager.free_fragments_buffer(
|
||||
message_info, fragmentation_header.datagram_tag)
|
||||
self._lowpan_fragments_buffers_manager.free_fragments_buffer(message_info,
|
||||
fragmentation_header.datagram_tag)
|
||||
|
||||
return self._ipv6_packet_factory.parse(data, message_info)
|
||||
|
||||
@@ -1126,16 +1077,15 @@ class LowpanParser(object):
|
||||
if fragments_buffer.whole_packet_received():
|
||||
data = io.BytesIO(fragments_buffer.read())
|
||||
|
||||
self._lowpan_fragments_buffers_manager.free_fragments_buffer(
|
||||
message_info, fragmentation_header.datagram_tag)
|
||||
self._lowpan_fragments_buffers_manager.free_fragments_buffer(message_info,
|
||||
fragmentation_header.datagram_tag)
|
||||
|
||||
return self._ipv6_packet_factory.parse(data, message_info)
|
||||
|
||||
return None
|
||||
|
||||
def _handle_iphc_header(self, data, message_info):
|
||||
ipv6_header, extension_headers, udp_header = self._decompress_iphc(
|
||||
data, message_info)
|
||||
ipv6_header, extension_headers, udp_header = self._decompress_iphc(data, message_info)
|
||||
|
||||
uncompressed_data = data.read()
|
||||
|
||||
@@ -1155,8 +1105,7 @@ class LowpanParser(object):
|
||||
|
||||
decompressed_data = ipv6_header.to_bytes() + decompressed_data
|
||||
|
||||
return self._ipv6_packet_factory.parse(io.BytesIO(decompressed_data),
|
||||
message_info)
|
||||
return self._ipv6_packet_factory.parse(io.BytesIO(decompressed_data), message_info)
|
||||
|
||||
def set_lowpan_context(self, cid, prefix):
|
||||
self._lowpan_decompressor.set_lowpan_context(cid, prefix)
|
||||
@@ -1167,25 +1116,19 @@ class LowpanParser(object):
|
||||
first_byte = ord(self._peek_n_bytes(data, n=1))
|
||||
|
||||
if self._is_mesh_header(first_byte):
|
||||
mesh_header = self._lowpan_mesh_header_factory.parse(
|
||||
data, message_info)
|
||||
mesh_header = self._lowpan_mesh_header_factory.parse(data, message_info)
|
||||
|
||||
message_info.source_mac_address = (
|
||||
mesh_header.originator_address)
|
||||
message_info.destination_mac_address = (
|
||||
mesh_header.final_destination_address)
|
||||
message_info.source_mac_address = (mesh_header.originator_address)
|
||||
message_info.destination_mac_address = (mesh_header.final_destination_address)
|
||||
|
||||
elif self._is_first_fragmentation_header(first_byte):
|
||||
return self._handle_first_fragmentation_header(
|
||||
data, message_info)
|
||||
return self._handle_first_fragmentation_header(data, message_info)
|
||||
|
||||
elif self._is_subsequent_fragmentation_header(first_byte):
|
||||
return self._handle_subsequent_fragmentation_header(
|
||||
data, message_info)
|
||||
return self._handle_subsequent_fragmentation_header(data, message_info)
|
||||
|
||||
elif self._is_iphc(first_byte):
|
||||
return self._handle_iphc_header(data, message_info)
|
||||
|
||||
else:
|
||||
raise RuntimeError(
|
||||
"Unsupported header type: 0x{:02x}".format(first_byte))
|
||||
raise RuntimeError("Unsupported header type: 0x{:02x}".format(first_byte))
|
||||
|
||||
@@ -263,8 +263,7 @@ class MacFrame:
|
||||
|
||||
data.seek(fcs_start)
|
||||
if aux_sec_header and aux_sec_header.security_level:
|
||||
mic, payload_end = self._parse_mic(data,
|
||||
aux_sec_header.security_level)
|
||||
mic, payload_end = self._parse_mic(data, aux_sec_header.security_level)
|
||||
else:
|
||||
payload_end = fcs_start
|
||||
mic = None
|
||||
@@ -280,13 +279,11 @@ class MacFrame:
|
||||
# TODO: support HT1 when there are Payload IEs in our code
|
||||
assert id != MacFrame.IEEE802154_HEADER_IE_HT1, \
|
||||
'Currently there should be no HT1!'
|
||||
header_ie_length = (header_ie &
|
||||
MacFrame.IEEE802154_HEADER_IE_LENGTH_MASK)
|
||||
header_ie_length = (header_ie & MacFrame.IEEE802154_HEADER_IE_LENGTH_MASK)
|
||||
assert cur_pos + 2 + header_ie_length <= payload_end, \
|
||||
'Parsing Header IE error, IE id:{} length:{}'.format(id, header_ie_length)
|
||||
header_ie_content = data.read(header_ie_length)
|
||||
header_ie_list.append(
|
||||
InformationElement(id, header_ie_length, header_ie_content))
|
||||
header_ie_list.append(InformationElement(id, header_ie_length, header_ie_content))
|
||||
cur_pos += 2 + header_ie_length
|
||||
if id == MacFrame.IEEE802154_HEADER_IE_HT2:
|
||||
break
|
||||
@@ -329,16 +326,12 @@ class MacFrame:
|
||||
message_info.open_payload_length = 1
|
||||
|
||||
if src_address.type == MacAddressType.SHORT:
|
||||
message_info.source_mac_address = DeviceDescriptors.get_extended(
|
||||
src_address).mac_address
|
||||
message_info.source_mac_address = DeviceDescriptors.get_extended(src_address).mac_address
|
||||
else:
|
||||
message_info.source_mac_address = src_address.mac_address
|
||||
|
||||
sec_obj = CryptoEngine(
|
||||
MacCryptoMaterialCreator(config.DEFAULT_MASTER_KEY))
|
||||
self.payload = MacPayload(
|
||||
bytearray(open_payload) +
|
||||
sec_obj.decrypt(private_payload, mic, message_info))
|
||||
sec_obj = CryptoEngine(MacCryptoMaterialCreator(config.DEFAULT_MASTER_KEY))
|
||||
self.payload = MacPayload(bytearray(open_payload) + sec_obj.decrypt(private_payload, mic, message_info))
|
||||
|
||||
else:
|
||||
self.payload = MacPayload(payload)
|
||||
@@ -367,14 +360,10 @@ class MacFrame:
|
||||
|
||||
def _parse_address(self, data, mode):
|
||||
if mode == MacHeader.AddressMode.SHORT:
|
||||
return MacAddress(data.read(2),
|
||||
MacAddressType.SHORT,
|
||||
big_endian=False)
|
||||
return MacAddress(data.read(2), MacAddressType.SHORT, big_endian=False)
|
||||
|
||||
if mode == MacHeader.AddressMode.EXTENDED:
|
||||
return MacAddress(data.read(8),
|
||||
MacAddressType.LONG,
|
||||
big_endian=False)
|
||||
return MacAddress(data.read(8), MacAddressType.LONG, big_endian=False)
|
||||
|
||||
else:
|
||||
return None
|
||||
|
||||
@@ -119,16 +119,13 @@ class Channel(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self._channel_page == other._channel_page and
|
||||
self._channel == other.__channel)
|
||||
return (self._channel_page == other._channel_page and self._channel == other.__channel)
|
||||
|
||||
def __repr__(self):
|
||||
return 'Channel(channel_page={},channel={})'.format(
|
||||
self._channel_page, self._channel)
|
||||
return 'Channel(channel_page={},channel={})'.format(self._channel_page, self._channel)
|
||||
|
||||
def to_hex(self):
|
||||
return struct.pack('>BBBH', TlvType.CHANNEL, 3, self.channel_page,
|
||||
self.channel)
|
||||
return struct.pack('>BBBH', TlvType.CHANNEL, 3, self.channel_page, self.channel)
|
||||
|
||||
|
||||
class ChannelFactory(object):
|
||||
@@ -164,8 +161,7 @@ class ExtendedPanid(object):
|
||||
return self._extended_panid
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(self, type(other)) and
|
||||
self.extended_panid == other.extended_panid)
|
||||
return (isinstance(self, type(other)) and self.extended_panid == other.extended_panid)
|
||||
|
||||
def __repr__(self):
|
||||
return "ExtendedPanid(extended_panid={})".format(self.extended_panid)
|
||||
@@ -189,8 +185,7 @@ class NetworkName(object):
|
||||
return self._network_name
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(self, type(other)) and
|
||||
self.network_name == other.network_name)
|
||||
return (isinstance(self, type(other)) and self.network_name == other.network_name)
|
||||
|
||||
def __repr__(self):
|
||||
return "NetworkName(network_name={})".format(self.network_name)
|
||||
@@ -272,13 +267,11 @@ class SteeringData(object):
|
||||
return self._bloom_filter == other._bloom_filter
|
||||
|
||||
def __repr__(self):
|
||||
return "SteeringData(bloom_filter={})".format(
|
||||
hexlify(self._bloom_filter))
|
||||
return "SteeringData(bloom_filter={})".format(hexlify(self._bloom_filter))
|
||||
|
||||
def to_hex(self):
|
||||
bloom_filter_len = len(self.bloom_filter)
|
||||
return (struct.pack('>BB', TlvType.STEERING_DATA, bloom_filter_len) +
|
||||
self.bloom_filter)
|
||||
return (struct.pack('>BB', TlvType.STEERING_DATA, bloom_filter_len) + self.bloom_filter)
|
||||
|
||||
|
||||
class SteeringDataFactory:
|
||||
@@ -304,12 +297,10 @@ class BorderAgentLocator(object):
|
||||
return self._border_agent_locator == other._border_agent_locator
|
||||
|
||||
def __repr__(self):
|
||||
return "BorderAgentLocator(rloc16={})".format(
|
||||
hex(self._border_agent_locator))
|
||||
return "BorderAgentLocator(rloc16={})".format(hex(self._border_agent_locator))
|
||||
|
||||
def to_hex(self):
|
||||
return struct.pack('>BBH', TlvType.BORDER_AGENT_LOCATOR, 2,
|
||||
self.border_agent_locator)
|
||||
return struct.pack('>BBH', TlvType.BORDER_AGENT_LOCATOR, 2, self.border_agent_locator)
|
||||
|
||||
|
||||
class BorderAgentLocatorFactory:
|
||||
@@ -359,8 +350,7 @@ class CommissionerSessionId(object):
|
||||
return self._commissioner_session_id == other._commissioner_session_id
|
||||
|
||||
def __repr__(self):
|
||||
return "CommissionerSessionId(commissioner_session_id={})".format(
|
||||
self._commissioner_session_id)
|
||||
return "CommissionerSessionId(commissioner_session_id={})".format(self._commissioner_session_id)
|
||||
|
||||
def to_hex(self):
|
||||
return struct.pack(
|
||||
@@ -491,8 +481,7 @@ class JoinerUdpPort(object):
|
||||
return self._udp_port
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(self, type(other)) and
|
||||
self.udp_port == other.udp_port)
|
||||
return (isinstance(self, type(other)) and self.udp_port == other.udp_port)
|
||||
|
||||
def __repr__(self):
|
||||
return "JoinerUdpPort(udp_port={})".format(self.udp_port)
|
||||
@@ -838,13 +827,11 @@ class DiscoveryRequest(object):
|
||||
return self._joiner_flag
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(self, type(other)) and
|
||||
self.version == other.version and
|
||||
return (isinstance(self, type(other)) and self.version == other.version and
|
||||
self.joiner_flag == other.joiner_flag)
|
||||
|
||||
def __repr__(self):
|
||||
return "DiscoveryRequest(version={}, joiner_flag={})".format(
|
||||
self.version, self.joiner_flag)
|
||||
return "DiscoveryRequest(version={}, joiner_flag={})".format(self.version, self.joiner_flag)
|
||||
|
||||
|
||||
class DiscoveryRequestFactory(object):
|
||||
@@ -873,13 +860,11 @@ class DiscoveryResponse(object):
|
||||
return self._native_flag
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(self, type(other)) and
|
||||
self.version == other.version and
|
||||
return (isinstance(self, type(other)) and self.version == other.version and
|
||||
self.native_flag == other.native_flag)
|
||||
|
||||
def __repr__(self):
|
||||
return "DiscoveryResponse(version={}, native_flag={})".format(
|
||||
self.version, self.native_flag)
|
||||
return "DiscoveryResponse(version={}, native_flag={})".format(self.version, self.native_flag)
|
||||
|
||||
|
||||
class DiscoveryResponseFactory(object):
|
||||
@@ -933,9 +918,7 @@ class MeshCopCommandFactory:
|
||||
try:
|
||||
return self._tlvs_factories[_type]
|
||||
except KeyError:
|
||||
logging.error(
|
||||
'Could not find TLV factory. Unsupported TLV type: {}'.format(
|
||||
_type))
|
||||
logging.error('Could not find TLV factory. Unsupported TLV type: {}'.format(_type))
|
||||
return UnknownTlvFactory(_type)
|
||||
|
||||
def _parse_tlv(self, data):
|
||||
@@ -943,15 +926,13 @@ class MeshCopCommandFactory:
|
||||
length = self._get_length(data)
|
||||
value = data.read(length)
|
||||
factory = self._get_tlv_factory(_type)
|
||||
return factory.parse(io.BytesIO(value),
|
||||
None) # message_info not needed here
|
||||
return factory.parse(io.BytesIO(value), None) # message_info not needed here
|
||||
|
||||
def _get_mesh_cop_msg_type(self, msg_type_str):
|
||||
try:
|
||||
return self._mesh_cop_msg_type_map[msg_type_str]
|
||||
except KeyError:
|
||||
raise KeyError(
|
||||
'Mesh cop message type not found: {}'.format(msg_type_str))
|
||||
raise KeyError('Mesh cop message type not found: {}'.format(msg_type_str))
|
||||
|
||||
def parse(self, cmd_type_str, data):
|
||||
cmd_type = self._get_mesh_cop_msg_type(cmd_type_str)
|
||||
|
||||
@@ -73,8 +73,7 @@ class Message(object):
|
||||
self._type = MessageType.MLE
|
||||
self._mle = udp_datagram.payload
|
||||
|
||||
elif isinstance(udp_datagram.payload,
|
||||
(coap.CoapMessage, coap.CoapMessageProxy)):
|
||||
elif isinstance(udp_datagram.payload, (coap.CoapMessage, coap.CoapMessageProxy)):
|
||||
self._type = MessageType.COAP
|
||||
self._coap = udp_datagram.payload
|
||||
|
||||
@@ -149,12 +148,10 @@ class Message(object):
|
||||
|
||||
elif self._mac_header.frame_type == mac802154.MacHeader.FrameType.DATA:
|
||||
self._type = MessageType.DATA
|
||||
elif (self._mac_header.frame_type ==
|
||||
mac802154.MacHeader.FrameType.COMMAND):
|
||||
elif (self._mac_header.frame_type == mac802154.MacHeader.FrameType.COMMAND):
|
||||
self._type = MessageType.COMMAND
|
||||
else:
|
||||
raise ValueError('Invalid mac frame type %d' %
|
||||
self._mac_header.frame_type)
|
||||
raise ValueError('Invalid mac frame type %d' % self._mac_header.frame_type)
|
||||
|
||||
@property
|
||||
def ipv6_packet(self):
|
||||
@@ -260,8 +257,7 @@ class Message(object):
|
||||
if contains_tlv:
|
||||
print("MleMessage contains optional TLV: {}".format(tlv_class_type))
|
||||
else:
|
||||
print("MleMessage doesn't contain optional TLV: {}".format(
|
||||
tlv_class_type))
|
||||
print("MleMessage doesn't contain optional TLV: {}".format(tlv_class_type))
|
||||
|
||||
def get_coap_message_tlv(self, tlv_class_type):
|
||||
if self.type != MessageType.COAP:
|
||||
@@ -303,8 +299,7 @@ class Message(object):
|
||||
if isinstance(tlv, tlv_class_type):
|
||||
break
|
||||
|
||||
print("CoapMessage doesn't contain optional TLV: {}".format(
|
||||
tlv_class_type))
|
||||
print("CoapMessage doesn't contain optional TLV: {}".format(tlv_class_type))
|
||||
|
||||
def assertCoapMessageRequestUriPath(self, uri_path):
|
||||
if self.type != MessageType.COAP:
|
||||
@@ -332,20 +327,17 @@ class Message(object):
|
||||
sent_to_node = True
|
||||
|
||||
elif self.mac_header.dest_address.type == common.MacAddressType.LONG:
|
||||
mac_address = common.MacAddress.from_eui64(
|
||||
bytearray(node.get_addr64(), encoding="utf-8"))
|
||||
mac_address = common.MacAddress.from_eui64(bytearray(node.get_addr64(), encoding="utf-8"))
|
||||
if self.mac_header.dest_address == mac_address:
|
||||
sent_to_node = True
|
||||
|
||||
assert sent_to_node
|
||||
|
||||
def assertSentToDestinationAddress(self, ipv6_address):
|
||||
assert (self.ipv6_packet.ipv6_header.destination_address ==
|
||||
ipaddress.ip_address(ipv6_address))
|
||||
assert (self.ipv6_packet.ipv6_header.destination_address == ipaddress.ip_address(ipv6_address))
|
||||
|
||||
def assertSentFromSourceAddress(self, ipv6_address):
|
||||
assert (self.ipv6_packet.ipv6_header.source_address ==
|
||||
ipaddress.ip_address(ipv6_address))
|
||||
assert (self.ipv6_packet.ipv6_header.source_address == ipaddress.ip_address(ipv6_address))
|
||||
|
||||
def assertSentWithHopLimit(self, hop_limit):
|
||||
assert self.ipv6_packet.ipv6_header.hop_limit == hop_limit
|
||||
@@ -354,8 +346,7 @@ class Message(object):
|
||||
return self.mac_header.dest_address.type == common.MacAddressType.LONG
|
||||
|
||||
def get_dst_udp_port(self):
|
||||
assert isinstance(self.ipv6_packet.upper_layer_protocol,
|
||||
ipv6.UDPDatagram)
|
||||
assert isinstance(self.ipv6_packet.upper_layer_protocol, ipv6.UDPDatagram)
|
||||
return self.ipv6_packet.upper_layer_protocol.header.dst_port
|
||||
|
||||
def is_data_poll(self):
|
||||
@@ -363,8 +354,7 @@ class Message(object):
|
||||
self._mac_header.command_type == mac802154.MacHeader.CommandIdentifier.DATA_REQUEST
|
||||
|
||||
def __repr__(self):
|
||||
if (self.type == MessageType.DTLS and
|
||||
self.dtls.content_type == dtls.ContentType.HANDSHAKE):
|
||||
if (self.type == MessageType.DTLS and self.dtls.content_type == dtls.ContentType.HANDSHAKE):
|
||||
return "Message(type={})".format(str(self.dtls.handshake_type))
|
||||
return "Message(type={})".format(MessageType(self.type).name)
|
||||
|
||||
@@ -411,8 +401,7 @@ class MessagesSet(object):
|
||||
break
|
||||
|
||||
if assert_enabled:
|
||||
assert (message is not None
|
||||
), "Could not find CoapMessage with code: {}".format(code)
|
||||
assert (message is not None), "Could not find CoapMessage with code: {}".format(code)
|
||||
|
||||
return message
|
||||
|
||||
@@ -441,22 +430,15 @@ class MessagesSet(object):
|
||||
break
|
||||
|
||||
if assert_enabled:
|
||||
assert (
|
||||
message is not None
|
||||
), "Could not find MleMessage with type: {}".format(command_type)
|
||||
assert (message is not None), "Could not find MleMessage with type: {}".format(command_type)
|
||||
|
||||
return message
|
||||
|
||||
def next_mle_message(self,
|
||||
command_type,
|
||||
assert_enabled=True,
|
||||
sent_to_node=None):
|
||||
def next_mle_message(self, command_type, assert_enabled=True, sent_to_node=None):
|
||||
message = self.next_mle_message_of_one_of_command_types(command_type)
|
||||
|
||||
if assert_enabled:
|
||||
assert (
|
||||
message is not None
|
||||
), "Could not find MleMessage of the type: {}".format(command_type)
|
||||
assert (message is not None), "Could not find MleMessage of the type: {}".format(command_type)
|
||||
|
||||
if sent_to_node is not None:
|
||||
message.assertSentToNode(sent_to_node)
|
||||
@@ -503,9 +485,7 @@ class MessagesSet(object):
|
||||
break
|
||||
|
||||
if assert_enabled:
|
||||
assert (
|
||||
message is not None
|
||||
), "Could not find Message of the type: {}".format(message_type)
|
||||
assert (message is not None), "Could not find Message of the type: {}".format(message_type)
|
||||
|
||||
return message
|
||||
|
||||
@@ -522,15 +502,12 @@ class MessagesSet(object):
|
||||
continue
|
||||
if msg.dtls.content_type != content_type:
|
||||
continue
|
||||
if (content_type == dtls.ContentType.HANDSHAKE and
|
||||
msg.dtls.handshake_type != handshake_type):
|
||||
if (content_type == dtls.ContentType.HANDSHAKE and msg.dtls.handshake_type != handshake_type):
|
||||
continue
|
||||
return msg
|
||||
|
||||
t = (handshake_type
|
||||
if content_type == dtls.ContentType.HANDSHAKE else content_type)
|
||||
raise ValueError("Could not find DTLS message of type: {}".format(
|
||||
str(t)))
|
||||
t = (handshake_type if content_type == dtls.ContentType.HANDSHAKE else content_type)
|
||||
raise ValueError("Could not find DTLS message of type: {}".format(str(t)))
|
||||
|
||||
def contains_icmp_message(self):
|
||||
for m in self.messages:
|
||||
@@ -586,12 +563,10 @@ class MessageFactory:
|
||||
for tlv in message.mle.command.tlvs:
|
||||
|
||||
if isinstance(tlv, mle.SourceAddress):
|
||||
mac802154.DeviceDescriptors.add(tlv.address,
|
||||
message.mac_header.src_address)
|
||||
mac802154.DeviceDescriptors.add(tlv.address, message.mac_header.src_address)
|
||||
|
||||
if isinstance(tlv, mle.Address16):
|
||||
mac802154.DeviceDescriptors.add(tlv.address,
|
||||
message.mac_header.dest_address)
|
||||
mac802154.DeviceDescriptors.add(tlv.address, message.mac_header.dest_address)
|
||||
|
||||
def _parse_mac_frame(self, data):
|
||||
mac_frame = mac802154.MacFrame()
|
||||
@@ -620,8 +595,7 @@ class MessageFactory:
|
||||
# Create stream with 6LoWPAN datagram
|
||||
lowpan_payload = io.BytesIO(mac_frame.payload.data)
|
||||
|
||||
ipv6_packet = self._lowpan_parser.parse(lowpan_payload,
|
||||
message_info)
|
||||
ipv6_packet = self._lowpan_parser.parse(lowpan_payload, message_info)
|
||||
if ipv6_packet is None:
|
||||
return [message]
|
||||
|
||||
@@ -633,7 +607,5 @@ class MessageFactory:
|
||||
return message.try_extract_dtls_messages()
|
||||
|
||||
except mac802154.KeyIdMode0Exception:
|
||||
print(
|
||||
'Received packet with key_id_mode = 0, cannot be handled in test scripts'
|
||||
)
|
||||
print('Received packet with key_id_mode = 0, cannot be handled in test scripts')
|
||||
raise DropPacketException
|
||||
|
||||
@@ -143,10 +143,8 @@ class Mode(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.receiver == other.receiver and
|
||||
self.secure == other.secure and
|
||||
self.device_type == other.device_type and
|
||||
self.network_data == other.network_data)
|
||||
return (self.receiver == other.receiver and self.secure == other.secure and
|
||||
self.device_type == other.device_type and self.network_data == other.network_data)
|
||||
|
||||
def __repr__(self):
|
||||
return "Mode(receiver={}, secure={}, device_type={}, network_data={})".format(
|
||||
@@ -254,8 +252,7 @@ class LinkLayerFrameCounter(object):
|
||||
return self.frame_counter == other.frame_counter
|
||||
|
||||
def __repr__(self):
|
||||
return "LinkLayerFrameCounter(frame_counter={})".format(
|
||||
self.frame_counter)
|
||||
return "LinkLayerFrameCounter(frame_counter={})".format(self.frame_counter)
|
||||
|
||||
|
||||
class LinkLayerFrameCounterFactory:
|
||||
@@ -312,12 +309,10 @@ class LinkQualityAndRouteData(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.output == other.output and self.input == other.input and
|
||||
self.route == other.route)
|
||||
return (self.output == other.output and self.input == other.input and self.route == other.route)
|
||||
|
||||
def __repr__(self):
|
||||
return "LinkQualityAndRouteData(ouput={}, input={}, route={})".format(
|
||||
self.output, self.input, self.route)
|
||||
return "LinkQualityAndRouteData(ouput={}, input={}, route={})".format(self.output, self.input, self.route)
|
||||
|
||||
|
||||
class LinkQualityAndRouteDataFactory:
|
||||
@@ -332,8 +327,7 @@ class LinkQualityAndRouteDataFactory:
|
||||
|
||||
class Route64(object):
|
||||
|
||||
def __init__(self, id_sequence, router_id_mask,
|
||||
link_quality_and_route_data):
|
||||
def __init__(self, id_sequence, router_id_mask, link_quality_and_route_data):
|
||||
self._id_sequence = id_sequence
|
||||
self._router_id_mask = router_id_mask
|
||||
self._link_quality_and_route_data = link_quality_and_route_data
|
||||
@@ -353,14 +347,11 @@ class Route64(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.id_sequence == other.id_sequence and
|
||||
self.router_id_mask == other.router_id_mask and
|
||||
self.link_quality_and_route_data ==
|
||||
other.link_quality_and_route_data)
|
||||
return (self.id_sequence == other.id_sequence and self.router_id_mask == other.router_id_mask and
|
||||
self.link_quality_and_route_data == other.link_quality_and_route_data)
|
||||
|
||||
def __repr__(self):
|
||||
lqrd_str = ", ".join(
|
||||
["{}".format(lqrd) for lqrd in self.link_quality_and_route_data])
|
||||
lqrd_str = ", ".join(["{}".format(lqrd) for lqrd in self.link_quality_and_route_data])
|
||||
return "Route64(id_sequence={}, router_id_mask={}, link_quality_and_route_data=[{}])".format(
|
||||
self.id_sequence, hex(self.router_id_mask), lqrd_str)
|
||||
|
||||
@@ -377,8 +368,7 @@ class Route64Factory:
|
||||
link_quality_and_route_data = []
|
||||
|
||||
while data.tell() < len(data.getvalue()):
|
||||
link_quality_and_route_data.append(
|
||||
self._lqrd_factory.parse(data, message_info))
|
||||
link_quality_and_route_data.append(self._lqrd_factory.parse(data, message_info))
|
||||
|
||||
return Route64(id_sequence, router_id_mask, link_quality_and_route_data)
|
||||
|
||||
@@ -447,10 +437,8 @@ class LeaderData(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.partition_id == other.partition_id and
|
||||
self.weighting == other.weighting and
|
||||
self.data_version == other.data_version and
|
||||
self.stable_data_version == other.stable_data_version and
|
||||
return (self.partition_id == other.partition_id and self.weighting == other.weighting and
|
||||
self.data_version == other.data_version and self.stable_data_version == other.stable_data_version and
|
||||
self.leader_router_id == other.leader_router_id)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -552,12 +540,10 @@ class ScanMask(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.router == other.router and
|
||||
self.end_device == other.end_device)
|
||||
return (self.router == other.router and self.end_device == other.end_device)
|
||||
|
||||
def __repr__(self):
|
||||
return "ScanMask(router={}, end_device={})".format(
|
||||
self.router, self.end_device)
|
||||
return "ScanMask(router={}, end_device={})".format(self.router, self.end_device)
|
||||
|
||||
|
||||
class ScanMaskFactory:
|
||||
@@ -636,14 +622,10 @@ class Connectivity(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.pp == other.pp and
|
||||
self.link_quality_3 == other.link_quality_3 and
|
||||
self.link_quality_2 == other.link_quality_2 and
|
||||
self.link_quality_1 == other.link_quality_1 and
|
||||
self.leader_cost == other.leader_cost and
|
||||
self.id_sequence == other.id_sequence and
|
||||
self.active_routers == other.active_routers and
|
||||
self.sed_buffer_size == other.sed_buffer_size and
|
||||
return (self.pp == other.pp and self.link_quality_3 == other.link_quality_3 and
|
||||
self.link_quality_2 == other.link_quality_2 and self.link_quality_1 == other.link_quality_1 and
|
||||
self.leader_cost == other.leader_cost and self.id_sequence == other.id_sequence and
|
||||
self.active_routers == other.active_routers and self.sed_buffer_size == other.sed_buffer_size and
|
||||
self.sed_datagram_count == other.sed_datagram_count)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -791,8 +773,7 @@ class AddressFull(object):
|
||||
return self.ipv6_address == other.ipv6_address
|
||||
|
||||
def __repr__(self):
|
||||
return "AddressFull(ipv6_address={}')".format(hexlify(
|
||||
self.ipv6_address))
|
||||
return "AddressFull(ipv6_address={}')".format(hexlify(self.ipv6_address))
|
||||
|
||||
|
||||
class AddressFullFactory:
|
||||
@@ -823,8 +804,7 @@ class AddressCompressed(object):
|
||||
return self.cid == other.cid and self.iid == other.iid
|
||||
|
||||
def __repr__(self):
|
||||
return "AddressCompressed(cid={}, iid={}')".format(
|
||||
self.cid, hexlify(self.iid))
|
||||
return "AddressCompressed(cid={}, iid={}')".format(self.cid, hexlify(self.iid))
|
||||
|
||||
|
||||
class AddressCompressedFactory:
|
||||
@@ -850,8 +830,7 @@ class AddressRegistration(object):
|
||||
return self.addresses == other.addresses
|
||||
|
||||
def __repr__(self):
|
||||
addresses_str = ", ".join(
|
||||
["{}".format(address) for address in self.addresses])
|
||||
addresses_str = ", ".join(["{}".format(address) for address in self.addresses])
|
||||
return "AddressRegistration(addresses=[{}])".format(addresses_str)
|
||||
|
||||
|
||||
@@ -869,11 +848,9 @@ class AddressRegistrationFactory:
|
||||
data.seek(-1, io.SEEK_CUR)
|
||||
|
||||
if compressed:
|
||||
addresses.append(
|
||||
self._addr_compressed_factory.parse(data, message_info))
|
||||
addresses.append(self._addr_compressed_factory.parse(data, message_info))
|
||||
else:
|
||||
addresses.append(
|
||||
self._addr_full_factory.parse(data, message_info))
|
||||
addresses.append(self._addr_full_factory.parse(data, message_info))
|
||||
|
||||
return AddressRegistration(addresses)
|
||||
|
||||
@@ -895,12 +872,10 @@ class Channel(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.channel_page == other.channel_page and
|
||||
self.channel == other.channel)
|
||||
return (self.channel_page == other.channel_page and self.channel == other.channel)
|
||||
|
||||
def __repr__(self):
|
||||
return "Channel(channel_page={}, channel={})".format(
|
||||
self.channel_page, self.channel)
|
||||
return "Channel(channel_page={}, channel={})".format(self.channel_page, self.channel)
|
||||
|
||||
|
||||
class ChannelFactory:
|
||||
@@ -958,8 +933,7 @@ class ActiveTimestamp(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.timestamp_seconds == other.timestamp_seconds and
|
||||
self.timestamp_ticks == other.timestamp_ticks and
|
||||
return (self.timestamp_seconds == other.timestamp_seconds and self.timestamp_ticks == other.timestamp_ticks and
|
||||
self.u == other.u)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -1001,8 +975,7 @@ class PendingTimestamp(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.timestamp_seconds == other.timestamp_seconds and
|
||||
self.timestamp_ticks == other.timestamp_ticks and
|
||||
return (self.timestamp_seconds == other.timestamp_seconds and self.timestamp_ticks == other.timestamp_ticks and
|
||||
self.u == other.u)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -1138,9 +1111,7 @@ class MleCommandFactory:
|
||||
try:
|
||||
return self._tlvs_factories[_type]
|
||||
except KeyError:
|
||||
logging.error(
|
||||
'Could not find TLV factory. Unsupported TLV type: {}'.format(
|
||||
_type))
|
||||
logging.error('Could not find TLV factory. Unsupported TLV type: {}'.format(_type))
|
||||
return UnknownTlvFactory(_type)
|
||||
|
||||
def _parse_tlv(self, data, message_info):
|
||||
@@ -1192,8 +1163,8 @@ class MleMessageSecured(MleMessage):
|
||||
return self._mic
|
||||
|
||||
def __repr__(self):
|
||||
return "MleMessageSecured(aux_sec_hdr={}, command={}, mic=\"{}\")".format(
|
||||
self.aux_sec_hdr, self.command, hexlify(self.mic))
|
||||
return "MleMessageSecured(aux_sec_hdr={}, command={}, mic=\"{}\")".format(self.aux_sec_hdr, self.command,
|
||||
hexlify(self.mic))
|
||||
|
||||
|
||||
class MleMessageFactory:
|
||||
@@ -1208,15 +1179,12 @@ class MleMessageFactory:
|
||||
|
||||
enc_data_length = len(data.getvalue())
|
||||
|
||||
enc_data = bytearray(
|
||||
data.read(enc_data_length - data.tell() -
|
||||
self._crypto_engine.mic_length))
|
||||
enc_data = bytearray(data.read(enc_data_length - data.tell() - self._crypto_engine.mic_length))
|
||||
mic = bytearray(data.read())
|
||||
|
||||
dec_data = self._crypto_engine.decrypt(enc_data, mic, message_info)
|
||||
|
||||
command = self._mle_command_factory.parse(io.BytesIO(dec_data),
|
||||
message_info)
|
||||
command = self._mle_command_factory.parse(io.BytesIO(dec_data), message_info)
|
||||
|
||||
return MleMessageSecured(aux_sec_hdr, command, mic)
|
||||
|
||||
@@ -1236,5 +1204,4 @@ class MleMessageFactory:
|
||||
|
||||
else:
|
||||
raise RuntimeError(
|
||||
"Could not create MLE message. Unknown security indicator value: {}"
|
||||
.format(security_indicator))
|
||||
"Could not create MLE message. Unknown security indicator value: {}".format(security_indicator))
|
||||
|
||||
@@ -62,8 +62,7 @@ class CryptoEngine:
|
||||
tuple: Encrypted message (bytearray), MIC (bytearray)
|
||||
|
||||
"""
|
||||
key, nonce, auth_data = self._crypto_material_creator.create_key_and_nonce_and_authenticated_data(
|
||||
message_info)
|
||||
key, nonce, auth_data = self._crypto_material_creator.create_key_and_nonce_and_authenticated_data(message_info)
|
||||
|
||||
cipher = AES.new(key, AES.MODE_CCM, nonce, mac_len=self.mic_length)
|
||||
cipher.update(auth_data)
|
||||
@@ -82,8 +81,7 @@ class CryptoEngine:
|
||||
bytearray: Decrypted message.
|
||||
|
||||
"""
|
||||
key, nonce, auth_data = self._crypto_material_creator.create_key_and_nonce_and_authenticated_data(
|
||||
message_info)
|
||||
key, nonce, auth_data = self._crypto_material_creator.create_key_and_nonce_and_authenticated_data(message_info)
|
||||
|
||||
cipher = AES.new(key, AES.MODE_CCM, nonce, mac_len=self.mic_length)
|
||||
cipher.update(auth_data)
|
||||
@@ -158,8 +156,7 @@ class MacCryptoMaterialCreator(CryptoMaterialCreator):
|
||||
"""
|
||||
return bytes(eui64 + struct.pack(">LB", frame_counter, security_level))
|
||||
|
||||
def _create_authenticated_data(self, mhr, auxiliary_security_header,
|
||||
extra_open_fields):
|
||||
def _create_authenticated_data(self, mhr, auxiliary_security_header, extra_open_fields):
|
||||
""" Create Authenticated Data
|
||||
|
||||
Read more: 7.6.3.3 CCM prerequisites - Std 802.15.4-2006
|
||||
@@ -176,8 +173,7 @@ class MacCryptoMaterialCreator(CryptoMaterialCreator):
|
||||
return bytes(mhr + auxiliary_security_header + extra_open_fields)
|
||||
|
||||
def create_key_and_nonce_and_authenticated_data(self, message_info):
|
||||
_, mac_key = self._generate_keys(
|
||||
message_info.aux_sec_hdr.sequence_counter)
|
||||
_, mac_key = self._generate_keys(message_info.aux_sec_hdr.sequence_counter)
|
||||
|
||||
nonce = self._create_nonce(
|
||||
message_info.source_mac_address,
|
||||
@@ -222,11 +218,9 @@ class MleCryptoMaterialCreator(CryptoMaterialCreator):
|
||||
bytes: created Nonce
|
||||
|
||||
"""
|
||||
return bytes(source_eui64[:8] +
|
||||
struct.pack(">LB", frame_counter, security_level))
|
||||
return bytes(source_eui64[:8] + struct.pack(">LB", frame_counter, security_level))
|
||||
|
||||
def _create_authenticated_data(self, source_address, destination_address,
|
||||
auxiliary_security_header):
|
||||
def _create_authenticated_data(self, source_address, destination_address, auxiliary_security_header):
|
||||
""" Create Authenticated Data
|
||||
|
||||
Read more: 4.8 - Thread v1.0 Specification
|
||||
@@ -240,12 +234,10 @@ class MleCryptoMaterialCreator(CryptoMaterialCreator):
|
||||
bytes: Authenticated Data
|
||||
|
||||
"""
|
||||
return bytes(source_address.packed + destination_address.packed +
|
||||
auxiliary_security_header)
|
||||
return bytes(source_address.packed + destination_address.packed + auxiliary_security_header)
|
||||
|
||||
def create_key_and_nonce_and_authenticated_data(self, message_info):
|
||||
mle_key, _ = self._generate_keys(
|
||||
message_info.aux_sec_hdr.sequence_counter)
|
||||
mle_key, _ = self._generate_keys(message_info.aux_sec_hdr.sequence_counter)
|
||||
|
||||
nonce = self._create_nonce(
|
||||
message_info.source_mac_address.mac_address,
|
||||
@@ -306,8 +298,7 @@ class AuxiliarySecurityHeader:
|
||||
key_source = self.key_id[:4]
|
||||
format = ">I" if self._big_endian else "<I"
|
||||
else:
|
||||
raise ValueError("Unsupported Key Index Mode: {}".format(
|
||||
self.key_id_mode))
|
||||
raise ValueError("Unsupported Key Index Mode: {}".format(self.key_id_mode))
|
||||
|
||||
return struct.unpack(format, key_source)[0]
|
||||
|
||||
@@ -370,22 +361,18 @@ class AuxiliarySecurityHeaderFactory:
|
||||
return self._key_id_lengths[key_id_mode]
|
||||
|
||||
def parse(self, data, message_info):
|
||||
security_control_bytes = bytearray(
|
||||
data.read(self._SECURITY_CONTROL_LENGTH))
|
||||
security_control_bytes = bytearray(data.read(self._SECURITY_CONTROL_LENGTH))
|
||||
frame_counter_bytes = bytearray(data.read(self._FRAME_COUNTER_LENGTH))
|
||||
|
||||
security_level, key_id_mode = self._parse_security_control(
|
||||
security_control_bytes[0])
|
||||
security_level, key_id_mode = self._parse_security_control(security_control_bytes[0])
|
||||
frame_counter = self._parse_frame_counter(frame_counter_bytes)
|
||||
|
||||
key_id_length = self._key_id_length(key_id_mode)
|
||||
key_id_bytes = bytearray(data.read(key_id_length))
|
||||
|
||||
aux_sec_hdr = AuxiliarySecurityHeader(key_id_mode, security_level,
|
||||
frame_counter, key_id_bytes)
|
||||
aux_sec_hdr = AuxiliarySecurityHeader(key_id_mode, security_level, frame_counter, key_id_bytes)
|
||||
|
||||
message_info.aux_sec_hdr_bytes = (security_control_bytes +
|
||||
frame_counter_bytes + key_id_bytes)
|
||||
message_info.aux_sec_hdr_bytes = (security_control_bytes + frame_counter_bytes + key_id_bytes)
|
||||
message_info.aux_sec_hdr = aux_sec_hdr
|
||||
|
||||
return aux_sec_hdr
|
||||
|
||||
@@ -99,12 +99,10 @@ class Route(object):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.border_router_16 == other.border_router_16 and
|
||||
self.prf == other.prf)
|
||||
return (self.border_router_16 == other.border_router_16 and self.prf == other.prf)
|
||||
|
||||
def __repr__(self):
|
||||
return "Route(border_router_16={}, prf={})".format(
|
||||
self.border_router_16, self.prf)
|
||||
return "Route(border_router_16={}, prf={})".format(self.border_router_16, self.prf)
|
||||
|
||||
|
||||
class RouteFactory(object):
|
||||
@@ -151,8 +149,7 @@ class HasRoute(NetworkData):
|
||||
|
||||
def __repr__(self):
|
||||
routes_str = ", ".join(["{}".format(route) for route in self.routes])
|
||||
return "HasRoute(stable={}, routes=[{}])".format(
|
||||
self.stable, routes_str)
|
||||
return "HasRoute(stable={}, routes=[{}])".format(self.stable, routes_str)
|
||||
|
||||
|
||||
class HasRouteFactory(object):
|
||||
@@ -194,8 +191,7 @@ class Prefix(NetworkData):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.domain_id == other.domain_id and
|
||||
self.prefix_length == other.prefix_length and
|
||||
return (self.domain_id == other.domain_id and self.prefix_length == other.prefix_length and
|
||||
self.prefix == other.prefix and self.sub_tlvs == other.sub_tlvs)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -230,11 +226,9 @@ class PrefixFactory(object):
|
||||
|
||||
prefix = bytearray(data.read(self._bits_to_bytes(prefix_length)))
|
||||
|
||||
sub_tlvs = self._sub_tlvs_factory.parse(io.BytesIO(data.read()),
|
||||
message_info)
|
||||
sub_tlvs = self._sub_tlvs_factory.parse(io.BytesIO(data.read()), message_info)
|
||||
|
||||
return Prefix(domain_id, prefix_length, prefix, sub_tlvs,
|
||||
message_info.stable)
|
||||
return Prefix(domain_id, prefix_length, prefix, sub_tlvs, message_info.stable)
|
||||
|
||||
|
||||
class BorderRouter(NetworkData):
|
||||
@@ -290,10 +284,8 @@ class BorderRouter(NetworkData):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.border_router_16 == other.border_router_16 and
|
||||
self.prf == other.prf and self.p == other.p and
|
||||
self.s == other.s and self.d == other.d and
|
||||
self.c == other.c and self.r == other.r and
|
||||
return (self.border_router_16 == other.border_router_16 and self.prf == other.prf and self.p == other.p and
|
||||
self.s == other.s and self.d == other.d and self.c == other.c and self.r == other.r and
|
||||
self.o == other.o and self.n == other.n)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -328,8 +320,7 @@ class BorderRouterFactory(object):
|
||||
data_byte = ord(data.read(1))
|
||||
n = (data_byte >> 7) & 0x01
|
||||
|
||||
return BorderRouter(border_router_16, prf, p, s, d, c, r, o, n,
|
||||
message_info.stable)
|
||||
return BorderRouter(border_router_16, prf, p, s, d, c, r, o, n, message_info.stable)
|
||||
|
||||
|
||||
class LowpanId(NetworkData):
|
||||
@@ -355,12 +346,11 @@ class LowpanId(NetworkData):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.c == other.c and self.cid == other.cid and
|
||||
self.context_length == other.context_length)
|
||||
return (self.c == other.c and self.cid == other.cid and self.context_length == other.context_length)
|
||||
|
||||
def __repr__(self):
|
||||
return "LowpanId(stable={}, c={}, cid={}, context_length={})".format(
|
||||
self.stable, self.c, self.cid, self.context_length)
|
||||
return "LowpanId(stable={}, c={}, cid={}, context_length={})".format(self.stable, self.c, self.cid,
|
||||
self.context_length)
|
||||
|
||||
|
||||
class LowpanIdFactory(object):
|
||||
@@ -393,15 +383,13 @@ class CommissioningData(NetworkData):
|
||||
|
||||
def __repr__(self):
|
||||
sub_tlvs_str = ", ".join(["{}".format(tlv) for tlv in self._sub_tlvs])
|
||||
return "CommissioningData(stable={}, sub_tlvs=[{}])".format(
|
||||
self._stable, sub_tlvs_str)
|
||||
return "CommissioningData(stable={}, sub_tlvs=[{}])".format(self._stable, sub_tlvs_str)
|
||||
|
||||
|
||||
class CommissioningDataSubTlvsFactory(SubTlvsFactory):
|
||||
|
||||
def __init__(self, sub_tlvs_factories):
|
||||
super(CommissioningDataSubTlvsFactory,
|
||||
self).__init__(sub_tlvs_factories)
|
||||
super(CommissioningDataSubTlvsFactory, self).__init__(sub_tlvs_factories)
|
||||
|
||||
|
||||
class CommissioningDataFactory(object):
|
||||
@@ -410,8 +398,7 @@ class CommissioningDataFactory(object):
|
||||
self._sub_tlvs_factory = sub_tlvs_factory
|
||||
|
||||
def parse(self, data, message_info):
|
||||
sub_tlvs = self._sub_tlvs_factory.parse(io.BytesIO(data.read()),
|
||||
message_info)
|
||||
sub_tlvs = self._sub_tlvs_factory.parse(io.BytesIO(data.read()), message_info)
|
||||
|
||||
return CommissioningData(sub_tlvs, message_info.stable)
|
||||
|
||||
@@ -463,10 +450,8 @@ class Service(NetworkData):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.t == other.t and self.id == other.id and
|
||||
self.enterprise_number == other.enterprise_number and
|
||||
self.service_data_length == other.service_data_length and
|
||||
self.service_data == other.service_data and
|
||||
return (self.t == other.t and self.id == other.id and self.enterprise_number == other.enterprise_number and
|
||||
self.service_data_length == other.service_data_length and self.service_data == other.service_data and
|
||||
self.sub_tlvs == other.sub_tlvs)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -504,8 +489,7 @@ class ServiceFactory(object):
|
||||
service_data_length = ord(data.read(1))
|
||||
service_data = data.read(service_data_length)
|
||||
|
||||
sub_tlvs = self._sub_tlvs_factory.parse(io.BytesIO(data.read()),
|
||||
message_info)
|
||||
sub_tlvs = self._sub_tlvs_factory.parse(io.BytesIO(data.read()), message_info)
|
||||
|
||||
return Service(
|
||||
t,
|
||||
@@ -536,12 +520,11 @@ class Server(NetworkData):
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.server_16 == other.server_16 and
|
||||
self.server_data == other.server_data)
|
||||
return (self.server_16 == other.server_16 and self.server_data == other.server_data)
|
||||
|
||||
def __repr__(self):
|
||||
return "LowpanId(stable={}, server_16={}, server_data=b'{}')".format(
|
||||
self.stable, self.server_16, hexlify(self.server_data))
|
||||
return "LowpanId(stable={}, server_16={}, server_data=b'{}')".format(self.stable, self.server_16,
|
||||
hexlify(self.server_data))
|
||||
|
||||
|
||||
class ServerFactory(object):
|
||||
|
||||
@@ -133,16 +133,11 @@ class MacCounters:
|
||||
return self.counters == other.counters
|
||||
|
||||
def __repr__(self):
|
||||
return ('MacCounters(' +
|
||||
f'if_in_unknown_protos={self.if_in_unknown_protos}, ' +
|
||||
f'if_in_errors={self.if_in_errors}, ' +
|
||||
f'if_out_errors={self.if_out_errors}, ' +
|
||||
f'if_in_ucast_pkts={self.if_in_ucast_pkts}, ' +
|
||||
f'if_in_broadcast_pkts={self.if_in_broadcast_pkts}, ' +
|
||||
f'if_in_discards={self.if_in_discards}, ' +
|
||||
f'if_out_ucast_pkts={self.if_out_ucast_pkts}, ' +
|
||||
f'if_out_broadcast_pkts={self.if_out_broadcast_pkts}, ' +
|
||||
f'if_out_discards={self.if_out_discards})')
|
||||
return ('MacCounters(' + f'if_in_unknown_protos={self.if_in_unknown_protos}, ' +
|
||||
f'if_in_errors={self.if_in_errors}, ' + f'if_out_errors={self.if_out_errors}, ' +
|
||||
f'if_in_ucast_pkts={self.if_in_ucast_pkts}, ' + f'if_in_broadcast_pkts={self.if_in_broadcast_pkts}, ' +
|
||||
f'if_in_discards={self.if_in_discards}, ' + f'if_out_ucast_pkts={self.if_out_ucast_pkts}, ' +
|
||||
f'if_out_broadcast_pkts={self.if_out_broadcast_pkts}, ' + f'if_out_discards={self.if_out_discards})')
|
||||
|
||||
|
||||
class MacCountersFactory:
|
||||
@@ -221,8 +216,7 @@ class ChildTableEntry:
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
|
||||
return (self.timeout == other.timeout and
|
||||
self.child_id == other.child_id and self.mode == other.mode)
|
||||
return (self.timeout == other.timeout and self.child_id == other.child_id and self.mode == other.mode)
|
||||
|
||||
def __repr__(self):
|
||||
return f'ChildTableEntry(timeout={self.timeout}, child_id={self.child_id}, mode={self.mode})'
|
||||
|
||||
@@ -98,8 +98,7 @@ class MacExtendedAddress(object):
|
||||
return self.mac_address == other.mac_address
|
||||
|
||||
def __repr__(self):
|
||||
return "MacExtendedAddress(mac_address={})".format(
|
||||
hexlify(self.mac_address))
|
||||
return "MacExtendedAddress(mac_address={})".format(hexlify(self.mac_address))
|
||||
|
||||
|
||||
class MacExtendedAddressFactory(object):
|
||||
@@ -226,12 +225,10 @@ class RouterMask(object):
|
||||
|
||||
def __eq__(self, other):
|
||||
common.expect_the_same_class(self, other)
|
||||
return (self.id_sequence == other.id_sequence and
|
||||
self.router_id_mask == other.router_id_mask)
|
||||
return (self.id_sequence == other.id_sequence and self.router_id_mask == other.router_id_mask)
|
||||
|
||||
def __repr__(self):
|
||||
return "RouterMask(id_sequence={}, router_id_mask={})".format(
|
||||
self.id_sequence, hex(self.router_id_mask))
|
||||
return "RouterMask(id_sequence={}, router_id_mask={})".format(self.id_sequence, hex(self.router_id_mask))
|
||||
|
||||
|
||||
class RouterMaskFactory(object):
|
||||
@@ -257,8 +254,7 @@ class NdOption(object):
|
||||
return self.options == other.options
|
||||
|
||||
def __repr__(self):
|
||||
return "NdOption(options=[{}])".format(", ".join(
|
||||
[str(opt) for opt in self.options]))
|
||||
return "NdOption(options=[{}])".format(", ".join([str(opt) for opt in self.options]))
|
||||
|
||||
|
||||
class NdOptionFactory(object):
|
||||
@@ -307,8 +303,7 @@ class ThreadNetworkData(object):
|
||||
return self.tlvs == other.tlvs
|
||||
|
||||
def __repr__(self):
|
||||
return "ThreadNetworkData(tlvs=[{}])".format(", ".join(
|
||||
[str(tlv) for tlv in self.tlvs]))
|
||||
return "ThreadNetworkData(tlvs=[{}])".format(", ".join([str(tlv) for tlv in self.tlvs]))
|
||||
|
||||
|
||||
class ThreadNetworkDataFactory(object):
|
||||
|
||||
@@ -43,12 +43,7 @@ import binascii
|
||||
|
||||
class Node:
|
||||
|
||||
def __init__(self,
|
||||
nodeid,
|
||||
is_mtd=False,
|
||||
simulator=None,
|
||||
version=None,
|
||||
is_bbr=False):
|
||||
def __init__(self, nodeid, is_mtd=False, simulator=None, version=None, is_bbr=False):
|
||||
self.nodeid = nodeid
|
||||
self.verbose = int(float(os.getenv('VERBOSE', 0)))
|
||||
self.node_type = os.getenv('NODE_TYPE', 'sim')
|
||||
@@ -108,8 +103,8 @@ class Node:
|
||||
cmd = '%s/examples/apps/cli/ot-cli-%s' % (srcdir, mode)
|
||||
|
||||
if 'RADIO_DEVICE' in os.environ:
|
||||
cmd += ' --real-time-signal=+1 -v spinel+hdlc+uart://%s?forkpty-arg=%d' % (
|
||||
os.environ['RADIO_DEVICE'], nodeid)
|
||||
cmd += ' --real-time-signal=+1 -v spinel+hdlc+uart://%s?forkpty-arg=%d' % (os.environ['RADIO_DEVICE'],
|
||||
nodeid)
|
||||
else:
|
||||
cmd += ' %d' % nodeid
|
||||
|
||||
@@ -151,8 +146,8 @@ class Node:
|
||||
# If Thread version of node matches the testing environment version.
|
||||
if self.version == self.env_version:
|
||||
if 'RADIO_DEVICE' in os.environ:
|
||||
args = ' --real-time-signal=+1 spinel+hdlc+uart://%s?forkpty-arg=%d' % (
|
||||
os.environ['RADIO_DEVICE'], nodeid)
|
||||
args = ' --real-time-signal=+1 spinel+hdlc+uart://%s?forkpty-arg=%d' % (os.environ['RADIO_DEVICE'],
|
||||
nodeid)
|
||||
else:
|
||||
args = ''
|
||||
|
||||
@@ -190,8 +185,8 @@ class Node:
|
||||
# Load Thread 1.1 node when testing Thread 1.2 scenarios for interoperability.
|
||||
elif self.version == '1.1':
|
||||
if 'RADIO_DEVICE_1_1' in os.environ:
|
||||
args = ' --real-time-signal=+1 spinel+hdlc+uart://%s?forkpty-arg=%d' % (
|
||||
os.environ['RADIO_DEVICE_1_1'], nodeid)
|
||||
args = ' --real-time-signal=+1 spinel+hdlc+uart://%s?forkpty-arg=%d' % (os.environ['RADIO_DEVICE_1_1'],
|
||||
nodeid)
|
||||
else:
|
||||
args = ''
|
||||
|
||||
@@ -288,8 +283,7 @@ class Node:
|
||||
import fdpexpect
|
||||
|
||||
serialPort = '/dev/ttyUSB%d' % ((nodeid - 1) * 2)
|
||||
self.pexpect = fdpexpect.fdspawn(
|
||||
os.open(serialPort, os.O_RDWR | os.O_NONBLOCK | os.O_NOCTTY))
|
||||
self.pexpect = fdpexpect.fdspawn(os.open(serialPort, os.O_RDWR | os.O_NONBLOCK | os.O_NOCTTY))
|
||||
|
||||
def __del__(self):
|
||||
self.destroy()
|
||||
@@ -298,8 +292,7 @@ class Node:
|
||||
if not self._initialized:
|
||||
return
|
||||
|
||||
if (hasattr(self.pexpect, 'proc') and self.pexpect.proc.poll() is None
|
||||
or
|
||||
if (hasattr(self.pexpect, 'proc') and self.pexpect.proc.poll() is None or
|
||||
not hasattr(self.pexpect, 'proc') and self.pexpect.isalive()):
|
||||
print("%d: exit" % self.nodeid)
|
||||
self.pexpect.send('exit\n')
|
||||
@@ -316,8 +309,7 @@ class Node:
|
||||
dummy_format_str = br"\[THCI\].*?type=%s.*?"
|
||||
join_ent_ntf = dummy_format_str % br"JOIN_ENT\.ntf"
|
||||
join_ent_rsp = dummy_format_str % br"JOIN_ENT\.rsp"
|
||||
pattern = (b"(" + join_fin_req + b")|(" + join_fin_rsp + b")|(" +
|
||||
join_ent_ntf + b")|(" + join_ent_rsp + b")")
|
||||
pattern = (b"(" + join_fin_req + b")|(" + join_fin_rsp + b")|(" + join_ent_ntf + b")|(" + join_ent_rsp + b")")
|
||||
|
||||
messages = []
|
||||
# There are at most 4 cert messages both for joiner and commissioner
|
||||
@@ -351,11 +343,7 @@ class Node:
|
||||
res = re.search(hex_pattern, log)
|
||||
if not res:
|
||||
break
|
||||
data = [
|
||||
int(hex, 16)
|
||||
for hex in res.group(0)[1:-1].split(b' ')
|
||||
if hex and hex != b'..'
|
||||
]
|
||||
data = [int(hex, 16) for hex in res.group(0)[1:-1].split(b' ') if hex and hex != b'..']
|
||||
payload += bytearray(data)
|
||||
log = log[res.end() - 1:]
|
||||
|
||||
@@ -797,8 +785,7 @@ class Node:
|
||||
addrs = self.get_addrs()
|
||||
for addr in addrs:
|
||||
segs = addr.split(':')
|
||||
if (segs[4] == '0' and segs[5] == 'ff' and segs[6] == 'fe00' and
|
||||
segs[7] == 'fc00'):
|
||||
if (segs[4] == '0' and segs[5] == 'ff' and segs[6] == 'fe00' and segs[7] == 'fc00'):
|
||||
return addr
|
||||
return None
|
||||
|
||||
@@ -838,31 +825,26 @@ class Node:
|
||||
def __getGlobalAddress(self):
|
||||
global_address = []
|
||||
for ip6Addr in self.get_addrs():
|
||||
if ((not re.match(config.LINK_LOCAL_REGEX_PATTERN, ip6Addr, re.I))
|
||||
and (not re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN,
|
||||
ip6Addr, re.I)) and
|
||||
(not re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr,
|
||||
re.I))):
|
||||
if ((not re.match(config.LINK_LOCAL_REGEX_PATTERN, ip6Addr, re.I)) and
|
||||
(not re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr, re.I)) and
|
||||
(not re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr, re.I))):
|
||||
global_address.append(ip6Addr)
|
||||
|
||||
return global_address
|
||||
|
||||
def __getRloc(self):
|
||||
for ip6Addr in self.get_addrs():
|
||||
if (re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr, re.I)
|
||||
and re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr,
|
||||
re.I) and
|
||||
not (re.match(config.ALOC_FLAG_REGEX_PATTERN, ip6Addr,
|
||||
re.I))):
|
||||
if (re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr, re.I) and
|
||||
re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr, re.I) and
|
||||
not (re.match(config.ALOC_FLAG_REGEX_PATTERN, ip6Addr, re.I))):
|
||||
return ip6Addr
|
||||
return None
|
||||
|
||||
def __getAloc(self):
|
||||
aloc = []
|
||||
for ip6Addr in self.get_addrs():
|
||||
if (re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr, re.I)
|
||||
and re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr,
|
||||
re.I) and
|
||||
if (re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr, re.I) and
|
||||
re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr, re.I) and
|
||||
re.match(config.ALOC_FLAG_REGEX_PATTERN, ip6Addr, re.I)):
|
||||
aloc.append(ip6Addr)
|
||||
|
||||
@@ -870,10 +852,8 @@ class Node:
|
||||
|
||||
def __getMleid(self):
|
||||
for ip6Addr in self.get_addrs():
|
||||
if re.match(
|
||||
config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr,
|
||||
re.I) and not (re.match(
|
||||
config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr, re.I)):
|
||||
if re.match(config.MESH_LOCAL_PREFIX_REGEX_PATTERN, ip6Addr,
|
||||
re.I) and not (re.match(config.ROUTING_LOCATOR_REGEX_PATTERN, ip6Addr, re.I)):
|
||||
return ip6Addr
|
||||
|
||||
return None
|
||||
@@ -936,8 +916,7 @@ class Node:
|
||||
self._expect('Done')
|
||||
|
||||
def send_network_diag_get(self, addr, tlv_types):
|
||||
self.send_command('networkdiagnostic get %s %s' %
|
||||
(addr, ' '.join([str(t.value) for t in tlv_types])))
|
||||
self.send_command('networkdiagnostic get %s %s' % (addr, ' '.join([str(t.value) for t in tlv_types])))
|
||||
|
||||
if isinstance(self.simulator, simulator.VirtualTime):
|
||||
self.simulator.go(8)
|
||||
@@ -948,8 +927,7 @@ class Node:
|
||||
self._expect('Done', timeout=timeout)
|
||||
|
||||
def send_network_diag_reset(self, addr, tlv_types):
|
||||
self.send_command('networkdiagnostic reset %s %s' %
|
||||
(addr, ' '.join([str(t.value) for t in tlv_types])))
|
||||
self.send_command('networkdiagnostic reset %s %s' % (addr, ' '.join([str(t.value) for t in tlv_types])))
|
||||
|
||||
if isinstance(self.simulator, simulator.VirtualTime):
|
||||
self.simulator.go(8)
|
||||
@@ -992,9 +970,7 @@ class Node:
|
||||
def scan(self):
|
||||
self.send_command('scan')
|
||||
|
||||
return self._expect_results(
|
||||
r'\|\s(\S+)\s+\|\s(\S+)\s+\|\s([0-9a-fA-F]{4})\s\|\s([0-9a-fA-F]{16})\s\|\s(\d+)'
|
||||
)
|
||||
return self._expect_results(r'\|\s(\S+)\s+\|\s(\S+)\s+\|\s([0-9a-fA-F]{4})\s\|\s([0-9a-fA-F]{16})\s\|\s(\d+)')
|
||||
|
||||
def ping(self, ipaddr, num_responses=1, size=None, timeout=5):
|
||||
cmd = 'ping %s' % ipaddr
|
||||
@@ -1074,18 +1050,13 @@ class Node:
|
||||
self._expect('Done')
|
||||
|
||||
# Set the meshlocal prefix in config.py
|
||||
self.send_command('dataset meshlocalprefix %s' %
|
||||
config.MESH_LOCAL_PREFIX.split('/')[0])
|
||||
self.send_command('dataset meshlocalprefix %s' % config.MESH_LOCAL_PREFIX.split('/')[0])
|
||||
self._expect('Done')
|
||||
|
||||
self.send_command('dataset commit active')
|
||||
self._expect('Done')
|
||||
|
||||
def set_pending_dataset(self,
|
||||
pendingtimestamp,
|
||||
activetimestamp,
|
||||
panid=None,
|
||||
channel=None):
|
||||
def set_pending_dataset(self, pendingtimestamp, activetimestamp, panid=None, channel=None):
|
||||
self.send_command('dataset clear')
|
||||
self._expect('Done')
|
||||
|
||||
@@ -1108,8 +1079,7 @@ class Node:
|
||||
self._expect('Done')
|
||||
|
||||
# Set the meshlocal prefix in config.py
|
||||
self.send_command('dataset meshlocalprefix %s' %
|
||||
config.MESH_LOCAL_PREFIX.split('/')[0])
|
||||
self.send_command('dataset meshlocalprefix %s' % config.MESH_LOCAL_PREFIX.split('/')[0])
|
||||
self._expect('Done')
|
||||
|
||||
self.send_command('dataset commit pending')
|
||||
@@ -1272,10 +1242,9 @@ class Node:
|
||||
else:
|
||||
timeout = 5
|
||||
|
||||
self._expect(
|
||||
r'coap response from ([\da-f:]+)(?: OBS=(\d+))?'
|
||||
r'(?: with payload: ([\da-f]+))?\b',
|
||||
timeout=timeout)
|
||||
self._expect(r'coap response from ([\da-f:]+)(?: OBS=(\d+))?'
|
||||
r'(?: with payload: ([\da-f]+))?\b',
|
||||
timeout=timeout)
|
||||
(source, observe, payload) = self.pexpect.match.groups()
|
||||
source = source.decode('UTF-8')
|
||||
|
||||
@@ -1298,10 +1267,9 @@ class Node:
|
||||
else:
|
||||
timeout = 5
|
||||
|
||||
self._expect(
|
||||
r'coap request from ([\da-f:]+)(?: OBS=(\d+))?'
|
||||
r'(?: with payload: ([\da-f]+))?\b',
|
||||
timeout=timeout)
|
||||
self._expect(r'coap request from ([\da-f:]+)(?: OBS=(\d+))?'
|
||||
r'(?: with payload: ([\da-f]+))?\b',
|
||||
timeout=timeout)
|
||||
(source, observe, payload) = self.pexpect.match.groups()
|
||||
source = source.decode('UTF-8')
|
||||
|
||||
@@ -1336,10 +1304,7 @@ class Node:
|
||||
else:
|
||||
timeout = 5
|
||||
|
||||
self._expect(
|
||||
r'Received ACK in reply to notification '
|
||||
r'from ([\da-f:]+)\b',
|
||||
timeout=timeout)
|
||||
self._expect(r'Received ACK in reply to notification ' r'from ([\da-f:]+)\b', timeout=timeout)
|
||||
(source,) = self.pexpect.match.groups()
|
||||
source = source.decode('UTF-8')
|
||||
|
||||
|
||||
@@ -52,8 +52,7 @@ class BaseSimulator(object):
|
||||
def __init__(self):
|
||||
self._nodes = {}
|
||||
self.commissioning_messages = {}
|
||||
self._payload_parse_factory = mesh_cop.MeshCopCommandFactory(
|
||||
mesh_cop.create_default_mesh_cop_tlv_factories())
|
||||
self._payload_parse_factory = mesh_cop.MeshCopCommandFactory(mesh_cop.create_default_mesh_cop_tlv_factories())
|
||||
self._mesh_cop_msg_set = mesh_cop.create_mesh_cop_message_type_set()
|
||||
|
||||
def __del__(self):
|
||||
@@ -86,8 +85,7 @@ class BaseSimulator(object):
|
||||
payload,
|
||||
) in node.read_cert_messages_in_commissioning_log():
|
||||
if direction == b'send':
|
||||
msg = self._payload_parse_factory.parse(
|
||||
type.decode("utf-8"), io.BytesIO(payload))
|
||||
msg = self._payload_parse_factory.parse(type.decode("utf-8"), io.BytesIO(payload))
|
||||
self.commissioning_messages[nodeid].append(msg)
|
||||
|
||||
|
||||
@@ -184,9 +182,7 @@ class VirtualTime(BaseSimulator):
|
||||
self.devices[addr]['msgs'] += messages
|
||||
|
||||
except message.DropPacketException:
|
||||
print(
|
||||
'Drop current packet because it cannot be handled in test scripts'
|
||||
)
|
||||
print('Drop current packet because it cannot be handled in test scripts')
|
||||
except Exception as e:
|
||||
# Just print the exception to the console
|
||||
print("EXCEPTION: %s" % e)
|
||||
@@ -243,8 +239,7 @@ class VirtualTime(BaseSimulator):
|
||||
""" Receive events until all devices are asleep. """
|
||||
while True:
|
||||
if (self.current_event or len(self.awake_devices) or
|
||||
(self._next_event_time() > self._pause_time and
|
||||
self.current_nodeid)):
|
||||
(self._next_event_time() > self._pause_time and self.current_nodeid)):
|
||||
self.sock.settimeout(self.BLOCK_TIMEOUT)
|
||||
try:
|
||||
msg, addr = self.sock.recvfrom(self.MAX_MESSAGE)
|
||||
@@ -309,8 +304,7 @@ class VirtualTime(BaseSimulator):
|
||||
|
||||
self.awake_devices.discard(addr)
|
||||
|
||||
if (self.current_event and
|
||||
self.current_event[self.EVENT_ADDR] == addr):
|
||||
if (self.current_event and self.current_event[self.EVENT_ADDR] == addr):
|
||||
# print "Done\t", self.current_event
|
||||
self.current_event = None
|
||||
|
||||
@@ -331,8 +325,7 @@ class VirtualTime(BaseSimulator):
|
||||
# print "-- Enqueue\t", event
|
||||
bisect.insort(self.event_queue, event)
|
||||
|
||||
self._pcap.append(data,
|
||||
(event_time // 1000000, event_time % 1000000))
|
||||
self._pcap.append(data, (event_time // 1000000, event_time % 1000000))
|
||||
self._add_message(addr[1] - self.port, data)
|
||||
|
||||
# add radio transmit done events to event queue
|
||||
@@ -456,8 +449,7 @@ class VirtualTime(BaseSimulator):
|
||||
continue
|
||||
dbg_print('syncing', addr, elapsed)
|
||||
self.devices[addr]['time'] = self.current_time
|
||||
message = struct.pack('=QBH', elapsed,
|
||||
self.OT_SIM_EVENT_ALARM_FIRED, 0)
|
||||
message = struct.pack('=QBH', elapsed, self.OT_SIM_EVENT_ALARM_FIRED, 0)
|
||||
self._send_message(message, addr)
|
||||
self.awake_devices.add(addr)
|
||||
self.receive_events()
|
||||
|
||||
@@ -110,14 +110,12 @@ class SnifferSocketTransport(SnifferTransport):
|
||||
def _nodeid_to_address(self, nodeid, ip_address=''):
|
||||
return (
|
||||
ip_address,
|
||||
self.BASE_PORT + (self.PORT_OFFSET * self.WELLKNOWN_NODE_ID) +
|
||||
nodeid,
|
||||
self.BASE_PORT + (self.PORT_OFFSET * self.WELLKNOWN_NODE_ID) + nodeid,
|
||||
)
|
||||
|
||||
def _address_to_nodeid(self, address):
|
||||
_, port = address
|
||||
return (port - self.BASE_PORT -
|
||||
(self.PORT_OFFSET * self.WELLKNOWN_NODE_ID))
|
||||
return (port - self.BASE_PORT - (self.PORT_OFFSET * self.WELLKNOWN_NODE_ID))
|
||||
|
||||
def open(self):
|
||||
if self.is_opened:
|
||||
@@ -130,9 +128,8 @@ class SnifferSocketTransport(SnifferTransport):
|
||||
|
||||
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
|
||||
self._socket.setsockopt(
|
||||
socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
|
||||
socket.inet_aton(self.RADIO_GROUP) + socket.inet_aton('127.0.0.1'))
|
||||
self._socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
|
||||
socket.inet_aton(self.RADIO_GROUP) + socket.inet_aton('127.0.0.1'))
|
||||
self._socket.bind(self._nodeid_to_address(self.WELLKNOWN_NODE_ID))
|
||||
|
||||
def close(self):
|
||||
|
||||
@@ -146,8 +146,7 @@ class TestCoapMessageOptionHeader(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(extended_value + 269, actual_value)
|
||||
|
||||
def test_should_create_CoapOptionHeader_when_from_bytes_classmethod_is_called(
|
||||
self):
|
||||
def test_should_create_CoapOptionHeader_when_from_bytes_classmethod_is_called(self):
|
||||
# GIVEN
|
||||
delta = any_4bits_value_different_than_13_and_14()
|
||||
length = any_4bits_value_different_than_13_and_14()
|
||||
@@ -161,8 +160,7 @@ class TestCoapMessageOptionHeader(unittest.TestCase):
|
||||
self.assertEqual(delta, option_header.delta)
|
||||
self.assertEqual(length, option_header.length)
|
||||
|
||||
def test_should_return_True_when_is_payload_marker_property_called_with_delta_and_length_equal_15(
|
||||
self):
|
||||
def test_should_return_True_when_is_payload_marker_property_called_with_delta_and_length_equal_15(self):
|
||||
# GIVEN
|
||||
delta = 15
|
||||
length = 15
|
||||
@@ -205,8 +203,7 @@ class TestCoapOption(unittest.TestCase):
|
||||
|
||||
class TestCoapOptionsFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_list_of_CoapOption_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_list_of_CoapOption_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
delta = any_4bits_value_lower_or_equal_than_12()
|
||||
length = any_4bits_value_lower_or_equal_than_12()
|
||||
@@ -276,8 +273,7 @@ class TestCoapCode(unittest.TestCase):
|
||||
_class, detail = actual_dotted.split(".")
|
||||
self.assertEqual(code, (int(_class) << 5) | int(detail))
|
||||
|
||||
def test_should_create_CoapCode_when_from_class_and_detail_classmethod_is_called(
|
||||
self):
|
||||
def test_should_create_CoapCode_when_from_class_and_detail_classmethod_is_called(self):
|
||||
# GIVEN
|
||||
code = any_code()
|
||||
|
||||
@@ -290,8 +286,7 @@ class TestCoapCode(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(code, actual_coap_obj.code)
|
||||
|
||||
def test_should_create_CoapCode_when_from_dotted_string_classmethod_is_called(
|
||||
self):
|
||||
def test_should_create_CoapCode_when_from_dotted_string_classmethod_is_called(self):
|
||||
# GIVEN
|
||||
code = any_code()
|
||||
|
||||
@@ -366,8 +361,7 @@ class TestCoapMessage(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(code, actual_code)
|
||||
|
||||
def test_should_return_message_id_value_when_message_id_property_is_called(
|
||||
self):
|
||||
def test_should_return_message_id_value_when_message_id_property_is_called(self):
|
||||
# GIVEN
|
||||
message_id = any_message_id()
|
||||
|
||||
@@ -467,8 +461,7 @@ class TestCoapMessage(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(payload, actual_payload)
|
||||
|
||||
def test_should_return_uri_path_value_when_uri_path_property_is_called(
|
||||
self):
|
||||
def test_should_return_uri_path_value_when_uri_path_property_is_called(self):
|
||||
# GIVEN
|
||||
uri_path = any_uri_path()
|
||||
|
||||
@@ -492,8 +485,7 @@ class TestCoapMessage(unittest.TestCase):
|
||||
|
||||
class TestCoapMessageIdToUriPathBinder(unittest.TestCase):
|
||||
|
||||
def test_should_add_uri_path_to_binds_when_add_uri_path_for_method_is_called(
|
||||
self):
|
||||
def test_should_add_uri_path_to_binds_when_add_uri_path_for_method_is_called(self):
|
||||
# GIVEN
|
||||
message_id = any_message_id()
|
||||
token = any_token()
|
||||
@@ -507,8 +499,7 @@ class TestCoapMessageIdToUriPathBinder(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(uri_path, binder.get_uri_path_for(message_id, token))
|
||||
|
||||
def test_should_raise_KeyError_when_get_uri_path_for_is_called_but_it_is_not_present_in_database(
|
||||
self):
|
||||
def test_should_raise_KeyError_when_get_uri_path_for_is_called_but_it_is_not_present_in_database(self):
|
||||
# GIVEN
|
||||
message_id = any_message_id()
|
||||
token = any_token()
|
||||
@@ -517,8 +508,7 @@ class TestCoapMessageIdToUriPathBinder(unittest.TestCase):
|
||||
binder = coap.CoapMessageIdToUriPathBinder()
|
||||
|
||||
# THEN
|
||||
self.assertRaises(RuntimeError, binder.get_uri_path_for, message_id,
|
||||
token)
|
||||
self.assertRaises(RuntimeError, binder.get_uri_path_for, message_id, token)
|
||||
|
||||
|
||||
class TestCoapMessageFactory(unittest.TestCase):
|
||||
@@ -535,14 +525,11 @@ class TestCoapMessageFactory(unittest.TestCase):
|
||||
def _create_coap_message_factory(self):
|
||||
return coap.CoapMessageFactory(
|
||||
options_factory=coap.CoapOptionsFactory(),
|
||||
uri_path_based_payload_factories={
|
||||
"/a/as": self._create_dummy_payload_factory()
|
||||
},
|
||||
uri_path_based_payload_factories={"/a/as": self._create_dummy_payload_factory()},
|
||||
message_id_to_uri_path_binder=coap.CoapMessageIdToUriPathBinder(),
|
||||
)
|
||||
|
||||
def test_should_create_CoapMessage_from_solicit_request_data_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_CoapMessage_from_solicit_request_data_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
data = bytearray([
|
||||
0x42,
|
||||
@@ -606,8 +593,7 @@ class TestCoapMessageFactory(unittest.TestCase):
|
||||
coap_message.payload,
|
||||
)
|
||||
|
||||
def test_should_create_CoapMessage_from_solicit_response_data_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_CoapMessage_from_solicit_response_data_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
data = bytearray([
|
||||
0x62,
|
||||
@@ -642,9 +628,7 @@ class TestCoapMessageFactory(unittest.TestCase):
|
||||
|
||||
factory = coap.CoapMessageFactory(
|
||||
options_factory=coap.CoapOptionsFactory(),
|
||||
uri_path_based_payload_factories={
|
||||
"/a/as": self._create_dummy_payload_factory()
|
||||
},
|
||||
uri_path_based_payload_factories={"/a/as": self._create_dummy_payload_factory()},
|
||||
message_id_to_uri_path_binder=mid_binder,
|
||||
)
|
||||
|
||||
|
||||
@@ -52,8 +52,7 @@ def any_ipv6_address():
|
||||
|
||||
class TestMessageInfo(unittest.TestCase):
|
||||
|
||||
def test_should_return_source_ipv6_value_when_source_ipv6_property_is_called(
|
||||
self):
|
||||
def test_should_return_source_ipv6_value_when_source_ipv6_property_is_called(self):
|
||||
# GIVEN
|
||||
source_ipv6 = any_ipv6_address()
|
||||
|
||||
@@ -64,11 +63,9 @@ class TestMessageInfo(unittest.TestCase):
|
||||
actual_source_ipv6 = message_info.source_ipv6
|
||||
|
||||
# THEN
|
||||
self.assertEqual(ipaddress.ip_address(bytes(source_ipv6)),
|
||||
actual_source_ipv6)
|
||||
self.assertEqual(ipaddress.ip_address(bytes(source_ipv6)), actual_source_ipv6)
|
||||
|
||||
def test_should_return_destination_ipv6_value_when_destination_ipv6_property_is_called(
|
||||
self):
|
||||
def test_should_return_destination_ipv6_value_when_destination_ipv6_property_is_called(self):
|
||||
# GIVEN
|
||||
destination_ipv6 = any_ipv6_address()
|
||||
|
||||
@@ -84,8 +81,7 @@ class TestMessageInfo(unittest.TestCase):
|
||||
actual_destination_ipv6,
|
||||
)
|
||||
|
||||
def test_should_return_source_eui64_value_when_source_eui64_property_is_called(
|
||||
self):
|
||||
def test_should_return_source_eui64_value_when_source_eui64_property_is_called(self):
|
||||
# GIVEN
|
||||
source_mac_address = any_eui64()
|
||||
|
||||
@@ -98,8 +94,7 @@ class TestMessageInfo(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(source_mac_address, actual_source_mac_address)
|
||||
|
||||
def test_should_return_destination_eui64_value_when_destination_eui64_property_is_called(
|
||||
self):
|
||||
def test_should_return_destination_eui64_value_when_destination_eui64_property_is_called(self):
|
||||
# GIVEN
|
||||
destination_mac_address = any_eui64()
|
||||
|
||||
@@ -110,14 +105,12 @@ class TestMessageInfo(unittest.TestCase):
|
||||
actual_destination_mac_address = message_info.destination_mac_address
|
||||
|
||||
# THEN
|
||||
self.assertEqual(destination_mac_address,
|
||||
actual_destination_mac_address)
|
||||
self.assertEqual(destination_mac_address, actual_destination_mac_address)
|
||||
|
||||
|
||||
class TestMacAddress(unittest.TestCase):
|
||||
|
||||
def test_should_create_MacAddress_from_eui64_when_from_eui64_classmethod_is_called(
|
||||
self):
|
||||
def test_should_create_MacAddress_from_eui64_when_from_eui64_classmethod_is_called(self):
|
||||
# GIVEN
|
||||
eui64 = any_eui64()
|
||||
|
||||
@@ -128,8 +121,7 @@ class TestMacAddress(unittest.TestCase):
|
||||
self.assertEqual(common.MacAddressType.LONG, mac_address.type)
|
||||
self.assertEqual(eui64, mac_address.mac_address)
|
||||
|
||||
def test_should_create_MacAddress_from_rloc16_int_when_from_rloc16_classmethod_is_called(
|
||||
self):
|
||||
def test_should_create_MacAddress_from_rloc16_int_when_from_rloc16_classmethod_is_called(self):
|
||||
# GIVEN
|
||||
rloc16 = any_rloc16_int()
|
||||
|
||||
@@ -140,8 +132,7 @@ class TestMacAddress(unittest.TestCase):
|
||||
self.assertEqual(common.MacAddressType.SHORT, mac_address.type)
|
||||
self.assertEqual(struct.pack(">H", rloc16), mac_address.mac_address)
|
||||
|
||||
def test_should_create_MacAddress_from_rloc16_bytearray_when_from_rloc16_classmethod_is_called(
|
||||
self):
|
||||
def test_should_create_MacAddress_from_rloc16_bytearray_when_from_rloc16_classmethod_is_called(self):
|
||||
# GIVEN
|
||||
rloc16 = any_rloc16_bytearray()
|
||||
|
||||
@@ -152,8 +143,7 @@ class TestMacAddress(unittest.TestCase):
|
||||
self.assertEqual(common.MacAddressType.SHORT, mac_address.type)
|
||||
self.assertEqual(rloc16, mac_address.mac_address)
|
||||
|
||||
def test_should_convert_short_MacAddress_to_iid_when_convert_method_is_called(
|
||||
self):
|
||||
def test_should_convert_short_MacAddress_to_iid_when_convert_method_is_called(self):
|
||||
# GIVEN
|
||||
rloc16 = any_rloc16_bytearray()
|
||||
|
||||
@@ -163,11 +153,9 @@ class TestMacAddress(unittest.TestCase):
|
||||
iid = mac_address.convert_to_iid()
|
||||
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00]) + rloc16, iid)
|
||||
self.assertEqual(bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00]) + rloc16, iid)
|
||||
|
||||
def test_should_convert_eui64_MacAddress_to_iid_when_convert_method_is_called(
|
||||
self):
|
||||
def test_should_convert_eui64_MacAddress_to_iid_when_convert_method_is_called(self):
|
||||
# GIVEN
|
||||
eui64 = any_eui64()
|
||||
|
||||
|
||||
@@ -36,15 +36,12 @@ import ipaddress
|
||||
import common
|
||||
import net_crypto
|
||||
|
||||
master_key = bytearray([
|
||||
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
|
||||
0xcc, 0xdd, 0xee, 0xff
|
||||
])
|
||||
master_key = bytearray(
|
||||
[0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff])
|
||||
|
||||
|
||||
def convert_aux_sec_hdr_to_bytearray(aux_sec_hdr):
|
||||
data = bytearray(
|
||||
[aux_sec_hdr.security_level | ((aux_sec_hdr.key_id_mode & 0x03) << 3)])
|
||||
data = bytearray([aux_sec_hdr.security_level | ((aux_sec_hdr.key_id_mode & 0x03) << 3)])
|
||||
data += struct.pack("<L", aux_sec_hdr.frame_counter)
|
||||
data += aux_sec_hdr.key_id
|
||||
return data
|
||||
@@ -76,8 +73,7 @@ def any_auxiliary_security_header():
|
||||
key_id_mode = any_key_id_mode()
|
||||
key_id = any_key_id(key_id_mode)
|
||||
|
||||
return net_crypto.AuxiliarySecurityHeader(key_id_mode, any_security_level(),
|
||||
any_frame_counter(), key_id)
|
||||
return net_crypto.AuxiliarySecurityHeader(key_id_mode, any_security_level(), any_frame_counter(), key_id)
|
||||
|
||||
|
||||
def any_frame_counter():
|
||||
@@ -100,8 +96,7 @@ def any_master_key():
|
||||
|
||||
class TestCryptoEngine(unittest.TestCase):
|
||||
|
||||
def test_should_decrypt_bytearray_to_mle_message_when_decrypt_method_is_called(
|
||||
self):
|
||||
def test_should_decrypt_bytearray_to_mle_message_when_decrypt_method_is_called(self):
|
||||
# GIVEN
|
||||
message_info = common.MessageInfo()
|
||||
message_info.source_mac_address = common.MacAddress.from_eui64(
|
||||
@@ -110,38 +105,32 @@ class TestCryptoEngine(unittest.TestCase):
|
||||
message_info.source_ipv6 = "fe80::235:cc94:d77a:07e8"
|
||||
message_info.destination_ipv6 = "ff02::2"
|
||||
|
||||
message_info.aux_sec_hdr = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode=2,
|
||||
security_level=5,
|
||||
frame_counter=262165,
|
||||
key_id=bytearray([0x00, 0x00, 0x00, 0x00, 0x01]))
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(
|
||||
message_info.aux_sec_hdr)
|
||||
message_info.aux_sec_hdr = net_crypto.AuxiliarySecurityHeader(key_id_mode=2,
|
||||
security_level=5,
|
||||
frame_counter=262165,
|
||||
key_id=bytearray([0x00, 0x00, 0x00, 0x00, 0x01]))
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(message_info.aux_sec_hdr)
|
||||
|
||||
data = bytearray([
|
||||
0x9a, 0x5a, 0x9a, 0x5b, 0xba, 0x25, 0x9c, 0x5e, 0x58, 0xa2, 0x7e,
|
||||
0x75, 0x74, 0xef, 0x79, 0xbc, 0x4f, 0xa3, 0xf9, 0xae, 0xa8, 0x34,
|
||||
0xf6, 0xf2, 0x37, 0x21, 0x93, 0x60
|
||||
0x9a, 0x5a, 0x9a, 0x5b, 0xba, 0x25, 0x9c, 0x5e, 0x58, 0xa2, 0x7e, 0x75, 0x74, 0xef, 0x79, 0xbc, 0x4f, 0xa3,
|
||||
0xf9, 0xae, 0xa8, 0x34, 0xf6, 0xf2, 0x37, 0x21, 0x93, 0x60
|
||||
])
|
||||
|
||||
mic = bytearray([0xe1, 0xb5, 0xa2, 0x53])
|
||||
|
||||
net_crypto_engine = net_crypto.CryptoEngine(
|
||||
net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
net_crypto_engine = net_crypto.CryptoEngine(net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
|
||||
# WHEN
|
||||
mle_msg = net_crypto_engine.decrypt(data, mic, message_info)
|
||||
|
||||
# THEN
|
||||
expected_mle_msg = bytearray([
|
||||
0x04, 0x00, 0x02, 0x00, 0x00, 0x09, 0x0b, 0x8f, 0x80, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0xf1, 0x0b, 0x08, 0x65, 0x5e,
|
||||
0x0f, 0x83, 0x40, 0xc7, 0x83, 0x31
|
||||
0x04, 0x00, 0x02, 0x00, 0x00, 0x09, 0x0b, 0x8f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0xf1,
|
||||
0x0b, 0x08, 0x65, 0x5e, 0x0f, 0x83, 0x40, 0xc7, 0x83, 0x31
|
||||
])
|
||||
self.assertEqual(expected_mle_msg, mle_msg)
|
||||
|
||||
def test_should_encrypt_mle_message_to_bytearray_when_encrypt_method_is_called(
|
||||
self):
|
||||
def test_should_encrypt_mle_message_to_bytearray_when_encrypt_method_is_called(self):
|
||||
# GIVEN
|
||||
message_info = common.MessageInfo()
|
||||
message_info.source_mac_address = common.MacAddress.from_eui64(
|
||||
@@ -150,37 +139,31 @@ class TestCryptoEngine(unittest.TestCase):
|
||||
message_info.source_ipv6 = "fe80::235:cc94:d77a:07e8"
|
||||
message_info.destination_ipv6 = "ff02::2"
|
||||
|
||||
message_info.aux_sec_hdr = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode=2,
|
||||
security_level=5,
|
||||
frame_counter=262165,
|
||||
key_id=bytearray([0x00, 0x00, 0x00, 0x00, 0x01]))
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(
|
||||
message_info.aux_sec_hdr)
|
||||
message_info.aux_sec_hdr = net_crypto.AuxiliarySecurityHeader(key_id_mode=2,
|
||||
security_level=5,
|
||||
frame_counter=262165,
|
||||
key_id=bytearray([0x00, 0x00, 0x00, 0x00, 0x01]))
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(message_info.aux_sec_hdr)
|
||||
|
||||
mle_msg = bytearray([
|
||||
0x04, 0x00, 0x02, 0x00, 0x00, 0x09, 0x0b, 0x8f, 0x80, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0xf1, 0x0b, 0x08, 0x65, 0x5e,
|
||||
0x0f, 0x83, 0x40, 0xc7, 0x83, 0x31
|
||||
0x04, 0x00, 0x02, 0x00, 0x00, 0x09, 0x0b, 0x8f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0xf1,
|
||||
0x0b, 0x08, 0x65, 0x5e, 0x0f, 0x83, 0x40, 0xc7, 0x83, 0x31
|
||||
])
|
||||
|
||||
net_crypto_engine = net_crypto.CryptoEngine(
|
||||
net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
net_crypto_engine = net_crypto.CryptoEngine(net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
|
||||
# WHEN
|
||||
encrypted_data, mic = net_crypto_engine.encrypt(mle_msg, message_info)
|
||||
|
||||
# THEN
|
||||
expected_encrypted_data = bytearray([
|
||||
0x9a, 0x5a, 0x9a, 0x5b, 0xba, 0x25, 0x9c, 0x5e, 0x58, 0xa2, 0x7e,
|
||||
0x75, 0x74, 0xef, 0x79, 0xbc, 0x4f, 0xa3, 0xf9, 0xae, 0xa8, 0x34,
|
||||
0xf6, 0xf2, 0x37, 0x21, 0x93, 0x60, 0xe1, 0xb5, 0xa2, 0x53
|
||||
0x9a, 0x5a, 0x9a, 0x5b, 0xba, 0x25, 0x9c, 0x5e, 0x58, 0xa2, 0x7e, 0x75, 0x74, 0xef, 0x79, 0xbc, 0x4f, 0xa3,
|
||||
0xf9, 0xae, 0xa8, 0x34, 0xf6, 0xf2, 0x37, 0x21, 0x93, 0x60, 0xe1, 0xb5, 0xa2, 0x53
|
||||
])
|
||||
|
||||
self.assertEqual(expected_encrypted_data, encrypted_data + mic)
|
||||
|
||||
def test_should_encrypt_and_decrypt_random_data_content_when_proper_methods_are_called(
|
||||
self):
|
||||
def test_should_encrypt_and_decrypt_random_data_content_when_proper_methods_are_called(self):
|
||||
# GIVEN
|
||||
data = any_data()
|
||||
|
||||
@@ -190,22 +173,18 @@ class TestCryptoEngine(unittest.TestCase):
|
||||
security_level = 5
|
||||
|
||||
message_info = common.MessageInfo()
|
||||
message_info.source_mac_address = common.MacAddress.from_eui64(
|
||||
any_eui64())
|
||||
message_info.source_mac_address = common.MacAddress.from_eui64(any_eui64())
|
||||
|
||||
message_info.source_ipv6 = any_ip_address()
|
||||
message_info.destination_ipv6 = any_ip_address()
|
||||
|
||||
message_info.aux_sec_hdr = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode=key_id_mode,
|
||||
security_level=security_level,
|
||||
frame_counter=any_frame_counter(),
|
||||
key_id=any_key_id(key_id_mode))
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(
|
||||
message_info.aux_sec_hdr)
|
||||
message_info.aux_sec_hdr = net_crypto.AuxiliarySecurityHeader(key_id_mode=key_id_mode,
|
||||
security_level=security_level,
|
||||
frame_counter=any_frame_counter(),
|
||||
key_id=any_key_id(key_id_mode))
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(message_info.aux_sec_hdr)
|
||||
|
||||
net_crypto_engine = net_crypto.CryptoEngine(
|
||||
net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
net_crypto_engine = net_crypto.CryptoEngine(net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
|
||||
# WHEN
|
||||
enc_data, mic = net_crypto_engine.encrypt(data, message_info)
|
||||
@@ -223,8 +202,7 @@ class TestCryptoMaterialCreator(unittest.TestCase):
|
||||
Test vectors was taken from thread specification.
|
||||
"""
|
||||
|
||||
def test_should_generate_mle_and_mac_key_when_generate_keys_method_is_called_with_sequence_counter_equal_0(
|
||||
self):
|
||||
def test_should_generate_mle_and_mac_key_when_generate_keys_method_is_called_with_sequence_counter_equal_0(self):
|
||||
"""
|
||||
7.1.4.1 Test Vector 1
|
||||
"""
|
||||
@@ -240,19 +218,14 @@ class TestCryptoMaterialCreator(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
mle_key,
|
||||
bytearray([
|
||||
0x54, 0x45, 0xf4, 0x15, 0x8f, 0xd7, 0x59, 0x12, 0x17, 0x58,
|
||||
0x09, 0xf8, 0xb5, 0x7a, 0x66, 0xa4
|
||||
]))
|
||||
bytearray([0x54, 0x45, 0xf4, 0x15, 0x8f, 0xd7, 0x59, 0x12, 0x17, 0x58, 0x09, 0xf8, 0xb5, 0x7a, 0x66,
|
||||
0xa4]))
|
||||
self.assertEqual(
|
||||
mac_key,
|
||||
bytearray([
|
||||
0xde, 0x89, 0xc5, 0x3a, 0xf3, 0x82, 0xb4, 0x21, 0xe0, 0xfd,
|
||||
0xe5, 0xa9, 0xba, 0xe3, 0xbe, 0xf0
|
||||
]))
|
||||
bytearray([0xde, 0x89, 0xc5, 0x3a, 0xf3, 0x82, 0xb4, 0x21, 0xe0, 0xfd, 0xe5, 0xa9, 0xba, 0xe3, 0xbe,
|
||||
0xf0]))
|
||||
|
||||
def test_should_generate_mle_and_mac_key_when_generate_keys_method_is_called_with_sequence_counter_equal_1(
|
||||
self):
|
||||
def test_should_generate_mle_and_mac_key_when_generate_keys_method_is_called_with_sequence_counter_equal_1(self):
|
||||
"""
|
||||
7.1.4.2 Test Vector 2
|
||||
"""
|
||||
@@ -268,19 +241,14 @@ class TestCryptoMaterialCreator(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
mle_key,
|
||||
bytearray([
|
||||
0x8f, 0x4c, 0xd1, 0xa2, 0x7d, 0x95, 0xc0, 0x7d, 0x12, 0xdb,
|
||||
0x89, 0x74, 0xbd, 0x61, 0x5c, 0x13
|
||||
]))
|
||||
bytearray([0x8f, 0x4c, 0xd1, 0xa2, 0x7d, 0x95, 0xc0, 0x7d, 0x12, 0xdb, 0x89, 0x74, 0xbd, 0x61, 0x5c,
|
||||
0x13]))
|
||||
self.assertEqual(
|
||||
mac_key,
|
||||
bytearray([
|
||||
0x9b, 0xe0, 0xd1, 0xaf, 0x7b, 0xd8, 0x73, 0x50, 0xde, 0xab,
|
||||
0xcd, 0xd0, 0x7f, 0xeb, 0xb9, 0xd5
|
||||
]))
|
||||
bytearray([0x9b, 0xe0, 0xd1, 0xaf, 0x7b, 0xd8, 0x73, 0x50, 0xde, 0xab, 0xcd, 0xd0, 0x7f, 0xeb, 0xb9,
|
||||
0xd5]))
|
||||
|
||||
def test_should_generate_mle_and_mac_key_when_generate_keys_method_is_called_with_sequence_counter_equal_2(
|
||||
self):
|
||||
def test_should_generate_mle_and_mac_key_when_generate_keys_method_is_called_with_sequence_counter_equal_2(self):
|
||||
"""
|
||||
7.1.4.3 Test Vector 3
|
||||
"""
|
||||
@@ -296,16 +264,12 @@ class TestCryptoMaterialCreator(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
mle_key,
|
||||
bytearray([
|
||||
0x01, 0x6e, 0x2a, 0xb8, 0xec, 0x88, 0x87, 0x96, 0x87, 0xa7,
|
||||
0x2e, 0x0a, 0x35, 0x7e, 0xcf, 0x2a
|
||||
]))
|
||||
bytearray([0x01, 0x6e, 0x2a, 0xb8, 0xec, 0x88, 0x87, 0x96, 0x87, 0xa7, 0x2e, 0x0a, 0x35, 0x7e, 0xcf,
|
||||
0x2a]))
|
||||
self.assertEqual(
|
||||
mac_key,
|
||||
bytearray([
|
||||
0x56, 0x41, 0x09, 0xe9, 0xd2, 0xaa, 0xd7, 0xf7, 0x23, 0xec,
|
||||
0x3b, 0x96, 0x11, 0x0e, 0xef, 0xa3
|
||||
]))
|
||||
bytearray([0x56, 0x41, 0x09, 0xe9, 0xd2, 0xaa, 0xd7, 0xf7, 0x23, 0xec, 0x3b, 0x96, 0x11, 0x0e, 0xef,
|
||||
0xa3]))
|
||||
|
||||
|
||||
class TestMleCryptoMaterialCreator(unittest.TestCase):
|
||||
@@ -319,8 +283,7 @@ class TestMleCryptoMaterialCreator(unittest.TestCase):
|
||||
creator = net_crypto.MleCryptoMaterialCreator(master_key)
|
||||
|
||||
# WHEN
|
||||
nonce = creator._create_nonce(source_eui64, frame_counter,
|
||||
security_level)
|
||||
nonce = creator._create_nonce(source_eui64, frame_counter, security_level)
|
||||
|
||||
# THEN
|
||||
nonce_bytes = io.BytesIO(nonce)
|
||||
@@ -329,8 +292,7 @@ class TestMleCryptoMaterialCreator(unittest.TestCase):
|
||||
self.assertEqual(struct.pack(">L", frame_counter), nonce_bytes.read(4))
|
||||
self.assertEqual(security_level, ord(nonce_bytes.read(1)))
|
||||
|
||||
def test_should_create_authenticated_data_when_create_authenticated_data_method_is_called(
|
||||
self):
|
||||
def test_should_create_authenticated_data_when_create_authenticated_data_method_is_called(self):
|
||||
"""
|
||||
Only Key id mode 2.
|
||||
Length of the Auxiliary Security Header is constantly equal 10.
|
||||
@@ -339,68 +301,55 @@ class TestMleCryptoMaterialCreator(unittest.TestCase):
|
||||
# GIVEN
|
||||
source_address = any_ip_address()
|
||||
destination_address = any_ip_address()
|
||||
auxiliary_security_header_bytes = convert_aux_sec_hdr_to_bytearray(
|
||||
any_auxiliary_security_header())
|
||||
auxiliary_security_header_bytes = convert_aux_sec_hdr_to_bytearray(any_auxiliary_security_header())
|
||||
|
||||
creator = net_crypto.MleCryptoMaterialCreator(master_key)
|
||||
|
||||
# WHEN
|
||||
authenticated_data = creator._create_authenticated_data(
|
||||
source_address, destination_address,
|
||||
auxiliary_security_header_bytes)
|
||||
authenticated_data = creator._create_authenticated_data(source_address, destination_address,
|
||||
auxiliary_security_header_bytes)
|
||||
|
||||
# THEN
|
||||
authenticated_data_bytes = io.BytesIO(authenticated_data)
|
||||
|
||||
self.assertEqual(source_address.packed,
|
||||
authenticated_data_bytes.read(16))
|
||||
self.assertEqual(destination_address.packed,
|
||||
authenticated_data_bytes.read(16))
|
||||
self.assertEqual(auxiliary_security_header_bytes,
|
||||
authenticated_data_bytes.read(10))
|
||||
self.assertEqual(source_address.packed, authenticated_data_bytes.read(16))
|
||||
self.assertEqual(destination_address.packed, authenticated_data_bytes.read(16))
|
||||
self.assertEqual(auxiliary_security_header_bytes, authenticated_data_bytes.read(10))
|
||||
|
||||
def test_should_create_key_and_nonce_and_auth_data_when_create_key_and_nonce_and_auth_data_is_called(
|
||||
self):
|
||||
def test_should_create_key_and_nonce_and_auth_data_when_create_key_and_nonce_and_auth_data_is_called(self):
|
||||
# GIVEN
|
||||
message_info = common.MessageInfo()
|
||||
message_info.source_mac_address = common.MacAddress.from_eui64(
|
||||
any_eui64())
|
||||
message_info.source_mac_address = common.MacAddress.from_eui64(any_eui64())
|
||||
|
||||
message_info.source_ipv6 = any_ip_address()
|
||||
message_info.destination_ipv6 = any_ip_address()
|
||||
|
||||
message_info.aux_sec_hdr = any_auxiliary_security_header()
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(
|
||||
message_info.aux_sec_hdr)
|
||||
message_info.aux_sec_hdr_bytes = convert_aux_sec_hdr_to_bytearray(message_info.aux_sec_hdr)
|
||||
|
||||
creator = net_crypto.MleCryptoMaterialCreator(master_key)
|
||||
|
||||
# WHEN
|
||||
key, nonce, auth_data = creator.create_key_and_nonce_and_authenticated_data(
|
||||
message_info)
|
||||
key, nonce, auth_data = creator.create_key_and_nonce_and_authenticated_data(message_info)
|
||||
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
message_info.source_mac_address.mac_address +
|
||||
struct.pack(">LB", message_info.aux_sec_hdr.frame_counter,
|
||||
message_info.aux_sec_hdr.security_level), nonce)
|
||||
struct.pack(">LB", message_info.aux_sec_hdr.frame_counter, message_info.aux_sec_hdr.security_level), nonce)
|
||||
|
||||
self.assertEqual(
|
||||
message_info.source_ipv6.packed +
|
||||
message_info.destination_ipv6.packed +
|
||||
message_info.aux_sec_hdr_bytes, auth_data)
|
||||
message_info.source_ipv6.packed + message_info.destination_ipv6.packed + message_info.aux_sec_hdr_bytes,
|
||||
auth_data)
|
||||
|
||||
|
||||
class TestAuxiliarySecurityHeader(unittest.TestCase):
|
||||
|
||||
def test_should_return_key_id_mode_value_when_key_id_mode_property_is_called(
|
||||
self):
|
||||
def test_should_return_key_id_mode_value_when_key_id_mode_property_is_called(self):
|
||||
# GIVEN
|
||||
key_id_mode = any_key_id_mode()
|
||||
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode, any_security_level(), any_frame_counter(),
|
||||
any_key_id(key_id_mode))
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(key_id_mode, any_security_level(), any_frame_counter(),
|
||||
any_key_id(key_id_mode))
|
||||
|
||||
# WHEN
|
||||
actual_key_id_mode = aux_sec_hdr_obj.key_id_mode
|
||||
@@ -408,15 +357,13 @@ class TestAuxiliarySecurityHeader(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(key_id_mode, actual_key_id_mode)
|
||||
|
||||
def test_should_return_security_level_value_when_security_level_property_is_called(
|
||||
self):
|
||||
def test_should_return_security_level_value_when_security_level_property_is_called(self):
|
||||
# GIVEN
|
||||
security_level = any_security_level()
|
||||
key_id_mode = any_key_id_mode()
|
||||
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode, security_level, any_frame_counter(),
|
||||
any_key_id(key_id_mode))
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(key_id_mode, security_level, any_frame_counter(),
|
||||
any_key_id(key_id_mode))
|
||||
|
||||
# WHEN
|
||||
actual_security_level = aux_sec_hdr_obj.security_level
|
||||
@@ -424,15 +371,13 @@ class TestAuxiliarySecurityHeader(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(security_level, actual_security_level)
|
||||
|
||||
def test_should_return_frame_counter_value_when_frame_counter_property_is_called(
|
||||
self):
|
||||
def test_should_return_frame_counter_value_when_frame_counter_property_is_called(self):
|
||||
# GIVEN
|
||||
frame_counter = any_frame_counter()
|
||||
key_id_mode = any_key_id_mode()
|
||||
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode, any_security_level(), frame_counter,
|
||||
any_key_id(key_id_mode))
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(key_id_mode, any_security_level(), frame_counter,
|
||||
any_key_id(key_id_mode))
|
||||
|
||||
# WHEN
|
||||
actual_frame_counter = aux_sec_hdr_obj.frame_counter
|
||||
@@ -445,8 +390,8 @@ class TestAuxiliarySecurityHeader(unittest.TestCase):
|
||||
key_id_mode = any_key_id_mode()
|
||||
key_id = any_key_id(key_id_mode)
|
||||
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode, any_security_level(), any_frame_counter(), key_id)
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(key_id_mode, any_security_level(), any_frame_counter(),
|
||||
key_id)
|
||||
|
||||
# WHEN
|
||||
actual_key_id = aux_sec_hdr_obj.key_id
|
||||
@@ -454,27 +399,24 @@ class TestAuxiliarySecurityHeader(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(key_id, actual_key_id)
|
||||
|
||||
def test_should_return_sequence_counter_value_when_sequence_counter_property_is_called(
|
||||
self):
|
||||
def test_should_return_sequence_counter_value_when_sequence_counter_property_is_called(self):
|
||||
# GIVEN
|
||||
key_id_mode = 2
|
||||
key_id = any_key_id(key_id_mode)
|
||||
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(
|
||||
key_id_mode, any_security_level(), any_frame_counter(), key_id)
|
||||
aux_sec_hdr_obj = net_crypto.AuxiliarySecurityHeader(key_id_mode, any_security_level(), any_frame_counter(),
|
||||
key_id)
|
||||
|
||||
# WHEN
|
||||
actual_sequence_counter = aux_sec_hdr_obj.sequence_counter
|
||||
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
struct.unpack(">I", key_id[:4])[0], actual_sequence_counter)
|
||||
self.assertEqual(struct.unpack(">I", key_id[:4])[0], actual_sequence_counter)
|
||||
|
||||
|
||||
class TestAuxiliarySecurityHeaderFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_AuxiliarySecurityHeader_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_AuxiliarySecurityHeader_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
key_id_mode = any_key_id_mode()
|
||||
sec_lvl = any_security_level()
|
||||
@@ -483,15 +425,13 @@ class TestAuxiliarySecurityHeaderFactory(unittest.TestCase):
|
||||
|
||||
factory = net_crypto.AuxiliarySecurityHeaderFactory()
|
||||
|
||||
data = bytearray([sec_lvl | key_id_mode << 3]) + struct.pack(
|
||||
"<I", frame_counter) + key_id
|
||||
data = bytearray([sec_lvl | key_id_mode << 3]) + struct.pack("<I", frame_counter) + key_id
|
||||
|
||||
# WHEN
|
||||
aux_sec_hdr = factory.parse(io.BytesIO(data), common.MessageInfo())
|
||||
|
||||
# THEN
|
||||
self.assertTrue(
|
||||
isinstance(aux_sec_hdr, net_crypto.AuxiliarySecurityHeader))
|
||||
self.assertTrue(isinstance(aux_sec_hdr, net_crypto.AuxiliarySecurityHeader))
|
||||
self.assertEqual(key_id_mode, aux_sec_hdr.key_id_mode)
|
||||
self.assertEqual(sec_lvl, aux_sec_hdr.security_level)
|
||||
self.assertEqual(frame_counter, aux_sec_hdr.frame_counter)
|
||||
|
||||
@@ -45,8 +45,7 @@ class TestDiag(thread_cert.TestCase):
|
||||
('diag\n', 'diagnostics mode is disabled\r\n'),
|
||||
('diag send 10 100\n', 'Error 13: InvalidState\r\n'),
|
||||
('diag start\n', 'Done\r\n'),
|
||||
('diag invalid test\n',
|
||||
'diag feature \'invalid\' is not supported'),
|
||||
('diag invalid test\n', 'diag feature \'invalid\' is not supported'),
|
||||
('diag', 'diagnostics mode is enabled\r\n'),
|
||||
('diag channel 10\n', 'failed\r\nstatus 0x7\r\n'),
|
||||
('diag channel 11\n', 'set channel to 11\r\nstatus 0x00\r\n'),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -63,10 +63,8 @@ class TestIPv6Fragmentation(thread_cert.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
|
||||
|
||||
mleid_leader = self.nodes[LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
mleid_router = self.nodes[ROUTER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID)
|
||||
mleid_leader = self.nodes[LEADER].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
mleid_router = self.nodes[ROUTER].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
|
||||
self.nodes[LEADER].udp_start("::", common.UDP_TEST_PORT)
|
||||
self.nodes[ROUTER].udp_start("::", common.UDP_TEST_PORT)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -45,8 +45,7 @@ class TestMacParser(unittest.TestCase):
|
||||
frame = mac802154.MacFrame()
|
||||
frame.parse(io.BytesIO(bytearray([0x12, 0x00, 0x12, 0x34, 0x56])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.ACK,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.ACK, frame.header.frame_type)
|
||||
self.assertEqual(True, frame.header.frame_pending)
|
||||
self.assertEqual(False, frame.header.ack_request)
|
||||
self.assertEqual(0, frame.header.frame_version)
|
||||
@@ -57,14 +56,9 @@ class TestMacParser(unittest.TestCase):
|
||||
def test_should_parse_data_frame_with_short_addresses(self):
|
||||
frame = mac802154.MacFrame()
|
||||
frame.parse(
|
||||
io.BytesIO(
|
||||
bytearray([
|
||||
0x61, 0x88, 0x34, 0xce, 0xfa, 0xad, 0xde, 0xef, 0xbe, 0x12,
|
||||
0x34, 0xfe, 0xdc
|
||||
])))
|
||||
io.BytesIO(bytearray([0x61, 0x88, 0x34, 0xce, 0xfa, 0xad, 0xde, 0xef, 0xbe, 0x12, 0x34, 0xfe, 0xdc])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(0, frame.header.frame_version)
|
||||
@@ -82,26 +76,22 @@ class TestMacParser(unittest.TestCase):
|
||||
frame.parse(
|
||||
io.BytesIO(
|
||||
bytearray([
|
||||
0x61, 0xcc, 0x56, 0xce, 0xfa, 0xde, 0xad, 0xbe, 0xef, 0xde,
|
||||
0xad, 0xbe, 0xef, 0x0b, 0xad, 0xf0, 0x0d, 0xba, 0xd0, 0xd0,
|
||||
0x0d, 0x12, 0x34, 0xfe, 0xdc
|
||||
0x61, 0xcc, 0x56, 0xce, 0xfa, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0x0b, 0xad, 0xf0,
|
||||
0x0d, 0xba, 0xd0, 0xd0, 0x0d, 0x12, 0x34, 0xfe, 0xdc
|
||||
])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(0, frame.header.frame_version)
|
||||
self.assertEqual(0x56, frame.header.seq)
|
||||
self.assertEqual(bytearray([0xfe, 0xdc]), frame.header.fcs)
|
||||
self.assertEqual(0xface, frame.header.dest_pan_id)
|
||||
self.assertEqual(
|
||||
bytearray(reversed([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe,
|
||||
0xef])), frame.header.dest_address.mac_address)
|
||||
self.assertEqual(bytearray(reversed([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef])),
|
||||
frame.header.dest_address.mac_address)
|
||||
self.assertEqual(0xface, frame.header.src_pan_id)
|
||||
self.assertEqual(
|
||||
bytearray(reversed([0x0b, 0xad, 0xf0, 0x0d, 0xba, 0xd0, 0xd0,
|
||||
0x0d])), frame.header.src_address.mac_address)
|
||||
self.assertEqual(bytearray(reversed([0x0b, 0xad, 0xf0, 0x0d, 0xba, 0xd0, 0xd0, 0x0d])),
|
||||
frame.header.src_address.mac_address)
|
||||
|
||||
self.assertEqual(bytearray([0x12, 0x34]), frame.payload.data)
|
||||
|
||||
@@ -110,12 +100,11 @@ class TestMacParser(unittest.TestCase):
|
||||
frame.parse(
|
||||
io.BytesIO(
|
||||
bytearray([
|
||||
0x61, 0xc8, 0x56, 0xce, 0xfa, 0xad, 0xde, 0x0b, 0xad, 0xf0,
|
||||
0x0d, 0xba, 0xd0, 0xd0, 0x0d, 0x12, 0x34, 0xfe, 0xdc
|
||||
0x61, 0xc8, 0x56, 0xce, 0xfa, 0xad, 0xde, 0x0b, 0xad, 0xf0, 0x0d, 0xba, 0xd0, 0xd0, 0x0d, 0x12,
|
||||
0x34, 0xfe, 0xdc
|
||||
])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(0, frame.header.frame_version)
|
||||
@@ -124,9 +113,8 @@ class TestMacParser(unittest.TestCase):
|
||||
self.assertEqual(0xface, frame.header.dest_pan_id)
|
||||
self.assertEqual(0xdead, frame.header.dest_address.rloc)
|
||||
self.assertEqual(0xface, frame.header.src_pan_id)
|
||||
self.assertEqual(
|
||||
bytearray(reversed([0x0b, 0xad, 0xf0, 0x0d, 0xba, 0xd0, 0xd0,
|
||||
0x0d])), frame.header.src_address.mac_address)
|
||||
self.assertEqual(bytearray(reversed([0x0b, 0xad, 0xf0, 0x0d, 0xba, 0xd0, 0xd0, 0x0d])),
|
||||
frame.header.src_address.mac_address)
|
||||
|
||||
self.assertEqual(bytearray([0x12, 0x34]), frame.payload.data)
|
||||
|
||||
@@ -135,21 +123,19 @@ class TestMacParser(unittest.TestCase):
|
||||
frame.parse(
|
||||
io.BytesIO(
|
||||
bytearray([
|
||||
0x61, 0x8c, 0x56, 0xce, 0xfa, 0xde, 0xad, 0xbe, 0xef, 0xde,
|
||||
0xad, 0xbe, 0xef, 0x0d, 0xf0, 0x12, 0x34, 0xfe, 0xdc
|
||||
0x61, 0x8c, 0x56, 0xce, 0xfa, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0x0d, 0xf0, 0x12,
|
||||
0x34, 0xfe, 0xdc
|
||||
])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(0, frame.header.frame_version)
|
||||
self.assertEqual(0x56, frame.header.seq)
|
||||
self.assertEqual(bytearray([0xfe, 0xdc]), frame.header.fcs)
|
||||
self.assertEqual(0xface, frame.header.dest_pan_id)
|
||||
self.assertEqual(
|
||||
bytearray(reversed([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe,
|
||||
0xef])), frame.header.dest_address.mac_address)
|
||||
self.assertEqual(bytearray(reversed([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef])),
|
||||
frame.header.dest_address.mac_address)
|
||||
self.assertEqual(0xface, frame.header.src_pan_id)
|
||||
self.assertEqual(0xf00d, frame.header.src_address.rloc)
|
||||
|
||||
@@ -157,15 +143,9 @@ class TestMacParser(unittest.TestCase):
|
||||
|
||||
def test_should_parse_data_request_command(self):
|
||||
frame = mac802154.MacFrame()
|
||||
frame.parse(
|
||||
io.BytesIO(
|
||||
bytearray([
|
||||
0x63, 0x88, 0x78, 0xce, 0xfa, 0xad, 0xde, 0x0d, 0xf0, 0x04,
|
||||
0xfe, 0xdc
|
||||
])))
|
||||
frame.parse(io.BytesIO(bytearray([0x63, 0x88, 0x78, 0xce, 0xfa, 0xad, 0xde, 0x0d, 0xf0, 0x04, 0xfe, 0xdc])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.COMMAND,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.COMMAND, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(0, frame.header.frame_version)
|
||||
@@ -181,10 +161,7 @@ class TestMacParser(unittest.TestCase):
|
||||
def test_should_decrypt_data_frame(self):
|
||||
|
||||
mac802154.DeviceDescriptors.add(
|
||||
0x2001,
|
||||
MacAddress(
|
||||
bytearray([0x16, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x07]),
|
||||
MacAddressType.LONG))
|
||||
0x2001, MacAddress(bytearray([0x16, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x07]), MacAddressType.LONG))
|
||||
|
||||
frame = mac802154.MacFrame()
|
||||
frame.parse(
|
||||
@@ -249,8 +226,7 @@ class TestMacParser(unittest.TestCase):
|
||||
0xfc
|
||||
]))) # FCS (valid)
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.DATA, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(1, frame.header.frame_version)
|
||||
@@ -267,10 +243,9 @@ class TestMacParser(unittest.TestCase):
|
||||
self.assertEqual(
|
||||
bytes(
|
||||
bytearray([
|
||||
0x7c, 0x77, 0x80, 0xf0, 0x4d, 0x4d, 0x4d, 0x4d, 0xe0, 0x04,
|
||||
0x44, 0x02, 0x44, 0x66, 0x13, 0x5f, 0x22, 0x80, 0xb1, 0x61,
|
||||
0x02, 0x61, 0x73, 0x11, 0x2a, 0xff, 0x01, 0x08, 0x16, 0x6e,
|
||||
0x0a, 0x00, 0x00, 0x00, 0x00, 0x07
|
||||
0x7c, 0x77, 0x80, 0xf0, 0x4d, 0x4d, 0x4d, 0x4d, 0xe0, 0x04, 0x44, 0x02, 0x44, 0x66, 0x13, 0x5f,
|
||||
0x22, 0x80, 0xb1, 0x61, 0x02, 0x61, 0x73, 0x11, 0x2a, 0xff, 0x01, 0x08, 0x16, 0x6e, 0x0a, 0x00,
|
||||
0x00, 0x00, 0x00, 0x07
|
||||
])), frame.payload.data)
|
||||
|
||||
def test_should_decrypt_command_frame(self):
|
||||
@@ -278,27 +253,23 @@ class TestMacParser(unittest.TestCase):
|
||||
frame.parse(
|
||||
io.BytesIO(
|
||||
bytearray([
|
||||
0x6b, 0xdc, 0xce, 0xce, 0xfa, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0a, 0x6e, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x6e,
|
||||
0x16, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x2d, 0xbc,
|
||||
0x12, 0xbe, 0x0a, 0x4f
|
||||
0x6b, 0xdc, 0xce, 0xce, 0xfa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x6e, 0x16, 0x03, 0x00, 0x00,
|
||||
0x00, 0x00, 0x0a, 0x6e, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x2d, 0xbc, 0x12, 0xbe,
|
||||
0x0a, 0x4f
|
||||
])))
|
||||
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.COMMAND,
|
||||
frame.header.frame_type)
|
||||
self.assertEqual(mac802154.MacHeader.FrameType.COMMAND, frame.header.frame_type)
|
||||
self.assertEqual(False, frame.header.frame_pending)
|
||||
self.assertEqual(True, frame.header.ack_request)
|
||||
self.assertEqual(1, frame.header.frame_version)
|
||||
self.assertEqual(206, frame.header.seq)
|
||||
self.assertEqual(bytearray([0x0a, 0x4f]), frame.header.fcs)
|
||||
self.assertEqual(0xface, frame.header.dest_pan_id)
|
||||
self.assertEqual(
|
||||
bytearray([0x16, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x02]),
|
||||
frame.header.dest_address.mac_address)
|
||||
self.assertEqual(bytearray([0x16, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x02]),
|
||||
frame.header.dest_address.mac_address)
|
||||
self.assertEqual(0xface, frame.header.src_pan_id)
|
||||
self.assertEqual(
|
||||
bytearray([0x16, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x03]),
|
||||
frame.header.src_address.mac_address)
|
||||
self.assertEqual(bytearray([0x16, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x03]),
|
||||
frame.header.src_address.mac_address)
|
||||
|
||||
self.assertEqual(0, frame.header.aux_sec_header.frame_counter)
|
||||
self.assertEqual(5, frame.header.aux_sec_header.security_level)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -58,9 +58,8 @@ def convert_border_router_to_bytearray(border_router):
|
||||
data = struct.pack(
|
||||
">HBB",
|
||||
border_router.border_router_16,
|
||||
(border_router.o & 0x01) | ((border_router.r & 0x01) << 1) |
|
||||
((border_router.c & 0x01) << 2) | ((border_router.d & 0x01) << 3) |
|
||||
((border_router.s & 0x01) << 4) | ((border_router.p & 0x01) << 5) |
|
||||
(border_router.o & 0x01) | ((border_router.r & 0x01) << 1) | ((border_router.c & 0x01) << 2) |
|
||||
((border_router.d & 0x01) << 3) | ((border_router.s & 0x01) << 4) | ((border_router.p & 0x01) << 5) |
|
||||
((border_router.prf & 0x03) << 6),
|
||||
((border_router.n & 0x01) << 7),
|
||||
)
|
||||
@@ -69,8 +68,7 @@ def convert_border_router_to_bytearray(border_router):
|
||||
|
||||
|
||||
def convert_lowpan_id_to_bytearray(lowpan_id):
|
||||
return bytearray(
|
||||
[lowpan_id.cid | (lowpan_id.c << 4), lowpan_id.context_length])
|
||||
return bytearray([lowpan_id.cid | (lowpan_id.c << 4), lowpan_id.context_length])
|
||||
|
||||
|
||||
def convert_prefix_sub_tlvs_to_bytearray(sub_tlvs):
|
||||
@@ -123,8 +121,7 @@ def convert_service_to_bytearray(service):
|
||||
((service.t & 0x01) << 7) | ((service.id) & 0x0F),
|
||||
service.enterprise_number,
|
||||
service.service_data_length,
|
||||
) + service.service_data +
|
||||
convert_service_sub_tlvs_to_bytearray(service.sub_tlvs))
|
||||
) + service.service_data + convert_service_sub_tlvs_to_bytearray(service.sub_tlvs))
|
||||
|
||||
|
||||
def any_border_router_16():
|
||||
@@ -162,9 +159,7 @@ def any_prefix(prefix_length=None):
|
||||
if prefix_length is None:
|
||||
prefix_length = any_prefix_length()
|
||||
|
||||
return bytearray([
|
||||
random.getrandbits(8) for _ in range(int(math.ceil(prefix_length / 8)))
|
||||
])
|
||||
return bytearray([random.getrandbits(8) for _ in range(int(math.ceil(prefix_length / 8)))])
|
||||
|
||||
|
||||
def any_p():
|
||||
@@ -219,8 +214,7 @@ def any_border_router():
|
||||
|
||||
|
||||
def any_lowpan_id():
|
||||
return network_data.LowpanId(any_c(), any_cid(), any_context_length(),
|
||||
any_stable())
|
||||
return network_data.LowpanId(any_c(), any_cid(), any_context_length(), any_stable())
|
||||
|
||||
|
||||
def any_prefix_sub_tlvs():
|
||||
@@ -291,8 +285,7 @@ def any_stable():
|
||||
|
||||
class TestRoute(unittest.TestCase):
|
||||
|
||||
def test_should_return_border_router_16_value_when_border_router_16_property_is_called(
|
||||
self):
|
||||
def test_should_return_border_router_16_value_when_border_router_16_property_is_called(self):
|
||||
# GIVEN
|
||||
border_router_16 = any_border_router_16()
|
||||
|
||||
@@ -319,16 +312,14 @@ class TestRoute(unittest.TestCase):
|
||||
|
||||
class TestRouteFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Route_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Route_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
border_router_16 = any_border_router_16()
|
||||
prf = any_prf()
|
||||
|
||||
factory = network_data.RouteFactory()
|
||||
|
||||
data = convert_route_to_bytearray(
|
||||
network_data.Route(border_router_16, prf))
|
||||
data = convert_route_to_bytearray(network_data.Route(border_router_16, prf))
|
||||
|
||||
# WHEN
|
||||
actual_route = factory.parse(io.BytesIO(data), None)
|
||||
@@ -341,8 +332,7 @@ class TestRouteFactory(unittest.TestCase):
|
||||
|
||||
class TestRoutesFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Route_list_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Route_list_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
routes = any_routes()
|
||||
|
||||
@@ -386,14 +376,12 @@ class TestHasRoute(unittest.TestCase):
|
||||
|
||||
class TestHasRouteFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_HasRoute_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_HasRoute_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
routes = any_routes()
|
||||
stable = any_stable()
|
||||
|
||||
factory = network_data.HasRouteFactory(
|
||||
network_data.RoutesFactory(network_data.RouteFactory()))
|
||||
factory = network_data.HasRouteFactory(network_data.RoutesFactory(network_data.RouteFactory()))
|
||||
|
||||
data = convert_routes_to_bytearray(routes)
|
||||
|
||||
@@ -411,8 +399,7 @@ class TestHasRouteFactory(unittest.TestCase):
|
||||
|
||||
class TestPrefix(unittest.TestCase):
|
||||
|
||||
def test_should_return_domain_id_value_when_domain_id_property_is_called(
|
||||
self):
|
||||
def test_should_return_domain_id_value_when_domain_id_property_is_called(self):
|
||||
# GIVEN
|
||||
domain_id = any_domain_id()
|
||||
|
||||
@@ -430,8 +417,7 @@ class TestPrefix(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(domain_id, actual_domain_id)
|
||||
|
||||
def test_should_return_prefix_length_value_when_prefix_length_property_is_called(
|
||||
self):
|
||||
def test_should_return_prefix_length_value_when_prefix_length_property_is_called(self):
|
||||
# GIVEN
|
||||
prefix_length = any_prefix_length()
|
||||
|
||||
@@ -467,8 +453,7 @@ class TestPrefix(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(prefix, actual_prefix)
|
||||
|
||||
def test_should_return_sub_tlvs_value_when_sub_tlvs_property_is_called(
|
||||
self):
|
||||
def test_should_return_sub_tlvs_value_when_sub_tlvs_property_is_called(self):
|
||||
# GIVEN
|
||||
sub_tlvs = any_prefix_sub_tlvs()
|
||||
|
||||
@@ -507,13 +492,11 @@ class TestPrefix(unittest.TestCase):
|
||||
|
||||
class TestPrefixSubTlvsFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_SubTlvs_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_SubTlvs_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
sub_tlvs = any_prefix_sub_tlvs()
|
||||
|
||||
factory = network_data.PrefixSubTlvsFactory(
|
||||
config.create_default_network_data_prefix_sub_tlvs_factories())
|
||||
factory = network_data.PrefixSubTlvsFactory(config.create_default_network_data_prefix_sub_tlvs_factories())
|
||||
|
||||
data = convert_prefix_sub_tlvs_to_bytearray(sub_tlvs)
|
||||
|
||||
@@ -527,19 +510,16 @@ class TestPrefixSubTlvsFactory(unittest.TestCase):
|
||||
|
||||
class TestPrefixFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Prefix_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Prefix_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
domain_id = any_domain_id()
|
||||
prefix_length = any_prefix_length()
|
||||
prefix = any_prefix(prefix_length)
|
||||
sub_tlvs = any_prefix_sub_tlvs()
|
||||
|
||||
factory = network_data.PrefixFactory(
|
||||
config.create_default_network_data_prefix_sub_tlvs_factory())
|
||||
factory = network_data.PrefixFactory(config.create_default_network_data_prefix_sub_tlvs_factory())
|
||||
|
||||
data = (bytearray([domain_id, prefix_length]) + prefix +
|
||||
convert_prefix_sub_tlvs_to_bytearray(sub_tlvs))
|
||||
data = (bytearray([domain_id, prefix_length]) + prefix + convert_prefix_sub_tlvs_to_bytearray(sub_tlvs))
|
||||
|
||||
message_info = common.MessageInfo()
|
||||
|
||||
@@ -556,8 +536,7 @@ class TestPrefixFactory(unittest.TestCase):
|
||||
|
||||
class TestBorderRouter(unittest.TestCase):
|
||||
|
||||
def test_should_return_border_router_16_value_when_border_router_16_property_is_called(
|
||||
self):
|
||||
def test_should_return_border_router_16_value_when_border_router_16_property_is_called(self):
|
||||
# GIVEN
|
||||
border_router_16 = any_border_router_16()
|
||||
|
||||
@@ -790,8 +769,7 @@ class TestBorderRouter(unittest.TestCase):
|
||||
|
||||
class TestBorderRouterFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_BorderRouter_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_BorderRouter_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
border_router_16 = any_border_router_16()
|
||||
prf = any_prf()
|
||||
@@ -807,8 +785,7 @@ class TestBorderRouterFactory(unittest.TestCase):
|
||||
factory = network_data.BorderRouterFactory()
|
||||
|
||||
data = convert_border_router_to_bytearray(
|
||||
network_data.BorderRouter(border_router_16, prf, p, s, d, c, r, o,
|
||||
n, stable))
|
||||
network_data.BorderRouter(border_router_16, prf, p, s, d, c, r, o, n, stable))
|
||||
|
||||
message_info = common.MessageInfo()
|
||||
message_info.stable = stable
|
||||
@@ -817,10 +794,8 @@ class TestBorderRouterFactory(unittest.TestCase):
|
||||
actual_border_router = factory.parse(io.BytesIO(data), message_info)
|
||||
|
||||
# THEN
|
||||
self.assertTrue(
|
||||
isinstance(actual_border_router, network_data.BorderRouter))
|
||||
self.assertEqual(border_router_16,
|
||||
actual_border_router.border_router_16)
|
||||
self.assertTrue(isinstance(actual_border_router, network_data.BorderRouter))
|
||||
self.assertEqual(border_router_16, actual_border_router.border_router_16)
|
||||
self.assertEqual(prf, actual_border_router.prf)
|
||||
self.assertEqual(p, actual_border_router.p)
|
||||
self.assertEqual(s, actual_border_router.s)
|
||||
@@ -838,8 +813,7 @@ class TestLowpanId(unittest.TestCase):
|
||||
# GIVEN
|
||||
c = any_c()
|
||||
|
||||
lowpan_id = network_data.LowpanId(c, any_cid(), any_context_length(),
|
||||
any_stable())
|
||||
lowpan_id = network_data.LowpanId(c, any_cid(), any_context_length(), any_stable())
|
||||
|
||||
# WHEN
|
||||
actual_c = lowpan_id.c
|
||||
@@ -851,8 +825,7 @@ class TestLowpanId(unittest.TestCase):
|
||||
# GIVEN
|
||||
cid = any_cid()
|
||||
|
||||
lowpan_id = network_data.LowpanId(any_c(), cid, any_context_length(),
|
||||
any_stable())
|
||||
lowpan_id = network_data.LowpanId(any_c(), cid, any_context_length(), any_stable())
|
||||
|
||||
# WHEN
|
||||
actual_cid = lowpan_id.cid
|
||||
@@ -860,13 +833,11 @@ class TestLowpanId(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(cid, actual_cid)
|
||||
|
||||
def test_should_return_context_length_value_when_context_length_property_is_called(
|
||||
self):
|
||||
def test_should_return_context_length_value_when_context_length_property_is_called(self):
|
||||
# GIVEN
|
||||
context_length = any_context_length()
|
||||
|
||||
lowpan_id = network_data.LowpanId(any_c(), any_cid(), context_length,
|
||||
any_stable())
|
||||
lowpan_id = network_data.LowpanId(any_c(), any_cid(), context_length, any_stable())
|
||||
|
||||
# WHEN
|
||||
actual_context_length = lowpan_id.context_length
|
||||
@@ -878,8 +849,7 @@ class TestLowpanId(unittest.TestCase):
|
||||
# GIVEN
|
||||
stable = any_stable()
|
||||
|
||||
lowpan_id = network_data.LowpanId(any_c(), any_cid(),
|
||||
any_context_length(), stable)
|
||||
lowpan_id = network_data.LowpanId(any_c(), any_cid(), any_context_length(), stable)
|
||||
|
||||
# WHEN
|
||||
actual_stable = lowpan_id.stable
|
||||
@@ -890,8 +860,7 @@ class TestLowpanId(unittest.TestCase):
|
||||
|
||||
class TestLowpanIdFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_LowpanId_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_LowpanId_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
c = any_c()
|
||||
cid = any_cid()
|
||||
@@ -900,8 +869,7 @@ class TestLowpanIdFactory(unittest.TestCase):
|
||||
|
||||
factory = network_data.LowpanIdFactory()
|
||||
|
||||
data = convert_lowpan_id_to_bytearray(
|
||||
network_data.LowpanId(c, cid, context_length, stable))
|
||||
data = convert_lowpan_id_to_bytearray(network_data.LowpanId(c, cid, context_length, stable))
|
||||
|
||||
message_info = common.MessageInfo()
|
||||
message_info.stable = stable
|
||||
@@ -958,8 +926,7 @@ class TestService(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(_id, actual_id)
|
||||
|
||||
def test_should_return_enterprise_number_value_when_enterprise_number_property_is_called(
|
||||
self):
|
||||
def test_should_return_enterprise_number_value_when_enterprise_number_property_is_called(self):
|
||||
# GIVEN
|
||||
enterprise_number = any_enterprise_number()
|
||||
|
||||
@@ -979,8 +946,7 @@ class TestService(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(enterprise_number, actual_enterprise_number)
|
||||
|
||||
def test_should_return_service_data_length_value_when_service_data_length_property_is_called(
|
||||
self):
|
||||
def test_should_return_service_data_length_value_when_service_data_length_property_is_called(self):
|
||||
# GIVEN
|
||||
service_data_length = any_service_data_length()
|
||||
|
||||
@@ -1000,8 +966,7 @@ class TestService(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(service_data_length, actual_service_data_length)
|
||||
|
||||
def test_should_return_service_data_value_when_service_data_property_is_called(
|
||||
self):
|
||||
def test_should_return_service_data_value_when_service_data_property_is_called(self):
|
||||
# GIVEN
|
||||
service_data = any_service_data()
|
||||
|
||||
@@ -1021,8 +986,7 @@ class TestService(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(service_data, actual_service_data)
|
||||
|
||||
def test_should_return_sub_tlvs_value_when_sub_tlvs_property_is_called(
|
||||
self):
|
||||
def test_should_return_sub_tlvs_value_when_sub_tlvs_property_is_called(self):
|
||||
# GIVEN
|
||||
sub_tlvs = any_service_sub_tlvs()
|
||||
|
||||
@@ -1065,13 +1029,11 @@ class TestService(unittest.TestCase):
|
||||
|
||||
class TestServiceSubTlvsFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_SubTlvs_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_SubTlvs_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
sub_tlvs = any_service_sub_tlvs()
|
||||
|
||||
factory = network_data.ServiceSubTlvsFactory(
|
||||
config.create_default_network_data_service_sub_tlvs_factories())
|
||||
factory = network_data.ServiceSubTlvsFactory(config.create_default_network_data_service_sub_tlvs_factories())
|
||||
|
||||
data = convert_service_sub_tlvs_to_bytearray(sub_tlvs)
|
||||
|
||||
@@ -1085,8 +1047,7 @@ class TestServiceSubTlvsFactory(unittest.TestCase):
|
||||
|
||||
class TestServiceFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Service_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Service_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
t = any_t()
|
||||
_id = any_id()
|
||||
@@ -1096,8 +1057,7 @@ class TestServiceFactory(unittest.TestCase):
|
||||
sub_tlvs = any_service_sub_tlvs()
|
||||
stable = any_stable()
|
||||
|
||||
factory = network_data.ServiceFactory(
|
||||
config.create_default_network_data_service_sub_tlvs_factory())
|
||||
factory = network_data.ServiceFactory(config.create_default_network_data_service_sub_tlvs_factory())
|
||||
|
||||
data = convert_service_to_bytearray(
|
||||
network_data.Service(
|
||||
@@ -1121,16 +1081,14 @@ class TestServiceFactory(unittest.TestCase):
|
||||
self.assertEqual(t, actual_service.t)
|
||||
self.assertEqual(_id, actual_service.id)
|
||||
self.assertEqual(enterprise_number, actual_service.enterprise_number)
|
||||
self.assertEqual(service_data_length,
|
||||
actual_service.service_data_length)
|
||||
self.assertEqual(service_data_length, actual_service.service_data_length)
|
||||
self.assertEqual(service_data, actual_service.service_data)
|
||||
self.assertEqual(sub_tlvs, actual_service.sub_tlvs)
|
||||
|
||||
|
||||
class TestServer(unittest.TestCase):
|
||||
|
||||
def test_should_return_server_16_value_when_server_16_property_is_called(
|
||||
self):
|
||||
def test_should_return_server_16_value_when_server_16_property_is_called(self):
|
||||
# GIVEN
|
||||
server_16 = any_server_16()
|
||||
|
||||
@@ -1142,8 +1100,7 @@ class TestServer(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(server_16, actual_server_16)
|
||||
|
||||
def test_should_return_server_data_value_when_server_data_property_is_called(
|
||||
self):
|
||||
def test_should_return_server_data_value_when_server_data_property_is_called(self):
|
||||
# GIVEN
|
||||
server_data = any_server_data()
|
||||
|
||||
@@ -1170,8 +1127,7 @@ class TestServer(unittest.TestCase):
|
||||
|
||||
class TestServerFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Server_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Server_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
server_16 = any_server_16()
|
||||
server_data = any_server_data()
|
||||
@@ -1179,8 +1135,7 @@ class TestServerFactory(unittest.TestCase):
|
||||
|
||||
factory = network_data.ServerFactory()
|
||||
|
||||
data = convert_server_to_bytearray(
|
||||
network_data.Server(server_16, server_data, stable))
|
||||
data = convert_server_to_bytearray(network_data.Server(server_16, server_data, stable))
|
||||
|
||||
message_info = common.MessageInfo()
|
||||
message_info.stable = stable
|
||||
|
||||
@@ -105,8 +105,7 @@ class TestTargetEid(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(eid, actual_eid)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
eid = any_eid()
|
||||
|
||||
@@ -118,8 +117,7 @@ class TestTargetEid(unittest.TestCase):
|
||||
|
||||
class TestTargetEidFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_TargetEid_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_TargetEid_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
eid = any_eid()
|
||||
|
||||
@@ -135,8 +133,7 @@ class TestTargetEidFactory(unittest.TestCase):
|
||||
|
||||
class TestMacExtendedAddress(unittest.TestCase):
|
||||
|
||||
def test_should_return_mac_address_value_when_mac_address_property_is_called(
|
||||
self):
|
||||
def test_should_return_mac_address_value_when_mac_address_property_is_called(self):
|
||||
# GIVEN
|
||||
mac_address = any_mac_extended_address()
|
||||
|
||||
@@ -148,34 +145,29 @@ class TestMacExtendedAddress(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(mac_address, actual_mac_address)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
mac_address = any_mac_extended_address()
|
||||
|
||||
mac_extended_address = network_layer.MacExtendedAddress(mac_address)
|
||||
|
||||
# THEN
|
||||
self.assertEqual(mac_extended_address,
|
||||
network_layer.MacExtendedAddress(mac_address))
|
||||
self.assertEqual(mac_extended_address, network_layer.MacExtendedAddress(mac_address))
|
||||
|
||||
|
||||
class TestMacExtendedAddressFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_MacExtendedAddress_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_MacExtendedAddress_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
mac_address = any_mac_extended_address()
|
||||
|
||||
factory = network_layer.MacExtendedAddressFactory()
|
||||
|
||||
# WHEN
|
||||
mac_extended_address = factory.parse(io.BytesIO(mac_address),
|
||||
common.MessageInfo())
|
||||
mac_extended_address = factory.parse(io.BytesIO(mac_address), common.MessageInfo())
|
||||
|
||||
# THEN
|
||||
self.assertTrue(
|
||||
isinstance(mac_extended_address, network_layer.MacExtendedAddress))
|
||||
self.assertTrue(isinstance(mac_extended_address, network_layer.MacExtendedAddress))
|
||||
self.assertEqual(mac_address, mac_extended_address.mac_address)
|
||||
|
||||
|
||||
@@ -193,8 +185,7 @@ class TestRloc16(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(rloc16, actual_rloc16)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
rloc16 = any_rloc16()
|
||||
|
||||
@@ -206,8 +197,7 @@ class TestRloc16(unittest.TestCase):
|
||||
|
||||
class TestRloc16Factory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Rloc16_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Rloc16_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
rloc16 = any_rloc16()
|
||||
|
||||
@@ -237,8 +227,7 @@ class TestMlEid(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(ml_eid, actual_ml_eid)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
ml_eid = any_ml_eid()
|
||||
|
||||
@@ -250,8 +239,7 @@ class TestMlEid(unittest.TestCase):
|
||||
|
||||
class TestMlEidFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_MlEid_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_MlEid_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
ml_eid = any_ml_eid()
|
||||
|
||||
@@ -279,8 +267,7 @@ class TestStatus(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(status, actual_status)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
status = any_status()
|
||||
|
||||
@@ -292,8 +279,7 @@ class TestStatus(unittest.TestCase):
|
||||
|
||||
class TestStatusFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_Status_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_Status_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
status = any_status()
|
||||
|
||||
@@ -315,8 +301,7 @@ class TestTimeSinceLastTransaction(unittest.TestCase):
|
||||
# GIVEN
|
||||
seconds = any_seconds()
|
||||
|
||||
time_since_last_transaction = network_layer.TimeSinceLastTransaction(
|
||||
seconds)
|
||||
time_since_last_transaction = network_layer.TimeSinceLastTransaction(seconds)
|
||||
|
||||
# WHEN
|
||||
actual_seconds = time_since_last_transaction.seconds
|
||||
@@ -324,13 +309,11 @@ class TestTimeSinceLastTransaction(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(seconds, actual_seconds)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
seconds = any_seconds()
|
||||
|
||||
time_since_last_transaction = network_layer.TimeSinceLastTransaction(
|
||||
seconds)
|
||||
time_since_last_transaction = network_layer.TimeSinceLastTransaction(seconds)
|
||||
|
||||
# THEN
|
||||
self.assertEqual(
|
||||
@@ -341,8 +324,7 @@ class TestTimeSinceLastTransaction(unittest.TestCase):
|
||||
|
||||
class TestTimeSinceLastTransactionFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_TimeSinceLastTransaction_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_TimeSinceLastTransaction_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
seconds = any_seconds()
|
||||
|
||||
@@ -351,27 +333,23 @@ class TestTimeSinceLastTransactionFactory(unittest.TestCase):
|
||||
data = bytearray(struct.pack(">L", seconds))
|
||||
|
||||
# WHEN
|
||||
time_since_last_transaction = factory.parse(io.BytesIO(data),
|
||||
common.MessageInfo())
|
||||
time_since_last_transaction = factory.parse(io.BytesIO(data), common.MessageInfo())
|
||||
|
||||
# THEN
|
||||
self.assertTrue(
|
||||
isinstance(
|
||||
time_since_last_transaction,
|
||||
network_layer.TimeSinceLastTransaction,
|
||||
))
|
||||
self.assertTrue(isinstance(
|
||||
time_since_last_transaction,
|
||||
network_layer.TimeSinceLastTransaction,
|
||||
))
|
||||
self.assertEqual(seconds, time_since_last_transaction.seconds)
|
||||
|
||||
|
||||
class TestRouterMask(unittest.TestCase):
|
||||
|
||||
def test_should_return_id_sequence_value_when_id_sequence_property_is_called(
|
||||
self):
|
||||
def test_should_return_id_sequence_value_when_id_sequence_property_is_called(self):
|
||||
# GIVEN
|
||||
id_sequence = any_id_sequence()
|
||||
|
||||
router_mask = network_layer.RouterMask(id_sequence,
|
||||
any_router_id_mask())
|
||||
router_mask = network_layer.RouterMask(id_sequence, any_router_id_mask())
|
||||
|
||||
# WHEN
|
||||
actual_id_sequence = router_mask.id_sequence
|
||||
@@ -379,13 +357,11 @@ class TestRouterMask(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(id_sequence, actual_id_sequence)
|
||||
|
||||
def test_should_return_router_id_mask_value_when_router_id_mask_property_is_called(
|
||||
self):
|
||||
def test_should_return_router_id_mask_value_when_router_id_mask_property_is_called(self):
|
||||
# GIVEN
|
||||
router_id_mask = any_router_id_mask()
|
||||
|
||||
router_mask = network_layer.RouterMask(any_id_sequence(),
|
||||
router_id_mask)
|
||||
router_mask = network_layer.RouterMask(any_id_sequence(), router_id_mask)
|
||||
|
||||
# WHEN
|
||||
actual_router_id_mask = router_mask.router_id_mask
|
||||
@@ -393,8 +369,7 @@ class TestRouterMask(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(router_id_mask, actual_router_id_mask)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
id_sequence = any_id_sequence()
|
||||
router_id_mask = any_router_id_mask()
|
||||
@@ -402,14 +377,12 @@ class TestRouterMask(unittest.TestCase):
|
||||
router_mask = network_layer.RouterMask(id_sequence, router_id_mask)
|
||||
|
||||
# THEN
|
||||
self.assertEqual(router_mask,
|
||||
network_layer.RouterMask(id_sequence, router_id_mask))
|
||||
self.assertEqual(router_mask, network_layer.RouterMask(id_sequence, router_id_mask))
|
||||
|
||||
|
||||
class TestRouterMaskFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_RouterMask_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_RouterMask_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
id_sequence = any_id_sequence()
|
||||
router_id_mask = any_router_id_mask()
|
||||
@@ -441,8 +414,7 @@ class TestNdOption(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(options, actual_options)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
options = any_options()
|
||||
|
||||
@@ -454,8 +426,7 @@ class TestNdOption(unittest.TestCase):
|
||||
|
||||
class TestNdOptionFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_NdOption_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_NdOption_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
options = any_options()
|
||||
|
||||
@@ -485,22 +456,19 @@ class TestThreadNetworkData(unittest.TestCase):
|
||||
# THEN
|
||||
self.assertEqual(tlvs, actual_tlvs)
|
||||
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(
|
||||
self):
|
||||
def test_should_return_True_when_try_to_equal_two_the_same_type_objects_with_the_same_values(self):
|
||||
# GIVEN
|
||||
tlvs = any_tlvs_data()
|
||||
|
||||
thread_network_data = network_layer.ThreadNetworkData(tlvs)
|
||||
|
||||
# THEN
|
||||
self.assertEqual(thread_network_data,
|
||||
network_layer.ThreadNetworkData(tlvs))
|
||||
self.assertEqual(thread_network_data, network_layer.ThreadNetworkData(tlvs))
|
||||
|
||||
|
||||
class TestThreadNetworkDataFactory(unittest.TestCase):
|
||||
|
||||
def test_should_create_ThreadNetworkData_from_bytearray_when_parse_method_is_called(
|
||||
self):
|
||||
def test_should_create_ThreadNetworkData_from_bytearray_when_parse_method_is_called(self):
|
||||
# GIVEN
|
||||
tlvs = any_tlvs_data()
|
||||
|
||||
@@ -509,16 +477,13 @@ class TestThreadNetworkDataFactory(unittest.TestCase):
|
||||
def parse(self, data, message_info):
|
||||
return bytearray(data.read())
|
||||
|
||||
factory = network_layer.ThreadNetworkDataFactory(
|
||||
DummyNetworkDataTlvsFactory())
|
||||
factory = network_layer.ThreadNetworkDataFactory(DummyNetworkDataTlvsFactory())
|
||||
|
||||
# WHEN
|
||||
thread_network_data = factory.parse(io.BytesIO(tlvs),
|
||||
common.MessageInfo())
|
||||
thread_network_data = factory.parse(io.BytesIO(tlvs), common.MessageInfo())
|
||||
|
||||
# THEN
|
||||
self.assertTrue(
|
||||
isinstance(thread_network_data, network_layer.ThreadNetworkData))
|
||||
self.assertTrue(isinstance(thread_network_data, network_layer.ThreadNetworkData))
|
||||
self.assertEqual(tlvs, thread_network_data.tlvs)
|
||||
|
||||
|
||||
|
||||
@@ -71,8 +71,7 @@ class TestREEDAddressSolicitRejected(thread_cert.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[REED].get_state(), 'child')
|
||||
|
||||
self.nodes[REED].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA,
|
||||
SRV_0_SERVER_DATA)
|
||||
self.nodes[REED].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA, SRV_0_SERVER_DATA)
|
||||
self.nodes[REED].register_netdata()
|
||||
self.simulator.go(2)
|
||||
|
||||
@@ -93,20 +92,16 @@ class TestREEDAddressSolicitRejected(thread_cert.TestCase):
|
||||
|
||||
# restore routerupgradethreshold to 16 and add service
|
||||
self.nodes[REED].set_router_upgrade_threshold(16)
|
||||
self.nodes[REED].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA,
|
||||
SRV_0_SERVER_DATA)
|
||||
self.nodes[REED].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA, SRV_0_SERVER_DATA)
|
||||
self.nodes[REED].register_netdata()
|
||||
self.simulator.go(130)
|
||||
self.assertEqual(self.hasAloc(REED, SRV_0_ID), True)
|
||||
|
||||
def hasAloc(self, node_id, service_id):
|
||||
for addr in self.nodes[node_id].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ALOC):
|
||||
for addr in self.nodes[node_id].get_ip6_address(config.ADDRESS_TYPE.ALOC):
|
||||
m = re.match('.*:fc(..)$', addr, re.I)
|
||||
if m is not None:
|
||||
if m.group(
|
||||
1) == str(service_id +
|
||||
10): # for service_id=3 look for '...:fc13'
|
||||
if m.group(1) == str(service_id + 10): # for service_id=3 look for '...:fc13'
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
@@ -78,13 +78,10 @@ class Test_Service(thread_cert.TestCase):
|
||||
}
|
||||
|
||||
def hasAloc(self, node_id, service_id):
|
||||
for addr in self.nodes[node_id].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ALOC):
|
||||
for addr in self.nodes[node_id].get_ip6_address(config.ADDRESS_TYPE.ALOC):
|
||||
m = re.match('.*:fc(..)$', addr, re.I)
|
||||
if m is not None:
|
||||
if m.group(
|
||||
1) == str(service_id +
|
||||
10): # for service_id=3 look for '...:fc13'
|
||||
if m.group(1) == str(service_id + 10): # for service_id=3 look for '...:fc13'
|
||||
return True
|
||||
|
||||
return False
|
||||
@@ -115,8 +112,7 @@ class Test_Service(thread_cert.TestCase):
|
||||
self.assertEqual(self.hasAloc(ROUTER2, SRV_0_ID), False)
|
||||
self.assertEqual(self.hasAloc(ROUTER2, SRV_1_ID), False)
|
||||
|
||||
self.nodes[ROUTER1].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA,
|
||||
SRV_0_SERVER_DATA)
|
||||
self.nodes[ROUTER1].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA, SRV_0_SERVER_DATA)
|
||||
self.nodes[ROUTER1].register_netdata()
|
||||
self.simulator.go(2)
|
||||
|
||||
@@ -130,8 +126,7 @@ class Test_Service(thread_cert.TestCase):
|
||||
aloc0 = self.nodes[ROUTER1].get_ip6_address(config.ADDRESS_TYPE.ALOC)[0]
|
||||
self.pingFromAll(aloc0)
|
||||
|
||||
self.nodes[LEADER].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA,
|
||||
SRV_0_SERVER_DATA)
|
||||
self.nodes[LEADER].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA, SRV_0_SERVER_DATA)
|
||||
self.nodes[LEADER].register_netdata()
|
||||
self.simulator.go(2)
|
||||
|
||||
@@ -144,8 +139,7 @@ class Test_Service(thread_cert.TestCase):
|
||||
|
||||
self.pingFromAll(aloc0)
|
||||
|
||||
self.nodes[ROUTER2].add_service(SRV_1_ENT_NUMBER, SRV_1_SERVICE_DATA,
|
||||
SRV_1_SERVER_DATA)
|
||||
self.nodes[ROUTER2].add_service(SRV_1_ENT_NUMBER, SRV_1_SERVICE_DATA, SRV_1_SERVER_DATA)
|
||||
self.nodes[ROUTER2].register_netdata()
|
||||
self.simulator.go(2)
|
||||
|
||||
|
||||
@@ -109,47 +109,38 @@ class TestCase(NcpSupportMixin, unittest.TestCase):
|
||||
self.nodes[i].set_network_name(params['network_name'])
|
||||
|
||||
if 'router_selection_jitter' in params:
|
||||
self.nodes[i].set_router_selection_jitter(
|
||||
params['router_selection_jitter'])
|
||||
self.nodes[i].set_router_selection_jitter(params['router_selection_jitter'])
|
||||
if 'router_upgrade_threshold' in params:
|
||||
self.nodes[i].set_router_upgrade_threshold(
|
||||
params['router_upgrade_threshold'])
|
||||
self.nodes[i].set_router_upgrade_threshold(params['router_upgrade_threshold'])
|
||||
if 'router_downgrade_threshold' in params:
|
||||
self.nodes[i].set_router_downgrade_threshold(
|
||||
params['router_downgrade_threshold'])
|
||||
self.nodes[i].set_router_downgrade_threshold(params['router_downgrade_threshold'])
|
||||
|
||||
if 'timeout' in params:
|
||||
self.nodes[i].set_timeout(params['timeout'])
|
||||
|
||||
if 'active_dataset' in params:
|
||||
self.nodes[i].set_active_dataset(
|
||||
params['active_dataset']['timestamp'],
|
||||
panid=params['active_dataset'].get('panid'),
|
||||
channel=params['active_dataset'].get('channel'),
|
||||
channel_mask=params['active_dataset'].get('channel_mask'),
|
||||
master_key=params['active_dataset'].get('master_key'))
|
||||
self.nodes[i].set_active_dataset(params['active_dataset']['timestamp'],
|
||||
panid=params['active_dataset'].get('panid'),
|
||||
channel=params['active_dataset'].get('channel'),
|
||||
channel_mask=params['active_dataset'].get('channel_mask'),
|
||||
master_key=params['active_dataset'].get('master_key'))
|
||||
|
||||
if 'pending_dataset' in params:
|
||||
self.nodes[i].set_pending_dataset(
|
||||
params['pending_dataset']['pendingtimestamp'],
|
||||
params['pending_dataset']['activetimestamp'],
|
||||
panid=params['pending_dataset'].get('panid'),
|
||||
channel=params['pending_dataset'].get('channel'))
|
||||
self.nodes[i].set_pending_dataset(params['pending_dataset']['pendingtimestamp'],
|
||||
params['pending_dataset']['activetimestamp'],
|
||||
panid=params['pending_dataset'].get('panid'),
|
||||
channel=params['pending_dataset'].get('channel'))
|
||||
|
||||
if 'key_switch_guardtime' in params:
|
||||
self.nodes[i].set_key_switch_guardtime(
|
||||
params['key_switch_guardtime'])
|
||||
self.nodes[i].set_key_switch_guardtime(params['key_switch_guardtime'])
|
||||
if 'key_sequence_counter' in params:
|
||||
self.nodes[i].set_key_sequence_counter(
|
||||
params['key_sequence_counter'])
|
||||
self.nodes[i].set_key_sequence_counter(params['key_sequence_counter'])
|
||||
|
||||
if 'network_id_timeout' in params:
|
||||
self.nodes[i].set_network_id_timeout(
|
||||
params['network_id_timeout'])
|
||||
self.nodes[i].set_network_id_timeout(params['network_id_timeout'])
|
||||
|
||||
if 'context_reuse_delay' in params:
|
||||
self.nodes[i].set_context_reuse_delay(
|
||||
params['context_reuse_delay'])
|
||||
self.nodes[i].set_context_reuse_delay(params['context_reuse_delay'])
|
||||
|
||||
if 'max_children' in params:
|
||||
self.nodes[i].set_max_children(params['max_children'])
|
||||
@@ -164,8 +155,7 @@ class TestCase(NcpSupportMixin, unittest.TestCase):
|
||||
rssi = None
|
||||
if isinstance(j, tuple):
|
||||
j, rssi = j
|
||||
self.nodes[i].add_whitelist(self.nodes[j].get_addr64(),
|
||||
rssi=rssi)
|
||||
self.nodes[i].add_whitelist(self.nodes[j].get_addr64(), rssi=rssi)
|
||||
self.nodes[i].enable_whitelist()
|
||||
|
||||
self._inspector = debug.Inspector(self)
|
||||
@@ -205,6 +195,4 @@ class TestCase(NcpSupportMixin, unittest.TestCase):
|
||||
"""
|
||||
Clean up node files in tmp directory
|
||||
"""
|
||||
os.system(
|
||||
f"rm -f tmp/{PORT_OFFSET}_*.flash tmp/{PORT_OFFSET}_*.data tmp/{PORT_OFFSET}_*.swap"
|
||||
)
|
||||
os.system(f"rm -f tmp/{PORT_OFFSET}_*.flash tmp/{PORT_OFFSET}_*.data tmp/{PORT_OFFSET}_*.swap")
|
||||
|
||||
@@ -58,9 +58,7 @@ class SubTlvsFactory(object):
|
||||
try:
|
||||
return self._sub_tlvs_factories[_type]
|
||||
except KeyError:
|
||||
logging.error(
|
||||
'Could not find TLV factory. Unsupported TLV type: {}'.format(
|
||||
_type))
|
||||
logging.error('Could not find TLV factory. Unsupported TLV type: {}'.format(_type))
|
||||
return UnknownTlvFactory(_type)
|
||||
|
||||
def parse(self, data, message_info):
|
||||
|
||||
@@ -112,8 +112,7 @@ class Router_5_1_01(thread_cert.TestCase):
|
||||
assert msg.get_mle_message_tlv(mle.Version).version == 3
|
||||
|
||||
# 5 - Leader responds with a Child ID Response
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER_1])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -149,8 +148,7 @@ class Router_5_1_01(thread_cert.TestCase):
|
||||
self.assertIn(mle.TlvType.LINK_MARGIN, tlv_request.tlvs)
|
||||
|
||||
# 9 - Leader sends a Unicast Link Accept
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
@@ -170,10 +168,8 @@ class Router_5_1_01(thread_cert.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Route64)
|
||||
|
||||
# 11 - Verify connectivity by sending an ICMPv6 Echo Request to the DUT link local address
|
||||
self.assertTrue(self.nodes[LEADER].ping(
|
||||
self.nodes[ROUTER_1].get_linklocal()))
|
||||
self.assertTrue(self.nodes[ROUTER_1].ping(
|
||||
self.nodes[LEADER].get_linklocal()))
|
||||
self.assertTrue(self.nodes[LEADER].ping(self.nodes[ROUTER_1].get_linklocal()))
|
||||
self.assertTrue(self.nodes[ROUTER_1].ping(self.nodes[LEADER].get_linklocal()))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -107,8 +107,7 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
|
||||
assert not self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
|
||||
|
||||
@@ -131,8 +130,7 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[BBR_1].get_state(), 'router')
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
assert self.nodes[BBR_1].get_backbone_router()['seqno'] == 2
|
||||
|
||||
# 3) Reset BBR_1 and bring it back after its original router id is released
|
||||
@@ -144,10 +142,8 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].reset()
|
||||
WAIT_TIME = 200
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.nodes[BBR_1].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[BBR_1].set_bbr_registration_jitter(
|
||||
BBR_REGISTRATION_JITTER)
|
||||
self.nodes[BBR_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[BBR_1].set_bbr_registration_jitter(BBR_REGISTRATION_JITTER)
|
||||
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX)
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
self.nodes[BBR_1].start()
|
||||
@@ -156,8 +152,7 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[BBR_1].get_state(), 'router')
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
BBR_1_SEQNO = self.nodes[BBR_1].get_backbone_router()['seqno']
|
||||
if (BBR_1_SEQNO != 255):
|
||||
break
|
||||
@@ -178,11 +173,9 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[BBR_2].get_state(), 'router')
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Disabled')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Disabled')
|
||||
|
||||
assert not self.nodes[BBR_2].has_ipmaddr(
|
||||
config.ALL_NETWORK_BBRS_ADDRESS)
|
||||
assert not self.nodes[BBR_2].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
|
||||
assert not self.nodes[BBR_2].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
|
||||
|
||||
# Enable Backbone function, it will stay at Secondary state as
|
||||
@@ -194,15 +187,12 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.nodes[BBR_2].set_backbone_router(seqno=255)
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Secondary')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Secondary')
|
||||
|
||||
# Check no SRV_DATA.ntf.
|
||||
messages = self.simulator.get_messages_sent_by(BBR_2)
|
||||
msg = messages.next_coap_message('0.02', '/a/sd', False)
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: %d sent unexpected SRV_DATA.ntf when there is PBbr already"
|
||||
assert (msg is None), "Error: %d sent unexpected SRV_DATA.ntf when there is PBbr already"
|
||||
|
||||
# Flush relative message queue.
|
||||
self.flush_nodes([BBR_1])
|
||||
@@ -211,18 +201,15 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.nodes[BBR_2].register_backbone_router()
|
||||
WAIT_TIME = WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Primary')
|
||||
|
||||
# Verify BBR_1 becomes Secondary and sends SRV_DATA.ntf to deregister
|
||||
# its service.
|
||||
messages = self.simulator.get_messages_sent_by(BBR_1)
|
||||
messages.next_coap_message('0.02', '/a/sd', True)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Secondary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Secondary')
|
||||
# Verify Sequence number increases when become Secondary from Primary.
|
||||
assert self.nodes[BBR_1].get_backbone_router()['seqno'] == (
|
||||
BBR_1_SEQNO + 1)
|
||||
assert self.nodes[BBR_1].get_backbone_router()['seqno'] == (BBR_1_SEQNO + 1)
|
||||
|
||||
# 4a) Check communication via DUA.
|
||||
bbr2_dua = self.nodes[BBR_2].get_addr(config.DOMAIN_PREFIX)
|
||||
@@ -231,14 +218,12 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
# 5) Stop BBR_2, BBR_1 becomes Primary after detecting there is no
|
||||
# available Backbone Router Service.
|
||||
self.nodes[BBR_2].reset()
|
||||
self.nodes[LEADER_1_1].release_router_id(
|
||||
self.nodes[BBR_2].get_router_id())
|
||||
self.nodes[LEADER_1_1].release_router_id(self.nodes[BBR_2].get_router_id())
|
||||
# Wait for the dissemination of Network Data without Backbone Router service
|
||||
self.simulator.go(10)
|
||||
|
||||
# BBR_1 becomes Primary.
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
messages = self.simulator.get_messages_sent_by(BBR_1)
|
||||
messages.next_coap_message('0.02', '/a/sd', True)
|
||||
|
||||
@@ -255,16 +240,14 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[BBR_2].get_state(), 'router')
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Secondary')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Secondary')
|
||||
|
||||
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
|
||||
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
|
||||
|
||||
# 6a) Check the uniqueness of DUA by comparing the one in above 4a).
|
||||
bbr2_dua2 = self.nodes[BBR_2].get_addr(config.DOMAIN_PREFIX)
|
||||
assert bbr2_dua == bbr2_dua2, 'Error: Unexpected different DUA ({} v.s. {})'.format(
|
||||
bbr2_dua, bbr2_dua2)
|
||||
assert bbr2_dua == bbr2_dua2, 'Error: Unexpected different DUA ({} v.s. {})'.format(bbr2_dua, bbr2_dua2)
|
||||
|
||||
# 6b) Check communication via DUA
|
||||
self.assertTrue(self.nodes[BBR_1].ping(bbr2_dua))
|
||||
|
||||
@@ -147,10 +147,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(node)
|
||||
msg = messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
command.check_compressed_address_registration_tlv(msg,
|
||||
dp_cid,
|
||||
iid,
|
||||
cid_present_once=True)
|
||||
command.check_compressed_address_registration_tlv(msg, dp_cid, iid, cid_present_once=True)
|
||||
|
||||
def test(self):
|
||||
# starting context id
|
||||
@@ -168,8 +165,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
|
||||
assert not self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
|
||||
|
||||
@@ -182,8 +178,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
domain_prefix_cid = context_id
|
||||
|
||||
# 2) Bring up ROUTER_1_1, no DUA was added due to that `P_slaac` flag is not set.
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.nodes[ROUTER_1_1].start()
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -192,8 +187,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
assert not dua, 'Error: Unexpected DUA ({})'.format(dua)
|
||||
|
||||
# 3) Bring up ROUTER_1_2, verify that it has DUA generated.
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_2].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -211,8 +205,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[MED_1_2].get_state(), 'child')
|
||||
|
||||
# 4a) DUA_IID_MANUAL1 is registered in Address Registration TLV via Child Update Request.
|
||||
self.__check_dua_registration(MED_1_2, DUA_IID_MANUAL1,
|
||||
domain_prefix_cid)
|
||||
self.__check_dua_registration(MED_1_2, DUA_IID_MANUAL1, domain_prefix_cid)
|
||||
|
||||
# 4b) Remove DUA_IID_MANUAL1, a new DUA generated via SLAAC would be registered in Address
|
||||
# Registration TLV via Child Update Request.
|
||||
@@ -228,8 +221,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
assert med_1_2_dua, 'Error: Expected DUA not found'
|
||||
|
||||
med_1_2_dua_iid = self.__get_iid(med_1_2_dua)
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid,
|
||||
domain_prefix_cid)
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid, domain_prefix_cid)
|
||||
|
||||
# 4c) Set DUA_IID_MANUAL2 which should override the generated one and be registered in Address
|
||||
# Registration TLV via Child Update Request.
|
||||
@@ -242,8 +234,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
|
||||
dua = self.nodes[MED_1_2].get_addr(config.DOMAIN_PREFIX)
|
||||
|
||||
self.__check_dua_registration(MED_1_2, DUA_IID_MANUAL2,
|
||||
domain_prefix_cid)
|
||||
self.__check_dua_registration(MED_1_2, DUA_IID_MANUAL2, domain_prefix_cid)
|
||||
|
||||
# 4d) Remove DUA_IID_MANUAL2, a new DUA generated via SLAAC, the same as in above b) would
|
||||
# be registered in Address Registration TLV via Child Update Request.
|
||||
@@ -259,15 +250,13 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
assert ipaddress.ip_address(med_1_2_dua) == ipaddress.ip_address(
|
||||
dua), 'Error: Expected same SLAAC DUA not generated'
|
||||
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid,
|
||||
domain_prefix_cid)
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid, domain_prefix_cid)
|
||||
|
||||
# 5) Change BBR_1 from config.DOMAIN_PREFIX to config.DOMAIN_PRFIX_ALTER. Verify that MED_1_2
|
||||
# generates a new Interface Identifier different from the one generated in 4d) due to the
|
||||
# Domain Prefix change.
|
||||
context_id += 1
|
||||
self.simulator.set_lowpan_context(context_id,
|
||||
config.DOMAIN_PREFIX_ALTER)
|
||||
self.simulator.set_lowpan_context(context_id, config.DOMAIN_PREFIX_ALTER)
|
||||
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX_ALTER)
|
||||
WAIT_TIME = WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -286,8 +275,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
assert ipaddress.ip_address(med_1_2_dua) == ipaddress.ip_address(
|
||||
dua), 'Error: Expected same SLAAC DUA not generated'
|
||||
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid,
|
||||
domain_prefix_cid)
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid, domain_prefix_cid)
|
||||
|
||||
#7) Configure ROUTER_1_1 as Border Router with 3 SLAAC prefixes, verify MED_1_2 would register
|
||||
# its DUA in Address Registration TLV.
|
||||
@@ -317,8 +305,7 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
|
||||
assert ipaddress.ip_address(med_1_2_dua) == ipaddress.ip_address(
|
||||
dua), 'Error: Expected same SLAAC DUA not generated'
|
||||
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid,
|
||||
domain_prefix_cid)
|
||||
self.__check_dua_registration(MED_1_2, med_1_2_dua_iid, domain_prefix_cid)
|
||||
|
||||
#8) Bring up SED_1_2, verify that it generates one DUA, and registers it to its parent, though the parent
|
||||
# is a Thread 1.1 device.
|
||||
|
||||
@@ -181,8 +181,7 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
# Prefix without `P_slaac`.
|
||||
self.nodes[BBR_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[BBR_1].set_bbr_registration_jitter(BBR_REGISTRATION_JITTER)
|
||||
self.nodes[BBR_1].set_backbone_router(
|
||||
seqno=seq_num, reg_delay=BBR_REREGISTRATION_DELAY)
|
||||
self.nodes[BBR_1].set_backbone_router(seqno=seq_num, reg_delay=BBR_REREGISTRATION_DELAY)
|
||||
self.nodes[BBR_1].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -190,8 +189,7 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
|
||||
assert not self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
|
||||
|
||||
@@ -210,8 +208,7 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
self.flush_nodes([ROUTER_1_2])
|
||||
|
||||
self.nodes[ROUTER_1_2].set_dua_iid(DUA_IID_MANUAL1)
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_2].start()
|
||||
WAIT_TIME = WAIT_ATTACH
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -278,17 +275,13 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
|
||||
dua2 = self.nodes[ROUTER_1_2].get_addr(config.DOMAIN_PREFIX)
|
||||
assert dua2, 'Error: Expected DUA ({}) not found'.format(dua2)
|
||||
assert dua2 != dua, 'Error: Expected Different DUA not found, same DUA {}'.format(
|
||||
dua2)
|
||||
assert dua2 != dua, 'Error: Expected Different DUA not found, same DUA {}'.format(dua2)
|
||||
|
||||
# e) (repeated) Configure BBR_1 to respond with per remaining error status:
|
||||
# - increase BBR seqno to trigger reregistration
|
||||
# - ROUTER_1_2 should re-register within BBR_REREGISTRATION_DELAY. For the not fatal errors, ROUTER_1_2
|
||||
# should re-register within another BBR_REREGISTRATION_DELAY (with least delay if ST_DUA_REREGISTER)
|
||||
for status in [
|
||||
ST_DUA_REREGISTER, ST_DUA_NO_RESOURCES, ST_DUA_BBR_NOT_PRIMARY,
|
||||
ST_DUA_GENERAL_FAILURE
|
||||
]:
|
||||
for status in [ST_DUA_REREGISTER, ST_DUA_NO_RESOURCES, ST_DUA_BBR_NOT_PRIMARY, ST_DUA_GENERAL_FAILURE]:
|
||||
print('Testing Status %d...'.format(status))
|
||||
# Flush relative message queues.
|
||||
self.flush_nodes([ROUTER_1_2])
|
||||
@@ -304,8 +297,7 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
self.__check_dua_registration_tmf(ROUTER_1_2, 2)
|
||||
|
||||
# Bring up Router_1_1
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].start()
|
||||
WAIT_TIME = WAIT_ATTACH
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -328,8 +320,7 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
# is of Thread 1.1 version.
|
||||
# 4) Bring up FED_1_2_2, it sends DUA.req itself as it it FTD.
|
||||
for node in [FED_1_2_1, MED_1_2_1, SED_1_2_1, FED_1_2_2]:
|
||||
print("Starting child {} (extaddr: {})...".format(
|
||||
node, self.nodes[node].get_addr64()))
|
||||
print("Starting child {} (extaddr: {})...".format(node, self.nodes[node].get_addr64()))
|
||||
# Flush all message queues.
|
||||
self.flush_all()
|
||||
self.nodes[node].start()
|
||||
@@ -343,8 +334,7 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
|
||||
# 5) MED_1_2_2, SED_1_2_2, MTDs should should register their DUA to their parent
|
||||
# by Child Update Request, and the parent would send DUA.req for them on behalf.
|
||||
for node in [MED_1_2_2, SED_1_2_2]:
|
||||
print("Starting child {} (extaddr: {})...".format(
|
||||
node, self.nodes[node].get_addr64()))
|
||||
print("Starting child {} (extaddr: {})...".format(node, self.nodes[node].get_addr64()))
|
||||
# Flush all message queues.
|
||||
self.flush_all()
|
||||
self.nodes[node].start()
|
||||
|
||||
@@ -85,15 +85,12 @@ class SED_EnhancedFramePending(thread_cert.TestCase):
|
||||
self.nodes[SED_1].udp_start('::', common.UDP_TEST_PORT)
|
||||
|
||||
# 2 - Ping Leader
|
||||
self.assertTrue(self.nodes[SED_1].ping(self.nodes[LEADER].get_rloc(),
|
||||
timeout=CHILD_TIMEOUT))
|
||||
self.assertTrue(self.nodes[SED_1].ping(self.nodes[LEADER].get_rloc(), timeout=CHILD_TIMEOUT))
|
||||
|
||||
self.flush_all()
|
||||
|
||||
# 3 - Send to SED
|
||||
self.nodes[LEADER].udp_send(UDP_BYTES_COUNT,
|
||||
self.nodes[SED_1].get_rloc(),
|
||||
common.UDP_TEST_PORT)
|
||||
self.nodes[LEADER].udp_send(UDP_BYTES_COUNT, self.nodes[SED_1].get_rloc(), common.UDP_TEST_PORT)
|
||||
|
||||
# 4 - Wait for half polling period
|
||||
self.simulator.go(DEFAULT_POLL_PERIOD // 2)
|
||||
@@ -101,9 +98,7 @@ class SED_EnhancedFramePending(thread_cert.TestCase):
|
||||
self.nodes[SED_1].udp_check_rx(UDP_BYTES_COUNT)
|
||||
|
||||
# 5 - Send to Leader
|
||||
self.nodes[SED_1].udp_send(UDP_BYTES_COUNT,
|
||||
self.nodes[LEADER].get_rloc(),
|
||||
common.UDP_TEST_PORT)
|
||||
self.nodes[SED_1].udp_send(UDP_BYTES_COUNT, self.nodes[LEADER].get_rloc(), common.UDP_TEST_PORT)
|
||||
self.simulator.go(1)
|
||||
self.nodes[LEADER].udp_check_rx(UDP_BYTES_COUNT)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED_1)
|
||||
|
||||
@@ -120,8 +120,7 @@ class SED_EnhancedKeepAlive(thread_cert.TestCase):
|
||||
self.assertEqual(msg.get_mle_message_tlv(mle.Version).version, 3)
|
||||
|
||||
# 5 - Leader responds with a Child ID Response
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[SED_1])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -131,8 +130,7 @@ class SED_EnhancedKeepAlive(thread_cert.TestCase):
|
||||
msg.assertMleMessageContainsOptionalTlv(mle.AddressRegistration)
|
||||
|
||||
leader_aloc = self.nodes[LEADER].get_addr_leader_aloc()
|
||||
self.assertTrue(self.nodes[SED_1].ping(leader_aloc,
|
||||
timeout=USER_POLL_PERIOD * 2))
|
||||
self.assertTrue(self.nodes[SED_1].ping(leader_aloc, timeout=USER_POLL_PERIOD * 2))
|
||||
|
||||
# 6 - Timeout Child
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
@@ -143,15 +141,13 @@ class SED_EnhancedKeepAlive(thread_cert.TestCase):
|
||||
self.nodes[SED_1].set_pollperiod(USER_POLL_PERIOD * 1000)
|
||||
self.nodes[LEADER].disable_whitelist()
|
||||
self.nodes[SED_1].disable_whitelist()
|
||||
self.assertFalse(self.nodes[SED_1].ping(leader_aloc,
|
||||
timeout=USER_POLL_PERIOD * 2))
|
||||
self.assertFalse(self.nodes[SED_1].ping(leader_aloc, timeout=USER_POLL_PERIOD * 2))
|
||||
self.flush_all()
|
||||
|
||||
# 7 - Wait SED_1 to re-attach
|
||||
self.simulator.go(240)
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[SED_1])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -159,8 +155,7 @@ class SED_EnhancedKeepAlive(thread_cert.TestCase):
|
||||
msg.assertMleMessageContainsOptionalTlv(mle.NetworkData)
|
||||
msg.assertMleMessageContainsOptionalTlv(mle.Route64)
|
||||
msg.assertMleMessageContainsOptionalTlv(mle.AddressRegistration)
|
||||
self.assertTrue(self.nodes[SED_1].ping(leader_aloc,
|
||||
timeout=USER_POLL_PERIOD * 2))
|
||||
self.assertTrue(self.nodes[SED_1].ping(leader_aloc, timeout=USER_POLL_PERIOD * 2))
|
||||
self.flush_all()
|
||||
|
||||
# 8 - Verify enhanced keep-alive works
|
||||
@@ -179,8 +174,7 @@ class SED_EnhancedKeepAlive(thread_cert.TestCase):
|
||||
self.nodes[LEADER].disable_whitelist()
|
||||
self.nodes[SED_1].disable_whitelist()
|
||||
self.nodes[SED_1].set_pollperiod(USER_POLL_PERIOD * 1000)
|
||||
self.assertTrue(self.nodes[SED_1].ping(leader_aloc,
|
||||
timeout=USER_POLL_PERIOD * 2))
|
||||
self.assertTrue(self.nodes[SED_1].ping(leader_aloc, timeout=USER_POLL_PERIOD * 2))
|
||||
|
||||
# 9 - Verify child resets keep-alive timer
|
||||
self.nodes[SED_1].set_pollperiod(DEFAULT_POLL_PERIOD * 1000)
|
||||
|
||||
@@ -127,9 +127,7 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
# Bring up BBR_1, BBR_1 becomes Leader and Primary Backbone Router
|
||||
self.nodes[BBR_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[BBR_1].set_bbr_registration_jitter(BBR_REGISTRATION_JITTER)
|
||||
self.nodes[BBR_1].set_backbone_router(seqno=1,
|
||||
reg_delay=REREG_DELAY,
|
||||
mlr_timeout=MLR_TIMEOUT)
|
||||
self.nodes[BBR_1].set_backbone_router(seqno=1, reg_delay=REREG_DELAY, mlr_timeout=MLR_TIMEOUT)
|
||||
self.nodes[BBR_1].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -137,17 +135,14 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
|
||||
self.pbbr_seq = 1
|
||||
|
||||
# Bring up BBR_2, BBR_2 becomes Router and Secondary Backbone Router
|
||||
self.nodes[BBR_2].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[BBR_2].set_bbr_registration_jitter(BBR_REGISTRATION_JITTER)
|
||||
self.nodes[BBR_2].set_backbone_router(seqno=2,
|
||||
reg_delay=REREG_DELAY,
|
||||
mlr_timeout=MLR_TIMEOUT)
|
||||
self.nodes[BBR_2].set_backbone_router(seqno=2, reg_delay=REREG_DELAY, mlr_timeout=MLR_TIMEOUT)
|
||||
self.nodes[BBR_2].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -155,23 +150,20 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.nodes[BBR_2].enable_backbone_router()
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Secondary')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Secondary')
|
||||
|
||||
self.simulator.set_lowpan_context(context_id, config.DOMAIN_PREFIX)
|
||||
domain_prefix_cid = context_id
|
||||
|
||||
# Bring up ROUTER_1_2
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_2].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[ROUTER_1_2].get_state(), 'router')
|
||||
|
||||
# Bring up ROUTER_1_1
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
@@ -233,9 +225,8 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
def __check_mlr_ok(self, id, is_ftd, is_parent_1p1=False):
|
||||
"""Check if MLR works for the node"""
|
||||
# Add MA1 and send MLR.req
|
||||
print(
|
||||
"======== checking MLR: Node%d (%s), Parent=%s ========" %
|
||||
(id, 'FTD' if is_ftd else 'MTD', '1.1' if is_parent_1p1 else '1.2'))
|
||||
print("======== checking MLR: Node%d (%s), Parent=%s ========" %
|
||||
(id, 'FTD' if is_ftd else 'MTD', '1.1' if is_parent_1p1 else '1.2'))
|
||||
expect_mlr_req = is_ftd or is_parent_1p1
|
||||
|
||||
if id == ROUTER_1_2:
|
||||
@@ -244,27 +235,17 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
parent_id = ROUTER_1_1 if is_parent_1p1 else ROUTER_1_2
|
||||
|
||||
for addr in [MA1, MA1g, MA2, MA3, MA4]:
|
||||
self.__check_ipmaddr_add(
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=expect_mlr_req,
|
||||
expect_mlr_req_proxied=(not expect_mlr_req))
|
||||
|
||||
for addr in [MA5, MA6]:
|
||||
self.__check_ipmaddr_add(id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=False,
|
||||
expect_mlr_req_proxied=False)
|
||||
expect_mlr_req=expect_mlr_req,
|
||||
expect_mlr_req_proxied=(not expect_mlr_req))
|
||||
|
||||
for addr in [MA5, MA6]:
|
||||
self.__check_ipmaddr_add(id, parent_id, addr, expect_mlr_req=False, expect_mlr_req_proxied=False)
|
||||
print('=' * 120)
|
||||
|
||||
def __check_ipmaddr_add(self,
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=True,
|
||||
expect_mlr_req_proxied=False):
|
||||
def __check_ipmaddr_add(self, id, parent_id, addr, expect_mlr_req=True, expect_mlr_req_proxied=False):
|
||||
"""Check MLR works for the added multicast address"""
|
||||
print("Node %d: ipmaddr %s" % (id, addr))
|
||||
self.flush_all()
|
||||
@@ -272,16 +253,12 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.assertTrue(self.nodes[id].has_ipmaddr(addr))
|
||||
self.simulator.go(PARENT_AGGREGATE_DELAY + WAIT_REDUNDANCE)
|
||||
|
||||
self.__check_send_mlr_req(id,
|
||||
addr,
|
||||
should_send=expect_mlr_req,
|
||||
expect_mlr_rsp=expect_mlr_req)
|
||||
self.__check_send_mlr_req(id, addr, should_send=expect_mlr_req, expect_mlr_rsp=expect_mlr_req)
|
||||
# Parent should either forward or proxy the MLR.req
|
||||
if parent_id:
|
||||
self.__check_send_mlr_req(parent_id,
|
||||
addr,
|
||||
should_send=expect_mlr_req or
|
||||
expect_mlr_req_proxied,
|
||||
should_send=expect_mlr_req or expect_mlr_req_proxied,
|
||||
expect_mlr_rsp=expect_mlr_req_proxied)
|
||||
|
||||
self.__check_rereg(id,
|
||||
@@ -308,14 +285,12 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
if isinstance(addrs, str):
|
||||
addrs = [addrs]
|
||||
|
||||
reg_mas = self.__get_registered_MAs(
|
||||
id, expect_mlr_req_num=expect_mlr_req_num)
|
||||
reg_mas = self.__get_registered_MAs(id, expect_mlr_req_num=expect_mlr_req_num)
|
||||
if should_send:
|
||||
for addr in addrs:
|
||||
self.assertIn(ipaddress.IPv6Address(addr), reg_mas)
|
||||
if expect_unique_reg:
|
||||
self.assertEqual(1,
|
||||
reg_mas.count(ipaddress.IPv6Address(addr)))
|
||||
self.assertEqual(1, reg_mas.count(ipaddress.IPv6Address(addr)))
|
||||
|
||||
# BBR should send MLR.rsp ACK
|
||||
if expect_mlr_rsp:
|
||||
@@ -330,9 +305,7 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
messages = self.simulator.get_messages_sent_by(id)
|
||||
reg_mas = []
|
||||
while True:
|
||||
msg = messages.next_coap_message('0.02',
|
||||
'/n/mr',
|
||||
assert_enabled=False)
|
||||
msg = messages.next_coap_message('0.02', '/n/mr', assert_enabled=False)
|
||||
if not msg:
|
||||
break
|
||||
addrs = msg.get_coap_message_tlv(network_layer.IPv6Addresses)
|
||||
@@ -348,53 +321,33 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
|
||||
return reg_mas
|
||||
|
||||
def __check_renewing(self,
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=True,
|
||||
expect_mlr_req_proxied=False):
|
||||
def __check_renewing(self, id, parent_id, addr, expect_mlr_req=True, expect_mlr_req_proxied=False):
|
||||
"""Check if MLR works that a node can renew it's registered MAs"""
|
||||
self.flush_all()
|
||||
self.simulator.go(MLR_TIMEOUT + WAIT_REDUNDANCE)
|
||||
|
||||
self.__check_send_mlr_req(id,
|
||||
addr,
|
||||
should_send=expect_mlr_req,
|
||||
expect_mlr_rsp=expect_mlr_req)
|
||||
self.__check_send_mlr_req(id, addr, should_send=expect_mlr_req, expect_mlr_rsp=expect_mlr_req)
|
||||
# Parent should either forward or proxy the MLR.req
|
||||
if parent_id:
|
||||
self.__check_send_mlr_req(parent_id,
|
||||
addr,
|
||||
should_send=expect_mlr_req or
|
||||
expect_mlr_req_proxied,
|
||||
should_send=expect_mlr_req or expect_mlr_req_proxied,
|
||||
expect_mlr_rsp=expect_mlr_req_proxied)
|
||||
|
||||
def __check_rereg(self,
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=True,
|
||||
expect_mlr_req_proxied=False):
|
||||
def __check_rereg(self, id, parent_id, addr, expect_mlr_req=True, expect_mlr_req_proxied=False):
|
||||
"""Check if MLR works that a node can do MLR reregistration when necessary"""
|
||||
self.__check_rereg_seqno(id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=expect_mlr_req,
|
||||
expect_mlr_req_proxied=expect_mlr_req_proxied)
|
||||
self.__check_rereg_pbbr_change(
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=expect_mlr_req,
|
||||
expect_mlr_req_proxied=expect_mlr_req_proxied)
|
||||
self.__check_rereg_pbbr_change(id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=expect_mlr_req,
|
||||
expect_mlr_req_proxied=expect_mlr_req_proxied)
|
||||
|
||||
def __check_rereg_seqno(self,
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=True,
|
||||
expect_mlr_req_proxied=False):
|
||||
def __check_rereg_seqno(self, id, parent_id, addr, expect_mlr_req=True, expect_mlr_req_proxied=False):
|
||||
"""Check if MLR works that a node can do MLR reregistration when PBBR seqno changes"""
|
||||
# Change seq on PBBR and expect MLR.req within REREG_DELAY
|
||||
self.flush_all()
|
||||
@@ -402,55 +355,39 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].set_backbone_router(seqno=self.pbbr_seq)
|
||||
self.simulator.go(REREG_DELAY + WAIT_REDUNDANCE)
|
||||
|
||||
self.__check_send_mlr_req(id,
|
||||
addr,
|
||||
should_send=expect_mlr_req,
|
||||
expect_mlr_rsp=expect_mlr_req)
|
||||
self.__check_send_mlr_req(id, addr, should_send=expect_mlr_req, expect_mlr_rsp=expect_mlr_req)
|
||||
# Parent should either forward or proxy the MLR.req
|
||||
if parent_id:
|
||||
self.__check_send_mlr_req(parent_id,
|
||||
addr,
|
||||
should_send=expect_mlr_req or
|
||||
expect_mlr_req_proxied,
|
||||
should_send=expect_mlr_req or expect_mlr_req_proxied,
|
||||
expect_mlr_rsp=expect_mlr_req_proxied)
|
||||
|
||||
def __check_rereg_pbbr_change(self,
|
||||
id,
|
||||
parent_id,
|
||||
addr,
|
||||
expect_mlr_req=True,
|
||||
expect_mlr_req_proxied=False):
|
||||
def __check_rereg_pbbr_change(self, id, parent_id, addr, expect_mlr_req=True, expect_mlr_req_proxied=False):
|
||||
"""Check if MLR works that a node can do MLR reregistration when PBBR changes"""
|
||||
# Make BBR_2 to be Primary and expect MLR.req within REREG_DELAY
|
||||
self.flush_all()
|
||||
self.nodes[BBR_1].disable_backbone_router()
|
||||
self.simulator.go(BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Primary')
|
||||
self.simulator.go(REREG_DELAY + WAIT_REDUNDANCE)
|
||||
|
||||
self.__check_send_mlr_req(id,
|
||||
addr,
|
||||
should_send=expect_mlr_req,
|
||||
expect_mlr_rsp=expect_mlr_req)
|
||||
self.__check_send_mlr_req(id, addr, should_send=expect_mlr_req, expect_mlr_rsp=expect_mlr_req)
|
||||
# Parent should either forward or proxy the MLR.req
|
||||
if parent_id:
|
||||
self.__check_send_mlr_req(parent_id,
|
||||
addr,
|
||||
should_send=expect_mlr_req or
|
||||
expect_mlr_req_proxied,
|
||||
should_send=expect_mlr_req or expect_mlr_req_proxied,
|
||||
expect_mlr_rsp=expect_mlr_req_proxied)
|
||||
|
||||
# Restore BBR_1 to be Primary and BBR_2 to be Secondary
|
||||
self.nodes[BBR_2].disable_backbone_router()
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
self.simulator.go(BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE)
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(),
|
||||
'Primary')
|
||||
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
|
||||
self.nodes[BBR_2].enable_backbone_router()
|
||||
self.simulator.go(BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE)
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(),
|
||||
'Secondary')
|
||||
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Secondary')
|
||||
|
||||
def __switch_to_1_1_parent(self):
|
||||
"""Check if MLR works when nodes are switching to a 1.1 parent"""
|
||||
@@ -464,12 +401,9 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.nodes[SED_1].add_ipmaddr(MA1)
|
||||
|
||||
self.simulator.go(REREG_DELAY + WAIT_REDUNDANCE)
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(FED_1))
|
||||
self.assertNotIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(MED_1))
|
||||
self.assertNotIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(SED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(FED_1))
|
||||
self.assertNotIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(MED_1))
|
||||
self.assertNotIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(SED_1))
|
||||
|
||||
self.flush_all()
|
||||
|
||||
@@ -481,18 +415,14 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.simulator.go(config.DEFAULT_CHILD_TIMEOUT + WAIT_REDUNDANCE)
|
||||
|
||||
self.assertEqual(self.nodes[id].get_state(), 'child')
|
||||
self.assertEqual(self.nodes[id].get_router_id(),
|
||||
self.nodes[ROUTER_1_1].get_router_id())
|
||||
self.assertEqual(self.nodes[id].get_router_id(), self.nodes[ROUTER_1_1].get_router_id())
|
||||
|
||||
self.simulator.go(REREG_DELAY + WAIT_REDUNDANCE)
|
||||
|
||||
# Verify all FED send MLR.req within REREG_DELAY when parent is 1.1
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(FED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(MED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(SED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(FED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(MED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(SED_1))
|
||||
|
||||
self.nodes[FED_1].del_ipmaddr(MA1)
|
||||
self.nodes[MED_1].del_ipmaddr(MA1)
|
||||
@@ -512,12 +442,9 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.nodes[SED_1].add_ipmaddr(MA1)
|
||||
|
||||
self.simulator.go(REREG_DELAY + WAIT_REDUNDANCE)
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(FED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(MED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(SED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(FED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(MED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(SED_1))
|
||||
|
||||
self.flush_all()
|
||||
|
||||
@@ -528,14 +455,12 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.simulator.go(config.DEFAULT_CHILD_TIMEOUT + WAIT_REDUNDANCE)
|
||||
|
||||
self.assertEqual(self.nodes[id].get_state(), 'child')
|
||||
self.assertEqual(self.nodes[id].get_router_id(),
|
||||
self.nodes[ROUTER_1_2].get_router_id())
|
||||
self.assertEqual(self.nodes[id].get_router_id(), self.nodes[ROUTER_1_2].get_router_id())
|
||||
|
||||
self.simulator.go(REREG_DELAY + WAIT_REDUNDANCE)
|
||||
|
||||
# Verify only FTD sends MLR.req within REREG_DELAY when parent is 1.2
|
||||
self.assertIn(ipaddress.IPv6Address(MA1),
|
||||
self.__get_registered_MAs(FED_1))
|
||||
self.assertIn(ipaddress.IPv6Address(MA1), self.__get_registered_MAs(FED_1))
|
||||
|
||||
# MED and SED might still send MLR.req during this period because it could be sending to it's 1.2 parent.
|
||||
|
||||
@@ -576,10 +501,7 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
self.flush_all()
|
||||
self.nodes[parent_id].add_ipmaddr(MA1)
|
||||
self.simulator.go(WAIT_REDUNDANCE)
|
||||
self.__check_send_mlr_req(parent_id,
|
||||
MA1,
|
||||
should_send=True,
|
||||
expect_mlr_rsp=True)
|
||||
self.__check_send_mlr_req(parent_id, MA1, should_send=True, expect_mlr_rsp=True)
|
||||
|
||||
# Parent should not register MA1 of Child 1 because it's already registerd
|
||||
self.flush_all()
|
||||
|
||||
@@ -161,20 +161,16 @@ class TestMulticastRegistration(thread_cert.TestCase):
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(node)
|
||||
|
||||
msg = messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST,
|
||||
assert_enabled=child_update_request_assert)
|
||||
msg = messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST,
|
||||
assert_enabled=child_update_request_assert)
|
||||
|
||||
if msg:
|
||||
is_in = command.check_address_registration_tlv(
|
||||
msg, multicast_address)
|
||||
is_in = command.check_address_registration_tlv(msg, multicast_address)
|
||||
|
||||
if in_address_registration:
|
||||
assert is_in, 'Error: Expected {} in AddressRegistrationTLV not found'.format(
|
||||
multicast_address)
|
||||
assert is_in, 'Error: Expected {} in AddressRegistrationTLV not found'.format(multicast_address)
|
||||
else:
|
||||
assert not is_in, 'Error: Unexpected {} in AddressRegistrationTLV'.format(
|
||||
multicast_address)
|
||||
assert not is_in, 'Error: Unexpected {} in AddressRegistrationTLV'.format(multicast_address)
|
||||
|
||||
def test(self):
|
||||
|
||||
@@ -257,8 +253,7 @@ class TestMulticastRegistration(thread_cert.TestCase):
|
||||
in_address_registration=True)
|
||||
|
||||
#6) Bring up ROUTER_1_1.
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(
|
||||
ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].set_router_selection_jitter(ROUTER_SELECTION_JITTER)
|
||||
self.nodes[ROUTER_1_1].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
self.simulator.go(WAIT_TIME)
|
||||
|
||||
@@ -121,8 +121,7 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
# Flush relative message queues
|
||||
self.flush_nodes([LEADER_1_2, ROUTER_1_1])
|
||||
|
||||
self.nodes[LEADER_1_2].set_link_quality(
|
||||
self.nodes[REED_1_2].get_addr64(), 2)
|
||||
self.nodes[LEADER_1_2].set_link_quality(self.nodes[REED_1_2].get_addr64(), 2)
|
||||
self.nodes[REED_1_2].set_router_selection_jitter(1)
|
||||
self.nodes[REED_1_2].set_router_upgrade_threshold(1)
|
||||
self.nodes[REED_1_2].start()
|
||||
@@ -131,8 +130,7 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
|
||||
# Check Parent Response
|
||||
messages = self.simulator.get_messages_sent_by(ROUTER_1_1)
|
||||
parent_prefer = messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE)
|
||||
parent_prefer = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_prefer), "Error: Expected parent response not found"
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(LEADER_1_2)
|
||||
@@ -141,8 +139,7 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
|
||||
# Known that link margin for link quality 3 is 80 and link quality 2 is 15
|
||||
assert ((parent_prefer.get_mle_message_tlv(mle.LinkMargin).link_margin -
|
||||
parent_cmp.get_mle_message_tlv(mle.LinkMargin).link_margin) >
|
||||
20)
|
||||
parent_cmp.get_mle_message_tlv(mle.LinkMargin).link_margin) > 20)
|
||||
|
||||
# Check Child Id Request
|
||||
messages = self.simulator.get_messages_sent_by(REED_1_2)
|
||||
@@ -156,10 +153,8 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
# Flush relative message queues
|
||||
self.flush_nodes([LEADER_1_2, REED_1_2])
|
||||
|
||||
self.nodes[LEADER_1_2].set_link_quality(
|
||||
self.nodes[ROUTER_1_2].get_addr64(), 2)
|
||||
self.nodes[REED_1_2].set_link_quality(
|
||||
self.nodes[ROUTER_1_2].get_addr64(), 2)
|
||||
self.nodes[LEADER_1_2].set_link_quality(self.nodes[ROUTER_1_2].get_addr64(), 2)
|
||||
self.nodes[REED_1_2].set_link_quality(self.nodes[ROUTER_1_2].get_addr64(), 2)
|
||||
self.nodes[ROUTER_1_2].set_router_selection_jitter(1)
|
||||
self.nodes[ROUTER_1_2].start()
|
||||
self.simulator.go(5)
|
||||
@@ -171,17 +166,15 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
# Skip first response for first parent request
|
||||
assert messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
|
||||
parent_prefer = messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE)
|
||||
parent_prefer = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_prefer), "Error: Expected parent response not found"
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(REED_1_2)
|
||||
parent_cmp = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_cmp), "Error: Expected parent response not found"
|
||||
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
|
||||
# Check Child Id Request
|
||||
messages = self.simulator.get_messages_sent_by(ROUTER_1_2)
|
||||
@@ -203,20 +196,18 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
|
||||
# Check Parent Response
|
||||
messages = self.simulator.get_messages_sent_by(ROUTER_1_2)
|
||||
parent_prefer = messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE)
|
||||
parent_prefer = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_prefer), "Error: Expected parent response not found"
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(LEADER_1_2)
|
||||
parent_cmp = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_cmp), "Error: Expected parent response not found"
|
||||
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Connectivity).pp >
|
||||
parent_cmp.get_mle_message_tlv(mle.Connectivity).pp)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Connectivity).pp > parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).pp)
|
||||
|
||||
# Check Child Id Request
|
||||
messages = self.simulator.get_messages_sent_by(REED_1_1)
|
||||
@@ -240,23 +231,19 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
|
||||
# Check Parent Response
|
||||
messages = self.simulator.get_messages_sent_by(LEADER_1_2)
|
||||
parent_prefer = messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE)
|
||||
parent_prefer = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_prefer), "Error: Expected parent response not found"
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(ROUTER_1_1)
|
||||
parent_cmp = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_cmp), "Error: Expected parent response not found"
|
||||
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.Connectivity).pp == parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).pp)
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.Connectivity).link_quality_3 > parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).link_quality_3)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Connectivity).pp == parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).pp)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Connectivity).link_quality_3 > parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).link_quality_3)
|
||||
|
||||
# Check Child Id Request
|
||||
messages = self.simulator.get_messages_sent_by(MED_1_1)
|
||||
@@ -277,25 +264,21 @@ class TestParentSelection(thread_cert.TestCase):
|
||||
|
||||
# Check Parent Response
|
||||
messages = self.simulator.get_messages_sent_by(ROUTER_1_2)
|
||||
parent_prefer = messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE)
|
||||
parent_prefer = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_prefer), "Error: Expected parent response not found"
|
||||
|
||||
messages = self.simulator.get_messages_sent_by(ROUTER_1_1)
|
||||
parent_cmp = messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
assert (parent_cmp), "Error: Expected parent response not found"
|
||||
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.Connectivity).pp == parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).pp)
|
||||
assert (parent_prefer.get_mle_message_tlv(
|
||||
mle.Connectivity).link_quality_3 == parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).link_quality_3)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Version).version >
|
||||
parent_cmp.get_mle_message_tlv(mle.Version).version)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.LinkMargin).link_margin == parent_cmp.get_mle_message_tlv(
|
||||
mle.LinkMargin).link_margin)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Connectivity).pp == parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).pp)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Connectivity).link_quality_3 == parent_cmp.get_mle_message_tlv(
|
||||
mle.Connectivity).link_quality_3)
|
||||
assert (parent_prefer.get_mle_message_tlv(mle.Version).version > parent_cmp.get_mle_message_tlv(
|
||||
mle.Version).version)
|
||||
|
||||
# Check Child Id Request
|
||||
messages = self.simulator.get_messages_sent_by(MED_1_2)
|
||||
|
||||
@@ -93,8 +93,7 @@ for node in [node1, node2, node3, node4]:
|
||||
|
||||
# Filter on specific PAN ID.
|
||||
|
||||
scan_result = wpan.parse_scan_result(
|
||||
scanner.discover_scan(panid_filter="0x0002"))
|
||||
scan_result = wpan.parse_scan_result(scanner.discover_scan(panid_filter="0x0002"))
|
||||
|
||||
verify(len(scan_result) == 2)
|
||||
for node in [node2, node3]:
|
||||
@@ -117,8 +116,7 @@ for node in [node1, node2]:
|
||||
|
||||
# Scan with filter enabled
|
||||
|
||||
scan_result = wpan.parse_scan_result(
|
||||
scanner.discover_scan(enable_filtering=True))
|
||||
scan_result = wpan.parse_scan_result(scanner.discover_scan(enable_filtering=True))
|
||||
|
||||
verify(len(scan_result) == 1)
|
||||
verify(node1.is_in_scan_result(scan_result))
|
||||
|
||||
@@ -92,8 +92,7 @@ for src, dst in [(ll1, ll2), (ll1, ml2), (ml1, ll2), (ml1, ml2)]:
|
||||
|
||||
s1 = node1.prepare_tx((src, PORT), (dst, PORT), 'Hi there!', NUM_MSGS)
|
||||
r1 = node2.prepare_rx(s1)
|
||||
s2 = node2.prepare_tx((dst, PORT), (src, PORT), 'Hello back to you!',
|
||||
NUM_MSGS)
|
||||
s2 = node2.prepare_tx((dst, PORT), (src, PORT), 'Hello back to you!', NUM_MSGS)
|
||||
r2 = node1.prepare_rx(s2)
|
||||
|
||||
wpan.Node.perform_async_tx_rx()
|
||||
|
||||
@@ -97,8 +97,7 @@ for poll_interval in [10, 100, 300]:
|
||||
|
||||
s1 = node1.prepare_tx((src, PORT), (dst, PORT), 'Hi there!', NUM_MSGS)
|
||||
r1 = node2.prepare_rx(s1)
|
||||
s2 = node2.prepare_tx((dst, PORT), (src, PORT), 'Hello back to you!',
|
||||
NUM_MSGS)
|
||||
s2 = node2.prepare_tx((dst, PORT), (src, PORT), 'Hello back to you!', NUM_MSGS)
|
||||
r2 = node1.prepare_rx(s2)
|
||||
|
||||
wpan.Node.perform_async_tx_rx()
|
||||
|
||||
@@ -90,8 +90,7 @@ node2.permit_join(duration_sec='100', port=str(rx_port))
|
||||
|
||||
# Send insecure reply from node1 to node2
|
||||
|
||||
sender2 = node1.prepare_tx((ll1, insecure_port), (ll2, rx_port),
|
||||
"Hi back! (insecure)", NUM_MSGS)
|
||||
sender2 = node1.prepare_tx((ll1, insecure_port), (ll2, rx_port), "Hi back! (insecure)", NUM_MSGS)
|
||||
recver2 = node2.prepare_rx(sender2)
|
||||
wpan.Node.perform_async_tx_rx()
|
||||
verify(sender2.was_successful)
|
||||
@@ -105,8 +104,7 @@ verify(node2.is_associated())
|
||||
|
||||
node1.permit_join('0')
|
||||
|
||||
sender = node2.prepare_tx(ll2, (ll1, insecure_port), "Hi (now secure)",
|
||||
NUM_MSGS)
|
||||
sender = node2.prepare_tx(ll2, (ll1, insecure_port), "Hi (now secure)", NUM_MSGS)
|
||||
recver = node1.prepare_rx(sender)
|
||||
wpan.Node.perform_async_tx_rx()
|
||||
verify(sender.was_successful)
|
||||
@@ -114,8 +112,7 @@ verify(recver.was_successful)
|
||||
|
||||
node2.permit_join('0')
|
||||
|
||||
sender2 = node1.prepare_tx((ll1, insecure_port), (ll2, rx_port),
|
||||
"Hi back! (secure now)", NUM_MSGS)
|
||||
sender2 = node1.prepare_tx((ll1, insecure_port), (ll2, rx_port), "Hi back! (secure now)", NUM_MSGS)
|
||||
recver2 = node2.prepare_rx(sender2)
|
||||
wpan.Node.perform_async_tx_rx()
|
||||
verify(sender2.was_successful)
|
||||
|
||||
@@ -74,8 +74,7 @@ def verify_prefix(
|
||||
This function verifies that the `prefix` is present on all the nodes in the `node_list`.
|
||||
"""
|
||||
for node in node_list:
|
||||
prefixes = wpan.parse_on_mesh_prefix_result(
|
||||
node.get(wpan.WPAN_THREAD_ON_MESH_PREFIXES))
|
||||
prefixes = wpan.parse_on_mesh_prefix_result(node.get(wpan.WPAN_THREAD_ON_MESH_PREFIXES))
|
||||
for p in prefixes:
|
||||
if p.prefix == prefix:
|
||||
verify(int(p.prefix_len) == prefix_len)
|
||||
@@ -89,8 +88,7 @@ def verify_prefix(
|
||||
verify(p.priority == priority)
|
||||
break
|
||||
else:
|
||||
raise wpan.VerifyError('Did not find prefix {} on node {}'.format(
|
||||
prefix, node))
|
||||
raise wpan.VerifyError('Did not find prefix {} on node {}'.format(prefix, node))
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -71,8 +71,7 @@ for child in children:
|
||||
|
||||
# Get the child table and verify all children are in the table.
|
||||
|
||||
child_table = wpan.parse_child_table_result(
|
||||
router.get(wpan.WPAN_THREAD_CHILD_TABLE))
|
||||
child_table = wpan.parse_child_table_result(router.get(wpan.WPAN_THREAD_CHILD_TABLE))
|
||||
|
||||
verify(len(child_table) == len(children))
|
||||
|
||||
@@ -82,8 +81,7 @@ for child in children:
|
||||
if entry.ext_address == ext_addr:
|
||||
break
|
||||
else:
|
||||
print('Failed to find a child entry for extended address {} in table'.
|
||||
format(ext_addr))
|
||||
print('Failed to find a child entry for extended address {} in table'.format(ext_addr))
|
||||
exit(1)
|
||||
|
||||
verify(int(entry.rloc16, 16) == int(child.get(wpan.WPAN_THREAD_RLOC16), 16))
|
||||
|
||||
@@ -114,8 +114,7 @@ sed_children[0].set(wpan.WPAN_POLL_INTERVAL, '500')
|
||||
|
||||
for index in range(1, NUM_ROUTERS):
|
||||
routers[index].join_node(routers[index - 1], wpan.JOIN_TYPE_ROUTER)
|
||||
sed_children[index].join_node(routers[index],
|
||||
wpan.JOIN_TYPE_SLEEPY_END_DEVICE)
|
||||
sed_children[index].join_node(routers[index], wpan.JOIN_TYPE_SLEEPY_END_DEVICE)
|
||||
sed_children[index].set(wpan.WPAN_POLL_INTERVAL, '500')
|
||||
|
||||
fed_children[0].join_node(routers[0], wpan.JOIN_TYPE_END_DEVICE)
|
||||
@@ -137,12 +136,10 @@ r1_rloc = int(routers[0].get(wpan.WPAN_THREAD_RLOC16), 16)
|
||||
|
||||
|
||||
def check_r1_router_table():
|
||||
router_table = wpan.parse_router_table_result(routers[0].get(
|
||||
wpan.WPAN_THREAD_ROUTER_TABLE))
|
||||
router_table = wpan.parse_router_table_result(routers[0].get(wpan.WPAN_THREAD_ROUTER_TABLE))
|
||||
verify(len(router_table) == NUM_ROUTERS)
|
||||
for entry in router_table:
|
||||
verify(entry.rloc16 == r1_rloc or entry.is_link_established() or
|
||||
entry.next_hop != INVALID_ROUTER_ID)
|
||||
verify(entry.rloc16 == r1_rloc or entry.is_link_established() or entry.next_hop != INVALID_ROUTER_ID)
|
||||
|
||||
|
||||
wpan.verify_within(check_r1_router_table, ROUTER_TABLE_WAIT_TIME)
|
||||
|
||||
@@ -144,15 +144,9 @@ def check_off_mesh_routes():
|
||||
# its WPAN_THREAD_OFF_MESH_ROUTES list (one time as part of network-wide
|
||||
# network data and again as part of the local network data). Note that
|
||||
# `r1 and `r2` each add a route, while `sed2` does not.
|
||||
verify(
|
||||
len(wpan.parse_list(r1.get(wpan.WPAN_THREAD_OFF_MESH_ROUTES))) ==
|
||||
NUM_ROUTES + NUM_ROUTES_LOCAL)
|
||||
verify(
|
||||
len(wpan.parse_list(r2.get(wpan.WPAN_THREAD_OFF_MESH_ROUTES))) ==
|
||||
NUM_ROUTES + NUM_ROUTES_LOCAL)
|
||||
verify(
|
||||
len(wpan.parse_list(sed2.get(wpan.WPAN_THREAD_OFF_MESH_ROUTES))) ==
|
||||
NUM_ROUTES)
|
||||
verify(len(wpan.parse_list(r1.get(wpan.WPAN_THREAD_OFF_MESH_ROUTES))) == NUM_ROUTES + NUM_ROUTES_LOCAL)
|
||||
verify(len(wpan.parse_list(r2.get(wpan.WPAN_THREAD_OFF_MESH_ROUTES))) == NUM_ROUTES + NUM_ROUTES_LOCAL)
|
||||
verify(len(wpan.parse_list(sed2.get(wpan.WPAN_THREAD_OFF_MESH_ROUTES))) == NUM_ROUTES)
|
||||
|
||||
|
||||
wpan.verify_within(check_off_mesh_routes, WAIT_TIME)
|
||||
|
||||
@@ -130,8 +130,7 @@ def check_addresses_and_prefixes():
|
||||
# correct flags).
|
||||
for prefix in [IP6_PREFIX_1, IP6_PREFIX_2, IP6_PREFIX_3]:
|
||||
for node in all_nodes:
|
||||
prefixes = wpan.parse_on_mesh_prefix_result(
|
||||
node.get(wpan.WPAN_THREAD_ON_MESH_PREFIXES))
|
||||
prefixes = wpan.parse_on_mesh_prefix_result(node.get(wpan.WPAN_THREAD_ON_MESH_PREFIXES))
|
||||
for p in prefixes:
|
||||
if p.prefix == prefix:
|
||||
verify(p.prefix_len == '64')
|
||||
@@ -145,8 +144,7 @@ def check_addresses_and_prefixes():
|
||||
verify(p.priority == "med")
|
||||
break
|
||||
else: # `for` loop finished without finding the prefix.
|
||||
raise wpan.VerifyError(
|
||||
'Did not find prefix {} on node {}'.format(prefix, node))
|
||||
raise wpan.VerifyError('Did not find prefix {} on node {}'.format(prefix, node))
|
||||
|
||||
# Verify that IPv6 address of `sed2` is present on `r2` (its parent)
|
||||
# "Thread:ChildTable:Addresses".
|
||||
@@ -173,8 +171,7 @@ def check_address_prefix_removed():
|
||||
verify(r2.find_ip6_address_with_prefix(IP6_PREFIX_1) == '')
|
||||
# Verify that the related prefix is also removed on all nodes
|
||||
for node in all_nodes:
|
||||
prefixes = wpan.parse_on_mesh_prefix_result(
|
||||
node.get(wpan.WPAN_THREAD_ON_MESH_PREFIXES))
|
||||
prefixes = wpan.parse_on_mesh_prefix_result(node.get(wpan.WPAN_THREAD_ON_MESH_PREFIXES))
|
||||
for p in prefixes:
|
||||
verify(p.prefix != IP6_PREFIX_1)
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user