[release] Snap to d85a812c07
Release-Operation-Build: https://cr-buildbucket.appspot.com/build/8747956901976648465
Change-Id: I6a997c7751fce75d063d6a8e4b1abf713af19ab5
diff --git a/docs/development/drivers/driver_guides/display/how_to_write.md b/docs/development/drivers/driver_guides/display/how_to_write.md
index 1dfb9fc..b1e851e 100644
--- a/docs/development/drivers/driver_guides/display/how_to_write.md
+++ b/docs/development/drivers/driver_guides/display/how_to_write.md
@@ -191,11 +191,6 @@
void DisplayControllerImplApplyConfiguration(
const display_config_t** display_config, size_t display_count) {}
- void DisplayControllerImplSetEld(
- uint64_t display_id,
- const uint8_t* raw_eld_list,
- size_t raw_eld_count) {}
-
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* usage, uint64_t collection_id) {
return ZX_ERR_NOT_SUPPORTED;
diff --git a/docs/gen/build_arguments.md b/docs/gen/build_arguments.md
index 5cc6865..9efaceb 100644
--- a/docs/gen/build_arguments.md
+++ b/docs/gen/build_arguments.md
@@ -1848,563 +1848,569 @@
From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:89
+### dir_pw_dma_mcuxpresso
+
+**Current value (from the default):** `"//third_party/pigweed/src/pw_dma_mcuxpresso"`
+
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:90
+
### dir_pw_docgen
**Current value (from the default):** `"//third_party/pigweed/src/pw_docgen"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:90
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:91
### dir_pw_doctor
**Current value (from the default):** `"//third_party/pigweed/src/pw_doctor"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:91
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:92
### dir_pw_emu
**Current value (from the default):** `"//third_party/pigweed/src/pw_emu"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:92
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:93
### dir_pw_env_setup
**Current value (from the default):** `"//third_party/pigweed/src/pw_env_setup"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:93
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:94
### dir_pw_env_setup_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_env_setup_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:94
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:95
### dir_pw_file
**Current value (from the default):** `"//third_party/pigweed/src/pw_file"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:95
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:96
### dir_pw_format
**Current value (from the default):** `"//third_party/pigweed/src/pw_format"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:96
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:97
### dir_pw_function
**Current value (from the default):** `"//third_party/pigweed/src/pw_function"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:97
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:98
### dir_pw_fuzzer
**Current value (from the default):** `"//third_party/pigweed/src/pw_fuzzer"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:98
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:99
### dir_pw_grpc
**Current value (from the default):** `"//third_party/pigweed/src/pw_grpc"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:99
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:100
### dir_pw_hdlc
**Current value (from the default):** `"//third_party/pigweed/src/pw_hdlc"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:100
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:101
### dir_pw_hex_dump
**Current value (from the default):** `"//third_party/pigweed/src/pw_hex_dump"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:101
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:102
### dir_pw_i2c
**Current value (from the default):** `"//third_party/pigweed/src/pw_i2c"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:102
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:103
### dir_pw_i2c_linux
**Current value (from the default):** `"//third_party/pigweed/src/pw_i2c_linux"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:103
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:104
### dir_pw_i2c_mcuxpresso
**Current value (from the default):** `"//third_party/pigweed/src/pw_i2c_mcuxpresso"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:104
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:105
### dir_pw_i2c_rp2040
**Current value (from the default):** `"//third_party/pigweed/src/pw_i2c_rp2040"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:105
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:106
### dir_pw_ide
**Current value (from the default):** `"//third_party/pigweed/src/pw_ide"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:106
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:107
### dir_pw_interrupt
**Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:107
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:108
### dir_pw_interrupt_cortex_m
**Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt_cortex_m"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:109
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:110
### dir_pw_interrupt_xtensa
**Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt_xtensa"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:110
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:111
### dir_pw_interrupt_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:111
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:112
### dir_pw_intrusive_ptr
**Current value (from the default):** `"//third_party/pigweed/src/pw_intrusive_ptr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:112
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:113
### dir_pw_json
**Current value (from the default):** `"//third_party/pigweed/src/pw_json"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:113
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:114
### dir_pw_kvs
**Current value (from the default):** `"//third_party/pigweed/src/pw_kvs"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:114
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:115
### dir_pw_libc
**Current value (from the default):** `"//third_party/pigweed/src/pw_libc"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:115
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:116
### dir_pw_libcxx
**Current value (from the default):** `"//third_party/pigweed/src/pw_libcxx"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:116
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:117
### dir_pw_log
**Current value (from the default):** `"//third_party/pigweed/src/pw_log"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:117
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:118
### dir_pw_log_android
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_android"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:118
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:119
### dir_pw_log_basic
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_basic"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:119
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:120
### dir_pw_log_null
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_null"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:120
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:121
### dir_pw_log_rpc
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_rpc"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:121
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:122
### dir_pw_log_string
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_string"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:122
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:123
### dir_pw_log_tokenized
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_tokenized"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:123
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:124
### dir_pw_log_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_log_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:124
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:125
### dir_pw_malloc
**Current value (from the default):** `"//third_party/pigweed/src/pw_malloc"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:125
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:126
### dir_pw_malloc_freelist
**Current value (from the default):** `"//third_party/pigweed/src/pw_malloc_freelist"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:126
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:127
### dir_pw_malloc_freertos
**Current value (from the default):** `"//third_party/pigweed/src/pw_malloc_freertos"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:127
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:128
### dir_pw_metric
**Current value (from the default):** `"//third_party/pigweed/src/pw_metric"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:128
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:129
### dir_pw_minimal_cpp_stdlib
**Current value (from the default):** `"//third_party/pigweed/src/pw_minimal_cpp_stdlib"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:130
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:131
### dir_pw_module
**Current value (from the default):** `"//third_party/pigweed/src/pw_module"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:131
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:132
### dir_pw_multibuf
**Current value (from the default):** `"//third_party/pigweed/src/pw_multibuf"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:132
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:133
### dir_pw_multisink
**Current value (from the default):** `"//third_party/pigweed/src/pw_multisink"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:133
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:134
### dir_pw_package
**Current value (from the default):** `"//third_party/pigweed/src/pw_package"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:134
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:135
### dir_pw_perf_test
**Current value (from the default):** `"//third_party/pigweed/src/pw_perf_test"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:135
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:136
### dir_pw_persistent_ram
**Current value (from the default):** `"//third_party/pigweed/src/pw_persistent_ram"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:136
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:137
### dir_pw_polyfill
**Current value (from the default):** `"//third_party/pigweed/src/pw_polyfill"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:137
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:138
### dir_pw_preprocessor
**Current value (from the default):** `"//third_party/pigweed/src/pw_preprocessor"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:138
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:139
### dir_pw_presubmit
**Current value (from the default):** `"//third_party/pigweed/src/pw_presubmit"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:139
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:140
### dir_pw_protobuf
**Current value (from the default):** `"//third_party/pigweed/src/pw_protobuf"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:140
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:141
### dir_pw_protobuf_compiler
**Current value (from the default):** `"//third_party/pigweed/src/pw_protobuf_compiler"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:141
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:142
### dir_pw_random
**Current value (from the default):** `"//third_party/pigweed/src/pw_random"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:142
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:143
### dir_pw_result
**Current value (from the default):** `"//third_party/pigweed/src/pw_result"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:143
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:144
### dir_pw_ring_buffer
**Current value (from the default):** `"//third_party/pigweed/src/pw_ring_buffer"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:144
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:145
### dir_pw_router
**Current value (from the default):** `"//third_party/pigweed/src/pw_router"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:145
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:146
### dir_pw_rpc
**Current value (from the default):** `"//third_party/pigweed/src/pw_rpc"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:146
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:147
### dir_pw_rpc_transport
**Current value (from the default):** `"//third_party/pigweed/src/pw_rpc_transport"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:147
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:148
### dir_pw_rust
**Current value (from the default):** `"//third_party/pigweed/src/pw_rust"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:148
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:149
### dir_pw_sensor
**Current value (from the default):** `"//third_party/pigweed/src/pw_sensor"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:149
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:150
### dir_pw_snapshot
**Current value (from the default):** `"//third_party/pigweed/src/pw_snapshot"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:150
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:151
### dir_pw_software_update
**Current value (from the default):** `"//third_party/pigweed/src/pw_software_update"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:151
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:152
### dir_pw_span
**Current value (from the default):** `"//third_party/pigweed/src/pw_span"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:152
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:153
### dir_pw_spi
**Current value (from the default):** `"//third_party/pigweed/src/pw_spi"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:153
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:154
### dir_pw_spi_linux
**Current value (from the default):** `"//third_party/pigweed/src/pw_spi_linux"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:154
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:155
### dir_pw_spi_mcuxpresso
**Current value (from the default):** `"//third_party/pigweed/src/pw_spi_mcuxpresso"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:155
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:156
### dir_pw_spi_rp2040
**Current value (from the default):** `"//third_party/pigweed/src/pw_spi_rp2040"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:156
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:157
### dir_pw_status
**Current value (from the default):** `"//third_party/pigweed/src/pw_status"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:157
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:158
### dir_pw_stm32cube_build
**Current value (from the default):** `"//third_party/pigweed/src/pw_stm32cube_build"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:158
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:159
### dir_pw_stream
**Current value (from the default):** `"//third_party/pigweed/src/pw_stream"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:159
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:160
### dir_pw_stream_shmem_mcuxpresso
**Current value (from the default):** `"//third_party/pigweed/src/pw_stream_shmem_mcuxpresso"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:161
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:162
### dir_pw_stream_uart_linux
**Current value (from the default):** `"//third_party/pigweed/src/pw_stream_uart_linux"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:162
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:163
### dir_pw_stream_uart_mcuxpresso
**Current value (from the default):** `"//third_party/pigweed/src/pw_stream_uart_mcuxpresso"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:164
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:165
### dir_pw_string
**Current value (from the default):** `"//third_party/pigweed/src/pw_string"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:165
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:166
### dir_pw_symbolizer
**Current value (from the default):** `"//third_party/pigweed/src/pw_symbolizer"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:166
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:167
### dir_pw_sync
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:167
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:168
### dir_pw_sync_baremetal
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync_baremetal"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:168
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:169
### dir_pw_sync_embos
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync_embos"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:169
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:170
### dir_pw_sync_freertos
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync_freertos"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:170
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:171
### dir_pw_sync_stl
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync_stl"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:171
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:172
### dir_pw_sync_threadx
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync_threadx"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:172
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:173
### dir_pw_sync_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_sync_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:173
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:174
### dir_pw_sys_io
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:174
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:175
### dir_pw_sys_io_ambiq_sdk
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_ambiq_sdk"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:175
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:176
### dir_pw_sys_io_arduino
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_arduino"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:176
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:177
### dir_pw_sys_io_baremetal_lm3s6965evb
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:178
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:179
### dir_pw_sys_io_baremetal_stm32f429
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:180
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:181
### dir_pw_sys_io_emcraft_sf2
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_emcraft_sf2"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:182
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:183
### dir_pw_sys_io_mcuxpresso
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_mcuxpresso"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:183
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:184
### dir_pw_sys_io_rp2040
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_rp2040"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:184
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:185
### dir_pw_sys_io_stdio
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_stdio"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:185
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:186
### dir_pw_sys_io_stm32cube
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_stm32cube"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:186
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:187
### dir_pw_sys_io_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:187
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:188
### dir_pw_system
**Current value (from the default):** `"//third_party/pigweed/src/pw_system"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:188
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:189
### dir_pw_target_runner
**Current value (from the default):** `"//third_party/pigweed/src/pw_target_runner"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:189
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:190
### dir_pw_third_party
@@ -2530,133 +2536,133 @@
**Current value (from the default):** `"//third_party/pigweed/src/pw_thread"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:190
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:191
### dir_pw_thread_embos
**Current value (from the default):** `"//third_party/pigweed/src/pw_thread_embos"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:191
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:192
### dir_pw_thread_freertos
**Current value (from the default):** `"//third_party/pigweed/src/pw_thread_freertos"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:192
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:193
### dir_pw_thread_stl
**Current value (from the default):** `"//third_party/pigweed/src/pw_thread_stl"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:193
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:194
### dir_pw_thread_threadx
**Current value (from the default):** `"//third_party/pigweed/src/pw_thread_threadx"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:194
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:195
### dir_pw_thread_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_thread_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:195
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:196
### dir_pw_tls_client
**Current value (from the default):** `"//third_party/pigweed/src/pw_tls_client"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:196
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:197
### dir_pw_tls_client_boringssl
**Current value (from the default):** `"//third_party/pigweed/src/pw_tls_client_boringssl"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:198
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:199
### dir_pw_tls_client_mbedtls
**Current value (from the default):** `"//third_party/pigweed/src/pw_tls_client_mbedtls"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:200
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:201
### dir_pw_tokenizer
**Current value (from the default):** `"//third_party/pigweed/src/pw_tokenizer"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:201
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:202
### dir_pw_toolchain
**Current value (from the default):** `"//third_party/pigweed/src/pw_toolchain"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:202
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:203
### dir_pw_toolchain_bazel
**Current value (from the default):** `"//third_party/pigweed/src/pw_toolchain_bazel"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:203
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:204
### dir_pw_trace
**Current value (from the default):** `"//third_party/pigweed/src/pw_trace"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:204
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:205
### dir_pw_trace_tokenized
**Current value (from the default):** `"//third_party/pigweed/src/pw_trace_tokenized"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:205
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:206
### dir_pw_transfer
**Current value (from the default):** `"//third_party/pigweed/src/pw_transfer"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:206
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:207
### dir_pw_uart
**Current value (from the default):** `"//third_party/pigweed/src/pw_uart"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:207
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:208
### dir_pw_unit_test
**Current value (from the default):** `"//third_party/pigweed/src/pw_unit_test"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:208
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:209
### dir_pw_unit_test_zephyr
**Current value (from the default):** `"//third_party/pigweed/src/pw_unit_test_zephyr"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:209
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:210
### dir_pw_varint
**Current value (from the default):** `"//third_party/pigweed/src/pw_varint"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:210
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:211
### dir_pw_watch
**Current value (from the default):** `"//third_party/pigweed/src/pw_watch"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:211
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:212
### dir_pw_web
**Current value (from the default):** `"//third_party/pigweed/src/pw_web"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:212
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:213
### dir_pw_work_queue
**Current value (from the default):** `"//third_party/pigweed/src/pw_work_queue"`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:213
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:214
### disable_boot_tests
@@ -6185,25 +6191,25 @@
A list with all Pigweed modules docs groups. DO NOT SET THIS BUILD ARGUMENT!
-**Current value (from the default):** `["//third_party/pigweed/src/docker:docs", "//third_party/pigweed/src/pw_alignment:docs", "//third_party/pigweed/src/pw_allocator:docs", "//third_party/pigweed/src/pw_analog:docs", "//third_party/pigweed/src/pw_android_toolchain:docs", "//third_party/pigweed/src/pw_arduino_build:docs", "//third_party/pigweed/src/pw_assert:docs", "//third_party/pigweed/src/pw_assert_basic:docs", "//third_party/pigweed/src/pw_assert_log:docs", "//third_party/pigweed/src/pw_assert_tokenized:docs", "//third_party/pigweed/src/pw_assert_zephyr:docs", "//third_party/pigweed/src/pw_async:docs", "//third_party/pigweed/src/pw_async2:docs", "//third_party/pigweed/src/pw_async2_basic:docs", "//third_party/pigweed/src/pw_async2_epoll:docs", "//third_party/pigweed/src/pw_async_basic:docs", "//third_party/pigweed/src/pw_base64:docs", "//third_party/pigweed/src/pw_bloat:docs", "//third_party/pigweed/src/pw_blob_store:docs", "//third_party/pigweed/src/pw_bluetooth:docs", "//third_party/pigweed/src/pw_bluetooth_hci:docs", "//third_party/pigweed/src/pw_bluetooth_profiles:docs", "//third_party/pigweed/src/pw_bluetooth_proxy:docs", "//third_party/pigweed/src/pw_bluetooth_sapphire:docs", "//third_party/pigweed/src/pw_boot:docs", "//third_party/pigweed/src/pw_boot_cortex_m:docs", "//third_party/pigweed/src/pw_build:docs", "//third_party/pigweed/src/pw_build_android:docs", "//third_party/pigweed/src/pw_build_info:docs", "//third_party/pigweed/src/pw_build_mcuxpresso:docs", "//third_party/pigweed/src/pw_bytes:docs", "//third_party/pigweed/src/pw_channel:docs", "//third_party/pigweed/src/pw_checksum:docs", "//third_party/pigweed/src/pw_chre:docs", "//third_party/pigweed/src/pw_chrono:docs", "//third_party/pigweed/src/pw_chrono_embos:docs", "//third_party/pigweed/src/pw_chrono_freertos:docs", "//third_party/pigweed/src/pw_chrono_rp2040:docs", "//third_party/pigweed/src/pw_chrono_stl:docs", "//third_party/pigweed/src/pw_chrono_threadx:docs", "//third_party/pigweed/src/pw_chrono_zephyr:docs", "//third_party/pigweed/src/pw_cli:docs", "//third_party/pigweed/src/pw_compilation_testing:docs", "//third_party/pigweed/src/pw_config_loader:docs", "//third_party/pigweed/src/pw_console:docs", "//third_party/pigweed/src/pw_containers:docs", "//third_party/pigweed/src/pw_cpu_exception:docs", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:docs", "//third_party/pigweed/src/pw_cpu_exception_risc_v:docs", "//third_party/pigweed/src/pw_crypto:docs", "//third_party/pigweed/src/pw_digital_io:docs", "//third_party/pigweed/src/pw_digital_io_linux:docs", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_digital_io_rp2040:docs", "//third_party/pigweed/src/pw_docgen:docs", "//third_party/pigweed/src/pw_doctor:docs", "//third_party/pigweed/src/pw_emu:docs", "//third_party/pigweed/src/pw_env_setup:docs", "//third_party/pigweed/src/pw_env_setup_zephyr:docs", "//third_party/pigweed/src/pw_file:docs", "//third_party/pigweed/src/pw_format:docs", "//third_party/pigweed/src/pw_function:docs", "//third_party/pigweed/src/pw_fuzzer:docs", "//third_party/pigweed/src/pw_grpc:docs", "//third_party/pigweed/src/pw_hdlc:docs", "//third_party/pigweed/src/pw_hex_dump:docs", "//third_party/pigweed/src/pw_i2c:docs", "//third_party/pigweed/src/pw_i2c_linux:docs", "//third_party/pigweed/src/pw_i2c_mcuxpresso:docs", "//third_party/pigweed/src/pw_i2c_rp2040:docs", "//third_party/pigweed/src/pw_ide:docs", "//third_party/pigweed/src/pw_interrupt:docs", "//third_party/pigweed/src/pw_interrupt_cortex_m:docs", "//third_party/pigweed/src/pw_interrupt_xtensa:docs", "//third_party/pigweed/src/pw_interrupt_zephyr:docs", "//third_party/pigweed/src/pw_intrusive_ptr:docs", "//third_party/pigweed/src/pw_json:docs", "//third_party/pigweed/src/pw_kvs:docs", "//third_party/pigweed/src/pw_libc:docs", "//third_party/pigweed/src/pw_libcxx:docs", "//third_party/pigweed/src/pw_log:docs", "//third_party/pigweed/src/pw_log_android:docs", "//third_party/pigweed/src/pw_log_basic:docs", "//third_party/pigweed/src/pw_log_null:docs", "//third_party/pigweed/src/pw_log_rpc:docs", "//third_party/pigweed/src/pw_log_string:docs", "//third_party/pigweed/src/pw_log_tokenized:docs", "//third_party/pigweed/src/pw_log_zephyr:docs", "//third_party/pigweed/src/pw_malloc:docs", "//third_party/pigweed/src/pw_malloc_freelist:docs", "//third_party/pigweed/src/pw_malloc_freertos:docs", "//third_party/pigweed/src/pw_metric:docs", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:docs", "//third_party/pigweed/src/pw_module:docs", "//third_party/pigweed/src/pw_multibuf:docs", "//third_party/pigweed/src/pw_multisink:docs", "//third_party/pigweed/src/pw_package:docs", "//third_party/pigweed/src/pw_perf_test:docs", "//third_party/pigweed/src/pw_persistent_ram:docs", "//third_party/pigweed/src/pw_polyfill:docs", "//third_party/pigweed/src/pw_preprocessor:docs", "//third_party/pigweed/src/pw_presubmit:docs", "//third_party/pigweed/src/pw_protobuf:docs", "//third_party/pigweed/src/pw_protobuf_compiler:docs", "//third_party/pigweed/src/pw_random:docs", "//third_party/pigweed/src/pw_result:docs", "//third_party/pigweed/src/pw_ring_buffer:docs", "//third_party/pigweed/src/pw_router:docs", "//third_party/pigweed/src/pw_rpc:docs", "//third_party/pigweed/src/pw_rpc_transport:docs", "//third_party/pigweed/src/pw_rust:docs", "//third_party/pigweed/src/pw_sensor:docs", "//third_party/pigweed/src/pw_snapshot:docs", "//third_party/pigweed/src/pw_software_update:docs", "//third_party/pigweed/src/pw_span:docs", "//third_party/pigweed/src/pw_spi:docs", "//third_party/pigweed/src/pw_spi_linux:docs", "//third_party/pigweed/src/pw_spi_mcuxpresso:docs", "//third_party/pigweed/src/pw_spi_rp2040:docs", "//third_party/pigweed/src/pw_status:docs", "//third_party/pigweed/src/pw_stm32cube_build:docs", "//third_party/pigweed/src/pw_stream:docs", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:docs", "//third_party/pigweed/src/pw_stream_uart_linux:docs", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:docs", "//third_party/pigweed/src/pw_string:docs", "//third_party/pigweed/src/pw_symbolizer:docs", "//third_party/pigweed/src/pw_sync:docs", "//third_party/pigweed/src/pw_sync_baremetal:docs", "//third_party/pigweed/src/pw_sync_embos:docs", "//third_party/pigweed/src/pw_sync_freertos:docs", "//third_party/pigweed/src/pw_sync_stl:docs", "//third_party/pigweed/src/pw_sync_threadx:docs", "//third_party/pigweed/src/pw_sync_zephyr:docs", "//third_party/pigweed/src/pw_sys_io:docs", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:docs", "//third_party/pigweed/src/pw_sys_io_arduino:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:docs", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:docs", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_sys_io_rp2040:docs", "//third_party/pigweed/src/pw_sys_io_stdio:docs", "//third_party/pigweed/src/pw_sys_io_stm32cube:docs", "//third_party/pigweed/src/pw_sys_io_zephyr:docs", "//third_party/pigweed/src/pw_system:docs", "//third_party/pigweed/src/pw_target_runner:docs", "//third_party/pigweed/src/pw_thread:docs", "//third_party/pigweed/src/pw_thread_embos:docs", "//third_party/pigweed/src/pw_thread_freertos:docs", "//third_party/pigweed/src/pw_thread_stl:docs", "//third_party/pigweed/src/pw_thread_threadx:docs", "//third_party/pigweed/src/pw_thread_zephyr:docs", "//third_party/pigweed/src/pw_tls_client:docs", "//third_party/pigweed/src/pw_tls_client_boringssl:docs", "//third_party/pigweed/src/pw_tls_client_mbedtls:docs", "//third_party/pigweed/src/pw_tokenizer:docs", "//third_party/pigweed/src/pw_toolchain:docs", "//third_party/pigweed/src/pw_toolchain_bazel:docs", "//third_party/pigweed/src/pw_trace:docs", "//third_party/pigweed/src/pw_trace_tokenized:docs", "//third_party/pigweed/src/pw_transfer:docs", "//third_party/pigweed/src/pw_uart:docs", "//third_party/pigweed/src/pw_unit_test:docs", "//third_party/pigweed/src/pw_unit_test_zephyr:docs", "//third_party/pigweed/src/pw_varint:docs", "//third_party/pigweed/src/pw_watch:docs", "//third_party/pigweed/src/pw_web:docs", "//third_party/pigweed/src/pw_work_queue:docs"]`
+**Current value (from the default):** `["//third_party/pigweed/src/docker:docs", "//third_party/pigweed/src/pw_alignment:docs", "//third_party/pigweed/src/pw_allocator:docs", "//third_party/pigweed/src/pw_analog:docs", "//third_party/pigweed/src/pw_android_toolchain:docs", "//third_party/pigweed/src/pw_arduino_build:docs", "//third_party/pigweed/src/pw_assert:docs", "//third_party/pigweed/src/pw_assert_basic:docs", "//third_party/pigweed/src/pw_assert_log:docs", "//third_party/pigweed/src/pw_assert_tokenized:docs", "//third_party/pigweed/src/pw_assert_zephyr:docs", "//third_party/pigweed/src/pw_async:docs", "//third_party/pigweed/src/pw_async2:docs", "//third_party/pigweed/src/pw_async2_basic:docs", "//third_party/pigweed/src/pw_async2_epoll:docs", "//third_party/pigweed/src/pw_async_basic:docs", "//third_party/pigweed/src/pw_base64:docs", "//third_party/pigweed/src/pw_bloat:docs", "//third_party/pigweed/src/pw_blob_store:docs", "//third_party/pigweed/src/pw_bluetooth:docs", "//third_party/pigweed/src/pw_bluetooth_hci:docs", "//third_party/pigweed/src/pw_bluetooth_profiles:docs", "//third_party/pigweed/src/pw_bluetooth_proxy:docs", "//third_party/pigweed/src/pw_bluetooth_sapphire:docs", "//third_party/pigweed/src/pw_boot:docs", "//third_party/pigweed/src/pw_boot_cortex_m:docs", "//third_party/pigweed/src/pw_build:docs", "//third_party/pigweed/src/pw_build_android:docs", "//third_party/pigweed/src/pw_build_info:docs", "//third_party/pigweed/src/pw_build_mcuxpresso:docs", "//third_party/pigweed/src/pw_bytes:docs", "//third_party/pigweed/src/pw_channel:docs", "//third_party/pigweed/src/pw_checksum:docs", "//third_party/pigweed/src/pw_chre:docs", "//third_party/pigweed/src/pw_chrono:docs", "//third_party/pigweed/src/pw_chrono_embos:docs", "//third_party/pigweed/src/pw_chrono_freertos:docs", "//third_party/pigweed/src/pw_chrono_rp2040:docs", "//third_party/pigweed/src/pw_chrono_stl:docs", "//third_party/pigweed/src/pw_chrono_threadx:docs", "//third_party/pigweed/src/pw_chrono_zephyr:docs", "//third_party/pigweed/src/pw_cli:docs", "//third_party/pigweed/src/pw_compilation_testing:docs", "//third_party/pigweed/src/pw_config_loader:docs", "//third_party/pigweed/src/pw_console:docs", "//third_party/pigweed/src/pw_containers:docs", "//third_party/pigweed/src/pw_cpu_exception:docs", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:docs", "//third_party/pigweed/src/pw_cpu_exception_risc_v:docs", "//third_party/pigweed/src/pw_crypto:docs", "//third_party/pigweed/src/pw_digital_io:docs", "//third_party/pigweed/src/pw_digital_io_linux:docs", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_digital_io_rp2040:docs", "//third_party/pigweed/src/pw_dma_mcuxpresso:docs", "//third_party/pigweed/src/pw_docgen:docs", "//third_party/pigweed/src/pw_doctor:docs", "//third_party/pigweed/src/pw_emu:docs", "//third_party/pigweed/src/pw_env_setup:docs", "//third_party/pigweed/src/pw_env_setup_zephyr:docs", "//third_party/pigweed/src/pw_file:docs", "//third_party/pigweed/src/pw_format:docs", "//third_party/pigweed/src/pw_function:docs", "//third_party/pigweed/src/pw_fuzzer:docs", "//third_party/pigweed/src/pw_grpc:docs", "//third_party/pigweed/src/pw_hdlc:docs", "//third_party/pigweed/src/pw_hex_dump:docs", "//third_party/pigweed/src/pw_i2c:docs", "//third_party/pigweed/src/pw_i2c_linux:docs", "//third_party/pigweed/src/pw_i2c_mcuxpresso:docs", "//third_party/pigweed/src/pw_i2c_rp2040:docs", "//third_party/pigweed/src/pw_ide:docs", "//third_party/pigweed/src/pw_interrupt:docs", "//third_party/pigweed/src/pw_interrupt_cortex_m:docs", "//third_party/pigweed/src/pw_interrupt_xtensa:docs", "//third_party/pigweed/src/pw_interrupt_zephyr:docs", "//third_party/pigweed/src/pw_intrusive_ptr:docs", "//third_party/pigweed/src/pw_json:docs", "//third_party/pigweed/src/pw_kvs:docs", "//third_party/pigweed/src/pw_libc:docs", "//third_party/pigweed/src/pw_libcxx:docs", "//third_party/pigweed/src/pw_log:docs", "//third_party/pigweed/src/pw_log_android:docs", "//third_party/pigweed/src/pw_log_basic:docs", "//third_party/pigweed/src/pw_log_null:docs", "//third_party/pigweed/src/pw_log_rpc:docs", "//third_party/pigweed/src/pw_log_string:docs", "//third_party/pigweed/src/pw_log_tokenized:docs", "//third_party/pigweed/src/pw_log_zephyr:docs", "//third_party/pigweed/src/pw_malloc:docs", "//third_party/pigweed/src/pw_malloc_freelist:docs", "//third_party/pigweed/src/pw_malloc_freertos:docs", "//third_party/pigweed/src/pw_metric:docs", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:docs", "//third_party/pigweed/src/pw_module:docs", "//third_party/pigweed/src/pw_multibuf:docs", "//third_party/pigweed/src/pw_multisink:docs", "//third_party/pigweed/src/pw_package:docs", "//third_party/pigweed/src/pw_perf_test:docs", "//third_party/pigweed/src/pw_persistent_ram:docs", "//third_party/pigweed/src/pw_polyfill:docs", "//third_party/pigweed/src/pw_preprocessor:docs", "//third_party/pigweed/src/pw_presubmit:docs", "//third_party/pigweed/src/pw_protobuf:docs", "//third_party/pigweed/src/pw_protobuf_compiler:docs", "//third_party/pigweed/src/pw_random:docs", "//third_party/pigweed/src/pw_result:docs", "//third_party/pigweed/src/pw_ring_buffer:docs", "//third_party/pigweed/src/pw_router:docs", "//third_party/pigweed/src/pw_rpc:docs", "//third_party/pigweed/src/pw_rpc_transport:docs", "//third_party/pigweed/src/pw_rust:docs", "//third_party/pigweed/src/pw_sensor:docs", "//third_party/pigweed/src/pw_snapshot:docs", "//third_party/pigweed/src/pw_software_update:docs", "//third_party/pigweed/src/pw_span:docs", "//third_party/pigweed/src/pw_spi:docs", "//third_party/pigweed/src/pw_spi_linux:docs", "//third_party/pigweed/src/pw_spi_mcuxpresso:docs", "//third_party/pigweed/src/pw_spi_rp2040:docs", "//third_party/pigweed/src/pw_status:docs", "//third_party/pigweed/src/pw_stm32cube_build:docs", "//third_party/pigweed/src/pw_stream:docs", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:docs", "//third_party/pigweed/src/pw_stream_uart_linux:docs", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:docs", "//third_party/pigweed/src/pw_string:docs", "//third_party/pigweed/src/pw_symbolizer:docs", "//third_party/pigweed/src/pw_sync:docs", "//third_party/pigweed/src/pw_sync_baremetal:docs", "//third_party/pigweed/src/pw_sync_embos:docs", "//third_party/pigweed/src/pw_sync_freertos:docs", "//third_party/pigweed/src/pw_sync_stl:docs", "//third_party/pigweed/src/pw_sync_threadx:docs", "//third_party/pigweed/src/pw_sync_zephyr:docs", "//third_party/pigweed/src/pw_sys_io:docs", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:docs", "//third_party/pigweed/src/pw_sys_io_arduino:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:docs", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:docs", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_sys_io_rp2040:docs", "//third_party/pigweed/src/pw_sys_io_stdio:docs", "//third_party/pigweed/src/pw_sys_io_stm32cube:docs", "//third_party/pigweed/src/pw_sys_io_zephyr:docs", "//third_party/pigweed/src/pw_system:docs", "//third_party/pigweed/src/pw_target_runner:docs", "//third_party/pigweed/src/pw_thread:docs", "//third_party/pigweed/src/pw_thread_embos:docs", "//third_party/pigweed/src/pw_thread_freertos:docs", "//third_party/pigweed/src/pw_thread_stl:docs", "//third_party/pigweed/src/pw_thread_threadx:docs", "//third_party/pigweed/src/pw_thread_zephyr:docs", "//third_party/pigweed/src/pw_tls_client:docs", "//third_party/pigweed/src/pw_tls_client_boringssl:docs", "//third_party/pigweed/src/pw_tls_client_mbedtls:docs", "//third_party/pigweed/src/pw_tokenizer:docs", "//third_party/pigweed/src/pw_toolchain:docs", "//third_party/pigweed/src/pw_toolchain_bazel:docs", "//third_party/pigweed/src/pw_trace:docs", "//third_party/pigweed/src/pw_trace_tokenized:docs", "//third_party/pigweed/src/pw_transfer:docs", "//third_party/pigweed/src/pw_uart:docs", "//third_party/pigweed/src/pw_unit_test:docs", "//third_party/pigweed/src/pw_unit_test_zephyr:docs", "//third_party/pigweed/src/pw_varint:docs", "//third_party/pigweed/src/pw_watch:docs", "//third_party/pigweed/src/pw_web:docs", "//third_party/pigweed/src/pw_work_queue:docs"]`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:566
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:569
### pw_module_tests
A list with all Pigweed module test groups. DO NOT SET THIS BUILD ARGUMENT!
-**Current value (from the default):** `["//third_party/pigweed/src/docker:tests", "//third_party/pigweed/src/pw_alignment:tests", "//third_party/pigweed/src/pw_allocator:tests", "//third_party/pigweed/src/pw_analog:tests", "//third_party/pigweed/src/pw_android_toolchain:tests", "//third_party/pigweed/src/pw_arduino_build:tests", "//third_party/pigweed/src/pw_assert:tests", "//third_party/pigweed/src/pw_assert_basic:tests", "//third_party/pigweed/src/pw_assert_log:tests", "//third_party/pigweed/src/pw_assert_tokenized:tests", "//third_party/pigweed/src/pw_assert_zephyr:tests", "//third_party/pigweed/src/pw_async:tests", "//third_party/pigweed/src/pw_async2:tests", "//third_party/pigweed/src/pw_async2_basic:tests", "//third_party/pigweed/src/pw_async2_epoll:tests", "//third_party/pigweed/src/pw_async_basic:tests", "//third_party/pigweed/src/pw_base64:tests", "//third_party/pigweed/src/pw_bloat:tests", "//third_party/pigweed/src/pw_blob_store:tests", "//third_party/pigweed/src/pw_bluetooth:tests", "//third_party/pigweed/src/pw_bluetooth_hci:tests", "//third_party/pigweed/src/pw_bluetooth_profiles:tests", "//third_party/pigweed/src/pw_bluetooth_proxy:tests", "//third_party/pigweed/src/pw_bluetooth_sapphire:tests", "//third_party/pigweed/src/pw_boot:tests", "//third_party/pigweed/src/pw_boot_cortex_m:tests", "//third_party/pigweed/src/pw_build:tests", "//third_party/pigweed/src/pw_build_android:tests", "//third_party/pigweed/src/pw_build_info:tests", "//third_party/pigweed/src/pw_build_mcuxpresso:tests", "//third_party/pigweed/src/pw_bytes:tests", "//third_party/pigweed/src/pw_channel:tests", "//third_party/pigweed/src/pw_checksum:tests", "//third_party/pigweed/src/pw_chre:tests", "//third_party/pigweed/src/pw_chrono:tests", "//third_party/pigweed/src/pw_chrono_embos:tests", "//third_party/pigweed/src/pw_chrono_freertos:tests", "//third_party/pigweed/src/pw_chrono_rp2040:tests", "//third_party/pigweed/src/pw_chrono_stl:tests", "//third_party/pigweed/src/pw_chrono_threadx:tests", "//third_party/pigweed/src/pw_chrono_zephyr:tests", "//third_party/pigweed/src/pw_cli:tests", "//third_party/pigweed/src/pw_compilation_testing:tests", "//third_party/pigweed/src/pw_config_loader:tests", "//third_party/pigweed/src/pw_console:tests", "//third_party/pigweed/src/pw_containers:tests", "//third_party/pigweed/src/pw_cpu_exception:tests", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:tests", "//third_party/pigweed/src/pw_cpu_exception_risc_v:tests", "//third_party/pigweed/src/pw_crypto:tests", "//third_party/pigweed/src/pw_digital_io:tests", "//third_party/pigweed/src/pw_digital_io_linux:tests", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_digital_io_rp2040:tests", "//third_party/pigweed/src/pw_docgen:tests", "//third_party/pigweed/src/pw_doctor:tests", "//third_party/pigweed/src/pw_emu:tests", "//third_party/pigweed/src/pw_env_setup:tests", "//third_party/pigweed/src/pw_env_setup_zephyr:tests", "//third_party/pigweed/src/pw_file:tests", "//third_party/pigweed/src/pw_format:tests", "//third_party/pigweed/src/pw_function:tests", "//third_party/pigweed/src/pw_fuzzer:tests", "//third_party/pigweed/src/pw_grpc:tests", "//third_party/pigweed/src/pw_hdlc:tests", "//third_party/pigweed/src/pw_hex_dump:tests", "//third_party/pigweed/src/pw_i2c:tests", "//third_party/pigweed/src/pw_i2c_linux:tests", "//third_party/pigweed/src/pw_i2c_mcuxpresso:tests", "//third_party/pigweed/src/pw_i2c_rp2040:tests", "//third_party/pigweed/src/pw_ide:tests", "//third_party/pigweed/src/pw_interrupt:tests", "//third_party/pigweed/src/pw_interrupt_cortex_m:tests", "//third_party/pigweed/src/pw_interrupt_xtensa:tests", "//third_party/pigweed/src/pw_interrupt_zephyr:tests", "//third_party/pigweed/src/pw_intrusive_ptr:tests", "//third_party/pigweed/src/pw_json:tests", "//third_party/pigweed/src/pw_kvs:tests", "//third_party/pigweed/src/pw_libc:tests", "//third_party/pigweed/src/pw_libcxx:tests", "//third_party/pigweed/src/pw_log:tests", "//third_party/pigweed/src/pw_log_android:tests", "//third_party/pigweed/src/pw_log_basic:tests", "//third_party/pigweed/src/pw_log_null:tests", "//third_party/pigweed/src/pw_log_rpc:tests", "//third_party/pigweed/src/pw_log_string:tests", "//third_party/pigweed/src/pw_log_tokenized:tests", "//third_party/pigweed/src/pw_log_zephyr:tests", "//third_party/pigweed/src/pw_malloc:tests", "//third_party/pigweed/src/pw_malloc_freelist:tests", "//third_party/pigweed/src/pw_malloc_freertos:tests", "//third_party/pigweed/src/pw_metric:tests", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:tests", "//third_party/pigweed/src/pw_module:tests", "//third_party/pigweed/src/pw_multibuf:tests", "//third_party/pigweed/src/pw_multisink:tests", "//third_party/pigweed/src/pw_package:tests", "//third_party/pigweed/src/pw_perf_test:tests", "//third_party/pigweed/src/pw_persistent_ram:tests", "//third_party/pigweed/src/pw_polyfill:tests", "//third_party/pigweed/src/pw_preprocessor:tests", "//third_party/pigweed/src/pw_presubmit:tests", "//third_party/pigweed/src/pw_protobuf:tests", "//third_party/pigweed/src/pw_protobuf_compiler:tests", "//third_party/pigweed/src/pw_random:tests", "//third_party/pigweed/src/pw_result:tests", "//third_party/pigweed/src/pw_ring_buffer:tests", "//third_party/pigweed/src/pw_router:tests", "//third_party/pigweed/src/pw_rpc:tests", "//third_party/pigweed/src/pw_rpc_transport:tests", "//third_party/pigweed/src/pw_rust:tests", "//third_party/pigweed/src/pw_sensor:tests", "//third_party/pigweed/src/pw_snapshot:tests", "//third_party/pigweed/src/pw_software_update:tests", "//third_party/pigweed/src/pw_span:tests", "//third_party/pigweed/src/pw_spi:tests", "//third_party/pigweed/src/pw_spi_linux:tests", "//third_party/pigweed/src/pw_spi_mcuxpresso:tests", "//third_party/pigweed/src/pw_spi_rp2040:tests", "//third_party/pigweed/src/pw_status:tests", "//third_party/pigweed/src/pw_stm32cube_build:tests", "//third_party/pigweed/src/pw_stream:tests", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:tests", "//third_party/pigweed/src/pw_stream_uart_linux:tests", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:tests", "//third_party/pigweed/src/pw_string:tests", "//third_party/pigweed/src/pw_symbolizer:tests", "//third_party/pigweed/src/pw_sync:tests", "//third_party/pigweed/src/pw_sync_baremetal:tests", "//third_party/pigweed/src/pw_sync_embos:tests", "//third_party/pigweed/src/pw_sync_freertos:tests", "//third_party/pigweed/src/pw_sync_stl:tests", "//third_party/pigweed/src/pw_sync_threadx:tests", "//third_party/pigweed/src/pw_sync_zephyr:tests", "//third_party/pigweed/src/pw_sys_io:tests", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:tests", "//third_party/pigweed/src/pw_sys_io_arduino:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:tests", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:tests", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_sys_io_rp2040:tests", "//third_party/pigweed/src/pw_sys_io_stdio:tests", "//third_party/pigweed/src/pw_sys_io_stm32cube:tests", "//third_party/pigweed/src/pw_sys_io_zephyr:tests", "//third_party/pigweed/src/pw_system:tests", "//third_party/pigweed/src/pw_target_runner:tests", "//third_party/pigweed/src/pw_thread:tests", "//third_party/pigweed/src/pw_thread_embos:tests", "//third_party/pigweed/src/pw_thread_freertos:tests", "//third_party/pigweed/src/pw_thread_stl:tests", "//third_party/pigweed/src/pw_thread_threadx:tests", "//third_party/pigweed/src/pw_thread_zephyr:tests", "//third_party/pigweed/src/pw_tls_client:tests", "//third_party/pigweed/src/pw_tls_client_boringssl:tests", "//third_party/pigweed/src/pw_tls_client_mbedtls:tests", "//third_party/pigweed/src/pw_tokenizer:tests", "//third_party/pigweed/src/pw_toolchain:tests", "//third_party/pigweed/src/pw_toolchain_bazel:tests", "//third_party/pigweed/src/pw_trace:tests", "//third_party/pigweed/src/pw_trace_tokenized:tests", "//third_party/pigweed/src/pw_transfer:tests", "//third_party/pigweed/src/pw_uart:tests", "//third_party/pigweed/src/pw_unit_test:tests", "//third_party/pigweed/src/pw_unit_test_zephyr:tests", "//third_party/pigweed/src/pw_varint:tests", "//third_party/pigweed/src/pw_watch:tests", "//third_party/pigweed/src/pw_web:tests", "//third_party/pigweed/src/pw_work_queue:tests"]`
+**Current value (from the default):** `["//third_party/pigweed/src/docker:tests", "//third_party/pigweed/src/pw_alignment:tests", "//third_party/pigweed/src/pw_allocator:tests", "//third_party/pigweed/src/pw_analog:tests", "//third_party/pigweed/src/pw_android_toolchain:tests", "//third_party/pigweed/src/pw_arduino_build:tests", "//third_party/pigweed/src/pw_assert:tests", "//third_party/pigweed/src/pw_assert_basic:tests", "//third_party/pigweed/src/pw_assert_log:tests", "//third_party/pigweed/src/pw_assert_tokenized:tests", "//third_party/pigweed/src/pw_assert_zephyr:tests", "//third_party/pigweed/src/pw_async:tests", "//third_party/pigweed/src/pw_async2:tests", "//third_party/pigweed/src/pw_async2_basic:tests", "//third_party/pigweed/src/pw_async2_epoll:tests", "//third_party/pigweed/src/pw_async_basic:tests", "//third_party/pigweed/src/pw_base64:tests", "//third_party/pigweed/src/pw_bloat:tests", "//third_party/pigweed/src/pw_blob_store:tests", "//third_party/pigweed/src/pw_bluetooth:tests", "//third_party/pigweed/src/pw_bluetooth_hci:tests", "//third_party/pigweed/src/pw_bluetooth_profiles:tests", "//third_party/pigweed/src/pw_bluetooth_proxy:tests", "//third_party/pigweed/src/pw_bluetooth_sapphire:tests", "//third_party/pigweed/src/pw_boot:tests", "//third_party/pigweed/src/pw_boot_cortex_m:tests", "//third_party/pigweed/src/pw_build:tests", "//third_party/pigweed/src/pw_build_android:tests", "//third_party/pigweed/src/pw_build_info:tests", "//third_party/pigweed/src/pw_build_mcuxpresso:tests", "//third_party/pigweed/src/pw_bytes:tests", "//third_party/pigweed/src/pw_channel:tests", "//third_party/pigweed/src/pw_checksum:tests", "//third_party/pigweed/src/pw_chre:tests", "//third_party/pigweed/src/pw_chrono:tests", "//third_party/pigweed/src/pw_chrono_embos:tests", "//third_party/pigweed/src/pw_chrono_freertos:tests", "//third_party/pigweed/src/pw_chrono_rp2040:tests", "//third_party/pigweed/src/pw_chrono_stl:tests", "//third_party/pigweed/src/pw_chrono_threadx:tests", "//third_party/pigweed/src/pw_chrono_zephyr:tests", "//third_party/pigweed/src/pw_cli:tests", "//third_party/pigweed/src/pw_compilation_testing:tests", "//third_party/pigweed/src/pw_config_loader:tests", "//third_party/pigweed/src/pw_console:tests", "//third_party/pigweed/src/pw_containers:tests", "//third_party/pigweed/src/pw_cpu_exception:tests", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:tests", "//third_party/pigweed/src/pw_cpu_exception_risc_v:tests", "//third_party/pigweed/src/pw_crypto:tests", "//third_party/pigweed/src/pw_digital_io:tests", "//third_party/pigweed/src/pw_digital_io_linux:tests", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_digital_io_rp2040:tests", "//third_party/pigweed/src/pw_dma_mcuxpresso:tests", "//third_party/pigweed/src/pw_docgen:tests", "//third_party/pigweed/src/pw_doctor:tests", "//third_party/pigweed/src/pw_emu:tests", "//third_party/pigweed/src/pw_env_setup:tests", "//third_party/pigweed/src/pw_env_setup_zephyr:tests", "//third_party/pigweed/src/pw_file:tests", "//third_party/pigweed/src/pw_format:tests", "//third_party/pigweed/src/pw_function:tests", "//third_party/pigweed/src/pw_fuzzer:tests", "//third_party/pigweed/src/pw_grpc:tests", "//third_party/pigweed/src/pw_hdlc:tests", "//third_party/pigweed/src/pw_hex_dump:tests", "//third_party/pigweed/src/pw_i2c:tests", "//third_party/pigweed/src/pw_i2c_linux:tests", "//third_party/pigweed/src/pw_i2c_mcuxpresso:tests", "//third_party/pigweed/src/pw_i2c_rp2040:tests", "//third_party/pigweed/src/pw_ide:tests", "//third_party/pigweed/src/pw_interrupt:tests", "//third_party/pigweed/src/pw_interrupt_cortex_m:tests", "//third_party/pigweed/src/pw_interrupt_xtensa:tests", "//third_party/pigweed/src/pw_interrupt_zephyr:tests", "//third_party/pigweed/src/pw_intrusive_ptr:tests", "//third_party/pigweed/src/pw_json:tests", "//third_party/pigweed/src/pw_kvs:tests", "//third_party/pigweed/src/pw_libc:tests", "//third_party/pigweed/src/pw_libcxx:tests", "//third_party/pigweed/src/pw_log:tests", "//third_party/pigweed/src/pw_log_android:tests", "//third_party/pigweed/src/pw_log_basic:tests", "//third_party/pigweed/src/pw_log_null:tests", "//third_party/pigweed/src/pw_log_rpc:tests", "//third_party/pigweed/src/pw_log_string:tests", "//third_party/pigweed/src/pw_log_tokenized:tests", "//third_party/pigweed/src/pw_log_zephyr:tests", "//third_party/pigweed/src/pw_malloc:tests", "//third_party/pigweed/src/pw_malloc_freelist:tests", "//third_party/pigweed/src/pw_malloc_freertos:tests", "//third_party/pigweed/src/pw_metric:tests", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:tests", "//third_party/pigweed/src/pw_module:tests", "//third_party/pigweed/src/pw_multibuf:tests", "//third_party/pigweed/src/pw_multisink:tests", "//third_party/pigweed/src/pw_package:tests", "//third_party/pigweed/src/pw_perf_test:tests", "//third_party/pigweed/src/pw_persistent_ram:tests", "//third_party/pigweed/src/pw_polyfill:tests", "//third_party/pigweed/src/pw_preprocessor:tests", "//third_party/pigweed/src/pw_presubmit:tests", "//third_party/pigweed/src/pw_protobuf:tests", "//third_party/pigweed/src/pw_protobuf_compiler:tests", "//third_party/pigweed/src/pw_random:tests", "//third_party/pigweed/src/pw_result:tests", "//third_party/pigweed/src/pw_ring_buffer:tests", "//third_party/pigweed/src/pw_router:tests", "//third_party/pigweed/src/pw_rpc:tests", "//third_party/pigweed/src/pw_rpc_transport:tests", "//third_party/pigweed/src/pw_rust:tests", "//third_party/pigweed/src/pw_sensor:tests", "//third_party/pigweed/src/pw_snapshot:tests", "//third_party/pigweed/src/pw_software_update:tests", "//third_party/pigweed/src/pw_span:tests", "//third_party/pigweed/src/pw_spi:tests", "//third_party/pigweed/src/pw_spi_linux:tests", "//third_party/pigweed/src/pw_spi_mcuxpresso:tests", "//third_party/pigweed/src/pw_spi_rp2040:tests", "//third_party/pigweed/src/pw_status:tests", "//third_party/pigweed/src/pw_stm32cube_build:tests", "//third_party/pigweed/src/pw_stream:tests", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:tests", "//third_party/pigweed/src/pw_stream_uart_linux:tests", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:tests", "//third_party/pigweed/src/pw_string:tests", "//third_party/pigweed/src/pw_symbolizer:tests", "//third_party/pigweed/src/pw_sync:tests", "//third_party/pigweed/src/pw_sync_baremetal:tests", "//third_party/pigweed/src/pw_sync_embos:tests", "//third_party/pigweed/src/pw_sync_freertos:tests", "//third_party/pigweed/src/pw_sync_stl:tests", "//third_party/pigweed/src/pw_sync_threadx:tests", "//third_party/pigweed/src/pw_sync_zephyr:tests", "//third_party/pigweed/src/pw_sys_io:tests", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:tests", "//third_party/pigweed/src/pw_sys_io_arduino:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:tests", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:tests", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_sys_io_rp2040:tests", "//third_party/pigweed/src/pw_sys_io_stdio:tests", "//third_party/pigweed/src/pw_sys_io_stm32cube:tests", "//third_party/pigweed/src/pw_sys_io_zephyr:tests", "//third_party/pigweed/src/pw_system:tests", "//third_party/pigweed/src/pw_target_runner:tests", "//third_party/pigweed/src/pw_thread:tests", "//third_party/pigweed/src/pw_thread_embos:tests", "//third_party/pigweed/src/pw_thread_freertos:tests", "//third_party/pigweed/src/pw_thread_stl:tests", "//third_party/pigweed/src/pw_thread_threadx:tests", "//third_party/pigweed/src/pw_thread_zephyr:tests", "//third_party/pigweed/src/pw_tls_client:tests", "//third_party/pigweed/src/pw_tls_client_boringssl:tests", "//third_party/pigweed/src/pw_tls_client_mbedtls:tests", "//third_party/pigweed/src/pw_tokenizer:tests", "//third_party/pigweed/src/pw_toolchain:tests", "//third_party/pigweed/src/pw_toolchain_bazel:tests", "//third_party/pigweed/src/pw_trace:tests", "//third_party/pigweed/src/pw_trace_tokenized:tests", "//third_party/pigweed/src/pw_transfer:tests", "//third_party/pigweed/src/pw_uart:tests", "//third_party/pigweed/src/pw_unit_test:tests", "//third_party/pigweed/src/pw_unit_test_zephyr:tests", "//third_party/pigweed/src/pw_varint:tests", "//third_party/pigweed/src/pw_watch:tests", "//third_party/pigweed/src/pw_web:tests", "//third_party/pigweed/src/pw_work_queue:tests"]`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:393
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:395
### pw_modules
A list with paths to all Pigweed module. DO NOT SET THIS BUILD ARGUMENT!
-**Current value (from the default):** `["//third_party/pigweed/src/docker", "//third_party/pigweed/src/pw_alignment", "//third_party/pigweed/src/pw_allocator", "//third_party/pigweed/src/pw_analog", "//third_party/pigweed/src/pw_android_toolchain", "//third_party/pigweed/src/pw_arduino_build", "//third_party/pigweed/src/pw_assert", "//third_party/pigweed/src/pw_assert_basic", "//third_party/pigweed/src/pw_assert_log", "//third_party/pigweed/src/pw_assert_tokenized", "//third_party/pigweed/src/pw_assert_zephyr", "//third_party/pigweed/src/pw_async", "//third_party/pigweed/src/pw_async2", "//third_party/pigweed/src/pw_async2_basic", "//third_party/pigweed/src/pw_async2_epoll", "//third_party/pigweed/src/pw_async_basic", "//third_party/pigweed/src/pw_base64", "//third_party/pigweed/src/pw_bloat", "//third_party/pigweed/src/pw_blob_store", "//third_party/pigweed/src/pw_bluetooth", "//third_party/pigweed/src/pw_bluetooth_hci", "//third_party/pigweed/src/pw_bluetooth_profiles", "//third_party/pigweed/src/pw_bluetooth_proxy", "//third_party/pigweed/src/pw_bluetooth_sapphire", "//third_party/pigweed/src/pw_boot", "//third_party/pigweed/src/pw_boot_cortex_m", "//third_party/pigweed/src/pw_build", "//third_party/pigweed/src/pw_build_android", "//third_party/pigweed/src/pw_build_info", "//third_party/pigweed/src/pw_build_mcuxpresso", "//third_party/pigweed/src/pw_bytes", "//third_party/pigweed/src/pw_channel", "//third_party/pigweed/src/pw_checksum", "//third_party/pigweed/src/pw_chre", "//third_party/pigweed/src/pw_chrono", "//third_party/pigweed/src/pw_chrono_embos", "//third_party/pigweed/src/pw_chrono_freertos", "//third_party/pigweed/src/pw_chrono_rp2040", "//third_party/pigweed/src/pw_chrono_stl", "//third_party/pigweed/src/pw_chrono_threadx", "//third_party/pigweed/src/pw_chrono_zephyr", "//third_party/pigweed/src/pw_cli", "//third_party/pigweed/src/pw_compilation_testing", "//third_party/pigweed/src/pw_config_loader", "//third_party/pigweed/src/pw_console", "//third_party/pigweed/src/pw_containers", "//third_party/pigweed/src/pw_cpu_exception", "//third_party/pigweed/src/pw_cpu_exception_cortex_m", "//third_party/pigweed/src/pw_cpu_exception_risc_v", "//third_party/pigweed/src/pw_crypto", "//third_party/pigweed/src/pw_digital_io", "//third_party/pigweed/src/pw_digital_io_linux", "//third_party/pigweed/src/pw_digital_io_mcuxpresso", "//third_party/pigweed/src/pw_digital_io_rp2040", "//third_party/pigweed/src/pw_docgen", "//third_party/pigweed/src/pw_doctor", "//third_party/pigweed/src/pw_emu", "//third_party/pigweed/src/pw_env_setup", "//third_party/pigweed/src/pw_env_setup_zephyr", "//third_party/pigweed/src/pw_file", "//third_party/pigweed/src/pw_format", "//third_party/pigweed/src/pw_function", "//third_party/pigweed/src/pw_fuzzer", "//third_party/pigweed/src/pw_grpc", "//third_party/pigweed/src/pw_hdlc", "//third_party/pigweed/src/pw_hex_dump", "//third_party/pigweed/src/pw_i2c", "//third_party/pigweed/src/pw_i2c_linux", "//third_party/pigweed/src/pw_i2c_mcuxpresso", "//third_party/pigweed/src/pw_i2c_rp2040", "//third_party/pigweed/src/pw_ide", "//third_party/pigweed/src/pw_interrupt", "//third_party/pigweed/src/pw_interrupt_cortex_m", "//third_party/pigweed/src/pw_interrupt_xtensa", "//third_party/pigweed/src/pw_interrupt_zephyr", "//third_party/pigweed/src/pw_intrusive_ptr", "//third_party/pigweed/src/pw_json", "//third_party/pigweed/src/pw_kvs", "//third_party/pigweed/src/pw_libc", "//third_party/pigweed/src/pw_libcxx", "//third_party/pigweed/src/pw_log", "//third_party/pigweed/src/pw_log_android", "//third_party/pigweed/src/pw_log_basic", "//third_party/pigweed/src/pw_log_null", "//third_party/pigweed/src/pw_log_rpc", "//third_party/pigweed/src/pw_log_string", "//third_party/pigweed/src/pw_log_tokenized", "//third_party/pigweed/src/pw_log_zephyr", "//third_party/pigweed/src/pw_malloc", "//third_party/pigweed/src/pw_malloc_freelist", "//third_party/pigweed/src/pw_malloc_freertos", "//third_party/pigweed/src/pw_metric", "//third_party/pigweed/src/pw_minimal_cpp_stdlib", "//third_party/pigweed/src/pw_module", "//third_party/pigweed/src/pw_multibuf", "//third_party/pigweed/src/pw_multisink", "//third_party/pigweed/src/pw_package", "//third_party/pigweed/src/pw_perf_test", "//third_party/pigweed/src/pw_persistent_ram", "//third_party/pigweed/src/pw_polyfill", "//third_party/pigweed/src/pw_preprocessor", "//third_party/pigweed/src/pw_presubmit", "//third_party/pigweed/src/pw_protobuf", "//third_party/pigweed/src/pw_protobuf_compiler", "//third_party/pigweed/src/pw_random", "//third_party/pigweed/src/pw_result", "//third_party/pigweed/src/pw_ring_buffer", "//third_party/pigweed/src/pw_router", "//third_party/pigweed/src/pw_rpc", "//third_party/pigweed/src/pw_rpc_transport", "//third_party/pigweed/src/pw_rust", "//third_party/pigweed/src/pw_sensor", "//third_party/pigweed/src/pw_snapshot", "//third_party/pigweed/src/pw_software_update", "//third_party/pigweed/src/pw_span", "//third_party/pigweed/src/pw_spi", "//third_party/pigweed/src/pw_spi_linux", "//third_party/pigweed/src/pw_spi_mcuxpresso", "//third_party/pigweed/src/pw_spi_rp2040", "//third_party/pigweed/src/pw_status", "//third_party/pigweed/src/pw_stm32cube_build", "//third_party/pigweed/src/pw_stream", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso", "//third_party/pigweed/src/pw_stream_uart_linux", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso", "//third_party/pigweed/src/pw_string", "//third_party/pigweed/src/pw_symbolizer", "//third_party/pigweed/src/pw_sync", "//third_party/pigweed/src/pw_sync_baremetal", "//third_party/pigweed/src/pw_sync_embos", "//third_party/pigweed/src/pw_sync_freertos", "//third_party/pigweed/src/pw_sync_stl", "//third_party/pigweed/src/pw_sync_threadx", "//third_party/pigweed/src/pw_sync_zephyr", "//third_party/pigweed/src/pw_sys_io", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk", "//third_party/pigweed/src/pw_sys_io_arduino", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2", "//third_party/pigweed/src/pw_sys_io_mcuxpresso", "//third_party/pigweed/src/pw_sys_io_rp2040", "//third_party/pigweed/src/pw_sys_io_stdio", "//third_party/pigweed/src/pw_sys_io_stm32cube", "//third_party/pigweed/src/pw_sys_io_zephyr", "//third_party/pigweed/src/pw_system", "//third_party/pigweed/src/pw_target_runner", "//third_party/pigweed/src/pw_thread", "//third_party/pigweed/src/pw_thread_embos", "//third_party/pigweed/src/pw_thread_freertos", "//third_party/pigweed/src/pw_thread_stl", "//third_party/pigweed/src/pw_thread_threadx", "//third_party/pigweed/src/pw_thread_zephyr", "//third_party/pigweed/src/pw_tls_client", "//third_party/pigweed/src/pw_tls_client_boringssl", "//third_party/pigweed/src/pw_tls_client_mbedtls", "//third_party/pigweed/src/pw_tokenizer", "//third_party/pigweed/src/pw_toolchain", "//third_party/pigweed/src/pw_toolchain_bazel", "//third_party/pigweed/src/pw_trace", "//third_party/pigweed/src/pw_trace_tokenized", "//third_party/pigweed/src/pw_transfer", "//third_party/pigweed/src/pw_uart", "//third_party/pigweed/src/pw_unit_test", "//third_party/pigweed/src/pw_unit_test_zephyr", "//third_party/pigweed/src/pw_varint", "//third_party/pigweed/src/pw_watch", "//third_party/pigweed/src/pw_web", "//third_party/pigweed/src/pw_work_queue"]`
+**Current value (from the default):** `["//third_party/pigweed/src/docker", "//third_party/pigweed/src/pw_alignment", "//third_party/pigweed/src/pw_allocator", "//third_party/pigweed/src/pw_analog", "//third_party/pigweed/src/pw_android_toolchain", "//third_party/pigweed/src/pw_arduino_build", "//third_party/pigweed/src/pw_assert", "//third_party/pigweed/src/pw_assert_basic", "//third_party/pigweed/src/pw_assert_log", "//third_party/pigweed/src/pw_assert_tokenized", "//third_party/pigweed/src/pw_assert_zephyr", "//third_party/pigweed/src/pw_async", "//third_party/pigweed/src/pw_async2", "//third_party/pigweed/src/pw_async2_basic", "//third_party/pigweed/src/pw_async2_epoll", "//third_party/pigweed/src/pw_async_basic", "//third_party/pigweed/src/pw_base64", "//third_party/pigweed/src/pw_bloat", "//third_party/pigweed/src/pw_blob_store", "//third_party/pigweed/src/pw_bluetooth", "//third_party/pigweed/src/pw_bluetooth_hci", "//third_party/pigweed/src/pw_bluetooth_profiles", "//third_party/pigweed/src/pw_bluetooth_proxy", "//third_party/pigweed/src/pw_bluetooth_sapphire", "//third_party/pigweed/src/pw_boot", "//third_party/pigweed/src/pw_boot_cortex_m", "//third_party/pigweed/src/pw_build", "//third_party/pigweed/src/pw_build_android", "//third_party/pigweed/src/pw_build_info", "//third_party/pigweed/src/pw_build_mcuxpresso", "//third_party/pigweed/src/pw_bytes", "//third_party/pigweed/src/pw_channel", "//third_party/pigweed/src/pw_checksum", "//third_party/pigweed/src/pw_chre", "//third_party/pigweed/src/pw_chrono", "//third_party/pigweed/src/pw_chrono_embos", "//third_party/pigweed/src/pw_chrono_freertos", "//third_party/pigweed/src/pw_chrono_rp2040", "//third_party/pigweed/src/pw_chrono_stl", "//third_party/pigweed/src/pw_chrono_threadx", "//third_party/pigweed/src/pw_chrono_zephyr", "//third_party/pigweed/src/pw_cli", "//third_party/pigweed/src/pw_compilation_testing", "//third_party/pigweed/src/pw_config_loader", "//third_party/pigweed/src/pw_console", "//third_party/pigweed/src/pw_containers", "//third_party/pigweed/src/pw_cpu_exception", "//third_party/pigweed/src/pw_cpu_exception_cortex_m", "//third_party/pigweed/src/pw_cpu_exception_risc_v", "//third_party/pigweed/src/pw_crypto", "//third_party/pigweed/src/pw_digital_io", "//third_party/pigweed/src/pw_digital_io_linux", "//third_party/pigweed/src/pw_digital_io_mcuxpresso", "//third_party/pigweed/src/pw_digital_io_rp2040", "//third_party/pigweed/src/pw_dma_mcuxpresso", "//third_party/pigweed/src/pw_docgen", "//third_party/pigweed/src/pw_doctor", "//third_party/pigweed/src/pw_emu", "//third_party/pigweed/src/pw_env_setup", "//third_party/pigweed/src/pw_env_setup_zephyr", "//third_party/pigweed/src/pw_file", "//third_party/pigweed/src/pw_format", "//third_party/pigweed/src/pw_function", "//third_party/pigweed/src/pw_fuzzer", "//third_party/pigweed/src/pw_grpc", "//third_party/pigweed/src/pw_hdlc", "//third_party/pigweed/src/pw_hex_dump", "//third_party/pigweed/src/pw_i2c", "//third_party/pigweed/src/pw_i2c_linux", "//third_party/pigweed/src/pw_i2c_mcuxpresso", "//third_party/pigweed/src/pw_i2c_rp2040", "//third_party/pigweed/src/pw_ide", "//third_party/pigweed/src/pw_interrupt", "//third_party/pigweed/src/pw_interrupt_cortex_m", "//third_party/pigweed/src/pw_interrupt_xtensa", "//third_party/pigweed/src/pw_interrupt_zephyr", "//third_party/pigweed/src/pw_intrusive_ptr", "//third_party/pigweed/src/pw_json", "//third_party/pigweed/src/pw_kvs", "//third_party/pigweed/src/pw_libc", "//third_party/pigweed/src/pw_libcxx", "//third_party/pigweed/src/pw_log", "//third_party/pigweed/src/pw_log_android", "//third_party/pigweed/src/pw_log_basic", "//third_party/pigweed/src/pw_log_null", "//third_party/pigweed/src/pw_log_rpc", "//third_party/pigweed/src/pw_log_string", "//third_party/pigweed/src/pw_log_tokenized", "//third_party/pigweed/src/pw_log_zephyr", "//third_party/pigweed/src/pw_malloc", "//third_party/pigweed/src/pw_malloc_freelist", "//third_party/pigweed/src/pw_malloc_freertos", "//third_party/pigweed/src/pw_metric", "//third_party/pigweed/src/pw_minimal_cpp_stdlib", "//third_party/pigweed/src/pw_module", "//third_party/pigweed/src/pw_multibuf", "//third_party/pigweed/src/pw_multisink", "//third_party/pigweed/src/pw_package", "//third_party/pigweed/src/pw_perf_test", "//third_party/pigweed/src/pw_persistent_ram", "//third_party/pigweed/src/pw_polyfill", "//third_party/pigweed/src/pw_preprocessor", "//third_party/pigweed/src/pw_presubmit", "//third_party/pigweed/src/pw_protobuf", "//third_party/pigweed/src/pw_protobuf_compiler", "//third_party/pigweed/src/pw_random", "//third_party/pigweed/src/pw_result", "//third_party/pigweed/src/pw_ring_buffer", "//third_party/pigweed/src/pw_router", "//third_party/pigweed/src/pw_rpc", "//third_party/pigweed/src/pw_rpc_transport", "//third_party/pigweed/src/pw_rust", "//third_party/pigweed/src/pw_sensor", "//third_party/pigweed/src/pw_snapshot", "//third_party/pigweed/src/pw_software_update", "//third_party/pigweed/src/pw_span", "//third_party/pigweed/src/pw_spi", "//third_party/pigweed/src/pw_spi_linux", "//third_party/pigweed/src/pw_spi_mcuxpresso", "//third_party/pigweed/src/pw_spi_rp2040", "//third_party/pigweed/src/pw_status", "//third_party/pigweed/src/pw_stm32cube_build", "//third_party/pigweed/src/pw_stream", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso", "//third_party/pigweed/src/pw_stream_uart_linux", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso", "//third_party/pigweed/src/pw_string", "//third_party/pigweed/src/pw_symbolizer", "//third_party/pigweed/src/pw_sync", "//third_party/pigweed/src/pw_sync_baremetal", "//third_party/pigweed/src/pw_sync_embos", "//third_party/pigweed/src/pw_sync_freertos", "//third_party/pigweed/src/pw_sync_stl", "//third_party/pigweed/src/pw_sync_threadx", "//third_party/pigweed/src/pw_sync_zephyr", "//third_party/pigweed/src/pw_sys_io", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk", "//third_party/pigweed/src/pw_sys_io_arduino", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2", "//third_party/pigweed/src/pw_sys_io_mcuxpresso", "//third_party/pigweed/src/pw_sys_io_rp2040", "//third_party/pigweed/src/pw_sys_io_stdio", "//third_party/pigweed/src/pw_sys_io_stm32cube", "//third_party/pigweed/src/pw_sys_io_zephyr", "//third_party/pigweed/src/pw_system", "//third_party/pigweed/src/pw_target_runner", "//third_party/pigweed/src/pw_thread", "//third_party/pigweed/src/pw_thread_embos", "//third_party/pigweed/src/pw_thread_freertos", "//third_party/pigweed/src/pw_thread_stl", "//third_party/pigweed/src/pw_thread_threadx", "//third_party/pigweed/src/pw_thread_zephyr", "//third_party/pigweed/src/pw_tls_client", "//third_party/pigweed/src/pw_tls_client_boringssl", "//third_party/pigweed/src/pw_tls_client_mbedtls", "//third_party/pigweed/src/pw_tokenizer", "//third_party/pigweed/src/pw_toolchain", "//third_party/pigweed/src/pw_toolchain_bazel", "//third_party/pigweed/src/pw_trace", "//third_party/pigweed/src/pw_trace_tokenized", "//third_party/pigweed/src/pw_transfer", "//third_party/pigweed/src/pw_uart", "//third_party/pigweed/src/pw_unit_test", "//third_party/pigweed/src/pw_unit_test_zephyr", "//third_party/pigweed/src/pw_varint", "//third_party/pigweed/src/pw_watch", "//third_party/pigweed/src/pw_web", "//third_party/pigweed/src/pw_work_queue"]`
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:220
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:221
### pw_preprocessor_CONFIG
diff --git a/docs/reference/hardware/_drivers_epitaphs.yaml b/docs/reference/hardware/_drivers_epitaphs.yaml
index e57a421..f180509 100644
--- a/docs/reference/hardware/_drivers_epitaphs.yaml
+++ b/docs/reference/hardware/_drivers_epitaphs.yaml
@@ -626,3 +626,15 @@
available_in_git: 'd60145af7b3e75ada3b25eb4c24d49bd9636c19f'
areas: ['Serial']
path: '/src/devices/serial/drivers/serial-async'
+- short_description: 'Intel HD Audio ELD (EDID-like data) support in the display coordinator driver'
+ deletion_reason: 'HD Audio on HDMI is not actively used or tested on Intel NUC devices. Current implementation blocks display driver migration to DFv2'
+ gerrit_change_id: '1046392'
+ available_in_git: 'dd7557d95161c1e30014d441ce2df679eb1814f0'
+ areas: ['Display', 'Audio']
+ path: 'src/graphics/display/drivers/coordinator/eld.cc'
+- short_description: 'Intel HD Audio ELD (EDID-like data) setup on intel-i915 driver'
+ deletion_reason: 'HD Audio on HDMI is not actively used or tested on Intel NUC devices. Current implementation blocks display driver migration to DFv2'
+ gerrit_change_id: '1046393'
+ available_in_git: 'dd7557d95161c1e30014d441ce2df679eb1814f0'
+ areas: ['Display', 'Audio']
+ path: 'src/graphics/display/drivers/intel-i915/intel-i915.cc'
diff --git a/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl b/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl
index bd11ac3..73b3129 100644
--- a/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl
+++ b/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl
@@ -505,19 +505,6 @@
config_stamp ConfigStamp;
}) -> ();
- /// Set ELD for one display.
- ///
- /// This method is called independently from the CheckConfiguration and ApplyConfiguration
- /// methods. The display_id may be unconfigured at the time this method is called.
- /// raw_eld is the ELD raw data formatted according to the HDA specification version 1.0a
- /// section 7.3.3.34.1.
- /// https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf
- /// The driver must not retain references to the ELD after this function returns.
- strict SetEld(struct {
- display_id uint64;
- raw_eld vector<uint8>:MAX;
- }) -> ();
-
/// Conveys the display hardware's limitations on image buffers to sysmem.
///
/// The sysmem BufferCollection imported with `collection_id` will receive
diff --git a/sdk/banjo/fuchsia.hardware.scpi/BUILD.gn b/sdk/banjo/fuchsia.hardware.scpi/BUILD.gn
deleted file mode 100644
index c23e0e3..0000000
--- a/sdk/banjo/fuchsia.hardware.scpi/BUILD.gn
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.hardware.scpi") {
- sources = [ "scpi.fidl" ]
- public_deps = [ "//zircon/vdso/zx" ]
- enable_banjo = true
-}
diff --git a/sdk/banjo/fuchsia.hardware.scpi/scpi.fidl b/sdk/banjo/fuchsia.hardware.scpi/scpi.fidl
deleted file mode 100644
index 1b0161a..0000000
--- a/sdk/banjo/fuchsia.hardware.scpi/scpi.fidl
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-library fuchsia.hardware.scpi;
-
-using zx;
-
-const MAX_DVFS_OPPS uint32 = 16;
-
-type ScpiOppEntry = struct {
- /// The operating point frequency in Hz.
- freq_hz uint32;
- /// The operating point voltage in microvolts.
- volt_uv uint32;
-};
-
-type ScpiOpp = struct {
- /// The device's operating points.
- opp array<ScpiOppEntry, MAX_DVFS_OPPS>;
- /// In microseconds.
- latency uint32;
- /// The number of operating points in opp.
- count uint32;
-};
-
-@transport("Banjo")
-@banjo_layout("ddk-protocol")
-closed protocol Scpi {
- strict GetSensor(struct {
- name string:MAX;
- }) -> (struct {
- s zx.Status;
- sensor_id uint32;
- });
- strict GetSensorValue(struct {
- sensor_id uint32;
- }) -> (struct {
- s zx.Status;
- sensor_value uint32;
- });
- strict GetDvfsInfo(struct {
- power_domain uint8;
- }) -> (struct {
- s zx.Status;
- opps ScpiOpp;
- });
- strict GetDvfsIdx(struct {
- power_domain uint8;
- }) -> (struct {
- s zx.Status;
- index uint16;
- });
- strict SetDvfsIdx(struct {
- power_domain uint8;
- index uint16;
- }) -> (struct {
- s zx.Status;
- });
-};
diff --git a/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl b/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl
index 27c39f9..4b8d81d 100644
--- a/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl
+++ b/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl
@@ -215,18 +215,6 @@
config_stamp fuchsia.hardware.display.types.ConfigStamp;
}) -> ();
- /// Set ELD (EDID Like Data, audio info in EDID) for one display.
- ///
- /// This method is called independently from the CheckConfiguration and
- /// ApplyConfiguration methods. The display_id may be unconfigured at the
- /// time this method is called. raw_eld is the ELD raw data formatted
- /// according to the HDA specification version 1.0a section 7.3.3.34.1.
- /// https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf
- flexible SetEld(struct {
- display_id uint64;
- raw_eld vector<uint8>:MAX;
- }) -> ();
-
/// Set sysmem buffer collection contraints needed to ensure an image can be
/// imported with `config` on the imported BufferCollecition with
/// `collection_id`.
diff --git a/src/connectivity/network/netstack3/core/BUILD.gn b/src/connectivity/network/netstack3/core/BUILD.gn
index 95be012..602c8cf 100644
--- a/src/connectivity/network/netstack3/core/BUILD.gn
+++ b/src/connectivity/network/netstack3/core/BUILD.gn
@@ -33,8 +33,6 @@
}
configs -= [ "//build/config/rust/lints:allow_unused_results" ]
sources = [
- "src/algorithm.rs",
- "src/algorithm/port_alloc.rs",
"src/api.rs",
"src/benchmarks.rs",
"src/context.rs",
@@ -71,6 +69,7 @@
"src/ip/device/integration.rs",
"src/ip/device/nud.rs",
"src/ip/device/nud/api.rs",
+ "src/ip/device/opaque_iid.rs",
"src/ip/device/route_discovery.rs",
"src/ip/device/router_solicitation.rs",
"src/ip/device/slaac.rs",
diff --git a/src/connectivity/network/netstack3/core/base/BUILD.gn b/src/connectivity/network/netstack3/core/base/BUILD.gn
index 53dfd50..7a13f82 100644
--- a/src/connectivity/network/netstack3/core/base/BUILD.gn
+++ b/src/connectivity/network/netstack3/core/base/BUILD.gn
@@ -21,6 +21,7 @@
"src/frame.rs",
"src/inspect.rs",
"src/lib.rs",
+ "src/port_alloc.rs",
"src/resource_references.rs",
"src/rng.rs",
"src/testutil/addr.rs",
diff --git a/src/connectivity/network/netstack3/core/base/src/lib.rs b/src/connectivity/network/netstack3/core/base/src/lib.rs
index 21cc978..30e767c 100644
--- a/src/connectivity/network/netstack3/core/base/src/lib.rs
+++ b/src/connectivity/network/netstack3/core/base/src/lib.rs
@@ -21,6 +21,7 @@
mod event;
mod frame;
mod inspect;
+mod port_alloc;
mod resource_references;
mod rng;
mod time;
@@ -38,6 +39,7 @@
pub use event::{CoreEventContext, EventContext};
pub use frame::{ReceivableFrameMeta, RecvFrameContext, SendFrameContext, SendableFrameMeta};
pub use inspect::{Inspectable, InspectableValue, Inspector, InspectorDeviceExt};
+pub use port_alloc::{simple_randomized_port_alloc, EphemeralPort, PortAllocImpl};
pub use resource_references::{
DeferredResourceRemovalContext, ReferenceNotifiers, RemoveResourceResult,
RemoveResourceResultWithContext,
diff --git a/src/connectivity/network/netstack3/core/src/algorithm/port_alloc.rs b/src/connectivity/network/netstack3/core/base/src/port_alloc.rs
similarity index 83%
rename from src/connectivity/network/netstack3/core/src/algorithm/port_alloc.rs
rename to src/connectivity/network/netstack3/core/base/src/port_alloc.rs
index a52ec5c..9901b1c 100644
--- a/src/connectivity/network/netstack3/core/src/algorithm/port_alloc.rs
+++ b/src/connectivity/network/netstack3/core/base/src/port_alloc.rs
@@ -12,50 +12,16 @@
use rand::RngCore;
/// A port number.
-// NOTE(brunodalbo): `PortNumber` could be a trait, but given the expected use
-// of the PortAlloc algorithm is to allocate `u16` ports, it's just defined as a
-// type alias for simplicity.
-pub(crate) type PortNumber = u16;
-
-/// A common implementation of `HashableId` providing usual 3-tuple flow
-/// identifiers.
-///
-/// `ProtocolFlowId` provides the most common 3-tuple needed to be used when
-/// allocating ports: local IP, remote IP, and remote port number.
-#[derive(Hash, Debug)]
-pub(crate) struct ProtocolFlowId<A, P> {
- local_addr: A,
- remote_addr: A,
- remote_port: P,
-}
-
-impl<A, P> ProtocolFlowId<A, P> {
- /// Creates a new `ProtocolFlowId` with given parameters.
- pub(crate) fn new(local_addr: A, remote_addr: A, remote_port: P) -> Self {
- Self { local_addr, remote_addr, remote_port }
- }
-
- /// Gets this `ProtocolFlowId`'s local address.
- pub(crate) fn local_addr(&self) -> &A {
- &self.local_addr
- }
-
- /// Gets this `ProtocolFlowId`'s remote address.
- pub(crate) fn remote_addr(&self) -> &A {
- &self.remote_addr
- }
-
- /// Gets this `ProtocolFlowId`'s remote port number.
- pub(crate) fn remote_port(&self) -> &P {
- &self.remote_port
- }
-}
+// NB: `PortNumber` could be a trait, but given the expected use of the
+// PortAlloc algorithm is to allocate `u16` ports, it's just defined as a type
+// alias for simplicity.
+type PortNumber = u16;
/// Trait that configures the behavior of port allocation.
///
/// `PortAllocImpl` provides the types, custom behaviors, and port availability
/// checks necessary to operate the port allocation algorithm.
-pub(crate) trait PortAllocImpl {
+pub trait PortAllocImpl {
/// The range of ports that can be allocated.
///
/// Local ports used in transport protocols are called [Ephemeral Ports].
@@ -103,14 +69,14 @@
///
/// `EphemeralPort` is always guaranteed to contain a port that is within
/// `I::EPHEMERAL_RANGE`.
-pub(crate) struct EphemeralPort<I: PortAllocImpl + ?Sized> {
+pub struct EphemeralPort<I: PortAllocImpl + ?Sized> {
port: PortNumber,
_marker: PhantomData<I>,
}
impl<I: PortAllocImpl + ?Sized> EphemeralPort<I> {
/// Creates a new `EphemeralPort` with a port chosen randomly in `range`.
- pub(crate) fn new_random<R: RngCore>(rng: &mut R) -> Self {
+ pub fn new_random<R: RngCore>(rng: &mut R) -> Self {
let num_ephemeral = u32::from(I::EPHEMERAL_RANGE.end() - I::EPHEMERAL_RANGE.start()) + 1;
let port = I::EPHEMERAL_RANGE.start() + ((rng.next_u32() % num_ephemeral) as PortNumber);
Self { port, _marker: PhantomData }
@@ -118,7 +84,7 @@
/// Increments the current [`PortNumber`] to the next value in the contained
/// range, wrapping around to the start of the range.
- pub(crate) fn next(&mut self) {
+ pub fn next(&mut self) {
if self.port == *I::EPHEMERAL_RANGE.end() {
self.port = *I::EPHEMERAL_RANGE.start();
} else {
@@ -127,7 +93,7 @@
}
/// Gets the `PortNumber` value.
- pub(crate) fn get(&self) -> PortNumber {
+ pub fn get(&self) -> PortNumber {
self.port
}
}
@@ -135,7 +101,7 @@
/// Implements the [algorithm 1] as described in RFC 6056.
///
/// [algorithm 1]: https://datatracker.ietf.org/doc/html/rfc6056#section-3.3.1
-pub(crate) fn simple_randomized_port_alloc<I: PortAllocImpl + ?Sized, R: RngCore>(
+pub fn simple_randomized_port_alloc<I: PortAllocImpl + ?Sized, R: RngCore>(
rng: &mut R,
id: &I::Id,
state: &I,
diff --git a/src/connectivity/network/netstack3/core/lock-order/src/lock.rs b/src/connectivity/network/netstack3/core/lock-order/src/lock.rs
index fc81652..5afcbb9 100644
--- a/src/connectivity/network/netstack3/core/lock-order/src/lock.rs
+++ b/src/connectivity/network/netstack3/core/lock-order/src/lock.rs
@@ -71,6 +71,140 @@
fn access(&self) -> Self::Guard<'_>;
}
+/// Marks a type as offering ordered lock access for some inner type `T`.
+///
+/// This trait allows for types that are lock order sensitive to be defined in a
+/// separate crate than the lock levels themselves while nudging local code away
+/// from using the locks without regards for ordering.
+///
+/// The crate defining the lock levels can implement [`LockLevelFor`] to declare
+/// the lock level to access the field exposed by this implementation.
+pub trait OrderedLockAccess<T> {
+ /// The lock type that observes ordering.
+ ///
+ /// This should be a type that implements either [`ExclusiveLock`] or
+ /// [`ReadWriteLock`].
+ type Lock;
+ /// Returns a borrow to the order-aware lock.
+ ///
+ /// Note that this returns [`OrderedLockRef`] to further prevent out of
+ /// order lock usage. Once sealed into [`OrderedLockRef`], the borrow can
+ /// only be used via the blanket [`RwLockFor`] and [`LockFor`]
+ /// implementations provided by this crate.
+ fn ordered_lock_access(&self) -> OrderedLockRef<'_, Self::Lock>;
+}
+
+/// A borrowed order-aware lock.
+pub struct OrderedLockRef<'a, T>(&'a T);
+
+impl<'a, T> OrderedLockRef<'a, T> {
+ /// Creates a new `OrderedLockRef` with a borrow on `lock`.
+ pub fn new(lock: &'a T) -> Self {
+ Self(lock)
+ }
+}
+
+/// Declares a type as the lock level for some type `T` that exposes locked
+/// state of type `Self::Data`.
+///
+/// If `T` implements [`OrderedLockAccess`] for `Self::Data`, then the
+/// [`LockFor`] and [`RwLockFor`] traits can be used to gain access to the
+/// protected state `Data` within `T` at lock level `Self`.
+///
+/// See [`OrderedLockAccess`] for more details.
+pub trait LockLevelFor<T> {
+ /// The data type within `T` that this is a lock level for.
+ type Data;
+}
+
+/// Abstracts an exclusive lock (i.e. a Mutex).
+pub trait ExclusiveLock<T>: 'static {
+ /// The guard type returned when locking the lock.
+ type Guard<'l>: DerefMut<Target = T>;
+ /// Locks this lock.
+ fn lock(&self) -> Self::Guard<'_>;
+}
+
+/// Abstracts a read write lock (i.e. an RwLock).
+pub trait ReadWriteLock<T>: 'static {
+ /// The guard type returned when locking for reads (i.e. shared).
+ type ReadGuard<'l>: Deref<Target = T>;
+ /// The guard type returned when locking for writes (i.e. exclusive).
+ type WriteGuard<'l>: DerefMut<Target = T>;
+ /// Locks this lock for reading.
+ fn read_lock(&self) -> Self::ReadGuard<'_>;
+ /// Locks this lock for writing.
+ fn write_lock(&self) -> Self::WriteGuard<'_>;
+}
+
+impl<L, T> LockFor<L> for T
+where
+ L: LockLevelFor<T>,
+ T: OrderedLockAccess<L::Data>,
+ T::Lock: ExclusiveLock<L::Data>,
+{
+ type Data = L::Data;
+ type Guard<'l> = <T::Lock as ExclusiveLock<L::Data>>::Guard<'l>
+ where
+ Self: 'l;
+ fn lock(&self) -> Self::Guard<'_> {
+ let OrderedLockRef(lock) = self.ordered_lock_access();
+ lock.lock()
+ }
+}
+
+impl<L, T> RwLockFor<L> for T
+where
+ L: LockLevelFor<T>,
+ T: OrderedLockAccess<L::Data>,
+ T::Lock: ReadWriteLock<L::Data>,
+{
+ type Data = L::Data;
+ type ReadGuard<'l> = <T::Lock as ReadWriteLock<L::Data>>::ReadGuard<'l>
+ where
+ Self: 'l;
+ type WriteGuard<'l> = <T::Lock as ReadWriteLock<L::Data>>::WriteGuard<'l>
+ where
+ Self: 'l;
+ fn read_lock(&self) -> Self::ReadGuard<'_> {
+ let OrderedLockRef(lock) = self.ordered_lock_access();
+ lock.read_lock()
+ }
+ fn write_lock(&self) -> Self::WriteGuard<'_> {
+ let OrderedLockRef(lock) = self.ordered_lock_access();
+ lock.write_lock()
+ }
+}
+
+/// Declares a type that is an [`UnlockedAccess`] marker for some field `Data`
+/// within `T`.
+///
+/// This is the equivalent of [`LockLevelFor`] for [`UnlockedAccess`], but given
+/// unlocked access is freely available through borrows the foreign type can
+/// safely expose a getter.
+pub trait UnlockedAccessMarkerFor<T> {
+ /// The data type within `T` that this an unlocked access marker for.
+ type Data: 'static;
+
+ /// Retrieves `Self::Data` from `T`.
+ fn unlocked_access(t: &T) -> &Self::Data;
+}
+
+impl<L, T> UnlockedAccess<L> for T
+where
+ L: UnlockedAccessMarkerFor<T>,
+{
+ type Data = <L as UnlockedAccessMarkerFor<T>>::Data;
+
+ type Guard<'l> = &'l <L as UnlockedAccessMarkerFor<T>>::Data
+ where
+ Self: 'l;
+
+ fn access(&self) -> Self::Guard<'_> {
+ L::unlocked_access(self)
+ }
+}
+
#[cfg(test)]
mod example {
//! Example implementations of the traits in this crate.
diff --git a/src/connectivity/network/netstack3/core/src/device/ndp.rs b/src/connectivity/network/netstack3/core/src/device/ndp.rs
index b873fbe..41d8c92 100644
--- a/src/connectivity/network/netstack3/core/src/device/ndp.rs
+++ b/src/connectivity/network/netstack3/core/src/device/ndp.rs
@@ -141,7 +141,6 @@
use zerocopy::ByteSlice;
use crate::{
- algorithm::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
context::{
testutil::{FakeInstant, FakeNetwork, FakeNetworkLinks, StepResult},
InstantContext as _, RngContext as _,
@@ -159,6 +158,7 @@
Ipv6DeviceConfigurationUpdate,
},
get_ipv6_hop_limit,
+ opaque_iid::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
router_solicitation::{MAX_RTR_SOLICITATION_DELAY, RTR_SOLICITATION_INTERVAL},
slaac::{
self, InnerSlaacTimerId, SlaacBindingsContext, SlaacConfiguration,
diff --git a/src/connectivity/network/netstack3/core/src/ip/device.rs b/src/connectivity/network/netstack3/core/src/ip/device.rs
index c166fd9..f667088 100644
--- a/src/connectivity/network/netstack3/core/src/ip/device.rs
+++ b/src/connectivity/network/netstack3/core/src/ip/device.rs
@@ -9,6 +9,7 @@
pub(crate) mod dad;
pub(crate) mod integration;
pub(crate) mod nud;
+pub(crate) mod opaque_iid;
pub(crate) mod route_discovery;
pub(crate) mod router_solicitation;
pub(crate) mod slaac;
diff --git a/src/connectivity/network/netstack3/core/src/algorithm.rs b/src/connectivity/network/netstack3/core/src/ip/device/opaque_iid.rs
similarity index 98%
rename from src/connectivity/network/netstack3/core/src/algorithm.rs
rename to src/connectivity/network/netstack3/core/src/ip/device/opaque_iid.rs
index 4c200bf..319d456 100644
--- a/src/connectivity/network/netstack3/core/src/algorithm.rs
+++ b/src/connectivity/network/netstack3/core/src/ip/device/opaque_iid.rs
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-//! Common algorithms.
+//! Opaque interface identifier (IID) used in SLAAC.
use core::fmt::{self, Debug};
@@ -10,10 +10,6 @@
use net_types::ip::{Ipv6Addr, Subnet};
use rand::RngCore;
-mod port_alloc;
-
-pub(crate) use port_alloc::*;
-
/// The length in bytes of the `secret_key` argument to
/// [`generate_opaque_interface_identifier`].
const STABLE_IID_SECRET_KEY_BYTES: usize = 32;
diff --git a/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs b/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs
index c167984..1524866 100644
--- a/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs
+++ b/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs
@@ -23,7 +23,6 @@
use tracing::{debug, error, trace};
use crate::{
- algorithm::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
context::{
CoreTimerContext, CounterContext, HandleableTimer, InstantBindingsTypes, InstantContext,
RngContext, TimerBindingsTypes, TimerContext,
@@ -32,6 +31,7 @@
device::{self, AnyDevice, DeviceIdContext, Id, WeakId as _},
error::{ExistsError, NotFoundError},
ip::device::{
+ opaque_iid::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
state::{Lifetime, SlaacConfig, TemporarySlaacConfig},
AddressRemovedReason, Ipv6DeviceAddr,
},
diff --git a/src/connectivity/network/netstack3/core/src/lib.rs b/src/connectivity/network/netstack3/core/src/lib.rs
index e3abcb5..ee229749 100644
--- a/src/connectivity/network/netstack3/core/src/lib.rs
+++ b/src/connectivity/network/netstack3/core/src/lib.rs
@@ -25,7 +25,6 @@
// TODO(https://github.com/dtolnay/thiserror/pull/64): remove this module.
extern crate fakestd as std;
-mod algorithm;
mod api;
mod context;
mod counters;
@@ -42,6 +41,9 @@
#[cfg(any(test, feature = "testutils"))]
pub mod testutil;
+pub(crate) mod algorithm {
+ pub(crate) use netstack3_base::{simple_randomized_port_alloc, PortAllocImpl};
+}
pub(crate) mod convert {
pub(crate) use netstack3_base::{BidirectionalConverter, OwnedOrRefsBidirectionalConverter};
}
@@ -162,7 +164,6 @@
pub(crate) use base::*;
// Re-exported types.
- pub use crate::algorithm::StableIidSecret;
pub use base::{IpLayerEvent, ResolveRouteError};
pub use device::{
api::{AddIpAddrSubnetError, AddrSubnetAndManualConfigEither, SetIpAddressPropertiesError},
@@ -170,6 +171,7 @@
IpDeviceConfigurationUpdate, Ipv4DeviceConfigurationUpdate,
Ipv6DeviceConfigurationUpdate, UpdateIpConfigurationError,
},
+ opaque_iid::StableIidSecret,
slaac::{SlaacConfiguration, TemporarySlaacAddressConfiguration},
state::{
IpDeviceConfiguration, Ipv4AddrConfig, Ipv4DeviceConfigurationAndFlags,
diff --git a/src/connectivity/network/netstack3/core/src/socket/datagram.rs b/src/connectivity/network/netstack3/core/src/socket/datagram.rs
index c27bee2a..1afd165 100644
--- a/src/connectivity/network/netstack3/core/src/socket/datagram.rs
+++ b/src/connectivity/network/netstack3/core/src/socket/datagram.rs
@@ -29,7 +29,6 @@
use thiserror::Error;
use crate::{
- algorithm::ProtocolFlowId,
context::{ReferenceNotifiers, RngContext},
convert::{BidirectionalConverter, OwnedOrRefsBidirectionalConverter},
device::{self, AnyDevice, DeviceIdContext, StrongId as _, WeakId as _},
@@ -600,14 +599,12 @@
impl<A: IpAddress, D: crate::device::Id, LI, RI: Copy> ConnAddr<ConnIpAddr<A, LI, RI>, D> {
pub(crate) fn from_protocol_flow_and_local_port(
- id: &ProtocolFlowId<SocketIpAddr<A>, RI>,
+ id: &DatagramFlowId<A, RI>,
local_port: LI,
) -> Self {
+ let DatagramFlowId { local_ip, remote_ip, remote_id } = id;
Self {
- ip: ConnIpAddr {
- local: (*id.local_addr(), local_port),
- remote: (*id.remote_addr(), *id.remote_port()),
- },
+ ip: ConnIpAddr { local: (*local_ip, local_port), remote: (*remote_ip, *remote_id) },
device: None,
}
}
diff --git a/src/connectivity/network/netstack3/core/src/transport/integration.rs b/src/connectivity/network/netstack3/core/src/transport/integration.rs
index 3e778cd..2f161da 100644
--- a/src/connectivity/network/netstack3/core/src/transport/integration.rs
+++ b/src/connectivity/network/netstack3/core/src/transport/integration.rs
@@ -3,7 +3,7 @@
// found in the LICENSE file.
use lock_order::{
- lock::{RwLockFor, UnlockedAccess},
+ lock::{LockLevelFor, RwLockFor, UnlockedAccess},
relation::LockBefore,
wrap::prelude::*,
};
@@ -583,6 +583,12 @@
}
}
+impl<I: crate::transport::tcp::socket::DualStackIpExt, D: device::WeakId, BT: BindingsTypes>
+ LockLevelFor<TcpSocketId<I, D, BT>> for crate::lock_ordering::TcpSocketState<I>
+{
+ type Data = TcpSocketState<I, D, BT>;
+}
+
impl<I: crate::transport::tcp::socket::DualStackIpExt, BC: BindingsContext>
UnlockedAccess<crate::lock_ordering::TcpIsnGenerator<I>> for StackState<BC>
{
diff --git a/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs b/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs
index 71ede9f..1d0af87 100644
--- a/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs
+++ b/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs
@@ -32,6 +32,7 @@
use assert_matches::assert_matches;
use derivative::Derivative;
+use lock_order::lock::{OrderedLockAccess, OrderedLockRef};
use net_types::{
ip::{
GenericOverIp, Ip, IpAddr, IpAddress, IpInvariant, IpVersion, IpVersionMarker, Ipv4,
@@ -1555,10 +1556,15 @@
}
}
+struct TcpDualStackPortAlloc<'a, I: DualStackIpExt, D: device::WeakId, BT: TcpBindingsTypes>(
+ &'a BoundSocketMap<I, D, BT>,
+ &'a BoundSocketMap<I::OtherVersion, D, BT>,
+);
+
/// When binding to IPv6 ANY address (::), we need to allocate a port that is
/// available in both stacks.
impl<'a, I: DualStackIpExt, D: device::WeakId, BT: TcpBindingsTypes> PortAllocImpl
- for (&'a BoundSocketMap<I, D, BT>, &'a BoundSocketMap<I::OtherVersion, D, BT>)
+ for TcpDualStackPortAlloc<'a, I, D, BT>
{
const EPHEMERAL_RANGE: RangeInclusive<u16> =
<BoundSocketMap<I, D, BT> as PortAllocImpl>::EPHEMERAL_RANGE;
@@ -1566,7 +1572,7 @@
type PortAvailableArg = ();
fn is_port_available(&self, (): &Self::Id, port: u16, (): &Self::PortAvailableArg) -> bool {
- let (this, other) = self;
+ let Self(this, other) = self;
this.is_port_available(&None, port, &None) && other.is_port_available(&None, port, &None)
}
}
@@ -1793,25 +1799,12 @@
}
impl<I: DualStackIpExt, D: device::WeakId, BT: TcpBindingsTypes>
- lock_order::lock::RwLockFor<crate::lock_ordering::TcpSocketState<I>> for TcpSocketId<I, D, BT>
+ OrderedLockAccess<TcpSocketState<I, D, BT>> for TcpSocketId<I, D, BT>
{
- type Data = TcpSocketState<I, D, BT>;
-
- type ReadGuard<'l> = crate::sync::RwLockReadGuard<'l, Self::Data>
- where
- Self: 'l ;
- type WriteGuard<'l> = crate::sync::RwLockWriteGuard<'l, Self::Data>
- where
- Self: 'l ;
-
- fn read_lock(&self) -> Self::ReadGuard<'_> {
- let Self(l) = self;
- l.read()
- }
-
- fn write_lock(&self) -> Self::WriteGuard<'_> {
- let Self(l) = self;
- l.write()
+ type Lock = RwLock<TcpSocketState<I, D, BT>>;
+ fn ordered_lock_access(&self) -> OrderedLockRef<'_, Self::Lock> {
+ let Self(rc) = self;
+ OrderedLockRef::new(&*rc)
}
}
@@ -2228,12 +2221,16 @@
// stacks before `bind_inner` tries to make
// a decision, because it might give two
// unrelated ports which is undesired.
+ let port_alloc = TcpDualStackPortAlloc(
+ &demux.socketmap,
+ &other_demux.socketmap
+ );
let port = match port {
Some(port) => port,
None => match algorithm::simple_randomized_port_alloc(
&mut bindings_ctx.rng(),
&(),
- &(&demux.socketmap, &other_demux.socketmap),
+ &port_alloc,
&(),
){
Some(port) => NonZeroU16::new(port)
diff --git a/src/connectivity/network/netstack3/core/src/transport/udp.rs b/src/connectivity/network/netstack3/core/src/transport/udp.rs
index 157aeca..0d5267c 100644
--- a/src/connectivity/network/netstack3/core/src/transport/udp.rs
+++ b/src/connectivity/network/netstack3/core/src/transport/udp.rs
@@ -33,7 +33,7 @@
use tracing::{debug, trace};
use crate::{
- algorithm::{self, PortAllocImpl, ProtocolFlowId},
+ algorithm::{self, PortAllocImpl},
context::{
ContextPair, CounterContext, InstantContext, ReferenceNotifiers, RngContext, TracingContext,
},
@@ -67,7 +67,7 @@
SocketInfo, SocketState as DatagramSocketState, WrapOtherStackIpOptions,
WrapOtherStackIpOptionsMut,
},
- AddrVec, Bound, IncompatibleError, InsertError, ListenerAddrInfo, MaybeDualStack,
+ AddrVec, Bound, IncompatibleError, InsertError, Inserter, ListenerAddrInfo, MaybeDualStack,
NotDualStackCapableError, RemoveResult, SetDualStackEnabledError, ShutdownType,
SocketAddrType, SocketMapAddrSpec, SocketMapAddrStateSpec, SocketMapConflictPolicy,
SocketMapStateSpec,
@@ -624,10 +624,8 @@
bindings_ctx: &mut BC,
flow: datagram::DatagramFlowId<I::Addr, UdpRemotePort>,
) -> Option<NonZeroU16> {
- let DatagramFlowId { local_ip, remote_ip, remote_id } = flow;
- let id = ProtocolFlowId::new(local_ip, remote_ip, remote_id);
let mut rng = bindings_ctx.rng();
- algorithm::simple_randomized_port_alloc(&mut rng, &id, bound, &())
+ algorithm::simple_randomized_port_alloc(&mut rng, &flow, bound, &())
.map(|p| NonZeroU16::new(p).expect("ephemeral ports should be non-zero"))
}
}
@@ -659,9 +657,24 @@
}
#[derive(Debug, Eq, PartialEq)]
+pub struct LoadBalancedEntry<T> {
+ id: T,
+ reuse_addr: bool,
+}
+
+#[derive(Debug, Eq, PartialEq)]
pub enum AddrState<T> {
Exclusive(T),
- ReusePort(Vec<T>),
+ Shared {
+ // Entries with the SO_REUSEADDR flag. If this list is not empty then
+ // new packets are delivered the last socket in this list.
+ priority: Vec<T>,
+
+ // Entries with the SO_REUSEPORT flag. Some of them may have
+ // SO_REUSEADDR flag set as well. If `priority` list is empty then
+ // incoming packets are load-balanced between sockets in this list.
+ load_balanced: Vec<LoadBalancedEntry<T>>,
+ },
}
impl<'a, A: IpAddress, LI> From<&'a ListenerIpAddr<A, LI>> for SocketAddrType {
@@ -679,33 +692,17 @@
}
}
-#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
-pub enum Sharing {
- Exclusive,
- ReusePort,
-}
-
-impl Default for Sharing {
- fn default() -> Self {
- Self::Exclusive
- }
+#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, Default)]
+pub struct Sharing {
+ reuse_addr: bool,
+ reuse_port: bool,
}
impl Sharing {
pub(crate) fn is_shareable_with_new_state(&self, new_state: Sharing) -> bool {
- match (self, new_state) {
- (Sharing::Exclusive, Sharing::Exclusive) => false,
- (Sharing::Exclusive, Sharing::ReusePort) => false,
- (Sharing::ReusePort, Sharing::Exclusive) => false,
- (Sharing::ReusePort, Sharing::ReusePort) => true,
- }
- }
-
- pub(crate) fn is_reuse_port(&self) -> bool {
- match self {
- Sharing::Exclusive => false,
- Sharing::ReusePort => true,
- }
+ let Sharing { reuse_addr, reuse_port } = self;
+ let Sharing { reuse_addr: new_reuse_addr, reuse_port: new_reuse_port } = new_state;
+ (*reuse_addr && new_reuse_addr) || (*reuse_port && new_reuse_port)
}
}
@@ -730,8 +727,18 @@
impl<T> ToSharingOptions for AddrState<T> {
fn to_sharing_options(&self) -> Sharing {
match self {
- AddrState::Exclusive(_) => Sharing::Exclusive,
- AddrState::ReusePort(_) => Sharing::ReusePort,
+ AddrState::Exclusive(_) => Sharing { reuse_addr: false, reuse_port: false },
+ AddrState::Shared { priority, load_balanced } => {
+ // All sockets in `priority` have `REUSE_ADDR` flag set. Check
+ // that all sockets in `load_balanced` have it set as well.
+ let reuse_addr = load_balanced.iter().all(|e| e.reuse_addr);
+
+ // All sockets in `load_balanced` have `REUSE_PORT` flag set,
+ // while the sockets in `priority` don't.
+ let reuse_port = priority.is_empty();
+
+ Sharing { reuse_addr, reuse_port }
+ }
}
}
}
@@ -743,54 +750,92 @@
}
}
+pub struct SocketMapAddrInserter<'a, I> {
+ state: &'a mut AddrState<I>,
+ sharing_state: Sharing,
+}
+
+impl<'a, I> Inserter<I> for SocketMapAddrInserter<'a, I> {
+ fn insert(self, id: I) {
+ match self {
+ Self { state: _, sharing_state: Sharing { reuse_addr: false, reuse_port: false } }
+ | Self { state: AddrState::Exclusive(_), sharing_state: _ } => {
+ panic!("Can't insert entry in a non-shareable entry")
+ }
+
+ // If only `SO_REUSEADDR` flag is set then insert the entry in the `priority` list.
+ Self {
+ state: AddrState::Shared { priority, load_balanced: _ },
+ sharing_state: Sharing { reuse_addr: true, reuse_port: false },
+ } => priority.push(id),
+
+ // If `SO_REUSEPORT` flag is set then insert the entry in the `load_balanced` list.
+ Self {
+ state: AddrState::Shared { priority: _, load_balanced },
+ sharing_state: Sharing { reuse_addr, reuse_port: true },
+ } => load_balanced.push(LoadBalancedEntry { id, reuse_addr }),
+ }
+ }
+}
+
impl<I: Debug + Eq> SocketMapAddrStateSpec for AddrState<I> {
type Id = I;
type SharingState = Sharing;
- type Inserter<'a> = &'a mut Vec<I> where I: 'a;
+ type Inserter<'a> = SocketMapAddrInserter<'a, I>
+ where
+ I: 'a;
fn new(new_sharing_state: &Sharing, id: I) -> Self {
match new_sharing_state {
- Sharing::Exclusive => Self::Exclusive(id),
- Sharing::ReusePort => Self::ReusePort(Vec::from([id])),
+ Sharing { reuse_addr: false, reuse_port: false } => Self::Exclusive(id),
+ Sharing { reuse_addr: true, reuse_port: false } => {
+ Self::Shared { priority: Vec::from([id]), load_balanced: Vec::new() }
+ }
+ Sharing { reuse_addr, reuse_port: true } => Self::Shared {
+ priority: Vec::new(),
+ load_balanced: Vec::from([LoadBalancedEntry { id, reuse_addr: *reuse_addr }]),
+ },
}
}
fn contains_id(&self, id: &Self::Id) -> bool {
match self {
Self::Exclusive(x) => id == x,
- Self::ReusePort(ids) => ids.contains(id),
+ Self::Shared { priority, load_balanced } => {
+ priority.contains(id) || load_balanced.iter().any(|e| e.id == *id)
+ }
}
}
fn try_get_inserter<'a, 'b>(
&'b mut self,
new_sharing_state: &'a Sharing,
- ) -> Result<&'b mut Vec<I>, IncompatibleError> {
- match (self, new_sharing_state) {
- (AddrState::Exclusive(_), _) | (AddrState::ReusePort(_), Sharing::Exclusive) => {
- Err(IncompatibleError)
- }
- (AddrState::ReusePort(ids), Sharing::ReusePort) => Ok(ids),
- }
+ ) -> Result<SocketMapAddrInserter<'b, I>, IncompatibleError> {
+ self.could_insert(new_sharing_state)?;
+ Ok(SocketMapAddrInserter { state: self, sharing_state: *new_sharing_state })
}
- fn could_insert(
- &self,
- new_sharing_state: &Self::SharingState,
- ) -> Result<(), IncompatibleError> {
- match (self, new_sharing_state) {
- (AddrState::Exclusive(_), _) | (_, Sharing::Exclusive) => Err(IncompatibleError),
- (AddrState::ReusePort(_), Sharing::ReusePort) => Ok(()),
- }
+ fn could_insert(&self, new_sharing_state: &Sharing) -> Result<(), IncompatibleError> {
+ self.to_sharing_options()
+ .is_shareable_with_new_state(*new_sharing_state)
+ .then_some(())
+ .ok_or_else(|| IncompatibleError)
}
fn remove_by_id(&mut self, id: I) -> RemoveResult {
match self {
- AddrState::Exclusive(_) => RemoveResult::IsLast,
- AddrState::ReusePort(ids) => {
- let index = ids.iter().position(|i| i == &id).expect("couldn't find ID to remove");
- assert_eq!(ids.swap_remove(index), id);
- if ids.is_empty() {
+ Self::Exclusive(_) => RemoveResult::IsLast,
+ Self::Shared { ref mut priority, ref mut load_balanced } => {
+ if let Some(pos) = priority.iter().position(|i| *i == id) {
+ let _removed: I = priority.remove(pos);
+ } else {
+ let pos = load_balanced
+ .iter()
+ .position(|e| e.id == id)
+ .expect("couldn't find ID to remove");
+ let _removed: LoadBalancedEntry<I> = load_balanced.remove(pos);
+ }
+ if priority.is_empty() && load_balanced.is_empty() {
RemoveResult::IsLast
} else {
RemoveResult::Success
@@ -807,11 +852,15 @@
) -> &T {
match self {
AddrState::Exclusive(id) => id,
- AddrState::ReusePort(ids) => {
- let mut hasher = DefaultHasher::new();
- selector.hash(&mut hasher);
- let index: usize = hasher.finish() as usize % ids.len();
- &ids[index]
+ AddrState::Shared { priority, load_balanced } => {
+ if let Some(id) = priority.last() {
+ id
+ } else {
+ let mut hasher = DefaultHasher::new();
+ selector.hash(&mut hasher);
+ let index: usize = hasher.finish() as usize % load_balanced.len();
+ &load_balanced[index].id
+ }
}
}
}
@@ -819,7 +868,9 @@
fn collect_all_ids(&self) -> impl Iterator<Item = &'_ T> {
match self {
AddrState::Exclusive(id) => Either::Left(core::iter::once(id)),
- AddrState::ReusePort(ids) => Either::Right(ids.iter()),
+ AddrState::Shared { priority, load_balanced } => {
+ Either::Right(priority.iter().chain(load_balanced.iter().map(|i| &i.id)))
+ }
}
}
}
@@ -911,7 +962,7 @@
for UdpBoundSocketMap<I, D, BT>
{
const EPHEMERAL_RANGE: RangeInclusive<u16> = 49152..=65535;
- type Id = ProtocolFlowId<SocketIpAddr<I::Addr>, UdpRemotePort>;
+ type Id = DatagramFlowId<I::Addr, UdpRemotePort>;
type PortAvailableArg = ();
fn is_port_available(&self, id: &Self::Id, port: u16, (): &()) -> bool {
@@ -1696,10 +1747,6 @@
/// available local ports for that address)
/// - If there is no route to `remote_ip`
/// - If `id` belongs to an already-connected socket
- ///
- /// # Panics
- ///
- /// `connect` panics if `id` is not a valid [`SocketId`].
pub fn connect(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -1721,10 +1768,6 @@
/// Sets the device to be used for sending and receiving packets for a socket.
/// If the socket is not currently bound to a local address and port, the device
/// will be used when binding.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid [`UdpSocketId`].
pub fn set_device(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -1736,10 +1779,6 @@
}
/// Gets the device the specified socket is bound to.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid socket ID.
pub fn get_bound_device(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -1756,10 +1795,6 @@
///
/// Returns an error if the socket does not support the `IPV6_V6ONLY` socket
/// option (e.g. an IPv4 socket).
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid `UdpSocketId`.
pub fn set_dual_stack_enabled(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -1800,10 +1835,6 @@
///
/// Returns an error if the socket does not support the `IPV6_V6ONLY` socket
/// option (e.g. an IPv4 socket).
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid `UdpSocketId`.
pub fn get_dual_stack_enabled(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -1821,34 +1852,44 @@
})
}
+ /// Sets the POSIX `SO_REUSEADDR` option for the specified socket.
+ ///
+ /// # Errors
+ ///
+ /// Returns an error if the socket is already bound.
+ pub fn set_posix_reuse_addr(
+ &mut self,
+ id: &UdpApiSocketId<I, C>,
+ reuse_addr: bool,
+ ) -> Result<(), ExpectedUnboundError> {
+ let mut sharing = datagram::get_sharing(self.core_ctx(), id);
+ sharing.reuse_addr = reuse_addr;
+ datagram::update_sharing(self.core_ctx(), id, sharing)
+ }
+
+ /// Gets the POSIX `SO_REUSEADDR` option for the specified socket.
+ pub fn get_posix_reuse_addr(&mut self, id: &UdpApiSocketId<I, C>) -> bool {
+ datagram::get_sharing(self.core_ctx(), id).reuse_addr
+ }
+
/// Sets the POSIX `SO_REUSEPORT` option for the specified socket.
///
/// # Errors
///
/// Returns an error if the socket is already bound.
- ///
- /// # Panics
- ///
- /// panics if `id` is not a valid `UdpSocketId`.
pub fn set_posix_reuse_port(
&mut self,
id: &UdpApiSocketId<I, C>,
reuse_port: bool,
) -> Result<(), ExpectedUnboundError> {
- datagram::update_sharing(
- self.core_ctx(),
- id,
- if reuse_port { Sharing::ReusePort } else { Sharing::Exclusive },
- )
+ let mut sharing = datagram::get_sharing(self.core_ctx(), id);
+ sharing.reuse_port = reuse_port;
+ datagram::update_sharing(self.core_ctx(), id, sharing)
}
/// Gets the POSIX `SO_REUSEPORT` option for the specified socket.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid `UdpSocketId`.
pub fn get_posix_reuse_port(&mut self, id: &UdpApiSocketId<I, C>) -> bool {
- datagram::get_sharing(self.core_ctx(), id).is_reuse_port()
+ datagram::get_sharing(self.core_ctx(), id).reuse_port
}
/// Sets the specified socket's membership status for the given group.
@@ -2131,10 +2172,6 @@
/// # Errors
///
/// Returns an error if the socket is not connected.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid `UdpSocketId`.
pub fn disconnect(&mut self, id: &UdpApiSocketId<I, C>) -> Result<(), ExpectedConnError> {
let (core_ctx, bindings_ctx) = self.contexts();
debug!("disconnect {id:?}");
@@ -2146,10 +2183,6 @@
/// # Errors
///
/// Returns an error if the socket is not connected.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid `UdpSocketId`.
pub fn shutdown(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -2164,20 +2197,12 @@
///
/// If the socket is not connected, or if `shutdown` was not called on it,
/// returns `None`.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid `UdpSocketId`.
pub fn get_shutdown(&mut self, id: &UdpApiSocketId<I, C>) -> Option<ShutdownType> {
let (core_ctx, bindings_ctx) = self.contexts();
datagram::get_shutdown_connected(core_ctx, bindings_ctx, id)
}
/// Removes a socket that was previously created.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid [`UdpSocketId`].
pub fn close(
&mut self,
id: UdpApiSocketId<I, C>,
@@ -2192,10 +2217,6 @@
/// Gets the [`SocketInfo`] associated with the UDP socket referenced by
/// `id`.
- ///
- /// # Panics
- ///
- /// `get_udp_info` panics if `id` is not a valid `UdpSocketId`.
pub fn get_info(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -2220,10 +2241,6 @@
/// # Errors
///
/// Returns an error if the socket is not currently unbound.
- ///
- /// # Panics
- ///
- /// `listen_udp` panics if `id` is not a valid [`UdpSocketId`].
pub fn listen(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -2247,10 +2264,6 @@
/// Returns an error if the socket is not connected or the packet cannot be
/// sent. On error, the original `body` is returned unmodified so that it
/// can be reused by the caller.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid UDP socket identifier.
pub fn send<B: BufferMut>(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -2281,10 +2294,6 @@
/// Returns an error if the socket is unbound and connecting fails, or if the
/// packet could not be sent. If the socket is unbound and connecting succeeds
/// but sending fails, the socket remains connected.
- ///
- /// # Panics
- ///
- /// Panics if `id` is not a valid UDP socket identifier.
pub fn send_to<B: BufferMut>(
&mut self,
id: &UdpApiSocketId<I, C>,
@@ -6820,61 +6829,124 @@
})
}
+ const EXCLUSIVE: Sharing = Sharing { reuse_addr: false, reuse_port: false };
+ const REUSE_ADDR: Sharing = Sharing { reuse_addr: true, reuse_port: false };
+ const REUSE_PORT: Sharing = Sharing { reuse_addr: false, reuse_port: true };
+ const REUSE_ADDR_PORT: Sharing = Sharing { reuse_addr: true, reuse_port: true };
+
#[test_case([
- (listen(ip_v4!("0.0.0.0"), 1), Sharing::Exclusive),
- (listen(ip_v4!("0.0.0.0"), 2), Sharing::Exclusive)],
+ (listen(ip_v4!("0.0.0.0"), 1), EXCLUSIVE),
+ (listen(ip_v4!("0.0.0.0"), 2), EXCLUSIVE)],
Ok(()); "listen_any_ip_different_port")]
#[test_case([
- (listen(ip_v4!("0.0.0.0"), 1), Sharing::Exclusive),
- (listen(ip_v4!("0.0.0.0"), 1), Sharing::Exclusive)],
+ (listen(ip_v4!("0.0.0.0"), 1), EXCLUSIVE),
+ (listen(ip_v4!("0.0.0.0"), 1), EXCLUSIVE)],
Err(InsertError::Exists); "any_ip_same_port")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive)],
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
Err(InsertError::Exists); "listen_same_specific_ip")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort)],
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+ Ok(()); "listen_same_specific_ip_reuse_addr")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
Ok(()); "listen_same_specific_ip_reuse_port")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort)],
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+ Ok(()); "listen_same_specific_ip_reuse_addr_port_and_reuse_addr")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+ Ok(()); "listen_same_specific_ip_reuse_addr_and_reuse_addr_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
+ Ok(()); "listen_same_specific_ip_reuse_addr_port_and_reuse_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+ Ok(()); "listen_same_specific_ip_reuse_port_and_reuse_addr_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+ Ok(()); "listen_same_specific_ip_reuse_addr_port_and_reuse_addr_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+ Err(InsertError::Exists); "listen_same_specific_ip_exclusive_reuse_addr")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
+ Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_exclusive")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
Err(InsertError::Exists); "listen_same_specific_ip_exclusive_reuse_port")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive)],
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
Err(InsertError::Exists); "listen_same_specific_ip_reuse_port_exclusive")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::ReusePort)],
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+ Err(InsertError::Exists); "listen_same_specific_ip_exclusive_reuse_addr_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
+ Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_port_exclusive")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+ Err(InsertError::Exists); "listen_same_specific_ip_reuse_port_reuse_addr")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
+ Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_reuse_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),],
+ Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_port_and_reuse_port_and_reuse_addr")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),],
+ Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_port_and_reuse_addr_and_reuse_port")]
+ #[test_case([
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), REUSE_PORT)],
Ok(()); "conn_shadows_listener_reuse_port")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
Err(InsertError::ShadowAddrExists); "conn_shadows_listener_exclusive")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::ReusePort)],
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), REUSE_PORT)],
Err(InsertError::ShadowAddrExists); "conn_shadows_listener_exclusive_reuse_port")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
Err(InsertError::ShadowAddrExists); "conn_shadows_listener_reuse_port_exclusive")]
#[test_case([
- (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+ (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
Err(InsertError::IndirectConflict); "conn_indirect_conflict_specific_listener")]
#[test_case([
- (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+ (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
Err(InsertError::IndirectConflict); "conn_indirect_conflict_any_listener")]
#[test_case([
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive),
- (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive)],
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE),
+ (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE)],
Err(InsertError::IndirectConflict); "specific_listener_indirect_conflict_conn")]
#[test_case([
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive),
- (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive)],
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE),
+ (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE)],
Err(InsertError::IndirectConflict); "any_listener_indirect_conflict_conn")]
fn bind_sequence<
C: IntoIterator<Item = (AddrVec<Ipv4, FakeWeakDeviceId<FakeDeviceId>, UdpAddrSpec>, Sharing)>,
@@ -6919,16 +6991,16 @@
}
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
- (listen(ip_v4!("2.2.2.2"), 2), Sharing::Exclusive),
+ (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+ (listen(ip_v4!("2.2.2.2"), 2), EXCLUSIVE),
]; "distinct")]
#[test_case([
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
- (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+ (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
]; "listen_reuse_port")]
#[test_case([
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), Sharing::ReusePort),
- (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), Sharing::ReusePort),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), REUSE_PORT),
+ (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), REUSE_PORT),
]; "conn_reuse_port")]
fn remove_sequence<I>(spec: I)
where
diff --git a/src/connectivity/network/netstack3/core/sync/BUILD.gn b/src/connectivity/network/netstack3/core/sync/BUILD.gn
index d1e8e15..0de8e89 100644
--- a/src/connectivity/network/netstack3/core/sync/BUILD.gn
+++ b/src/connectivity/network/netstack3/core/sync/BUILD.gn
@@ -14,7 +14,10 @@
"src/lib.rs",
"src/rc.rs",
]
- deps = [ "//third_party/rust_crates:derivative" ]
+ deps = [
+ "//src/connectivity/network/netstack3/core/lock-order",
+ "//third_party/rust_crates:derivative",
+ ]
feature_sets = [
{
diff --git a/src/connectivity/network/netstack3/core/sync/src/lib.rs b/src/connectivity/network/netstack3/core/sync/src/lib.rs
index efdcd36..ebe2e96a 100644
--- a/src/connectivity/network/netstack3/core/sync/src/lib.rs
+++ b/src/connectivity/network/netstack3/core/sync/src/lib.rs
@@ -59,6 +59,14 @@
}
}
+impl<T: 'static> lock_order::lock::ExclusiveLock<T> for Mutex<T> {
+ type Guard<'l> = LockGuard<'l, T>;
+
+ fn lock(&self) -> Self::Guard<'_> {
+ self.lock()
+ }
+}
+
/// A [`std::sync::RwLock`] assuming lock poisoning will never occur.
#[derive(Debug, Default)]
pub struct RwLock<T>(std::sync::RwLock<T>);
@@ -127,6 +135,20 @@
}
}
+impl<T: 'static> lock_order::lock::ReadWriteLock<T> for RwLock<T> {
+ type ReadGuard<'l> = RwLockReadGuard<'l, T>;
+
+ type WriteGuard<'l> = RwLockWriteGuard<'l, T>;
+
+ fn read_lock(&self) -> Self::ReadGuard<'_> {
+ self.read()
+ }
+
+ fn write_lock(&self) -> Self::WriteGuard<'_> {
+ self.write()
+ }
+}
+
mod lock_guard {
#[cfg(not(feature = "recursive-lock-panic"))]
use core::marker::PhantomData;
diff --git a/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs b/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs
index d2abb0d..b40e1ab 100644
--- a/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs
+++ b/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs
@@ -126,6 +126,7 @@
type SetSocketDeviceError: IntoErrno;
type SetMulticastMembershipError: IntoErrno;
type MulticastInterfaceError: IntoErrno;
+ type SetReuseAddrError: IntoErrno;
type SetReusePortError: IntoErrno;
type ShutdownError: IntoErrno;
type SetIpTransparentError: IntoErrno;
@@ -188,6 +189,14 @@
id: &Self::SocketId,
) -> Result<bool, NotDualStackCapableError>;
+ fn set_reuse_addr(
+ ctx: &mut Ctx,
+ id: &Self::SocketId,
+ reuse_addr: bool,
+ ) -> Result<(), Self::SetReuseAddrError>;
+
+ fn get_reuse_addr(ctx: &mut Ctx, id: &Self::SocketId) -> bool;
+
fn set_reuse_port(
ctx: &mut Ctx,
id: &Self::SocketId,
@@ -309,6 +318,7 @@
type SetSocketDeviceError = SocketError;
type SetMulticastMembershipError = SetMulticastMembershipError;
type MulticastInterfaceError = NotDualStackCapableError;
+ type SetReuseAddrError = ExpectedUnboundError;
type SetReusePortError = ExpectedUnboundError;
type SetIpTransparentError = Never;
type LocalIdentifier = NonZeroU16;
@@ -385,20 +395,24 @@
ctx.api().udp().get_bound_device(id)
}
+ fn set_reuse_addr(
+ ctx: &mut Ctx,
+ id: &Self::SocketId,
+ reuse_addr: bool,
+ ) -> Result<(), Self::SetReusePortError> {
+ ctx.api().udp().set_posix_reuse_addr(id, reuse_addr).inspect_err(|_| {
+ warn!("tried to set SO_REUSEADDR on a bound socket; see https://fxbug.dev/42051599")
+ })
+ }
+
fn set_reuse_port(
ctx: &mut Ctx,
id: &Self::SocketId,
reuse_port: bool,
) -> Result<(), Self::SetReusePortError> {
- match ctx.api().udp().set_posix_reuse_port(id, reuse_port) {
- Ok(()) => Ok(()),
- Err(e) => {
- warn!(
- "tried to set SO_REUSEPORT on a bound socket; see https://fxbug.dev/42051599"
- );
- Err(e)
- }
- }
+ ctx.api().udp().set_posix_reuse_port(id, reuse_port).inspect_err(|_| {
+ warn!("tried to set SO_REUSEPORT on a bound socket; see https://fxbug.dev/42051599")
+ })
}
fn set_dual_stack_enabled(
@@ -416,6 +430,10 @@
ctx.api().udp().get_dual_stack_enabled(id)
}
+ fn get_reuse_addr(ctx: &mut Ctx, id: &Self::SocketId) -> bool {
+ ctx.api().udp().get_posix_reuse_addr(id)
+ }
+
fn get_reuse_port(ctx: &mut Ctx, id: &Self::SocketId) -> bool {
ctx.api().udp().get_posix_reuse_port(id)
}
@@ -578,6 +596,7 @@
type SetSocketDeviceError = SocketError;
type SetMulticastMembershipError = NotSupportedError;
type MulticastInterfaceError = NotSupportedError;
+ type SetReuseAddrError = NotSupportedError;
type SetReusePortError = NotSupportedError;
type SetIpTransparentError = NotSupportedError;
type LocalIdentifier = NonZeroU16;
@@ -684,6 +703,18 @@
}
}
+ fn set_reuse_addr(
+ _ctx: &mut Ctx,
+ _id: &Self::SocketId,
+ _reuse_addr: bool,
+ ) -> Result<(), Self::SetReuseAddrError> {
+ Err(NotSupportedError)
+ }
+
+ fn get_reuse_addr(_ctx: &mut Ctx, _id: &Self::SocketId) -> bool {
+ false
+ }
+
fn set_reuse_port(
_ctx: &mut Ctx,
_id: &Self::SocketId,
@@ -1233,7 +1264,12 @@
responder.send(Ok(())).unwrap_or_else(|e| error!("failed to respond: {e:?}"));
}
Request::GetSendBuffer { responder } => {
- respond_not_supported!("syncudp::GetSendBuffer", responder)
+ // TODO(https://fxbug.dev/42074004): Actually implement SetSendBuffer.
+ // Until then we return the default buffer size used on Linux.
+ const DEFAULT_SEND_BUFFER: u64 = 212992;
+ responder
+ .send(Ok(DEFAULT_SEND_BUFFER))
+ .unwrap_or_else(|e| error!("failed to respond: {e:?}"));
}
Request::SetReceiveBuffer { value_bytes, responder } => {
responder
@@ -1248,18 +1284,15 @@
.send(Ok(self.get_max_receive_buffer_size()))
.unwrap_or_else(|e| error!("failed to respond: {e:?}"));
}
- Request::SetReuseAddress { value: _, responder } => {
- tracing::warn!(
- "TODO(https://fxbug.dev/42180094): implement SO_REUSEADDR; returning OK"
- );
- // ANVL's UDP test stub requires that setting SO_REUSEADDR succeeds.
- // Blindly return success here to unblock test coverage (possible since
- // the network test realm is restarted before each test case).
- // TODO(https://fxbug.dev/42180094): Actually implement SetReuseAddress.
- responder.send(Ok(())).unwrap_or_else(|e| error!("failed to respond: {e:?}"));
+ Request::SetReuseAddress { value, responder } => {
+ let result = self.set_reuse_addr(value);
+ maybe_log_error!("set_reuse_addr", &result);
+ responder.send(result).unwrap_or_else(|e| error!("failed to respond: {e:?}"));
}
Request::GetReuseAddress { responder } => {
- respond_not_supported!("syncudp::GetReuseAddress", responder)
+ responder
+ .send(Ok(self.get_reuse_addr()))
+ .unwrap_or_else(|e| error!("failed to respond: {e:?}"));
}
Request::SetReusePort { value, responder } => {
let result = self.set_reuse_port(value);
@@ -1916,6 +1949,16 @@
correct_ip_version.ok_or(fposix::Errno::Eopnotsupp)
}
+ fn set_reuse_addr(self, reuse_addr: bool) -> Result<(), fposix::Errno> {
+ let Self { ctx, data: BindingData { info: SocketControlInfo { id, .. }, .. } } = self;
+ T::set_reuse_addr(ctx, id, reuse_addr).map_err(IntoErrno::into_errno)
+ }
+
+ fn get_reuse_addr(self) -> bool {
+ let Self { ctx, data: BindingData { info: SocketControlInfo { id, .. }, .. } } = self;
+ T::get_reuse_addr(ctx, id)
+ }
+
fn set_reuse_port(self, reuse_port: bool) -> Result<(), fposix::Errno> {
let Self { ctx, data: BindingData { info: SocketControlInfo { id, .. }, .. } } = self;
T::set_reuse_port(ctx, id, reuse_port).map_err(IntoErrno::into_errno)
diff --git a/src/developer/ffx/plugins/repository/serve/src/lib.rs b/src/developer/ffx/plugins/repository/serve/src/lib.rs
index e9c2a50..1acf3f7 100644
--- a/src/developer/ffx/plugins/repository/serve/src/lib.rs
+++ b/src/developer/ffx/plugins/repository/serve/src/lib.rs
@@ -999,6 +999,7 @@
);
let tmp_port_file = tempfile::NamedTempFile::new().unwrap();
+ let tmp_port_file_path = tmp_port_file.path().to_owned();
// Future resolves once fake target exists
let _timeout = timeout(time::Duration::from_secs(10), async {
@@ -1014,28 +1015,31 @@
.await
.unwrap();
- let serve_tool = ServeTool {
- cmd: ServeCommand {
- repository: Some(REPO_NAME.to_string()),
- trusted_root: None,
- address: (REPO_IPV4_ADDR, REPO_PORT).into(),
- repo_path: Some(EMPTY_REPO_PATH.into()),
- product_bundle: None,
- alias: vec!["example.com".into(), "fuchsia.com".into()],
- storage_type: Some(RepositoryStorageType::Ephemeral),
- alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
- port_path: Some(tmp_port_file.path().to_owned()),
- no_device: false,
- },
- context: test_env.context.clone(),
- target_collection_proxy: target_collection_proxy,
- };
-
let test_stdout = TestBuffer::default();
let writer = SimpleWriter::new_buffers(test_stdout.clone(), Vec::new());
// Run main in background
- let _task = fasync::Task::local(async move { serve_tool.main(writer).await.unwrap() });
+ let _task = fasync::Task::local(async move {
+ serve_impl(
+ target_collection_proxy,
+ ServeCommand {
+ repository: Some(REPO_NAME.to_string()),
+ trusted_root: None,
+ address: (REPO_IPV4_ADDR, REPO_PORT).into(),
+ repo_path: Some(EMPTY_REPO_PATH.into()),
+ product_bundle: None,
+ alias: vec!["example.com".into(), "fuchsia.com".into()],
+ storage_type: Some(RepositoryStorageType::Ephemeral),
+ alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
+ port_path: Some(tmp_port_file_path),
+ no_device: false,
+ },
+ test_env.context.clone(),
+ writer,
+ )
+ .await
+ .unwrap()
+ });
// Future resolves once repo server communicates with them.
let _timeout = timeout(time::Duration::from_secs(10), async {
@@ -1136,6 +1140,7 @@
let test_env = get_test_env().await;
let tmp_port_file = tempfile::NamedTempFile::new().unwrap();
+ let tmp_port_file_path = tmp_port_file.path().to_owned();
let (fake_repo, _fake_repo_rx) = FakeRepositoryManager::new();
let (fake_engine, _fake_engine_rx) = FakeEngine::new();
@@ -1143,28 +1148,31 @@
let (_, target_collection_proxy, _) =
FakeTargetCollection::new(fake_repo.clone(), fake_engine.clone(), None);
- let serve_tool = ServeTool {
- cmd: ServeCommand {
- repository: Some(REPO_NAME.to_string()),
- trusted_root: None,
- address: (REPO_IPV4_ADDR, REPO_PORT).into(),
- repo_path: Some(EMPTY_REPO_PATH.into()),
- product_bundle: None,
- alias: vec![],
- storage_type: None,
- alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
- port_path: Some(tmp_port_file.path().to_owned()),
- no_device: true,
- },
- context: test_env.context.clone(),
- target_collection_proxy: target_collection_proxy,
- };
-
let test_stdout = TestBuffer::default();
let writer = SimpleWriter::new_buffers(test_stdout.clone(), Vec::new());
// Run main in background
- let _task = fasync::Task::local(async move { serve_tool.main(writer).await.unwrap() });
+ let _task = fasync::Task::local(async move {
+ serve_impl(
+ target_collection_proxy,
+ ServeCommand {
+ repository: Some(REPO_NAME.to_string()),
+ trusted_root: None,
+ address: (REPO_IPV4_ADDR, REPO_PORT).into(),
+ repo_path: Some(EMPTY_REPO_PATH.into()),
+ product_bundle: None,
+ alias: vec!["example.com".into(), "fuchsia.com".into()],
+ storage_type: Some(RepositoryStorageType::Ephemeral),
+ alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
+ port_path: Some(tmp_port_file_path),
+ no_device: false,
+ },
+ test_env.context.clone(),
+ writer,
+ )
+ .await
+ .unwrap()
+ });
// Wait for the "Serving repository ..." output
for _ in 0..10 {
@@ -1289,6 +1297,7 @@
write_product_bundle(&pb_dir).await;
let tmp_port_file = tempfile::NamedTempFile::new().unwrap();
+ let tmp_port_file_path = tmp_port_file.path().to_owned();
let (fake_repo, mut fake_repo_rx) = FakeRepositoryManager::new();
let (fake_engine, _fake_engine_rx) = FakeEngine::new();
@@ -1309,28 +1318,31 @@
.await
.unwrap();
- let serve_tool = ServeTool {
- cmd: ServeCommand {
- repository: None,
- trusted_root: None,
- address: (REPO_IPV4_ADDR, REPO_PORT).into(),
- repo_path: None,
- product_bundle: Some(pb_dir),
- alias: vec![],
- storage_type: Some(RepositoryStorageType::Ephemeral),
- alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
- port_path: Some(tmp_port_file.path().to_owned()),
- no_device: false,
- },
- context: test_env.context.clone(),
- target_collection_proxy: target_collection_proxy,
- };
-
let test_stdout = TestBuffer::default();
let writer = SimpleWriter::new_buffers(test_stdout.clone(), Vec::new());
// Run main in background
- let _task = fasync::Task::local(async move { serve_tool.main(writer).await.unwrap() });
+ let _task = fasync::Task::local(async move {
+ serve_impl(
+ target_collection_proxy,
+ ServeCommand {
+ repository: None,
+ trusted_root: None,
+ address: (REPO_IPV4_ADDR, REPO_PORT).into(),
+ repo_path: None,
+ product_bundle: Some(pb_dir),
+ alias: vec![],
+ storage_type: Some(RepositoryStorageType::Ephemeral),
+ alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
+ port_path: Some(tmp_port_file_path),
+ no_device: false,
+ },
+ test_env.context.clone(),
+ writer,
+ )
+ .await
+ .unwrap()
+ });
// Future resolves once repo server communicates with them.
let _timeout = timeout(time::Duration::from_secs(10), async {
diff --git a/src/devices/tests/node-group-test/drivers/root-driver.cc b/src/devices/tests/node-group-test/drivers/root-driver.cc
index 0832541..7c0e9d5 100644
--- a/src/devices/tests/node-group-test/drivers/root-driver.cc
+++ b/src/devices/tests/node-group-test/drivers/root-driver.cc
@@ -29,7 +29,7 @@
};
zx_device_str_prop_t str_fragment_props_1[] = {
- {bind_test::FLAG.c_str(), str_prop_bool_val(false)},
+ ddk::MakeStrProperty(bind_test::FLAG, false),
};
auto fragment_dev_a_1 = std::make_unique<RootDriver>(dev);
@@ -70,7 +70,7 @@
// Add 2 devices that matches the other node group node.
zx_device_str_prop_t str_fragment_props_2[] = {
- {bind_test::TEST_PROP.c_str(), str_prop_str_val(bind_test::TEST_PROP_VALUE_2.c_str())},
+ ddk::MakeStrProperty(bind_test::TEST_PROP, bind_test::TEST_PROP_VALUE_2),
};
auto fragment_dev_b_1 = std::make_unique<RootDriver>(dev);
diff --git a/src/graphics/display/drivers/amlogic-display/display-engine.h b/src/graphics/display/drivers/amlogic-display/display-engine.h
index 498c8a7..fa75f66 100644
--- a/src/graphics/display/drivers/amlogic-display/display-engine.h
+++ b/src/graphics/display/drivers/amlogic-display/display-engine.h
@@ -104,8 +104,6 @@
void DisplayControllerImplApplyConfiguration(const display_config_t* display_configs,
size_t display_count,
const config_stamp_t* banjo_config_stamp);
- void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count) {} // No ELD required for non-HDA systems.
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on);
diff --git a/src/graphics/display/drivers/coordinator/BUILD.gn b/src/graphics/display/drivers/coordinator/BUILD.gn
index 71a91a5..eaa10ad 100644
--- a/src/graphics/display/drivers/coordinator/BUILD.gn
+++ b/src/graphics/display/drivers/coordinator/BUILD.gn
@@ -61,8 +61,6 @@
"controller.h",
"display-info.cc",
"display-info.h",
- "eld.cc",
- "eld.h",
"engine-driver-client.cc",
"engine-driver-client.h",
"fence.cc",
@@ -97,7 +95,6 @@
"//src/graphics/display/lib/api-types-cpp",
"//src/graphics/display/lib/edid",
"//src/lib/async-watchdog",
- "//src/lib/eld",
"//src/media/audio/drivers/lib/audio-proto-utils",
"//zircon/system/ulib/async:async-cpp",
"//zircon/system/ulib/async-loop:async-loop-cpp",
diff --git a/src/graphics/display/drivers/coordinator/controller.cc b/src/graphics/display/drivers/coordinator/controller.cc
index b48d6e9..9e6192c 100644
--- a/src/graphics/display/drivers/coordinator/controller.cc
+++ b/src/graphics/display/drivers/coordinator/controller.cc
@@ -46,7 +46,6 @@
#include "src/graphics/display/drivers/coordinator/client-priority.h"
#include "src/graphics/display/drivers/coordinator/client.h"
#include "src/graphics/display/drivers/coordinator/display-info.h"
-#include "src/graphics/display/drivers/coordinator/eld.h"
#include "src/graphics/display/drivers/coordinator/image.h"
#include "src/graphics/display/drivers/coordinator/layer.h"
#include "src/graphics/display/drivers/coordinator/migration-util.h"
@@ -159,13 +158,6 @@
fbl::RefPtr<DisplayInfo> display_info = std::move(display_info_result).value();
DisplayId display_id = display_info->id;
- if (display_info->edid.has_value()) {
- fbl::Array<uint8_t> eld = ComputeEld(display_info->edid->base);
-
- // The array is empty if memory allocation failed. We prefer using an
- // empty ELD to dropping the display altogether.
- engine_driver_client_->SetEld(display_id, eld);
- }
fbl::AutoLock lock(mtx());
auto display_it = displays_.find(display_id);
diff --git a/src/graphics/display/drivers/coordinator/eld.cc b/src/graphics/display/drivers/coordinator/eld.cc
deleted file mode 100644
index 2f6e21f..0000000
--- a/src/graphics/display/drivers/coordinator/eld.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2021 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/graphics/display/drivers/coordinator/eld.h"
-
-#include <zircon/assert.h>
-
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <limits>
-
-#include <fbl/array.h>
-
-#include "src/graphics/display/lib/edid/edid.h"
-#include "src/lib/eld/eld.h"
-
-namespace display {
-
-fbl::Array<uint8_t> ComputeEld(const edid::Edid& edid) {
- // First we calculate the total length so we can allocate.
- // The total ELD length of the ELD includes the ELD header, the ELD baseline (parts 1, 2 and 3)
- // and the any vendor specific data (not suported).
-
- // We need the baseline part 2 variable length from the monitor name.
- // We populate up to kEldMonitorNameMaxLength bytes of monitor name.
- constexpr size_t kMaxMonitorNameStringLength = 16;
- size_t monitor_name_string_len = strlen(edid.monitor_name());
- if (monitor_name_string_len > kMaxMonitorNameStringLength) {
- monitor_name_string_len = kMaxMonitorNameStringLength;
- }
- const size_t eld_baseline_part2_length = monitor_name_string_len;
-
- // We need the number of short audio descriptors to calculate the baseline part 3 length.
- size_t number_of_short_audio_descriptors = 0;
- for (auto it = edid::audio_data_block_iterator(&edid); it.is_valid(); ++it) {
- if (it->format() != edid::ShortAudioDescriptor::kLPcm) {
- // TODO(andresoportus): Add compressed formats.
- continue;
- }
- number_of_short_audio_descriptors++;
- }
- const size_t eld_baseline_part3_length =
- number_of_short_audio_descriptors * sizeof(edid::ShortAudioDescriptor);
-
- // Now we can calculate the ELD length.
- size_t eld_length = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) +
- eld_baseline_part2_length + eld_baseline_part3_length;
- eld_length = (eld_length + 3) & ~3; // Make the ELD length multiple of 4.
-
- // With the ELD length we can allocate and then fill in the data.
- //
- // The array is default-initialized, so all ELD fields are set to zero.
- fbl::Array<uint8_t> eld = fbl::MakeArray<uint8_t>(eld_length);
- if (eld.empty()) {
- // Array allocation failed.
- return eld;
- }
-
- // Fill the data, moving pointer p along the way.
- uint8_t* p = eld.get();
-
- // Populate the ELD header.
- hda::EldHeader* header = reinterpret_cast<hda::EldHeader*>(p);
- header->set_eld_ver(2);
- // These asserts guarantee the cast directly below will not cause UB.
- ZX_ASSERT_MSG(eld_length > 0, "Overflow while computing ELD length");
- ZX_ASSERT(eld_length < std::numeric_limits<uint32_t>::max());
- header->set_baseline_eld_len(static_cast<uint32_t>(eld_length));
- p += sizeof(hda::EldHeader);
-
- // Populate the ELD baseline part 1.
- hda::EldBaselinePart1* part1 = reinterpret_cast<hda::EldBaselinePart1*>(p);
- // "with CEA-861-C and continuing through present, incrementing the version number is no longer
- // required. The revision number shall be set to 0x03"
- part1->set_cea_edid_ver(3);
- // The cast does not cause UB because monitor_name_string_len has an upper
- // bound of kMaxMonitorNameStringLength, which is 16.
- part1->set_mnl(static_cast<char>(monitor_name_string_len));
- part1->set_sad_count(static_cast<uint8_t>(number_of_short_audio_descriptors));
- part1->set_conn_type(edid.is_hdmi() ? 0 : 1);
- part1->set_s_ai(0); // Not supported: ACP, ISRC1, or ISRC2 packets.
- part1->set_hdcp(0); // Not supported.
- part1->aud_synch_delay = 0; // Not supported.
- part1->byte4 = 0; // Not supported: FLR, LFE, FC, RLR, RC, FLRC, RLRC.
- part1->port_id = 0; // Not supported.
- part1->manufacturer_name = edid.manufacturer_name_code();
- part1->product_code = edid.product_code();
- p += sizeof(hda::EldBaselinePart1);
-
- // Populate the ELD baseline part 2: monitor_name_string.
- memcpy(p, edid.monitor_name(), monitor_name_string_len);
- p += monitor_name_string_len;
-
- // Populate the ELD baseline part 3: short audio descriptors.
- for (auto it = edid::audio_data_block_iterator(&edid); it.is_valid(); ++it) {
- if (it->format() != edid::ShortAudioDescriptor::kLPcm) {
- // TODO(andresoportus): Add compressed formats.
- continue;
- }
- edid::ShortAudioDescriptor* sad = reinterpret_cast<edid::ShortAudioDescriptor*>(p);
- p += sizeof(edid::ShortAudioDescriptor);
- *sad = *it;
- }
- // We don't populate the vendor specific block.
-
- return eld;
-}
-
-} // namespace display
diff --git a/src/graphics/display/drivers/coordinator/eld.h b/src/graphics/display/drivers/coordinator/eld.h
deleted file mode 100644
index e8a15fc..0000000
--- a/src/graphics/display/drivers/coordinator/eld.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2021 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_ELD_H_
-#define SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_ELD_H_
-
-#include <cstdint>
-
-#include <fbl/array.h>
-
-#include "src/graphics/display/lib/edid/edid.h"
-
-namespace display {
-
-// Returns an empty array if memory allocation failed.
-fbl::Array<uint8_t> ComputeEld(const edid::Edid& edid);
-
-} // namespace display
-
-#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_ELD_H_
diff --git a/src/graphics/display/drivers/coordinator/engine-driver-client.cc b/src/graphics/display/drivers/coordinator/engine-driver-client.cc
index b9bc460..4cf3f11 100644
--- a/src/graphics/display/drivers/coordinator/engine-driver-client.cc
+++ b/src/graphics/display/drivers/coordinator/engine-driver-client.cc
@@ -184,15 +184,6 @@
dc_.ApplyConfiguration(display_config_list, display_config_count, config_stamp);
}
-void EngineDriverClient::SetEld(DisplayId display_id, cpp20::span<const uint8_t> raw_eld) {
- if (use_engine_) {
- return;
- }
-
- ZX_DEBUG_ASSERT(dc_.is_valid());
- dc_.SetEld(ToBanjoDisplayId(display_id), raw_eld.data(), raw_eld.size());
-}
-
void EngineDriverClient::SetDisplayControllerInterface(
const display_controller_interface_protocol_t& protocol) {
if (use_engine_) {
diff --git a/src/graphics/display/drivers/coordinator/engine-driver-client.h b/src/graphics/display/drivers/coordinator/engine-driver-client.h
index fa4a828..e9e5a8c 100644
--- a/src/graphics/display/drivers/coordinator/engine-driver-client.h
+++ b/src/graphics/display/drivers/coordinator/engine-driver-client.h
@@ -56,8 +56,6 @@
void ApplyConfiguration(const display_config_t* display_config_list, size_t display_config_count,
const config_stamp_t* config_stamp);
- void SetEld(DisplayId display_id, cpp20::span<const uint8_t> raw_eld);
-
// TODO(https://fxbug.dev/314126494): These methods are only used in the
// banjo transport. Remove when all drivers are migrated to FIDL transport.
void SetDisplayControllerInterface(const display_controller_interface_protocol_t& protocol);
diff --git a/src/graphics/display/drivers/coordinator/tests/BUILD.gn b/src/graphics/display/drivers/coordinator/tests/BUILD.gn
index ea9add5..339e7d1 100644
--- a/src/graphics/display/drivers/coordinator/tests/BUILD.gn
+++ b/src/graphics/display/drivers/coordinator/tests/BUILD.gn
@@ -9,7 +9,6 @@
configs += [ "//build/config:all_source" ]
sources = [
"display-test.cc",
- "eld-test.cc",
"fence-test.cc",
"image-test.cc",
"inspect-test.cc",
diff --git a/src/graphics/display/drivers/coordinator/tests/eld-test.cc b/src/graphics/display/drivers/coordinator/tests/eld-test.cc
deleted file mode 100644
index 0185ded..0000000
--- a/src/graphics/display/drivers/coordinator/tests/eld-test.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2021 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/graphics/display/drivers/coordinator/eld.h"
-
-#include <gtest/gtest.h>
-#include <src/lib/eld/eld.h>
-
-namespace display {
-
-TEST(EldTest, eld1) {
- static uint8_t edid1[] = {
- 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x6D, 0xB8, 0x5A, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x18, 0x01, 0x03, 0x80, 0x30, 0x1B, 0x78, 0xEA, 0x31, 0x35, 0xA5, 0x55, 0x4E,
- 0xA1, 0x26, 0x0C, 0x50, 0x54, 0xA5, 0x4B, 0x00, 0x71, 0x4F, 0x81, 0x80, 0x95, 0x00, 0xB3,
- 0x00, 0xA9, 0xC0, 0x81, 0x00, 0x81, 0xC0, 0x90, 0x40, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38,
- 0x2D, 0x40, 0x58, 0x2C, 0x45, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00,
- 0xFD, 0x00, 0x38, 0x4B, 0x1E, 0x53, 0x0F, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x00, 0x00, 0x00, 0xFC, 0x00, 0x4C, 0x47, 0x20, 0x49, 0x50, 0x53, 0x20, 0x46, 0x55, 0x4C,
- 0x4C, 0x48, 0x44, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x64, 0x02, 0x03, 0x1D, 0xF1, 0x4A, 0x90, 0x04,
- 0x03, 0x01, 0x14, 0x12, 0x05, 0x1F, 0x10, 0x13, 0x23, 0x09, 0x07, 0x07, 0x83, 0x01, 0x00,
- 0x00, 0x65, 0x03, 0x0C, 0x00, 0x10, 0x00, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,
- 0x58, 0x2C, 0x45, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00, 0x1E, 0x01, 0x1D, 0x80, 0x18, 0x71,
- 0x1C, 0x16, 0x20, 0x58, 0x2C, 0x25, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00, 0x9E, 0x01, 0x1D,
- 0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20, 0x6E, 0x28, 0x55, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00,
- 0x1E, 0x8C, 0x0A, 0xD0, 0x8A, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, 0x96, 0x00, 0xE0, 0x0E,
- 0x11, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xAE};
-
- edid::Edid edid;
- const char* err_msg = nullptr;
- ASSERT_TRUE(edid.Init(edid1, sizeof(edid1), &err_msg));
- fbl::Array<uint8_t> eld = ComputeEld(edid);
- ASSERT_EQ(eld.size(), 36u);
- EXPECT_EQ(eld[3], 0x10); // Version 2.
-
- const char* monitor_name = "LG IPS FULLHD";
- size_t monitor_name_length = strlen(monitor_name);
- EXPECT_EQ(eld[sizeof(hda::EldHeader)], 0x60 | monitor_name_length); // EDID version 3, mnl.
- EXPECT_TRUE(memcmp((char*)&eld[20], monitor_name, monitor_name_length) == 0);
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 1], 0x10); // SAD count = 1, other fiels 0.
-
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 12], 0x6d); // Manufacturer id2 for LG.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 13], 0x1e); // Manufacturer id1 for LG.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 14], 0xb8); // Product Code2.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 15], 0x5a); // Product Code1.
-
- // Short Audio Descriptor.
- size_t sad_start = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) + monitor_name_length;
- EXPECT_EQ(eld[sad_start], 0x09); // format = 1, num channels minus 1 = 1.
- EXPECT_EQ(eld[sad_start + 1], 0x07); // sampling_frequencies 32k, 44.1k and 48k.
- EXPECT_EQ(eld[sad_start + 2], 0x07); // All 4 bits for number of bits.
-}
-
-TEST(EldTest, VsyncWithEld2) {
- static uint8_t edid2[] = {
- 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x5A, 0x63, 0x34, 0x5B, 0x01, 0x01, 0x01,
- 0x01, 0x2C, 0x1D, 0x01, 0x03, 0x80, 0x5E, 0x35, 0x78, 0x2E, 0x2E, 0xDD, 0xA6, 0x55, 0x4E,
- 0x9A, 0x26, 0x0E, 0x47, 0x4A, 0xBF, 0xEF, 0x80, 0xD1, 0xC0, 0xB3, 0x00, 0xA9, 0x40, 0xA9,
- 0xC0, 0x95, 0x00, 0x90, 0x40, 0x81, 0x80, 0x01, 0x01, 0x4D, 0xD0, 0x00, 0xA0, 0xF0, 0x70,
- 0x3E, 0x80, 0x30, 0x20, 0x35, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x1A, 0x56, 0x5E, 0x00,
- 0xA0, 0xA0, 0xA0, 0x29, 0x50, 0x2F, 0x20, 0x35, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x1A,
- 0x00, 0x00, 0x00, 0xFD, 0x00, 0x32, 0x4B, 0x18, 0xA0, 0x3C, 0x01, 0x0A, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x56, 0x58, 0x34, 0x33, 0x38, 0x30, 0x20,
- 0x53, 0x45, 0x52, 0x49, 0x45, 0x53, 0x01, 0x2E, 0x02, 0x03, 0x36, 0xF1, 0x54, 0x01, 0x03,
- 0x04, 0x05, 0x07, 0x0A, 0x0B, 0x0E, 0x0F, 0x90, 0x12, 0x13, 0x14, 0x16, 0x1F, 0x60, 0x61,
- 0x65, 0x66, 0x5D, 0x23, 0x09, 0x7F, 0x07, 0x83, 0x01, 0x00, 0x00, 0x67, 0x03, 0x0C, 0x00,
- 0x10, 0x00, 0x38, 0x78, 0x67, 0xD8, 0x5D, 0xC4, 0x01, 0x78, 0x88, 0x03, 0xE4, 0x0F, 0x00,
- 0x80, 0x07, 0x52, 0x6C, 0x80, 0xA0, 0x70, 0x70, 0x3E, 0x80, 0x30, 0x20, 0x3A, 0x00, 0xAD,
- 0x11, 0x32, 0x00, 0x00, 0x1E, 0x1A, 0x68, 0x00, 0xA0, 0xF0, 0x38, 0x1F, 0x40, 0x30, 0x20,
- 0xA3, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x18, 0xA3, 0x66, 0x00, 0xA0, 0xF0, 0x70, 0x1F,
- 0x80, 0x30, 0x20, 0x35, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x1A};
-
- edid::Edid edid;
- const char* err_msg = nullptr;
- ASSERT_TRUE(edid.Init(edid2, sizeof(edid2), &err_msg));
- fbl::Array<uint8_t> eld = ComputeEld(edid);
- ASSERT_EQ(eld.size(), 36u);
- EXPECT_EQ(eld[3], 0x10); // Version 2.
-
- const char* monitor_name = "VX4380 SERIES";
- size_t monitor_name_length = strlen(monitor_name);
- EXPECT_EQ(eld[sizeof(hda::EldHeader)], 0x60 | monitor_name_length); // EDID version 3, mnl.
- EXPECT_TRUE(memcmp((char*)&eld[20], monitor_name, monitor_name_length) == 0);
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 1], 0x10); // SAD count = 1, other fiels 0.
-
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 12], 0x63); // Manufacturer id2 for ViewSonic.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 13], 0x5a); // Manufacturer id1 for ViewSonic.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 14], 0x34); // Product Code2.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 15], 0x5b); // Product Code1.
-
- // Short Audio Descriptor.
- size_t sad_start = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) + monitor_name_length;
- EXPECT_EQ(eld[sad_start], 0x09); // format = 1, num channels minus 1 = 1.
- EXPECT_EQ(eld[sad_start + 1], 0x7F); // All 7 bits for sampling_frequencies.
- EXPECT_EQ(eld[sad_start + 2], 0x07); // All 4 bits for number of bits.
-}
-
-TEST(EldTest, VsyncWithEld3) {
- static uint8_t edid3[] = {
- 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x6D, 0x08, 0x5B, 0x15, 0x76, 0x01,
- 0x00, 0x09, 0x1B, 0x01, 0x03, 0x80, 0x3C, 0x22, 0x78, 0xEA, 0x30, 0x35, 0xA7, 0x55, 0x4E,
- 0xA3, 0x26, 0x0F, 0x50, 0x54, 0x21, 0x08, 0x00, 0x71, 0x40, 0x81, 0x80, 0x81, 0xC0, 0xA9,
- 0xC0, 0xD1, 0xC0, 0x81, 0x00, 0x01, 0x01, 0x01, 0x01, 0x04, 0x74, 0x00, 0x30, 0xF2, 0x70,
- 0x5A, 0x80, 0xB0, 0x58, 0x8A, 0x00, 0x58, 0x54, 0x21, 0x00, 0x00, 0x1E, 0x56, 0x5E, 0x00,
- 0xA0, 0xA0, 0xA0, 0x29, 0x50, 0x30, 0x20, 0x35, 0x00, 0x58, 0x54, 0x21, 0x00, 0x00, 0x1A,
- 0x00, 0x00, 0x00, 0xFD, 0x00, 0x38, 0x3D, 0x1E, 0x87, 0x1E, 0x00, 0x0A, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x4C, 0x47, 0x20, 0x55, 0x6C, 0x74, 0x72,
- 0x61, 0x20, 0x48, 0x44, 0x0A, 0x20, 0x01, 0xF7, 0x02, 0x03, 0x1D, 0x71, 0x46, 0x90, 0x22,
- 0x05, 0x04, 0x03, 0x01, 0x23, 0x09, 0x07, 0x07, 0x6D, 0x03, 0x0C, 0x00, 0x10, 0x00, 0xB8,
- 0x3C, 0x20, 0x00, 0x60, 0x01, 0x02, 0x03, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,
- 0x58, 0x2C, 0x45, 0x00, 0x58, 0x54, 0x21, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xFF, 0x00,
- 0x37, 0x30, 0x39, 0x4E, 0x54, 0x42, 0x4B, 0x32, 0x54, 0x37, 0x36, 0x35, 0x0A, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x8A};
-
- edid::Edid edid;
- const char* err_msg = nullptr;
- ASSERT_TRUE(edid.Init(edid3, sizeof(edid3), &err_msg));
- fbl::Array<uint8_t> eld = ComputeEld(edid);
- ASSERT_EQ(eld.size(), 36u);
- EXPECT_EQ(eld[3], 0x10); // Version 2.
-
- const char* monitor_name = "LG Ultra HD";
- size_t monitor_name_length = strlen(monitor_name);
- EXPECT_EQ(eld[sizeof(hda::EldHeader)], 0x60 | monitor_name_length); // EDID version 3, mnl.
- EXPECT_TRUE(memcmp((char*)&eld[20], monitor_name, monitor_name_length) == 0);
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 1], 0x10); // SAD count = 1, other fiels 0.
-
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 12], 0x6d); // Manufacturer id2 for LG.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 13], 0x1e); // Manufacturer id1 for LG.
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 14], 0x08); // Product Code2
- EXPECT_EQ(eld[sizeof(hda::EldHeader) + 15], 0x5b); // Product Code1
-
- // Short Audio Descriptor.
- size_t sad_start = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) + monitor_name_length;
- EXPECT_EQ(eld[sad_start], 0x09); // format = 1, num channels minus 1 = 1.
- EXPECT_EQ(eld[sad_start + 1], 0x07); // sampling_frequencies 32k, 44.1k and 48k.
- EXPECT_EQ(eld[sad_start + 2], 0x07); // All 4 bits for number of bits.
-
- EXPECT_EQ(eld[34], 0x00); // Alignment bytes must be zero.
- EXPECT_EQ(eld[35], 0x00); // Alignment bytes must be zero.
-}
-
-} // namespace display
diff --git a/src/graphics/display/drivers/fake/fake-display.cc b/src/graphics/display/drivers/fake/fake-display.cc
index 4d1203d4..4722ca7 100644
--- a/src/graphics/display/drivers/fake/fake-display.cc
+++ b/src/graphics/display/drivers/fake/fake-display.cc
@@ -401,9 +401,6 @@
current_config_stamp_.store(config_stamp, std::memory_order_relaxed);
}
-void FakeDisplay::DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count) {}
-
enum class FakeDisplay::BufferCollectionUsage {
kPrimaryLayer = 1,
kCapture = 2,
diff --git a/src/graphics/display/drivers/fake/fake-display.h b/src/graphics/display/drivers/fake/fake-display.h
index 7f86d7c..b209271 100644
--- a/src/graphics/display/drivers/fake/fake-display.h
+++ b/src/graphics/display/drivers/fake/fake-display.h
@@ -90,8 +90,6 @@
void DisplayControllerImplApplyConfiguration(const display_config_t* display_configs,
size_t display_count,
const config_stamp_t* banjo_config_stamp);
- void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count);
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on);
diff --git a/src/graphics/display/drivers/goldfish-display/display-engine.h b/src/graphics/display/drivers/goldfish-display/display-engine.h
index a87becd..8c2f164 100644
--- a/src/graphics/display/drivers/goldfish-display/display-engine.h
+++ b/src/graphics/display/drivers/goldfish-display/display-engine.h
@@ -74,8 +74,6 @@
void DisplayControllerImplApplyConfiguration(const display_config_t* display_config,
size_t display_count,
const config_stamp_t* banjo_config_stamp);
- void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count) {} // No ELD required for non-HDA systems.
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on) {
diff --git a/src/graphics/display/drivers/intel-i915/intel-i915.cc b/src/graphics/display/drivers/intel-i915/intel-i915.cc
index 150853c..ec0ca6c 100644
--- a/src/graphics/display/drivers/intel-i915/intel-i915.cc
+++ b/src/graphics/display/drivers/intel-i915/intel-i915.cc
@@ -762,13 +762,6 @@
}
void Controller::RemoveDisplay(std::unique_ptr<DisplayDevice> display) {
- // Invalidate and disable any ELD.
- if (display->id() == eld_display_id_) {
- auto audio_pin = registers::AudioPinEldCPReadyStatus::Get().ReadFrom(mmio_space());
- audio_pin.set_eld_valid_a(0).set_audio_enable_a(0).WriteTo(mmio_space());
- eld_display_id_.reset();
- }
-
// Make sure the display's resources get freed before reallocating the pipe buffers by letting
// "display" go out of scope.
}
@@ -1827,36 +1820,6 @@
return is_tgl(device_id_) ? kTigerLakeDataBufferBlockCount : kKabyLakeDataBufferBlockCount;
}
-void Controller::DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count) {
- const display::DisplayId display_id = display::ToDisplayId(banjo_display_id);
- // We use the first "a" of the 3 ELD slots in the datasheet.
- if (eld_display_id_.has_value() && eld_display_id_.value() != display_id) {
- zxlogf(ERROR, "ELD display already in use");
- return;
- }
- eld_display_id_ = display_id;
-
- constexpr size_t kMaxEldLength = 48;
- size_t length = std::min<size_t>(raw_eld_count, kMaxEldLength);
- auto edid0 = registers::AudEdidData::Get(0).ReadFrom(mmio_space());
- auto audio_pin = registers::AudioPinEldCPReadyStatus::Get().ReadFrom(mmio_space());
- auto ctrl = registers::AudioDipEldControlStatus::Get().ReadFrom(mmio_space());
- audio_pin.set_audio_enable_a(1).set_eld_valid_a(0).WriteTo(mmio_space());
-
- // TODO(andresoportus): We should "Wait for 2 vertical blanks" if we do this with the display
- // enabled.
-
- ctrl.set_eld_access_address(0).WriteTo(mmio_space());
- ZX_ASSERT(!(length % 4)); // We don't use vendor block so length is multiple of 4.
- for (size_t i = 0; i < length; i += 4) {
- edid0.set_data(raw_eld_list[i] | (raw_eld_list[i + 1] << 8) | (raw_eld_list[i + 2] << 16) |
- (raw_eld_list[i + 3] << 24));
- edid0.WriteTo(mmio_space());
- }
- audio_pin.set_eld_valid_a(1).WriteTo(mmio_space());
-}
-
void Controller::DisplayControllerImplApplyConfiguration(
const display_config_t* banjo_display_configs, size_t display_config_count,
const config_stamp_t* banjo_config_stamp) {
diff --git a/src/graphics/display/drivers/intel-i915/intel-i915.h b/src/graphics/display/drivers/intel-i915/intel-i915.h
index be96da4..72667a4 100644
--- a/src/graphics/display/drivers/intel-i915/intel-i915.h
+++ b/src/graphics/display/drivers/intel-i915/intel-i915.h
@@ -100,8 +100,6 @@
void DisplayControllerImplApplyConfiguration(const display_config_t* banjo_display_configs,
size_t display_config_count,
const config_stamp_t* banjo_config_stamp);
- void DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count);
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplSetDisplayPower(uint64_t banjo_display_id, bool power_on) {
@@ -343,8 +341,6 @@
// Various configuration values set by the BIOS which need to be carried across suspend.
bool ddi_e_disabled_ = true;
- std::optional<display::DisplayId> eld_display_id_;
-
// Debug
inspect::Inspector inspector_;
inspect::Node root_node_;
diff --git a/src/graphics/display/drivers/intel-i915/registers.h b/src/graphics/display/drivers/intel-i915/registers.h
index 0bfb392..767b236 100644
--- a/src/graphics/display/drivers/intel-i915/registers.h
+++ b/src/graphics/display/drivers/intel-i915/registers.h
@@ -542,58 +542,6 @@
static auto Get() { return hwreg::RegisterAddr<FuseStatus>(0x42000); }
};
-// AUD_EDID_DATA
-class AudEdidData : public hwreg::RegisterBase<AudEdidData, uint32_t> {
- public:
- DEF_FIELD(31, 0, data);
-
- static auto Get(int transcoder_id) {
- if (transcoder_id == 0) {
- return hwreg::RegisterAddr<AudEdidData>(0x65050);
- } else if (transcoder_id == 1) {
- return hwreg::RegisterAddr<AudEdidData>(0x65150);
- } else { // transcoder_id == 2.
- ZX_DEBUG_ASSERT(transcoder_id == 2);
- return hwreg::RegisterAddr<AudEdidData>(0x65250);
- }
- }
-};
-
-// AUD_DIP_ELD_CTRL_ST
-class AudioDipEldControlStatus : public hwreg::RegisterBase<AudioDipEldControlStatus, uint32_t> {
- public:
- DEF_FIELD(30, 29, dip_port_select);
- DEF_FIELD(24, 21, dip_type_enable_status);
- DEF_FIELD(20, 18, dip_buffer_index);
- DEF_FIELD(17, 16, dip_transmission_frequency);
- DEF_FIELD(14, 10, eld_buffer_size);
- DEF_FIELD(9, 5, eld_access_address);
- DEF_BIT(4, eld_ack);
- DEF_FIELD(3, 0, dip_access_address);
- static auto Get() { return hwreg::RegisterAddr<AudioDipEldControlStatus>(0x650B4); }
-};
-
-// AUD_PIN_ELD_CP_VLD
-class AudioPinEldCPReadyStatus : public hwreg::RegisterBase<AudioPinEldCPReadyStatus, uint32_t> {
- public:
- DEF_BIT(11, audio_inactive_c);
- DEF_BIT(10, audio_enable_c);
- DEF_BIT(9, cp_ready_c);
- DEF_BIT(8, eld_valid_c);
-
- DEF_BIT(7, audio_inactive_b);
- DEF_BIT(6, audio_enable_b);
- DEF_BIT(5, cp_ready_b);
- DEF_BIT(4, eld_valid_b);
-
- DEF_BIT(3, audio_inactive_a);
- DEF_BIT(2, audio_enable_a);
- DEF_BIT(1, cp_ready_a);
- DEF_BIT(0, eld_valid_a);
-
- static auto Get() { return hwreg::RegisterAddr<AudioPinEldCPReadyStatus>(0x650C0); }
-};
-
// CDCLK_CTL (CD Clock Control)
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-12.21 Part 1 pages 220-222
diff --git a/src/graphics/display/drivers/simple/simple-display.h b/src/graphics/display/drivers/simple/simple-display.h
index 024aa0a..6aefe3f 100644
--- a/src/graphics/display/drivers/simple/simple-display.h
+++ b/src/graphics/display/drivers/simple/simple-display.h
@@ -79,8 +79,6 @@
void DisplayControllerImplApplyConfiguration(const display_config_t* display_config,
size_t display_count,
const config_stamp_t* banjo_config_stamp);
- void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count) {} // No ELD required for non-HDA systems.
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on) {
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc
index 4d0b318..044ff07 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc
@@ -126,14 +126,6 @@
return engine_.ApplyConfiguration(display_configs, banjo_config_stamp);
}
-void DisplayControllerBanjo::DisplayControllerImplSetEld(uint64_t banjo_display_id,
- const uint8_t* raw_eld_list,
- size_t raw_eld_count) {
- const display::DisplayId display_id = display::ToDisplayId(banjo_display_id);
- const cpp20::span<const uint8_t> raw_eld(raw_eld_list, raw_eld_count);
- engine_.SetEld(display_id, raw_eld);
-}
-
zx_status_t DisplayControllerBanjo::DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* banjo_image_buffer_usage,
uint64_t banjo_driver_buffer_collection_id) {
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h
index 2e22599..e2d60c6 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h
@@ -55,8 +55,6 @@
void DisplayControllerImplApplyConfiguration(const display_config_t* banjo_display_configs,
size_t banjo_display_configs_count,
const config_stamp_t* banjo_config_stamp);
- void DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
- size_t raw_eld_count);
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* banjo_image_buffer_usage,
uint64_t banjo_driver_buffer_collection_id);
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h b/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h
index a1a2ba9..84d8473 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h
@@ -63,8 +63,6 @@
virtual void ApplyConfiguration(cpp20::span<const display_config_t> display_configs,
const config_stamp_t* banjo_config_stamp) = 0;
- virtual void SetEld(display::DisplayId display_id, cpp20::span<const uint8_t> raw_eld) = 0;
-
virtual zx::result<> SetBufferCollectionConstraints(
const display::ImageBufferUsage& image_buffer_usage,
display::DriverBufferCollectionId driver_buffer_collection_id) = 0;
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc b/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc
index dcf8f16..189c170 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc
@@ -347,11 +347,6 @@
}
}
-void DisplayEngine::SetEld(display::DisplayId display_id, cpp20::span<const uint8_t> raw_eld) {
- // No ELD required for non-HDA systems.
- return;
-}
-
zx::result<> DisplayEngine::SetBufferCollectionConstraints(
const display::ImageBufferUsage& image_buffer_usage,
display::DriverBufferCollectionId driver_buffer_collection_id) {
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-engine.h b/src/graphics/display/drivers/virtio-guest/v1/display-engine.h
index 5f6d23d..81b68d9 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-engine.h
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-engine.h
@@ -89,7 +89,6 @@
size_t* out_client_composition_opcodes_actual) override;
void ApplyConfiguration(cpp20::span<const display_config_t> display_configs,
const config_stamp_t* banjo_config_stamp) override;
- void SetEld(display::DisplayId display_id, cpp20::span<const uint8_t> raw_eld) override;
zx::result<> SetBufferCollectionConstraints(
const display::ImageBufferUsage& image_buffer_usage,
display::DriverBufferCollectionId driver_buffer_collection_id) override;
diff --git a/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h b/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h
index 55828d1..57ca5f2 100644
--- a/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h
+++ b/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h
@@ -69,8 +69,6 @@
CheckConfigurationCompleter::Sync& completer) override {}
void ApplyConfiguration(ApplyConfigurationRequestView request, fdf::Arena& arena,
ApplyConfigurationCompleter::Sync& completer) override {}
- void SetEld(SetEldRequestView request, fdf::Arena& arena,
- SetEldCompleter::Sync& completer) override {}
void SetBufferCollectionConstraints(
SetBufferCollectionConstraintsRequestView request, fdf::Arena& arena,
SetBufferCollectionConstraintsCompleter::Sync& completer) override {}
diff --git a/src/lib/ddktl/include/ddktl/device.h b/src/lib/ddktl/include/ddktl/device.h
index 6731f1c..864bf69 100644
--- a/src/lib/ddktl/include/ddktl/device.h
+++ b/src/lib/ddktl/include/ddktl/device.h
@@ -319,6 +319,39 @@
std::vector<device_metadata_t> metadata_list_;
};
+// Factory functions to create a zx_device_str_prop_t.
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, uint32_t val) {
+ return {key.c_str(), str_prop_int_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, uint32_t val) {
+ return {key, str_prop_int_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, bool val) {
+ return {key.c_str(), str_prop_bool_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, bool val) {
+ return {key, str_prop_bool_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, const std::string& val) {
+ return {key.c_str(), str_prop_str_val(val.c_str())};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, const std::string& val) {
+ return {key, str_prop_str_val(val.c_str())};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, const char* val) {
+ return {key.c_str(), str_prop_str_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, const char* val) {
+ return {key, str_prop_str_val(val)};
+}
+
class DeviceAddArgs {
public:
explicit DeviceAddArgs(const char* name) {
diff --git a/src/sys/pkg/bin/pm/cmd/pm/pm.go b/src/sys/pkg/bin/pm/cmd/pm/pm.go
index 0b319e3..2e199e3 100644
--- a/src/sys/pkg/bin/pm/cmd/pm/pm.go
+++ b/src/sys/pkg/bin/pm/cmd/pm/pm.go
@@ -15,7 +15,6 @@
"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/build"
"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/archive"
buildcmd "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/build"
- initcmd "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/init"
"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/publish"
"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/seal"
"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/serve"
@@ -30,7 +29,6 @@
through ffx. Please adapt workflows accordingly.
Package Commands:
- init - initialize a package meta directory in the standard form
build - perform update and seal in order
update - update the merkle roots in meta/contents
seal - seal package metadata into a meta.far
@@ -98,7 +96,9 @@
err = nil
case "init":
- err = initcmd.Run(cfg, flag.Args()[1:])
+ url := "https://fuchsia.dev/fuchsia-src/development/idk/documentation/packages"
+ fmt.Fprintf(os.Stderr, "please create the meta directory and the meta package file according to %v", url)
+ err = nil
case "publish":
err = publish.Run(cfg, flag.Args()[1:])
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5
index f49c03d..becc96c 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5
@@ -14,10 +14,6 @@
"SocketTest.UnixSocketStatFS",
"OpenModes/SocketOpenTest.Unix/*",
- // Netstack3 does not support SO_REUSEADDR for UDP.
- "IPUnboundSockets/IPUnboundSocketTest.ReuseAddrDefault/[0123]",
- "IPUnboundSockets/IPUnboundSocketTest.SetReuseAddr/[0123]",
-
// Netstack3 does not support many UDP socket options or operations
"IPUnboundSockets/IPUnboundSocketTest.CheckSkipECN/*",
"IPUnboundSockets/IPUnboundSocketTest.InvalidLargeTOS/*",
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5
index 2161b01..df7fee1 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5
@@ -37,7 +37,6 @@
"AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.BindToDeviceReusePort/TCP",
// Netstack3 does not have complete support for multicast sockets.
- "AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.V4EphemeralPortReservedReuseAddr/UDP",
"AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.V4MappedEphemeralPortReservedReuseAddr/UDP",
"AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.V6EphemeralPortReservedReuseAddr/UDP",
],
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5
index b751824..6f6ffb2 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5
@@ -6,9 +6,7 @@
{
type: "expect_failure",
matchers: [
- // Netstack3 does not support SO_REUSEADDR and only partially supports
- // SO_REUSEPORT for UDP sockets.
- "AllUDPSockets/UDPSocketPairTest.ReuseAddrDefault/*",
+ // Netstack3 does not support SO_REUSEADDR and SO_REUSEPORT on bound sockets.
"AllUDPSockets/UDPSocketPairTest.SetReuseAddr/*",
"AllUDPSockets/UDPSocketPairTest.SetReuseAddrReusePort/*",
"AllUDPSockets/UDPSocketPairTest.SetReusePort/*",
@@ -57,7 +55,6 @@
// Netstack3 does not support many UDP socket options or operations
"AllUDPSockets/AllSocketPairTest.BasicRecvmmsg/*",
"AllUDPSockets/AllSocketPairTest.BasicSendmmsg/*",
- "AllUDPSockets/AllSocketPairTest.GetSndBufSucceeds/*",
"AllUDPSockets/AllSocketPairTest.GetSocketOutOfBandInlineOption/*",
"AllUDPSockets/AllSocketPairTest.GetSocketRcvbufOption/*",
"AllUDPSockets/AllSocketPairTest.KeepAliveSocketOption/*",
@@ -67,7 +64,6 @@
"AllUDPSockets/AllSocketPairTest.SendmmsgIsLimitedByMAXIOV/*",
"AllUDPSockets/AllSocketPairTest.RecvmsgPeekMsghdrFlagsCleared/*",
"AllUDPSockets/AllSocketPairTest.SetAndGetBooleanSocketOptions/*",
- "AllUDPSockets/NonStreamSocketPairTest.SendMsgTooLarge/*",
"AllUDPSockets/UDPSocketPairTest.GetSocketAcceptConn/*",
"AllUDPSockets/UDPSocketPairTest.IPPKTINFODefault/*",
"AllUDPSockets/UDPSocketPairTest.RecvTosDefault/*",
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5
index b0e0e15..9d28b05 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5
@@ -6,14 +6,6 @@
{
type: "expect_failure",
matchers: [
- // Netstack3 does not support SO_REUSEADDR and only partially supports
- // SO_REUSEPORT for UDP sockets.
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindDoubleReuseAddrReusePortThenReuseAddr/*",
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindReuseAddrReusePortConversionReversable1/*",
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindReuseAddrReusePortConversionReversable2/*",
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindReuseAddrReusePortConvertibleToReuseAddr/*",
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.ReuseAddrDistribution/*",
-
// Netstack3 does not have complete support for multicast UDP sockets.
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.IpMulticastIPPacketInfo/*",
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.IpMulticastLoopbackAddrNoDefaultSendIf/*",
@@ -25,8 +17,6 @@
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetAndReceiveIPPKTINFO/*",
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketRecvBuf/*",
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketSendBuf/*",
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketSendBufAboveMax/*",
- "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketSendBufBelowMin/*",
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.TestBindToBcastThenReceive/*",
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.TestBindToBcastThenSend/*",
"IPv4UDPSockets/IPv4UDPUnboundSocketTest.TestBindToMcastThenSend/*",
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index 8da67cb..205050e 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit 8da67cbc66b8d96f4873fc2ce6de80edc12f913a
+Subproject commit 205050e07712f021f766d8aca85bf7f549665f81
diff --git a/tools/devshell/host-tool b/tools/devshell/host-tool
index fb91710..2242026 100755
--- a/tools/devshell/host-tool
+++ b/tools/devshell/host-tool
@@ -27,7 +27,9 @@
set -e
+# shellcheck source=tools/devshell/lib/vars.sh
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
+# shellcheck source=tools/devshell/lib/host_symbolizer.sh
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/host_symbolizer.sh || exit $?
fx-config-read
@@ -90,6 +92,7 @@
# list-build-artifacts fails with a reasonable error message if tool is unknown
toolpath="$(fx-command-run list-build-artifacts --name "${toolname}" --expect-one tools)"
+tool_label="$(fx-command-run list-build-artifacts --show-label --name "${toolname}" --expect-one tools)"
if [[ ! -f "${FUCHSIA_BUILD_DIR}/${toolpath}" ]]; then
# If the desire is to build, then it's important for the build to
@@ -107,13 +110,13 @@
if ! $build; then
fx-error "Tool \"${toolname}\" is required by this command and has not been built."
- fx-error "Please build it first: fx build ${toolpath}"
+ fx-error "Please build it first: fx build ${tool_label}"
exit 2
fi
{
- echo "Building required tool \"${toolpath}\"..."
- fx-command-run build "${toolpath}" || exit $?
+ echo "Building required tool '${toolname}' from \"${tool_label}\"..."
+ fx-command-run build "${tool_label}" || exit $?
} 1>&2
fi
diff --git a/tools/devshell/tests/subcommands/fx_host_tool_test b/tools/devshell/tests/subcommands/fx_host_tool_test
index 2c9d964..8f363b0b 100644
--- a/tools/devshell/tests/subcommands/fx_host_tool_test
+++ b/tools/devshell/tests/subcommands/fx_host_tool_test
@@ -5,9 +5,12 @@
### Test expected usage of host-tool in fx scripts
+# Source platform.sh so that we can point to jq and include it as a runtime dependency.
+source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/../../lib/platform.sh" || exit $?
BT_FILE_DEPS=(
"scripts/fx"
+ "prebuilt/third_party/jq/${HOST_PLATFORM}/bin/jq"
"tools/devshell/lib/fx-cmd-locator.sh"
"tools/devshell/lib/fx-optional-features.sh"
"tools/devshell/lib/host_symbolizer.sh"
@@ -15,10 +18,11 @@
"tools/devshell/lib/vars.sh"
"tools/devshell/lib/platform.sh"
"tools/devshell/host-tool"
+ "tools/devshell/list-build-artifacts"
+ "tools/devshell/jq.fx"
)
BT_MOCKED_TOOLS=(
- "tools/devshell/list-build-artifacts"
"tools/devshell/build"
)
@@ -31,10 +35,32 @@
fx-config-read
ffx="$(btf::make_installed_hosttools_mock ffx)"
ffx_rel="${ffx##${FUCHSIA_BUILD_DIR}/}"
- cat >"${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" <<EOF
- [[ \$2 == "ffx" ]] && echo ${ffx_rel} && exit 0
- exit 1
+
+ # slow_tool is used by the TEST_kill_bg_process below and must be
+ # listed in tool_paths.json.
+ slow_tool="$(btf::make_installed_hosttools_mock slow_tool)"
+ slow_tool_rel="${slow_tool##${FUCHSIA_BUILD_DIR}/}"
+
+ # Set up dummy build API modules.
+cat > "${BT_TEMP_DIR}/out/default/tool_paths.json" <<EOF
+[
+ {
+ "cpu": "${HOST_CPU}",
+ "label": "//tools/ffx(//build/toolchain:host_${HOST_CPU})",
+ "name": "ffx",
+ "os": "${HOST_OS}",
+ "path": "${ffx_rel}"
+ },
+ {
+ "cpu": "${HOST_CPU}",
+ "label": "//tools/slow_tool(//build/toolchain:host_${HOST_CPU})",
+ "name": "slow_tool",
+ "os": "${HOST_OS}",
+ "path": "${slow_tool_rel}"
+ }
+]
EOF
+
local uname="$(btf::make_mock_binary uname)"
btf::add_binary_to_path "$uname"
@@ -152,12 +178,6 @@
EOF
chmod +x "${frontend_cmd}"
- local slow_tool="$(btf::make_installed_hosttools_mock slow_tool)"
- local slow_tool_rel="${slow_tool##${FUCHSIA_BUILD_DIR}/}"
- cat >"${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" <<EOF
- [[ \$2 == "slow_tool" ]] && echo ${slow_tool_rel} && exit 0
- exit 1
-EOF
cat >"${slow_tool}.mock_side_effects" <<EOF
cleanup() {
local st=\$1
diff --git a/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden b/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden
index fc3f8c9..bcb5482 100644
--- a/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden
+++ b/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden
@@ -5241,7 +5241,7 @@
template<>
struct ::fidl::internal::ProtocolDetails<::test_protocols::PlatformServer> {
- static constexpr char DiscoverableName[] = "platform";
+ static constexpr char DiscoverableName[] = "test.protocols.PlatformServer";
};
#endif // __Fuchsia__
diff --git a/tools/fidl/fidlgen_go/goldens/protocols.go.golden b/tools/fidl/fidlgen_go/goldens/protocols.go.golden
index e7fb1e8..832786e 100644
--- a/tools/fidl/fidlgen_go/goldens/protocols.go.golden
+++ b/tools/fidl/fidlgen_go/goldens/protocols.go.golden
@@ -1114,13 +1114,13 @@
// Implements ServiceRequest.
func (_ PlatformServerWithCtxInterfaceRequest) Name() string {
- return "platform"
+ return "test.protocols.PlatformServer"
}
func (c PlatformServerWithCtxInterfaceRequest) ToChannel() _zx.Channel {
return c.Channel
}
-const PlatformServerName = "platform"
+const PlatformServerName = "test.protocols.PlatformServer"
type PlatformServerWithCtxStub struct {
Impl PlatformServerWithCtx
diff --git a/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden b/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden
index 22e8d01..258c6ff 100644
--- a/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden
+++ b/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden
@@ -3594,7 +3594,7 @@
PlatformServer::~PlatformServer() = default;
-const char PlatformServer::Name_[] = "platform";
+const char PlatformServer::Name_[] = "test.protocols.PlatformServer";
const fidl_type_t* ::test::protocols::PlatformServer_RequestDecoder::GetType(uint64_t ordinal, bool* out_needs_response, bool* out_is_known) {
*out_needs_response = false;
diff --git a/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden b/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden
index 633802f..0e31c43 100644
--- a/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden
+++ b/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden
@@ -2979,7 +2979,7 @@
#[cfg(target_os = "fuchsia")]
type SynchronousProxy = PlatformServer_SynchronousProxy;
- const DEBUG_NAME: &'static str = "platform";
+ const DEBUG_NAME: &'static str = "test.protocols.PlatformServer";
}
impl fidl::endpoints::DiscoverableProtocolMarker for PlatformServer_Marker {}
diff --git a/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden b/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden
index 23b1507..5882c6e 100644
--- a/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden
+++ b/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden
@@ -563,7 +563,7 @@
resource zx_chan_test_protocols_PlatformServer_server[zx_chan]
zx_channel_create$test_protocols_PlatformServer(options const[0], out0 ptr[out, zx_chan_test_protocols_PlatformServer_client], out1 ptr[out, zx_chan_test_protocols_PlatformServer_server])
-fdio_service_connect$test_protocols_PlatformServer(path ptr[in, string["/svc/platform"]], handle zx_chan_test_protocols_PlatformServer_server)
+fdio_service_connect$test_protocols_PlatformServer(path ptr[in, string["/svc/test.protocols.PlatformServer"]], handle zx_chan_test_protocols_PlatformServer_server)
test_protocols_SyscallProtocolMethodCRequest {
diff --git a/tools/fidl/lib/fidlgen/types.go b/tools/fidl/lib/fidlgen/types.go
index 29a2c08..7495dc7 100644
--- a/tools/fidl/lib/fidlgen/types.go
+++ b/tools/fidl/lib/fidlgen/types.go
@@ -1326,7 +1326,7 @@
return ""
}
var name string
- if arg, ok := attr.LookupArgStandalone(); ok {
+ if arg, ok := attr.LookupArg("name"); ok {
name = arg.ValueString()
} else {
// TODO(https://fxbug.dev/42053780): Construct this string in fidlc, not here.