Repository: AVSystem/Anjay Branch: master Commit: 3fd991b2dc16 Files: 989 Total size: 10.6 MB Directory structure: gitextract_r4wlvbaj/ ├── .dockerignore ├── .github/ │ └── workflows/ │ ├── anjay-tests.yml │ └── coverity.yml ├── .gitignore ├── .gitmodules ├── CHANGELOG.md ├── CMakeLists.txt ├── CONTRIBUTING.rst ├── Dockerfile ├── Doxyfile.in ├── LICENSE ├── NOTICE ├── README.Windows.md ├── README.md ├── cmake/ │ ├── anjay-config.cmake.in │ ├── anjay-version.cmake.in │ ├── requirePython3venv.cmake │ └── toolchain/ │ └── afl-gcc.cmake ├── demo/ │ ├── CMakeLists.txt │ ├── advanced_firmware_update.c │ ├── advanced_firmware_update.h │ ├── advanced_firmware_update_addimg.c │ ├── advanced_firmware_update_app.c │ ├── demo.c │ ├── demo.h │ ├── demo_args.c │ ├── demo_args.h │ ├── demo_cmds.c │ ├── demo_cmds.h │ ├── demo_time.c │ ├── demo_utils.c │ ├── demo_utils.h │ ├── firmware_update.c │ ├── firmware_update.h │ ├── lwm2m_gateway.c │ ├── lwm2m_gateway.h │ ├── net_traffic_interceptor.c │ ├── net_traffic_interceptor.h │ ├── objects/ │ │ ├── apn_conn_profile.c │ │ ├── binary_app_data_container.c │ │ ├── cell_connectivity.c │ │ ├── conn_monitoring.c │ │ ├── conn_statistics.c │ │ ├── device.c │ │ ├── download_diagnostics.c │ │ ├── event_log.c │ │ ├── ext_dev_info.c │ │ ├── gateway_end_devices/ │ │ │ ├── binary_app_data_container.c │ │ │ ├── binary_app_data_container.h │ │ │ ├── push_button_object.c │ │ │ ├── push_button_object.h │ │ │ ├── temperature_object.c │ │ │ └── temperature_object.h │ │ ├── geopoints.c │ │ ├── ip_ping.c │ │ ├── ipso_objects.c │ │ ├── location.c │ │ ├── portfolio.c │ │ └── test.c │ ├── objects.h │ ├── software_mgmt.c │ └── software_mgmt.h ├── deps/ │ └── avs_coap/ │ ├── .gitignore │ ├── CMakeLists.txt │ ├── Doxyfile.in │ ├── LICENSE │ ├── NOTICE │ ├── README.md │ ├── cmake/ │ │ ├── AddHeaderSelfSufficiencyTests.cmake │ │ ├── avs_coap-config.cmake.in │ │ └── fill-placeholders.cmake │ ├── devconfig │ ├── doc/ │ │ ├── CMakeLists.txt │ │ └── sphinx/ │ │ ├── make.bat │ │ └── source/ │ │ ├── ErrorHandling.rst │ │ ├── Fuzzing.rst │ │ ├── Overview.rst │ │ ├── _static/ │ │ │ └── theme_overrides.css │ │ ├── conf.py.in │ │ └── index.rst │ ├── examples/ │ │ ├── CMakeLists.txt │ │ └── async-client/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── include_public/ │ │ └── avsystem/ │ │ └── coap/ │ │ ├── async.h │ │ ├── async_client.h │ │ ├── async_exchange.h │ │ ├── async_server.h │ │ ├── avs_coap_config.h.in │ │ ├── coap.h │ │ ├── code.h │ │ ├── ctx.h │ │ ├── observe.h │ │ ├── option.h │ │ ├── streaming.h │ │ ├── tcp.h │ │ ├── token.h │ │ ├── udp.h │ │ └── writer.h │ ├── requirements.txt │ ├── src/ │ │ ├── async/ │ │ │ ├── avs_coap_async_client.c │ │ │ ├── avs_coap_async_client.h │ │ │ ├── avs_coap_async_server.c │ │ │ ├── avs_coap_async_server.h │ │ │ ├── avs_coap_exchange.c │ │ │ └── avs_coap_exchange.h │ │ ├── avs_coap_code_utils.c │ │ ├── avs_coap_code_utils.h │ │ ├── avs_coap_common_utils.c │ │ ├── avs_coap_common_utils.h │ │ ├── avs_coap_ctx.c │ │ ├── avs_coap_ctx.h │ │ ├── avs_coap_ctx_vtable.h │ │ ├── avs_coap_init.h │ │ ├── avs_coap_observe.c │ │ ├── avs_coap_observe.h │ │ ├── avs_coap_parse_utils.h │ │ ├── avs_coap_poison.h │ │ ├── avs_coap_x_log_config.h │ │ ├── options/ │ │ │ ├── avs_coap_iterator.c │ │ │ ├── avs_coap_iterator.h │ │ │ ├── avs_coap_option.c │ │ │ ├── avs_coap_option.h │ │ │ ├── avs_coap_options.c │ │ │ └── avs_coap_options.h │ │ ├── streaming/ │ │ │ ├── avs_coap_streaming_client.c │ │ │ ├── avs_coap_streaming_client.h │ │ │ ├── avs_coap_streaming_server.c │ │ │ └── avs_coap_streaming_server.h │ │ ├── tcp/ │ │ │ ├── avs_coap_tcp_ctx.c │ │ │ ├── avs_coap_tcp_ctx.h │ │ │ ├── avs_coap_tcp_header.c │ │ │ ├── avs_coap_tcp_header.h │ │ │ ├── avs_coap_tcp_msg.c │ │ │ ├── avs_coap_tcp_msg.h │ │ │ ├── avs_coap_tcp_pending_requests.c │ │ │ ├── avs_coap_tcp_pending_requests.h │ │ │ ├── avs_coap_tcp_signaling.c │ │ │ ├── avs_coap_tcp_signaling.h │ │ │ ├── avs_coap_tcp_utils.c │ │ │ └── avs_coap_tcp_utils.h │ │ └── udp/ │ │ ├── avs_coap_udp_ctx.c │ │ ├── avs_coap_udp_ctx.h │ │ ├── avs_coap_udp_header.h │ │ ├── avs_coap_udp_msg.c │ │ ├── avs_coap_udp_msg.h │ │ ├── avs_coap_udp_msg_cache.c │ │ ├── avs_coap_udp_msg_cache.h │ │ ├── avs_coap_udp_tx_params.c │ │ └── avs_coap_udp_tx_params.h │ ├── tests/ │ │ ├── fuzz/ │ │ │ ├── CMakeLists.txt │ │ │ ├── coap_async_api_tcp.c │ │ │ ├── coap_async_api_udp.c │ │ │ ├── coap_parse.c │ │ │ └── input/ │ │ │ ├── coap_async_api_tcp/ │ │ │ │ └── recv_get_send_content │ │ │ ├── coap_async_api_tcp.hex/ │ │ │ │ └── recv_get_send_content │ │ │ ├── coap_async_api_udp/ │ │ │ │ ├── recv_get_send_content │ │ │ │ ├── send_block_put_recv_changed │ │ │ │ ├── send_get_recv_block_content │ │ │ │ └── send_get_recv_content │ │ │ ├── coap_async_api_udp.hex/ │ │ │ │ ├── recv_get_send_content │ │ │ │ ├── send_block_put_recv_changed │ │ │ │ ├── send_get_recv_block_content │ │ │ │ └── send_get_recv_content │ │ │ ├── coap_parse/ │ │ │ │ └── empty │ │ │ └── hex-to-fuzz-input.sh │ │ ├── mock_clock.c │ │ ├── mock_clock.h │ │ ├── options/ │ │ │ ├── option.c │ │ │ └── options.c │ │ ├── socket.c │ │ ├── socket.h │ │ ├── tcp/ │ │ │ ├── async_client.c │ │ │ ├── async_server.c │ │ │ ├── csm.c │ │ │ ├── ctx.c │ │ │ ├── env.h │ │ │ ├── header.c │ │ │ ├── helper_functions.h │ │ │ ├── payload_escaper.c │ │ │ ├── requesting.c │ │ │ ├── responding.c │ │ │ ├── setsock.c │ │ │ └── utils.h │ │ ├── udp/ │ │ │ ├── async_client.c │ │ │ ├── async_client_with_big_data.c │ │ │ ├── async_observe.c │ │ │ ├── async_server.c │ │ │ ├── big_data.h │ │ │ ├── fuzzer_cases.c │ │ │ ├── msg.c │ │ │ ├── msg_cache.c │ │ │ ├── setsock.c │ │ │ ├── streaming_client.c │ │ │ ├── streaming_observe.c │ │ │ ├── streaming_server.c │ │ │ ├── tx_params_mock.h │ │ │ ├── udp_tx_params.c │ │ │ └── utils.h │ │ ├── utils.c │ │ └── utils.h │ └── tools/ │ ├── conditional_headers_whitelist.json │ └── coverage ├── devconfig ├── doc/ │ ├── CMakeLists.txt │ └── sphinx/ │ ├── extensions/ │ │ ├── builders/ │ │ │ ├── __init__.py │ │ │ ├── dummy.py │ │ │ ├── snippet_source_linter.py │ │ │ └── snippet_source_list_references.py │ │ ├── file_dirtiness_checker.py │ │ ├── small_literal.py │ │ └── snippet_source.py │ ├── snippet_sources.md5 │ ├── source/ │ │ ├── APIReference.rst │ │ ├── AdvancedTopics/ │ │ │ ├── AT-AccessControl.rst │ │ │ ├── AT-AttributeStorage.rst │ │ │ ├── AT-Bootstrap.rst │ │ │ ├── AT-CertificateUsage.rst │ │ │ ├── AT-Certificates.rst │ │ │ ├── AT-CustomEventLoop.rst │ │ │ ├── AT-CustomObjects/ │ │ │ │ ├── AT_CO1_SingleInstanceReadOnly.rst │ │ │ │ ├── AT_CO2_SingleInstanceExecutableAndReadOnly.rst │ │ │ │ ├── AT_CO3_MultiInstanceReadOnlyFixed.rst │ │ │ │ ├── AT_CO4_FixedInstanceWritable.rst │ │ │ │ ├── AT_CO5_MultiInstanceDynamic.rst │ │ │ │ ├── AT_CO6_MultipleResourceInstances.rst │ │ │ │ ├── AT_CO7_BootstrapAwareness.rst │ │ │ │ ├── AT_CO_BootstrapAwareness.rst │ │ │ │ ├── AT_CO_FixedInstanceWritable.rst │ │ │ │ ├── AT_CO_MultiInstanceDynamic.rst │ │ │ │ ├── AT_CO_MultiInstanceReadOnlyFixed.rst │ │ │ │ ├── AT_CO_MultipleResourceInstances.rst │ │ │ │ ├── AT_CO_SingleInstanceExecutableAndReadOnly.rst │ │ │ │ ├── AT_CO_SingleInstanceReadOnly.rst │ │ │ │ └── Anjay_codegen_note.rst │ │ │ ├── AT-CustomObjects.rst │ │ │ ├── AT-EventLoopNotes.rst │ │ │ ├── AT-IpsoObjects.rst │ │ │ ├── AT-NetworkErrorHandling.rst │ │ │ ├── AT-OtherFeatures.rst │ │ │ ├── AT-Persistence.rst │ │ │ └── AT-RetransmissionsTimeoutsCaching.rst │ │ ├── AdvancedTopics.rst │ │ ├── BasicClient/ │ │ │ ├── BC-Initialization.rst │ │ │ ├── BC-MandatoryObjects.rst │ │ │ ├── BC-Notifications.rst │ │ │ ├── BC-ObjectImplementation.rst │ │ │ ├── BC-Security.rst │ │ │ ├── BC-Send.rst │ │ │ └── BC-ThreadSafety.rst │ │ ├── BasicClient.rst │ │ ├── CommercialFeatures/ │ │ │ ├── CF-CorePersistence.rst │ │ │ ├── CF-CustomHardwareSupport.rst │ │ │ ├── CF-EST.rst │ │ │ ├── CF-FSDM.rst │ │ │ ├── CF-HSM.rst │ │ │ ├── CF-IoTSAFE.rst │ │ │ ├── CF-NIDD.rst │ │ │ ├── CF-OSCORE.rst │ │ │ ├── CF-SMSBinding.rst │ │ │ └── CF-SmartCardBootstrap.rst │ │ ├── CommercialFeatures.rst │ │ ├── Compiling_client_applications.rst │ │ ├── FirmwareUpdateTutorial/ │ │ │ ├── FU-AdvancedFirmwareUpdate/ │ │ │ │ ├── FU-AFU-BasicImplementation.rst │ │ │ │ ├── FU-AFU-Examples.rst │ │ │ │ ├── FU-AFU-ResourceDefinitions.rst │ │ │ │ ├── FU-AFU-StateDiagram.rst │ │ │ │ └── _files/ │ │ │ │ └── 33629.xml │ │ │ ├── FU-AdvancedFirmwareUpdate.rst │ │ │ ├── FU-BasicImplementation.rst │ │ │ ├── FU-DownloadResumption.rst │ │ │ ├── FU-Introduction.rst │ │ │ ├── FU-ModesAndProtocols.rst │ │ │ ├── FU-PoorConnectivity.rst │ │ │ ├── FU-SecureDownloads.rst │ │ │ ├── FU1.rst │ │ │ ├── FU2.rst │ │ │ ├── FU3.rst │ │ │ ├── FU4.rst │ │ │ ├── FU5.rst │ │ │ └── FU6.rst │ │ ├── FirmwareUpdateTutorial.rst │ │ ├── Introduction.rst │ │ ├── KnownIssues.rst │ │ ├── LwM2M.rst │ │ ├── LwM2MGateway/ │ │ │ ├── LwM2MGatewayAPI.rst │ │ │ ├── LwM2MGatewayIntro.rst │ │ │ ├── LwM2MGatewayNotifications.rst │ │ │ └── LwM2MGatewaySend.rst │ │ ├── LwM2MGateway.rst │ │ ├── Migrating/ │ │ │ ├── MigratingCustomEntropy.rst │ │ │ ├── MigratingFromAnjay214.rst │ │ │ ├── MigratingFromAnjay215.rst │ │ │ ├── MigratingFromAnjay225.rst │ │ │ ├── MigratingFromAnjay24.rst │ │ │ ├── MigratingFromAnjay26.rst │ │ │ ├── MigratingFromAnjay27.rst │ │ │ ├── MigratingFromAnjay28.rst │ │ │ ├── MigratingFromAnjay30.rst │ │ │ ├── MigratingFromAnjay310.rst │ │ │ ├── MigratingFromAnjay312.rst │ │ │ ├── MigratingFromAnjay32.rst │ │ │ ├── MigratingFromAnjay33.rst │ │ │ ├── MigratingFromAnjay34.rst │ │ │ └── MigratingFromAnjay37.rst │ │ ├── Migrating.rst │ │ ├── PortingGuideForNonPOSIXPlatforms/ │ │ │ ├── CustomTLS/ │ │ │ │ ├── CustomTLS-CertificatesAdvanced.rst │ │ │ │ ├── CustomTLS-CertificatesBasic.rst │ │ │ │ ├── CustomTLS-ConfigFeatures.rst │ │ │ │ ├── CustomTLS-Minimal.rst │ │ │ │ ├── CustomTLS-Resumption.rst │ │ │ │ ├── CustomTLS-Stub.rst │ │ │ │ └── CustomTLS-TCPSupport.rst │ │ │ ├── CustomTLS.rst │ │ │ ├── NetworkingAPI/ │ │ │ │ ├── NetworkingAPI-Bind.rst │ │ │ │ ├── NetworkingAPI-EventLoopSupport.rst │ │ │ │ ├── NetworkingAPI-IpStickiness.rst │ │ │ │ ├── NetworkingAPI-Minimal.rst │ │ │ │ ├── NetworkingAPI-OtherFeatures.rst │ │ │ │ ├── NetworkingAPI-RemoteHostPort.rst │ │ │ │ ├── NetworkingAPI-ShutdownRemoteHostname.rst │ │ │ │ ├── NetworkingAPI-Stats.rst │ │ │ │ ├── NetworkingAPI1.rst │ │ │ │ ├── NetworkingAPI2.rst │ │ │ │ ├── NetworkingAPI3.rst │ │ │ │ ├── NetworkingAPI4.rst │ │ │ │ ├── NetworkingAPI5.rst │ │ │ │ ├── NetworkingAPI6.rst │ │ │ │ └── NetworkingAPI7.rst │ │ │ ├── NetworkingAPI.rst │ │ │ ├── ThreadingAPI.rst │ │ │ └── TimeAPI.rst │ │ ├── PortingGuideForNonPOSIXPlatforms.rst │ │ ├── Tools/ │ │ │ ├── CliLwM2MServer.rst │ │ │ ├── FactoryProvisioning.rst │ │ │ ├── PackagesGenerator.rst │ │ │ ├── StandaloneObjects.rst │ │ │ ├── StubGenerator.rst │ │ │ └── VirtualEnvironments.rst │ │ ├── Tools.rst │ │ ├── _static/ │ │ │ └── theme_overrides.css │ │ ├── _templates/ │ │ │ ├── layout.html │ │ │ └── searchbox.html │ │ ├── conf.py.in │ │ └── index.rst │ └── source_api/ │ ├── BackToDocumentation.rst │ ├── _static/ │ │ └── theme_overrides.css │ ├── _templates/ │ │ ├── layout.html │ │ └── searchbox.html │ ├── conf.py.in │ └── index.rst ├── example_configs/ │ ├── README.md │ ├── embedded_lwm2m10/ │ │ ├── anjay/ │ │ │ └── anjay_config.h │ │ └── avsystem/ │ │ ├── coap/ │ │ │ └── avs_coap_config.h │ │ └── commons/ │ │ ├── avs_commons_config.h │ │ └── lwip-posix-compat.h │ ├── embedded_lwm2m11/ │ │ ├── anjay/ │ │ │ └── anjay_config.h │ │ └── avsystem/ │ │ ├── coap/ │ │ │ └── avs_coap_config.h │ │ └── commons/ │ │ ├── avs_commons_config.h │ │ └── lwip-posix-compat.h │ ├── embedded_lwm2m12/ │ │ ├── anjay/ │ │ │ └── anjay_config.h │ │ └── avsystem/ │ │ ├── coap/ │ │ │ └── avs_coap_config.h │ │ └── commons/ │ │ ├── avs_commons_config.h │ │ └── lwip-posix-compat.h │ ├── linux_lwm2m10/ │ │ ├── anjay/ │ │ │ └── anjay_config.h │ │ └── avsystem/ │ │ ├── coap/ │ │ │ └── avs_coap_config.h │ │ └── commons/ │ │ └── avs_commons_config.h │ ├── linux_lwm2m11/ │ │ ├── anjay/ │ │ │ └── anjay_config.h │ │ └── avsystem/ │ │ ├── coap/ │ │ │ └── avs_coap_config.h │ │ └── commons/ │ │ └── avs_commons_config.h │ └── linux_lwm2m12/ │ ├── anjay/ │ │ └── anjay_config.h │ └── avsystem/ │ ├── coap/ │ │ └── avs_coap_config.h │ └── commons/ │ └── avs_commons_config.h ├── examples/ │ ├── CMakeLists.txt │ ├── commercial-features/ │ │ ├── CF-CorePersistence/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-EST/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-EST-PKCS11/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-NIDD/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── nidd_demo_driver.c │ │ │ └── nidd_demo_driver.h │ │ ├── CF-OSCORE/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-PKCS11/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-PSA-PKI/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-PSA-PSK/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-PSA-bootstrap/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-PSA-management/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-SMS/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-SMS-PSK/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-SMS-UDP/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── CF-SmartCardBootstrap/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ └── CMakeLists.txt │ ├── custom-network/ │ │ ├── CMakeLists.txt │ │ ├── bind/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ └── net_impl.c │ │ ├── ip-stickiness/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ └── net_impl.c │ │ ├── minimal/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ └── net_impl.c │ │ ├── remote-host-port/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ └── net_impl.c │ │ ├── shutdown-remote-hostname/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ └── net_impl.c │ │ └── stats/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── main.c │ │ └── net_impl.c │ ├── custom-tls/ │ │ ├── CMakeLists.txt │ │ ├── certificates-advanced/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── certificates-advanced-fake-dane/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── certificates-basic/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── config-features/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── minimal/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── resumption-buffer/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── resumption-simple/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ ├── stub/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── net_impl.c │ │ │ └── tls_impl.c │ │ └── tcp-support/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── firmware_update.c │ │ ├── firmware_update.h │ │ ├── main.c │ │ ├── net_impl.c │ │ ├── time_object.c │ │ ├── time_object.h │ │ └── tls_impl.c │ └── tutorial/ │ ├── AT-AccessControl/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── main.c │ │ ├── test_object.c │ │ └── test_object.h │ ├── AT-Bootstrap/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── AT-Certificates/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── AT-CustomEventLoop/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── AT-CustomObjects/ │ │ ├── CMakeLists.txt │ │ ├── bootstrap-awareness/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── multi-instance-dynamic/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── test_object.c │ │ │ └── test_object.h │ │ ├── multi-instance-resources-dynamic/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ ├── main.c │ │ │ ├── test_object.c │ │ │ └── test_object.h │ │ ├── read-only/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── read-only-multiple-fixed/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── read-only-with-executable/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ ├── writable-multiple-fixed/ │ │ │ ├── CMakeLists.txt │ │ │ └── src/ │ │ │ └── main.c │ │ └── writable-multiple-fixed-transactional/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── AT-Downloader/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── AT-IpsoObjects/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── AT-Persistence/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── BC-Initialization/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── BC-MandatoryObjects/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── BC-Notifications/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ ├── BC-ObjectImplementation/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ ├── BC-Security/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ └── main.c │ ├── BC-Send/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ ├── BC-ThreadSafety/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ ├── CMakeLists.txt │ ├── LwM2M-Gateway/ │ │ ├── CMakeLists.txt │ │ ├── end_device.py │ │ └── src/ │ │ ├── gateway_server.c │ │ ├── gateway_server.h │ │ ├── main.c │ │ ├── temperature_object.c │ │ └── temperature_object.h │ └── firmware-update/ │ ├── CMakeLists.txt │ ├── advanced-firmware-update/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── advanced_firmware_update.c │ │ ├── advanced_firmware_update.h │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ ├── basic-implementation/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── firmware_update.c │ │ ├── firmware_update.h │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ ├── download-resumption/ │ │ ├── CMakeLists.txt │ │ └── src/ │ │ ├── firmware_update.c │ │ ├── firmware_update.h │ │ ├── main.c │ │ ├── time_object.c │ │ └── time_object.h │ └── secure-downloads/ │ ├── CMakeLists.txt │ └── src/ │ ├── firmware_update.c │ ├── firmware_update.h │ ├── main.c │ ├── time_object.c │ └── time_object.h ├── include_public/ │ └── anjay/ │ ├── access_control.h │ ├── advanced_fw_update.h │ ├── anjay.h │ ├── anjay_config.h.in │ ├── attr_storage.h │ ├── core.h │ ├── dm.h │ ├── download.h │ ├── factory_provisioning.h │ ├── fw_update.h │ ├── io.h │ ├── ipso_objects.h │ ├── ipso_objects_v2.h │ ├── lwm2m_gateway.h │ ├── lwm2m_send.h │ ├── security.h │ ├── server.h │ ├── stats.h │ └── sw_mgmt.h ├── ltoconfig ├── requirements.txt ├── src/ │ ├── anjay_config_log.h │ ├── anjay_init.h │ ├── anjay_modules/ │ │ ├── anjay_access_utils.h │ │ ├── anjay_attr_storage_utils.h │ │ ├── anjay_bootstrap.h │ │ ├── anjay_dm_utils.h │ │ ├── anjay_io_utils.h │ │ ├── anjay_lwm2m_gateway.h │ │ ├── anjay_notify.h │ │ ├── anjay_raw_buffer.h │ │ ├── anjay_sched.h │ │ ├── anjay_servers.h │ │ ├── anjay_time_defs.h │ │ ├── anjay_utils_core.h │ │ └── dm/ │ │ ├── anjay_execute.h │ │ └── anjay_modules.h │ ├── core/ │ │ ├── anjay_access_utils.c │ │ ├── anjay_access_utils_private.h │ │ ├── anjay_bootstrap_core.c │ │ ├── anjay_bootstrap_core.h │ │ ├── anjay_core.c │ │ ├── anjay_core.h │ │ ├── anjay_dm_core.c │ │ ├── anjay_dm_core.h │ │ ├── anjay_downloader.h │ │ ├── anjay_event_loop.c │ │ ├── anjay_io_core.c │ │ ├── anjay_io_core.h │ │ ├── anjay_io_utils.c │ │ ├── anjay_lwm2m_send.c │ │ ├── anjay_lwm2m_send.h │ │ ├── anjay_notify.c │ │ ├── anjay_raw_buffer.c │ │ ├── anjay_servers_inactive.h │ │ ├── anjay_servers_private.h │ │ ├── anjay_servers_reload.h │ │ ├── anjay_servers_utils.c │ │ ├── anjay_servers_utils.h │ │ ├── anjay_stats.c │ │ ├── anjay_stats.h │ │ ├── anjay_utils_core.c │ │ ├── anjay_utils_private.h │ │ ├── attr_storage/ │ │ │ ├── anjay_attr_storage.c │ │ │ ├── anjay_attr_storage.h │ │ │ ├── anjay_attr_storage_persistence.c │ │ │ └── anjay_attr_storage_private.h │ │ ├── coap/ │ │ │ ├── anjay_content_format.h │ │ │ └── anjay_msg_details.h │ │ ├── dm/ │ │ │ ├── anjay_discover.c │ │ │ ├── anjay_discover.h │ │ │ ├── anjay_dm_attributes.c │ │ │ ├── anjay_dm_attributes.h │ │ │ ├── anjay_dm_create.c │ │ │ ├── anjay_dm_create.h │ │ │ ├── anjay_dm_execute.c │ │ │ ├── anjay_dm_execute.h │ │ │ ├── anjay_dm_handlers.c │ │ │ ├── anjay_dm_read.c │ │ │ ├── anjay_dm_read.h │ │ │ ├── anjay_dm_write.c │ │ │ ├── anjay_dm_write.h │ │ │ ├── anjay_dm_write_attrs.c │ │ │ ├── anjay_dm_write_attrs.h │ │ │ ├── anjay_modules.c │ │ │ ├── anjay_query.c │ │ │ └── anjay_query.h │ │ ├── downloader/ │ │ │ ├── anjay_coap.c │ │ │ ├── anjay_downloader.c │ │ │ ├── anjay_http.c │ │ │ └── anjay_private.h │ │ ├── io/ │ │ │ ├── anjay_base64_out.c │ │ │ ├── anjay_base64_out.h │ │ │ ├── anjay_batch_builder.c │ │ │ ├── anjay_batch_builder.h │ │ │ ├── anjay_cbor_in.c │ │ │ ├── anjay_cbor_out.c │ │ │ ├── anjay_common.c │ │ │ ├── anjay_common.h │ │ │ ├── anjay_corelnk.c │ │ │ ├── anjay_corelnk.h │ │ │ ├── anjay_dynamic.c │ │ │ ├── anjay_input_buf.c │ │ │ ├── anjay_json_encoder.c │ │ │ ├── anjay_json_like_decoder.c │ │ │ ├── anjay_json_like_decoder.h │ │ │ ├── anjay_json_like_decoder_vtable.h │ │ │ ├── anjay_lwm2m_cbor_in.c │ │ │ ├── anjay_lwm2m_cbor_out.c │ │ │ ├── anjay_opaque.c │ │ │ ├── anjay_output_buf.c │ │ │ ├── anjay_senml_in.c │ │ │ ├── anjay_senml_like_encoder.c │ │ │ ├── anjay_senml_like_encoder.h │ │ │ ├── anjay_senml_like_encoder_vtable.h │ │ │ ├── anjay_senml_like_out.c │ │ │ ├── anjay_text.c │ │ │ ├── anjay_tlv.h │ │ │ ├── anjay_tlv_in.c │ │ │ ├── anjay_tlv_out.c │ │ │ ├── anjay_vtable.h │ │ │ ├── cbor/ │ │ │ │ ├── anjay_cbor_encoder_ll.c │ │ │ │ ├── anjay_cbor_encoder_ll.h │ │ │ │ ├── anjay_cbor_types.h │ │ │ │ ├── anjay_json_like_cbor_decoder.c │ │ │ │ ├── anjay_json_like_cbor_decoder.h │ │ │ │ └── anjay_senml_cbor_encoder.c │ │ │ └── json/ │ │ │ ├── anjay_json_decoder.c │ │ │ └── anjay_json_decoder.h │ │ ├── observe/ │ │ │ ├── anjay_observe_core.c │ │ │ ├── anjay_observe_core.h │ │ │ ├── anjay_observe_internal.h │ │ │ └── anjay_observe_planning.c │ │ └── servers/ │ │ ├── anjay_activate.c │ │ ├── anjay_activate.h │ │ ├── anjay_connection_ip.c │ │ ├── anjay_connections.c │ │ ├── anjay_connections.h │ │ ├── anjay_connections_internal.h │ │ ├── anjay_register.c │ │ ├── anjay_register.h │ │ ├── anjay_reload.c │ │ ├── anjay_security.h │ │ ├── anjay_security_generic.c │ │ ├── anjay_server_connections.c │ │ ├── anjay_server_connections.h │ │ ├── anjay_servers_internal.c │ │ └── anjay_servers_internal.h │ └── modules/ │ ├── access_control/ │ │ ├── anjay_access_control_handlers.c │ │ ├── anjay_access_control_persistence.c │ │ ├── anjay_mod_access_control.c │ │ └── anjay_mod_access_control.h │ ├── advanced_fw_update/ │ │ └── anjay_advanced_fw_update.c │ ├── factory_provisioning/ │ │ └── anjay_provisioning.c │ ├── fw_update/ │ │ └── anjay_fw_update.c │ ├── ipso/ │ │ ├── anjay_ipso_3d_sensor.c │ │ ├── anjay_ipso_basic_sensor.c │ │ └── anjay_ipso_button.c │ ├── ipso_v2/ │ │ ├── anjay_ipso_v2_3d_sensor.c │ │ └── anjay_ipso_v2_basic_sensor.c │ ├── lwm2m_gateway/ │ │ └── anjay_lwm2m_gateway.c │ ├── security/ │ │ ├── anjay_mod_security.c │ │ ├── anjay_mod_security.h │ │ ├── anjay_security_persistence.c │ │ ├── anjay_security_transaction.c │ │ ├── anjay_security_transaction.h │ │ ├── anjay_security_utils.c │ │ └── anjay_security_utils.h │ ├── server/ │ │ ├── anjay_mod_server.c │ │ ├── anjay_mod_server.h │ │ ├── anjay_server_persistence.c │ │ ├── anjay_server_transaction.c │ │ ├── anjay_server_transaction.h │ │ ├── anjay_server_utils.c │ │ └── anjay_server_utils.h │ └── sw_mgmt/ │ └── anjay_sw_mgmt.c ├── standalone/ │ ├── security/ │ │ ├── standalone_mod_security.c │ │ ├── standalone_mod_security.h │ │ ├── standalone_security.h │ │ ├── standalone_security_persistence.c │ │ ├── standalone_security_transaction.c │ │ ├── standalone_security_transaction.h │ │ ├── standalone_security_utils.c │ │ └── standalone_security_utils.h │ └── server/ │ ├── standalone_mod_server.c │ ├── standalone_mod_server.h │ ├── standalone_server.h │ ├── standalone_server_persistence.c │ ├── standalone_server_transaction.c │ ├── standalone_server_transaction.h │ ├── standalone_server_utils.c │ └── standalone_server_utils.h ├── tests/ │ ├── codegen/ │ │ ├── CMakeLists.txt │ │ ├── check_with_object_registry.sh │ │ └── input/ │ │ ├── execute.xml │ │ ├── multiple-object.xml │ │ ├── read.xml │ │ ├── sanitization.xml │ │ └── write.xml │ ├── core/ │ │ ├── access_utils.c │ │ ├── anjay.c │ │ ├── attr_storage/ │ │ │ ├── attr_storage.c │ │ │ ├── attr_storage_test.h │ │ │ └── persistence.c │ │ ├── bootstrap.c │ │ ├── bootstrap_mock.h │ │ ├── coap/ │ │ │ ├── utils.c │ │ │ └── utils.h │ │ ├── dm.c │ │ ├── downloader/ │ │ │ └── downloader.c │ │ ├── io/ │ │ │ ├── batch_builder.c │ │ │ ├── bigdata.h │ │ │ ├── cbor/ │ │ │ │ ├── cbor_decoder.c │ │ │ │ └── cbor_encoder.c │ │ │ ├── cbor_in.c │ │ │ ├── corelnk.c │ │ │ ├── dm_batch.c │ │ │ ├── dynamic.c │ │ │ ├── json/ │ │ │ │ └── json_decoder.c │ │ │ ├── json_in.c │ │ │ ├── lwm2m_cbor_in.c │ │ │ ├── lwm2m_cbor_out.c │ │ │ ├── raw_cbor_in.c │ │ │ ├── senml_cbor_encoder.c │ │ │ ├── senml_cbor_out.c │ │ │ ├── senml_in_common.h │ │ │ ├── senml_json_encoder.c │ │ │ ├── text.c │ │ │ ├── tlv_in.c │ │ │ └── tlv_out.c │ │ ├── io.c │ │ ├── lwm2m_send.c │ │ ├── observe/ │ │ │ ├── observe.c │ │ │ └── observe_mock.h │ │ ├── socket_mock.c │ │ ├── socket_mock.h │ │ └── utils.c │ ├── doc/ │ │ └── runtest.py │ ├── fuzz/ │ │ ├── CMakeLists.txt │ │ ├── cbor/ │ │ │ └── decoder.c │ │ └── test_cases/ │ │ ├── cbor_decoder/ │ │ │ ├── boring │ │ │ └── invalid │ │ ├── coap_stream/ │ │ │ └── valid_coap_msg │ │ ├── coap_stream_request/ │ │ │ └── basic │ │ └── coap_stream_response/ │ │ └── basic │ ├── integration/ │ │ ├── CMakeLists.txt │ │ ├── framework/ │ │ │ ├── framework/ │ │ │ │ ├── __init__.py │ │ │ │ ├── asserts.py │ │ │ │ ├── create_package.py │ │ │ │ ├── create_xlsx_test_report.py │ │ │ │ ├── lwm2m_test.py │ │ │ │ ├── pretty_test_runner.py │ │ │ │ ├── serialize_senml_cbor.py │ │ │ │ ├── test_suite.py │ │ │ │ └── test_utils.py │ │ │ └── pyproject.toml │ │ ├── run_tests.sh.in │ │ ├── runtest.py │ │ └── suites/ │ │ ├── __init__.py │ │ ├── default/ │ │ │ ├── __init__.py │ │ │ ├── access_control.py │ │ │ ├── advanced_firmware_update.py │ │ │ ├── async.py │ │ │ ├── block_response.py │ │ │ ├── block_write.py │ │ │ ├── bootstrap_client.py │ │ │ ├── bootstrap_discover.py │ │ │ ├── bootstrap_factory.py │ │ │ ├── bootstrap_holdoff.py │ │ │ ├── bootstrap_pack.py │ │ │ ├── bootstrap_server.py │ │ │ ├── bootstrap_sync.py │ │ │ ├── bootstrap_transaction.py │ │ │ ├── buffer_sizes.py │ │ │ ├── cbor_encoding.py │ │ │ ├── cbor_requests.py │ │ │ ├── client_block_request.py │ │ │ ├── coap.py │ │ │ ├── con_attr.py │ │ │ ├── conn_status_api.py │ │ │ ├── connection_id.py │ │ │ ├── crash.py │ │ │ ├── create.py │ │ │ ├── critical_opts.py │ │ │ ├── disable_server.py │ │ │ ├── discover_depth.py │ │ │ ├── downloader.py │ │ │ ├── factory_provisioning.py │ │ │ ├── firmware_update.py │ │ │ ├── firmware_update11.py │ │ │ ├── forbidden_on_register.py │ │ │ ├── formats.py │ │ │ ├── hierarchical_cbor_encoding.py │ │ │ ├── ipso_objects.py │ │ │ ├── json_encoding.py │ │ │ ├── json_requests.py │ │ │ ├── lwm2m_gateway.py │ │ │ ├── lwm2m_gateway_observe_attributes.py │ │ │ ├── modify_servers.py │ │ │ ├── msg_cache.py │ │ │ ├── notification_timestamps.py │ │ │ ├── notifications.py │ │ │ ├── observe_attributes.py │ │ │ ├── observe_with_attributes.py │ │ │ ├── offline.py │ │ │ ├── plaintext_base64.py │ │ │ ├── port_rebind.py │ │ │ ├── queue_mode.py │ │ │ ├── read_composite.py │ │ │ ├── reboot.py │ │ │ ├── register.py │ │ │ ├── request_too_large.py │ │ │ ├── retransmissions.py │ │ │ ├── security.py │ │ │ ├── send.py │ │ │ ├── senml_json_encoding.py │ │ │ ├── separate_response.py │ │ │ ├── software_mgmt.py │ │ │ ├── ssl_error_api.py │ │ │ ├── stats.py │ │ │ ├── test_object.py │ │ │ ├── time_api.py │ │ │ ├── unregister.py │ │ │ ├── update.py │ │ │ ├── uri_change_reregister.py │ │ │ └── write_composite.py │ │ ├── sensitive/ │ │ │ ├── __init__.py │ │ │ ├── advanced_firmware_update.py │ │ │ ├── bootstrap_client.py │ │ │ ├── firmware_update.py │ │ │ └── update.py │ │ └── testfest/ │ │ ├── __init__.py │ │ ├── bootstrap.py │ │ ├── dm/ │ │ │ ├── __init__.py │ │ │ ├── advanced_firmware_update.py │ │ │ ├── connectivity_management.py │ │ │ ├── connectivity_monitoring.py │ │ │ ├── connectivity_statistics.py │ │ │ ├── device.py │ │ │ ├── firmware_update.py │ │ │ ├── location.py │ │ │ ├── portfolio.py │ │ │ └── utils.py │ │ ├── management.py │ │ ├── multi_servers.py │ │ ├── register.py │ │ ├── reporting.py │ │ └── security.py │ ├── modules/ │ │ ├── access_control/ │ │ │ ├── access_control.c │ │ │ └── persistence.c │ │ ├── factory_provisioning/ │ │ │ └── provisioning.c │ │ ├── lwm2m_gateway/ │ │ │ └── lwm2m_gateway.c │ │ ├── security/ │ │ │ ├── api.c │ │ │ └── persistence.c │ │ └── server/ │ │ ├── api.c │ │ └── persistence.c │ └── utils/ │ ├── coap/ │ │ ├── socket.c │ │ └── socket.h │ ├── dm.c │ ├── dm.h │ ├── mock_clock.c │ ├── mock_clock.h │ ├── mock_dm.c │ ├── mock_dm.h │ └── utils.h ├── tools/ │ ├── analyze │ ├── anjay_codegen.py │ ├── anjay_config_log_tool.py │ ├── build_doxygen_docs.py │ ├── build_sphinx_docs.py │ ├── ci/ │ │ ├── build-docker-images.sh │ │ ├── rockylinux-9/ │ │ │ └── Dockerfile │ │ ├── ubuntu-22.04/ │ │ │ └── Dockerfile │ │ └── ubuntu-24.04/ │ │ └── Dockerfile │ ├── ci-psa/ │ │ ├── Dockerfile │ │ └── README.md │ ├── conditional_headers_whitelist.json │ ├── coverage │ ├── find_unused_code.py │ ├── generate-certs.sh │ ├── generate_doxygen_config.py │ ├── lwm2m_object_registry.py │ ├── markdown-toc.py │ ├── provisioning-tool/ │ │ ├── configs/ │ │ │ ├── cert_info.json │ │ │ ├── endpoint_cfg │ │ │ └── lwm2m_server.json │ │ ├── factory_prov/ │ │ │ ├── __init__.py │ │ │ ├── cert_gen.py │ │ │ └── factory_prov.py │ │ └── ptool.py │ ├── symlink-check.sh │ ├── test-framework-tools/ │ │ ├── .gitignore │ │ ├── nsh-lwm2m/ │ │ │ ├── cbor_shell.py │ │ │ ├── nsh_lwm2m.py │ │ │ └── tlv_shell.py │ │ ├── pymbedtls/ │ │ │ ├── CMakeLists.txt │ │ │ ├── cmake/ │ │ │ │ ├── FindMbedTLS.cmake │ │ │ │ └── QueryPythonForPybind11.cmake │ │ │ ├── pymbedtls/ │ │ │ │ └── __init__.py │ │ │ ├── pyproject.toml │ │ │ └── src/ │ │ │ ├── common.cpp │ │ │ ├── common.hpp │ │ │ ├── context.cpp │ │ │ ├── context.hpp │ │ │ ├── pybind11_interop.hpp │ │ │ ├── pymbedtls.cpp │ │ │ ├── security.cpp │ │ │ ├── security.hpp │ │ │ ├── socket.cpp │ │ │ └── socket.hpp │ │ └── tools/ │ │ ├── framework_tools/ │ │ │ ├── __init__.py │ │ │ ├── coap_file_server.py │ │ │ └── lwm2m/ │ │ │ ├── __init__.py │ │ │ ├── coap/ │ │ │ │ ├── __init__.py │ │ │ │ ├── code.py │ │ │ │ ├── content_format.py │ │ │ │ ├── option.py │ │ │ │ ├── packet.py │ │ │ │ ├── server.py │ │ │ │ ├── transport.py │ │ │ │ ├── type.py │ │ │ │ └── utils.py │ │ │ ├── messages.py │ │ │ ├── objlink.py │ │ │ ├── path.py │ │ │ ├── senml_cbor.py │ │ │ ├── server.py │ │ │ └── tlv.py │ │ └── pyproject.toml │ ├── test_duplicates.py │ ├── test_ghactions.py │ └── utils.sh └── valgrind_test.supp ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ # binaries *.a *.so *.so.* /demo/demo # NetBeans Project nbproject # IDEA-based IDE project .idea/ # VSCode .vscode/ # build configuration autogenerated files /build /output *.swp CMakeFiles/ CMakeTmp/ CMakeCache.txt CMakeDoxyfile.in CMakeDoxygenDefaults.cmake cmake_install.cmake install_manifest.txt _CPack_Packages/ CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake Testing/ /include_public/anjay/anjay_config.h posix-config.h anjay-*.cmake Doxyfile /doc/sphinx/source/conf.py tools/test-framework-tools/pymbedtls/build/ # other Makefile *.log *.gcda *.gcno *.gcov *~ tags .ycm_extra_conf.py .ycm_extra_conf.pyc /tests/codegen/*.c /tests/codegen/*.cpp /tests/integration/build __pycache__/ .gdb_history *.orig *.egg-info *.pyc /tools/test-framework-tools/pymbedtls* compile_commands.json /avs_commons/install /doc/sphinx/build /doc/sphinx/html /doc/doxygen /doc/sphinx/source/.doctrees !/doc/sphinx/Makefile # built tutorials examples/build ================================================ FILE: .github/workflows/anjay-tests.yml ================================================ # Copyright 2017-2026 AVSystem # AVSystem Anjay LwM2M SDK # All rights reserved. # # Licensed under AVSystem Anjay LwM2M Client SDK - Non-Commercial License. # See the attached LICENSE file for details. name: Anjay tests on: [push] jobs: ubuntu2204-compilers-test: runs-on: ubuntu-latest container: avsystemembedded/anjay-travis:ubuntu-22.04-3.0 env: CC: ${{ matrix.CC }} CXX: ${{ matrix.CXX }} MEM_CHECK_TOOL: ${{ matrix.MEM_CHECK_TOOL }} steps: # NOTE: workaround for https://github.com/actions/checkout/issues/760 - run: git config --global safe.directory '*' # NOTE: v2 requires Git 2.18 for submodules, it's not present in the image - uses: actions/checkout@v1 with: submodules: recursive - run: apt-get update - run: apt-get -y install $CC $CXX - run: ./devconfig $MEM_CHECK_TOOL --without-analysis -DWITH_VALGRIND_TRACK_ORIGINS=OFF -DWITH_IPV6=OFF - run: | . /venv/bin/activate env CC=gcc LC_ALL=C.UTF-8 make -j - run: | . /venv/bin/activate env CC=gcc LC_ALL=C.UTF-8 make check strategy: fail-fast: false matrix: include: - CC: gcc-11 CXX: g++-11 MEM_CHECK_TOOL: --with-valgrind - CC: gcc-12 CXX: g++-12 MEM_CHECK_TOOL: --with-valgrind - CC: clang-11 CXX: clang++-11 MEM_CHECK_TOOL: --with-valgrind - CC: clang-12 CXX: clang++-12 MEM_CHECK_TOOL: --with-valgrind - CC: clang-13 CXX: clang++-13 MEM_CHECK_TOOL: --with-valgrind - CC: clang-14 CXX: clang++-14 MEM_CHECK_TOOL: --without-memcheck # NOTE: workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1758782 ubuntu2404-compilers-test: runs-on: ubuntu-latest container: avsystemembedded/anjay-travis:ubuntu-24.04-3.0 env: CC: ${{ matrix.CC }} CXX: ${{ matrix.CXX }} MEM_CHECK_TOOL: ${{ matrix.MEM_CHECK_TOOL }} steps: # NOTE: workaround for https://github.com/actions/checkout/issues/760 - run: git config --global safe.directory '*' # NOTE: v2 requires Git 2.18 for submodules, it's not present in the image - uses: actions/checkout@v1 with: submodules: recursive - run: apt-get update - run: apt-get -y install $CC $CXX - run: ./devconfig $MEM_CHECK_TOOL --without-analysis -DWITH_VALGRIND_TRACK_ORIGINS=OFF -DWITH_IPV6=OFF - run: | . /venv/bin/activate env CC=gcc LC_ALL=C.UTF-8 make -j - run: | . /venv/bin/activate env CC=gcc LC_ALL=C.UTF-8 make check strategy: fail-fast: false matrix: include: - CC: gcc-12 CXX: g++-12 MEM_CHECK_TOOL: --with-valgrind - CC: gcc-13 CXX: g++-13 MEM_CHECK_TOOL: --with-valgrind - CC: gcc-14 CXX: g++-14 MEM_CHECK_TOOL: --with-valgrind - CC: clang-17 CXX: clang++-17 MEM_CHECK_TOOL: --with-valgrind - CC: clang-18 CXX: clang++-18 MEM_CHECK_TOOL: --with-valgrind - CC: clang-19 CXX: clang++-19 MEM_CHECK_TOOL: --with-valgrind rockylinux9-compilers-test: runs-on: ubuntu-latest container: avsystemembedded/anjay-travis:rockylinux-9-3.0 env: CC: ${{ matrix.CC }} CXX: ${{ matrix.CXX }} steps: # NOTE: workaround for https://github.com/actions/checkout/issues/760 - run: git config --global safe.directory '*' # NOTE: v2 requires Git 2.18 for submodules, it's not present in the image - uses: actions/checkout@v1 with: submodules: recursive - run: dnf update -y --nobest - run: dnf install -y $CC # Solve issues with EPERM when running dumpcap - run: setcap '' $(which dumpcap) - run: ./devconfig --with-valgrind --without-analysis -DWITH_VALGRIND_TRACK_ORIGINS=OFF -DWITH_IPV6=OFF - run: | . /venv/bin/activate env CC=gcc LC_ALL=C.UTF-8 make -j - run: | . /venv/bin/activate env CC=gcc LC_ALL=C.UTF-8 make check strategy: fail-fast: false matrix: include: - CC: gcc CXX: g++ - CC: clang CXX: clang++ macOS-test: runs-on: "${{ matrix.RUNNER }}" steps: # NOTE: v2 requires Git 2.18 for submodules, it's not present in the image - uses: actions/checkout@v1 with: submodules: recursive - run: brew update # NOTE: try the brew install command twice to work around "brew link" errors - run: INSTALL_CMD="brew install python3 openssl"; $INSTALL_CMD || $INSTALL_CMD # NOTE: Some tests don't pass on mbedTLS 3.6.2 now, so we need to install an older version # Homebrew only specifiers major version of mbedTLS, so let's pin the version to 3.6.0 manually - run: curl -f https://raw.githubusercontent.com/Homebrew/homebrew-core/219dabf6cab172fb8b62b4d8598e016e190c3c20/Formula/m/mbedtls.rb > /tmp/mbedtls.rb # HACK: New version of homebrew requires us to install a formulae from a tap, create a tap for our mbedTLS. # The change in homebrew is intentional and won't be fixed, for more details see: https://github.com/orgs/Homebrew/discussions/6351 - run: brew tap-new embedded/mbedtls - run: | TAP_DIR="$(brew --repo embedded/mbedtls)" mkdir -p "${TAP_DIR}/Formula" cp /tmp/mbedtls.rb "${TAP_DIR}/Formula/mbedtls.rb" git -C "${TAP_DIR}" add Formula/mbedtls.rb git -C "${TAP_DIR}" -c user.name="CI" -c user.email="ci@example.com" commit -m "Add custom mbedtls formula" - run: brew install embedded/mbedtls/mbedtls - run: brew pin mbedtls # NOTE: The above command may have installed a new version of Python, that's why we launch it weirdly # NOTE: We manualy create env since devconfig does not use /usr/bin/env python3 - run: /usr/bin/env python3 -m venv venv - run: env JAVA_HOME="$JAVA_HOME_17_X64" ./devconfig --with-asan --without-analysis --no-examples -DWITH_VALGRIND_TRACK_ORIGINS=OFF -DWITH_IPV6=OFF -DMBEDTLS_ROOT_DIR=/opt/homebrew/opt/mbedtls - run: | . venv/bin/activate LC_ALL=en_US.UTF-8 make -j - run: | . venv/bin/activate LC_ALL=en_US.UTF-8 make check strategy: fail-fast: false matrix: include: - RUNNER: macos-14 - RUNNER: macos-15 - RUNNER: macos-26 ================================================ FILE: .github/workflows/coverity.yml ================================================ # Copyright 2017-2026 AVSystem # AVSystem Anjay LwM2M SDK # All rights reserved. # # Licensed under AVSystem Anjay LwM2M Client SDK - Non-Commercial License. # See the attached LICENSE file for details. name: Coverity on: push: branches: [master] jobs: coverity: runs-on: ubuntu-latest container: avsystemembedded/anjay-travis:ubuntu-22.04-3.0 env: # NOTE: These need to be configured in GitHub Actions GUI COVERITY_EMAIL: ${{ secrets.COVERITY_EMAIL }} COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} steps: # NOTE: workaround for https://github.com/actions/checkout/issues/760 - run: git config --global safe.directory '*' # NOTE: v2 requires Git 2.18 for submodules, it's not present in the image - uses: actions/checkout@v1 with: submodules: recursive - run: | mkdir -p coverity_tool bash -c 'cd coverity_tool && \ wget https://scan.coverity.com/download/linux64 --post-data "token=$COVERITY_SCAN_TOKEN&project=AVSystem%2FAnjay" -O coverity_tool.tgz && \ tar xf coverity_tool.tgz' - run: ./devconfig --without-analysis -DWITH_NESTED_FUNCTION_MUTEX_LOCKS=OFF -DWITH_IPV6=OFF - run: env LC_ALL=C.UTF-8 ./coverity_tool/cov-analysis*/bin/cov-build --dir cov-int make - run: tar zcf cov-int.tgz cov-int - run: | curl --form "token=$COVERITY_SCAN_TOKEN" \ --form "email=$COVERITY_EMAIL" \ --form file=@cov-int.tgz \ --form version=$(git rev-parse HEAD) \ --form description="" \ https://scan.coverity.com/builds?project=AVSystem%2FAnjay ================================================ FILE: .gitignore ================================================ # binaries *.a *.so *.so.* /demo/demo # NetBeans Project nbproject # IDEA-based IDE project .idea/ # VSCode .vscode/ # build configuration autogenerated files /build /coverage /output *.swp CMakeFiles/ CMakeTmp/ CMakeCache.txt CMakeDoxyfile.in CMakeDoxygenDefaults.cmake cmake_install.cmake install_manifest.txt _CPack_Packages/ CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake Testing/ /include_public/anjay/anjay_config.h posix-config.h anjay-*.cmake Doxyfile /doc/sphinx/source/conf.py /doc/sphinx/source_api/api_generated tests/integration/run_tests.sh # other Makefile *.log *.gcda *.gcno *.gcov *~ tags .ycm_extra_conf.py .ycm_extra_conf.pyc /tests/codegen/*.c /tests/codegen/*.cpp /tests/integration/build __pycache__/ .gdb_history *.orig *.egg-info *.pyc *.cache compile_commands.json /avs_commons/install /doc/sphinx/build /doc/sphinx/html /doc/doxygen/Doxyfile* /doc/sphinx/source/.doctrees !/doc/sphinx/Makefile # built tutorials examples/*-build # Anjay persistence files *-persistence.dat # Python venv /venv/ build/ dist/ *.egg-info/ # py-build-cmake cache .py-build-cmake_cache ================================================ FILE: .gitmodules ================================================ [submodule "deps/avs_commons"] path = deps/avs_commons url = https://github.com/AVSystem/avs_commons.git ================================================ FILE: CHANGELOG.md ================================================ # Changelog ## 3.13.1 (April 2nd, 2026) ### Bugfixes - Tests and documentation corrections ## 3.13.0 (March 31st, 2026) ### Features - Introduced experimental SSL Error API under `WITH_SSL_ERROR_API` for MbedTLS and custom TLS backends - Implemented FW Update Object v1.1 Resources. - Introduced support for LwM2M 1.2 features: - LwM2M CBOR format, - Bootstrap Pack operation, - Observation Attributes (carried in Observe, not in Write Attributes) - `hqmax` and `edge` attributes (`con` attribute is supported separatley from LwM2M 1.2, enabled with `ANJAY_WITH_CON_ATTR`), - Discover `depth` parameter, - SenML-ETCH CBOR & JSON formats for composite operations, - deleting Resource Instances. ## 3.12.0 (January 30th, 2026) ### BREAKING CHANGES - PEP 668 was adopted. Using Python based tools requires a virtual environment and `devconfig` script ensures it's activated. - Most tools from `tests/integration/framework` were extracted into `tools/test-framework-tools` directory which is being installed in venv by `devconfig` ### Bugfixes - Fixed crash in avs_coap when block transfers are disabled and outgoing message does not fit into the external output buffer. - (commercial version only) Fixed a bug that made it impossible to set a Master Secret which length was anything other than 16 bytes (OSCORE). - Fixed avs_coap tests for GCC 15 ### Features - Added traffic interceptor usage to demo application. - (commercial version only) Made it possible to set the maximum length of the Master Secret and Master Salt using the AVS_COAP_OSCORE_MASTER_SECRET_SIZE and AVS_COAP_OSCORE_MASTER_SALT_SIZE options, respectively. - Removed experimental tags from server connection status API, IPSO objects v2 API, Software Management object API, CoAP Download retry API and Confirmable Notification status callback API. ### Improvements - Reworked the help menu in Anjay Demo. - (commercial version only) Added support for running PKCS11 integration tests with OpenSSL as (D)TLS backend. - Migrated pymbedtls build system to pyproject.toml. ## 3.11.0 (September 26th, 2025) ### BREAKING CHANGES - Default value of maximal holdoff time during Bootstrap limited from 120 sec. to 20 sec. The limit can still be changed using ANJAY_MAX_HOLDOFF_TIME define. - If the Server certificate is missing from the Data Model, Anjay falls back to PKIX verification, provided that a Trust Store is available, even when the certificate usage is set to DANE-TA or DANE-EE. - avs_commons 5.5.0 that is used by Anjay 3.11.0 stoped passing the trust store to Mbed TLS backend for Certificate Usage 2 or 3. For details on how Anjay handles Certificate Usage resource refer to Anjay Specification -> Advanced Topics -> Certificate Usage. ### Bugfixes - Updated avs_commons to a version without a PSK-mode vulnerability in the Mbed TLS backend where a client configured for PSK could connect to a server that did not know the PSK, due to advertising non-PSK key exchange and skipping certificate verification. This issue affected only TLS 1.3 connections with Mbed TLS versions ≥ 3.6.1. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/5.5.0 ### Features - (commercial version only) Added support for configuring OSCORE Object for each Security Object in Anjay Demo. ## 3.10.0 (May 28th, 2025) ### Features - Instruction how to generate packages for Anjay Demo was added to documentation. - Dropped support for Ubuntu 18.04 and removed tests for it. ### Bugfixes - Fixed `devconfig` script which was incorrectly setting Anjay version in logs to "unknown". - Added canceling the Register or Update message exchange if it's in progress when Server Disable (with resource execution or by API) is called that could have led to disabling the server infinitely. ### Improvements - Unified script for generating packages in integration tests, now it can also be used to generate packages for the Software Management object. - The format of the metadata for packages used in integration tests and the demo has been revised to be more unambiguous and unified. - Added `confirmable_notification_status_cb` handler that is called if acknowledgement for confirmable notification is received from the Server or some error has occurred. ## 3.9.0 (February 28th, 2025) ### Features - LwM2M Gateway functionality was added. To see the feature description, API documentation and tutorial on its usage, see Anjay docs - Added a ``coap_downloader_retry_count`` and ``coap_downloader_retry_delay`` configuration options that allow to resume the CoAP download process in case of network errors. ### Improvements - Extended the functionality of the flag enabling Connection ID to also include connections to the file download CoAP server, in addition to the LwM2M server - Migrated GitHub Actions tests on macOS to the macos-14 runner. - Refactored test_ghactions.py. - Added Github Actions test on macOS for the AppleClang. ### Bugfixes - Ensured that Github Actions tests on macOS actually runs on LLVM installed from Homebrew instead of AppleClang. - Minor fix in the devconfig. ## 3.8.1 (November 13th, 2024) ### Improvements - Improved the coverage script and switched to lcov. - In case when the LwM2M server answers with an RST message to a notification that is yielding an error value (e.g. failure to read), which effectively cancels the notification, Anjay is not infinitely trying to transmit that message with error value once again. New behavior is enabled by default, and controlled with `WITH_AVS_COAP_OBSERVE_FORCE_CANCEL_ON_UNACKED_ERROR` option of `avs_coap`. Existing projects have to opt-in explicitly. - Added `--nobest` flag to `dnf update` in Rockylinux image preparation for tests to solve installation candidates conflicts. ### Bugfixes - Actually fixed compatibility with Mbed TLS 3.6. - Fixed compatibility of integration test framework with Mbed TLS versions that enabled TLS 1.3, but didn't use `MBEDTLS_USE_PSA_CRYPTO`. - The -Wformat warning appearing in some compilers has been fixed. - Fixed LwM2M CBOR parser incorrectly accepting inputs containing empty arrays as keys - Prevent from generating non unique session tokens when the monotonic system clock granulation is not fine enough. - Refactored how timeouts are handled in pymbedtls to be in line with use of mbedTLS in avs_commons. ## 3.8.0 (May 28th, 2024) ### BREAKING CHANGES - Timeout in case of sending a Confirmable Notification does not cancel the observation anymore by default. ### Features - Added a ``connection_error_is_registration_failure`` configuration option that allows handling connection errors as Register failures, including the automatic retry mechanism - Added experimental server connection status API. ### Improvements - (commercial version only) Changed MSISDN matching method in SMS binding feature to allow handling messages with Short Codes as originating number ### Bugfixes - Fixed a corner case in which a connection error during a non-first Register attempt could cause uncontrolled infinite retries - Fixed a bug in demo of Advanced Firmware Update module that prevented proper handling of security config for targets other than APP - Fixed a bug that caused anjay_next_planned_notify_trigger family APIs to return an invalid value after canceling observations ## 3.7.0 (February 16th, 2024) ### Features - Added support for LwM2M 1.2 server object requirement for infinite lifetime (lifetime == 0). - Introduced @experimental and @deprecated Doxygen tags. - Added experimental IPSO objects v2 API. - Added experimental Software Management object API. ### Improvements - Improved integration tests compability and framework stability - Added support for wget2 for validating links in documentation (for HTTP/2 support) ### Bugfixes - Refactored generation of blockwise Confirmable notifications to avoid a possible assertion failure; requests for subsequent blocks of such notifications are now sent as Piggybacked responses - Fixed a bug in the documentation of an object definition struct - (commercial version only) Fixed problems with running some tests on systems with Mbed TLS 3.x - Fixed a few assertion and pointer punning issues regarding calls to IPSO objects APIs in erroneous cases - Prevent from trying to store empty cert/keys on HSM ## 3.6.1 (November 21st, 2023) ### Improvements - Optimized heap memory usage: SenML CBOR payloads for Send and Notify operations are no longer serialized in memory in their entirety unless their contents depend on the Access Control object state - Added a public define for MSISDN string size - Optimized "Out of memory" logs in favor of a smaller flash memory footprint - (commercial feature only) Added API for querying Anjay for SSID associated with given MSISDN and SMS Trigger resource value ### Bugfixes - (commercial feature only) Fixes for various bugs that could cause invalid memory accesses when restoring data from corrupted core persistence data ## 3.6.0 (October 9th, 2023) ### Features - Added APIs for setting custom timeouts for downloads performed over CoAP+TCP and HTTP, including firmware update downloads - Added `requirements.txt` file to manage Python dependencies more efficiently ### Improvements - Clarified documentation on behavior of Firmware Update and Advanced Firmware Update modules when ``anjay_fw_update_get_security_config_t`` and ``anjay_advanced_fw_update_perform_upgrade_t`` callbacks, respectively, are not defined. - Added compilation flag that disables all composite operations ### Bugfixes - Updated integration tests so that they pass on macOS - Fix abort scenario in Advanced Firmware Update module ## 3.5.0 (September 7th, 2023) ### BREAKING CHANGES - Reversed the order of calling the ``delivery_handler`` callback vs. canceling the observation when sending notifications with 4.xx or 5.xx code; this change is breaking only for direct users of ``avs_coap`` API ### Features - Added APIs for suspending and resuming standalone downloads as well as Firmware Update and Advanced Firmware Update PULL-mode downloads - Added standalone versions of the Security and Server object implementations, that can be customized by the end users - Added definitions for common Core Object IDs in the public API - Removed potentially faulty assertion in code generated by anjay_codegen.py - (commercial feature only) added ``anjay_sim_bootstrap_calculate_md5()`` function that allows verification whether SIM Bootstrap data has been changed (e.g. as a result of SIM OTA) ### Improvements - Rewritten Send-based reporting in Advanced Firmware Update in such a way that it will now work with custom implementations of the Server object - Simplified the CoAP downloader implementation so that the ``get_remote_hostname`` socket operation is no longer necessary for download resumption - Made handling of initial peer CSM messages in CoAP+TCP asynchronous - Updated the documentation with more descriptive warnings about functions that require extra care to maintain thread safety - Removed ``const`` qualifier from ``MAKE_URI_PATH()`` compound literal which triggers a plausible compiler bug on IAR EWARM v9.30 - Reading SNI from the Security Object for the FOTA download connection ### Bugfixes - Fixed a critical bug that caused Anjay to crash when sending notifications with 4.xx or 5.xx code over TCP - Fixed a regression introduced in 2.13.0 that prevented the Firmware Update and Advanced Firmware Update from compiling without the ``ANJAY_WITH_DOWNLOADER`` configuration option enabled - Fixed a condition where the Register or Update messages could be erroneously regenerated when refreshing server connections while already performing a Register or Update request - Fixed a condition where the connection could be erroneously retried automatically when a fatal failure was expected - Decoupled the ``WITH_AVS_COAP_TCP`` and ``ANJAY_WITH_LWM2M11`` configuration options so that they can be set independently as intended - Fixed the ``devconfig`` script and Github Actions configuration for better compatibility with building on macOS - Refactored TCP binding handling in integration tests for more reliability - Fixed the case where CoAP+TCP Abort message could erroneously be sent multiple times - Loosened some time constraints in Advanced Firmware Update tests - Fixed supplemental iid sort in Advanced Firmware Update - Fixed too early restart while performing an upgrade using Advanced Firmware Update module in Anjay demo app - Fixed too early persistence write while performing an upgrade using Advanced Firmware Update module in Anjay demo app ## 3.4.1 (June 23rd, 2023) ### Features - (commercial feature only) New ``sim_bootstrap`` module that implements the logic necessary to extract the EF(DODF-bootstrap) file contents from a smart card ### Bugfixes - Fixed a potential crash in case of a specific out-of-memory condition in Advanced Firmware Update - Fixed `anjay_config_log.h` so that all non-binary configuration options are properly logged - Fixed a regression from 3.4.0 that prevented ``nsh_lwm2m.py`` from launching ## 3.4.0 (June 14th, 2023) ### Features - New APIs for server connection lifecycle management: ``anjay_server_schedule_reconnect()`` and ``anjay_schedule_register()`` - New options in ``anjay_configuration_t`` that allow for optional more strict LwM2M TS compliance: ``update_immediately_on_dm_change`` and ``enable_self_notify`` - Added option to disable auto-closing of the socket when in queue mode. - `avs_coap_observe_cancel()` is now public API (for direct users of avs_coap) - Added Advanced Firmware Update as an Anjay module - Added simplified demo of Advanced Firmware Update with two firmware images - Added tutorial for Advanced Firmware Update ### Improvements - Observations are now automatically cancelled if the client needs to send a new Register messsage - Added explicit casts in macros that involve negating an unsigned value, to silence warnings generated by some compilers - Various improvements and refactors of integration tests, to make them run faster and more stable - (commercial feature only) Disabled servers are saved now in Core Persistence, which prevents them from registering until the timeout passes with respect to the real clock. ### Bugfixes - Fixed handling of SenML payload that could cause erroneous behavior and memory leaks when parsing payloads only containing the Base Name field, without Name - Fixed error handling in bootstrapper (commercial only) and factory provisioning modules so that the changes are properly rolled back in case of error - Fixed assertion error (or 4.05 Method Not Allowed when compiled without assertions) when attempting to set the Disable Timeout resource in the Server object when the `ANJAY_WITHOUT_DEREGISTER` configuration option is set - Fixed inequality comparisons on some time values that could cause erroneous behavior on platforms with low-resolution system clocks, and updated unit tests to not assume a high-resolution clock - Fixed a problem where `anjay_ongoing_registration_exists()` inconditionally returned `true` if any server connection in a "disabled" state existed - Timeout when sending a Confirmable Notification now cancels the observation, as required by RFC 7641 - Removed sending of Release messages when using CoAP+TCP, which fixes the issue of erroneously sending them at the beginning after reconnecting a LwM2M connection socket - Fixed the serial port handling code in the sample NIDD driver, to properly handle cases where more than one line is received in a single read() call - Fixed compatibility of integration tests with the current versions of the Python cryptography module - Fixed problems with compiling the library without `WITH_AVS_COAP_BLOCK` enabled (contributed by Flonidan A/S) - Fixed a bug in the pymbedtls library used by tests, that prevented it from working in DTLS client mode - Fixed bug in the "Custom (D)TLS layers" code examples ## 3.3.1 (March 10th, 2023) ### Improvements - `anjay_disable_server()` and `anjay_disable_server_with_timeout()` can now be called on servers that are not enabled as well ### Bugfixes - Fixed resetting of counter for the Communication Sequence Retry Count resource - Fixed a regression in 3.2.0 that prevented the bootstrap connection to be properly closed if the Bootstrap Server is reconfigured in the new bootstrap information and legacy Server-Initiated Bootstrap is disabled ## 3.3.0 (February 21st, 2023) ### Features - New configuration option, `WITHOUT_MODULE_fw_update_PUSH_MODE` (CMake) / `ANJAY_WITHOUT_MODULE_FW_UPDATE_PUSH_MODE` (header), that allows disabling support for the PUSH mode in the Firmware Update module ### Improvements - Refactored tests to use `avs_stream_inbuf` instead of `avs_unit_memstream` - Refactored `anjay_input_ctx_constructor_t` to use only a single pointer for input stream - Revised support for DTLS Connection ID extension, so that a new handshake is not performed if Connection ID is used, unless an error occurs - Revised example Anjay configurations for embedded builds without CMake to optimize compile time and code size #### Bugfixes - Fixed a critical regression in 3.2.0 that could cause an assertion failure and use-after-free during Bootstrap Finish if the Bootstrap Server is reconfigured in the new bootstrap information and legacy Server-Initiated Bootstrap is disabled - Fixed a bug that could cause undefined behavior when reading the Update Delivery Method resource in the Firmware Update object with thread safety enabled but Downloader disabled - Fixed a bug that prevented notifications from being sent in a timely manner after receiving Reset message cancelling an Observation in response to another confirmable notification - Fixed a bug that could cause an assertion failure when using `anjay_delete_with_core_persistence()` if a primary server connection failed, but a trigger (SMS) connection is operational - Fixed the response code of unsuccessful Resource /1/x/9 Bootstrap-Request Trigger execution (e.g. when there is no Bootstrap-Server Account) ## 3.2.1 (December 13th, 2022) ### Improvements - Added some missing log messages for potential scheduler errors - Updated the version of pybind11 used by integration tests to 2.10.1 ### Bugfixes - Fixed a regression in 3.2.0 that caused some invalid Writes to be silently ignored without responding with proper error codes - Fixed compatibility of integration tests with Python 3.11 and the current Github macOS environment ## 3.2.0 (December 7th, 2022) ### BREAKING CHANGES - Observations are now implicitly canceled when the client's endpoint identity changes (i.e., when the socket is reconnected without a successful DTLS session resumption). This is in line with [RFC 7641](https://datatracker.ietf.org/doc/html/rfc7641#page-22) and LwM2M TS requirements (see [Core 6.4.1](https://www.openmobilealliance.org/release/LightweightM2M/V1_1_1-20190617-A/HTML-Version/OMA-TS-LightweightM2M_Core-V1_1_1-20190617-A.html#6-4-1-0-641-Observe-Operation) and [Transport 6.4.3](https://www.openmobilealliance.org/release/LightweightM2M/V1_1_1-20190617-A/HTML-Version/OMA-TS-LightweightM2M_Transport-V1_1_1-20190617-A.html#6-4-3-0-643-Registration-Interface)), but **may break compatibility with some non-well-behaved servers.** ### Features - New APIs to access information about the last registration time, next registration update time and last communication with a server time - Expanded `anjay_resource_observation_status_t` structure so that now `anjay_resource_observation_status()` returns also the number of servers that observe the given Resource (capped at newly introduced `ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER`) and their SSIDs ### Improvements - Migrated GitHub Actions tests from Fedora-36 to RockyLinux-9 - Added compilation flag to enforce Content-Format in Send messages. - Refactored Firmware Update notification handling and simplified internal module support - Removed the usage of symbolic links between Python packages to make them usable on Windows - Key generation in the factory provisioning script has been rewritten to use the cryptography Python module instead of pyOpenSSL - Factory provisioning script now uses elliptic curve cryptography by default in certificate mode - `anjay_next_planned_lifecycle_operation()` and `anjay_transport_next_planned_lifecycle_operation()` now properly respect jobs that have been scheduled manually (e.g. `anjay_schedule_registration_update()`) ### Bugfixes - Fixed a bug that could cause some resources in a Write message to be ignored when they follow a Multiple-Instance Resource entry - Fixed semantics of Resources 19 and 20 in the Server object, which were mistakenly swapped - **NOTE:** The persistence format for the Server object has been reinterpreted so that Resources 19 and 20 remain where they were, without taking semantics into account. This will fix configurations provisioned by Servers but may break configuration persisted just after initially configuring it from code. - Made sure that `anjay_schedule_registration_update()` forces a single Update request even when followed by `anjay_transport_schedule_reconnect()` or a change of offline mode - Made sure that notifications are not sent before the Update operation if one has been scheduled - Made sure that `anjay_transport_schedule_reconnect()` properly reconnects the Bootstrap server connection in all cases - Made sure that the socket is properly closed when queue mode is enabled, including previously missing cases related to the Send operation and when no CoAP message needs to be sent at all - Refactored asynchronous server connection management to avoid race conditions that could lead to required actions (e.g. EST requests) not being performed when the calculated delays were not big enough ## 3.1.2 (August 24th, 2022) ### Improvements - Reduced code size of the Security object implementation - Updated documentation, readme and examples to mention the new EU IoT Cloud platform - Migrated GitHub Actions tests to ubuntu-18.04, ubuntu-20.04, ubuntu-22.04, fedora-36 and macos-11 ### Bugfixes - Fixed various compilation warnings - Fixed dangerous usage of `avs_realloc()` in the event loop implementation ## 3.1.1 (July 22nd, 2022) ### Improvements - Added `CHANGELOG.md` ### Bugfixes - Added the missing return in anjay_dm_handlers.c that could cause undefined behavior when `ANJAY_WITH_THREAD_SAFETY` was disabled - Removed the unused option in the factory provisioning script - Removed usage of Python 3.6 syntax in tests that caused Github Actions tests to fail - Added missing notes about the change to (D)TLS version in all migration guides in the documentation - (commercial feature only) Fixed proper handling of changing the disable_legacy_server_initiated_bootstrap across core persistence cycles ## 3.1.0 (July 6th, 2022) ### BREAKING CHANGES **Note:** the following changes, while technically breaking, are minor, and should not cause problems in most pratical usages. See also: https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay30.html - Changed error handling semantics of anjay_attr_storage_restore() to match other persistence restore functions - TLS 1.2 is no longer implicitly set as the default (D)TLS version; the underlying crypto library's default is now used ### Features - Factory provisioning feature that allows to perform "Factory bootstrap" based on SenML CBOR data stream - New API: anjay_access_control_set_owner(), allowing to set Owner resource in the Access Control object during the "Factory bootstrap" phase - New APIs for changing the CoAP transmission parameters, CoAP exchange timeout and DTLS handshake timeouts while the library is running ### Improvements - Migrated the Observe/Notify subsystem to use the new AVS_SORTED_SET API from avs_commons; this means that avs_rbtree can be disabled, in which case a more lightweight list-based implementation will be used - Minor code size optimizations in the Server object implementation - Added documentation for the OSCORE commercial feature - (D)TLS version can now be set from command line in the demo application ### Bugfixes - Fixed a bug in anjay_ongoing_registration_exists() that could cause it to always return true if disable_legacy_server_initiated_bootstrap is set to true - Fixed improper formatting of the payload describing the data model in the Register message during initial negotiation of the LwM2M version - Fixed handling of persistence format versioning for the Security object, that could cause crashes if Anjay was compiled without LwM2M 1.1 support - Changed the "Bootstrap on Registration Failure" resource in the Server object to be readable, as specified in LwM2M TS 1.2 - (commercial feature only) Added persistence of runtime LwM2M version in the core persistence feature; previously the client could erroneously use a different LwM2M version than it registered with after core persistence restore ## 3.0.0 (May 18th, 2022) ### BREAKING CHANGES - Changed license of the free version to AVSystem-5-clause - Refactored the attr_storage module as a core feature - Names of the relevant CMake options and configuration macros have changed - anjay_attr_storage_install() has been removed; Attribute Storage is now always installed if enabled at compilation time - Behavior of anjay_attr_storage_restore() has been changed - this function now fails if supplied source stream is empty - The "con" attribute is now included in anjay_dm_oi_attributes_t, as it has been standardized for LwM2M TS 1.2 - Refactored public headers to consistently use conditional compilation; APIs for disabled features are no longer accessible - Removed previously deprecated APIs - avs_commons 5.0 refactor the API for providing PSK credentials. Please refer to the change log there, or the document below for details: https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay215.html ### Features - LwM2M TS 1.1 support and related features are now available in the open source version; the features include: - Support for TCP binding - Support for SenML JSON, SenML CBOR and raw CBOR content formats - Support for the Send operation - Possibility for automatically moving security credentials provisioned by the Bootstrap Server or the bootstrapper module onto hardware security engines (note: no hardware security engine implementation is provided in the open source version) - Security credentials provisioned by the Bootstrap server or bootstrapper module and automatically moved onto hardware security engine can now be marked as "permanent" to prevent them from being removed - (commercial feature only) Experimental support for some LwM2M TS 1.2 features ### Improvements - Refactored incoming message handling to make use of the `AVS_NET_SOCKET_HAS_BUFFERED_DATA` feature added in avs_commons 5.0 - Refactored and simplified internal flow of calling data model handlers - Refactored internal handling of communication state - Commercial features are now available for separate inclusion, described in the documentation more clearly and feature code examples - Various improvements in the documentation ## Anjay 2.15.0 (April 8th, 2022) ### Bugfixes - Fixed some uninitialized variables in IPSO object implementations - Fixed some compilation warnings in unit tests - Fixed compatibility of integration tests with OpenSSL 3 - Fixed socket flag handling in tests that were breaking with some versions of Python - Fixed some obsolete information in Doxygen documentation - (commercial feature only) Added a validity check for the certificate provisioned via EST; previous code could lead to an assertion failure if the server misbehaved or the system clock was not set correctly ### BREAKING CHANGES - avs_commons 4.10 contains a refator of PSK security credential handling. Please refer to the change log there, or the document below for details: https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay214.html ### Features - Added a new anjay_event_loop_run_with_error_handling() API that automatically restarts the communication in case of a fatal error - (commercial version only) Added support for using PSK security credentials located in hardware security engines - (commercial version only) Added the possibility for automatically moving security credentials provisioned by the Bootstrap Server or the bootstrapper module onto hardware security engines ### Improvements - Added proper support for object versioning in the object stub generator - Refactored LOG_VALIDATION_FAILED macros in security and server modules to prevent some compilers to generate code with excessive stack usage - Stopped using LOG macro in expression context for better compatibility with external logger implementations - Added support for Mbed TLS 3.1 in the pymbedtls module used in tests ### Bugfixes - Fixed firmware update protocol support being erroneously reported when a custom TLS layer is used - Changed default "Minimum Period" attribute value to 0, as mandated by the specification - Fixed a potential memory leak in fw_update module's cleanup routine - Fixed the downloader and fw_update modules erroneously passing empty CoAP ETags to the user - Fixed ETag handling in the firmware update tutorial examples - Fixed handling of objects with names that contain characters that are invalid for C identifiers in the object stub generator - Fixed building documentation on newer versions of Sphinx - Prevented the custom TLS layer from building during testing if the dependencies are not met - (commercial version only) Fixed the wrong resource being written when updating the TLS/DTLS Alert Code resource - (commercial version only) Fixed a bug which could cause communication over coaps+tcp to be stalled due to buffering on the TLS layer Also updates avs_commons to version 4.10.0. For details, see https://github.com/AVSystem/avs_commons/releases/tag/4.10.0 ## Anjay 2.14.1 (November 29th, 2021) ### Features - added custom TLS layer tutorial, - added possibility to generate code for objects with constant number of instances. ### Improvements - updated avs_commons to version 4.9.1, - made avs_coap work with external logger feature, - expanded code generation docs. ### Bugfixes - fixed erronous links in documentation, - removed issues from IPSO objects documentation. ## Anjay 2.14.0 (October 1st, 2021) ### Features - Added anjay_event_loop_run() and anjay_serve_any() APIs that remove the need to implement the event loop manually in client applications - Added predefined implementation of some common IPSO object types - (commercial version only) Support for PSA API for hardware-based security ### Improvements - Moved mutex locking from anjay_sched_run() to scheduler jobs themselves, so that custom scheduler jobs are properly supported when thread safety is enabled; this is technically a breaking change against 2.13.0, but the 2.13.0 behaviour has been classified as a defect - Refactored the demo client to use the new event loop API - Made data types used by anjay_codegen.py more consistent - Various improvements and updates to the documentation, including new tutorials about thread safety and the new APIs - Improved integration tests so that they are more deterministic - Migrated public CI for the open-source version to GitHub Actions ### Bugfixes - Fixed incorrect behavior of anjay_ongoing_registration_exists() when Server-Initiated Bootstrap was in use (issue #56) - Fixed some potential race conditions that could cause anjay_get_socket_entries() to return invalid sockets when downloads were in progress - Fixed obsolete URLs in documentation Also updates avs_commons to version 4.9.0. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/4.9.0 ## Anjay 2.13.0 (July 19th, 2021) ### Features - Added optional support for thread safety When enabled, all calls to Anjay library functions are protected using built-in mutex, which allows safe integration into multi-threaded applications. ### Improvements - General improvements when using fw_update module without ANJAY_WITH_DOWNLOADER - Add option in demo to provide identity and psk as ASCII string ### Bugfixes - Fixed URL in lwm2m_object_registry.py - Fix bug in dockerfile with apt-get install change not refreshing apt index Also updates avs_commons to version 4.8.1. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/4.8.1 ## Anjay 2.12.0 (June 30th, 2021) ### Features - Added extended log handler implementation, it can be enabled in demo by `--alternative-logger` argument. ### Improvements - Endpoint name and local MSISDN are copied during anjay_new() along with the rest of the parameters. - Demo now checks if binding mode is compatible with the provided URI. ### Bugfixes - Fixed the case where the LwM2M server requests a block from the middle. - Handle fatal CoAP errors during registration, in case of aborted context device will abort registration. (commercial version only) Also updates avs_commons to version 4.8.0. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/4.8.0 ## Anjay 2.11.1 (June 2nd, 2021) ### Features - Added anjay_send_batch_data_add_current_multiple_ignore_not_found(), a variant of anjay_send_batch_data_add_current_multiple() that does not treat non-existing resources as an error ### Improvements - Simplifications in JSON serialization code - Relaxed timeout values in some integration tests - Added documentation for internal CoAP packet parsing APIs - (commercial version only) Read-Composite and Observe-Composite responses now make use of the "base name" and "base time" SenML labels - (commercial version only) Observe response sequence number is now omitted for the TCP transport, as permitted by RFC 8323 ### Bugfixes - Fixed default content-format selection for simple resources if it is not selected by the server and text/plain is disabled at compile time - (commercial version only) Fixed a critical bug in anjay_send_batch_data_add_current_multiple() that could cause the batch to be in an inconsistent state if the underlying read operation failed - (commercial version only) Fixed a potential memory leak when restoring observation state in anjay_new_from_core_persistence() Also updates avs_commons to version 4.7.2. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/4.7.2 ## Anjay 2.11.0 (April 29th, 2021) ### Features - (commercial version only) Added anjay_send_batch_data_add_current_multiple() API for sending multiple resources with the same timestamp - (commercial version only) "send" command in demo application now supports sending multiple resources at once ### Improvements - Added documentation for the avs_coap module - Added tutorial for using the LwM2M Send method (available in commercial version only) - (commercial version only) Resource Instances can now be created through the Write-Composite operation - (commercial version only) Made use of Base Name and Base Time labels when generating SenML documents to reduce message size ### Bugfixes - Enforced decimal base when handling text/plain content format (previously C-style octal and hexadecimal literals were erroneously supported) - Made anjay_ongoing_registration_exists() work even if non-default implementation of the Server object is in use - Fixed various compilation warnings - (commercial version only) Removed erroneous quotes when reporting LwM2M Enabler version in Register requests and Discover responses for LwM2M 1.1 - (commercial version only) Proper checks for attempts to send data from forbidden objects (Security, OSCORE) via anjay_send_batch_data_add_current() - (commercial version only) Added graceful handling of the case when security information provisioned through EST onto an HSM is not accessible, but necessary to attempt bootstrap Also updates avs_commons to version 4.7.1. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/4.7.1 ## Anjay 2.10.0 (March 19th, 2021) ### Features - Added additional_tls_config_clb field to anjay_configuration_t that allows for advanced configuration of the TLS backend - Added possibility to mix NoSec and secured server connections in demo client - Added pretty-printing of JSON payloads in the NSH testing shell - (commercial version only) Added APIs to query times of upcoming Register, Update and Notify events - (commercial version only) Implemented reporting of Short Server ID for the OSCORE object on Bootstrap-Discover, as required by LwM2M 1.1 - (commercial version only) Added support for the Trigger resource in the Server object - (commercial version only) Added support for the ID Context resource in the OSCORE object ### Improvements - Refactored _anjay_sync_access_control() to avoid recursion - Refactored debug logging of CoAP BLOCK options ### Bugfixes - Fixed the issue where pmax-based notifications were not being scheduled when Notification Storing was disabled - Fixed semantics of the LwM2M Write operation when writing optional resources that are not supported in the implementation; this behaviour has been clarified between LwM2M TS releases 1.1 and 1.1.1 - Fixed queue-mode server connections superfluously resuming when exiting offline mode if there is no data to be sent - Fixed potential NULL dereferences in Security, Server, Access Control and OSCORE object implementations - Fixed potential memory leak in data batch storage module (used by Notify and Send operations) - More robust state checking in the TLV output module - Fixed some linting checks (visibility, header and code duplication verification) that were not executing properly as part of "make check" and deduplicated them between subprojects - Fixed a bug in pymbedtls module that caused integration tests to sometimes freeze indefinitely - Fixed a bug that prevented lwm2m_decode command in the NSH testing shell from working - Fixed a problem with building the demo application on Windows - (commercial version only) Made LwM2M Send operation work properly when the server connection is suspended due to queue mode operation - (commercial version only) Fixed handling of buffer overflow corner cases in the BG96 driver in the demo application Also updates avs_commons to version 4.7. For details, see: https://github.com/AVSystem/avs_commons/releases/tag/4.7 ## Anjay 2.9.0 (January 18th, 2021) ### BREAKING CHANGES - Minimum required CMake version is raised to 3.6 - avs_commons 4.6 contains a refactor of avs_net_local_address_for_target_host() that may be breaking for users who maintain their own socket integration code For more detailed information about breaking changes and how your code needs to be updated, see: https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay28.html ### Features - LwM2M Testing Shell is now included in the open-source version, see https://docs.avsystem.com/hubfs/Anjay_Docs/Tools/CliLwM2MServer.html - Demo application can now be built even when some of the optional library features (e.g. bootstrap, Access Control, observation support, persistence) are disabled - A new guide for writing custom socket integration code, and example lightweight implementation: https://docs.avsystem.com/hubfs/Anjay_Docs/PortingGuideForNonPOSIXPlatforms/NetworkingAPI.html ### Improvements - Improved wording in migration documentation to make usage clearer - Various improvements to integration tests: - Tests that involve restarting the demo process now retain execution logs for each launch - Fixed a race condition when handling demo process shutdown - (commercial version only) Additional tests for rebuilding client certificate chain - (commercial version only) CoAP message cache, previously only enabled for UDP, is now also used for SMS and NIDD transports - (commercial version only) Made closing NIDD connection in the BG96 driver more resilient to errors ### Bugfixes - Removed some misleading log messages - (commercial version only) Fixed some dependencies between CMake configuration options so that cmake -DDTLS_BACKEND= . works with default settings Also updates avs_commons to version 4.6 which, in addition to the breaking change mentioned above, introduces the following changes: ### Improvements - Additional tests for the avs_stream module Bugfixes - Fixed erroneous bounds check in _avs_crypto_get_data_source_definition() - Made removal of PKCS#11 objects more resilient to errors (relevant mostly for commercial Anjay users) - Fixed CMake code for importing the libp11 library (relevant mostly for commercial Anjay users) ## Anjay 2.8.0 (November 23rd, 2020) ### BREAKING CHANGES See below for breaking changes in avs_commons. Note that these are unlikely to affect users that use CMake for building the library, but may require updating configuration headers when using alternative build systems. For more detailed information about breaking changes and how your code needs to be updated, see: https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay27.html ### Features - Made use of avs_commons' new floating point formatting functions, making it possible to link against libc implementations that don't support printf("%g") - (commercial version only) Support for Enrollment over Secure Transports (EST-coaps) with key and certificate storage on Hardware Security Modules via avs_commons' OpenSSL engine support - (commercial version only) Support for certificate chain reconstruction based on trust store when performing (D)TLS handshake - this is especially useful for EST-based security, as certificates provisioned via /est/crts can be used as client certificate chain during handshake ### Improvements - Better CMake-level dependencies and error handling for compile-time configuration options - Fixed various compile-time warnings - Included avs_commons and avs_coap configuration in the TRACE-level configuration report log at initialization time - Relaxed timeout for Deregister message in integration tests - Integration test target logs path is now configurable in runtest.py - Various improvements to documentation and examples: - Attribute storage module is now installed in most tutorials, making them more complete - https://docs.avsystem.com/hubfs/Anjay_Docs/AdvancedTopics/AT-NetworkErrorHandling.html now mentions retry behavior of the commercial version in LwM2M 1.1 - API documentation generated by Doxygen now properly includes all commercial-only APIs when run in commercial codebase - Updated installation instructions for CentOS that referred to non-existent URLs - Updated visual style to match corporate identity ### Bugfixes - Data model persistence routines can no longer be successfully called during the bootstrap procedure, preventing from persisting potentially invalid data - Fixed a regression in 2.7.0 that prevented ciphersuite setting from being properly respected for HTTP downloads - Fixed a bug that could result in an assertion failure when showing demo client's help message - Fixed a bug in "get_transport" command implementation in demo client - Fixed erroneous setting of AVS_COMMONS_WITH_AVS_CRYPTO_ADVANCED_FEATURES in example configuration headers - Removed duplicate file names that could prevent building with some embedded IDEs Also updates avs_commons to version 4.5 which introduces the following changes: ### BREAKING CHANGES - Moved URL handling routines to a separate avs_url component - Implementation of avs_net_validate_ip_address() is no longer required when writing custom socket integration layer - Hardware Security Module support has been reorganized to allow easier implementation of third-party engines ### Features - Support for private key generation and removal on Hardware Security Modules via PKCS#11 engine - Support for storing and removing certificates stored on Hardware Security Modules via PKCS#11 engine - Support for certificate chain reconstruction based on trust store when performing (D)TLS handshake - New AVS_DOUBLE_AS_STRING() API and AVS_COMMONS_WITHOUT_FLOAT_FORMAT_SPECIFIERS configuration options, making it possible to stringify floating point numbers on libc implementations that don't support printf("%g") ### Improvements - Simplified URL hostname validation - it is now somewhat more lenient, but no longer depends on avs_net_validate_ip_address() - Removed internal usage of avs_net_validate_ip_address() and reimplemented it as an inline function that wraps avs_net_addrinfo_resolve_ex() - Better CMake-level dependencies and compile-time error handling for compile-time configuration options - PEM-formatted security objects can now be loaded from buffer in the Mbed TLS backend ### Bugfixes - Fixed conditional compilation clauses for avs_crypto global initialization - Additional NULL checks when loading security information - Removed duplicate file names that could prevent building with some embedded IDEs ## Anjay 2.7.0 (October 15th, 2020) ### BREAKING CHANGES - Changed signature of anjay_security_config_from_dm() and expected lifetime of anjay_security_config_t; removed anjay_fw_update_load_security_from_dm() compatibility alias Note: For a more detailed information about breaking changes and how your code needs to be updated, see: https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay26.html ### Features - New anjay_download_set_next_block_offset() API that allows skipping parts of downloads - (commercial version only) Support for configuring certificate security from external sources during the Factory Bootstrap phase, including initial support for PKCS11-based hardware security - (commercial version only) Support for TCP in the NSH testing shell ### Bugfixes - Fixed support for older versions of Mbed TLS - More graceful error handling in anjay_security_object_add_instance() - Made the option to disable bootstrap support work again - Other bug fixes, partially found using fuzz testing Also updates avs_commons to version 4.4 which introduces the following changes: ### BREAKING CHANGES - Significant refactor of avs_crypto_security_info_union_t family of types (compatibility aliases are available) ### Features - Initial support for PKCS11-based hardware security - New APIs: - avs_crypto_certificate_chain_info_array_persistence() - avs_crypto_certificate_chain_info_from_engine() - avs_crypto_certificate_chain_info_list_persistence() - avs_crypto_certificate_chain_info_persist() - avs_crypto_cert_revocation_list_info_array_persistence() - avs_crypto_cert_revocation_list_info_list_persistence() - avs_crypto_cert_revocation_list_info_persist() - avs_crypto_private_key_info_copy() - avs_crypto_private_key_info_from_engine() - avs_crypto_private_key_info_persistence() - avs_net_socket_dane_tlsa_array_copy() - avs_stream_copy() - avs_stream_offset() - Added scripts simplifying unit test code coverage calculation ## Anjay 2.6.1 (August 31st, 2020) ### Features - Added documentation for the LwM2M testing shell (NSH) - note that the shell itself is only available in the commercial version ### Improvements - Refactored security key loading flow ### Bugfixes - Fixed testing scripts to make them work on macOS and Raspberry Pi OS again - Added __odr_asan to the list of permitted symbols so that "make check" succeeds when the library is built with AddressSanitizer enabled - (applicable to commercial version only) Fixed a bug in anjay_server_object_set_lifetime() that could lead to sending the Update message twice afterwards Also updates avs_commons to version 4.3.1 which introduces the following changes: ### Improvements - Replaced the test PKCS#7 file in unit tests with a more modern one, that can be loaded properly with newest releases of Mbed TLS ### Bugfixes - Made the library compile again with Mbed TLS configured without CRL support or without file system support - Fixed some testing code to make it work on macOS and Raspberry Pi OS again - Added __odr_asan to the list of permitted symbols so that "make check" succeeds when the library is built with AddressSanitizer enabled ## Anjay 2.6.0 (August 25th, 2020) ### Features - Added compile-time option to disable plaintext and TLV format support - Added compile-time option to disable usage of the Deregister message - Added support for DANE TLSA entries for downloads - Added support for Security and Server (and OSCORE in commercial version) persistence to the demo client - (commercial version only) More complete support for Enrollment over Secure Transports (EST-coaps), including: - Support for /est/sren and /est/crts operations - Persistence of EST data - Support for application/pkcs7-mime;smime-type=certs-only content format - (commercial version only) Implemented OSCORE object persistence - (commercial version only) Support for Matching Type and Certificate Usage Resources in the LwM2M Security object - (commercial version only) LwM2M Security object Resources that has previously been only supported through Bootstrap Write, are now also exposed through anjay_security_instance_t ### Improvements - Anjay can now be used on platforms that do not support handling 64-bit integers through printf() and scanf() - Stricter command line option parsing in the demo client - Improved help message formatting in the demo client - (commercial version only) Various improvements to TLV and CBOR handling in the nsh tool ### Bugfixes - Fixed a bug that could lead to a blocking receive with infinite timeout when DTLS is in use and handshake messages had to be retransmitted - NOTE: This, strictly speaking, introduces a BREAKING CHANGE in semantics of `anjay_serve()` and `avs_coap_*_handle_incoming_packet()` - as they no longer wait for the first message to arrive, but handle it in a non-blocking manner. However, this should not matter in practice if recommended patterns of these functions' usage are followed, and in the worst case scenario it may cause poorly written event loop code to behave as a busy loop, but it should not prevent the code from working. - Stricter parsing of TLV payloads - Fixed calculation of block size when resuming CoAP downloads which did not use the ETag option - Made tests related to X.509 certificate mode pass with the OpenSSL backend - More graceful error handling in downloader when required callbacks are not passed - Fixed various compilation warnings - (commercial version only) Fixed a bug that could lead to crash if offline mode was toggled during same-socket CoAP download and another LwM2M exchange was also scheduled - (commercial version only) Fixed CMake option dependencies for the EST feature Also updates avs_commons to version 4.3 which introduces the following changes: ### Features - Improved trust store handling, including: - Support for configuring usage of system-wide trust store - Support for trusted certificate arrays and lists in addition to single entries - Support for CRLs - Support for DANE TLSA entries - Support for loading certs-only PKCS#7 files - New avs_crypto_client_cert_expiration_date() API - Removed dtls_echo_server tool that has been unused since version 4.1 ### Bugfixes - Fixed a bug that prevented compiling avs_commons without TLS support - Fixed missing error handling in avs_persistence_sized_buffer() - Fixed a bug in safe_add_int64_t() that could cause a crash if the result of addition was INT64_MIN - Fixed various compilation warnings ## Anjay 2.5.0 (July 14th, 2020) ### Features - Updated AvsCommons to 4.2.1 - Added new API for etag allocation - (commercial version only) Added initial support for Enrollment Over Secure Transport (EST) ### Bugfixes - Fixed segfault in CoAP downloads caused by cancellation in the middle of the transfer - Fixed building tests on CentOS - Fixed compilation when WITH_ANJAY_LOGS=OFF is used - Fixed handling of transactional LwM2M Write - (commercial version only) Fixed download suspension for downloads over shared socket ## Anjay 2.4.4 (July 1st, 2020) ### Features - Updated avs_commons to version 4.2.0 - (commercial version) Added API for run-time Lifetime management ### Bugfixes - (commercial version) Fixed corner case handling of Last Bootstrapped Resource ## Anjay 2.4.3 (June 25th, 2020) ### Improvements - Added workarounds for non-deterministic operation of time-sensitive integration tests ### Bugfixes - Fixed a critical bug in error handling of notification sending - Fixed some bugs in Docker and Travis integration - (commercial version only) Fixed a bug in `anjay_transport_*()` functions that prevented them from working correctly with NIDD transport ## Anjay 2.4.2 (June 17th, 2020) ### Features - (commercial version only) Implemented NIDD MTU management, allowing to configure maximum message size to be sent, and the maximum message to be received - (commercial version only) Added binding mode deduction from URI scheme to demo client ### Improvements - Added Dockerfile to simplify compiling & launching Anjay demo client on various systems - Improved error reporting when executing Registration Update Trigger ### Bugfixes - Fixed incorrect condition in time_object_notify in tutorials' code - Fixed compilation issues of pymbedtls on newer GCC versions - Fixed compilation of the demo client on Windows ## Anjay 2.4.1 (May 29th, 2020) - NOTE: The endpoint name and server URI arguments to the demo client are now mandatory ### Improvements - Fixed various compilation warnings in certain configurations - Updated documentation, readme and examples to mention the new Try Anjay platform - Added some missing information in "Porting guide for non-POSIX platforms" documentation article - Additional script for testing Docker configurations used by Travis locally ### Bugfixes - Updated avs_commons to version 4.1.3, with more fixes in CMake scripts for corner cases when searching for mbed TLSa, and fix for allowing compilation on platforms that define macros that conflict with avs_log verbosity levels (DEBUG, ERROR etc.) - Removed the .clang-format file that relied on features specific to an unpublished custom fork of clang-format ## Anjay 2.4a (May 22nd, 2020) Updated avs_commons to version 4.1.2, which fixes interoperability problem with CMake versions older than 3.11. ## Anjay 2.4 (May 21st, 2020) ### Features - Added anjay_ongoing_registration_exists() API - Added anjay_server_get_ssids() API for the default implementation of the Server object - Made offline mode configurable independently per transport (UDP, TCP; in commercial version also SMS and NIDD) and respected by downloads (including firmware update) - Network integration layer (in commercial version, also SMS and NIDD drivers) may now use avs_errno(AVS_ENODEV) as a special error condition that will NOT trigger connection reset - (commercial version only) Added avs_send_deferrable() API - (commercial version only) Support for reporting State and Result changes using LwM2M Send messages in the fw_update module - (commercial version only) Ability to perform CoAP(S) downloads (including firmware update) over the same socket that is already used for LwM2M communication. In particular, this allows downloads over SMS and NIDD. ### Improvements - fw_update module now allows reset of the state machine during download - Ability to report successful firmware update without reboot through the fw_update module is now officially supported - (commercial verison only) OSCORE implementation now properly supports kid_ctx negotiation as specified by RFC 8613 Appendix B.2 - (commercial version only) Improvements to NIDD handling, to make sure that different packet size limits may be used for incoming and outgoing messages (NOTE: For the commercial version, this includes BREAKING CHANGES) ### Bugfixes - Made some payload processing errors (including text/plain base64 decoding errors) return 4.00 Bad Request properly instead of 5.00 Internal Server Error - The default Disable timeout in the default implementation of the Server object is now 86400 as mandated by the spec instead of infinity - (commercial version only) Fixed a bug in timeout handling that sometimes caused the bg96_nidd driver to report spurious errors Also updates avs_commons to version 4.1.1, which includes the following changes: ### Bugfixes - Fixed a bug in CMake scripts that caused link errors when using statically linked versions of mbed TLS ## Anjay 2.3a (May 15th, 2020) BREAKING CHANGES: - Removed usages of the ssize_t type. APIs in both Anjay and avs_commons that had it in public signatures have been redesigned - (commercial version only) Retry mechanisms described in LwM2M TS 1.1.1, section 6.2.1.2 are now used by default, which changes the default registration retry policy - Updated avs_commons to version 4.1, with the following breaking changes: - Renamed public header files for better uniqueness - Redesigned socket creation and in-place decoration APIs, including the addition of a requirement to provide PRNG context - Renamed some public configuration macros, to unify with the updated compile-time configuration pattern - Removed the legacy avs_coap component (the version used by Anjay 1.x) - Removed the mbed TLS custom entropy initializer pattern in favor of the new PRNG framework Note: For a more detailed information about breaking changes and how your code needs to be fixed, see https://docs.avsystem.com/hubfs/Anjay_Docs/Migrating/MigratingFromAnjay225.html ### Features - Changed project structure, configuration headers and updated build system, so that building the library without using CMake is now officially supported - Allowed public access to Anjay's scheduler using anjay_get_scheduler() - Code generator now allows omitting some of the resources during generation - (commercial version only) Added support for some of the retry mechanisms described in LwM2M TS 1.1.1, including the following resources: - Bootstrap on Registration Failure - Communication Retry Count - Communication Retry Timer - Communication Sequence Delay Timer - Communication Sequence Retry Count - (commercial version only) SMS driver API is now public, allowing for custom driver implementation ### Improvements - Major overhaul of documentation, including new tutorials for data model and firmware update implementation, as well as guides for migration from both Anjay 1.16 and 2.2 - Cryptographically secure PRNG is now used whenever possible for generation of CoAP tokens and initial message IDs - Improvements to code generator: - Refactored the generated code so that programmatic instantiation of Object Instances is now easier - Code generated in C++ mode is now more object-oriented and idiomatic - Thanks to all compile-time configuration now being accessible via a public header, the demo client can now be compiled even when some optional features are disabled - Removed some unused code from the open source version ### Bugfixes - Fixed a problem that could occur while reconnecting to a server, if the host's local address was switching between IPv4 and IPv6 - Fixed behavior of anjay_exit_offline() when called immediately after anjay_enter_offline() - disable_legacy_server_initiated_bootstrap is now properly respected when reconnecting after a connectivity failure - anjay_get_string() and anjay_execute_get_arg_value() now report buffer underruns more reliably - Added missing HTTP download timeout logic - Errors from the socket's send() method are now properly propagated through the CoAP layer - Fixed fatal errors that could occur during some specific CoAP error conditions, including during attempts to silently ignore incoming packets - Fixes to minor issues found by Coverity - Fixed working on platforms where malloc/calloc returns NULL when 0 bytes is requested - Fixed compatibility with some embedded compilers - Fixed interoperability with servers that use Uri-Path: '' to represent empty query path, as it seems to be permitted by the CoAP RFC - Fixed error codes used by the Portfolio object in the demo client - Minor fixes in integration testing framework - (commercial version only) Added missing support of LwM2M 1.1-specific resources of the Server object to its persistence functions - (commercial version only) Fixed various bugs in the bootstrapper module - (commercial version only) Additional verification of NIDD URLs - (commercial version only) More robust error handling in demo client's NIDD driver Also updates avs_commons to version 4.1, which includes the following changes, in addition to those mentioned above as "breaking changes" ### Features - Building without CMake is now officially supported - Added idiomatic C++ wrapper for AVS_LIST - New API for cryptographically safe PRNGs in avs_crypto - File-based streams and default log handler can now be disabled at compile time ### Bugfixes - Fixed a bug in the default socket implementation that prevented compiling on platforms without the IP_TOS socket option support - Fixed improper parsing of empty host in URLs - Some previously missed log messages now properly respect WITH_AVS_MICRO_LOGS - Fixed a bug in netbuf stream's error handling ## Anjay 2.2.5 (February 7th, 2020) ### Bugfixes - Updated avs_commons to version 4.0.3, which includes: - Fix for scope of avs_net_mbedtls_entropy_init() declaration in deps.h - Fix that prevented net_impl.c from compiling when IP_TOS is not available ## Anjay 2.2.4 (January 30th, 2020) ### Bugfixes - Fixed bugs that caused problems with compilation on macOS and Travis - avs_commons 4.0.2 include a fix to TLS backend data loader unit tests ### Features - Added support for "micro logs", removing most of log strings to save space, while retaining all the information useful for debugging - avs_commons 4.0.2 include support for proper RFC 6125-compliant validation of certificates against hostnames in the OpenSSL backend ## Anjay 2.2.3 (January 17th, 2020) ### Bugfixes - Fixed error in CoAP message ID assignment when a CoAP request was being sent from a response handler ### Features - Added anjay_resource_observation_status() API to the open source version - Added --server-public-key-file to the demo application ## Anjay 2.2.2 (December 20th, 2019) ### Bugfixes - Fixed an assertion failure on Cancel Observe arriving while sending a confirmable notification ### Improvements - Minor workarounds for various compiler warnings - Fixed unnecessary building of CoAP library test targets Also updates avs_commons to version 4.0.1, which includes the following changes: ### Bugfixes - Prevented certificate-based ciphersuites from being sent in Client Hello when PSK is used over the OpenSSL backend ### Features - Introduced "micro log" feature and AVS_DISPOSABLE_LOG() macro ## Anjay 2.2.1 (December 6th, 2019) This release synchronizes the open-source version of Anjay with the commercial branch, that has been in development since September 2018. Versions 2.0.0 (June 14th, 2019) through 2.2.0 have only been released to commercial customers. Note that the commercial version includes extensive support for LwM2M TS 1.1 features. These are not available in the open-source version and not described in this changelog. ### BREAKING CHANGES - Redesigned data model APIs - Replaced instance_it and instance_present handlers with list_instances - Simplified the instance_create API - IIDs for Create are always assigned by Anjay - user code no longer needs to allocate IDs - Removed the SSID argument - Replaced supported_rids field, resource_present, resource_it and resource_operations handlers with list_resources - Redesigned handling of Multiple-Instance Resources: - Old APIs for resource arrays are no longer available - Read and write handlers now take additional Resource Instance ID argument - Removed resource_dim handler - Introduced new resource_reset and list_resource_instances handlers - Renamed various types, in particular those related to LwM2M Attributes - Disallowed 65535 for all levels of IDs, as mandated in LwM2M TS 1.1 - Changed custom objects in demo client to use Object IDs from the range of Bulk Objects Reserved by AVSystem - Additional minor changes to the Test object semantics - It is now not possible to build both static and shared versions of Anjay as part of the same build - Heavily refactored error handling; some public APIs may require use of avs_error_t instead of plain integer error codes - Removed stubs of commercial-only APIs from the open source version ### Features - Entirely rewritten CoAP implementation - Register, Update, Request Bootstrap and confirmable Notify messages are now sent asynchronously and do not block other functionality - Notifications in JSON format now include timestamps - Added setting to prefer hierarchical Content-Format even when reading simple resources, to improve interoperability with certain server implementations - Added support for DTLS Connection ID extension if using a development version of mbed TLS that supports it - Added ability to configure (D)TLS ciphersuites - Added support for epmin and epmax attributes, specified in LwM2M TS 1.1 - Moved most of the Access Control mechanism logic from the access_control module (i.e., object implementation) to Anjay core - Changed `anjay_execute_get_*()` error codes to ANJAY_ERR constants so that they can be safely propagated by DM handler callbacks - Added generating notifications when Access Control object changes - New revision of persistent format of the Server object implementation, with redesigned handling of Binding resource - Improvements to demo client: - Notifications in Device object now work properly in the demo client - Demo client now supports different binding modes for different servers - Support for more resources in the Cellular Connectivity object - Support for Event Log object - Support for BinaryAppDataContainer object - Added script and build target for finding unused code ### Improvements - Improvements to logging: - Made it easier to compile Anjay without any logs - Made some log messages more descriptive - Tweaked log levels for better manageability - More robust downloader module, including improvements to HTTP ETag handling - Allowed Accept option in all incoming requests, for better interoperability with certain server implementations - Removed internal scheduler implementation, migrated to avs_sched from avs_commons - Made use of stack-allocated avs_persistence contexts - Refactored handling of server connections and data in Security and Server objects to be more in line with OMA guidelines - Refactored CMake scripts to make use of CMake 3 features - Extracted parts of dm_core.c to separate files - Improvements to internal symbol naming scheme - Simplified a lot of internal APIs, including I/O contexts and DM path handling - Various cleanups and improvements of Python-based integration test code ### Bugfixes - Added missing protocol version in responses to Bootstrap Discover on an object path - Various minor bugfixes Also updates avs_commons to version 4.0.0, which includes the following changes: ### Breaking changes - Removed ignoring context feature from avs_persistence - Refactored error handling, introducing the new avs_error_t concept - Renamed avs_stream_abstract_t to avs_stream_t - Renamed avs_net_abstract_socket_t to avs_net_socket_t ### Features - avs_net - Added support for Server Name Identification (D)TLS extension when using OpenSSL, and ability to enable or disable it explicitly - Added support for DTLS Connection ID extension if using a development version of mbed TLS that supports it - Added possibility to use custom mbed TLS entropy pool configuration - Added ability to configure (D)TLS ciphersuites - Added propagation of (D)TLS handshake alert codes to user code - Implemented accept() call for UDP sockets - Added avs_url_parse_lenient function and separate validation functions - avs_stream - Added avs_stream_membuf_take_ownership function - Added avs_stream_membuf_reserve function - avs_utils - Added avs_unhexlify function - avs_algorithm - Refactored base64 to support alternate alphabets and padding settings - avs_unit - Added support for and_then callbacks in mock sockets ### Improvements - Made logs render "..." at the end if truncated - Improved compatibility with various platforms, including Zephyr - Improved structure of CMake stage configuration, removed unused definitions - Reformatted entire codebase ### Bugfixes - Added extern "C" clauses missing in some files, added regression testing for that, fixed some other C++ incompatibilities - Fixed some improperly propagated error cases in HTTP client - Fixed problems with avs_net sockets not working for localhost if no non-loopback network interfaces are available - Fixed some potential NULL dereferences, assertion errors and various other fixes ## Anjay 1.16 (September 12th, 2019) ### Features - Added anjay_fw_update_set_result API for changing Firmware Update Result at runtime ### Improvements - Make Travis tests a bit faster by no longer using --track-origins=yes Valgrind argument, and also using pre-built Docker images ### Bugfixes - Disabled stdin buffering in demo application. Fixes occasional hangs in Python tests - Updated usages of deprecated `avs_persistence_*` functions - Added mbedx509 to pymbedtls dependencies - Fixed issues found by Coverity scan ## Anjay 1.15.5 (April 24th, 2019) ### Bug fixes - Updated avs_commons to 3.10.0, which includes a fix that drastically (one order of magnitude in some cases) changes the result of `avs_coap_exchange_lifetime()`. Previously the results were not in line with RFC7252 requirements. ### Improvements - The client will no longer wait indefinitely for Bootstrap Finish, but rather for an interval of at most EXCHANGE_LIFETIME seconds since last Bootstrap Interface operation. ## Anjay 1.15.4 (April 19th, 2019) ### Bugfixes - Fixed bug that caused Anjay fw_update module `perform_upgrade` handler to be called more than once in some cases ### Improvements - Anjay CMakeLists.txt does not use `${PROJECT_NAME}` anymore, improving compatibility with projects that include it as sources ## Anjay 1.15.3a (April 5th, 2019) ### Improvements - Documented retransmission parameters configuration in chapter "Retransmissions, timeouts & response caching" ## Anjay 1.15.3 (April 3rd, 2019) ### Bugfixes - Fixed some issues found by Coverity scan - Upgraded avs_commons to version 3.9.1, which includes: - Fix of usage of select() on platforms that do not support poll() - Added new `AVS_RESCHED_*` APIs ## Anjay 1.15.2 (March 25th, 2019) ### Improvements - Use https:// URI instead of git:// for avs_commons submodule. This allows fetching the submodule without setting up SSH keys. Fixes [#23](https://github.com/AVSystem/Anjay/issues/23) ## Anjay 1.15.1 (February 19th, 2019) ### Improvements - Anjay will never attempt to send Register/Update from anjay_delete any more. It used to happen when that message was scheduled to be sent at a time that happened to pass between last anjay_sched_run and anjay_delete calls. ## Anjay 1.15 (February 14th, 2019) ### BREAKING CHANGES - Updated avs_commons library to 3.9, which extracts an avs_stream_net library to break a dependency cycle between components. Applications that do not use CMake need to manually add libavs_stream_net.a to the linker command line. ### Bugfixes - PUT/POST requests with an Accept: CoAP option are no longer rejected as invalid. - Fixed a bug in HTTPS downloader that caused the download to hang indefinitely if the internal buffer of TLS socket is larger than 4KB and downloaded data length module TLS socket buffer size is larger than 4KB. - Aborting HTTP(S) downloads no longer waits for the whole transfer to complete. ## Anjay 1.14.2 (January 29th, 2019) ### Bugfixes - Fixed NULL pointer dereference in log messages displayed when an unknown attribute with no value is passed to Write-Attributes ## Anjay 1.14.1 (January 22nd, 2019) ### Features - Added command line flag to the demo client that disables use of stdin ### Improvements - Removed some code duplicated with avs_commons - Fixed some minor issues found by scan-build 7 - Simplified flow of code for Register, Update and Request Bootstrap operations - Reformatted example code ### Bugfixes - Fixed a bug that prevented attempt to retry DTLS handshake after failed Request Bootstrap operation in some scenarios when Server-Initiated Bootstrap is enabled - Fixed misleading, erroneous log message for when receiving CoAP messages time out - Fixed the documentation URL test randomly failing on some machines ## Anjay 1.14.0 (December 4th, 2018) ### Improvements - Added anjay_configuration_t::stored_notification_limit configuration option for limiting the maximum number of notifications stored when the client is offline. ## Anjay 1.13.1 (October 8th, 2018) ### Improvements - Fixed compilation warnings caused by unused variables / mismatching printf format specifiers ## Anjay 1.13.0 (October 4th, 2018) ### Breaking changes - anjay_configuration_t::max_icmp_failures field has been removed. - Changed the way connection errors are handled. Connections are now NOT automatically retried in most of the cases. Please refer to the documentation (Advanced tutorial -> Network error handling) for a summary of the new semantics. ### Improvements - Extensive refactor of the server connection handling subsystem. - Added timeout for the documentation URL check. - Prevented integration tests from running concurrently on Travis. ### Bugfixes - Fixed behaviour when the attributes are set so that pmax < pmin. - Fixed a bug that caused Discover operation on the Security object to erroneously work instead of causing 4.01 Unauthorized error as mandated by the spec. - Fixed compilation warnings on various compilers. - Upgraded avs_commons to version 3.8.2, which includes: - Fixes for proper propagation of avs_stream_close() errors. - Fixes for external library dependency checking. - Fixes for various compilation warnings. - Improved logs from the IP address stringification code. ## Anjay 1.12.1 (September 21st, 2018) Update avs_commons to 3.8.1 ## Anjay 1.12.0 (September 21st, 2018) ### Breaking changes - Updated AvsCommons to 3.8.0, which requires CMake 3.4.0 or higher. This means that Anjay requires CMake 3.4.0 or higher as well. - Running tests requires grequests (https://github.com/kennethreitz/grequests) now ### Features - Allowed configuration of UDP DTLS Handshake transmission parameters by anjay_configuration_t::udp_dtls_hs_tx_params field - Allowed configuration of firmware download CoAP transmission parameters by anjay_fw_update_handlers_t::get_coap_tx_params handler implemented by the user - Added sequence diagrams for library operations in documentation chapter "4.4. A few notes on general usage" ### Improvements - Reformatted the entire codebase with clang-format - Added more tests verifying demo client's behavior in situations with network connectivity issues - Explained in the demo application why file descriptors other than 0, 1, 2, are being closed ### Bugfixes - Fixed the cause of "could not stringify socket address" error ## Anjay 1.11.0 (September 4th, 2018) ### Breaking changes - `Removed ANJAY_BINDING_*` constants. Whenever used, they should now be replaced with plain c-strings, as follows: * `ANJAY_BINDING_U` -> `"U"`, * `ANJAY_BINDING_S` -> `"S"`, * `ANJAY_BINDING_US` -> `"US"`, * `ANJAY_BINDING_UQ` -> `"UQ"`, * `ANJAY_BINDING_SQ` -> `"SQ"`, * `ANJAY_BINDING_UQS` -> `"UQS"`, * `ANJAY_BINDING_NONE` -> `""` ### Features - Implemented anjay_attr_storage_purge(), to allow cleaning up Attribute Storage data without recreating a whole client instance - Implemented anjay_access_control_purge(), anjay_access_control_is_modified(), to allow better control over persistence - Updated avs_commons to version 3.7.1 ### Bugfixes - Fixed implementation of bytes resources in demo test object code - Added missing header in attr_storage.h ### Improvements - Added support for multiple object versions in lwm2m_object_registry.py script - Added some previously missing optional packages to README.md, required to run integration tests - Improved performance of integration tests - Improved documentation of internal server-related APIs - Improved unit tests API, specifically added macros that help building CoAP messages without the knowledge of exact packet encoding ## Anjay 1.10.4 (July 30th, 2018) ### Features - Added a configuration option that allows disabling Server-Initiated Bootstrap ### Bugfixes - Very short HTTP downloads now do not hang forever when the server does not close the TCP connection ### Improvements - Refactored management of bootstrap backoff state - Add tests for client behavior after receiving 4.03 Forbidden in response to Register request ## Anjay 1.10.3a (July 19th, 2018) ### Fixes - Fixed Travis build ## Anjay 1.10.3 (July 19th, 2018) ### Fixes - Fixed warning about uninitialized retval when compiling in SW4STM32 ### Improvements - Added validation of URLs in documentation - Added multiple test cases ## Anjay 1.10.2 (July 10th, 2018) ### Features - Updated AvsComons to version 3.6.2 which includes: * a more restrictive approach to symbols from POSIX or C standard library that should not be used in embedded environments * a fix of compilation on ARMCC * a fix of compile time warning on IAR ### Fixes - Fixed client behavior when received a 4.03 Forbidden on LwM2M Register - Fixed outdated reference to the LwM2M Specification in the documentation ### Improvements - Added more tests verifying client behavior in different scenarios ## Anjay 1.10.1 (June 29th, 2018) ### Fixes - Updated avs_commons to 3.6.1 - fixes compatibility issues in tests. ## Anjay 1.10.0 (June 28th, 2018) ### Features - Updated avs_commons to 3.6.0, which includes: * an abstraction layer over allocator routines, making it possible for the user to provide custom allocation/deallocation functions to be used by AvsCommons, * removal of ``AVS_LIST_CONFIG_ALLOC/FREE`` (they are now replaced with calls to ``avs_calloc()`` and ``avs_free()`` respectively), * removal of use of all ``time()`` calls, * removal of use of variable length array language feature, * default socket implementation refactor to use a nonblocking socket API, * ``avs_compat_threading`` module, implementing necessary synchronization primitives used across AvsCommons such as mutexes, * ``avs_cleanup_global_state()`` method, allowing to (optionally) free any global state implicitly instantiated in AvsCommons, * various compatibility fixes for FreeBSD. - Prevented ``anjay_schedule_reconnect()`` from sending Updates when they are not necessary, - Introduced an API (``anjay_get_socket_entries()``) allowing to obtain different kinds of sockets used by Anjay. ### Improvements - Removed all uses of ``malloc()/calloc()/realloc()/free()`` in favor of AvsCommons' memory layer abstraction, - Removed all occurrences of ``time()``, - Removed all uses of variable length arrays, - Improved non-GNU compilers compatibility, - Fixed multiple typos in documentation, - Fixed LwM2M-level error reporting for some LwM2M requests with unexpected payloads/content-formats (sane error codes are now returned instead of Internal Server Error), - Various compatibility fixes for FreeBSD. ### Fixes - Made bind address family depend on resolved numeric address rather than domain name, - Fixed project compilation when ``WITH_AVS_PERSISTENCE`` is disabled. ## Anjay 1.9.3 (May 29th, 2018) ### Improvements - Updated avs_commons to 3.4.3 - AVS_ASSERT and AVS_UNREACHABLE macros are now used for assertions that contain string literals. This prevents some compilers from emitting warnings about constant expressions being used in asserts. ## Anjay 1.9.2 (May 28th, 2018) ### Features - Updated avs_commons to 3.4.2 including various compatibility improvements - Added preliminary Windows support ### Bugfixes - Fixed many different casts between incompatible function types found by gcc 8.1 - Fixed compile errors caused by some (perfectly valid) CMake option configurations ### Improvements - Improved documentation of anjay_fw_update_perform_upgrade_t - Improved compatibility with compilers without typeof() support ## Anjay 1.9.1 (May 17th, 2018) ### Bugfixes - Fixed searching for scan-build ("make analyze" target) on Ubuntu 18.04 - Prevented sending superfluous notifications before cleaning up the library Also updates avs_commons to version 3.4.1, which includes the following changes: ### Bugfixes - Fixed bug in avs_http that prevented digest authentication from working - Fixed conditional compilation bugs in avs_net that made it impossible to disable certain features - Fixed bugs in avs_net unit tests that prevented them from passing on systems without JDK installed and when ran as root ### Improvements - Simplified TLS session persistence logic (removed dependency on mbed TLS session cache) - Fixed compilation warnings on mbed TLS >= 2.7 - Worked around false positive warnings from scan-build 6.0 ## Anjay 1.9.0 (May 11th, 2018) ### Features * anjay_notify_instances_changed() are now automatically called when manipulating pre-implemented Security and Server objects via module API * (commercial version only) Added support for persistence of server registration and notification state, designed for devices with aggressive power saving * (commercial version only) Added minimal CoAP file server to the command-line test server application ### Improvements * BREAKING API CHANGE: Security and Server object implementation modules no longer expose the anjay_dm_object_def_t pointer directly. * anjay_schedule_reconnect() now also reconnects downloads started using anjay_download() * Notifications with non-success message codes are now always sent as Confirmable messages to ensure consistency with server-side state * Integration tests now can be easily launched under rr for easier debugging * Added various informative log messages * Moved persistence subsystem to avs_commons and migrated to it * Fixed various compilation warnings and compatibility with different compilers * Major internal codebase refactoring, including: * Saner scheduler function signatures * Changed registration expiration time to use realtime clock instead of the monotonic one, which improves compatibility with sleep mode scenarios * Better hermetization of Observe handling implementation * Simplification and better hermetization of server connection handling * Reorganization of Registration Interface implementation * (commercial version only) More flexible management of commercial features during packaging Also updates avs_commons to version 3.4.0, which includes the following changes: ### Features * Moved persistence subsystem from Anjay and improved upon it: * Added support for persisting additional integer types * Added support for persisting containers with variable size elements * Added ability to check the type of persistence context ### Improvements * BREAKING API CHANGE: Changed TLS session resumption API so that it is now serialized to and deserialized from user-provided buffer * BREAKING API CHANGE: Simplified certificate and key configuration API * Note that this change dropped support for some libraries that implement "fake" OpenSSL API * Refactored avs_log() so that compiler will always parse TRACE-level logs, even if code generation for them is disabled * Fixed various compilation warnings and compatibility with different compilers * Fixed warnings when compiling with mbed TLS 2.3 and newer ### Bugfixes * Fixed critical bugs in CoAP option handling: * Potential integer overflow * Erroneous operation on big-endian machines * Added various missing NULL checks ## Anjay 1.8.2 (March 14th, 2018) ### Improvements - Added X.509 certificate support to pymbedtls Python module. - Made `BINDING_MODE_AS_STR` `const`. - Changed type of the buffer size argument of `anjay_execute_get_arg_value` to unsigned size_t. - Added a note on using LwIP socket integration layer to "Porting guide for non-POSIX platforms". - Added debug logs in instance validators for Security and Server LwM2M objects. - Added proper notifications for "Last Execute Arguments" resource of the Test Object in demo client. - Disabled Coverity scan on Travis. This avoids marking the build as failing despite all tests passing - Coverity service is "down for maintenance" since 2018-02-20, and there seems to be no information on when will it be up again. ### Bugfixes - Fixed `anjay_schedule_reconnect` behavior when called after the client gives up on reaching a LwM2M server. Previously, only a single reconnection attempt was attempted in such case, regardless of the `max_icmp_failures` configuration option. - Fixed compilation errors on compilers that do not support typeof. ## Anjay 1.8.1 (February 28th, 2018) ### Bugfixes - Fixed infinite loop of Register retransmissions when LwM2M Server ignores Updates and Client attempts to re-register - Fixed nested links in README.md ## Anjay 1.8.0 (February 21st, 2018) ### Features - Added get_security_info() handler to fw_update module, enabling configuration of security information for PULL-mode downloads over encrypted channels - Added anjay_fw_update_load_security_from_dm() which allows to match security information from the Security object based on URI ### Bugfixes - fw_update module will no longer connect to any HTTPS or CoAPS URI without authentication ## Anjay 1.7.3 (February 16th, 2018) ### Features - anjay_codegen is now able to generate C++ code ### Improvements - Updated timeouts in integration tests which should improve test result stability - Added log when security mode does not match server URI ## Anjay 1.7.2 (February 12th, 2018) ### Bugfixes - Fix anjay_all_connections_failed(). It is no longer returning true if no LwM2M Servers are configured. ## Anjay 1.7.1 (February 12th, 2018) ### Bugfixes - Skip retransmission loop in case of DTLS handshake timeout. DTLS packet retransmissions are handled within avs_net_socket_connect anyway, so there is no point in applying yet another exponential backoff loop. ## Anjay 1.7.0 (February 12th, 2018) ### Breaking changes - Reverted anjay_server_unreachable_handler_t as it has been found that using the handler correctly is close to being impossible. - Anjay no longer attempts to reach LwM2M Servers indefinitely. Maximum number of retries is now configured via anjay_configuration_t::max_icmp_failures, and by default is set to 7. ### Features - Introduced anjay_all_connections_failed() method, allowing the user to check if Anjay already gave up on trying to reach LwM2M Servers. ### Improvements - Downgrade log level in _anjay_dm_foreach_instance() to TRACE. ## Anjay 1.6.1 (January 29th, 2018) ### Features - Added anjay_server_unreachable_handler_t, that may be implemented by the user to control behavior of Anjay when it failed to connect to the LwM2M Server - Added new demo command line option "--server-unreachable-action" to be able to present the aforementioned handler in action - Added new demo command "enable-server" to enable Server of specified SSID - Added anjay_disable_server_with_timeout() ### Improvements - Improved compatibility with CMake 2.8.12 ### Bugfixes - Fixed Update interval: when lifetime is larger than `2*MAX_TRANSMIT_WAIT`, Update is now sent at `lifetime-MAX_TRANSMIT_WAIT` instead of `lifetime/2` - Fixed demo command line parsing functions - Fixed Travis problems and configuration on CentOS ## Anjay 1.6.0 (January 8th, 2018) ### Breaking changes - Replaced time_t with int32_t for period Attributes; fixes compatibility with platforms that have unsigned time_t ### Improvements - Removed useless symlinks that caused problems on Windows - Fixed usage of errno constants that are defined by avs_commons compatibility layer; fixes compatibility with platforms that don't declare sane errno constants - Improved compatibility with CMake 2.8 and CentOS ### Other - anjay_persistence_time() is now deprecated ## Anjay 1.5.2 (December 11th, 2017) ### Bugfixes - Fixed flow of flushing unsent notifications - Bug fixes in avs_commons, including: - Fixed undefined behavior in CoAP message cache - Fixed compatibility with compilers that don't support either stdatomic.h or GCC-style `__sync_*` builtins - Prevented CoAP back-off timer randomization from occasionally using negative numbers - Fixed minor error handling problems - Fixed link commands for TinyDTLS interoperability ### Improvements - Added WITH_TEST CMake flag - Improved compatibility with BSD operating systems - Improvements in avs_commons, including: - Fixed interoperability with HTTP servers that unexpectedly close connection ## Anjay 1.5.1 (November 27th, 2017) ### Features - Support HTTP download resumption ### Bugfixes - Fix some race conditions in integration tests that revealed themselves on slow machines - Fix anjay_download() retrying download forever even in case of terminal failures - Fix Firmware Update resetting by a null-byte Write - Stop scheduling useless LwM2M Updates to the Bootstrap Server ### Improvements - Test Firmware Update "not enough storage" scenario over CoAP - Test Firmware Update "connection lost during download" scenario over CoAP ## Anjay 1.5.0 (November 20th, 2017) ### Features - Extracted Firmware Update logic to a separate module so that the end user have to implement device-specific firmware updating logic only - Implemented API for firmware update resumption - Implemented stub of the portfolio object (in demo client) required for the OMA TestFest 2017 - Added support for DTLS session resumption as well as register-after-reconnect semantics - Added object versioning support - Added support for LwM2M Server URIs with Uri-Path and Uri-Query ### Bugfixes - Fixed travis builds on macOS - Fixed a few misleading statements in the documentation - Fixed anjay_codegen.py handling of Multiple Instance Resources - Fixed Content-Format for responses on Bootstrap Discover request - Fixed Write (replace) on Device object instance in demo client ### Improvements - Added more tests covering OMA TestFest 2017 test cases - Allowed configuring Security/Server IIDs from command line in demo - Allowed Bootstrap Delete on "/" - Added support for re-bootstrapping after failed registrations - Added anjay_server/security_object_is_modified simiar to anjay_attr_storage_is_modified - Updated porting guide - Replaced Internal Server Error responses with more specific error codes in a few places ### Other - Relaxed validator of Update location path, due to specification being unclear (see: https://github.com/OpenMobileAlliance/OMA_LwM2M_for_Developers/issues/230) ## Anjay 1.4.1 (October 16th, 2017) ### Features - Added CMake option `WITH_STATIC_DEPS_LINKED` that forces direct linkage of the library dependencies into the final target library - Migrated to a new time API implemented in avs_commons - Removed dependency on wget completely and used built-in downloader instead ### Bugfixes - Fixed symbol visibility checks ### Improvements - Renamed a few files to improve compatibility with various IDEs that do not handle files with non-unique naming across the entire project - Lowered severity of some log messages that were actually not that critical - Published example output from anjay_codegen.py script in the documentation ## Anjay 1.4.0 (September 8th, 2017) ### Features - New tools: lwm2m_object_registry.py and anjay_codegen.py, that allow automatic generation of object implementation stubs from LwM2M object definition XMLs - anjay_download() now supports HTTP(S), using the client from avs_commons - New APIs for querying Anjay's network traffic statistics - New APIs in attr_storage for direct attribute manipulation: - anjay_attr_storage_set_object_attrs() - anjay_attr_storage_set_instance_attrs() - anjay_attr_storage_set_resource_attrs() - CoAP implementation base has been refactored and moved to avs_commons, so that it can now be used standalone; Anjay code has been refactored accordingly ### Bugfixes - Fixed a bug that prevented anjay_get_string() from working as documented when the buffer was too short - Fixed conformance with RFC 7252 when sending error responses on observed resources (previously the Observe header was erroneously included) - Fixed various minor bugs found through static code analysis and compilation on various platforms ### Improvements - POSIX dependencies are now better isolated to ease porting onto non-POSIX platforms - Added more documentation, including: - New tutorial page (BT4) with general notes on library usage - Porting guide for non-POSIX platforms - Removed some superfluous log messages ## Anjay 1.3.3 (July 27th, 2017) ### Features - Implemented anjay_download() API for asynchronous CoAP(S) downloads - Added anjay_download example code - Added support for CoAP firmware download in demo application ### Bugfixes - Fixed Register/Update transport when changing Binding - Fixed lt/gt/st semantics according to https://github.com/OpenMobileAlliance/OMA_LwM2M_for_Developers/issues/191 - Fixed handling of unrelated BLOCK2 requests during a block-wise Read - Disallowed Write-Attributes requests if the server does not have Read access rights - Fixed build instructions for OS X in README ### Improvements - Added packet capture in Python tests - Added compilation instructions for Android - Made missing scan-build a fatal error if static analysis was enabled with a CMake flag - Integrated Coverity scan with Travis build - Allowed configuration of CoAP transmission parameters in anjay_new() ## Anjay 1.3.2 (July 13th, 2017) ### Features - Added custom Attribute "con" that may be used to enforce sending Confirmable Notifications for observed entities. - Added new chapter of the Tutorial about Executable Resources. - Added documentation subsection about relation LwM2M Discover and Attribute Storage. ### Improvements - Removed dependency to Boost.Python in tests, and migrated to pybind11 instead (included as a submodule). - Implemented sending Update after Lifetime Resource has changed (https://github.com/OpenMobileAlliance/OMA_LwM2M_for_Developers/issues/185) - Implemented proper Bootstrap Server Account purge logic (https://github.com/OpenMobileAlliance/OMA_LwM2M_for_Developers/issues/195) - Improved handling of CoAP Ping messages - they no longer produce error messages in the logs. - Documented `ANJAY_ERR_*` constants. - Added more NULL-assertions in the example demo client. - Enabled scan-build in make check by default. - Bumped all copyright years. ### Bugfixes - Fixed dead URLs in the documentation. - Fixed segfault when Bootstrap Discover was performed on a non-existing Object. - Fixed various minor issues found by the static analysis tools. - Fixed various compilation issues when compiled on older Android platforms. ## Anjay 1.3.1 (June 22nd, 2017) ### Features - Added `confirmable_notifications` field to `anjay_configuration_t`, enabling the client to only send LwM2M Notify as CoAP Confirmable messages. - Added retransmission detection using message cache with fixed size, configurable at library initialization. - Added Custom Object/Notifications tutorial with example client. - Added documentation page explaining message cache purpose and usage. ### Improvements - Added support for Write on Instance with superfluous TLV instance header. Anjay used to reject such requests as malformed. - Implemented ETS test 204 (Read with Accept: JSON). - Made attribute parsing stricter. Unknown or duplicate attributes now cause Bad Request responses - Splitted `anjay.h` header into smaller ones. Note: `anjay.h` now includes all other headers, so no changes to user code are required. ### Bugfixes - Fixed problem with duplicate request aborting block-wise Read responses. - Prevented tests from failing if Sphinx is not installed. - Fixed ConnectivityMonitoring.APN type to Multiple Resource. Fixes issue #10. - Fixed semantics of `lt` and `gt` attributes to match draft-ietf-core-dynlink document. - Fixed build issue when configuring build with -DWITH_BOOTSTRAP=OFF CMake option. - Fixed compilation warnings in relase builds. ## Anjay 1.3.0 (May 26th, 2017) ### Features * Added initial output-only support for JSON Content-Format * Added support for SMS-related Resources in security module * Refactored code to facilitate support for SMS Binding * Actual SMS Binding support now implemented in the commercial version ### Improvements * BREAKING API CHANGE: Replaced rid_bound and resource_supported handler with statically declared list of supported resources * Improved handling of DTLS backends in build system * 5.03 Service Unavailable is now sent instead of Reset when an unexpected request arrives while waiting for a response to Register or Update * Improvements in demo client: * Fixed Firmware Update object state machine * Added default Access Control entries ### Bugfixes * Fixed sending errnoeus 2.31 Continue if the last block payload chunk trigerred an error * Relaxed invariants for Client-Initiated Bootstrap as per https://github.com/OpenMobileAlliance/OMA_LwM2M_for_Developers/issues/164 * Prevented sending Object Instance list in Update messages if only changes are in the Security object * Fixed various bugs in access_control module ### Other * Fixed in-code version numbers ## Anjay 1.2.1 (April 10th, 2017) ### Features * Added automatic Update after object (de)register ### Bugfix * Fixed potential access violation in anjay_attr_storage_restore() ## Anjay 1.2.0 (April 3rd, 2017) ### Features * Added new API: anjay_unregister_object() ### Improvements * Added new constant: ANJAY_ERR_SERVICE_UNAVAILABLE * Made documentation linter work better when the MD5 file is broken * Refactored anjay_dm_object_def_t, introduced anjay_dm_handlers_t * Refactored attr_storage so that object wrapping is no longer necessary * Fixed Travis configuration and added macOS build * Refactored access_control implementation, simplified API * Removed the on_register object handler ## Anjay 1.1.1 (March 14th, 2017) ### Features * Added API to specify configuration for CoAP sockets, including overriding path MTU * Added support for new DTLS backend: tinydtls ### Improvements * When CoAP logic is blocked on BLOCK processing, 5.03 is now sent as response to unrelated requests * Anjay can now be compiled and run on macOS * Updated compliance to the released 1.0 specification * Added actual reconnection of sockets when using queue mode ### Bugfixes * Fixes to various issues found using static analysis * Fixed compliance issues with handling Bootstrap-Server Account Timeout * Removed automatic instantiation of Access Control object instances, as per https://github.com/OpenMobileAlliance/OMA_LwM2M_for_Developers/issues/192 * Fixed handling of integration test dependencies in CMake files * Workaroud for bug in mbed TLS, see https://github.com/Mbed-TLS/mbedtls/issues/843 ## Anjay 1.1.0 (February 22nd, 2017) ### Features * Demo client loads certificates from files * Added Bootstrap Awareness tutorial * Added Access Control tutorial * Added DTLS tutorial * Refactored Attribute handling to meet current LwM2M standard requirements * Improved out of source build support * Improved test coverage ### Bugfixes * Fixed coverage script * Fixed fuzz tests compilation & running on some configurations * Fixed mbedTLS detection in integration tests * Fixed a case where mismatched Resource ID was accepted in the TLV payload * Fixed compilation of tests under gcc-4.6 * Fixed detection of the required python version ### Other * Added missing license headers * Lowered loglevel of some less important messages * Refactored some of the macros and replaced them with real C code * Replaced all "LWM2M" with "LwM2M" * Other minor fixes ## Anjay 1.0.0 (February 8th, 2017) Initial release. ================================================ FILE: CMakeLists.txt ================================================ # Copyright 2017-2026 AVSystem # AVSystem Anjay LwM2M SDK # All rights reserved. # # Licensed under AVSystem Anjay LwM2M Client SDK - Non-Commercial License. # See the attached LICENSE file for details. cmake_minimum_required(VERSION 3.16) project(anjay C) set(ANJAY_VERSION "23f4cd115" CACHE STRING "Anjay library version") set(ANJAY_BINARY_VERSION 1.0.0) set(ANJAY_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(ANJAY_BUILD_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/output") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${ANJAY_BUILD_OUTPUT_DIR}/bin") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${ANJAY_BUILD_OUTPUT_DIR}/lib") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${ANJAY_BUILD_OUTPUT_DIR}/lib") set(CMAKE_USE_RELATIVE_PATHS TRUE) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(CheckFunctionExists) if(WITH_DEMO OR WITH_INTEGRATION_TESTS) # ensure Python venv is active include(cmake/requirePython3venv.cmake) endif() # On Linux, one needs to link libdl to use dlsym(). On BSD, it is not necessary, # and even harmful, since libdl does not exist. set(CMAKE_REQUIRED_INCLUDES "dlfcn.h") foreach(lib "" dl) message(STATUS "Looking for dlsym() in library: ${lib}") set(CMAKE_REQUIRED_LIBRARIES ${lib}) # check_function_exists caches its result; make sure the check is # actually repeated for each lib unset(HAVE_DLSYM CACHE) check_function_exists(dlsym HAVE_DLSYM) set(CMAKE_REQUIRED_LIBRARIES) if(HAVE_DLSYM) set(DETECTED_DLSYM_LIBRARY "${lib}" CACHE STRING "" FORCE) break() endif() endforeach() set(CMAKE_REQUIRED_INCLUDES) set(DLSYM_LIBRARY "${DETECTED_DLSYM_LIBRARY}" CACHE STRING "Name of the library containing dlsym() symbol") include(CMakeDependentOption) # compilation flags set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS OFF) option(WITH_EXTRA_WARNINGS "Enable extra compilation warnings" OFF) if(WITH_EXTRA_WARNINGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Winit-self -Wmissing-declarations -Wc++-compat -Wsign-conversion -Wconversion -Wcast-qual -Wvla -Wno-variadic-macros -Wno-long-long -Wshadow") if(CMAKE_C_COMPILER_ID MATCHES "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wjump-misses-init") endif() endif() include(${CMAKE_CURRENT_LIST_DIR}/deps/avs_commons/cmake/PosixFeatures.cmake) option(WITH_LIBRARY_SHARED "Compile Anjay as shared library" "${UNIX}") if(WITH_LIBRARY_SHARED) # It is not possible to create a shared library if -fPIC is not enabled for # either Anjay or any of its dependencies. set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() ################# TUNABLES ##################################################### set(MAX_PK_OR_IDENTITY_SIZE 2048 CACHE STRING "Maximum supported size (in bytes) of 'PK or Identity' Resource in Security object.") set(MAX_SECRET_KEY_SIZE 256 CACHE STRING "Maximum supported size (in bytes) of 'Secret Key' Resource in Security object.") # Following options refer to the payload of plaintext-encoded CoAP packets. set(MAX_DOUBLE_STRING_SIZE 512 CACHE STRING "Maximum supported length (in characters) of a string that can be parsed as a double-precision float value, including trailing nullbyte.") # CoAP guarantees that Uri-Path/Uri-Query/Location-Path/Location-Query option # values are at most 255 characters long, so default values will work for all # CoAP requests. Reducing these values is discouraged. set(MAX_URI_SEGMENT_SIZE 256 CACHE STRING "Maximum supported length (in characters) of a single Uri-Path/Location-Path CoAP option value, including trailing nullbyte.") set(MAX_URI_QUERY_SEGMENT_SIZE 256 CACHE STRING "Maximum supported length (in characters) of a single Uri-Query CoAP option value, including trailing nullbyte.") set(DTLS_SESSION_BUFFER_SIZE 1024 CACHE STRING "Size of the buffer that caches DTLS session information for resumption support.") set(MAX_OBSERVATION_SERVERS_REPORTED_NUMBER 0 CACHE STRING "Maximum number of servers observing a given Resource listed by anjay_resource_observation_status() function.") set(ANJAY_DEFAULT_SEND_FORMAT AVS_COAP_FORMAT_NONE CACHE STRING "Default value of Content-Format used in Send messages. Value AVS_COAP_FORMAT_NONE(65535) means no default value.") set(MAX_HOLDOFF_TIME 20 CACHE STRING "Upper limit for the Hold Off Time for the Bootstrap connection.") ################# FEATURES THAT REQUIRE LIBRARY CONFIGURATION ################## option(WITH_AVS_PERSISTENCE "Enable support for persisting objects data" ON) option(WITH_BOOTSTRAP "Enable LwM2M Bootstrap Interface support" ON) option(WITHOUT_TLV "Disable support for TLV content format" OFF) option(WITH_DOWNLOADER "Enable support for downloader API" ON) cmake_dependent_option(WITH_HTTP_DOWNLOAD "Enable support for HTTP(S) downloads" OFF "WITH_DOWNLOADER" OFF) option(WITH_LWM2M11 "Enable support for LwM2M 1.1" ON) cmake_dependent_option(WITH_LWM2M12 "Enable support for LwM2M 1.2 features" ON "WITH_LWM2M11" OFF) # NOTE: WITH_EST is moved below due to dependencies set(THREAD_SAFETY_DEFAULT OFF) if(WIN32 OR UNIX) set(THREAD_SAFETY_DEFAULT ON) endif() option(WITH_THREAD_SAFETY "Enable guarding of all accesses to anjay_t with a mutex" "${THREAD_SAFETY_DEFAULT}") ################# LIBRARIES #################################################### # avs_commons required components. set(AVS_COMMONS_COMPONENTS algorithm crypto list buffer net sched stream stream_net url utils compat_threading) if(WITH_HTTP_DOWNLOAD) list(APPEND AVS_COMMONS_COMPONENTS http) endif() if(WITH_AVS_PERSISTENCE) list(APPEND AVS_COMMONS_COMPONENTS persistence) endif() if(WITH_MODULE_sim_bootstrap) list(APPEND AVS_COMMONS_COMPONENTS stream_md5) endif() if(NOT DEFINED WITH_AVS_RBTREE OR WITH_AVS_RBTREE) set(WITH_AVS_RBTREE ON CACHE INTERNAL "") endif() set(AVS_COMMONS_LIBRARIES) foreach(_component ${AVS_COMMONS_COMPONENTS}) string(TOUPPER ${_component} _component_uppercase) # Enable compilation of each component. set(WITH_AVS_${_component_uppercase} ON CACHE INTERNAL "") # And mark it as a weak dependency. list(APPEND AVS_COMMONS_LIBRARIES avs_${_component}) endforeach() option(WITH_LOCAL_AVS_COMMONS "Use locally installed avs_commons libraries" OFF) if(WITH_LOCAL_AVS_COMMONS) # WITH_TEST is also defined in Commons # it defaults to ON there, but if we have external avs_commons, let's better not depend on avs_unit by default cmake_dependent_option(WITH_TEST "Enable Anjay tests" OFF WITH_AVS_UNIT OFF) if(WITH_TEST) set(AVS_COMMONS_COMPONENTS ${AVS_COMMONS_COMPONENTS} unit) find_program(VALGRIND_EXECUTABLE valgrind) cmake_dependent_option(WITH_VALGRIND "Enable usage of valgrind during unit tests" OFF "VALGRIND_EXECUTABLE" OFF) endif() find_package(avs_commons COMPONENTS ${AVS_COMMONS_COMPONENTS} REQUIRED) function(read_avs_commons_compile_time_option OPTION_NAME) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/avs_commons_check.c "#include \nint main() {\n#ifndef ${OPTION_NAME}\nint error[-1];\n#endif\nreturn 0; }\n") get_target_property(INCLUDE_DIRS avs_utils INTERFACE_INCLUDE_DIRECTORIES) try_compile(OPTION_VALUE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/avs_commons_check.c CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${INCLUDE_DIRS}") set(${OPTION_NAME} ${OPTION_VALUE} CACHE INTERNAL "") endfunction() read_avs_commons_compile_time_option(AVS_COMMONS_HAVE_VISIBILITY) read_avs_commons_compile_time_option(AVS_COMMONS_STREAM_WITH_FILE) set(WITH_AVS_STREAM_FILE "${AVS_COMMONS_STREAM_WITH_FILE}") read_avs_commons_compile_time_option(AVS_COMMONS_SCHED_THREAD_SAFE) set(WITH_SCHEDULER_THREAD_SAFE "${AVS_COMMONS_SCHED_THREAD_SAFE}") read_avs_commons_compile_time_option(AVS_COMMONS_NET_WITH_POSIX_AVS_SOCKET) set(WITH_POSIX_AVS_SOCKET "${AVS_COMMONS_NET_WITH_POSIX_AVS_SOCKET}") else() set(_DTLS_BACKENDS "mbedtls" "openssl" "tinydtls" "custom") set(DTLS_BACKEND "mbedtls" CACHE STRING "DTLS backend to use; possible values: ${_DTLS_BACKENDS}") # Reset enabled backends first, to avoid issues with CMakeCache set(WITH_CUSTOM_TLS OFF CACHE INTERNAL "") set(WITH_MBEDTLS OFF CACHE INTERNAL "") set(WITH_OPENSSL OFF CACHE INTERNAL "") set(WITH_TINYDTLS OFF CACHE INTERNAL "") string(TOLOWER "${DTLS_BACKEND}" _DTLS_BACKEND_LOWERCASE) if(_DTLS_BACKEND_LOWERCASE STREQUAL "mbedtls") set(WITH_MBEDTLS ON CACHE INTERNAL "") elseif(_DTLS_BACKEND_LOWERCASE STREQUAL "openssl") set(OPENSSL_CUSTOM_CIPHERS_ENABLED ON CACHE INTERNAL "") set(WITH_OPENSSL ON CACHE INTERNAL "") set(WITH_OPENSSL_CUSTOM_CIPHERS "ECDHE-ECDSA-AES128-CCM8:PSK-AES128-CCM8" CACHE INTERNAL "") elseif(_DTLS_BACKEND_LOWERCASE STREQUAL "tinydtls") set(WITH_TINYDTLS ON CACHE INTERNAL "") elseif(_DTLS_BACKEND_LOWERCASE STREQUAL "custom") set(WITH_CUSTOM_TLS ON CACHE INTERNAL "") elseif(NOT _DTLS_BACKEND_LOWERCASE STREQUAL "") message(FATAL_ERROR "Unsupported DTLS backend: ${_DTLS_BACKEND_LOWERCASE}; possible values: ${_DTLS_BACKENDS}") endif() message(STATUS "DTLS backend: ${_DTLS_BACKEND_LOWERCASE}") if(WITH_MBEDTLS OR WITH_CUSTOM_TLS) set(SSL_ERROR_API_DEFAULT ON) else() set(SSL_ERROR_API_DEFAULT OFF) endif() endif() option(WITH_AVS_COAP_TCP "Enable CoAP over TCP support" "${WITH_LWM2M11}") option(WITH_CONN_STATUS_API "Enable support for the experimental anjay_get_server_connection_status() API and related callback." ON) option(WITH_SSL_ERROR_API "Enable support for the experimental server SSL error callback." "${SSL_ERROR_API_DEFAULT}") set(ENABLE_ADVANCED_CRYPTO OFF) option(WITH_AVS_LOG "Enable logging support" ON) if(NOT WITH_LOCAL_AVS_COMMONS) set(WITH_SCHEDULER_THREAD_SAFE "${WITH_THREAD_SAFETY}" CACHE INTERNAL "") set(WITH_AVS_CRYPTO_ADVANCED_FEATURES ${ENABLE_ADVANCED_CRYPTO} CACHE INTERNAL "") add_subdirectory(deps/avs_commons) endif() option(WITH_LOCAL_AVS_COAP "Use locally installed avs_coap library" OFF) if(WITH_LOCAL_AVS_COAP) find_package(avs_coap REQUIRED) function(read_avs_coap_compile_time_option OPTION_NAME) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/avs_coap_check.c "#include \nint main() {\n#ifndef ${OPTION_NAME}\nint error[-1];\n#endif\nreturn 0; }\n") get_target_property(INCLUDE_DIRS avs_coap INTERFACE_INCLUDE_DIRECTORIES) try_compile(OPTION_VALUE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/avs_coap_check.c CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${INCLUDE_DIRS}") set(${OPTION_NAME} ${OPTION_VALUE} CACHE INTERNAL "") endfunction() read_avs_coap_compile_time_option(WITH_AVS_COAP_UDP) read_avs_coap_compile_time_option(WITH_AVS_COAP_TCP) read_avs_coap_compile_time_option(WITH_AVS_COAP_OBSERVE) read_avs_coap_compile_time_option(WITH_AVS_COAP_BLOCK) read_avs_coap_compile_time_option(WITH_AVS_COAP_STREAMING_API) else() add_subdirectory(deps/avs_coap) endif() if(NOT WITH_AVS_COAP_STREAMING_API) message(FATAL_ERROR "avs_coap streaming API is required, but disabled") endif() if(WITH_AVS_LOG) list(APPEND AVS_COMMONS_LIBRARIES avs_log) endif() ################# FEATURES ##################################################### option(WITH_ACCESS_CONTROL "Enable core support for Access Control mechanism" ON) option(WITH_DISCOVER "Enable support for LwM2M Discover operation" ON) cmake_dependent_option(WITH_OBSERVE "Enable support for Information Reporting interface (Observe)" ON "WITH_AVS_COAP_OBSERVE" OFF) cmake_dependent_option(WITH_CON_ATTR "Enable support for the Confirmable Notification attribute" "${WITH_LWM2M12}" WITH_OBSERVE OFF) option(WITH_LEGACY_CONTENT_FORMAT_SUPPORT "Enable support for pre-LwM2M 1.0 CoAP Content-Format values (1541-1543)" OFF) option(WITH_LWM2M_JSON "Enable support for LwM2M 1.0 JSON (output only)" ON) option(WITHOUT_PLAINTEXT "Disable support for Plain Text content format" OFF) option(WITHOUT_DEREGISTER "Disable use of the Deregister message" OFF) option(WITHOUT_IP_STICKINESS "Disable support for IP stickiness" OFF) option(WITHOUT_COMPOSITE_OPERATIONS "Disable composite operations" OFF) cmake_dependent_option(WITH_SENML_JSON "Enable support for SenML JSON content format" ON WITH_LWM2M11 OFF) cmake_dependent_option(WITH_CBOR "Enable support for CBOR and SenML CBOR content formats" ON WITH_LWM2M11 OFF) cmake_dependent_option(WITH_LWM2M_GATEWAY "Enable support /25 LwM2M Gateway Object" OFF "WITH_LWM2M11;NOT WITH_CORE_PERSISTENCE" OFF) cmake_dependent_option(WITH_BOOTSTRAP_PACK "Enable LwM2M Bootstrap-Pack support" ON "WITH_LWM2M12;WITH_BOOTSTRAP;WITH_CBOR OR WITH_SENML_JSON" OFF) cmake_dependent_option(WITH_SEND "Enable support for LwM2M 1.1 Send operation" ON "WITH_CBOR OR WITH_SENML_JSON" OFF) cmake_dependent_option(WITH_OBSERVATION_ATTRIBUTES "Enable support for Observation Attributes" ON "WITH_OBSERVE;WITH_LWM2M12" OFF) option(WITHOUT_QUEUE_MODE_AUTOCLOSE "Disable automatic closing of server connection sockets after MAX_TRANSMIT_WAIT of inactivity" OFF) cmake_dependent_option(WITH_OBSERVATION_STATUS "Enable support for anjay_resource_observation_status() API" ON "WITH_OBSERVE" OFF) cmake_dependent_option(WITH_COAP_DOWNLOAD "Enable support for CoAP(S) downloads" ON WITH_DOWNLOADER OFF) cmake_dependent_option(WITH_ANJAY_LOGS "Enable logging support" ON WITH_AVS_LOG OFF) cmake_dependent_option(WITH_ANJAY_TRACE_LOGS "Enable logging support" ON "WITH_ANJAY_LOGS;NOT EXTERNAL_LOG_LEVELS_HEADER" OFF) cmake_dependent_option(AVS_LOG_WITH_TRACE "Enable TRACE level logging" OFF WITH_AVS_LOG OFF) cmake_dependent_option(WITH_INTERNAL_LOGS "Enable logging from inside AVSystem Commons libraries" ON WITH_AVS_LOG OFF) cmake_dependent_option(WITH_INTERNAL_TRACE "Enable TRACE-level logs inside AVSystem Commons libraries" ON AVS_LOG_WITH_TRACE OFF) option(WITH_NET_STATS "Enable measuring amount of LwM2M traffic" ON) option(WITH_COMMUNICATION_TIMESTAMP_API "Enable communication timestamps" ON) option(WITH_EVENT_LOOP "Enable default implementation of the event loop" "${WITH_POSIX_AVS_SOCKET}") if(DEFINED WITH_MODULE_attr_storage) message(FATAL_ERROR "WITH_MODULE_attr_storage has been removed since Anjay 3.0. Please use WITH_ATTR_STORAGE instead.") endif() cmake_dependent_option(WITH_ATTR_STORAGE "Enable automatic attribute storage" ON WITH_AVS_PERSISTENCE OFF) option(WITH_SECURITY_STRUCTURED "Enable support for avs_crypto types in the data model" ON) # ANJAY_MUTEX_LOCK() variant based on nested functions file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/nested_funcs.c" "int main() { int nested(void) { return 0; } return nested(); }") try_compile(HAVE_NESTED_FUNCTIONS "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp" "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/nested_funcs.c") set(WITH_NESTED_FUNCTION_MUTEX_LOCKS_DEFAULT OFF) if(WITH_EXTRA_WARNINGS AND NOT CMAKE_BUILD_TYPE MATCHES "Rel") set(WITH_NESTED_FUNCTION_MUTEX_LOCKS_DEFAULT ON) endif() cmake_dependent_option(WITH_NESTED_FUNCTION_MUTEX_LOCKS "Enable mutex locking variant based on nested functions (provides more compiler warnings)" "${WITH_NESTED_FUNCTION_MUTEX_LOCKS_DEFAULT}" "WITH_THREAD_SAFETY;HAVE_NESTED_FUNCTIONS;AVS_COMMONS_HAVE_PRAGMA_DIAGNOSTIC" OFF) # This option is not exposed in anjay_config.h, # as it is basically useless outside of development of the Anjay library itself if(WITH_NESTED_FUNCTION_MUTEX_LOCKS) add_definitions(-DANJAY_WITH_NESTED_FUNCTION_MUTEX_LOCKS) endif() ################# MODULES ###################################################### cmake_dependent_option(WITH_MODULE_access_control "Access control object implementation module" ON WITH_ACCESS_CONTROL OFF) option(WITH_MODULE_ipso_objects "Generic implementation of certain kinds of IPSO objects" ON) option(WITH_MODULE_ipso_objects_v2 "Experimental generic implementation of certain kinds of IPSO objects" ON) option(WITH_MODULE_security "Security object module" ON) option(WITH_MODULE_server "Server object module" ON) option(WITH_MODULE_fw_update "Firmware Update object module" ON) cmake_dependent_option(WITHOUT_MODULE_fw_update_PUSH_MODE "Disable support for PUSH mode Firmware Update" OFF "WITH_MODULE_fw_update;WITH_DOWNLOADER" OFF) cmake_dependent_option(WITH_MODULE_fw_update_v11_resources "Enable support for optional resources in Firmware Update object that were added in LwM2M 1.1" OFF "WITH_LWM2M11" OFF) cmake_dependent_option(WITH_MODULE_factory_provisioning "Factory provisioning module" ON "WITH_BOOTSTRAP;WITH_CBOR" OFF) option(WITH_MODULE_advanced_fw_update "Advanced Firmware Update object module" OFF) option(WITH_MODULE_sw_mgmt "Software Management object module" OFF) ################# CODE ######################################################### add_library(anjay include_public/anjay/access_control.h include_public/anjay/advanced_fw_update.h include_public/anjay/anjay.h include_public/anjay/attr_storage.h include_public/anjay/core.h include_public/anjay/dm.h include_public/anjay/download.h include_public/anjay/factory_provisioning.h include_public/anjay/fw_update.h include_public/anjay/io.h include_public/anjay/ipso_objects.h include_public/anjay/ipso_objects_v2.h include_public/anjay/lwm2m_gateway.h include_public/anjay/lwm2m_send.h include_public/anjay/security.h include_public/anjay/server.h include_public/anjay/stats.h include_public/anjay/sw_mgmt.h src/anjay_config_log.h src/anjay_init.h src/anjay_modules/anjay_access_utils.h src/anjay_modules/anjay_bootstrap.h src/anjay_modules/anjay_dm_utils.h src/anjay_modules/anjay_io_utils.h src/anjay_modules/anjay_notify.h src/anjay_modules/anjay_raw_buffer.h src/anjay_modules/anjay_sched.h src/anjay_modules/anjay_servers.h src/anjay_modules/anjay_time_defs.h src/anjay_modules/anjay_utils_core.h src/anjay_modules/dm/anjay_execute.h src/anjay_modules/dm/anjay_modules.h src/core/anjay_access_utils.c src/core/anjay_access_utils_private.h src/core/anjay_bootstrap_core.c src/core/anjay_bootstrap_core.h src/core/anjay_core.c src/core/anjay_core.h src/core/anjay_dm_core.c src/core/anjay_dm_core.h src/core/anjay_downloader.h src/core/anjay_event_loop.c src/core/anjay_io_core.c src/core/anjay_io_core.h src/core/anjay_io_utils.c src/core/anjay_lwm2m_send.c src/core/anjay_lwm2m_send.h src/core/anjay_notify.c src/core/anjay_raw_buffer.c src/core/anjay_servers_inactive.h src/core/anjay_servers_private.h src/core/anjay_servers_reload.h src/core/anjay_servers_utils.c src/core/anjay_servers_utils.h src/core/anjay_stats.c src/core/anjay_stats.h src/core/anjay_utils_core.c src/core/anjay_utils_private.h src/core/attr_storage/anjay_attr_storage.h src/core/attr_storage/anjay_attr_storage_persistence.c src/core/attr_storage/anjay_attr_storage_private.h src/core/attr_storage/anjay_attr_storage.c src/core/coap/anjay_content_format.h src/core/coap/anjay_msg_details.h src/core/dm/anjay_discover.c src/core/dm/anjay_discover.h src/core/dm/anjay_dm_attributes.c src/core/dm/anjay_dm_attributes.h src/core/dm/anjay_dm_create.c src/core/dm/anjay_dm_create.h src/core/dm/anjay_dm_execute.c src/core/dm/anjay_dm_execute.h src/core/dm/anjay_dm_handlers.c src/core/dm/anjay_dm_read.c src/core/dm/anjay_dm_read.h src/core/dm/anjay_dm_write_attrs.c src/core/dm/anjay_dm_write_attrs.h src/core/dm/anjay_dm_write.c src/core/dm/anjay_dm_write.h src/core/dm/anjay_modules.c src/core/dm/anjay_query.c src/core/dm/anjay_query.h src/core/downloader/anjay_coap.c src/core/downloader/anjay_downloader.c src/core/downloader/anjay_http.c src/core/downloader/anjay_private.h src/core/io/anjay_base64_out.c src/core/io/anjay_base64_out.h src/core/io/anjay_batch_builder.c src/core/io/anjay_batch_builder.h src/core/io/anjay_cbor_in.c src/core/io/anjay_cbor_out.c src/core/io/anjay_common.c src/core/io/anjay_common.h src/core/io/anjay_corelnk.c src/core/io/anjay_corelnk.h src/core/io/anjay_dynamic.c src/core/io/anjay_input_buf.c src/core/io/anjay_json_encoder.c src/core/io/anjay_json_like_decoder.c src/core/io/anjay_json_like_decoder.h src/core/io/anjay_json_like_decoder_vtable.h src/core/io/anjay_lwm2m_cbor_in.c src/core/io/anjay_lwm2m_cbor_out.c src/core/io/anjay_opaque.c src/core/io/anjay_output_buf.c src/core/io/anjay_senml_in.c src/core/io/anjay_senml_like_encoder.c src/core/io/anjay_senml_like_encoder.h src/core/io/anjay_senml_like_encoder_vtable.h src/core/io/anjay_senml_like_out.c src/core/io/anjay_text.c src/core/io/anjay_tlv.h src/core/io/anjay_tlv_in.c src/core/io/anjay_tlv_out.c src/core/io/anjay_vtable.h src/core/io/cbor/anjay_cbor_encoder_ll.c src/core/io/cbor/anjay_cbor_encoder_ll.h src/core/io/cbor/anjay_cbor_types.h src/core/io/cbor/anjay_json_like_cbor_decoder.c src/core/io/cbor/anjay_json_like_cbor_decoder.h src/core/io/cbor/anjay_senml_cbor_encoder.c src/core/io/json/anjay_json_decoder.c src/core/io/json/anjay_json_decoder.h src/core/observe/anjay_observe_core.c src/core/observe/anjay_observe_core.h src/core/observe/anjay_observe_internal.h src/core/observe/anjay_observe_planning.c src/core/servers/anjay_activate.c src/core/servers/anjay_activate.h src/core/servers/anjay_connection_ip.c src/core/servers/anjay_connections.c src/core/servers/anjay_connections.h src/core/servers/anjay_connections_internal.h src/core/servers/anjay_register.c src/core/servers/anjay_register.h src/core/servers/anjay_reload.c src/core/servers/anjay_security_generic.c src/core/servers/anjay_security.h src/core/servers/anjay_server_connections.c src/core/servers/anjay_server_connections.h src/core/servers/anjay_servers_internal.c src/core/servers/anjay_servers_internal.h src/modules/access_control/anjay_access_control_handlers.c src/modules/access_control/anjay_access_control_persistence.c src/modules/access_control/anjay_mod_access_control.c src/modules/access_control/anjay_mod_access_control.h src/modules/advanced_fw_update/anjay_advanced_fw_update.c src/modules/factory_provisioning/anjay_provisioning.c src/modules/fw_update/anjay_fw_update.c src/modules/ipso/anjay_ipso_3d_sensor.c src/modules/ipso/anjay_ipso_basic_sensor.c src/modules/ipso/anjay_ipso_button.c src/modules/ipso_v2/anjay_ipso_v2_3d_sensor.c src/modules/ipso_v2/anjay_ipso_v2_basic_sensor.c src/modules/lwm2m_gateway/anjay_lwm2m_gateway.c src/modules/security/anjay_mod_security.c src/modules/security/anjay_mod_security.h src/modules/security/anjay_security_persistence.c src/modules/security/anjay_security_transaction.c src/modules/security/anjay_security_transaction.h src/modules/security/anjay_security_utils.c src/modules/security/anjay_security_utils.h src/modules/server/anjay_mod_server.c src/modules/server/anjay_mod_server.h src/modules/server/anjay_server_persistence.c src/modules/server/anjay_server_transaction.c src/modules/server/anjay_server_transaction.h src/modules/server/anjay_server_utils.c src/modules/server/anjay_server_utils.h src/modules/sw_mgmt/anjay_sw_mgmt.c ) target_include_directories(anjay PUBLIC $ $ $) target_include_directories(anjay PRIVATE $) target_link_libraries(anjay PUBLIC avs_coap ${AVS_COMMONS_LIBRARIES}) set_property(TARGET anjay APPEND PROPERTY COMPILE_DEFINITIONS "ANJAY_VERSION=\"${ANJAY_VERSION}\"") ################# LINK ######################################################### set(ANJAY_WITH_ACCESS_CONTROL "${WITH_ACCESS_CONTROL}") set(ANJAY_WITH_ATTR_STORAGE "${WITH_ATTR_STORAGE}") set(ANJAY_WITH_BOOTSTRAP "${WITH_BOOTSTRAP}") set(ANJAY_WITH_BOOTSTRAP_PACK "${WITH_BOOTSTRAP_PACK}") set(ANJAY_WITH_COAP_DOWNLOAD "${WITH_COAP_DOWNLOAD}") set(ANJAY_WITH_CON_ATTR "${WITH_CON_ATTR}") set(ANJAY_WITH_DISCOVER "${WITH_DISCOVER}") set(ANJAY_WITH_DOWNLOADER "${WITH_DOWNLOADER}") set(ANJAY_WITH_HTTP_DOWNLOAD "${WITH_HTTP_DOWNLOAD}") set(ANJAY_WITH_LEGACY_CONTENT_FORMAT_SUPPORT "${WITH_LEGACY_CONTENT_FORMAT_SUPPORT}") set(ANJAY_WITH_LOGS "${WITH_ANJAY_LOGS}") set(ANJAY_WITH_LWM2M_JSON "${WITH_LWM2M_JSON}") set(ANJAY_WITHOUT_TLV "${WITHOUT_TLV}") set(ANJAY_WITHOUT_PLAINTEXT "${WITHOUT_PLAINTEXT}") set(ANJAY_WITHOUT_DEREGISTER "${WITHOUT_DEREGISTER}") set(ANJAY_WITHOUT_IP_STICKINESS "${WITHOUT_IP_STICKINESS}") set(ANJAY_WITHOUT_COMPOSITE_OPERATIONS "${WITHOUT_COMPOSITE_OPERATIONS}") set(ANJAY_WITH_MODULE_ACCESS_CONTROL "${WITH_MODULE_access_control}") set(ANJAY_WITH_MODULE_IPSO_OBJECTS "${WITH_MODULE_ipso_objects}") set(ANJAY_WITH_MODULE_IPSO_OBJECTS_V2 "${WITH_MODULE_ipso_objects_v2}") set(ANJAY_WITH_MODULE_FW_UPDATE "${WITH_MODULE_fw_update}") set(ANJAY_WITH_MODULE_FW_UPDATE_V11_RESOURCES "${WITH_MODULE_fw_update_v11_resources}") set(ANJAY_WITH_MODULE_ADVANCED_FW_UPDATE "${WITH_MODULE_advanced_fw_update}") set(ANJAY_WITHOUT_MODULE_FW_UPDATE_PUSH_MODE "${WITHOUT_MODULE_fw_update_PUSH_MODE}") set(ANJAY_WITH_MODULE_SECURITY "${WITH_MODULE_security}") set(ANJAY_WITH_MODULE_SERVER "${WITH_MODULE_server}") set(ANJAY_WITH_MODULE_SW_MGMT "${WITH_MODULE_sw_mgmt}") set(ANJAY_WITH_NET_STATS "${WITH_NET_STATS}") set(ANJAY_WITH_COMMUNICATION_TIMESTAMP_API "${WITH_COMMUNICATION_TIMESTAMP_API}") set(ANJAY_WITH_EVENT_LOOP "${WITH_EVENT_LOOP}") set(ANJAY_WITH_OBSERVATION_STATUS "${WITH_OBSERVATION_STATUS}") set(ANJAY_WITH_OBSERVE "${WITH_OBSERVE}") set(ANJAY_WITH_THREAD_SAFETY "${WITH_THREAD_SAFETY}") set(ANJAY_WITH_TRACE_LOGS "${WITH_ANJAY_TRACE_LOGS}") set(ANJAY_WITH_MODULE_FACTORY_PROVISIONING "${WITH_MODULE_factory_provisioning}") set(ANJAY_WITH_CBOR "${WITH_CBOR}") set(ANJAY_WITH_LWM2M11 "${WITH_LWM2M11}") set(ANJAY_WITH_LWM2M12 "${WITH_LWM2M12}") set(ANJAY_WITH_OBSERVATION_ATTRIBUTES "${WITH_OBSERVATION_ATTRIBUTES}") set(ANJAY_WITH_SECURITY_STRUCTURED "${WITH_SECURITY_STRUCTURED}") set(ANJAY_WITH_SEND "${WITH_SEND}") set(ANJAY_WITH_SENML_JSON "${WITH_SENML_JSON}") set(ANJAY_WITHOUT_QUEUE_MODE_AUTOCLOSE "${WITHOUT_QUEUE_MODE_AUTOCLOSE}") set(ANJAY_WITH_CONN_STATUS_API "${WITH_CONN_STATUS_API}") set(ANJAY_WITH_SSL_ERROR_API "${WITH_SSL_ERROR_API}") set(ANJAY_WITH_LWM2M_GATEWAY "${WITH_LWM2M_GATEWAY}") configure_file(include_public/anjay/anjay_config.h.in include_public/anjay/anjay_config.h) if(BUILD_SHARED_LIBS) set_target_properties(anjay PROPERTIES VERSION ${ANJAY_BINARY_VERSION}) if(AVS_COMMONS_HAVE_VISIBILITY) get_property(LINK_FLAGS TARGET anjay PROPERTY LINK_FLAGS) set_property(TARGET anjay PROPERTY LINK_FLAGS "${LINK_FLAGS} -Wl,--exclude-libs,ALL") endif() if(APPLE) get_property(LINK_FLAGS TARGET anjay PROPERTY LINK_FLAGS) set_property(TARGET anjay PROPERTY LINK_FLAGS "${LINK_FLAGS} -Wl,-undefined,dynamic_lookup") endif() endif() ################# DEMO ######################################################### set(DEMO_DEPENDENCIES WITH_AVS_LOG WITH_EVENT_LOOP # WITH_SCHEDULER_THREAD_SAFE WITH_MODULE_security WITH_MODULE_server) cmake_dependent_option(WITH_DEMO "Compile DEMO applications" ON "${DEMO_DEPENDENCIES}" OFF) if(WITH_DEMO) find_program(OPENSSL_EXECUTABLE openssl) if(OPENSSL_EXECUTABLE) if(NOT EXISTS "${ANJAY_BUILD_OUTPUT_DIR}/certs/client.crt.der") execute_process(COMMAND env bash "${CMAKE_CURRENT_SOURCE_DIR}/tools/generate-certs.sh" "${ANJAY_BUILD_OUTPUT_DIR}/certs" RESULT_VARIABLE RES) if(NOT ${RES} EQUAL 0) message(FATAL_ERROR "could not generate SSL certificates") endif() endif() elseif(WITH_AVS_UNIT) message(FATAL_ERROR "OpenSSL command line utility is required for unit tests") endif() add_subdirectory(demo) endif() ################# TEST ######################################################## cmake_dependent_option(WITH_INTEGRATION_TESTS "Enable integration tests" OFF "WITH_TEST;WITH_DEMO" OFF) if(WITH_TEST) enable_testing() add_custom_target(check) add_custom_target(anjay_unit_check) add_dependencies(check anjay_unit_check) # anjay_test add_executable(anjay_test EXCLUDE_FROM_ALL $ tests/core/coap/utils.c tests/core/coap/utils.h tests/core/bootstrap_mock.h tests/core/io/bigdata.h tests/core/observe/observe_mock.h tests/core/socket_mock.c tests/core/socket_mock.h tests/utils/dm.c tests/utils/dm.h tests/utils/mock_clock.c tests/utils/mock_clock.h tests/utils/mock_dm.c tests/utils/mock_dm.h tests/utils/utils.h tests/utils/coap/socket.h tests/utils/coap/socket.c) if(WITH_SENML_JSON) target_sources(anjay_test PRIVATE tests/core/io/senml_json_encoder.c) endif() if(WITH_CBOR) target_sources(anjay_test PRIVATE tests/core/io/senml_cbor_encoder.c) endif() if(WITH_SEND) target_sources(anjay_test PRIVATE tests/core/lwm2m_send.c) endif() if(WITH_MODULE_factory_provisioning) target_sources(anjay_test PRIVATE tests/modules/factory_provisioning/provisioning.c) endif() target_include_directories(anjay_test PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" $) target_link_libraries(anjay_test PRIVATE avs_unit avs_coap_for_tests ${AVS_COMMONS_LIBRARIES}) if(NOT HAVE_DLSYM AND NOT DLSYM_LIBRARY) message(FATAL_ERROR "dlsym() is required for tests, but its definition " "could not be found; either use -DDLSYM_LIBRARY to select the " "library or disable tests") elseif(DLSYM_LIBRARY) target_link_libraries(anjay_test PRIVATE ${DLSYM_LIBRARY}) endif() set_property(TARGET anjay_test APPEND PROPERTY COMPILE_DEFINITIONS ANJAY_TEST "ANJAY_BIN_DIR=\"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}\"") target_compile_options(anjay_test PRIVATE -Wno-overlength-strings -Wno-vla -Wno-c++-compat) if(CMAKE_C_COMPILER_ID MATCHES "GNU") target_compile_options(anjay_test PRIVATE -Wno-jump-misses-init) if(CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8) target_compile_options(anjay_test PRIVATE -Wno-missing-field-initializers -Wno-uninitialized -Wno-unused-value) else() # before GCC 4.8 there was no -Wpedantic, only -pedantic; and no way to disable it target_compile_options(anjay_test PRIVATE -Wno-pedantic) endif() endif() if(WITH_VALGRIND) set(VALGRIND ${VALGRIND_EXECUTABLE} --leak-check=full --track-origins=yes -q --error-exitcode=63 --suppressions=${CMAKE_CURRENT_SOURCE_DIR}/valgrind_test.supp) endif() if(VALGRIND) set(VALGRIND_LOG ${VALGRIND} --log-file=${ANJAY_BUILD_OUTPUT_DIR}/VALGRIND.anjay_test.log) else() set(VALGRIND_LOG) endif() add_test(NAME anjay_test WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" COMMAND ${VALGRIND_LOG} $) add_custom_target(anjay_check COMMAND ${CMAKE_CTEST_COMMAND} -R "^anjay_test$$" -V DEPENDS anjay_test) add_dependencies(anjay_unit_check anjay_check) if(TARGET avs_commons_check) add_dependencies(check avs_commons_check) endif() # TODO T2192: rename to avs_coap after migration if(TARGET avs_coap_check) add_dependencies(check avs_coap_check) endif() # Source validation get_target_property(ANJAY_SOURCES anjay SOURCES) set(ABSOLUTE_HEADERS) foreach(F ${ANJAY_SOURCES}) add_test(NAME test_anjay_${F}_visibility COMMAND deps/avs_commons/test_visibility.py ${F} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_test(NAME test_anjay_${F}_headers COMMAND deps/avs_commons/test_headers.py ${F} tools/conditional_headers_whitelist.json WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) if(F MATCHES [.]h$) list(APPEND ABSOLUTE_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/${F}") endif() endforeach() add_custom_target(visibility_check COMMAND ${CMAKE_CTEST_COMMAND} -R "'^test_anjay_.*_visibility$$'") add_dependencies(anjay_unit_check visibility_check) add_custom_target(headers_check COMMAND ${CMAKE_CTEST_COMMAND} -R "'^test_anjay_.*_headers$$'") add_dependencies(anjay_unit_check headers_check) add_test(NAME test_function_duplicates COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/test_duplicates.py ${ABSOLUTE_HEADERS}) add_test(NAME test_markdown_toc COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/markdown-toc.py --check "${CMAKE_CURRENT_SOURCE_DIR}/README.md") add_test(NAME test_config_log COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/anjay_config_log_tool.py validate) add_custom_target(function_duplicates_check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "'^test_function_duplicates$$'") add_custom_target(toc_check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "'^test_markdown_toc$$'") add_custom_target(config_log_check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "'^test_config_log$$'") add_dependencies(anjay_unit_check function_duplicates_check toc_check config_log_check) # Symbol validation add_custom_target(symbols_check COMMAND ${CMAKE_CTEST_COMMAND} -R "'^test_.*_symbols$$'" --output-on-failure) if(BUILD_SHARED_LIBS) add_test(NAME test_so_symbols COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/deps/avs_commons/test_symbols.sh $ anjay_ ANJAY_ "__odr_asan[.]") else() add_test(NAME test_a_symbols COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/deps/avs_commons/test_symbols.sh $ anjay_ ANJAY_ _anjay_ _ANJAY_ "__odr_asan[.]") endif() add_dependencies(symbols_check anjay) add_dependencies(anjay_unit_check symbols_check) add_custom_target(anjay_extern_c_check COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/deps/avs_commons/tools/check_extern_c.py" --path "${CMAKE_CURRENT_SOURCE_DIR}") add_dependencies(anjay_unit_check anjay_extern_c_check) add_custom_target(anjay_filename_check COMMAND ! find src -name "'*.[ch]'" | sed -e "'s|^.*/||'" | grep -v "'^anjay_'" COMMAND ! find src -name "'*.[ch]'" | sed -e "'s|^.*/||'" | sort | uniq -c | grep -v "'^ *1 '" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") add_dependencies(anjay_check anjay_filename_check) add_custom_target(symlink_check COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/symlink-check.sh") add_dependencies(anjay_check symlink_check) # Unit tests include(ProcessorCount) ProcessorCount(ANJAY_DEFAULT_NPROC) set(NPROC "${ANJAY_DEFAULT_NPROC}" CACHE STRING "Number of threads for multi-threaded build/test operations") add_subdirectory(tests/codegen) if(WITH_INTEGRATION_TESTS) set(TEST_RERUNS 3 CACHE STRING "Maximal number of times we try to rerun each testsuite") option(TEST_KEEP_SUCCESS_LOGS "Store all logs from test cases, even if no error happened" ON) add_subdirectory(tests/integration) endif() else(WITH_TEST) macro(add_anjay_test NAME) endmacro() endif(WITH_TEST) ################# FUZZ TESTING ################################################# add_subdirectory(tests/fuzz) if(WITH_DOCS) add_subdirectory(doc) endif() ################# STATIC ANALYSIS ############################################## cmake_dependent_option(WITH_STATIC_ANALYSIS "Perform static analysis of the codebase on `make check`" OFF WITH_TEST OFF) if(WITH_STATIC_ANALYSIS) find_program(SCAN_BUILD_BINARY scan-build) if(NOT SCAN_BUILD_BINARY) # some systems only have scan-build-x.y, where x.y is the version of LLVM # let's try that find_program(CLANG_BINARY clang) if(CLANG_BINARY) avs_temp_name(_fname) file(WRITE ${_fname} "__clang_major__ __clang_minor__") execute_process(COMMAND "${CLANG_BINARY}" -E -P -x c ${_fname} OUTPUT_VARIABLE CLANG_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE) file(REMOVE ${_fname}) string(REPLACE " " "." CLANG_VERSION_OUTPUT "${CLANG_VERSION_OUTPUT}") find_program(SCAN_BUILD_BINARY "scan-build-${CLANG_VERSION_OUTPUT}") endif() endif() if(NOT SCAN_BUILD_BINARY) message(FATAL_ERROR "scan-build not found; specify path with -DSCAN_BUILD_BINARY or disable static analysis with -DWITH_STATIC_ANALYSIS=OFF") else() add_custom_target(analyze COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/analyze" --output-dir "${CMAKE_CURRENT_BINARY_DIR}/static-analysis" --scan-build "${SCAN_BUILD_BINARY}") add_dependencies(check analyze) endif() endif() cmake_dependent_option(WITH_FIND_UNUSED_CODE "Check for unused symbols on `make check`" ON "WITH_TEST;UNIX;NOT APPLE" OFF) if(WITH_FIND_UNUSED_CODE) add_custom_target(find_unused_code COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/find_unused_code.py" # avs_commons global cleanup functions --ignore-symbol "^_avs_.*_cleanup_global.*_state$$" # hardware crypto PSK support --ignore-symbol "^_avs_crypto_mbedtls_engine_load_psk_\\(identity\\|key\\)$$" # gcc internals --ignore-object ".*/crtbegin.o" # external libraries --ignore-file "^/usr/lib/.*$$") add_dependencies(check find_unused_code) endif() option(WITH_EXAMPLES "Compile and test examples" ON) if(WITH_EXAMPLES) add_subdirectory(examples) endif() ################# INSTALL ###################################################### # libraries install(TARGETS anjay EXPORT anjay-targets DESTINATION lib) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include_public/anjay/anjay_config.h" "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/anjay.h" "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/core.h" "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/dm.h" "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/download.h" "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/io.h" "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/stats.h" DESTINATION include/anjay) if(WITH_ATTR_STORAGE) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/attr_storage.h" DESTINATION include/anjay) endif() if(WITH_SEND) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/lwm2m_send.h" DESTINATION include/anjay) endif() if(WITH_LWM2M_GATEWAY) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/lwm2m_gateway.h" DESTINATION include/anjay) endif() if(WITH_MODULE_access_control) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/access_control.h" DESTINATION include/anjay) endif() if(WITH_MODULE_ipso_objects) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/ipso_objects.h" DESTINATION include/anjay) endif() if(WITH_MODULE_ipso_objects_v2) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/ipso_objects_v2.h" DESTINATION include/anjay) endif() if(WITH_MODULE_fw_update) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/fw_update.h" DESTINATION include/anjay) endif() if(WITH_MODULE_advanced_fw_update) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/advanced_fw_update.h" DESTINATION include/anjay) endif() if(WITH_MODULE_security) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/security.h" DESTINATION include/anjay) endif() if(WITH_MODULE_server) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/server.h" DESTINATION include/anjay) endif() if(WITH_MODULE_factory_provisioning) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/factory_provisioning.h" DESTINATION include/anjay) endif() if(WITH_MODULE_sw_mgmt) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include_public/anjay/sw_mgmt.h" DESTINATION include/anjay) endif() # install CMake package configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/anjay-config.cmake.in ${ANJAY_BUILD_OUTPUT_DIR}/cmake/anjay-config.cmake @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/anjay-version.cmake.in ${ANJAY_BUILD_OUTPUT_DIR}/cmake/anjay-version.cmake @ONLY) install(EXPORT anjay-targets DESTINATION lib/anjay) install(FILES ${ANJAY_BUILD_OUTPUT_DIR}/cmake/anjay-config.cmake ${ANJAY_BUILD_OUTPUT_DIR}/cmake/anjay-version.cmake DESTINATION lib/anjay) ================================================ FILE: CONTRIBUTING.rst ================================================ .. Copyright 2017-2026 AVSystem AVSystem Anjay LwM2M SDK All rights reserved. Licensed under AVSystem Anjay LwM2M Client SDK - Non-Commercial License. See the attached LICENSE file for details. Contributing to Anjay ===================== Thank you for considering contributing to Anjay! Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved. Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. Reporting issues ---------------- **If you find a security vulnerability, do NOT open an issue!** Please email `opensource@avsystem.com `_ instead. We will address the issue as soon as possible and will give you an estimate for when we have a fix and release available for an eventual public disclosure. Use GitHub issue tracker for reporting other bugs. A great bug report should include: - Affected library version. - Platform information: - processor architecture, - operating system, - compiler version. - Minimal code example or a list of steps required to reproduce the bug. - In case of run-time errors, logs from ``strace``, ``valgrind`` and PCAP network traffic dumps are greatly appreciated. Feature requests ---------------- If you think some feature is missing, or that something can be improved, do not hesitate to suggest how we can make it better! When doing that, use GitHub issue tracker to post a description of the feature and some explanation why you need it. Code contributions ------------------ If you never submitted a pull request before, take a look at `this fantastic tutorial `_. #. Fork the project. #. Work on your contribution - follow guidelines described below. #. Push changes to your fork. #. Make sure all ``make check`` tests still pass. #. `Create a pull request `_. #. Wait for someone from Anjay team to review your contribution and give feedback. Code style ^^^^^^^^^^ All code should be fully C99-compliant and compile without warnings under ``gcc`` and ``clang``. Enable extra warnings by using ``cmake -DWITH_EXTRA_WARNINGS=ON`` or ``devconfig`` script. Compiling and testing the code on multiple architectures (e.g. 32/64-bit x86, ARM, MIPS) is not required, but welcome. General guidelines `````````````````` - Do not use GNU extensions. - Use ``UPPER_CASE`` for constants and ``snake_case`` in all other cases. - Prefer ``static`` functions. Use ``_anjay_`` prefix for private functions shared between translation units and ``anjay_`` prefix for types and public functions. - Do not use global variables. Only constants are allowed in global scope. - When using bitfields, make sure they are not saved to persistent storage nor sent over the network - their memory layout is implementation-defined, making them non-portable. - Avoid recursion - when writing code for an embedded platform, it is important to determine a hard limit on the stack space used by a program. - Include license information at the top of each file you add. - Use visibility macros defined in ``anjay_init.h`` to prevent internal symbols from being exported when using a GCC-compatible compiler. See `Visibility macros`_ section for examples. Visibility macros ````````````````` - Public header files (``.h`` files inside ``include_public/`` directories): no visibility macros. - Private header files (``.h`` files outside ``include_public/`` directories):: // ... includes VISIBILITY_PRIVATE_HEADER_BEGIN // ... code VISIBILITY_PRIVATE_HEADER_END - Source files (``.c``):: #include // ... includes VISIBILITY_SOURCE_BEGIN // ... code Tests ^^^^^ Make use of the `coverage script `_ to generate a code coverage report. New code should be covered by tests. Before submitting your code, run the whole test suite (``make check``) to ensure that it does not introduce regressions. Use ``valgrind`` and Address Sanitizer to check for memory corruption errors. Running tests on Ubuntu 20.04 or later: :: # Install these for tests: sudo apt-get install python3-pip git libmbedtls-dev libssl-dev zlib1g-dev python3 libpython3-dev wget valgrind curl cmake build-essential tshark pip3 install -U -r requirements.txt # Configure and run check target ./devconfig && make check Running tests on CentOS 7 or later: :: # Install these for tests: # (IUS is required for Python 3.5) sudo yum install -y https://repo.ius.io/ius-release-el7.rpm sudo yum install -y valgrind valgrind-devel openssl openssl-devel python35u python35u-devel python35u-pip clang-analyzer # Some test scripts expect Python >=3.5 to be available via `python3` command # Use update-alternatives to create a /usr/bin/python3 symlink with priority 0 # (lowest possible) sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 0 sudo python3 -m pip install -r requirements.txt # Configure and run check target # NOTE: clang-3.4 static analyzer (default version for CentOS) gives false # positives. --without-analysis flag disables static analysis. ./devconfig --without-analysis -DPython_ADDITIONAL_VERSIONS=3.5 && make check Running tests on macOS Sierra or later: :: # Install these for tests: brew install python3 openssl llvm pip3 install -r requirements.txt # Configure and run check target: # if the scan-build script is located somewhere else, then you need to # specify a different SCAN_BUILD_BINARY. Below, we are assumming scan-build # comes from an llvm package, installed via homebrew. ./devconfig -DSCAN_BUILD_BINARY=/usr/local/Cellar/llvm/*/bin/scan-build && make check ================================================ FILE: Dockerfile ================================================ # Copyright 2017-2026 AVSystem # AVSystem Anjay LwM2M SDK # All rights reserved. # # Licensed under AVSystem Anjay LwM2M Client SDK - Non-Commercial License. # See the attached LICENSE file for details. FROM ubuntu:24.04 WORKDIR /Anjay RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -yq git build-essential cmake libmbedtls-dev zlib1g-dev COPY . . RUN cmake . RUN make -j ENV HOME /Anjay ================================================ FILE: Doxyfile.in ================================================ # Doxyfile 1.9.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). # # Note: # # Use doxygen to compare the used configuration file with the template # configuration file: # doxygen -x [configFile] # Use doxygen to compare the used configuration file with the template # configuration file without replacing the environment variables or CMake type # replacement variables: # doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = anjay # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIR@ # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format # and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to # control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO # Controls the number of sub-directories that will be created when # CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every # level increment doubles the number of directories, resulting in 4096 # directories at level 8 which is the default and also the maximum value. The # sub-directories are organized in 2 levels, the first level always has a fixed # number of 16 directories. # Minimum value: 0, maximum value: 8, default value: 8. # This tag requires that the tag CREATE_SUBDIRS is set to YES. CREATE_SUBDIRS_LEVEL = 8 # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, # Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English # (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, # Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with # English messages), Korean, Korean-en (Korean with English messages), Latvian, # Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, # Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, # Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @DOXYGEN_INPUT_PATHS@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # By default Python docstrings are displayed as preformatted text and doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the # doxygen's special commands can be used and the contents of the docstring # documentation blocks is shown as doxygen documentation. # The default value is: YES. PYTHON_DOCSTRING = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". Note that you cannot put \n's in the value part of an alias # to insert newlines (in the resulting output). You can put ^^ in the value part # of an alias to insert a newline as if a physical newline was in the original # file. When you need a literal { or } or , in the value part of an alias you # have to escape them by means of a backslash (\), this can lead to conflicts # with the commands \{ and \} for these it is advised to use the version @{ and # @} or use a double escape (\\{ and \\}) ALIASES += "experimental=\xrefitem experimentals \"Experimental\" \"Experimental List\"" # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, # VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 5 # The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to # generate identifiers for the Markdown headings. Note: Every identifier is # unique. # Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a # sequence number starting at 0 and GITHUB use the lower case version of title # with any whitespace replaced by '-' and punctuation characters removed. # The default value is: DOXYGEN. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. MARKDOWN_ID_STYLE = DOXYGEN # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 # The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, # which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. NUM_PROC_THREADS = 1 # If the TIMESTAMP tag is set different from NO then each generated page will # contain the date or date and time when the page was generated. Setting this to # NO can help when comparing the output of multiple runs. # Possible values are: YES, NO, DATETIME and DATE. # The default value is: NO. TIMESTAMP = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If this flag is set to YES, the name of an unnamed parameter in a declaration # will be determined by the corresponding definition. By default unnamed # parameters remain unnamed in the output. # The default value is: YES. RESOLVE_UNNAMED_PARAMS = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # will also hide undocumented C++ concepts if enabled. This option has no effect # if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # With the correct setting of option CASE_SENSE_NAMES doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that # are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. # Possible values are: SYSTEM, NO and YES. # The default value is: SYSTEM. CASE_SENSE_NAMES = SYSTEM # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = YES # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_HEADERFILE tag is set to YES then the documentation for a class # will show which file needs to be included to use the class. # The default value is: YES. SHOW_HEADERFILE = YES # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. See also section "Changing the # layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as documenting some parameters in # a documented function twice, or documenting parameters that don't exist or # using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete # function parameter documentation. If set to NO, doxygen will accept that some # parameters have no documentation without warning. # The default value is: YES. WARN_IF_INCOMPLETE_DOC = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong parameter # documentation, but not about the absence of documentation. If EXTRACT_ALL is # set to YES then this flag will automatically be disabled. See also # WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about # undocumented enumeration values. If set to NO, doxygen will accept # undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: NO. WARN_IF_UNDOC_ENUM_VAL = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # at the end of the doxygen process doxygen will return with a non-zero status. # If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves # like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not # write the warning messages in between other messages but write them at the end # of a run, in case a WARN_LOGFILE is defined the warning messages will be # besides being in the defined file also be shown at the end of a run, unless # the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case # the behavior will remain as with the setting FAIL_ON_WARNINGS. # Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # In the $text part of the WARN_FORMAT command it is possible that a reference # to a more specific place is given. To make it easier to jump to this place # (outside of doxygen) the user can define a custom "cut" / "paste" string. # Example: # WARN_LINE_FORMAT = "'vi $file +$line'" # See also: WARN_FORMAT # The default value is: at line $line of file $file. WARN_LINE_FORMAT = "at line $line of file $file" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). In case the file specified cannot be opened for writing the # warning and error messages are written to standard error. When as file - is # specified the warning and error messages are written to standard output # (stdout). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = @DOXYGEN_INPUT_PATHS@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. # See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # This tag can be used to specify the character encoding of the source files # that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify # character encoding on a per file pattern basis. Doxygen will compare the file # name with each pattern and apply the encoding instead of the default # INPUT_ENCODING) if there is a match. The character encodings are a list of the # form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding # "INPUT_ENCODING" for further information on supported encodings. INPUT_FILE_ENCODING = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, # *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, # *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, # *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be # provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, # *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cxx \ *.cpp \ *.inl \ *.h \ *.hpp \ *.h++ # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # ANamespace::AClass, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that doxygen will use the data processed and written to standard output # for further processing, therefore nothing else, like debug statements or used # commands (so in case of a Windows batch file always use @echo OFF), should be # written to standard output. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = # The Fortran standard specifies that for fixed formatted Fortran code all # characters from position 72 are to be considered as comment. A common # extension is to allow longer lines before the automatic comment starts. The # setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can # be processed before the automatic comment starts. # Minimum value: 7, maximum value: 10000, default value: 72. FORTRAN_COMMENT_AFTER = 72 #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: # http://clang.llvm.org/) for more accurate parsing at the cost of reduced # performance. This can be particularly helpful with template rich C++ code for # which doxygen's built-in parser lacks the necessary type information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS # tag is set to YES then doxygen will add the directory of each input to the # include path. # The default value is: YES. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_ADD_INC_PATHS = YES # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the directory containing a file called compile_commands.json. This # file is the compilation database (see: # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the # options used when the source files were built. This is equivalent to # specifying the -p option to a clang tool, such as clang-check. These options # will then be passed to the parser. Any options specified with CLANG_OPTIONS # will be added as well. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) # that should be ignored while generating the index headers. The IGNORE_PREFIX # tag works for classes, function and member names. The entity will be placed in # the alphabetical list under the first letter of the entity name that remains # after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = NO # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). # Note: Since the styling of scrollbars can currently not be overruled in # Webkit/Chromium, the styling will be left out of the default doxygen.css if # one or more extra stylesheets have been specified. So if scrollbar # customization is desired it has to be added explicitly. For an example see the # documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. # Possible values are: LIGHT always generate light mode output, DARK always # generate dark mode output, AUTO_LIGHT automatically set the mode according to # the user preference, use light mode if no preference is set (the default), # AUTO_DARK automatically set the mode according to the user preference, use # dark mode if no preference is set and TOGGLE allow to user to switch between # light and dark mode via a button. # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE = AUTO_LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be # dynamically folded and expanded in the generated HTML source code. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_CODE_FOLDING = YES # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To # create a documentation set, doxygen will generate a Makefile in the HTML # output directory. Running make will produce the docset in that directory and # running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag determines the URL of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDURL = # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # on Windows. In the beginning of 2021 Microsoft took the original page, with # a.o. the download links, offline the HTML help workshop was already many years # in maintenance mode). You can download the HTML help workshop from the web # archives at Installation executable (see: # http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo # ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # The SITEMAP_URL tag is used to specify the full URL of the place where the # generated documentation will be placed on the server by the user during the # deployment of the documentation. The generated sitemap is called sitemap.xml # and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL # is specified no sitemap is generated. For information about the sitemap # protocol see https://www.sitemaps.org # This tag requires that the tag GENERATE_HTML is set to YES. SITEMAP_URL = # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine tune the look of the index (see "Fine-tuning the output"). As an # example, the default style sheet generated by doxygen has an example that # shows how to put an image at the root of the tree instead of the PROJECT_NAME. # Since the tree basically has the same information as the tab index, you could # consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the # FULL_SIDEBAR option determines if the side bar is limited to only the treeview # area (value NO) or if it should extend to the full height of the window (value # YES). Setting this to YES gives a layout similar to # https://docs.readthedocs.io with more room for contents, but less room for the # project logo, title, and description. If either GENERATE_TREEVIEW or # DISABLE_INDEX is set to NO, this option has no effect. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. FULL_SIDEBAR = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email # addresses. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. OBFUSCATE_EMAILS = YES # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. # Possible values are: png (the default) and svg (looks nicer but requires the # pdf2svg or inkscape tool). # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. # Note that the different versions of MathJax have different requirements with # regards to the different settings, so it is possible that also other MathJax # settings have to be changed when switching between the different MathJax # versions. # Possible values are: MathJax_2 and MathJax_3. # The default value is: MathJax_2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_VERSION = MathJax_2 # When MathJax is enabled you can set the default output format to be used for # the MathJax output. For more details about the output format see MathJax # version 2 (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 # (see: # http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best # compatibility. This is the name for Mathjax version 2, for MathJax version 3 # this will be translated into chtml), NativeMML (i.e. MathML. Only supported # for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This # is the name for Mathjax version 3, for MathJax version 2 this will be # translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. The default value is: # - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 # - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # for MathJax version 2 (see # https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # For example for MathJax version 3 (see # http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): # MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /