[style] change python yapf column_limit to 119 (#5339)

This commit is contained in:
Simon Lin
2020-08-07 12:40:24 +08:00
committed by GitHub
parent e810357adb
commit d7343c877b
150 changed files with 2910 additions and 5676 deletions
+1 -1
View File
@@ -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
View File
@@ -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()
+5 -10
View File
@@ -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(
+33 -45
View File
@@ -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,
+76 -159
View File
@@ -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(
+8 -19
View File
@@ -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
View File
@@ -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),
)
+27 -54
View File
@@ -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
+35 -79
View File
@@ -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()))
+53 -110
View File
@@ -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))
+8 -19
View File
@@ -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
+18 -37
View File
@@ -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)
+22 -50
View File
@@ -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
+33 -66
View File
@@ -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))
+13 -26
View File
@@ -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
+21 -38
View File
@@ -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):
+6 -12
View File
@@ -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})'
+5 -10
View File
@@ -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):
+35 -70
View File
@@ -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')
+7 -15
View File
@@ -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):
+14 -30
View File
@@ -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,
)
+12 -24
View File
@@ -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()
+82 -142
View File
@@ -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)
+1 -2
View File
@@ -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
+35 -64
View File
@@ -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
+45 -90
View File
@@ -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
+38 -73
View File
@@ -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
+5 -11
View File
@@ -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)
+18 -30
View File
@@ -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")
+1 -3
View File
@@ -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)
+2 -4
View File
@@ -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))
# -----------------------------------------------------------------------------------------------------------------------
+2 -4
View File
@@ -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))
+3 -6
View File
@@ -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)
+3 -6
View File
@@ -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