• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2#
3#  Copyright (c) 2016, The OpenThread Authors.
4#  All rights reserved.
5#
6#  Redistribution and use in source and binary forms, with or without
7#  modification, are permitted provided that the following conditions are met:
8#  1. Redistributions of source code must retain the above copyright
9#     notice, this list of conditions and the following disclaimer.
10#  2. Redistributions in binary form must reproduce the above copyright
11#     notice, this list of conditions and the following disclaimer in the
12#     documentation and/or other materials provided with the distribution.
13#  3. Neither the name of the copyright holder nor the
14#     names of its contributors may be used to endorse or promote products
15#     derived from this software without specific prior written permission.
16#
17#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27#  POSSIBILITY OF SUCH DAMAGE.
28#
29import os
30from enum import Enum
31
32import coap
33import dtls
34import ipv6
35import lowpan
36import mesh_cop
37import message
38import mle
39import net_crypto
40import network_data
41import network_diag
42import network_layer
43import simulator
44import sniffer
45from tlvs_parsing import SubTlvsFactory
46
47MESH_LOCAL_PREFIX = 'fd00:db8::/64'
48MESH_LOCAL_PREFIX_REGEX_PATTERN = '^fd00:0?db8:0{0,4}:0{0,4}'
49ROUTING_LOCATOR = '64/:0:ff:fe00:/16'
50ROUTING_LOCATOR_REGEX_PATTERN = r'.*:(0)?:0{0,2}ff:fe00:\w{1,4}$'
51LINK_LOCAL = 'fe80:/112'
52LINK_LOCAL_REGEX_PATTERN = '^fe80:.*'
53ALOC_FLAG_REGEX_PATTERN = '.*:fc..$'
54LINK_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS = 'ff32:40:fd00:db8:0:0:0:1'
55REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS = 'ff33:40:fd00:db8:0:0:0:1'
56REALM_LOCAL_ALL_NODES_ADDRESS = 'ff03::1'
57REALM_LOCAL_ALL_ROUTERS_ADDRESS = 'ff03::2'
58LINK_LOCAL_ALL_NODES_ADDRESS = 'ff02::1'
59LINK_LOCAL_ALL_ROUTERS_ADDRESS = 'ff02::2'
60TMF_PORT = 61631
61
62DOMAIN_PREFIX = 'fd00:7d03:7d03:7d03::/64'
63DOMAIN_PREFIX_REGEX_PATTERN = '^fd00:7d03:7d03:7d03:'
64DOMAIN_PREFIX_ALTER = 'fd00:7d04:7d04:7d04::/64'
65
66PORT_OFFSET = int(os.getenv('PORT_OFFSET', '0'))
67BACKBONE_IPV6_ADDR_START = f'{0x9100 + PORT_OFFSET:04x}'
68BACKBONE_PREFIX = f'{BACKBONE_IPV6_ADDR_START}::/64'
69BACKBONE_PREFIX_REGEX_PATTERN = f'^{BACKBONE_IPV6_ADDR_START}:'
70BACKBONE_DOCKER_NETWORK_NAME = f'backbone{PORT_OFFSET}'
71BACKBONE_DOCKER_NETWORK_DEFAULT_ID = 0
72BACKBONE_IFNAME = 'eth0'
73THREAD_IFNAME = 'wpan0'
74
75OTBR_DOCKER_IMAGE = os.getenv('OTBR_DOCKER_IMAGE', 'otbr-ot12-backbone-ci')
76OTBR_DOCKER_NAME_PREFIX = f'otbr_{PORT_OFFSET}_'
77
78ALL_NETWORK_BBRS_ADDRESS = 'ff32:40:fd00:db8:0:0:0:3'
79
80ALL_DOMAIN_BBRS_ADDRESS = 'ff32:40:fd00:7d03:7d03:7d03:0:3'
81ALL_DOMAIN_BBRS_ADDRESS_ALTER = 'ff32:40:fd00:7d04:7d04:7d04:0:3'
82
83ONLINK_GUA_PREFIX = '2021::/64'
84
85# Any address starts with 'fd' are considered on-link address.
86ONLINK_PREFIX_REGEX_PATTERN = '^fd'
87
88DEFAULT_NETWORK_KEY = bytearray([
89    0x00,
90    0x11,
91    0x22,
92    0x33,
93    0x44,
94    0x55,
95    0x66,
96    0x77,
97    0x88,
98    0x99,
99    0xaa,
100    0xbb,
101    0xcc,
102    0xdd,
103    0xee,
104    0xff,
105])
106
107
108class ADDRESS_TYPE(Enum):
109    LINK_LOCAL = 'LINK_LOCAL'  # For Thread interface link-local only
110    GLOBAL = 'GLOBAL'
111    RLOC = 'RLOC'
112    ALOC = 'ALOC'
113    ML_EID = 'ML_EID'
114    DUA = 'DUA'
115    BACKBONE_GUA = 'BACKBONE_GUA'
116    BACKBONE_LINK_LOCAL = 'BACKBONE_LINK_LOCAL'
117    OMR = 'OMR'
118    ONLINK_ULA = 'ONLINK_ULA'
119    ONLINK_GUA = 'ONLINK_GUA'
120
121
122RSSI = {
123    'LINK_QULITY_0': -100,
124    'LINK_QULITY_1': -95,
125    'LINK_QULITY_2': -85,
126    'LINK_QULITY_3': -65,
127}
128
129SNIFFER_ID = int(os.getenv('SNIFFER_ID', 34))
130
131CHANNEL = 11
132CHANNEL_MASK = 0x07fff800
133EXTENDED_PANID = 'dead00beef00cafe'
134NETWORK_NAME = 'OpenThread'
135PANID = 0xface
136PSKC = 'c23a76e98f1a6483639b1ac1271e2e27'
137SECURITY_POLICY = [672, 'onrc']
138
139LEADER_STARTUP_DELAY = 12
140ROUTER_STARTUP_DELAY = 10
141LEADER_REBOOT_DELAY = 40
142ED_STARTUP_DELAY = 5
143BORDER_ROUTER_STARTUP_DELAY = 20
144MAX_NEIGHBOR_AGE = 100
145INFINITE_COST_TIMEOUT = 90
146
147MAX_ADVERTISEMENT_INTERVAL = 32
148MLE_END_DEVICE_TIMEOUT = 100
149
150AQ_TIMEOUT = 3
151ADDRESS_QUERY_INITIAL_RETRY_DELAY = 15
152DEFAULT_CHILD_TIMEOUT = 6
153VIRTUAL_TIME = int(os.getenv('VIRTUAL_TIME', 0))
154PARENT_AGGREGATIOIN_DELAY = 5
155DUA_DAD_DELAY = 5
156DEFAULT_BBR_REGISTRATION_JITTER = 2
157DEFAULT_ROUTER_SELECTION_JITTER = 1
158
159LEADER_NOTIFY_SED_BY_CHILD_UPDATE_REQUEST = True
160
161THREAD_VERSION_1_1 = 2
162THREAD_VERSION_1_2 = 3
163THREAD_VERSION_1_3 = 4
164THREAD_VERSION_1_4 = 5
165
166PACKET_VERIFICATION_NONE = 0
167PACKET_VERIFICATION_DEFAULT = 1
168PACKET_VERIFICATION_TREL = 2
169
170# After leader reset it may retransmit link request 6 times with max 5.5s interval
171LEADER_RESET_DELAY = 41
172# After router reset it may retransmit link request 3 times with max 5.5s interval
173ROUTER_RESET_DELAY = 23
174MLE_MAX_CRITICAL_TRANSMISSION_COUNT = 6
175MLE_MAX_TRANSMISSION_COUNT = 3
176
177
178def create_default_network_data_prefix_sub_tlvs_factories():
179    return {
180        network_data.TlvType.HAS_ROUTE:
181            network_data.HasRouteFactory(routes_factory=network_data.RoutesFactory(
182                route_factory=network_data.RouteFactory())),
183        network_data.TlvType.BORDER_ROUTER:
184            network_data.BorderRouterFactory(),
185        network_data.TlvType.LOWPAN_ID:
186            network_data.LowpanIdFactory(),
187    }
188
189
190def create_default_network_data_prefix_sub_tlvs_factory():
191    return network_data.PrefixSubTlvsFactory(
192        sub_tlvs_factories=create_default_network_data_prefix_sub_tlvs_factories())
193
194
195def create_default_network_data_service_sub_tlvs_factories():
196    return {network_data.TlvType.SERVER: network_data.ServerFactory()}
197
198
199def create_default_network_data_service_sub_tlvs_factory():
200    return network_data.ServiceSubTlvsFactory(
201        sub_tlvs_factories=create_default_network_data_service_sub_tlvs_factories())
202
203
204def create_default_network_data_commissioning_data_sub_tlvs_factories():
205    return {
206        mesh_cop.TlvType.CHANNEL: mesh_cop.ChannelFactory(),
207        mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
208        mesh_cop.TlvType.BORDER_AGENT_LOCATOR: mesh_cop.BorderAgentLocatorFactory(),
209        mesh_cop.TlvType.COMMISSIONER_SESSION_ID: mesh_cop.CommissionerSessionIdFactory(),
210        mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
211    }
212
213
214def create_default_network_data_commissioning_data_sub_tlvs_factory():
215    return network_data.CommissioningDataSubTlvsFactory(
216        sub_tlvs_factories=create_default_network_data_commissioning_data_sub_tlvs_factories())
217
218
219def create_default_network_data_tlvs_factories():
220    return {
221        network_data.TlvType.PREFIX:
222            network_data.PrefixFactory(sub_tlvs_factory=create_default_network_data_prefix_sub_tlvs_factory()),
223        network_data.TlvType.SERVICE:
224            network_data.ServiceFactory(sub_tlvs_factory=create_default_network_data_service_sub_tlvs_factory()),
225        network_data.TlvType.COMMISSIONING:
226            network_data.CommissioningDataFactory(
227                sub_tlvs_factory=create_default_network_data_commissioning_data_sub_tlvs_factory()),
228    }
229
230
231def create_default_network_data_tlvs_factory():
232    return network_data.NetworkDataTlvsFactory(sub_tlvs_factories=create_default_network_data_tlvs_factories())
233
234
235def create_default_mle_tlv_route64_factory():
236    return mle.Route64Factory(link_quality_and_route_data_factory=mle.LinkQualityAndRouteDataFactory())
237
238
239def create_default_mle_tlv_network_data_factory():
240    return mle.NetworkDataFactory(network_data_tlvs_factory=create_default_network_data_tlvs_factory())
241
242
243def create_default_mle_tlv_address_registration_factory():
244    return mle.AddressRegistrationFactory(
245        addr_compressed_factory=mle.AddressCompressedFactory(),
246        addr_full_factory=mle.AddressFullFactory(),
247    )
248
249
250def create_default_mle_tlv_thread_discovery_factory():
251    return mle.ThreadDiscoveryFactory(thread_discovery_tlvs_factory=create_default_thread_discovery_tlvs_factory())
252
253
254def create_default_thread_discovery_tlvs_factory():
255    return mesh_cop.ThreadDiscoveryTlvsFactory(sub_tlvs_factories=create_default_thread_discovery_sub_tlvs_factories())
256
257
258def create_default_thread_discovery_sub_tlvs_factories():
259    return {
260        mesh_cop.TlvType.DISCOVERY_REQUEST: mesh_cop.DiscoveryRequestFactory(),
261        mesh_cop.TlvType.DISCOVERY_RESPONSE: mesh_cop.DiscoveryResponseFactory(),
262        mesh_cop.TlvType.EXTENDED_PANID: mesh_cop.ExtendedPanidFactory(),
263        mesh_cop.TlvType.NETWORK_NAME: mesh_cop.NetworkNameFactory(),
264        mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
265        mesh_cop.TlvType.JOINER_UDP_PORT: mesh_cop.JoinerUdpPortFactory(),
266        mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
267    }
268
269
270def create_default_mle_tlvs_factories():
271    return {
272        mle.TlvType.SOURCE_ADDRESS: mle.SourceAddressFactory(),
273        mle.TlvType.MODE: mle.ModeFactory(),
274        mle.TlvType.TIMEOUT: mle.TimeoutFactory(),
275        mle.TlvType.CHALLENGE: mle.ChallengeFactory(),
276        mle.TlvType.RESPONSE: mle.ResponseFactory(),
277        mle.TlvType.LINK_LAYER_FRAME_COUNTER: mle.LinkLayerFrameCounterFactory(),
278        mle.TlvType.MLE_FRAME_COUNTER: mle.MleFrameCounterFactory(),
279        mle.TlvType.ROUTE64: create_default_mle_tlv_route64_factory(),
280        mle.TlvType.ADDRESS16: mle.Address16Factory(),
281        mle.TlvType.LEADER_DATA: mle.LeaderDataFactory(),
282        mle.TlvType.NETWORK_DATA: create_default_mle_tlv_network_data_factory(),
283        mle.TlvType.TLV_REQUEST: mle.TlvRequestFactory(),
284        mle.TlvType.SCAN_MASK: mle.ScanMaskFactory(),
285        mle.TlvType.CONNECTIVITY: mle.ConnectivityFactory(),
286        mle.TlvType.LINK_MARGIN: mle.LinkMarginFactory(),
287        mle.TlvType.STATUS: mle.StatusFactory(),
288        mle.TlvType.VERSION: mle.VersionFactory(),
289        mle.TlvType.ADDRESS_REGISTRATION: create_default_mle_tlv_address_registration_factory(),
290        mle.TlvType.CHANNEL: mle.ChannelFactory(),
291        mle.TlvType.PANID: mle.PanIdFactory(),
292        mle.TlvType.ACTIVE_TIMESTAMP: mle.ActiveTimestampFactory(),
293        mle.TlvType.PENDING_TIMESTAMP: mle.PendingTimestampFactory(),
294        mle.TlvType.CSL_CHANNEL: mle.CslChannelFactory(),
295        mle.TlvType.CSL_SYNCHRONIZED_TIMEOUT: mle.CslSynchronizedTimeoutFactory(),
296        mle.TlvType.CSL_CLOCK_ACCURACY: mle.CslClockAccuracyFactory(),
297        mle.TlvType.ACTIVE_OPERATIONAL_DATASET: mle.ActiveOperationalDatasetFactory(),
298        mle.TlvType.PENDING_OPERATIONAL_DATASET: mle.PendingOperationalDatasetFactory(),
299        mle.TlvType.TIME_REQUEST: mle.TimeRequestFactory(),
300        mle.TlvType.TIME_PARAMETER: mle.TimeParameterFactory(),
301        mle.TlvType.THREAD_DISCOVERY: create_default_mle_tlv_thread_discovery_factory(),
302        mle.TlvType.LINK_METRICS_QUERY: mle.LinkMetricsQueryFactory(),
303        mle.TlvType.LINK_METRICS_MANAGEMENT: mle.LinkMetricsManagementFactory(),
304        mle.TlvType.LINK_METRICS_REPORT: mle.LinkMetricsReportFactory(),
305        mle.TlvType.LINK_PROBE: mle.LinkProbeFactory(),
306    }
307
308
309def create_default_mle_crypto_engine(network_key):
310    return net_crypto.CryptoEngine(crypto_material_creator=net_crypto.MleCryptoMaterialCreator(network_key))
311
312
313def create_default_mle_message_factory(network_key):
314    return mle.MleMessageFactory(
315        aux_sec_hdr_factory=net_crypto.AuxiliarySecurityHeaderFactory(),
316        mle_command_factory=mle.MleCommandFactory(tlvs_factories=create_default_mle_tlvs_factories()),
317        crypto_engine=create_default_mle_crypto_engine(network_key),
318    )
319
320
321def create_deafult_network_tlvs_factories():
322    return {
323        network_layer.TlvType.TARGET_EID:
324            network_layer.TargetEidFactory(),
325        network_layer.TlvType.MAC_EXTENDED_ADDRESS:
326            network_layer.MacExtendedAddressFactory(),
327        network_layer.TlvType.RLOC16:
328            network_layer.Rloc16Factory(),
329        network_layer.TlvType.ML_EID:
330            network_layer.MlEidFactory(),
331        network_layer.TlvType.STATUS:
332            network_layer.StatusFactory(),
333        network_layer.TlvType.TIME_SINCE_LAST_TRANSACTION:
334            network_layer.TimeSinceLastTransactionFactory(),
335        network_layer.TlvType.ROUTER_MASK:
336            network_layer.RouterMaskFactory(),
337        network_layer.TlvType.ND_OPTION:
338            network_layer.NdOptionFactory(),
339        network_layer.TlvType.ND_DATA:
340            network_layer.NdDataFactory(),
341        network_layer.TlvType.THREAD_NETWORK_DATA:
342            network_layer.ThreadNetworkDataFactory(create_default_network_data_tlvs_factory()),
343        network_layer.TlvType.XTAL_ACCURACY:
344            network_layer.XtalAccuracyFactory(),
345        # Routing information are distributed in a Thread network by MLE Routing TLV
346        # which is in fact MLE Route64 TLV. Thread specification v1.1. - Chapter 5.20
347        network_layer.TlvType.MLE_ROUTING:
348            create_default_mle_tlv_route64_factory(),
349        network_layer.TlvType.IPv6_ADDRESSES:
350            network_layer.IPv6AddressesFactory(),
351    }
352
353
354def create_default_network_tlvs_factory():
355    return SubTlvsFactory(sub_tlvs_factories=create_deafult_network_tlvs_factories())
356
357
358def create_default_mesh_cop_tlvs_factories():
359    return {
360        mesh_cop.TlvType.CHANNEL: mesh_cop.ChannelFactory(),
361        mesh_cop.TlvType.PAN_ID: mesh_cop.PanidFactory(),
362        mesh_cop.TlvType.EXTENDED_PANID: mesh_cop.ExtendedPanidFactory(),
363        mesh_cop.TlvType.NETWORK_NAME: mesh_cop.NetworkNameFactory(),
364        mesh_cop.TlvType.PSKC: mesh_cop.PSKcFactory(),
365        mesh_cop.TlvType.NETWORK_KEY: mesh_cop.NetworkKeyFactory(),
366        mesh_cop.TlvType.NETWORK_KEY_SEQUENCE_COUNTER: mesh_cop.NetworkKeySequenceCounterFactory(),
367        mesh_cop.TlvType.NETWORK_MESH_LOCAL_PREFIX: mesh_cop.NetworkMeshLocalPrefixFactory(),
368        mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
369        mesh_cop.TlvType.BORDER_AGENT_LOCATOR: mesh_cop.BorderAgentLocatorFactory(),
370        mesh_cop.TlvType.COMMISSIONER_ID: mesh_cop.CommissionerIdFactory(),
371        mesh_cop.TlvType.COMMISSIONER_SESSION_ID: mesh_cop.CommissionerSessionIdFactory(),
372        mesh_cop.TlvType.SECURITY_POLICY: mesh_cop.SecurityPolicyFactory(),
373        mesh_cop.TlvType.GET: mesh_cop.GetFactory(),
374        mesh_cop.TlvType.ACTIVE_TIMESTAMP: mesh_cop.ActiveTimestampFactory(),
375        mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
376        mesh_cop.TlvType.STATE: mesh_cop.StateFactory(),
377        mesh_cop.TlvType.JOINER_DTLS_ENCAPSULATION: mesh_cop.JoinerDtlsEncapsulationFactory(),
378        mesh_cop.TlvType.JOINER_UDP_PORT: mesh_cop.JoinerUdpPortFactory(),
379        mesh_cop.TlvType.JOINER_IID: mesh_cop.JoinerIIDFactory(),
380        mesh_cop.TlvType.JOINER_ROUTER_LOCATOR: mesh_cop.JoinerRouterLocatorFactory(),
381        mesh_cop.TlvType.JOINER_ROUTER_KEK: mesh_cop.JoinerRouterKEKFactory(),
382        mesh_cop.TlvType.PROVISIONING_URL: mesh_cop.ProvisioningUrlFactory(),
383        mesh_cop.TlvType.VENDOR_NAME: mesh_cop.VendorNameFactory(),
384        mesh_cop.TlvType.VENDOR_MODEL: mesh_cop.VendorModelFactory(),
385        mesh_cop.TlvType.VENDOR_SW_VERSION: mesh_cop.VendorSWVersionFactory(),
386        mesh_cop.TlvType.VENDOR_DATA: mesh_cop.VendorDataFactory(),
387        mesh_cop.TlvType.VENDOR_STACK_VERSION: mesh_cop.VendorStackVersionFactory(),
388        mesh_cop.TlvType.UDP_ENCAPSULATION: mesh_cop.UdpEncapsulationFactory(),
389        mesh_cop.TlvType.IPV6_ADDRESS: mesh_cop.Ipv6AddressFactory(),
390        mesh_cop.TlvType.PENDING_TIMESTAMP: mesh_cop.PendingTimestampFactory(),
391        mesh_cop.TlvType.DELAY_TIMER: mesh_cop.DelayTimerFactory(),
392        mesh_cop.TlvType.CHANNEL_MASK: mesh_cop.ChannelMaskFactory(),
393        mesh_cop.TlvType.COUNT: mesh_cop.CountFactory(),
394        mesh_cop.TlvType.PERIOD: mesh_cop.PeriodFactory(),
395        mesh_cop.TlvType.SCAN_DURATION: mesh_cop.ScanDurationFactory(),
396        mesh_cop.TlvType.ENERGY_LIST: mesh_cop.EnergyListFactory(),
397    }
398
399
400def create_default_mesh_cop_tlvs_factory():
401    return SubTlvsFactory(sub_tlvs_factories=create_default_mesh_cop_tlvs_factories())
402
403
404def create_default_network_diag_tlv_factories():
405    return {
406        network_diag.TlvType.EXT_ADDRESS: network_layer.MacExtendedAddressFactory(),
407        network_diag.TlvType.ADDRESS16: mle.Address16Factory(),
408        network_diag.TlvType.MODE: mle.ModeFactory(),
409        network_diag.TlvType.POLLING_PERIOD: mle.TimeoutFactory(),
410        network_diag.TlvType.CONNECTIVITY: mle.ConnectivityFactory(),
411        network_diag.TlvType.ROUTE64: create_default_mle_tlv_route64_factory(),
412        network_diag.TlvType.LEADER_DATA: mle.LeaderDataFactory(),
413        network_diag.TlvType.NETWORK_DATA: create_default_mle_tlv_network_data_factory(),
414        network_diag.TlvType.IPV6_ADDRESS_LIST: network_diag.Ipv6AddressListFactory(),
415        network_diag.TlvType.MAC_COUNTERS: network_diag.MacCountersFactory(),
416        network_diag.TlvType.BATTERY_LEVEL: network_diag.BatteryLevelFactory(),
417        network_diag.TlvType.SUPPLY_VOLTAGE: network_diag.SupplyVoltageFactory(),
418        network_diag.TlvType.CHILD_TABLE: network_diag.ChildTableFactory(),
419        network_diag.TlvType.CHANNEL_PAGES: network_diag.ChannelPagesFactory(),
420        network_diag.TlvType.TYPE_LIST: network_diag.TypeListFactory(),
421        network_diag.TlvType.MAX_CHILD_TIMEOUT: network_diag.MaxChildTimeoutFactory()
422    }
423
424
425def create_default_network_diag_tlvs_factory():
426    return SubTlvsFactory(sub_tlvs_factories=create_default_network_diag_tlv_factories())
427
428
429def create_default_uri_path_based_payload_factories():
430    network_layer_tlvs_factory = create_default_network_tlvs_factory()
431    mesh_cop_tlvs_factory = create_default_mesh_cop_tlvs_factory()
432    network_diag_tlvs_factory = create_default_network_diag_tlvs_factory()
433
434    return {
435        '/a/as': network_layer_tlvs_factory,
436        '/a/aq': network_layer_tlvs_factory,
437        '/a/ar': network_layer_tlvs_factory,
438        '/a/ae': network_layer_tlvs_factory,
439        '/a/an': network_layer_tlvs_factory,
440        '/a/sd': network_layer_tlvs_factory,
441        '/c/lp': mesh_cop_tlvs_factory,
442        '/c/cs': mesh_cop_tlvs_factory,
443        '/d/da': network_diag_tlvs_factory,
444        '/d/dg': network_diag_tlvs_factory,
445        '/d/dq': network_diag_tlvs_factory,
446        '/d/dr': network_diag_tlvs_factory,
447        '/n/mr': network_layer_tlvs_factory,
448        '/n/dr': network_layer_tlvs_factory,
449        '/n/dn': network_layer_tlvs_factory,
450    }
451
452
453def create_default_coap_message_factory():
454    return coap.CoapMessageFactory(
455        options_factory=coap.CoapOptionsFactory(),
456        uri_path_based_payload_factories=create_default_uri_path_based_payload_factories(),
457        message_id_to_uri_path_binder=coap.CoapMessageIdToUriPathBinder(),
458    )
459
460
461def create_default_ipv6_hop_by_hop_options_factories():
462    return {109: ipv6.MPLOptionFactory()}
463
464
465def create_default_ipv6_hop_by_hop_options_factory():
466    return ipv6.HopByHopOptionsFactory(options_factories=create_default_ipv6_hop_by_hop_options_factories())
467
468
469def create_default_based_on_src_dst_ports_udp_payload_factory(network_key):
470    mle_message_factory = create_default_mle_message_factory(network_key)
471    coap_message_factory = create_default_coap_message_factory()
472    dtls_message_factory = create_default_dtls_message_factory()
473
474    return ipv6.UdpBasedOnSrcDstPortsPayloadFactory(
475        src_dst_port_based_payload_factories={
476            19788: mle_message_factory,
477            61631: coap_message_factory,
478            1000: dtls_message_factory,
479            5683: coap_message_factory,
480            5684: dtls_message_factory,
481        })
482
483
484def create_default_dtls_message_factory():
485    return dtls.MessageFactory()
486
487
488def create_default_ipv6_icmp_body_factories():
489    return {
490        ipv6.ICMP_DESTINATION_UNREACHABLE: ipv6.ICMPv6DestinationUnreachableFactory(),
491        ipv6.ICMP_ECHO_REQUEST: ipv6.ICMPv6EchoBodyFactory(),
492        ipv6.ICMP_ECHO_RESPONSE: ipv6.ICMPv6EchoBodyFactory(),
493        'default': ipv6.BytesPayloadFactory(),
494    }
495
496
497def create_default_ipv6_upper_layer_factories(network_key):
498    return {
499        ipv6.IPV6_NEXT_HEADER_UDP:
500            ipv6.UDPDatagramFactory(
501                udp_header_factory=ipv6.UDPHeaderFactory(),
502                udp_payload_factory=create_default_based_on_src_dst_ports_udp_payload_factory(network_key),
503            ),
504        ipv6.IPV6_NEXT_HEADER_ICMP:
505            ipv6.ICMPv6Factory(body_factories=create_default_ipv6_icmp_body_factories()),
506    }
507
508
509def create_default_lowpan_extension_headers_factories():
510    return {
511        ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP:
512            lowpan.LowpanHopByHopFactory(hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())
513    }
514
515
516def create_default_ipv6_extension_headers_factories():
517    return {
518        ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP:
519            ipv6.HopByHopFactory(hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())
520    }
521
522
523def create_default_ipv6_packet_factory(network_key):
524    return ipv6.IPv6PacketFactory(
525        ehf=create_default_ipv6_extension_headers_factories(),
526        ulpf=create_default_ipv6_upper_layer_factories(network_key),
527    )
528
529
530def create_default_lowpan_decompressor(context_manager):
531    return lowpan.LowpanDecompressor(
532        lowpan_ip_header_factory=lowpan.LowpanIpv6HeaderFactory(context_manager=context_manager),
533        lowpan_extension_headers_factory=lowpan.LowpanExtensionHeadersFactory(
534            ext_headers_factories=create_default_lowpan_extension_headers_factories()),
535        lowpan_udp_header_factory=lowpan.LowpanUdpHeaderFactory(),
536    )
537
538
539def create_default_thread_context_manager():
540    context_manager = lowpan.ContextManager()
541    context_manager[0] = lowpan.Context(MESH_LOCAL_PREFIX)
542
543    return context_manager
544
545
546def create_default_lowpan_parser(context_manager, network_key=DEFAULT_NETWORK_KEY):
547    return lowpan.LowpanParser(
548        lowpan_mesh_header_factory=lowpan.LowpanMeshHeaderFactory(),
549        lowpan_decompressor=create_default_lowpan_decompressor(context_manager),
550        lowpan_fragements_buffers_manager=lowpan.LowpanFragmentsBuffersManager(),
551        ipv6_packet_factory=create_default_ipv6_packet_factory(network_key),
552    )
553
554
555def create_default_thread_message_factory(network_key=DEFAULT_NETWORK_KEY):
556    context_manager = create_default_thread_context_manager()
557    lowpan_parser = create_default_lowpan_parser(context_manager, network_key)
558
559    return message.MessageFactory(lowpan_parser=lowpan_parser)
560
561
562def create_default_thread_sniffer(use_message_factory=True):
563    return sniffer.Sniffer(create_default_thread_message_factory() if use_message_factory else None)
564
565
566def create_default_simulator(use_message_factory=True):
567    if VIRTUAL_TIME:
568        return simulator.VirtualTime(use_message_factory=use_message_factory)
569    return simulator.RealTime(use_message_factory=use_message_factory)
570