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