Add window extensions to AOSP cuttlefish foldable target. am: 6901602172
Original change: https://googleplex-android-review.googlesource.com/c/device/google/cuttlefish/+/16586025
Change-Id: I567f632cdc74e30ff12c2543efb3a8c644152242
diff --git a/.clang-format b/.clang-format
index 9f9ffe3..a03f8b3 100644
--- a/.clang-format
+++ b/.clang-format
@@ -19,3 +19,4 @@
# of the below options.
BasedOnStyle: Google
+IncludeBlocks: Preserve
diff --git a/Android.mk b/Android.mk
index 59e9806..10c9765 100644
--- a/Android.mk
+++ b/Android.mk
@@ -11,7 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-ifneq ($(filter vsoc_arm64 vsoc_x86 vsoc_x86_64, $(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter vsoc_arm vsoc_arm64 vsoc_x86 vsoc_x86_64, $(TARGET_BOARD_PLATFORM)),)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
diff --git a/AndroidProducts.mk b/AndroidProducts.mk
index 8d06ed7..c51b1b4 100644
--- a/AndroidProducts.mk
+++ b/AndroidProducts.mk
@@ -18,7 +18,9 @@
aosp_cf_arm_only_phone:$(LOCAL_DIR)/vsoc_arm_only/phone/aosp_cf.mk \
aosp_cf_arm64_auto:$(LOCAL_DIR)/vsoc_arm64/auto/aosp_cf.mk \
aosp_cf_arm64_phone:$(LOCAL_DIR)/vsoc_arm64/phone/aosp_cf.mk \
+ aosp_cf_arm64_phone_hwasan:$(LOCAL_DIR)/vsoc_arm64/phone/aosp_cf_hwasan.mk \
aosp_cf_arm64_only_phone:$(LOCAL_DIR)/vsoc_arm64_only/phone/aosp_cf.mk \
+ aosp_cf_arm64_only_phone_hwasan:$(LOCAL_DIR)/vsoc_arm64_only/phone/aosp_cf_hwasan.mk \
aosp_cf_x86_64_auto:$(LOCAL_DIR)/vsoc_x86_64/auto/device.mk \
aosp_cf_x86_64_pc:$(LOCAL_DIR)/vsoc_x86_64/pc/aosp_cf.mk \
aosp_cf_x86_64_phone:$(LOCAL_DIR)/vsoc_x86_64/phone/aosp_cf.mk \
diff --git a/CleanSpec.mk b/CleanSpec.mk
index f235841..6d10d12 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -58,6 +58,9 @@
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/[email protected])
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/[email protected])
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/[email protected])
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/[email protected])
+
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/[email protected])
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/[email protected])
@@ -68,3 +71,8 @@
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/[email protected])
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/product/apex/com.android.gki.*)
+
+$(call add-clean-step, find $(PRODUCT_OUT)/system -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/vendor -type f -name "*health@*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*health@*" -print0 | xargs -0 rm -f)
diff --git a/README.md b/README.md
index 2220898..25dd51b 100644
--- a/README.md
+++ b/README.md
@@ -12,15 +12,26 @@
take cloud-vendor-specific steps to enable. For Google Compute Engine
specifically, see the [GCE guide].
- [GCE guide]: https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances
+ [GCE guide]: https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances
+
+*** promo
+ ARM specific steps:
+ - When running on an ARM machine, the most direct way is to check
+ for the existence of `/dev/kvm`. Note that this method can also be used to
+ confirm support of KVM on any environment.
+ - Before proceeding to the next step, please first follow
+ [the guide](multiarch-howto.md) to adjust APT sources.
+***
2. Download, build, and install the host debian package:
```bash
+ sudo apt install -y git devscripts config-package-dev debhelper-compat golang
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish
debuild -i -us -uc -b
- sudo dpkg -i ../cuttlefish-common_*_amd64.deb || sudo apt-get install -f
+ sudo dpkg -i ../cuttlefish-common_*_*64.deb || sudo apt-get install -f
+ sudo usermod -aG kvm,cvdnetwork $USER
sudo reboot
```
@@ -67,12 +78,3 @@
WebRTC on Cuttlefish
[documentation](https://source.android.com/setup/create/cuttlefish-ref-webrtc).
-## Launch Viewer (VNC)
-
-When launching with `--start_vnc_server=true` , You can use the
-[TightVNC JViewer](https://www.tightvnc.com/download.php). Once you have
-downloaded the *TightVNC Java Viewer JAR in a ZIP archive*, run it with
-
- `$ java -jar tightvnc-jviewer.jar -ScalingFactor=50 -Tunneling=no -host=localhost -port=6444`
-
-Click "Connect" and you should see a lock screen!
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 4067d27..92e1712 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -19,6 +19,15 @@
},
{
"name": "vts_ibase_test"
+ },
+ {
+ "name": "OverlayDeviceTests"
+ },
+ {
+ "name": "CtsNativeVerifiedBootTestCases"
+ },
+ {
+ "name": "CtsScopedStorageDeviceOnlyTest"
}
]
}
diff --git a/apex/com.android.hardware.core_permissions/Android.bp b/apex/com.android.hardware.core_permissions/Android.bp
new file mode 100644
index 0000000..11e28d7
--- /dev/null
+++ b/apex/com.android.hardware.core_permissions/Android.bp
@@ -0,0 +1,47 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+override_apex {
+ name: "com.google.aosp_cf_x86_64_phone.hardware.core_permissions",
+ base: "com.android.hardware.core_permissions",
+ prebuilts: [
+ "android.hardware.audio.low_latency.prebuilt.xml",
+ "android.hardware.biometrics.face.prebuilt.xml",
+ "android.hardware.camera.concurrent.prebuilt.xml",
+ "android.hardware.camera.flash-autofocus.prebuilt.xml",
+ "android.hardware.camera.front.prebuilt.xml",
+ "android.hardware.camera.full.prebuilt.xml",
+ "android.hardware.camera.raw.prebuilt.xml",
+ "android.hardware.ethernet.prebuilt.xml",
+ "android.hardware.faketouch.prebuilt.xml",
+ "android.hardware.fingerprint.prebuilt.xml",
+ "android.hardware.location.gps.prebuilt.xml",
+ "android.hardware.reboot_escrow.prebuilt.xml",
+ "android.hardware.vulkan.level-0.prebuilt.xml",
+ "android.hardware.vulkan.version-1_0_3.prebuilt.xml",
+ "android.software.device_id_attestation.prebuilt.xml",
+ "android.software.ipsec_tunnels.prebuilt.xml",
+ "android.software.opengles.deqp.level-2021-03-01.prebuilt.xml",
+ "android.software.sip.voip.prebuilt.xml",
+ "android.software.verified_boot.prebuilt.xml",
+ "android.software.vulkan.deqp.level-2021-03-01.prebuilt.xml",
+ "aosp_excluded_hardware.prebuilt.xml",
+ "cuttlefish_excluded_hardware.prebuilt.xml",
+ "handheld_core_hardware.prebuilt.xml",
+ ],
+}
diff --git a/apex/com.google.aosp_cf_x86_64_phone.rros/Android.bp b/apex/com.google.aosp_cf_x86_64_phone.rros/Android.bp
new file mode 100644
index 0000000..e988ecf
--- /dev/null
+++ b/apex/com.google.aosp_cf_x86_64_phone.rros/Android.bp
@@ -0,0 +1,34 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+apex {
+ name: "com.google.aosp_cf_x86_64_phone.rros",
+ manifest: "apex_manifest.json",
+ key: "com.google.cf.apex.key",
+ certificate: ":com.google.cf.apex.certificate",
+ file_contexts: "file_contexts",
+ use_vndk_as_stable: true,
+ updatable: false,
+ // Install the apex in /vendor/apex
+ soc_specific: true,
+ rros: [
+ "cuttlefish_overlay_frameworks_base_core",
+ "cuttlefish_overlay_settings_provider",
+ "cuttlefish_phone_overlay_frameworks_base_core",
+ ],
+}
diff --git a/apex/com.google.aosp_cf_x86_64_phone.rros/apex_manifest.json b/apex/com.google.aosp_cf_x86_64_phone.rros/apex_manifest.json
new file mode 100644
index 0000000..47cefb5
--- /dev/null
+++ b/apex/com.google.aosp_cf_x86_64_phone.rros/apex_manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "com.google.aosp_cf_x86_64_phone.rros",
+ "version": 1
+}
diff --git a/apex/com.google.aosp_cf_x86_64_phone.rros/file_contexts b/apex/com.google.aosp_cf_x86_64_phone.rros/file_contexts
new file mode 100644
index 0000000..cb7fd8d
--- /dev/null
+++ b/apex/com.google.aosp_cf_x86_64_phone.rros/file_contexts
@@ -0,0 +1,2 @@
+(/.*)? u:object_r:vendor_file:s0
+/overlay(/.*)? u:object_r:vendor_overlay_file:s0
diff --git a/apex/com.google.cf.bt/Android.bp b/apex/com.google.cf.bt/Android.bp
new file mode 100644
index 0000000..438db02
--- /dev/null
+++ b/apex/com.google.cf.bt/Android.bp
@@ -0,0 +1,45 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_etc {
+ name: "com.google.cf.bt.rc",
+ src: "com.google.cf.bt.rc",
+ installable: false,
+}
+
+apex {
+ name: "com.google.cf.bt",
+ manifest: "manifest.json",
+ file_contexts: "file_contexts",
+ key: "com.google.cf.apex.key",
+ certificate: ":com.google.cf.apex.certificate",
+ use_vndk_as_stable: true,
+ updatable: false,
+ soc_specific: true,
+ binaries: [
+ "[email protected]",
+ "bt_vhci_forwarder",
+ ],
+ prebuilts: [
+ "android.hardware.bluetooth_le.prebuilt.xml",
+ "android.hardware.bluetooth.prebuilt.xml",
+ "com.google.cf.bt.rc",
+ ],
+ init_rc: ["com.google.cf.bt.trig.rc"],
+ vintf_fragments: [":[email protected]"],
+}
diff --git a/apex/com.google.cf.bt/com.google.cf.bt.rc b/apex/com.google.cf.bt/com.google.cf.bt.rc
new file mode 100644
index 0000000..a5f2ae7
--- /dev/null
+++ b/apex/com.google.cf.bt/com.google.cf.bt.rc
@@ -0,0 +1,9 @@
+service bt_vhci_forwarder /apex/com.google.cf.bt/bin/bt_vhci_forwarder -virtio_console_dev=${vendor.ser.bt-uart}
+ user bluetooth
+ group bluetooth
+
+service btlinux-1.1 /apex/com.google.cf.bt/bin/hw/[email protected]
+ class hal
+ user bluetooth
+ group bluetooth net_admin net_bt_admin
+ capabilities NET_ADMIN
diff --git a/apex/com.google.cf.bt/com.google.cf.bt.trig.rc b/apex/com.google.cf.bt/com.google.cf.bt.trig.rc
new file mode 100644
index 0000000..a082c18
--- /dev/null
+++ b/apex/com.google.cf.bt/com.google.cf.bt.trig.rc
@@ -0,0 +1,6 @@
+## Init files within the APEX do not support triggers (b/202731768)
+## By adding this as an init_rc parameter of the APEX the file will be installed
+## outside of the APEX and instead be installed under /vendor/etc/init.
+on post-fs-data
+ start bt_vhci_forwarder
+
diff --git a/apex/com.google.cf.bt/file_contexts b/apex/com.google.cf.bt/file_contexts
new file mode 100644
index 0000000..b148753
--- /dev/null
+++ b/apex/com.google.cf.bt/file_contexts
@@ -0,0 +1,4 @@
+(/.*)? u:object_r:vendor_file:s0
+/bin/hw/[email protected] u:object_r:hal_bluetooth_btlinux_exec:s0
+/bin/bt_vhci_forwarder u:object_r:bt_vhci_forwarder_exec:s0
+/etc/permissions(/.*)? u:object_r:vendor_configs_file:s0
\ No newline at end of file
diff --git a/apex/com.google.cf.bt/manifest.json b/apex/com.google.cf.bt/manifest.json
new file mode 100644
index 0000000..0436efe
--- /dev/null
+++ b/apex/com.google.cf.bt/manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "com.google.cf.bt",
+ "version": 1
+}
diff --git a/apex/com.google.cf.input.config/Android.bp b/apex/com.google.cf.input.config/Android.bp
new file mode 100644
index 0000000..00edee9
--- /dev/null
+++ b/apex/com.google.cf.input.config/Android.bp
@@ -0,0 +1,37 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+apex {
+ name: "com.google.cf.input.config",
+ // InputDevice expects input config files in /apex/com.android.input.config/etc
+ apex_name: "com.android.input.config",
+ manifest: "apex_manifest.json",
+ key: "com.google.cf.apex.key",
+ certificate: ":com.google.cf.apex.certificate",
+ file_contexts: "file_contexts",
+ use_vndk_as_stable: true,
+ updatable: false,
+ // Install the apex in /vendor/apex
+ soc_specific: true,
+ prebuilts: [
+ "Crosvm_Virtio_Multitouch_Touchscreen_0.idc",
+ "Crosvm_Virtio_Multitouch_Touchscreen_1.idc",
+ "Crosvm_Virtio_Multitouch_Touchscreen_2.idc",
+ "Crosvm_Virtio_Multitouch_Touchscreen_3.idc",
+ ],
+}
diff --git a/apex/com.google.cf.input.config/apex_manifest.json b/apex/com.google.cf.input.config/apex_manifest.json
new file mode 100644
index 0000000..dce7ad4
--- /dev/null
+++ b/apex/com.google.cf.input.config/apex_manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "com.android.input.config",
+ "version": 1
+}
diff --git a/apex/com.google.cf.input.config/file_contexts b/apex/com.google.cf.input.config/file_contexts
new file mode 100644
index 0000000..e982bd5
--- /dev/null
+++ b/apex/com.google.cf.input.config/file_contexts
@@ -0,0 +1,4 @@
+(/.*)? u:object_r:vendor_file:s0
+/etc/usr/keylayout(/.*)?\.kl u:object_r:vendor_keylayout_file:s0
+/etc/usr/keychars(/.*)?\.kcm u:object_r:vendor_keychars_file:s0
+/etc/usr/idc(/.*)?\.idc u:object_r:vendor_idc_file:s0
diff --git a/apex/com.google.cf.rild/Android.bp b/apex/com.google.cf.rild/Android.bp
new file mode 100644
index 0000000..ecea755
--- /dev/null
+++ b/apex/com.google.cf.rild/Android.bp
@@ -0,0 +1,52 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_etc {
+ name: "com.google.cf.rild.rc",
+ src: "com.google.cf.rild.rc",
+ installable: false,
+}
+
+apex {
+ name: "com.google.cf.rild",
+ manifest: "apex_manifest.json",
+ key: "com.google.cf.apex.key",
+ certificate: ":com.google.cf.apex.certificate",
+ file_contexts: "file_contexts",
+ use_vndk_as_stable: true,
+ updatable: false,
+ // Install the apex in /vendor/apex
+ soc_specific: true,
+ binaries: [
+ "libcuttlefish-rild",
+ ],
+ native_shared_libs: [
+ "libcuttlefish-ril-2",
+ ],
+ prebuilts: [
+ "android.hardware.telephony.gsm.prebuilt.xml",
+ "android.hardware.telephony.ims.prebuilt.xml",
+ "com.google.cf.rild.rc",
+ ],
+ vintf_fragments: [":libril-modem-lib-manifests"],
+ overrides: [
+ "libril",
+ "libreference-ril",
+ "rild",
+ ],
+}
diff --git a/apex/com.google.cf.rild/apex_manifest.json b/apex/com.google.cf.rild/apex_manifest.json
new file mode 100644
index 0000000..c096789
--- /dev/null
+++ b/apex/com.google.cf.rild/apex_manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "com.google.cf.rild",
+ "version": 1
+}
diff --git a/apex/com.google.cf.rild/com.google.cf.rild.rc b/apex/com.google.cf.rild/com.google.cf.rild.rc
new file mode 100644
index 0000000..ff8b888
--- /dev/null
+++ b/apex/com.google.cf.rild/com.google.cf.rild.rc
@@ -0,0 +1,5 @@
+service vendor.ril-daemon /apex/com.google.cf.rild/bin/hw/libcuttlefish-rild
+ class main
+ user radio
+ group radio inet misc audio log readproc wakelock
+ capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
diff --git a/apex/com.google.cf.rild/file_contexts b/apex/com.google.cf.rild/file_contexts
new file mode 100644
index 0000000..fc0d328
--- /dev/null
+++ b/apex/com.google.cf.rild/file_contexts
@@ -0,0 +1,3 @@
+(/.*)? u:object_r:vendor_file:s0
+/bin/hw/libcuttlefish-rild u:object_r:libcuttlefish_rild_exec:s0
+/etc/permissions(/.*)? u:object_r:vendor_configs_file:s0
diff --git a/apex/com.google.cf.wifi/Android.bp b/apex/com.google.cf.wifi/Android.bp
new file mode 100644
index 0000000..a60f233
--- /dev/null
+++ b/apex/com.google.cf.wifi/Android.bp
@@ -0,0 +1,72 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_etc {
+ name: "com.google.cf.wifi.rc",
+ src: "com.google.cf.wifi.rc",
+ installable: false,
+}
+
+prebuilt_etc {
+ name: "wpa_supplicant.conf.cf",
+ src: ":wpa_supplicant_template.conf",
+ filename: "wpa_supplicant.conf",
+ relative_install_path: "wifi",
+ installable: false,
+}
+
+apex_defaults {
+ name: "com.google.cf.wifi.defaults",
+ // Name expected by wpa_supplicant when it looks for config files.
+ apex_name: "com.android.wifi.hal",
+ manifest: "apex_manifest.json",
+ key: "com.google.cf.apex.key",
+ certificate: ":com.google.cf.apex.certificate",
+ file_contexts: "file_contexts",
+ use_vndk_as_stable: true,
+ updatable: false,
+ // Install the apex in /vendor/apex
+ soc_specific: true,
+ binaries: [
+ "rename_netiface",
+ "setup_wifi",
+ "wpa_supplicant_cf",
+ ],
+ prebuilts: [
+ "android.hardware.wifi.prebuilt.xml",
+ "com.google.cf.wifi.rc",
+ "wpa_supplicant.conf.cf",
+ "wpa_supplicant_overlay.conf.cf",
+ ],
+ // TODO(b/202992812): Use the vintf_fragment from the wpa_supplicant project.
+ vintf_fragments: ["com.google.cf.wifi.xml"],
+}
+
+apex {
+ name: "com.google.cf.wifi",
+ defaults: ["com.google.cf.wifi.defaults"],
+ prebuilts: [
+ "android.hardware.wifi.passpoint.prebuilt.xml",
+ ],
+}
+
+apex {
+ name: "com.google.cf.wifi.no-passpoint",
+ defaults: ["com.google.cf.wifi.defaults"],
+ multi_install_skip_symbol_files: true,
+}
diff --git a/apex/com.google.cf.wifi/apex_manifest.json b/apex/com.google.cf.wifi/apex_manifest.json
new file mode 100644
index 0000000..ffd1a2c
--- /dev/null
+++ b/apex/com.google.cf.wifi/apex_manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "com.android.wifi.hal",
+ "version": 1
+}
diff --git a/apex/com.google.cf.wifi/com.google.cf.wifi.rc b/apex/com.google.cf.wifi/com.google.cf.wifi.rc
new file mode 100644
index 0000000..87c798c
--- /dev/null
+++ b/apex/com.google.cf.wifi/com.google.cf.wifi.rc
@@ -0,0 +1,16 @@
+service rename_eth0 /apex/com.android.wifi.hal/bin/rename_netiface eth0 rmnet0
+ oneshot
+
+service setup_wifi /apex/com.android.wifi.hal/bin/setup_wifi
+ oneshot
+
+service wpa_supplicant /apex/com.android.wifi.hal/bin/hw/wpa_supplicant_cf -g@android:wpa_wlan0
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ socket wpa_wlan0 dgram 660 wifi wifi
+ group system wifi inet
+ disabled
+ oneshot
diff --git a/apex/com.google.cf.wifi/com.google.cf.wifi.xml b/apex/com.google.cf.wifi/com.google.cf.wifi.xml
new file mode 100644
index 0000000..772096c
--- /dev/null
+++ b/apex/com.google.cf.wifi/com.google.cf.wifi.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device">
+ <hal format="hidl">
+ <name>android.hardware.wifi.supplicant</name>
+ <transport>hwbinder</transport>
+ <version>1.4</version>
+ <interface>
+ <name>ISupplicant</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/apex/com.google.cf.wifi/file_contexts b/apex/com.google.cf.wifi/file_contexts
new file mode 100644
index 0000000..b11e272
--- /dev/null
+++ b/apex/com.google.cf.wifi/file_contexts
@@ -0,0 +1,5 @@
+(/.*)? u:object_r:vendor_file:s0
+/bin/rename_netiface u:object_r:rename_netiface_exec:s0
+/bin/setup_wifi u:object_r:setup_wifi_exec:s0
+/bin/hw/wpa_supplicant_cf u:object_r:hal_wifi_supplicant_default_exec:s0
+/etc/permissions(/.*)? u:object_r:vendor_configs_file:s0
diff --git a/host/commands/tapsetiff/Android.bp b/apex/keys/Android.bp
similarity index 67%
rename from host/commands/tapsetiff/Android.bp
rename to apex/keys/Android.bp
index 1d7dedb..85184bc 100644
--- a/host/commands/tapsetiff/Android.bp
+++ b/apex/keys/Android.bp
@@ -1,5 +1,4 @@
-//
-// Copyright (C) 2020 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -17,7 +16,13 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-sh_binary_host {
- name: "tapsetiff",
- src: "tapsetiff.py",
+apex_key {
+ name: "com.google.cf.apex.key",
+ public_key: "com.google.cf.apex.avbpubkey",
+ private_key: "com.google.cf.apex.pem",
+}
+
+android_app_certificate {
+ name: "com.google.cf.apex.certificate",
+ certificate: "com.google.cf.apex",
}
diff --git a/apex/keys/com.google.cf.apex.avbpubkey b/apex/keys/com.google.cf.apex.avbpubkey
new file mode 100644
index 0000000..1fc39e1
--- /dev/null
+++ b/apex/keys/com.google.cf.apex.avbpubkey
Binary files differ
diff --git a/apex/keys/com.google.cf.apex.pem b/apex/keys/com.google.cf.apex.pem
new file mode 100644
index 0000000..59de332
--- /dev/null
+++ b/apex/keys/com.google.cf.apex.pem
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKQIBAAKCAgEAvAG5AIYljraeMBaaVr+UYPFZ/GEDn1+irto2iWtPJxaSIQwU
+t0GMU5DtRMds3XK0PaQOYusoQXQnf3nnb6Ake8NtifsI+pw2HRnx+bwlbvoUBlA4
+g0hpMQThdryevg1hT8bdgQDRm8LI/xIGZ/HH5jKgNHcEmxJuVTmBfSjokaIJDb/M
+ZrTr9agFALIHh6JAdRDXUE4Myr3a8pzeAN71Y5Ll99c1Ni3uc5Fx/83q+vtlL5qE
+zDCsBj1q7gvkdiYFtEGsm+tJ5+sG5/aUKaOq05u0vZRsLInlacub/6Vy5G+uBAXc
+Lzx14rXvzcKkcvgbkpmedPdbv3JR4Pg0oGtgPXG9Qh3bU1XsjaYUzp9c1jhQjs+q
+qBGKOKex1sVF/6/Wn6EjYGKawxHPQtFEp5DcIv7nrQDPFWy6GA4CmO/vaWfQcmIA
+9ikCZGuqDhKJpmJ4WO145u1qgnNHsBLwHMtxHoz7nq0bJUcdCxbrNutUkn4lFuFs
+JUUZdFxKeJkYcT+0+Ml1P6girGXaiLE8JyYBTps+Y91mGnMuNDezseZBEYpX1rP+
+Qx5pdbMFt8anp5bOar76dyGI/wq12kgfnpyweItXRULiIS9EsPxT6birh1BzXtpq
+jnsdEpC5uXidise1rvdNkrgbpCZC9ZDpRzBORWz1OW8+EhmoGhtvBPD6wLsCAwEA
+AQKCAgAW5SrPaoa2W3zmJEqFV+1M5Pdtaa8UQIRCQOa1U3EfNHt1NNBtBLl/D74l
+Sxfx298hRpJN749GcUvCFWleyaTHwaPcUsrkIhPg9WDnZcc1PZUks64+JppQ0uRW
+HmBCisSX/4LIC/56tnzduyc2j1YlrXKfEQNpkxQGousm/81att3dY8cTluLJVr3N
+OOD73oF1ACkIaYjbQ8WfGAVdG8nMZ35D8VxUjcFlJ4g3e68rA2RuKKYVa7P3SpF0
+DdSzoqu9KOZJUpz8dj2wD/I5I+pQvLyE/ccyoVRjztzfhBl6wjLx4HjQ887zXe6n
+IxX9vkM1Vina2qi8psJb4D4gbxMYEvXnOhequ1TSvd03f91gR5D9KFxspGF8NHRA
+gkzKT7QGqgOS31IANC0wIdH5tVrLSVxhtq5BKxdxywTZz4wA/Gy32o7D7phX9PhH
+MZDSplwi92ft1UoU1VLM5eCRSDJf9LM3HVXTpzlmMwCalR+AVnCxNa6rKvDfAbmn
+BVOoh8vNkEfRBwmI6ctXaC7VVA+E4JdWMKk7BbKqU4yUVHrdSCyjwxomAh3G539w
+0YnS7mR8kw/D9ppkQ5bm6ndtu8ABd+VfBPzlvc3kgLjlco7zENNqMOhgrm5lKZsS
+s5WCrZ4feeeC4FZAUXf17SYas6WfB9Hr64Fs81vZmwfNpmgMGQKCAQEA6CsiJCh4
+FAbuLZAAJtJ3z/4uoJTLqfHPOHZFww2PJ7f5CwYIdOxBQ4/PBjz8wreajur3eYai
+T9uhKbG2+elO48ReMREytcpGox9t36wbxrrE185XpI4lQITvEyOv9fsV0af4Vk7W
+KljV5IMMauYwwouUwYV4VPQHVOUMKNy0u/68A6NTjIAXU41pQHzo+bCtyCjpw8ol
+7dQxHzOFbngoSv0s+FT1a+myDJPSAj0BjDTlsaD+Gplcvag4qMOA28IBjcFiv4l5
+e75RF0CIWzRvOJsR3G7WkhxTH1jn4HYOjoYRAZ5YTHq7QM5/xZdulA0sT2zWzY6V
+YlOICG9jZTpI/wKCAQEAz04eDQtDme2jvzdMft0OebsEXuRudCpGiZ3hkPthBelk
+eeFEt9yl2oU9fOOQhjY369gLK3tkN+O6hpGV9bWC2Iua1o7gsSZDp8CKZFOK9JD7
+aqvmND0R3tRCqVaaraIqgWx7kFg5x7Lfgi/KFuXZy7umCbVQqtxDBaSW+Nso2m9m
+0mnr41r9Z52gqJV+z1zyjRY4wswtAmUDcRDnwkJsX6hKFxTRvxRvy1JK1whBgflM
+3oHjUNQFSeeKa2rdZzDSy7ZRCTwl5gZI2CsURX3XmFvYOXdioDACUlpcjzK8Trcq
+/2+gz/2nLmMgVvp5tHYhYHovEks8BoAyAofFyQbsRQKCAQBSH5/OBnqjKuhpOXy0
+PtKewhygNMHt9VkFceCvZEZ1GECBw7qOEVvsmBv06vHFtsh3MWoklJkpglj5tKEy
+uXJsYvOmi5zSbSCbZuyop+qTW1FxvM2HqbhHoD4pGQCPFCfdp3rSnMRo6k+Oq0Rj
+M9Wfm1wdMCcmdcN6JiMs+RT9QtgiuU0+b7jQlz7ZztViLTrriH1YAlN0UxClJsZW
+Ey69h9y2YucFKv8OL+OjYwz/GV7+fCImKoWBmNWh7LXSBkgianuRoQFV4jYw8WTK
+TjvhXAjvXk2MFXTZq8spvNjdVVMCrY4yT1+ZRvIvZKd6u0YnOiqpP3xb8Yw235/b
+GMjlAoIBAQCav7ubDR+Hlme34/XMdgPKRxr6Ixd4y94f+KVbbut8WD9S5CBCCAoe
+13uQ8Ob/6RVRjtK3wMKNHggtUBxbcQWd1IjfRYTheKjkXsxwHBUMf/XOKUgNEtF2
+P4kLk8SffQCx4GNU2yc2tYY3TqlS8n3koc1OTfVLtmSpn7W7Sw5yENr2k28tJs0n
+PfmiHwaskLvXKhFxCK1IrlMlYfM/hgoUVjIIjNgOBZl2c5W+c0FDXvBM4TTpL3xL
+MPaZPQrNbxrMSuqvNCEuVt6lz3KwdUItT9JXA5Gx9mSlSSLzGnKLaBxG1fN7j+Pu
+srx/cTbMyaoctNjSlSrXx3aNgQDaEbrpAoIBAQCxwuK5O9dVHIL8KDh20GrUSVrI
+OapyM7xEjiOJbqEhRbfww3ZHJmw6KYahOnJ5M4gT+23olqRK0pkV80O1H0hfBOF6
+WUlYxW/fBB2egSM568mZ0lXZAMDRxF19XpxzbPUlzTVoA9sZm9Djq6uqWCjYL0Rk
+0aj3DlMMPNMf3EBZJr2pI/GT1WssqKpvTv5gYXvsdoqvpGucW6z/MvilKgbU+RvQ
+V6zDyNdAepw65MCrH+doNroe9NEKS6Fg7RTgMKBWaHTaHJuayj+5/IvkHJ7ULTpW
+NoKv6EkvL2FuVsVa4fY+3KMhJamr4IkhCHhKeNDrAxEyHZ1QjAjhH9W0QDP0
+-----END RSA PRIVATE KEY-----
diff --git a/apex/keys/com.google.cf.apex.pk8 b/apex/keys/com.google.cf.apex.pk8
new file mode 100644
index 0000000..424387a
--- /dev/null
+++ b/apex/keys/com.google.cf.apex.pk8
Binary files differ
diff --git a/apex/keys/com.google.cf.apex.x509.pem b/apex/keys/com.google.cf.apex.x509.pem
new file mode 100644
index 0000000..db073ba
--- /dev/null
+++ b/apex/keys/com.google.cf.apex.x509.pem
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFyTCCA7ECFEDbudaUmJ6QxCAviuzTSQwh55rKMA0GCSqGSIb3DQEBCwUAMIGf
+MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+bnRhaW4gVmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEi
+MCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTEbMBkGA1UEAwwSY29t
+Lmdvb2dsZS5jZi5yaWxkMCAXDTIxMTAwMTE3MjQyMVoYDzQ3NTkwODI4MTcyNDIx
+WjCBnzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM
+DU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB0FuZHJvaWQxEDAOBgNVBAsMB0FuZHJv
+aWQxIjAgBgkqhkiG9w0BCQEWE2FuZHJvaWRAYW5kcm9pZC5jb20xGzAZBgNVBAMM
+EmNvbS5nb29nbGUuY2YucmlsZDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAKGd7f1fKnpky183oJHp5xAam+LeyMcCMg+VPaRMg5T2Uw4kPlJrwxDx0n6S
+WNtqVvcZMRfUREw6BW6mWhOae1rarVSJDxo+pzcju66zVYMf38FqzrBLPSzkKOvK
+pC3WiTs193+lrWsL6a3XtNx3gN3J4cc4f+gEASiE93mbN/pHirIgpLwmZMpaHAXd
+KZBk8iXPrwusdCAi0F6v9AxP0JUhYBmqr+/q5mFHevRq7UBykBjRqNTylmDPjjxu
+fRDkOmnzs8/htToT03NXrDhxod5GIZ/+NsVaTECZ4PK/+BBnMBg/FRE4kPpolMkp
+Nt72pkGDL0whz7RrUxhHfFDVKngmmspBpBIF4bVXQz5yuYqDaEiZv/7x8yjsbkkF
++eraEi9HBy6klhlbYV2XDA/qvV8twocJS/5Qql9bGmH/fHX3SbXTI/RD4kiopxXL
+rCLiV5ABjaFEUp5ub2IHP4W/lXpWqc1GFZfg59wL6NO/dJGO7UsHW/M2euJ4RU4i
+w3kl0J2TmjM1mCbWPsYkyCtW+QwkSz1RpB2cI2v+oYc5vmIceZuu3OY80mzvhqEK
+45Nu1qGoExmrdgVqF6h8LHMSRAMAlx+13Glt2QNEdaEsc9E1oPxXXK0oOLEI/F0B
+9pGGMgVZFPSGtQ8nWNAxy2v+WwtzNQO9p5ra6atYHkbwfhcdAgMBAAEwDQYJKoZI
+hvcNAQELBQADggIBAFpj7pYQHw75MK1Np27IVwhegZrJNb2g8lpYuD/Qzx9bPBTg
+BJ6hSnjPQwgFeAA1mtyh9CzJPzBRrGXJz/zp/VojFs1G4vqm3if+MC+ONKzxtlf1
+q4IPd/DsFce9Ak2NDyAp6IFDZhtEQxv48CclYy2JsIVqlPh2aWN2/VbHQ2e/D8ZK
+MIrTiSPjogDSPcK4MLbavSCQlxZIr+bfNhqm78oWhrpTrJu0+6rXNDJ82LpobmEV
+lp2UmFPVc1sm+Al317Wo5durfF99YSDOF2u9lKO81X4b5Jjc0a6n1q/hHlrMSMuq
++5wn+KVtKRAZf5dU7YGRTPLYKq1Yf0Zygd5lXxG2xhtwaHnwTY3g5cgKLHGzJ9hk
+FbLxVR86ZXiFnZyEncfC8PjUBX6fK2hy1bi1GZSj6jRwsUTx6ay5m28Y4EA+ix89
+hcqrXNR2dumpZTtjirjIrr2hbQB/Mf+LGSmUSZzLaL8vF6Owaxrqg7r3L4NnY6o7
+P45QehDTmm6DQg/8y47KPeKuHIf3JjW2WavcyUF0d/FtjXtPGB+t9Uskfhmv+qIm
+/3RAGckgLIi1+38bwVeHI+EnljZ2PLaXarEFjecI9HmA7A40MQWxaQns91nIjKDE
+8jpIVI+lTRpCPNJAfEm+txvE6PnlAXqDCIhIfl/sX/sIJguqoI/NV+1xJYQg
+-----END CERTIFICATE-----
diff --git a/build/Android.bp b/build/Android.bp
index d516313..1fd858c 100644
--- a/build/Android.bp
+++ b/build/Android.bp
@@ -23,6 +23,7 @@
module_type: "cvd_host_package",
config_namespace: "cvd",
value_variables: [
+ "grub_config",
"launch_configs",
"custom_action_config",
"custom_action_servers",
@@ -33,21 +34,28 @@
"android.hardware.automotive.vehicle@2.0-virtualization-grpc-server",
"adb",
"adb_connector",
- "adbshell",
"allocd",
"allocd_client",
"assemble_cvd",
+ "avbtool",
"bt_connector",
"common_crosvm",
"config_server",
"console_forwarder",
"crosvm",
+ "cvd",
+ "cvd_internal_host_bugreport",
+ "cvd_internal_start",
+ "cvd_internal_status",
+ "cvd_internal_stop",
"cvd_host_bugreport",
+ "cvd_server",
"cvd_status",
"extract-ikconfig",
"extract-vmlinux",
"fsck.f2fs",
"gnss_grpc_proxy",
+ "health",
"kernel_log_monitor",
"launch_cvd",
"libgrpc++",
@@ -64,24 +72,31 @@
"mkenvimage",
"modem_simulator",
"ms-tpm-20-ref",
+ "mcopy",
+ "mmd",
+ "mtools",
"newfs_msdos",
"powerwash_cvd",
"restart_cvd",
"root-canal",
- // TODO(b/186487510): remove libchrome and libbacktrace when ASan-related dependency issue is resolved.
- "libchrome",
- "libbacktrace",
"run_cvd",
"secure_env",
"socket_vsock_proxy",
"stop_cvd",
- "tapsetiff",
"tombstone_receiver",
"toybox",
"unpack_bootimg",
- "vnc_server",
"webRTC",
"webrtc_operator",
+ "operator_proxy",
+ "wmediumd",
+ "wmediumd_control",
+ "wmediumd_gen_config",
+]
+
+cvd_openwrt_images = [
+ "kernel_for_openwrt",
+ "openwrt_rootfs",
]
cvd_bluetooth_config_files = [
@@ -97,14 +112,18 @@
cvd_host_webrtc_assets = [
"webrtc_adb.js",
"webrtc_app.js",
+ "webrtc_index.js",
"webrtc_controls.js",
"webrtc_cf.js",
+ "webrtc_server_connector.js",
"webrtc_index.html",
+ "webrtc_client.html",
"webrtc_rootcanal.js",
"webrtc_server.crt",
"webrtc_server.key",
"webrtc_server.p12",
"webrtc_style.css",
+ "webrtc_index.css",
"webrtc_controls.css",
"webrtc_trusted.pem",
]
@@ -159,6 +178,12 @@
"xhci.policy_aarch64",
]
+cvd_host_qemu_bootloader = [
+ "bootloader_qemu_x86_64",
+ "bootloader_qemu_aarch64",
+ "bootloader_qemu_arm",
+]
+
cvd_host_package_customization {
name: "cvd-host_package",
deps: cvd_host_tools +
@@ -167,7 +192,9 @@
common: {
deps: cvd_host_webrtc_assets +
cvd_host_model_simulator_files +
- cvd_bluetooth_config_files,
+ cvd_host_qemu_bootloader +
+ cvd_bluetooth_config_files +
+ cvd_openwrt_images,
},
},
diff --git a/build/README.md b/build/README.md
index dc66c0a..18565a9 100644
--- a/build/README.md
+++ b/build/README.md
@@ -3,8 +3,8 @@
To add custom actions to the WebRTC control panel, create a custom action config
JSON file in your virtual device product makefile directory, create a
`prebuilt_etc_host` module for the JSON file with `sub_dir`
-`cvd_custom_action_config`, then set the build variable
-`SOONG_CONFIG_cvd_custom_action_config` to the name of that module. For example:
+`cvd_custom_action_config`, then set the Soong config variable `custom_action_config`
+in the `cvd` namespace to the name of that module. For example:
```
Android.bp:
@@ -16,9 +16,7 @@
}
my_virtual_device.mk:
- SOONG_CONFIG_NAMESPACES += cvd
- SOONG_CONFIG_cvd += custom_action_config
- SOONG_CONFIG_cvd_custom_action_config := my_custom_action_config.json
+ $(call soong_config_set, cvd, custom_action_config, my_custom_action_config.json)
```
TODO(b/171709037): Add documentation to source.android.com
diff --git a/build/cvd-host-package.go b/build/cvd-host-package.go
index b025386..d157083 100644
--- a/build/cvd-host-package.go
+++ b/build/cvd-host-package.go
@@ -56,6 +56,12 @@
{Mutator: "arch", Variation: android.Common.String()},
}
for _, dep := range strings.Split(
+ ctx.Config().VendorConfig("cvd").String("grub_config"), " ") {
+ if ctx.OtherModuleExists(dep) {
+ ctx.AddVariationDependencies(variations, cvdHostPackageDependencyTag, dep)
+ }
+ }
+ for _, dep := range strings.Split(
ctx.Config().VendorConfig("cvd").String("launch_configs"), " ") {
if ctx.OtherModuleExists(dep) {
ctx.AddVariationDependencies(variations, cvdHostPackageDependencyTag, dep)
diff --git a/common/frontend/socket_vsock_proxy/Android.bp b/common/frontend/socket_vsock_proxy/Android.bp
index 9335408..f04251b 100644
--- a/common/frontend/socket_vsock_proxy/Android.bp
+++ b/common/frontend/socket_vsock_proxy/Android.bp
@@ -23,6 +23,7 @@
"main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
diff --git a/common/libs/concurrency/multiplexer.h b/common/libs/concurrency/multiplexer.h
index 065c1a2..478963f 100644
--- a/common/libs/concurrency/multiplexer.h
+++ b/common/libs/concurrency/multiplexer.h
@@ -17,6 +17,7 @@
#pragma once
#include <condition_variable>
+#include <functional>
#include <memory>
#include <vector>
@@ -24,55 +25,64 @@
#include "common/libs/concurrency/thread_safe_queue.h"
namespace cuttlefish {
-namespace confui {
-template <typename T>
+template <typename T, typename Queue>
class Multiplexer {
public:
- Multiplexer(int n_qs, int max_elements) : sem_items_{0}, next_{0} {
- auto drop_new = [](typename ThreadSafeQueue<T>::QueueImpl* internal_q) {
- internal_q->pop_front();
- };
- for (int i = 0; i < n_qs; i++) {
- auto queue = std::make_unique<ThreadSafeQueue<T>>(max_elements, drop_new);
- queues_.push_back(std::move(queue));
- }
+ using QueuePtr = std::unique_ptr<Queue>;
+ using QueueSelector = std::function<int(void)>;
+
+ template <typename... Args>
+ static QueuePtr CreateQueue(Args&&... args) {
+ auto raw_ptr = new Queue(std::forward<Args>(args)...);
+ return QueuePtr(raw_ptr);
}
- int GetNewQueueId() {
- CHECK(next_ < queues_.size())
- << "can't get more queues than " << queues_.size();
- return next_++;
+ Multiplexer() : sem_items_{0} {}
+
+ int RegisterQueue(QueuePtr&& queue) {
+ const int id_to_return = queues_.size();
+ queues_.push_back(std::move(queue));
+ return id_to_return;
}
void Push(const int idx, T&& t) {
CheckIdx(idx);
- queues_[idx]->Push(t);
+ queues_[idx]->Push(std::move(t));
sem_items_.SemPost();
}
- T Pop() {
- // the idx must have an item!
- // no waiting in fn()!
- sem_items_.SemWait();
- for (auto& q : queues_) {
- if (q->IsEmpty()) {
- continue;
- }
- return q->Pop();
- }
- CHECK(false) << "Multiplexer.Pop() should be able to return an item";
- // must not reach here
- return T{};
+ T Pop(QueueSelector selector) {
+ SemWait();
+ int q_id = selector();
+ CheckIdx(q_id); // check, if weird, will die there
+ QueuePtr& queue = queues_[q_id];
+ CHECK(queue) << "queue must not be null.";
+ return queue->Pop();
}
+ T Pop() {
+ auto default_selector = [this]() -> int {
+ for (int i = 0; i < queues_.size(); i++) {
+ if (!queues_[i]->IsEmpty()) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ return Pop(default_selector);
+ }
+
+ bool IsEmpty(const int idx) { return queues_[idx]->IsEmpty(); }
+
+ void SemWait() { sem_items_.SemWait(); }
+
private:
void CheckIdx(const int idx) {
CHECK(idx >= 0 && idx < queues_.size()) << "queues_ array out of bound";
}
// total items across the queues
Semaphore sem_items_;
- std::vector<std::unique_ptr<ThreadSafeQueue<T>>> queues_;
- int next_;
+ std::vector<QueuePtr> queues_;
+ QueuePtr null_ptr_;
};
-} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/common/libs/concurrency/thread_safe_queue.h b/common/libs/concurrency/thread_safe_queue.h
index 9105299..ae16bef 100644
--- a/common/libs/concurrency/thread_safe_queue.h
+++ b/common/libs/concurrency/thread_safe_queue.h
@@ -20,6 +20,7 @@
#include <deque>
#include <iterator>
#include <mutex>
+#include <type_traits>
#include <utility>
namespace cuttlefish {
@@ -34,9 +35,11 @@
class ThreadSafeQueue {
public:
using QueueImpl = std::deque<T>;
+ using QueueFullHandler = std::function<void(QueueImpl*)>;
+
ThreadSafeQueue() = default;
explicit ThreadSafeQueue(std::size_t max_elements,
- std::function<void(QueueImpl*)> max_elements_handler)
+ QueueFullHandler max_elements_handler)
: max_elements_{max_elements},
max_elements_handler_{std::move(max_elements_handler)} {}
@@ -58,18 +61,17 @@
return std::move(items_);
}
- void Push(T&& t) {
+ template <typename U>
+ bool Push(U&& u) {
+ static_assert(std::is_assignable_v<T, decltype(u)>);
std::lock_guard<std::mutex> guard(m_);
- DropItemsIfAtCapacity();
- items_.push_back(std::move(t));
+ const bool has_room = DropItemsIfAtCapacity();
+ if (!has_room) {
+ return false;
+ }
+ items_.push_back(std::forward<U>(u));
new_item_.notify_one();
- }
-
- void Push(const T& t) {
- std::lock_guard<std::mutex> guard(m_);
- DropItemsIfAtCapacity();
- items_.push_back(t);
- new_item_.notify_one();
+ return true;
}
bool IsEmpty() {
@@ -83,15 +85,22 @@
}
private:
- void DropItemsIfAtCapacity() {
+ // return whether there's room to push
+ bool DropItemsIfAtCapacity() {
if (max_elements_ && max_elements_ == items_.size()) {
max_elements_handler_(&items_);
}
+ if (max_elements_ && max_elements_ == items_.size()) {
+ // handler intends to ignore the newly coming element or
+ // did not empty the room for whatever reason
+ return false;
+ }
+ return true;
}
std::mutex m_;
std::size_t max_elements_{};
- std::function<void(QueueImpl*)> max_elements_handler_{};
+ QueueFullHandler max_elements_handler_{};
std::condition_variable new_item_;
QueueImpl items_;
};
diff --git a/common/libs/confui/Android.bp b/common/libs/confui/Android.bp
index 13ff2fd..ca6348a 100644
--- a/common/libs/confui/Android.bp
+++ b/common/libs/confui/Android.bp
@@ -20,13 +20,16 @@
cc_library_static {
name: "libcuttlefish_confui",
srcs: [
+ "packet_types.cpp",
"packet.cpp",
+ "protocol_types.cpp",
"protocol.cpp",
],
static: {
static_libs: [
"libbase",
"libcuttlefish_fs",
+ "libteeui",
],
shared_libs: [
"libcrypto", // libcrypto_static is not accessible from all targets
diff --git a/common/libs/confui/confui.h b/common/libs/confui/confui.h
index 957fca1..18dec37 100644
--- a/common/libs/confui/confui.h
+++ b/common/libs/confui/confui.h
@@ -23,15 +23,5 @@
* header file(s)
*
*/
-#include "common/libs/confui/packet.h"
#include "common/libs/confui/protocol.h"
#include "common/libs/confui/utils.h"
-
-namespace cuttlefish {
-namespace confui {
-using packet::RecvConfUiMsg;
-using packet::SendAck;
-using packet::SendCmd;
-using packet::SendResponse;
-} // end of namespace confui
-} // end of namespace cuttlefish
diff --git a/common/libs/confui/packet.cpp b/common/libs/confui/packet.cpp
index d5be03a..debaeb8 100644
--- a/common/libs/confui/packet.cpp
+++ b/common/libs/confui/packet.cpp
@@ -16,82 +16,30 @@
#include "common/libs/confui/packet.h"
#include <algorithm>
-#include <iostream>
-
-#include <android-base/logging.h>
-#include <android-base/strings.h>
-
-#include "common/libs/confui/protocol.h"
-#include "common/libs/confui/utils.h"
-#include "common/libs/fs/shared_buf.h"
namespace cuttlefish {
namespace confui {
namespace packet {
-ConfUiMessage PayloadToConfUiMessage(const std::string& str_to_parse) {
- auto tokens = android::base::Split(str_to_parse, ":");
- ConfUiCheck(tokens.size() >= 3)
- << "PayloadToConfUiMessage takes \"" + str_to_parse + "\""
- << "and does not have 3 tokens";
- std::string msg;
- std::for_each(tokens.begin() + 2, tokens.end() - 1,
- [&msg](auto& token) { msg.append(token + ":"); });
- msg.append(*tokens.rbegin());
- return {tokens[0], tokens[1], msg};
-}
-
-// Use only this function to make a packet to send over the confirmation
-// ui packet layer
-template <typename... Args>
-static Payload ToPayload(const ConfUiCmd cmd, const std::string& session_id,
- Args&&... args) {
- std::string cmd_str = ToString(cmd);
- std::string msg =
- ArgsToString(session_id, ":", cmd_str, ":", std::forward<Args>(args)...);
- PayloadHeader header;
- header.payload_length_ = msg.size();
- return {header, msg};
-}
-
-template <typename... Args>
-static bool WritePayload(SharedFD d, const ConfUiCmd cmd,
- const std::string& session_id, Args&&... args) {
- if (!d->IsOpen()) {
- LOG(ERROR) << "file, socket, etc, is not open to write";
- return false;
- }
- auto [payload, msg] = ToPayload(cmd, session_id, std::forward<Args>(args)...);
-
- auto nwrite =
- WriteAll(d, reinterpret_cast<const char*>(&payload), sizeof(payload));
- if (nwrite != sizeof(payload)) {
- return false;
- }
- nwrite = cuttlefish::WriteAll(d, msg.c_str(), msg.size());
- if (nwrite != msg.size()) {
- return false;
- }
- return true;
-}
-
-static std::optional<ConfUiMessage> ReadPayload(SharedFD s) {
+static std::optional<std::vector<std::uint8_t>> ReadRawData(SharedFD s) {
if (!s->IsOpen()) {
- LOG(ERROR) << "file, socket, etc, is not open to read";
+ ConfUiLog(ERROR) << "file, socket, etc, is not open to read";
return std::nullopt;
}
- PayloadHeader p;
+ packet::PayloadHeader p;
auto nread = ReadExactBinary(s, &p);
if (nread != sizeof(p)) {
+ ConfUiLog(ERROR) << nread << " and sizeof(p) = " << sizeof(p)
+ << " not matching";
return std::nullopt;
}
-
if (p.payload_length_ == 0) {
- return {{SESSION_ANY, ToString(ConfUiCmd::kUnknown), std::string{""}}};
+ return {{}};
}
- if (p.payload_length_ >= kMaxPayloadLength) {
- LOG(ERROR) << "Payload length must be less than " << kMaxPayloadLength;
+ if (p.payload_length_ >= packet::kMaxPayloadLength) {
+ ConfUiLog(ERROR) << "Payload length must be less than "
+ << packet::kMaxPayloadLength;
return std::nullopt;
}
@@ -99,33 +47,109 @@
nread = ReadExact(s, buf.get(), p.payload_length_);
buf[p.payload_length_] = 0;
if (nread != p.payload_length_) {
+ ConfUiLog(ERROR) << "The length ReadRawData read does not match.";
return std::nullopt;
}
- std::string msg_to_parse{buf.get()};
- auto [session_id, type, contents] = PayloadToConfUiMessage(msg_to_parse);
- return {{session_id, type, contents}};
+ std::vector<std::uint8_t> result{buf.get(), buf.get() + nread};
+
+ return {result};
}
-std::optional<ConfUiMessage> RecvConfUiMsg(SharedFD fd) {
- return ReadPayload(fd);
+static std::optional<ParsedPacket> ParseRawData(
+ const std::vector<std::uint8_t>& data_to_parse) {
+ /*
+ * data_to_parse has 0 in it, so it is not exactly "your (text) std::string."
+ * If we type-cast data_to_parse to std::string and use 3rd party std::string-
+ * processing libraries, the outcome might be incorrect. However, the header
+ * part has no '\0' in it, and is actually a sequence of letters, or a text.
+ * So, we use android::base::Split() to take the header
+ *
+ */
+ std::string as_string{data_to_parse.begin(), data_to_parse.end()};
+ auto tokens = android::base::Split(as_string, ":");
+ CHECK(tokens.size() >= 3)
+ << "Raw packet for confirmation UI must have at least"
+ << " three components.";
+ /**
+ * Here is how the raw data, i.e. tokens[2:] looks like
+ *
+ * n:l[0]:l[1]:l[2]:...:l[n-1]:data[0]data[1]data[2]...data[n]
+ *
+ * Thus it basically has the number of items, the lengths of each item,
+ * and the byte representation of each item. n and l[i] are separated by ':'
+ * Note that the byte representation may have ':' in it. This could mess
+ * up the parsing if we totally depending on ':' separation.
+ *
+ * However, it is safe to assume that there's no ':' inside n or
+ * the string for l[i]. So, we do anyway split the data_to_parse by ':',
+ * and take n and from l[0] through l[n-1] only.
+ */
+ std::string session_id = tokens[0];
+ std::string cmd_type = tokens[1];
+ if (!IsOnlyDigits(tokens[2])) {
+ ConfUiLog(ERROR) << "Token[2] of the ConfUi packet should be a number";
+ return std::nullopt;
+ }
+ const int n = std::stoi(tokens[2]);
+
+ if (n + 2 > tokens.size()) {
+ ConfUiLog(ERROR) << "The ConfUi packet is ill-formatted.";
+ return std::nullopt;
+ }
+ ConfUiPacketInfo data_to_return;
+ std::vector<int> lengths;
+ for (int i = 1; i <= n; i++) {
+ if (!IsOnlyDigits(tokens[2 + i])) {
+ ConfUiLog(ERROR) << tokens[2 + i] << " should be a number but is not.";
+ return std::nullopt;
+ }
+ lengths.emplace_back(std::stoi(tokens[2 + i]));
+ }
+ // to find the first position of the non-header part
+ int pos = 0;
+ // 3 for three ":"s
+ pos += tokens[0].size() + tokens[1].size() + tokens[2].size() + 3;
+ for (int i = 1; i <= n; i++) {
+ pos += tokens[2 + i].size() + 1;
+ }
+ int expected_total_length = pos;
+ for (auto const len : lengths) {
+ expected_total_length += len;
+ }
+ if (expected_total_length != data_to_parse.size()) {
+ ConfUiLog(ERROR) << "expected length in ParseRawData is "
+ << expected_total_length << " while the actual length is "
+ << data_to_parse.size();
+ return std::nullopt;
+ }
+ for (const auto len : lengths) {
+ if (len == 0) {
+ // push null vector or whatever empty, appropriately-typed
+ // container
+ data_to_return.emplace_back(std::vector<std::uint8_t>{});
+ continue;
+ }
+ data_to_return.emplace_back(data_to_parse.begin() + pos,
+ data_to_parse.begin() + pos + len);
+ pos = pos + len;
+ }
+ ParsedPacket result{session_id, cmd_type, data_to_return};
+ return {result};
}
-bool SendCmd(SharedFD fd, const std::string& session_id, ConfUiCmd cmd,
- const std::string& additional_info) {
- return WritePayload(fd, cmd, session_id, additional_info);
+std::optional<ParsedPacket> ReadPayload(SharedFD s) {
+ auto raw_data = ReadRawData(s);
+ if (!raw_data) {
+ ConfUiLog(ERROR) << "raw data returned std::nullopt";
+ return std::nullopt;
+ }
+ auto parsed_result = ParseRawData(raw_data.value());
+ if (!parsed_result) {
+ ConfUiLog(ERROR) << "parsed result returns nullopt";
+ return std::nullopt;
+ }
+ return parsed_result;
}
-
-bool SendAck(SharedFD fd, const std::string& session_id, const bool is_success,
- const std::string& additional_info) {
- return WritePayload(fd, ConfUiCmd::kCliAck, session_id,
- ToCliAckMessage(is_success, additional_info));
-}
-
-bool SendResponse(SharedFD fd, const std::string& session_id,
- const std::string& additional_info) {
- return WritePayload(fd, ConfUiCmd::kCliRespond, session_id, additional_info);
-}
-
} // end of namespace packet
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/common/libs/confui/packet.h b/common/libs/confui/packet.h
index 848eb29..e109a61 100644
--- a/common/libs/confui/packet.h
+++ b/common/libs/confui/packet.h
@@ -15,56 +15,122 @@
#pragma once
+#include <algorithm>
#include <cstdint>
-#include <functional>
#include <optional>
#include <string>
#include <tuple>
+#include <type_traits>
+#include <vector>
-#include "common/libs/confui/protocol.h"
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+
+#include "common/libs/confui/packet_types.h"
+#include "common/libs/confui/utils.h"
+#include "common/libs/fs/shared_buf.h"
#include "common/libs/fs/shared_fd.h"
+/**
+ * @file packet.h
+ *
+ * @brief lowest-level packet for communication between host & guest
+ *
+ * Each packet has three fields
+ * 1. session_id_: the name of the currently active confirmation UI session
+ * 2. type_: the type of command/response. E.g. start, stop, ack, abort, etc
+ * 3. additional_info_: all the other additional information
+ *
+ * The binary represenation of each packet is as follows:
+ * n:L[1]:L[2]:...:L[n]:data[1]data[2]data[3]...data[n]
+ *
+ * The additional_info_ is in general a variable number of items, each
+ * is either a byte vector (e.g. std::vector<uint8_t>) or a string.
+ *
+ * n is the number of items. L[i] is the length of i th item. data[i]
+ * is the binary representation of the i th item
+ *
+ */
namespace cuttlefish {
namespace confui {
namespace packet {
+
/*
- * for communication between Confirmation UI guest and host.
+ * methods in namespace impl is not intended for public use
*
- * Payload is actually the header. When we send/recv, besides Payload,
- * the "payload_length_" bytes should be additionally sent/recv'ed.
- *
- * The payload is assumed to be a text (e.g. char[N])
- * The WritePayload will create the string. When read, however,
- * the receiver should parse it
- *
- * The format we use for confirmation UI is:
- * session_id:type:contents
- *
- * e.g. GooglePay10354:start:my confirmaton message
+ * For exposed APIs, skip to "start of public APIs
+ * or, skip the namespace impl
*/
-struct PayloadHeader {
- std::uint32_t payload_length_;
-};
+namespace impl {
+template <typename Buffer, typename... Args>
+void AppendToBuffer(Buffer& buffer, Args&&... args) {
+ (buffer.insert(buffer.end(), std::begin(std::forward<Args>(args)),
+ std::end(std::forward<Args>(args))),
+ ...);
+}
-// PayloadHeader + the message actually being sent
-using Payload = std::tuple<PayloadHeader, std::string>;
+template <typename... Args>
+std::vector<int> MakeSizeHeader(Args&&... args) {
+ std::vector<int> lengths;
+ (lengths.push_back(std::distance(std::begin(args), std::end(args))), ...);
+ return lengths;
+}
-// msg will look like "334522:start:Hello I am Here!"
-// this function returns 334522, start, "Hello I am Here!"
-// if no session id is given, it is regarded as SESSION_ANY
-ConfUiMessage PayloadToConfUiMessage(const std::string& str_to_parse);
+// Use only this function to make a packet to send over the confirmation
+// ui packet layer
+template <typename... Args>
+Payload ToPayload(const std::string& cmd_str, const std::string& session_id,
+ Args&&... args) {
+ using namespace cuttlefish::confui::packet::impl;
+ constexpr auto n_args = sizeof...(Args);
+ std::stringstream ss;
+ ss << ArgsToString(session_id, ":", cmd_str, ":", n_args, ":");
+ // create size header
+ std::vector<int> size_info =
+ impl::MakeSizeHeader(std::forward<Args>(args)...);
+ for (const auto sz : size_info) {
+ ss << sz << ":";
+ }
+ std::string header = ss.str();
+ std::vector<std::uint8_t> payload_buffer{header.begin(), header.end()};
+ impl::AppendToBuffer(payload_buffer, std::forward<Args>(args)...);
-std::optional<ConfUiMessage> RecvConfUiMsg(SharedFD fd);
-bool SendAck(SharedFD fd, const std::string& session_id, const bool is_success,
- const std::string& additional_info);
-bool SendResponse(SharedFD fd, const std::string& session_id,
- const std::string& additional_info);
-// for HAL
-bool SendCmd(SharedFD fd, const std::string& session_id, ConfUiCmd cmd,
- const std::string& additional_info);
+ PayloadHeader ph;
+ ph.payload_length_ = payload_buffer.size();
+ return {ph, payload_buffer};
+}
+} // namespace impl
-// this is for short messages
-constexpr const ssize_t kMaxPayloadLength = 1000;
+/*
+ * start of public methods
+ */
+std::optional<ParsedPacket> ReadPayload(SharedFD s);
+
+template <typename... Args>
+bool WritePayload(SharedFD d, const std::string& cmd_str,
+ const std::string& session_id, Args&&... args) {
+ // TODO(kwstephenkim): type check Args... so that they are either
+ // kind of std::string or std::vector<1 byte>
+ if (!d->IsOpen()) {
+ ConfUiLog(ERROR) << "file, socket, etc, is not open to write";
+ return false;
+ }
+ auto [payload_header, data_to_send] =
+ impl::ToPayload(cmd_str, session_id, std::forward<Args>(args)...);
+ const std::string data_in_str(data_to_send.cbegin(), data_to_send.cend());
+
+ auto nwrite = WriteAll(d, reinterpret_cast<const char*>(&payload_header),
+ sizeof(payload_header));
+ if (nwrite != sizeof(payload_header)) {
+ return false;
+ }
+ nwrite = WriteAll(d, reinterpret_cast<const char*>(data_to_send.data()),
+ data_to_send.size());
+ if (nwrite != data_to_send.size()) {
+ return false;
+ }
+ return true;
+}
} // end of namespace packet
} // end of namespace confui
diff --git a/common/libs/confui/packet_types.cpp b/common/libs/confui/packet_types.cpp
new file mode 100644
index 0000000..f3108b5
--- /dev/null
+++ b/common/libs/confui/packet_types.cpp
@@ -0,0 +1,44 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "common/libs/confui/packet_types.h"
+
+#include <sstream>
+
+namespace cuttlefish {
+namespace confui {
+namespace packet {
+std::string ToString(const ParsedPacket& packet) {
+ std::stringstream ss;
+ ss << "[" << packet.session_id_ << "," << packet.type_ << ",";
+ for (auto const& vec : packet.additional_info_) {
+ if (vec.empty()) {
+ ss << ",";
+ continue;
+ }
+ std::string token(vec.cbegin(), vec.cend());
+ ss << token << ",";
+ }
+ std::string result = ss.str();
+ bool is_remove_one_comma = (!packet.additional_info_.empty());
+ if (is_remove_one_comma) {
+ result.pop_back();
+ }
+ result.append("]");
+ return result;
+}
+} // end of namespace packet
+} // end of namespace confui
+} // end of namespace cuttlefish
diff --git a/common/libs/confui/packet_types.h b/common/libs/confui/packet_types.h
new file mode 100644
index 0000000..73f2745
--- /dev/null
+++ b/common/libs/confui/packet_types.h
@@ -0,0 +1,49 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <cstdint>
+#include <sstream>
+#include <string>
+#include <tuple>
+#include <vector>
+
+namespace cuttlefish {
+namespace confui {
+namespace packet {
+struct PayloadHeader {
+ std::uint32_t payload_length_;
+};
+
+using BufferType = std::vector<std::uint8_t>;
+
+// PayloadHeader + the byte size sent over the channel
+using Payload = std::tuple<PayloadHeader, BufferType>;
+
+// this is for short messages
+constexpr const ssize_t kMaxPayloadLength = 10000;
+
+using ConfUiPacketInfo = std::vector<std::vector<std::uint8_t>>;
+struct ParsedPacket {
+ std::string session_id_;
+ std::string type_;
+ ConfUiPacketInfo additional_info_;
+};
+
+std::string ToString(const ParsedPacket& packet);
+} // end of namespace packet
+} // end of namespace confui
+} // end of namespace cuttlefish
diff --git a/common/libs/confui/protocol.cpp b/common/libs/confui/protocol.cpp
index 6784034..03ca4cc 100644
--- a/common/libs/confui/protocol.cpp
+++ b/common/libs/confui/protocol.cpp
@@ -15,88 +15,259 @@
#include "common/libs/confui/protocol.h"
-#include <map>
#include <sstream>
-#include <unordered_map>
#include <vector>
#include <android-base/strings.h>
+#include "common/libs/confui/packet.h"
#include "common/libs/confui/utils.h"
+#include "common/libs/fs/shared_buf.h"
namespace cuttlefish {
namespace confui {
-std::string ToDebugString(const ConfUiCmd& cmd, const bool is_debug) {
- std::stringstream ss;
- ss << "of " << Enum2Base(cmd);
- std::string suffix = "";
- if (is_debug) {
- suffix.append(ss.str());
- }
- static std::unordered_map<ConfUiCmd, std::string> look_up_tab{
- {ConfUiCmd::kUnknown, "kUnknown"},
- {ConfUiCmd::kStart, "kStart"},
- {ConfUiCmd::kStop, "kStop"},
- {ConfUiCmd::kCliAck, "kCliAck"},
- {ConfUiCmd::kCliRespond, "kCliRespond"},
- {ConfUiCmd::kAbort, "kAbort"},
- {ConfUiCmd::kSuspend, "kSuspend"},
- {ConfUiCmd::kRestore, "kRestore"},
- {ConfUiCmd::kUserInputEvent, "kUserInputEvent"}};
- if (look_up_tab.find(cmd) != look_up_tab.end()) {
- return look_up_tab[cmd] + suffix;
- }
- return "kUnknown" + suffix;
+namespace {
+// default implementation of ToConfUiMessage
+template <ConfUiCmd C>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage(
+ const packet::ParsedPacket& message) {
+ return std::make_unique<ConfUiGenericMessage<C>>(message.session_id_);
}
-std::string ToString(const ConfUiCmd& cmd) { return ToDebugString(cmd, false); }
+// these are specialized, and defined below
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kCliAck>(
+ const packet::ParsedPacket& message);
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kStart>(
+ const packet::ParsedPacket& message);
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kUserInputEvent>(
+ const packet::ParsedPacket& message);
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kUserTouchEvent>(
+ const packet::ParsedPacket& message);
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kCliRespond>(
+ const packet::ParsedPacket& message);
-ConfUiCmd ToCmd(std::uint32_t i) {
- std::vector<ConfUiCmd> all_cmds{
- ConfUiCmd::kStart, ConfUiCmd::kStop, ConfUiCmd::kCliAck,
- ConfUiCmd::kCliRespond, ConfUiCmd::kAbort, ConfUiCmd::kSuspend,
- ConfUiCmd::kRestore, ConfUiCmd::kUserInputEvent, ConfUiCmd::kUnknown};
+std::unique_ptr<ConfUiMessage> ToConfUiMessage(
+ const packet::ParsedPacket& confui_packet) {
+ const auto confui_cmd = ToCmd(confui_packet.type_);
+ switch (confui_cmd) {
+ // customized ConfUiMessage
+ case ConfUiCmd::kStart:
+ return ToConfUiMessage<ConfUiCmd::kStart>(confui_packet);
+ case ConfUiCmd::kCliAck:
+ return ToConfUiMessage<ConfUiCmd::kCliAck>(confui_packet);
+ case ConfUiCmd::kCliRespond:
+ return ToConfUiMessage<ConfUiCmd::kCliRespond>(confui_packet);
+ case ConfUiCmd::kUserInputEvent:
+ return ToConfUiMessage<ConfUiCmd::kUserInputEvent>(confui_packet);
+ case ConfUiCmd::kUserTouchEvent:
+ return ToConfUiMessage<ConfUiCmd::kUserTouchEvent>(confui_packet);
+ // default ConfUiMessage with session & type only
+ case ConfUiCmd::kAbort:
+ return ToConfUiMessage<ConfUiCmd::kAbort>(confui_packet);
+ case ConfUiCmd::kStop:
+ return ToConfUiMessage<ConfUiCmd::kStop>(confui_packet);
+ // these are errors
+ case ConfUiCmd::kUnknown:
+ default:
+ ConfUiLog(ERROR) << "ConfUiCmd value is not good for ToConfUiMessage: "
+ << ToString(confui_cmd);
+ break;
+ }
+ return {nullptr};
+}
+} // end of unnamed namespace
- for (auto& cmd : all_cmds) {
- if (i == Enum2Base(cmd)) {
- return cmd;
+std::string ToString(const ConfUiMessage& msg) { return msg.ToString(); }
+
+std::unique_ptr<ConfUiMessage> RecvConfUiMsg(SharedFD fd) {
+ if (!fd->IsOpen()) {
+ ConfUiLog(ERROR) << "file, socket, etc, is not open to read";
+ return {nullptr};
+ }
+ auto confui_packet_opt = packet::ReadPayload(fd);
+ if (!confui_packet_opt) {
+ ConfUiLog(ERROR) << "ReadPayload returns but with std::nullptr";
+ return {nullptr};
+ }
+
+ auto confui_packet = confui_packet_opt.value();
+ return ToConfUiMessage(confui_packet);
+}
+
+std::unique_ptr<ConfUiMessage> RecvConfUiMsg(const std::string& session_id,
+ SharedFD fd) {
+ auto conf_ui_msg = RecvConfUiMsg(fd);
+ if (!conf_ui_msg) {
+ return {nullptr};
+ }
+ auto recv_session_id = conf_ui_msg->GetSessionId();
+ if (session_id != recv_session_id) {
+ ConfUiLog(ERROR) << "Received Session ID (" << recv_session_id
+ << ") is not the expected one (" << session_id << ")";
+ return {nullptr};
+ }
+ return conf_ui_msg;
+}
+
+bool SendAbortCmd(SharedFD fd, const std::string& session_id) {
+ ConfUiGenericMessage<ConfUiCmd::kAbort> confui_msg{session_id};
+ return confui_msg.SendOver(fd);
+}
+
+bool SendStopCmd(SharedFD fd, const std::string& session_id) {
+ ConfUiGenericMessage<ConfUiCmd::kStop> confui_msg{session_id};
+ return confui_msg.SendOver(fd);
+}
+
+bool SendAck(SharedFD fd, const std::string& session_id, const bool is_success,
+ const std::string& status_message) {
+ ConfUiAckMessage confui_msg{session_id, is_success, status_message};
+ return confui_msg.SendOver(fd);
+}
+
+bool SendResponse(SharedFD fd, const std::string& session_id,
+ const UserResponse::type& plain_selection,
+ const std::vector<std::uint8_t>& signed_response,
+ const std::vector<std::uint8_t>& message) {
+ ConfUiCliResponseMessage confui_msg{session_id, plain_selection,
+ signed_response, message};
+ return confui_msg.SendOver(fd);
+}
+
+bool SendStartCmd(SharedFD fd, const std::string& session_id,
+ const std::string& prompt_text,
+ const std::vector<std::uint8_t>& extra_data,
+ const std::string& locale,
+ const std::vector<teeui::UIOption>& ui_opts) {
+ ConfUiStartMessage confui_msg{session_id, prompt_text, extra_data, locale,
+ ui_opts};
+ return confui_msg.SendOver(fd);
+}
+
+// this is only for deliverSecureInputEvent
+bool SendUserSelection(SharedFD fd, const std::string& session_id,
+ const UserResponse::type& confirm_cancel) {
+ ConfUiUserSelectionMessage confui_msg{session_id, confirm_cancel};
+ return confui_msg.SendOver(fd);
+}
+
+// specialized ToConfUiMessage()
+namespace {
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kCliAck>(
+ const packet::ParsedPacket& message) {
+ auto type = ToCmd(message.type_);
+ auto& contents = message.additional_info_;
+ if (type != ConfUiCmd::kCliAck) {
+ ConfUiLog(ERROR) << "Received cmd is not ack but " << ToString(type);
+ return {nullptr};
+ }
+
+ if (contents.size() != 2) {
+ ConfUiLog(ERROR)
+ << "Ack message should only have pass/fail and a status message";
+ return {nullptr};
+ }
+
+ const std::string success_str(contents[0].begin(), contents[0].end());
+ const bool is_success = (success_str == "success");
+ const std::string status_message(contents[1].begin(), contents[1].end());
+ return std::make_unique<ConfUiAckMessage>(message.session_id_, is_success,
+ status_message);
+}
+
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kStart>(
+ const packet::ParsedPacket& message) {
+ /*
+ * additional_info_[0]: prompt text
+ * additional_info_[1]: extra data
+ * additional_info_[2]: locale
+ * additional_info_[3]: UIOptions
+ *
+ */
+ if (message.additional_info_.size() < 3) {
+ ConfUiLog(ERROR) << "ConfUiMessage for kStart is ill-formatted: "
+ << packet::ToString(message);
+ return {nullptr};
+ }
+ std::vector<teeui::UIOption> ui_opts;
+ bool has_ui_option = (message.additional_info_.size() == 4) &&
+ !(message.additional_info_[3].empty());
+ if (has_ui_option) {
+ std::string ui_opts_string{message.additional_info_[3].begin(),
+ message.additional_info_[3].end()};
+ auto tokens = android::base::Split(ui_opts_string, ",");
+ for (auto token : tokens) {
+ auto ui_opt_optional = ToUiOption(token);
+ if (!ui_opt_optional) {
+ ConfUiLog(ERROR) << "Wrong UiOption String : " << token;
+ return {nullptr};
+ }
+ ui_opts.emplace_back(ui_opt_optional.value());
}
}
- return ConfUiCmd::kUnknown;
+ auto sm = std::make_unique<ConfUiStartMessage>(
+ message.session_id_,
+ std::string(message.additional_info_[0].begin(),
+ message.additional_info_[0].end()),
+ message.additional_info_[1],
+ std::string(message.additional_info_[2].begin(),
+ message.additional_info_[2].end()),
+ ui_opts);
+ return sm;
}
-ConfUiCmd ToCmd(const std::string& cmd_str) {
- static std::map<std::string, ConfUiCmd> cmds = {
- {"kStart", ConfUiCmd::kStart},
- {"kStop", ConfUiCmd::kStop},
- {"kCliAck", ConfUiCmd::kCliAck},
- {"kCliRespond", ConfUiCmd::kCliRespond},
- {"kAbort", ConfUiCmd::kAbort},
- {"kSuspend", ConfUiCmd::kSuspend},
- {"kRestore", ConfUiCmd::kRestore},
- {"kUserInputEvent", ConfUiCmd::kUserInputEvent},
- };
- if (cmds.find(cmd_str) != cmds.end()) {
- return cmds[cmd_str];
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kUserInputEvent>(
+ const packet::ParsedPacket& message) {
+ if (message.additional_info_.size() < 1) {
+ ConfUiLog(ERROR)
+ << "kUserInputEvent message should have at least one additional_info_";
+ return {nullptr};
}
- return ConfUiCmd::kUnknown;
+ auto response = std::string{message.additional_info_[0].begin(),
+ message.additional_info_[0].end()};
+ return std::make_unique<ConfUiUserSelectionMessage>(message.session_id_,
+ response);
}
-std::string ToCliAckMessage(const bool is_success, const std::string& message) {
- std::string header = "error:";
- if (is_success) {
- header = "success:";
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kUserTouchEvent>(
+ const packet::ParsedPacket& message) {
+ if (message.additional_info_.size() < 2) {
+ ConfUiLog(ERROR)
+ << "kUserTouchEvent message should have at least two additional_info_";
+ return {nullptr};
}
- return header + message;
+ auto x = std::string(message.additional_info_[0].begin(),
+ message.additional_info_[0].end());
+ auto y = std::string(message.additional_info_[1].begin(),
+ message.additional_info_[1].end());
+ return std::make_unique<ConfUiUserTouchMessage>(message.session_id_,
+ std::stoi(x), std::stoi(y));
}
-std::string ToCliAckSuccessMsg(const std::string& message) {
- return ToCliAckMessage(true, message);
+template <>
+std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kCliRespond>(
+ const packet::ParsedPacket& message) {
+ if (message.additional_info_.size() < 3) {
+ ConfUiLog(ERROR)
+ << "kCliRespond message should have at least two additional info";
+ return {nullptr};
+ }
+ auto response = std::string{message.additional_info_[0].begin(),
+ message.additional_info_[0].end()};
+ auto sign = message.additional_info_[1];
+ auto msg = message.additional_info_[2];
+ return std::make_unique<ConfUiCliResponseMessage>(message.session_id_,
+ response, sign, msg);
}
-
-std::string ToCliAckErrorMsg(const std::string& message) {
- return ToCliAckMessage(false, message);
-}
-
+} // end of unnamed namespace
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/common/libs/confui/protocol.h b/common/libs/confui/protocol.h
index 582b43e..f41afc4 100644
--- a/common/libs/confui/protocol.h
+++ b/common/libs/confui/protocol.h
@@ -16,48 +16,55 @@
#pragma once
#include <cstdint>
+#include <optional>
#include <string>
+#include <tuple>
+
+#include <teeui/common_message_types.h> // /system/teeui/libteeui/.../include
+
+#include "common/libs/confui/packet_types.h"
+#include "common/libs/confui/protocol_types.h"
+#include "common/libs/fs/shared_fd.h"
namespace cuttlefish {
namespace confui {
-// When you update this, please update all the utility functions
-// in conf.cpp: e.g. ToString, etc
-enum class ConfUiCmd : std::uint32_t {
- kUnknown = 100,
- kStart = 111, // start rendering, send confirmation msg, & wait respond
- kStop = 112, // start rendering, send confirmation msg, & wait respond
- kCliAck = 113, // client acknowledged. "error:err_msg" or "success:command"
- kCliRespond = 114, // with "confirm" or "cancel"
- kAbort = 115, // to abort the current session
- kSuspend = 116, // to suspend, so do save the context
- kRestore = 117,
- kUserInputEvent = 200
-};
-std::string ToString(const ConfUiCmd& cmd);
-std::string ToDebugString(const ConfUiCmd& cmd, const bool is_debug);
-ConfUiCmd ToCmd(const std::string& cmd_str);
-ConfUiCmd ToCmd(std::uint32_t i);
+std::string ToString(const ConfUiMessage& msg);
-struct UserResponse {
- using type = std::string;
- constexpr static const auto kConfirm = "user_confirm";
- constexpr static const auto kCancel = "user_cancel";
- constexpr static const auto kUnknown = "user_unknown";
-};
+constexpr auto SESSION_ANY = "";
+/*
+ * received confirmation UI message on the guest could be abort or
+ * ack/response. Thus, the guest APIs should call RecvConfUiMsg(fd),
+ * see which is it, and then use Into*(conf_ui_message) to
+ * parse & use it.
+ *
+ */
+std::unique_ptr<ConfUiMessage> RecvConfUiMsg(SharedFD fd);
+std::unique_ptr<ConfUiMessage> RecvConfUiMsg(const std::string& session_id,
+ SharedFD fd);
-// invalid/ignored session id
-constexpr char SESSION_ANY[] = "";
+bool SendAbortCmd(SharedFD fd, const std::string& session_id);
-std::string ToCliAckMessage(const bool is_success, const std::string& message);
-std::string ToCliAckErrorMsg(const std::string& message);
-std::string ToCliAckSuccessMsg(const std::string& message);
+bool SendAck(SharedFD fd, const std::string& session_id, const bool is_success,
+ const std::string& status_message);
+bool SendResponse(SharedFD fd, const std::string& session_id,
+ const UserResponse::type& plain_selection,
+ const std::vector<std::uint8_t>& signed_response,
+ // signing is a function of message, key
+ const std::vector<std::uint8_t>& message);
-struct ConfUiMessage {
- std::string session_id_;
- std::string type_; // cmd, which cmd? ack, response, etc
- std::string msg_;
-};
+// for HAL
+bool SendStartCmd(SharedFD fd, const std::string& session_id,
+ const std::string& prompt_text,
+ const std::vector<std::uint8_t>& extra_data,
+ const std::string& locale,
+ const std::vector<teeui::UIOption>& ui_opts);
+
+bool SendStopCmd(SharedFD fd, const std::string& session_id);
+
+// for HAL::deliverSecureInputEvent
+bool SendUserSelection(SharedFD fd, const std::string& session_id,
+ const UserResponse::type& confirm_cancel);
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/common/libs/confui/protocol_types.cpp b/common/libs/confui/protocol_types.cpp
new file mode 100644
index 0000000..3a8d9a6
--- /dev/null
+++ b/common/libs/confui/protocol_types.cpp
@@ -0,0 +1,164 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "common/libs/confui/protocol_types.h"
+
+#include <map>
+#include <sstream>
+#include <unordered_map>
+
+#include "common/libs/confui/packet.h"
+#include "common/libs/confui/utils.h"
+
+namespace cuttlefish {
+namespace confui {
+std::string ToDebugString(const ConfUiCmd& cmd, const bool is_verbose) {
+ std::stringstream ss;
+ ss << " of " << Enum2Base(cmd);
+ std::string suffix = "";
+ if (is_verbose) {
+ suffix.append(ss.str());
+ }
+ static std::unordered_map<ConfUiCmd, std::string> look_up_tab{
+ {ConfUiCmd::kUnknown, "kUnknown"},
+ {ConfUiCmd::kStart, "kStart"},
+ {ConfUiCmd::kStop, "kStop"},
+ {ConfUiCmd::kCliAck, "kCliAck"},
+ {ConfUiCmd::kCliRespond, "kCliRespond"},
+ {ConfUiCmd::kAbort, "kAbort"},
+ {ConfUiCmd::kUserInputEvent, "kUserInputEvent"},
+ {ConfUiCmd::kUserInputEvent, "kUserTouchEvent"}};
+ if (look_up_tab.find(cmd) != look_up_tab.end()) {
+ return look_up_tab[cmd] + suffix;
+ }
+ return "kUnknown" + suffix;
+}
+
+std::string ToString(const ConfUiCmd& cmd) { return ToDebugString(cmd, false); }
+
+ConfUiCmd ToCmd(std::uint32_t i) {
+ std::vector<ConfUiCmd> all_cmds{
+ ConfUiCmd::kStart, ConfUiCmd::kStop,
+ ConfUiCmd::kCliAck, ConfUiCmd::kCliRespond,
+ ConfUiCmd::kAbort, ConfUiCmd::kUserInputEvent,
+ ConfUiCmd::kUserTouchEvent, ConfUiCmd::kUnknown};
+
+ for (auto& cmd : all_cmds) {
+ if (i == Enum2Base(cmd)) {
+ return cmd;
+ }
+ }
+ return ConfUiCmd::kUnknown;
+}
+
+ConfUiCmd ToCmd(const std::string& cmd_str) {
+ static std::map<std::string, ConfUiCmd> cmds = {
+ {"kStart", ConfUiCmd::kStart},
+ {"kStop", ConfUiCmd::kStop},
+ {"kCliAck", ConfUiCmd::kCliAck},
+ {"kCliRespond", ConfUiCmd::kCliRespond},
+ {"kAbort", ConfUiCmd::kAbort},
+ {"kUserInputEvent", ConfUiCmd::kUserInputEvent},
+ {"kUserTouchEvent", ConfUiCmd::kUserTouchEvent},
+ };
+ if (cmds.find(cmd_str) != cmds.end()) {
+ return cmds[cmd_str];
+ }
+ return ConfUiCmd::kUnknown;
+}
+
+std::string ToString(const teeui::UIOption ui_opt) {
+ return std::to_string(static_cast<int>(ui_opt));
+}
+
+std::optional<teeui::UIOption> ToUiOption(const std::string& src) {
+ if (!IsOnlyDigits(src)) {
+ return std::nullopt;
+ }
+ return {static_cast<teeui::UIOption>(std::stoi(src))};
+}
+
+template <typename T>
+static std::string ByteVecToString(const std::vector<T>& v) {
+ static_assert(sizeof(T) == 1);
+ std::string result{v.begin(), v.end()};
+ return result;
+}
+
+std::string ConfUiAckMessage::ToString() const {
+ return CreateString(session_id_, confui::ToString(GetType()),
+ (is_success_ ? "success" : "fail"), status_message_);
+}
+
+bool ConfUiAckMessage::SendOver(SharedFD fd) {
+ return Send_(fd, GetType(), session_id_,
+ std::string(is_success_ ? "success" : "fail"), status_message_);
+}
+
+std::string ConfUiCliResponseMessage::ToString() const {
+ return CreateString(session_id_, confui::ToString(GetType()), response_,
+ ByteVecToString(sign_), ByteVecToString(message_));
+}
+
+bool ConfUiCliResponseMessage::SendOver(SharedFD fd) {
+ return Send_(fd, GetType(), session_id_, response_, sign_, message_);
+}
+
+std::string ConfUiStartMessage::UiOptsToString() const {
+ std::stringstream ss;
+ for (const auto& ui_opt : ui_opts_) {
+ ss << cuttlefish::confui::ToString(ui_opt) << ",";
+ }
+ auto ui_opt_str = ss.str();
+ if (!ui_opt_str.empty()) {
+ ui_opt_str.pop_back();
+ }
+ return ui_opt_str;
+}
+
+std::string ConfUiStartMessage::ToString() const {
+ auto ui_opts_str = UiOptsToString();
+ return CreateString(
+ session_id_, confui::ToString(GetType()), prompt_text_, locale_,
+ std::string(extra_data_.begin(), extra_data_.end()), ui_opts_str);
+}
+
+bool ConfUiStartMessage::SendOver(SharedFD fd) {
+ return Send_(fd, GetType(), session_id_, prompt_text_, extra_data_, locale_,
+ UiOptsToString());
+}
+
+std::string ConfUiUserSelectionMessage::ToString() const {
+ return CreateString(session_id_, confui::ToString(GetType()), response_);
+}
+
+bool ConfUiUserSelectionMessage::SendOver(SharedFD fd) {
+ return Send_(fd, GetType(), session_id_, response_);
+}
+
+std::string ConfUiUserTouchMessage::ToString() const {
+ std::stringstream ss;
+ ss << "(" << x_ << "," << y_ << ")";
+ auto pos = ss.str();
+ return CreateString(session_id_, confui::ToString(GetType()), response_, pos);
+}
+
+bool ConfUiUserTouchMessage::SendOver(SharedFD fd) {
+ return Send_(fd, GetType(), session_id_, std::to_string(x_),
+ std::to_string(y_));
+}
+
+} // end of namespace confui
+} // end of namespace cuttlefish
diff --git a/common/libs/confui/protocol_types.h b/common/libs/confui/protocol_types.h
new file mode 100644
index 0000000..609b533
--- /dev/null
+++ b/common/libs/confui/protocol_types.h
@@ -0,0 +1,231 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <cstdint>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <teeui/common_message_types.h> // /system/teeui/libteeui/.../include
+
+#include "common/libs/confui/packet.h"
+#include "common/libs/confui/packet_types.h"
+
+#include "common/libs/confui/utils.h"
+#include "common/libs/fs/shared_fd.h"
+
+namespace cuttlefish {
+namespace confui {
+// When you update this, please update all the utility functions
+// in conf.cpp: e.g. ToString, etc
+enum class ConfUiCmd : std::uint32_t {
+ kUnknown = 100,
+ kStart = 111, // start rendering, send confirmation msg, & wait respond
+ kStop = 112, // start rendering, send confirmation msg, & wait respond
+ kCliAck = 113, // client acknowledged. "error:err_msg" or "success:command"
+ kCliRespond = 114, // with "confirm" or "cancel" or "abort"
+ kAbort = 115, // to abort the current session
+ kUserInputEvent = 200,
+ kUserTouchEvent = 201
+};
+
+// this is for short messages
+constexpr const ssize_t kMaxMessageLength = packet::kMaxPayloadLength;
+
+std::string ToString(const ConfUiCmd& cmd);
+std::string ToDebugString(const ConfUiCmd& cmd, const bool is_debug);
+ConfUiCmd ToCmd(const std::string& cmd_str);
+ConfUiCmd ToCmd(std::uint32_t i);
+
+std::string ToString(const teeui::UIOption ui_opt);
+std::optional<teeui::UIOption> ToUiOption(const std::string&);
+
+struct HostError {
+ static constexpr char kSystemError[] = "system_error";
+ static constexpr char kUIError[] = "ui_error";
+ static constexpr char kMessageTooLongError[] = "msg_too_long_error";
+ static constexpr char kIncorrectUTF8[] = "msg_incorrect_utf8";
+};
+
+struct UserResponse {
+ using type = std::string;
+ constexpr static const auto kConfirm = "user_confirm";
+ constexpr static const auto kCancel = "user_cancel";
+ constexpr static const auto kTouchEvent = "user_touch";
+ // user may close x button on the virtual window or so
+ // or.. scroll the session up and throw to trash bin
+ constexpr static const auto kUserAbort = "user_abort";
+ constexpr static const auto kUnknown = "user_unknown";
+};
+
+class ConfUiMessage {
+ public:
+ ConfUiMessage(const std::string& session_id) : session_id_{session_id} {}
+ virtual ~ConfUiMessage() = default;
+ virtual std::string ToString() const = 0;
+ void SetSessionId(const std::string session_id) { session_id_ = session_id; }
+ std::string GetSessionId() const { return session_id_; }
+ virtual ConfUiCmd GetType() const = 0;
+ virtual bool SendOver(SharedFD fd) = 0;
+
+ protected:
+ std::string session_id_;
+ template <typename... Args>
+ static std::string CreateString(Args&&... args) {
+ return "[" + ArgsToStringWithDelim(",", std::forward<Args>(args)...) + "]";
+ }
+ template <typename... Args>
+ static bool Send_(SharedFD fd, const ConfUiCmd cmd,
+ const std::string& session_id, Args&&... args) {
+ return packet::WritePayload(fd, confui::ToString(cmd), session_id,
+ std::forward<Args>(args)...);
+ }
+};
+
+template <ConfUiCmd cmd>
+class ConfUiGenericMessage : public ConfUiMessage {
+ public:
+ ConfUiGenericMessage(const std::string& session_id)
+ : ConfUiMessage{session_id} {}
+ virtual ~ConfUiGenericMessage() = default;
+ std::string ToString() const override {
+ return CreateString(session_id_, confui::ToString(GetType()));
+ }
+ ConfUiCmd GetType() const override { return cmd; }
+ bool SendOver(SharedFD fd) override {
+ return Send_(fd, GetType(), session_id_);
+ }
+};
+
+class ConfUiAckMessage : public ConfUiMessage {
+ public:
+ ConfUiAckMessage(const std::string& session_id, const bool is_success,
+ const std::string& status)
+ : ConfUiMessage{session_id},
+ is_success_(is_success),
+ status_message_(status) {}
+ virtual ~ConfUiAckMessage() = default;
+ std::string ToString() const override;
+ ConfUiCmd GetType() const override { return ConfUiCmd::kCliAck; }
+ bool SendOver(SharedFD fd) override;
+ bool IsSuccess() const { return is_success_; }
+ std::string GetStatusMessage() const { return status_message_; }
+
+ private:
+ bool is_success_;
+ std::string status_message_;
+};
+
+// the signed user response sent to the guest
+class ConfUiCliResponseMessage : public ConfUiMessage {
+ public:
+ ConfUiCliResponseMessage(const std::string& session_id,
+ const UserResponse::type& response,
+ const std::vector<std::uint8_t>& sign = {},
+ const std::vector<std::uint8_t>& msg = {})
+ : ConfUiMessage(session_id),
+ response_(response),
+ sign_(sign),
+ message_{msg} {}
+ virtual ~ConfUiCliResponseMessage() = default;
+ std::string ToString() const override;
+ ConfUiCmd GetType() const override { return ConfUiCmd::kCliRespond; }
+ auto GetResponse() const { return response_; }
+ auto GetMessage() const { return message_; }
+ auto GetSign() const { return sign_; }
+ bool SendOver(SharedFD fd) override;
+
+ private:
+ UserResponse::type response_; // plain format
+ std::vector<std::uint8_t> sign_; // signed format
+ // second argument to pass via resultCB of promptUserConfirmation
+ std::vector<std::uint8_t> message_;
+};
+
+class ConfUiStartMessage : public ConfUiMessage {
+ public:
+ ConfUiStartMessage(const std::string session_id,
+ const std::string& prompt_text = "",
+ const std::vector<std::uint8_t>& extra_data = {},
+ const std::string& locale = "C",
+ const std::vector<teeui::UIOption> ui_opts = {})
+ : ConfUiMessage(session_id),
+ prompt_text_(prompt_text),
+ extra_data_(extra_data),
+ locale_(locale),
+ ui_opts_(ui_opts) {}
+ virtual ~ConfUiStartMessage() = default;
+ std::string ToString() const override;
+ ConfUiCmd GetType() const override { return ConfUiCmd::kStart; }
+ std::string GetPromptText() const { return prompt_text_; }
+ std::vector<std::uint8_t> GetExtraData() const { return extra_data_; }
+ std::string GetLocale() const { return locale_; }
+ std::vector<teeui::UIOption> GetUiOpts() const { return ui_opts_; }
+ bool SendOver(SharedFD fd) override;
+
+ private:
+ std::string prompt_text_;
+ std::vector<std::uint8_t> extra_data_;
+ std::string locale_;
+ std::vector<teeui::UIOption> ui_opts_;
+
+ std::string UiOptsToString() const;
+};
+
+// this one is for deliverSecureInputEvent() as well as
+// physical-input based implementation
+class ConfUiUserSelectionMessage : public ConfUiMessage {
+ public:
+ ConfUiUserSelectionMessage(const std::string& session_id,
+ const UserResponse::type& response)
+ : ConfUiMessage(session_id), response_(response) {}
+ virtual ~ConfUiUserSelectionMessage() = default;
+ std::string ToString() const override;
+ ConfUiCmd GetType() const override { return ConfUiCmd::kUserInputEvent; }
+ auto GetResponse() const { return response_; }
+ bool SendOver(SharedFD fd) override;
+
+ private:
+ UserResponse::type response_;
+};
+
+class ConfUiUserTouchMessage : public ConfUiMessage {
+ public:
+ ConfUiUserTouchMessage(const std::string& session_id, const int x,
+ const int y)
+ : ConfUiMessage(session_id),
+ x_(x),
+ y_(y),
+ response_(UserResponse::kTouchEvent) {}
+ virtual ~ConfUiUserTouchMessage() = default;
+ std::string ToString() const override;
+ ConfUiCmd GetType() const override { return ConfUiCmd::kUserTouchEvent; }
+ auto GetResponse() const { return response_; }
+ bool SendOver(SharedFD fd) override;
+ std::pair<int, int> GetLocation() { return {x_, y_}; }
+
+ private:
+ int x_;
+ int y_;
+ UserResponse::type response_;
+};
+
+using ConfUiAbortMessage = ConfUiGenericMessage<ConfUiCmd::kAbort>;
+using ConfUiStopMessage = ConfUiGenericMessage<ConfUiCmd::kStop>;
+
+} // end of namespace confui
+} // end of namespace cuttlefish
diff --git a/common/libs/confui/utils.h b/common/libs/confui/utils.h
index 2e4ac04..1f3814f 100644
--- a/common/libs/confui/utils.h
+++ b/common/libs/confui/utils.h
@@ -15,6 +15,7 @@
#pragma once
+#include <algorithm>
#include <sstream>
#include <string>
#include <type_traits>
@@ -35,7 +36,14 @@
std::string ArgsToStringWithDelim(Delim&& delim, Args&&... args) {
std::stringstream ss;
([&ss, &delim](auto& arg) { ss << arg << delim; }(args), ...);
- return ss.str();
+ auto result = ss.str();
+ std::string delim_str(delim);
+ if (!result.empty() && !delim_str.empty()) {
+ for (int i = 0; i < delim_str.size(); i++) {
+ result.pop_back();
+ }
+ }
+ return result;
}
// make t... to a single string with no blank in between
@@ -44,6 +52,11 @@
return ArgsToStringWithDelim("", std::forward<Args>(args)...);
}
+inline bool IsOnlyDigits(const std::string& src) {
+ return std::all_of(src.begin(), src.end(),
+ [](int c) -> bool { return std::isdigit(c); });
+}
+
// note that no () surrounding LOG(level) << "ConfUI:" is crucial
#define ConfUiLog(LOG_LEVEL) LOG(LOG_LEVEL) << "ConfUI: "
diff --git a/common/libs/fs/shared_buf.cc b/common/libs/fs/shared_buf.cc
index 61ff51e..f4b24dd 100644
--- a/common/libs/fs/shared_buf.cc
+++ b/common/libs/fs/shared_buf.cc
@@ -33,32 +33,34 @@
ssize_t WriteAll(SharedFD fd, const char* buf, size_t size) {
size_t total_written = 0;
ssize_t written = 0;
- while ((written = fd->Write((void*)&(buf[total_written]), size - total_written)) > 0) {
- if (written < 0) {
- errno = fd->GetErrno();
- return written;
+ do {
+ written = fd->Write((void*)&(buf[total_written]), size - total_written);
+ if (written <= 0) {
+ if (written < 0) {
+ errno = fd->GetErrno();
+ return written;
+ }
+ return total_written;
}
total_written += written;
- if (total_written == size) {
- break;
- }
- }
+ } while (total_written < size);
return total_written;
}
ssize_t ReadExact(SharedFD fd, char* buf, size_t size) {
size_t total_read = 0;
ssize_t read = 0;
- while ((read = fd->Read((void*)&(buf[total_read]), size - total_read)) > 0) {
- if (read < 0) {
- errno = fd->GetErrno();
- return read;
+ do {
+ read = fd->Read((void*)&(buf[total_read]), size - total_read);
+ if (read <= 0) {
+ if (read < 0) {
+ errno = fd->GetErrno();
+ return read;
+ }
+ return total_read;
}
total_read += read;
- if (total_read == size) {
- break;
- }
- }
+ } while (total_read < size);
return total_read;
}
diff --git a/common/libs/fs/shared_buf.h b/common/libs/fs/shared_buf.h
index eb63174..f1a02c2 100644
--- a/common/libs/fs/shared_buf.h
+++ b/common/libs/fs/shared_buf.h
@@ -30,6 +30,7 @@
*
* If a read error is encountered, returns -1. buf will contain any data read
* up until that point and errno will be set.
+ *
*/
ssize_t ReadAll(SharedFD fd, std::string* buf);
@@ -40,6 +41,11 @@
*
* If a read error is encountered, returns -1. buf will contain any data read
* up until that point and errno will be set.
+ *
+ * If the size of buf is 0, read(fd, buf, 0) is effectively called, which means
+ * error(s) might be detected. If detected, the return value would be -1.
+ * If not detected, the return value will be 0.
+ *
*/
ssize_t ReadExact(SharedFD fd, std::string* buf);
@@ -50,6 +56,11 @@
*
* If a read error is encountered, returns -1. buf will contain any data read
* up until that point and errno will be set.
+ *
+ * If the size of buf is 0, read(fd, buf, 0) is effectively called, which means
+ * error(s) might be detected. If detected, the return value would be -1.
+ * If not detected, the return value will be 0.
+ *
*/
ssize_t ReadExact(SharedFD fd, std::vector<char>* buf);
@@ -60,6 +71,11 @@
*
* If a read error is encountered, returns -1. buf will contain any data read
* up until that point and errno will be set.
+ *
+ * When the size is 0, read(fd, buf, 0) is effectively called, which means
+ * error(s) might be detected. If detected, the return value would be -1.
+ * If not detected, the return value will be 0.
+ *
*/
ssize_t ReadExact(SharedFD fd, char* buf, size_t size);
@@ -83,6 +99,12 @@
*
* If a write error is encountered, returns -1. Some data may have already been
* written to fd at that point.
+ *
+ * If the size of buf is 0, WriteAll returns 0 with no error set unless
+ * the fd is a regular file. If fd is a regular file, write(fd, buf, 0) is
+ * effectively called. It may detect errors; if detected, errno is set and
+ * -1 is returned. If not detected, 0 is returned with errno unchanged.
+ *
*/
ssize_t WriteAll(SharedFD fd, const std::string& buf);
@@ -93,6 +115,12 @@
*
* If a write error is encountered, returns -1. Some data may have already been
* written to fd at that point.
+ *
+ * If the size of buf is 0, WriteAll returns 0 with no error set unless
+ * the fd is a regular file. If fd is a regular file, write(fd, buf, 0) is
+ * effectively called. It may detect errors; if detected, errno is set and
+ * -1 is returned. If not detected, 0 is returned with errno unchanged.
+ *
*/
ssize_t WriteAll(SharedFD fd, const std::vector<char>& buf);
@@ -103,6 +131,12 @@
*
* If a write error is encountered, returns -1. Some data may have already been
* written to fd at that point.
+ *
+ * If size is 0, WriteAll returns 0 with no error set unless
+ * the fd is a regular file. If fd is a regular file, write(fd, buf, 0) is
+ * effectively called. It may detect errors; if detected, errno is set and
+ * -1 is returned. If not detected, 0 is returned with errno unchanged.
+ *
*/
ssize_t WriteAll(SharedFD fd, const char* buf, size_t size);
@@ -113,6 +147,12 @@
*
* If a write error is encountered, returns -1. Some data may have already been
* written to fd at that point.
+ *
+ * If ever sizeof(T) is 0, WriteAll returns 0 with no error set unless
+ * the fd is a regular file. If fd is a regular file, write(fd, buf, 0) is
+ * effectively called. It may detect errors; if detected, errno is set and
+ * -1 is returned. If not detected, 0 is returned with errno unchanged.
+ *
*/
template<typename T>
ssize_t WriteAllBinary(SharedFD fd, const T* binary_data) {
diff --git a/common/libs/fs/shared_fd.cpp b/common/libs/fs/shared_fd.cpp
index b770a38..8723d8f 100644
--- a/common/libs/fs/shared_fd.cpp
+++ b/common/libs/fs/shared_fd.cpp
@@ -83,6 +83,14 @@
#endif
}
+bool IsRegularFile(const int fd) {
+ struct stat info;
+ if (fstat(fd, &info) < 0) {
+ return false;
+ }
+ return S_ISREG(info.st_mode);
+}
+
} // namespace
bool FileInstance::CopyFrom(FileInstance& in, size_t length) {
@@ -310,6 +318,21 @@
return SharedFD::Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode);
}
+SharedFD SharedFD::Fifo(const std::string& path, mode_t mode) {
+ struct stat st;
+ if (TEMP_FAILURE_RETRY(stat(path.c_str(), &st)) == 0) {
+ if (TEMP_FAILURE_RETRY(remove(path.c_str())) != 0) {
+ return ErrorFD(errno);
+ }
+ }
+
+ int fd = TEMP_FAILURE_RETRY(mkfifo(path.c_str(), mode));
+ if (fd == -1) {
+ return ErrorFD(errno);
+ }
+ return Open(path, mode);
+}
+
SharedFD SharedFD::Socket(int domain, int socket_type, int protocol) {
int fd = TEMP_FAILURE_RETRY(socket(domain, socket_type, protocol));
if (fd == -1) {
@@ -455,12 +478,14 @@
addr.svm_cid = cid;
auto casted_addr = reinterpret_cast<sockaddr*>(&addr);
if (vsock->Bind(casted_addr, sizeof(addr)) == -1) {
- LOG(ERROR) << "Bind failed (" << vsock->StrError() << ")";
+ LOG(ERROR) << "Port " << port << " Bind failed (" << vsock->StrError()
+ << ")";
return SharedFD::ErrorFD(vsock->GetErrno());
}
if (type == SOCK_STREAM || type == SOCK_SEQPACKET) {
if (vsock->Listen(4) < 0) {
- LOG(ERROR) << "Listen failed (" << vsock->StrError() << ")";
+ LOG(ERROR) << "Port" << port << " Listen failed (" << vsock->StrError()
+ << ")";
return SharedFD::ErrorFD(vsock->GetErrno());
}
}
@@ -511,4 +536,233 @@
}
}
+/* static */ std::shared_ptr<FileInstance> FileInstance::ClosedInstance() {
+ return std::shared_ptr<FileInstance>(new FileInstance(-1, EBADF));
+}
+
+int FileInstance::Bind(const struct sockaddr* addr, socklen_t addrlen) {
+ errno = 0;
+ int rval = bind(fd_, addr, addrlen);
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::Connect(const struct sockaddr* addr, socklen_t addrlen) {
+ errno = 0;
+ int rval = connect(fd_, addr, addrlen);
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::UNMANAGED_Dup() {
+ errno = 0;
+ int rval = TEMP_FAILURE_RETRY(dup(fd_));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::UNMANAGED_Dup2(int newfd) {
+ errno = 0;
+ int rval = TEMP_FAILURE_RETRY(dup2(fd_, newfd));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::Fcntl(int command, int value) {
+ errno = 0;
+ int rval = TEMP_FAILURE_RETRY(fcntl(fd_, command, value));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::GetSockName(struct sockaddr* addr, socklen_t* addrlen) {
+ errno = 0;
+ int rval = TEMP_FAILURE_RETRY(getsockname(fd_, addr, addrlen));
+ if (rval == -1) {
+ errno_ = errno;
+ }
+ return rval;
+}
+
+unsigned int FileInstance::VsockServerPort() {
+ struct sockaddr_vm vm_socket;
+ socklen_t length = sizeof(vm_socket);
+ GetSockName(reinterpret_cast<struct sockaddr*>(&vm_socket), &length);
+ return vm_socket.svm_port;
+}
+
+int FileInstance::Ioctl(int request, void* val) {
+ errno = 0;
+ int rval = TEMP_FAILURE_RETRY(ioctl(fd_, request, val));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::LinkAtCwd(const std::string& path) {
+ std::string name = "/proc/self/fd/";
+ name += std::to_string(fd_);
+ errno = 0;
+ int rval =
+ linkat(-1, name.c_str(), AT_FDCWD, path.c_str(), AT_SYMLINK_FOLLOW);
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::Listen(int backlog) {
+ errno = 0;
+ int rval = listen(fd_, backlog);
+ errno_ = errno;
+ return rval;
+}
+
+off_t FileInstance::LSeek(off_t offset, int whence) {
+ errno = 0;
+ off_t rval = TEMP_FAILURE_RETRY(lseek(fd_, offset, whence));
+ errno_ = errno;
+ return rval;
+}
+
+ssize_t FileInstance::Recv(void* buf, size_t len, int flags) {
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(recv(fd_, buf, len, flags));
+ errno_ = errno;
+ return rval;
+}
+
+ssize_t FileInstance::RecvMsg(struct msghdr* msg, int flags) {
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(recvmsg(fd_, msg, flags));
+ errno_ = errno;
+ return rval;
+}
+
+ssize_t FileInstance::Read(void* buf, size_t count) {
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(read(fd_, buf, count));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::EventfdRead(eventfd_t* value) {
+ errno = 0;
+ auto rval = eventfd_read(fd_, value);
+ errno_ = errno;
+ return rval;
+}
+
+ssize_t FileInstance::Send(const void* buf, size_t len, int flags) {
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(send(fd_, buf, len, flags));
+ errno_ = errno;
+ return rval;
+}
+
+ssize_t FileInstance::SendMsg(const struct msghdr* msg, int flags) {
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(sendmsg(fd_, msg, flags));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::Shutdown(int how) {
+ errno = 0;
+ int rval = shutdown(fd_, how);
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::SetSockOpt(int level, int optname, const void* optval,
+ socklen_t optlen) {
+ errno = 0;
+ int rval = setsockopt(fd_, level, optname, optval, optlen);
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::GetSockOpt(int level, int optname, void* optval,
+ socklen_t* optlen) {
+ errno = 0;
+ int rval = getsockopt(fd_, level, optname, optval, optlen);
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::SetTerminalRaw() {
+ errno = 0;
+ termios terminal_settings;
+ int rval = tcgetattr(fd_, &terminal_settings);
+ errno_ = errno;
+ if (rval < 0) {
+ return rval;
+ }
+ cfmakeraw(&terminal_settings);
+ rval = tcsetattr(fd_, TCSANOW, &terminal_settings);
+ errno_ = errno;
+ return rval;
+}
+
+std::string FileInstance::StrError() const {
+ errno = 0;
+ return std::string(strerror(errno_));
+}
+
+ScopedMMap FileInstance::MMap(void* addr, size_t length, int prot, int flags,
+ off_t offset) {
+ errno = 0;
+ auto ptr = mmap(addr, length, prot, flags, fd_, offset);
+ errno_ = errno;
+ return ScopedMMap(ptr, length);
+}
+
+ssize_t FileInstance::Truncate(off_t length) {
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(ftruncate(fd_, length));
+ errno_ = errno;
+ return rval;
+}
+
+ssize_t FileInstance::Write(const void* buf, size_t count) {
+ if (count == 0 && !IsRegular()) {
+ return 0;
+ }
+ errno = 0;
+ ssize_t rval = TEMP_FAILURE_RETRY(write(fd_, buf, count));
+ errno_ = errno;
+ return rval;
+}
+
+int FileInstance::EventfdWrite(eventfd_t value) {
+ errno = 0;
+ int rval = eventfd_write(fd_, value);
+ errno_ = errno;
+ return rval;
+}
+
+bool FileInstance::IsATTY() {
+ errno = 0;
+ int rval = isatty(fd_);
+ errno_ = errno;
+ return rval;
+}
+
+FileInstance::FileInstance(int fd, int in_errno)
+ : fd_(fd), errno_(in_errno), is_regular_file_(IsRegularFile(fd_)) {
+ // Ensure every file descriptor managed by a FileInstance has the CLOEXEC
+ // flag
+ TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, FD_CLOEXEC));
+ std::stringstream identity;
+ identity << "fd=" << fd << " @" << this;
+ identity_ = identity.str();
+}
+
+FileInstance* FileInstance::Accept(struct sockaddr* addr,
+ socklen_t* addrlen) const {
+ int fd = TEMP_FAILURE_RETRY(accept(fd_, addr, addrlen));
+ if (fd == -1) {
+ return new FileInstance(fd, errno);
+ } else {
+ return new FileInstance(fd, 0);
+ }
+}
+
} // namespace cuttlefish
diff --git a/common/libs/fs/shared_fd.h b/common/libs/fs/shared_fd.h
index 114d199..da9d2fd 100644
--- a/common/libs/fs/shared_fd.h
+++ b/common/libs/fs/shared_fd.h
@@ -126,6 +126,7 @@
// Fcntl or Dup functions.
static SharedFD Open(const std::string& pathname, int flags, mode_t mode = 0);
static SharedFD Creat(const std::string& pathname, mode_t mode);
+ static SharedFD Fifo(const std::string& pathname, mode_t mode);
static bool Pipe(SharedFD* fd0, SharedFD* fd1);
static SharedFD Event(int initval = 0, int flags = 0);
static SharedFD MemfdCreate(const std::string& name, unsigned int flags = 0);
@@ -232,27 +233,12 @@
virtual ~FileInstance() { Close(); }
// This can't be a singleton because our shared_ptr's aren't thread safe.
- static std::shared_ptr<FileInstance> ClosedInstance() {
- return std::shared_ptr<FileInstance>(new FileInstance(-1, EBADF));
- }
+ static std::shared_ptr<FileInstance> ClosedInstance();
- int Bind(const struct sockaddr* addr, socklen_t addrlen) {
- errno = 0;
- int rval = bind(fd_, addr, addrlen);
- errno_ = errno;
- return rval;
- }
-
- int Connect(const struct sockaddr* addr, socklen_t addrlen) {
- errno = 0;
- int rval = connect(fd_, addr, addrlen);
- errno_ = errno;
- return rval;
- }
-
+ int Bind(const struct sockaddr* addr, socklen_t addrlen);
+ int Connect(const struct sockaddr* addr, socklen_t addrlen);
int ConnectWithTimeout(const struct sockaddr* addr, socklen_t addrlen,
struct timeval* timeout);
-
void Close();
// Returns true if the entire input was copied.
@@ -261,57 +247,24 @@
// reference type.
bool CopyFrom(FileInstance& in, size_t length);
- int UNMANAGED_Dup() {
- errno = 0;
- int rval = TEMP_FAILURE_RETRY(dup(fd_));
- errno_ = errno;
- return rval;
- }
-
- int UNMANAGED_Dup2(int newfd) {
- errno = 0;
- int rval = TEMP_FAILURE_RETRY(dup2(fd_, newfd));
- errno_ = errno;
- return rval;
- }
-
- int Fcntl(int command, int value) {
- errno = 0;
- int rval = TEMP_FAILURE_RETRY(fcntl(fd_, command, value));
- errno_ = errno;
- return rval;
- }
+ int UNMANAGED_Dup();
+ int UNMANAGED_Dup2(int newfd);
+ int Fcntl(int command, int value);
int GetErrno() const { return errno_; }
+ int GetSockName(struct sockaddr* addr, socklen_t* addrlen);
- int GetSockName(struct sockaddr* addr, socklen_t* addrlen) {
- errno = 0;
- int rval = TEMP_FAILURE_RETRY(getsockname(fd_, addr, addrlen));
- if (rval == -1) {
- errno_ = errno;
- }
- return rval;
- }
+ unsigned int VsockServerPort();
- unsigned int VsockServerPort() {
- struct sockaddr_vm vm_socket;
- socklen_t length = sizeof(vm_socket);
- GetSockName(reinterpret_cast<struct sockaddr*>(&vm_socket), &length);
- return vm_socket.svm_port;
- }
-
- int Ioctl(int request, void* val = nullptr) {
- errno = 0;
- int rval = TEMP_FAILURE_RETRY(ioctl(fd_, request, val));
- errno_ = errno;
- return rval;
- }
-
+ int Ioctl(int request, void* val = nullptr);
bool IsOpen() const { return fd_ != -1; }
// in probably isn't modified, but the API spec doesn't have const.
bool IsSet(fd_set* in) const;
+ // whether this is a regular file or not
+ bool IsRegular() const { return is_regular_file_; }
+
/**
* Adds a hard link to a file descriptor, based on the current working
* directory of the process or to some absolute path.
@@ -321,73 +274,16 @@
* Using this on a file opened with O_TMPFILE can link it into the filesystem.
*/
// Used with O_TMPFILE files to attach them to the filesystem.
- int LinkAtCwd(const std::string& path) {
- std::string name = "/proc/self/fd/";
- name += std::to_string(fd_);
- errno = 0;
- int rval = linkat(
- -1, name.c_str(), AT_FDCWD, path.c_str(), AT_SYMLINK_FOLLOW);
- errno_ = errno;
- return rval;
- }
-
- int Listen(int backlog) {
- errno = 0;
- int rval = listen(fd_, backlog);
- errno_ = errno;
- return rval;
- }
-
+ int LinkAtCwd(const std::string& path);
+ int Listen(int backlog);
static void Log(const char* message);
-
- off_t LSeek(off_t offset, int whence) {
- errno = 0;
- off_t rval = TEMP_FAILURE_RETRY(lseek(fd_, offset, whence));
- errno_ = errno;
- return rval;
- }
-
- ssize_t Recv(void* buf, size_t len, int flags) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(recv(fd_, buf, len, flags));
- errno_ = errno;
- return rval;
- }
-
- ssize_t RecvMsg(struct msghdr* msg, int flags) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(recvmsg(fd_, msg, flags));
- errno_ = errno;
- return rval;
- }
-
- ssize_t Read(void* buf, size_t count) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(read(fd_, buf, count));
- errno_ = errno;
- return rval;
- }
-
- int EventfdRead(eventfd_t* value) {
- errno = 0;
- auto rval = eventfd_read(fd_, value);
- errno_ = errno;
- return rval;
- }
-
- ssize_t Send(const void* buf, size_t len, int flags) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(send(fd_, buf, len, flags));
- errno_ = errno;
- return rval;
- }
-
- ssize_t SendMsg(const struct msghdr* msg, int flags) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(sendmsg(fd_, msg, flags));
- errno_ = errno;
- return rval;
- }
+ off_t LSeek(off_t offset, int whence);
+ ssize_t Recv(void* buf, size_t len, int flags);
+ ssize_t RecvMsg(struct msghdr* msg, int flags);
+ ssize_t Read(void* buf, size_t count);
+ int EventfdRead(eventfd_t* value);
+ ssize_t Send(const void* buf, size_t len, int flags);
+ ssize_t SendMsg(const struct msghdr* msg, int flags);
template <typename... Args>
ssize_t SendFileDescriptors(const void* buf, size_t len, Args&&... sent_fds) {
@@ -399,118 +295,34 @@
return ret;
}
- int Shutdown(int how) {
- errno = 0;
- int rval = shutdown(fd_, how);
- errno_ = errno;
- return rval;
- }
-
+ int Shutdown(int how);
void Set(fd_set* dest, int* max_index) const;
-
- int SetSockOpt(int level, int optname, const void* optval, socklen_t optlen) {
- errno = 0;
- int rval = setsockopt(fd_, level, optname, optval, optlen);
- errno_ = errno;
- return rval;
- }
-
- int GetSockOpt(int level, int optname, void* optval, socklen_t* optlen) {
- errno = 0;
- int rval = getsockopt(fd_, level, optname, optval, optlen);
- errno_ = errno;
- return rval;
- }
-
- int SetTerminalRaw() {
- errno = 0;
- termios terminal_settings;
- int rval = tcgetattr(fd_, &terminal_settings);
- errno_ = errno;
- if (rval < 0) {
- return rval;
- }
- cfmakeraw(&terminal_settings);
- rval = tcsetattr(fd_, TCSANOW, &terminal_settings);
- errno_ = errno;
- return rval;
- }
-
- const char* StrError() const {
- errno = 0;
- FileInstance* s = const_cast<FileInstance*>(this);
- char* out = strerror_r(errno_, s->strerror_buf_, sizeof(strerror_buf_));
-
- // From man page:
- // strerror_r() returns a pointer to a string containing the error message.
- // This may be either a pointer to a string that the function stores in
- // buf, or a pointer to some (immutable) static string (in which case buf
- // is unused).
- if (out != s->strerror_buf_) {
- strncpy(s->strerror_buf_, out, sizeof(strerror_buf_));
- }
- return strerror_buf_;
- }
-
- ScopedMMap MMap(void* addr, size_t length, int prot, int flags,
- off_t offset) {
- errno = 0;
- auto ptr = mmap(addr, length, prot, flags, fd_, offset);
- errno_ = errno;
- return ScopedMMap(ptr, length);
- }
-
- ssize_t Truncate(off_t length) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(ftruncate(fd_, length));
- errno_ = errno;
- return rval;
- }
-
- ssize_t Write(const void* buf, size_t count) {
- errno = 0;
- ssize_t rval = TEMP_FAILURE_RETRY(write(fd_, buf, count));
- errno_ = errno;
- return rval;
- }
-
- int EventfdWrite(eventfd_t value) {
- errno = 0;
- int rval = eventfd_write(fd_, value);
- errno_ = errno;
- return rval;
- }
-
- bool IsATTY() {
- errno = 0;
- int rval = isatty(fd_);
- errno_ = errno;
- return rval;
- }
+ int SetSockOpt(int level, int optname, const void* optval, socklen_t optlen);
+ int GetSockOpt(int level, int optname, void* optval, socklen_t* optlen);
+ int SetTerminalRaw();
+ std::string StrError() const;
+ ScopedMMap MMap(void* addr, size_t length, int prot, int flags, off_t offset);
+ ssize_t Truncate(off_t length);
+ /*
+ * If the file is a regular file and the count is 0, Write() may detect
+ * error(s) by calling write(fd, buf, 0) declared in <unistd.h>. If detected,
+ * it will return -1. If not, 0 will be returned. For non-regular files such
+ * as socket or pipe, write(fd, buf, 0) is not specified. Write(), however,
+ * will do nothing and just return 0.
+ *
+ */
+ ssize_t Write(const void* buf, size_t count);
+ int EventfdWrite(eventfd_t value);
+ bool IsATTY();
private:
- FileInstance(int fd, int in_errno) : fd_(fd), errno_(in_errno) {
- // Ensure every file descriptor managed by a FileInstance has the CLOEXEC
- // flag
- TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, FD_CLOEXEC));
- std::stringstream identity;
- identity << "fd=" << fd << " @" << this;
- identity_ = identity.str();
- }
-
- FileInstance* Accept(struct sockaddr* addr, socklen_t* addrlen) const {
- int fd = TEMP_FAILURE_RETRY(accept(fd_, addr, addrlen));
- if (fd == -1) {
- return new FileInstance(fd, errno);
- } else {
- return new FileInstance(fd, 0);
- }
- }
+ FileInstance(int fd, int in_errno);
+ FileInstance* Accept(struct sockaddr* addr, socklen_t* addrlen) const;
int fd_;
int errno_;
std::string identity_;
- char strerror_buf_[160];
+ bool is_regular_file_;
};
/* Methods that need both a fully defined SharedFD and a fully defined
diff --git a/common/libs/net/netlink_client.cpp b/common/libs/net/netlink_client.cpp
index 7b2404f..b245f7e 100644
--- a/common/libs/net/netlink_client.cpp
+++ b/common/libs/net/netlink_client.cpp
@@ -54,9 +54,14 @@
char buf[4096];
struct iovec iov = { buf, sizeof(buf) };
struct sockaddr_nl sa;
- struct msghdr msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
+ struct msghdr msg {};
struct nlmsghdr *nh;
+ msg.msg_name = &sa;
+ msg.msg_namelen = sizeof(sa);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+
int result = netlink_fd_->RecvMsg(&msg, 0);
if (result < 0) {
LOG(ERROR) << "Netlink error: " << strerror(errno);
diff --git a/common/libs/security/keymaster_channel.cpp b/common/libs/security/keymaster_channel.cpp
index 7b3ab86..cfc427b 100644
--- a/common/libs/security/keymaster_channel.cpp
+++ b/common/libs/security/keymaster_channel.cpp
@@ -25,7 +25,7 @@
ManagedKeymasterMessage CreateKeymasterMessage(
AndroidKeymasterCommand command, bool is_response, size_t payload_size) {
- auto memory = new uint8_t[payload_size + sizeof(keymaster_message)];
+ auto memory = std::malloc(payload_size + sizeof(keymaster_message));
auto message = reinterpret_cast<keymaster_message*>(memory);
message->cmd = command;
message->is_response = is_response;
@@ -37,7 +37,7 @@
{
keymaster::Eraser(ptr, sizeof(keymaster_message) + ptr->payload_size);
}
- delete reinterpret_cast<uint8_t*>(ptr);
+ std::free(ptr);
}
KeymasterChannel::KeymasterChannel(SharedFD input, SharedFD output)
diff --git a/common/libs/time/monotonic_time.h b/common/libs/time/monotonic_time.h
deleted file mode 100644
index 2839001..0000000
--- a/common/libs/time/monotonic_time.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#pragma once
-
-#include <stdint.h>
-#include <time.h>
-
-namespace cuttlefish {
-namespace time {
-
-static const int64_t kNanosecondsPerSecond = 1000000000;
-
-class TimeDifference {
- public:
- TimeDifference(time_t seconds, long nanoseconds, int64_t scale) :
- scale_(scale), truncated_(false) {
- ts_.tv_sec = seconds;
- ts_.tv_nsec = nanoseconds;
- if (scale_ == kNanosecondsPerSecond) {
- truncated_ = true;
- truncated_ns_ = 0;
- }
- }
-
- TimeDifference(const TimeDifference& in, int64_t scale) :
- scale_(scale), truncated_(false) {
- ts_ = in.GetTS();
- if (scale_ == kNanosecondsPerSecond) {
- truncated_ = true;
- truncated_ns_ = 0;
- } else if ((in.scale_ % scale_) == 0) {
- truncated_ = true;
- truncated_ns_ = ts_.tv_nsec;
- }
- }
-
- TimeDifference(const struct timespec& in, int64_t scale) :
- ts_(in), scale_(scale), truncated_(false) { }
-
- TimeDifference operator*(const uint32_t factor) {
- TimeDifference rval = *this;
- rval.ts_.tv_sec = ts_.tv_sec * factor;
- // Create temporary variable to hold the multiplied
- // nanoseconds so that no overflow is possible.
- // Nanoseconds must be in [0, 10^9) and so all are less
- // then 2^30. Even multiplied by the largest uint32
- // this will fit in a 64-bit int without overflow.
- int64_t tv_nsec = static_cast<int64_t>(ts_.tv_nsec) * factor;
- rval.ts_.tv_sec += (tv_nsec / kNanosecondsPerSecond);
- rval.ts_.tv_nsec = tv_nsec % kNanosecondsPerSecond;
- return rval;
- }
-
- TimeDifference operator+(const TimeDifference& other) const {
- struct timespec ret = ts_;
- ret.tv_nsec = (ts_.tv_nsec + other.ts_.tv_nsec) % 1000000000;
- ret.tv_sec = (ts_.tv_sec + other.ts_.tv_sec) +
- (ts_.tv_nsec + other.ts_.tv_nsec) / 1000000000;
- return TimeDifference(ret, scale_ < other.scale_ ? scale_: other.scale_);
- }
-
- TimeDifference operator-(const TimeDifference& other) const {
- struct timespec ret = ts_;
- // Keeps nanoseconds positive and allow negative numbers only on
- // seconds.
- ret.tv_nsec = (1000000000 + ts_.tv_nsec - other.ts_.tv_nsec) % 1000000000;
- ret.tv_sec = (ts_.tv_sec - other.ts_.tv_sec) -
- (ts_.tv_nsec < other.ts_.tv_nsec ? 1 : 0);
- return TimeDifference(ret, scale_ < other.scale_ ? scale_: other.scale_);
- }
-
- bool operator<(const TimeDifference& other) const {
- return ts_.tv_sec < other.ts_.tv_sec ||
- (ts_.tv_sec == other.ts_.tv_sec && ts_.tv_nsec < other.ts_.tv_nsec);
- }
-
- int64_t count() const {
- return ts_.tv_sec * (kNanosecondsPerSecond / scale_) + ts_.tv_nsec / scale_;
- }
-
- time_t seconds() const {
- return ts_.tv_sec;
- }
-
- long subseconds_in_ns() const {
- if (!truncated_) {
- truncated_ns_ = (ts_.tv_nsec / scale_) * scale_;
- truncated_ = true;
- }
- return truncated_ns_;
- }
-
- struct timespec GetTS() const {
- // We can't assume C++11, so avoid extended initializer lists.
- struct timespec rval = { ts_.tv_sec, subseconds_in_ns()};
- return rval;
- }
-
- protected:
- struct timespec ts_;
- int64_t scale_;
- mutable bool truncated_;
- mutable long truncated_ns_;
-};
-
-class MonotonicTimePoint {
- public:
- static MonotonicTimePoint Now() {
- struct timespec ts;
-#ifdef CLOCK_MONOTONIC_RAW
- // WARNING:
- // While we do have CLOCK_MONOTONIC_RAW, we can't depend on it until:
- // - ALL places relying on MonotonicTimePoint are fixed,
- // - pthread supports pthread_timewait_monotonic.
- //
- // This is currently observable as a LEGITIMATE problem while running
- // pthread_test. DO NOT revert this to CLOCK_MONOTONIC_RAW until test
- // passes.
- clock_gettime(CLOCK_MONOTONIC, &ts);
-#else
- clock_gettime(CLOCK_MONOTONIC, &ts);
-#endif
- return MonotonicTimePoint(ts);
- }
-
- MonotonicTimePoint() {
- ts_.tv_sec = 0;
- ts_.tv_nsec = 0;
- }
-
- explicit MonotonicTimePoint(const struct timespec& ts) {
- ts_ = ts;
- }
-
- TimeDifference SinceEpoch() const {
- return TimeDifference(ts_, 1);
- }
-
- TimeDifference operator-(const MonotonicTimePoint& other) const {
- struct timespec rval;
- rval.tv_sec = ts_.tv_sec - other.ts_.tv_sec;
- rval.tv_nsec = ts_.tv_nsec - other.ts_.tv_nsec;
- if (rval.tv_nsec < 0) {
- --rval.tv_sec;
- rval.tv_nsec += kNanosecondsPerSecond;
- }
- return TimeDifference(rval, 1);
- }
-
- MonotonicTimePoint operator+(const TimeDifference& other) const {
- MonotonicTimePoint rval = *this;
- rval.ts_.tv_sec += other.seconds();
- rval.ts_.tv_nsec += other.subseconds_in_ns();
- if (rval.ts_.tv_nsec >= kNanosecondsPerSecond) {
- ++rval.ts_.tv_sec;
- rval.ts_.tv_nsec -= kNanosecondsPerSecond;
- }
- return rval;
- }
-
- bool operator==(const MonotonicTimePoint& other) const {
- return (ts_.tv_sec == other.ts_.tv_sec) &&
- (ts_.tv_nsec == other.ts_.tv_nsec);
- }
-
- bool operator!=(const MonotonicTimePoint& other) const {
- return !(*this == other);
- }
-
- bool operator<(const MonotonicTimePoint& other) const {
- return ((ts_.tv_sec - other.ts_.tv_sec) < 0) ||
- ((ts_.tv_sec == other.ts_.tv_sec) &&
- (ts_.tv_nsec < other.ts_.tv_nsec));
- }
-
- bool operator>(const MonotonicTimePoint& other) const {
- return other < *this;
- }
-
- bool operator<=(const MonotonicTimePoint& other) const {
- return !(*this > other);
- }
-
- bool operator>=(const MonotonicTimePoint& other) const {
- return !(*this < other);
- }
-
- MonotonicTimePoint& operator+=(const TimeDifference& other) {
- ts_.tv_sec += other.seconds();
- ts_.tv_nsec += other.subseconds_in_ns();
- if (ts_.tv_nsec >= kNanosecondsPerSecond) {
- ++ts_.tv_sec;
- ts_.tv_nsec -= kNanosecondsPerSecond;
- }
- return *this;
- }
-
- MonotonicTimePoint& operator-=(const TimeDifference& other) {
- ts_.tv_sec -= other.seconds();
- ts_.tv_nsec -= other.subseconds_in_ns();
- if (ts_.tv_nsec < 0) {
- --ts_.tv_sec;
- ts_.tv_nsec += kNanosecondsPerSecond;
- }
- return *this;
- }
-
- void ToTimespec(struct timespec* dest) const {
- *dest = ts_;
- }
-
- protected:
- struct timespec ts_;
-};
-
-class Seconds : public TimeDifference {
- public:
- explicit Seconds(const TimeDifference& difference) :
- TimeDifference(difference, kNanosecondsPerSecond) { }
-
- Seconds(int64_t seconds) :
- TimeDifference(seconds, 0, kNanosecondsPerSecond) { }
-};
-
-class Milliseconds : public TimeDifference {
- public:
- explicit Milliseconds(const TimeDifference& difference) :
- TimeDifference(difference, kScale) { }
-
- Milliseconds(int64_t ms) : TimeDifference(
- ms / 1000, (ms % 1000) * kScale, kScale) { }
-
- protected:
- static const int kScale = kNanosecondsPerSecond / 1000;
-};
-
-class Microseconds : public TimeDifference {
- public:
- explicit Microseconds(const TimeDifference& difference) :
- TimeDifference(difference, kScale) { }
-
- Microseconds(int64_t micros) : TimeDifference(
- micros / 1000000, (micros % 1000000) * kScale, kScale) { }
-
- protected:
- static const int kScale = kNanosecondsPerSecond / 1000000;
-};
-
-class Nanoseconds : public TimeDifference {
- public:
- explicit Nanoseconds(const TimeDifference& difference) :
- TimeDifference(difference, 1) { }
- Nanoseconds(int64_t ns) : TimeDifference(ns / kNanosecondsPerSecond,
- ns % kNanosecondsPerSecond, 1) { }
-};
-
-} // namespace time
-} // namespace cuttlefish
-
-/**
- * Legacy support for microseconds. Use MonotonicTimePoint in new code.
- */
-static const int64_t kSecsToUsecs = static_cast<int64_t>(1000) * 1000;
-
-static inline int64_t get_monotonic_usecs() {
- return cuttlefish::time::Microseconds(
- cuttlefish::time::MonotonicTimePoint::Now().SinceEpoch()).count();
-}
diff --git a/common/libs/utils/Android.bp b/common/libs/utils/Android.bp
index 860b684..5190d2b 100644
--- a/common/libs/utils/Android.bp
+++ b/common/libs/utils/Android.bp
@@ -23,13 +23,15 @@
"archive.cpp",
"subprocess.cpp",
"environment.cpp",
- "size_utils.cpp",
+ "flag_parser.cpp",
+ "shared_fd_flag.cpp",
"files.cpp",
"users.cpp",
"network.cpp",
"base64.cpp",
"tcp_socket.cpp",
"tee_logging.cpp",
+ "unix_sockets.cpp",
"vsock_connection.cpp",
],
shared: {
@@ -53,6 +55,28 @@
defaults: ["cuttlefish_host"],
}
+cc_test_host {
+ name: "libcuttlefish_utils_test",
+ srcs: [
+ "flag_parser_test.cpp",
+ "unix_sockets_test.cpp",
+ ],
+ static_libs: [
+ "libbase",
+ "libcuttlefish_fs",
+ "libcuttlefish_utils",
+ ],
+ shared_libs: [
+ "libcrypto",
+ "liblog",
+ "libxml2",
+ ],
+ test_options: {
+ unit_test: true,
+ },
+ defaults: ["cuttlefish_host"],
+}
+
cc_library {
name: "libvsock_utils",
srcs: ["vsock_connection.cpp"],
diff --git a/common/libs/utils/archive.cpp b/common/libs/utils/archive.cpp
index 05fbf5f..2748fd1 100644
--- a/common/libs/utils/archive.cpp
+++ b/common/libs/utils/archive.cpp
@@ -79,15 +79,15 @@
bsdtar_cmd.AddParameter(file);
bsdtar_cmd.AddParameter("-O");
bsdtar_cmd.AddParameter(path);
- std::string stdout, stderr;
- auto ret = RunWithManagedStdio(std::move(bsdtar_cmd), nullptr, &stdout,
- nullptr);
+ std::string stdout_str;
+ auto ret =
+ RunWithManagedStdio(std::move(bsdtar_cmd), nullptr, &stdout_str, nullptr);
if (ret != 0) {
LOG(ERROR) << "Could not extract \"" << path << "\" from \"" << file
<< "\" to memory.";
return "";
}
- return stdout;
+ return stdout_str;
}
} // namespace cuttlefish
diff --git a/common/libs/utils/files.cpp b/common/libs/utils/files.cpp
index ea84b32..3a33763 100644
--- a/common/libs/utils/files.cpp
+++ b/common/libs/utils/files.cpp
@@ -18,25 +18,26 @@
#include <android-base/logging.h>
+#include <dirent.h>
+#include <ftw.h>
+#include <libgen.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <array>
#include <climits>
#include <cstdio>
#include <cstdlib>
#include <fstream>
-#include <libgen.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <dirent.h>
#include <vector>
#include "common/libs/fs/shared_fd.h"
namespace cuttlefish {
-bool FileExists(const std::string& path) {
+bool FileExists(const std::string& path, bool follow_symlinks) {
struct stat st;
- return stat(path.c_str(), &st) == 0;
+ return (follow_symlinks ? stat : lstat)(path.c_str(), &st) == 0;
}
bool FileHasContent(const std::string& path) {
@@ -56,9 +57,9 @@
return ret;
}
-bool DirectoryExists(const std::string& path) {
+bool DirectoryExists(const std::string& path, bool follow_symlinks) {
struct stat st;
- if (stat(path.c_str(), &st) == -1) {
+ if ((follow_symlinks ? stat : lstat)(path.c_str(), &st) == -1) {
return false;
}
if ((st.st_mode & S_IFMT) != S_IFDIR) {
@@ -88,6 +89,40 @@
return true;
}
+bool RecursivelyRemoveDirectory(const std::string& path) {
+ // Copied from libbase TemporaryDir destructor.
+ auto callback = [](const char* child, const struct stat*, int file_type,
+ struct FTW*) -> int {
+ switch (file_type) {
+ case FTW_D:
+ case FTW_DP:
+ case FTW_DNR:
+ if (rmdir(child) == -1) {
+ PLOG(ERROR) << "rmdir " << child;
+ }
+ break;
+ case FTW_NS:
+ default:
+ if (rmdir(child) != -1) {
+ break;
+ }
+ // FALLTHRU (for gcc, lint, pcc, etc; and following for clang)
+ FALLTHROUGH_INTENDED;
+ case FTW_F:
+ case FTW_SL:
+ case FTW_SLN:
+ if (unlink(child) == -1) {
+ PLOG(ERROR) << "unlink " << child;
+ }
+ break;
+ }
+ return 0;
+ };
+
+ return nftw(path.c_str(), callback, 128, FTW_DEPTH | FTW_MOUNT | FTW_PHYS) ==
+ 0;
+}
+
std::string AbsolutePath(const std::string& path) {
if (path.empty()) {
return {};
@@ -117,6 +152,11 @@
return st.st_size;
}
+bool MakeFileExecutable(const std::string& path) {
+ LOG(DEBUG) << "Making " << path << " executable";
+ return chmod(path.c_str(), S_IRWXU) == 0;
+}
+
// TODO(schuffelen): Use std::filesystem::last_write_time when on C++17
std::chrono::system_clock::time_point FileModificationTime(const std::string& path) {
struct stat st;
@@ -138,11 +178,10 @@
}
bool RemoveFile(const std::string& file) {
- LOG(DEBUG) << "Removing " << file;
+ LOG(DEBUG) << "Removing file " << file;
return remove(file.c_str()) == 0;
}
-
std::string ReadFile(const std::string& file) {
std::string contents;
std::ifstream in(file, std::ios::in | std::ios::binary);
@@ -222,4 +261,10 @@
return ret;
}
+bool FileIsSocket(const std::string& path) {
+ struct stat st;
+ return stat(path.c_str(), &st) == 0 && S_ISSOCK(st.st_mode);
+}
+
+
} // namespace cuttlefish
diff --git a/common/libs/utils/files.h b/common/libs/utils/files.h
index ff1c8d3..cc784ab 100644
--- a/common/libs/utils/files.h
+++ b/common/libs/utils/files.h
@@ -21,18 +21,22 @@
#include <string>
namespace cuttlefish {
-bool FileExists(const std::string& path);
+bool FileExists(const std::string& path, bool follow_symlinks = true);
bool FileHasContent(const std::string& path);
std::vector<std::string> DirectoryContents(const std::string& path);
-bool DirectoryExists(const std::string& path);
+bool DirectoryExists(const std::string& path, bool follow_symlinks = true);
bool IsDirectoryEmpty(const std::string& path);
+bool RecursivelyRemoveDirectory(const std::string& path);
off_t FileSize(const std::string& path);
bool RemoveFile(const std::string& file);
bool RenameFile(const std::string& old_name, const std::string& new_name);
std::string ReadFile(const std::string& file);
+bool MakeFileExecutable(const std::string& path);
std::chrono::system_clock::time_point FileModificationTime(const std::string& path);
std::string cpp_dirname(const std::string& str);
std::string cpp_basename(const std::string& str);
+// Whether a file exists and is a unix socket
+bool FileIsSocket(const std::string& path);
// The returned value may contain .. or . if these are present in the path
// argument.
diff --git a/common/libs/utils/flag_parser.cpp b/common/libs/utils/flag_parser.cpp
new file mode 100644
index 0000000..e011de6
--- /dev/null
+++ b/common/libs/utils/flag_parser.cpp
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <common/libs/utils/flag_parser.h>
+
+#include <algorithm>
+#include <iostream>
+#include <iterator>
+#include <unordered_set>
+
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+
+namespace cuttlefish {
+
+std::ostream& operator<<(std::ostream& out, const FlagAlias& alias) {
+ switch (alias.mode) {
+ case FlagAliasMode::kFlagExact:
+ return out << alias.name;
+ case FlagAliasMode::kFlagPrefix:
+ return out << alias.name << "*";
+ case FlagAliasMode::kFlagConsumesFollowing:
+ return out << alias.name << " *";
+ default:
+ LOG(FATAL) << "Unexpected flag alias mode " << (int)alias.mode;
+ }
+ return out;
+}
+
+Flag& Flag::UnvalidatedAlias(const FlagAlias& alias) & {
+ aliases_.push_back(alias);
+ return *this;
+}
+Flag Flag::UnvalidatedAlias(const FlagAlias& alias) && {
+ aliases_.push_back(alias);
+ return *this;
+}
+
+void Flag::ValidateAlias(const FlagAlias& alias) {
+ using android::base::EndsWith;
+ using android::base::StartsWith;
+
+ CHECK(StartsWith(alias.name, "-")) << "Flags should start with \"-\"";
+ if (alias.mode == FlagAliasMode::kFlagPrefix) {
+ CHECK(EndsWith(alias.name, "=")) << "Prefix flags shold end with \"=\"";
+ }
+
+ CHECK(!HasAlias(alias)) << "Duplicate flag alias: " << alias.name;
+ if (alias.mode == FlagAliasMode::kFlagConsumesFollowing) {
+ CHECK(!HasAlias({FlagAliasMode::kFlagExact, alias.name}))
+ << "Overlapping flag aliases for " << alias.name;
+ } else if (alias.mode == FlagAliasMode::kFlagExact) {
+ CHECK(!HasAlias({FlagAliasMode::kFlagExact, alias.name}))
+ << "Overlapping flag aliases for " << alias.name;
+ }
+}
+
+Flag& Flag::Alias(const FlagAlias& alias) & {
+ ValidateAlias(alias);
+ aliases_.push_back(alias);
+ return *this;
+}
+Flag Flag::Alias(const FlagAlias& alias) && {
+ ValidateAlias(alias);
+ aliases_.push_back(alias);
+ return *this;
+}
+
+Flag& Flag::Help(const std::string& help) & {
+ help_ = help;
+ return *this;
+}
+Flag Flag::Help(const std::string& help) && {
+ help_ = help;
+ return *this;
+}
+
+Flag& Flag::Getter(std::function<std::string()> fn) & {
+ getter_ = std::move(fn);
+ return *this;
+}
+Flag Flag::Getter(std::function<std::string()> fn) && {
+ getter_ = std::move(fn);
+ return *this;
+}
+
+Flag& Flag::Setter(std::function<bool(const FlagMatch&)> fn) & {
+ setter_ = std::move(fn);
+ return *this;
+}
+Flag Flag::Setter(std::function<bool(const FlagMatch&)> fn) && {
+ setter_ = std::move(fn);
+ return *this;
+}
+
+Flag::FlagProcessResult Flag::Process(
+ const std::string& arg, const std::optional<std::string>& next_arg) const {
+ if (!setter_ && aliases_.size() > 0) {
+ LOG(ERROR) << "No setter for flag with alias " << aliases_[0].name;
+ return FlagProcessResult::kFlagError;
+ }
+ for (auto& alias : aliases_) {
+ switch (alias.mode) {
+ case FlagAliasMode::kFlagConsumesFollowing:
+ if (arg != alias.name) {
+ continue;
+ }
+ if (!next_arg) {
+ LOG(ERROR) << "Expected an argument after \"" << arg << "\"";
+ return FlagProcessResult::kFlagError;
+ }
+ if (!(*setter_)({arg, *next_arg})) {
+ LOG(ERROR) << "Processing \"" << arg << "\" \"" << *next_arg
+ << "\" failed";
+ return FlagProcessResult::kFlagError;
+ }
+ return FlagProcessResult::kFlagConsumedWithFollowing;
+ case FlagAliasMode::kFlagExact:
+ if (arg != alias.name) {
+ continue;
+ }
+ if (!(*setter_)({arg, arg})) {
+ LOG(ERROR) << "Processing \"" << arg << "\" failed";
+ return FlagProcessResult::kFlagError;
+ }
+ return FlagProcessResult::kFlagConsumed;
+ case FlagAliasMode::kFlagPrefix:
+ if (!android::base::StartsWith(arg, alias.name)) {
+ continue;
+ }
+ if (!(*setter_)({alias.name, arg.substr(alias.name.size())})) {
+ LOG(ERROR) << "Processing \"" << arg << "\" failed";
+ return FlagProcessResult::kFlagError;
+ }
+ return FlagProcessResult::kFlagConsumed;
+ default:
+ LOG(ERROR) << "Unknown flag alias mode: " << (int)alias.mode;
+ return FlagProcessResult::kFlagError;
+ }
+ }
+ return FlagProcessResult::kFlagSkip;
+}
+
+bool Flag::Parse(std::vector<std::string>& arguments) const {
+ for (int i = 0; i < arguments.size();) {
+ std::string arg = arguments[i];
+ std::optional<std::string> next_arg;
+ if (i < arguments.size() - 1) {
+ next_arg = arguments[i + 1];
+ }
+ auto result = Process(arg, next_arg);
+ if (result == FlagProcessResult::kFlagError) {
+ LOG(ERROR) << "Failure in parsing \"" << arg << "\"";
+ return false;
+ } else if (result == FlagProcessResult::kFlagConsumed) {
+ arguments.erase(arguments.begin() + i);
+ } else if (result == FlagProcessResult::kFlagConsumedWithFollowing) {
+ arguments.erase(arguments.begin() + i, arguments.begin() + i + 2);
+ } else if (result == FlagProcessResult::kFlagSkip) {
+ i++;
+ continue;
+ } else {
+ LOG(ERROR) << "Unknown FlagProcessResult: " << (int)result;
+ return false;
+ }
+ }
+ return true;
+}
+bool Flag::Parse(std::vector<std::string>&& arguments) const {
+ return Parse(static_cast<std::vector<std::string>&>(arguments));
+}
+
+bool Flag::HasAlias(const FlagAlias& test) const {
+ for (const auto& alias : aliases_) {
+ if (alias.mode == test.mode && alias.name == test.name) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static std::string XmlEscape(const std::string& s) {
+ using android::base::StringReplace;
+ return StringReplace(StringReplace(s, "<", "<", true), ">", ">", true);
+}
+
+bool Flag::WriteGflagsCompatXml(std::ostream& out) const {
+ std::unordered_set<std::string> name_guesses;
+ for (const auto& alias : aliases_) {
+ std::string_view name = alias.name;
+ if (!android::base::ConsumePrefix(&name, "-")) {
+ continue;
+ }
+ android::base::ConsumePrefix(&name, "-");
+ if (alias.mode == FlagAliasMode::kFlagExact) {
+ android::base::ConsumePrefix(&name, "no");
+ name_guesses.insert(std::string{name});
+ } else if (alias.mode == FlagAliasMode::kFlagConsumesFollowing) {
+ name_guesses.insert(std::string{name});
+ } else if (alias.mode == FlagAliasMode::kFlagPrefix) {
+ if (!android::base::ConsumeSuffix(&name, "=")) {
+ continue;
+ }
+ name_guesses.insert(std::string{name});
+ }
+ }
+ bool found_alias = false;
+ for (const auto& name : name_guesses) {
+ bool has_bool_aliases =
+ HasAlias({FlagAliasMode::kFlagPrefix, "-" + name + "="}) &&
+ HasAlias({FlagAliasMode::kFlagPrefix, "--" + name + "="}) &&
+ HasAlias({FlagAliasMode::kFlagExact, "-" + name}) &&
+ HasAlias({FlagAliasMode::kFlagExact, "--" + name}) &&
+ HasAlias({FlagAliasMode::kFlagExact, "-no" + name}) &&
+ HasAlias({FlagAliasMode::kFlagExact, "--no" + name});
+ bool has_other_aliases =
+ HasAlias({FlagAliasMode::kFlagPrefix, "-" + name + "="}) &&
+ HasAlias({FlagAliasMode::kFlagPrefix, "--" + name + "="}) &&
+ HasAlias({FlagAliasMode::kFlagConsumesFollowing, "-" + name}) &&
+ HasAlias({FlagAliasMode::kFlagConsumesFollowing, "--" + name});
+ if (has_bool_aliases && has_other_aliases) {
+ LOG(ERROR) << "Expected exactly one of has_bool_aliases and "
+ << "has_other_aliases, got both for \"" << name << "\".";
+ return false;
+ } else if (!has_bool_aliases && !has_other_aliases) {
+ continue;
+ }
+ found_alias = true;
+ // Lifted from external/gflags/src/gflags_reporting.cc:DescribeOneFlagInXML
+ out << "<flag>\n";
+ out << " <file>file.cc</file>\n";
+ out << " <name>" << XmlEscape(name) << "</name>\n";
+ auto help = help_ ? XmlEscape(*help_) : std::string{""};
+ out << " <meaning>" << help << "</meaning>\n";
+ auto value = getter_ ? XmlEscape((*getter_)()) : std::string{""};
+ out << " <default>" << value << "</default>\n";
+ out << " <current>" << value << "</current>\n";
+ out << " <type>" << (has_bool_aliases ? "bool" : "string") << "</type>\n";
+ out << "</flag>\n";
+ }
+ return found_alias;
+}
+
+std::ostream& operator<<(std::ostream& out, const Flag& flag) {
+ out << "[";
+ for (auto it = flag.aliases_.begin(); it != flag.aliases_.end(); it++) {
+ if (it != flag.aliases_.begin()) {
+ out << ", ";
+ }
+ out << *it;
+ }
+ out << "]\n";
+ if (flag.help_) {
+ out << "(" << *flag.help_ << ")\n";
+ }
+ if (flag.getter_) {
+ out << "(Current value: \"" << (*flag.getter_)() << "\")\n";
+ }
+ return out;
+}
+
+std::vector<std::string> ArgsToVec(int argc, char** argv) {
+ std::vector<std::string> args;
+ for (int i = 0; i < argc; i++) {
+ args.push_back(argv[i]);
+ }
+ return args;
+}
+
+bool ParseFlags(const std::vector<Flag>& flags,
+ std::vector<std::string>& args) {
+ for (const auto& flag : flags) {
+ if (!flag.Parse(args)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool ParseFlags(const std::vector<Flag>& flags,
+ std::vector<std::string>&& args) {
+ for (const auto& flag : flags) {
+ if (!flag.Parse(args)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool WriteGflagsCompatXml(const std::vector<Flag>& flags, std::ostream& out) {
+ for (const auto& flag : flags) {
+ if (!flag.WriteGflagsCompatXml(out)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+Flag HelpFlag(const std::vector<Flag>& flags, const std::string& text) {
+ auto setter = [&](FlagMatch) {
+ if (text.size() > 0) {
+ LOG(INFO) << text;
+ }
+ for (const auto& flag : flags) {
+ LOG(INFO) << flag;
+ }
+ return false;
+ };
+ return Flag()
+ .Alias({FlagAliasMode::kFlagExact, "-help"})
+ .Alias({FlagAliasMode::kFlagExact, "--help"})
+ .Setter(setter);
+}
+
+Flag InvalidFlagGuard() {
+ return Flag()
+ .UnvalidatedAlias({FlagAliasMode::kFlagPrefix, "-"})
+ .Help(
+ "This executable only supports the flags in `-help`. Positional "
+ "arguments may be supported.")
+ .Setter([](const FlagMatch& match) {
+ LOG(ERROR) << "Unknown flag " << match.value;
+ return false;
+ });
+}
+
+Flag UnexpectedArgumentGuard() {
+ return Flag()
+ .UnvalidatedAlias({FlagAliasMode::kFlagPrefix, ""})
+ .Help(
+ "This executable only supports the flags in `-help`. Positional "
+ "arguments are not supported.")
+ .Setter([](const FlagMatch& match) {
+ LOG(ERROR) << "Unexpected argument \"" << match.value << "\"";
+ return false;
+ });
+}
+
+Flag GflagsCompatFlag(const std::string& name) {
+ return Flag()
+ .Alias({FlagAliasMode::kFlagPrefix, "-" + name + "="})
+ .Alias({FlagAliasMode::kFlagPrefix, "--" + name + "="})
+ .Alias({FlagAliasMode::kFlagConsumesFollowing, "-" + name})
+ .Alias({FlagAliasMode::kFlagConsumesFollowing, "--" + name});
+};
+
+Flag GflagsCompatFlag(const std::string& name, std::string& value) {
+ return GflagsCompatFlag(name)
+ .Getter([&value]() { return value; })
+ .Setter([&value](const FlagMatch& match) {
+ value = match.value;
+ return true;
+ });
+}
+
+template <typename T>
+std::optional<T> ParseInteger(const std::string& value) {
+ if (value.size() == 0) {
+ return {};
+ }
+ const char* base = value.c_str();
+ char* end = nullptr;
+ errno = 0;
+ auto r = strtoll(base, &end, /* auto-detect */ 0);
+ if (errno != 0 || end != base + value.size()) {
+ return {};
+ }
+ if (static_cast<T>(r) != r) {
+ return {};
+ }
+ return r;
+}
+
+template <typename T>
+static Flag GflagsCompatNumericFlagGeneric(const std::string& name, T& value) {
+ return GflagsCompatFlag(name)
+ .Getter([&value]() { return std::to_string(value); })
+ .Setter([&value](const FlagMatch& match) {
+ auto parsed = ParseInteger<T>(match.value);
+ if (parsed) {
+ value = *parsed;
+ return true;
+ } else {
+ LOG(ERROR) << "Failed to parse \"" << match.value
+ << "\" as an integer";
+ return false;
+ }
+ });
+}
+
+Flag GflagsCompatFlag(const std::string& name, int32_t& value) {
+ return GflagsCompatNumericFlagGeneric(name, value);
+}
+
+Flag GflagsCompatFlag(const std::string& name, bool& value) {
+ return Flag()
+ .Alias({FlagAliasMode::kFlagPrefix, "-" + name + "="})
+ .Alias({FlagAliasMode::kFlagPrefix, "--" + name + "="})
+ .Alias({FlagAliasMode::kFlagExact, "-" + name})
+ .Alias({FlagAliasMode::kFlagExact, "--" + name})
+ .Alias({FlagAliasMode::kFlagExact, "-no" + name})
+ .Alias({FlagAliasMode::kFlagExact, "--no" + name})
+ .Getter([&value]() { return value ? "true" : "false"; })
+ .Setter([name, &value](const FlagMatch& match) {
+ const auto& key = match.key;
+ if (key == "-" + name || key == "--" + name) {
+ value = true;
+ return true;
+ } else if (key == "-no" + name || key == "--no" + name) {
+ value = false;
+ return true;
+ } else if (key == "-" + name + "=" || key == "--" + name + "=") {
+ if (match.value == "true") {
+ value = true;
+ return true;
+ } else if (match.value == "false") {
+ value = false;
+ return true;
+ } else {
+ LOG(ERROR) << "Unexpected boolean value \"" << match.value << "\""
+ << " for \"" << name << "\"";
+ return false;
+ }
+ }
+ LOG(ERROR) << "Unexpected key \"" << match.key << "\""
+ << " for \"" << name << "\"";
+ return false;
+ });
+};
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/flag_parser.h b/common/libs/utils/flag_parser.h
new file mode 100644
index 0000000..9f66ded
--- /dev/null
+++ b/common/libs/utils/flag_parser.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <functional>
+#include <optional>
+#include <set>
+#include <string>
+#include <vector>
+
+#include <android-base/logging.h>
+
+/* Support for parsing individual flags out of a larger list of flags. This
+ * supports externally determining the order that flags are evaluated in, and
+ * incrementally integrating with existing flag parsing implementations.
+ *
+ * Start with Flag() or one of the GflagsCompatFlag(...) functions to create new
+ * flags. These flags should be aggregated through the application through some
+ * other mechanism and then evaluated individually with Flag::Parse or together
+ * with ParseFlags on arguments. */
+
+namespace cuttlefish {
+
+/* The matching behavior used with the name in `FlagAlias::name`. */
+enum class FlagAliasMode {
+ /* Match arguments of the form `<name><value>`. In practice, <name> usually
+ * looks like "-flag=" or "--flag=", where the "-" and "=" are included in
+ * parsing. */
+ kFlagPrefix,
+ /* Match arguments of the form `<name>`. In practice, <name> will look like
+ * "-flag" or "--flag". */
+ kFlagExact,
+ /* Match a pair of arguments of the form `<name>` `<value>`. In practice,
+ * <name> will look like "-flag" or "--flag". */
+ kFlagConsumesFollowing,
+};
+
+/* A single matching rule for a `Flag`. One `Flag` can have multiple rules. */
+struct FlagAlias {
+ FlagAliasMode mode;
+ std::string name;
+};
+
+std::ostream& operator<<(std::ostream&, const FlagAlias&);
+
+/* A successful match in an argument list from a `FlagAlias` inside a `Flag`.
+ * The `key` value corresponds to `FlagAlias::name`. For a match of
+ * `FlagAliasMode::kFlagExact`, `key` and `value` will both be the `name`. */
+struct FlagMatch {
+ std::string key;
+ std::string value;
+};
+
+class Flag {
+ public:
+ /* Add an alias that triggers matches and calls to the `Setter` function. */
+ Flag& Alias(const FlagAlias& alias) &;
+ Flag Alias(const FlagAlias& alias) &&;
+ /* Set help text, visible in the class ostream writer method. Optional. */
+ Flag& Help(const std::string&) &;
+ Flag Help(const std::string&) &&;
+ /* Set a loader that displays the current value in help text. Optional. */
+ Flag& Getter(std::function<std::string()>) &;
+ Flag Getter(std::function<std::string()>) &&;
+ /* Set the callback for matches. The callback be invoked multiple times. */
+ Flag& Setter(std::function<bool(const FlagMatch&)>) &;
+ Flag Setter(std::function<bool(const FlagMatch&)>) &&;
+
+ /* Examines a list of arguments, removing any matches from the list and
+ * invoking the `Setter` for every match. Returns `false` if the callback ever
+ * returns `false`. Non-matches are left in place. */
+ bool Parse(std::vector<std::string>& flags) const;
+ bool Parse(std::vector<std::string>&& flags) const;
+
+ /* Write gflags `--helpxml` style output for a string-type flag. */
+ bool WriteGflagsCompatXml(std::ostream&) const;
+
+ private:
+ /* Reports whether `Process` wants to consume zero, one, or two arguments. */
+ enum class FlagProcessResult {
+ /* Error in handling a flag, exit flag handling with an error result. */
+ kFlagError,
+ kFlagSkip, /* Flag skipped; consume no arguments. */
+ kFlagConsumed, /* Flag processed; consume one argument. */
+ kFlagConsumedWithFollowing, /* Flag processed; consume 2 arguments. */
+ };
+
+ void ValidateAlias(const FlagAlias& alias);
+ Flag& UnvalidatedAlias(const FlagAlias& alias) &;
+ Flag UnvalidatedAlias(const FlagAlias& alias) &&;
+
+ /* Attempt to match a single argument. */
+ FlagProcessResult Process(const std::string& argument,
+ const std::optional<std::string>& next_arg) const;
+
+ bool HasAlias(const FlagAlias&) const;
+
+ friend std::ostream& operator<<(std::ostream&, const Flag&);
+ friend Flag InvalidFlagGuard();
+ friend Flag UnexpectedArgumentGuard();
+
+ std::vector<FlagAlias> aliases_;
+ std::optional<std::string> help_;
+ std::optional<std::function<std::string()>> getter_;
+ std::optional<std::function<bool(const FlagMatch&)>> setter_;
+};
+
+std::ostream& operator<<(std::ostream&, const Flag&);
+
+std::vector<std::string> ArgsToVec(int argc, char** argv);
+
+/* Handles a list of flags. Flags are matched in the order given in case two
+ * flags match the same argument. Matched flags are removed, leaving only
+ * unmatched arguments. */
+bool ParseFlags(const std::vector<Flag>& flags, std::vector<std::string>& args);
+bool ParseFlags(const std::vector<Flag>& flags, std::vector<std::string>&&);
+
+bool WriteGflagsCompatXml(const std::vector<Flag>&, std::ostream&);
+
+/* If any of these are used, they should be evaluated after all other flags, and
+ * in the order defined here (help before invalid flags, invalid flags before
+ * unexpected arguments). */
+
+/* If a "-help" or "--help" flag is present, prints all the flags and fails. */
+Flag HelpFlag(const std::vector<Flag>& flags, const std::string& text = "");
+/* Catches unrecognized arguments that begin with `-`, and errors out. This
+ * effectively denies unknown flags. */
+Flag InvalidFlagGuard();
+/* Catches any arguments not extracted by other Flag matchers and errors out.
+ * This effectively denies unknown flags and any positional arguments. */
+Flag UnexpectedArgumentGuard();
+
+// Create a flag resembling a gflags argument of the given type. This includes
+// "-[-]flag=*",support for all types, "-[-]noflag" support for booleans, and
+// "-flag *", "--flag *", support for other types. The value passed in the flag
+// is saved to the defined reference.
+Flag GflagsCompatFlag(const std::string& name);
+Flag GflagsCompatFlag(const std::string& name, std::string& value);
+Flag GflagsCompatFlag(const std::string& name, std::int32_t& value);
+Flag GflagsCompatFlag(const std::string& name, bool& value);
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/flag_parser_test.cpp b/common/libs/utils/flag_parser_test.cpp
new file mode 100644
index 0000000..ab16c84
--- /dev/null
+++ b/common/libs/utils/flag_parser_test.cpp
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <common/libs/utils/flag_parser.h>
+
+#include <gtest/gtest.h>
+#include <libxml/tree.h>
+#include <map>
+#include <optional>
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace cuttlefish {
+
+TEST(FlagParser, DuplicateAlias) {
+ FlagAlias alias = {FlagAliasMode::kFlagExact, "--flag"};
+ ASSERT_DEATH({ Flag().Alias(alias).Alias(alias); }, "Duplicate flag alias");
+}
+
+TEST(FlagParser, ConflictingAlias) {
+ FlagAlias exact_alias = {FlagAliasMode::kFlagExact, "--flag"};
+ FlagAlias following_alias = {FlagAliasMode::kFlagConsumesFollowing, "--flag"};
+ ASSERT_DEATH({ Flag().Alias(exact_alias).Alias(following_alias); },
+ "Overlapping flag aliases");
+}
+
+TEST(FlagParser, StringFlag) {
+ std::string value;
+ auto flag = GflagsCompatFlag("myflag", value);
+ ASSERT_TRUE(flag.Parse({"-myflag=a"}));
+ ASSERT_EQ(value, "a");
+ ASSERT_TRUE(flag.Parse({"--myflag=b"}));
+ ASSERT_EQ(value, "b");
+ ASSERT_TRUE(flag.Parse({"-myflag", "c"}));
+ ASSERT_EQ(value, "c");
+ ASSERT_TRUE(flag.Parse({"--myflag", "d"}));
+ ASSERT_EQ(value, "d");
+ ASSERT_TRUE(flag.Parse({"--myflag="}));
+ ASSERT_EQ(value, "");
+}
+
+std::optional<std::map<std::string, std::string>> flagXml(const Flag& f) {
+ std::stringstream xml_stream;
+ if (!f.WriteGflagsCompatXml(xml_stream)) {
+ return {};
+ }
+ auto xml = xml_stream.str();
+ // Holds all memory for the parsed structure.
+ std::unique_ptr<xmlDoc, xmlFreeFunc> doc(
+ xmlReadMemory(xml.c_str(), xml.size(), nullptr, nullptr, 0), xmlFree);
+ if (!doc) {
+ return {};
+ }
+ xmlNodePtr root_element = xmlDocGetRootElement(doc.get());
+ std::map<std::string, std::string> elements_map;
+ for (auto elem = root_element->children; elem != nullptr; elem = elem->next) {
+ if (elem->type != xmlElementType::XML_ELEMENT_NODE) {
+ continue;
+ }
+ elements_map[(char*)elem->name] = "";
+ if (elem->children == nullptr) {
+ continue;
+ }
+ if (elem->children->type != XML_TEXT_NODE) {
+ continue;
+ }
+ elements_map[(char*)elem->name] = (char*)elem->children->content;
+ }
+ return elements_map;
+}
+
+TEST(FlagParser, GflagsIncompatibleFlag) {
+ auto flag = Flag().Alias({FlagAliasMode::kFlagExact, "--flag"});
+ ASSERT_FALSE(flagXml(flag));
+}
+
+TEST(FlagParser, StringFlagXml) {
+ std::string value = "somedefault";
+ auto flag = GflagsCompatFlag("myflag", value).Help("somehelp");
+ auto xml = flagXml(flag);
+ ASSERT_TRUE(xml);
+ ASSERT_NE((*xml)["file"], "");
+ ASSERT_EQ((*xml)["name"], "myflag");
+ ASSERT_EQ((*xml)["meaning"], "somehelp");
+ ASSERT_EQ((*xml)["default"], "somedefault");
+ ASSERT_EQ((*xml)["current"], "somedefault");
+ ASSERT_EQ((*xml)["type"], "string");
+}
+
+TEST(FlagParser, RepeatedStringFlag) {
+ std::string value;
+ auto flag = GflagsCompatFlag("myflag", value);
+ ASSERT_TRUE(flag.Parse({"-myflag=a", "--myflag", "b"}));
+ ASSERT_EQ(value, "b");
+}
+
+TEST(FlagParser, RepeatedListFlag) {
+ std::vector<std::string> elems;
+ auto flag = GflagsCompatFlag("myflag");
+ flag.Setter([&elems](const FlagMatch& match) {
+ elems.push_back(match.value);
+ return true;
+ });
+ ASSERT_TRUE(flag.Parse({"-myflag=a", "--myflag", "b"}));
+ ASSERT_EQ(elems, (std::vector<std::string>{"a", "b"}));
+}
+
+TEST(FlagParser, FlagRemoval) {
+ std::string value;
+ auto flag = GflagsCompatFlag("myflag", value);
+ std::vector<std::string> flags = {"-myflag=a", "-otherflag=c"};
+ ASSERT_TRUE(flag.Parse(flags));
+ ASSERT_EQ(value, "a");
+ ASSERT_EQ(flags, std::vector<std::string>{"-otherflag=c"});
+ flags = {"-otherflag=a", "-myflag=c"};
+ ASSERT_TRUE(flag.Parse(flags));
+ ASSERT_EQ(value, "c");
+ ASSERT_EQ(flags, std::vector<std::string>{"-otherflag=a"});
+}
+
+TEST(FlagParser, IntFlag) {
+ std::int32_t value = 0;
+ auto flag = GflagsCompatFlag("myflag", value);
+ ASSERT_TRUE(flag.Parse({"-myflag=5"}));
+ ASSERT_EQ(value, 5);
+ ASSERT_TRUE(flag.Parse({"--myflag=6"}));
+ ASSERT_EQ(value, 6);
+ ASSERT_TRUE(flag.Parse({"-myflag", "7"}));
+ ASSERT_EQ(value, 7);
+ ASSERT_TRUE(flag.Parse({"--myflag", "8"}));
+ ASSERT_EQ(value, 8);
+}
+
+TEST(FlagParser, IntFlagXml) {
+ int value = 5;
+ auto flag = GflagsCompatFlag("myflag", value).Help("somehelp");
+ auto xml = flagXml(flag);
+ ASSERT_TRUE(xml);
+ ASSERT_NE((*xml)["file"], "");
+ ASSERT_EQ((*xml)["name"], "myflag");
+ ASSERT_EQ((*xml)["meaning"], "somehelp");
+ ASSERT_EQ((*xml)["default"], "5");
+ ASSERT_EQ((*xml)["current"], "5");
+ ASSERT_EQ((*xml)["type"], "string");
+}
+
+TEST(FlagParser, BoolFlag) {
+ bool value = false;
+ auto flag = GflagsCompatFlag("myflag", value);
+ ASSERT_TRUE(flag.Parse({"-myflag"}));
+ ASSERT_TRUE(value);
+
+ value = false;
+ ASSERT_TRUE(flag.Parse({"--myflag"}));
+ ASSERT_TRUE(value);
+
+ value = false;
+ ASSERT_TRUE(flag.Parse({"-myflag=true"}));
+ ASSERT_TRUE(value);
+
+ value = false;
+ ASSERT_TRUE(flag.Parse({"--myflag=true"}));
+ ASSERT_TRUE(value);
+
+ value = true;
+ ASSERT_TRUE(flag.Parse({"-nomyflag"}));
+ ASSERT_FALSE(value);
+
+ value = true;
+ ASSERT_TRUE(flag.Parse({"--nomyflag"}));
+ ASSERT_FALSE(value);
+
+ value = true;
+ ASSERT_TRUE(flag.Parse({"-myflag=false"}));
+ ASSERT_FALSE(value);
+
+ value = true;
+ ASSERT_TRUE(flag.Parse({"--myflag=false"}));
+ ASSERT_FALSE(value);
+
+ ASSERT_FALSE(flag.Parse({"--myflag=nonsense"}));
+}
+
+TEST(FlagParser, BoolFlagXml) {
+ bool value = true;
+ auto flag = GflagsCompatFlag("myflag", value).Help("somehelp");
+ auto xml = flagXml(flag);
+ ASSERT_TRUE(xml);
+ ASSERT_NE((*xml)["file"], "");
+ ASSERT_EQ((*xml)["name"], "myflag");
+ ASSERT_EQ((*xml)["meaning"], "somehelp");
+ ASSERT_EQ((*xml)["default"], "true");
+ ASSERT_EQ((*xml)["current"], "true");
+ ASSERT_EQ((*xml)["type"], "bool");
+}
+
+TEST(FlagParser, StringIntFlag) {
+ std::int32_t int_value = 0;
+ std::string string_value;
+ auto int_flag = GflagsCompatFlag("int", int_value);
+ auto string_flag = GflagsCompatFlag("string", string_value);
+ std::vector<Flag> flags = {int_flag, string_flag};
+ ASSERT_TRUE(ParseFlags(flags, {"-int=5", "-string=a"}));
+ ASSERT_EQ(int_value, 5);
+ ASSERT_EQ(string_value, "a");
+ ASSERT_TRUE(ParseFlags(flags, {"--int=6", "--string=b"}));
+ ASSERT_EQ(int_value, 6);
+ ASSERT_EQ(string_value, "b");
+ ASSERT_TRUE(ParseFlags(flags, {"-int", "7", "-string", "c"}));
+ ASSERT_EQ(int_value, 7);
+ ASSERT_EQ(string_value, "c");
+ ASSERT_TRUE(ParseFlags(flags, {"--int", "8", "--string", "d"}));
+ ASSERT_EQ(int_value, 8);
+ ASSERT_EQ(string_value, "d");
+}
+
+TEST(FlagParser, InvalidStringFlag) {
+ std::string value;
+ auto flag = GflagsCompatFlag("myflag", value);
+ ASSERT_FALSE(flag.Parse({"-myflag"}));
+ ASSERT_FALSE(flag.Parse({"--myflag"}));
+}
+
+TEST(FlagParser, InvalidIntFlag) {
+ int value;
+ auto flag = GflagsCompatFlag("myflag", value);
+ ASSERT_FALSE(flag.Parse({"-myflag"}));
+ ASSERT_FALSE(flag.Parse({"--myflag"}));
+ ASSERT_FALSE(flag.Parse({"-myflag=abc"}));
+ ASSERT_FALSE(flag.Parse({"--myflag=def"}));
+ ASSERT_FALSE(flag.Parse({"-myflag", "abc"}));
+ ASSERT_FALSE(flag.Parse({"--myflag", "def"}));
+}
+
+TEST(FlagParser, InvalidFlagGuard) {
+ auto flag = InvalidFlagGuard();
+ ASSERT_TRUE(flag.Parse({}));
+ ASSERT_TRUE(flag.Parse({"positional"}));
+ ASSERT_TRUE(flag.Parse({"positional", "positional2"}));
+ ASSERT_FALSE(flag.Parse({"-flag"}));
+ ASSERT_FALSE(flag.Parse({"-"}));
+}
+
+TEST(FlagParser, UnexpectedArgumentGuard) {
+ auto flag = UnexpectedArgumentGuard();
+ ASSERT_TRUE(flag.Parse({}));
+ ASSERT_FALSE(flag.Parse({"positional"}));
+ ASSERT_FALSE(flag.Parse({"positional", "positional2"}));
+ ASSERT_FALSE(flag.Parse({"-flag"}));
+ ASSERT_FALSE(flag.Parse({"-"}));
+}
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/network.cpp b/common/libs/utils/network.cpp
index d1f5f59..d8068b4 100644
--- a/common/libs/utils/network.cpp
+++ b/common/libs/utils/network.cpp
@@ -17,15 +17,19 @@
#include "common/libs/utils/network.h"
#include <arpa/inet.h>
-#include <linux/if.h>
-#include <linux/if_tun.h>
-#include <linux/types.h>
-#include <linux/if_packet.h>
+#include <net/if.h>
+#include <netinet/ether.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
-#include <netinet/ether.h>
#include <string.h>
+// Kernel headers don't mix well with userspace headers, but there is no
+// userspace header that provides the if_tun.h #defines. Include the kernel
+// header, but move conflicting definitions out of the way using macros.
+#define ethhdr __kernel_ethhdr
+#include <linux/if_tun.h>
+#undef ethdhr
+
#include <android-base/strings.h>
#include "android-base/logging.h"
@@ -36,12 +40,6 @@
namespace cuttlefish {
namespace {
-static std::string DefaultHostArtifactsPath(const std::string& file_name) {
- return (StringFromEnv("ANDROID_HOST_OUT", StringFromEnv("HOME", ".")) +
- "/") +
- file_name;
-}
-
// This should be the size of virtio_net_hdr_v1, from linux/virtio_net.h, but
// the version of that header that ships with android in Pie does not include
// that struct (it was added in Q).
@@ -96,42 +94,28 @@
return tap_fd;
}
- if (HostArch() == Arch::Arm64) {
- auto tapsetiff_path = DefaultHostArtifactsPath("bin/tapsetiff");
- Command cmd(tapsetiff_path);
- cmd.AddParameter(tap_fd);
- cmd.AddParameter(interface_name.c_str());
- int ret = cmd.Start().Wait();
- if (ret != 0) {
- LOG(ERROR) << "Unable to run tapsetiff.py. Exited with status " << ret;
- tap_fd->Close();
- return SharedFD();
- }
- } else {
- struct ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
- strncpy(ifr.ifr_name, interface_name.c_str(), IFNAMSIZ);
+ struct ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
+ strncpy(ifr.ifr_name, interface_name.c_str(), IFNAMSIZ);
- int err = tap_fd->Ioctl(TUNSETIFF, &ifr);
- if (err < 0) {
- LOG(ERROR) << "Unable to connect to " << interface_name
- << " tap interface: " << tap_fd->StrError();
- tap_fd->Close();
- return SharedFD();
- }
-
- // The interface's configuration may have been modified or just not set
- // correctly on creation. While qemu checks this and enforces the right
- // configuration, crosvm does not, so it needs to be set before it's passed to
- // it.
- tap_fd->Ioctl(TUNSETOFFLOAD,
- reinterpret_cast<void*>(TUN_F_CSUM | TUN_F_UFO | TUN_F_TSO4 |
- TUN_F_TSO6));
- int len = SIZE_OF_VIRTIO_NET_HDR_V1;
- tap_fd->Ioctl(TUNSETVNETHDRSZ, &len);
+ int err = tap_fd->Ioctl(TUNSETIFF, &ifr);
+ if (err < 0) {
+ LOG(ERROR) << "Unable to connect to " << interface_name
+ << " tap interface: " << tap_fd->StrError();
+ tap_fd->Close();
+ return SharedFD();
}
+ // The interface's configuration may have been modified or just not set
+ // correctly on creation. While qemu checks this and enforces the right
+ // configuration, crosvm does not, so it needs to be set before it's passed to
+ // it.
+ tap_fd->Ioctl(TUNSETOFFLOAD,
+ reinterpret_cast<void*>(TUN_F_CSUM | TUN_F_UFO | TUN_F_TSO4 |
+ TUN_F_TSO6));
+ int len = SIZE_OF_VIRTIO_NET_HDR_V1;
+ tap_fd->Ioctl(TUNSETVNETHDRSZ, &len);
return tap_fd;
}
@@ -139,9 +123,9 @@
Command cmd("/bin/bash");
cmd.AddParameter("-c");
cmd.AddParameter("egrep -h -e \"^iff:.*\" /proc/*/fdinfo/*");
- std::string stdin, stdout, stderr;
- RunWithManagedStdio(std::move(cmd), &stdin, &stdout, &stderr);
- auto lines = android::base::Split(stdout, "\n");
+ std::string stdin_str, stdout_str, stderr_str;
+ RunWithManagedStdio(std::move(cmd), &stdin_str, &stdout_str, &stderr_str);
+ auto lines = android::base::Split(stdout_str, "\n");
std::set<std::string> tap_interfaces;
for (const auto& line : lines) {
if (line == "") {
@@ -310,4 +294,25 @@
return true;
}
+bool ReleaseDhcpLeases(const std::string& lease_path, SharedFD tap_fd,
+ const std::uint8_t dhcp_server_ip[4]) {
+ auto lease_file_fd = SharedFD::Open(lease_path, O_RDONLY);
+ if (!lease_file_fd->IsOpen()) {
+ LOG(ERROR) << "Could not open leases file \"" << lease_path << '"';
+ return false;
+ }
+ bool success = true;
+ auto dhcp_leases = ParseDnsmasqLeases(lease_file_fd);
+ for (auto& lease : dhcp_leases) {
+ if (!ReleaseDhcp4(tap_fd, lease.mac_address, lease.ip_address,
+ dhcp_server_ip)) {
+ LOG(ERROR) << "Failed to release " << lease;
+ success = false;
+ } else {
+ LOG(INFO) << "Successfully dropped " << lease;
+ }
+ }
+ return success;
+}
+
} // namespace cuttlefish
diff --git a/common/libs/utils/network.h b/common/libs/utils/network.h
index 64b562e..98cdf18 100644
--- a/common/libs/utils/network.h
+++ b/common/libs/utils/network.h
@@ -49,4 +49,6 @@
const std::uint8_t ip_address[4],
const std::uint8_t dhcp_server_ip[4]);
+bool ReleaseDhcpLeases(const std::string& lease_path, SharedFD tap_fd,
+ const std::uint8_t dhcp_server_ip[4]);
}
diff --git a/common/libs/utils/shared_fd_flag.cpp b/common/libs/utils/shared_fd_flag.cpp
new file mode 100644
index 0000000..9d5ad89
--- /dev/null
+++ b/common/libs/utils/shared_fd_flag.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "common/libs/utils/shared_fd_flag.h"
+
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <string>
+
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/flag_parser.h"
+
+namespace cuttlefish {
+
+static bool Set(const FlagMatch& match, SharedFD& out) {
+ int raw_fd;
+ if (!android::base::ParseInt(match.value.c_str(), &raw_fd)) {
+ LOG(ERROR) << "Failed to parse value \"" << match.value
+ << "\" for fd flag \"" << match.key << "\"";
+ return false;
+ }
+ out = SharedFD::Dup(raw_fd);
+ if (out->IsOpen()) {
+ close(raw_fd);
+ }
+ return true;
+}
+
+Flag SharedFDFlag(SharedFD& out) {
+ return Flag().Setter([&](const FlagMatch& mat) { return Set(mat, out); });
+}
+Flag SharedFDFlag(const std::string& name, SharedFD& out) {
+ return GflagsCompatFlag(name).Setter(
+ [&out](const FlagMatch& mat) { return Set(mat, out); });
+}
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.cpp b/common/libs/utils/shared_fd_flag.h
similarity index 69%
rename from common/libs/utils/size_utils.cpp
rename to common/libs/utils/shared_fd_flag.h
index 9f25445..33b1555 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/common/libs/utils/shared_fd_flag.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,16 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#pragma once
-#include "common/libs/utils/size_utils.h"
+#include <string>
-#include <unistd.h>
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/flag_parser.h"
namespace cuttlefish {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+Flag SharedFDFlag(SharedFD& out);
+Flag SharedFDFlag(const std::string& name, SharedFD& out);
} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.h b/common/libs/utils/size_utils.h
index 625cdd8..71bfea6 100644
--- a/common/libs/utils/size_utils.h
+++ b/common/libs/utils/size_utils.h
@@ -26,6 +26,9 @@
constexpr int PARTITION_SIZE_SHIFT = 12;
// Returns the smallest multiple of 2^align_log greater than or equal to val.
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log);
+constexpr uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
+ uint64_t align = 1ULL << align_log;
+ return ((val + (align - 1)) / align) * align;
+}
} // namespace cuttlefish
diff --git a/common/libs/utils/subprocess.cpp b/common/libs/utils/subprocess.cpp
index 7c05219..cb8e4c6 100644
--- a/common/libs/utils/subprocess.cpp
+++ b/common/libs/utils/subprocess.cpp
@@ -16,6 +16,7 @@
#include "common/libs/utils/subprocess.h"
+#include <android-base/logging.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
@@ -24,13 +25,15 @@
#include <sys/wait.h>
#include <unistd.h>
+#include <stdio.h>
#include <map>
#include <set>
#include <thread>
-#include <android-base/logging.h>
-
#include "common/libs/fs/shared_buf.h"
+#include "common/libs/utils/files.h"
+
+extern char** environ;
namespace cuttlefish {
namespace {
@@ -74,14 +77,35 @@
ret.push_back(NULL);
return ret;
}
-
-void UnsetEnvironment(const std::unordered_set<std::string>& unenv) {
- for (auto it = unenv.cbegin(); it != unenv.cend(); ++it) {
- unsetenv(it->c_str());
- }
-}
} // namespace
+SubprocessOptions& SubprocessOptions::Verbose(bool verbose) & {
+ verbose_ = verbose;
+ return *this;
+}
+SubprocessOptions SubprocessOptions::Verbose(bool verbose) && {
+ verbose_ = verbose;
+ return *this;
+}
+
+SubprocessOptions& SubprocessOptions::ExitWithParent(bool v) & {
+ exit_with_parent_ = v;
+ return *this;
+}
+SubprocessOptions SubprocessOptions::ExitWithParent(bool v) && {
+ exit_with_parent_ = v;
+ return *this;
+}
+
+SubprocessOptions& SubprocessOptions::InGroup(bool in_group) & {
+ in_group_ = in_group;
+ return *this;
+}
+SubprocessOptions SubprocessOptions::InGroup(bool in_group) && {
+ in_group_ = in_group;
+ return *this;
+}
+
Subprocess::Subprocess(Subprocess&& subprocess)
: pid_(subprocess.pid_),
started_(subprocess.started_),
@@ -143,7 +167,7 @@
return retval;
}
-bool KillSubprocess(Subprocess* subprocess) {
+StopperResult KillSubprocess(Subprocess* subprocess) {
auto pid = subprocess->pid();
if (pid > 0) {
auto pgid = getpgid(pid);
@@ -155,13 +179,23 @@
// to the process and not a (non-existent) group
}
bool is_group_head = pid == pgid;
- if (is_group_head) {
- return killpg(pid, SIGKILL) == 0;
- } else {
- return kill(pid, SIGKILL) == 0;
+ auto kill_ret = (is_group_head ? killpg : kill)(pid, SIGKILL);
+ if (kill_ret == 0) {
+ return StopperResult::kStopSuccess;
}
+ auto kill_cmd = is_group_head ? "killpg(" : "kill(";
+ PLOG(ERROR) << kill_cmd << pid << ", SIGKILL) failed: ";
+ return StopperResult::kStopFailure;
}
- return true;
+ return StopperResult::kStopSuccess;
+}
+
+Command::Command(const std::string& executable, SubprocessStopper stopper)
+ : subprocess_stopper_(stopper) {
+ for (char** env = environ; *env; env++) {
+ env_.emplace_back(*env);
+ }
+ command_.push_back(executable);
}
Command::~Command() {
@@ -175,41 +209,30 @@
}
}
-bool Command::BuildParameter(std::stringstream* stream, SharedFD shared_fd) {
+void Command::BuildParameter(std::stringstream* stream, SharedFD shared_fd) {
int fd;
if (inherited_fds_.count(shared_fd)) {
fd = inherited_fds_[shared_fd];
} else {
fd = shared_fd->Fcntl(F_DUPFD_CLOEXEC, 3);
- if (fd < 0) {
- LOG(ERROR) << "Could not acquire a new file descriptor: " << shared_fd->StrError();
- return false;
- }
+ CHECK(fd >= 0) << "Could not acquire a new file descriptor: "
+ << shared_fd->StrError();
inherited_fds_[shared_fd] = fd;
}
*stream << fd;
- return true;
}
-bool Command::RedirectStdIO(Subprocess::StdIOChannel channel,
+void Command::RedirectStdIO(Subprocess::StdIOChannel channel,
SharedFD shared_fd) {
- if (!shared_fd->IsOpen()) {
- return false;
- }
- if (redirects_.count(channel)) {
- LOG(ERROR) << "Attempted multiple redirections of fd: "
- << static_cast<int>(channel);
- return false;
- }
+ CHECK(shared_fd->IsOpen());
+ CHECK(redirects_.count(channel) == 0)
+ << "Attempted multiple redirections of fd: " << static_cast<int>(channel);
auto dup_fd = shared_fd->Fcntl(F_DUPFD_CLOEXEC, 3);
- if (dup_fd < 0) {
- LOG(ERROR) << "Could not acquire a new file descriptor: " << shared_fd->StrError();
- return false;
- }
+ CHECK(dup_fd >= 0) << "Could not acquire a new file descriptor: "
+ << shared_fd->StrError();
redirects_[channel] = dup_fd;
- return true;
}
-bool Command::RedirectStdIO(Subprocess::StdIOChannel subprocess_channel,
+void Command::RedirectStdIO(Subprocess::StdIOChannel subprocess_channel,
Subprocess::StdIOChannel parent_channel) {
return RedirectStdIO(subprocess_channel,
SharedFD::Dup(static_cast<int>(parent_channel)));
@@ -243,17 +266,9 @@
}
}
int rval;
- // If use_parent_env_ is false, the current process's environment is used as
- // the environment of the child process. To force an empty emvironment for
- // the child process pass the address of a pointer to NULL
- if (use_parent_env_) {
- UnsetEnvironment(unenv_);
- rval = execvp(cmd[0], const_cast<char* const*>(cmd.data()));
- } else {
- auto envp = ToCharPointers(env_);
- rval = execvpe(cmd[0], const_cast<char* const*>(cmd.data()),
- const_cast<char* const*>(envp.data()));
- }
+ auto envp = ToCharPointers(env_);
+ rval = execvpe(cmd[0], const_cast<char* const*>(cmd.data()),
+ const_cast<char* const*>(envp.data()));
// No need for an if: if exec worked it wouldn't have returned
LOG(ERROR) << "exec of " << cmd[0] << " failed (" << strerror(errno)
<< ")";
@@ -276,6 +291,20 @@
return Subprocess(pid, subprocess_stopper_);
}
+std::string Command::AsBashScript(
+ const std::string& redirected_stdio_path) const {
+ CHECK(inherited_fds_.empty())
+ << "Bash wrapper will not have inheritied file descriptors.";
+ CHECK(redirects_.empty()) << "Bash wrapper will not have redirected stdio.";
+
+ std::string contents =
+ "#!/bin/bash\n\n" + android::base::Join(command_, " \\\n");
+ if (!redirected_stdio_path.empty()) {
+ contents += " &> " + AbsolutePath(redirected_stdio_path);
+ }
+ return contents;
+}
+
// A class that waits for threads to exit in its destructor.
class ThreadJoiner {
std::vector<std::thread*> threads_;
@@ -290,8 +319,8 @@
}
};
-int RunWithManagedStdio(Command&& cmd_tmp, const std::string* stdin,
- std::string* stdout, std::string* stderr,
+int RunWithManagedStdio(Command&& cmd_tmp, const std::string* stdin_str,
+ std::string* stdout_str, std::string* stderr_str,
SubprocessOptions options) {
/*
* The order of these declarations is necessary for safety. If the function
@@ -308,60 +337,48 @@
ThreadJoiner thread_joiner({&stdin_thread, &stdout_thread, &stderr_thread});
Command cmd = std::move(cmd_tmp);
bool io_error = false;
- if (stdin != nullptr) {
+ if (stdin_str != nullptr) {
SharedFD pipe_read, pipe_write;
if (!SharedFD::Pipe(&pipe_read, &pipe_write)) {
LOG(ERROR) << "Could not create a pipe to write the stdin of \""
<< cmd.GetShortName() << "\"";
return -1;
}
- if (!cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdIn, pipe_read)) {
- LOG(ERROR) << "Could not set stdout of \"" << cmd.GetShortName()
- << "\", was already set.";
- return -1;
- }
- stdin_thread = std::thread([pipe_write, stdin, &io_error]() {
- int written = WriteAll(pipe_write, *stdin);
+ cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdIn, pipe_read);
+ stdin_thread = std::thread([pipe_write, stdin_str, &io_error]() {
+ int written = WriteAll(pipe_write, *stdin_str);
if (written < 0) {
io_error = true;
LOG(ERROR) << "Error in writing stdin to process";
}
});
}
- if (stdout != nullptr) {
+ if (stdout_str != nullptr) {
SharedFD pipe_read, pipe_write;
if (!SharedFD::Pipe(&pipe_read, &pipe_write)) {
LOG(ERROR) << "Could not create a pipe to read the stdout of \""
<< cmd.GetShortName() << "\"";
return -1;
}
- if (!cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, pipe_write)) {
- LOG(ERROR) << "Could not set stdout of \"" << cmd.GetShortName()
- << "\", was already set.";
- return -1;
- }
- stdout_thread = std::thread([pipe_read, stdout, &io_error]() {
- int read = ReadAll(pipe_read, stdout);
+ cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, pipe_write);
+ stdout_thread = std::thread([pipe_read, stdout_str, &io_error]() {
+ int read = ReadAll(pipe_read, stdout_str);
if (read < 0) {
io_error = true;
LOG(ERROR) << "Error in reading stdout from process";
}
});
}
- if (stderr != nullptr) {
+ if (stderr_str != nullptr) {
SharedFD pipe_read, pipe_write;
if (!SharedFD::Pipe(&pipe_read, &pipe_write)) {
LOG(ERROR) << "Could not create a pipe to read the stderr of \""
<< cmd.GetShortName() << "\"";
return -1;
}
- if (!cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, pipe_write)) {
- LOG(ERROR) << "Could not set stderr of \"" << cmd.GetShortName()
- << "\", was already set.";
- return -1;
- }
- stderr_thread = std::thread([pipe_read, stderr, &io_error]() {
- int read = ReadAll(pipe_read, stderr);
+ cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, pipe_write);
+ stderr_thread = std::thread([pipe_read, stderr_str, &io_error]() {
+ int read = ReadAll(pipe_read, stderr_str);
if (read < 0) {
io_error = true;
LOG(ERROR) << "Error in reading stderr from process";
diff --git a/common/libs/utils/subprocess.h b/common/libs/utils/subprocess.h
index 777a026..b34a1c3 100644
--- a/common/libs/utils/subprocess.h
+++ b/common/libs/utils/subprocess.h
@@ -15,6 +15,9 @@
*/
#pragma once
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+#include <common/libs/fs/shared_fd.h>
#include <sys/types.h>
#include <functional>
@@ -24,17 +27,20 @@
#include <unordered_set>
#include <vector>
-#include <android-base/logging.h>
-
-#include <common/libs/fs/shared_fd.h>
-
namespace cuttlefish {
+
+enum class StopperResult {
+ kStopFailure, /* Failed to stop the subprocess. */
+ kStopCrash, /* Attempted to stop the subprocess cleanly, but that failed. */
+ kStopSuccess, /* The subprocess exited in the expected way. */
+};
+
class Command;
class Subprocess;
class SubprocessOptions;
-using SubprocessStopper = std::function<bool(Subprocess*)>;
+using SubprocessStopper = std::function<StopperResult(Subprocess*)>;
// Kills a process by sending it the SIGKILL signal.
-bool KillSubprocess(Subprocess* subprocess);
+StopperResult KillSubprocess(Subprocess* subprocess);
// Keeps track of a running (sub)process. Allows to wait for its completion.
// It's an error to wait twice for the same subprocess.
@@ -65,7 +71,7 @@
// completion of the command, that's what Wait is for.
bool Started() const { return started_; }
pid_t pid() const { return pid_; }
- bool Stop() { return stopper_(this); }
+ StopperResult Stop() { return stopper_(this); }
private:
// Copy is disabled to avoid waiting twice for the same pid (the first wait
@@ -79,26 +85,26 @@
};
class SubprocessOptions {
- bool verbose_;
- bool exit_with_parent_;
- bool in_group_;
-public:
- SubprocessOptions() : verbose_(true), exit_with_parent_(true) {}
+ public:
+ SubprocessOptions()
+ : verbose_(true), exit_with_parent_(true), in_group_(false) {}
- void Verbose(bool verbose) {
- verbose_ = verbose;
- }
- void ExitWithParent(bool exit_with_parent) {
- exit_with_parent_ = exit_with_parent;
- }
+ SubprocessOptions& Verbose(bool verbose) &;
+ SubprocessOptions Verbose(bool verbose) &&;
+ SubprocessOptions& ExitWithParent(bool exit_with_parent) &;
+ SubprocessOptions ExitWithParent(bool exit_with_parent) &&;
// The subprocess runs as head of its own process group.
- void InGroup(bool in_group) {
- in_group_ = in_group;
- }
+ SubprocessOptions& InGroup(bool in_group) &;
+ SubprocessOptions InGroup(bool in_group) &&;
bool Verbose() const { return verbose_; }
bool ExitWithParent() const { return exit_with_parent_; }
bool InGroup() const { return in_group_; }
+
+ private:
+ bool verbose_;
+ bool exit_with_parent_;
+ bool in_group_;
};
// An executable command. Multiple subprocesses can be started from the same
@@ -108,15 +114,15 @@
private:
template <typename T>
// For every type other than SharedFD (for which there is a specialisation)
- bool BuildParameter(std::stringstream* stream, T t) {
+ void BuildParameter(std::stringstream* stream, T t) {
*stream << t;
- return true;
}
// Special treatment for SharedFD
- bool BuildParameter(std::stringstream* stream, SharedFD shared_fd);
+ void BuildParameter(std::stringstream* stream, SharedFD shared_fd);
template <typename T, typename... Args>
- bool BuildParameter(std::stringstream* stream, T t, Args... args) {
- return BuildParameter(stream, t) && BuildParameter(stream, args...);
+ void BuildParameter(std::stringstream* stream, T t, Args... args) {
+ BuildParameter(stream, t);
+ BuildParameter(stream, args...);
}
public:
@@ -124,10 +130,7 @@
// optional subprocess stopper. When not provided, stopper defaults to sending
// SIGKILL to the subprocess.
Command(const std::string& executable,
- SubprocessStopper stopper = KillSubprocess)
- : subprocess_stopper_(stopper) {
- command_.push_back(executable);
- }
+ SubprocessStopper stopper = KillSubprocess);
Command(Command&&) = default;
// The default copy constructor is unsafe because it would mean multiple
// closing of the inherited file descriptors. If needed it can be implemented
@@ -136,18 +139,40 @@
Command& operator=(const Command&) = delete;
~Command();
+ const std::string& Executable() const { return command_[0]; }
+
+ void SetExecutable(const std::string& executable) {
+ command_[0] = executable;
+ }
+
+ void SetStopper(SubprocessStopper stopper) { subprocess_stopper_ = stopper; }
+
// Specify the environment for the subprocesses to be started. By default
// subprocesses inherit the parent's environment.
void SetEnvironment(const std::vector<std::string>& env) {
- use_parent_env_ = false;
env_ = env;
}
- // Specify environment variables to be unset from the parent's environment
- // for the subprocesses to be started.
- void UnsetFromEnvironment(const std::vector<std::string>& env) {
- use_parent_env_ = true;
- std::copy(env.cbegin(), env.cend(), std::inserter(unenv_, unenv_.end()));
+ void AddEnvironmentVariable(const std::string& env_var,
+ const std::string& value) {
+ return AddEnvironmentVariable(env_var + "=" + value);
+ }
+
+ void AddEnvironmentVariable(const std::string& env_var) {
+ env_.push_back(env_var);
+ }
+
+ // Specify an environment variable to be unset from the parent's
+ // environment for the subprocesses to be started.
+ void UnsetFromEnvironment(const std::string& env_var) {
+ auto it = env_.begin();
+ while (it != env_.end()) {
+ if (android::base::StartsWith(*it, env_var + "=")) {
+ it = env_.erase(it);
+ } else {
+ ++it;
+ }
+ }
}
// Adds a single parameter to the command. All arguments are concatenated into
@@ -156,33 +181,24 @@
// object is destroyed. To add multiple parameters to the command the function
// must be called multiple times, one per parameter.
template <typename... Args>
- bool AddParameter(Args... args) {
+ void AddParameter(Args... args) {
std::stringstream ss;
- if (BuildParameter(&ss, args...)) {
- command_.push_back(ss.str());
- return true;
- }
- return false;
+ BuildParameter(&ss, args...);
+ command_.push_back(ss.str());
}
// Similar to AddParameter, except the args are appended to the last (most
// recently-added) parameter in the command.
template <typename... Args>
- bool AppendToLastParameter(Args... args) {
- if (command_.empty()) {
- LOG(ERROR) << "There is no parameter to append to.";
- return false;
- }
+ void AppendToLastParameter(Args... args) {
+ CHECK(!command_.empty()) << "There is no parameter to append to.";
std::stringstream ss;
- if (BuildParameter(&ss, args...)) {
- command_[command_.size()-1] += ss.str();
- return true;
- }
- return false;
+ BuildParameter(&ss, args...);
+ command_[command_.size() - 1] += ss.str();
}
// Redirects the standard IO of the command.
- bool RedirectStdIO(Subprocess::StdIOChannel channel, SharedFD shared_fd);
- bool RedirectStdIO(Subprocess::StdIOChannel subprocess_channel,
+ void RedirectStdIO(Subprocess::StdIOChannel channel, SharedFD shared_fd);
+ void RedirectStdIO(Subprocess::StdIOChannel subprocess_channel,
Subprocess::StdIOChannel parent_channel);
// Starts execution of the command. This method can be called multiple times,
@@ -195,13 +211,17 @@
return command_[0];
}
+ // Generates the contents for a bash script that can be used to run this
+ // command. Note that this command must not require any file descriptors
+ // or stdio redirects as those would not be available when the bash script
+ // is run.
+ std::string AsBashScript(const std::string& redirected_stdio_path = "") const;
+
private:
std::vector<std::string> command_;
std::map<SharedFD, int> inherited_fds_{};
std::map<Subprocess::StdIOChannel, int> redirects_{};
- bool use_parent_env_ = true;
std::vector<std::string> env_{};
- std::unordered_set<std::string> unenv_{};
SubprocessStopper subprocess_stopper_;
};
diff --git a/common/libs/utils/unix_sockets.cpp b/common/libs/utils/unix_sockets.cpp
new file mode 100644
index 0000000..c275525
--- /dev/null
+++ b/common/libs/utils/unix_sockets.cpp
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "common/libs/utils/unix_sockets.h"
+
+#include <android-base/logging.h>
+#include <android-base/result.h>
+
+#include <numeric>
+#include <vector>
+
+#include "common/libs/fs/shared_fd.h"
+
+using android::base::Error;
+using android::base::Result;
+
+// This would use android::base::ReceiveFileDescriptors, but it silently drops
+// SCM_CREDENTIALS control messages.
+
+namespace cuttlefish {
+
+ControlMessage ControlMessage::FromRaw(const cmsghdr* cmsg) {
+ ControlMessage message;
+ message.data_ =
+ std::vector<char>((char*)cmsg, ((char*)cmsg) + cmsg->cmsg_len);
+ if (message.IsFileDescriptors()) {
+ size_t fdcount =
+ static_cast<size_t>(cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
+ for (int i = 0; i < fdcount; i++) {
+ // Use memcpy as CMSG_DATA may be unaligned
+ int fd = -1;
+ memcpy(&fd, CMSG_DATA(cmsg) + (i * sizeof(int)), sizeof(fd));
+ message.fds_.push_back(fd);
+ }
+ }
+ return message;
+}
+
+Result<ControlMessage> ControlMessage::FromFileDescriptors(
+ const std::vector<SharedFD>& fds) {
+ ControlMessage message;
+ message.data_.resize(CMSG_SPACE(fds.size() * sizeof(int)), 0);
+ message.Raw()->cmsg_len = CMSG_LEN(fds.size() * sizeof(int));
+ message.Raw()->cmsg_level = SOL_SOCKET;
+ message.Raw()->cmsg_type = SCM_RIGHTS;
+ for (int i = 0; i < fds.size(); i++) {
+ int fd_copy = fds[i]->Fcntl(F_DUPFD_CLOEXEC, 3);
+ if (fd_copy < 0) {
+ return Error() << "Failed to duplicate fd: " << fds[i]->StrError();
+ }
+ message.fds_.push_back(fd_copy);
+ // Following the CMSG_DATA spec, use memcpy to avoid alignment issues.
+ memcpy(CMSG_DATA(message.Raw()) + (i * sizeof(int)), &fd_copy, sizeof(int));
+ }
+ return message;
+}
+
+ControlMessage ControlMessage::FromCredentials(const ucred& credentials) {
+ ControlMessage message;
+ message.data_.resize(CMSG_SPACE(sizeof(ucred)), 0);
+ message.Raw()->cmsg_len = CMSG_LEN(sizeof(ucred));
+ message.Raw()->cmsg_level = SOL_SOCKET;
+ message.Raw()->cmsg_type = SCM_CREDENTIALS;
+ // Following the CMSG_DATA spec, use memcpy to avoid alignment issues.
+ memcpy(CMSG_DATA(message.Raw()), &credentials, sizeof(credentials));
+ return message;
+}
+
+ControlMessage::ControlMessage(ControlMessage&& existing) {
+ // Enforce that the old ControlMessage is left empty, so it doesn't try to
+ // close any file descriptors. https://stackoverflow.com/a/17735913
+ data_ = std::move(existing.data_);
+ existing.data_.clear();
+ fds_ = std::move(existing.fds_);
+ existing.fds_.clear();
+}
+
+ControlMessage& ControlMessage::operator=(ControlMessage&& existing) {
+ // Enforce that the old ControlMessage is left empty, so it doesn't try to
+ // close any file descriptors. https://stackoverflow.com/a/17735913
+ data_ = std::move(existing.data_);
+ existing.data_.clear();
+ fds_ = std::move(existing.fds_);
+ existing.fds_.clear();
+ return *this;
+}
+
+ControlMessage::~ControlMessage() {
+ for (const auto& fd : fds_) {
+ if (close(fd) != 0) {
+ PLOG(ERROR) << "Failed to close fd " << fd
+ << ", may have leaked or closed prematurely";
+ }
+ }
+}
+
+cmsghdr* ControlMessage::Raw() {
+ return reinterpret_cast<cmsghdr*>(data_.data());
+}
+
+const cmsghdr* ControlMessage::Raw() const {
+ return reinterpret_cast<const cmsghdr*>(data_.data());
+}
+
+bool ControlMessage::IsCredentials() const {
+ bool right_level = Raw()->cmsg_level == SOL_SOCKET;
+ bool right_type = Raw()->cmsg_type == SCM_CREDENTIALS;
+ bool enough_data = Raw()->cmsg_len >= sizeof(cmsghdr) + sizeof(ucred);
+ return right_level && right_type && enough_data;
+}
+
+Result<ucred> ControlMessage::AsCredentials() const {
+ if (!IsCredentials()) {
+ return Error() << "Control message does not hold a credential";
+ }
+ ucred credentials;
+ memcpy(&credentials, CMSG_DATA(Raw()), sizeof(ucred));
+ return credentials;
+}
+
+bool ControlMessage::IsFileDescriptors() const {
+ bool right_level = Raw()->cmsg_level == SOL_SOCKET;
+ bool right_type = Raw()->cmsg_type == SCM_RIGHTS;
+ return right_level && right_type;
+}
+
+Result<std::vector<SharedFD>> ControlMessage::AsSharedFDs() const {
+ if (!IsFileDescriptors()) {
+ return Error() << "Message does not contain file descriptors";
+ }
+ size_t fdcount =
+ static_cast<size_t>(Raw()->cmsg_len - CMSG_LEN(0)) / sizeof(int);
+ std::vector<SharedFD> shared_fds;
+ for (int i = 0; i < fdcount; i++) {
+ // Use memcpy as CMSG_DATA may be unaligned
+ int fd = -1;
+ memcpy(&fd, CMSG_DATA(Raw()) + (i * sizeof(int)), sizeof(fd));
+ SharedFD shared_fd = SharedFD::Dup(fd);
+ if (!shared_fd->IsOpen()) {
+ return Error() << "Could not dup FD " << fd;
+ }
+ shared_fds.push_back(shared_fd);
+ }
+ return shared_fds;
+}
+
+bool UnixSocketMessage::HasFileDescriptors() {
+ for (const auto& control_message : control) {
+ if (control_message.IsFileDescriptors()) {
+ return true;
+ }
+ }
+ return false;
+}
+Result<std::vector<SharedFD>> UnixSocketMessage::FileDescriptors() {
+ std::vector<SharedFD> fds;
+ for (const auto& control_message : control) {
+ if (control_message.IsFileDescriptors()) {
+ auto additional_fds = control_message.AsSharedFDs();
+ if (!additional_fds.ok()) {
+ return Error() << "Failed to get FDs: " << additional_fds.error();
+ }
+ fds.insert(fds.end(), additional_fds->begin(), additional_fds->end());
+ }
+ }
+ return fds;
+}
+bool UnixSocketMessage::HasCredentials() {
+ for (const auto& control_message : control) {
+ if (control_message.IsCredentials()) {
+ return true;
+ }
+ }
+ return false;
+}
+Result<ucred> UnixSocketMessage::Credentials() {
+ std::vector<ucred> credentials;
+ for (const auto& control_message : control) {
+ if (control_message.IsCredentials()) {
+ auto creds = control_message.AsCredentials();
+ if (!creds.ok()) {
+ return Error() << "Message claims to have credentials but does not: "
+ << creds.error();
+ }
+ credentials.push_back(*creds);
+ }
+ }
+ if (credentials.size() == 0) {
+ return Error() << "No credentials present";
+ } else if (credentials.size() == 1) {
+ return credentials[0];
+ } else {
+ return Error() << "Excepted 1 credential, received " << credentials.size();
+ }
+}
+
+UnixMessageSocket::UnixMessageSocket(SharedFD socket) : socket_(socket) {
+ socklen_t ln = sizeof(max_message_size_);
+ CHECK(socket->GetSockOpt(SOL_SOCKET, SO_SNDBUF, &max_message_size_, &ln) == 0)
+ << "error: can't retrieve socket max message size\n";
+}
+
+Result<void> UnixMessageSocket::EnableCredentials(bool enable) {
+ int flag = enable ? 1 : 0;
+ if (socket_->SetSockOpt(SOL_SOCKET, SO_PASSCRED, &flag, sizeof(flag)) != 0) {
+ return Error() << "Could not set credential status to " << enable << ": "
+ << socket_->StrError();
+ }
+ return {};
+}
+
+Result<void> UnixMessageSocket::WriteMessage(const UnixSocketMessage& message) {
+ auto control_size = 0;
+ for (const auto& control : message.control) {
+ control_size += control.data_.size();
+ }
+ std::vector<char> message_control(control_size, 0);
+ msghdr message_header{};
+ message_header.msg_control = message_control.data();
+ message_header.msg_controllen = message_control.size();
+ auto cmsg = CMSG_FIRSTHDR(&message_header);
+ size_t calculated_control_len = 0;
+ for (const ControlMessage& control : message.control) {
+ if (cmsg == nullptr) {
+ return Error() << "Control messages did not fit in control buffer";
+ }
+ /* size() should match CMSG_SPACE */
+ memcpy(cmsg, control.data_.data(), control.data_.size());
+ calculated_control_len += control.data_.size();
+ cmsg = CMSG_NXTHDR(&message_header, cmsg);
+ }
+
+ iovec message_iovec;
+ message_iovec.iov_base = (void*)message.data.data();
+ message_iovec.iov_len = message.data.size();
+ message_header.msg_name = nullptr;
+ message_header.msg_namelen = 0;
+ message_header.msg_iov = &message_iovec;
+ message_header.msg_iovlen = 1;
+ message_header.msg_flags = 0;
+
+ auto bytes_sent = socket_->SendMsg(&message_header, MSG_NOSIGNAL);
+ if (bytes_sent < 0) {
+ return Error() << "Failed to send message: " << socket_->StrError();
+ } else if (bytes_sent != message.data.size()) {
+ return Error() << "Failed to send entire message. Sent " << bytes_sent
+ << ", excepted to send " << message.data.size();
+ }
+ return {};
+}
+
+Result<UnixSocketMessage> UnixMessageSocket::ReadMessage() {
+ msghdr message_header{};
+ std::vector<char> message_control(max_message_size_, 0);
+ message_header.msg_control = message_control.data();
+ message_header.msg_controllen = message_control.size();
+ std::vector<char> message_data(max_message_size_, 0);
+ iovec message_iovec;
+ message_iovec.iov_base = message_data.data();
+ message_iovec.iov_len = message_data.size();
+ message_header.msg_iov = &message_iovec;
+ message_header.msg_iovlen = 1;
+ message_header.msg_name = nullptr;
+ message_header.msg_namelen = 0;
+ message_header.msg_flags = 0;
+
+ auto bytes_read = socket_->RecvMsg(&message_header, MSG_CMSG_CLOEXEC);
+ if (bytes_read < 0) {
+ return Error() << "Read error: " << socket_->StrError();
+ } else if (message_header.msg_flags & MSG_TRUNC) {
+ return Error() << "Message was truncated on read";
+ } else if (message_header.msg_flags & MSG_CTRUNC) {
+ return Error() << "Message control data was truncated on read";
+ } else if (message_header.msg_flags & MSG_ERRQUEUE) {
+ return Error() << "Error queue error";
+ }
+ UnixSocketMessage managed_message;
+ for (auto cmsg = CMSG_FIRSTHDR(&message_header); cmsg != nullptr;
+ cmsg = CMSG_NXTHDR(&message_header, cmsg)) {
+ managed_message.control.emplace_back(ControlMessage::FromRaw(cmsg));
+ }
+ message_data.resize(bytes_read);
+ managed_message.data = std::move(message_data);
+
+ return managed_message;
+}
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/unix_sockets.h b/common/libs/utils/unix_sockets.h
new file mode 100644
index 0000000..cd6995f
--- /dev/null
+++ b/common/libs/utils/unix_sockets.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <android-base/result.h>
+
+#include <cstdint>
+#include <variant>
+#include <vector>
+
+#include "common/libs/fs/shared_fd.h"
+
+namespace cuttlefish {
+
+class UnixMessageSocket;
+
+struct ControlMessage {
+ public:
+ static ControlMessage FromRaw(const cmsghdr*);
+ static android::base::Result<ControlMessage> FromFileDescriptors(
+ const std::vector<SharedFD>&);
+ static ControlMessage FromCredentials(const ucred&);
+ ControlMessage(const ControlMessage&) = delete;
+ ControlMessage(ControlMessage&&);
+ ~ControlMessage();
+ ControlMessage& operator=(const ControlMessage&) = delete;
+ ControlMessage& operator=(ControlMessage&&);
+
+ const cmsghdr* Raw() const;
+
+ bool IsCredentials() const;
+ android::base::Result<ucred> AsCredentials() const;
+
+ bool IsFileDescriptors() const;
+ android::base::Result<std::vector<SharedFD>> AsSharedFDs() const;
+
+ private:
+ friend class UnixMessageSocket;
+ ControlMessage() = default;
+ cmsghdr* Raw();
+
+ std::vector<char> data_;
+ std::vector<int> fds_;
+};
+
+struct UnixSocketMessage {
+ std::vector<char> data;
+ std::vector<ControlMessage> control;
+
+ bool HasFileDescriptors();
+ android::base::Result<std::vector<SharedFD>> FileDescriptors();
+ bool HasCredentials();
+ android::base::Result<ucred> Credentials();
+};
+
+class UnixMessageSocket {
+ public:
+ UnixMessageSocket(SharedFD);
+ [[nodiscard]] android::base::Result<void> WriteMessage(
+ const UnixSocketMessage&);
+ android::base::Result<UnixSocketMessage> ReadMessage();
+
+ [[nodiscard]] android::base::Result<void> EnableCredentials(bool);
+
+ private:
+ SharedFD socket_;
+ std::uint32_t max_message_size_;
+};
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/unix_sockets_test.cpp b/common/libs/utils/unix_sockets_test.cpp
new file mode 100644
index 0000000..4475064
--- /dev/null
+++ b/common/libs/utils/unix_sockets_test.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "common/libs/utils/unix_sockets.h"
+
+#include <android-base/logging.h>
+#include <android-base/result.h>
+#include <gtest/gtest.h>
+
+#include "common/libs/fs/shared_buf.h"
+#include "common/libs/fs/shared_fd.h"
+
+namespace cuttlefish {
+
+SharedFD CreateMemFDWithData(const std::string& data) {
+ auto memfd = SharedFD::MemfdCreate("");
+ CHECK(WriteAll(memfd, data) == data.size()) << memfd->StrError();
+ CHECK(memfd->LSeek(0, SEEK_SET) == 0);
+ return memfd;
+}
+
+std::string ReadAllFDData(SharedFD fd) {
+ std::string data;
+ CHECK(ReadAll(fd, &data) > 0) << fd->StrError();
+ return data;
+}
+
+TEST(UnixSocketMessage, ExtractFileDescriptors) {
+ auto memfd1 = CreateMemFDWithData("abc");
+ auto memfd2 = CreateMemFDWithData("def");
+
+ UnixSocketMessage message;
+ auto control1 = ControlMessage::FromFileDescriptors({memfd1});
+ ASSERT_TRUE(control1.ok()) << control1.error();
+ message.control.emplace_back(std::move(*control1));
+ auto control2 = ControlMessage::FromFileDescriptors({memfd2});
+ ASSERT_TRUE(control2.ok()) << control2.error();
+ message.control.emplace_back(std::move(*control2));
+
+ ASSERT_TRUE(message.HasFileDescriptors());
+ auto fds = message.FileDescriptors();
+ ASSERT_TRUE(fds.ok());
+ ASSERT_EQ("abc", ReadAllFDData((*fds)[0]));
+ ASSERT_EQ("def", ReadAllFDData((*fds)[1]));
+}
+
+std::pair<UnixMessageSocket, UnixMessageSocket> UnixMessageSocketPair() {
+ SharedFD sock1, sock2;
+ CHECK(SharedFD::SocketPair(AF_UNIX, SOCK_SEQPACKET, 0, &sock1, &sock2));
+ return {UnixMessageSocket(sock1), UnixMessageSocket(sock2)};
+}
+
+TEST(UnixMessageSocket, SendPlainMessage) {
+ auto [writer, reader] = UnixMessageSocketPair();
+ UnixSocketMessage message_in = {{1, 2, 3}, {}};
+ auto write_result = writer.WriteMessage(message_in);
+ ASSERT_TRUE(write_result.ok()) << write_result.error();
+
+ auto message_out = reader.ReadMessage();
+ ASSERT_TRUE(message_out.ok()) << message_out.error();
+ ASSERT_EQ(message_in.data, message_out->data);
+ ASSERT_EQ(0, message_out->control.size());
+}
+
+TEST(UnixMessageSocket, SendFileDescriptor) {
+ auto [writer, reader] = UnixMessageSocketPair();
+
+ UnixSocketMessage message_in = {{4, 5, 6}, {}};
+ auto control_in =
+ ControlMessage::FromFileDescriptors({CreateMemFDWithData("abc")});
+ ASSERT_TRUE(control_in.ok()) << control_in.error();
+ message_in.control.emplace_back(std::move(*control_in));
+ auto write_result = writer.WriteMessage(message_in);
+ ASSERT_TRUE(write_result.ok()) << write_result.error();
+
+ auto message_out = reader.ReadMessage();
+ ASSERT_TRUE(message_out.ok()) << message_out.error();
+ ASSERT_EQ(message_in.data, message_out->data);
+
+ ASSERT_EQ(1, message_out->control.size());
+ auto fds_out = message_out->control[0].AsSharedFDs();
+ ASSERT_TRUE(fds_out.ok()) << fds_out.error();
+ ASSERT_EQ(1, fds_out->size());
+ ASSERT_EQ("abc", ReadAllFDData((*fds_out)[0]));
+}
+
+TEST(UnixMessageSocket, SendTwoFileDescriptors) {
+ auto memfd1 = CreateMemFDWithData("abc");
+ auto memfd2 = CreateMemFDWithData("def");
+
+ auto [writer, reader] = UnixMessageSocketPair();
+ UnixSocketMessage message_in = {{7, 8, 9}, {}};
+ auto control_in = ControlMessage::FromFileDescriptors({memfd1, memfd2});
+ ASSERT_TRUE(control_in.ok()) << control_in.error();
+ message_in.control.emplace_back(std::move(*control_in));
+ auto write_result = writer.WriteMessage(message_in);
+ ASSERT_TRUE(write_result.ok()) << write_result.error();
+
+ auto message_out = reader.ReadMessage();
+ ASSERT_TRUE(message_out.ok()) << message_out.error();
+ ASSERT_EQ(message_in.data, message_out->data);
+
+ ASSERT_EQ(1, message_out->control.size());
+ auto fds_out = message_out->control[0].AsSharedFDs();
+ ASSERT_TRUE(fds_out.ok()) << fds_out.error();
+ ASSERT_EQ(2, fds_out->size());
+
+ ASSERT_EQ("abc", ReadAllFDData((*fds_out)[0]));
+ ASSERT_EQ("def", ReadAllFDData((*fds_out)[1]));
+}
+
+TEST(UnixMessageSocket, SendCredentials) {
+ auto [writer, reader] = UnixMessageSocketPair();
+ auto writer_creds_status = writer.EnableCredentials(true);
+ ASSERT_TRUE(writer_creds_status.ok()) << writer_creds_status.error();
+ auto reader_creds_status = reader.EnableCredentials(true);
+ ASSERT_TRUE(reader_creds_status.ok()) << reader_creds_status.error();
+
+ ucred credentials_in;
+ credentials_in.pid = getpid();
+ credentials_in.uid = getuid();
+ credentials_in.gid = getgid();
+ UnixSocketMessage message_in = {{1, 5, 9}, {}};
+ auto control_in = ControlMessage::FromCredentials(credentials_in);
+ message_in.control.emplace_back(std::move(control_in));
+ auto write_result = writer.WriteMessage(message_in);
+ ASSERT_TRUE(write_result.ok()) << write_result.error();
+
+ auto message_out = reader.ReadMessage();
+ ASSERT_TRUE(message_out.ok()) << message_out.error();
+ ASSERT_EQ(message_in.data, message_out->data);
+
+ ASSERT_EQ(1, message_out->control.size());
+ auto credentials_out = message_out->control[0].AsCredentials();
+ ASSERT_TRUE(credentials_out.ok()) << credentials_out.error();
+ ASSERT_EQ(credentials_in.pid, credentials_out->pid);
+ ASSERT_EQ(credentials_in.uid, credentials_out->uid);
+ ASSERT_EQ(credentials_in.gid, credentials_out->gid);
+}
+
+TEST(UnixMessageSocket, BadCredentialsBlocked) {
+ auto [writer, reader] = UnixMessageSocketPair();
+ auto writer_creds_status = writer.EnableCredentials(true);
+ ASSERT_TRUE(writer_creds_status.ok()) << writer_creds_status.error();
+ auto reader_creds_status = reader.EnableCredentials(true);
+ ASSERT_TRUE(reader_creds_status.ok()) << reader_creds_status.error();
+
+ ucred credentials_in;
+ // This assumes the test is running without root privileges
+ credentials_in.pid = getpid() + 1;
+ credentials_in.uid = getuid() + 1;
+ credentials_in.gid = getgid() + 1;
+
+ UnixSocketMessage message_in = {{2, 4, 6}, {}};
+ auto control_in = ControlMessage::FromCredentials(credentials_in);
+ message_in.control.emplace_back(std::move(control_in));
+ auto write_result = writer.WriteMessage(message_in);
+ ASSERT_FALSE(write_result.ok()) << write_result.error();
+}
+
+TEST(UnixMessageSocket, AutoCredentials) {
+ auto [writer, reader] = UnixMessageSocketPair();
+ auto writer_creds_status = writer.EnableCredentials(true);
+ ASSERT_TRUE(writer_creds_status.ok()) << writer_creds_status.error();
+ auto reader_creds_status = reader.EnableCredentials(true);
+ ASSERT_TRUE(reader_creds_status.ok()) << reader_creds_status.error();
+
+ UnixSocketMessage message_in = {{3, 6, 9}, {}};
+ auto write_result = writer.WriteMessage(message_in);
+ ASSERT_TRUE(write_result.ok()) << write_result.error();
+
+ auto message_out = reader.ReadMessage();
+ ASSERT_TRUE(message_out.ok()) << message_out.error();
+ ASSERT_EQ(message_in.data, message_out->data);
+
+ ASSERT_EQ(1, message_out->control.size());
+ auto credentials_out = message_out->control[0].AsCredentials();
+ ASSERT_TRUE(credentials_out.ok()) << credentials_out.error();
+ ASSERT_EQ(getpid(), credentials_out->pid);
+ ASSERT_EQ(getuid(), credentials_out->uid);
+ ASSERT_EQ(getgid(), credentials_out->gid);
+}
+
+} // namespace cuttlefish
diff --git a/guest/commands/bt_vhci_forwarder/bt_vhci_forwarder.rc b/guest/commands/bt_vhci_forwarder/bt_vhci_forwarder.rc
new file mode 100644
index 0000000..8b7fb36
--- /dev/null
+++ b/guest/commands/bt_vhci_forwarder/bt_vhci_forwarder.rc
@@ -0,0 +1,7 @@
+on post-fs
+ start bt_vhci_forwarder
+
+service bt_vhci_forwarder /vendor/bin/bt_vhci_forwarder -virtio_console_dev=${vendor.ser.bt-uart}
+ user bluetooth
+ group bluetooth
+
diff --git a/host/commands/mk_cdisk/Android.bp b/guest/commands/dlkm_loader/Android.bp
similarity index 72%
copy from host/commands/mk_cdisk/Android.bp
copy to guest/commands/dlkm_loader/Android.bp
index a0cf8ba..ae91c02 100644
--- a/host/commands/mk_cdisk/Android.bp
+++ b/guest/commands/dlkm_loader/Android.bp
@@ -18,24 +18,16 @@
}
cc_binary {
- name: "mk_cdisk",
+ name: "dlkm_loader",
srcs: [
- "mk_cdisk.cc",
- ],
- shared_libs: [
- "libcuttlefish_fs",
- "libcuttlefish_utils",
- "libbase",
- "libjsoncpp",
- "liblog",
- "libz",
+ "dlkm_loader.cpp",
],
static_libs: [
- "libcdisk_spec",
- "libext2_uuid",
- "libimage_aggregator",
- "libprotobuf-cpp-lite",
- "libsparse",
+ "libbase",
+ "libmodprobe",
],
- defaults: ["cuttlefish_host"],
+ shared_libs: [
+ "liblog",
+ ],
+ defaults: ["cuttlefish_guest_only"]
}
diff --git a/guest/commands/dlkm_loader/dlkm_loader.cpp b/guest/commands/dlkm_loader/dlkm_loader.cpp
new file mode 100644
index 0000000..0d22225
--- /dev/null
+++ b/guest/commands/dlkm_loader/dlkm_loader.cpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <modprobe/modprobe.h>
+
+int main(void) {
+ LOG(INFO) << "dlkm loader successfully initialized";
+ Modprobe m({"/vendor/lib/modules"}, "modules.load");
+ CHECK(m.LoadListedModules(true)) << "modules from vendor dlkm weren't loaded correctly";
+ LOG(INFO) << "module load count is " << m.GetModuleCount();
+ return 0;
+}
diff --git a/guest/commands/rename_netiface/Android.bp b/guest/commands/rename_netiface/Android.bp
index f7b71be..3cf4225 100644
--- a/guest/commands/rename_netiface/Android.bp
+++ b/guest/commands/rename_netiface/Android.bp
@@ -23,6 +23,7 @@
srcs: [
"main.cpp",
],
+ init_rc: ["rename_netiface.rc"],
shared_libs: [
"cuttlefish_net",
],
diff --git a/guest/commands/rename_netiface/rename_netiface.rc b/guest/commands/rename_netiface/rename_netiface.rc
new file mode 100644
index 0000000..bd82a39
--- /dev/null
+++ b/guest/commands/rename_netiface/rename_netiface.rc
@@ -0,0 +1,2 @@
+service rename_eth0 /vendor/bin/rename_netiface eth0 rmnet0
+ oneshot
diff --git a/guest/commands/setup_wifi/Android.bp b/guest/commands/setup_wifi/Android.bp
index 21472b1..e7a85bb 100644
--- a/guest/commands/setup_wifi/Android.bp
+++ b/guest/commands/setup_wifi/Android.bp
@@ -23,6 +23,7 @@
srcs: [
"main.cpp",
],
+ init_rc: ["setup_wifi.rc"],
shared_libs: [
"cuttlefish_net",
"libbase",
diff --git a/guest/commands/setup_wifi/main.cpp b/guest/commands/setup_wifi/main.cpp
index 032f39e..4a91442 100644
--- a/guest/commands/setup_wifi/main.cpp
+++ b/guest/commands/setup_wifi/main.cpp
@@ -32,17 +32,15 @@
#include "common/libs/net/network_interface.h"
#include "common/libs/net/network_interface_manager.h"
-DEFINE_string(mac_address, "", "mac address to use for wlan0");
+DEFINE_string(mac_prefix, "", "mac prefix to use for wlan0");
-static std::array<unsigned char, 6> str_to_mac(const std::string& mac_str) {
+static std::array<unsigned char, 6> prefix_to_mac(
+ const std::string& mac_prefix) {
std::array<unsigned char, 6> mac;
- std::istringstream stream(mac_str);
- for (int i = 0; i < 6; i++) {
- int num;
- stream >> std::hex >> num;
- mac[i] = num;
- stream.get();
- }
+ int macPrefix = stoi(mac_prefix);
+ mac[0] = 0x02;
+ mac[1] = (macPrefix >> CHAR_BIT) & 0xFF;
+ mac[2] = macPrefix & 0xFF;
return mac;
}
@@ -51,7 +49,8 @@
auto factory = cuttlefish::NetlinkClientFactory::Default();
std::unique_ptr<cuttlefish::NetlinkClient> nl(factory->New(NETLINK_ROUTE));
- LOG(INFO) << "Setting " << source << " mac address to " << FLAGS_mac_address;
+ LOG(INFO) << "Setting " << source << " mac address based on "
+ << FLAGS_mac_prefix;
int32_t index = if_nametoindex(source.c_str());
// Setting the address is available in RTM_SETLINK, but not RTM_NEWLINK.
// https://elixir.bootlin.com/linux/v5.4.44/source/net/core/rtnetlink.c#L2785
@@ -64,7 +63,7 @@
.ifi_index = index,
.ifi_change = 0xFFFFFFFF,
});
- fix_mac_request.AddMacAddress(str_to_mac(FLAGS_mac_address));
+ fix_mac_request.AddMacAddress(prefix_to_mac(FLAGS_mac_prefix));
bool fix_mac = nl->Send(fix_mac_request);
if (!fix_mac) {
LOG(ERROR) << "setup_network: could not fix mac address";
@@ -131,10 +130,10 @@
}
int main(int argc, char** argv) {
- char wifi_address[PROPERTY_VALUE_MAX + 1];
- property_get("ro.boot.wifi_mac_address", wifi_address, "");
+ char wifi_mac_prefix[PROPERTY_VALUE_MAX + 1];
+ property_get("ro.boot.wifi_mac_prefix", wifi_mac_prefix, "");
- SetCommandLineOptionWithMode("mac_address", wifi_address,
+ SetCommandLineOptionWithMode("mac_prefix", wifi_mac_prefix,
google::FlagSettingMode::SET_FLAGS_DEFAULT);
gflags::ParseCommandLineFlags(&argc, &argv, true);
diff --git a/guest/commands/setup_wifi/setup_wifi.rc b/guest/commands/setup_wifi/setup_wifi.rc
new file mode 100644
index 0000000..a2f1eb5
--- /dev/null
+++ b/guest/commands/setup_wifi/setup_wifi.rc
@@ -0,0 +1,2 @@
+service setup_wifi /vendor/bin/setup_wifi
+ oneshot
diff --git a/guest/hals/audio/audio_hw.c b/guest/hals/audio/audio_hw.c
deleted file mode 100644
index c0c705a..0000000
--- a/guest/hals/audio/audio_hw.c
+++ /dev/null
@@ -1,1854 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This code was forked from device/generic/goldfish/audio/audio_hw.c
- *
- * At the time of forking, the code was identical except that a fallback
- * to a legacy HAL which does not use ALSA was removed, and the dependency
- * on libdl was also removed.
- */
-
-#define LOG_TAG "audio_hw_generic"
-
-#include <assert.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <pthread.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include <dlfcn.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <log/log.h>
-#include <cutils/list.h>
-#include <cutils/str_parms.h>
-
-#include <hardware/hardware.h>
-#include <system/audio.h>
-#include <hardware/audio.h>
-#include <tinyalsa/asoundlib.h>
-
-#define PCM_CARD 0
-#define PCM_DEVICE 0
-
-#define OUT_PERIOD_MS 10
-#define OUT_PERIOD_COUNT 4
-
-#define IN_PERIOD_MS 10
-#define IN_PERIOD_COUNT 4
-
-struct generic_audio_device {
- struct audio_hw_device device; // Constant after init
- pthread_mutex_t lock;
- bool mic_mute; // Protected by this->lock
- struct mixer* mixer; // Protected by this->lock
- struct listnode out_streams; // Record for output streams, protected by this->lock
- struct listnode in_streams; // Record for input streams, protected by this->lock
- audio_patch_handle_t next_patch_handle; // Protected by this->lock
-};
-
-/* If not NULL, this is a pointer to the fallback module.
- * This really is the original goldfish audio device /dev/eac which we will use
- * if no alsa devices are detected.
- */
-static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state);
-static int adev_get_microphones(const audio_hw_device_t *dev,
- struct audio_microphone_characteristic_t *mic_array,
- size_t *mic_count);
-
-
-typedef struct audio_vbuffer {
- pthread_mutex_t lock;
- uint8_t * data;
- size_t frame_size;
- size_t frame_count;
- size_t head;
- size_t tail;
- size_t live;
-} audio_vbuffer_t;
-
-static int audio_vbuffer_init (audio_vbuffer_t * audio_vbuffer, size_t frame_count,
- size_t frame_size) {
- if (!audio_vbuffer) {
- return -EINVAL;
- }
- audio_vbuffer->frame_size = frame_size;
- audio_vbuffer->frame_count = frame_count;
- size_t bytes = frame_count * frame_size;
- audio_vbuffer->data = calloc(bytes, 1);
- if (!audio_vbuffer->data) {
- return -ENOMEM;
- }
- audio_vbuffer->head = 0;
- audio_vbuffer->tail = 0;
- audio_vbuffer->live = 0;
- pthread_mutex_init (&audio_vbuffer->lock, (const pthread_mutexattr_t *) NULL);
- return 0;
-}
-
-static int audio_vbuffer_destroy (audio_vbuffer_t * audio_vbuffer) {
- if (!audio_vbuffer) {
- return -EINVAL;
- }
- free(audio_vbuffer->data);
- pthread_mutex_destroy(&audio_vbuffer->lock);
- return 0;
-}
-
-static int audio_vbuffer_live (audio_vbuffer_t * audio_vbuffer) {
- if (!audio_vbuffer) {
- return -EINVAL;
- }
- pthread_mutex_lock (&audio_vbuffer->lock);
- int live = audio_vbuffer->live;
- pthread_mutex_unlock (&audio_vbuffer->lock);
- return live;
-}
-
-#define MIN(a,b) (((a)<(b))?(a):(b))
-static size_t audio_vbuffer_write (audio_vbuffer_t * audio_vbuffer, const void * buffer, size_t frame_count) {
- size_t frames_written = 0;
- pthread_mutex_lock (&audio_vbuffer->lock);
-
- while (frame_count != 0) {
- int frames = 0;
- if (audio_vbuffer->live == 0 || audio_vbuffer->head > audio_vbuffer->tail) {
- frames = MIN(frame_count, audio_vbuffer->frame_count - audio_vbuffer->head);
- } else if (audio_vbuffer->head < audio_vbuffer->tail) {
- frames = MIN(frame_count, audio_vbuffer->tail - (audio_vbuffer->head));
- } else {
- // Full
- break;
- }
- memcpy(&audio_vbuffer->data[audio_vbuffer->head*audio_vbuffer->frame_size],
- &((uint8_t*)buffer)[frames_written*audio_vbuffer->frame_size],
- frames*audio_vbuffer->frame_size);
- audio_vbuffer->live += frames;
- frames_written += frames;
- frame_count -= frames;
- audio_vbuffer->head = (audio_vbuffer->head + frames) % audio_vbuffer->frame_count;
- }
-
- pthread_mutex_unlock (&audio_vbuffer->lock);
- return frames_written;
-}
-
-static size_t audio_vbuffer_read (audio_vbuffer_t * audio_vbuffer, void * buffer, size_t frame_count) {
- size_t frames_read = 0;
- pthread_mutex_lock (&audio_vbuffer->lock);
-
- while (frame_count != 0) {
- int frames = 0;
- if (audio_vbuffer->live == audio_vbuffer->frame_count ||
- audio_vbuffer->tail > audio_vbuffer->head) {
- frames = MIN(frame_count, audio_vbuffer->frame_count - audio_vbuffer->tail);
- } else if (audio_vbuffer->tail < audio_vbuffer->head) {
- frames = MIN(frame_count, audio_vbuffer->head - audio_vbuffer->tail);
- } else {
- break;
- }
- memcpy(&((uint8_t*)buffer)[frames_read*audio_vbuffer->frame_size],
- &audio_vbuffer->data[audio_vbuffer->tail*audio_vbuffer->frame_size],
- frames*audio_vbuffer->frame_size);
- audio_vbuffer->live -= frames;
- frames_read += frames;
- frame_count -= frames;
- audio_vbuffer->tail = (audio_vbuffer->tail + frames) % audio_vbuffer->frame_count;
- }
-
- pthread_mutex_unlock (&audio_vbuffer->lock);
- return frames_read;
-}
-
-struct generic_stream_out {
- struct audio_stream_out stream; // Constant after init
- pthread_mutex_t lock;
- struct generic_audio_device *dev; // Constant after init
- uint32_t num_devices; // Protected by this->lock
- audio_devices_t devices[AUDIO_PATCH_PORTS_MAX]; // Protected by this->lock
- struct audio_config req_config; // Constant after init
- struct pcm_config pcm_config; // Constant after init
- audio_vbuffer_t buffer; // Constant after init
-
- // Time & Position Keeping
- bool standby; // Protected by this->lock
- uint64_t underrun_position; // Protected by this->lock
- struct timespec underrun_time; // Protected by this->lock
- uint64_t last_write_time_us; // Protected by this->lock
- uint64_t frames_total_buffered; // Protected by this->lock
- uint64_t frames_written; // Protected by this->lock
- uint64_t frames_rendered; // Protected by this->lock
-
- // Worker
- pthread_t worker_thread; // Constant after init
- pthread_cond_t worker_wake; // Protected by this->lock
- bool worker_standby; // Protected by this->lock
- bool worker_exit; // Protected by this->lock
-
- audio_io_handle_t handle; // Constant after init
- audio_patch_handle_t patch_handle; // Protected by this->dev->lock
-
- struct listnode stream_node; // Protected by this->dev->lock
-};
-
-struct generic_stream_in {
- struct audio_stream_in stream; // Constant after init
- pthread_mutex_t lock;
- struct generic_audio_device *dev; // Constant after init
- audio_devices_t device; // Protected by this->lock
- struct audio_config req_config; // Constant after init
- struct pcm *pcm; // Protected by this->lock
- struct pcm_config pcm_config; // Constant after init
- int16_t *stereo_to_mono_buf; // Protected by this->lock
- size_t stereo_to_mono_buf_size; // Protected by this->lock
- audio_vbuffer_t buffer; // Protected by this->lock
-
- // Time & Position Keeping
- bool standby; // Protected by this->lock
- int64_t standby_position; // Protected by this->lock
- struct timespec standby_exit_time;// Protected by this->lock
- int64_t standby_frames_read; // Protected by this->lock
-
- // Worker
- pthread_t worker_thread; // Constant after init
- pthread_cond_t worker_wake; // Protected by this->lock
- bool worker_standby; // Protected by this->lock
- bool worker_exit; // Protected by this->lock
-
- audio_io_handle_t handle; // Constant after init
- audio_patch_handle_t patch_handle; // Protected by this->dev->lock
-
- struct listnode stream_node; // Protected by this->dev->lock
-};
-
-static struct pcm_config pcm_config_out = {
- .channels = 2,
- .rate = 0,
- .period_size = 0,
- .period_count = OUT_PERIOD_COUNT,
- .format = PCM_FORMAT_S16_LE,
- .start_threshold = 0,
-};
-
-static struct pcm_config pcm_config_in = {
- .channels = 2,
- .rate = 0,
- .period_size = 0,
- .period_count = IN_PERIOD_COUNT,
- .format = PCM_FORMAT_S16_LE,
- .start_threshold = 0,
- .stop_threshold = INT_MAX,
-};
-
-static pthread_mutex_t adev_init_lock = PTHREAD_MUTEX_INITIALIZER;
-static unsigned int audio_device_ref_count = 0;
-
-static uint32_t out_get_sample_rate(const struct audio_stream *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- return out->req_config.sample_rate;
-}
-
-static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
-{
- return -ENOSYS;
-}
-
-static size_t out_get_buffer_size(const struct audio_stream *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- int size = out->pcm_config.period_size *
- audio_stream_out_frame_size(&out->stream);
-
- return size;
-}
-
-static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- return out->req_config.channel_mask;
-}
-
-static audio_format_t out_get_format(const struct audio_stream *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
-
- return out->req_config.format;
-}
-
-static int out_set_format(struct audio_stream *stream, audio_format_t format)
-{
- return -ENOSYS;
-}
-
-static int out_dump(const struct audio_stream *stream, int fd)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- pthread_mutex_lock(&out->lock);
- dprintf(fd, "\tout_dump:\n"
- "\t\tsample rate: %u\n"
- "\t\tbuffer size: %zu\n"
- "\t\tchannel mask: %08x\n"
- "\t\tformat: %d\n"
- "\t\tdevice(s): ",
- out_get_sample_rate(stream),
- out_get_buffer_size(stream),
- out_get_channels(stream),
- out_get_format(stream));
- if (out->num_devices == 0) {
- dprintf(fd, "%08x\n", AUDIO_DEVICE_NONE);
- } else {
- for (uint32_t i = 0; i < out->num_devices; i++) {
- if (i != 0) {
- dprintf(fd, ", ");
- }
- dprintf(fd, "%08x", out->devices[i]);
- }
- dprintf(fd, "\n");
- }
- dprintf(fd, "\t\taudio dev: %p\n\n", out->dev);
- pthread_mutex_unlock(&out->lock);
- return 0;
-}
-
-static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
-{
- struct str_parms *parms;
- char value[32];
- int success;
- int ret = -EINVAL;
-
- if (kvpairs == NULL || kvpairs[0] == 0) {
- return 0;
- }
- parms = str_parms_create_str(kvpairs);
- success = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
- value, sizeof(value));
- // As the hal version is 3.0, it must not use set parameters API to set audio devices.
- // Instead, it should use create_audio_patch API.
- assert(("Must not use set parameters API to set audio devices", success < 0));
-
- if (str_parms_has_key(parms, AUDIO_PARAMETER_STREAM_FORMAT)) {
- // match the return value of out_set_format
- ret = -ENOSYS;
- }
-
- str_parms_destroy(parms);
-
- if (ret == -EINVAL) {
- ALOGW("%s(), unsupported parameter %s", __func__, kvpairs);
- // There is not any key supported for set_parameters API.
- // Return error when there is non-null value passed in.
- }
- return ret;
-}
-
-static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- struct str_parms *query = str_parms_create_str(keys);
- char *str = NULL;
- char value[256];
- struct str_parms *reply = str_parms_create();
- int ret;
- bool get = false;
-
- ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
- if (ret >= 0) {
- pthread_mutex_lock(&out->lock);
- audio_devices_t device = AUDIO_DEVICE_NONE;
- for (uint32_t i = 0; i < out->num_devices; i++) {
- device |= out->devices[i];
- }
- str_parms_add_int(reply, AUDIO_PARAMETER_STREAM_ROUTING, device);
- pthread_mutex_unlock(&out->lock);
- get = true;
- }
-
- if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_FORMATS)) {
- value[0] = 0;
- strcat(value, "AUDIO_FORMAT_PCM_16_BIT");
- str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_FORMATS, value);
- get = true;
- }
-
- if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_FORMAT)) {
- value[0] = 0;
- strcat(value, "AUDIO_FORMAT_PCM_16_BIT");
- str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_FORMAT, value);
- get = true;
- }
-
- if (get) {
- str = str_parms_to_str(reply);
- }
- else {
- ALOGD("%s Unsupported paramter: %s", __FUNCTION__, keys);
- }
-
- str_parms_destroy(query);
- str_parms_destroy(reply);
- return str;
-}
-
-static uint32_t out_get_latency(const struct audio_stream_out *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- return (out->pcm_config.period_size * 1000) / out->pcm_config.rate;
-}
-
-static int out_set_volume(struct audio_stream_out *stream, float left,
- float right)
-{
- return -ENOSYS;
-}
-
-static void *out_write_worker(void * args)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)args;
- struct pcm *pcm = NULL;
- uint8_t *buffer = NULL;
- int buffer_frames;
- int buffer_size;
- bool restart = false;
- bool shutdown = false;
- while (true) {
- pthread_mutex_lock(&out->lock);
- while (out->worker_standby || restart) {
- restart = false;
- if (pcm) {
- pcm_close(pcm); // Frees pcm
- pcm = NULL;
- free(buffer);
- buffer=NULL;
- }
- if (out->worker_exit) {
- break;
- }
- pthread_cond_wait(&out->worker_wake, &out->lock);
- }
-
- if (out->worker_exit) {
- if (!out->worker_standby) {
- ALOGE("Out worker not in standby before exiting");
- }
- shutdown = true;
- }
-
- while (!shutdown && audio_vbuffer_live(&out->buffer) == 0) {
- pthread_cond_wait(&out->worker_wake, &out->lock);
- }
-
- if (shutdown) {
- pthread_mutex_unlock(&out->lock);
- break;
- }
-
- if (!pcm) {
- pcm = pcm_open(PCM_CARD, PCM_DEVICE,
- PCM_OUT | PCM_MONOTONIC, &out->pcm_config);
- if (!pcm_is_ready(pcm)) {
- ALOGE("pcm_open(out) failed: %s: channels %d format %d rate %d",
- pcm_get_error(pcm),
- out->pcm_config.channels,
- out->pcm_config.format,
- out->pcm_config.rate
- );
- pthread_mutex_unlock(&out->lock);
- break;
- }
- buffer_frames = out->pcm_config.period_size;
- buffer_size = pcm_frames_to_bytes(pcm, buffer_frames);
- buffer = malloc(buffer_size);
- if (!buffer) {
- ALOGE("could not allocate write buffer");
- pthread_mutex_unlock(&out->lock);
- break;
- }
- }
- int frames = audio_vbuffer_read(&out->buffer, buffer, buffer_frames);
- pthread_mutex_unlock(&out->lock);
- int ret = pcm_write(pcm, buffer, pcm_frames_to_bytes(pcm, frames));
- if (ret != 0) {
- ALOGE("pcm_write failed %s", pcm_get_error(pcm));
- restart = true;
- }
- }
- if (buffer) {
- free(buffer);
- }
-
- return NULL;
-}
-
-// Call with in->lock held
-static void get_current_output_position(struct generic_stream_out *out,
- uint64_t * position,
- struct timespec * timestamp) {
- struct timespec curtime = { .tv_sec = 0, .tv_nsec = 0 };
- clock_gettime(CLOCK_MONOTONIC, &curtime);
- const int64_t now_us = (curtime.tv_sec * 1000000000LL + curtime.tv_nsec) / 1000;
- if (timestamp) {
- *timestamp = curtime;
- }
- int64_t position_since_underrun;
- if (out->standby) {
- position_since_underrun = 0;
- } else {
- const int64_t first_us = (out->underrun_time.tv_sec * 1000000000LL +
- out->underrun_time.tv_nsec) / 1000;
- position_since_underrun = (now_us - first_us) *
- out_get_sample_rate(&out->stream.common) /
- 1000000;
- if (position_since_underrun < 0) {
- position_since_underrun = 0;
- }
- }
- *position = out->underrun_position + position_since_underrun;
-
- // The device will reuse the same output stream leading to periods of
- // underrun.
- if (*position > out->frames_written) {
- ALOGW("Not supplying enough data to HAL, expected position %" PRIu64 " , only wrote "
- "%" PRIu64,
- *position, out->frames_written);
-
- *position = out->frames_written;
- out->underrun_position = *position;
- out->underrun_time = curtime;
- out->frames_total_buffered = 0;
- }
-}
-
-
-static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
- size_t bytes)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- const size_t frames = bytes / audio_stream_out_frame_size(stream);
-
- pthread_mutex_lock(&out->lock);
-
- if (out->worker_standby) {
- out->worker_standby = false;
- }
-
- uint64_t current_position;
- struct timespec current_time;
-
- get_current_output_position(out, ¤t_position, ¤t_time);
- const uint64_t now_us = (current_time.tv_sec * 1000000000LL +
- current_time.tv_nsec) / 1000;
- if (out->standby) {
- out->standby = false;
- out->underrun_time = current_time;
- out->frames_rendered = 0;
- out->frames_total_buffered = 0;
- }
-
- size_t frames_written = audio_vbuffer_write(&out->buffer, buffer, frames);
- pthread_cond_signal(&out->worker_wake);
-
- /* Implementation just consumes bytes if we start getting backed up */
- out->frames_written += frames;
- out->frames_rendered += frames;
- out->frames_total_buffered += frames;
-
- // We simulate the audio device blocking when it's write buffers become
- // full.
-
- // At the beginning or after an underrun, try to fill up the vbuffer.
- // This will be throttled by the PlaybackThread
- int frames_sleep = out->frames_total_buffered < out->buffer.frame_count ? 0 : frames;
-
- uint64_t sleep_time_us = frames_sleep * 1000000LL /
- out_get_sample_rate(&stream->common);
-
- // If the write calls are delayed, subtract time off of the sleep to
- // compensate
- uint64_t time_since_last_write_us = now_us - out->last_write_time_us;
- if (time_since_last_write_us < sleep_time_us) {
- sleep_time_us -= time_since_last_write_us;
- } else {
- sleep_time_us = 0;
- }
- out->last_write_time_us = now_us + sleep_time_us;
-
- pthread_mutex_unlock(&out->lock);
-
- if (sleep_time_us > 0) {
- usleep(sleep_time_us);
- }
-
- if (frames_written < frames) {
- ALOGW("Hardware backing HAL too slow, could only write %zu of %zu frames", frames_written, frames);
- }
-
- /* Always consume all bytes */
- return bytes;
-}
-
-static int out_get_presentation_position(const struct audio_stream_out *stream,
- uint64_t *frames, struct timespec *timestamp)
-
-{
- if (stream == NULL || frames == NULL || timestamp == NULL) {
- return -EINVAL;
- }
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
-
- pthread_mutex_lock(&out->lock);
- get_current_output_position(out, frames, timestamp);
- pthread_mutex_unlock(&out->lock);
-
- return 0;
-}
-
-static int out_get_render_position(const struct audio_stream_out *stream,
- uint32_t *dsp_frames)
-{
- if (stream == NULL || dsp_frames == NULL) {
- return -EINVAL;
- }
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- pthread_mutex_lock(&out->lock);
- *dsp_frames = out->frames_rendered;
- pthread_mutex_unlock(&out->lock);
- return 0;
-}
-
-// Must be called with out->lock held
-static void do_out_standby(struct generic_stream_out *out)
-{
- int frames_sleep = 0;
- uint64_t sleep_time_us = 0;
- if (out->standby) {
- return;
- }
- while (true) {
- get_current_output_position(out, &out->underrun_position, NULL);
- frames_sleep = out->frames_written - out->underrun_position;
-
- if (frames_sleep == 0) {
- break;
- }
-
- sleep_time_us = frames_sleep * 1000000LL /
- out_get_sample_rate(&out->stream.common);
-
- pthread_mutex_unlock(&out->lock);
- usleep(sleep_time_us);
- pthread_mutex_lock(&out->lock);
- }
- out->worker_standby = true;
- out->standby = true;
-}
-
-static int out_standby(struct audio_stream *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- pthread_mutex_lock(&out->lock);
- do_out_standby(out);
- pthread_mutex_unlock(&out->lock);
- return 0;
-}
-
-static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
-{
- // out_add_audio_effect is a no op
- return 0;
-}
-
-static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
-{
- // out_remove_audio_effect is a no op
- return 0;
-}
-
-static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
- int64_t *timestamp)
-{
- return -ENOSYS;
-}
-
-static uint32_t in_get_sample_rate(const struct audio_stream *stream)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- return in->req_config.sample_rate;
-}
-
-static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
-{
- return -ENOSYS;
-}
-
-static int refine_output_parameters(uint32_t *sample_rate, audio_format_t *format, audio_channel_mask_t *channel_mask)
-{
- static const uint32_t sample_rates [] = {8000,11025,16000,22050,24000,32000,
- 44100,48000};
- static const int sample_rates_count = sizeof(sample_rates)/sizeof(uint32_t);
- bool inval = false;
- if (*format != AUDIO_FORMAT_PCM_16_BIT) {
- *format = AUDIO_FORMAT_PCM_16_BIT;
- inval = true;
- }
-
- int channel_count = popcount(*channel_mask);
- if (channel_count != 1 && channel_count != 2) {
- *channel_mask = AUDIO_CHANNEL_IN_STEREO;
- inval = true;
- }
-
- int i;
- for (i = 0; i < sample_rates_count; i++) {
- if (*sample_rate < sample_rates[i]) {
- *sample_rate = sample_rates[i];
- inval=true;
- break;
- }
- else if (*sample_rate == sample_rates[i]) {
- break;
- }
- else if (i == sample_rates_count-1) {
- // Cap it to the highest rate we support
- *sample_rate = sample_rates[i];
- inval=true;
- }
- }
-
- if (inval) {
- return -EINVAL;
- }
- return 0;
-}
-
-static int refine_input_parameters(uint32_t *sample_rate, audio_format_t *format, audio_channel_mask_t *channel_mask)
-{
- static const uint32_t sample_rates [] = {8000, 11025, 16000, 22050, 44100, 48000};
- static const int sample_rates_count = sizeof(sample_rates)/sizeof(uint32_t);
- bool inval = false;
- // Only PCM_16_bit is supported. If this is changed, stereo to mono drop
- // must be fixed in in_read
- if (*format != AUDIO_FORMAT_PCM_16_BIT) {
- *format = AUDIO_FORMAT_PCM_16_BIT;
- inval = true;
- }
-
- int channel_count = popcount(*channel_mask);
- if (channel_count != 1 && channel_count != 2) {
- *channel_mask = AUDIO_CHANNEL_IN_STEREO;
- inval = true;
- }
-
- int i;
- for (i = 0; i < sample_rates_count; i++) {
- if (*sample_rate < sample_rates[i]) {
- *sample_rate = sample_rates[i];
- inval=true;
- break;
- }
- else if (*sample_rate == sample_rates[i]) {
- break;
- }
- else if (i == sample_rates_count-1) {
- // Cap it to the highest rate we support
- *sample_rate = sample_rates[i];
- inval=true;
- }
- }
-
- if (inval) {
- return -EINVAL;
- }
- return 0;
-}
-
-static int check_input_parameters(uint32_t sample_rate, audio_format_t format,
- audio_channel_mask_t channel_mask)
-{
- return refine_input_parameters(&sample_rate, &format, &channel_mask);
-}
-
-static size_t get_input_buffer_size(uint32_t sample_rate, audio_format_t format,
- audio_channel_mask_t channel_mask)
-{
- size_t size;
- int channel_count = popcount(channel_mask);
- if (check_input_parameters(sample_rate, format, channel_mask) != 0)
- return 0;
-
- size = sample_rate*IN_PERIOD_MS/1000;
- // Audioflinger expects audio buffers to be multiple of 16 frames
- size = ((size + 15) / 16) * 16;
- size *= sizeof(short) * channel_count;
-
- return size;
-}
-
-
-static size_t in_get_buffer_size(const struct audio_stream *stream)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- int size = get_input_buffer_size(in->req_config.sample_rate,
- in->req_config.format,
- in->req_config.channel_mask);
-
- return size;
-}
-
-static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- return in->req_config.channel_mask;
-}
-
-static audio_format_t in_get_format(const struct audio_stream *stream)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- return in->req_config.format;
-}
-
-static int in_set_format(struct audio_stream *stream, audio_format_t format)
-{
- return -ENOSYS;
-}
-
-static int in_dump(const struct audio_stream *stream, int fd)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
-
- pthread_mutex_lock(&in->lock);
- dprintf(fd, "\tin_dump:\n"
- "\t\tsample rate: %u\n"
- "\t\tbuffer size: %zu\n"
- "\t\tchannel mask: %08x\n"
- "\t\tformat: %d\n"
- "\t\tdevice: %08x\n"
- "\t\taudio dev: %p\n\n",
- in_get_sample_rate(stream),
- in_get_buffer_size(stream),
- in_get_channels(stream),
- in_get_format(stream),
- in->device,
- in->dev);
- pthread_mutex_unlock(&in->lock);
- return 0;
-}
-
-static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
-{
- struct str_parms *parms;
- char value[32];
- int success;
- int ret = -EINVAL;
-
- if (kvpairs == NULL || kvpairs[0] == 0) {
- return 0;
- }
- parms = str_parms_create_str(kvpairs);
- success = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
- value, sizeof(value));
- // As the hal version is 3.0, it must not use set parameters API to set audio device.
- // Instead, it should use create_audio_patch API.
- assert(("Must not use set parameters API to set audio devices", success < 0));
-
- if (str_parms_has_key(parms, AUDIO_PARAMETER_STREAM_FORMAT)) {
- // match the return value of in_set_format
- ret = -ENOSYS;
- }
-
- str_parms_destroy(parms);
-
- if (ret == -EINVAL) {
- ALOGW("%s(), unsupported parameter %s", __func__, kvpairs);
- // There is not any key supported for set_parameters API.
- // Return error when there is non-null value passed in.
- }
- return ret;
-}
-
-static char * in_get_parameters(const struct audio_stream *stream,
- const char *keys)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- struct str_parms *query = str_parms_create_str(keys);
- char *str = NULL;
- char value[256];
- struct str_parms *reply = str_parms_create();
- int ret;
- bool get = false;
-
- ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
- if (ret >= 0) {
- str_parms_add_int(reply, AUDIO_PARAMETER_STREAM_ROUTING, in->device);
- get = true;
- }
-
- if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_FORMATS)) {
- value[0] = 0;
- strcat(value, "AUDIO_FORMAT_PCM_16_BIT");
- str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_FORMATS, value);
- get = true;
- }
-
- if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_FORMAT)) {
- value[0] = 0;
- strcat(value, "AUDIO_FORMAT_PCM_16_BIT");
- str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_FORMAT, value);
- get = true;
- }
-
- if (get) {
- str = str_parms_to_str(reply);
- }
- else {
- ALOGD("%s Unsupported paramter: %s", __FUNCTION__, keys);
- }
-
- str_parms_destroy(query);
- str_parms_destroy(reply);
- return str;
-}
-
-static int in_set_gain(struct audio_stream_in *stream, float gain)
-{
- // in_set_gain is a no op
- return 0;
-}
-
-// Call with in->lock held
-static void get_current_input_position(struct generic_stream_in *in,
- int64_t * position,
- struct timespec * timestamp) {
- struct timespec t = { .tv_sec = 0, .tv_nsec = 0 };
- clock_gettime(CLOCK_MONOTONIC, &t);
- const int64_t now_us = (t.tv_sec * 1000000000LL + t.tv_nsec) / 1000;
- if (timestamp) {
- *timestamp = t;
- }
- int64_t position_since_standby;
- if (in->standby) {
- position_since_standby = 0;
- } else {
- const int64_t first_us = (in->standby_exit_time.tv_sec * 1000000000LL +
- in->standby_exit_time.tv_nsec) / 1000;
- position_since_standby = (now_us - first_us) *
- in_get_sample_rate(&in->stream.common) /
- 1000000;
- if (position_since_standby < 0) {
- position_since_standby = 0;
- }
- }
- *position = in->standby_position + position_since_standby;
-}
-
-// Must be called with in->lock held
-static void do_in_standby(struct generic_stream_in *in)
-{
- if (in->standby) {
- return;
- }
- in->worker_standby = true;
- get_current_input_position(in, &in->standby_position, NULL);
- in->standby = true;
-}
-
-static int in_standby(struct audio_stream *stream)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- pthread_mutex_lock(&in->lock);
- do_in_standby(in);
- pthread_mutex_unlock(&in->lock);
- return 0;
-}
-
-static void *in_read_worker(void * args)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)args;
- struct pcm *pcm = NULL;
- uint8_t *buffer = NULL;
- size_t buffer_frames;
- int buffer_size;
-
- bool restart = false;
- bool shutdown = false;
- while (true) {
- pthread_mutex_lock(&in->lock);
- while (in->worker_standby || restart) {
- restart = false;
- if (pcm) {
- pcm_close(pcm); // Frees pcm
- pcm = NULL;
- free(buffer);
- buffer=NULL;
- }
- if (in->worker_exit) {
- break;
- }
- pthread_cond_wait(&in->worker_wake, &in->lock);
- }
-
- if (in->worker_exit) {
- if (!in->worker_standby) {
- ALOGE("In worker not in standby before exiting");
- }
- shutdown = true;
- }
- if (shutdown) {
- pthread_mutex_unlock(&in->lock);
- break;
- }
- if (!pcm) {
- pcm = pcm_open(PCM_CARD, PCM_DEVICE,
- PCM_IN | PCM_MONOTONIC, &in->pcm_config);
- if (!pcm_is_ready(pcm)) {
- ALOGE("pcm_open(in) failed: %s: channels %d format %d rate %d",
- pcm_get_error(pcm),
- in->pcm_config.channels,
- in->pcm_config.format,
- in->pcm_config.rate
- );
- pthread_mutex_unlock(&in->lock);
- break;
- }
- buffer_frames = in->pcm_config.period_size;
- buffer_size = pcm_frames_to_bytes(pcm, buffer_frames);
- buffer = malloc(buffer_size);
- if (!buffer) {
- ALOGE("could not allocate worker read buffer");
- pthread_mutex_unlock(&in->lock);
- break;
- }
- }
- pthread_mutex_unlock(&in->lock);
- int ret = pcm_read(pcm, buffer, pcm_frames_to_bytes(pcm, buffer_frames));
- if (ret != 0) {
- ALOGW("pcm_read failed %s", pcm_get_error(pcm));
- restart = true;
- continue;
- }
-
- pthread_mutex_lock(&in->lock);
- size_t frames_written = audio_vbuffer_write(&in->buffer, buffer, buffer_frames);
- pthread_mutex_unlock(&in->lock);
-
- if (frames_written != buffer_frames) {
- ALOGW("in_read_worker only could write %zu / %zu frames", frames_written, buffer_frames);
- }
- }
- if (buffer) {
- free(buffer);
- }
- return NULL;
-}
-
-static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
- size_t bytes)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- struct generic_audio_device *adev = in->dev;
- const size_t frames = bytes / audio_stream_in_frame_size(stream);
- bool mic_mute = false;
- size_t read_bytes = 0;
-
- adev_get_mic_mute(&adev->device, &mic_mute);
- pthread_mutex_lock(&in->lock);
-
- if (in->worker_standby) {
- in->worker_standby = false;
- }
- pthread_cond_signal(&in->worker_wake);
-
- int64_t current_position;
- struct timespec current_time;
-
- get_current_input_position(in, ¤t_position, ¤t_time);
- if (in->standby) {
- in->standby = false;
- in->standby_exit_time = current_time;
- in->standby_frames_read = 0;
- }
-
- const int64_t frames_available = current_position - in->standby_position - in->standby_frames_read;
- assert(frames_available >= 0);
-
- const size_t frames_wait = ((uint64_t)frames_available > frames) ? 0 : frames - frames_available;
-
- int64_t sleep_time_us = frames_wait * 1000000LL /
- in_get_sample_rate(&stream->common);
-
- pthread_mutex_unlock(&in->lock);
-
- if (sleep_time_us > 0) {
- usleep(sleep_time_us);
- }
-
- pthread_mutex_lock(&in->lock);
- int read_frames = 0;
- if (in->standby) {
- ALOGW("Input put to sleep while read in progress");
- goto exit;
- }
- in->standby_frames_read += frames;
-
- if (popcount(in->req_config.channel_mask) == 1 &&
- in->pcm_config.channels == 2) {
- // Need to resample to mono
- if (in->stereo_to_mono_buf_size < bytes*2) {
- in->stereo_to_mono_buf = realloc(in->stereo_to_mono_buf,
- bytes*2);
- if (!in->stereo_to_mono_buf) {
- ALOGE("Failed to allocate stereo_to_mono_buff");
- goto exit;
- }
- }
-
- read_frames = audio_vbuffer_read(&in->buffer, in->stereo_to_mono_buf, frames);
-
- // Currently only pcm 16 is supported.
- uint16_t *src = (uint16_t *)in->stereo_to_mono_buf;
- uint16_t *dst = (uint16_t *)buffer;
- size_t i;
- // Resample stereo 16 to mono 16 by dropping one channel.
- // The stereo stream is interleaved L-R-L-R
- for (i = 0; i < frames; i++) {
- *dst = *src;
- src += 2;
- dst += 1;
- }
- } else {
- read_frames = audio_vbuffer_read(&in->buffer, buffer, frames);
- }
-
-exit:
- read_bytes = read_frames*audio_stream_in_frame_size(stream);
-
- if (mic_mute) {
- read_bytes = 0;
- }
-
- if (read_bytes < bytes) {
- memset (&((uint8_t *)buffer)[read_bytes], 0, bytes-read_bytes);
- }
-
- pthread_mutex_unlock(&in->lock);
-
- return bytes;
-}
-
-static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
-{
- return 0;
-}
-
-static int in_get_capture_position(const struct audio_stream_in *stream,
- int64_t *frames, int64_t *time)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- pthread_mutex_lock(&in->lock);
- struct timespec current_time;
- get_current_input_position(in, frames, ¤t_time);
- *time = (current_time.tv_sec * 1000000000LL + current_time.tv_nsec);
- pthread_mutex_unlock(&in->lock);
- return 0;
-}
-
-static int in_get_active_microphones(const struct audio_stream_in *stream,
- struct audio_microphone_characteristic_t *mic_array,
- size_t *mic_count)
-{
- return adev_get_microphones(NULL, mic_array, mic_count);
-}
-
-static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
-{
- // in_add_audio_effect is a no op
- return 0;
-}
-
-static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
-{
- // in_add_audio_effect is a no op
- return 0;
-}
-
-static int adev_open_output_stream(struct audio_hw_device *dev,
- audio_io_handle_t handle,
- audio_devices_t devices,
- audio_output_flags_t flags,
- struct audio_config *config,
- struct audio_stream_out **stream_out,
- const char *address __unused)
-{
- struct generic_audio_device *adev = (struct generic_audio_device *)dev;
- struct generic_stream_out *out;
- int ret = 0;
-
- if (refine_output_parameters(&config->sample_rate, &config->format, &config->channel_mask)) {
- ALOGE("Error opening output stream format %d, channel_mask %04x, sample_rate %u",
- config->format, config->channel_mask, config->sample_rate);
- ret = -EINVAL;
- goto error;
- }
-
- out = (struct generic_stream_out *)calloc(1, sizeof(struct generic_stream_out));
-
- if (!out)
- return -ENOMEM;
-
- out->stream.common.get_sample_rate = out_get_sample_rate;
- out->stream.common.set_sample_rate = out_set_sample_rate;
- out->stream.common.get_buffer_size = out_get_buffer_size;
- out->stream.common.get_channels = out_get_channels;
- out->stream.common.get_format = out_get_format;
- out->stream.common.set_format = out_set_format;
- out->stream.common.standby = out_standby;
- out->stream.common.dump = out_dump;
- out->stream.common.set_parameters = out_set_parameters;
- out->stream.common.get_parameters = out_get_parameters;
- out->stream.common.add_audio_effect = out_add_audio_effect;
- out->stream.common.remove_audio_effect = out_remove_audio_effect;
- out->stream.get_latency = out_get_latency;
- out->stream.set_volume = out_set_volume;
- out->stream.write = out_write;
- out->stream.get_render_position = out_get_render_position;
- out->stream.get_presentation_position = out_get_presentation_position;
- out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
-
- out->handle = handle;
-
- pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL);
- out->dev = adev;
- // Only 1 device is expected despite the argument being named 'devices'
- out->num_devices = 1;
- out->devices[0] = devices;
- memcpy(&out->req_config, config, sizeof(struct audio_config));
- memcpy(&out->pcm_config, &pcm_config_out, sizeof(struct pcm_config));
- out->pcm_config.rate = config->sample_rate;
- out->pcm_config.period_size = out->pcm_config.rate*OUT_PERIOD_MS/1000;
-
- out->standby = true;
- out->underrun_position = 0;
- out->underrun_time.tv_sec = 0;
- out->underrun_time.tv_nsec = 0;
- out->last_write_time_us = 0;
- out->frames_total_buffered = 0;
- out->frames_written = 0;
- out->frames_rendered = 0;
-
- ret = audio_vbuffer_init(&out->buffer,
- out->pcm_config.period_size*out->pcm_config.period_count,
- out->pcm_config.channels *
- pcm_format_to_bits(out->pcm_config.format) >> 3);
- if (ret == 0) {
- pthread_cond_init(&out->worker_wake, NULL);
- out->worker_standby = true;
- out->worker_exit = false;
- pthread_create(&out->worker_thread, NULL, out_write_worker, out);
-
- }
-
- pthread_mutex_lock(&adev->lock);
- list_add_tail(&adev->out_streams, &out->stream_node);
- pthread_mutex_unlock(&adev->lock);
-
- *stream_out = &out->stream;
-
-error:
-
- return ret;
-}
-
-// This must be called with adev->lock held.
-struct generic_stream_out *get_stream_out_by_io_handle_l(
- struct generic_audio_device *adev, audio_io_handle_t handle) {
- struct listnode *node;
-
- list_for_each(node, &adev->out_streams) {
- struct generic_stream_out *out = node_to_item(
- node, struct generic_stream_out, stream_node);
- if (out->handle == handle) {
- return out;
- }
- }
- return NULL;
-}
-
-static void adev_close_output_stream(struct audio_hw_device *dev,
- struct audio_stream_out *stream)
-{
- struct generic_stream_out *out = (struct generic_stream_out *)stream;
- pthread_mutex_lock(&out->lock);
- do_out_standby(out);
-
- out->worker_exit = true;
- pthread_cond_signal(&out->worker_wake);
- pthread_mutex_unlock(&out->lock);
-
- pthread_join(out->worker_thread, NULL);
- pthread_mutex_destroy(&out->lock);
- audio_vbuffer_destroy(&out->buffer);
-
- struct generic_audio_device *adev = (struct generic_audio_device *) dev;
- pthread_mutex_lock(&adev->lock);
- list_remove(&out->stream_node);
- pthread_mutex_unlock(&adev->lock);
- free(stream);
-}
-
-static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
-{
- return 0;
-}
-
-static char * adev_get_parameters(const struct audio_hw_device *dev,
- const char *keys)
-{
- return strdup("");
-}
-
-static int adev_get_audio_port(struct audio_hw_device *dev,
- struct audio_port *port)
-{
- return 0;
-}
-
-static int adev_init_check(const struct audio_hw_device *dev)
-{
- return 0;
-}
-
-static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
-{
- // adev_set_voice_volume is a no op (simulates phones)
- return 0;
-}
-
-static int adev_set_audio_port_config(struct audio_hw_device *dev,
- const struct audio_port_config *config) {
- return 0;
-}
-
-static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
-{
- return -ENOSYS;
-}
-
-static int adev_get_master_volume(struct audio_hw_device *dev, float *volume)
-{
- return -ENOSYS;
-}
-
-static int adev_set_master_mute(struct audio_hw_device *dev, bool muted)
-{
- return -ENOSYS;
-}
-
-static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted)
-{
- return -ENOSYS;
-}
-
-static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
-{
- // adev_set_mode is a no op (simulates phones)
- return 0;
-}
-
-static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
-{
- struct generic_audio_device *adev = (struct generic_audio_device *)dev;
- pthread_mutex_lock(&adev->lock);
- adev->mic_mute = state;
- pthread_mutex_unlock(&adev->lock);
- return 0;
-}
-
-static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
-{
- struct generic_audio_device *adev = (struct generic_audio_device *)dev;
- pthread_mutex_lock(&adev->lock);
- *state = adev->mic_mute;
- pthread_mutex_unlock(&adev->lock);
- return 0;
-}
-
-
-static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
- const struct audio_config *config)
-{
- return get_input_buffer_size(config->sample_rate, config->format, config->channel_mask);
-}
-
-// This must be called with adev->lock held.
-struct generic_stream_in *get_stream_in_by_io_handle_l(
- struct generic_audio_device *adev, audio_io_handle_t handle) {
- struct listnode *node;
-
- list_for_each(node, &adev->in_streams) {
- struct generic_stream_in *in = node_to_item(
- node, struct generic_stream_in, stream_node);
- if (in->handle == handle) {
- return in;
- }
- }
- return NULL;
-}
-
-static void adev_close_input_stream(struct audio_hw_device *dev,
- struct audio_stream_in *stream)
-{
- struct generic_stream_in *in = (struct generic_stream_in *)stream;
- pthread_mutex_lock(&in->lock);
- do_in_standby(in);
-
- in->worker_exit = true;
- pthread_cond_signal(&in->worker_wake);
- pthread_mutex_unlock(&in->lock);
- pthread_join(in->worker_thread, NULL);
-
- if (in->stereo_to_mono_buf != NULL) {
- free(in->stereo_to_mono_buf);
- in->stereo_to_mono_buf_size = 0;
- }
-
- pthread_mutex_destroy(&in->lock);
- audio_vbuffer_destroy(&in->buffer);
-
- struct generic_audio_device *adev = (struct generic_audio_device *) dev;
- pthread_mutex_lock(&adev->lock);
- list_remove(&in->stream_node);
- pthread_mutex_unlock(&adev->lock);
- free(stream);
-}
-
-
-static int adev_open_input_stream(struct audio_hw_device *dev,
- audio_io_handle_t handle,
- audio_devices_t devices,
- struct audio_config *config,
- struct audio_stream_in **stream_in,
- audio_input_flags_t flags __unused,
- const char *address __unused,
- audio_source_t source __unused)
-{
- struct generic_audio_device *adev = (struct generic_audio_device *)dev;
- struct generic_stream_in *in;
- int ret = 0;
- uint32_t orig_sample_rate = config->sample_rate;
- audio_format_t orig_audio_format = config->format;
- audio_channel_mask_t orig_channel_mask = config->channel_mask;
- if (refine_input_parameters(&config->sample_rate, &config->format, &config->channel_mask)) {
- ALOGE("Error opening input stream format %d, channel_mask %04x, sample_rate %u",
- orig_audio_format, orig_channel_mask, orig_sample_rate);
- ret = -EINVAL;
- goto error;
- }
-
- in = (struct generic_stream_in *)calloc(1, sizeof(struct generic_stream_in));
- if (!in) {
- ret = -ENOMEM;
- goto error;
- }
-
- in->stream.common.get_sample_rate = in_get_sample_rate;
- in->stream.common.set_sample_rate = in_set_sample_rate; // no op
- in->stream.common.get_buffer_size = in_get_buffer_size;
- in->stream.common.get_channels = in_get_channels;
- in->stream.common.get_format = in_get_format;
- in->stream.common.set_format = in_set_format; // no op
- in->stream.common.standby = in_standby;
- in->stream.common.dump = in_dump;
- in->stream.common.set_parameters = in_set_parameters;
- in->stream.common.get_parameters = in_get_parameters;
- in->stream.common.add_audio_effect = in_add_audio_effect; // no op
- in->stream.common.remove_audio_effect = in_remove_audio_effect; // no op
- in->stream.set_gain = in_set_gain; // no op
- in->stream.read = in_read;
- in->stream.get_input_frames_lost = in_get_input_frames_lost; // no op
- in->stream.get_capture_position = in_get_capture_position;
- in->stream.get_active_microphones = in_get_active_microphones;
-
- pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL);
- in->dev = adev;
- in->device = devices;
- memcpy(&in->req_config, config, sizeof(struct audio_config));
- memcpy(&in->pcm_config, &pcm_config_in, sizeof(struct pcm_config));
- in->pcm_config.rate = config->sample_rate;
- in->pcm_config.period_size = in->pcm_config.rate*IN_PERIOD_MS/1000;
-
- in->stereo_to_mono_buf = NULL;
- in->stereo_to_mono_buf_size = 0;
-
- in->standby = true;
- in->standby_position = 0;
- in->standby_exit_time.tv_sec = 0;
- in->standby_exit_time.tv_nsec = 0;
- in->standby_frames_read = 0;
-
- ret = audio_vbuffer_init(&in->buffer,
- in->pcm_config.period_size*in->pcm_config.period_count,
- in->pcm_config.channels *
- pcm_format_to_bits(in->pcm_config.format) >> 3);
- if (ret == 0) {
- pthread_cond_init(&in->worker_wake, NULL);
- in->worker_standby = true;
- in->worker_exit = false;
- pthread_create(&in->worker_thread, NULL, in_read_worker, in);
- }
- in->handle = handle;
-
- pthread_mutex_lock(&adev->lock);
- list_add_tail(&adev->in_streams, &in->stream_node);
- pthread_mutex_unlock(&adev->lock);
-
- *stream_in = &in->stream;
-
-error:
- return ret;
-}
-
-
-static int adev_dump(const audio_hw_device_t *dev, int fd)
-{
- return 0;
-}
-
-static int adev_get_microphones(const audio_hw_device_t *dev,
- struct audio_microphone_characteristic_t *mic_array,
- size_t *mic_count)
-{
- if (mic_count == NULL) {
- return -ENOSYS;
- }
-
- if (*mic_count == 0) {
- *mic_count = 1;
- return 0;
- }
-
- if (mic_array == NULL) {
- return -ENOSYS;
- }
-
- strncpy(mic_array->device_id, "mic_goldfish", AUDIO_MICROPHONE_ID_MAX_LEN - 1);
- mic_array->device = AUDIO_DEVICE_IN_BUILTIN_MIC;
- strncpy(mic_array->address, AUDIO_BOTTOM_MICROPHONE_ADDRESS,
- AUDIO_DEVICE_MAX_ADDRESS_LEN - 1);
- memset(mic_array->channel_mapping, AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED,
- sizeof(mic_array->channel_mapping));
- mic_array->location = AUDIO_MICROPHONE_LOCATION_UNKNOWN;
- mic_array->group = 0;
- mic_array->index_in_the_group = 0;
- mic_array->sensitivity = AUDIO_MICROPHONE_SENSITIVITY_UNKNOWN;
- mic_array->max_spl = AUDIO_MICROPHONE_SPL_UNKNOWN;
- mic_array->min_spl = AUDIO_MICROPHONE_SPL_UNKNOWN;
- mic_array->directionality = AUDIO_MICROPHONE_DIRECTIONALITY_UNKNOWN;
- mic_array->num_frequency_responses = 0;
- mic_array->geometric_location.x = AUDIO_MICROPHONE_COORDINATE_UNKNOWN;
- mic_array->geometric_location.y = AUDIO_MICROPHONE_COORDINATE_UNKNOWN;
- mic_array->geometric_location.z = AUDIO_MICROPHONE_COORDINATE_UNKNOWN;
- mic_array->orientation.x = AUDIO_MICROPHONE_COORDINATE_UNKNOWN;
- mic_array->orientation.y = AUDIO_MICROPHONE_COORDINATE_UNKNOWN;
- mic_array->orientation.z = AUDIO_MICROPHONE_COORDINATE_UNKNOWN;
-
- *mic_count = 1;
- return 0;
-}
-
-static int adev_create_audio_patch(struct audio_hw_device *dev,
- unsigned int num_sources,
- const struct audio_port_config *sources,
- unsigned int num_sinks,
- const struct audio_port_config *sinks,
- audio_patch_handle_t *handle) {
- if (num_sources != 1 || num_sinks == 0 || num_sinks > AUDIO_PATCH_PORTS_MAX) {
- return -EINVAL;
- }
-
- if (sources[0].type == AUDIO_PORT_TYPE_DEVICE) {
- // If source is a device, the number of sinks should be 1.
- if (num_sinks != 1 || sinks[0].type != AUDIO_PORT_TYPE_MIX) {
- return -EINVAL;
- }
- } else if (sources[0].type == AUDIO_PORT_TYPE_MIX) {
- // If source is a mix, all sinks should be device.
- for (unsigned int i = 0; i < num_sinks; i++) {
- if (sinks[i].type != AUDIO_PORT_TYPE_DEVICE) {
- ALOGE("%s() invalid sink type %#x for mix source", __func__, sinks[i].type);
- return -EINVAL;
- }
- }
- } else {
- // All other cases are invalid.
- return -EINVAL;
- }
-
- struct generic_audio_device* adev = (struct generic_audio_device*) dev;
- int ret = 0;
- bool generatedPatchHandle = false;
- pthread_mutex_lock(&adev->lock);
- if (*handle == AUDIO_PATCH_HANDLE_NONE) {
- *handle = ++adev->next_patch_handle;
- generatedPatchHandle = true;
- }
-
- // Only handle patches for mix->devices and device->mix case.
- if (sources[0].type == AUDIO_PORT_TYPE_DEVICE) {
- struct generic_stream_in *in =
- get_stream_in_by_io_handle_l(adev, sinks[0].ext.mix.handle);
- if (in == NULL) {
- ALOGE("%s()can not find stream with handle(%d)", __func__, sources[0].ext.mix.handle);
- ret = -EINVAL;
- goto error;
- }
-
- // Check if the patch handle match the recorded one if a valid patch handle is passed.
- if (!generatedPatchHandle && in->patch_handle != *handle) {
- ALOGE("%s() the patch handle(%d) does not match recorded one(%d) for stream "
- "with handle(%d) when creating audio patch for device->mix",
- __func__, *handle, in->patch_handle, in->handle);
- ret = -EINVAL;
- goto error;
- }
- pthread_mutex_lock(&in->lock);
- in->device = sources[0].ext.device.type;
- pthread_mutex_unlock(&in->lock);
- in->patch_handle = *handle;
- } else {
- struct generic_stream_out *out =
- get_stream_out_by_io_handle_l(adev, sources[0].ext.mix.handle);
- if (out == NULL) {
- ALOGE("%s()can not find stream with handle(%d)", __func__, sources[0].ext.mix.handle);
- ret = -EINVAL;
- goto error;
- }
-
- // Check if the patch handle match the recorded one if a valid patch handle is passed.
- if (!generatedPatchHandle && out->patch_handle != *handle) {
- ALOGE("%s() the patch handle(%d) does not match recorded one(%d) for stream "
- "with handle(%d) when creating audio patch for mix->device",
- __func__, *handle, out->patch_handle, out->handle);
- ret = -EINVAL;
- pthread_mutex_unlock(&out->lock);
- goto error;
- }
- pthread_mutex_lock(&out->lock);
- for (out->num_devices = 0; out->num_devices < num_sinks; out->num_devices++) {
- out->devices[out->num_devices] = sinks[out->num_devices].ext.device.type;
- }
- pthread_mutex_unlock(&out->lock);
- out->patch_handle = *handle;
- }
-
-error:
- if (ret != 0 && generatedPatchHandle) {
- *handle = AUDIO_PATCH_HANDLE_NONE;
- }
- pthread_mutex_unlock(&adev->lock);
- return 0;
-}
-
-// This must be called with adev->lock held.
-struct generic_stream_out *get_stream_out_by_patch_handle_l(
- struct generic_audio_device *adev, audio_patch_handle_t patch_handle) {
- struct listnode *node;
-
- list_for_each(node, &adev->out_streams) {
- struct generic_stream_out *out = node_to_item(
- node, struct generic_stream_out, stream_node);
- if (out->patch_handle == patch_handle) {
- return out;
- }
- }
- return NULL;
-}
-
-// This must be called with adev->lock held.
-struct generic_stream_in *get_stream_in_by_patch_handle_l(
- struct generic_audio_device *adev, audio_patch_handle_t patch_handle) {
- struct listnode *node;
-
- list_for_each(node, &adev->in_streams) {
- struct generic_stream_in *in = node_to_item(
- node, struct generic_stream_in, stream_node);
- if (in->patch_handle == patch_handle) {
- return in;
- }
- }
- return NULL;
-}
-
-static int adev_release_audio_patch(struct audio_hw_device *dev,
- audio_patch_handle_t patch_handle) {
- struct generic_audio_device *adev = (struct generic_audio_device *) dev;
-
- pthread_mutex_lock(&adev->lock);
- struct generic_stream_out *out = get_stream_out_by_patch_handle_l(adev, patch_handle);
- if (out != NULL) {
- pthread_mutex_lock(&out->lock);
- out->num_devices = 0;
- memset(out->devices, 0, sizeof(out->devices));
- pthread_mutex_unlock(&out->lock);
- out->patch_handle = AUDIO_PATCH_HANDLE_NONE;
- pthread_mutex_unlock(&adev->lock);
- return 0;
- }
- struct generic_stream_in *in = get_stream_in_by_patch_handle_l(adev, patch_handle);
- if (in != NULL) {
- pthread_mutex_lock(&in->lock);
- in->device = AUDIO_DEVICE_NONE;
- pthread_mutex_unlock(&in->lock);
- in->patch_handle = AUDIO_PATCH_HANDLE_NONE;
- pthread_mutex_unlock(&adev->lock);
- return 0;
- }
-
- pthread_mutex_unlock(&adev->lock);
- ALOGW("%s() cannot find stream for patch handle: %d", __func__, patch_handle);
- return -EINVAL;
-}
-
-static int adev_close(hw_device_t *dev)
-{
- struct generic_audio_device *adev = (struct generic_audio_device *)dev;
- int ret = 0;
- if (!adev)
- return 0;
-
- pthread_mutex_lock(&adev_init_lock);
-
- if (audio_device_ref_count == 0) {
- ALOGE("adev_close called when ref_count 0");
- ret = -EINVAL;
- goto error;
- }
-
- if ((--audio_device_ref_count) == 0) {
- if (adev->mixer) {
- mixer_close(adev->mixer);
- }
- free(adev);
- }
-
-error:
- pthread_mutex_unlock(&adev_init_lock);
- return ret;
-}
-
-static int adev_open(const hw_module_t* module, const char* name,
- hw_device_t** device)
-{
- static struct generic_audio_device *adev;
-
- if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
- return -EINVAL;
-
- pthread_mutex_lock(&adev_init_lock);
- if (audio_device_ref_count != 0) {
- *device = &adev->device.common;
- audio_device_ref_count++;
- ALOGV("%s: returning existing instance of adev", __func__);
- ALOGV("%s: exit", __func__);
- goto unlock;
- }
- adev = calloc(1, sizeof(struct generic_audio_device));
-
- pthread_mutex_init(&adev->lock, (const pthread_mutexattr_t *) NULL);
-
- adev->device.common.tag = HARDWARE_DEVICE_TAG;
- adev->device.common.version = AUDIO_DEVICE_API_VERSION_3_0;
- adev->device.common.module = (struct hw_module_t *) module;
- adev->device.common.close = adev_close;
-
- adev->device.init_check = adev_init_check; // no op
- adev->device.set_voice_volume = adev_set_voice_volume; // no op
- adev->device.set_master_volume = adev_set_master_volume; // no op
- adev->device.get_master_volume = adev_get_master_volume; // no op
- adev->device.set_master_mute = adev_set_master_mute; // no op
- adev->device.get_master_mute = adev_get_master_mute; // no op
- adev->device.set_mode = adev_set_mode; // no op
- adev->device.set_mic_mute = adev_set_mic_mute;
- adev->device.get_mic_mute = adev_get_mic_mute;
- adev->device.set_parameters = adev_set_parameters; // no op
- adev->device.get_parameters = adev_get_parameters; // no op
- adev->device.get_audio_port = adev_get_audio_port; // no op
- adev->device.set_audio_port_config = adev_set_audio_port_config; // no op
- adev->device.get_input_buffer_size = adev_get_input_buffer_size;
- adev->device.open_output_stream = adev_open_output_stream;
- adev->device.close_output_stream = adev_close_output_stream;
- adev->device.open_input_stream = adev_open_input_stream;
- adev->device.close_input_stream = adev_close_input_stream;
- adev->device.dump = adev_dump;
- adev->device.get_microphones = adev_get_microphones;
- adev->device.create_audio_patch = adev_create_audio_patch;
- adev->device.release_audio_patch = adev_release_audio_patch;
-
- *device = &adev->device.common;
-
- adev->next_patch_handle = AUDIO_PATCH_HANDLE_NONE;
- list_init(&adev->out_streams);
- list_init(&adev->in_streams);
-
- adev->mixer = mixer_open(PCM_CARD);
- struct mixer_ctl *ctl;
-
- // Set default mixer ctls
- // Enable channels and set volume
- for (int i = 0; i < (int)mixer_get_num_ctls(adev->mixer); i++) {
- ctl = mixer_get_ctl(adev->mixer, i);
- ALOGD("mixer %d name %s", i, mixer_ctl_get_name(ctl));
- if (!strcmp(mixer_ctl_get_name(ctl), "Master Playback Volume") ||
- !strcmp(mixer_ctl_get_name(ctl), "Capture Volume")) {
- for (int z = 0; z < (int)mixer_ctl_get_num_values(ctl); z++) {
- ALOGD("set ctl %d to %d", z, 100);
- mixer_ctl_set_percent(ctl, z, 100);
- }
- continue;
- }
- if (!strcmp(mixer_ctl_get_name(ctl), "Master Playback Switch") ||
- !strcmp(mixer_ctl_get_name(ctl), "Capture Switch")) {
- for (int z = 0; z < (int)mixer_ctl_get_num_values(ctl); z++) {
- ALOGD("set ctl %d to %d", z, 1);
- mixer_ctl_set_value(ctl, z, 1);
- }
- continue;
- }
- }
-
- audio_device_ref_count++;
-
-unlock:
- pthread_mutex_unlock(&adev_init_lock);
- return 0;
-}
-
-static struct hw_module_methods_t hal_module_methods = {
- .open = adev_open,
-};
-
-struct audio_module HAL_MODULE_INFO_SYM = {
- .common = {
- .tag = HARDWARE_MODULE_TAG,
- .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
- .hal_api_version = HARDWARE_HAL_API_VERSION,
- .id = AUDIO_HARDWARE_MODULE_ID,
- .name = "Generic audio HW HAL",
- .author = "The Android Open Source Project",
- .methods = &hal_module_methods,
- },
-};
diff --git a/guest/hals/bt/OWNERS b/guest/hals/bt/OWNERS
index e8a4a00..e791d83 100644
--- a/guest/hals/bt/OWNERS
+++ b/guest/hals/bt/OWNERS
@@ -1,2 +1,3 @@
+include device/google/cuttlefish:/OWNERS
include platform/system/bt:/OWNERS
[email protected]
\ No newline at end of file
diff --git a/guest/hals/camera/vsock_frame_provider.cpp b/guest/hals/camera/vsock_frame_provider.cpp
index 435d5f9..baa4c52 100644
--- a/guest/hals/camera/vsock_frame_provider.cpp
+++ b/guest/hals/camera/vsock_frame_provider.cpp
@@ -22,6 +22,16 @@
namespace cuttlefish {
+namespace {
+bool writeJsonEventMessage(
+ std::shared_ptr<cuttlefish::VsockConnection> connection,
+ const std::string& message) {
+ Json::Value json_message;
+ json_message["event"] = message;
+ return connection && connection->WriteMessage(json_message);
+}
+} // namespace
+
VsockFrameProvider::~VsockFrameProvider() { stop(); }
void VsockFrameProvider::start(
@@ -30,6 +40,7 @@
stop();
running_ = true;
connection_ = connection;
+ writeJsonEventMessage(connection, "VIRTUAL_DEVICE_START_CAMERA_SESSION");
reader_thread_ =
std::thread([this, width, height] { VsockReadLoop(width, height); });
}
@@ -40,6 +51,7 @@
if (reader_thread_.joinable()) {
reader_thread_.join();
}
+ writeJsonEventMessage(connection_, "VIRTUAL_DEVICE_STOP_CAMERA_SESSION");
connection_ = nullptr;
}
@@ -53,11 +65,7 @@
void VsockFrameProvider::requestJpeg() {
jpeg_pending_ = true;
- Json::Value message;
- message["event"] = "VIRTUAL_DEVICE_CAPTURE_IMAGE";
- if (connection_) {
- connection_->WriteMessage(message);
- }
+ writeJsonEventMessage(connection_, "VIRTUAL_DEVICE_CAPTURE_IMAGE");
}
void VsockFrameProvider::cancelJpegRequest() { jpeg_pending_ = false; }
diff --git a/guest/hals/confirmationui/.clang-format b/guest/hals/confirmationui/.clang-format
new file mode 100644
index 0000000..b0dc94c
--- /dev/null
+++ b/guest/hals/confirmationui/.clang-format
@@ -0,0 +1,10 @@
+BasedOnStyle: LLVM
+IndentWidth: 4
+UseTab: Never
+BreakBeforeBraces: Attach
+AllowShortFunctionsOnASingleLine: Inline
+AllowShortIfStatementsOnASingleLine: true
+IndentCaseLabels: false
+ColumnLimit: 100
+PointerBindsToType: true
+SpacesBeforeTrailingComments: 2
diff --git a/guest/hals/confirmationui/Android.bp b/guest/hals/confirmationui/Android.bp
new file mode 100644
index 0000000..168764a
--- /dev/null
+++ b/guest/hals/confirmationui/Android.bp
@@ -0,0 +1,90 @@
+// Copyright (C) 2021 The Android Open-Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// WARNING: Everything listed here will be built on ALL platforms,
+// including x86, the emulator, and the SDK. Modules must be uniquely
+// named (liblights.panda), and must build everywhere, or limit themselves
+// to only building on ARM if they include assembly. Individual makefiles
+// are responsible for having their own logic, for fine-grained control.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_binary {
+ name: "[email protected]",
+ defaults: ["hidl_defaults", "cuttlefish_guest_only"],
+ relative_install_path: "hw",
+ vendor: true,
+ shared_libs: [
+ "[email protected]",
+ "[email protected]",
+ "libbase",
+ "libhidlbase",
+ "libutils",
+ ],
+ static_libs: [
+ "libcutils",
+ "libcuttlefish_confui",
+ ],
+
+ init_rc: ["[email protected]"],
+
+ vintf_fragments: ["[email protected]"],
+
+ srcs: [
+ "service.cpp",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-DTEEUI_USE_STD_VECTOR",
+ ],
+}
+
+cc_library {
+ name: "[email protected]",
+ defaults: ["hidl_defaults", "cuttlefish_guest_only"],
+ vendor: true,
+ shared_libs: [
+ "[email protected]",
+ "[email protected]",
+ "libbase",
+ "libdmabufheap",
+ "libhidlbase",
+ "libteeui_hal_support",
+ "libtrusty",
+ "libutils",
+ ],
+
+ export_include_dirs: ["include"],
+
+ srcs: [
+ "TrustyConfirmationUI.cpp",
+ "guest_session.cpp",
+ ],
+ static_libs: [
+ "libcutils",
+ "libcuttlefish_confui",
+ "libcuttlefish_fs",
+ ],
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-DTEEUI_USE_STD_VECTOR",
+ ],
+}
+
diff --git a/guest/hals/confirmationui/README b/guest/hals/confirmationui/README
new file mode 100644
index 0000000..45d4e76
--- /dev/null
+++ b/guest/hals/confirmationui/README
@@ -0,0 +1,20 @@
+## Secure UI Architecture
+
+To implement confirmationui a secure UI architecture is required. This entails a way
+to display the confirmation dialog driven by a reduced trusted computing base, typically
+a trusted execution environment (TEE), without having to rely on Linux and the Android
+system for integrity and authenticity of input events. This implementation provides
+neither. But it provides most of the functionlity required to run a full Android Protected
+Confirmation feature when integrated into a secure UI architecture.
+
+## Secure input (NotSoSecureInput)
+
+This implementation does not provide any security guaranties.
+The input method (NotSoSecureInput) runs a cryptographic protocols that is
+sufficiently secure IFF the end point is implemented on a trustworthy
+secure input device. But since the endpoint is currently in the HAL
+service itself this implementation is not secure.
+
+NOTE that a secure input device end point needs a good source of entropy
+for generating nonces. The current implementation (NotSoSecureInput.cpp#generateNonce)
+uses a constant nonce.
\ No newline at end of file
diff --git a/guest/hals/confirmationui/TrustyConfirmationUI.cpp b/guest/hals/confirmationui/TrustyConfirmationUI.cpp
new file mode 100644
index 0000000..7854332
--- /dev/null
+++ b/guest/hals/confirmationui/TrustyConfirmationUI.cpp
@@ -0,0 +1,248 @@
+/*
+ *
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "TrustyConfirmationUI.h"
+
+#include <cutils/properties.h>
+
+namespace android {
+namespace hardware {
+namespace confirmationui {
+namespace V1_0 {
+namespace implementation {
+
+using ::teeui::MsgString;
+using ::teeui::MsgVector;
+using ::android::hardware::keymaster::V4_0::HardwareAuthToken;
+using TeeuiRc = ::teeui::ResponseCode;
+
+namespace {
+teeui::UIOption convertUIOption(UIOption uio) {
+ static_assert(uint32_t(UIOption::AccessibilityInverted) ==
+ uint32_t(teeui::UIOption::AccessibilityInverted) &&
+ uint32_t(UIOption::AccessibilityMagnified) ==
+ uint32_t(teeui::UIOption::AccessibilityMagnified),
+ "teeui::UIOPtion and ::android::hardware::confirmationui::V1_0::UIOption "
+ "are out of sync");
+ return teeui::UIOption(uio);
+}
+
+inline MsgString hidl2MsgString(const hidl_string& s) {
+ return {s.c_str(), s.c_str() + s.size()};
+}
+template <typename T> inline MsgVector<T> hidl2MsgVector(const hidl_vec<T>& v) {
+ return {v};
+}
+
+inline MsgVector<teeui::UIOption> hidl2MsgVector(const hidl_vec<UIOption>& v) {
+ MsgVector<teeui::UIOption> result(v.size());
+ for (unsigned int i = 0; i < v.size(); ++i) {
+ result[i] = convertUIOption(v[i]);
+ }
+ return result;
+}
+} // namespace
+
+cuttlefish::SharedFD TrustyConfirmationUI::ConnectToHost() {
+ using namespace std::chrono_literals;
+ while (true) {
+ auto host_fd = cuttlefish::SharedFD::VsockClient(2, host_vsock_port_, SOCK_STREAM);
+ if (host_fd->IsOpen()) {
+ ConfUiLog(INFO) << "Client connection is established";
+ return host_fd;
+ }
+ ConfUiLog(INFO) << "host service is not on. Sleep for 500 ms";
+ std::this_thread::sleep_for(500ms);
+ }
+}
+
+TrustyConfirmationUI::TrustyConfirmationUI()
+ : listener_state_(ListenerState::None),
+ prompt_result_(ResponseCode::Ignored), host_vsock_port_{static_cast<int>(property_get_int64(
+ "ro.boot.vsock_confirmationui_port", 7700))},
+ current_session_id_{10} {
+ ConfUiLog(INFO) << "Connecting to Confirmation UI host listening on port " << host_vsock_port_;
+ host_fd_ = ConnectToHost();
+ auto fetching_cmd = [this]() { HostMessageFetcherLoop(); };
+ if (host_fd_->IsOpen()) {
+ host_cmd_fetcher_thread_ = std::thread(fetching_cmd);
+ }
+}
+
+TrustyConfirmationUI::~TrustyConfirmationUI() {
+ if (host_fd_->IsOpen()) {
+ host_fd_->Close();
+ }
+ if (host_cmd_fetcher_thread_.joinable()) {
+ host_cmd_fetcher_thread_.join();
+ }
+
+ if (listener_state_ != ListenerState::None) {
+ callback_thread_.join();
+ }
+}
+
+void TrustyConfirmationUI::HostMessageFetcherLoop() {
+ while (true) {
+ if (!host_fd_->IsOpen()) {
+ // this happens when TrustyConfirmationUI is destroyed
+ ConfUiLog(ERROR) << "host_fd_ is not open";
+ return;
+ }
+ auto msg = cuttlefish::confui::RecvConfUiMsg(host_fd_);
+ if (!msg) {
+ // socket is broken for now
+ return;
+ }
+ {
+ std::unique_lock<std::mutex> lk(current_session_lock_);
+ if (!current_session_ || msg->GetSessionId() != current_session_->GetSessionId()) {
+ if (!current_session_) {
+ ConfUiLog(ERROR) << "msg is received but session is null";
+ continue;
+ }
+ ConfUiLog(ERROR) << "session id mismatch, so ignored"
+ << "Received for " << msg->GetSessionId()
+ << " but currently running " << current_session_->GetSessionId();
+ continue;
+ }
+ current_session_->Push(std::move(msg));
+ }
+ listener_state_condv_.notify_all();
+ }
+}
+
+void TrustyConfirmationUI::RunSession(sp<IConfirmationResultCallback> resultCB,
+ hidl_string promptText, hidl_vec<uint8_t> extraData,
+ hidl_string locale, hidl_vec<UIOption> uiOptions) {
+ cuttlefish::SharedFD fd = host_fd_;
+ // ownership of the fd is passed to GuestSession
+ {
+ std::unique_lock<std::mutex> lk(current_session_lock_);
+ current_session_ = std::make_unique<GuestSession>(
+ current_session_id_, listener_state_, listener_state_lock_, listener_state_condv_, fd,
+ hidl2MsgString(promptText), hidl2MsgVector(extraData), hidl2MsgString(locale),
+ hidl2MsgVector(uiOptions));
+ }
+
+ auto [rc, msg, token] = current_session_->PromptUserConfirmation();
+
+ std::unique_lock<std::mutex> lock(listener_state_lock_); // for listener_state_
+ bool do_callback = (listener_state_ == ListenerState::Interactive ||
+ listener_state_ == ListenerState::SetupDone) &&
+ resultCB;
+ prompt_result_ = rc;
+ listener_state_ = ListenerState::Terminating;
+ lock.unlock();
+ if (do_callback) {
+ auto error = resultCB->result(prompt_result_, msg, token);
+ if (!error.isOk()) {
+ ConfUiLog(ERROR) << "Result callback failed " << error.description();
+ }
+ ConfUiLog(INFO) << "Result callback returned.";
+ } else {
+ listener_state_condv_.notify_all();
+ }
+}
+
+// Methods from ::android::hardware::confirmationui::V1_0::IConfirmationUI
+// follow.
+Return<ResponseCode> TrustyConfirmationUI::promptUserConfirmation(
+ const sp<IConfirmationResultCallback>& resultCB, const hidl_string& promptText,
+ const hidl_vec<uint8_t>& extraData, const hidl_string& locale,
+ const hidl_vec<UIOption>& uiOptions) {
+ std::unique_lock<std::mutex> stateLock(listener_state_lock_, std::defer_lock);
+ ConfUiLog(INFO) << "promptUserConfirmation is called";
+
+ if (!stateLock.try_lock()) {
+ return ResponseCode::OperationPending;
+ }
+ switch (listener_state_) {
+ case ListenerState::None:
+ break;
+ case ListenerState::Starting:
+ case ListenerState::SetupDone:
+ case ListenerState::Interactive:
+ return ResponseCode::OperationPending;
+ case ListenerState::Terminating:
+ callback_thread_.join();
+ listener_state_ = ListenerState::None;
+ break;
+ default:
+ return ResponseCode::Unexpected;
+ }
+ assert(listener_state_ == ListenerState::None);
+ listener_state_ = ListenerState::Starting;
+ ConfUiLog(INFO) << "Per promptUserConfirmation, "
+ << "an active TEE UI session starts";
+ current_session_id_++;
+ auto worker = [this](const sp<IConfirmationResultCallback>& resultCB,
+ const hidl_string& promptText, const hidl_vec<uint8_t>& extraData,
+ const hidl_string& locale, const hidl_vec<UIOption>& uiOptions) {
+ RunSession(resultCB, promptText, extraData, locale, uiOptions);
+ };
+ callback_thread_ = std::thread(worker, resultCB, promptText, extraData, locale, uiOptions);
+
+ listener_state_condv_.wait(stateLock, [this] {
+ return listener_state_ == ListenerState::SetupDone ||
+ listener_state_ == ListenerState::Interactive ||
+ listener_state_ == ListenerState::Terminating;
+ });
+ if (listener_state_ == ListenerState::Terminating) {
+ callback_thread_.join();
+ listener_state_ = ListenerState::None;
+ if (prompt_result_ == ResponseCode::Canceled) {
+ // VTS expects this
+ return ResponseCode::OK;
+ }
+ return prompt_result_;
+ }
+ return ResponseCode::OK;
+}
+
+Return<ResponseCode>
+TrustyConfirmationUI::deliverSecureInputEvent(const HardwareAuthToken& auth_token) {
+ ConfUiLog(INFO) << "deliverSecureInputEvent is called";
+ ResponseCode rc = ResponseCode::Ignored;
+ {
+ std::unique_lock<std::mutex> lock(current_session_lock_);
+ if (!current_session_) {
+ return rc;
+ }
+ return current_session_->DeliverSecureInputEvent(auth_token);
+ }
+}
+
+Return<void> TrustyConfirmationUI::abort() {
+ {
+ std::unique_lock<std::mutex> lock(current_session_lock_);
+ if (!current_session_) {
+ return Void();
+ }
+ return current_session_->Abort();
+ }
+}
+
+android::sp<IConfirmationUI> createTrustyConfirmationUI() {
+ return new TrustyConfirmationUI();
+}
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace confirmationui
+} // namespace hardware
+} // namespace android
diff --git a/guest/hals/confirmationui/TrustyConfirmationUI.h b/guest/hals/confirmationui/TrustyConfirmationUI.h
new file mode 100644
index 0000000..1742d88
--- /dev/null
+++ b/guest/hals/confirmationui/TrustyConfirmationUI.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H
+#define ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H
+
+#include <atomic>
+#include <condition_variable>
+#include <cstdint>
+#include <memory>
+#include <mutex>
+#include <thread>
+
+#include <android/hardware/confirmationui/1.0/IConfirmationUI.h>
+#include <android/hardware/keymaster/4.0/types.h>
+#include <hidl/Status.h>
+#include <teeui/generic_messages.h>
+
+#include "common/libs/concurrency/thread_safe_queue.h"
+#include "common/libs/confui/confui.h"
+#include "common/libs/fs/shared_fd.h"
+#include "guest_session.h"
+
+namespace android {
+namespace hardware {
+namespace confirmationui {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::sp;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+
+class TrustyConfirmationUI : public IConfirmationUI {
+ public:
+ using ConfUiMessage = cuttlefish::confui::ConfUiMessage;
+ using ConfUiAckMessage = cuttlefish::confui::ConfUiAckMessage;
+ using ListenerState = GuestSession::ListenerState;
+
+ TrustyConfirmationUI();
+ virtual ~TrustyConfirmationUI();
+ // Methods from ::android::hardware::confirmationui::V1_0::IConfirmationUI
+ // follow.
+ Return<ResponseCode> promptUserConfirmation(const sp<IConfirmationResultCallback>& resultCB,
+ const hidl_string& promptText,
+ const hidl_vec<uint8_t>& extraData,
+ const hidl_string& locale,
+ const hidl_vec<UIOption>& uiOptions) override;
+ Return<ResponseCode> deliverSecureInputEvent(
+ const ::android::hardware::keymaster::V4_0::HardwareAuthToken& secureInputToken) override;
+
+ Return<void> abort() override;
+
+ private:
+ /*
+ * Note for implementation
+ *
+ * The TEE UI session cannot be pre-emptied normally. The session will have an
+ * exclusive control for the input and the screen. Only when something goes
+ * wrong, it can be aborted by abort().
+ *
+ * Another thing is that promptUserConfirmation() may return without waiting
+ * for the resultCB is completed. When it returns early, it still returns
+ * ResponseCode::OK. In that case, the promptUserConfirmation() could actually
+ * fail -- e.g. the input device is broken down afterwards, the user never
+ * gave an input until timeout, etc. Then, the resultCB would be called with
+ * an appropriate error code. However, even in that case, most of the time
+ * promptUserConfirmation() returns OK. Only when the initial set up for
+ * confirmation UI fails, promptUserConfirmation() may return non-OK.
+ *
+ * So, the implementation is roughly:
+ * 1. If there's another session going on, return with ResponseCode::Ignored
+ * and the return is immediate
+ * 2. If there's a zombie, collect the zombie and go to 3
+ * 3. If there's nothing, start a new session in a new thread, and return
+ * the promptUserConfirmation() call as early as possible
+ *
+ * Another issue is to maintain/define the ownership of vsock. For now,
+ * a message fetcher (from the host) will see if the vsock is ok, and
+ * reconnect if not. But, eventually, the new session should establish a
+ * new connection/client vsock, and the new session should own the fetcher
+ * thread.
+ */
+ std::thread callback_thread_;
+ ListenerState listener_state_;
+
+ std::mutex listener_state_lock_;
+ std::condition_variable listener_state_condv_;
+ ResponseCode prompt_result_;
+
+ // client socket to the host
+ int host_vsock_port_;
+ cuttlefish::SharedFD host_fd_;
+
+ // ack, response, command from the host, and the abort command from the guest
+ std::atomic<std::uint32_t> current_session_id_;
+ std::mutex current_session_lock_;
+ std::unique_ptr<GuestSession> current_session_;
+ std::thread host_cmd_fetcher_thread_;
+
+ cuttlefish::SharedFD ConnectToHost();
+ void HostMessageFetcherLoop();
+ void RunSession(sp<IConfirmationResultCallback> resultCB, hidl_string promptText,
+ hidl_vec<uint8_t> extraData, hidl_string locale, hidl_vec<UIOption> uiOptions);
+};
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace confirmationui
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H
diff --git a/guest/hals/confirmationui/[email protected] b/guest/hals/confirmationui/[email protected]
new file mode 100644
index 0000000..81dfd49
--- /dev/null
+++ b/guest/hals/confirmationui/[email protected]
@@ -0,0 +1,5 @@
+service confirmationui-1-0 /vendor/bin/hw/[email protected]
+ interface [email protected]::IConfirmationUI default
+ class hal
+ user system
+ group drmrpc input system
diff --git a/guest/hals/confirmationui/[email protected] b/guest/hals/confirmationui/[email protected]
new file mode 100644
index 0000000..9008b87
--- /dev/null
+++ b/guest/hals/confirmationui/[email protected]
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device">
+ <hal format="hidl">
+ <name>android.hardware.confirmationui</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IConfirmationUI</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/guest/hals/confirmationui/guest_session.cpp b/guest/hals/confirmationui/guest_session.cpp
new file mode 100644
index 0000000..aa2ab12
--- /dev/null
+++ b/guest/hals/confirmationui/guest_session.cpp
@@ -0,0 +1,265 @@
+/*
+ *
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "guest_session.h"
+
+#include <future>
+
+namespace android {
+namespace hardware {
+namespace confirmationui {
+namespace V1_0 {
+namespace implementation {
+using TeeuiRc = teeui::ResponseCode;
+
+GuestSession::ResultTriple GuestSession::PromptUserConfirmation() {
+ std::unique_lock<std::mutex> stateLock(listener_state_lock_);
+ /*
+ * This is the main listener thread function. The listener thread life cycle
+ * is equivalent to the life cycle of a single confirmation request. The life
+ * cycle is divided in four phases.
+ * * The starting phase:
+ * * Drives the cuttlefish confirmation UI session on the host side, too
+ *
+ * Note: During the starting phase the hwbinder service thread is blocked and
+ * waiting for possible Errors. If the setup phase concludes successfully, the
+ * hwbinder service thread gets unblocked and returns successfully. Errors
+ * that occur after the first phase are delivered by callback interface.
+ *
+ * For cuttlefish, it means that the guest will conduct a blocking wait for
+ * an ack to kStart.
+ *
+ * * The 2nd phase - non interactive phase
+ * * After a grace period:
+ * * guest will pick up cuttlefish host's ack to kStart
+ *
+ * * The 3rd phase - interactive phase
+ * * We wait to any external event
+ * * Abort
+ * * Secure user input asserted
+ * * The result is fetched from the TA.
+ *
+ * * The 4th phase - cleanup
+ * * Sending the kStop command to the cuttlefish host, and wait for ack
+ */
+
+ GuestSession::ResultTriple error;
+ auto& error_rc = std::get<ResponseCode>(error);
+ error_rc = ResponseCode::SystemError;
+
+ CHECK(listener_state_ == ListenerState::Starting) << "ListenerState should be Starting";
+
+ // initiate prompt
+ ConfUiLog(INFO) << "Initiating prompt";
+ const std::uint32_t payload_lower_bound =
+ static_cast<std::uint32_t>(prompt_text_.size() + extra_data_.size());
+ const std::uint32_t upper_bound =
+ static_cast<std::uint32_t>(cuttlefish::confui::kMaxMessageLength);
+ if (payload_lower_bound > upper_bound) {
+ ConfUiLog(INFO) << "UI message too long to send to the host";
+ // message is too long anyway, and don't send it to the host
+ error_rc = ResponseCode::UIErrorMessageTooLong;
+ return error;
+ }
+ SerializedSend(cuttlefish::confui::SendStartCmd, host_fd_, session_name_, prompt_text_,
+ extra_data_, locale_, ui_options_);
+ ConfUiLog(INFO) << "Session " << GetSessionId() << " started on both the guest and the host";
+
+ auto clean_up_and_get_first = [&]() -> std::unique_ptr<ConfUiMessage> {
+ // blocking wait to get the first msg that belongs to this session
+ while (true) {
+ auto first_curr_session_msg = incoming_msg_queue_.Pop();
+ if (!first_curr_session_msg ||
+ first_curr_session_msg->GetSessionId() != GetSessionId()) {
+ continue;
+ }
+ return std::move(first_curr_session_msg);
+ }
+ };
+
+ /*
+ * Unconditionally wait ack, or host abort
+ *
+ * First couple of messages could be from the previous session.
+ * We should clear them up.
+ *
+ * Even though the guest HAL sends kAbort to the host, the kAbort
+ * does not happen immediately. Between the incoming_msg_queue_.FlushAll()
+ * and the actual abort on the host, there could still be messages
+ * sent from the host to the guest. As these lines are the first read
+ * for the current session, we clear up the preceding messages
+ * from the previous session until we see the message for the current
+ * session.
+ *
+ * Note that abort() call puts the Abort command in the queue. So,
+ * it will also show up in incoming_msg_queue_
+ *
+ */
+ auto first_msg = std::move(clean_up_and_get_first());
+
+ cuttlefish::confui::ConfUiAckMessage& start_ack_msg =
+ static_cast<cuttlefish::confui::ConfUiAckMessage&>(*first_msg);
+ if (!start_ack_msg.IsSuccess()) {
+ // handle errors: MALFORMED_UTF8 or Message too long
+ const std::string error_msg = start_ack_msg.GetStatusMessage();
+ if (error_msg == cuttlefish::confui::HostError::kMessageTooLongError) {
+ ConfUiLog(ERROR) << "Message + Extra data + Meta info were too long";
+ error_rc = ResponseCode::UIErrorMessageTooLong;
+ }
+ if (error_msg == cuttlefish::confui::HostError::kIncorrectUTF8) {
+ ConfUiLog(ERROR) << "Message is incorrectly UTF-encoded";
+ error_rc = ResponseCode::UIErrorMalformedUTF8Encoding;
+ }
+ return error;
+ }
+
+ // ############################## Start 2nd Phase #############################################
+ listener_state_ = ListenerState::SetupDone;
+ ConfUiLog(INFO) << "Transition to SetupDone";
+ stateLock.unlock();
+ listener_state_condv_.notify_all();
+
+ // cuttlefish does not need the second phase to implement HAL APIs
+ // input was already prepared before the confirmation UI screen was rendered
+
+ // ############################## Start 3rd Phase - interactive phase #########################
+ stateLock.lock();
+ listener_state_ = ListenerState::Interactive;
+ ConfUiLog(INFO) << "Transition to Interactive";
+ stateLock.unlock();
+ listener_state_condv_.notify_all();
+
+ // give deliverSecureInputEvent a chance to interrupt
+
+ // wait for an input but should not block deliverSecureInputEvent or Abort
+ // Thus, it should not hold the stateLock
+ std::mutex input_ready_mtx;
+ std::condition_variable input_ready_cv_;
+ std::unique_lock<std::mutex> input_ready_lock(input_ready_mtx);
+ bool input_ready = false;
+ auto wait_input_and_signal = [&]() -> std::unique_ptr<ConfUiMessage> {
+ auto msg = incoming_msg_queue_.Pop();
+ {
+ std::unique_lock<std::mutex> lock(input_ready_mtx);
+ input_ready = true;
+ input_ready_cv_.notify_one();
+ }
+ return msg;
+ };
+ auto input_and_signal_future = std::async(std::launch::async, wait_input_and_signal);
+ input_ready_cv_.wait(input_ready_lock, [&]() { return input_ready; });
+ // now an input is ready, so let's acquire the stateLock
+
+ stateLock.lock();
+ auto user_or_abort = input_and_signal_future.get();
+
+ if (user_or_abort->GetType() == cuttlefish::confui::ConfUiCmd::kAbort) {
+ ConfUiLog(ERROR) << "Abort called or the user/host aborted"
+ << " while waiting user response";
+ return {ResponseCode::Aborted, {}, {}};
+ }
+ if (user_or_abort->GetType() == cuttlefish::confui::ConfUiCmd::kCliAck) {
+ auto& ack_msg = static_cast<cuttlefish::confui::ConfUiAckMessage&>(*user_or_abort);
+ if (ack_msg.IsSuccess()) {
+ ConfUiLog(ERROR) << "When host failed, it is supposed to send "
+ << "kCliAck with fail, but this is kCliAck with success";
+ }
+ error_rc = ResponseCode::SystemError;
+ return error;
+ }
+ cuttlefish::confui::ConfUiCliResponseMessage& user_response =
+ static_cast<cuttlefish::confui::ConfUiCliResponseMessage&>(*user_or_abort);
+
+ // pick, see if it is response, abort cmd
+ // handle abort or error response here
+ ConfUiLog(INFO) << "Making up the result";
+
+ // make up the result triple
+ if (user_response.GetResponse() == cuttlefish::confui::UserResponse::kCancel) {
+ SerializedSend(cuttlefish::confui::SendStopCmd, host_fd_, GetSessionId());
+ return {ResponseCode::Canceled, {}, {}};
+ }
+
+ if (user_response.GetResponse() != cuttlefish::confui::UserResponse::kConfirm) {
+ ConfUiLog(ERROR) << "Unexpected user response that is " << user_response.GetResponse();
+ return error;
+ }
+ SerializedSend(cuttlefish::confui::SendStopCmd, host_fd_, GetSessionId());
+ // ############################## Start 4th Phase - cleanup ##################################
+ return {ResponseCode::OK, user_response.GetMessage(), user_response.GetSign()};
+}
+
+Return<ResponseCode> GuestSession::DeliverSecureInputEvent(
+ const android::hardware::keymaster::V4_0::HardwareAuthToken& auth_token) {
+ ResponseCode rc = ResponseCode::Ignored;
+ {
+ /*
+ * deliverSecureInputEvent is only used by the VTS test to mock human input. A correct
+ * implementation responds with a mock confirmation token signed with a test key. The
+ * problem is that the non interactive grace period was not formalized in the HAL spec,
+ * so that the VTS test does not account for the grace period. (It probably should.)
+ * This means we can only pass the VTS test if we block until the grace period is over
+ * (SetupDone -> Interactive) before we deliver the input event.
+ *
+ * The true secure input is delivered by a different mechanism and gets ignored -
+ * not queued - until the grace period is over.
+ *
+ */
+ std::unique_lock<std::mutex> stateLock(listener_state_lock_);
+ listener_state_condv_.wait(stateLock,
+ [this] { return listener_state_ != ListenerState::SetupDone; });
+ if (listener_state_ != ListenerState::Interactive) return ResponseCode::Ignored;
+ if (static_cast<TestModeCommands>(auth_token.challenge) == TestModeCommands::OK_EVENT) {
+ SerializedSend(cuttlefish::confui::SendUserSelection, host_fd_, GetSessionId(),
+ cuttlefish::confui::UserResponse::kConfirm);
+ } else {
+ SerializedSend(cuttlefish::confui::SendUserSelection, host_fd_, GetSessionId(),
+ cuttlefish::confui::UserResponse::kCancel);
+ }
+ rc = ResponseCode::OK;
+ }
+ listener_state_condv_.notify_all();
+ // VTS test expect an OK response if the event was successfully delivered.
+ // But since the TA returns the callback response now, we have to translate
+ // Canceled into OK. Canceled is only returned if the delivered event canceled
+ // the operation, which means that the event was successfully delivered. Thus
+ // we return OK.
+ if (rc == ResponseCode::Canceled) return ResponseCode::OK;
+ return rc;
+}
+
+Return<void> GuestSession::Abort() {
+ {
+ std::unique_lock<std::mutex> stateLock(listener_state_lock_);
+ if (listener_state_ == ListenerState::SetupDone ||
+ listener_state_ == ListenerState::Interactive) {
+ if (host_fd_->IsOpen()) {
+ SerializedSend(cuttlefish::confui::SendAbortCmd, host_fd_, GetSessionId());
+ }
+ using cuttlefish::confui::ConfUiAbortMessage;
+ auto local_abort_cmd = std::make_unique<ConfUiAbortMessage>(GetSessionId());
+ incoming_msg_queue_.Push(std::move(local_abort_cmd));
+ }
+ }
+ listener_state_condv_.notify_all();
+ return Void();
+}
+} // namespace implementation
+} // namespace V1_0
+} // namespace confirmationui
+} // namespace hardware
+} // namespace android
diff --git a/guest/hals/confirmationui/guest_session.h b/guest/hals/confirmationui/guest_session.h
new file mode 100644
index 0000000..0dceffe
--- /dev/null
+++ b/guest/hals/confirmationui/guest_session.h
@@ -0,0 +1,146 @@
+/*
+ *
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android-base/logging.h>
+#include <android/hardware/confirmationui/1.0/types.h>
+#include <android/hardware/keymaster/4.0/types.h>
+
+#include <condition_variable>
+#include <cstdint>
+#include <memory>
+#include <mutex>
+#include <string>
+#include <tuple>
+#include <vector>
+
+#include "common/libs/concurrency/thread_safe_queue.h"
+#include "common/libs/confui/confui.h"
+#include "common/libs/fs/shared_fd.h"
+
+namespace android {
+namespace hardware {
+namespace confirmationui {
+namespace V1_0 {
+namespace implementation {
+class GuestSession {
+ public:
+ using ConfUiMessage = cuttlefish::confui::ConfUiMessage;
+ using ConfUiAckMessage = cuttlefish::confui::ConfUiAckMessage;
+ using Queue = cuttlefish::ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>;
+ using QueueImpl = Queue::QueueImpl;
+
+ enum class ListenerState : uint32_t {
+ None = 0,
+ Starting = 1,
+ SetupDone = 2,
+ Interactive = 3,
+ Terminating = 4,
+ };
+
+ GuestSession(const std::uint32_t session_id, ListenerState& listener_state,
+ std::mutex& listener_state_lock, std::condition_variable& listener_state_condv,
+ cuttlefish::SharedFD host_fd, const teeui::MsgString& promptText,
+ const teeui::MsgVector<uint8_t>& extraData, const teeui::MsgString& locale,
+ const teeui::MsgVector<teeui::UIOption>& uiOptions)
+ : prompt_text_{promptText.begin(), promptText.end()}, extra_data_{extraData.begin(),
+ extraData.end()},
+ locale_{locale.begin(), locale.end()}, ui_options_{uiOptions.begin(), uiOptions.end()},
+ listener_state_(listener_state), listener_state_lock_(listener_state_lock),
+ listener_state_condv_(listener_state_condv), host_fd_{host_fd},
+ session_name_(MakeName(session_id)),
+ incoming_msg_queue_(
+ 20, [this](GuestSession::QueueImpl* impl) { return QueueFullHandler(impl); }) {}
+
+ ~GuestSession() {
+ // the thread for PromptUserConfirmation is still alive
+ // the host_fd_ may be alive
+ auto state = listener_state_;
+ if (state == ListenerState::SetupDone || state == ListenerState::Interactive) {
+ Abort();
+ }
+ // TODO(kwstephenkim): close fd once Session takes the ownership of fd
+ // join host_cmd_fetcher_thread_ once Session takes the ownership of fd
+ }
+
+ using ResultTriple =
+ std::tuple<ResponseCode, teeui::MsgVector<uint8_t>, teeui::MsgVector<uint8_t>>;
+ ResultTriple PromptUserConfirmation();
+
+ Return<ResponseCode> DeliverSecureInputEvent(
+ const ::android::hardware::keymaster::V4_0::HardwareAuthToken& secureInputToken);
+
+ Return<void> Abort();
+ std::string GetSessionId() const { return session_name_; }
+
+ void Push(std::unique_ptr<ConfUiMessage>&& msg) { incoming_msg_queue_.Push(std::move(msg)); }
+
+ private:
+ template <typename F, typename... Args>
+ bool SerializedSend(F&& f, cuttlefish::SharedFD fd, Args&&... args) {
+ if (!fd->IsOpen()) {
+ return false;
+ }
+ std::unique_lock<std::mutex> lock(send_serializer_mtx_);
+ return f(fd, std::forward<Args>(args)...);
+ }
+
+ void QueueFullHandler(QueueImpl* queue_impl) {
+ if (!queue_impl) {
+ LOG(ERROR) << "Registered queue handler is "
+ << "seeing nullptr for queue implementation.";
+ return;
+ }
+ const auto n = (queue_impl->size()) / 2;
+ // pop front half
+ queue_impl->erase(queue_impl->begin(), queue_impl->begin() + n);
+ }
+
+ std::string MakeName(const std::uint32_t i) const {
+ return "ConfirmationUiSession" + std::to_string(i);
+ }
+ std::string prompt_text_;
+ std::vector<std::uint8_t> extra_data_;
+ std::string locale_;
+ std::vector<teeui::UIOption> ui_options_;
+
+ /*
+ * lister_state_lock_ coordinates multiple threads that may
+ * call the three Confirmation UI HAL APIs concurrently
+ */
+ ListenerState& listener_state_;
+ std::mutex& listener_state_lock_;
+ std::condition_variable& listener_state_condv_;
+ cuttlefish::SharedFD host_fd_;
+
+ const std::string session_name_;
+ Queue incoming_msg_queue_;
+
+ /*
+ * multiple threads could try to write on the vsock at the
+ * same time. E.g. promptUserConfirmation() thread sends
+ * a command while abort() is being called. The abort() thread
+ * will try to write an abort command concurrently.
+ */
+ std::mutex send_serializer_mtx_;
+};
+} // namespace implementation
+} // namespace V1_0
+} // namespace confirmationui
+} // namespace hardware
+} // namespace android
diff --git a/guest/hals/confirmationui/include/TrustyConfirmationuiHal.h b/guest/hals/confirmationui/include/TrustyConfirmationuiHal.h
new file mode 100644
index 0000000..2ab9389
--- /dev/null
+++ b/guest/hals/confirmationui/include/TrustyConfirmationuiHal.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android/hardware/confirmationui/1.0/IConfirmationUI.h>
+
+namespace android {
+namespace hardware {
+namespace confirmationui {
+namespace V1_0 {
+namespace implementation {
+
+android::sp<IConfirmationUI> createTrustyConfirmationUI();
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace confirmationui
+} // namespace hardware
+} // namespace android
diff --git a/guest/hals/confirmationui/include/TrustyIpc.h b/guest/hals/confirmationui/include/TrustyIpc.h
new file mode 100644
index 0000000..eb764bc
--- /dev/null
+++ b/guest/hals/confirmationui/include/TrustyIpc.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <stdint.h>
+
+/*
+ * This interface is shared between Android and Trusty. There is a copy in each
+ * repository. They must be kept in sync.
+ */
+
+#define CONFIRMATIONUI_PORT "com.android.trusty.confirmationui"
+
+/**
+ * enum confirmationui_cmd - command identifiers for ConfirmationUI interface
+ * @CONFIRMATIONUI_RESP_BIT: response bit set as part of response
+ * @CONFIRMATIONUI_REQ_SHIFT: number of bits used by response bit
+ * @CONFIRMATIONUI_CMD_INIT: command to initialize session
+ * @CONFIRMATIONUI_CMD_MSG: command to send ConfirmationUI messages
+ */
+enum confirmationui_cmd : uint32_t {
+ CONFIRMATIONUI_RESP_BIT = 1,
+ CONFIRMATIONUI_REQ_SHIFT = 1,
+
+ CONFIRMATIONUI_CMD_INIT = (1 << CONFIRMATIONUI_REQ_SHIFT),
+ CONFIRMATIONUI_CMD_MSG = (2 << CONFIRMATIONUI_REQ_SHIFT),
+};
+
+/**
+ * struct confirmationui_hdr - header for ConfirmationUI messages
+ * @cmd: command identifier
+ *
+ * Note that no messages return a status code. Any error on the server side
+ * results in the connection being closed. So, operations can be assumed to be
+ * successful if they return a response.
+ */
+struct confirmationui_hdr {
+ uint32_t cmd;
+};
+
+/**
+ * struct confirmationui_init_req - arguments for request to initialize a
+ * session
+ * @shm_len: length of memory region being shared
+ *
+ * A handle to a memory region must be sent along with this message. This memory
+ * is send to ConfirmationUI messages.
+ */
+struct confirmationui_init_req {
+ uint32_t shm_len;
+};
+
+/**
+ * struct confirmationui_msg_args - arguments for sending a message
+ * @msg_len: length of message being sent
+ *
+ * Contents of the message are located in the shared memory region that is
+ * established using %CONFIRMATIONUI_CMD_INIT.
+ *
+ * ConfirmationUI messages can travel both ways.
+ */
+struct confirmationui_msg_args {
+ uint32_t msg_len;
+};
+
+#define CONFIRMATIONUI_MAX_MSG_SIZE 0x2000
diff --git a/guest/hals/confirmationui/service.cpp b/guest/hals/confirmationui/service.cpp
new file mode 100644
index 0000000..dd7e84b
--- /dev/null
+++ b/guest/hals/confirmationui/service.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <hidl/HidlTransportSupport.h>
+
+#include <TrustyConfirmationuiHal.h>
+
+using android::sp;
+using android::hardware::confirmationui::V1_0::implementation::createTrustyConfirmationUI;
+
+int main() {
+ ::android::hardware::configureRpcThreadpool(1, true /*willJoinThreadpool*/);
+ auto service = createTrustyConfirmationUI();
+ auto status = service->registerAsService();
+ if (status != android::OK) {
+ LOG(FATAL) << "Could not register service for ConfirmationUI 1.0 (" << status << ")";
+ return -1;
+ }
+ ::android::hardware::joinRpcThreadpool();
+ return -1;
+}
diff --git a/guest/hals/health/Android.bp b/guest/hals/health/Android.bp
index 81d19a3..cb9d866 100644
--- a/guest/hals/health/Android.bp
+++ b/guest/hals/health/Android.bp
@@ -17,6 +17,58 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
+cc_defaults {
+ name: "android.hardware.health-service.cuttlefish-defaults",
+ relative_install_path: "hw",
+ vintf_fragments: ["android.hardware.health-service.cuttlefish.xml"],
+
+ srcs: [
+ "health-aidl.cpp",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ static_libs: [
+ "android.hardware.health-translate-ndk",
+ "libbatterymonitor",
+ "libhealthloop",
+ "libhealth_aidl_impl",
+ ],
+
+ shared_libs: [
+ "libbase",
+ "libbinder_ndk",
+ "libcutils",
+ "libhidlbase",
+ "liblog",
+ "libutils",
+ "android.hardware.health-V1-ndk",
+ ],
+
+ defaults: ["enabled_on_p_and_later"],
+}
+
+cc_binary {
+ name: "android.hardware.health-service.cuttlefish",
+ defaults: ["android.hardware.health-service.cuttlefish-defaults"],
+ proprietary: true,
+ init_rc: ["android.hardware.health-service.cuttlefish.rc"],
+ overrides: ["charger"],
+}
+
+cc_binary {
+ name: "android.hardware.health-service.cuttlefish_recovery",
+ defaults: ["android.hardware.health-service.cuttlefish-defaults"],
+ recovery: true,
+ init_rc: ["android.hardware.health-service.cuttlefish_recovery.rc"],
+ overrides: ["charger.recovery"],
+}
+
+// Deprecated. Retained to be used on other devices. It is not installed on cuttlefish.
+// TODO(b/210183170): Delete once other devices transition to the AIDL HAL.
cc_library_shared {
name: "[email protected]",
stem: "[email protected]",
@@ -26,7 +78,7 @@
relative_install_path: "hw",
srcs: [
- "health.cpp",
+ "health-hidl.cpp",
],
cflags: [
diff --git a/guest/hals/health/android.hardware.health-service.cuttlefish.rc b/guest/hals/health/android.hardware.health-service.cuttlefish.rc
new file mode 100644
index 0000000..8c2f153
--- /dev/null
+++ b/guest/hals/health/android.hardware.health-service.cuttlefish.rc
@@ -0,0 +1,8 @@
+service vendor.health-cuttlefish /vendor/bin/hw/android.hardware.health-service.cuttlefish
+ class hal
+ user system
+ group system
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+ file /dev/kmsg w
+
+# cuttlefish has no charger mode.
diff --git a/guest/hals/health/android.hardware.health-service.cuttlefish.xml b/guest/hals/health/android.hardware.health-service.cuttlefish.xml
new file mode 100644
index 0000000..98026cb
--- /dev/null
+++ b/guest/hals/health/android.hardware.health-service.cuttlefish.xml
@@ -0,0 +1,7 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.health</name>
+ <version>1</version>
+ <fqname>IHealth/default</fqname>
+ </hal>
+</manifest>
diff --git a/guest/hals/health/android.hardware.health-service.cuttlefish_recovery.rc b/guest/hals/health/android.hardware.health-service.cuttlefish_recovery.rc
new file mode 100644
index 0000000..58e4405
--- /dev/null
+++ b/guest/hals/health/android.hardware.health-service.cuttlefish_recovery.rc
@@ -0,0 +1,7 @@
+service vendor.health-cuttlefish /system/bin/hw/android.hardware.health-service.cuttlefish_recovery
+ class hal
+ seclabel u:r:hal_health_default:s0
+ user system
+ group system
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+ file /dev/kmsg w
diff --git a/guest/hals/health/health-aidl.cpp b/guest/hals/health/health-aidl.cpp
new file mode 100644
index 0000000..595971f
--- /dev/null
+++ b/guest/hals/health/health-aidl.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "android.hardware.health-service.cuttlefish"
+
+#include <memory>
+#include <string_view>
+
+#include <android-base/logging.h>
+#include <android/binder_interface_utils.h>
+#include <health-impl/Health.h>
+#include <health/utils.h>
+
+using ::aidl::android::hardware::health::BatteryHealth;
+using ::aidl::android::hardware::health::BatteryStatus;
+using ::aidl::android::hardware::health::HalHealthLoop;
+using ::aidl::android::hardware::health::Health;
+using ::aidl::android::hardware::health::HealthInfo;
+using ::aidl::android::hardware::health::IHealth;
+using ::android::hardware::health::InitHealthdConfig;
+using ::ndk::ScopedAStatus;
+using ::ndk::SharedRefBase;
+using namespace std::literals;
+
+namespace aidl::android::hardware::health {
+
+// Health HAL implementation for cuttlefish. Note that in this implementation,
+// cuttlefish pretends to be a device with a battery being charged.
+// Implementations on real devices should not insert these fake values. For
+// example, a battery-less device should report batteryPresent = false and
+// batteryStatus = UNKNOWN.
+
+class HealthImpl : public Health {
+ public:
+ // Inherit constructor.
+ using Health::Health;
+ virtual ~HealthImpl() {}
+
+ ScopedAStatus getChargeCounterUah(int32_t* out) override;
+ ScopedAStatus getCurrentNowMicroamps(int32_t* out) override;
+ ScopedAStatus getCurrentAverageMicroamps(int32_t* out) override;
+ ScopedAStatus getCapacity(int32_t* out) override;
+ ScopedAStatus getChargeStatus(BatteryStatus* out) override;
+
+ protected:
+ void UpdateHealthInfo(HealthInfo* health_info) override;
+};
+
+void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) {
+ health_info->chargerAcOnline = true;
+ health_info->chargerUsbOnline = true;
+ health_info->chargerWirelessOnline = false;
+ health_info->maxChargingCurrentMicroamps = 500000;
+ health_info->maxChargingVoltageMicrovolts = 5000000;
+ health_info->batteryStatus = BatteryStatus::CHARGING;
+ health_info->batteryHealth = BatteryHealth::GOOD;
+ health_info->batteryPresent = true;
+ health_info->batteryLevel = 85;
+ health_info->batteryVoltageMillivolts = 3600;
+ health_info->batteryTemperatureTenthsCelsius = 350;
+ health_info->batteryCurrentMicroamps = 400000;
+ health_info->batteryCycleCount = 32;
+ health_info->batteryFullChargeUah = 4000000;
+ health_info->batteryChargeCounterUah = 1900000;
+ health_info->batteryTechnology = "Li-ion";
+}
+
+ScopedAStatus HealthImpl::getChargeCounterUah(int32_t* out) {
+ *out = 1900000;
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus HealthImpl::getCurrentNowMicroamps(int32_t* out) {
+ *out = 400000;
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus HealthImpl::getCurrentAverageMicroamps(int32_t*) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ScopedAStatus HealthImpl::getCapacity(int32_t* out) {
+ *out = 85;
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus HealthImpl::getChargeStatus(BatteryStatus* out) {
+ *out = BatteryStatus::CHARGING;
+ return ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::health
+
+int main(int, [[maybe_unused]] char** argv) {
+#ifdef __ANDROID_RECOVERY__
+ android::base::InitLogging(argv, android::base::KernelLogger);
+#endif
+ // Cuttlefish does not support offline-charging mode, hence do not handle
+ // --charger option.
+ using aidl::android::hardware::health::HealthImpl;
+ LOG(INFO) << "Starting health HAL.";
+ auto config = std::make_unique<healthd_config>();
+ InitHealthdConfig(config.get());
+ auto binder = SharedRefBase::make<HealthImpl>("default", std::move(config));
+ auto hal_health_loop = std::make_shared<HalHealthLoop>(binder, binder);
+ return hal_health_loop->StartLoop();
+}
diff --git a/guest/hals/health/health.cpp b/guest/hals/health/health-hidl.cpp
similarity index 100%
rename from guest/hals/health/health.cpp
rename to guest/hals/health/health-hidl.cpp
diff --git a/guest/hals/health/storage/Android.bp b/guest/hals/health/storage/Android.bp
index dc57d0f..1ca807d1 100644
--- a/guest/hals/health/storage/Android.bp
+++ b/guest/hals/health/storage/Android.bp
@@ -38,7 +38,7 @@
],
shared_libs: [
- "android.hardware.health.storage-V1-ndk_platform",
+ "android.hardware.health.storage-V1-ndk",
"libbase",
"libbinder_ndk",
"libutils",
diff --git a/guest/hals/identity/Android.bp b/guest/hals/identity/Android.bp
new file mode 100644
index 0000000..8596b39
--- /dev/null
+++ b/guest/hals/identity/Android.bp
@@ -0,0 +1,51 @@
+cc_binary {
+ name: "android.hardware.identity-service.remote",
+ relative_install_path: "hw",
+ init_rc: ["android.hardware.identity-service.remote.rc"],
+ vintf_fragments: ["android.hardware.identity-service.remote.xml"],
+ vendor: true,
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-g",
+ ],
+ shared_libs: [
+ "liblog",
+ "libcrypto",
+ "libbinder_ndk",
+ "libkeymaster_messages",
+ ],
+ static_libs: [
+ "libbase",
+ "libcppbor_external",
+ "libcppcose_rkp",
+ "libutils",
+ "libsoft_attestation_cert",
+ "libkeymaster_portable",
+ "libsoft_attestation_cert",
+ "libpuresoftkeymasterdevice",
+ "android.hardware.identity-support-lib",
+ "android.hardware.identity-V3-ndk",
+ "android.hardware.keymaster-V3-ndk",
+ "android.hardware.security.keymint-V1-ndk",
+ ],
+ local_include_dirs: [
+ "common",
+ "libeic",
+ ],
+ srcs: [
+ "service.cpp",
+ "RemoteSecureHardwareProxy.cpp",
+ "common/IdentityCredential.cpp",
+ "common/IdentityCredentialStore.cpp",
+ "common/WritableIdentityCredential.cpp",
+ "libeic/EicCbor.c",
+ "libeic/EicPresentation.c",
+ "libeic/EicProvisioning.c",
+ "libeic/EicOpsImpl.cc",
+ ],
+ required: [
+ "android.hardware.identity_credential.xml",
+ ],
+}
+
diff --git a/guest/hals/identity/OWNERS b/guest/hals/identity/OWNERS
new file mode 100644
index 0000000..190f95c
--- /dev/null
+++ b/guest/hals/identity/OWNERS
@@ -0,0 +1 @@
+include /platform/hardware/interfaces:/identity/OWNERS
diff --git a/guest/hals/identity/RemoteSecureHardwareProxy.cpp b/guest/hals/identity/RemoteSecureHardwareProxy.cpp
new file mode 100644
index 0000000..3ec8aaa
--- /dev/null
+++ b/guest/hals/identity/RemoteSecureHardwareProxy.cpp
@@ -0,0 +1,412 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "RemoteSecureHardwareProxy"
+
+#include "RemoteSecureHardwareProxy.h"
+
+#include <android/hardware/identity/support/IdentityCredentialSupport.h>
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <string.h>
+
+#include <openssl/sha.h>
+
+#include <openssl/aes.h>
+#include <openssl/bn.h>
+#include <openssl/crypto.h>
+#include <openssl/ec.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/hkdf.h>
+#include <openssl/hmac.h>
+#include <openssl/objects.h>
+#include <openssl/pem.h>
+#include <openssl/pkcs12.h>
+#include <openssl/rand.h>
+#include <openssl/x509.h>
+#include <openssl/x509_vfy.h>
+
+#include <libeic.h>
+
+using ::std::optional;
+using ::std::string;
+using ::std::tuple;
+using ::std::vector;
+
+namespace android::hardware::identity {
+
+// ----------------------------------------------------------------------
+
+RemoteSecureHardwareProvisioningProxy::RemoteSecureHardwareProvisioningProxy() {
+}
+
+RemoteSecureHardwareProvisioningProxy::
+ ~RemoteSecureHardwareProvisioningProxy() {}
+
+bool RemoteSecureHardwareProvisioningProxy::shutdown() {
+ LOG(INFO) << "RemoteSecureHardwarePresentationProxy shutdown";
+ return true;
+}
+
+bool RemoteSecureHardwareProvisioningProxy::initialize(bool testCredential) {
+ LOG(INFO) << "RemoteSecureHardwareProvisioningProxy created, "
+ "sizeof(EicProvisioning): "
+ << sizeof(EicProvisioning);
+ return eicProvisioningInit(&ctx_, testCredential);
+}
+
+bool RemoteSecureHardwareProvisioningProxy::initializeForUpdate(
+ bool testCredential, string docType,
+ vector<uint8_t> encryptedCredentialKeys) {
+ return eicProvisioningInitForUpdate(
+ &ctx_, testCredential, docType.c_str(), docType.size(),
+ encryptedCredentialKeys.data(), encryptedCredentialKeys.size());
+}
+
+// Returns public key certificate.
+optional<vector<uint8_t>>
+RemoteSecureHardwareProvisioningProxy::createCredentialKey(
+ const vector<uint8_t>& challenge, const vector<uint8_t>& applicationId) {
+ uint8_t publicKeyCert[4096];
+ size_t publicKeyCertSize = sizeof publicKeyCert;
+ if (!eicProvisioningCreateCredentialKey(
+ &ctx_, challenge.data(), challenge.size(), applicationId.data(),
+ applicationId.size(), publicKeyCert, &publicKeyCertSize)) {
+ return {};
+ }
+ vector<uint8_t> pubKeyCert(publicKeyCertSize);
+ memcpy(pubKeyCert.data(), publicKeyCert, publicKeyCertSize);
+ return pubKeyCert;
+}
+
+bool RemoteSecureHardwareProvisioningProxy::startPersonalization(
+ int accessControlProfileCount, vector<int> entryCounts,
+ const string& docType, size_t expectedProofOfProvisioningSize) {
+ if (!eicProvisioningStartPersonalization(
+ &ctx_, accessControlProfileCount, entryCounts.data(),
+ entryCounts.size(), docType.c_str(), docType.size(),
+ expectedProofOfProvisioningSize)) {
+ return false;
+ }
+ return true;
+}
+
+// Returns MAC (28 bytes).
+optional<vector<uint8_t>>
+RemoteSecureHardwareProvisioningProxy::addAccessControlProfile(
+ int id, const vector<uint8_t>& readerCertificate,
+ bool userAuthenticationRequired, uint64_t timeoutMillis,
+ uint64_t secureUserId) {
+ vector<uint8_t> mac(28);
+ uint8_t scratchSpace[512];
+ if (!eicProvisioningAddAccessControlProfile(
+ &ctx_, id, readerCertificate.data(), readerCertificate.size(),
+ userAuthenticationRequired, timeoutMillis, secureUserId, mac.data(),
+ scratchSpace, sizeof(scratchSpace))) {
+ return {};
+ }
+ return mac;
+}
+
+bool RemoteSecureHardwareProvisioningProxy::beginAddEntry(
+ const vector<int>& accessControlProfileIds, const string& nameSpace,
+ const string& name, uint64_t entrySize) {
+ uint8_t scratchSpace[512];
+ vector<uint8_t> uint8AccessControlProfileIds;
+ for (size_t i = 0; i < accessControlProfileIds.size(); i++) {
+ uint8AccessControlProfileIds.push_back(accessControlProfileIds[i] & 0xFF);
+ }
+
+ return eicProvisioningBeginAddEntry(
+ &ctx_, uint8AccessControlProfileIds.data(),
+ uint8AccessControlProfileIds.size(), nameSpace.c_str(), nameSpace.size(),
+ name.c_str(), name.size(), entrySize, scratchSpace, sizeof(scratchSpace));
+}
+
+// Returns encryptedContent.
+optional<vector<uint8_t>> RemoteSecureHardwareProvisioningProxy::addEntryValue(
+ const vector<int>& accessControlProfileIds, const string& nameSpace,
+ const string& name, const vector<uint8_t>& content) {
+ vector<uint8_t> eicEncryptedContent;
+ uint8_t scratchSpace[512];
+ vector<uint8_t> uint8AccessControlProfileIds;
+ for (size_t i = 0; i < accessControlProfileIds.size(); i++) {
+ uint8AccessControlProfileIds.push_back(accessControlProfileIds[i] & 0xFF);
+ }
+
+ eicEncryptedContent.resize(content.size() + 28);
+ if (!eicProvisioningAddEntryValue(&ctx_, uint8AccessControlProfileIds.data(),
+ uint8AccessControlProfileIds.size(),
+ nameSpace.c_str(), nameSpace.size(),
+ name.c_str(), name.size(), content.data(),
+ content.size(), eicEncryptedContent.data(),
+ scratchSpace, sizeof(scratchSpace))) {
+ return {};
+ }
+ return eicEncryptedContent;
+}
+
+// Returns signatureOfToBeSigned (EIC_ECDSA_P256_SIGNATURE_SIZE bytes).
+optional<vector<uint8_t>>
+RemoteSecureHardwareProvisioningProxy::finishAddingEntries() {
+ vector<uint8_t> signatureOfToBeSigned(EIC_ECDSA_P256_SIGNATURE_SIZE);
+ if (!eicProvisioningFinishAddingEntries(&ctx_,
+ signatureOfToBeSigned.data())) {
+ return {};
+ }
+ return signatureOfToBeSigned;
+}
+
+// Returns encryptedCredentialKeys.
+optional<vector<uint8_t>>
+RemoteSecureHardwareProvisioningProxy::finishGetCredentialData(
+ const string& docType) {
+ vector<uint8_t> encryptedCredentialKeys(116);
+ size_t size = encryptedCredentialKeys.size();
+ if (!eicProvisioningFinishGetCredentialData(
+ &ctx_, docType.c_str(), docType.size(),
+ encryptedCredentialKeys.data(), &size)) {
+ return {};
+ }
+ encryptedCredentialKeys.resize(size);
+ return encryptedCredentialKeys;
+}
+
+// ----------------------------------------------------------------------
+
+RemoteSecureHardwarePresentationProxy::RemoteSecureHardwarePresentationProxy() {
+}
+
+RemoteSecureHardwarePresentationProxy::
+ ~RemoteSecureHardwarePresentationProxy() {}
+
+bool RemoteSecureHardwarePresentationProxy::initialize(
+ bool testCredential, string docType,
+ vector<uint8_t> encryptedCredentialKeys) {
+ LOG(INFO) << "RemoteSecureHardwarePresentationProxy created, "
+ "sizeof(EicPresentation): "
+ << sizeof(EicPresentation);
+ return eicPresentationInit(&ctx_, testCredential, docType.c_str(),
+ docType.size(), encryptedCredentialKeys.data(),
+ encryptedCredentialKeys.size());
+}
+
+// Returns publicKeyCert (1st component) and signingKeyBlob (2nd component)
+optional<pair<vector<uint8_t>, vector<uint8_t>>>
+RemoteSecureHardwarePresentationProxy::generateSigningKeyPair(string docType,
+ time_t now) {
+ uint8_t publicKeyCert[512];
+ size_t publicKeyCertSize = sizeof(publicKeyCert);
+ vector<uint8_t> signingKeyBlob(60);
+
+ if (!eicPresentationGenerateSigningKeyPair(
+ &ctx_, docType.c_str(), docType.size(), now, publicKeyCert,
+ &publicKeyCertSize, signingKeyBlob.data())) {
+ return {};
+ }
+
+ vector<uint8_t> cert;
+ cert.resize(publicKeyCertSize);
+ memcpy(cert.data(), publicKeyCert, publicKeyCertSize);
+
+ return std::make_pair(cert, signingKeyBlob);
+}
+
+// Returns private key
+optional<vector<uint8_t>>
+RemoteSecureHardwarePresentationProxy::createEphemeralKeyPair() {
+ vector<uint8_t> priv(EIC_P256_PRIV_KEY_SIZE);
+ if (!eicPresentationCreateEphemeralKeyPair(&ctx_, priv.data())) {
+ return {};
+ }
+ return priv;
+}
+
+optional<uint64_t>
+RemoteSecureHardwarePresentationProxy::createAuthChallenge() {
+ uint64_t challenge;
+ if (!eicPresentationCreateAuthChallenge(&ctx_, &challenge)) {
+ return {};
+ }
+ return challenge;
+}
+
+bool RemoteSecureHardwarePresentationProxy::shutdown() {
+ LOG(INFO) << "RemoteSecureHardwarePresentationProxy shutdown";
+ return true;
+}
+
+bool RemoteSecureHardwarePresentationProxy::pushReaderCert(
+ const vector<uint8_t>& certX509) {
+ return eicPresentationPushReaderCert(&ctx_, certX509.data(), certX509.size());
+}
+
+bool RemoteSecureHardwarePresentationProxy::validateRequestMessage(
+ const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& requestMessage, int coseSignAlg,
+ const vector<uint8_t>& readerSignatureOfToBeSigned) {
+ return eicPresentationValidateRequestMessage(
+ &ctx_, sessionTranscript.data(), sessionTranscript.size(),
+ requestMessage.data(), requestMessage.size(), coseSignAlg,
+ readerSignatureOfToBeSigned.data(), readerSignatureOfToBeSigned.size());
+}
+
+bool RemoteSecureHardwarePresentationProxy::setAuthToken(
+ uint64_t challenge, uint64_t secureUserId, uint64_t authenticatorId,
+ int hardwareAuthenticatorType, uint64_t timeStamp,
+ const vector<uint8_t>& mac, uint64_t verificationTokenChallenge,
+ uint64_t verificationTokenTimestamp, int verificationTokenSecurityLevel,
+ const vector<uint8_t>& verificationTokenMac) {
+ return eicPresentationSetAuthToken(
+ &ctx_, challenge, secureUserId, authenticatorId,
+ hardwareAuthenticatorType, timeStamp, mac.data(), mac.size(),
+ verificationTokenChallenge, verificationTokenTimestamp,
+ verificationTokenSecurityLevel, verificationTokenMac.data(),
+ verificationTokenMac.size());
+}
+
+optional<bool>
+RemoteSecureHardwarePresentationProxy::validateAccessControlProfile(
+ int id, const vector<uint8_t>& readerCertificate,
+ bool userAuthenticationRequired, int timeoutMillis, uint64_t secureUserId,
+ const vector<uint8_t>& mac) {
+ bool accessGranted = false;
+ uint8_t scratchSpace[512];
+ if (!eicPresentationValidateAccessControlProfile(
+ &ctx_, id, readerCertificate.data(), readerCertificate.size(),
+ userAuthenticationRequired, timeoutMillis, secureUserId, mac.data(),
+ &accessGranted, scratchSpace, sizeof(scratchSpace))) {
+ return {};
+ }
+ return accessGranted;
+}
+
+bool RemoteSecureHardwarePresentationProxy::startRetrieveEntries() {
+ return eicPresentationStartRetrieveEntries(&ctx_);
+}
+
+bool RemoteSecureHardwarePresentationProxy::calcMacKey(
+ const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& readerEphemeralPublicKey,
+ const vector<uint8_t>& signingKeyBlob, const string& docType,
+ unsigned int numNamespacesWithValues,
+ size_t expectedProofOfProvisioningSize) {
+ if (signingKeyBlob.size() != 60) {
+ eicDebug("Unexpected size %zd of signingKeyBlob, expected 60",
+ signingKeyBlob.size());
+ return false;
+ }
+ return eicPresentationCalcMacKey(
+ &ctx_, sessionTranscript.data(), sessionTranscript.size(),
+ readerEphemeralPublicKey.data(), signingKeyBlob.data(), docType.c_str(),
+ docType.size(), numNamespacesWithValues, expectedProofOfProvisioningSize);
+}
+
+AccessCheckResult
+RemoteSecureHardwarePresentationProxy::startRetrieveEntryValue(
+ const string& nameSpace, const string& name,
+ unsigned int newNamespaceNumEntries, int32_t entrySize,
+ const vector<int32_t>& accessControlProfileIds) {
+ uint8_t scratchSpace[512];
+ vector<uint8_t> uint8AccessControlProfileIds;
+ for (size_t i = 0; i < accessControlProfileIds.size(); i++) {
+ uint8AccessControlProfileIds.push_back(accessControlProfileIds[i] & 0xFF);
+ }
+
+ EicAccessCheckResult result = eicPresentationStartRetrieveEntryValue(
+ &ctx_, nameSpace.c_str(), nameSpace.size(), name.c_str(), name.size(),
+ newNamespaceNumEntries, entrySize, uint8AccessControlProfileIds.data(),
+ uint8AccessControlProfileIds.size(), scratchSpace, sizeof(scratchSpace));
+ switch (result) {
+ case EIC_ACCESS_CHECK_RESULT_OK:
+ return AccessCheckResult::kOk;
+ case EIC_ACCESS_CHECK_RESULT_NO_ACCESS_CONTROL_PROFILES:
+ return AccessCheckResult::kNoAccessControlProfiles;
+ case EIC_ACCESS_CHECK_RESULT_FAILED:
+ return AccessCheckResult::kFailed;
+ case EIC_ACCESS_CHECK_RESULT_USER_AUTHENTICATION_FAILED:
+ return AccessCheckResult::kUserAuthenticationFailed;
+ case EIC_ACCESS_CHECK_RESULT_READER_AUTHENTICATION_FAILED:
+ return AccessCheckResult::kReaderAuthenticationFailed;
+ }
+ eicDebug("Unknown result with code %d, returning kFailed", (int)result);
+ return AccessCheckResult::kFailed;
+}
+
+optional<vector<uint8_t>>
+RemoteSecureHardwarePresentationProxy::retrieveEntryValue(
+ const vector<uint8_t>& encryptedContent, const string& nameSpace,
+ const string& name, const vector<int32_t>& accessControlProfileIds) {
+ uint8_t scratchSpace[512];
+ vector<uint8_t> uint8AccessControlProfileIds;
+ for (size_t i = 0; i < accessControlProfileIds.size(); i++) {
+ uint8AccessControlProfileIds.push_back(accessControlProfileIds[i] & 0xFF);
+ }
+
+ vector<uint8_t> content;
+ content.resize(encryptedContent.size() - 28);
+ if (!eicPresentationRetrieveEntryValue(
+ &ctx_, encryptedContent.data(), encryptedContent.size(),
+ content.data(), nameSpace.c_str(), nameSpace.size(), name.c_str(),
+ name.size(), uint8AccessControlProfileIds.data(),
+ uint8AccessControlProfileIds.size(), scratchSpace,
+ sizeof(scratchSpace))) {
+ return {};
+ }
+ return content;
+}
+
+optional<vector<uint8_t>>
+RemoteSecureHardwarePresentationProxy::finishRetrieval() {
+ vector<uint8_t> mac(32);
+ size_t macSize = 32;
+ if (!eicPresentationFinishRetrieval(&ctx_, mac.data(), &macSize)) {
+ return {};
+ }
+ mac.resize(macSize);
+ return mac;
+}
+
+optional<vector<uint8_t>>
+RemoteSecureHardwarePresentationProxy::deleteCredential(
+ const string& docType, const vector<uint8_t>& challenge,
+ bool includeChallenge, size_t proofOfDeletionCborSize) {
+ vector<uint8_t> signatureOfToBeSigned(EIC_ECDSA_P256_SIGNATURE_SIZE);
+ if (!eicPresentationDeleteCredential(
+ &ctx_, docType.c_str(), docType.size(), challenge.data(),
+ challenge.size(), includeChallenge, proofOfDeletionCborSize,
+ signatureOfToBeSigned.data())) {
+ return {};
+ }
+ return signatureOfToBeSigned;
+}
+
+optional<vector<uint8_t>> RemoteSecureHardwarePresentationProxy::proveOwnership(
+ const string& docType, bool testCredential,
+ const vector<uint8_t>& challenge, size_t proofOfOwnershipCborSize) {
+ vector<uint8_t> signatureOfToBeSigned(EIC_ECDSA_P256_SIGNATURE_SIZE);
+ if (!eicPresentationProveOwnership(&ctx_, docType.c_str(), docType.size(),
+ testCredential, challenge.data(),
+ challenge.size(), proofOfOwnershipCborSize,
+ signatureOfToBeSigned.data())) {
+ return {};
+ }
+ return signatureOfToBeSigned;
+}
+
+} // namespace android::hardware::identity
diff --git a/guest/hals/identity/RemoteSecureHardwareProxy.h b/guest/hals/identity/RemoteSecureHardwareProxy.h
new file mode 100644
index 0000000..39cb422
--- /dev/null
+++ b/guest/hals/identity/RemoteSecureHardwareProxy.h
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_FAKESECUREHARDWAREPROXY_H
+#define ANDROID_HARDWARE_IDENTITY_FAKESECUREHARDWAREPROXY_H
+
+#include <libeic.h>
+
+#include "SecureHardwareProxy.h"
+
+namespace android::hardware::identity {
+
+// This implementation uses libEmbeddedIC in-process.
+//
+class RemoteSecureHardwareProvisioningProxy
+ : public SecureHardwareProvisioningProxy {
+ public:
+ RemoteSecureHardwareProvisioningProxy();
+ virtual ~RemoteSecureHardwareProvisioningProxy();
+
+ bool initialize(bool testCredential) override;
+
+ bool initializeForUpdate(bool testCredential, string docType,
+ vector<uint8_t> encryptedCredentialKeys) override;
+
+ bool shutdown() override;
+
+ // Returns public key certificate.
+ optional<vector<uint8_t>> createCredentialKey(
+ const vector<uint8_t>& challenge,
+ const vector<uint8_t>& applicationId) override;
+
+ bool startPersonalization(int accessControlProfileCount,
+ vector<int> entryCounts, const string& docType,
+ size_t expectedProofOfProvisioningSize) override;
+
+ // Returns MAC (28 bytes).
+ optional<vector<uint8_t>> addAccessControlProfile(
+ int id, const vector<uint8_t>& readerCertificate,
+ bool userAuthenticationRequired, uint64_t timeoutMillis,
+ uint64_t secureUserId) override;
+
+ bool beginAddEntry(const vector<int>& accessControlProfileIds,
+ const string& nameSpace, const string& name,
+ uint64_t entrySize) override;
+
+ // Returns encryptedContent.
+ optional<vector<uint8_t>> addEntryValue(
+ const vector<int>& accessControlProfileIds, const string& nameSpace,
+ const string& name, const vector<uint8_t>& content) override;
+
+ // Returns signatureOfToBeSigned (EIC_ECDSA_P256_SIGNATURE_SIZE bytes).
+ optional<vector<uint8_t>> finishAddingEntries() override;
+
+ // Returns encryptedCredentialKeys (80 bytes).
+ optional<vector<uint8_t>> finishGetCredentialData(
+ const string& docType) override;
+
+ protected:
+ EicProvisioning ctx_;
+};
+
+// This implementation uses libEmbeddedIC in-process.
+//
+class RemoteSecureHardwarePresentationProxy
+ : public SecureHardwarePresentationProxy {
+ public:
+ RemoteSecureHardwarePresentationProxy();
+ virtual ~RemoteSecureHardwarePresentationProxy();
+
+ bool initialize(bool testCredential, string docType,
+ vector<uint8_t> encryptedCredentialKeys) override;
+
+ // Returns publicKeyCert (1st component) and signingKeyBlob (2nd component)
+ optional<pair<vector<uint8_t>, vector<uint8_t>>> generateSigningKeyPair(
+ string docType, time_t now) override;
+
+ // Returns private key
+ optional<vector<uint8_t>> createEphemeralKeyPair() override;
+
+ optional<uint64_t> createAuthChallenge() override;
+
+ bool startRetrieveEntries() override;
+
+ bool setAuthToken(uint64_t challenge, uint64_t secureUserId,
+ uint64_t authenticatorId, int hardwareAuthenticatorType,
+ uint64_t timeStamp, const vector<uint8_t>& mac,
+ uint64_t verificationTokenChallenge,
+ uint64_t verificationTokenTimestamp,
+ int verificationTokenSecurityLevel,
+ const vector<uint8_t>& verificationTokenMac) override;
+
+ bool pushReaderCert(const vector<uint8_t>& certX509) override;
+
+ optional<bool> validateAccessControlProfile(
+ int id, const vector<uint8_t>& readerCertificate,
+ bool userAuthenticationRequired, int timeoutMillis, uint64_t secureUserId,
+ const vector<uint8_t>& mac) override;
+
+ bool validateRequestMessage(
+ const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& requestMessage, int coseSignAlg,
+ const vector<uint8_t>& readerSignatureOfToBeSigned) override;
+
+ bool calcMacKey(const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& readerEphemeralPublicKey,
+ const vector<uint8_t>& signingKeyBlob, const string& docType,
+ unsigned int numNamespacesWithValues,
+ size_t expectedProofOfProvisioningSize) override;
+
+ AccessCheckResult startRetrieveEntryValue(
+ const string& nameSpace, const string& name,
+ unsigned int newNamespaceNumEntries, int32_t entrySize,
+ const vector<int32_t>& accessControlProfileIds) override;
+
+ optional<vector<uint8_t>> retrieveEntryValue(
+ const vector<uint8_t>& encryptedContent, const string& nameSpace,
+ const string& name,
+ const vector<int32_t>& accessControlProfileIds) override;
+
+ optional<vector<uint8_t>> finishRetrieval() override;
+
+ optional<vector<uint8_t>> deleteCredential(
+ const string& docType, const vector<uint8_t>& challenge,
+ bool includeChallenge, size_t proofOfDeletionCborSize) override;
+
+ optional<vector<uint8_t>> proveOwnership(
+ const string& docType, bool testCredential,
+ const vector<uint8_t>& challenge,
+ size_t proofOfOwnershipCborSize) override;
+
+ bool shutdown() override;
+
+ protected:
+ EicPresentation ctx_;
+};
+
+// Factory implementation.
+//
+class RemoteSecureHardwareProxyFactory : public SecureHardwareProxyFactory {
+ public:
+ RemoteSecureHardwareProxyFactory() {}
+ virtual ~RemoteSecureHardwareProxyFactory() {}
+
+ sp<SecureHardwareProvisioningProxy> createProvisioningProxy() override {
+ return new RemoteSecureHardwareProvisioningProxy();
+ }
+
+ sp<SecureHardwarePresentationProxy> createPresentationProxy() override {
+ return new RemoteSecureHardwarePresentationProxy();
+ }
+};
+
+} // namespace android::hardware::identity
+
+#endif // ANDROID_HARDWARE_IDENTITY_FAKESECUREHARDWAREPROXY_H
diff --git a/guest/hals/identity/android.hardware.identity-service.remote.rc b/guest/hals/identity/android.hardware.identity-service.remote.rc
new file mode 100644
index 0000000..e1dc7a9
--- /dev/null
+++ b/guest/hals/identity/android.hardware.identity-service.remote.rc
@@ -0,0 +1,3 @@
+service vendor.identity-remote /vendor/bin/hw/android.hardware.identity-service.remote
+ class hal
+ user nobody
diff --git a/guest/hals/identity/android.hardware.identity-service.remote.xml b/guest/hals/identity/android.hardware.identity-service.remote.xml
new file mode 100644
index 0000000..a074250
--- /dev/null
+++ b/guest/hals/identity/android.hardware.identity-service.remote.xml
@@ -0,0 +1,10 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.identity</name>
+ <version>3</version>
+ <interface>
+ <name>IIdentityCredentialStore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/guest/hals/identity/common/IdentityCredential.cpp b/guest/hals/identity/common/IdentityCredential.cpp
new file mode 100644
index 0000000..3555c53
--- /dev/null
+++ b/guest/hals/identity/common/IdentityCredential.cpp
@@ -0,0 +1,945 @@
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IdentityCredential"
+
+#include "IdentityCredential.h"
+#include "IdentityCredentialStore.h"
+
+#include <android/hardware/identity/support/IdentityCredentialSupport.h>
+
+#include <string.h>
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+
+#include <cppbor.h>
+#include <cppbor_parse.h>
+
+#include "SecureHardwareProxy.h"
+#include "WritableIdentityCredential.h"
+
+namespace aidl::android::hardware::identity {
+
+using ::aidl::android::hardware::keymaster::Timestamp;
+using ::android::base::StringPrintf;
+using ::std::optional;
+
+using namespace ::android::hardware::identity;
+
+int IdentityCredential::initialize() {
+ if (credentialData_.size() == 0) {
+ LOG(ERROR) << "CredentialData is empty";
+ return IIdentityCredentialStore::STATUS_INVALID_DATA;
+ }
+ auto [item, _, message] = cppbor::parse(credentialData_);
+ if (item == nullptr) {
+ LOG(ERROR) << "CredentialData is not valid CBOR: " << message;
+ return IIdentityCredentialStore::STATUS_INVALID_DATA;
+ }
+
+ const cppbor::Array* arrayItem = item->asArray();
+ if (arrayItem == nullptr || arrayItem->size() != 3) {
+ LOG(ERROR) << "CredentialData is not an array with three elements";
+ return IIdentityCredentialStore::STATUS_INVALID_DATA;
+ }
+
+ const cppbor::Tstr* docTypeItem = (*arrayItem)[0]->asTstr();
+ const cppbor::Bool* testCredentialItem =
+ ((*arrayItem)[1]->asSimple() != nullptr
+ ? ((*arrayItem)[1]->asSimple()->asBool())
+ : nullptr);
+ const cppbor::Bstr* encryptedCredentialKeysItem = (*arrayItem)[2]->asBstr();
+ if (docTypeItem == nullptr || testCredentialItem == nullptr ||
+ encryptedCredentialKeysItem == nullptr) {
+ LOG(ERROR) << "CredentialData unexpected item types";
+ return IIdentityCredentialStore::STATUS_INVALID_DATA;
+ }
+
+ docType_ = docTypeItem->value();
+ testCredential_ = testCredentialItem->value();
+
+ encryptedCredentialKeys_ = encryptedCredentialKeysItem->value();
+ if (!hwProxy_->initialize(testCredential_, docType_,
+ encryptedCredentialKeys_)) {
+ LOG(ERROR) << "hwProxy->initialize failed";
+ return false;
+ }
+
+ return IIdentityCredentialStore::STATUS_OK;
+}
+
+ndk::ScopedAStatus IdentityCredential::deleteCredential(
+ vector<uint8_t>* outProofOfDeletionSignature) {
+ return deleteCredentialCommon({}, false, outProofOfDeletionSignature);
+}
+
+ndk::ScopedAStatus IdentityCredential::deleteCredentialWithChallenge(
+ const vector<uint8_t>& challenge,
+ vector<uint8_t>* outProofOfDeletionSignature) {
+ return deleteCredentialCommon(challenge, true, outProofOfDeletionSignature);
+}
+
+ndk::ScopedAStatus IdentityCredential::deleteCredentialCommon(
+ const vector<uint8_t>& challenge, bool includeChallenge,
+ vector<uint8_t>* outProofOfDeletionSignature) {
+ if (challenge.size() > 32) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA, "Challenge too big"));
+ }
+
+ cppbor::Array array = {"ProofOfDeletion", docType_, testCredential_};
+ if (includeChallenge) {
+ array = {"ProofOfDeletion", docType_, challenge, testCredential_};
+ }
+
+ vector<uint8_t> proofOfDeletionCbor = array.encode();
+ vector<uint8_t> podDigest = support::sha256(proofOfDeletionCbor);
+
+ optional<vector<uint8_t>> signatureOfToBeSigned = hwProxy_->deleteCredential(
+ docType_, challenge, includeChallenge, proofOfDeletionCbor.size());
+ if (!signatureOfToBeSigned) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error signing ProofOfDeletion"));
+ }
+
+ optional<vector<uint8_t>> signature =
+ support::coseSignEcDsaWithSignature(signatureOfToBeSigned.value(),
+ proofOfDeletionCbor, // data
+ {}); // certificateChain
+ if (!signature) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "Error signing data"));
+ }
+
+ *outProofOfDeletionSignature = signature.value();
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::proveOwnership(
+ const vector<uint8_t>& challenge,
+ vector<uint8_t>* outProofOfOwnershipSignature) {
+ if (challenge.size() > 32) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA, "Challenge too big"));
+ }
+
+ cppbor::Array array;
+ array = {"ProofOfOwnership", docType_, challenge, testCredential_};
+ vector<uint8_t> proofOfOwnershipCbor = array.encode();
+ vector<uint8_t> podDigest = support::sha256(proofOfOwnershipCbor);
+
+ optional<vector<uint8_t>> signatureOfToBeSigned = hwProxy_->proveOwnership(
+ docType_, testCredential_, challenge, proofOfOwnershipCbor.size());
+ if (!signatureOfToBeSigned) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error signing ProofOfOwnership"));
+ }
+
+ optional<vector<uint8_t>> signature =
+ support::coseSignEcDsaWithSignature(signatureOfToBeSigned.value(),
+ proofOfOwnershipCbor, // data
+ {}); // certificateChain
+ if (!signature) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "Error signing data"));
+ }
+
+ *outProofOfOwnershipSignature = signature.value();
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::createEphemeralKeyPair(
+ vector<uint8_t>* outKeyPair) {
+ optional<vector<uint8_t>> ephemeralPriv = hwProxy_->createEphemeralKeyPair();
+ if (!ephemeralPriv) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error creating ephemeral key"));
+ }
+ optional<vector<uint8_t>> keyPair =
+ support::ecPrivateKeyToKeyPair(ephemeralPriv.value());
+ if (!keyPair) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error creating ephemeral key-pair"));
+ }
+
+ // Stash public key of this key-pair for later check in startRetrieval().
+ optional<vector<uint8_t>> publicKey =
+ support::ecKeyPairGetPublicKey(keyPair.value());
+ if (!publicKey) {
+ LOG(ERROR) << "Error getting public part of ephemeral key pair";
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error getting public part of ephemeral key pair"));
+ }
+ ephemeralPublicKey_ = publicKey.value();
+
+ *outKeyPair = keyPair.value();
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::setReaderEphemeralPublicKey(
+ const vector<uint8_t>& publicKey) {
+ readerPublicKey_ = publicKey;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::createAuthChallenge(
+ int64_t* outChallenge) {
+ optional<uint64_t> challenge = hwProxy_->createAuthChallenge();
+ if (!challenge) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "Error generating challenge"));
+ }
+ *outChallenge = challenge.value();
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::setRequestedNamespaces(
+ const vector<RequestNamespace>& requestNamespaces) {
+ requestNamespaces_ = requestNamespaces;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::setVerificationToken(
+ const VerificationToken& verificationToken) {
+ verificationToken_ = verificationToken;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::startRetrieval(
+ const vector<SecureAccessControlProfile>& accessControlProfiles,
+ const HardwareAuthToken& authToken, const vector<uint8_t>& itemsRequest,
+ const vector<uint8_t>& signingKeyBlob,
+ const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& readerSignature,
+ const vector<int32_t>& requestCounts) {
+ std::unique_ptr<cppbor::Item> sessionTranscriptItem;
+ if (sessionTranscript.size() > 0) {
+ auto [item, _, message] = cppbor::parse(sessionTranscript);
+ if (item == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "SessionTranscript contains invalid CBOR"));
+ }
+ sessionTranscriptItem = std::move(item);
+ }
+ if (numStartRetrievalCalls_ > 0) {
+ if (sessionTranscript_ != sessionTranscript) {
+ LOG(ERROR) << "Session Transcript changed";
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_SESSION_TRANSCRIPT_MISMATCH,
+ "Passed-in SessionTranscript doesn't match previously used "
+ "SessionTranscript"));
+ }
+ }
+ sessionTranscript_ = sessionTranscript;
+
+ // This resets various state in the TA...
+ if (!hwProxy_->startRetrieveEntries()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error starting retrieving entries"));
+ }
+
+ optional<vector<uint8_t>> signatureOfToBeSigned;
+ if (readerSignature.size() > 0) {
+ signatureOfToBeSigned = support::coseSignGetSignature(readerSignature);
+ if (!signatureOfToBeSigned) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ "Error extracting signatureOfToBeSigned from COSE_Sign1"));
+ }
+ }
+
+ // Feed the auth token to secure hardware only if they're valid.
+ if (authToken.timestamp.milliSeconds != 0) {
+ if (!hwProxy_->setAuthToken(
+ authToken.challenge, authToken.userId, authToken.authenticatorId,
+ int(authToken.authenticatorType), authToken.timestamp.milliSeconds,
+ authToken.mac, verificationToken_.challenge,
+ verificationToken_.timestamp.milliSeconds,
+ int(verificationToken_.securityLevel), verificationToken_.mac)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA, "Invalid Auth Token"));
+ }
+ }
+
+ // We'll be feeding ACPs interleaved with certificates from the reader
+ // certificate chain...
+ vector<SecureAccessControlProfile> remainingAcps = accessControlProfiles;
+
+ // ... and we'll use those ACPs to build up a 32-bit mask indicating which
+ // of the possible 32 ACPs grants access.
+ uint32_t accessControlProfileMask = 0;
+
+ // If there is a signature, validate that it was made with the top-most key in
+ // the certificate chain embedded in the COSE_Sign1 structure.
+ optional<vector<uint8_t>> readerCertificateChain;
+ if (readerSignature.size() > 0) {
+ readerCertificateChain = support::coseSignGetX5Chain(readerSignature);
+ if (!readerCertificateChain) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ "Unable to get reader certificate chain from COSE_Sign1"));
+ }
+
+ // First, feed all the reader certificates to the secure hardware. We start
+ // at the end..
+ optional<vector<vector<uint8_t>>> splitCerts =
+ support::certificateChainSplit(readerCertificateChain.value());
+ if (!splitCerts || splitCerts.value().size() == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ "Error splitting certificate chain from COSE_Sign1"));
+ }
+ for (ssize_t n = splitCerts.value().size() - 1; n >= 0; --n) {
+ const vector<uint8_t>& x509Cert = splitCerts.value()[n];
+ if (!hwProxy_->pushReaderCert(x509Cert)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ StringPrintf("Error validating reader certificate %zd", n)
+ .c_str()));
+ }
+
+ // If we have ACPs for that particular certificate, send them to the
+ // TA right now...
+ //
+ // Remember in this case certificate equality is done by comparing public
+ // keys, not bitwise comparison of the certificates.
+ //
+ optional<vector<uint8_t>> x509CertPubKey =
+ support::certificateChainGetTopMostKey(x509Cert);
+ if (!x509CertPubKey) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ StringPrintf("Error getting public key from reader certificate %zd",
+ n)
+ .c_str()));
+ }
+ vector<SecureAccessControlProfile>::iterator it = remainingAcps.begin();
+ while (it != remainingAcps.end()) {
+ const SecureAccessControlProfile& profile = *it;
+ if (profile.readerCertificate.encodedCertificate.size() == 0) {
+ ++it;
+ continue;
+ }
+ optional<vector<uint8_t>> profilePubKey =
+ support::certificateChainGetTopMostKey(
+ profile.readerCertificate.encodedCertificate);
+ if (!profilePubKey) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error getting public key from profile"));
+ }
+ if (profilePubKey.value() == x509CertPubKey.value()) {
+ optional<bool> res = hwProxy_->validateAccessControlProfile(
+ profile.id, profile.readerCertificate.encodedCertificate,
+ profile.userAuthenticationRequired, profile.timeoutMillis,
+ profile.secureUserId, profile.mac);
+ if (!res) {
+ return ndk::ScopedAStatus(
+ AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Error validating access control profile"));
+ }
+ if (res.value()) {
+ accessControlProfileMask |= (1 << profile.id);
+ }
+ it = remainingAcps.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ }
+
+ // ... then pass the request message and have the TA check it's signed by
+ // the key in last certificate we pushed.
+ if (sessionTranscript.size() > 0 && itemsRequest.size() > 0 &&
+ readerSignature.size() > 0) {
+ optional<vector<uint8_t>> tbsSignature =
+ support::coseSignGetSignature(readerSignature);
+ if (!tbsSignature) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ "Error extracting toBeSigned from COSE_Sign1"));
+ }
+ optional<int> coseSignAlg = support::coseSignGetAlg(readerSignature);
+ if (!coseSignAlg) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ "Error extracting signature algorithm from COSE_Sign1"));
+ }
+ if (!hwProxy_->validateRequestMessage(sessionTranscript, itemsRequest,
+ coseSignAlg.value(),
+ tbsSignature.value())) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_SIGNATURE_CHECK_FAILED,
+ "readerMessage is not signed by top-level certificate"));
+ }
+ }
+ }
+
+ // Feed remaining access control profiles...
+ for (const SecureAccessControlProfile& profile : remainingAcps) {
+ optional<bool> res = hwProxy_->validateAccessControlProfile(
+ profile.id, profile.readerCertificate.encodedCertificate,
+ profile.userAuthenticationRequired, profile.timeoutMillis,
+ profile.secureUserId, profile.mac);
+ if (!res) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Error validating access control profile"));
+ }
+ if (res.value()) {
+ accessControlProfileMask |= (1 << profile.id);
+ }
+ }
+
+ // TODO: move this check to the TA
+#if 1
+ // To prevent replay-attacks, we check that the public part of the ephemeral
+ // key we previously created, is present in the DeviceEngagement part of
+ // SessionTranscript as a COSE_Key, in uncompressed form.
+ //
+ // We do this by just searching for the X and Y coordinates.
+ if (sessionTranscript.size() > 0) {
+ auto [getXYSuccess, ePubX, ePubY] =
+ support::ecPublicKeyGetXandY(ephemeralPublicKey_);
+ if (!getXYSuccess) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_EPHEMERAL_PUBLIC_KEY_NOT_FOUND,
+ "Error extracting X and Y from ePub"));
+ }
+ if (sessionTranscript.size() > 0 &&
+ !(memmem(sessionTranscript.data(), sessionTranscript.size(),
+ ePubX.data(), ePubX.size()) != nullptr &&
+ memmem(sessionTranscript.data(), sessionTranscript.size(),
+ ePubY.data(), ePubY.size()) != nullptr)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_EPHEMERAL_PUBLIC_KEY_NOT_FOUND,
+ "Did not find ephemeral public key's X and Y coordinates in "
+ "SessionTranscript (make sure leading zeroes are not used)"));
+ }
+ }
+#endif
+
+ // itemsRequest: If non-empty, contains request data that may be signed by the
+ // reader. The content can be defined in the way appropriate for the
+ // credential, but there are three requirements that must be met to work with
+ // this HAL:
+ if (itemsRequest.size() > 0) {
+ // 1. The content must be a CBOR-encoded structure.
+ auto [item, _, message] = cppbor::parse(itemsRequest);
+ if (item == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_ITEMS_REQUEST_MESSAGE,
+ "Error decoding CBOR in itemsRequest"));
+ }
+
+ // 2. The CBOR structure must be a map.
+ const cppbor::Map* map = item->asMap();
+ if (map == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_ITEMS_REQUEST_MESSAGE,
+ "itemsRequest is not a CBOR map"));
+ }
+
+ // 3. The map must contain a key "nameSpaces" whose value contains a map, as
+ // described in
+ // the example below.
+ //
+ // NameSpaces = {
+ // + NameSpace => DataElements ; Requested data elements for each
+ // NameSpace
+ // }
+ //
+ // NameSpace = tstr
+ //
+ // DataElements = {
+ // + DataElement => IntentToRetain
+ // }
+ //
+ // DataElement = tstr
+ // IntentToRetain = bool
+ //
+ // Here's an example of an |itemsRequest| CBOR value satisfying above
+ // requirements 1. through 3.:
+ //
+ // {
+ // 'docType' : 'org.iso.18013-5.2019',
+ // 'nameSpaces' : {
+ // 'org.iso.18013-5.2019' : {
+ // 'Last name' : false,
+ // 'Birth date' : false,
+ // 'First name' : false,
+ // 'Home address' : true
+ // },
+ // 'org.aamva.iso.18013-5.2019' : {
+ // 'Real Id' : false
+ // }
+ // }
+ // }
+ //
+ const cppbor::Map* nsMap = nullptr;
+ for (size_t n = 0; n < map->size(); n++) {
+ const auto& [keyItem, valueItem] = (*map)[n];
+ if (keyItem->type() == cppbor::TSTR &&
+ keyItem->asTstr()->value() == "nameSpaces" &&
+ valueItem->type() == cppbor::MAP) {
+ nsMap = valueItem->asMap();
+ break;
+ }
+ }
+ if (nsMap == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_ITEMS_REQUEST_MESSAGE,
+ "No nameSpaces map in top-most map"));
+ }
+
+ for (size_t n = 0; n < nsMap->size(); n++) {
+ auto& [nsKeyItem, nsValueItem] = (*nsMap)[n];
+ const cppbor::Tstr* nsKey = nsKeyItem->asTstr();
+ const cppbor::Map* nsInnerMap = nsValueItem->asMap();
+ if (nsKey == nullptr || nsInnerMap == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_ITEMS_REQUEST_MESSAGE,
+ "Type mismatch in nameSpaces map"));
+ }
+ string requestedNamespace = nsKey->value();
+ set<string> requestedKeys;
+ for (size_t m = 0; m < nsInnerMap->size(); m++) {
+ const auto& [innerMapKeyItem, innerMapValueItem] = (*nsInnerMap)[m];
+ const cppbor::Tstr* nameItem = innerMapKeyItem->asTstr();
+ const cppbor::Simple* simple = innerMapValueItem->asSimple();
+ const cppbor::Bool* intentToRetainItem =
+ (simple != nullptr) ? simple->asBool() : nullptr;
+ if (nameItem == nullptr || intentToRetainItem == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_ITEMS_REQUEST_MESSAGE,
+ "Type mismatch in value in nameSpaces map"));
+ }
+ requestedKeys.insert(nameItem->value());
+ }
+ requestedNameSpacesAndNames_[requestedNamespace] = requestedKeys;
+ }
+ }
+
+ deviceNameSpacesMap_ = cppbor::Map();
+ currentNameSpaceDeviceNameSpacesMap_ = cppbor::Map();
+
+ requestCountsRemaining_ = requestCounts;
+ currentNameSpace_ = "";
+
+ itemsRequest_ = itemsRequest;
+ signingKeyBlob_ = signingKeyBlob;
+
+ // calculate the size of DeviceNameSpaces. We need to know it ahead of time.
+ calcDeviceNameSpacesSize(accessControlProfileMask);
+
+ // Count the number of non-empty namespaces
+ size_t numNamespacesWithValues = 0;
+ for (size_t n = 0; n < expectedNumEntriesPerNamespace_.size(); n++) {
+ if (expectedNumEntriesPerNamespace_[n] > 0) {
+ numNamespacesWithValues += 1;
+ }
+ }
+
+ // Finally, pass info so the HMAC key can be derived and the TA can start
+ // creating the DeviceNameSpaces CBOR...
+ if (sessionTranscript_.size() > 0 && readerPublicKey_.size() > 0 &&
+ signingKeyBlob.size() > 0) {
+ // We expect the reader ephemeral public key to be same size and curve
+ // as the ephemeral key we generated (e.g. P-256 key), otherwise ECDH
+ // won't work. So its length should be 65 bytes and it should be
+ // starting with 0x04.
+ if (readerPublicKey_.size() != 65 || readerPublicKey_[0] != 0x04) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Reader public key is not in expected format"));
+ }
+ vector<uint8_t> pubKeyP256(readerPublicKey_.begin() + 1,
+ readerPublicKey_.end());
+ if (!hwProxy_->calcMacKey(sessionTranscript_, pubKeyP256, signingKeyBlob,
+ docType_, numNamespacesWithValues,
+ expectedDeviceNameSpacesSize_)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error starting retrieving entries"));
+ }
+ }
+
+ numStartRetrievalCalls_ += 1;
+ return ndk::ScopedAStatus::ok();
+}
+
+size_t cborNumBytesForLength(size_t length) {
+ if (length < 24) {
+ return 0;
+ } else if (length <= 0xff) {
+ return 1;
+ } else if (length <= 0xffff) {
+ return 2;
+ } else if (length <= 0xffffffff) {
+ return 4;
+ }
+ return 8;
+}
+
+size_t cborNumBytesForTstr(const string& value) {
+ return 1 + cborNumBytesForLength(value.size()) + value.size();
+}
+
+void IdentityCredential::calcDeviceNameSpacesSize(
+ uint32_t accessControlProfileMask) {
+ /*
+ * This is how DeviceNameSpaces is defined:
+ *
+ * DeviceNameSpaces = {
+ * * NameSpace => DeviceSignedItems
+ * }
+ * DeviceSignedItems = {
+ * + DataItemName => DataItemValue
+ * }
+ *
+ * Namespace = tstr
+ * DataItemName = tstr
+ * DataItemValue = any
+ *
+ * This function will calculate its length using knowledge of how CBOR is
+ * encoded.
+ */
+ size_t ret = 0;
+ vector<unsigned int> numEntriesPerNamespace;
+ for (const RequestNamespace& rns : requestNamespaces_) {
+ vector<RequestDataItem> itemsToInclude;
+
+ for (const RequestDataItem& rdi : rns.items) {
+ // If we have a CBOR request message, skip if item isn't in it
+ if (itemsRequest_.size() > 0) {
+ const auto& it = requestedNameSpacesAndNames_.find(rns.namespaceName);
+ if (it == requestedNameSpacesAndNames_.end()) {
+ continue;
+ }
+ const set<string>& dataItemNames = it->second;
+ if (dataItemNames.find(rdi.name) == dataItemNames.end()) {
+ continue;
+ }
+ }
+
+ // Access is granted if at least one of the profiles grants access.
+ //
+ // If an item is configured without any profiles, access is denied.
+ //
+ bool authorized = false;
+ for (auto id : rdi.accessControlProfileIds) {
+ if (accessControlProfileMask & (1 << id)) {
+ authorized = true;
+ break;
+ }
+ }
+ if (!authorized) {
+ continue;
+ }
+
+ itemsToInclude.push_back(rdi);
+ }
+
+ numEntriesPerNamespace.push_back(itemsToInclude.size());
+
+ // If no entries are to be in the namespace, we don't include it in
+ // the CBOR...
+ if (itemsToInclude.size() == 0) {
+ continue;
+ }
+
+ // Key: NameSpace
+ ret += cborNumBytesForTstr(rns.namespaceName);
+
+ // Value: Open the DeviceSignedItems map
+ ret += 1 + cborNumBytesForLength(itemsToInclude.size());
+
+ for (const RequestDataItem& item : itemsToInclude) {
+ // Key: DataItemName
+ ret += cborNumBytesForTstr(item.name);
+
+ // Value: DataItemValue - entryData.size is the length of serialized CBOR
+ // so we use that.
+ ret += item.size;
+ }
+ }
+
+ // Now that we know the number of namespaces with values, we know how many
+ // bytes the DeviceNamespaces map in the beginning is going to take up.
+ ret += 1 + cborNumBytesForLength(numEntriesPerNamespace.size());
+
+ expectedDeviceNameSpacesSize_ = ret;
+ expectedNumEntriesPerNamespace_ = numEntriesPerNamespace;
+}
+
+ndk::ScopedAStatus IdentityCredential::startRetrieveEntryValue(
+ const string& nameSpace, const string& name, int32_t entrySize,
+ const vector<int32_t>& accessControlProfileIds) {
+ if (name.empty()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA, "Name cannot be empty"));
+ }
+ if (nameSpace.empty()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Name space cannot be empty"));
+ }
+
+ if (requestCountsRemaining_.size() == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "No more name spaces left to go through"));
+ }
+
+ bool newNamespace;
+ if (currentNameSpace_ == "") {
+ // First call.
+ currentNameSpace_ = nameSpace;
+ newNamespace = true;
+ }
+
+ if (nameSpace == currentNameSpace_) {
+ // Same namespace.
+ if (requestCountsRemaining_[0] == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "No more entries to be retrieved in current name space"));
+ }
+ requestCountsRemaining_[0] -= 1;
+ } else {
+ // New namespace.
+ if (requestCountsRemaining_[0] != 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Moved to new name space but one or more entries need to be "
+ "retrieved "
+ "in current name space"));
+ }
+ if (currentNameSpaceDeviceNameSpacesMap_.size() > 0) {
+ deviceNameSpacesMap_.add(currentNameSpace_,
+ std::move(currentNameSpaceDeviceNameSpacesMap_));
+ }
+ currentNameSpaceDeviceNameSpacesMap_ = cppbor::Map();
+
+ requestCountsRemaining_.erase(requestCountsRemaining_.begin());
+ currentNameSpace_ = nameSpace;
+ newNamespace = true;
+ }
+
+ // It's permissible to have an empty itemsRequest... but if non-empty you can
+ // only request what was specified in said itemsRequest. Enforce that.
+ if (itemsRequest_.size() > 0) {
+ const auto& it = requestedNameSpacesAndNames_.find(nameSpace);
+ if (it == requestedNameSpacesAndNames_.end()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_NOT_IN_REQUEST_MESSAGE,
+ "Name space was not requested in startRetrieval"));
+ }
+ const set<string>& dataItemNames = it->second;
+ if (dataItemNames.find(name) == dataItemNames.end()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_NOT_IN_REQUEST_MESSAGE,
+ "Data item name in name space was not requested in startRetrieval"));
+ }
+ }
+
+ unsigned int newNamespaceNumEntries = 0;
+ if (newNamespace) {
+ if (expectedNumEntriesPerNamespace_.size() == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "No more populated name spaces left to go through"));
+ }
+ newNamespaceNumEntries = expectedNumEntriesPerNamespace_[0];
+ expectedNumEntriesPerNamespace_.erase(
+ expectedNumEntriesPerNamespace_.begin());
+ }
+
+ // Access control is enforced in the secure hardware.
+ //
+ // ... except for STATUS_NOT_IN_REQUEST_MESSAGE, that's handled above (TODO:
+ // consolidate).
+ //
+ AccessCheckResult res =
+ hwProxy_->startRetrieveEntryValue(nameSpace, name, newNamespaceNumEntries,
+ entrySize, accessControlProfileIds);
+ switch (res) {
+ case AccessCheckResult::kOk:
+ /* Do nothing. */
+ break;
+ case AccessCheckResult::kFailed:
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Access control check failed (failed)"));
+ break;
+ case AccessCheckResult::kNoAccessControlProfiles:
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_NO_ACCESS_CONTROL_PROFILES,
+ "Access control check failed (no access control profiles)"));
+ break;
+ case AccessCheckResult::kUserAuthenticationFailed:
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_USER_AUTHENTICATION_FAILED,
+ "Access control check failed (user auth)"));
+ break;
+ case AccessCheckResult::kReaderAuthenticationFailed:
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_READER_AUTHENTICATION_FAILED,
+ "Access control check failed (reader auth)"));
+ break;
+ }
+
+ currentName_ = name;
+ currentAccessControlProfileIds_ = accessControlProfileIds;
+ entryRemainingBytes_ = entrySize;
+ entryValue_.resize(0);
+
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::retrieveEntryValue(
+ const vector<uint8_t>& encryptedContent, vector<uint8_t>* outContent) {
+ optional<vector<uint8_t>> content = hwProxy_->retrieveEntryValue(
+ encryptedContent, currentNameSpace_, currentName_,
+ currentAccessControlProfileIds_);
+ if (!content) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Error decrypting data"));
+ }
+
+ size_t chunkSize = content.value().size();
+
+ if (chunkSize > entryRemainingBytes_) {
+ LOG(ERROR) << "Retrieved chunk of size " << chunkSize
+ << " is bigger than remaining space of size "
+ << entryRemainingBytes_;
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Retrieved chunk is bigger than remaining space"));
+ }
+
+ entryRemainingBytes_ -= chunkSize;
+ if (entryRemainingBytes_ > 0) {
+ if (chunkSize != IdentityCredentialStore::kGcmChunkSize) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Retrieved non-final chunk of size which isn't kGcmChunkSize"));
+ }
+ }
+
+ entryValue_.insert(entryValue_.end(), content.value().begin(),
+ content.value().end());
+
+ if (entryRemainingBytes_ == 0) {
+ auto [entryValueItem, _, message] = cppbor::parse(entryValue_);
+ if (entryValueItem == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Retrieved data which is invalid CBOR"));
+ }
+ currentNameSpaceDeviceNameSpacesMap_.add(currentName_,
+ std::move(entryValueItem));
+ }
+
+ *outContent = content.value();
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::finishRetrieval(
+ vector<uint8_t>* outMac, vector<uint8_t>* outDeviceNameSpaces) {
+ if (currentNameSpaceDeviceNameSpacesMap_.size() > 0) {
+ deviceNameSpacesMap_.add(currentNameSpace_,
+ std::move(currentNameSpaceDeviceNameSpacesMap_));
+ }
+ vector<uint8_t> encodedDeviceNameSpaces = deviceNameSpacesMap_.encode();
+
+ if (encodedDeviceNameSpaces.size() != expectedDeviceNameSpacesSize_) {
+ LOG(ERROR) << "encodedDeviceNameSpaces is "
+ << encodedDeviceNameSpaces.size() << " bytes, "
+ << "was expecting " << expectedDeviceNameSpacesSize_;
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ StringPrintf("Unexpected CBOR size %zd for encodedDeviceNameSpaces, "
+ "was expecting %zd",
+ encodedDeviceNameSpaces.size(),
+ expectedDeviceNameSpacesSize_)
+ .c_str()));
+ }
+
+ // If there's no signing key or no sessionTranscript or no reader ephemeral
+ // public key, we return the empty MAC.
+ optional<vector<uint8_t>> mac;
+ if (signingKeyBlob_.size() > 0 && sessionTranscript_.size() > 0 &&
+ readerPublicKey_.size() > 0) {
+ optional<vector<uint8_t>> digestToBeMaced = hwProxy_->finishRetrieval();
+ if (!digestToBeMaced || digestToBeMaced.value().size() != 32) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Error generating digestToBeMaced"));
+ }
+ // Now construct COSE_Mac0 from the returned MAC...
+ mac = support::coseMacWithDigest(digestToBeMaced.value(), {} /* data */);
+ }
+
+ *outMac = mac.value_or(vector<uint8_t>({}));
+ *outDeviceNameSpaces = encodedDeviceNameSpaces;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::generateSigningKeyPair(
+ vector<uint8_t>* outSigningKeyBlob, Certificate* outSigningKeyCertificate) {
+ time_t now = time(NULL);
+ optional<pair<vector<uint8_t>, vector<uint8_t>>> pair =
+ hwProxy_->generateSigningKeyPair(docType_, now);
+ if (!pair) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "Error creating signingKey"));
+ }
+
+ *outSigningKeyCertificate = Certificate();
+ outSigningKeyCertificate->encodedCertificate = pair->first;
+
+ *outSigningKeyBlob = pair->second;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredential::updateCredential(
+ shared_ptr<IWritableIdentityCredential>* outWritableCredential) {
+ sp<SecureHardwareProvisioningProxy> hwProxy =
+ hwProxyFactory_->createProvisioningProxy();
+ shared_ptr<WritableIdentityCredential> wc =
+ ndk::SharedRefBase::make<WritableIdentityCredential>(hwProxy, docType_,
+ testCredential_);
+ if (!wc->initializeForUpdate(encryptedCredentialKeys_)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error initializing WritableIdentityCredential for update"));
+ }
+ *outWritableCredential = wc;
+ return ndk::ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::identity
diff --git a/guest/hals/identity/common/IdentityCredential.h b/guest/hals/identity/common/IdentityCredential.h
new file mode 100644
index 0000000..aaf772a
--- /dev/null
+++ b/guest/hals/identity/common/IdentityCredential.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_IDENTITYCREDENTIAL_H
+#define ANDROID_HARDWARE_IDENTITY_IDENTITYCREDENTIAL_H
+
+#include <aidl/android/hardware/identity/BnIdentityCredential.h>
+#include <aidl/android/hardware/keymaster/HardwareAuthToken.h>
+#include <aidl/android/hardware/keymaster/VerificationToken.h>
+#include <android/hardware/identity/support/IdentityCredentialSupport.h>
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+#include <cppbor.h>
+
+#include "IdentityCredentialStore.h"
+#include "SecureHardwareProxy.h"
+
+namespace aidl::android::hardware::identity {
+
+using ::aidl::android::hardware::keymaster::HardwareAuthToken;
+using ::aidl::android::hardware::keymaster::VerificationToken;
+using ::android::sp;
+using ::android::hardware::identity::SecureHardwarePresentationProxy;
+using ::std::map;
+using ::std::set;
+using ::std::string;
+using ::std::vector;
+
+class IdentityCredential : public BnIdentityCredential {
+ public:
+ IdentityCredential(sp<SecureHardwareProxyFactory> hwProxyFactory,
+ sp<SecureHardwarePresentationProxy> hwProxy,
+ const vector<uint8_t>& credentialData)
+ : hwProxyFactory_(hwProxyFactory),
+ hwProxy_(hwProxy),
+ credentialData_(credentialData),
+ numStartRetrievalCalls_(0),
+ expectedDeviceNameSpacesSize_(0) {}
+
+ // Parses and decrypts credentialData_, return a status code from
+ // IIdentityCredentialStore. Must be called right after construction.
+ int initialize();
+
+ // Methods from IIdentityCredential follow.
+ ndk::ScopedAStatus deleteCredential(
+ vector<uint8_t>* outProofOfDeletionSignature) override;
+ ndk::ScopedAStatus deleteCredentialWithChallenge(
+ const vector<uint8_t>& challenge,
+ vector<uint8_t>* outProofOfDeletionSignature) override;
+ ndk::ScopedAStatus proveOwnership(
+ const vector<uint8_t>& challenge,
+ vector<uint8_t>* outProofOfOwnershipSignature) override;
+ ndk::ScopedAStatus createEphemeralKeyPair(
+ vector<uint8_t>* outKeyPair) override;
+ ndk::ScopedAStatus setReaderEphemeralPublicKey(
+ const vector<uint8_t>& publicKey) override;
+ ndk::ScopedAStatus createAuthChallenge(int64_t* outChallenge) override;
+ ndk::ScopedAStatus setRequestedNamespaces(
+ const vector<RequestNamespace>& requestNamespaces) override;
+ ndk::ScopedAStatus setVerificationToken(
+ const VerificationToken& verificationToken) override;
+ ndk::ScopedAStatus startRetrieval(
+ const vector<SecureAccessControlProfile>& accessControlProfiles,
+ const HardwareAuthToken& authToken, const vector<uint8_t>& itemsRequest,
+ const vector<uint8_t>& signingKeyBlob,
+ const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& readerSignature,
+ const vector<int32_t>& requestCounts) override;
+ ndk::ScopedAStatus startRetrieveEntryValue(
+ const string& nameSpace, const string& name, int32_t entrySize,
+ const vector<int32_t>& accessControlProfileIds) override;
+ ndk::ScopedAStatus retrieveEntryValue(const vector<uint8_t>& encryptedContent,
+ vector<uint8_t>* outContent) override;
+ ndk::ScopedAStatus finishRetrieval(
+ vector<uint8_t>* outMac, vector<uint8_t>* outDeviceNameSpaces) override;
+ ndk::ScopedAStatus generateSigningKeyPair(
+ vector<uint8_t>* outSigningKeyBlob,
+ Certificate* outSigningKeyCertificate) override;
+
+ ndk::ScopedAStatus updateCredential(
+ shared_ptr<IWritableIdentityCredential>* outWritableCredential) override;
+
+ private:
+ ndk::ScopedAStatus deleteCredentialCommon(
+ const vector<uint8_t>& challenge, bool includeChallenge,
+ vector<uint8_t>* outProofOfDeletionSignature);
+
+ // Set by constructor
+ sp<SecureHardwareProxyFactory> hwProxyFactory_;
+ sp<SecureHardwarePresentationProxy> hwProxy_;
+ vector<uint8_t> credentialData_;
+ int numStartRetrievalCalls_;
+
+ // Set by initialize()
+ string docType_;
+ bool testCredential_;
+ vector<uint8_t> encryptedCredentialKeys_;
+
+ // Set by createEphemeralKeyPair()
+ vector<uint8_t> ephemeralPublicKey_;
+
+ // Set by setReaderEphemeralPublicKey()
+ vector<uint8_t> readerPublicKey_;
+
+ // Set by setRequestedNamespaces()
+ vector<RequestNamespace> requestNamespaces_;
+
+ // Set by setVerificationToken().
+ VerificationToken verificationToken_;
+
+ // Set at startRetrieval() time.
+ vector<uint8_t> signingKeyBlob_;
+ vector<uint8_t> sessionTranscript_;
+ vector<uint8_t> itemsRequest_;
+ vector<int32_t> requestCountsRemaining_;
+ map<string, set<string>> requestedNameSpacesAndNames_;
+ cppbor::Map deviceNameSpacesMap_;
+ cppbor::Map currentNameSpaceDeviceNameSpacesMap_;
+
+ // Calculated at startRetrieval() time.
+ size_t expectedDeviceNameSpacesSize_;
+ vector<unsigned int> expectedNumEntriesPerNamespace_;
+
+ // Set at startRetrieveEntryValue() time.
+ string currentNameSpace_;
+ string currentName_;
+ vector<int32_t> currentAccessControlProfileIds_;
+ size_t entryRemainingBytes_;
+ vector<uint8_t> entryValue_;
+
+ void calcDeviceNameSpacesSize(uint32_t accessControlProfileMask);
+};
+
+} // namespace aidl::android::hardware::identity
+
+#endif // ANDROID_HARDWARE_IDENTITY_IDENTITYCREDENTIAL_H
diff --git a/guest/hals/identity/common/IdentityCredentialStore.cpp b/guest/hals/identity/common/IdentityCredentialStore.cpp
new file mode 100644
index 0000000..b98ee00
--- /dev/null
+++ b/guest/hals/identity/common/IdentityCredentialStore.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IdentityCredentialStore"
+
+#include <android-base/logging.h>
+
+#include "IdentityCredential.h"
+#include "IdentityCredentialStore.h"
+#include "WritableIdentityCredential.h"
+
+namespace aidl::android::hardware::identity {
+
+using ::aidl::android::hardware::security::keymint::
+ IRemotelyProvisionedComponent;
+
+ndk::ScopedAStatus IdentityCredentialStore::getHardwareInformation(
+ HardwareInformation* hardwareInformation) {
+ HardwareInformation hw;
+ hw.credentialStoreName = "Identity Credential Reference Implementation";
+ hw.credentialStoreAuthorName = "Google";
+ hw.dataChunkSize = kGcmChunkSize;
+ hw.isDirectAccess = false;
+ hw.supportedDocTypes = {};
+ *hardwareInformation = hw;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredentialStore::createCredential(
+ const string& docType, bool testCredential,
+ shared_ptr<IWritableIdentityCredential>* outWritableCredential) {
+ sp<SecureHardwareProvisioningProxy> hwProxy =
+ hwProxyFactory_->createProvisioningProxy();
+ shared_ptr<WritableIdentityCredential> wc =
+ ndk::SharedRefBase::make<WritableIdentityCredential>(hwProxy, docType,
+ testCredential);
+ if (!wc->initialize()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error initializing WritableIdentityCredential"));
+ }
+ *outWritableCredential = wc;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus IdentityCredentialStore::getCredential(
+ CipherSuite cipherSuite, const vector<uint8_t>& credentialData,
+ shared_ptr<IIdentityCredential>* outCredential) {
+ // We only support CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256 right
+ // now.
+ if (cipherSuite !=
+ CipherSuite::CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_CIPHER_SUITE_NOT_SUPPORTED,
+ "Unsupported cipher suite"));
+ }
+
+ sp<SecureHardwarePresentationProxy> hwProxy =
+ hwProxyFactory_->createPresentationProxy();
+ shared_ptr<IdentityCredential> credential =
+ ndk::SharedRefBase::make<IdentityCredential>(hwProxyFactory_, hwProxy,
+ credentialData);
+ auto ret = credential->initialize();
+ if (ret != IIdentityCredentialStore::STATUS_OK) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ int(ret), "Error initializing IdentityCredential"));
+ }
+ *outCredential = credential;
+ return ndk::ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::identity
diff --git a/guest/hals/identity/common/IdentityCredentialStore.h b/guest/hals/identity/common/IdentityCredentialStore.h
new file mode 100644
index 0000000..1d65b2c
--- /dev/null
+++ b/guest/hals/identity/common/IdentityCredentialStore.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_IDENTITYCREDENTIALSTORE_H
+#define ANDROID_HARDWARE_IDENTITY_IDENTITYCREDENTIALSTORE_H
+
+#include <aidl/android/hardware/identity/BnIdentityCredentialStore.h>
+#include <aidl/android/hardware/security/keymint/IRemotelyProvisionedComponent.h>
+
+#include "SecureHardwareProxy.h"
+
+namespace aidl::android::hardware::identity {
+
+using ::android::sp;
+using ::android::hardware::identity::SecureHardwareProxyFactory;
+using ::std::shared_ptr;
+using ::std::string;
+using ::std::vector;
+
+class IdentityCredentialStore : public BnIdentityCredentialStore {
+ public:
+ IdentityCredentialStore(sp<SecureHardwareProxyFactory> hwProxyFactory)
+ : hwProxyFactory_(hwProxyFactory) {}
+
+ // The GCM chunk size used by this implementation is 64 KiB.
+ static constexpr size_t kGcmChunkSize = 64 * 1024;
+
+ // Methods from IIdentityCredentialStore follow.
+ ndk::ScopedAStatus getHardwareInformation(
+ HardwareInformation* hardwareInformation) override;
+
+ ndk::ScopedAStatus createCredential(
+ const string& docType, bool testCredential,
+ shared_ptr<IWritableIdentityCredential>* outWritableCredential) override;
+
+ ndk::ScopedAStatus getCredential(
+ CipherSuite cipherSuite, const vector<uint8_t>& credentialData,
+ shared_ptr<IIdentityCredential>* outCredential) override;
+
+ private:
+ sp<SecureHardwareProxyFactory> hwProxyFactory_;
+};
+
+} // namespace aidl::android::hardware::identity
+
+#endif // ANDROID_HARDWARE_IDENTITY_IDENTITYCREDENTIALSTORE_H
diff --git a/guest/hals/identity/common/SecureHardwareProxy.h b/guest/hals/identity/common/SecureHardwareProxy.h
new file mode 100644
index 0000000..bd252a7
--- /dev/null
+++ b/guest/hals/identity/common/SecureHardwareProxy.h
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_SECUREHARDWAREPROXY_H
+#define ANDROID_HARDWARE_IDENTITY_SECUREHARDWAREPROXY_H
+
+#include <utils/RefBase.h>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace android::hardware::identity {
+
+using ::android::RefBase;
+using ::std::optional;
+using ::std::pair;
+using ::std::string;
+using ::std::vector;
+
+// These classes are used to communicate with Secure Hardware. They mimic the
+// API in libEmbeddedIC 1:1 (except for using C++ types) as each call is
+// intended to be forwarded to the Secure Hardware.
+//
+// Instances are instantiated when a provisioning or presentation session
+// starts. When the session is complete, the shutdown() method is called.
+//
+
+// Forward declare.
+//
+class SecureHardwareProvisioningProxy;
+class SecureHardwarePresentationProxy;
+
+// This is a class used to create proxies.
+//
+class SecureHardwareProxyFactory : public RefBase {
+ public:
+ SecureHardwareProxyFactory() {}
+ virtual ~SecureHardwareProxyFactory() {}
+
+ virtual sp<SecureHardwareProvisioningProxy> createProvisioningProxy() = 0;
+ virtual sp<SecureHardwarePresentationProxy> createPresentationProxy() = 0;
+};
+
+// The proxy used for provisioning.
+//
+class SecureHardwareProvisioningProxy : public RefBase {
+ public:
+ SecureHardwareProvisioningProxy() {}
+ virtual ~SecureHardwareProvisioningProxy() {}
+
+ virtual bool initialize(bool testCredential) = 0;
+
+ virtual bool initializeForUpdate(bool testCredential, string docType,
+ vector<uint8_t> encryptedCredentialKeys) = 0;
+
+ // Returns public key certificate chain with attestation.
+ //
+ // This must return an entire certificate chain and its implementation must
+ // be coordinated with the implementation of eicOpsCreateCredentialKey() on
+ // the TA side (which may return just a single certificate or the entire
+ // chain).
+ virtual optional<vector<uint8_t>> createCredentialKey(
+ const vector<uint8_t>& challenge,
+ const vector<uint8_t>& applicationId) = 0;
+
+ virtual bool startPersonalization(int accessControlProfileCount,
+ vector<int> entryCounts,
+ const string& docType,
+ size_t expectedProofOfProvisioningSize) = 0;
+
+ // Returns MAC (28 bytes).
+ virtual optional<vector<uint8_t>> addAccessControlProfile(
+ int id, const vector<uint8_t>& readerCertificate,
+ bool userAuthenticationRequired, uint64_t timeoutMillis,
+ uint64_t secureUserId) = 0;
+
+ virtual bool beginAddEntry(const vector<int>& accessControlProfileIds,
+ const string& nameSpace, const string& name,
+ uint64_t entrySize) = 0;
+
+ // Returns encryptedContent.
+ virtual optional<vector<uint8_t>> addEntryValue(
+ const vector<int>& accessControlProfileIds, const string& nameSpace,
+ const string& name, const vector<uint8_t>& content) = 0;
+
+ // Returns signatureOfToBeSigned (EIC_ECDSA_P256_SIGNATURE_SIZE bytes).
+ virtual optional<vector<uint8_t>> finishAddingEntries() = 0;
+
+ // Returns encryptedCredentialKeys (80 bytes).
+ virtual optional<vector<uint8_t>> finishGetCredentialData(
+ const string& docType) = 0;
+
+ virtual bool shutdown() = 0;
+};
+
+enum AccessCheckResult {
+ kOk,
+ kFailed,
+ kNoAccessControlProfiles,
+ kUserAuthenticationFailed,
+ kReaderAuthenticationFailed,
+};
+
+// The proxy used for presentation.
+//
+class SecureHardwarePresentationProxy : public RefBase {
+ public:
+ SecureHardwarePresentationProxy() {}
+ virtual ~SecureHardwarePresentationProxy() {}
+
+ virtual bool initialize(bool testCredential, string docType,
+ vector<uint8_t> encryptedCredentialKeys) = 0;
+
+ // Returns publicKeyCert (1st component) and signingKeyBlob (2nd component)
+ virtual optional<pair<vector<uint8_t>, vector<uint8_t>>>
+ generateSigningKeyPair(string docType, time_t now) = 0;
+
+ // Returns private key
+ virtual optional<vector<uint8_t>> createEphemeralKeyPair() = 0;
+
+ virtual optional<uint64_t> createAuthChallenge() = 0;
+
+ virtual bool startRetrieveEntries() = 0;
+
+ virtual bool setAuthToken(uint64_t challenge, uint64_t secureUserId,
+ uint64_t authenticatorId,
+ int hardwareAuthenticatorType, uint64_t timeStamp,
+ const vector<uint8_t>& mac,
+ uint64_t verificationTokenChallenge,
+ uint64_t verificationTokenTimestamp,
+ int verificationTokenSecurityLevel,
+ const vector<uint8_t>& verificationTokenMac) = 0;
+
+ virtual bool pushReaderCert(const vector<uint8_t>& certX509) = 0;
+
+ virtual optional<bool> validateAccessControlProfile(
+ int id, const vector<uint8_t>& readerCertificate,
+ bool userAuthenticationRequired, int timeoutMillis, uint64_t secureUserId,
+ const vector<uint8_t>& mac) = 0;
+
+ virtual bool validateRequestMessage(
+ const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& requestMessage, int coseSignAlg,
+ const vector<uint8_t>& readerSignatureOfToBeSigned) = 0;
+
+ virtual bool calcMacKey(const vector<uint8_t>& sessionTranscript,
+ const vector<uint8_t>& readerEphemeralPublicKey,
+ const vector<uint8_t>& signingKeyBlob,
+ const string& docType,
+ unsigned int numNamespacesWithValues,
+ size_t expectedProofOfProvisioningSize) = 0;
+
+ virtual AccessCheckResult startRetrieveEntryValue(
+ const string& nameSpace, const string& name,
+ unsigned int newNamespaceNumEntries, int32_t entrySize,
+ const vector<int32_t>& accessControlProfileIds) = 0;
+
+ virtual optional<vector<uint8_t>> retrieveEntryValue(
+ const vector<uint8_t>& encryptedContent, const string& nameSpace,
+ const string& name, const vector<int32_t>& accessControlProfileIds) = 0;
+
+ virtual optional<vector<uint8_t>> finishRetrieval();
+
+ virtual optional<vector<uint8_t>> deleteCredential(
+ const string& docType, const vector<uint8_t>& challenge,
+ bool includeChallenge, size_t proofOfDeletionCborSize) = 0;
+
+ virtual optional<vector<uint8_t>> proveOwnership(
+ const string& docType, bool testCredential,
+ const vector<uint8_t>& challenge, size_t proofOfOwnershipCborSize) = 0;
+
+ virtual bool shutdown() = 0;
+};
+
+} // namespace android::hardware::identity
+
+#endif // ANDROID_HARDWARE_IDENTITY_SECUREHARDWAREPROXY_H
diff --git a/guest/hals/identity/common/WritableIdentityCredential.cpp b/guest/hals/identity/common/WritableIdentityCredential.cpp
new file mode 100644
index 0000000..13ee244
--- /dev/null
+++ b/guest/hals/identity/common/WritableIdentityCredential.cpp
@@ -0,0 +1,424 @@
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "WritableIdentityCredential"
+
+#include "WritableIdentityCredential.h"
+
+#include <android/hardware/identity/support/IdentityCredentialSupport.h>
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+
+#include <cppbor.h>
+#include <cppbor_parse.h>
+
+#include <utility>
+
+#include "IdentityCredentialStore.h"
+
+#include "SecureHardwareProxy.h"
+
+namespace aidl::android::hardware::identity {
+
+using ::android::base::StringPrintf;
+using ::std::optional;
+using namespace ::android::hardware::identity;
+
+bool WritableIdentityCredential::initialize() {
+ if (!hwProxy_->initialize(testCredential_)) {
+ LOG(ERROR) << "hwProxy->initialize() failed";
+ return false;
+ }
+ startPersonalizationCalled_ = false;
+ firstEntry_ = true;
+
+ return true;
+}
+
+// Used when updating a credential. Returns false on failure.
+bool WritableIdentityCredential::initializeForUpdate(
+ const vector<uint8_t>& encryptedCredentialKeys) {
+ if (!hwProxy_->initializeForUpdate(testCredential_, docType_,
+ encryptedCredentialKeys)) {
+ LOG(ERROR) << "hwProxy->initializeForUpdate() failed";
+ return false;
+ }
+ startPersonalizationCalled_ = false;
+ firstEntry_ = true;
+
+ return true;
+}
+
+WritableIdentityCredential::~WritableIdentityCredential() {}
+
+ndk::ScopedAStatus WritableIdentityCredential::getAttestationCertificate(
+ const vector<uint8_t>& attestationApplicationId,
+ const vector<uint8_t>& attestationChallenge,
+ vector<Certificate>* outCertificateChain) {
+ if (getAttestationCertificateAlreadyCalled_) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error attestation certificate previously generated"));
+ }
+ getAttestationCertificateAlreadyCalled_ = true;
+
+ if (attestationChallenge.empty()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Challenge can not be empty"));
+ }
+
+ optional<vector<uint8_t>> certChain = hwProxy_->createCredentialKey(
+ attestationChallenge, attestationApplicationId);
+ if (!certChain) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error generating attestation certificate chain"));
+ }
+
+ optional<vector<vector<uint8_t>>> certs =
+ support::certificateChainSplit(certChain.value());
+ if (!certs) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error splitting chain into separate certificates"));
+ }
+
+ *outCertificateChain = vector<Certificate>();
+ for (const vector<uint8_t>& cert : certs.value()) {
+ Certificate c = Certificate();
+ c.encodedCertificate = cert;
+ outCertificateChain->push_back(std::move(c));
+ }
+
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus
+WritableIdentityCredential::setExpectedProofOfProvisioningSize(
+ int32_t expectedProofOfProvisioningSize) {
+ expectedProofOfProvisioningSize_ = expectedProofOfProvisioningSize;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus WritableIdentityCredential::startPersonalization(
+ int32_t accessControlProfileCount, const vector<int32_t>& entryCounts) {
+ if (startPersonalizationCalled_) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "startPersonalization called already"));
+ }
+ startPersonalizationCalled_ = true;
+
+ numAccessControlProfileRemaining_ = accessControlProfileCount;
+ remainingEntryCounts_ = entryCounts;
+ entryNameSpace_ = "";
+
+ signedDataAccessControlProfiles_ = cppbor::Array();
+ signedDataNamespaces_ = cppbor::Map();
+ signedDataCurrentNamespace_ = cppbor::Array();
+
+ if (!hwProxy_->startPersonalization(accessControlProfileCount, entryCounts,
+ docType_,
+ expectedProofOfProvisioningSize_)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "eicStartPersonalization"));
+ }
+
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus WritableIdentityCredential::addAccessControlProfile(
+ int32_t id, const Certificate& readerCertificate,
+ bool userAuthenticationRequired, int64_t timeoutMillis,
+ int64_t secureUserId,
+ SecureAccessControlProfile* outSecureAccessControlProfile) {
+ if (numAccessControlProfileRemaining_ == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "numAccessControlProfileRemaining_ is 0 and expected non-zero"));
+ }
+
+ if (accessControlProfileIds_.find(id) != accessControlProfileIds_.end()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Access Control Profile id must be unique"));
+ }
+ accessControlProfileIds_.insert(id);
+
+ if (id < 0 || id >= 32) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Access Control Profile id must be non-negative and less than 32"));
+ }
+
+ // Spec requires if |userAuthenticationRequired| is false, then
+ // |timeoutMillis| must also be zero.
+ if (!userAuthenticationRequired && timeoutMillis != 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "userAuthenticationRequired is false but timeout is non-zero"));
+ }
+
+ optional<vector<uint8_t>> mac = hwProxy_->addAccessControlProfile(
+ id, readerCertificate.encodedCertificate, userAuthenticationRequired,
+ timeoutMillis, secureUserId);
+ if (!mac) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "eicAddAccessControlProfile"));
+ }
+
+ SecureAccessControlProfile profile;
+ profile.id = id;
+ profile.readerCertificate = readerCertificate;
+ profile.userAuthenticationRequired = userAuthenticationRequired;
+ profile.timeoutMillis = timeoutMillis;
+ profile.secureUserId = secureUserId;
+ profile.mac = mac.value();
+ cppbor::Map profileMap;
+ profileMap.add("id", profile.id);
+ if (profile.readerCertificate.encodedCertificate.size() > 0) {
+ profileMap.add("readerCertificate",
+ cppbor::Bstr(profile.readerCertificate.encodedCertificate));
+ }
+ if (profile.userAuthenticationRequired) {
+ profileMap.add("userAuthenticationRequired",
+ profile.userAuthenticationRequired);
+ profileMap.add("timeoutMillis", profile.timeoutMillis);
+ }
+ signedDataAccessControlProfiles_.add(std::move(profileMap));
+
+ numAccessControlProfileRemaining_--;
+
+ *outSecureAccessControlProfile = profile;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus WritableIdentityCredential::beginAddEntry(
+ const vector<int32_t>& accessControlProfileIds, const string& nameSpace,
+ const string& name, int32_t entrySize) {
+ if (numAccessControlProfileRemaining_ != 0) {
+ LOG(ERROR) << "numAccessControlProfileRemaining_ is "
+ << numAccessControlProfileRemaining_ << " and expected zero";
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "numAccessControlProfileRemaining_ is not zero"));
+ }
+
+ // Ensure passed-in profile ids reference valid access control profiles
+ for (const int32_t id : accessControlProfileIds) {
+ if (accessControlProfileIds_.find(id) == accessControlProfileIds_.end()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "An id in accessControlProfileIds references non-existing ACP"));
+ }
+ }
+
+ if (remainingEntryCounts_.size() == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "No more namespaces to add to"));
+ }
+
+ // Handle initial beginEntry() call.
+ if (firstEntry_) {
+ firstEntry_ = false;
+ entryNameSpace_ = nameSpace;
+ allNameSpaces_.insert(nameSpace);
+ }
+
+ // If the namespace changed...
+ if (nameSpace != entryNameSpace_) {
+ if (allNameSpaces_.find(nameSpace) != allNameSpaces_.end()) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Name space cannot be added in interleaving fashion"));
+ }
+
+ // Then check that all entries in the previous namespace have been added..
+ if (remainingEntryCounts_[0] != 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "New namespace but a non-zero number of entries remain to be added"));
+ }
+ remainingEntryCounts_.erase(remainingEntryCounts_.begin());
+ remainingEntryCounts_[0] -= 1;
+ allNameSpaces_.insert(nameSpace);
+
+ if (signedDataCurrentNamespace_.size() > 0) {
+ signedDataNamespaces_.add(entryNameSpace_,
+ std::move(signedDataCurrentNamespace_));
+ signedDataCurrentNamespace_ = cppbor::Array();
+ }
+ } else {
+ // Same namespace...
+ if (remainingEntryCounts_[0] == 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Same namespace but no entries remain to be added"));
+ }
+ remainingEntryCounts_[0] -= 1;
+ }
+
+ entryRemainingBytes_ = entrySize;
+ entryNameSpace_ = nameSpace;
+ entryName_ = name;
+ entryAccessControlProfileIds_ = accessControlProfileIds;
+ entryBytes_.resize(0);
+ // LOG(INFO) << "name=" << name << " entrySize=" << entrySize;
+
+ if (!hwProxy_->beginAddEntry(accessControlProfileIds, nameSpace, name,
+ entrySize)) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "eicBeginAddEntry"));
+ }
+
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus WritableIdentityCredential::addEntryValue(
+ const vector<uint8_t>& content, vector<uint8_t>* outEncryptedContent) {
+ size_t contentSize = content.size();
+
+ if (contentSize > IdentityCredentialStore::kGcmChunkSize) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Passed in chunk of is bigger than kGcmChunkSize"));
+ }
+ if (contentSize > entryRemainingBytes_) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Passed in chunk is bigger than remaining space"));
+ }
+
+ entryBytes_.insert(entryBytes_.end(), content.begin(), content.end());
+ entryRemainingBytes_ -= contentSize;
+ if (entryRemainingBytes_ > 0) {
+ if (contentSize != IdentityCredentialStore::kGcmChunkSize) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Retrieved non-final chunk which isn't kGcmChunkSize"));
+ }
+ }
+
+ optional<vector<uint8_t>> encryptedContent = hwProxy_->addEntryValue(
+ entryAccessControlProfileIds_, entryNameSpace_, entryName_, content);
+ if (!encryptedContent) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "eicAddEntryValue"));
+ }
+
+ if (entryRemainingBytes_ == 0) {
+ // TODO: ideally do do this without parsing the data (but still validate
+ // data is valid CBOR).
+ auto [item, _, message] = cppbor::parse(entryBytes_);
+ if (item == nullptr) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "Data is not valid CBOR"));
+ }
+ cppbor::Map entryMap;
+ entryMap.add("name", entryName_);
+ entryMap.add("value", std::move(item));
+ cppbor::Array profileIdArray;
+ for (auto id : entryAccessControlProfileIds_) {
+ profileIdArray.add(id);
+ }
+ entryMap.add("accessControlProfiles", std::move(profileIdArray));
+ signedDataCurrentNamespace_.add(std::move(entryMap));
+ }
+
+ *outEncryptedContent = encryptedContent.value();
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus WritableIdentityCredential::finishAddingEntries(
+ vector<uint8_t>* outCredentialData,
+ vector<uint8_t>* outProofOfProvisioningSignature) {
+ if (numAccessControlProfileRemaining_ != 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "numAccessControlProfileRemaining_ is not 0 and expected zero"));
+ }
+
+ if (remainingEntryCounts_.size() > 1 || remainingEntryCounts_[0] != 0) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ "More entry spaces remain than startPersonalization configured"));
+ }
+
+ if (signedDataCurrentNamespace_.size() > 0) {
+ signedDataNamespaces_.add(entryNameSpace_,
+ std::move(signedDataCurrentNamespace_));
+ }
+ cppbor::Array popArray;
+ popArray.add("ProofOfProvisioning")
+ .add(docType_)
+ .add(std::move(signedDataAccessControlProfiles_))
+ .add(std::move(signedDataNamespaces_))
+ .add(testCredential_);
+ vector<uint8_t> encodedCbor = popArray.encode();
+
+ if (encodedCbor.size() != expectedProofOfProvisioningSize_) {
+ LOG(ERROR) << "CBOR for proofOfProvisioning is " << encodedCbor.size()
+ << " bytes, "
+ << "was expecting " << expectedProofOfProvisioningSize_;
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_INVALID_DATA,
+ StringPrintf("Unexpected CBOR size %zd for proofOfProvisioning, was "
+ "expecting %zd",
+ encodedCbor.size(), expectedProofOfProvisioningSize_)
+ .c_str()));
+ }
+
+ optional<vector<uint8_t>> signatureOfToBeSigned =
+ hwProxy_->finishAddingEntries();
+ if (!signatureOfToBeSigned) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "eicFinishAddingEntries"));
+ }
+
+ optional<vector<uint8_t>> signature =
+ support::coseSignEcDsaWithSignature(signatureOfToBeSigned.value(),
+ encodedCbor, // data
+ {}); // certificateChain
+ if (!signature) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED, "Error signing data"));
+ }
+
+ optional<vector<uint8_t>> encryptedCredentialKeys =
+ hwProxy_->finishGetCredentialData(docType_);
+ if (!encryptedCredentialKeys) {
+ return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
+ IIdentityCredentialStore::STATUS_FAILED,
+ "Error generating encrypted CredentialKeys"));
+ }
+ cppbor::Array array;
+ array.add(docType_);
+ array.add(testCredential_);
+ array.add(encryptedCredentialKeys.value());
+ vector<uint8_t> credentialData = array.encode();
+
+ *outCredentialData = credentialData;
+ *outProofOfProvisioningSignature = signature.value();
+ hwProxy_->shutdown();
+
+ return ndk::ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::identity
diff --git a/guest/hals/identity/common/WritableIdentityCredential.h b/guest/hals/identity/common/WritableIdentityCredential.h
new file mode 100644
index 0000000..47a22ad
--- /dev/null
+++ b/guest/hals/identity/common/WritableIdentityCredential.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_WRITABLEIDENTITYCREDENTIAL_H
+#define ANDROID_HARDWARE_IDENTITY_WRITABLEIDENTITYCREDENTIAL_H
+
+#include <aidl/android/hardware/identity/BnWritableIdentityCredential.h>
+#include <android/hardware/identity/support/IdentityCredentialSupport.h>
+
+#include <cppbor.h>
+#include <set>
+
+#include "IdentityCredentialStore.h"
+#include "SecureHardwareProxy.h"
+
+namespace aidl::android::hardware::identity {
+
+using ::android::sp;
+using ::android::hardware::identity::SecureHardwareProvisioningProxy;
+using ::std::set;
+using ::std::string;
+using ::std::vector;
+
+class WritableIdentityCredential : public BnWritableIdentityCredential {
+ public:
+ // For a new credential, call initialize() right after construction.
+ //
+ // For an updated credential, call initializeForUpdate() right after
+ // construction.
+ //
+ WritableIdentityCredential(sp<SecureHardwareProvisioningProxy> hwProxy,
+ const string& docType, bool testCredential)
+ : hwProxy_(hwProxy), docType_(docType), testCredential_(testCredential) {}
+
+ ~WritableIdentityCredential();
+
+ // Creates the Credential Key. Returns false on failure.
+ bool initialize();
+
+ // Used when updating a credential. Returns false on failure.
+ bool initializeForUpdate(const vector<uint8_t>& encryptedCredentialKeys);
+
+ // Methods from IWritableIdentityCredential follow.
+ ndk::ScopedAStatus getAttestationCertificate(
+ const vector<uint8_t>& attestationApplicationId,
+ const vector<uint8_t>& attestationChallenge,
+ vector<Certificate>* outCertificateChain) override;
+
+ ndk::ScopedAStatus setExpectedProofOfProvisioningSize(
+ int32_t expectedProofOfProvisioningSize) override;
+
+ ndk::ScopedAStatus startPersonalization(
+ int32_t accessControlProfileCount,
+ const vector<int32_t>& entryCounts) override;
+
+ ndk::ScopedAStatus addAccessControlProfile(
+ int32_t id, const Certificate& readerCertificate,
+ bool userAuthenticationRequired, int64_t timeoutMillis,
+ int64_t secureUserId,
+ SecureAccessControlProfile* outSecureAccessControlProfile) override;
+
+ ndk::ScopedAStatus beginAddEntry(
+ const vector<int32_t>& accessControlProfileIds, const string& nameSpace,
+ const string& name, int32_t entrySize) override;
+ ndk::ScopedAStatus addEntryValue(
+ const vector<uint8_t>& content,
+ vector<uint8_t>* outEncryptedContent) override;
+
+ ndk::ScopedAStatus finishAddingEntries(
+ vector<uint8_t>* outCredentialData,
+ vector<uint8_t>* outProofOfProvisioningSignature) override;
+
+ private:
+ // Set by constructor.
+ sp<SecureHardwareProvisioningProxy> hwProxy_;
+ string docType_;
+ bool testCredential_;
+
+ // This is set in initialize().
+ bool startPersonalizationCalled_;
+ bool firstEntry_;
+
+ // This is set in getAttestationCertificate().
+ bool getAttestationCertificateAlreadyCalled_ = false;
+
+ // These fields are initialized during startPersonalization()
+ size_t numAccessControlProfileRemaining_;
+ vector<int32_t> remainingEntryCounts_;
+ cppbor::Array signedDataAccessControlProfiles_;
+ cppbor::Map signedDataNamespaces_;
+ cppbor::Array signedDataCurrentNamespace_;
+ size_t expectedProofOfProvisioningSize_;
+
+ // This field is initialized in addAccessControlProfile
+ set<int32_t> accessControlProfileIds_;
+
+ // These fields are initialized during beginAddEntry()
+ size_t entryRemainingBytes_;
+ string entryNameSpace_;
+ string entryName_;
+ vector<int32_t> entryAccessControlProfileIds_;
+ vector<uint8_t> entryBytes_;
+ set<string> allNameSpaces_;
+};
+
+} // namespace aidl::android::hardware::identity
+
+#endif // ANDROID_HARDWARE_IDENTITY_WRITABLEIDENTITYCREDENTIAL_H
diff --git a/guest/hals/identity/libeic/EicCbor.c b/guest/hals/identity/libeic/EicCbor.c
new file mode 100644
index 0000000..b496342
--- /dev/null
+++ b/guest/hals/identity/libeic/EicCbor.c
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "EicCbor.h"
+
+void eicCborInit(EicCbor* cbor, uint8_t* buffer, size_t bufferSize) {
+ eicMemSet(cbor, '\0', sizeof(EicCbor));
+ cbor->size = 0;
+ cbor->bufferSize = bufferSize;
+ cbor->buffer = buffer;
+ cbor->digestType = EIC_CBOR_DIGEST_TYPE_SHA256;
+ eicOpsSha256Init(&cbor->digester.sha256);
+}
+
+void eicCborInitHmacSha256(EicCbor* cbor, uint8_t* buffer, size_t bufferSize,
+ const uint8_t* hmacKey, size_t hmacKeySize) {
+ eicMemSet(cbor, '\0', sizeof(EicCbor));
+ cbor->size = 0;
+ cbor->bufferSize = bufferSize;
+ cbor->buffer = buffer;
+ cbor->digestType = EIC_CBOR_DIGEST_TYPE_HMAC_SHA256;
+ eicOpsHmacSha256Init(&cbor->digester.hmacSha256, hmacKey, hmacKeySize);
+}
+
+void eicCborEnableSecondaryDigesterSha256(EicCbor* cbor, EicSha256Ctx* sha256) {
+ cbor->secondaryDigesterSha256 = sha256;
+}
+
+void eicCborFinal(EicCbor* cbor, uint8_t digest[EIC_SHA256_DIGEST_SIZE]) {
+ switch (cbor->digestType) {
+ case EIC_CBOR_DIGEST_TYPE_SHA256:
+ eicOpsSha256Final(&cbor->digester.sha256, digest);
+ break;
+ case EIC_CBOR_DIGEST_TYPE_HMAC_SHA256:
+ eicOpsHmacSha256Final(&cbor->digester.hmacSha256, digest);
+ break;
+ }
+}
+
+void eicCborAppend(EicCbor* cbor, const uint8_t* data, size_t size) {
+ switch (cbor->digestType) {
+ case EIC_CBOR_DIGEST_TYPE_SHA256:
+ eicOpsSha256Update(&cbor->digester.sha256, data, size);
+ break;
+ case EIC_CBOR_DIGEST_TYPE_HMAC_SHA256:
+ eicOpsHmacSha256Update(&cbor->digester.hmacSha256, data, size);
+ break;
+ }
+ if (cbor->secondaryDigesterSha256 != NULL) {
+ eicOpsSha256Update(cbor->secondaryDigesterSha256, data, size);
+ }
+
+ if (cbor->size >= cbor->bufferSize) {
+ cbor->size += size;
+ return;
+ }
+
+ size_t numBytesLeft = cbor->bufferSize - cbor->size;
+ size_t numBytesToCopy = size;
+ if (numBytesToCopy > numBytesLeft) {
+ numBytesToCopy = numBytesLeft;
+ }
+ eicMemCpy(cbor->buffer + cbor->size, data, numBytesToCopy);
+
+ cbor->size += size;
+}
+
+size_t eicCborAdditionalLengthBytesFor(size_t size) {
+ if (size < 24) {
+ return 0;
+ } else if (size <= 0xff) {
+ return 1;
+ } else if (size <= 0xffff) {
+ return 2;
+ } else if (size <= 0xffffffff) {
+ return 4;
+ }
+ return 8;
+}
+
+void eicCborBegin(EicCbor* cbor, int majorType, uint64_t size) {
+ uint8_t data[9];
+
+ if (size < 24) {
+ data[0] = (majorType << 5) | size;
+ eicCborAppend(cbor, data, 1);
+ } else if (size <= 0xff) {
+ data[0] = (majorType << 5) | 24;
+ data[1] = size;
+ eicCborAppend(cbor, data, 2);
+ } else if (size <= 0xffff) {
+ data[0] = (majorType << 5) | 25;
+ data[1] = size >> 8;
+ data[2] = size & 0xff;
+ eicCborAppend(cbor, data, 3);
+ } else if (size <= 0xffffffff) {
+ data[0] = (majorType << 5) | 26;
+ data[1] = (size >> 24) & 0xff;
+ data[2] = (size >> 16) & 0xff;
+ data[3] = (size >> 8) & 0xff;
+ data[4] = size & 0xff;
+ eicCborAppend(cbor, data, 5);
+ } else {
+ data[0] = (majorType << 5) | 27;
+ data[1] = (((uint64_t)size) >> 56) & 0xff;
+ data[2] = (((uint64_t)size) >> 48) & 0xff;
+ data[3] = (((uint64_t)size) >> 40) & 0xff;
+ data[4] = (((uint64_t)size) >> 32) & 0xff;
+ data[5] = (((uint64_t)size) >> 24) & 0xff;
+ data[6] = (((uint64_t)size) >> 16) & 0xff;
+ data[7] = (((uint64_t)size) >> 8) & 0xff;
+ data[8] = ((uint64_t)size) & 0xff;
+ eicCborAppend(cbor, data, 9);
+ }
+}
+
+void eicCborAppendByteString(EicCbor* cbor, const uint8_t* data,
+ size_t dataSize) {
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, dataSize);
+ eicCborAppend(cbor, data, dataSize);
+}
+
+void eicCborAppendString(EicCbor* cbor, const char* str, size_t strLength) {
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_STRING, strLength);
+ eicCborAppend(cbor, (const uint8_t*)str, strLength);
+}
+
+void eicCborAppendStringZ(EicCbor* cbor, const char* str) {
+ eicCborAppendString(cbor, str, eicStrLen(str));
+}
+
+void eicCborAppendSimple(EicCbor* cbor, uint8_t simpleValue) {
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_SIMPLE, simpleValue);
+}
+
+void eicCborAppendBool(EicCbor* cbor, bool value) {
+ uint8_t simpleValue =
+ value ? EIC_CBOR_SIMPLE_VALUE_TRUE : EIC_CBOR_SIMPLE_VALUE_FALSE;
+ eicCborAppendSimple(cbor, simpleValue);
+}
+
+void eicCborAppendSemantic(EicCbor* cbor, uint64_t value) {
+ size_t encoded = value;
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_SEMANTIC, encoded);
+}
+
+void eicCborAppendUnsigned(EicCbor* cbor, uint64_t value) {
+ uint64_t encoded = value;
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_UNSIGNED, encoded);
+}
+
+void eicCborAppendNumber(EicCbor* cbor, int64_t value) {
+ if (value < 0) {
+ uint64_t encoded = -1 - value;
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_NEGATIVE, encoded);
+ } else {
+ eicCborAppendUnsigned(cbor, value);
+ }
+}
+
+void eicCborAppendArray(EicCbor* cbor, size_t numElements) {
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_ARRAY, numElements);
+}
+
+void eicCborAppendMap(EicCbor* cbor, size_t numPairs) {
+ eicCborBegin(cbor, EIC_CBOR_MAJOR_TYPE_MAP, numPairs);
+}
+
+bool eicCborCalcAccessControl(EicCbor* cborBuilder, int id,
+ const uint8_t* readerCertificate,
+ size_t readerCertificateSize,
+ bool userAuthenticationRequired,
+ uint64_t timeoutMillis, uint64_t secureUserId) {
+ size_t numPairs = 1;
+ if (readerCertificateSize > 0) {
+ numPairs += 1;
+ }
+ if (userAuthenticationRequired) {
+ numPairs += 2;
+ if (secureUserId > 0) {
+ numPairs += 1;
+ }
+ }
+ eicCborAppendMap(cborBuilder, numPairs);
+ eicCborAppendStringZ(cborBuilder, "id");
+ eicCborAppendUnsigned(cborBuilder, id);
+ if (readerCertificateSize > 0) {
+ eicCborAppendStringZ(cborBuilder, "readerCertificate");
+ eicCborAppendByteString(cborBuilder, readerCertificate,
+ readerCertificateSize);
+ }
+ if (userAuthenticationRequired) {
+ eicCborAppendStringZ(cborBuilder, "userAuthenticationRequired");
+ eicCborAppendBool(cborBuilder, userAuthenticationRequired);
+ eicCborAppendStringZ(cborBuilder, "timeoutMillis");
+ eicCborAppendUnsigned(cborBuilder, timeoutMillis);
+ if (secureUserId > 0) {
+ eicCborAppendStringZ(cborBuilder, "secureUserId");
+ eicCborAppendUnsigned(cborBuilder, secureUserId);
+ }
+ }
+
+ if (cborBuilder->size > cborBuilder->bufferSize) {
+ eicDebug("Buffer for ACP CBOR is too small (%zd) - need %zd bytes",
+ cborBuilder->bufferSize, cborBuilder->size);
+ return false;
+ }
+
+ return true;
+}
+
+bool eicCborCalcEntryAdditionalData(
+ const uint8_t* accessControlProfileIds, size_t numAccessControlProfileIds,
+ const char* nameSpace, size_t nameSpaceLength, const char* name,
+ size_t nameLength, uint8_t* cborBuffer, size_t cborBufferSize,
+ size_t* outAdditionalDataCborSize,
+ uint8_t additionalDataSha256[EIC_SHA256_DIGEST_SIZE]) {
+ EicCbor cborBuilder;
+
+ eicCborInit(&cborBuilder, cborBuffer, cborBufferSize);
+ eicCborAppendMap(&cborBuilder, 3);
+ eicCborAppendStringZ(&cborBuilder, "Namespace");
+ eicCborAppendString(&cborBuilder, nameSpace, nameSpaceLength);
+ eicCborAppendStringZ(&cborBuilder, "Name");
+ eicCborAppendString(&cborBuilder, name, nameLength);
+ eicCborAppendStringZ(&cborBuilder, "AccessControlProfileIds");
+ eicCborAppendArray(&cborBuilder, numAccessControlProfileIds);
+ for (size_t n = 0; n < numAccessControlProfileIds; n++) {
+ eicCborAppendNumber(&cborBuilder, accessControlProfileIds[n]);
+ }
+ if (cborBuilder.size > cborBufferSize) {
+ eicDebug(
+ "Not enough space for additionalData - buffer is only %zd bytes, "
+ "content is %zd",
+ cborBufferSize, cborBuilder.size);
+ return false;
+ }
+ if (outAdditionalDataCborSize != NULL) {
+ *outAdditionalDataCborSize = cborBuilder.size;
+ }
+ eicCborFinal(&cborBuilder, additionalDataSha256);
+ return true;
+}
diff --git a/guest/hals/identity/libeic/EicCbor.h b/guest/hals/identity/libeic/EicCbor.h
new file mode 100644
index 0000000..384766f
--- /dev/null
+++ b/guest/hals/identity/libeic/EicCbor.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_EIC_CBOR_H
+#define ANDROID_HARDWARE_IDENTITY_EIC_CBOR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EicOps.h"
+
+typedef enum {
+ EIC_CBOR_DIGEST_TYPE_SHA256,
+ EIC_CBOR_DIGEST_TYPE_HMAC_SHA256,
+} EicCborDigestType;
+
+/* EicCbor is a utility class to build CBOR data structures and calculate
+ * digests on the fly.
+ */
+typedef struct {
+ // Contains the size of the built CBOR, even if it exceeds bufferSize (will
+ // never write to buffer beyond bufferSize though)
+ size_t size;
+
+ // The size of the buffer. Is zero if no data is recorded in which case
+ // only digesting is performed.
+ size_t bufferSize;
+
+ // Whether we're producing a SHA-256 or HMAC-SHA256 digest.
+ EicCborDigestType digestType;
+
+ // The SHA-256 digester object.
+ union {
+ EicSha256Ctx sha256;
+ EicHmacSha256Ctx hmacSha256;
+ } digester;
+
+ // The secondary digester, may be unset.
+ EicSha256Ctx* secondaryDigesterSha256;
+
+ // The buffer used for building up CBOR or NULL if bufferSize is 0.
+ uint8_t* buffer;
+} EicCbor;
+
+/* Initializes an EicCbor.
+ *
+ * The given buffer will be used, up to bufferSize.
+ *
+ * If bufferSize is 0, buffer may be NULL.
+ */
+void eicCborInit(EicCbor* cbor, uint8_t* buffer, size_t bufferSize);
+
+/* Like eicCborInit() but uses HMAC-SHA256 instead of SHA-256.
+ */
+void eicCborInitHmacSha256(EicCbor* cbor, uint8_t* buffer, size_t bufferSize,
+ const uint8_t* hmacKey, size_t hmacKeySize);
+
+/* Enables a secondary digester.
+ *
+ * May be enabled midway through processing, this can be used to e.g. calculate
+ * a digest of Sig_structure (for COSE_Sign1) and a separate digest of its
+ * payload.
+ */
+void eicCborEnableSecondaryDigesterSha256(EicCbor* cbor, EicSha256Ctx* sha256);
+
+/* Finishes building CBOR and returns the digest. */
+void eicCborFinal(EicCbor* cbor, uint8_t digest[EIC_SHA256_DIGEST_SIZE]);
+
+/* Appends CBOR data to the EicCbor. */
+void eicCborAppend(EicCbor* cbor, const uint8_t* data, size_t size);
+
+#define EIC_CBOR_MAJOR_TYPE_UNSIGNED 0
+#define EIC_CBOR_MAJOR_TYPE_NEGATIVE 1
+#define EIC_CBOR_MAJOR_TYPE_BYTE_STRING 2
+#define EIC_CBOR_MAJOR_TYPE_STRING 3
+#define EIC_CBOR_MAJOR_TYPE_ARRAY 4
+#define EIC_CBOR_MAJOR_TYPE_MAP 5
+#define EIC_CBOR_MAJOR_TYPE_SEMANTIC 6
+#define EIC_CBOR_MAJOR_TYPE_SIMPLE 7
+
+#define EIC_CBOR_SIMPLE_VALUE_FALSE 20
+#define EIC_CBOR_SIMPLE_VALUE_TRUE 21
+
+#define EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR 24
+
+/* Begins a new CBOR value. */
+void eicCborBegin(EicCbor* cbor, int majorType, uint64_t size);
+
+/* Appends a bytestring. */
+void eicCborAppendByteString(EicCbor* cbor, const uint8_t* data,
+ size_t dataSize);
+
+/* Appends a UTF-8 string. */
+void eicCborAppendString(EicCbor* cbor, const char* str, size_t strLength);
+
+/* Appends a NUL-terminated UTF-8 string. */
+void eicCborAppendStringZ(EicCbor* cbor, const char* str);
+
+/* Appends a simple value. */
+void eicCborAppendSimple(EicCbor* cbor, uint8_t simpleValue);
+
+/* Appends a boolean. */
+void eicCborAppendBool(EicCbor* cbor, bool value);
+
+/* Appends a semantic */
+void eicCborAppendSemantic(EicCbor* cbor, uint64_t value);
+
+/* Appends an unsigned number. */
+void eicCborAppendUnsigned(EicCbor* cbor, uint64_t value);
+
+/* Appends a number. */
+void eicCborAppendNumber(EicCbor* cbor, int64_t value);
+
+/* Starts appending an array.
+ *
+ * After this numElements CBOR elements must follow.
+ */
+void eicCborAppendArray(EicCbor* cbor, size_t numElements);
+
+/* Starts appending a map.
+ *
+ * After this numPairs pairs of CBOR elements must follow.
+ */
+void eicCborAppendMap(EicCbor* cbor, size_t numPairs);
+
+/* Calculates how many bytes are needed to store a size. */
+size_t eicCborAdditionalLengthBytesFor(size_t size);
+
+bool eicCborCalcAccessControl(EicCbor* cborBuilder, int id,
+ const uint8_t* readerCertificate,
+ size_t readerCertificateSize,
+ bool userAuthenticationRequired,
+ uint64_t timeoutMillis, uint64_t secureUserId);
+
+bool eicCborCalcEntryAdditionalData(
+ const uint8_t* accessControlProfileIds, size_t numAccessControlProfileIds,
+ const char* nameSpace, size_t nameSpaceLength, const char* name,
+ size_t nameLength, uint8_t* cborBuffer, size_t cborBufferSize,
+ size_t* outAdditionalDataCborSize,
+ uint8_t additionalDataSha256[EIC_SHA256_DIGEST_SIZE]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ANDROID_HARDWARE_IDENTITY_EIC_CBOR_H
diff --git a/guest/hals/identity/libeic/EicCommon.h b/guest/hals/identity/libeic/EicCommon.h
new file mode 100644
index 0000000..1fab26a
--- /dev/null
+++ b/guest/hals/identity/libeic/EicCommon.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_EIC_COMMON_H
+#define ANDROID_HARDWARE_IDENTITY_EIC_COMMON_H
+
+// Feature version 202009:
+//
+// CredentialKeys = [
+// bstr, ; storageKey, a 128-bit AES key
+// bstr, ; credentialPrivKey, the private key for credentialKey
+// ]
+//
+// Feature version 202101:
+//
+// CredentialKeys = [
+// bstr, ; storageKey, a 128-bit AES key
+// bstr, ; credentialPrivKey, the private key for credentialKey
+// bstr ; proofOfProvisioning SHA-256
+// ]
+//
+// where storageKey is 16 bytes, credentialPrivateKey is 32 bytes, and
+// proofOfProvisioning SHA-256 is 32 bytes.
+#define EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202009 52
+#define EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202101 86
+
+#endif // ANDROID_HARDWARE_IDENTITY_EIC_COMMON_H
diff --git a/guest/hals/identity/libeic/EicOps.h b/guest/hals/identity/libeic/EicOps.h
new file mode 100644
index 0000000..849d6fc
--- /dev/null
+++ b/guest/hals/identity/libeic/EicOps.h
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_EIC_OPS_H
+#define ANDROID_HARDWARE_IDENTITY_EIC_OPS_H
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+// Uncomment or define if debug messages are needed.
+//
+//#define EIC_DEBUG
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// The following defines must be set to something appropriate
+//
+// EIC_SHA256_CONTEXT_SIZE - the size of EicSha256Ctx
+// EIC_HMAC_SHA256_CONTEXT_SIZE - the size of EicHmacSha256Ctx
+//
+// For example, if EicSha256Ctx is implemented using BoringSSL this would be
+// defined as sizeof(SHA256_CTX).
+//
+// We expect the implementation to provide a header file with the name
+// EicOpsImpl.h to do all this.
+//
+#include "EicOpsImpl.h"
+
+#define EIC_SHA256_DIGEST_SIZE 32
+
+// The size of a P-256 private key.
+//
+#define EIC_P256_PRIV_KEY_SIZE 32
+
+// The size of a P-256 public key in uncompressed form.
+//
+// The public key is stored in uncompressed form, first the X coordinate, then
+// the Y coordinate.
+//
+#define EIC_P256_PUB_KEY_SIZE 64
+
+// Size of one of the coordinates in a curve-point.
+//
+#define EIC_P256_COORDINATE_SIZE 32
+
+// The size of an ECSDA signature using P-256.
+//
+// The R and S values are stored here, first R then S.
+//
+#define EIC_ECDSA_P256_SIGNATURE_SIZE 64
+
+#define EIC_AES_128_KEY_SIZE 16
+
+// The following are definitions of implementation functions the
+// underlying platform must provide.
+//
+
+struct EicSha256Ctx {
+ uint8_t reserved[EIC_SHA256_CONTEXT_SIZE];
+};
+typedef struct EicSha256Ctx EicSha256Ctx;
+
+struct EicHmacSha256Ctx {
+ uint8_t reserved[EIC_HMAC_SHA256_CONTEXT_SIZE];
+};
+typedef struct EicHmacSha256Ctx EicHmacSha256Ctx;
+
+#ifdef EIC_DEBUG
+// Debug macro. Don't include a new-line in message.
+//
+#define eicDebug(...) \
+ do { \
+ eicPrint("%s:%d: ", __FILE__, __LINE__); \
+ eicPrint(__VA_ARGS__); \
+ eicPrint("\n"); \
+ } while (0)
+#else
+#define eicDebug(...) \
+ do { \
+ } while (0)
+#endif
+
+// Prints message which should include new-line character. Can be no-op.
+//
+// Don't use this from code, use eicDebug() instead.
+//
+#ifdef EIC_DEBUG
+void eicPrint(const char* format, ...);
+#else
+inline void eicPrint(const char*, ...) {}
+#endif
+
+// Dumps data as pretty-printed hex. Can be no-op.
+//
+#ifdef EIC_DEBUG
+void eicHexdump(const char* message, const uint8_t* data, size_t dataSize);
+#else
+inline void eicHexdump(const char*, const uint8_t*, size_t) {}
+#endif
+
+// Pretty-prints encoded CBOR. Can be no-op.
+//
+// If a byte-string is larger than |maxBStrSize| its contents will not be
+// printed, instead the value of the form "<bstr size=1099016
+// sha1=ef549cca331f73dfae2090e6a37c04c23f84b07b>" will be printed. Pass zero
+// for |maxBStrSize| to disable this.
+//
+#ifdef EIC_DEBUG
+void eicCborPrettyPrint(const uint8_t* cborData, size_t cborDataSize,
+ size_t maxBStrSize);
+#else
+inline void eicCborPrettyPrint(const uint8_t*, size_t, size_t) {}
+#endif
+
+// Memory setting, see memset(3).
+void* eicMemSet(void* s, int c, size_t n);
+
+// Memory copying, see memcpy(3).
+void* eicMemCpy(void* dest, const void* src, size_t n);
+
+// String length, see strlen(3).
+size_t eicStrLen(const char* s);
+
+// Memory compare, see CRYPTO_memcmp(3SSL)
+//
+// It takes an amount of time dependent on len, but independent of the contents
+// of the memory regions pointed to by s1 and s2.
+//
+int eicCryptoMemCmp(const void* s1, const void* s2, size_t n);
+
+// Random number generation.
+bool eicOpsRandom(uint8_t* buf, size_t numBytes);
+
+// If |testCredential| is true, returns the 128-bit AES Hardware-Bound Key (16
+// bytes).
+//
+// Otherwise returns all zeroes (16 bytes).
+//
+const uint8_t* eicOpsGetHardwareBoundKey(bool testCredential);
+
+// Encrypts |data| with |key| and |additionalAuthenticatedData| using |nonce|,
+// returns the resulting (nonce || ciphertext || tag) in |encryptedData| which
+// must be of size |dataSize| + 28.
+bool eicOpsEncryptAes128Gcm(
+ const uint8_t* key, // Must be 16 bytes
+ const uint8_t* nonce, // Must be 12 bytes
+ const uint8_t* data, // May be NULL if size is 0
+ size_t dataSize,
+ const uint8_t* additionalAuthenticationData, // May be NULL if size is 0
+ size_t additionalAuthenticationDataSize, uint8_t* encryptedData);
+
+// Decrypts |encryptedData| using |key| and |additionalAuthenticatedData|,
+// returns resulting plaintext in |data| must be of size |encryptedDataSize|
+// - 28.
+//
+// The format of |encryptedData| must be as specified in the
+// encryptAes128Gcm() function.
+bool eicOpsDecryptAes128Gcm(const uint8_t* key, // Must be 16 bytes
+ const uint8_t* encryptedData,
+ size_t encryptedDataSize,
+ const uint8_t* additionalAuthenticationData,
+ size_t additionalAuthenticationDataSize,
+ uint8_t* data);
+
+// Creates an EC key using the P-256 curve. The private key is written to
+// |privateKey|. The public key is written to |publicKey|.
+//
+bool eicOpsCreateEcKey(uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ uint8_t publicKey[EIC_P256_PUB_KEY_SIZE]);
+
+// Generates CredentialKey plus an attestation certificate.
+//
+// The attestation certificate will be signed by the attestation keys the secure
+// area has been provisioned with. The given |challenge| and |applicationId|
+// will be used as will |testCredential|.
+//
+// The generated certificate will be in X.509 format and returned in |cert|
+// and |certSize| must be set to the size of this array and this function will
+// set it to the size of the certification chain on successfully return.
+//
+// This may return either a single certificate or an entire certificate
+// chain. If it returns only a single certificate, the implementation of
+// SecureHardwareProvisioningProxy::createCredentialKey() should amend the
+// remainder of the certificate chain on the HAL side.
+//
+bool eicOpsCreateCredentialKey(uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ const uint8_t* challenge, size_t challengeSize,
+ const uint8_t* applicationId,
+ size_t applicationIdSize, bool testCredential,
+ uint8_t* cert,
+ size_t* certSize); // inout
+
+// Generate an X.509 certificate for the key identified by |publicKey| which
+// must be of the form returned by eicOpsCreateEcKey().
+//
+// If proofOfBinding is not NULL, it will be included as an OCTET_STRING
+// X.509 extension at OID 1.3.6.1.4.1.11129.2.1.26.
+//
+// The certificate will be signed by the key identified by |signingKey| which
+// must be of the form returned by eicOpsCreateEcKey().
+//
+bool eicOpsSignEcKey(const uint8_t publicKey[EIC_P256_PUB_KEY_SIZE],
+ const uint8_t signingKey[EIC_P256_PRIV_KEY_SIZE],
+ unsigned int serial, const char* issuerName,
+ const char* subjectName, time_t validityNotBefore,
+ time_t validityNotAfter, const uint8_t* proofOfBinding,
+ size_t proofOfBindingSize, uint8_t* cert,
+ size_t* certSize); // inout
+
+// Uses |privateKey| to create an ECDSA signature of some data (the SHA-256 must
+// be given by |digestOfData|). Returns the signature in |signature|.
+//
+bool eicOpsEcDsa(const uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ const uint8_t digestOfData[EIC_SHA256_DIGEST_SIZE],
+ uint8_t signature[EIC_ECDSA_P256_SIGNATURE_SIZE]);
+
+// Performs Elliptic Curve Diffie-Helman.
+//
+bool eicOpsEcdh(const uint8_t publicKey[EIC_P256_PUB_KEY_SIZE],
+ const uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ uint8_t sharedSecret[EIC_P256_COORDINATE_SIZE]);
+
+// Performs HKDF.
+//
+bool eicOpsHkdf(const uint8_t* sharedSecret, size_t sharedSecretSize,
+ const uint8_t* salt, size_t saltSize, const uint8_t* info,
+ size_t infoSize, uint8_t* output, size_t outputSize);
+
+// SHA-256 functions.
+void eicOpsSha256Init(EicSha256Ctx* ctx);
+void eicOpsSha256Update(EicSha256Ctx* ctx, const uint8_t* data, size_t len);
+void eicOpsSha256Final(EicSha256Ctx* ctx,
+ uint8_t digest[EIC_SHA256_DIGEST_SIZE]);
+
+// HMAC SHA-256 functions.
+void eicOpsHmacSha256Init(EicHmacSha256Ctx* ctx, const uint8_t* key,
+ size_t keySize);
+void eicOpsHmacSha256Update(EicHmacSha256Ctx* ctx, const uint8_t* data,
+ size_t len);
+void eicOpsHmacSha256Final(EicHmacSha256Ctx* ctx,
+ uint8_t digest[EIC_SHA256_DIGEST_SIZE]);
+
+// Extracts the public key in the given X.509 certificate.
+//
+// If the key is not an EC key, this function fails.
+//
+// Otherwise the public key is stored in uncompressed form in |publicKey| which
+// size should be set in |publicKeySize|. On successful return |publicKeySize|
+// is set to the length of the key. If there is not enough space, the function
+// fails.
+//
+// (The public key returned is not necessarily a P-256 key, even if it is note
+// that its size is not EIC_P256_PUBLIC_KEY_SIZE because of the leading 0x04.)
+//
+bool eicOpsX509GetPublicKey(const uint8_t* x509Cert, size_t x509CertSize,
+ uint8_t* publicKey, size_t* publicKeySize);
+
+// Checks that the X.509 certificate given by |x509Cert| is signed by the public
+// key given by |publicKey| which must be an EC key in uncompressed form (e.g.
+// same formatt as returned by eicOpsX509GetPublicKey()).
+//
+bool eicOpsX509CertSignedByPublicKey(const uint8_t* x509Cert,
+ size_t x509CertSize,
+ const uint8_t* publicKey,
+ size_t publicKeySize);
+
+// Checks that |signature| is a signature of some data (given by |digest|),
+// signed by the public key given by |publicKey|.
+//
+// The key must be an EC key in uncompressed form (e.g. same format as returned
+// by eicOpsX509GetPublicKey()).
+//
+// The format of the signature is the same encoding as the 'signature' field of
+// COSE_Sign1 - that is, it's the R and S integers both with the same length as
+// the key-size.
+//
+// The size of digest must match the size of the key.
+//
+bool eicOpsEcDsaVerifyWithPublicKey(const uint8_t* digest, size_t digestSize,
+ const uint8_t* signature,
+ size_t signatureSize,
+ const uint8_t* publicKey,
+ size_t publicKeySize);
+
+// Validates that the passed in data constitutes a valid auth- and verification
+// tokens.
+//
+bool eicOpsValidateAuthToken(
+ uint64_t challenge, uint64_t secureUserId, uint64_t authenticatorId,
+ int hardwareAuthenticatorType, uint64_t timeStamp, const uint8_t* mac,
+ size_t macSize, uint64_t verificationTokenChallenge,
+ uint64_t verificationTokenTimeStamp, int verificationTokenSecurityLevel,
+ const uint8_t* verificationTokenMac, size_t verificationTokenMacSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ANDROID_HARDWARE_IDENTITY_EIC_OPS_H
diff --git a/guest/hals/identity/libeic/EicOpsImpl.cc b/guest/hals/identity/libeic/EicOpsImpl.cc
new file mode 100644
index 0000000..0921c72
--- /dev/null
+++ b/guest/hals/identity/libeic/EicOpsImpl.cc
@@ -0,0 +1,546 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "EicOpsImpl"
+
+#include <optional>
+#include <tuple>
+#include <vector>
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <string.h>
+
+#include <android/hardware/identity/support/IdentityCredentialSupport.h>
+
+#include <openssl/sha.h>
+
+#include <openssl/aes.h>
+#include <openssl/bn.h>
+#include <openssl/crypto.h>
+#include <openssl/ec.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/hkdf.h>
+#include <openssl/hmac.h>
+#include <openssl/objects.h>
+#include <openssl/pem.h>
+#include <openssl/pkcs12.h>
+#include <openssl/rand.h>
+#include <openssl/x509.h>
+#include <openssl/x509_vfy.h>
+
+#include "EicOps.h"
+
+using ::std::map;
+using ::std::optional;
+using ::std::string;
+using ::std::tuple;
+using ::std::vector;
+
+void* eicMemSet(void* s, int c, size_t n) { return memset(s, c, n); }
+
+void* eicMemCpy(void* dest, const void* src, size_t n) {
+ return memcpy(dest, src, n);
+}
+
+size_t eicStrLen(const char* s) { return strlen(s); }
+
+int eicCryptoMemCmp(const void* s1, const void* s2, size_t n) {
+ return CRYPTO_memcmp(s1, s2, n);
+}
+
+void eicOpsHmacSha256Init(EicHmacSha256Ctx* ctx, const uint8_t* key,
+ size_t keySize) {
+ HMAC_CTX* realCtx = (HMAC_CTX*)ctx;
+ HMAC_CTX_init(realCtx);
+ if (HMAC_Init_ex(realCtx, key, keySize, EVP_sha256(), nullptr /* impl */) !=
+ 1) {
+ LOG(ERROR) << "Error initializing HMAC_CTX";
+ }
+}
+
+void eicOpsHmacSha256Update(EicHmacSha256Ctx* ctx, const uint8_t* data,
+ size_t len) {
+ HMAC_CTX* realCtx = (HMAC_CTX*)ctx;
+ if (HMAC_Update(realCtx, data, len) != 1) {
+ LOG(ERROR) << "Error updating HMAC_CTX";
+ }
+}
+
+void eicOpsHmacSha256Final(EicHmacSha256Ctx* ctx,
+ uint8_t digest[EIC_SHA256_DIGEST_SIZE]) {
+ HMAC_CTX* realCtx = (HMAC_CTX*)ctx;
+ unsigned int size = 0;
+ if (HMAC_Final(realCtx, digest, &size) != 1) {
+ LOG(ERROR) << "Error finalizing HMAC_CTX";
+ }
+ if (size != EIC_SHA256_DIGEST_SIZE) {
+ LOG(ERROR) << "Expected 32 bytes from HMAC_Final, got " << size;
+ }
+}
+
+void eicOpsSha256Init(EicSha256Ctx* ctx) {
+ SHA256_CTX* realCtx = (SHA256_CTX*)ctx;
+ SHA256_Init(realCtx);
+}
+
+void eicOpsSha256Update(EicSha256Ctx* ctx, const uint8_t* data, size_t len) {
+ SHA256_CTX* realCtx = (SHA256_CTX*)ctx;
+ SHA256_Update(realCtx, data, len);
+}
+
+void eicOpsSha256Final(EicSha256Ctx* ctx,
+ uint8_t digest[EIC_SHA256_DIGEST_SIZE]) {
+ SHA256_CTX* realCtx = (SHA256_CTX*)ctx;
+ SHA256_Final(digest, realCtx);
+}
+
+bool eicOpsRandom(uint8_t* buf, size_t numBytes) {
+ optional<vector<uint8_t>> bytes =
+ ::android::hardware::identity::support::getRandom(numBytes);
+ if (!bytes.has_value()) {
+ return false;
+ }
+ memcpy(buf, bytes.value().data(), numBytes);
+ return true;
+}
+
+bool eicOpsEncryptAes128Gcm(
+ const uint8_t* key, // Must be 16 bytes
+ const uint8_t* nonce, // Must be 12 bytes
+ const uint8_t* data, // May be NULL if size is 0
+ size_t dataSize,
+ const uint8_t* additionalAuthenticationData, // May be NULL if size is 0
+ size_t additionalAuthenticationDataSize, uint8_t* encryptedData) {
+ vector<uint8_t> cppKey;
+ cppKey.resize(16);
+ memcpy(cppKey.data(), key, 16);
+
+ vector<uint8_t> cppData;
+ cppData.resize(dataSize);
+ if (dataSize > 0) {
+ memcpy(cppData.data(), data, dataSize);
+ }
+
+ vector<uint8_t> cppAAD;
+ cppAAD.resize(additionalAuthenticationDataSize);
+ if (additionalAuthenticationDataSize > 0) {
+ memcpy(cppAAD.data(), additionalAuthenticationData,
+ additionalAuthenticationDataSize);
+ }
+
+ vector<uint8_t> cppNonce;
+ cppNonce.resize(12);
+ memcpy(cppNonce.data(), nonce, 12);
+
+ optional<vector<uint8_t>> cppEncryptedData =
+ android::hardware::identity::support::encryptAes128Gcm(cppKey, cppNonce,
+ cppData, cppAAD);
+ if (!cppEncryptedData.has_value()) {
+ return false;
+ }
+
+ memcpy(encryptedData, cppEncryptedData.value().data(),
+ cppEncryptedData.value().size());
+ return true;
+}
+
+// Decrypts |encryptedData| using |key| and |additionalAuthenticatedData|,
+// returns resulting plaintext in |data| must be of size |encryptedDataSize|
+// - 28.
+//
+// The format of |encryptedData| must be as specified in the
+// encryptAes128Gcm() function.
+bool eicOpsDecryptAes128Gcm(const uint8_t* key, // Must be 16 bytes
+ const uint8_t* encryptedData,
+ size_t encryptedDataSize,
+ const uint8_t* additionalAuthenticationData,
+ size_t additionalAuthenticationDataSize,
+ uint8_t* data) {
+ vector<uint8_t> keyVec;
+ keyVec.resize(16);
+ memcpy(keyVec.data(), key, 16);
+
+ vector<uint8_t> encryptedDataVec;
+ encryptedDataVec.resize(encryptedDataSize);
+ if (encryptedDataSize > 0) {
+ memcpy(encryptedDataVec.data(), encryptedData, encryptedDataSize);
+ }
+
+ vector<uint8_t> aadVec;
+ aadVec.resize(additionalAuthenticationDataSize);
+ if (additionalAuthenticationDataSize > 0) {
+ memcpy(aadVec.data(), additionalAuthenticationData,
+ additionalAuthenticationDataSize);
+ }
+
+ optional<vector<uint8_t>> decryptedDataVec =
+ android::hardware::identity::support::decryptAes128Gcm(
+ keyVec, encryptedDataVec, aadVec);
+ if (!decryptedDataVec.has_value()) {
+ eicDebug("Error decrypting data");
+ return false;
+ }
+ if (decryptedDataVec.value().size() != encryptedDataSize - 28) {
+ eicDebug("Decrypted data is size %zd, expected %zd",
+ decryptedDataVec.value().size(), encryptedDataSize - 28);
+ return false;
+ }
+
+ if (decryptedDataVec.value().size() > 0) {
+ memcpy(data, decryptedDataVec.value().data(),
+ decryptedDataVec.value().size());
+ }
+ return true;
+}
+
+bool eicOpsCreateEcKey(uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ uint8_t publicKey[EIC_P256_PUB_KEY_SIZE]) {
+ optional<vector<uint8_t>> keyPair =
+ android::hardware::identity::support::createEcKeyPair();
+ if (!keyPair) {
+ eicDebug("Error creating EC keypair");
+ return false;
+ }
+ optional<vector<uint8_t>> privKey =
+ android::hardware::identity::support::ecKeyPairGetPrivateKey(
+ keyPair.value());
+ if (!privKey) {
+ eicDebug("Error extracting private key");
+ return false;
+ }
+ if (privKey.value().size() != EIC_P256_PRIV_KEY_SIZE) {
+ eicDebug("Private key is %zd bytes, expected %zd", privKey.value().size(),
+ (size_t)EIC_P256_PRIV_KEY_SIZE);
+ return false;
+ }
+
+ optional<vector<uint8_t>> pubKey =
+ android::hardware::identity::support::ecKeyPairGetPublicKey(
+ keyPair.value());
+ if (!pubKey) {
+ eicDebug("Error extracting public key");
+ return false;
+ }
+ // ecKeyPairGetPublicKey() returns 0x04 | x | y, we don't want the leading
+ // 0x04.
+ if (pubKey.value().size() != EIC_P256_PUB_KEY_SIZE + 1) {
+ eicDebug("Public key is %zd bytes long, expected %zd",
+ pubKey.value().size(), (size_t)EIC_P256_PRIV_KEY_SIZE + 1);
+ return false;
+ }
+
+ memcpy(privateKey, privKey.value().data(), EIC_P256_PRIV_KEY_SIZE);
+ memcpy(publicKey, pubKey.value().data() + 1, EIC_P256_PUB_KEY_SIZE);
+
+ return true;
+}
+
+bool eicOpsCreateCredentialKey(uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ const uint8_t* challenge, size_t challengeSize,
+ const uint8_t* applicationId,
+ size_t applicationIdSize, bool testCredential,
+ uint8_t* cert, size_t* certSize) {
+ vector<uint8_t> challengeVec(challengeSize);
+ memcpy(challengeVec.data(), challenge, challengeSize);
+
+ vector<uint8_t> applicationIdVec(applicationIdSize);
+ memcpy(applicationIdVec.data(), applicationId, applicationIdSize);
+
+ optional<std::pair<vector<uint8_t>, vector<vector<uint8_t>>>> ret =
+ android::hardware::identity::support::createEcKeyPairAndAttestation(
+ challengeVec, applicationIdVec, testCredential);
+ if (!ret) {
+ eicDebug("Error generating CredentialKey and attestation");
+ return false;
+ }
+
+ // Extract certificate chain.
+ vector<uint8_t> flatChain =
+ android::hardware::identity::support::certificateChainJoin(
+ ret.value().second);
+ if (*certSize < flatChain.size()) {
+ eicDebug("Buffer for certificate is only %zd bytes long, need %zd bytes",
+ *certSize, flatChain.size());
+ return false;
+ }
+ memcpy(cert, flatChain.data(), flatChain.size());
+ *certSize = flatChain.size();
+
+ // Extract private key.
+ optional<vector<uint8_t>> privKey =
+ android::hardware::identity::support::ecKeyPairGetPrivateKey(
+ ret.value().first);
+ if (!privKey) {
+ eicDebug("Error extracting private key");
+ return false;
+ }
+ if (privKey.value().size() != EIC_P256_PRIV_KEY_SIZE) {
+ eicDebug("Private key is %zd bytes, expected %zd", privKey.value().size(),
+ (size_t)EIC_P256_PRIV_KEY_SIZE);
+ return false;
+ }
+
+ memcpy(privateKey, privKey.value().data(), EIC_P256_PRIV_KEY_SIZE);
+
+ return true;
+}
+
+bool eicOpsSignEcKey(const uint8_t publicKey[EIC_P256_PUB_KEY_SIZE],
+ const uint8_t signingKey[EIC_P256_PRIV_KEY_SIZE],
+ unsigned int serial, const char* issuerName,
+ const char* subjectName, time_t validityNotBefore,
+ time_t validityNotAfter, const uint8_t* proofOfBinding,
+ size_t proofOfBindingSize, uint8_t* cert,
+ size_t* certSize) { // inout
+ vector<uint8_t> signingKeyVec(EIC_P256_PRIV_KEY_SIZE);
+ memcpy(signingKeyVec.data(), signingKey, EIC_P256_PRIV_KEY_SIZE);
+
+ vector<uint8_t> pubKeyVec(EIC_P256_PUB_KEY_SIZE + 1);
+ pubKeyVec[0] = 0x04;
+ memcpy(pubKeyVec.data() + 1, publicKey, EIC_P256_PUB_KEY_SIZE);
+
+ string serialDecimal = android::base::StringPrintf("%d", serial);
+
+ map<string, vector<uint8_t>> extensions;
+ if (proofOfBinding != nullptr) {
+ vector<uint8_t> proofOfBindingVec(proofOfBinding,
+ proofOfBinding + proofOfBindingSize);
+ extensions["1.3.6.1.4.1.11129.2.1.26"] = proofOfBindingVec;
+ }
+
+ optional<vector<uint8_t>> certVec =
+ android::hardware::identity::support::ecPublicKeyGenerateCertificate(
+ pubKeyVec, signingKeyVec, serialDecimal, issuerName, subjectName,
+ validityNotBefore, validityNotAfter, extensions);
+ if (!certVec) {
+ eicDebug("Error generating certificate");
+ return false;
+ }
+
+ if (*certSize < certVec.value().size()) {
+ eicDebug("Buffer for certificate is only %zd bytes long, need %zd bytes",
+ *certSize, certVec.value().size());
+ return false;
+ }
+ memcpy(cert, certVec.value().data(), certVec.value().size());
+ *certSize = certVec.value().size();
+
+ return true;
+}
+
+bool eicOpsEcDsa(const uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
+ const uint8_t digestOfData[EIC_SHA256_DIGEST_SIZE],
+ uint8_t signature[EIC_ECDSA_P256_SIGNATURE_SIZE]) {
+ vector<uint8_t> privKeyVec(EIC_P256_PRIV_KEY_SIZE);
+ memcpy(privKeyVec.data(), privateKey, EIC_P256_PRIV_KEY_SIZE);
+
+ vector<uint8_t> digestVec(EIC_SHA256_DIGEST_SIZE);
+ memcpy(digestVec.data(), digestOfData, EIC_SHA256_DIGEST_SIZE);
+
+ optional<vector<uint8_t>> derSignature =
+ android::hardware::identity::support::signEcDsaDigest(privKeyVec,
+ digestVec);
+ if (!derSignature) {
+ eicDebug("Error signing data");
+ return false;
+ }
+
+ ECDSA_SIG* sig;
+ const unsigned char* p = derSignature.value().data();
+ sig = d2i_ECDSA_SIG(nullptr, &p, derSignature.value().size());
+ if (sig == nullptr) {
+ eicDebug("Error decoding DER signature");
+ return false;
+ }
+
+ if (BN_bn2binpad(sig->r, signature, 32) != 32) {
+ eicDebug("Error encoding r");
+ return false;
+ }
+ if (BN_bn2binpad(sig->s, signature + 32, 32) != 32) {
+ eicDebug("Error encoding s");
+ return false;
+ }
+
+ return true;
+}
+
+static const uint8_t hbkTest[16] = {0};
+static const uint8_t hbkReal[16] = {0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15};
+
+const uint8_t* eicOpsGetHardwareBoundKey(bool testCredential) {
+ if (testCredential) {
+ return hbkTest;
+ }
+ return hbkReal;
+}
+
+bool eicOpsValidateAuthToken(uint64_t /* challenge */,
+ uint64_t /* secureUserId */,
+ uint64_t /* authenticatorId */,
+ int /* hardwareAuthenticatorType */,
+ uint64_t /* timeStamp */, const uint8_t* /* mac */,
+ size_t /* macSize */,
+ uint64_t /* verificationTokenChallenge */,
+ uint64_t /* verificationTokenTimeStamp */,
+ int /* verificationTokenSecurityLevel */,
+ const uint8_t* /* verificationTokenMac */,
+ size_t /* verificationTokenMacSize */) {
+ // Here's where we would validate the passed-in |authToken| to assure
+ // ourselves that it comes from the e.g. biometric hardware and wasn't made up
+ // by an attacker.
+ //
+ // However this involves calculating the MAC which requires access to the to
+ // a pre-shared key which we don't have...
+ //
+ return true;
+}
+
+bool eicOpsX509GetPublicKey(const uint8_t* x509Cert, size_t x509CertSize,
+ uint8_t* publicKey, size_t* publicKeySize) {
+ vector<uint8_t> chain;
+ chain.resize(x509CertSize);
+ memcpy(chain.data(), x509Cert, x509CertSize);
+ optional<vector<uint8_t>> res =
+ android::hardware::identity::support::certificateChainGetTopMostKey(
+ chain);
+ if (!res) {
+ return false;
+ }
+ if (res.value().size() > *publicKeySize) {
+ eicDebug("Public key size is %zd but buffer only has room for %zd bytes",
+ res.value().size(), *publicKeySize);
+ return false;
+ }
+ *publicKeySize = res.value().size();
+ memcpy(publicKey, res.value().data(), *publicKeySize);
+ eicDebug("Extracted %zd bytes public key from %zd bytes X.509 cert",
+ *publicKeySize, x509CertSize);
+ return true;
+}
+
+bool eicOpsX509CertSignedByPublicKey(const uint8_t* x509Cert,
+ size_t x509CertSize,
+ const uint8_t* publicKey,
+ size_t publicKeySize) {
+ vector<uint8_t> certVec(x509Cert, x509Cert + x509CertSize);
+ vector<uint8_t> publicKeyVec(publicKey, publicKey + publicKeySize);
+ return android::hardware::identity::support::certificateSignedByPublicKey(
+ certVec, publicKeyVec);
+}
+
+bool eicOpsEcDsaVerifyWithPublicKey(const uint8_t* digest, size_t digestSize,
+ const uint8_t* signature,
+ size_t signatureSize,
+ const uint8_t* publicKey,
+ size_t publicKeySize) {
+ vector<uint8_t> digestVec(digest, digest + digestSize);
+ vector<uint8_t> signatureVec(signature, signature + signatureSize);
+ vector<uint8_t> publicKeyVec(publicKey, publicKey + publicKeySize);
+
+ vector<uint8_t> derSignature;
+ if (!android::hardware::identity::support::ecdsaSignatureCoseToDer(
+ signatureVec, derSignature)) {
+ LOG(ERROR) << "Error convering signature to DER format";
+ return false;
+ }
+
+ if (!android::hardware::identity::support::checkEcDsaSignature(
+ digestVec, derSignature, publicKeyVec)) {
+ LOG(ERROR) << "Signature check failed";
+ return false;
+ }
+ return true;
+}
+
+bool eicOpsEcdh(const uint8_t publicKey[EIC_P256_PUB_KEY_SIZE],
+ const uint8_t privateKey[EIC_P256_PUB_KEY_SIZE],
+ uint8_t sharedSecret[EIC_P256_COORDINATE_SIZE]) {
+ vector<uint8_t> pubKeyVec(EIC_P256_PUB_KEY_SIZE + 1);
+ pubKeyVec[0] = 0x04;
+ memcpy(pubKeyVec.data() + 1, publicKey, EIC_P256_PUB_KEY_SIZE);
+
+ vector<uint8_t> privKeyVec(EIC_P256_PRIV_KEY_SIZE);
+ memcpy(privKeyVec.data(), privateKey, EIC_P256_PRIV_KEY_SIZE);
+
+ optional<vector<uint8_t>> shared =
+ android::hardware::identity::support::ecdh(pubKeyVec, privKeyVec);
+ if (!shared) {
+ LOG(ERROR) << "Error performing ECDH";
+ return false;
+ }
+ if (shared.value().size() != EIC_P256_COORDINATE_SIZE) {
+ LOG(ERROR) << "Unexpected size of shared secret " << shared.value().size()
+ << " expected " << EIC_P256_COORDINATE_SIZE << " bytes";
+ return false;
+ }
+ memcpy(sharedSecret, shared.value().data(), EIC_P256_COORDINATE_SIZE);
+ return true;
+}
+
+bool eicOpsHkdf(const uint8_t* sharedSecret, size_t sharedSecretSize,
+ const uint8_t* salt, size_t saltSize, const uint8_t* info,
+ size_t infoSize, uint8_t* output, size_t outputSize) {
+ vector<uint8_t> sharedSecretVec(sharedSecretSize);
+ memcpy(sharedSecretVec.data(), sharedSecret, sharedSecretSize);
+ vector<uint8_t> saltVec(saltSize);
+ memcpy(saltVec.data(), salt, saltSize);
+ vector<uint8_t> infoVec(infoSize);
+ memcpy(infoVec.data(), info, infoSize);
+
+ optional<vector<uint8_t>> result = android::hardware::identity::support::hkdf(
+ sharedSecretVec, saltVec, infoVec, outputSize);
+ if (!result) {
+ LOG(ERROR) << "Error performing HKDF";
+ return false;
+ }
+ if (result.value().size() != outputSize) {
+ LOG(ERROR) << "Unexpected size of HKDF " << result.value().size()
+ << " expected " << outputSize;
+ return false;
+ }
+ memcpy(output, result.value().data(), outputSize);
+ return true;
+}
+
+#ifdef EIC_DEBUG
+
+void eicPrint(const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+}
+
+void eicHexdump(const char* message, const uint8_t* data, size_t dataSize) {
+ vector<uint8_t> dataVec(dataSize);
+ memcpy(dataVec.data(), data, dataSize);
+ android::hardware::identity::support::hexdump(message, dataVec);
+}
+
+void eicCborPrettyPrint(const uint8_t* cborData, size_t cborDataSize,
+ size_t maxBStrSize) {
+ vector<uint8_t> cborDataVec(cborDataSize);
+ memcpy(cborDataVec.data(), cborData, cborDataSize);
+ string str = android::hardware::identity::support::cborPrettyPrint(
+ cborDataVec, maxBStrSize, {});
+ fprintf(stderr, "%s\n", str.c_str());
+}
+
+#endif // EIC_DEBUG
diff --git a/guest/hals/identity/libeic/EicOpsImpl.h b/guest/hals/identity/libeic/EicOpsImpl.h
new file mode 100644
index 0000000..333cdce
--- /dev/null
+++ b/guest/hals/identity/libeic/EicOpsImpl.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_EIC_OPS_IMPL_H
+#define ANDROID_HARDWARE_IDENTITY_EIC_OPS_IMPL_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+// Add whatever includes are needed for definitions below.
+//
+
+#include <openssl/hmac.h>
+#include <openssl/sha.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Set the following defines to match the implementation of the supplied
+// eicOps*() operations. See EicOps.h for details.
+//
+
+#define EIC_SHA256_CONTEXT_SIZE sizeof(SHA256_CTX)
+
+#define EIC_HMAC_SHA256_CONTEXT_SIZE sizeof(HMAC_CTX)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ANDROID_HARDWARE_IDENTITY_EMBEDDED_IC_H
diff --git a/guest/hals/identity/libeic/EicPresentation.c b/guest/hals/identity/libeic/EicPresentation.c
new file mode 100644
index 0000000..520c2c2
--- /dev/null
+++ b/guest/hals/identity/libeic/EicPresentation.c
@@ -0,0 +1,916 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "EicPresentation.h"
+#include "EicCommon.h"
+
+#include <inttypes.h>
+
+bool eicPresentationInit(EicPresentation* ctx, bool testCredential,
+ const char* docType, size_t docTypeLength,
+ const uint8_t* encryptedCredentialKeys,
+ size_t encryptedCredentialKeysSize) {
+ uint8_t credentialKeys[EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202101];
+ bool expectPopSha256 = false;
+
+ // For feature version 202009 it's 52 bytes long and for feature version
+ // 202101 it's 86 bytes (the additional data is the ProofOfProvisioning
+ // SHA-256). We need to support loading all feature versions.
+ //
+ if (encryptedCredentialKeysSize ==
+ EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202009 + 28) {
+ /* do nothing */
+ } else if (encryptedCredentialKeysSize ==
+ EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202101 + 28) {
+ expectPopSha256 = true;
+ } else {
+ eicDebug("Unexpected size %zd for encryptedCredentialKeys",
+ encryptedCredentialKeysSize);
+ return false;
+ }
+
+ eicMemSet(ctx, '\0', sizeof(EicPresentation));
+
+ if (!eicOpsDecryptAes128Gcm(
+ eicOpsGetHardwareBoundKey(testCredential), encryptedCredentialKeys,
+ encryptedCredentialKeysSize,
+ // DocType is the additionalAuthenticatedData
+ (const uint8_t*)docType, docTypeLength, credentialKeys)) {
+ eicDebug("Error decrypting CredentialKeys");
+ return false;
+ }
+
+ // It's supposed to look like this;
+ //
+ // Feature version 202009:
+ //
+ // CredentialKeys = [
+ // bstr, ; storageKey, a 128-bit AES key
+ // bstr, ; credentialPrivKey, the private key for credentialKey
+ // ]
+ //
+ // Feature version 202101:
+ //
+ // CredentialKeys = [
+ // bstr, ; storageKey, a 128-bit AES key
+ // bstr, ; credentialPrivKey, the private key for credentialKey
+ // bstr ; proofOfProvisioning SHA-256
+ // ]
+ //
+ // where storageKey is 16 bytes, credentialPrivateKey is 32 bytes, and
+ // proofOfProvisioning SHA-256 is 32 bytes.
+ //
+ if (credentialKeys[0] !=
+ (expectPopSha256 ? 0x83 : 0x82) || // array of two or three elements
+ credentialKeys[1] != 0x50 || // 16-byte bstr
+ credentialKeys[18] != 0x58 ||
+ credentialKeys[19] != 0x20) { // 32-byte bstr
+ eicDebug("Invalid CBOR for CredentialKeys");
+ return false;
+ }
+ if (expectPopSha256) {
+ if (credentialKeys[52] != 0x58 ||
+ credentialKeys[53] != 0x20) { // 32-byte bstr
+ eicDebug("Invalid CBOR for CredentialKeys");
+ return false;
+ }
+ }
+ eicMemCpy(ctx->storageKey, credentialKeys + 2, EIC_AES_128_KEY_SIZE);
+ eicMemCpy(ctx->credentialPrivateKey, credentialKeys + 20,
+ EIC_P256_PRIV_KEY_SIZE);
+ ctx->testCredential = testCredential;
+ if (expectPopSha256) {
+ eicMemCpy(ctx->proofOfProvisioningSha256, credentialKeys + 54,
+ EIC_SHA256_DIGEST_SIZE);
+ }
+ return true;
+}
+
+bool eicPresentationGenerateSigningKeyPair(EicPresentation* ctx,
+ const char* docType,
+ size_t docTypeLength, time_t now,
+ uint8_t* publicKeyCert,
+ size_t* publicKeyCertSize,
+ uint8_t signingKeyBlob[60]) {
+ uint8_t signingKeyPriv[EIC_P256_PRIV_KEY_SIZE];
+ uint8_t signingKeyPub[EIC_P256_PUB_KEY_SIZE];
+ uint8_t cborBuf[64];
+
+ // Generate the ProofOfBinding CBOR to include in the X.509 certificate in
+ // IdentityCredentialAuthenticationKeyExtension CBOR. This CBOR is defined
+ // by the following CDDL
+ //
+ // ProofOfBinding = [
+ // "ProofOfBinding",
+ // bstr, // Contains the SHA-256 of ProofOfProvisioning
+ // ]
+ //
+ // This array may grow in the future if other information needs to be
+ // conveyed.
+ //
+ // The bytes of ProofOfBinding is is represented as an OCTET_STRING
+ // and stored at OID 1.3.6.1.4.1.11129.2.1.26.
+ //
+
+ EicCbor cbor;
+ eicCborInit(&cbor, cborBuf, sizeof cborBuf);
+ eicCborAppendArray(&cbor, 2);
+ eicCborAppendStringZ(&cbor, "ProofOfBinding");
+ eicCborAppendByteString(&cbor, ctx->proofOfProvisioningSha256,
+ EIC_SHA256_DIGEST_SIZE);
+ if (cbor.size > sizeof(cborBuf)) {
+ eicDebug("Exceeded buffer size");
+ return false;
+ }
+ const uint8_t* proofOfBinding = cborBuf;
+ size_t proofOfBindingSize = cbor.size;
+
+ if (!eicOpsCreateEcKey(signingKeyPriv, signingKeyPub)) {
+ eicDebug("Error creating signing key");
+ return false;
+ }
+
+ const int secondsInOneYear = 365 * 24 * 60 * 60;
+ time_t validityNotBefore = now;
+ time_t validityNotAfter = now + secondsInOneYear; // One year from now.
+ if (!eicOpsSignEcKey(
+ signingKeyPub, ctx->credentialPrivateKey, 1,
+ "Android Identity Credential Key", // issuer CN
+ "Android Identity Credential Authentication Key", // subject CN
+ validityNotBefore, validityNotAfter, proofOfBinding,
+ proofOfBindingSize, publicKeyCert, publicKeyCertSize)) {
+ eicDebug("Error creating certificate for signing key");
+ return false;
+ }
+
+ uint8_t nonce[12];
+ if (!eicOpsRandom(nonce, 12)) {
+ eicDebug("Error getting random");
+ return false;
+ }
+ if (!eicOpsEncryptAes128Gcm(
+ ctx->storageKey, nonce, signingKeyPriv, sizeof(signingKeyPriv),
+ // DocType is the additionalAuthenticatedData
+ (const uint8_t*)docType, docTypeLength, signingKeyBlob)) {
+ eicDebug("Error encrypting signing key");
+ return false;
+ }
+
+ return true;
+}
+
+bool eicPresentationCreateEphemeralKeyPair(
+ EicPresentation* ctx, uint8_t ephemeralPrivateKey[EIC_P256_PRIV_KEY_SIZE]) {
+ uint8_t ephemeralPublicKey[EIC_P256_PUB_KEY_SIZE];
+ if (!eicOpsCreateEcKey(ctx->ephemeralPrivateKey, ephemeralPublicKey)) {
+ eicDebug("Error creating ephemeral key");
+ return false;
+ }
+ eicMemCpy(ephemeralPrivateKey, ctx->ephemeralPrivateKey,
+ EIC_P256_PRIV_KEY_SIZE);
+ return true;
+}
+
+bool eicPresentationCreateAuthChallenge(EicPresentation* ctx,
+ uint64_t* authChallenge) {
+ do {
+ if (!eicOpsRandom((uint8_t*)&(ctx->authChallenge), sizeof(uint64_t))) {
+ eicDebug("Failed generating random challenge");
+ return false;
+ }
+ } while (ctx->authChallenge == 0);
+ eicDebug("Created auth challenge %" PRIu64, ctx->authChallenge);
+ *authChallenge = ctx->authChallenge;
+ return true;
+}
+
+// From "COSE Algorithms" registry
+//
+#define COSE_ALG_ECDSA_256 -7
+
+bool eicPresentationValidateRequestMessage(
+ EicPresentation* ctx, const uint8_t* sessionTranscript,
+ size_t sessionTranscriptSize, const uint8_t* requestMessage,
+ size_t requestMessageSize, int coseSignAlg,
+ const uint8_t* readerSignatureOfToBeSigned,
+ size_t readerSignatureOfToBeSignedSize) {
+ if (ctx->readerPublicKeySize == 0) {
+ eicDebug("No public key for reader");
+ return false;
+ }
+
+ // Right now we only support ECDSA with SHA-256 (e.g. ES256).
+ //
+ if (coseSignAlg != COSE_ALG_ECDSA_256) {
+ eicDebug(
+ "COSE Signature algorithm for reader signature is %d, "
+ "only ECDSA with SHA-256 is supported right now",
+ coseSignAlg);
+ return false;
+ }
+
+ // What we're going to verify is the COSE ToBeSigned structure which
+ // looks like the following:
+ //
+ // Sig_structure = [
+ // context : "Signature" / "Signature1" / "CounterSignature",
+ // body_protected : empty_or_serialized_map,
+ // ? sign_protected : empty_or_serialized_map,
+ // external_aad : bstr,
+ // payload : bstr
+ // ]
+ //
+ // So we're going to build that CBOR...
+ //
+ EicCbor cbor;
+ eicCborInit(&cbor, NULL, 0);
+ eicCborAppendArray(&cbor, 4);
+ eicCborAppendStringZ(&cbor, "Signature1");
+
+ // The COSE Encoded protected headers is just a single field with
+ // COSE_LABEL_ALG (1) -> coseSignAlg (e.g. -7). For simplicitly we just
+ // hard-code the CBOR encoding:
+ static const uint8_t coseEncodedProtectedHeaders[] = {0xa1, 0x01, 0x26};
+ eicCborAppendByteString(&cbor, coseEncodedProtectedHeaders,
+ sizeof(coseEncodedProtectedHeaders));
+
+ // External_aad is the empty bstr
+ static const uint8_t externalAad[0] = {};
+ eicCborAppendByteString(&cbor, externalAad, sizeof(externalAad));
+
+ // For the payload, the _encoded_ form follows here. We handle this by simply
+ // opening a bstr, and then writing the CBOR. This requires us to know the
+ // size of said bstr, ahead of time... the CBOR to be written is
+ //
+ // ReaderAuthentication = [
+ // "ReaderAuthentication",
+ // SessionTranscript,
+ // ItemsRequestBytes
+ // ]
+ //
+ // ItemsRequestBytes = #6.24(bstr .cbor ItemsRequest)
+ //
+ // ReaderAuthenticationBytes = #6.24(bstr .cbor ReaderAuthentication)
+ //
+ // which is easily calculated below
+ //
+ size_t calculatedSize = 0;
+ calculatedSize += 1; // Array of size 3
+ calculatedSize += 1; // "ReaderAuthentication" less than 24 bytes
+ calculatedSize +=
+ sizeof("ReaderAuthentication") - 1; // Don't include trailing NUL
+ calculatedSize += sessionTranscriptSize; // Already CBOR encoded
+ calculatedSize += 2; // Semantic tag EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR (24)
+ calculatedSize += 1 + eicCborAdditionalLengthBytesFor(requestMessageSize);
+ calculatedSize += requestMessageSize;
+
+ // However note that we're authenticating ReaderAuthenticationBytes which
+ // is a tagged bstr of the bytes of ReaderAuthentication. So need to get
+ // that in front.
+ size_t rabCalculatedSize = 0;
+ rabCalculatedSize +=
+ 2; // Semantic tag EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR (24)
+ rabCalculatedSize += 1 + eicCborAdditionalLengthBytesFor(calculatedSize);
+ rabCalculatedSize += calculatedSize;
+
+ // Begin the bytestring for ReaderAuthenticationBytes;
+ eicCborBegin(&cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, rabCalculatedSize);
+
+ eicCborAppendSemantic(&cbor, EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR);
+
+ // Begins the bytestring for ReaderAuthentication;
+ eicCborBegin(&cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, calculatedSize);
+
+ // And now that we know the size, let's fill it in...
+ //
+ size_t payloadOffset = cbor.size;
+ eicCborBegin(&cbor, EIC_CBOR_MAJOR_TYPE_ARRAY, 3);
+ eicCborAppendStringZ(&cbor, "ReaderAuthentication");
+ eicCborAppend(&cbor, sessionTranscript, sessionTranscriptSize);
+ eicCborAppendSemantic(&cbor, EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR);
+ eicCborBegin(&cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, requestMessageSize);
+ eicCborAppend(&cbor, requestMessage, requestMessageSize);
+
+ if (cbor.size != payloadOffset + calculatedSize) {
+ eicDebug("CBOR size is %zd but we expected %zd", cbor.size,
+ payloadOffset + calculatedSize);
+ return false;
+ }
+ uint8_t toBeSignedDigest[EIC_SHA256_DIGEST_SIZE];
+ eicCborFinal(&cbor, toBeSignedDigest);
+
+ if (!eicOpsEcDsaVerifyWithPublicKey(
+ toBeSignedDigest, EIC_SHA256_DIGEST_SIZE, readerSignatureOfToBeSigned,
+ readerSignatureOfToBeSignedSize, ctx->readerPublicKey,
+ ctx->readerPublicKeySize)) {
+ eicDebug("Request message is not signed by public key");
+ return false;
+ }
+ ctx->requestMessageValidated = true;
+ return true;
+}
+
+// Validates the next certificate in the reader certificate chain.
+bool eicPresentationPushReaderCert(EicPresentation* ctx,
+ const uint8_t* certX509,
+ size_t certX509Size) {
+ // If we had a previous certificate, use its public key to validate this
+ // certificate.
+ if (ctx->readerPublicKeySize > 0) {
+ if (!eicOpsX509CertSignedByPublicKey(certX509, certX509Size,
+ ctx->readerPublicKey,
+ ctx->readerPublicKeySize)) {
+ eicDebug(
+ "Certificate is not signed by public key in the previous "
+ "certificate");
+ return false;
+ }
+ }
+
+ // Store the key of this certificate, this is used to validate the next
+ // certificate and also ACPs with certificates that use the same public key...
+ ctx->readerPublicKeySize = EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE;
+ if (!eicOpsX509GetPublicKey(certX509, certX509Size, ctx->readerPublicKey,
+ &ctx->readerPublicKeySize)) {
+ eicDebug("Error extracting public key from certificate");
+ return false;
+ }
+ if (ctx->readerPublicKeySize == 0) {
+ eicDebug("Zero-length public key in certificate");
+ return false;
+ }
+
+ return true;
+}
+
+bool eicPresentationSetAuthToken(
+ EicPresentation* ctx, uint64_t challenge, uint64_t secureUserId,
+ uint64_t authenticatorId, int hardwareAuthenticatorType, uint64_t timeStamp,
+ const uint8_t* mac, size_t macSize, uint64_t verificationTokenChallenge,
+ uint64_t verificationTokenTimestamp, int verificationTokenSecurityLevel,
+ const uint8_t* verificationTokenMac, size_t verificationTokenMacSize) {
+ // It doesn't make sense to accept any tokens if
+ // eicPresentationCreateAuthChallenge() was never called.
+ if (ctx->authChallenge == 0) {
+ eicDebug(
+ "Trying validate tokens when no auth-challenge was previously "
+ "generated");
+ return false;
+ }
+ // At least the verification-token must have the same challenge as what was
+ // generated.
+ if (verificationTokenChallenge != ctx->authChallenge) {
+ eicDebug(
+ "Challenge in verification token does not match the challenge "
+ "previously generated");
+ return false;
+ }
+ if (!eicOpsValidateAuthToken(
+ challenge, secureUserId, authenticatorId, hardwareAuthenticatorType,
+ timeStamp, mac, macSize, verificationTokenChallenge,
+ verificationTokenTimestamp, verificationTokenSecurityLevel,
+ verificationTokenMac, verificationTokenMacSize)) {
+ return false;
+ }
+ ctx->authTokenChallenge = challenge;
+ ctx->authTokenSecureUserId = secureUserId;
+ ctx->authTokenTimestamp = timeStamp;
+ ctx->verificationTokenTimestamp = verificationTokenTimestamp;
+ return true;
+}
+
+static bool checkUserAuth(EicPresentation* ctx, bool userAuthenticationRequired,
+ int timeoutMillis, uint64_t secureUserId) {
+ if (!userAuthenticationRequired) {
+ return true;
+ }
+
+ if (secureUserId != ctx->authTokenSecureUserId) {
+ eicDebug("secureUserId in profile differs from userId in authToken");
+ return false;
+ }
+
+ // Only ACP with auth-on-every-presentation - those with timeout == 0 - need
+ // the challenge to match...
+ if (timeoutMillis == 0) {
+ if (ctx->authTokenChallenge != ctx->authChallenge) {
+ eicDebug("Challenge in authToken (%" PRIu64
+ ") doesn't match the challenge "
+ "that was created (%" PRIu64 ") for this session",
+ ctx->authTokenChallenge, ctx->authChallenge);
+ return false;
+ }
+ }
+
+ uint64_t now = ctx->verificationTokenTimestamp;
+ if (ctx->authTokenTimestamp > now) {
+ eicDebug("Timestamp in authToken is in the future");
+ return false;
+ }
+
+ if (timeoutMillis > 0) {
+ if (now > ctx->authTokenTimestamp + timeoutMillis) {
+ eicDebug("Deadline for authToken is in the past");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static bool checkReaderAuth(EicPresentation* ctx,
+ const uint8_t* readerCertificate,
+ size_t readerCertificateSize) {
+ uint8_t publicKey[EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE];
+ size_t publicKeySize;
+
+ if (readerCertificateSize == 0) {
+ return true;
+ }
+
+ // Remember in this case certificate equality is done by comparing public
+ // keys, not bitwise comparison of the certificates.
+ //
+ publicKeySize = EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE;
+ if (!eicOpsX509GetPublicKey(readerCertificate, readerCertificateSize,
+ publicKey, &publicKeySize)) {
+ eicDebug("Error extracting public key from certificate");
+ return false;
+ }
+ if (publicKeySize == 0) {
+ eicDebug("Zero-length public key in certificate");
+ return false;
+ }
+
+ if ((ctx->readerPublicKeySize != publicKeySize) ||
+ (eicCryptoMemCmp(ctx->readerPublicKey, publicKey,
+ ctx->readerPublicKeySize) != 0)) {
+ return false;
+ }
+ return true;
+}
+
+// Note: This function returns false _only_ if an error occurred check for
+// access, _not_ whether access is granted. Whether access is granted is
+// returned in |accessGranted|.
+//
+bool eicPresentationValidateAccessControlProfile(
+ EicPresentation* ctx, int id, const uint8_t* readerCertificate,
+ size_t readerCertificateSize, bool userAuthenticationRequired,
+ int timeoutMillis, uint64_t secureUserId, const uint8_t mac[28],
+ bool* accessGranted, uint8_t* scratchSpace, size_t scratchSpaceSize) {
+ *accessGranted = false;
+ if (id < 0 || id >= 32) {
+ eicDebug("id value of %d is out of allowed range [0, 32[", id);
+ return false;
+ }
+
+ // Validate the MAC
+ EicCbor cborBuilder;
+ eicCborInit(&cborBuilder, scratchSpace, scratchSpaceSize);
+ if (!eicCborCalcAccessControl(
+ &cborBuilder, id, readerCertificate, readerCertificateSize,
+ userAuthenticationRequired, timeoutMillis, secureUserId)) {
+ return false;
+ }
+ if (!eicOpsDecryptAes128Gcm(ctx->storageKey, mac, 28, cborBuilder.buffer,
+ cborBuilder.size, NULL)) {
+ eicDebug("MAC for AccessControlProfile doesn't match");
+ return false;
+ }
+
+ bool passedUserAuth = checkUserAuth(ctx, userAuthenticationRequired,
+ timeoutMillis, secureUserId);
+ bool passedReaderAuth =
+ checkReaderAuth(ctx, readerCertificate, readerCertificateSize);
+
+ ctx->accessControlProfileMaskValidated |= (1U << id);
+ if (readerCertificateSize > 0) {
+ ctx->accessControlProfileMaskUsesReaderAuth |= (1U << id);
+ }
+ if (!passedReaderAuth) {
+ ctx->accessControlProfileMaskFailedReaderAuth |= (1U << id);
+ }
+ if (!passedUserAuth) {
+ ctx->accessControlProfileMaskFailedUserAuth |= (1U << id);
+ }
+
+ if (passedUserAuth && passedReaderAuth) {
+ *accessGranted = true;
+ eicDebug("Access granted for id %d", id);
+ }
+ return true;
+}
+
+bool eicPresentationCalcMacKey(
+ EicPresentation* ctx, const uint8_t* sessionTranscript,
+ size_t sessionTranscriptSize,
+ const uint8_t readerEphemeralPublicKey[EIC_P256_PUB_KEY_SIZE],
+ const uint8_t signingKeyBlob[60], const char* docType, size_t docTypeLength,
+ unsigned int numNamespacesWithValues, size_t expectedDeviceNamespacesSize) {
+ uint8_t signingKeyPriv[EIC_P256_PRIV_KEY_SIZE];
+ if (!eicOpsDecryptAes128Gcm(ctx->storageKey, signingKeyBlob, 60,
+ (const uint8_t*)docType, docTypeLength,
+ signingKeyPriv)) {
+ eicDebug("Error decrypting signingKeyBlob");
+ return false;
+ }
+
+ uint8_t sharedSecret[EIC_P256_COORDINATE_SIZE];
+ if (!eicOpsEcdh(readerEphemeralPublicKey, signingKeyPriv, sharedSecret)) {
+ eicDebug("ECDH failed");
+ return false;
+ }
+
+ EicCbor cbor;
+ eicCborInit(&cbor, NULL, 0);
+ eicCborAppendSemantic(&cbor, EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR);
+ eicCborAppendByteString(&cbor, sessionTranscript, sessionTranscriptSize);
+ uint8_t salt[EIC_SHA256_DIGEST_SIZE];
+ eicCborFinal(&cbor, salt);
+
+ const uint8_t info[7] = {'E', 'M', 'a', 'c', 'K', 'e', 'y'};
+ uint8_t derivedKey[32];
+ if (!eicOpsHkdf(sharedSecret, EIC_P256_COORDINATE_SIZE, salt, sizeof(salt),
+ info, sizeof(info), derivedKey, sizeof(derivedKey))) {
+ eicDebug("HKDF failed");
+ return false;
+ }
+
+ eicCborInitHmacSha256(&ctx->cbor, NULL, 0, derivedKey, sizeof(derivedKey));
+ ctx->buildCbor = true;
+
+ // What we're going to calculate the HMAC-SHA256 is the COSE ToBeMaced
+ // structure which looks like the following:
+ //
+ // MAC_structure = [
+ // context : "MAC" / "MAC0",
+ // protected : empty_or_serialized_map,
+ // external_aad : bstr,
+ // payload : bstr
+ // ]
+ //
+ eicCborAppendArray(&ctx->cbor, 4);
+ eicCborAppendStringZ(&ctx->cbor, "MAC0");
+
+ // The COSE Encoded protected headers is just a single field with
+ // COSE_LABEL_ALG (1) -> COSE_ALG_HMAC_256_256 (5). For simplicitly we just
+ // hard-code the CBOR encoding:
+ static const uint8_t coseEncodedProtectedHeaders[] = {0xa1, 0x01, 0x05};
+ eicCborAppendByteString(&ctx->cbor, coseEncodedProtectedHeaders,
+ sizeof(coseEncodedProtectedHeaders));
+
+ // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
+ // so external_aad is the empty bstr
+ static const uint8_t externalAad[0] = {};
+ eicCborAppendByteString(&ctx->cbor, externalAad, sizeof(externalAad));
+
+ // For the payload, the _encoded_ form follows here. We handle this by simply
+ // opening a bstr, and then writing the CBOR. This requires us to know the
+ // size of said bstr, ahead of time... the CBOR to be written is
+ //
+ // DeviceAuthentication = [
+ // "DeviceAuthentication",
+ // SessionTranscript,
+ // DocType, ; DocType as used in Documents structure in
+ // OfflineResponse DeviceNameSpacesBytes
+ // ]
+ //
+ // DeviceNameSpacesBytes = #6.24(bstr .cbor DeviceNameSpaces)
+ //
+ // DeviceAuthenticationBytes = #6.24(bstr .cbor DeviceAuthentication)
+ //
+ // which is easily calculated below
+ //
+ size_t calculatedSize = 0;
+ calculatedSize += 1; // Array of size 4
+ calculatedSize += 1; // "DeviceAuthentication" less than 24 bytes
+ calculatedSize +=
+ sizeof("DeviceAuthentication") - 1; // Don't include trailing NUL
+ calculatedSize += sessionTranscriptSize; // Already CBOR encoded
+ calculatedSize +=
+ 1 + eicCborAdditionalLengthBytesFor(docTypeLength) + docTypeLength;
+ calculatedSize += 2; // Semantic tag EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR (24)
+ calculatedSize +=
+ 1 + eicCborAdditionalLengthBytesFor(expectedDeviceNamespacesSize);
+ calculatedSize += expectedDeviceNamespacesSize;
+
+ // However note that we're authenticating DeviceAuthenticationBytes which
+ // is a tagged bstr of the bytes of DeviceAuthentication. So need to get
+ // that in front.
+ size_t dabCalculatedSize = 0;
+ dabCalculatedSize +=
+ 2; // Semantic tag EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR (24)
+ dabCalculatedSize += 1 + eicCborAdditionalLengthBytesFor(calculatedSize);
+ dabCalculatedSize += calculatedSize;
+
+ // Begin the bytestring for DeviceAuthenticationBytes;
+ eicCborBegin(&ctx->cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, dabCalculatedSize);
+
+ eicCborAppendSemantic(&ctx->cbor, EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR);
+
+ // Begins the bytestring for DeviceAuthentication;
+ eicCborBegin(&ctx->cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, calculatedSize);
+
+ eicCborAppendArray(&ctx->cbor, 4);
+ eicCborAppendStringZ(&ctx->cbor, "DeviceAuthentication");
+ eicCborAppend(&ctx->cbor, sessionTranscript, sessionTranscriptSize);
+ eicCborAppendString(&ctx->cbor, docType, docTypeLength);
+
+ // For the payload, the _encoded_ form follows here. We handle this by simply
+ // opening a bstr, and then writing the CBOR. This requires us to know the
+ // size of said bstr, ahead of time.
+ eicCborAppendSemantic(&ctx->cbor, EIC_CBOR_SEMANTIC_TAG_ENCODED_CBOR);
+ eicCborBegin(&ctx->cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING,
+ expectedDeviceNamespacesSize);
+ ctx->expectedCborSizeAtEnd = expectedDeviceNamespacesSize + ctx->cbor.size;
+
+ eicCborAppendMap(&ctx->cbor, numNamespacesWithValues);
+ return true;
+}
+
+bool eicPresentationStartRetrieveEntries(EicPresentation* ctx) {
+ // HAL may use this object multiple times to retrieve data so need to reset
+ // various state objects here.
+ ctx->requestMessageValidated = false;
+ ctx->buildCbor = false;
+ ctx->accessControlProfileMaskValidated = 0;
+ ctx->accessControlProfileMaskUsesReaderAuth = 0;
+ ctx->accessControlProfileMaskFailedReaderAuth = 0;
+ ctx->accessControlProfileMaskFailedUserAuth = 0;
+ ctx->readerPublicKeySize = 0;
+ return true;
+}
+
+EicAccessCheckResult eicPresentationStartRetrieveEntryValue(
+ EicPresentation* ctx, const char* nameSpace, size_t nameSpaceLength,
+ const char* name, size_t nameLength, unsigned int newNamespaceNumEntries,
+ int32_t entrySize, const uint8_t* accessControlProfileIds,
+ size_t numAccessControlProfileIds, uint8_t* scratchSpace,
+ size_t scratchSpaceSize) {
+ (void)entrySize;
+ uint8_t* additionalDataCbor = scratchSpace;
+ size_t additionalDataCborBufferSize = scratchSpaceSize;
+ size_t additionalDataCborSize;
+
+ if (newNamespaceNumEntries > 0) {
+ eicCborAppendString(&ctx->cbor, nameSpace, nameSpaceLength);
+ eicCborAppendMap(&ctx->cbor, newNamespaceNumEntries);
+ }
+
+ // We'll need to calc and store a digest of additionalData to check that it's
+ // the same additionalData being passed in for every
+ // eicPresentationRetrieveEntryValue() call...
+ //
+ ctx->accessCheckOk = false;
+ if (!eicCborCalcEntryAdditionalData(
+ accessControlProfileIds, numAccessControlProfileIds, nameSpace,
+ nameSpaceLength, name, nameLength, additionalDataCbor,
+ additionalDataCborBufferSize, &additionalDataCborSize,
+ ctx->additionalDataSha256)) {
+ return EIC_ACCESS_CHECK_RESULT_FAILED;
+ }
+
+ if (numAccessControlProfileIds == 0) {
+ return EIC_ACCESS_CHECK_RESULT_NO_ACCESS_CONTROL_PROFILES;
+ }
+
+ // Access is granted if at least one of the profiles grants access.
+ //
+ // If an item is configured without any profiles, access is denied.
+ //
+ EicAccessCheckResult result = EIC_ACCESS_CHECK_RESULT_FAILED;
+ for (size_t n = 0; n < numAccessControlProfileIds; n++) {
+ int id = accessControlProfileIds[n];
+ uint32_t idBitMask = (1 << id);
+
+ // If the access control profile wasn't validated, this is an error and we
+ // fail immediately.
+ bool validated =
+ ((ctx->accessControlProfileMaskValidated & idBitMask) != 0);
+ if (!validated) {
+ eicDebug("No ACP for profile id %d", id);
+ return EIC_ACCESS_CHECK_RESULT_FAILED;
+ }
+
+ // Otherwise, we _did_ validate the profile. If none of the checks
+ // failed, we're done
+ bool failedUserAuth =
+ ((ctx->accessControlProfileMaskFailedUserAuth & idBitMask) != 0);
+ bool failedReaderAuth =
+ ((ctx->accessControlProfileMaskFailedReaderAuth & idBitMask) != 0);
+ if (!failedUserAuth && !failedReaderAuth) {
+ result = EIC_ACCESS_CHECK_RESULT_OK;
+ break;
+ }
+ // One of the checks failed, convey which one
+ if (failedUserAuth) {
+ result = EIC_ACCESS_CHECK_RESULT_USER_AUTHENTICATION_FAILED;
+ } else {
+ result = EIC_ACCESS_CHECK_RESULT_READER_AUTHENTICATION_FAILED;
+ }
+ }
+ eicDebug("Result %d for name %s", result, name);
+
+ if (result == EIC_ACCESS_CHECK_RESULT_OK) {
+ eicCborAppendString(&ctx->cbor, name, nameLength);
+ ctx->accessCheckOk = true;
+ }
+ return result;
+}
+
+// Note: |content| must be big enough to hold |encryptedContentSize| - 28 bytes.
+bool eicPresentationRetrieveEntryValue(
+ EicPresentation* ctx, const uint8_t* encryptedContent,
+ size_t encryptedContentSize, uint8_t* content, const char* nameSpace,
+ size_t nameSpaceLength, const char* name, size_t nameLength,
+ const uint8_t* accessControlProfileIds, size_t numAccessControlProfileIds,
+ uint8_t* scratchSpace, size_t scratchSpaceSize) {
+ uint8_t* additionalDataCbor = scratchSpace;
+ size_t additionalDataCborBufferSize = scratchSpaceSize;
+ size_t additionalDataCborSize;
+
+ uint8_t calculatedSha256[EIC_SHA256_DIGEST_SIZE];
+ if (!eicCborCalcEntryAdditionalData(
+ accessControlProfileIds, numAccessControlProfileIds, nameSpace,
+ nameSpaceLength, name, nameLength, additionalDataCbor,
+ additionalDataCborBufferSize, &additionalDataCborSize,
+ calculatedSha256)) {
+ return false;
+ }
+
+ if (eicCryptoMemCmp(calculatedSha256, ctx->additionalDataSha256,
+ EIC_SHA256_DIGEST_SIZE) != 0) {
+ eicDebug("SHA-256 mismatch of additionalData");
+ return false;
+ }
+ if (!ctx->accessCheckOk) {
+ eicDebug("Attempting to retrieve a value for which access is not granted");
+ return false;
+ }
+
+ if (!eicOpsDecryptAes128Gcm(ctx->storageKey, encryptedContent,
+ encryptedContentSize, additionalDataCbor,
+ additionalDataCborSize, content)) {
+ eicDebug("Error decrypting content");
+ return false;
+ }
+
+ eicCborAppend(&ctx->cbor, content, encryptedContentSize - 28);
+
+ return true;
+}
+
+bool eicPresentationFinishRetrieval(EicPresentation* ctx,
+ uint8_t* digestToBeMaced,
+ size_t* digestToBeMacedSize) {
+ if (!ctx->buildCbor) {
+ *digestToBeMacedSize = 0;
+ return true;
+ }
+ if (*digestToBeMacedSize != 32) {
+ return false;
+ }
+
+ // This verifies that the correct expectedDeviceNamespacesSize value was
+ // passed in at eicPresentationCalcMacKey() time.
+ if (ctx->cbor.size != ctx->expectedCborSizeAtEnd) {
+ eicDebug("CBOR size is %zd, was expecting %zd", ctx->cbor.size,
+ ctx->expectedCborSizeAtEnd);
+ return false;
+ }
+ eicCborFinal(&ctx->cbor, digestToBeMaced);
+ return true;
+}
+
+bool eicPresentationDeleteCredential(
+ EicPresentation* ctx, const char* docType, size_t docTypeLength,
+ const uint8_t* challenge, size_t challengeSize, bool includeChallenge,
+ size_t proofOfDeletionCborSize,
+ uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]) {
+ EicCbor cbor;
+
+ eicCborInit(&cbor, NULL, 0);
+
+ // What we're going to sign is the COSE ToBeSigned structure which
+ // looks like the following:
+ //
+ // Sig_structure = [
+ // context : "Signature" / "Signature1" / "CounterSignature",
+ // body_protected : empty_or_serialized_map,
+ // ? sign_protected : empty_or_serialized_map,
+ // external_aad : bstr,
+ // payload : bstr
+ // ]
+ //
+ eicCborAppendArray(&cbor, 4);
+ eicCborAppendStringZ(&cbor, "Signature1");
+
+ // The COSE Encoded protected headers is just a single field with
+ // COSE_LABEL_ALG (1) -> COSE_ALG_ECSDA_256 (-7). For simplicitly we just
+ // hard-code the CBOR encoding:
+ static const uint8_t coseEncodedProtectedHeaders[] = {0xa1, 0x01, 0x26};
+ eicCborAppendByteString(&cbor, coseEncodedProtectedHeaders,
+ sizeof(coseEncodedProtectedHeaders));
+
+ // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
+ // so external_aad is the empty bstr
+ static const uint8_t externalAad[0] = {};
+ eicCborAppendByteString(&cbor, externalAad, sizeof(externalAad));
+
+ // For the payload, the _encoded_ form follows here. We handle this by simply
+ // opening a bstr, and then writing the CBOR. This requires us to know the
+ // size of said bstr, ahead of time.
+ eicCborBegin(&cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING, proofOfDeletionCborSize);
+
+ // Finally, the CBOR that we're actually signing.
+ eicCborAppendArray(&cbor, includeChallenge ? 4 : 3);
+ eicCborAppendStringZ(&cbor, "ProofOfDeletion");
+ eicCborAppendString(&cbor, docType, docTypeLength);
+ if (includeChallenge) {
+ eicCborAppendByteString(&cbor, challenge, challengeSize);
+ }
+ eicCborAppendBool(&cbor, ctx->testCredential);
+
+ uint8_t cborSha256[EIC_SHA256_DIGEST_SIZE];
+ eicCborFinal(&cbor, cborSha256);
+ if (!eicOpsEcDsa(ctx->credentialPrivateKey, cborSha256,
+ signatureOfToBeSigned)) {
+ eicDebug("Error signing proofOfDeletion");
+ return false;
+ }
+
+ return true;
+}
+
+bool eicPresentationProveOwnership(
+ EicPresentation* ctx, const char* docType, size_t docTypeLength,
+ bool testCredential, const uint8_t* challenge, size_t challengeSize,
+ size_t proofOfOwnershipCborSize,
+ uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]) {
+ EicCbor cbor;
+
+ eicCborInit(&cbor, NULL, 0);
+
+ // What we're going to sign is the COSE ToBeSigned structure which
+ // looks like the following:
+ //
+ // Sig_structure = [
+ // context : "Signature" / "Signature1" / "CounterSignature",
+ // body_protected : empty_or_serialized_map,
+ // ? sign_protected : empty_or_serialized_map,
+ // external_aad : bstr,
+ // payload : bstr
+ // ]
+ //
+ eicCborAppendArray(&cbor, 4);
+ eicCborAppendStringZ(&cbor, "Signature1");
+
+ // The COSE Encoded protected headers is just a single field with
+ // COSE_LABEL_ALG (1) -> COSE_ALG_ECSDA_256 (-7). For simplicitly we just
+ // hard-code the CBOR encoding:
+ static const uint8_t coseEncodedProtectedHeaders[] = {0xa1, 0x01, 0x26};
+ eicCborAppendByteString(&cbor, coseEncodedProtectedHeaders,
+ sizeof(coseEncodedProtectedHeaders));
+
+ // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
+ // so external_aad is the empty bstr
+ static const uint8_t externalAad[0] = {};
+ eicCborAppendByteString(&cbor, externalAad, sizeof(externalAad));
+
+ // For the payload, the _encoded_ form follows here. We handle this by simply
+ // opening a bstr, and then writing the CBOR. This requires us to know the
+ // size of said bstr, ahead of time.
+ eicCborBegin(&cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING,
+ proofOfOwnershipCborSize);
+
+ // Finally, the CBOR that we're actually signing.
+ eicCborAppendArray(&cbor, 4);
+ eicCborAppendStringZ(&cbor, "ProofOfOwnership");
+ eicCborAppendString(&cbor, docType, docTypeLength);
+ eicCborAppendByteString(&cbor, challenge, challengeSize);
+ eicCborAppendBool(&cbor, testCredential);
+
+ uint8_t cborSha256[EIC_SHA256_DIGEST_SIZE];
+ eicCborFinal(&cbor, cborSha256);
+ if (!eicOpsEcDsa(ctx->credentialPrivateKey, cborSha256,
+ signatureOfToBeSigned)) {
+ eicDebug("Error signing proofOfDeletion");
+ return false;
+ }
+
+ return true;
+}
diff --git a/guest/hals/identity/libeic/EicPresentation.h b/guest/hals/identity/libeic/EicPresentation.h
new file mode 100644
index 0000000..72d8401
--- /dev/null
+++ b/guest/hals/identity/libeic/EicPresentation.h
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_EIC_PRESENTATION_H
+#define ANDROID_HARDWARE_IDENTITY_EIC_PRESENTATION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EicCbor.h"
+
+// The maximum size we support for public keys in reader certificates.
+#define EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE 65
+
+typedef struct {
+ int featureLevel;
+
+ uint8_t storageKey[EIC_AES_128_KEY_SIZE];
+ uint8_t credentialPrivateKey[EIC_P256_PRIV_KEY_SIZE];
+
+ uint8_t ephemeralPrivateKey[EIC_P256_PRIV_KEY_SIZE];
+
+ // The challenge generated with eicPresentationCreateAuthChallenge()
+ uint64_t authChallenge;
+
+ // Set by eicPresentationSetAuthToken() and contains the fields
+ // from the passed in authToken and verificationToken.
+ //
+ uint64_t authTokenChallenge;
+ uint64_t authTokenSecureUserId;
+ uint64_t authTokenTimestamp;
+ uint64_t verificationTokenTimestamp;
+
+ // The public key for the reader.
+ //
+ // (During the process of pushing reader certificates, this is also used to
+ // store the public key of the previously pushed certificate.)
+ //
+ uint8_t readerPublicKey[EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE];
+ size_t readerPublicKeySize;
+
+ // This is set to true only if eicPresentationValidateRequestMessage()
+ // successfully validated the requestMessage.
+ //
+ // Why even record this? Because there's no requirement the HAL actually calls
+ // that function and we validate ACPs before it's called... so it's possible
+ // that a compromised HAL could trick us into marking ACPs as authorized while
+ // they in fact aren't.
+ bool requestMessageValidated;
+ bool buildCbor;
+
+ // Set to true initialized as a test credential.
+ bool testCredential;
+
+ // Set to true if the evaluation of access control checks in
+ // eicPresentationStartRetrieveEntryValue() resulted
+ // EIC_ACCESS_CHECK_RESULT_OK
+ bool accessCheckOk;
+
+ // These are bitmasks indicating which of the possible 32 access control
+ // profiles are authorized. They are built up by
+ // eicPresentationValidateAccessControlProfile().
+ //
+ uint32_t
+ accessControlProfileMaskValidated; // True if the profile was validated.
+ uint32_t accessControlProfileMaskUsesReaderAuth; // True if the ACP is using
+ // reader auth
+ uint32_t
+ accessControlProfileMaskFailedReaderAuth; // True if failed reader auth
+ uint32_t accessControlProfileMaskFailedUserAuth; // True if failed user auth
+
+ // SHA-256 for AdditionalData, updated for each entry.
+ uint8_t additionalDataSha256[EIC_SHA256_DIGEST_SIZE];
+
+ // SHA-256 of ProofOfProvisioning. Set to NUL-bytes or initialized from
+ // CredentialKeys data if credential was created with feature version 202101
+ // or later.
+ uint8_t proofOfProvisioningSha256[EIC_SHA256_DIGEST_SIZE];
+
+ size_t expectedCborSizeAtEnd;
+ EicCbor cbor;
+} EicPresentation;
+
+bool eicPresentationInit(EicPresentation* ctx, bool testCredential,
+ const char* docType, size_t docTypeLength,
+ const uint8_t* encryptedCredentialKeys,
+ size_t encryptedCredentialKeysSize);
+
+bool eicPresentationGenerateSigningKeyPair(EicPresentation* ctx,
+ const char* docType,
+ size_t docTypeLength, time_t now,
+ uint8_t* publicKeyCert,
+ size_t* publicKeyCertSize,
+ uint8_t signingKeyBlob[60]);
+
+// Create an ephemeral key-pair.
+//
+// The private key is stored in |ctx->ephemeralPrivateKey| and also returned in
+// |ephemeralPrivateKey|.
+//
+bool eicPresentationCreateEphemeralKeyPair(
+ EicPresentation* ctx, uint8_t ephemeralPrivateKey[EIC_P256_PRIV_KEY_SIZE]);
+
+// Returns a non-zero challenge in |authChallenge|.
+bool eicPresentationCreateAuthChallenge(EicPresentation* ctx,
+ uint64_t* authChallenge);
+
+// Starts retrieving entries.
+//
+bool eicPresentationStartRetrieveEntries(EicPresentation* ctx);
+
+// Sets the auth-token.
+bool eicPresentationSetAuthToken(
+ EicPresentation* ctx, uint64_t challenge, uint64_t secureUserId,
+ uint64_t authenticatorId, int hardwareAuthenticatorType, uint64_t timeStamp,
+ const uint8_t* mac, size_t macSize, uint64_t verificationTokenChallenge,
+ uint64_t verificationTokenTimeStamp, int verificationTokenSecurityLevel,
+ const uint8_t* verificationTokenMac, size_t verificationTokenMacSize);
+
+// Function to push certificates in the reader certificate chain.
+//
+// This should start with the root certificate (e.g. the last in the chain) and
+// continue up the chain, ending with the certificate for the reader.
+//
+// Calls to this function should be interleaved with calls to the
+// eicPresentationValidateAccessControlProfile() function, see below.
+//
+bool eicPresentationPushReaderCert(EicPresentation* ctx,
+ const uint8_t* certX509,
+ size_t certX509Size);
+
+// Checks an access control profile.
+//
+// Returns false if an error occurred while checking the profile (e.g. MAC
+// doesn't check out).
+//
+// Returns in |accessGranted| whether access is granted.
+//
+// If |readerCertificate| is non-empty and the public key of one of those
+// certificates appear in the chain presented by the reader, this function must
+// be called after pushing that certificate using
+// eicPresentationPushReaderCert().
+//
+// The scratchSpace should be set to a buffer at least 512 bytes. It's done
+// this way to avoid allocating stack space.
+//
+bool eicPresentationValidateAccessControlProfile(
+ EicPresentation* ctx, int id, const uint8_t* readerCertificate,
+ size_t readerCertificateSize, bool userAuthenticationRequired,
+ int timeoutMillis, uint64_t secureUserId, const uint8_t mac[28],
+ bool* accessGranted, uint8_t* scratchSpace, size_t scratchSpaceSize);
+
+// Validates that the given requestMessage is signed by the public key in the
+// certificate last set with eicPresentationPushReaderCert().
+//
+// The format of the signature is the same encoding as the 'signature' field of
+// COSE_Sign1 - that is, it's the R and S integers both with the same length as
+// the key-size.
+//
+// Must be called after eicPresentationPushReaderCert() have been used to push
+// the final certificate. Which is the certificate of the reader itself.
+//
+bool eicPresentationValidateRequestMessage(
+ EicPresentation* ctx, const uint8_t* sessionTranscript,
+ size_t sessionTranscriptSize, const uint8_t* requestMessage,
+ size_t requestMessageSize, int coseSignAlg,
+ const uint8_t* readerSignatureOfToBeSigned,
+ size_t readerSignatureOfToBeSignedSize);
+
+typedef enum {
+ // Returned if access is granted.
+ EIC_ACCESS_CHECK_RESULT_OK,
+
+ // Returned if an error occurred checking for access.
+ EIC_ACCESS_CHECK_RESULT_FAILED,
+
+ // Returned if access was denied because item is configured without any
+ // access control profiles.
+ EIC_ACCESS_CHECK_RESULT_NO_ACCESS_CONTROL_PROFILES,
+
+ // Returned if access was denied because of user authentication.
+ EIC_ACCESS_CHECK_RESULT_USER_AUTHENTICATION_FAILED,
+
+ // Returned if access was denied because of reader authentication.
+ EIC_ACCESS_CHECK_RESULT_READER_AUTHENTICATION_FAILED,
+} EicAccessCheckResult;
+
+// Passes enough information to calculate the MACing key
+//
+bool eicPresentationCalcMacKey(
+ EicPresentation* ctx, const uint8_t* sessionTranscript,
+ size_t sessionTranscriptSize,
+ const uint8_t readerEphemeralPublicKey[EIC_P256_PUB_KEY_SIZE],
+ const uint8_t signingKeyBlob[60], const char* docType, size_t docTypeLength,
+ unsigned int numNamespacesWithValues, size_t expectedDeviceNamespacesSize);
+
+// The scratchSpace should be set to a buffer at least 512 bytes (ideally 1024
+// bytes, the bigger the better). It's done this way to avoid allocating stack
+// space.
+//
+EicAccessCheckResult eicPresentationStartRetrieveEntryValue(
+ EicPresentation* ctx, const char* nameSpace, size_t nameSpaceLength,
+ const char* name, size_t nameLength, unsigned int newNamespaceNumEntries,
+ int32_t entrySize, const uint8_t* accessControlProfileIds,
+ size_t numAccessControlProfileIds, uint8_t* scratchSpace,
+ size_t scratchSpaceSize);
+
+// Note: |content| must be big enough to hold |encryptedContentSize| - 28 bytes.
+//
+// The scratchSpace should be set to a buffer at least 512 bytes. It's done this
+// way to avoid allocating stack space.
+//
+bool eicPresentationRetrieveEntryValue(
+ EicPresentation* ctx, const uint8_t* encryptedContent,
+ size_t encryptedContentSize, uint8_t* content, const char* nameSpace,
+ size_t nameSpaceLength, const char* name, size_t nameLength,
+ const uint8_t* accessControlProfileIds, size_t numAccessControlProfileIds,
+ uint8_t* scratchSpace, size_t scratchSpaceSize);
+
+// Returns the HMAC-SHA256 of |ToBeMaced| as per RFC 8051 "6.3. How to Compute
+// and Verify a MAC".
+bool eicPresentationFinishRetrieval(EicPresentation* ctx,
+ uint8_t* digestToBeMaced,
+ size_t* digestToBeMacedSize);
+
+// The data returned in |signatureOfToBeSigned| contains the ECDSA signature of
+// the ToBeSigned CBOR from RFC 8051 "4.4. Signing and Verification Process"
+// where content is set to the ProofOfDeletion CBOR.
+//
+bool eicPresentationDeleteCredential(
+ EicPresentation* ctx, const char* docType, size_t docTypeLength,
+ const uint8_t* challenge, size_t challengeSize, bool includeChallenge,
+ size_t proofOfDeletionCborSize,
+ uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]);
+
+// The data returned in |signatureOfToBeSigned| contains the ECDSA signature of
+// the ToBeSigned CBOR from RFC 8051 "4.4. Signing and Verification Process"
+// where content is set to the ProofOfOwnership CBOR.
+//
+bool eicPresentationProveOwnership(
+ EicPresentation* ctx, const char* docType, size_t docTypeLength,
+ bool testCredential, const uint8_t* challenge, size_t challengeSize,
+ size_t proofOfOwnershipCborSize,
+ uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ANDROID_HARDWARE_IDENTITY_EIC_PRESENTATION_H
diff --git a/guest/hals/identity/libeic/EicProvisioning.c b/guest/hals/identity/libeic/EicProvisioning.c
new file mode 100644
index 0000000..1f691cd
--- /dev/null
+++ b/guest/hals/identity/libeic/EicProvisioning.c
@@ -0,0 +1,403 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "EicProvisioning.h"
+#include "EicCommon.h"
+
+bool eicProvisioningInit(EicProvisioning* ctx, bool testCredential) {
+ eicMemSet(ctx, '\0', sizeof(EicProvisioning));
+ ctx->testCredential = testCredential;
+ if (!eicOpsRandom(ctx->storageKey, EIC_AES_128_KEY_SIZE)) {
+ return false;
+ }
+
+ return true;
+}
+
+bool eicProvisioningInitForUpdate(EicProvisioning* ctx, bool testCredential,
+ const char* docType, size_t docTypeLength,
+ const uint8_t* encryptedCredentialKeys,
+ size_t encryptedCredentialKeysSize) {
+ uint8_t credentialKeys[EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202101];
+
+ // For feature version 202009 it's 52 bytes long and for feature version
+ // 202101 it's 86 bytes (the additional data is the ProofOfProvisioning
+ // SHA-256). We need to support loading all feature versions.
+ //
+ bool expectPopSha256 = false;
+ if (encryptedCredentialKeysSize ==
+ EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202009 + 28) {
+ /* do nothing */
+ } else if (encryptedCredentialKeysSize ==
+ EIC_CREDENTIAL_KEYS_CBOR_SIZE_FEATURE_VERSION_202101 + 28) {
+ expectPopSha256 = true;
+ } else {
+ eicDebug("Unexpected size %zd for encryptedCredentialKeys",
+ encryptedCredentialKeysSize);
+ return false;
+ }
+
+ eicMemSet(ctx, '\0', sizeof(EicProvisioning));
+ ctx->testCredential = testCredential;
+
+ if (!eicOpsDecryptAes128Gcm(
+ eicOpsGetHardwareBoundKey(testCredential), encryptedCredentialKeys,
+ encryptedCredentialKeysSize,
+ // DocType is the additionalAuthenticatedData
+ (const uint8_t*)docType, docTypeLength, credentialKeys)) {
+ eicDebug("Error decrypting CredentialKeys");
+ return false;
+ }
+
+ // It's supposed to look like this;
+ //
+ // Feature version 202009:
+ //
+ // CredentialKeys = [
+ // bstr, ; storageKey, a 128-bit AES key
+ // bstr, ; credentialPrivKey, the private key for credentialKey
+ // ]
+ //
+ // Feature version 202101:
+ //
+ // CredentialKeys = [
+ // bstr, ; storageKey, a 128-bit AES key
+ // bstr, ; credentialPrivKey, the private key for credentialKey
+ // bstr ; proofOfProvisioning SHA-256
+ // ]
+ //
+ // where storageKey is 16 bytes, credentialPrivateKey is 32 bytes, and
+ // proofOfProvisioning SHA-256 is 32 bytes.
+ //
+ if (credentialKeys[0] !=
+ (expectPopSha256 ? 0x83 : 0x82) || // array of two or three elements
+ credentialKeys[1] != 0x50 || // 16-byte bstr
+ credentialKeys[18] != 0x58 ||
+ credentialKeys[19] != 0x20) { // 32-byte bstr
+ eicDebug("Invalid CBOR for CredentialKeys");
+ return false;
+ }
+ if (expectPopSha256) {
+ if (credentialKeys[52] != 0x58 ||
+ credentialKeys[53] != 0x20) { // 32-byte bstr
+ eicDebug("Invalid CBOR for CredentialKeys");
+ return false;
+ }
+ }
+ eicMemCpy(ctx->storageKey, credentialKeys + 2, EIC_AES_128_KEY_SIZE);
+ eicMemCpy(ctx->credentialPrivateKey, credentialKeys + 20,
+ EIC_P256_PRIV_KEY_SIZE);
+ // Note: We don't care about the previous ProofOfProvisioning SHA-256
+ ctx->isUpdate = true;
+ return true;
+}
+
+bool eicProvisioningCreateCredentialKey(
+ EicProvisioning* ctx, const uint8_t* challenge, size_t challengeSize,
+ const uint8_t* applicationId, size_t applicationIdSize,
+ uint8_t* publicKeyCert, size_t* publicKeyCertSize) {
+ if (ctx->isUpdate) {
+ eicDebug("Cannot create CredentialKey on update");
+ return false;
+ }
+
+ if (!eicOpsCreateCredentialKey(ctx->credentialPrivateKey, challenge,
+ challengeSize, applicationId,
+ applicationIdSize, ctx->testCredential,
+ publicKeyCert, publicKeyCertSize)) {
+ return false;
+ }
+ return true;
+}
+
+bool eicProvisioningStartPersonalization(
+ EicProvisioning* ctx, int accessControlProfileCount, const int* entryCounts,
+ size_t numEntryCounts, const char* docType, size_t docTypeLength,
+ size_t expectedProofOfProvisioningSize) {
+ if (numEntryCounts >= EIC_MAX_NUM_NAMESPACES) {
+ return false;
+ }
+ if (accessControlProfileCount >= EIC_MAX_NUM_ACCESS_CONTROL_PROFILE_IDS) {
+ return false;
+ }
+
+ ctx->numEntryCounts = numEntryCounts;
+ if (numEntryCounts > EIC_MAX_NUM_NAMESPACES) {
+ return false;
+ }
+ for (size_t n = 0; n < numEntryCounts; n++) {
+ if (entryCounts[n] >= 256) {
+ return false;
+ }
+ ctx->entryCounts[n] = entryCounts[n];
+ }
+ ctx->curNamespace = -1;
+ ctx->curNamespaceNumProcessed = 0;
+
+ eicCborInit(&ctx->cbor, NULL, 0);
+
+ // What we're going to sign is the COSE ToBeSigned structure which
+ // looks like the following:
+ //
+ // Sig_structure = [
+ // context : "Signature" / "Signature1" / "CounterSignature",
+ // body_protected : empty_or_serialized_map,
+ // ? sign_protected : empty_or_serialized_map,
+ // external_aad : bstr,
+ // payload : bstr
+ // ]
+ //
+ eicCborAppendArray(&ctx->cbor, 4);
+ eicCborAppendStringZ(&ctx->cbor, "Signature1");
+
+ // The COSE Encoded protected headers is just a single field with
+ // COSE_LABEL_ALG (1) -> COSE_ALG_ECSDA_256 (-7). For simplicitly we just
+ // hard-code the CBOR encoding:
+ static const uint8_t coseEncodedProtectedHeaders[] = {0xa1, 0x01, 0x26};
+ eicCborAppendByteString(&ctx->cbor, coseEncodedProtectedHeaders,
+ sizeof(coseEncodedProtectedHeaders));
+
+ // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
+ // so external_aad is the empty bstr
+ static const uint8_t externalAad[0] = {};
+ eicCborAppendByteString(&ctx->cbor, externalAad, sizeof(externalAad));
+
+ // For the payload, the _encoded_ form follows here. We handle this by simply
+ // opening a bstr, and then writing the CBOR. This requires us to know the
+ // size of said bstr, ahead of time.
+ eicCborBegin(&ctx->cbor, EIC_CBOR_MAJOR_TYPE_BYTE_STRING,
+ expectedProofOfProvisioningSize);
+ ctx->expectedCborSizeAtEnd = expectedProofOfProvisioningSize + ctx->cbor.size;
+
+ eicOpsSha256Init(&ctx->proofOfProvisioningDigester);
+ eicCborEnableSecondaryDigesterSha256(&ctx->cbor,
+ &ctx->proofOfProvisioningDigester);
+
+ eicCborAppendArray(&ctx->cbor, 5);
+ eicCborAppendStringZ(&ctx->cbor, "ProofOfProvisioning");
+ eicCborAppendString(&ctx->cbor, docType, docTypeLength);
+
+ eicCborAppendArray(&ctx->cbor, accessControlProfileCount);
+
+ return true;
+}
+
+bool eicProvisioningAddAccessControlProfile(
+ EicProvisioning* ctx, int id, const uint8_t* readerCertificate,
+ size_t readerCertificateSize, bool userAuthenticationRequired,
+ uint64_t timeoutMillis, uint64_t secureUserId, uint8_t outMac[28],
+ uint8_t* scratchSpace, size_t scratchSpaceSize) {
+ EicCbor cborBuilder;
+ eicCborInit(&cborBuilder, scratchSpace, scratchSpaceSize);
+
+ if (!eicCborCalcAccessControl(
+ &cborBuilder, id, readerCertificate, readerCertificateSize,
+ userAuthenticationRequired, timeoutMillis, secureUserId)) {
+ return false;
+ }
+
+ // Calculate and return MAC
+ uint8_t nonce[12];
+ if (!eicOpsRandom(nonce, 12)) {
+ return false;
+ }
+ if (!eicOpsEncryptAes128Gcm(ctx->storageKey, nonce, NULL, 0,
+ cborBuilder.buffer, cborBuilder.size, outMac)) {
+ return false;
+ }
+
+ // The ACP CBOR in the provisioning receipt doesn't include secureUserId so
+ // build it again.
+ eicCborInit(&cborBuilder, scratchSpace, scratchSpaceSize);
+ if (!eicCborCalcAccessControl(
+ &cborBuilder, id, readerCertificate, readerCertificateSize,
+ userAuthenticationRequired, timeoutMillis, 0 /* secureUserId */)) {
+ return false;
+ }
+
+ // Append the CBOR from the local builder to the digester.
+ eicCborAppend(&ctx->cbor, cborBuilder.buffer, cborBuilder.size);
+
+ return true;
+}
+
+bool eicProvisioningBeginAddEntry(EicProvisioning* ctx,
+ const uint8_t* accessControlProfileIds,
+ size_t numAccessControlProfileIds,
+ const char* nameSpace, size_t nameSpaceLength,
+ const char* name, size_t nameLength,
+ uint64_t entrySize, uint8_t* scratchSpace,
+ size_t scratchSpaceSize) {
+ uint8_t* additionalDataCbor = scratchSpace;
+ const size_t additionalDataCborBufSize = scratchSpaceSize;
+ size_t additionalDataCborSize;
+
+ // We'll need to calc and store a digest of additionalData to check that it's
+ // the same additionalData being passed in for every
+ // eicProvisioningAddEntryValue() call...
+ if (!eicCborCalcEntryAdditionalData(
+ accessControlProfileIds, numAccessControlProfileIds, nameSpace,
+ nameSpaceLength, name, nameLength, additionalDataCbor,
+ additionalDataCborBufSize, &additionalDataCborSize,
+ ctx->additionalDataSha256)) {
+ return false;
+ }
+
+ if (ctx->curNamespace == -1) {
+ ctx->curNamespace = 0;
+ ctx->curNamespaceNumProcessed = 0;
+ // Opens the main map: { * Namespace => [ + Entry ] }
+ eicCborAppendMap(&ctx->cbor, ctx->numEntryCounts);
+ eicCborAppendString(&ctx->cbor, nameSpace, nameSpaceLength);
+ // Opens the per-namespace array: [ + Entry ]
+ eicCborAppendArray(&ctx->cbor, ctx->entryCounts[ctx->curNamespace]);
+ }
+
+ if (ctx->curNamespaceNumProcessed == ctx->entryCounts[ctx->curNamespace]) {
+ ctx->curNamespace += 1;
+ ctx->curNamespaceNumProcessed = 0;
+ eicCborAppendString(&ctx->cbor, nameSpace, nameSpaceLength);
+ // Opens the per-namespace array: [ + Entry ]
+ eicCborAppendArray(&ctx->cbor, ctx->entryCounts[ctx->curNamespace]);
+ }
+
+ eicCborAppendMap(&ctx->cbor, 3);
+ eicCborAppendStringZ(&ctx->cbor, "name");
+ eicCborAppendString(&ctx->cbor, name, nameLength);
+
+ ctx->curEntrySize = entrySize;
+ ctx->curEntryNumBytesReceived = 0;
+
+ eicCborAppendStringZ(&ctx->cbor, "value");
+
+ ctx->curNamespaceNumProcessed += 1;
+ return true;
+}
+
+bool eicProvisioningAddEntryValue(
+ EicProvisioning* ctx, const uint8_t* accessControlProfileIds,
+ size_t numAccessControlProfileIds, const char* nameSpace,
+ size_t nameSpaceLength, const char* name, size_t nameLength,
+ const uint8_t* content, size_t contentSize, uint8_t* outEncryptedContent,
+ uint8_t* scratchSpace, size_t scratchSpaceSize) {
+ uint8_t* additionalDataCbor = scratchSpace;
+ const size_t additionalDataCborBufSize = scratchSpaceSize;
+ size_t additionalDataCborSize;
+ uint8_t calculatedSha256[EIC_SHA256_DIGEST_SIZE];
+
+ if (!eicCborCalcEntryAdditionalData(
+ accessControlProfileIds, numAccessControlProfileIds, nameSpace,
+ nameSpaceLength, name, nameLength, additionalDataCbor,
+ additionalDataCborBufSize, &additionalDataCborSize,
+ calculatedSha256)) {
+ return false;
+ }
+ if (eicCryptoMemCmp(calculatedSha256, ctx->additionalDataSha256,
+ EIC_SHA256_DIGEST_SIZE) != 0) {
+ eicDebug("SHA-256 mismatch of additionalData");
+ return false;
+ }
+
+ eicCborAppend(&ctx->cbor, content, contentSize);
+
+ uint8_t nonce[12];
+ if (!eicOpsRandom(nonce, 12)) {
+ return false;
+ }
+ if (!eicOpsEncryptAes128Gcm(ctx->storageKey, nonce, content, contentSize,
+ additionalDataCbor, additionalDataCborSize,
+ outEncryptedContent)) {
+ return false;
+ }
+
+ // If done with this entry, close the map
+ ctx->curEntryNumBytesReceived += contentSize;
+ if (ctx->curEntryNumBytesReceived == ctx->curEntrySize) {
+ eicCborAppendStringZ(&ctx->cbor, "accessControlProfiles");
+ eicCborAppendArray(&ctx->cbor, numAccessControlProfileIds);
+ for (size_t n = 0; n < numAccessControlProfileIds; n++) {
+ eicCborAppendNumber(&ctx->cbor, accessControlProfileIds[n]);
+ }
+ }
+ return true;
+}
+
+bool eicProvisioningFinishAddingEntries(
+ EicProvisioning* ctx,
+ uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]) {
+ uint8_t cborSha256[EIC_SHA256_DIGEST_SIZE];
+
+ eicCborAppendBool(&ctx->cbor, ctx->testCredential);
+ eicCborFinal(&ctx->cbor, cborSha256);
+
+ // This verifies that the correct expectedProofOfProvisioningSize value was
+ // passed in at eicStartPersonalization() time.
+ if (ctx->cbor.size != ctx->expectedCborSizeAtEnd) {
+ eicDebug("CBOR size is %zd, was expecting %zd", ctx->cbor.size,
+ ctx->expectedCborSizeAtEnd);
+ return false;
+ }
+
+ if (!eicOpsEcDsa(ctx->credentialPrivateKey, cborSha256,
+ signatureOfToBeSigned)) {
+ eicDebug("Error signing proofOfProvisioning");
+ return false;
+ }
+
+ return true;
+}
+
+bool eicProvisioningFinishGetCredentialData(
+ EicProvisioning* ctx, const char* docType, size_t docTypeLength,
+ uint8_t* encryptedCredentialKeys, size_t* encryptedCredentialKeysSize) {
+ EicCbor cbor;
+ uint8_t cborBuf[86];
+
+ if (*encryptedCredentialKeysSize < 86 + 28) {
+ eicDebug("encryptedCredentialKeysSize is %zd which is insufficient");
+ return false;
+ }
+
+ eicCborInit(&cbor, cborBuf, sizeof(cborBuf));
+ eicCborAppendArray(&cbor, 3);
+ eicCborAppendByteString(&cbor, ctx->storageKey, EIC_AES_128_KEY_SIZE);
+ eicCborAppendByteString(&cbor, ctx->credentialPrivateKey,
+ EIC_P256_PRIV_KEY_SIZE);
+ uint8_t popSha256[EIC_SHA256_DIGEST_SIZE];
+ eicOpsSha256Final(&ctx->proofOfProvisioningDigester, popSha256);
+ eicCborAppendByteString(&cbor, popSha256, EIC_SHA256_DIGEST_SIZE);
+ if (cbor.size > sizeof(cborBuf)) {
+ eicDebug("Exceeded buffer size");
+ return false;
+ }
+
+ uint8_t nonce[12];
+ if (!eicOpsRandom(nonce, 12)) {
+ eicDebug("Error getting random");
+ return false;
+ }
+ if (!eicOpsEncryptAes128Gcm(eicOpsGetHardwareBoundKey(ctx->testCredential),
+ nonce, cborBuf, cbor.size,
+ // DocType is the additionalAuthenticatedData
+ (const uint8_t*)docType, docTypeLength,
+ encryptedCredentialKeys)) {
+ eicDebug("Error encrypting CredentialKeys");
+ return false;
+ }
+ *encryptedCredentialKeysSize = cbor.size + 28;
+
+ return true;
+}
diff --git a/guest/hals/identity/libeic/EicProvisioning.h b/guest/hals/identity/libeic/EicProvisioning.h
new file mode 100644
index 0000000..245a6e6
--- /dev/null
+++ b/guest/hals/identity/libeic/EicProvisioning.h
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_EIC_PROVISIONING_H
+#define ANDROID_HARDWARE_IDENTITY_EIC_PROVISIONING_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EicCbor.h"
+
+#define EIC_MAX_NUM_NAMESPACES 32
+#define EIC_MAX_NUM_ACCESS_CONTROL_PROFILE_IDS 32
+
+typedef struct {
+ // Set by eicCreateCredentialKey() OR eicProvisioningInitForUpdate()
+ uint8_t credentialPrivateKey[EIC_P256_PRIV_KEY_SIZE];
+
+ int numEntryCounts;
+ uint8_t entryCounts[EIC_MAX_NUM_NAMESPACES];
+
+ int curNamespace;
+ int curNamespaceNumProcessed;
+
+ size_t curEntrySize;
+ size_t curEntryNumBytesReceived;
+
+ // Set by eicProvisioningInit() OR eicProvisioningInitForUpdate()
+ uint8_t storageKey[EIC_AES_128_KEY_SIZE];
+
+ size_t expectedCborSizeAtEnd;
+
+ // SHA-256 for AdditionalData, updated for each entry.
+ uint8_t additionalDataSha256[EIC_SHA256_DIGEST_SIZE];
+
+ // Digester just for ProofOfProvisioning (without Sig_structure).
+ EicSha256Ctx proofOfProvisioningDigester;
+
+ EicCbor cbor;
+
+ bool testCredential;
+
+ // Set to true if this is an update.
+ bool isUpdate;
+} EicProvisioning;
+
+bool eicProvisioningInit(EicProvisioning* ctx, bool testCredential);
+
+bool eicProvisioningInitForUpdate(EicProvisioning* ctx, bool testCredential,
+ const char* docType, size_t docTypeLength,
+ const uint8_t* encryptedCredentialKeys,
+ size_t encryptedCredentialKeysSize);
+
+bool eicProvisioningCreateCredentialKey(
+ EicProvisioning* ctx, const uint8_t* challenge, size_t challengeSize,
+ const uint8_t* applicationId, size_t applicationIdSize,
+ uint8_t* publicKeyCert, size_t* publicKeyCertSize);
+
+bool eicProvisioningStartPersonalization(
+ EicProvisioning* ctx, int accessControlProfileCount, const int* entryCounts,
+ size_t numEntryCounts, const char* docType, size_t docTypeLength,
+ size_t expectedProofOfProvisioningingSize);
+
+// The scratchSpace should be set to a buffer at least 512 bytes. It's done this
+// way to avoid allocating stack space.
+//
+bool eicProvisioningAddAccessControlProfile(
+ EicProvisioning* ctx, int id, const uint8_t* readerCertificate,
+ size_t readerCertificateSize, bool userAuthenticationRequired,
+ uint64_t timeoutMillis, uint64_t secureUserId, uint8_t outMac[28],
+ uint8_t* scratchSpace, size_t scratchSpaceSize);
+
+// The scratchSpace should be set to a buffer at least 512 bytes. It's done this
+// way to avoid allocating stack space.
+//
+bool eicProvisioningBeginAddEntry(EicProvisioning* ctx,
+ const uint8_t* accessControlProfileIds,
+ size_t numAccessControlProfileIds,
+ const char* nameSpace, size_t nameSpaceLength,
+ const char* name, size_t nameLength,
+ uint64_t entrySize, uint8_t* scratchSpace,
+ size_t scratchSpaceSize);
+
+// The outEncryptedContent array must be contentSize + 28 bytes long.
+//
+// The scratchSpace should be set to a buffer at least 512 bytes. It's done this
+// way to avoid allocating stack space.
+//
+bool eicProvisioningAddEntryValue(
+ EicProvisioning* ctx, const uint8_t* accessControlProfileIds,
+ size_t numAccessControlProfileIds, const char* nameSpace,
+ size_t nameSpaceLength, const char* name, size_t nameLength,
+ const uint8_t* content, size_t contentSize, uint8_t* outEncryptedContent,
+ uint8_t* scratchSpace, size_t scratchSpaceSize);
+
+// The data returned in |signatureOfToBeSigned| contains the ECDSA signature of
+// the ToBeSigned CBOR from RFC 8051 "4.4. Signing and Verification Process"
+// where content is set to the ProofOfProvisioninging CBOR.
+//
+bool eicProvisioningFinishAddingEntries(
+ EicProvisioning* ctx,
+ uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]);
+
+//
+//
+// The |encryptedCredentialKeys| array is set to AES-GCM-ENC(HBK, R,
+// CredentialKeys, docType) where
+//
+// CredentialKeys = [
+// bstr, ; storageKey, a 128-bit AES key
+// bstr ; credentialPrivKey, the private key for credentialKey
+// bstr ; SHA-256(ProofOfProvisioning)
+// ]
+//
+// for feature version 202101. For feature version 202009 the third field was
+// not present.
+//
+// Since |storageKey| is 16 bytes and |credentialPrivKey| is 32 bytes, the
+// encoded CBOR for CredentialKeys is 86 bytes and consequently
+// |encryptedCredentialKeys| will be no longer than 86 + 28 = 114 bytes.
+//
+bool eicProvisioningFinishGetCredentialData(
+ EicProvisioning* ctx, const char* docType, size_t docTypeLength,
+ uint8_t* encryptedCredentialKeys, size_t* encryptedCredentialKeysSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ANDROID_HARDWARE_IDENTITY_EIC_PROVISIONING_H
diff --git a/guest/hals/identity/libeic/libeic.h b/guest/hals/identity/libeic/libeic.h
new file mode 100644
index 0000000..8674ce3
--- /dev/null
+++ b/guest/hals/identity/libeic/libeic.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_IDENTITY_LIBEIC_H
+#define ANDROID_HARDWARE_IDENTITY_LIBEIC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The EIC_INSIDE_LIBEIC_H preprocessor symbol is used to enforce
+ * library users to include only this file. All public interfaces, and
+ * only public interfaces, must be included here.
+ */
+#define EIC_INSIDE_LIBEIC_H
+#include "EicCbor.h"
+#include "EicCommon.h"
+#include "EicOps.h"
+#include "EicPresentation.h"
+#include "EicProvisioning.h"
+#undef EIC_INSIDE_LIBEIC_H
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ANDROID_HARDWARE_IDENTITY_LIBEIC_H
diff --git a/guest/hals/identity/service.cpp b/guest/hals/identity/service.cpp
new file mode 100644
index 0000000..b40dba4
--- /dev/null
+++ b/guest/hals/identity/service.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "android.hardware.identity-service"
+
+#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+
+#include "IdentityCredentialStore.h"
+
+#include "RemoteSecureHardwareProxy.h"
+
+using ::android::sp;
+using ::android::base::InitLogging;
+using ::android::base::StderrLogger;
+
+using ::aidl::android::hardware::identity::IdentityCredentialStore;
+using ::android::hardware::identity::RemoteSecureHardwareProxyFactory;
+using ::android::hardware::identity::SecureHardwareProxyFactory;
+
+int main(int /*argc*/, char* argv[]) {
+ InitLogging(argv, StderrLogger);
+
+ sp<SecureHardwareProxyFactory> hwProxyFactory =
+ new RemoteSecureHardwareProxyFactory();
+
+ ABinderProcess_setThreadPoolMaxThreadCount(0);
+ std::shared_ptr<IdentityCredentialStore> store =
+ ndk::SharedRefBase::make<IdentityCredentialStore>(hwProxyFactory);
+
+ const std::string instance =
+ std::string(IdentityCredentialStore::descriptor) + "/default";
+ binder_status_t status =
+ AServiceManager_addService(store->asBinder().get(), instance.c_str());
+ CHECK_EQ(status, STATUS_OK);
+
+ ABinderProcess_joinThreadPool();
+ return EXIT_FAILURE; // should not reach
+}
diff --git a/guest/hals/keymint/remote/Android.bp b/guest/hals/keymint/remote/Android.bp
index a383c45..4944d37 100644
--- a/guest/hals/keymint/remote/Android.bp
+++ b/guest/hals/keymint/remote/Android.bp
@@ -32,9 +32,8 @@
"-Wextra",
],
shared_libs: [
- "android.hardware.security.keymint-V1-ndk_platform",
- "android.hardware.security.secureclock-V1-ndk_platform",
- "android.hardware.security.sharedsecret-V1-ndk_platform",
+ "android.hardware.security.secureclock-V1-ndk",
+ "android.hardware.security.sharedsecret-V1-ndk",
"lib_android_keymaster_keymint_utils",
"libbase",
"libbinder_ndk",
@@ -52,11 +51,24 @@
"remote_keymint_device.cpp",
"remote_keymint_operation.cpp",
"remote_keymaster.cpp",
+ "remote_remotely_provisioned_component.cpp",
"remote_secure_clock.cpp",
"remote_shared_secret.cpp",
"service.cpp",
],
defaults: [
"cuttlefish_guest_only",
+ "keymint_use_latest_hal_aidl_ndk_shared",
],
+ required: [
+ "RemoteProvisioner",
+ "android.hardware.hardware_keystore.remote-keymint.xml",
+ ],
+}
+
+prebuilt_etc {
+ name: "android.hardware.hardware_keystore.remote-keymint.xml",
+ sub_dir: "permissions",
+ vendor: true,
+ src: "android.hardware.hardware_keystore.remote-keymint.xml",
}
diff --git a/guest/hals/keymint/remote/android.hardware.hardware_keystore.remote-keymint.xml b/guest/hals/keymint/remote/android.hardware.hardware_keystore.remote-keymint.xml
new file mode 100644
index 0000000..e5a9345
--- /dev/null
+++ b/guest/hals/keymint/remote/android.hardware.hardware_keystore.remote-keymint.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<permissions>
+ <feature name="android.hardware.hardware_keystore" version="100" />
+</permissions>
diff --git a/guest/hals/keymint/remote/android.hardware.security.keymint-service.remote.xml b/guest/hals/keymint/remote/android.hardware.security.keymint-service.remote.xml
index 4aa05ef..a4d0302 100644
--- a/guest/hals/keymint/remote/android.hardware.security.keymint-service.remote.xml
+++ b/guest/hals/keymint/remote/android.hardware.security.keymint-service.remote.xml
@@ -1,10 +1,12 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.security.keymint</name>
+ <version>2</version>
<fqname>IKeyMintDevice/default</fqname>
</hal>
<hal format="aidl">
<name>android.hardware.security.keymint</name>
+ <version>2</version>
<fqname>IRemotelyProvisionedComponent/default</fqname>
</hal>
</manifest>
diff --git a/guest/hals/keymint/remote/remote_keymaster.cpp b/guest/hals/keymint/remote/remote_keymaster.cpp
index 5eee143..9739a6b 100644
--- a/guest/hals/keymint/remote/remote_keymaster.cpp
+++ b/guest/hals/keymint/remote/remote_keymaster.cpp
@@ -17,6 +17,8 @@
#include "remote_keymaster.h"
#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
#include <keymaster/android_keymaster_messages.h>
#include <keymaster/keymaster_configuration.h>
@@ -67,6 +69,33 @@
return false;
}
+ // Set the vendor patchlevel to value retrieved from system property (which
+ // requires SELinux permission).
+ ConfigureVendorPatchlevelRequest vendor_req(message_version());
+ vendor_req.vendor_patchlevel = GetVendorPatchlevel();
+ ConfigureVendorPatchlevelResponse vendor_rsp =
+ ConfigureVendorPatchlevel(vendor_req);
+ if (vendor_rsp.error != KM_ERROR_OK) {
+ LOG(ERROR) << "Failed to configure keymaster vendor patchlevel: "
+ << vendor_rsp.error;
+ return false;
+ }
+
+ // Set the boot patchlevel to value retrieved from system property (which
+ // requires SELinux permission).
+ ConfigureBootPatchlevelRequest boot_req(message_version());
+ static constexpr char boot_prop_name[] = "ro.vendor.boot_security_patch";
+ auto boot_prop_value = android::base::GetProperty(boot_prop_name, "");
+ boot_prop_value = android::base::StringReplace(boot_prop_value.data(), "-",
+ "", /* all */ true);
+ boot_req.boot_patchlevel = std::stoi(boot_prop_value);
+ ConfigureBootPatchlevelResponse boot_rsp = ConfigureBootPatchlevel(boot_req);
+ if (boot_rsp.error != KM_ERROR_OK) {
+ LOG(ERROR) << "Failed to configure keymaster boot patchlevel: "
+ << boot_rsp.error;
+ return false;
+ }
+
return true;
}
@@ -122,15 +151,25 @@
void RemoteKeymaster::GenerateKey(const GenerateKeyRequest& request,
GenerateKeyResponse* response) {
- GenerateKeyRequest datedRequest(request.message_version);
- datedRequest.key_description = request.key_description;
-
- if (!request.key_description.Contains(TAG_CREATION_DATETIME)) {
+ if (message_version_ < MessageVersion(KmVersion::KEYMINT_1) &&
+ !request.key_description.Contains(TAG_CREATION_DATETIME)) {
+ GenerateKeyRequest datedRequest(request.message_version);
datedRequest.key_description.push_back(TAG_CREATION_DATETIME,
java_time(time(NULL)));
+ ForwardCommand(GENERATE_KEY, datedRequest, response);
+ } else {
+ ForwardCommand(GENERATE_KEY, request, response);
}
+}
- ForwardCommand(GENERATE_KEY, datedRequest, response);
+void RemoteKeymaster::GenerateRkpKey(const GenerateRkpKeyRequest& request,
+ GenerateRkpKeyResponse* response) {
+ ForwardCommand(GENERATE_RKP_KEY, request, response);
+}
+
+void RemoteKeymaster::GenerateCsr(const GenerateCsrRequest& request,
+ GenerateCsrResponse* response) {
+ ForwardCommand(GENERATE_CSR, request, response);
}
void RemoteKeymaster::GetKeyCharacteristics(
@@ -234,8 +273,21 @@
void RemoteKeymaster::GenerateTimestampToken(
GenerateTimestampTokenRequest& request,
GenerateTimestampTokenResponse* response) {
- // TODO(aosp/1641315): Send a message to the host.
ForwardCommand(GENERATE_TIMESTAMP_TOKEN, request, response);
}
+ConfigureVendorPatchlevelResponse RemoteKeymaster::ConfigureVendorPatchlevel(
+ const ConfigureVendorPatchlevelRequest& request) {
+ ConfigureVendorPatchlevelResponse response(message_version());
+ ForwardCommand(CONFIGURE_VENDOR_PATCHLEVEL, request, &response);
+ return response;
+}
+
+ConfigureBootPatchlevelResponse RemoteKeymaster::ConfigureBootPatchlevel(
+ const ConfigureBootPatchlevelRequest& request) {
+ ConfigureBootPatchlevelResponse response(message_version());
+ ForwardCommand(CONFIGURE_BOOT_PATCHLEVEL, request, &response);
+ return response;
+}
+
} // namespace keymaster
diff --git a/guest/hals/keymint/remote/remote_keymaster.h b/guest/hals/keymint/remote/remote_keymaster.h
index bd86012..d7c7abf 100644
--- a/guest/hals/keymint/remote/remote_keymaster.h
+++ b/guest/hals/keymint/remote/remote_keymaster.h
@@ -55,6 +55,10 @@
void Configure(const ConfigureRequest& request, ConfigureResponse* response);
void GenerateKey(const GenerateKeyRequest& request,
GenerateKeyResponse* response);
+ void GenerateRkpKey(const GenerateRkpKeyRequest& request,
+ GenerateRkpKeyResponse* response);
+ void GenerateCsr(const GenerateCsrRequest& request,
+ GenerateCsrResponse* response);
void GetKeyCharacteristics(const GetKeyCharacteristicsRequest& request,
GetKeyCharacteristicsResponse* response);
void ImportKey(const ImportKeyRequest& request, ImportKeyResponse* response);
@@ -82,6 +86,10 @@
const VerifyAuthorizationRequest& request);
DeviceLockedResponse DeviceLocked(const DeviceLockedRequest& request);
EarlyBootEndedResponse EarlyBootEnded();
+ ConfigureVendorPatchlevelResponse ConfigureVendorPatchlevel(
+ const ConfigureVendorPatchlevelRequest& request);
+ ConfigureBootPatchlevelResponse ConfigureBootPatchlevel(
+ const ConfigureBootPatchlevelRequest& request);
void GenerateTimestampToken(GenerateTimestampTokenRequest& request,
GenerateTimestampTokenResponse* response);
diff --git a/guest/hals/keymint/remote/remote_keymint_device.cpp b/guest/hals/keymint/remote/remote_keymint_device.cpp
index 55903b7..bef3230 100644
--- a/guest/hals/keymint/remote/remote_keymint_device.cpp
+++ b/guest/hals/keymint/remote/remote_keymint_device.cpp
@@ -37,17 +37,19 @@
namespace {
vector<KeyCharacteristics> convertKeyCharacteristics(
- SecurityLevel keyMintSecurityLevel, const AuthorizationSet& sw_enforced,
- const AuthorizationSet& hw_enforced) {
+ const vector<KeyParameter>& keyParams, SecurityLevel keyMintSecurityLevel,
+ const AuthorizationSet& sw_enforced, const AuthorizationSet& hw_enforced,
+ bool include_keystore_enforced = true) {
KeyCharacteristics keyMintEnforced{keyMintSecurityLevel, {}};
if (keyMintSecurityLevel != SecurityLevel::SOFTWARE) {
// We're pretending to be TRUSTED_ENVIRONMENT or STRONGBOX.
keyMintEnforced.authorizations = kmParamSet2Aidl(hw_enforced);
- // Put all the software authorizations in the keystore list.
- KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE,
- kmParamSet2Aidl(sw_enforced)};
- return {std::move(keyMintEnforced), std::move(keystoreEnforced)};
+ if (include_keystore_enforced && !sw_enforced.empty()) {
+ return {std::move(keyMintEnforced),
+ {SecurityLevel::KEYSTORE, kmParamSet2Aidl(sw_enforced)}};
+ }
+ return {std::move(keyMintEnforced)};
}
KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE, {}};
@@ -77,6 +79,11 @@
/* Unenforceable */
case KM_TAG_CREATION_DATETIME:
+ for (const auto& p : keyParams) {
+ if (p.tag == Tag::CREATION_DATETIME) {
+ keystoreEnforced.authorizations.push_back(kmParam2Aidl(entry));
+ }
+ }
break;
/* Disallowed in KeyCharacteristics */
@@ -160,10 +167,12 @@
vector<KeyCharacteristics> retval;
retval.reserve(2);
- if (!keyMintEnforced.authorizations.empty())
+ if (!keyMintEnforced.authorizations.empty()) {
retval.push_back(std::move(keyMintEnforced));
- if (!keystoreEnforced.authorizations.empty())
+ }
+ if (include_keystore_enforced && !keystoreEnforced.authorizations.empty()) {
retval.push_back(std::move(keystoreEnforced));
+ }
return retval;
}
@@ -245,7 +254,7 @@
creationResult->keyBlob = kmBlob2vector(response.key_blob);
creationResult->keyCharacteristics = convertKeyCharacteristics(
- securityLevel_, response.unenforced, response.enforced);
+ keyParams, securityLevel_, response.unenforced, response.enforced);
creationResult->certificateChain =
convertCertificateChain(response.certificate_chain);
return ScopedAStatus::ok();
@@ -279,7 +288,7 @@
creationResult->keyBlob = kmBlob2vector(response.key_blob);
creationResult->keyCharacteristics = convertKeyCharacteristics(
- securityLevel_, response.unenforced, response.enforced);
+ keyParams, securityLevel_, response.unenforced, response.enforced);
creationResult->certificateChain =
convertCertificateChain(response.certificate_chain);
@@ -310,7 +319,7 @@
creationResult->keyBlob = kmBlob2vector(response.key_blob);
creationResult->keyCharacteristics = convertKeyCharacteristics(
- securityLevel_, response.unenforced, response.enforced);
+ unwrappingParams, securityLevel_, response.unenforced, response.enforced);
creationResult->certificateChain =
convertCertificateChain(response.certificate_chain);
@@ -413,10 +422,25 @@
}
ScopedAStatus RemoteKeyMintDevice::getKeyCharacteristics(
- const std::vector<uint8_t>& /* storageKeyBlob */,
- const std::vector<uint8_t>& /* appId */,
- const std::vector<uint8_t>& /* appData */,
- std::vector<KeyCharacteristics>* /* keyCharacteristics */) {
- return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
+ const std::vector<uint8_t>& storageKeyBlob,
+ const std::vector<uint8_t>& appId, const std::vector<uint8_t>& appData,
+ std::vector<KeyCharacteristics>* keyCharacteristics) {
+ GetKeyCharacteristicsRequest request(impl_.message_version());
+ request.SetKeyMaterial(storageKeyBlob.data(), storageKeyBlob.size());
+ addClientAndAppData(appId, appData, &request.additional_params);
+
+ GetKeyCharacteristicsResponse response(impl_.message_version());
+ impl_.GetKeyCharacteristics(request, &response);
+
+ if (response.error != KM_ERROR_OK) {
+ return kmError2ScopedAStatus(response.error);
+ }
+
+ *keyCharacteristics = convertKeyCharacteristics(
+ {} /*keyParams*/, securityLevel_, response.unenforced, response.enforced,
+ false /*include_keystore_enforced*/);
+
+ return ScopedAStatus::ok();
}
+
} // namespace aidl::android::hardware::security::keymint
diff --git a/guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp b/guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp
new file mode 100644
index 0000000..7d2eca1
--- /dev/null
+++ b/guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <aidl/android/hardware/security/keymint/RpcHardwareInfo.h>
+#include <cppbor.h>
+#include <cppbor_parse.h>
+#include <keymaster/cppcose/cppcose.h>
+#include <keymaster/keymaster_configuration.h>
+#include <openssl/bn.h>
+#include <openssl/ec.h>
+#include <openssl/rand.h>
+#include <openssl/x509.h>
+
+#include <variant>
+
+#include "KeyMintUtils.h"
+#include "android/binder_auto_utils.h"
+#include "remote_remotely_provisioned_component.h"
+
+namespace aidl::android::hardware::security::keymint {
+namespace {
+using namespace cppcose;
+using namespace keymaster;
+
+using ::aidl::android::hardware::security::keymint::km_utils::kmBlob2vector;
+using ::ndk::ScopedAStatus;
+
+// Error codes from the provisioning stack are negated.
+ndk::ScopedAStatus toKeymasterError(const KeymasterResponse& response) {
+ auto error =
+ static_cast<keymaster_error_t>(-static_cast<int32_t>(response.error));
+ return ::aidl::android::hardware::security::keymint::km_utils::
+ kmError2ScopedAStatus(error);
+}
+
+} // namespace
+
+RemoteRemotelyProvisionedComponent::RemoteRemotelyProvisionedComponent(
+ keymaster::RemoteKeymaster& impl)
+ : impl_(impl) {}
+
+ScopedAStatus RemoteRemotelyProvisionedComponent::getHardwareInfo(
+ RpcHardwareInfo* info) {
+ info->versionNumber = 1;
+ info->rpcAuthorName = "Google";
+ info->supportedEekCurve = RpcHardwareInfo::CURVE_25519;
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus RemoteRemotelyProvisionedComponent::generateEcdsaP256KeyPair(
+ bool testMode, MacedPublicKey* macedPublicKey,
+ std::vector<uint8_t>* privateKeyHandle) {
+ GenerateRkpKeyRequest request(impl_.message_version());
+ request.test_mode = testMode;
+ GenerateRkpKeyResponse response(impl_.message_version());
+ impl_.GenerateRkpKey(request, &response);
+ if (response.error != KM_ERROR_OK) {
+ return toKeymasterError(response);
+ }
+
+ macedPublicKey->macedKey = km_utils::kmBlob2vector(response.maced_public_key);
+ *privateKeyHandle = km_utils::kmBlob2vector(response.key_blob);
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus RemoteRemotelyProvisionedComponent::generateCertificateRequest(
+ bool testMode, const std::vector<MacedPublicKey>& keysToSign,
+ const std::vector<uint8_t>& endpointEncCertChain,
+ const std::vector<uint8_t>& challenge, DeviceInfo* deviceInfo,
+ ProtectedData* protectedData, std::vector<uint8_t>* keysToSignMac) {
+ GenerateCsrRequest request(impl_.message_version());
+ request.test_mode = testMode;
+ request.num_keys = keysToSign.size();
+ request.keys_to_sign_array = new KeymasterBlob[keysToSign.size()];
+ for (size_t i = 0; i < keysToSign.size(); i++) {
+ request.SetKeyToSign(i, keysToSign[i].macedKey.data(),
+ keysToSign[i].macedKey.size());
+ }
+ request.SetEndpointEncCertChain(endpointEncCertChain.data(),
+ endpointEncCertChain.size());
+ request.SetChallenge(challenge.data(), challenge.size());
+ GenerateCsrResponse response(impl_.message_version());
+ impl_.GenerateCsr(request, &response);
+
+ if (response.error != KM_ERROR_OK) {
+ return toKeymasterError(response);
+ }
+ deviceInfo->deviceInfo = km_utils::kmBlob2vector(response.device_info_blob);
+ protectedData->protectedData =
+ km_utils::kmBlob2vector(response.protected_data_blob);
+ *keysToSignMac = km_utils::kmBlob2vector(response.keys_to_sign_mac);
+ return ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::security::keymint
diff --git a/guest/hals/keymint/remote/remote_remotely_provisioned_component.h b/guest/hals/keymint/remote/remote_remotely_provisioned_component.h
new file mode 100644
index 0000000..35e182a
--- /dev/null
+++ b/guest/hals/keymint/remote/remote_remotely_provisioned_component.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <cstdint>
+#include <vector>
+
+#include <aidl/android/hardware/security/keymint/BnRemotelyProvisionedComponent.h>
+#include <aidl/android/hardware/security/keymint/MacedPublicKey.h>
+#include <aidl/android/hardware/security/keymint/RpcHardwareInfo.h>
+#include <aidl/android/hardware/security/keymint/SecurityLevel.h>
+
+#include "KeyMintUtils.h"
+#include "guest/hals/keymint/remote/remote_keymaster.h"
+
+namespace aidl::android::hardware::security::keymint {
+
+class RemoteRemotelyProvisionedComponent
+ : public BnRemotelyProvisionedComponent {
+ public:
+ explicit RemoteRemotelyProvisionedComponent(keymaster::RemoteKeymaster& impl);
+
+ ndk::ScopedAStatus getHardwareInfo(RpcHardwareInfo* info) override;
+
+ ndk::ScopedAStatus generateEcdsaP256KeyPair(
+ bool testMode, MacedPublicKey* macedPublicKey,
+ std::vector<uint8_t>* privateKeyHandle) override;
+
+ ndk::ScopedAStatus generateCertificateRequest(
+ bool testMode, const std::vector<MacedPublicKey>& keysToSign,
+ const std::vector<uint8_t>& endpointEncCertChain,
+ const std::vector<uint8_t>& challenge, DeviceInfo* deviceInfo,
+ ProtectedData* protectedData,
+ std::vector<uint8_t>* keysToSignMac) override;
+
+ private:
+ keymaster::RemoteKeymaster& impl_;
+};
+
+} // namespace aidl::android::hardware::security::keymint
diff --git a/guest/hals/keymint/remote/service.cpp b/guest/hals/keymint/remote/service.cpp
index 404df77..1fb0143 100644
--- a/guest/hals/keymint/remote/service.cpp
+++ b/guest/hals/keymint/remote/service.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define LOG_TAG "android.hardware.security.keymint-service"
+#define LOG_TAG "android.hardware.security.keymint-service.remote"
#include <android-base/logging.h>
#include <android/binder_manager.h>
@@ -23,24 +23,31 @@
#include <keymaster/android_keymaster_messages.h>
#include <keymaster/km_version.h>
#include <keymaster/soft_keymaster_logger.h>
-#include "guest/hals/keymint/remote/remote_keymint_device.h"
+#include <aidl/android/hardware/security/keymint/SecurityLevel.h>
#include <guest/hals/keymint/remote/remote_keymaster.h>
#include <guest/hals/keymint/remote/remote_keymint_device.h>
+#include <guest/hals/keymint/remote/remote_remotely_provisioned_component.h>
#include <guest/hals/keymint/remote/remote_secure_clock.h>
#include <guest/hals/keymint/remote/remote_shared_secret.h>
#include "common/libs/fs/shared_fd.h"
#include "common/libs/security/keymaster_channel.h"
-static const char device[] = "/dev/hvc3";
+namespace {
+
+const char device[] = "/dev/hvc3";
using aidl::android::hardware::security::keymint::RemoteKeyMintDevice;
+using aidl::android::hardware::security::keymint::
+ RemoteRemotelyProvisionedComponent;
using aidl::android::hardware::security::keymint::SecurityLevel;
using aidl::android::hardware::security::secureclock::RemoteSecureClock;
using aidl::android::hardware::security::sharedsecret::RemoteSharedSecret;
+using keymaster::GenerateTimestampTokenRequest;
+using keymaster::GenerateTimestampTokenResponse;
template <typename T, class... Args>
-static std::shared_ptr<T> addService(Args&&... args) {
+std::shared_ptr<T> addService(Args&&... args) {
std::shared_ptr<T> ser =
ndk::SharedRefBase::make<T>(std::forward<Args>(args)...);
auto instanceName = std::string(T::descriptor) + "/default";
@@ -51,6 +58,21 @@
return ser;
}
+SecurityLevel getSecurityLevel(::keymaster::RemoteKeymaster& remote_keymaster) {
+ GenerateTimestampTokenRequest request(remote_keymaster.message_version());
+ GenerateTimestampTokenResponse response(remote_keymaster.message_version());
+ remote_keymaster.GenerateTimestampToken(request, &response);
+
+ if (response.error != STATUS_OK) {
+ LOG(FATAL) << "Error getting timestamp token from remote keymaster: "
+ << response.error;
+ }
+
+ return static_cast<SecurityLevel>(response.token.security_level);
+}
+
+} // namespace
+
int main(int, char** argv) {
android::base::InitLogging(argv, android::base::KernelLogger);
// Zero threads seems like a useless pool, but below we'll join this thread to
@@ -71,12 +93,17 @@
keymaster::RemoteKeymaster remote_keymaster(
&keymasterChannel, keymaster::MessageVersion(
- keymaster::KmVersion::KEYMINT_1, 0 /* km_date */));
+ keymaster::KmVersion::KEYMINT_2, 0 /* km_date */));
+
+ if (!remote_keymaster.Initialize()) {
+ LOG(FATAL) << "Could not initialize keymaster";
+ }
addService<RemoteKeyMintDevice>(remote_keymaster,
- SecurityLevel::TRUSTED_ENVIRONMENT);
+ getSecurityLevel(remote_keymaster));
addService<RemoteSecureClock>(remote_keymaster);
addService<RemoteSharedSecret>(remote_keymaster);
+ addService<RemoteRemotelyProvisionedComponent>(remote_keymaster);
ABinderProcess_joinThreadPool();
return EXIT_FAILURE; // should not reach
diff --git a/guest/hals/ril/reference-libril/Android.bp b/guest/hals/ril/reference-libril/Android.bp
index 687f95f..b6525ac 100644
--- a/guest/hals/ril/reference-libril/Android.bp
+++ b/guest/hals/ril/reference-libril/Android.bp
@@ -56,7 +56,7 @@
"libutils",
],
static_libs: [
- "libprotobuf-c-nano-enable_malloc"
+ "libprotobuf-c-nano-enable_malloc",
],
}
@@ -67,4 +67,3 @@
"[email protected]",
],
}
-
diff --git a/guest/hals/ril/reference-libril/ril.h b/guest/hals/ril/reference-libril/ril.h
index 586de42..f7bc2c5 100644
--- a/guest/hals/ril/reference-libril/ril.h
+++ b/guest/hals/ril/reference-libril/ril.h
@@ -6202,7 +6202,7 @@
*
* "data" is NULL
*
- * "response" is an array of RIL_CellInfo_v12.
+ * "response" is an array of RIL_CellInfo_v12.
*
* Valid errors:
* SUCCESS
@@ -7543,8 +7543,12 @@
#define RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORDS 172
+/**
+ * Same as RIL_REQUEST_GET_CELL_INFO_LIST but "response" is an array of RIL_CellInfo_v16.
+ */
+#define RIL_REQUEST_GET_CELL_INFO_LIST_1_6 173
-#define RIL_REQUEST_LAST RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORDS
+#define RIL_REQUEST_LAST RIL_REQUEST_GET_CELL_INFO_LIST_1_6
/***********************************************************************/
diff --git a/guest/hals/ril/reference-libril/ril_commands.h b/guest/hals/ril/reference-libril/ril_commands.h
index a100b48..4b1c48d 100644
--- a/guest/hals/ril/reference-libril/ril_commands.h
+++ b/guest/hals/ril/reference-libril/ril_commands.h
@@ -14,176 +14,193 @@
** See the License for the specific language governing permissions and
** limitations under the License.
*/
- {0, NULL}, //none
- {RIL_REQUEST_GET_SIM_STATUS, radio_1_6::getIccCardStatusResponse},
- {RIL_REQUEST_ENTER_SIM_PIN, radio_1_6::supplyIccPinForAppResponse},
- {RIL_REQUEST_ENTER_SIM_PUK, radio_1_6::supplyIccPukForAppResponse},
- {RIL_REQUEST_ENTER_SIM_PIN2, radio_1_6::supplyIccPin2ForAppResponse},
- {RIL_REQUEST_ENTER_SIM_PUK2, radio_1_6::supplyIccPuk2ForAppResponse},
- {RIL_REQUEST_CHANGE_SIM_PIN, radio_1_6::changeIccPinForAppResponse},
- {RIL_REQUEST_CHANGE_SIM_PIN2, radio_1_6::changeIccPin2ForAppResponse},
- {RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, radio_1_6::supplyNetworkDepersonalizationResponse},
- {RIL_REQUEST_GET_CURRENT_CALLS, radio_1_6::getCurrentCallsResponse},
- {RIL_REQUEST_DIAL, radio_1_6::dialResponse},
- {RIL_REQUEST_GET_IMSI, radio_1_6::getIMSIForAppResponse},
- {RIL_REQUEST_HANGUP, radio_1_6::hangupConnectionResponse},
- {RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, radio_1_6::hangupWaitingOrBackgroundResponse},
- {RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, radio_1_6::hangupForegroundResumeBackgroundResponse},
- {RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, radio_1_6::switchWaitingOrHoldingAndActiveResponse},
- {RIL_REQUEST_CONFERENCE, radio_1_6::conferenceResponse},
- {RIL_REQUEST_UDUB, radio_1_6::rejectCallResponse},
- {RIL_REQUEST_LAST_CALL_FAIL_CAUSE, radio_1_6::getLastCallFailCauseResponse},
- {RIL_REQUEST_SIGNAL_STRENGTH, radio_1_6::getSignalStrengthResponse},
- {RIL_REQUEST_VOICE_REGISTRATION_STATE, radio_1_6::getVoiceRegistrationStateResponse},
- {RIL_REQUEST_DATA_REGISTRATION_STATE, radio_1_6::getDataRegistrationStateResponse},
- {RIL_REQUEST_OPERATOR, radio_1_6::getOperatorResponse},
- {RIL_REQUEST_RADIO_POWER, radio_1_6::setRadioPowerResponse},
- {RIL_REQUEST_DTMF, radio_1_6::sendDtmfResponse},
- {RIL_REQUEST_SEND_SMS, radio_1_6::sendSmsResponse},
- {RIL_REQUEST_SEND_SMS_EXPECT_MORE, radio_1_6::sendSmsExpectMoreResponse},
- {RIL_REQUEST_SETUP_DATA_CALL, radio_1_6::setupDataCallResponse},
- {RIL_REQUEST_SIM_IO, radio_1_6::iccIOForAppResponse},
- {RIL_REQUEST_SEND_USSD, radio_1_6::sendUssdResponse},
- {RIL_REQUEST_CANCEL_USSD, radio_1_6::cancelPendingUssdResponse},
- {RIL_REQUEST_GET_CLIR, radio_1_6::getClirResponse},
- {RIL_REQUEST_SET_CLIR, radio_1_6::setClirResponse},
- {RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, radio_1_6::getCallForwardStatusResponse},
- {RIL_REQUEST_SET_CALL_FORWARD, radio_1_6::setCallForwardResponse},
- {RIL_REQUEST_QUERY_CALL_WAITING, radio_1_6::getCallWaitingResponse},
- {RIL_REQUEST_SET_CALL_WAITING, radio_1_6::setCallWaitingResponse},
- {RIL_REQUEST_SMS_ACKNOWLEDGE, radio_1_6::acknowledgeLastIncomingGsmSmsResponse},
- {RIL_REQUEST_GET_IMEI, NULL},
- {RIL_REQUEST_GET_IMEISV, NULL},
- {RIL_REQUEST_ANSWER, radio_1_6::acceptCallResponse},
- {RIL_REQUEST_DEACTIVATE_DATA_CALL, radio_1_6::deactivateDataCallResponse},
- {RIL_REQUEST_QUERY_FACILITY_LOCK, radio_1_6::getFacilityLockForAppResponse},
- {RIL_REQUEST_SET_FACILITY_LOCK, radio_1_6::setFacilityLockForAppResponse},
- {RIL_REQUEST_CHANGE_BARRING_PASSWORD, radio_1_6::setBarringPasswordResponse},
- {RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE, radio_1_6::getNetworkSelectionModeResponse},
- {RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, radio_1_6::setNetworkSelectionModeAutomaticResponse},
- {RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, radio_1_6::setNetworkSelectionModeManualResponse},
- {RIL_REQUEST_QUERY_AVAILABLE_NETWORKS , radio_1_6::getAvailableNetworksResponse},
- {RIL_REQUEST_DTMF_START, radio_1_6::startDtmfResponse},
- {RIL_REQUEST_DTMF_STOP, radio_1_6::stopDtmfResponse},
- {RIL_REQUEST_BASEBAND_VERSION, radio_1_6::getBasebandVersionResponse},
- {RIL_REQUEST_SEPARATE_CONNECTION, radio_1_6::separateConnectionResponse},
- {RIL_REQUEST_SET_MUTE, radio_1_6::setMuteResponse},
- {RIL_REQUEST_GET_MUTE, radio_1_6::getMuteResponse},
- {RIL_REQUEST_QUERY_CLIP, radio_1_6::getClipResponse},
- {RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE, NULL},
- {RIL_REQUEST_DATA_CALL_LIST, radio_1_6::getDataCallListResponse},
- {RIL_REQUEST_RESET_RADIO, NULL},
- {RIL_REQUEST_OEM_HOOK_RAW, radio_1_6::sendRequestRawResponse},
- {RIL_REQUEST_OEM_HOOK_STRINGS, radio_1_6::sendRequestStringsResponse},
- {RIL_REQUEST_SCREEN_STATE, radio_1_6::sendDeviceStateResponse}, // Note the response function is different.
- {RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, radio_1_6::setSuppServiceNotificationsResponse},
- {RIL_REQUEST_WRITE_SMS_TO_SIM, radio_1_6::writeSmsToSimResponse},
- {RIL_REQUEST_DELETE_SMS_ON_SIM, radio_1_6::deleteSmsOnSimResponse},
- {RIL_REQUEST_SET_BAND_MODE, radio_1_6::setBandModeResponse},
- {RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE, radio_1_6::getAvailableBandModesResponse},
- {RIL_REQUEST_STK_GET_PROFILE, NULL},
- {RIL_REQUEST_STK_SET_PROFILE, NULL},
- {RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, radio_1_6::sendEnvelopeResponse},
- {RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, radio_1_6::sendTerminalResponseToSimResponse},
- {RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM, radio_1_6::handleStkCallSetupRequestFromSimResponse},
- {RIL_REQUEST_EXPLICIT_CALL_TRANSFER, radio_1_6::explicitCallTransferResponse},
- {RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, radio_1_6::setPreferredNetworkTypeResponse},
- {RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE, radio_1_6::getPreferredNetworkTypeResponse},
- {RIL_REQUEST_GET_NEIGHBORING_CELL_IDS, radio_1_6::getNeighboringCidsResponse},
- {RIL_REQUEST_SET_LOCATION_UPDATES, radio_1_6::setLocationUpdatesResponse},
- {RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, radio_1_6::setCdmaSubscriptionSourceResponse},
- {RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, radio_1_6::setCdmaRoamingPreferenceResponse},
- {RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE, radio_1_6::getCdmaRoamingPreferenceResponse},
- {RIL_REQUEST_SET_TTY_MODE, radio_1_6::setTTYModeResponse},
- {RIL_REQUEST_QUERY_TTY_MODE, radio_1_6::getTTYModeResponse},
- {RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE, radio_1_6::setPreferredVoicePrivacyResponse},
- {RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE, radio_1_6::getPreferredVoicePrivacyResponse},
- {RIL_REQUEST_CDMA_FLASH, radio_1_6::sendCDMAFeatureCodeResponse},
- {RIL_REQUEST_CDMA_BURST_DTMF, radio_1_6::sendBurstDtmfResponse},
- {RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY, NULL},
- {RIL_REQUEST_CDMA_SEND_SMS, radio_1_6::sendCdmaSmsResponse},
- {RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE, radio_1_6::acknowledgeLastIncomingCdmaSmsResponse},
- {RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG, radio_1_6::getGsmBroadcastConfigResponse},
- {RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG, radio_1_6::setGsmBroadcastConfigResponse},
- {RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION, radio_1_6::setGsmBroadcastActivationResponse},
- {RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG, radio_1_6::getCdmaBroadcastConfigResponse},
- {RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG, radio_1_6::setCdmaBroadcastConfigResponse},
- {RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION, radio_1_6::setCdmaBroadcastActivationResponse},
- {RIL_REQUEST_CDMA_SUBSCRIPTION, radio_1_6::getCDMASubscriptionResponse},
- {RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM, radio_1_6::writeSmsToRuimResponse},
- {RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, radio_1_6::deleteSmsOnRuimResponse},
- {RIL_REQUEST_DEVICE_IDENTITY, radio_1_6::getDeviceIdentityResponse},
- {RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE, radio_1_6::exitEmergencyCallbackModeResponse},
- {RIL_REQUEST_GET_SMSC_ADDRESS, radio_1_6::getSmscAddressResponse},
- {RIL_REQUEST_SET_SMSC_ADDRESS, radio_1_6::setSmscAddressResponse},
- {RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, radio_1_6::reportSmsMemoryStatusResponse},
- {RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING, radio_1_6::reportStkServiceIsRunningResponse},
- {RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, radio_1_6::getCdmaSubscriptionSourceResponse},
- {RIL_REQUEST_ISIM_AUTHENTICATION, radio_1_6::requestIsimAuthenticationResponse},
- {RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, radio_1_6::acknowledgeIncomingGsmSmsWithPduResponse},
- {RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, radio_1_6::sendEnvelopeWithStatusResponse},
- {RIL_REQUEST_VOICE_RADIO_TECH, radio_1_6::getVoiceRadioTechnologyResponse},
- {RIL_REQUEST_GET_CELL_INFO_LIST, radio_1_6::getCellInfoListResponse},
- {RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, radio_1_6::setCellInfoListRateResponse},
- {RIL_REQUEST_SET_INITIAL_ATTACH_APN, radio_1_6::setInitialAttachApnResponse},
- {RIL_REQUEST_IMS_REGISTRATION_STATE, radio_1_6::getImsRegistrationStateResponse},
- {RIL_REQUEST_IMS_SEND_SMS, radio_1_6::sendImsSmsResponse},
- {RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, radio_1_6::iccTransmitApduBasicChannelResponse},
- {RIL_REQUEST_SIM_OPEN_CHANNEL, radio_1_6::iccOpenLogicalChannelResponse},
- {RIL_REQUEST_SIM_CLOSE_CHANNEL, radio_1_6::iccCloseLogicalChannelResponse},
- {RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, radio_1_6::iccTransmitApduLogicalChannelResponse},
- {RIL_REQUEST_NV_READ_ITEM, radio_1_6::nvReadItemResponse},
- {RIL_REQUEST_NV_WRITE_ITEM, radio_1_6::nvWriteItemResponse},
- {RIL_REQUEST_NV_WRITE_CDMA_PRL, radio_1_6::nvWriteCdmaPrlResponse},
- {RIL_REQUEST_NV_RESET_CONFIG, radio_1_6::nvResetConfigResponse},
- {RIL_REQUEST_SET_UICC_SUBSCRIPTION, radio_1_6::setUiccSubscriptionResponse},
- {RIL_REQUEST_ALLOW_DATA, radio_1_6::setDataAllowedResponse},
- {RIL_REQUEST_GET_HARDWARE_CONFIG, radio_1_6::getHardwareConfigResponse},
- {RIL_REQUEST_SIM_AUTHENTICATION, radio_1_6::requestIccSimAuthenticationResponse},
- {RIL_REQUEST_GET_DC_RT_INFO, NULL},
- {RIL_REQUEST_SET_DC_RT_INFO_RATE, NULL},
- {RIL_REQUEST_SET_DATA_PROFILE, radio_1_6::setDataProfileResponse},
- {RIL_REQUEST_SHUTDOWN, radio_1_6::requestShutdownResponse},
- {RIL_REQUEST_GET_RADIO_CAPABILITY, radio_1_6::getRadioCapabilityResponse},
- {RIL_REQUEST_SET_RADIO_CAPABILITY, radio_1_6::setRadioCapabilityResponse},
- {RIL_REQUEST_START_LCE, radio_1_6::startLceServiceResponse},
- {RIL_REQUEST_STOP_LCE, radio_1_6::stopLceServiceResponse},
- {RIL_REQUEST_PULL_LCEDATA, radio_1_6::pullLceDataResponse},
- {RIL_REQUEST_GET_ACTIVITY_INFO, radio_1_6::getModemActivityInfoResponse},
- {RIL_REQUEST_SET_CARRIER_RESTRICTIONS, radio_1_6::setAllowedCarriersResponse},
- {RIL_REQUEST_GET_CARRIER_RESTRICTIONS, radio_1_6::getAllowedCarriersResponse},
- {RIL_REQUEST_SEND_DEVICE_STATE, radio_1_6::sendDeviceStateResponse},
- {RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, radio_1_6::setIndicationFilterResponse},
- {RIL_REQUEST_SET_SIM_CARD_POWER, radio_1_6::setSimCardPowerResponse},
- {RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION, radio_1_6::setCarrierInfoForImsiEncryptionResponse},
- {RIL_REQUEST_START_NETWORK_SCAN, radio_1_6::startNetworkScanResponse},
- {RIL_REQUEST_STOP_NETWORK_SCAN, radio_1_6::stopNetworkScanResponse},
- {RIL_REQUEST_START_KEEPALIVE, radio_1_6::startKeepaliveResponse},
- {RIL_REQUEST_STOP_KEEPALIVE, radio_1_6::stopKeepaliveResponse},
- {RIL_REQUEST_GET_MODEM_STACK_STATUS, radio_1_6::getModemStackStatusResponse},
- {RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE_BITMAP, radio_1_6::getPreferredNetworkTypeBitmapResponse},
- {RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE_BITMAP, radio_1_6::setPreferredNetworkTypeBitmapResponse},
- {RIL_REQUEST_EMERGENCY_DIAL, radio_1_6::emergencyDialResponse},
- {RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS, radio_1_6::setSystemSelectionChannelsResponse},
- {RIL_REQUEST_ENABLE_MODEM, radio_1_6::enableModemResponse},
- {RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA, radio_1_6::setSignalStrengthReportingCriteriaResponse},
- {RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA, radio_1_6::setLinkCapacityReportingCriteriaResponse},
- {RIL_REQUEST_ENABLE_UICC_APPLICATIONS, radio_1_6::enableUiccApplicationsResponse},
- {RIL_REQUEST_ARE_UICC_APPLICATIONS_ENABLED, radio_1_6::areUiccApplicationsEnabledResponse},
- {RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION, radio_1_6::supplySimDepersonalizationResponse},
- {RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE, radio_1_6::sendCdmaSmsExpectMoreResponse},
- {RIL_REQUEST_GET_BARRING_INFO, radio_1_6::getBarringInfoResponse},
- {RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY, radio_1_6::setNrDualConnectivityStateResponse},
- {RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED, radio_1_6::isNrDualConnectivityEnabledResponse},
- {RIL_REQUEST_ALLOCATE_PDU_SESSION_ID, radio_1_6::allocatePduSessionIdResponse},
- {RIL_REQUEST_RELEASE_PDU_SESSION_ID, radio_1_6::releasePduSessionIdResponse},
- {RIL_REQUEST_START_HANDOVER, radio_1_6::startHandoverResponse},
- {RIL_REQUEST_CANCEL_HANDOVER, radio_1_6::cancelHandoverResponse},
- {RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP, radio_1_6::setAllowedNetworkTypesBitmapResponse},
- {RIL_REQUEST_SET_DATA_THROTTLING, radio_1_6::setDataThrottlingResponse},
- {RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS, radio_1_6::getSystemSelectionChannelsResponse},
- {RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP, radio_1_6::getAllowedNetworkTypesBitmapResponse},
- {RIL_REQUEST_GET_SLICING_CONFIG, radio_1_6::getSlicingConfigResponse},
- {RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS, radio_1_6::getSimPhonebookRecordsResponse},
- {RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY, radio_1_6::getSimPhonebookCapacityResponse},
- {RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORDS, radio_1_6::updateSimPhonebookRecordsResponse}
+{0, NULL}, // none
+ {RIL_REQUEST_GET_SIM_STATUS, radio_1_6::getIccCardStatusResponse},
+ {RIL_REQUEST_ENTER_SIM_PIN, radio_1_6::supplyIccPinForAppResponse},
+ {RIL_REQUEST_ENTER_SIM_PUK, radio_1_6::supplyIccPukForAppResponse},
+ {RIL_REQUEST_ENTER_SIM_PIN2, radio_1_6::supplyIccPin2ForAppResponse},
+ {RIL_REQUEST_ENTER_SIM_PUK2, radio_1_6::supplyIccPuk2ForAppResponse},
+ {RIL_REQUEST_CHANGE_SIM_PIN, radio_1_6::changeIccPinForAppResponse},
+ {RIL_REQUEST_CHANGE_SIM_PIN2, radio_1_6::changeIccPin2ForAppResponse},
+ {RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
+ radio_1_6::supplyNetworkDepersonalizationResponse},
+ {RIL_REQUEST_GET_CURRENT_CALLS, radio_1_6::getCurrentCallsResponse},
+ {RIL_REQUEST_DIAL, radio_1_6::dialResponse},
+ {RIL_REQUEST_GET_IMSI, radio_1_6::getIMSIForAppResponse},
+ {RIL_REQUEST_HANGUP, radio_1_6::hangupConnectionResponse},
+ {RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, radio_1_6::hangupWaitingOrBackgroundResponse},
+ {RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND,
+ radio_1_6::hangupForegroundResumeBackgroundResponse},
+ {RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,
+ radio_1_6::switchWaitingOrHoldingAndActiveResponse},
+ {RIL_REQUEST_CONFERENCE, radio_1_6::conferenceResponse},
+ {RIL_REQUEST_UDUB, radio_1_6::rejectCallResponse},
+ {RIL_REQUEST_LAST_CALL_FAIL_CAUSE, radio_1_6::getLastCallFailCauseResponse},
+ {RIL_REQUEST_SIGNAL_STRENGTH, radio_1_6::getSignalStrengthResponse},
+ {RIL_REQUEST_VOICE_REGISTRATION_STATE, radio_1_6::getVoiceRegistrationStateResponse},
+ {RIL_REQUEST_DATA_REGISTRATION_STATE, radio_1_6::getDataRegistrationStateResponse},
+ {RIL_REQUEST_OPERATOR, radio_1_6::getOperatorResponse},
+ {RIL_REQUEST_RADIO_POWER, radio_1_6::setRadioPowerResponse},
+ {RIL_REQUEST_DTMF, radio_1_6::sendDtmfResponse},
+ {RIL_REQUEST_SEND_SMS, radio_1_6::sendSmsResponse},
+ {RIL_REQUEST_SEND_SMS_EXPECT_MORE, radio_1_6::sendSmsExpectMoreResponse},
+ {RIL_REQUEST_SETUP_DATA_CALL, radio_1_6::setupDataCallResponse},
+ {RIL_REQUEST_SIM_IO, radio_1_6::iccIOForAppResponse},
+ {RIL_REQUEST_SEND_USSD, radio_1_6::sendUssdResponse},
+ {RIL_REQUEST_CANCEL_USSD, radio_1_6::cancelPendingUssdResponse},
+ {RIL_REQUEST_GET_CLIR, radio_1_6::getClirResponse},
+ {RIL_REQUEST_SET_CLIR, radio_1_6::setClirResponse},
+ {RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, radio_1_6::getCallForwardStatusResponse},
+ {RIL_REQUEST_SET_CALL_FORWARD, radio_1_6::setCallForwardResponse},
+ {RIL_REQUEST_QUERY_CALL_WAITING, radio_1_6::getCallWaitingResponse},
+ {RIL_REQUEST_SET_CALL_WAITING, radio_1_6::setCallWaitingResponse},
+ {RIL_REQUEST_SMS_ACKNOWLEDGE, radio_1_6::acknowledgeLastIncomingGsmSmsResponse},
+ {RIL_REQUEST_GET_IMEI, NULL}, {RIL_REQUEST_GET_IMEISV, NULL},
+ {RIL_REQUEST_ANSWER, radio_1_6::acceptCallResponse},
+ {RIL_REQUEST_DEACTIVATE_DATA_CALL, radio_1_6::deactivateDataCallResponse},
+ {RIL_REQUEST_QUERY_FACILITY_LOCK, radio_1_6::getFacilityLockForAppResponse},
+ {RIL_REQUEST_SET_FACILITY_LOCK, radio_1_6::setFacilityLockForAppResponse},
+ {RIL_REQUEST_CHANGE_BARRING_PASSWORD, radio_1_6::setBarringPasswordResponse},
+ {RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE, radio_1_6::getNetworkSelectionModeResponse},
+ {RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,
+ radio_1_6::setNetworkSelectionModeAutomaticResponse},
+ {RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
+ radio_1_6::setNetworkSelectionModeManualResponse},
+ {RIL_REQUEST_QUERY_AVAILABLE_NETWORKS, radio_1_6::getAvailableNetworksResponse},
+ {RIL_REQUEST_DTMF_START, radio_1_6::startDtmfResponse},
+ {RIL_REQUEST_DTMF_STOP, radio_1_6::stopDtmfResponse},
+ {RIL_REQUEST_BASEBAND_VERSION, radio_1_6::getBasebandVersionResponse},
+ {RIL_REQUEST_SEPARATE_CONNECTION, radio_1_6::separateConnectionResponse},
+ {RIL_REQUEST_SET_MUTE, radio_1_6::setMuteResponse},
+ {RIL_REQUEST_GET_MUTE, radio_1_6::getMuteResponse},
+ {RIL_REQUEST_QUERY_CLIP, radio_1_6::getClipResponse},
+ {RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE, NULL},
+ {RIL_REQUEST_DATA_CALL_LIST, radio_1_6::getDataCallListResponse},
+ {RIL_REQUEST_RESET_RADIO, NULL},
+ {RIL_REQUEST_OEM_HOOK_RAW, radio_1_6::sendRequestRawResponse},
+ {RIL_REQUEST_OEM_HOOK_STRINGS, radio_1_6::sendRequestStringsResponse},
+ {RIL_REQUEST_SCREEN_STATE,
+ radio_1_6::sendDeviceStateResponse}, // Note the response function is different.
+ {RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, radio_1_6::setSuppServiceNotificationsResponse},
+ {RIL_REQUEST_WRITE_SMS_TO_SIM, radio_1_6::writeSmsToSimResponse},
+ {RIL_REQUEST_DELETE_SMS_ON_SIM, radio_1_6::deleteSmsOnSimResponse},
+ {RIL_REQUEST_SET_BAND_MODE, radio_1_6::setBandModeResponse},
+ {RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE, radio_1_6::getAvailableBandModesResponse},
+ {RIL_REQUEST_STK_GET_PROFILE, NULL}, {RIL_REQUEST_STK_SET_PROFILE, NULL},
+ {RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, radio_1_6::sendEnvelopeResponse},
+ {RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, radio_1_6::sendTerminalResponseToSimResponse},
+ {RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
+ radio_1_6::handleStkCallSetupRequestFromSimResponse},
+ {RIL_REQUEST_EXPLICIT_CALL_TRANSFER, radio_1_6::explicitCallTransferResponse},
+ {RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, radio_1_6::setPreferredNetworkTypeResponse},
+ {RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE, radio_1_6::getPreferredNetworkTypeResponse},
+ {RIL_REQUEST_GET_NEIGHBORING_CELL_IDS, radio_1_6::getNeighboringCidsResponse},
+ {RIL_REQUEST_SET_LOCATION_UPDATES, radio_1_6::setLocationUpdatesResponse},
+ {RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, radio_1_6::setCdmaSubscriptionSourceResponse},
+ {RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, radio_1_6::setCdmaRoamingPreferenceResponse},
+ {RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE, radio_1_6::getCdmaRoamingPreferenceResponse},
+ {RIL_REQUEST_SET_TTY_MODE, radio_1_6::setTTYModeResponse},
+ {RIL_REQUEST_QUERY_TTY_MODE, radio_1_6::getTTYModeResponse},
+ {RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
+ radio_1_6::setPreferredVoicePrivacyResponse},
+ {RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE,
+ radio_1_6::getPreferredVoicePrivacyResponse},
+ {RIL_REQUEST_CDMA_FLASH, radio_1_6::sendCDMAFeatureCodeResponse},
+ {RIL_REQUEST_CDMA_BURST_DTMF, radio_1_6::sendBurstDtmfResponse},
+ {RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY, NULL},
+ {RIL_REQUEST_CDMA_SEND_SMS, radio_1_6::sendCdmaSmsResponse},
+ {RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE, radio_1_6::acknowledgeLastIncomingCdmaSmsResponse},
+ {RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG, radio_1_6::getGsmBroadcastConfigResponse},
+ {RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG, radio_1_6::setGsmBroadcastConfigResponse},
+ {RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION, radio_1_6::setGsmBroadcastActivationResponse},
+ {RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG, radio_1_6::getCdmaBroadcastConfigResponse},
+ {RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG, radio_1_6::setCdmaBroadcastConfigResponse},
+ {RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION, radio_1_6::setCdmaBroadcastActivationResponse},
+ {RIL_REQUEST_CDMA_SUBSCRIPTION, radio_1_6::getCDMASubscriptionResponse},
+ {RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM, radio_1_6::writeSmsToRuimResponse},
+ {RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, radio_1_6::deleteSmsOnRuimResponse},
+ {RIL_REQUEST_DEVICE_IDENTITY, radio_1_6::getDeviceIdentityResponse},
+ {RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE, radio_1_6::exitEmergencyCallbackModeResponse},
+ {RIL_REQUEST_GET_SMSC_ADDRESS, radio_1_6::getSmscAddressResponse},
+ {RIL_REQUEST_SET_SMSC_ADDRESS, radio_1_6::setSmscAddressResponse},
+ {RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, radio_1_6::reportSmsMemoryStatusResponse},
+ {RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING, radio_1_6::reportStkServiceIsRunningResponse},
+ {RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, radio_1_6::getCdmaSubscriptionSourceResponse},
+ {RIL_REQUEST_ISIM_AUTHENTICATION, radio_1_6::requestIsimAuthenticationResponse},
+ {RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
+ radio_1_6::acknowledgeIncomingGsmSmsWithPduResponse},
+ {RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, radio_1_6::sendEnvelopeWithStatusResponse},
+ {RIL_REQUEST_VOICE_RADIO_TECH, radio_1_6::getVoiceRadioTechnologyResponse},
+ {RIL_REQUEST_GET_CELL_INFO_LIST, radio_1_6::getCellInfoListResponse},
+ {RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, radio_1_6::setCellInfoListRateResponse},
+ {RIL_REQUEST_SET_INITIAL_ATTACH_APN, radio_1_6::setInitialAttachApnResponse},
+ {RIL_REQUEST_IMS_REGISTRATION_STATE, radio_1_6::getImsRegistrationStateResponse},
+ {RIL_REQUEST_IMS_SEND_SMS, radio_1_6::sendImsSmsResponse},
+ {RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, radio_1_6::iccTransmitApduBasicChannelResponse},
+ {RIL_REQUEST_SIM_OPEN_CHANNEL, radio_1_6::iccOpenLogicalChannelResponse},
+ {RIL_REQUEST_SIM_CLOSE_CHANNEL, radio_1_6::iccCloseLogicalChannelResponse},
+ {RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, radio_1_6::iccTransmitApduLogicalChannelResponse},
+ {RIL_REQUEST_NV_READ_ITEM, radio_1_6::nvReadItemResponse},
+ {RIL_REQUEST_NV_WRITE_ITEM, radio_1_6::nvWriteItemResponse},
+ {RIL_REQUEST_NV_WRITE_CDMA_PRL, radio_1_6::nvWriteCdmaPrlResponse},
+ {RIL_REQUEST_NV_RESET_CONFIG, radio_1_6::nvResetConfigResponse},
+ {RIL_REQUEST_SET_UICC_SUBSCRIPTION, radio_1_6::setUiccSubscriptionResponse},
+ {RIL_REQUEST_ALLOW_DATA, radio_1_6::setDataAllowedResponse},
+ {RIL_REQUEST_GET_HARDWARE_CONFIG, radio_1_6::getHardwareConfigResponse},
+ {RIL_REQUEST_SIM_AUTHENTICATION, radio_1_6::requestIccSimAuthenticationResponse},
+ {RIL_REQUEST_GET_DC_RT_INFO, NULL}, {RIL_REQUEST_SET_DC_RT_INFO_RATE, NULL},
+ {RIL_REQUEST_SET_DATA_PROFILE, radio_1_6::setDataProfileResponse},
+ {RIL_REQUEST_SHUTDOWN, radio_1_6::requestShutdownResponse},
+ {RIL_REQUEST_GET_RADIO_CAPABILITY, radio_1_6::getRadioCapabilityResponse},
+ {RIL_REQUEST_SET_RADIO_CAPABILITY, radio_1_6::setRadioCapabilityResponse},
+ {RIL_REQUEST_START_LCE, radio_1_6::startLceServiceResponse},
+ {RIL_REQUEST_STOP_LCE, radio_1_6::stopLceServiceResponse},
+ {RIL_REQUEST_PULL_LCEDATA, radio_1_6::pullLceDataResponse},
+ {RIL_REQUEST_GET_ACTIVITY_INFO, radio_1_6::getModemActivityInfoResponse},
+ {RIL_REQUEST_SET_CARRIER_RESTRICTIONS, radio_1_6::setAllowedCarriersResponse},
+ {RIL_REQUEST_GET_CARRIER_RESTRICTIONS, radio_1_6::getAllowedCarriersResponse},
+ {RIL_REQUEST_SEND_DEVICE_STATE, radio_1_6::sendDeviceStateResponse},
+ {RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, radio_1_6::setIndicationFilterResponse},
+ {RIL_REQUEST_SET_SIM_CARD_POWER, radio_1_6::setSimCardPowerResponse},
+ {RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION,
+ radio_1_6::setCarrierInfoForImsiEncryptionResponse},
+ {RIL_REQUEST_START_NETWORK_SCAN, radio_1_6::startNetworkScanResponse},
+ {RIL_REQUEST_STOP_NETWORK_SCAN, radio_1_6::stopNetworkScanResponse},
+ {RIL_REQUEST_START_KEEPALIVE, radio_1_6::startKeepaliveResponse},
+ {RIL_REQUEST_STOP_KEEPALIVE, radio_1_6::stopKeepaliveResponse},
+ {RIL_REQUEST_GET_MODEM_STACK_STATUS, radio_1_6::getModemStackStatusResponse},
+ {RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE_BITMAP,
+ radio_1_6::getPreferredNetworkTypeBitmapResponse},
+ {RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE_BITMAP,
+ radio_1_6::setPreferredNetworkTypeBitmapResponse},
+ {RIL_REQUEST_EMERGENCY_DIAL, radio_1_6::emergencyDialResponse},
+ {RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS, radio_1_6::setSystemSelectionChannelsResponse},
+ {RIL_REQUEST_ENABLE_MODEM, radio_1_6::enableModemResponse},
+ {RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA,
+ radio_1_6::setSignalStrengthReportingCriteriaResponse},
+ {RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA,
+ radio_1_6::setLinkCapacityReportingCriteriaResponse},
+ {RIL_REQUEST_ENABLE_UICC_APPLICATIONS, radio_1_6::enableUiccApplicationsResponse},
+ {RIL_REQUEST_ARE_UICC_APPLICATIONS_ENABLED, radio_1_6::areUiccApplicationsEnabledResponse},
+ {RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION, radio_1_6::supplySimDepersonalizationResponse},
+ {RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE, radio_1_6::sendCdmaSmsExpectMoreResponse},
+ {RIL_REQUEST_GET_BARRING_INFO, radio_1_6::getBarringInfoResponse},
+ {RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY, radio_1_6::setNrDualConnectivityStateResponse},
+ {RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED,
+ radio_1_6::isNrDualConnectivityEnabledResponse},
+ {RIL_REQUEST_ALLOCATE_PDU_SESSION_ID, radio_1_6::allocatePduSessionIdResponse},
+ {RIL_REQUEST_RELEASE_PDU_SESSION_ID, radio_1_6::releasePduSessionIdResponse},
+ {RIL_REQUEST_START_HANDOVER, radio_1_6::startHandoverResponse},
+ {RIL_REQUEST_CANCEL_HANDOVER, radio_1_6::cancelHandoverResponse},
+ {RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP,
+ radio_1_6::setAllowedNetworkTypesBitmapResponse},
+ {RIL_REQUEST_SET_DATA_THROTTLING, radio_1_6::setDataThrottlingResponse},
+ {RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS, radio_1_6::getSystemSelectionChannelsResponse},
+ {RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP,
+ radio_1_6::getAllowedNetworkTypesBitmapResponse},
+ {RIL_REQUEST_GET_SLICING_CONFIG, radio_1_6::getSlicingConfigResponse},
+ {RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS, radio_1_6::getSimPhonebookRecordsResponse},
+ {RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY, radio_1_6::getSimPhonebookCapacityResponse},
+ {RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORDS, radio_1_6::updateSimPhonebookRecordsResponse},
+ {RIL_REQUEST_GET_CELL_INFO_LIST_1_6, radio_1_6::getCellInfoListResponse
+}
diff --git a/guest/hals/ril/reference-libril/ril_service.cpp b/guest/hals/ril/reference-libril/ril_service.cpp
index c7b80a6..8f2b948 100644
--- a/guest/hals/ril/reference-libril/ril_service.cpp
+++ b/guest/hals/ril/reference-libril/ril_service.cpp
@@ -119,26 +119,46 @@
void convertRilSignalStrengthToHal(void *response, size_t responseLen,
SignalStrength& signalStrength);
-void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
- SetupDataCallResult& dcResult);
+void convertRilSignalStrengthToHal_1_2(void* response, size_t responseLen,
+ V1_2::SignalStrength& signalStrength);
void convertRilSignalStrengthToHal_1_4(void *response, size_t responseLen,
V1_4::SignalStrength& signalStrength);
-void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
- ::android::hardware::radio::V1_4::SetupDataCallResult& dcResult);
+void convertRilSignalStrengthToHal_1_6(void* response, size_t responseLen,
+ V1_6::SignalStrength& signalStrength);
-void convertRilDataCallToHal(RIL_Data_Call_Response_v12 *dcResponse,
- ::android::hardware::radio::V1_5::SetupDataCallResult& dcResult);
+void convertRilDataCallToHal(RIL_Data_Call_Response_v11* dcResponse, SetupDataCallResult& dcResult);
-void convertRilDataCallToHal(RIL_Data_Call_Response_v12 *dcResponse,
- ::android::hardware::radio::V1_6::SetupDataCallResult& dcResult);
+void convertRilDataCallToHal(RIL_Data_Call_Response_v11* dcResponse,
+ V1_4::SetupDataCallResult& dcResult);
+
+void convertRilDataCallToHal(RIL_Data_Call_Response_v12* dcResponse,
+ V1_5::SetupDataCallResult& dcResult);
+
+void convertRilDataCallToHal(RIL_Data_Call_Response_v12* dcResponse,
+ V1_6::SetupDataCallResult& dcResult);
void convertRilDataCallListToHal(void *response, size_t responseLen,
hidl_vec<SetupDataCallResult>& dcResultList);
+void convertRilDataCallListToHal_1_4(void* response, size_t responseLen,
+ hidl_vec<V1_4::SetupDataCallResult>& dcResultList);
+
+void convertRilDataCallListToHal_1_5(void* response, size_t responseLen,
+ hidl_vec<V1_5::SetupDataCallResult>& dcResultList);
+
+void convertRilDataCallListToHal_1_6(void* response, size_t responseLen,
+ hidl_vec<V1_6::SetupDataCallResult>& dcResultList);
+
void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
void convertRilCellInfoListToHal_1_2(void *response, size_t responseLen, hidl_vec<V1_2::CellInfo>& records);
+void convertRilCellInfoListToHal_1_4(void* response, size_t responseLen,
+ hidl_vec<V1_4::CellInfo>& records);
+void convertRilCellInfoListToHal_1_5(void* response, size_t responseLen,
+ hidl_vec<V1_5::CellInfo>& records);
+void convertRilCellInfoListToHal_1_6(void* response, size_t responseLen,
+ hidl_vec<V1_6::CellInfo>& records);
void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
RIL_Errno e);
@@ -2428,7 +2448,7 @@
#if VDBG
RLOGD("getCellInfoList_1_6: serial %d", serial);
#endif
- dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
+ dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST_1_6);
return Void();
}
@@ -3501,12 +3521,14 @@
e = RIL_E_SUCCESS;
}
populateResponseInfo(responseInfo, serial, RESPONSE_SOLICITED, e);
- Return<void> retStatus
- = radioService[mSlotId]->mRadioResponseV1_2->setSignalStrengthReportingCriteriaResponse(responseInfo);
+ Return<void> retStatus =
+ radioService[mSlotId]
+ ->mRadioResponseV1_2->setSignalStrengthReportingCriteriaResponse(
+ responseInfo);
radioService[mSlotId]->checkReturnStatus(retStatus);
} else {
- RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
- mSlotId);
+ RLOGE("setSignalStrengthReportingCriteria: radioService[%d]->mRadioResponse == NULL",
+ mSlotId);
}
return Void();
}
@@ -4458,8 +4480,9 @@
populateResponseInfo(responseInfo, serial, RESPONSE_SOLICITED, RIL_E_SUCCESS);
if (radioService[mSlotId]->mRadioResponseV1_5 != NULL) {
- Return<void> retStatus
- = radioService[mSlotId]->mRadioResponseV1_5->setInitialAttachApnResponse(responseInfo);
+ Return<void> retStatus =
+ radioService[mSlotId]->mRadioResponseV1_5->setInitialAttachApnResponse_1_5(
+ responseInfo);
} else if (radioService[mSlotId]->mRadioResponseV1_4 != NULL) {
Return<void> retStatus
= radioService[mSlotId]->mRadioResponseV1_4->setInitialAttachApnResponse(responseInfo);
@@ -4487,8 +4510,8 @@
populateResponseInfo(responseInfo, serial, RESPONSE_SOLICITED, RIL_E_SUCCESS);
if (radioService[mSlotId]->mRadioResponseV1_5 != NULL) {
- Return<void> retStatus
- = radioService[mSlotId]->mRadioResponseV1_5->setDataProfileResponse(responseInfo);
+ Return<void> retStatus =
+ radioService[mSlotId]->mRadioResponseV1_5->setDataProfileResponse_1_5(responseInfo);
} else if (radioService[mSlotId]->mRadioResponseV1_4 != NULL) {
Return<void> retStatus
= radioService[mSlotId]->mRadioResponseV1_4->setDataProfileResponse(responseInfo);
@@ -5123,57 +5146,134 @@
return 0;
}
-int radio_1_6::getCurrentCallsResponse(int slotId,
- int responseType, int serial, RIL_Errno e,
- void *response, size_t responseLen) {
+int radio_1_6::getCurrentCallsResponse(int slotId, int responseType, int serial, RIL_Errno e,
+ void* response, size_t responseLen) {
#if VDBG
RLOGD("getCurrentCallsResponse: serial %d", serial);
#endif
- if (radioService[slotId]->mRadioResponse != NULL) {
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL ||
+ radioService[slotId]->mRadioResponseV1_2 != NULL ||
+ radioService[slotId]->mRadioResponse != NULL) {
+ V1_6::RadioResponseInfo responseInfo16 = {};
RadioResponseInfo responseInfo = {};
- populateResponseInfo(responseInfo, serial, responseType, e);
-
- hidl_vec<Call> calls;
- if ((response == NULL && responseLen != 0)
- || (responseLen % sizeof(RIL_Call *)) != 0) {
- RLOGE("getCurrentCallsResponse: Invalid response");
- if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ populateResponseInfo_1_6(responseInfo16, serial, responseType, e);
} else {
- int num = responseLen / sizeof(RIL_Call *);
- calls.resize(num);
-
- for (int i = 0 ; i < num ; i++) {
- RIL_Call *p_cur = ((RIL_Call **) response)[i];
- /* each call info */
- calls[i].state = (CallState) p_cur->state;
- calls[i].index = p_cur->index;
- calls[i].toa = p_cur->toa;
- calls[i].isMpty = p_cur->isMpty;
- calls[i].isMT = p_cur->isMT;
- calls[i].als = p_cur->als;
- calls[i].isVoice = p_cur->isVoice;
- calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
- calls[i].number = convertCharPtrToHidlString(p_cur->number);
- calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
- calls[i].name = convertCharPtrToHidlString(p_cur->name);
- calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
- if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
- RIL_UUS_Info *uusInfo = p_cur->uusInfo;
- calls[i].uusInfo.resize(1);
- calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
- calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
- // convert uusInfo->uusData to a null-terminated string
- char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
- calls[i].uusInfo[0].uusData = nullTermStr;
- free(nullTermStr);
- }
- }
+ populateResponseInfo(responseInfo, serial, responseType, e);
}
+ if ((response == NULL && responseLen != 0) || (responseLen % sizeof(RIL_Call*)) != 0) {
+ RLOGE("getCurrentCallsResponse: Invalid response");
+ if (e == RIL_E_SUCCESS) {
+ responseInfo16.error = V1_6::RadioError::INVALID_RESPONSE;
+ responseInfo.error = RadioError::INVALID_RESPONSE;
+ }
+ return 0;
+ } else {
+ Return<void> retStatus;
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ hidl_vec<V1_6::Call> calls;
+ int num = responseLen / sizeof(RIL_Call*);
+ calls.resize(num);
- Return<void> retStatus = radioService[slotId]->mRadioResponse->
- getCurrentCallsResponse(responseInfo, calls);
- radioService[slotId]->checkReturnStatus(retStatus);
+ for (int i = 0; i < num; i++) {
+ RIL_Call* p_cur = ((RIL_Call**)response)[i];
+ /* each call info */
+ calls[i].base.base.state = (CallState)p_cur->state;
+ calls[i].base.base.index = p_cur->index;
+ calls[i].base.base.toa = p_cur->toa;
+ calls[i].base.base.isMpty = p_cur->isMpty;
+ calls[i].base.base.isMT = p_cur->isMT;
+ calls[i].base.base.als = p_cur->als;
+ calls[i].base.base.isVoice = p_cur->isVoice;
+ calls[i].base.base.isVoicePrivacy = p_cur->isVoicePrivacy;
+ calls[i].base.base.number = convertCharPtrToHidlString(p_cur->number);
+ calls[i].base.base.numberPresentation =
+ (CallPresentation)p_cur->numberPresentation;
+ calls[i].base.base.name = convertCharPtrToHidlString(p_cur->name);
+ calls[i].base.base.namePresentation = (CallPresentation)p_cur->namePresentation;
+ if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
+ RIL_UUS_Info* uusInfo = p_cur->uusInfo;
+ calls[i].base.base.uusInfo.resize(1);
+ calls[i].base.base.uusInfo[0].uusType = (UusType)uusInfo->uusType;
+ calls[i].base.base.uusInfo[0].uusDcs = (UusDcs)uusInfo->uusDcs;
+ // convert uusInfo->uusData to a null-terminated string
+ char* nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
+ calls[i].base.base.uusInfo[0].uusData = nullTermStr;
+ free(nullTermStr);
+ }
+ }
+ retStatus = radioService[slotId]->mRadioResponseV1_6->getCurrentCallsResponse_1_6(
+ responseInfo16, calls);
+ } else if (radioService[slotId]->mRadioResponseV1_2 != NULL) {
+ hidl_vec<V1_2::Call> calls;
+ int num = responseLen / sizeof(RIL_Call*);
+ calls.resize(num);
+
+ for (int i = 0; i < num; i++) {
+ RIL_Call* p_cur = ((RIL_Call**)response)[i];
+ /* each call info */
+ calls[i].base.state = (CallState)p_cur->state;
+ calls[i].base.index = p_cur->index;
+ calls[i].base.toa = p_cur->toa;
+ calls[i].base.isMpty = p_cur->isMpty;
+ calls[i].base.isMT = p_cur->isMT;
+ calls[i].base.als = p_cur->als;
+ calls[i].base.isVoice = p_cur->isVoice;
+ calls[i].base.isVoicePrivacy = p_cur->isVoicePrivacy;
+ calls[i].base.number = convertCharPtrToHidlString(p_cur->number);
+ calls[i].base.numberPresentation = (CallPresentation)p_cur->numberPresentation;
+ calls[i].base.name = convertCharPtrToHidlString(p_cur->name);
+ calls[i].base.namePresentation = (CallPresentation)p_cur->namePresentation;
+ if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
+ RIL_UUS_Info* uusInfo = p_cur->uusInfo;
+ calls[i].base.uusInfo.resize(1);
+ calls[i].base.uusInfo[0].uusType = (UusType)uusInfo->uusType;
+ calls[i].base.uusInfo[0].uusDcs = (UusDcs)uusInfo->uusDcs;
+ // convert uusInfo->uusData to a null-terminated string
+ char* nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
+ calls[i].base.uusInfo[0].uusData = nullTermStr;
+ free(nullTermStr);
+ }
+ }
+ retStatus = radioService[slotId]->mRadioResponseV1_2->getCurrentCallsResponse_1_2(
+ responseInfo, calls);
+ } else {
+ hidl_vec<Call> calls;
+ int num = responseLen / sizeof(RIL_Call*);
+ calls.resize(num);
+
+ for (int i = 0; i < num; i++) {
+ RIL_Call* p_cur = ((RIL_Call**)response)[i];
+ /* each call info */
+ calls[i].state = (CallState)p_cur->state;
+ calls[i].index = p_cur->index;
+ calls[i].toa = p_cur->toa;
+ calls[i].isMpty = p_cur->isMpty;
+ calls[i].isMT = p_cur->isMT;
+ calls[i].als = p_cur->als;
+ calls[i].isVoice = p_cur->isVoice;
+ calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
+ calls[i].number = convertCharPtrToHidlString(p_cur->number);
+ calls[i].numberPresentation = (CallPresentation)p_cur->numberPresentation;
+ calls[i].name = convertCharPtrToHidlString(p_cur->name);
+ calls[i].namePresentation = (CallPresentation)p_cur->namePresentation;
+ if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
+ RIL_UUS_Info* uusInfo = p_cur->uusInfo;
+ calls[i].uusInfo.resize(1);
+ calls[i].uusInfo[0].uusType = (UusType)uusInfo->uusType;
+ calls[i].uusInfo[0].uusDcs = (UusDcs)uusInfo->uusDcs;
+ // convert uusInfo->uusData to a null-terminated string
+ char* nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
+ calls[i].uusInfo[0].uusData = nullTermStr;
+ free(nullTermStr);
+ }
+ }
+ retStatus = radioService[slotId]->mRadioResponse->getCurrentCallsResponse(
+ responseInfo, calls);
+ }
+ radioService[slotId]->checkReturnStatus(retStatus);
+ }
} else {
RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
}
@@ -5268,19 +5368,19 @@
RIL_Errno e, void *response,
size_t responseLen) {
#if VDBG
- RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
+ RLOGD("hangupForegroundResumeBackgroundResponse: serial %d", serial);
#endif
if (radioService[slotId]->mRadioResponse != NULL) {
RadioResponseInfo responseInfo = {};
populateResponseInfo(responseInfo, serial, responseType, e);
Return<void> retStatus =
- radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
- responseInfo);
+ radioService[slotId]->mRadioResponse->hangupForegroundResumeBackgroundResponse(
+ responseInfo);
radioService[slotId]->checkReturnStatus(retStatus);
} else {
- RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
- slotId);
+ RLOGE("hangupForegroundResumeBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
+ slotId);
}
return 0;
@@ -5362,7 +5462,7 @@
LastCallFailCauseInfo info = {};
info.vendorCause = hidl_string();
if (response == NULL) {
- RLOGE("getCurrentCallsResponse Invalid response: NULL");
+ RLOGE("getLastCallFailCauseResponse Invalid response: NULL");
if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
} else if (responseLen == sizeof(int)) {
int *pInt = (int *) response;
@@ -5372,7 +5472,7 @@
info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
} else {
- RLOGE("getCurrentCallsResponse Invalid response: NULL");
+ RLOGE("getLastCallFailCauseResponse Invalid response: NULL");
if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
}
@@ -5387,46 +5487,59 @@
return 0;
}
-int radio_1_6::getSignalStrengthResponse(int slotId,
- int responseType, int serial, RIL_Errno e,
- void *response, size_t responseLen) {
+int radio_1_6::getSignalStrengthResponse(int slotId, int responseType, int serial, RIL_Errno e,
+ void* response, size_t responseLen) {
#if VDBG
RLOGD("getSignalStrengthResponse: serial %d", serial);
#endif
- if (radioService[slotId]->mRadioResponseV1_4 != NULL) {
- RadioResponseInfo responseInfo = {};
- populateResponseInfo(responseInfo, serial, responseType, e);
- ::android::hardware::radio::V1_4::SignalStrength signalStrength_1_4 = {};
- if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v12)) {
- RLOGE("getSignalStrengthResponse: Invalid response");
- if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
- } else {
- convertRilSignalStrengthToHal_1_4(response, responseLen, signalStrength_1_4);
- }
-
- //TODO: future implementation needs to fill tdScdma, wcdma and nr signal strength.
-
- Return<void> retStatus = radioService[slotId]->mRadioResponseV1_4->
- getSignalStrengthResponse_1_4(responseInfo, signalStrength_1_4);
- radioService[slotId]->checkReturnStatus(retStatus);
- } else if (radioService[slotId]->mRadioResponse != NULL) {
- RadioResponseInfo responseInfo = {};
- populateResponseInfo(responseInfo, serial, responseType, e);
- SignalStrength signalStrength = {};
- if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v12)) {
- RLOGE("getSignalStrengthResponse: Invalid response");
- if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
- } else {
- convertRilSignalStrengthToHal(response, responseLen, signalStrength);
- }
-
- Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
- responseInfo, signalStrength);
- radioService[slotId]->checkReturnStatus(retStatus);
+ V1_6::RadioResponseInfo responseInfo16 = {};
+ RadioResponseInfo responseInfo = {};
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ populateResponseInfo_1_6(responseInfo16, serial, responseType, e);
} else {
- RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
- slotId);
+ populateResponseInfo(responseInfo, serial, responseType, e);
+ }
+
+ if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v12)) {
+ RLOGE("getSignalStrengthResponse: Invalid response");
+ if (e == RIL_E_SUCCESS) {
+ responseInfo16.error = V1_6::RadioError::INVALID_RESPONSE;
+ responseInfo.error = RadioError::INVALID_RESPONSE;
+ }
+ } else {
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ V1_6::SignalStrength signalStrength_1_6 = {};
+ convertRilSignalStrengthToHal_1_6(response, responseLen, signalStrength_1_6);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioResponseV1_6->getSignalStrengthResponse_1_6(
+ responseInfo16, signalStrength_1_6);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ } else if (radioService[slotId]->mRadioResponseV1_4 != NULL) {
+ V1_4::SignalStrength signalStrength_1_4 = {};
+ convertRilSignalStrengthToHal_1_4(response, responseLen, signalStrength_1_4);
+ // TODO: future implementation needs to fill tdScdma, wcdma and nr signal strength.
+ Return<void> retStatus =
+ radioService[slotId]->mRadioResponseV1_4->getSignalStrengthResponse_1_4(
+ responseInfo, signalStrength_1_4);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ } else if (radioService[slotId]->mRadioResponseV1_2 != NULL) {
+ V1_2::SignalStrength signalStrength_1_2 = {};
+ convertRilSignalStrengthToHal_1_2(response, responseLen, signalStrength_1_2);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioResponseV1_2->getSignalStrengthResponse_1_2(
+ responseInfo, signalStrength_1_2);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ } else if (radioService[slotId]->mRadioResponse != NULL) {
+ SignalStrength signalStrength = {};
+ convertRilSignalStrengthToHal(response, responseLen, signalStrength);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioResponse->getSignalStrengthResponse(responseInfo,
+ signalStrength);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ } else {
+ RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL", slotId);
+ }
}
return 0;
@@ -6483,9 +6596,8 @@
return 0;
}
-int radio_1_6::getDataRegistrationStateResponse(int slotId,
- int responseType, int serial, RIL_Errno e,
- void *response, size_t responseLen) {
+int radio_1_6::getDataRegistrationStateResponse(int slotId, int responseType, int serial,
+ RIL_Errno e, void* response, size_t responseLen) {
#if VDBG
RLOGD("getDataRegistrationStateResponse: serial %d", serial);
#endif
@@ -6547,11 +6659,11 @@
}
Return<void> retStatus =
- radioService[slotId]
- ->mRadioResponseV1_6
- ->getVoiceRegistrationStateResponse_1_6(
- responseInfo_1_6, regResponse);
+ radioService[slotId]
+ ->mRadioResponseV1_6->getDataRegistrationStateResponse_1_6(
+ responseInfo_1_6, regResponse);
radioService[slotId]->checkReturnStatus(retStatus);
+ return 0;
}
} else if (s_vendorFunctions->version <= 14 &&
radioService[slotId]->mRadioResponseV1_5 != NULL) {
@@ -6587,11 +6699,11 @@
numStrings, resp);
Return<void> retStatus =
- radioService[slotId]
- ->mRadioResponseV1_5
- ->getDataRegistrationStateResponse_1_5(
- responseInfo, regResponse);
+ radioService[slotId]
+ ->mRadioResponseV1_5->getDataRegistrationStateResponse_1_5(
+ responseInfo, regResponse);
radioService[slotId]->checkReturnStatus(retStatus);
+ return 0;
}
} else if (s_vendorFunctions->version <= 14 &&
radioService[slotId]->mRadioResponseV1_2 != NULL) {
@@ -6611,6 +6723,7 @@
Return<void> retStatus = radioService[slotId]->mRadioResponseV1_2->
getDataRegistrationStateResponse_1_2(responseInfo, dataRegResponse);
radioService[slotId]->checkReturnStatus(retStatus);
+ return 0;
}
} else if (s_vendorFunctions->version <= 14) {
int numStrings = responseLen / sizeof(char *);
@@ -7605,29 +7718,56 @@
return 0;
}
-int radio_1_6::getDataCallListResponse(int slotId,
- int responseType, int serial, RIL_Errno e,
- void *response, size_t responseLen) {
+int radio_1_6::getDataCallListResponse(int slotId, int responseType, int serial, RIL_Errno e,
+ void* response, size_t responseLen) {
#if VDBG
RLOGD("getDataCallListResponse: serial %d", serial);
#endif
- if (radioService[slotId]->mRadioResponse != NULL) {
+ if (radioService[slotId]->mRadioResponse != NULL ||
+ radioService[slotId]->mRadioResponseV1_4 != NULL ||
+ radioService[slotId]->mRadioResponseV1_5 != NULL ||
+ radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ V1_6::RadioResponseInfo responseInfo16 = {};
RadioResponseInfo responseInfo = {};
- populateResponseInfo(responseInfo, serial, responseType, e);
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ populateResponseInfo_1_6(responseInfo16, serial, responseType, e);
+ } else {
+ populateResponseInfo(responseInfo, serial, responseType, e);
+ }
- hidl_vec<SetupDataCallResult> ret;
if ((response == NULL && responseLen != 0)
|| responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
RLOGE("getDataCallListResponse: invalid response");
- if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
+ if (e == RIL_E_SUCCESS) {
+ responseInfo16.error = V1_6::RadioError::INVALID_RESPONSE;
+ responseInfo.error = RadioError::INVALID_RESPONSE;
+ }
} else {
- convertRilDataCallListToHal(response, responseLen, ret);
+ Return<void> retStatus;
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ hidl_vec<V1_6::SetupDataCallResult> ret;
+ convertRilDataCallListToHal_1_6(response, responseLen, ret);
+ retStatus = radioService[slotId]->mRadioResponseV1_6->getDataCallListResponse_1_6(
+ responseInfo16, ret);
+ } else if (radioService[slotId]->mRadioResponseV1_5 != NULL) {
+ hidl_vec<V1_5::SetupDataCallResult> ret;
+ convertRilDataCallListToHal_1_5(response, responseLen, ret);
+ retStatus = radioService[slotId]->mRadioResponseV1_5->getDataCallListResponse_1_5(
+ responseInfo, ret);
+ } else if (radioService[slotId]->mRadioResponseV1_4 != NULL) {
+ hidl_vec<V1_4::SetupDataCallResult> ret;
+ convertRilDataCallListToHal_1_4(response, responseLen, ret);
+ retStatus = radioService[slotId]->mRadioResponseV1_4->getDataCallListResponse_1_4(
+ responseInfo, ret);
+ } else {
+ hidl_vec<SetupDataCallResult> ret;
+ convertRilDataCallListToHal(response, responseLen, ret);
+ retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
+ responseInfo, ret);
+ }
+ radioService[slotId]->checkReturnStatus(retStatus);
}
-
- Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
- responseInfo, ret);
- radioService[slotId]->checkReturnStatus(retStatus);
} else {
RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
}
@@ -8794,47 +8934,72 @@
return 0;
}
-int radio_1_6::getCellInfoListResponse(int slotId,
- int responseType,
- int serial, RIL_Errno e, void *response,
- size_t responseLen) {
+int radio_1_6::getCellInfoListResponse(int slotId, int responseType, int serial, RIL_Errno e,
+ void* response, size_t responseLen) {
#if VDBG
RLOGD("getCellInfoListResponse: serial %d", serial);
#endif
-
- if (radioService[slotId]->mRadioResponse != NULL ||
- radioService[slotId]->mRadioResponseV1_2 != NULL) {
+ if (radioService[slotId]->mRadioResponseV1_6 != NULL) {
+ V1_6::RadioResponseInfo responseInfo = {};
+ populateResponseInfo_1_6(responseInfo, serial, responseType, e);
+ hidl_vec<V1_6::CellInfo> ret;
+ Return<void> retStatus;
+ if (response != NULL && responseLen != 0 && responseLen % sizeof(RIL_CellInfo_v16) == 0) {
+ convertRilCellInfoListToHal_1_6(response, responseLen, ret);
+ } else {
+ RLOGE("getCellInfoListResponse_1_6: Invalid response");
+ if (e == RIL_E_SUCCESS) responseInfo.error = V1_6::RadioError::INVALID_RESPONSE;
+ }
+ retStatus = radioService[slotId]->mRadioResponseV1_6->getCellInfoListResponse_1_6(
+ responseInfo, ret);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ } else if (radioService[slotId]->mRadioResponse != NULL ||
+ radioService[slotId]->mRadioResponseV1_2 != NULL ||
+ radioService[slotId]->mRadioResponseV1_4 != NULL ||
+ radioService[slotId]->mRadioResponseV1_5 != NULL) {
RadioResponseInfo responseInfo = {};
populateResponseInfo(responseInfo, serial, responseType, e);
-
+ bool error = response == NULL && responseLen != 0;
Return<void> retStatus;
- hidl_vec<CellInfo> ret;
- if ((response == NULL && responseLen != 0)
- || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
- RLOGE("getCellInfoListResponse: Invalid response");
- if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
-
- if (radioService[slotId]->mRadioResponseV1_2 != NULL) {
- hidl_vec<V1_2::CellInfo> ret;
- retStatus = radioService[slotId]->mRadioResponseV1_2->
- getCellInfoListResponse_1_2(responseInfo, ret);
+ if (radioService[slotId]->mRadioResponseV1_5 != NULL) {
+ hidl_vec<V1_5::CellInfo> ret;
+ if (!error && responseLen % sizeof(RIL_CellInfo_v16) != 0) {
+ convertRilCellInfoListToHal_1_5(response, responseLen, ret);
} else {
- hidl_vec<CellInfo> ret;
- retStatus = radioService[slotId]->mRadioResponse->
- getCellInfoListResponse(responseInfo, ret);
+ RLOGE("getCellInfoListResponse_1_5: Invalid response");
+ if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
}
- } else {
- if (radioService[slotId]->mRadioResponseV1_2 != NULL) {
- hidl_vec<V1_2::CellInfo> ret;
+ retStatus = radioService[slotId]->mRadioResponseV1_5->getCellInfoListResponse_1_5(
+ responseInfo, ret);
+ } else if (radioService[slotId]->mRadioResponseV1_4 != NULL) {
+ hidl_vec<V1_4::CellInfo> ret;
+ if (!error && responseLen % sizeof(RIL_CellInfo_v16) != 0) {
+ convertRilCellInfoListToHal_1_4(response, responseLen, ret);
+ } else {
+ RLOGE("getCellInfoListResponse_1_4: Invalid response");
+ if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
+ }
+ radioService[slotId]->mRadioResponseV1_4->getCellInfoListResponse_1_4(responseInfo,
+ ret);
+ } else if (radioService[slotId]->mRadioResponseV1_2 != NULL) {
+ hidl_vec<V1_2::CellInfo> ret;
+ if (!error && responseLen % sizeof(RIL_CellInfo_v12) != 0) {
convertRilCellInfoListToHal_1_2(response, responseLen, ret);
- retStatus = radioService[slotId]->mRadioResponseV1_2->
- getCellInfoListResponse_1_2(responseInfo, ret);
} else {
- hidl_vec<CellInfo> ret;
- convertRilCellInfoListToHal(response, responseLen, ret);
- retStatus = radioService[slotId]->mRadioResponse->
- getCellInfoListResponse(responseInfo, ret);
+ RLOGE("getCellInfoListResponse_1_2: Invalid response");
+ if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
}
+ radioService[slotId]->mRadioResponseV1_2->getCellInfoListResponse_1_2(responseInfo,
+ ret);
+ } else {
+ hidl_vec<CellInfo> ret;
+ if (!error && responseLen % sizeof(RIL_CellInfo) != 0) {
+ convertRilCellInfoListToHal(response, responseLen, ret);
+ } else {
+ RLOGE("getCellInfoListResponse: Invalid response");
+ if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
+ }
+ radioService[slotId]->mRadioResponse->getCellInfoListResponse(responseInfo, ret);
}
radioService[slotId]->checkReturnStatus(retStatus);
} else {
@@ -8866,9 +9031,8 @@
return 0;
}
-int radio_1_6::setInitialAttachApnResponse(int slotId,
- int responseType, int serial, RIL_Errno e,
- void *response, size_t responseLen) {
+int radio_1_6::setInitialAttachApnResponse(int slotId, int responseType, int serial, RIL_Errno e,
+ void* response, size_t responseLen) {
#if VDBG
RLOGD("setInitialAttachApnResponse: serial %d", serial);
#endif
@@ -8876,18 +9040,18 @@
if (radioService[slotId]->mRadioResponseV1_5 != NULL) {
RadioResponseInfo responseInfo = {};
populateResponseInfo(responseInfo, serial, responseType, e);
- Return<void> retStatus
- = radioService[slotId]->mRadioResponseV1_5->setInitialAttachApnResponse_1_5(
- responseInfo);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioResponseV1_5->setInitialAttachApnResponse_1_5(
+ responseInfo);
+ radioService[slotId]->checkReturnStatus(retStatus);
} else if (radioService[slotId]->mRadioResponse != NULL) {
RadioResponseInfo responseInfo = {};
populateResponseInfo(responseInfo, serial, responseType, e);
- Return<void> retStatus
- = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
radioService[slotId]->checkReturnStatus(retStatus);
} else {
- RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
- slotId);
+ RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL", slotId);
}
return 0;
@@ -10638,6 +10802,26 @@
signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
}
+void convertRilSignalStrengthToHal_1_2(void* response, size_t responseLen,
+ V1_2::SignalStrength& signalStrength_1_2) {
+ SignalStrength signalStrength = {};
+ convertRilSignalStrengthToHal(response, responseLen, signalStrength);
+ signalStrength_1_2.gsm = signalStrength.gw;
+ signalStrength_1_2.cdma = signalStrength.cdma;
+ signalStrength_1_2.evdo = signalStrength.evdo;
+ signalStrength_1_2.lte = signalStrength.lte;
+
+ RIL_SignalStrength_v12* rilSignalStrength = (RIL_SignalStrength_v12*)response;
+ signalStrength_1_2.wcdma.base.signalStrength =
+ rilSignalStrength->WCDMA_SignalStrength.signalStrength;
+ signalStrength_1_2.wcdma.base.bitErrorRate =
+ rilSignalStrength->WCDMA_SignalStrength.bitErrorRate;
+ signalStrength_1_2.wcdma.rscp = INT_MAX;
+ signalStrength_1_2.wcdma.ecno = INT_MAX;
+
+ signalStrength_1_2.tdScdma.rscp = INT_MAX;
+}
+
void convertRilSignalStrengthToHal_1_4(void *response, size_t responseLen,
V1_4::SignalStrength& signalStrength_1_4) {
SignalStrength signalStrength = {};
@@ -10667,12 +10851,41 @@
signalStrength_1_4.nr.csiSinr = rilSignalStrength->NR_SignalStrength.ssSinr;
}
-int radio_1_6::currentSignalStrengthInd(int slotId,
- int indicationType, int token, RIL_Errno e,
- void *response, size_t responseLen) {
- if (radioService[slotId] != NULL &&
- (radioService[slotId]->mRadioIndication != NULL ||
- radioService[slotId]->mRadioIndicationV1_4 != NULL)) {
+void convertRilSignalStrengthToHal_1_6(void* response, size_t responseLen,
+ V1_6::SignalStrength& signalStrength_1_6) {
+ SignalStrength signalStrength = {};
+ convertRilSignalStrengthToHal(response, responseLen, signalStrength);
+ signalStrength_1_6.gsm = signalStrength.gw;
+ signalStrength_1_6.cdma = signalStrength.cdma;
+ signalStrength_1_6.evdo = signalStrength.evdo;
+ signalStrength_1_6.lte.base = signalStrength.lte;
+
+ RIL_SignalStrength_v12* rilSignalStrength = (RIL_SignalStrength_v12*)response;
+ signalStrength_1_6.wcdma.base.signalStrength =
+ rilSignalStrength->WCDMA_SignalStrength.signalStrength;
+ signalStrength_1_6.wcdma.base.bitErrorRate =
+ rilSignalStrength->WCDMA_SignalStrength.bitErrorRate;
+ signalStrength_1_6.wcdma.rscp = INT_MAX;
+ signalStrength_1_6.wcdma.ecno = INT_MAX;
+
+ signalStrength_1_6.tdscdma.signalStrength = INT_MAX;
+ signalStrength_1_6.tdscdma.bitErrorRate = INT_MAX;
+ signalStrength_1_6.tdscdma.rscp = INT_MAX;
+
+ signalStrength_1_6.nr.base.ssRsrp = rilSignalStrength->NR_SignalStrength.ssRsrp;
+ signalStrength_1_6.nr.base.ssRsrq = rilSignalStrength->NR_SignalStrength.ssRsrq;
+ signalStrength_1_6.nr.base.ssSinr = rilSignalStrength->NR_SignalStrength.ssSinr;
+ signalStrength_1_6.nr.base.csiRsrp = rilSignalStrength->NR_SignalStrength.csiRsrp;
+ signalStrength_1_6.nr.base.csiRsrq = rilSignalStrength->NR_SignalStrength.csiRsrq;
+ signalStrength_1_6.nr.base.csiSinr = rilSignalStrength->NR_SignalStrength.ssSinr;
+}
+
+int radio_1_6::currentSignalStrengthInd(int slotId, int indicationType, int token, RIL_Errno e,
+ void* response, size_t responseLen) {
+ if (radioService[slotId] != NULL && (radioService[slotId]->mRadioIndication != NULL ||
+ radioService[slotId]->mRadioIndicationV1_2 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_4 != NULL) ||
+ radioService[slotId]->mRadioIndicationV1_6 != NULL) {
if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v12)) {
RLOGE("currentSignalStrengthInd: invalid response");
return 0;
@@ -10682,16 +10895,26 @@
RLOGD("currentSignalStrengthInd");
#endif
Return<void> retStatus;
- if (radioService[slotId]->mRadioIndicationV1_4 != NULL) {
- V1_4::SignalStrength signalStrength_1_4 = {};
- convertRilSignalStrengthToHal_1_4(response, responseLen, signalStrength_1_4);
- retStatus = radioService[slotId]->mRadioIndicationV1_4->currentSignalStrength_1_4(
- convertIntToRadioIndicationType(indicationType), signalStrength_1_4);
+ if (radioService[slotId]->mRadioIndicationV1_6 != NULL) {
+ V1_6::SignalStrength signalStrength_1_6 = {};
+ convertRilSignalStrengthToHal_1_6(response, responseLen, signalStrength_1_6);
+ retStatus = radioService[slotId]->mRadioIndicationV1_6->currentSignalStrength_1_6(
+ convertIntToRadioIndicationType(indicationType), signalStrength_1_6);
+ } else if (radioService[slotId]->mRadioIndicationV1_4 != NULL) {
+ V1_4::SignalStrength signalStrength_1_4 = {};
+ convertRilSignalStrengthToHal_1_4(response, responseLen, signalStrength_1_4);
+ retStatus = radioService[slotId]->mRadioIndicationV1_4->currentSignalStrength_1_4(
+ convertIntToRadioIndicationType(indicationType), signalStrength_1_4);
+ } else if (radioService[slotId]->mRadioIndicationV1_2 != NULL) {
+ V1_2::SignalStrength signalStrength_1_2 = {};
+ convertRilSignalStrengthToHal_1_2(response, responseLen, signalStrength_1_2);
+ retStatus = radioService[slotId]->mRadioIndicationV1_2->currentSignalStrength_1_2(
+ convertIntToRadioIndicationType(indicationType), signalStrength_1_2);
} else {
- SignalStrength signalStrength = {};
- convertRilSignalStrengthToHal(response, responseLen, signalStrength);
- retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
- convertIntToRadioIndicationType(indicationType), signalStrength);
+ SignalStrength signalStrength = {};
+ convertRilSignalStrengthToHal(response, responseLen, signalStrength);
+ retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
+ convertIntToRadioIndicationType(indicationType), signalStrength);
}
radioService[slotId]->checkReturnStatus(retStatus);
} else {
@@ -10841,6 +11064,39 @@
}
}
+void convertRilDataCallListToHal_1_4(void* response, size_t responseLen,
+ hidl_vec<V1_4::SetupDataCallResult>& dcResultList) {
+ int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
+
+ RIL_Data_Call_Response_v11* dcResponse = (RIL_Data_Call_Response_v11*)response;
+ dcResultList.resize(num);
+ for (int i = 0; i < num; i++) {
+ convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
+ }
+}
+
+void convertRilDataCallListToHal_1_5(void* response, size_t responseLen,
+ hidl_vec<V1_5::SetupDataCallResult>& dcResultList) {
+ int num = responseLen / sizeof(RIL_Data_Call_Response_v12);
+
+ RIL_Data_Call_Response_v12* dcResponse = (RIL_Data_Call_Response_v12*)response;
+ dcResultList.resize(num);
+ for (int i = 0; i < num; i++) {
+ convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
+ }
+}
+
+void convertRilDataCallListToHal_1_6(void* response, size_t responseLen,
+ hidl_vec<V1_6::SetupDataCallResult>& dcResultList) {
+ int num = responseLen / sizeof(RIL_Data_Call_Response_v12);
+
+ RIL_Data_Call_Response_v12* dcResponse = (RIL_Data_Call_Response_v12*)response;
+ dcResultList.resize(num);
+ for (int i = 0; i < num; i++) {
+ convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
+ }
+}
+
int radio_1_6::dataCallListChangedInd(int slotId,
int indicationType, int token, RIL_Errno e, void *response,
size_t responseLen) {
@@ -12045,6 +12301,346 @@
}
}
+void convertRilCellInfoListToHal_1_5(void* response, size_t responseLen,
+ hidl_vec<V1_5::CellInfo>& records) {
+ int num = responseLen / sizeof(RIL_CellInfo_v16);
+ records.resize(num);
+ RIL_CellInfo_v16* rillCellInfo = (RIL_CellInfo_v16*)response;
+ for (int i = 0; i < num; i++) {
+ records[i].registered = rillCellInfo->registered;
+ records[i].connectionStatus = (V1_2::CellConnectionStatus)rillCellInfo->connectionStatus;
+
+ switch (rillCellInfo->cellInfoType) {
+ case RIL_CELL_INFO_TYPE_GSM: {
+ V1_5::CellInfoGsm cellInfoGsm;
+ cellInfoGsm.cellIdentityGsm.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
+ cellInfoGsm.cellIdentityGsm.base.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
+ cellInfoGsm.cellIdentityGsm.base.base.lac =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
+ cellInfoGsm.cellIdentityGsm.base.base.cid =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
+ cellInfoGsm.cellIdentityGsm.base.base.arfcn =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
+ cellInfoGsm.cellIdentityGsm.base.base.bsic =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
+ cellInfoGsm.signalStrengthGsm.signalStrength =
+ rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
+ cellInfoGsm.signalStrengthGsm.bitErrorRate =
+ rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
+ cellInfoGsm.signalStrengthGsm.timingAdvance =
+ rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
+ records[i].ratSpecificInfo.gsm(cellInfoGsm);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_WCDMA: {
+ V1_5::CellInfoWcdma cellInfoWcdma;
+ cellInfoWcdma.cellIdentityWcdma.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
+ cellInfoWcdma.cellIdentityWcdma.base.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
+ cellInfoWcdma.cellIdentityWcdma.base.base.lac =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
+ cellInfoWcdma.cellIdentityWcdma.base.base.cid =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
+ cellInfoWcdma.cellIdentityWcdma.base.base.psc =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
+ cellInfoWcdma.cellIdentityWcdma.base.base.uarfcn =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
+ cellInfoWcdma.signalStrengthWcdma.base.signalStrength =
+ rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
+ cellInfoWcdma.signalStrengthWcdma.base.bitErrorRate =
+ rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
+ records[i].ratSpecificInfo.wcdma(cellInfoWcdma);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_CDMA: {
+ V1_2::CellInfoCdma cellInfoCdma;
+ cellInfoCdma.cellIdentityCdma.base.networkId =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
+ cellInfoCdma.cellIdentityCdma.base.systemId =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
+ cellInfoCdma.cellIdentityCdma.base.baseStationId =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
+ cellInfoCdma.cellIdentityCdma.base.longitude =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
+ cellInfoCdma.cellIdentityCdma.base.latitude =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
+ cellInfoCdma.signalStrengthCdma.dbm =
+ rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
+ cellInfoCdma.signalStrengthCdma.ecio =
+ rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
+ cellInfoCdma.signalStrengthEvdo.dbm =
+ rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
+ cellInfoCdma.signalStrengthEvdo.ecio =
+ rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
+ cellInfoCdma.signalStrengthEvdo.signalNoiseRatio =
+ rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
+ records[i].ratSpecificInfo.cdma(cellInfoCdma);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_LTE: {
+ V1_5::CellInfoLte cellInfoLte;
+ cellInfoLte.cellIdentityLte.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
+ cellInfoLte.cellIdentityLte.base.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
+ cellInfoLte.cellIdentityLte.base.base.ci =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
+ cellInfoLte.cellIdentityLte.base.base.pci =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
+ cellInfoLte.cellIdentityLte.base.base.tac =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
+ cellInfoLte.cellIdentityLte.base.base.earfcn =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
+ cellInfoLte.signalStrengthLte.signalStrength =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
+ cellInfoLte.signalStrengthLte.rsrp =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
+ cellInfoLte.signalStrengthLte.rsrq =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
+ cellInfoLte.signalStrengthLte.rssnr =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
+ cellInfoLte.signalStrengthLte.cqi =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
+ cellInfoLte.signalStrengthLte.timingAdvance =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
+ records[i].ratSpecificInfo.lte(cellInfoLte);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_TD_SCDMA: {
+ V1_5::CellInfoTdscdma cellInfoTdscdma;
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.mnc = ril::util::mnc::decode(
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.lac =
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.cid =
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.cpid =
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
+ cellInfoTdscdma.signalStrengthTdscdma.rscp =
+ rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
+ records[i].ratSpecificInfo.tdscdma(cellInfoTdscdma);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_NR: {
+ V1_5::CellInfoNr cellInfoNr;
+ cellInfoNr.cellIdentityNr.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.nr.cellidentity.mcc);
+ cellInfoNr.cellIdentityNr.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.nr.cellidentity.mnc);
+ cellInfoNr.cellIdentityNr.base.nci = rillCellInfo->CellInfo.nr.cellidentity.nci;
+ cellInfoNr.cellIdentityNr.base.pci = rillCellInfo->CellInfo.nr.cellidentity.pci;
+ cellInfoNr.cellIdentityNr.base.tac = rillCellInfo->CellInfo.nr.cellidentity.tac;
+ cellInfoNr.cellIdentityNr.base.nrarfcn =
+ rillCellInfo->CellInfo.nr.cellidentity.nrarfcn;
+ cellInfoNr.cellIdentityNr.base.operatorNames.alphaLong = convertCharPtrToHidlString(
+ rillCellInfo->CellInfo.nr.cellidentity.operatorNames.alphaLong);
+ cellInfoNr.cellIdentityNr.base.operatorNames.alphaShort =
+ convertCharPtrToHidlString(
+ rillCellInfo->CellInfo.nr.cellidentity.operatorNames.alphaShort);
+
+ cellInfoNr.signalStrengthNr.ssRsrp =
+ rillCellInfo->CellInfo.nr.signalStrength.ssRsrp;
+ cellInfoNr.signalStrengthNr.ssRsrq =
+ rillCellInfo->CellInfo.nr.signalStrength.ssRsrq;
+ cellInfoNr.signalStrengthNr.ssSinr =
+ rillCellInfo->CellInfo.nr.signalStrength.ssSinr;
+ cellInfoNr.signalStrengthNr.csiRsrp =
+ rillCellInfo->CellInfo.nr.signalStrength.csiRsrp;
+ cellInfoNr.signalStrengthNr.csiRsrq =
+ rillCellInfo->CellInfo.nr.signalStrength.csiRsrq;
+ cellInfoNr.signalStrengthNr.csiSinr =
+ rillCellInfo->CellInfo.nr.signalStrength.csiSinr;
+ records[i].ratSpecificInfo.nr(cellInfoNr);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ rillCellInfo += 1;
+ }
+}
+
+void convertRilCellInfoListToHal_1_6(void* response, size_t responseLen,
+ hidl_vec<V1_6::CellInfo>& records) {
+ int num = responseLen / sizeof(RIL_CellInfo_v16);
+ records.resize(num);
+ RIL_CellInfo_v16* rillCellInfo = (RIL_CellInfo_v16*)response;
+ for (int i = 0; i < num; i++) {
+ records[i].registered = rillCellInfo->registered;
+ records[i].connectionStatus = (V1_2::CellConnectionStatus)rillCellInfo->connectionStatus;
+
+ switch (rillCellInfo->cellInfoType) {
+ case RIL_CELL_INFO_TYPE_GSM: {
+ V1_5::CellInfoGsm cellInfoGsm;
+ cellInfoGsm.cellIdentityGsm.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
+ cellInfoGsm.cellIdentityGsm.base.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
+ cellInfoGsm.cellIdentityGsm.base.base.lac =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
+ cellInfoGsm.cellIdentityGsm.base.base.cid =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
+ cellInfoGsm.cellIdentityGsm.base.base.arfcn =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
+ cellInfoGsm.cellIdentityGsm.base.base.bsic =
+ rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
+ cellInfoGsm.signalStrengthGsm.signalStrength =
+ rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
+ cellInfoGsm.signalStrengthGsm.bitErrorRate =
+ rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
+ cellInfoGsm.signalStrengthGsm.timingAdvance =
+ rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
+ records[i].ratSpecificInfo.gsm(cellInfoGsm);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_WCDMA: {
+ V1_5::CellInfoWcdma cellInfoWcdma;
+ cellInfoWcdma.cellIdentityWcdma.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
+ cellInfoWcdma.cellIdentityWcdma.base.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
+ cellInfoWcdma.cellIdentityWcdma.base.base.lac =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
+ cellInfoWcdma.cellIdentityWcdma.base.base.cid =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
+ cellInfoWcdma.cellIdentityWcdma.base.base.psc =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
+ cellInfoWcdma.cellIdentityWcdma.base.base.uarfcn =
+ rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
+ cellInfoWcdma.signalStrengthWcdma.base.signalStrength =
+ rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
+ cellInfoWcdma.signalStrengthWcdma.base.bitErrorRate =
+ rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
+ records[i].ratSpecificInfo.wcdma(cellInfoWcdma);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_CDMA: {
+ V1_2::CellInfoCdma cellInfoCdma;
+ cellInfoCdma.cellIdentityCdma.base.networkId =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
+ cellInfoCdma.cellIdentityCdma.base.systemId =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
+ cellInfoCdma.cellIdentityCdma.base.baseStationId =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
+ cellInfoCdma.cellIdentityCdma.base.longitude =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
+ cellInfoCdma.cellIdentityCdma.base.latitude =
+ rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
+ cellInfoCdma.signalStrengthCdma.dbm =
+ rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
+ cellInfoCdma.signalStrengthCdma.ecio =
+ rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
+ cellInfoCdma.signalStrengthEvdo.dbm =
+ rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
+ cellInfoCdma.signalStrengthEvdo.ecio =
+ rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
+ cellInfoCdma.signalStrengthEvdo.signalNoiseRatio =
+ rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
+ records[i].ratSpecificInfo.cdma(cellInfoCdma);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_LTE: {
+ V1_6::CellInfoLte cellInfoLte;
+ cellInfoLte.cellIdentityLte.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
+ cellInfoLte.cellIdentityLte.base.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
+ cellInfoLte.cellIdentityLte.base.base.ci =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
+ cellInfoLte.cellIdentityLte.base.base.pci =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
+ cellInfoLte.cellIdentityLte.base.base.tac =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
+ cellInfoLte.cellIdentityLte.base.base.earfcn =
+ rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
+ cellInfoLte.signalStrengthLte.base.signalStrength =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
+ cellInfoLte.signalStrengthLte.base.rsrp =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
+ cellInfoLte.signalStrengthLte.base.rsrq =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
+ cellInfoLte.signalStrengthLte.base.rssnr =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
+ cellInfoLte.signalStrengthLte.base.cqi =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
+ cellInfoLte.signalStrengthLte.base.timingAdvance =
+ rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
+ records[i].ratSpecificInfo.lte(cellInfoLte);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_TD_SCDMA: {
+ V1_5::CellInfoTdscdma cellInfoTdscdma;
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.mnc = ril::util::mnc::decode(
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.lac =
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.cid =
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
+ cellInfoTdscdma.cellIdentityTdscdma.base.base.cpid =
+ rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
+ cellInfoTdscdma.signalStrengthTdscdma.rscp =
+ rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
+ records[i].ratSpecificInfo.tdscdma(cellInfoTdscdma);
+ break;
+ }
+
+ case RIL_CELL_INFO_TYPE_NR: {
+ V1_6::CellInfoNr cellInfoNr;
+ cellInfoNr.cellIdentityNr.base.mcc =
+ std::to_string(rillCellInfo->CellInfo.nr.cellidentity.mcc);
+ cellInfoNr.cellIdentityNr.base.mnc =
+ ril::util::mnc::decode(rillCellInfo->CellInfo.nr.cellidentity.mnc);
+ cellInfoNr.cellIdentityNr.base.nci = rillCellInfo->CellInfo.nr.cellidentity.nci;
+ cellInfoNr.cellIdentityNr.base.pci = rillCellInfo->CellInfo.nr.cellidentity.pci;
+ cellInfoNr.cellIdentityNr.base.tac = rillCellInfo->CellInfo.nr.cellidentity.tac;
+ cellInfoNr.cellIdentityNr.base.nrarfcn =
+ rillCellInfo->CellInfo.nr.cellidentity.nrarfcn;
+ cellInfoNr.cellIdentityNr.base.operatorNames.alphaLong = convertCharPtrToHidlString(
+ rillCellInfo->CellInfo.nr.cellidentity.operatorNames.alphaLong);
+ cellInfoNr.cellIdentityNr.base.operatorNames.alphaShort =
+ convertCharPtrToHidlString(
+ rillCellInfo->CellInfo.nr.cellidentity.operatorNames.alphaShort);
+
+ cellInfoNr.signalStrengthNr.base.ssRsrp =
+ rillCellInfo->CellInfo.nr.signalStrength.ssRsrp;
+ cellInfoNr.signalStrengthNr.base.ssRsrq =
+ rillCellInfo->CellInfo.nr.signalStrength.ssRsrq;
+ cellInfoNr.signalStrengthNr.base.ssSinr =
+ rillCellInfo->CellInfo.nr.signalStrength.ssSinr;
+ cellInfoNr.signalStrengthNr.base.csiRsrp =
+ rillCellInfo->CellInfo.nr.signalStrength.csiRsrp;
+ cellInfoNr.signalStrengthNr.base.csiRsrq =
+ rillCellInfo->CellInfo.nr.signalStrength.csiRsrq;
+ cellInfoNr.signalStrengthNr.base.csiSinr =
+ rillCellInfo->CellInfo.nr.signalStrength.csiSinr;
+ records[i].ratSpecificInfo.nr(cellInfoNr);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ rillCellInfo += 1;
+ }
+}
+
int radio_1_6::cellInfoListInd(int slotId,
int indicationType, int token, RIL_Errno e, void *response,
size_t responseLen) {
@@ -12426,111 +13022,197 @@
return 0;
}
-int radio_1_6::networkScanResultInd(int slotId,
- int indicationType, int token, RIL_Errno e, void *response,
- size_t responseLen) {
+int radio_1_6::networkScanResultInd(int slotId, int indicationType, int token, RIL_Errno e,
+ void* response, size_t responseLen) {
#if VDBG
RLOGD("networkScanResultInd");
#endif
- if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_4 != NULL) {
+ if (radioService[slotId] != NULL && (radioService[slotId]->mRadioIndicationV1_6 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_5 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_4 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_2 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_1 != NULL)) {
if (response == NULL || responseLen == 0) {
RLOGE("networkScanResultInd: invalid response");
return 0;
}
RLOGD("networkScanResultInd");
-#if VDBG
- RLOGD("networkScanResultInd");
-#endif
-
RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
-
- V1_1::NetworkScanResult result;
- result.status = (V1_1::ScanStatus) networkScanResult->status;
- result.error = (RadioError) networkScanResult->error;
- convertRilCellInfoListToHal(
- networkScanResult->network_infos,
- networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
- result.networkInfos);
-
- Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_4->networkScanResult(
- convertIntToRadioIndicationType(indicationType), result);
+ Return<void> retStatus;
+ if (radioService[slotId]->mRadioIndicationV1_6 != NULL) {
+ V1_6::NetworkScanResult result;
+ result.status = (V1_1::ScanStatus)networkScanResult->status;
+ result.error = (V1_6::RadioError)networkScanResult->error;
+ convertRilCellInfoListToHal_1_6(
+ networkScanResult->network_infos,
+ networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v16),
+ result.networkInfos);
+ retStatus = radioService[slotId]->mRadioIndicationV1_6->networkScanResult_1_6(
+ convertIntToRadioIndicationType(indicationType), result);
+ } else if (radioService[slotId]->mRadioIndicationV1_5 != NULL) {
+ V1_5::NetworkScanResult result;
+ result.status = (V1_1::ScanStatus)networkScanResult->status;
+ result.error = (RadioError)networkScanResult->error;
+ convertRilCellInfoListToHal_1_5(
+ networkScanResult->network_infos,
+ networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
+ result.networkInfos);
+ retStatus = radioService[slotId]->mRadioIndicationV1_5->networkScanResult_1_5(
+ convertIntToRadioIndicationType(indicationType), result);
+ } else if (radioService[slotId]->mRadioIndicationV1_4 != NULL) {
+ V1_4::NetworkScanResult result;
+ result.status = (V1_1::ScanStatus)networkScanResult->status;
+ result.error = (RadioError)networkScanResult->error;
+ convertRilCellInfoListToHal_1_4(
+ networkScanResult->network_infos,
+ networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
+ result.networkInfos);
+ retStatus = radioService[slotId]->mRadioIndicationV1_4->networkScanResult_1_4(
+ convertIntToRadioIndicationType(indicationType), result);
+ } else if (radioService[slotId]->mRadioIndicationV1_2 != NULL) {
+ V1_2::NetworkScanResult result;
+ result.status = (V1_1::ScanStatus)networkScanResult->status;
+ result.error = (RadioError)networkScanResult->error;
+ convertRilCellInfoListToHal_1_2(
+ networkScanResult->network_infos,
+ networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
+ result.networkInfos);
+ retStatus = radioService[slotId]->mRadioIndicationV1_2->networkScanResult_1_2(
+ convertIntToRadioIndicationType(indicationType), result);
+ } else {
+ V1_1::NetworkScanResult result;
+ result.status = (V1_1::ScanStatus)networkScanResult->status;
+ result.error = (RadioError)networkScanResult->error;
+ convertRilCellInfoListToHal(
+ networkScanResult->network_infos,
+ networkScanResult->network_infos_length * sizeof(RIL_CellInfo),
+ result.networkInfos);
+ retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
+ convertIntToRadioIndicationType(indicationType), result);
+ }
radioService[slotId]->checkReturnStatus(retStatus);
} else {
- RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_4 == NULL", slotId);
+ RLOGE("networkScanResultInd: radioService[%d]->mRadioIndication == NULL", slotId);
}
return 0;
}
-int radio_1_6::carrierInfoForImsiEncryption(int slotId,
- int indicationType, int token, RIL_Errno e, void *response,
- size_t responseLen) {
- if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_4 != NULL) {
+int radio_1_6::carrierInfoForImsiEncryption(int slotId, int indicationType, int token, RIL_Errno e,
+ void* response, size_t responseLen) {
+ if (radioService[slotId] != NULL && (radioService[slotId]->mRadioIndicationV1_2 != NULL)) {
if (response == NULL || responseLen == 0) {
RLOGE("carrierInfoForImsiEncryption: invalid response");
return 0;
}
RLOGD("carrierInfoForImsiEncryption");
- Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_4->
- carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_2->carrierInfoForImsiEncryption(
+ convertIntToRadioIndicationType(indicationType));
radioService[slotId]->checkReturnStatus(retStatus);
} else {
- RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_4 == NULL",
- slotId);
+ RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndication == NULL", slotId);
}
return 0;
}
-int radio_1_6::reportPhysicalChannelConfigs(int slotId, int indicationType,
- int token, RIL_Errno e,
- void *response,
- size_t responseLen) {
- if (radioService[slotId] != NULL &&
- radioService[slotId]->mRadioIndicationV1_4 != NULL) {
- int *configs = (int *)response;
- ::android::hardware::hidl_vec<PhysicalChannelConfigV1_4> physChanConfig;
- physChanConfig.resize(1);
- physChanConfig[0].base.status =
- (::android::hardware::radio::V1_2::CellConnectionStatus)configs[0];
- physChanConfig[0].base.cellBandwidthDownlink = configs[1];
- physChanConfig[0].rat =
- (::android::hardware::radio::V1_4::RadioTechnology)configs[2];
- physChanConfig[0].rfInfo.range(
- (::android::hardware::radio::V1_4::FrequencyRange)configs[3]);
- physChanConfig[0].contextIds.resize(1);
- physChanConfig[0].contextIds[0] = configs[4];
- RLOGD("reportPhysicalChannelConfigs: %d %d %d %d %d", configs[0],
- configs[1], configs[2], configs[3], configs[4]);
- Return<void> retStatus = radioService[slotId]
- ->mRadioIndicationV1_4->currentPhysicalChannelConfigs_1_4(
- RadioIndicationType::UNSOLICITED, physChanConfig);
- radioService[slotId]->checkReturnStatus(retStatus);
- {
- // just send the link estimate along with physical channel
- // config, as it has at least the downlink bandwidth.
- // Note: the bandwidth is just some hardcoded
- // value, as there is not way to get that reliably on
- // virtual devices, as of now.
- V1_2::LinkCapacityEstimate lce = {
- .downlinkCapacityKbps = static_cast<uint32_t>(configs[1]),
- .uplinkCapacityKbps = static_cast<uint32_t>(configs[1])
- };
- RLOGD("reporting link capacity estimate download: %d upload: %d",
- lce.downlinkCapacityKbps, lce.uplinkCapacityKbps );
- Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_4->
- currentLinkCapacityEstimate(RadioIndicationType::UNSOLICITED, lce);
- radioService[slotId]->checkReturnStatus(retStatus);
- }
+int radio_1_6::reportPhysicalChannelConfigs(int slotId, int indicationType, int token, RIL_Errno e,
+ void* response, size_t responseLen) {
+ if (radioService[slotId] != NULL && (radioService[slotId]->mRadioIndicationV1_6 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_4 != NULL ||
+ radioService[slotId]->mRadioIndicationV1_2 != NULL)) {
+ int* configs = (int*)response;
+ if (radioService[slotId]->mRadioIndicationV1_6 != NULL) {
+ hidl_vec<V1_6::PhysicalChannelConfig> physChanConfig;
+ physChanConfig.resize(1);
+ physChanConfig[0].status = (V1_2::CellConnectionStatus)configs[0];
+ physChanConfig[0].cellBandwidthDownlinkKhz = configs[1];
+ physChanConfig[0].rat = (V1_4::RadioTechnology)configs[2];
+ physChanConfig[0].contextIds.resize(1);
+ physChanConfig[0].contextIds[0] = configs[4];
+ RLOGD("reportPhysicalChannelConfigs_1_6: %d %d %d %d %d", configs[0], configs[1],
+ configs[2], configs[3], configs[4]);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_6->currentPhysicalChannelConfigs_1_6(
+ RadioIndicationType::UNSOLICITED, physChanConfig);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ {
+ // Just send the link estimate along with physical channel config, as it has
+ // at least the downlink bandwidth.
+ // Note: the bandwidth is just some hardcoded value, as there is not way to get
+ // that reliably on virtual devices, as of now.
+ V1_6::LinkCapacityEstimate lce = {
+ .downlinkCapacityKbps = static_cast<uint32_t>(configs[1]),
+ .uplinkCapacityKbps = static_cast<uint32_t>(configs[1])};
+ RLOGD("reporting link capacity estimate download: %d upload: %d",
+ lce.downlinkCapacityKbps, lce.uplinkCapacityKbps);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_6->currentLinkCapacityEstimate_1_6(
+ RadioIndicationType::UNSOLICITED, lce);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ }
+ } else if (radioService[slotId]->mRadioIndicationV1_4 != NULL) {
+ hidl_vec<PhysicalChannelConfigV1_4> physChanConfig;
+ physChanConfig.resize(1);
+ physChanConfig[0].base.status = (V1_2::CellConnectionStatus)configs[0];
+ physChanConfig[0].base.cellBandwidthDownlink = configs[1];
+ physChanConfig[0].rat = (V1_4::RadioTechnology)configs[2];
+ physChanConfig[0].rfInfo.range((V1_4::FrequencyRange)configs[3]);
+ physChanConfig[0].contextIds.resize(1);
+ physChanConfig[0].contextIds[0] = configs[4];
+ RLOGD("reportPhysicalChannelConfigs_1_4: %d %d %d %d %d", configs[0], configs[1],
+ configs[2], configs[3], configs[4]);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_4->currentPhysicalChannelConfigs_1_4(
+ RadioIndicationType::UNSOLICITED, physChanConfig);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ {
+ // Just send the link estimate along with physical channel config, as it has
+ // at least the downlink bandwidth.
+ // Note: the bandwidth is just some hardcoded value, as there is not way to get
+ // that reliably on virtual devices, as of now.
+ V1_2::LinkCapacityEstimate lce = {
+ .downlinkCapacityKbps = static_cast<uint32_t>(configs[1]),
+ .uplinkCapacityKbps = static_cast<uint32_t>(configs[1])};
+ RLOGD("reporting link capacity estimate download: %d upload: %d",
+ lce.downlinkCapacityKbps, lce.uplinkCapacityKbps);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_4->currentLinkCapacityEstimate(
+ RadioIndicationType::UNSOLICITED, lce);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ }
+ } else {
+ hidl_vec<V1_2::PhysicalChannelConfig> physChanConfig;
+ physChanConfig.resize(1);
+ physChanConfig[0].status = (V1_2::CellConnectionStatus)configs[0];
+ physChanConfig[0].cellBandwidthDownlink = configs[1];
+ RLOGD("reportPhysicalChannelConfigs_1_2: %d %d", configs[0], configs[1]);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_2->currentPhysicalChannelConfigs(
+ RadioIndicationType::UNSOLICITED, physChanConfig);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ {
+ // Just send the link estimate along with physical channel config, as it has
+ // at least the downlink bandwidth.
+ // Note: the bandwidth is just some hardcoded value, as there is not way to get
+ // that reliably on virtual devices, as of now.
+ V1_2::LinkCapacityEstimate lce = {
+ .downlinkCapacityKbps = static_cast<uint32_t>(configs[1]),
+ .uplinkCapacityKbps = static_cast<uint32_t>(configs[1])};
+ RLOGD("reporting link capacity estimate download: %d upload: %d",
+ lce.downlinkCapacityKbps, lce.uplinkCapacityKbps);
+ Return<void> retStatus =
+ radioService[slotId]->mRadioIndicationV1_2->currentLinkCapacityEstimate(
+ RadioIndicationType::UNSOLICITED, lce);
+ radioService[slotId]->checkReturnStatus(retStatus);
+ }
+ }
} else {
- RLOGE(
- "reportPhysicalChannelConfigs: radioService[%d]->mRadioIndicationV1_4 "
- "== NULL",
- slotId);
- return -1;
+ RLOGE("reportPhysicalChannelConfigs: radioService[%d]->mRadioIndication == NULL", slotId);
+ return -1;
}
-
- return 0;
+ return 0;
}
int radio_1_6::keepaliveStatusInd(int slotId,
diff --git a/guest/hals/ril/reference-ril/reference-ril.c b/guest/hals/ril/reference-ril/reference-ril.c
index c3452ae..81b87a2e 100644
--- a/guest/hals/ril/reference-ril/reference-ril.c
+++ b/guest/hals/ril/reference-ril/reference-ril.c
@@ -704,11 +704,10 @@
{
int onOff;
- int err;
ATResponse *p_response = NULL;
if (sState != RADIO_STATE_OFF) {
- err = at_send_command("AT+CFUN=0", &p_response);
+ at_send_command("AT+CFUN=0", &p_response);
setRadioState(RADIO_STATE_UNAVAILABLE);
}
@@ -1197,7 +1196,6 @@
RIL_Dial *p_dial;
char *cmd;
const char *clir;
- int ret;
p_dial = (RIL_Dial *)data;
@@ -1210,7 +1208,7 @@
asprintf(&cmd, "ATD%s%s;", p_dial->address, clir);
- ret = at_send_command(cmd, NULL);
+ at_send_command(cmd, NULL);
free(cmd);
@@ -1254,7 +1252,6 @@
{
int *p_line;
- int ret;
char *cmd;
if (getSIMStatus() == SIM_ABSENT) {
@@ -1267,7 +1264,7 @@
// "Releases a specific active call X"
asprintf(&cmd, "AT+CHLD=1%d", p_line[0]);
- ret = at_send_command(cmd, NULL);
+ at_send_command(cmd, NULL);
free(cmd);
@@ -1289,6 +1286,7 @@
memset(response, 0, sizeof(response));
+ // TODO(b/206814247): Rename AT+CSQ command.
err = at_send_command_singleline("AT+CSQ", "+CSQ:", &p_response);
if (err < 0 || p_response->success == 0) {
@@ -1672,9 +1670,11 @@
char *line = str, *p;
int *resp = NULL;
int skip;
- int count = 3;
int commas;
+ s_lac = -1;
+ s_cid = -1;
+
RLOGD("parseRegistrationState. Parsing: %s",str);
err = at_tok_start(&line);
if (err < 0) goto error;
@@ -1712,19 +1712,14 @@
case 0: /* +CREG: <stat> */
err = at_tok_nextint(&line, &resp[0]);
if (err < 0) goto error;
- resp[1] = -1;
- resp[2] = -1;
- break;
+ break;
case 1: /* +CREG: <n>, <stat> */
err = at_tok_nextint(&line, &skip);
if (err < 0) goto error;
err = at_tok_nextint(&line, &resp[0]);
if (err < 0) goto error;
- resp[1] = -1;
- resp[2] = -1;
- if (err < 0) goto error;
- break;
+ break;
case 2: /* +CREG: <stat>, <lac>, <cid> */
err = at_tok_nextint(&line, &resp[0]);
@@ -1758,13 +1753,16 @@
if (err < 0) goto error;
err = at_tok_nextint(&line, &resp[3]);
if (err < 0) goto error;
- count = 4;
break;
default:
goto error;
}
- s_lac = resp[1];
- s_cid = resp[2];
+
+ if (commas >= 2) {
+ s_lac = resp[1];
+ s_cid = resp[2];
+ }
+
if (response)
*response = resp;
if (items)
@@ -2615,7 +2613,6 @@
RIL_UNUSED_PARM(datalen);
int err, len;
- int instruction = 0;
char *cmd = NULL;
char *line = NULL;
RIL_SIM_APDU *p_args = NULL;
@@ -2660,7 +2657,6 @@
sscanf(&(sr.simResponse[len - 4]), "%02x%02x", &(sr.sw1), &(sr.sw2));
sr.simResponse[len - 4] = '\0';
- instruction = p_args->instruction;
RIL_onRequestComplete(t, RIL_E_SUCCESS, &sr, sizeof(sr));
at_response_free(p_response);
return;
@@ -2851,14 +2847,22 @@
if (ackSuccess == 1) {
err = at_send_command("AT+CNMA=1", NULL);
+ if (err < 0) {
+ goto error;
+ }
} else if (ackSuccess == 0) {
err = at_send_command("AT+CNMA=2", NULL);
+ if (err < 0) {
+ goto error;
+ }
} else {
RLOGE("unsupported arg to RIL_REQUEST_SMS_ACKNOWLEDGE\n");
goto error;
}
RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
+
+ return;
error:
RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
}
@@ -3264,6 +3268,33 @@
RIL_onRequestComplete(t, RIL_E_SUCCESS, ci, sizeof(ci));
}
+static void requestGetCellInfoList_1_6(void* data __unused, size_t datalen __unused, RIL_Token t) {
+ uint64_t curTime = ril_nano_time();
+ RIL_CellInfo_v16 ci[1] = {{ // ci[0]
+ 1, // cellInfoType
+ 1, // registered
+ CELL_CONNECTION_PRIMARY_SERVING,
+ { // union CellInfo
+ {// RIL_CellInfoGsm gsm
+ {
+ // gsm.cellIdneityGsm
+ s_mcc, // mcc
+ s_mnc, // mnc
+ s_lac, // lac
+ s_cid, // cid
+ 0, // arfcn unknown
+ 0x1, // Base Station Identity Code set to arbitrarily 1
+ },
+ {
+ // gsm.signalStrengthGsm
+ 10, // signalStrength
+ 0 // bitErrorRate
+ ,
+ INT_MAX // timingAdvance invalid value
+ }}}}};
+
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, ci, sizeof(ci));
+}
static void requestSetCellInfoListRate(void *data, size_t datalen __unused, RIL_Token t)
{
@@ -4670,6 +4701,10 @@
requestGetCellInfoList(data, datalen, t);
break;
+ case RIL_REQUEST_GET_CELL_INFO_LIST_1_6:
+ requestGetCellInfoList_1_6(data, datalen, t);
+ break;
+
case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE:
requestSetCellInfoListRate(data, datalen, t);
break;
@@ -6018,7 +6053,7 @@
response, sizeof(response));
free(line);
} else if (strStartsWith(s, "+CUSATEND")) { // session end
- RIL_onUnsolicitedResponse(RIL_UNSOL_STK_SESSION_END, NULL, 0);
+ RIL_onUnsolicitedResponse(RIL_UNSOL_STK_SESSION_END, NULL, 0);
} else if (strStartsWith(s, "+CUSATP:")) {
line = p = strdup(s);
if (!line) {
@@ -6235,6 +6270,10 @@
pthread_attr_init (&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);
+ if (ret < 0) {
+ RLOGE("pthread_create: %s:", strerror(errno));
+ return NULL;
+ }
return &s_callbacks;
}
diff --git a/host/commands/tapsetiff/Android.bp b/guest/hals/wpa_supplicant/Android.bp
similarity index 64%
copy from host/commands/tapsetiff/Android.bp
copy to guest/hals/wpa_supplicant/Android.bp
index 1d7dedb..c82554d 100644
--- a/host/commands/tapsetiff/Android.bp
+++ b/guest/hals/wpa_supplicant/Android.bp
@@ -1,5 +1,4 @@
-//
-// Copyright (C) 2020 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -14,10 +13,15 @@
// limitations under the License.
package {
- default_applicable_licenses: ["Android-Apache-2.0"],
+ default_applicable_licenses: [
+ "external_wpa_supplicant_8_wpa_supplicant_license",
+ ],
}
-sh_binary_host {
- name: "tapsetiff",
- src: "tapsetiff.py",
+cc_binary {
+ name: "wpa_supplicant_cf",
+ defaults: ["wpa_supplicant_defaults"],
+ static_libs: [
+ "lib_driver_cmd_simulated_cf_bp",
+ ],
}
diff --git a/guest/libs/wpa_supplicant_8_lib/Android.bp b/guest/libs/wpa_supplicant_8_lib/Android.bp
new file mode 100644
index 0000000..d09457e
--- /dev/null
+++ b/guest/libs/wpa_supplicant_8_lib/Android.bp
@@ -0,0 +1,18 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_library_static {
+ name: "lib_driver_cmd_simulated_cf_bp",
+ srcs: ["driver_cmd_nl80211.c"],
+ cflags: ["-DCONFIG_ANDROID_LOG"],
+ header_libs: [
+ "wpa_supplicant_headers",
+ ],
+ shared_libs: [
+ "libc",
+ "libcutils",
+ "libnl",
+ ],
+ soc_specific: true,
+}
diff --git a/guest/monitoring/cuttlefish_service/Android.bp b/guest/monitoring/cuttlefish_service/Android.bp
index 133d233..d33d0e7 100644
--- a/guest/monitoring/cuttlefish_service/Android.bp
+++ b/guest/monitoring/cuttlefish_service/Android.bp
@@ -20,6 +20,9 @@
name: "CuttlefishService",
vendor: true,
srcs: ["java/**/*.java"],
+ resource_dirs: [
+ "res",
+ ],
static_libs: ["guava"],
sdk_version: "28",
privileged: true,
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java
index 23d4fec..000a96d 100644
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java
+++ b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java
@@ -16,6 +16,8 @@
package com.android.google.gce.gceservice;
import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.res.Resources;
import android.util.Log;
/*
@@ -28,8 +30,13 @@
private final GceFuture<Boolean> mEnabled = new GceFuture<Boolean>("Bluetooth");
- public BluetoothChecker() {
+ public BluetoothChecker(Context context) {
super(LOG_TAG);
+ Resources res = context.getResources();
+ if (!res.getBoolean(R.bool.config_bt_required)) {
+ Log.i(LOG_TAG, "Bluetooth not required, assuming enabled.");
+ mEnabled.set(true);
+ }
}
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
index 80d497a..ef0aa03 100644
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
+++ b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
@@ -51,8 +51,8 @@
private final JobExecutor mExecutor = new JobExecutor();
private final EventReporter mEventReporter = new EventReporter();
private final GceBroadcastReceiver mBroadcastReceiver = new GceBroadcastReceiver();
- private final BluetoothChecker mBluetoothChecker = new BluetoothChecker();
+ private BluetoothChecker mBluetoothChecker = null;
private ConnectivityChecker mConnChecker;
private GceWifiManager mWifiManager = null;
private String mMostRecentAction = null;
@@ -76,6 +76,7 @@
mWindowManager = getSystemService(WindowManager.class);
mConnChecker = new ConnectivityChecker(this, mEventReporter);
mWifiManager = new GceWifiManager(this, mEventReporter, mExecutor);
+ mBluetoothChecker = new BluetoothChecker(this);
mPreviousRotation = getRotation();
mPreviousScreenBounds = getScreenBounds();
diff --git a/guest/monitoring/cuttlefish_service/res/values/config.xml b/guest/monitoring/cuttlefish_service/res/values/config.xml
new file mode 100644
index 0000000..692a686
--- /dev/null
+++ b/guest/monitoring/cuttlefish_service/res/values/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <!-- Is BT required for boot complete -->
+ <bool name="config_bt_required">true</bool>
+</resources>
diff --git a/guest/monitoring/tombstone_transmit/tombstone_transmit.cpp b/guest/monitoring/tombstone_transmit/tombstone_transmit.cpp
index 3d08780..b283fef 100644
--- a/guest/monitoring/tombstone_transmit/tombstone_transmit.cpp
+++ b/guest/monitoring/tombstone_transmit/tombstone_transmit.cpp
@@ -123,8 +123,9 @@
}
if (!log_fd->IsOpen()) {
+ auto error = log_fd->StrError();
ALOGE("Unable to connect to vsock:%u:%u: %s", FLAGS_cid, FLAGS_port,
- log_fd->StrError());
+ error.c_str());
} else if (!ifs.is_open()) {
ALOGE("%s closed in the middle of readout.", ts_path.c_str());
} else {
diff --git a/guest/services/wifi/init.wifi.sh b/guest/services/wifi/init.wifi.sh
new file mode 100755
index 0000000..a23f174
--- /dev/null
+++ b/guest/services/wifi/init.wifi.sh
@@ -0,0 +1,7 @@
+#!/vendor/bin/sh
+
+wifi_mac_prefix=`getprop ro.boot.wifi_mac_prefix`
+if [ -n "$wifi_mac_prefix" ]; then
+ /vendor/bin/mac80211_create_radios 2 $wifi_mac_prefix || exit 1
+fi
+
diff --git a/host/commands/adbshell/main.cpp b/host/commands/adbshell/main.cpp
deleted file mode 100644
index 7263f4c..0000000
--- a/host/commands/adbshell/main.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Utility that uses an adb connection as the login shell. */
-
-#include <array>
-#include <cassert>
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <string>
-#include <vector>
-
-#include <errno.h>
-#include <unistd.h>
-
-#include "common/libs/utils/environment.h"
-#include "host/libs/config/cuttlefish_config.h"
-
-// Many of our users interact with CVDs via ssh. They expect to be able to
-// get an Android shell (as opposed to the host shell) with a single command.
-//
-// Our goals are to:
-//
-// * Allow the user to select which CVD to connect to
-//
-// * Avoid modifications to the host-side sshd and the protocol
-//
-// We accomplish this by using specialized accounts: vsoc-## and cvd-## and
-// specific Android serial numbers:
-//
-// The vsoc-01 account provides a host-side shell that controls the first CVD
-// The cvd-01 account is connected to the Andorid shell of the first CVD
-// The first CVD has a serial number of CUTTLEFISHCVD01
-//
-// The code in the commands/launch directory also follows these conventions by
-// default.
-//
-
-namespace {
-std::string VsocUser() {
- std::string user = cuttlefish::StringFromEnv("USER", "");
- assert(!user_cstring.empty());
-
- std::string cvd_prefix = "cvd-";
- if (user.find(cvd_prefix) == 0) {
- user.replace(0, cvd_prefix.size(), cuttlefish::kVsocUserPrefix);
- }
- return user;
-}
-
-std::string CuttlefishConfigLocation() {
- return std::string("/home/") + VsocUser() +
- "/cuttlefish_runtime/cuttlefish_config.json";
-}
-
-std::string CuttlefishFindAdb() {
- std::string rval = std::string("/home/") + VsocUser() + "/bin/adb";
- if (TEMP_FAILURE_RETRY(access(rval.c_str(), X_OK)) == -1) {
- return "/usr/bin/adb";
- }
- return rval;
-}
-
-void SetCuttlefishConfigEnv() {
- setenv(cuttlefish::kCuttlefishConfigEnvVarName, CuttlefishConfigLocation().c_str(),
- true);
-}
-} // namespace
-
-int main(int argc, char* argv[]) {
- SetCuttlefishConfigEnv();
- auto instance = cuttlefish::CuttlefishConfig::Get()
- ->ForDefaultInstance().adb_device_name();
- std::string adb_path = CuttlefishFindAdb();
-
- std::vector<char*> new_argv = {
- const_cast<char*>(adb_path.c_str()), const_cast<char*>("-s"),
- const_cast<char*>(instance.c_str()), const_cast<char*>("shell"),
- const_cast<char*>("/system/bin/sh")};
-
- // Some important data is lost before this point, and there are
- // no great recovery options:
- // * ssh with no arguments comes in with 1 arg of -adbshell. The command
- // given above does the right thing if we don't invoke the shell.
- if (argc == 1) {
- new_argv.back() = nullptr;
- }
- // * simple shell commands come in with a -c and a single string. The
- // problem here is that adb doesn't preserve spaces, so we need
- // to do additional escaping. The best compromise seems to be to
- // throw double quotes around each string.
- for (int i = 1; i < argc; ++i) {
- size_t buf_size = std::strlen(argv[i]) + 4;
- new_argv.push_back(new char[buf_size]);
- std::snprintf(new_argv.back(), buf_size, "\"%s\"", argv[i]);
- }
- //
- // * scp seems to be pathologically broken when paths contain spaces.
- // spaces aren't properly escaped by gcloud, so scp will fail with
- // "scp: with ambiguous target." We might be able to fix this with
- // some creative parsing of the arguments, but that seems like
- // overkill.
- new_argv.push_back(nullptr);
- execv(new_argv[0], new_argv.data());
- // This never should happen
- return 2;
-}
diff --git a/host/commands/append_squashfs_overlay/Android.bp b/host/commands/append_squashfs_overlay/Android.bp
new file mode 100644
index 0000000..882bcb9
--- /dev/null
+++ b/host/commands/append_squashfs_overlay/Android.bp
@@ -0,0 +1,12 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+rust_binary_host {
+ name: "append_squashfs_overlay",
+ crate_name: "append_squashfs_overlay",
+ srcs: ["src/main.rs"],
+ rustlibs: [
+ "libclap",
+ ],
+}
\ No newline at end of file
diff --git a/host/commands/append_squashfs_overlay/Cargo.toml b/host/commands/append_squashfs_overlay/Cargo.toml
new file mode 100644
index 0000000..5472580
--- /dev/null
+++ b/host/commands/append_squashfs_overlay/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "append_squashfs_overlay"
+version = "0.1.0"
+authors = ["Jeongik Cha <[email protected]>"]
+edition = 2021
+
+[dependencies]
+clap = "2.33"
\ No newline at end of file
diff --git a/host/commands/append_squashfs_overlay/OWNERS b/host/commands/append_squashfs_overlay/OWNERS
new file mode 100644
index 0000000..0930c9e
--- /dev/null
+++ b/host/commands/append_squashfs_overlay/OWNERS
@@ -0,0 +1 @@
[email protected]
\ No newline at end of file
diff --git a/host/commands/append_squashfs_overlay/src/main.rs b/host/commands/append_squashfs_overlay/src/main.rs
new file mode 100644
index 0000000..281aef8
--- /dev/null
+++ b/host/commands/append_squashfs_overlay/src/main.rs
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//! `append_squashfs_overlay` generates a new squashfs image(dest) which contains an overlay image(overlay) on an squashfs image(src).
+//! The tool ignores the existing overlay image in src, that is, the overlay image could be replaced with a new overlay image.
+use std::fs::File;
+use std::io::{copy, Error, ErrorKind, Read, Result, Seek, SeekFrom};
+use std::path::Path;
+
+use clap::{App, Arg};
+
+// https://dr-emann.github.io/squashfs/squashfs.html
+const BYTES_USED_FIELD_POS: u64 = (32 * 5 + 16 * 6 + 64) / 8;
+const SQUASHFS_MAGIC: u32 = 0x73717368;
+
+// https://git.openwrt.org/?p=project/fstools.git;a=blob;f=libfstools/rootdisk.c;h=9f2317f14e8d8f12c71b30944138d7a6c877b406;hb=refs/heads/master#l125
+// 64kb alignment
+const ROOTDEV_OVERLAY_ALIGN: u64 = 64 * 1024;
+
+fn align_size(size: u64, alignment: u64) -> u64 {
+ assert!(
+ alignment > 0 && (alignment & (alignment - 1) == 0),
+ "alignment should be greater than 0 and a power of 2."
+ );
+ (size + (alignment - 1)) & !(alignment - 1)
+}
+
+fn merge_fs(src: &Path, overlay: &Path, dest: &Path, overwrite: bool) -> Result<()> {
+ if dest.exists() && !overwrite {
+ return Err(Error::new(
+ ErrorKind::AlreadyExists,
+ "The destination file already exists, add -w option to overwrite.",
+ ));
+ }
+ let mut buffer = [0; 4];
+
+ let mut src = File::open(src)?;
+
+ src.read_exact(&mut buffer)?;
+ let magic = u32::from_le_bytes(buffer);
+ if magic != SQUASHFS_MAGIC {
+ return Err(Error::new(ErrorKind::InvalidData, "The source image isn't a squashfs image."));
+ }
+ src.seek(SeekFrom::Start(BYTES_USED_FIELD_POS))?;
+ let mut buffer = [0; 8];
+ src.read_exact(&mut buffer)?;
+
+ // https://git.openwrt.org/?p=project/fstools.git;a=blob;f=libfstools/rootdisk.c;h=9f2317f14e8d8f12c71b30944138d7a6c877b406;hb=refs/heads/master#l125
+ // use little endian
+ let bytes_used = u64::from_le_bytes(buffer);
+ let mut dest = File::create(dest)?;
+ let mut overlay = File::open(overlay)?;
+
+ src.seek(SeekFrom::Start(0))?;
+ let mut src_handle = src.take(align_size(bytes_used, ROOTDEV_OVERLAY_ALIGN));
+ copy(&mut src_handle, &mut dest)?;
+ copy(&mut overlay, &mut dest)?;
+ Ok(())
+}
+
+fn main() -> Result<()> {
+ let matches = App::new("append_squashfs_overlay")
+ .arg(Arg::with_name("src").required(true))
+ .arg(Arg::with_name("overlay").required(true))
+ .arg(Arg::with_name("dest").required(true))
+ .arg(
+ Arg::with_name("overwrite")
+ .short("w")
+ .required(false)
+ .takes_value(false)
+ .help("whether the tool overwrite dest or not"),
+ )
+ .get_matches();
+
+ let src = matches.value_of("src").unwrap().as_ref();
+ let overlay = matches.value_of("overlay").unwrap().as_ref();
+ let dest = matches.value_of("dest").unwrap().as_ref();
+ let overwrite = matches.is_present("overwrite");
+
+ merge_fs(src, overlay, dest, overwrite)?;
+ Ok(())
+}
diff --git a/host/commands/assemble_cvd/Android.bp b/host/commands/assemble_cvd/Android.bp
index 4ed4452..2a4095c 100644
--- a/host/commands/assemble_cvd/Android.bp
+++ b/host/commands/assemble_cvd/Android.bp
@@ -27,6 +27,7 @@
"clean.cc",
"disk_flags.cc",
"flags.cc",
+ "flag_feature.cpp",
"misc_info.cc",
"super_image_mixer.cc",
],
@@ -34,9 +35,11 @@
"bootimg_headers",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
+ "libfruit",
"libjsoncpp",
"libnl",
"libprotobuf-cpp-full",
@@ -51,6 +54,7 @@
"libsparse",
"libcuttlefish_graphics_detector",
"libcuttlefish_host_config",
+ "libcuttlefish_host_config_adb",
"libcuttlefish_vm_manager",
"libgflags",
],
diff --git a/host/commands/assemble_cvd/assemble_cvd.cc b/host/commands/assemble_cvd/assemble_cvd.cc
index 27eadb5..77d0337 100644
--- a/host/commands/assemble_cvd/assemble_cvd.cc
+++ b/host/commands/assemble_cvd/assemble_cvd.cc
@@ -23,18 +23,24 @@
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
#include "common/libs/utils/tee_logging.h"
#include "host/commands/assemble_cvd/clean.h"
#include "host/commands/assemble_cvd/disk_flags.h"
+#include "host/commands/assemble_cvd/flag_feature.h"
#include "host/commands/assemble_cvd/flags.h"
+#include "host/libs/config/adb/adb.h"
+#include "host/libs/config/config_flag.h"
+#include "host/libs/config/custom_actions.h"
#include "host/libs/config/fetcher_config.h"
using cuttlefish::StringFromEnv;
DEFINE_string(assembly_dir, StringFromEnv("HOME", ".") + "/cuttlefish_assembly",
"A directory to put generated files common between instances");
-DEFINE_string(instance_dir, StringFromEnv("HOME", ".") + "/cuttlefish_runtime",
- "A directory to put all instance specific files");
+DEFINE_string(instance_dir, StringFromEnv("HOME", ".") + "/cuttlefish",
+ "This is a directory that will hold the cuttlefish generated"
+ "files, including both instance-specific and common files");
DEFINE_bool(resume, true, "Resume using the disk from the last session, if "
"possible. i.e., if --noresume is passed, the disk "
"will be reset to the state it was initially launched "
@@ -88,32 +94,57 @@
return true;
}
-void ValidateAdbModeFlag(const CuttlefishConfig& config) {
- auto adb_modes = config.adb_mode();
- adb_modes.erase(AdbMode::Unknown);
- if (adb_modes.size() < 1) {
- LOG(INFO) << "ADB not enabled";
- }
-}
-
#ifndef O_TMPFILE
# define O_TMPFILE (020000000 | O_DIRECTORY)
#endif
-const CuttlefishConfig* InitFilesystemAndCreateConfig(
- FetcherConfig fetcher_config, KernelConfig kernel_config) {
- std::string assembly_dir_parent = AbsolutePath(FLAGS_assembly_dir);
- while (assembly_dir_parent[assembly_dir_parent.size() - 1] == '/') {
- assembly_dir_parent =
- assembly_dir_parent.substr(0, FLAGS_assembly_dir.rfind('/'));
+void CreateLegacySymlinks(const CuttlefishConfig::InstanceSpecific& instance) {
+ std::string log_files[] = {
+ "kernel.log", "launcher.log", "logcat",
+ "metrics.log", "modem_simulator.log", "crosvm_openwrt.log",
+ };
+ for (const auto& log_file : log_files) {
+ auto symlink_location = instance.PerInstancePath(log_file.c_str());
+ auto log_target = "logs/" + log_file; // Relative path
+ if (symlink(log_target.c_str(), symlink_location.c_str()) != 0) {
+ PLOG(FATAL) << "symlink(\"" << log_target << ", " << symlink_location
+ << ") failed";
+ }
}
- assembly_dir_parent =
- assembly_dir_parent.substr(0, FLAGS_assembly_dir.rfind('/'));
- auto log =
- SharedFD::Open(
- assembly_dir_parent,
- O_WRONLY | O_TMPFILE,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+
+ std::stringstream legacy_instance_path_stream;
+ legacy_instance_path_stream << FLAGS_instance_dir;
+ if (gflags::GetCommandLineFlagInfoOrDie("instance_dir").is_default) {
+ legacy_instance_path_stream << "_runtime";
+ }
+ legacy_instance_path_stream << "." << instance.id();
+ auto legacy_instance_path = legacy_instance_path_stream.str();
+
+ if (DirectoryExists(legacy_instance_path, /* follow_symlinks */ false)) {
+ CHECK(RecursivelyRemoveDirectory(legacy_instance_path))
+ << "Failed to remove legacy directory " << legacy_instance_path;
+ } else if (FileExists(legacy_instance_path, /* follow_symlinks */ false)) {
+ CHECK(RemoveFile(legacy_instance_path))
+ << "Failed to remove instance_dir symlink " << legacy_instance_path;
+ }
+ if (symlink(instance.instance_dir().c_str(), legacy_instance_path.c_str())) {
+ PLOG(FATAL) << "symlink(\"" << instance.instance_dir() << "\", \""
+ << legacy_instance_path << "\") failed";
+ }
+}
+
+const CuttlefishConfig* InitFilesystemAndCreateConfig(
+ FetcherConfig fetcher_config, KernelConfig kernel_config,
+ fruit::Injector<>& injector) {
+ std::string runtime_dir_parent = AbsolutePath(FLAGS_instance_dir);
+ while (runtime_dir_parent[runtime_dir_parent.size() - 1] == '/') {
+ runtime_dir_parent =
+ runtime_dir_parent.substr(0, FLAGS_instance_dir.rfind('/'));
+ }
+ runtime_dir_parent =
+ runtime_dir_parent.substr(0, FLAGS_instance_dir.rfind('/'));
+ auto log = SharedFD::Open(runtime_dir_parent, O_WRONLY | O_TMPFILE,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (!log->IsOpen()) {
LOG(ERROR) << "Could not open O_TMPFILE precursor to assemble_cvd.log: "
<< log->StrError();
@@ -129,15 +160,18 @@
// SaveConfig line below. Don't launch cuttlefish subprocesses between these
// two operations, as those will assume they can read the config object from
// disk.
- auto config = InitializeCuttlefishConfiguration(
- FLAGS_instance_dir, FLAGS_modem_simulator_count, kernel_config);
+ auto config = InitializeCuttlefishConfiguration(FLAGS_instance_dir,
+ FLAGS_modem_simulator_count,
+ kernel_config, injector);
std::set<std::string> preserving;
- if (FLAGS_resume && ShouldCreateAllCompositeDisks(config)) {
+ bool create_os_composite_disk = ShouldCreateOsCompositeDisk(config);
+ if (FLAGS_resume && create_os_composite_disk) {
LOG(INFO) << "Requested resuming a previous session (the default behavior) "
<< "but the base images have changed under the overlay, making the "
<< "overlay incompatible. Wiping the overlay files.";
- } else if (FLAGS_resume && !ShouldCreateAllCompositeDisks(config)) {
+ } else if (FLAGS_resume && !create_os_composite_disk) {
preserving.insert("overlay.img");
+ preserving.insert("ap_overlay.img");
preserving.insert("os_composite_disk_config.txt");
preserving.insert("os_composite_gpt_header.img");
preserving.insert("os_composite_gpt_footer.img");
@@ -165,16 +199,30 @@
ss.str("");
}
}
- CHECK(CleanPriorFiles(preserving, FLAGS_assembly_dir, FLAGS_instance_dir))
+ CHECK(CleanPriorFiles(preserving, config.assembly_dir(),
+ config.instance_dirs()))
<< "Failed to clean prior files";
- // Create assembly directory if it doesn't exist.
- CHECK(EnsureDirectoryExists(FLAGS_assembly_dir));
+ CHECK(EnsureDirectoryExists(config.root_dir()));
+ CHECK(EnsureDirectoryExists(config.assembly_dir()));
+ CHECK(EnsureDirectoryExists(config.instances_dir()));
if (log->LinkAtCwd(config.AssemblyPath("assemble_cvd.log"))) {
LOG(ERROR) << "Unable to persist assemble_cvd log at "
<< config.AssemblyPath("assemble_cvd.log")
<< ": " << log->StrError();
}
+
+ auto disk_config = GetOsCompositeDiskConfig();
+ if (auto it = std::find_if(disk_config.begin(), disk_config.end(),
+ [](const auto& partition) {
+ return partition.label == "ap_rootfs";
+ });
+ it != disk_config.end()) {
+ auto ap_image_idx = std::distance(disk_config.begin(), it) + 1;
+ std::stringstream ss;
+ ss << "/dev/vda" << ap_image_idx;
+ config.set_ap_image_dev_path(ss.str());
+ }
for (const auto& instance : config.Instances()) {
// Create instance directory if it doesn't exist.
CHECK(EnsureDirectoryExists(instance.instance_dir()));
@@ -184,21 +232,41 @@
CHECK(EnsureDirectoryExists(shared_dir));
auto recording_dir = instance.instance_dir() + "/recording";
CHECK(EnsureDirectoryExists(recording_dir));
+ CHECK(EnsureDirectoryExists(instance.PerInstanceLogPath("")));
+ // TODO(schuffelen): Move this code somewhere better
+ CreateLegacySymlinks(instance);
}
CHECK(SaveConfig(config)) << "Failed to initialize configuration";
}
- std::string first_instance = FLAGS_instance_dir + "." + std::to_string(GetInstance());
- CHECK_EQ(symlink(first_instance.c_str(), FLAGS_instance_dir.c_str()), 0)
- << "Could not symlink \"" << first_instance << "\" to \"" << FLAGS_instance_dir << "\"";
-
// Do this early so that the config object is ready for anything that needs it
auto config = CuttlefishConfig::Get();
CHECK(config) << "Failed to obtain config singleton";
- ValidateAdbModeFlag(*config);
+ if (DirectoryExists(FLAGS_assembly_dir, /* follow_symlinks */ false)) {
+ CHECK(RecursivelyRemoveDirectory(FLAGS_assembly_dir))
+ << "Failed to remove directory " << FLAGS_assembly_dir;
+ } else if (FileExists(FLAGS_assembly_dir, /* follow_symlinks */ false)) {
+ CHECK(RemoveFile(FLAGS_assembly_dir))
+ << "Failed to remove file" << FLAGS_assembly_dir;
+ }
+ if (symlink(config->assembly_dir().c_str(), FLAGS_assembly_dir.c_str())) {
+ PLOG(FATAL) << "symlink(\"" << config->assembly_dir() << "\", \""
+ << FLAGS_assembly_dir << "\") failed";
+ }
- CreateDynamicDiskFiles(fetcher_config, config);
+ std::string first_instance = config->Instances()[0].instance_dir();
+ std::string double_legacy_instance_dir = FLAGS_instance_dir + "_runtime";
+ if (FileExists(double_legacy_instance_dir, /* follow_symlinks */ false)) {
+ CHECK(RemoveFile(double_legacy_instance_dir))
+ << "Failed to remove symlink " << double_legacy_instance_dir;
+ }
+ if (symlink(first_instance.c_str(), double_legacy_instance_dir.c_str())) {
+ PLOG(FATAL) << "Could not symlink \"" << first_instance << "\" to \""
+ << double_legacy_instance_dir << "\"";
+ }
+
+ CreateDynamicDiskFiles(fetcher_config, *config);
return config;
}
@@ -218,6 +286,17 @@
SetCommandLineOptionWithMode("initramfs_path", discovered_ramdisk.c_str(),
google::FlagSettingMode::SET_FLAGS_DEFAULT);
}
+
+fruit::Component<> FlagsComponent() {
+ return fruit::createComponent()
+ .install(AdbConfigComponent)
+ .install(AdbConfigFlagComponent)
+ .install(AdbConfigFragmentComponent)
+ .install(GflagsComponent)
+ .install(ConfigFlagComponent)
+ .install(CustomActionsComponent);
+}
+
} // namespace
int AssembleCvdMain(int argc, char** argv) {
@@ -247,10 +326,54 @@
ExtractKernelParamsFromFetcherConfig(fetcher_config);
KernelConfig kernel_config;
- CHECK(ParseCommandLineFlags(&argc, &argv, &kernel_config)) << "Failed to parse arguments";
+ auto args = ArgsToVec(argc - 1, argv + 1);
- auto config =
- InitFilesystemAndCreateConfig(std::move(fetcher_config), kernel_config);
+ bool help = false;
+ std::string help_str;
+ bool helpxml = false;
+
+ std::vector<Flag> help_flags = {
+ GflagsCompatFlag("help", help),
+ GflagsCompatFlag("helpfull", help),
+ GflagsCompatFlag("helpshort", help),
+ GflagsCompatFlag("helpmatch", help_str),
+ GflagsCompatFlag("helpon", help_str),
+ GflagsCompatFlag("helppackage", help_str),
+ GflagsCompatFlag("helpxml", helpxml),
+ };
+ for (const auto& help_flag : help_flags) {
+ if (!help_flag.Parse(args)) {
+ LOG(ERROR) << "Failed to process help flag.";
+ return 1;
+ }
+ }
+
+ fruit::Injector<> injector(FlagsComponent);
+ auto flag_features = injector.getMultibindings<FlagFeature>();
+ if (!FlagFeature::ProcessFlags(flag_features, args)) {
+ LOG(ERROR) << "Failed to parse flags.";
+ return 1;
+ }
+
+ if (help || help_str != "") {
+ LOG(WARNING) << "TODO(schuffelen): Implement `--help` for assemble_cvd.";
+ LOG(WARNING) << "In the meantime, call `launch_cvd --help`";
+ return 1;
+ } else if (helpxml) {
+ if (!FlagFeature::WriteGflagsHelpXml(flag_features, std::cout)) {
+ LOG(ERROR) << "Failure in writing gflags helpxml output";
+ }
+ std::exit(1); // For parity with gflags
+ }
+ // TODO(schuffelen): Put in "unknown flag" guards after gflags is removed.
+ // gflags either consumes all arguments that start with - or leaves all of
+ // them in place, and either errors out on unknown flags or accepts any flags.
+
+ CHECK(GetKernelConfigAndSetDefaults(&kernel_config))
+ << "Failed to parse arguments";
+
+ auto config = InitFilesystemAndCreateConfig(std::move(fetcher_config),
+ kernel_config, injector);
std::cout << GetConfigFilePath(*config) << "\n";
std::cout << std::flush;
diff --git a/host/commands/assemble_cvd/boot_config.cc b/host/commands/assemble_cvd/boot_config.cc
index b433940..99c0b61 100644
--- a/host/commands/assemble_cvd/boot_config.cc
+++ b/host/commands/assemble_cvd/boot_config.cc
@@ -29,6 +29,7 @@
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
#include "common/libs/utils/subprocess.h"
+#include "host/libs/config/bootconfig_args.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/kernel_args.h"
#include "host/libs/vm_manager/crosvm_manager.h"
@@ -43,10 +44,10 @@
namespace {
size_t WriteEnvironment(const CuttlefishConfig& config,
- const std::vector<std::string>& kernel_args,
+ const std::string& kernel_args,
const std::string& env_path) {
std::ostringstream env;
- env << "bootargs=" << android::base::Join(kernel_args, " ") << '\0';
+ env << "bootargs=" << kernel_args << '\0';
if (!config.boot_slot().empty()) {
env << "android_slot_suffix=_" << config.boot_slot() << '\0';
}
@@ -58,7 +59,7 @@
}
// Note that the 0 index points to the GPT table.
- env << "bootcmd=boot_android virtio 0#misc" << '\0';
+ env << "bootcmd=verified_boot_android virtio 0#misc" << '\0';
if (FLAGS_vm_manager == CrosvmManager::name() &&
config.target_arch() == Arch::Arm64) {
env << "fdtaddr=0x80000000" << '\0';
@@ -79,42 +80,89 @@
} // namespace
+class InitBootloaderEnvPartitionImpl : public InitBootloaderEnvPartition {
+ public:
+ INJECT(InitBootloaderEnvPartitionImpl(
+ const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
-bool InitBootloaderEnvPartition(const CuttlefishConfig& config,
- const CuttlefishConfig::InstanceSpecific& instance) {
- auto boot_env_image_path = instance.uboot_env_image_path();
- auto tmp_boot_env_image_path = boot_env_image_path + ".tmp";
- auto uboot_env_path = instance.PerInstancePath("mkenvimg_input");
- auto kernel_args = KernelCommandLineFromConfig(config);
- if(!WriteEnvironment(config, kernel_args, uboot_env_path)) {
- LOG(ERROR) << "Unable to write out plaintext env '" << uboot_env_path << ".'";
- return false;
- }
+ // Feature
+ std::string Name() const override { return "InitBootloaderEnvPartitionImpl"; }
+ bool Enabled() const override { return !config_.protected_vm(); }
- auto mkimage_path = HostBinaryPath("mkenvimage");
- Command cmd(mkimage_path);
- cmd.AddParameter("-s");
- cmd.AddParameter("4096");
- cmd.AddParameter("-o");
- cmd.AddParameter(tmp_boot_env_image_path);
- cmd.AddParameter(uboot_env_path);
- int success = cmd.Start().Wait();
- if (success != 0) {
- LOG(ERROR) << "Unable to run mkenvimage. Exited with status " << success;
- return false;
- }
-
- if(!FileExists(boot_env_image_path) || ReadFile(boot_env_image_path) != ReadFile(tmp_boot_env_image_path)) {
- if(!RenameFile(tmp_boot_env_image_path, boot_env_image_path)) {
- LOG(ERROR) << "Unable to delete the old env image.";
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto boot_env_image_path = instance_.uboot_env_image_path();
+ auto tmp_boot_env_image_path = boot_env_image_path + ".tmp";
+ auto uboot_env_path = instance_.PerInstancePath("mkenvimg_input");
+ auto kernel_cmdline =
+ android::base::Join(KernelCommandLineFromConfig(config_), " ");
+ // If the bootconfig isn't supported in the guest kernel, the bootconfig
+ // args need to be passed in via the uboot env. This won't be an issue for
+ // protect kvm which is running a kernel with bootconfig support.
+ if (!config_.bootconfig_supported()) {
+ auto bootconfig_args = android::base::Join(
+ BootconfigArgsFromConfig(config_, instance_), " ");
+ // "androidboot.hardware" kernel parameter has changed to "hardware" in
+ // bootconfig and needs to be replaced before being used in the kernel
+ // cmdline.
+ bootconfig_args = android::base::StringReplace(
+ bootconfig_args, " hardware=", " androidboot.hardware=", true);
+ // TODO(b/182417593): Until we pass the module parameters through
+ // modules.options, we pass them through bootconfig using
+ // 'kernel.<key>=<value>' But if we don't support bootconfig, we need to
+ // rename them back to the old cmdline version
+ bootconfig_args =
+ android::base::StringReplace(bootconfig_args, " kernel.", " ", true);
+ kernel_cmdline += " ";
+ kernel_cmdline += bootconfig_args;
+ }
+ if (!WriteEnvironment(config_, kernel_cmdline, uboot_env_path)) {
+ LOG(ERROR) << "Unable to write out plaintext env '" << uboot_env_path
+ << ".'";
return false;
}
- LOG(DEBUG) << "Updated bootloader environment image.";
- } else {
- RemoveFile(tmp_boot_env_image_path);
+
+ auto mkimage_path = HostBinaryPath("mkenvimage");
+ Command cmd(mkimage_path);
+ cmd.AddParameter("-s");
+ cmd.AddParameter("4096");
+ cmd.AddParameter("-o");
+ cmd.AddParameter(tmp_boot_env_image_path);
+ cmd.AddParameter(uboot_env_path);
+ int success = cmd.Start().Wait();
+ if (success != 0) {
+ LOG(ERROR) << "Unable to run mkenvimage. Exited with status " << success;
+ return false;
+ }
+
+ if (!FileExists(boot_env_image_path) ||
+ ReadFile(boot_env_image_path) != ReadFile(tmp_boot_env_image_path)) {
+ if (!RenameFile(tmp_boot_env_image_path, boot_env_image_path)) {
+ LOG(ERROR) << "Unable to delete the old env image.";
+ return false;
+ }
+ LOG(DEBUG) << "Updated bootloader environment image.";
+ } else {
+ RemoveFile(tmp_boot_env_image_path);
+ }
+
+ return true;
}
- return true;
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>,
+ InitBootloaderEnvPartition>
+InitBootloaderEnvPartitionComponent() {
+ return fruit::createComponent()
+ .bind<InitBootloaderEnvPartition, InitBootloaderEnvPartitionImpl>()
+ .addMultibinding<Feature, InitBootloaderEnvPartition>();
}
} // namespace cuttlefish
diff --git a/host/commands/assemble_cvd/boot_config.h b/host/commands/assemble_cvd/boot_config.h
index 1a81b79..74109dd 100644
--- a/host/commands/assemble_cvd/boot_config.h
+++ b/host/commands/assemble_cvd/boot_config.h
@@ -16,11 +16,19 @@
#pragma once
#include <string>
-#include <host/libs/config/cuttlefish_config.h>
+
+#include <fruit/fruit.h>
+
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
namespace cuttlefish {
-bool InitBootloaderEnvPartition(const CuttlefishConfig& config,
- const CuttlefishConfig::InstanceSpecific& instance);
+class InitBootloaderEnvPartition : public Feature {};
+
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>,
+ InitBootloaderEnvPartition>
+InitBootloaderEnvPartitionComponent();
} // namespace cuttlefish
diff --git a/host/commands/assemble_cvd/boot_image_utils.cc b/host/commands/assemble_cvd/boot_image_utils.cc
index cfad23f..5e1cbd5 100644
--- a/host/commands/assemble_cvd/boot_image_utils.cc
+++ b/host/commands/assemble_cvd/boot_image_utils.cc
@@ -222,11 +222,20 @@
return false;
}
- auto fd = SharedFD::Open(tmp_boot_image_path, O_RDWR);
- auto original_size = FileSize(boot_image_path);
- CHECK(fd->Truncate(original_size) == 0)
- << "`truncate --size=" << original_size << " " << tmp_boot_image_path << "` "
- << "failed: " << fd->StrError();
+ auto avbtool_path = HostBinaryPath("avbtool");
+ Command avb_cmd(avbtool_path);
+ avb_cmd.AddParameter("add_hash_footer");
+ avb_cmd.AddParameter("--image");
+ avb_cmd.AddParameter(tmp_boot_image_path);
+ avb_cmd.AddParameter("--partition_size");
+ avb_cmd.AddParameter(FileSize(boot_image_path));
+ avb_cmd.AddParameter("--partition_name");
+ avb_cmd.AddParameter("boot");
+ success = avb_cmd.Start().Wait();
+ if (success != 0) {
+ LOG(ERROR) << "Unable to run avbtool. Exited with status " << success;
+ return false;
+ }
return DeleteTmpFileIfNotChanged(tmp_boot_image_path, new_boot_image_path);
}
@@ -235,8 +244,6 @@
const std::string& vendor_boot_image_path,
const std::string& new_vendor_boot_image_path,
const std::string& unpack_dir,
- const std::string& repack_dir,
- const std::vector<std::string>& bootconfig_args,
bool bootconfig_supported) {
if (UnpackVendorBootImageIfNotUnpacked(vendor_boot_image_path, unpack_dir) ==
false) {
@@ -255,23 +262,15 @@
ramdisk_path = unpack_dir + "/" + CONCATENATED_VENDOR_RAMDISK;
}
- auto bootconfig_fd = SharedFD::Creat(repack_dir + "/bootconfig", 0666);
- if (!bootconfig_fd->IsOpen()) {
- LOG(ERROR) << "Unable to create intermediate bootconfig file: "
- << bootconfig_fd->StrError();
- return false;
- }
std::string bootconfig = ReadFile(unpack_dir + "/bootconfig");
- bootconfig_fd->Write(bootconfig.c_str(), bootconfig.size());
LOG(DEBUG) << "Bootconfig parameters from vendor boot image are "
- << ReadFile(repack_dir + "/bootconfig");
+ << bootconfig;
std::string vendor_boot_params = ReadFile(unpack_dir + "/vendor_boot_params");
auto kernel_cmdline =
ExtractValue(vendor_boot_params, "vendor command line args: ") +
(bootconfig_supported
? ""
- : " " + android::base::StringReplace(bootconfig, "\n", " ", true) +
- " " + android::base::Join(bootconfig_args, " "));
+ : " " + android::base::StringReplace(bootconfig, "\n", " ", true));
if (!bootconfig_supported) {
// TODO(b/182417593): Until we pass the module parameters through
// modules.options, we pass them through bootconfig using
@@ -280,8 +279,7 @@
kernel_cmdline = android::base::StringReplace(
kernel_cmdline, " kernel.", " ", true);
}
- LOG(DEBUG) << "Cmdline from vendor boot image and config is "
- << kernel_cmdline;
+ LOG(DEBUG) << "Cmdline from vendor boot image is " << kernel_cmdline;
auto tmp_vendor_boot_image_path = new_vendor_boot_image_path + TMP_EXTENSION;
auto repack_path = HostBinaryPath("mkbootimg");
@@ -298,7 +296,7 @@
repack_cmd.AddParameter(unpack_dir + "/dtb");
if (bootconfig_supported) {
repack_cmd.AddParameter("--vendor_bootconfig");
- repack_cmd.AddParameter(repack_dir + "/bootconfig");
+ repack_cmd.AddParameter(unpack_dir + "/bootconfig");
}
int success = repack_cmd.Start().Wait();
@@ -307,11 +305,20 @@
return false;
}
- auto fd = SharedFD::Open(tmp_vendor_boot_image_path, O_RDWR);
- auto original_size = FileSize(vendor_boot_image_path);
- CHECK(fd->Truncate(original_size) == 0)
- << "`truncate --size=" << original_size << " " << tmp_vendor_boot_image_path << "` "
- << "failed: " << fd->StrError();
+ auto avbtool_path = HostBinaryPath("avbtool");
+ Command avb_cmd(avbtool_path);
+ avb_cmd.AddParameter("add_hash_footer");
+ avb_cmd.AddParameter("--image");
+ avb_cmd.AddParameter(tmp_vendor_boot_image_path);
+ avb_cmd.AddParameter("--partition_size");
+ avb_cmd.AddParameter(FileSize(vendor_boot_image_path));
+ avb_cmd.AddParameter("--partition_name");
+ avb_cmd.AddParameter("vendor_boot");
+ success = avb_cmd.Start().Wait();
+ if (success != 0) {
+ LOG(ERROR) << "Unable to run avbtool. Exited with status " << success;
+ return false;
+ }
return DeleteTmpFileIfNotChanged(tmp_vendor_boot_image_path, new_vendor_boot_image_path);
}
@@ -319,14 +326,11 @@
bool RepackVendorBootImageWithEmptyRamdisk(
const std::string& vendor_boot_image_path,
const std::string& new_vendor_boot_image_path,
- const std::string& unpack_dir, const std::string& repack_dir,
- const std::vector<std::string>& bootconfig_args,
- bool bootconfig_supported) {
+ const std::string& unpack_dir, bool bootconfig_supported) {
auto empty_ramdisk_file =
SharedFD::Creat(unpack_dir + "/empty_ramdisk", 0666);
return RepackVendorBootImage(
unpack_dir + "/empty_ramdisk", vendor_boot_image_path,
- new_vendor_boot_image_path, unpack_dir, repack_dir, bootconfig_args,
- bootconfig_supported);
+ new_vendor_boot_image_path, unpack_dir, bootconfig_supported);
}
} // namespace cuttlefish
diff --git a/host/commands/assemble_cvd/boot_image_utils.h b/host/commands/assemble_cvd/boot_image_utils.h
index fafb514..298fdb4 100644
--- a/host/commands/assemble_cvd/boot_image_utils.h
+++ b/host/commands/assemble_cvd/boot_image_utils.h
@@ -27,12 +27,9 @@
const std::string& vendor_boot_image_path,
const std::string& new_vendor_boot_image_path,
const std::string& unpack_dir,
- const std::string& repack_dir,
- const std::vector<std::string>& bootconfig_args,
bool bootconfig_supported);
bool RepackVendorBootImageWithEmptyRamdisk(
const std::string& vendor_boot_image_path,
const std::string& new_vendor_boot_image_path,
- const std::string& unpack_dir, const std::string& repack_dir,
- const std::vector<std::string>& bootconfig_args, bool bootconfig_supported);
+ const std::string& unpack_dir, bool bootconfig_supported);
}
diff --git a/host/commands/assemble_cvd/clean.cc b/host/commands/assemble_cvd/clean.cc
index 6197a8f..853e11f 100644
--- a/host/commands/assemble_cvd/clean.cc
+++ b/host/commands/assemble_cvd/clean.cc
@@ -113,10 +113,9 @@
} // namespace
-bool CleanPriorFiles(
- const std::set<std::string>& preserving,
- const std::string& assembly_dir,
- const std::string& instance_dir) {
+bool CleanPriorFiles(const std::set<std::string>& preserving,
+ const std::string& assembly_dir,
+ const std::vector<std::string>& instance_dirs) {
std::vector<std::string> paths = {
// Everything in the assembly directory
assembly_dir,
@@ -125,19 +124,7 @@
// The global link to the config file
GetGlobalConfigFileLink(),
};
-
- std::string runtime_dir_parent = cpp_dirname(AbsolutePath(instance_dir));
- std::string runtime_dirs_basename = cpp_basename(AbsolutePath(instance_dir));
-
- std::regex instance_dir_regex("^.+\\.[1-9]\\d*$");
- for (const auto& path : DirectoryContents(runtime_dir_parent)) {
- std::string absl_path = runtime_dir_parent + "/" + path;
- if((path.rfind(runtime_dirs_basename, 0) == 0) && std::regex_match(path, instance_dir_regex) &&
- DirectoryExists(absl_path)) {
- paths.push_back(absl_path);
- }
- }
- paths.push_back(instance_dir);
+ paths.insert(paths.end(), instance_dirs.begin(), instance_dirs.end());
return CleanPriorFiles(paths, preserving);
}
diff --git a/host/commands/assemble_cvd/clean.h b/host/commands/assemble_cvd/clean.h
index 1f33685..febd5c1 100644
--- a/host/commands/assemble_cvd/clean.h
+++ b/host/commands/assemble_cvd/clean.h
@@ -20,10 +20,9 @@
namespace cuttlefish {
-bool CleanPriorFiles(
- const std::set<std::string>& preserving,
- const std::string& assembly_dir,
- const std::string& instance_dir);
+bool CleanPriorFiles(const std::set<std::string>& preserving,
+ const std::string& assembly_dir,
+ const std::vector<std::string>& instance_dirs);
bool EnsureDirectoryExists(const std::string& directory_path);
diff --git a/host/commands/assemble_cvd/disk_flags.cc b/host/commands/assemble_cvd/disk_flags.cc
index e5ccac9..b046339 100644
--- a/host/commands/assemble_cvd/disk_flags.cc
+++ b/host/commands/assemble_cvd/disk_flags.cc
@@ -16,14 +16,14 @@
#include "host/commands/assemble_cvd/disk_flags.h"
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+#include <fruit/fruit.h>
+#include <gflags/gflags.h>
#include <sys/statvfs.h>
#include <fstream>
-#include <android-base/logging.h>
-#include <android-base/strings.h>
-#include <gflags/gflags.h>
-
#include "common/libs/fs/shared_buf.h"
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
@@ -35,18 +35,20 @@
#include "host/libs/config/bootconfig_args.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/data_image.h"
-#include "host/libs/image_aggregator/image_aggregator.h"
#include "host/libs/vm_manager/crosvm_manager.h"
// Taken from external/avb/libavb/avb_slot_verify.c; this define is not in the headers
#define VBMETA_MAX_SIZE 65536ul
-DEFINE_string(system_image_dir, cuttlefish::DefaultGuestImagePath(""),
- "Location of the system partition images.");
+DECLARE_string(system_image_dir);
DEFINE_string(boot_image, "",
"Location of cuttlefish boot image. If empty it is assumed to be "
"boot.img in the directory specified by -system_image_dir.");
+DEFINE_string(
+ init_boot_image, "",
+ "Location of cuttlefish init boot image. If empty it is assumed to "
+ "be init_boot.img in the directory specified by -system_image_dir.");
DEFINE_string(data_image, "", "Location of the data partition image.");
DEFINE_string(super_image, "", "Location of the super partition image.");
DEFINE_string(misc_image, "",
@@ -63,13 +65,23 @@
DEFINE_string(vbmeta_system_image, "",
"Location of cuttlefish vbmeta_system image. If empty it is assumed to "
"be vbmeta_system.img in the directory specified by -system_image_dir.");
-DEFINE_string(esp, "", "Path to ESP partition image (FAT formatted)");
+DEFINE_string(otheros_esp_image, "",
+ "Location of cuttlefish esp image. If the image does not exist, "
+ "and --otheros_root_image is specified, an esp partition image "
+ "is created with default bootloaders.");
+DEFINE_string(otheros_kernel_path, "",
+ "Location of cuttlefish otheros kernel.");
+DEFINE_string(otheros_initramfs_path, "",
+ "Location of cuttlefish otheros initramfs.img.");
+DEFINE_string(otheros_root_image, "",
+ "Location of cuttlefish otheros root filesystem image.");
DEFINE_int32(blank_metadata_image_mb, 16,
"The size of the blank metadata image to generate, MB.");
DEFINE_int32(blank_sdcard_image_mb, 2048,
"If enabled, the size of the blank sdcard image to generate, MB.");
+DECLARE_string(ap_rootfs_image);
DECLARE_string(bootloader);
DECLARE_bool(use_sdcard);
DECLARE_string(initramfs_path);
@@ -92,6 +104,11 @@
std::string default_boot_image = FLAGS_system_image_dir + "/boot.img";
SetCommandLineOptionWithMode("boot_image", default_boot_image.c_str(),
google::FlagSettingMode::SET_FLAGS_DEFAULT);
+ std::string default_init_boot_image =
+ FLAGS_system_image_dir + "/init_boot.img";
+ SetCommandLineOptionWithMode("init_boot_image",
+ default_init_boot_image.c_str(),
+ google::FlagSettingMode::SET_FLAGS_DEFAULT);
std::string default_data_image = FLAGS_system_image_dir + "/userdata.img";
SetCommandLineOptionWithMode("data_image", default_data_image.c_str(),
google::FlagSettingMode::SET_FLAGS_DEFAULT);
@@ -104,6 +121,9 @@
std::string default_misc_image = FLAGS_system_image_dir + "/misc.img";
SetCommandLineOptionWithMode("misc_image", default_misc_image.c_str(),
google::FlagSettingMode::SET_FLAGS_DEFAULT);
+ std::string default_esp_image = FLAGS_system_image_dir + "/esp.img";
+ SetCommandLineOptionWithMode("otheros_esp_image", default_esp_image.c_str(),
+ google::FlagSettingMode::SET_FLAGS_DEFAULT);
std::string default_vendor_boot_image = FLAGS_system_image_dir
+ "/vendor_boot.img";
SetCommandLineOptionWithMode("vendor_boot_image",
@@ -120,78 +140,108 @@
return true;
}
-
-std::vector<ImagePartition> os_composite_disk_config(
- const CuttlefishConfig::InstanceSpecific& instance) {
+void create_overlay_image(const CuttlefishConfig& config,
+ std::string overlay_path) {
+ bool missingOverlay = !FileExists(overlay_path);
+ bool newOverlay = FileModificationTime(overlay_path) <
+ FileModificationTime(config.os_composite_disk_path());
+ if (missingOverlay || !FLAGS_resume || newOverlay) {
+ CreateQcowOverlay(config.crosvm_binary(), config.os_composite_disk_path(),
+ overlay_path);
+ }
+}
+std::vector<ImagePartition> GetOsCompositeDiskConfig() {
std::vector<ImagePartition> partitions;
- partitions.push_back(ImagePartition {
- .label = "misc",
- .image_file_path = FLAGS_misc_image,
+ partitions.push_back(ImagePartition{
+ .label = "misc",
+ .image_file_path = FLAGS_misc_image,
+ .read_only = true,
});
- if (!FLAGS_esp.empty()) {
- partitions.push_back(ImagePartition {
- .label = "esp",
- .image_file_path = FLAGS_esp,
- .type = kEfiSystemPartition,
+ partitions.push_back(ImagePartition{
+ .label = "boot_a",
+ .image_file_path = FLAGS_boot_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "boot_b",
+ .image_file_path = FLAGS_boot_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "init_boot_a",
+ .image_file_path = FLAGS_init_boot_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "init_boot_b",
+ .image_file_path = FLAGS_init_boot_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "vendor_boot_a",
+ .image_file_path = FLAGS_vendor_boot_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "vendor_boot_b",
+ .image_file_path = FLAGS_vendor_boot_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "vbmeta_a",
+ .image_file_path = FLAGS_vbmeta_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "vbmeta_b",
+ .image_file_path = FLAGS_vbmeta_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "vbmeta_system_a",
+ .image_file_path = FLAGS_vbmeta_system_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "vbmeta_system_b",
+ .image_file_path = FLAGS_vbmeta_system_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "super",
+ .image_file_path = FLAGS_super_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "userdata",
+ .image_file_path = FLAGS_data_image,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "metadata",
+ .image_file_path = FLAGS_metadata_image,
+ .read_only = true,
+ });
+ if (!FLAGS_otheros_root_image.empty()) {
+ partitions.push_back(ImagePartition{
+ .label = "otheros_esp",
+ .image_file_path = FLAGS_otheros_esp_image,
+ .type = kEfiSystemPartition,
+ .read_only = true,
+ });
+ partitions.push_back(ImagePartition{
+ .label = "otheros_root",
+ .image_file_path = FLAGS_otheros_root_image,
+ .read_only = true,
});
}
- partitions.push_back(ImagePartition {
- .label = "boot_a",
- .image_file_path = FLAGS_boot_image,
- });
- partitions.push_back(ImagePartition {
- .label = "boot_b",
- .image_file_path = FLAGS_boot_image,
- });
- // Boot image repacking is not supported on protected VMs. Repacking requires
- // resigning the image and keys on android hosts aren't trusted.
- if (!FLAGS_protected_vm) {
+ if (!FLAGS_ap_rootfs_image.empty()) {
partitions.push_back(ImagePartition{
- .label = "vendor_boot_a",
- .image_file_path = instance.vendor_boot_image_path(),
- });
- partitions.push_back(ImagePartition{
- .label = "vendor_boot_b",
- .image_file_path = instance.vendor_boot_image_path(),
- });
- } else {
- partitions.push_back(ImagePartition{
- .label = "vendor_boot_a",
- .image_file_path = FLAGS_vendor_boot_image,
- });
- partitions.push_back(ImagePartition{
- .label = "vendor_boot_b",
- .image_file_path = FLAGS_vendor_boot_image,
+ .label = "ap_rootfs",
+ .image_file_path = FLAGS_ap_rootfs_image,
+ .read_only = true,
});
}
- partitions.push_back(ImagePartition {
- .label = "vbmeta_a",
- .image_file_path = FLAGS_vbmeta_image,
- });
- partitions.push_back(ImagePartition {
- .label = "vbmeta_b",
- .image_file_path = FLAGS_vbmeta_image,
- });
- partitions.push_back(ImagePartition {
- .label = "vbmeta_system_a",
- .image_file_path = FLAGS_vbmeta_system_image,
- });
- partitions.push_back(ImagePartition {
- .label = "vbmeta_system_b",
- .image_file_path = FLAGS_vbmeta_system_image,
- });
- partitions.push_back(ImagePartition {
- .label = "super",
- .image_file_path = FLAGS_super_image,
- });
- partitions.push_back(ImagePartition {
- .label = "userdata",
- .image_file_path = FLAGS_data_image,
- });
- partitions.push_back(ImagePartition {
- .label = "metadata",
- .image_file_path = FLAGS_metadata_image,
- });
return partitions;
}
@@ -235,31 +285,6 @@
return ret;
}
-bool ShouldCreateAllCompositeDisks(const CuttlefishConfig& config) {
- std::chrono::system_clock::time_point youngest_disk_img;
- for (auto& partition :
- os_composite_disk_config(config.ForDefaultInstance())) {
- auto partition_mod_time = FileModificationTime(partition.image_file_path);
- if (partition_mod_time > youngest_disk_img) {
- youngest_disk_img = partition_mod_time;
- }
- }
-
- // If the youngest partition img is younger than any composite disk, this fact implies that
- // the composite disks are all out of date and need to be reinitialized.
- for (auto& instance : config.Instances()) {
- if (!FileExists(instance.os_composite_disk_path())) {
- continue;
- }
- if (youngest_disk_img >
- FileModificationTime(instance.os_composite_disk_path())) {
- return true;
- }
- }
-
- return false;
-}
-
bool DoesCompositeMatchCurrentDiskConfig(
const std::string& prior_disk_config_path,
const std::vector<ImagePartition>& partitions) {
@@ -300,6 +325,11 @@
return composite_age < LastUpdatedInputDisk(partitions);
}
+bool ShouldCreateOsCompositeDisk(const CuttlefishConfig& config) {
+ return ShouldCreateCompositeDisk(config.os_composite_disk_path(),
+ GetOsCompositeDiskConfig());
+}
+
static uint64_t AvailableSpaceAtPath(const std::string& path) {
struct statvfs vfs;
if (statvfs(path.c_str(), &vfs) != 0) {
@@ -312,12 +342,11 @@
return static_cast<uint64_t>(vfs.f_frsize) * vfs.f_bavail;
}
-bool CreateCompositeDisk(const CuttlefishConfig& config,
- const CuttlefishConfig::InstanceSpecific& instance) {
- if (!SharedFD::Open(instance.os_composite_disk_path().c_str(),
+bool CreateOsCompositeDisk(const CuttlefishConfig& config) {
+ if (!SharedFD::Open(config.os_composite_disk_path().c_str(),
O_WRONLY | O_CREAT, 0644)
->IsOpen()) {
- LOG(ERROR) << "Could not ensure " << instance.os_composite_disk_path()
+ LOG(ERROR) << "Could not ensure " << config.os_composite_disk_path()
<< " exists";
return false;
}
@@ -343,16 +372,15 @@
<< existing_sizes.disk_size;
}
std::string header_path =
- instance.PerInstancePath("os_composite_gpt_header.img");
+ config.AssemblyPath("os_composite_gpt_header.img");
std::string footer_path =
- instance.PerInstancePath("os_composite_gpt_footer.img");
- CreateCompositeDisk(os_composite_disk_config(instance), header_path,
- footer_path, instance.os_composite_disk_path());
+ config.AssemblyPath("os_composite_gpt_footer.img");
+ CreateCompositeDisk(GetOsCompositeDiskConfig(), header_path, footer_path,
+ config.os_composite_disk_path());
} else {
// If this doesn't fit into the disk, it will fail while aggregating. The
// aggregator doesn't maintain any sparse attributes.
- AggregateImage(os_composite_disk_config(instance),
- instance.os_composite_disk_path());
+ AggregateImage(GetOsCompositeDiskConfig(), config.os_composite_disk_path());
}
return true;
}
@@ -381,132 +409,352 @@
return true;
}
-static void RepackAllBootImages(const CuttlefishConfig* config) {
- CHECK(FileHasContent(FLAGS_boot_image))
- << "File not found: " << FLAGS_boot_image;
+class BootImageRepacker : public Feature {
+ public:
+ INJECT(BootImageRepacker(const CuttlefishConfig& config)) : config_(config) {}
- CHECK(FileHasContent(FLAGS_vendor_boot_image))
- << "File not found: " << FLAGS_vendor_boot_image;
-
- if (FLAGS_kernel_path.size()) {
- const std::string new_boot_image_path =
- config->AssemblyPath("boot_repacked.img");
- bool success = RepackBootImage(FLAGS_kernel_path, FLAGS_boot_image,
- new_boot_image_path, config->assembly_dir());
- CHECK(success) << "Failed to regenerate the boot image with the new kernel";
- SetCommandLineOptionWithMode("boot_image", new_boot_image_path.c_str(),
- google::FlagSettingMode::SET_FLAGS_DEFAULT);
+ // Feature
+ std::string Name() const override { return "BootImageRepacker"; }
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Enabled() const override {
+ // If we are booting a protected VM, for now, assume that image repacking
+ // isn't trusted. Repacking requires resigning the image and keys from an
+ // android host aren't trusted.
+ return !config_.protected_vm();
}
- for (auto instance : config->Instances()) {
- const std::string new_vendor_boot_image_path =
- instance.vendor_boot_image_path();
- const std::vector<std::string> boot_config_vector =
- BootconfigArgsFromConfig(*config, instance);
+ protected:
+ bool Setup() override {
+ if (!FileHasContent(FLAGS_boot_image)) {
+ LOG(ERROR) << "File not found: " << FLAGS_boot_image;
+ return false;
+ }
+ // The init_boot partition is be optional for testing boot.img
+ // with the ramdisk inside.
+ if (!FileHasContent(FLAGS_init_boot_image)) {
+ LOG(WARNING) << "File not found: " << FLAGS_init_boot_image;
+ }
+
+ if (!FileHasContent(FLAGS_vendor_boot_image)) {
+ LOG(ERROR) << "File not found: " << FLAGS_vendor_boot_image;
+ return false;
+ }
+
+ if (FLAGS_kernel_path.size()) {
+ const std::string new_boot_image_path =
+ config_.AssemblyPath("boot_repacked.img");
+ bool success =
+ RepackBootImage(FLAGS_kernel_path, FLAGS_boot_image,
+ new_boot_image_path, config_.assembly_dir());
+ if (!success) {
+ LOG(ERROR) << "Failed to regenerate the boot image with the new kernel";
+ return false;
+ }
+ SetCommandLineOptionWithMode("boot_image", new_boot_image_path.c_str(),
+ google::FlagSettingMode::SET_FLAGS_DEFAULT);
+ }
+
if (FLAGS_kernel_path.size() || FLAGS_initramfs_path.size()) {
+ const std::string new_vendor_boot_image_path =
+ config_.AssemblyPath("vendor_boot_repacked.img");
// Repack the vendor boot images if kernels and/or ramdisks are passed in.
if (FLAGS_initramfs_path.size()) {
bool success = RepackVendorBootImage(
FLAGS_initramfs_path, FLAGS_vendor_boot_image,
- new_vendor_boot_image_path, config->assembly_dir(),
- instance.instance_dir(), boot_config_vector,
- config->bootconfig_supported());
- CHECK(success) << "Failed to regenerate the vendor boot image with the "
- "new ramdisk";
- } else {
- // This control flow implies a kernel with all configs built in.
- // If it's just the kernel, repack the vendor boot image without a
- // ramdisk.
- bool success = RepackVendorBootImageWithEmptyRamdisk(
- FLAGS_vendor_boot_image, new_vendor_boot_image_path,
- config->assembly_dir(), instance.instance_dir(), boot_config_vector,
- config->bootconfig_supported());
- CHECK(success)
- << "Failed to regenerate the vendor boot image without a ramdisk";
+ new_vendor_boot_image_path, config_.assembly_dir(),
+ config_.bootconfig_supported());
+ if (!success) {
+ LOG(ERROR) << "Failed to regenerate the vendor boot image with the "
+ "new ramdisk";
+ } else {
+ // This control flow implies a kernel with all configs built in.
+ // If it's just the kernel, repack the vendor boot image without a
+ // ramdisk.
+ bool success = RepackVendorBootImageWithEmptyRamdisk(
+ FLAGS_vendor_boot_image, new_vendor_boot_image_path,
+ config_.assembly_dir(), config_.bootconfig_supported());
+ if (!success) {
+ LOG(ERROR) << "Failed to regenerate the vendor boot image without "
+ "a ramdisk";
+ return false;
+ }
+ }
+ SetCommandLineOptionWithMode(
+ "vendor_boot_image", new_vendor_boot_image_path.c_str(),
+ google::FlagSettingMode::SET_FLAGS_DEFAULT);
}
- } else {
- // Repack the vendor boot image to add the instance specific bootconfig
- // parameters
- bool success = RepackVendorBootImage(
- std::string(), FLAGS_vendor_boot_image, new_vendor_boot_image_path,
- config->assembly_dir(), instance.instance_dir(), boot_config_vector,
- config->bootconfig_supported());
- CHECK(success) << "Failed to regenerate the vendor boot image";
}
+ return true;
}
+
+ private:
+ const CuttlefishConfig& config_;
+};
+
+class GeneratePersistentBootconfig : public Feature {
+ public:
+ INJECT(GeneratePersistentBootconfig(
+ const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // Feature
+ std::string Name() const override { return "GeneratePersistentBootconfig"; }
+ bool Enabled() const override { return !config_.protected_vm(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ const auto bootconfig_path = instance_.persistent_bootconfig_path();
+ if (!FileExists(bootconfig_path)) {
+ if (!CreateBlankImage(bootconfig_path, 1 /* mb */, "none")) {
+ LOG(ERROR) << "Failed to create image at " << bootconfig_path;
+ return false;
+ }
+ }
+
+ auto bootconfig_fd = SharedFD::Open(bootconfig_path, O_RDWR);
+ if (!bootconfig_fd->IsOpen()) {
+ LOG(ERROR) << "Unable to open bootconfig file: "
+ << bootconfig_fd->StrError();
+ return false;
+ }
+
+ // Cuttlefish for the time being won't be able to support OTA from a
+ // non-bootconfig kernel to a bootconfig-kernel (or vice versa) IF the
+ // device is stopped (via stop_cvd). This is rarely an issue since OTA
+ // testing run on cuttlefish is done within one launch cycle of the device.
+ // If this ever becomes an issue, this code will have to be rewritten.
+ if (!config_.bootconfig_supported()) {
+ return true;
+ }
+
+ const std::string bootconfig =
+ android::base::Join(BootconfigArgsFromConfig(config_, instance_),
+ "\n") +
+ "\n";
+ ssize_t bytesWritten = WriteAll(bootconfig_fd, bootconfig);
+ if (bytesWritten != bootconfig.size()) {
+ LOG(ERROR) << "Failed to write contents of bootconfig to \""
+ << bootconfig_path << "\"";
+ return false;
+ }
+ LOG(DEBUG) << "Bootconfig parameters from vendor boot image and config are "
+ << ReadFile(bootconfig_path);
+
+ const off_t bootconfig_size_bytes =
+ AlignToPowerOf2(bootconfig.size(), PARTITION_SIZE_SHIFT);
+ if (bootconfig_fd->Truncate(bootconfig_size_bytes) != 0) {
+ LOG(ERROR) << "`truncate --size=" << bootconfig_size_bytes << " bytes "
+ << bootconfig_path << "` failed:" << bootconfig_fd->StrError();
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+class InitializeMetadataImage : public Feature {
+ public:
+ INJECT(InitializeMetadataImage()) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeMetadataImage"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ if (!FileExists(FLAGS_metadata_image)) {
+ bool success = CreateBlankImage(FLAGS_metadata_image,
+ FLAGS_blank_metadata_image_mb, "none");
+ if (!success) {
+ LOG(ERROR) << "Failed to create \"" << FLAGS_metadata_image
+ << "\" with size " << FLAGS_blank_metadata_image_mb;
+ }
+ return success;
+ }
+ return true;
+ }
+};
+
+class InitializeAccessKregistryImage : public Feature {
+ public:
+ INJECT(InitializeAccessKregistryImage(
+ const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeAccessKregistryImage"; }
+ bool Enabled() const override { return !config_.protected_vm(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() {
+ if (FileExists(instance_.access_kregistry_path())) {
+ return true;
+ }
+ bool success =
+ CreateBlankImage(instance_.access_kregistry_path(), 2 /* mb */, "none");
+ if (!success) {
+ LOG(ERROR) << "Failed to create access_kregistry_path \""
+ << instance_.access_kregistry_path() << "\"";
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+class InitializePstore : public Feature {
+ public:
+ INJECT(InitializePstore(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // Feature
+ std::string Name() const override { return "InitializePstore"; }
+ bool Enabled() const override { return !config_.protected_vm(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() {
+ if (FileExists(instance_.pstore_path())) {
+ return true;
+ }
+ bool success =
+ CreateBlankImage(instance_.pstore_path(), 2 /* mb */, "none");
+ if (!success) {
+ LOG(ERROR) << "Failed to create pstore_path \"" << instance_.pstore_path()
+ << "\"";
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+class InitializeSdCard : public Feature {
+ public:
+ INJECT(InitializeSdCard(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeSdCard"; }
+ bool Enabled() const override {
+ return FLAGS_use_sdcard && !config_.protected_vm();
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() {
+ if (FileExists(instance_.sdcard_path())) {
+ return true;
+ }
+ bool success = CreateBlankImage(instance_.sdcard_path(),
+ FLAGS_blank_sdcard_image_mb, "sdcard");
+ if (!success) {
+ LOG(ERROR) << "Failed to create sdcard \"" << instance_.sdcard_path()
+ << "\"";
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+class InitializeFactoryResetProtected : public Feature {
+ public:
+ INJECT(InitializeFactoryResetProtected(
+ const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeSdCard"; }
+ bool Enabled() const override { return !config_.protected_vm(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() {
+ if (FileExists(instance_.factory_reset_protected_path())) {
+ return true;
+ }
+ bool success = CreateBlankImage(instance_.factory_reset_protected_path(),
+ 1 /* mb */, "none");
+ if (!success) {
+ LOG(ERROR) << "Failed to create FRP \""
+ << instance_.factory_reset_protected_path() << "\"";
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+static fruit::Component<> DiskChangesComponent(const FetcherConfig* fetcher,
+ const CuttlefishConfig* config) {
+ return fruit::createComponent()
+ .bindInstance(*fetcher)
+ .bindInstance(*config)
+ .addMultibinding<Feature, InitializeMetadataImage>()
+ .addMultibinding<Feature, BootImageRepacker>()
+ .install(FixedMiscImagePathComponent, &FLAGS_misc_image)
+ .install(InitializeMiscImageComponent)
+ .install(FixedDataImagePathComponent, &FLAGS_data_image)
+ .install(InitializeDataImageComponent)
+ // Create esp if necessary
+ .install(InitializeEspImageComponent, &FLAGS_otheros_esp_image,
+ &FLAGS_otheros_kernel_path, &FLAGS_otheros_initramfs_path,
+ &FLAGS_otheros_root_image);
+}
+
+static fruit::Component<> DiskChangesPerInstanceComponent(
+ const FetcherConfig* fetcher, const CuttlefishConfig* config,
+ const CuttlefishConfig::InstanceSpecific* instance) {
+ return fruit::createComponent()
+ .bindInstance(*fetcher)
+ .bindInstance(*config)
+ .bindInstance(*instance)
+ .addMultibinding<Feature, InitializeAccessKregistryImage>()
+ .addMultibinding<Feature, InitializePstore>()
+ .addMultibinding<Feature, InitializeSdCard>()
+ .addMultibinding<Feature, InitializeFactoryResetProtected>()
+ .addMultibinding<Feature, GeneratePersistentBootconfig>()
+ .install(InitBootloaderEnvPartitionComponent);
}
void CreateDynamicDiskFiles(const FetcherConfig& fetcher_config,
- const CuttlefishConfig* config) {
- // Create misc if necessary
- CHECK(InitializeMiscImage(FLAGS_misc_image)) << "Failed to create misc image";
+ const CuttlefishConfig& config) {
+ // TODO(schuffelen): Unify this with the other injector created in
+ // assemble_cvd.cpp
+ fruit::Injector<> injector(DiskChangesComponent, &fetcher_config, &config);
- // Create data if necessary
- DataImageResult dataImageResult = ApplyDataImagePolicy(*config, FLAGS_data_image);
- CHECK(dataImageResult != DataImageResult::Error) << "Failed to set up userdata";
+ const auto& features = injector.getMultibindings<Feature>();
+ CHECK(Feature::RunSetup(features)) << "Failed to run feature setup.";
- if (!FileExists(FLAGS_metadata_image)) {
- CreateBlankImage(FLAGS_metadata_image, FLAGS_blank_metadata_image_mb, "none");
+ for (const auto& instance : config.Instances()) {
+ fruit::Injector<> instance_injector(DiskChangesPerInstanceComponent,
+ &fetcher_config, &config, &instance);
+ const auto& instance_features =
+ instance_injector.getMultibindings<Feature>();
+ CHECK(Feature::RunSetup(instance_features))
+ << "Failed to run instance feature setup.";
}
- // If we are booting a protected VM, for now, assume we want a super minimal
- // environment with no userdata encryption, limited debug, no FRP emulation, a
- // static env for the bootloader, no SD-Card and no resume-on-reboot HAL
- // support. We can also assume that image repacking isn't trusted. Repacking
- // requires resigning the image and keys from an android host aren't trusted.
- if (!FLAGS_protected_vm) {
- RepackAllBootImages(config);
-
- for (const auto& instance : config->Instances()) {
- if (!FileExists(instance.access_kregistry_path())) {
- CreateBlankImage(instance.access_kregistry_path(), 2 /* mb */, "none");
- }
-
- if (!FileExists(instance.pstore_path())) {
- CreateBlankImage(instance.pstore_path(), 2 /* mb */, "none");
- }
-
- if (FLAGS_use_sdcard && !FileExists(instance.sdcard_path())) {
- CreateBlankImage(instance.sdcard_path(),
- FLAGS_blank_sdcard_image_mb, "sdcard");
- }
-
- CHECK(InitBootloaderEnvPartition(*config, instance))
- << "Failed to create bootloader environment partition";
-
- const auto frp = instance.factory_reset_protected_path();
- if (!FileExists(frp)) {
- CreateBlankImage(frp, 1 /* mb */, "none");
- }
-
- const auto bootconfig_path = instance.persistent_bootconfig_path();
- if (!FileExists(bootconfig_path)) {
- CreateBlankImage(bootconfig_path, 1 /* mb */, "none");
- }
-
- auto bootconfig_fd = SharedFD::Open(bootconfig_path, O_RDWR);
- CHECK(bootconfig_fd->IsOpen())
- << "Unable to open bootconfig file: " << bootconfig_fd->StrError();
-
- const std::string bootconfig =
- android::base::Join(BootconfigArgsFromConfig(*config, instance),
- "\n") +
- "\n";
- ssize_t bytesWritten = WriteAll(bootconfig_fd, bootconfig);
- CHECK(bytesWritten == bootconfig.size());
- LOG(DEBUG)
- << "Bootconfig parameters from vendor boot image and config are "
- << ReadFile(bootconfig_path);
-
- const off_t bootconfig_size_bytes =
- AlignToPowerOf2(bootconfig.size(), PARTITION_SIZE_SHIFT);
- CHECK(bootconfig_fd->Truncate(bootconfig_size_bytes) == 0)
- << "`truncate --size=" << bootconfig_size_bytes << " bytes "
- << bootconfig_path << "` failed:" << bootconfig_fd->StrError();
- }
- }
-
- for (const auto& instance : config->Instances()) {
+ for (const auto& instance : config.Instances()) {
bool compositeMatchesDiskConfig = DoesCompositeMatchCurrentDiskConfig(
instance.PerInstancePath("persistent_composite_disk_config.txt"),
persistent_composite_disk_config(instance));
@@ -515,7 +763,7 @@
persistent_composite_disk_config(instance));
if (!compositeMatchesDiskConfig || oldCompositeDisk) {
- CHECK(CreatePersistentCompositeDisk(*config, instance))
+ CHECK(CreatePersistentCompositeDisk(config, instance))
<< "Failed to create persistent composite disk";
}
}
@@ -534,33 +782,26 @@
CHECK(FileHasContent(FLAGS_bootloader))
<< "File not found: " << FLAGS_bootloader;
- if (!FLAGS_esp.empty()) {
- CHECK(FileHasContent(FLAGS_esp))
- << "File not found: " << FLAGS_esp;
- }
-
- if (SuperImageNeedsRebuilding(fetcher_config, *config)) {
- bool success = RebuildSuperImage(fetcher_config, *config, FLAGS_super_image);
+ if (SuperImageNeedsRebuilding(fetcher_config, config)) {
+ bool success = RebuildSuperImage(fetcher_config, config, FLAGS_super_image);
CHECK(success) << "Super image rebuilding requested but could not be completed.";
}
- bool newDataImage = dataImageResult == DataImageResult::FileUpdated;
+ bool oldOsCompositeDisk = ShouldCreateOsCompositeDisk(config);
+ bool osCompositeMatchesDiskConfig = DoesCompositeMatchCurrentDiskConfig(
+ config.AssemblyPath("os_composite_disk_config.txt"),
+ GetOsCompositeDiskConfig());
+ if (!osCompositeMatchesDiskConfig || oldOsCompositeDisk || !FLAGS_resume) {
+ CHECK(CreateOsCompositeDisk(config))
+ << "Failed to create OS composite disk";
- for (auto instance : config->Instances()) {
- bool compositeMatchesDiskConfig = DoesCompositeMatchCurrentDiskConfig(
- instance.PerInstancePath("os_composite_disk_config.txt"),
- os_composite_disk_config(instance));
- bool oldCompositeDisk = ShouldCreateCompositeDisk(
- instance.os_composite_disk_path(), os_composite_disk_config(instance));
- if (!compositeMatchesDiskConfig || oldCompositeDisk || !FLAGS_resume || newDataImage) {
+ for (auto instance : config.Instances()) {
if (FLAGS_resume) {
LOG(INFO) << "Requested to continue an existing session, (the default) "
<< "but the disk files have become out of date. Wiping the "
<< "old session files and starting a new session for device "
<< instance.serial_number();
}
- CHECK(CreateCompositeDisk(*config, instance))
- << "Failed to create composite disk";
if (FileExists(instance.access_kregistry_path())) {
CreateBlankImage(instance.access_kregistry_path(), 2 /* mb */, "none");
}
@@ -571,19 +812,16 @@
}
if (!FLAGS_protected_vm) {
- for (auto instance : config->Instances()) {
- auto overlay_path = instance.PerInstancePath("overlay.img");
- bool missingOverlay = !FileExists(overlay_path);
- bool newOverlay = FileModificationTime(overlay_path) <
- FileModificationTime(instance.os_composite_disk_path());
- if (missingOverlay || !FLAGS_resume || newOverlay) {
- CreateQcowOverlay(config->crosvm_binary(),
- instance.os_composite_disk_path(), overlay_path);
+ for (auto instance : config.Instances()) {
+ create_overlay_image(config, instance.PerInstancePath("overlay.img"));
+ if (instance.start_ap()) {
+ create_overlay_image(config,
+ instance.PerInstancePath("ap_overlay.img"));
}
}
}
- for (auto instance : config->Instances()) {
+ for (auto instance : config.Instances()) {
// Check that the files exist
for (const auto& file : instance.virtual_disk_paths()) {
if (!file.empty()) {
diff --git a/host/commands/assemble_cvd/disk_flags.h b/host/commands/assemble_cvd/disk_flags.h
index 3491c3a..3b6bb3c 100644
--- a/host/commands/assemble_cvd/disk_flags.h
+++ b/host/commands/assemble_cvd/disk_flags.h
@@ -22,12 +22,14 @@
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/fetcher_config.h"
+#include "host/libs/image_aggregator/image_aggregator.h"
namespace cuttlefish {
bool ResolveInstanceFiles();
-bool ShouldCreateAllCompositeDisks(const CuttlefishConfig& config);
+bool ShouldCreateOsCompositeDisk(const CuttlefishConfig& config);
void CreateDynamicDiskFiles(const FetcherConfig& fetcher_config,
- const CuttlefishConfig* config);
+ const CuttlefishConfig& config);
+std::vector<ImagePartition> GetOsCompositeDiskConfig();
} // namespace cuttlefish
diff --git a/host/commands/assemble_cvd/flag_feature.cpp b/host/commands/assemble_cvd/flag_feature.cpp
new file mode 100644
index 0000000..a81c4a1
--- /dev/null
+++ b/host/commands/assemble_cvd/flag_feature.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "host/commands/assemble_cvd/flag_feature.h"
+
+#include <android-base/strings.h>
+#include <fruit/fruit.h>
+#include <gflags/gflags.h>
+#include <string.h>
+#include <string>
+#include <unordered_set>
+#include <vector>
+
+#include "host/libs/config/feature.h"
+
+namespace cuttlefish {
+
+static std::string XmlEscape(const std::string& s) {
+ using android::base::StringReplace;
+ return StringReplace(StringReplace(s, "<", "<", true), ">", ">", true);
+}
+
+class ParseGflagsImpl : public ParseGflags {
+ public:
+ INJECT(ParseGflagsImpl(ConfigFlag& config)) : config_(config) {}
+
+ std::string Name() const override { return "ParseGflags"; }
+ std::unordered_set<FlagFeature*> Dependencies() const override {
+ return {static_cast<FlagFeature*>(&config_)};
+ }
+ bool Process(std::vector<std::string>& args) override {
+ std::string process_name = "assemble_cvd";
+ std::vector<char*> pseudo_argv = {process_name.data()};
+ for (auto& arg : args) {
+ pseudo_argv.push_back(arg.data());
+ }
+ int argc = pseudo_argv.size();
+ auto argv = pseudo_argv.data();
+ gflags::AllowCommandLineReparsing(); // Support future non-gflags flags
+ gflags::ParseCommandLineNonHelpFlags(&argc, &argv,
+ /* remove_flags */ false);
+ return true;
+ }
+ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {
+ // Lifted from external/gflags/src/gflags_reporting.cc:ShowXMLOfFlags
+ std::vector<gflags::CommandLineFlagInfo> flags;
+ gflags::GetAllFlags(&flags);
+ for (const auto& flag : flags) {
+ // From external/gflags/src/gflags_reporting.cc:DescribeOneFlagInXML
+ out << "<flag>\n";
+ out << " <file>" << XmlEscape(flag.filename) << "</file>\n";
+ out << " <name>" << XmlEscape(flag.name) << "</name>\n";
+ out << " <meaning>" << XmlEscape(flag.description) << "</meaning>\n";
+ out << " <default>" << XmlEscape(flag.default_value) << "</default>\n";
+ out << " <current>" << XmlEscape(flag.current_value) << "</current>\n";
+ out << " <type>" << XmlEscape(flag.type) << "</type>\n";
+ out << "</flag>\n";
+ }
+ return true;
+ }
+
+ private:
+ ConfigFlag& config_;
+};
+
+fruit::Component<fruit::Required<ConfigFlag>, ParseGflags> GflagsComponent() {
+ return fruit::createComponent()
+ .bind<ParseGflags, ParseGflagsImpl>()
+ .addMultibinding<FlagFeature, ParseGflags>();
+}
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.cpp b/host/commands/assemble_cvd/flag_feature.h
similarity index 67%
copy from common/libs/utils/size_utils.cpp
copy to host/commands/assemble_cvd/flag_feature.h
index 9f25445..da91a3d 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/commands/assemble_cvd/flag_feature.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,16 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#pragma once
-#include "common/libs/utils/size_utils.h"
+#include <fruit/fruit.h>
-#include <unistd.h>
+#include "host/libs/config/config_flag.h"
+#include "host/libs/config/feature.h"
namespace cuttlefish {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+class ParseGflags : public FlagFeature {};
+
+fruit::Component<fruit::Required<ConfigFlag>, ParseGflags> GflagsComponent();
} // namespace cuttlefish
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index b12dfd2..eb08d93 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -19,12 +19,16 @@
#include <sstream>
#include <unordered_map>
+#include <fruit/fruit.h>
+
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
#include "host/commands/assemble_cvd/alloc.h"
#include "host/commands/assemble_cvd/boot_config.h"
#include "host/commands/assemble_cvd/clean.h"
#include "host/commands/assemble_cvd/disk_flags.h"
+#include "host/libs/config/config_flag.h"
#include "host/libs/config/host_tools_version.h"
#include "host/libs/graphics_detector/graphics_detector.h"
#include "host/libs/vm_manager/crosvm_manager.h"
@@ -36,12 +40,7 @@
using cuttlefish::StringFromEnv;
using cuttlefish::vm_manager::CrosvmManager;
using google::FlagSettingMode::SET_FLAGS_DEFAULT;
-
-DEFINE_string(config, "phone",
- "Config preset name. Will automatically set flag fields "
- "using the values from this file of presets. See "
- "device/google/cuttlefish/shared/config/config_*.json "
- "for possible values.");
+using google::FlagSettingMode::SET_FLAGS_VALUE;
DEFINE_int32(cpus, 2, "Virtual CPU count.");
DEFINE_string(data_policy, "use_existing", "How to handle userdata partition."
@@ -49,8 +48,6 @@
"'always_create'.");
DEFINE_int32(blank_data_image_mb, 0,
"The size of the blank data image to generate, MB.");
-DEFINE_string(blank_data_image_fmt, "f2fs",
- "The fs format for the blank data image. Used with mkfs.");
DEFINE_int32(gdb_port, 0,
"Port number to spawn kernel gdb on e.g. -gdb_port=1234. The"
"kernel must have been built with CONFIG_RANDOMIZE_BASE "
@@ -85,6 +82,10 @@
DEFINE_string(initramfs_path, "", "Path to the initramfs");
DEFINE_string(extra_kernel_cmdline, "",
"Additional flags to put on the kernel command line");
+DEFINE_string(extra_bootconfig_args, "",
+ "Space-separated list of extra bootconfig args. "
+ "Note: overwriting an existing bootconfig argument "
+ "requires ':=' instead of '='.");
DEFINE_bool(guest_enforce_security, true,
"Whether to run in enforcing mode (non permissive).");
DEFINE_bool(guest_audit_security, true,
@@ -99,14 +100,19 @@
DEFINE_string(gpu_mode, cuttlefish::kGpuModeAuto,
"What gpu configuration to use, one of {auto, drm_virgl, "
"gfxstream, guest_swiftshader}");
+DEFINE_string(hwcomposer, cuttlefish::kHwComposerAuto,
+ "What hardware composer to use, one of {auto, drm, ranchu} ");
+DEFINE_string(gpu_capture_binary, "",
+ "Path to the GPU capture binary to use when capturing GPU traces"
+ "(ngfx, renderdoc, etc)");
+DEFINE_bool(enable_gpu_udmabuf,
+ false,
+ "Use the udmabuf driver for zero-copy virtio-gpu");
DEFINE_bool(deprecated_boot_completed, false, "Log boot completed message to"
" host kernel. This is only used during transition of our clients."
" Will be deprecated soon.");
-DEFINE_bool(start_vnc_server, false, "Whether to start the vnc server process. "
- "The VNC server runs at port 6443 + i for "
- "the vsoc-i user or CUTTLEFISH_INSTANCE=i, "
- "starting from 1.");
+
DEFINE_bool(use_allocd, false,
"Acquire static resources from the resource allocator daemon.");
DEFINE_bool(enable_minimal_mode, false,
@@ -173,13 +179,17 @@
false,
"[Experimental] If enabled, exposes local adb service through a websocket.");
+static constexpr auto HOST_OPERATOR_SOCKET_PATH = "/run/cuttlefish/operator";
+
DEFINE_bool(
- start_webrtc_sig_server, false,
+ // The actual default for this flag is set with SetCommandLineOption() in
+ // GetKernelConfigsAndSetDefaults() at the end of this file.
+ start_webrtc_sig_server, true,
"Whether to start the webrtc signaling server. This option only applies to "
"the first instance, if multiple instances are launched they'll share the "
"same signaling server, which is owned by the first one.");
-DEFINE_string(webrtc_sig_server_addr, "0.0.0.0",
+DEFINE_string(webrtc_sig_server_addr, "",
"The address of the webrtc signaling server.");
DEFINE_int32(
@@ -202,9 +212,13 @@
"The path section of the URL where the device should be "
"registered with the signaling server.");
+DEFINE_bool(webrtc_sig_server_secure, true,
+ "Whether the WebRTC signaling server uses secure protocols (WSS vs WS).");
+
DEFINE_bool(verify_sig_server_certificate, false,
"Whether to verify the signaling server's certificate with a "
- "trusted signing authority (Disallow self signed certificates).");
+ "trusted signing authority (Disallow self signed certificates). "
+ "This is ignored if an insecure server is configured.");
DEFINE_string(sig_server_headers_file, "",
"Path to a file containing HTTP headers to be included in the "
@@ -217,25 +231,12 @@
"appearance of the substring '{num}' in the device id will be substituted "
"with the instance number to support multiple instances");
-DEFINE_string(adb_mode, "vsock_half_tunnel",
- "Mode for ADB connection."
- "'vsock_tunnel' for a TCP connection tunneled through vsock, "
- "'native_vsock' for a direct connection to the guest ADB over "
- "vsock, 'vsock_half_tunnel' for a TCP connection forwarded to "
- "the guest ADB server, or a comma separated list of types as in "
- "'native_vsock,vsock_half_tunnel'");
-DEFINE_bool(run_adb_connector, !cuttlefish::IsRunningInContainer(),
- "Maintain adb connection by sending 'adb connect' commands to the "
- "server. Only relevant with -adb_mode=tunnel or vsock_tunnel");
-
DEFINE_string(uuid, cuttlefish::ForCurrentInstance(cuttlefish::kDefaultUuidPrefix),
"UUID to use for the device. Random if not specified");
DEFINE_bool(daemon, false,
"Run cuttlefish in background, the launcher exits on boot "
"completed/failed");
-DEFINE_string(device_title, "", "Human readable name for the instance, "
- "used by the vnc_server for its server title");
DEFINE_string(setupwizard_mode, "DISABLED",
"One of DISABLED,OPTIONAL,REQUIRED");
@@ -247,17 +248,6 @@
DEFINE_bool(restart_subprocesses, true, "Restart any crashed host process");
DEFINE_bool(enable_vehicle_hal_grpc_server, true, "Enables the vehicle HAL "
"emulation gRPC server on the host");
-DEFINE_string(custom_action_config, "",
- "Path to a custom action config JSON. Defaults to the file provided by "
- "build variable CVD_CUSTOM_ACTION_CONFIG. If this build variable "
- "is empty then the custom action config will be empty as well.");
-DEFINE_string(custom_actions, "",
- "Serialized JSON of an array of custom action objects (in the "
- "same format as custom action config JSON files). For use "
- "within --config preset config files; prefer "
- "--custom_action_config to specify a custom config file on the "
- "command line. Actions in this flag are combined with actions "
- "in --custom_action_config.");
DEFINE_string(bootloader, "", "Bootloader binary path");
DEFINE_string(boot_slot, "", "Force booting into the given slot. If empty, "
"the slot will be chosen based on the misc partition if using a "
@@ -287,6 +277,21 @@
DEFINE_bool(vhost_net, false, "Enable vhost acceleration of networking");
+DEFINE_string(
+ vhost_user_mac80211_hwsim, "",
+ "Unix socket path for vhost-user of mac80211_hwsim, typically served by "
+ "wmediumd. You can set this when using an external wmediumd instance.");
+DEFINE_string(wmediumd_config, "",
+ "Path to the wmediumd config file. When missing, the default "
+ "configuration is used which adds MAC addresses for up to 16 "
+ "cuttlefish instances including AP.");
+DEFINE_string(ap_rootfs_image,
+ DefaultHostArtifactsPath("etc/openwrt/images/openwrt_rootfs"),
+ "rootfs image for AP instance");
+DEFINE_string(ap_kernel_image,
+ DefaultHostArtifactsPath("etc/openwrt/images/kernel_for_openwrt"),
+ "kernel image for AP instance");
+
DEFINE_bool(record_screen, false, "Enable screen recording. "
"Requires --start_webrtc");
@@ -321,6 +326,8 @@
DEFINE_uint32(camera_server_port, 0, "camera vsock port");
+DEFINE_string(userdata_format, "f2fs", "The userdata filesystem format");
+
DECLARE_string(assembly_dir);
DECLARE_string(boot_image);
DECLARE_string(system_image_dir);
@@ -331,10 +338,6 @@
namespace {
-bool IsFlagSet(const std::string& flag) {
- return !gflags::GetCommandLineFlagInfoOrDie(flag.c_str()).is_default;
-}
-
std::pair<uint16_t, uint16_t> ParsePortRange(const std::string& flag) {
static const std::regex rgx("[0-9]+:[0-9]+");
CHECK(std::regex_match(flag, rgx))
@@ -348,11 +351,6 @@
return port_range;
}
-int NumStreamers() {
- auto start_flags = {FLAGS_start_vnc_server, FLAGS_start_webrtc};
- return std::count(start_flags.begin(), start_flags.end(), true);
-}
-
std::string StrForInstance(const std::string& prefix, int num) {
std::ostringstream stream;
stream << prefix << std::setfill('0') << std::setw(2) << num;
@@ -469,13 +467,17 @@
} // namespace
CuttlefishConfig InitializeCuttlefishConfiguration(
- const std::string& instance_dir, int modem_simulator_count,
- KernelConfig kernel_config) {
- // At most one streamer can be started.
- CHECK(NumStreamers() <= 1);
-
+ const std::string& root_dir, int modem_simulator_count,
+ KernelConfig kernel_config, fruit::Injector<>& injector) {
CuttlefishConfig tmp_config_obj;
- tmp_config_obj.set_assembly_dir(FLAGS_assembly_dir);
+
+ for (const auto& fragment : injector.getMultibindings<ConfigFragment>()) {
+ CHECK(tmp_config_obj.SaveFragment(*fragment))
+ << "Failed to save fragment " << fragment->Name();
+ }
+
+ tmp_config_obj.set_root_dir(root_dir);
+
tmp_config_obj.set_target_arch(kernel_config.target_arch);
tmp_config_obj.set_bootconfig_supported(kernel_config.bootconfig_supported);
auto vmm = GetVmManager(FLAGS_vm_manager, kernel_config.target_arch);
@@ -521,10 +523,9 @@
const GraphicsAvailability graphics_availability =
GetGraphicsAvailabilityWithSubprocessCheck();
- LOG(VERBOSE) << graphics_availability;
+ LOG(DEBUG) << graphics_availability;
tmp_config_obj.set_gpu_mode(FLAGS_gpu_mode);
-
if (tmp_config_obj.gpu_mode() != kGpuModeAuto &&
tmp_config_obj.gpu_mode() != kGpuModeDrmVirgl &&
tmp_config_obj.gpu_mode() != kGpuModeGfxStream &&
@@ -559,15 +560,48 @@
"--gpu_mode=auto or --gpu_mode=guest_swiftshader.";
}
}
+
+ tmp_config_obj.set_restart_subprocesses(FLAGS_restart_subprocesses);
+ tmp_config_obj.set_gpu_capture_binary(FLAGS_gpu_capture_binary);
+ if (!tmp_config_obj.gpu_capture_binary().empty()) {
+ CHECK(tmp_config_obj.gpu_mode() == kGpuModeGfxStream)
+ << "GPU capture only supported with --gpu_mode=gfxstream";
+
+ // GPU capture runs in a detached mode where the "launcher" process
+ // intentionally exits immediately.
+ CHECK(!tmp_config_obj.restart_subprocesses())
+ << "GPU capture only supported with --norestart_subprocesses";
+ }
+
+ tmp_config_obj.set_hwcomposer(FLAGS_hwcomposer);
+ if (!tmp_config_obj.hwcomposer().empty()) {
+ if (tmp_config_obj.hwcomposer() == kHwComposerRanchu) {
+ CHECK(tmp_config_obj.gpu_mode() != kGpuModeDrmVirgl)
+ << "ranchu hwcomposer not supported with --gpu_mode=drm_virgl";
+ }
+ }
+
+ if (tmp_config_obj.hwcomposer() == kHwComposerAuto) {
+ if (tmp_config_obj.gpu_mode() == kGpuModeDrmVirgl) {
+ tmp_config_obj.set_hwcomposer(kHwComposerDrmMinigbm);
+ } else {
+ tmp_config_obj.set_hwcomposer(kHwComposerRanchu);
+ }
+ }
+
+ tmp_config_obj.set_enable_gpu_udmabuf(FLAGS_enable_gpu_udmabuf);
+
// Sepolicy rules need to be updated to support gpu mode. Temporarily disable
// auto-enabling sandbox when gpu is enabled (b/152323505).
if (tmp_config_obj.gpu_mode() != kGpuModeGuestSwiftshader) {
SetCommandLineOptionWithMode("enable_sandbox", "false", SET_FLAGS_DEFAULT);
}
- if (vmm->ConfigureGpuMode(tmp_config_obj.gpu_mode()).empty()) {
- LOG(FATAL) << "Invalid gpu_mode=" << FLAGS_gpu_mode <<
- " does not work with vm_manager=" << FLAGS_vm_manager;
+ if (vmm->ConfigureGraphics(tmp_config_obj.gpu_mode(),
+ tmp_config_obj.hwcomposer()).empty()) {
+ LOG(FATAL) << "Invalid (gpu_mode=," << FLAGS_gpu_mode <<
+ " hwcomposer= " << FLAGS_hwcomposer <<
+ ") does not work with vm_manager=" << FLAGS_vm_manager;
}
CHECK(!FLAGS_smt || FLAGS_cpus % 2 == 0)
@@ -585,12 +619,10 @@
tmp_config_obj.set_gdb_port(FLAGS_gdb_port);
- std::vector<std::string> adb = android::base::Split(FLAGS_adb_mode, ",");
- tmp_config_obj.set_adb_mode(std::set<std::string>(adb.begin(), adb.end()));
-
tmp_config_obj.set_guest_enforce_security(FLAGS_guest_enforce_security);
tmp_config_obj.set_guest_audit_security(FLAGS_guest_audit_security);
tmp_config_obj.set_extra_kernel_cmdline(FLAGS_extra_kernel_cmdline);
+ tmp_config_obj.set_extra_bootconfig_args(FLAGS_extra_bootconfig_args);
if (FLAGS_console) {
SetCommandLineOptionWithMode("enable_sandbox", "false", SET_FLAGS_DEFAULT);
@@ -607,13 +639,12 @@
tmp_config_obj.set_crosvm_binary(FLAGS_crosvm_binary);
tmp_config_obj.set_tpm_device(FLAGS_tpm_device);
- tmp_config_obj.set_enable_vnc_server(FLAGS_start_vnc_server);
-
tmp_config_obj.set_seccomp_policy_dir(FLAGS_seccomp_policy_dir);
tmp_config_obj.set_enable_webrtc(FLAGS_start_webrtc);
tmp_config_obj.set_webrtc_assets_dir(FLAGS_webrtc_assets_dir);
tmp_config_obj.set_webrtc_certs_dir(FLAGS_webrtc_certs_dir);
+ tmp_config_obj.set_sig_server_secure(FLAGS_webrtc_sig_server_secure);
// Note: This will be overridden if the sig server is started by us
tmp_config_obj.set_sig_server_port(FLAGS_webrtc_sig_server_port);
tmp_config_obj.set_sig_server_address(FLAGS_webrtc_sig_server_addr);
@@ -634,71 +665,15 @@
tmp_config_obj.set_webrtc_enable_adb_websocket(
FLAGS_webrtc_enable_adb_websocket);
- tmp_config_obj.set_restart_subprocesses(FLAGS_restart_subprocesses);
- tmp_config_obj.set_run_adb_connector(FLAGS_run_adb_connector);
tmp_config_obj.set_run_as_daemon(FLAGS_daemon);
tmp_config_obj.set_data_policy(FLAGS_data_policy);
tmp_config_obj.set_blank_data_image_mb(FLAGS_blank_data_image_mb);
- tmp_config_obj.set_blank_data_image_fmt(FLAGS_blank_data_image_fmt);
tmp_config_obj.set_enable_gnss_grpc_proxy(FLAGS_start_gnss_proxy);
- tmp_config_obj.set_enable_vehicle_hal_grpc_server(FLAGS_enable_vehicle_hal_grpc_server);
- tmp_config_obj.set_vehicle_hal_grpc_server_binary(
- HostBinaryPath("android.hardware.automotive.vehicle@2.0-virtualization-grpc-server"));
-
- std::string custom_action_config;
- if (!FLAGS_custom_action_config.empty()) {
- custom_action_config = FLAGS_custom_action_config;
- } else {
- std::string custom_action_config_dir =
- DefaultHostArtifactsPath("etc/cvd_custom_action_config");
- if (DirectoryExists(custom_action_config_dir)) {
- auto custom_action_configs = DirectoryContents(custom_action_config_dir);
- // Two entries are always . and ..
- if (custom_action_configs.size() > 3) {
- LOG(ERROR) << "Expected at most one custom action config in "
- << custom_action_config_dir << ". Please delete extras.";
- } else if (custom_action_configs.size() == 3) {
- for (const auto& config : custom_action_configs) {
- if (android::base::EndsWithIgnoreCase(config, ".json")) {
- custom_action_config = custom_action_config_dir + "/" + config;
- }
- }
- }
- }
- }
- std::vector<CustomActionConfig> custom_actions;
- Json::CharReaderBuilder builder;
- Json::Value custom_action_array(Json::arrayValue);
- if (custom_action_config != "") {
- // Load the custom action config JSON.
- std::ifstream ifs(custom_action_config);
- std::string errorMessage;
- if (!Json::parseFromStream(builder, ifs, &custom_action_array, &errorMessage)) {
- LOG(FATAL) << "Could not read custom actions config file "
- << custom_action_config << ": "
- << errorMessage;
- }
- for (const auto& custom_action : custom_action_array) {
- custom_actions.push_back(CustomActionConfig(custom_action));
- }
- }
- if (FLAGS_custom_actions != "") {
- // Load the custom action from the --config preset file.
- std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
- std::string errorMessage;
- if (!reader->parse(&*FLAGS_custom_actions.begin(), &*FLAGS_custom_actions.end(),
- &custom_action_array, &errorMessage)) {
- LOG(FATAL) << "Could not read custom actions config flag: "
- << errorMessage;
- }
- for (const auto& custom_action : custom_action_array) {
- custom_actions.push_back(CustomActionConfig(custom_action));
- }
- }
- tmp_config_obj.set_custom_actions(custom_actions);
+ tmp_config_obj.set_enable_vehicle_hal_grpc_server(
+ FLAGS_enable_vehicle_hal_grpc_server);
tmp_config_obj.set_bootloader(FLAGS_bootloader);
@@ -716,12 +691,26 @@
tmp_config_obj.set_vhost_net(FLAGS_vhost_net);
+ tmp_config_obj.set_vhost_user_mac80211_hwsim(FLAGS_vhost_user_mac80211_hwsim);
+
+ if ((FLAGS_ap_rootfs_image.empty()) != (FLAGS_ap_kernel_image.empty())) {
+ LOG(FATAL) << "Either both ap_rootfs_image and ap_kernel_image should be "
+ "set or neither should be set.";
+ }
+
+ tmp_config_obj.set_ap_rootfs_image(FLAGS_ap_rootfs_image);
+ tmp_config_obj.set_ap_kernel_image(FLAGS_ap_kernel_image);
+
+ tmp_config_obj.set_wmediumd_config(FLAGS_wmediumd_config);
+
tmp_config_obj.set_record_screen(FLAGS_record_screen);
tmp_config_obj.set_enable_host_bluetooth(FLAGS_enable_host_bluetooth);
tmp_config_obj.set_protected_vm(FLAGS_protected_vm);
+ tmp_config_obj.set_userdata_format(FLAGS_userdata_format);
+
std::vector<int> num_instances;
for (int i = 0; i < FLAGS_num_instances; i++) {
num_instances.push_back(GetInstance() + i);
@@ -743,10 +732,7 @@
auto instance = tmp_config_obj.ForInstance(num);
auto const_instance =
- const_cast<const CuttlefishConfig&>(tmp_config_obj)
- .ForInstance(num);
- // Set this first so that calls to PerInstancePath below are correct
- instance.set_instance_dir(instance_dir + "." + std::to_string(num));
+ const_cast<const CuttlefishConfig&>(tmp_config_obj).ForInstance(num);
instance.set_use_allocd(FLAGS_use_allocd);
if (FLAGS_use_random_serial) {
instance.set_serial_number(
@@ -770,17 +756,19 @@
instance.set_uuid(FLAGS_uuid);
- instance.set_vnc_server_port(6444 + num - 1);
- instance.set_host_port(6520 + num - 1);
+ instance.set_modem_simulator_host_id(1000 + num); // Must be 4 digits
+ // the deprecated vnc was 6444 + num - 1, and qemu_vnc was vnc - 5900
+ instance.set_qemu_vnc_server_port(544 + num - 1);
+ instance.set_adb_host_port(6520 + num - 1);
instance.set_adb_ip_and_port("0.0.0.0:" + std::to_string(6520 + num - 1));
+ instance.set_confui_host_vsock_port(7700 + num - 1);
instance.set_tombstone_receiver_port(calc_vsock_port(6600));
- instance.set_vehicle_hal_server_port(9210 + num - 1);
+ instance.set_vehicle_hal_server_port(9300 + num - 1);
instance.set_audiocontrol_server_port(9410); /* OK to use the same port number across instances */
instance.set_config_server_port(calc_vsock_port(6800));
if (tmp_config_obj.gpu_mode() != kGpuModeDrmVirgl &&
tmp_config_obj.gpu_mode() != kGpuModeGfxStream) {
- instance.set_frames_server_port(calc_vsock_port(6900));
if (FLAGS_vm_manager == QemuManager::name()) {
instance.set_keyboard_server_port(calc_vsock_port(7000));
instance.set_touch_server_port(calc_vsock_port(7100));
@@ -802,7 +790,6 @@
FLAGS_bluetooth_default_commands_file);
instance.set_camera_server_port(FLAGS_camera_server_port);
- instance.set_device_title(FLAGS_device_title);
if (FLAGS_protected_vm) {
instance.set_virtual_disk_paths(
@@ -818,14 +805,10 @@
instance.set_virtual_disk_paths(virtual_disk_paths);
}
- std::array<unsigned char, 6> mac_address;
- mac_address[0] = 1 << 6; // locally administered
- // TODO(schuffelen): Randomize these and preserve the state.
- for (int i = 1; i < 5; i++) {
- mac_address[i] = i;
- }
- mac_address[5] = num;
- instance.set_wifi_mac_address(mac_address);
+ // We'd like to set mac prefix to be 5554, 5555, 5556, ... in normal cases.
+ // When --base_instance_num=3, this might be 5556, 5557, 5558, ... (skipping
+ // first two)
+ instance.set_wifi_mac_prefix(5554 + (num - 1));
instance.set_start_webrtc_signaling_server(false);
@@ -840,14 +823,43 @@
}
instance.set_webrtc_device_id(device_id);
}
- if (FLAGS_start_webrtc_sig_server && is_first_instance) {
+ if (!is_first_instance || !FLAGS_start_webrtc) {
+ // Only the first instance starts the signaling server or proxy
+ instance.set_start_webrtc_signaling_server(false);
+ instance.set_start_webrtc_sig_server_proxy(false);
+ } else {
auto port = 8443 + num - 1;
// Change the signaling server port for all instances
tmp_config_obj.set_sig_server_port(port);
- instance.set_start_webrtc_signaling_server(true);
- } else {
- instance.set_start_webrtc_signaling_server(false);
+ // Either the signaling server or the proxy is started, never both
+ instance.set_start_webrtc_signaling_server(FLAGS_start_webrtc_sig_server);
+ // The proxy is only started if the host operator is available
+ instance.set_start_webrtc_sig_server_proxy(
+ cuttlefish::FileIsSocket(HOST_OPERATOR_SOCKET_PATH) &&
+ !FLAGS_start_webrtc_sig_server);
}
+
+ // Start wmediumd process for the first instance if
+ // vhost_user_mac80211_hwsim is not specified.
+ const bool start_wmediumd =
+ FLAGS_vhost_user_mac80211_hwsim.empty() && is_first_instance;
+ if (start_wmediumd) {
+ // TODO(b/199020470) move this to the directory for shared resources
+ auto vhost_user_socket_path =
+ const_instance.PerInstanceInternalPath("vhost_user_mac80211");
+ auto wmediumd_api_socket_path =
+ const_instance.PerInstanceInternalPath("wmediumd_api_server");
+
+ tmp_config_obj.set_vhost_user_mac80211_hwsim(vhost_user_socket_path);
+ tmp_config_obj.set_wmediumd_api_server_socket(wmediumd_api_socket_path);
+ instance.set_start_wmediumd(true);
+ } else {
+ instance.set_start_wmediumd(false);
+ }
+
+ instance.set_start_ap(!FLAGS_ap_rootfs_image.empty() &&
+ !FLAGS_ap_kernel_image.empty() && is_first_instance);
+
is_first_instance = false;
// instance.modem_simulator_ports := "" or "[port,]*port"
@@ -866,112 +878,61 @@
}
} // end of num_instances loop
+ std::vector<std::string> names;
+ for (const auto& instance : tmp_config_obj.Instances()) {
+ names.emplace_back(instance.instance_name());
+ }
+ tmp_config_obj.set_instance_names(names);
+
tmp_config_obj.set_enable_sandbox(FLAGS_enable_sandbox);
- // Audio is not available for VNC server
+ // Audio is not available for Arm64
SetCommandLineOptionWithMode(
"enable_audio",
- (FLAGS_start_vnc_server || (cuttlefish::HostArch() == cuttlefish::Arch::Arm64))
- ? "false"
- : "true",
+ (cuttlefish::HostArch() == cuttlefish::Arch::Arm64) ? "false" : "true",
SET_FLAGS_DEFAULT);
tmp_config_obj.set_enable_audio(FLAGS_enable_audio);
return tmp_config_obj;
}
-void SetDefaultFlagsFromConfigPreset() {
- std::string config_preset = FLAGS_config; // The name of the preset config.
- std::string config_file_path; // The path to the preset config JSON.
- std::set<std::string> allowed_config_presets;
- for (const std::string& file :
- DirectoryContents(DefaultHostArtifactsPath("etc/cvd_config"))) {
- std::string_view local_file(file);
- if (android::base::ConsumePrefix(&local_file, "cvd_config_") &&
- android::base::ConsumeSuffix(&local_file, ".json")) {
- allowed_config_presets.emplace(local_file);
- }
- }
-
- // If the user specifies a --config name, then use that config
- // preset option.
- std::string android_info_path = FLAGS_system_image_dir + "/android-info.txt";
- if (IsFlagSet("config")) {
- if (!allowed_config_presets.count(config_preset)) {
- LOG(FATAL) << "Invalid --config option '" << config_preset
- << "'. Valid options: "
- << android::base::Join(allowed_config_presets, ",");
- }
- } else if (FileExists(android_info_path)) {
- // Otherwise try to load the correct preset using android-info.txt.
- std::ifstream ifs(android_info_path);
- if (ifs.is_open()) {
- std::string android_info;
- ifs >> android_info;
- std::string_view local_android_info(android_info);
- if (android::base::ConsumePrefix(&local_android_info, "config=")) {
- config_preset = local_android_info;
- }
- if (!allowed_config_presets.count(config_preset)) {
- LOG(WARNING) << android_info_path
- << " contains invalid config preset: '"
- << local_android_info << "'. Defaulting to 'phone'.";
- config_preset = "phone";
- }
- }
- }
- LOG(INFO) << "Launching CVD using --config='" << config_preset << "'.";
-
- config_file_path = DefaultHostArtifactsPath("etc/cvd_config/cvd_config_" +
- config_preset + ".json");
- Json::Value config;
- Json::CharReaderBuilder builder;
- std::ifstream ifs(config_file_path);
- std::string errorMessage;
- if (!Json::parseFromStream(builder, ifs, &config, &errorMessage)) {
- LOG(FATAL) << "Could not read config file " << config_file_path << ": "
- << errorMessage;
- }
- for (const std::string& flag : config.getMemberNames()) {
- std::string value;
- if (flag == "custom_actions") {
- Json::StreamWriterBuilder factory;
- value = Json::writeString(factory, config[flag]);
- } else {
- value = config[flag].asString();
- }
- if (gflags::SetCommandLineOptionWithMode(flag.c_str(), value.c_str(),
- SET_FLAGS_DEFAULT)
- .empty()) {
- LOG(FATAL) << "Error setting flag '" << flag << "'.";
- }
- }
-}
-
-void SetDefaultFlagsForQemu() {
+void SetDefaultFlagsForQemu(Arch target_arch) {
// for now, we don't set non-default options for QEMU
- if (FLAGS_gpu_mode == kGpuModeGuestSwiftshader && NumStreamers() == 0) {
+ if (FLAGS_gpu_mode == kGpuModeGuestSwiftshader && !FLAGS_start_webrtc) {
// This makes WebRTC the default streamer unless the user requests
// another via a --star_<streamer> flag, while at the same time it's
// possible to run without any streamer by setting --start_webrtc=false.
SetCommandLineOptionWithMode("start_webrtc", "true", SET_FLAGS_DEFAULT);
}
- std::string default_bootloader = FLAGS_system_image_dir + "/bootloader.qemu";
+ std::string default_bootloader =
+ DefaultHostArtifactsPath("etc/bootloader_");
+ if(target_arch == Arch::Arm) {
+ // Bootloader is unstable >512MB RAM on 32-bit ARM
+ SetCommandLineOptionWithMode("memory_mb", "512", SET_FLAGS_VALUE);
+ default_bootloader += "arm";
+ } else if (target_arch == Arch::Arm64) {
+ default_bootloader += "aarch64";
+ } else {
+ default_bootloader += "x86_64";
+ }
+ default_bootloader += "/bootloader.qemu";
SetCommandLineOptionWithMode("bootloader", default_bootloader.c_str(),
SET_FLAGS_DEFAULT);
}
void SetDefaultFlagsForCrosvm() {
- if (NumStreamers() == 0) {
+ if (!FLAGS_start_webrtc) {
// This makes WebRTC the default streamer unless the user requests
// another via a --star_<streamer> flag, while at the same time it's
// possible to run without any streamer by setting --start_webrtc=false.
SetCommandLineOptionWithMode("start_webrtc", "true", SET_FLAGS_DEFAULT);
}
- // TODO(b/182484563): Re-enable autodetection when we fix the crosvm crashes
- bool default_enable_sandbox = false;
-
+ std::set<Arch> supported_archs{Arch::X86_64};
+ bool default_enable_sandbox =
+ supported_archs.find(HostArch()) != supported_archs.end() &&
+ EnsureDirectoryExists(kCrosvmVarEmptyDir) &&
+ IsDirectoryEmpty(kCrosvmVarEmptyDir) && !IsRunningInContainer();
SetCommandLineOptionWithMode("enable_sandbox",
(default_enable_sandbox ? "true" : "false"),
SET_FLAGS_DEFAULT);
@@ -981,10 +942,7 @@
SET_FLAGS_DEFAULT);
}
-bool ParseCommandLineFlags(int* argc, char*** argv, KernelConfig* kernel_config) {
- google::ParseCommandLineNonHelpFlags(argc, argv, true);
- SetDefaultFlagsFromConfigPreset();
- google::HandleCommandLineHelpFlags();
+bool GetKernelConfigAndSetDefaults(KernelConfig* kernel_config) {
bool invalid_manager = false;
if (!ResolveInstanceFiles()) {
@@ -1001,7 +959,7 @@
}
if (FLAGS_vm_manager == QemuManager::name()) {
- SetDefaultFlagsForQemu();
+ SetDefaultFlagsForQemu(kernel_config->target_arch);
} else if (FLAGS_vm_manager == CrosvmManager::name()) {
SetDefaultFlagsForCrosvm();
} else {
@@ -1009,11 +967,18 @@
<< std::endl;
invalid_manager = true;
}
- // The default for starting signaling server is whether or not webrt is to be
- // started.
- SetCommandLineOptionWithMode("start_webrtc_sig_server",
- FLAGS_start_webrtc ? "true" : "false",
- SET_FLAGS_DEFAULT);
+ auto host_operator_present =
+ cuttlefish::FileIsSocket(HOST_OPERATOR_SOCKET_PATH);
+ // The default for starting signaling server depends on whether or not webrtc
+ // is to be started and the presence of the host orchestrator.
+ SetCommandLineOptionWithMode(
+ "start_webrtc_sig_server",
+ FLAGS_start_webrtc && !host_operator_present ? "true" : "false",
+ SET_FLAGS_DEFAULT);
+ SetCommandLineOptionWithMode(
+ "webrtc_sig_server_addr",
+ host_operator_present ? HOST_OPERATOR_SOCKET_PATH : "0.0.0.0",
+ SET_FLAGS_DEFAULT);
if (invalid_manager) {
return false;
}
diff --git a/host/commands/assemble_cvd/flags.h b/host/commands/assemble_cvd/flags.h
index 3c02d92..961ac23 100644
--- a/host/commands/assemble_cvd/flags.h
+++ b/host/commands/assemble_cvd/flags.h
@@ -1,7 +1,10 @@
#pragma once
+#include <fruit/fruit.h>
#include <cstdint>
#include <optional>
+#include <string>
+#include <vector>
#include "common/libs/utils/environment.h"
#include "host/libs/config/cuttlefish_config.h"
@@ -14,12 +17,12 @@
bool bootconfig_supported;
};
-bool ParseCommandLineFlags(int* argc, char*** argv,
- KernelConfig* kernel_config);
+bool GetKernelConfigAndSetDefaults(KernelConfig* kernel_config);
// Must be called after ParseCommandLineFlags.
-CuttlefishConfig InitializeCuttlefishConfiguration(
- const std::string& instance_dir, int modem_simulator_count,
- KernelConfig kernel_config);
+CuttlefishConfig InitializeCuttlefishConfiguration(const std::string& root_dir,
+ int modem_simulator_count,
+ KernelConfig kernel_config,
+ fruit::Injector<>& injector);
std::string GetConfigFilePath(const CuttlefishConfig& config);
std::string GetCuttlefishEnvPath();
diff --git a/host/commands/assemble_cvd/super_image_mixer.cc b/host/commands/assemble_cvd/super_image_mixer.cc
index c1e7eac..8478006 100644
--- a/host/commands/assemble_cvd/super_image_mixer.cc
+++ b/host/commands/assemble_cvd/super_image_mixer.cc
@@ -55,14 +55,9 @@
const std::string kMiscInfoPath = "META/misc_info.txt";
const std::set<std::string> kDefaultTargetImages = {
- "IMAGES/boot.img",
- "IMAGES/odm.img",
- "IMAGES/odm_dlkm.img",
- "IMAGES/recovery.img",
- "IMAGES/userdata.img",
- "IMAGES/vbmeta.img",
- "IMAGES/vendor.img",
- "IMAGES/vendor_dlkm.img",
+ "IMAGES/boot.img", "IMAGES/init_boot.img", "IMAGES/odm.img",
+ "IMAGES/odm_dlkm.img", "IMAGES/recovery.img", "IMAGES/userdata.img",
+ "IMAGES/vbmeta.img", "IMAGES/vendor.img", "IMAGES/vendor_dlkm.img",
};
const std::set<std::string> kDefaultTargetBuildProp = {
"ODM/build.prop",
diff --git a/host/commands/bt_connector/Android.bp b/host/commands/bt_connector/Android.bp
index d617eaa..8703a76 100644
--- a/host/commands/bt_connector/Android.bp
+++ b/host/commands/bt_connector/Android.bp
@@ -24,6 +24,7 @@
"main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libjsoncpp",
diff --git a/host/commands/bt_connector/OWNERS b/host/commands/bt_connector/OWNERS
index e8a4a00..e791d83 100644
--- a/host/commands/bt_connector/OWNERS
+++ b/host/commands/bt_connector/OWNERS
@@ -1,2 +1,3 @@
+include device/google/cuttlefish:/OWNERS
include platform/system/bt:/OWNERS
[email protected]
\ No newline at end of file
diff --git a/host/commands/bt_connector/main.cpp b/host/commands/bt_connector/main.cpp
index fc17b31..a625768 100644
--- a/host/commands/bt_connector/main.cpp
+++ b/host/commands/bt_connector/main.cpp
@@ -14,7 +14,7 @@
*/
#include <fcntl.h>
-#include <sys/poll.h>
+#include <poll.h>
#include <unistd.h>
#include <ios>
#include <mutex>
diff --git a/host/commands/config_server/Android.bp b/host/commands/config_server/Android.bp
index b567bd9..51f3015 100644
--- a/host/commands/config_server/Android.bp
+++ b/host/commands/config_server/Android.bp
@@ -23,6 +23,7 @@
"main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libjsoncpp",
diff --git a/host/commands/console_forwarder/Android.bp b/host/commands/console_forwarder/Android.bp
index 230a0f7..c98c7aa 100644
--- a/host/commands/console_forwarder/Android.bp
+++ b/host/commands/console_forwarder/Android.bp
@@ -23,6 +23,7 @@
"main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libjsoncpp",
"libcuttlefish_fs",
diff --git a/host/commands/cvd/Android.bp b/host/commands/cvd/Android.bp
new file mode 100644
index 0000000..3d2f853
--- /dev/null
+++ b/host/commands/cvd/Android.bp
@@ -0,0 +1,73 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_binary_host {
+ name: "cvd",
+ symlinks: ["acloud"],
+ srcs: [
+ "main.cc",
+ ],
+ shared_libs: [
+ "libext2_blkid",
+ "libbase",
+ "libcuttlefish_fs",
+ "libcuttlefish_utils",
+ "libjsoncpp",
+ "libprotobuf-cpp-lite",
+ ],
+ static_libs: [
+ "libbuildversion",
+ "libcuttlefish_cvd_proto",
+ "libcuttlefish_host_config",
+ ],
+ required: [
+ "cvd_internal_host_bugreport",
+ "cvd_internal_start",
+ "cvd_internal_status",
+ "cvd_internal_stop",
+ "cvd_server",
+ ],
+ defaults: [
+ "cuttlefish_host",
+ ],
+ use_version_lib: true,
+}
+
+cc_binary_host {
+ name: "cvd_server",
+ srcs: [
+ "server.cc",
+ ],
+ shared_libs: [
+ "libbase",
+ "libcuttlefish_fs",
+ "libcuttlefish_utils",
+ "libjsoncpp",
+ "libprotobuf-cpp-lite",
+ ],
+ static_libs: [
+ "libbuildversion",
+ "libcuttlefish_cvd_proto",
+ "libcuttlefish_host_config",
+ ],
+ defaults: [
+ "cuttlefish_host",
+ ],
+ use_version_lib: true,
+}
diff --git a/host/commands/cvd/main.cc b/host/commands/cvd/main.cc
new file mode 100644
index 0000000..e226e45
--- /dev/null
+++ b/host/commands/cvd/main.cc
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <chrono>
+#include <iostream>
+#include <map>
+#include <optional>
+#include <string>
+#include <thread>
+#include <vector>
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/result.h>
+#include <build/version.h>
+
+#include "cvd_server.pb.h"
+
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/environment.h"
+#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
+#include "common/libs/utils/subprocess.h"
+#include "common/libs/utils/unix_sockets.h"
+#include "host/commands/cvd/server.h"
+#include "host/libs/config/cuttlefish_config.h"
+
+namespace cuttlefish {
+namespace {
+
+class CvdClient {
+ public:
+ CvdClient(const SharedFD& server) { SetServer(server); }
+
+ void SetServer(const SharedFD& server) {
+ CHECK(server->IsOpen()) << "Unable to open connection to cvd_server.";
+ server_ = UnixMessageSocket(server);
+ CHECK(server_->EnableCredentials(true).ok())
+ << "Unable to enable UnixMessageSocket credentials.";
+ }
+
+ bool EnsureCvdServerRunning(const std::string& host_tool_directory,
+ int num_retries = 1) {
+ cvd::Request request;
+ request.mutable_version_request();
+ auto response = SendRequest(request);
+
+ // If cvd_server is not running, start and wait before checking its version.
+ if (!response.ok()) {
+ StartCvdServer(host_tool_directory);
+ response = SendRequest(request);
+ }
+ CHECK(response.ok() && response->has_version_response())
+ << "GetVersion call missing VersionResponse.";
+ CheckStatus(response->status(), "GetVersion");
+
+ auto server_version = response->version_response().version();
+ if (server_version.major() != cvd::kVersionMajor) {
+ std::cout << "Major version difference: cvd(" << cvd::kVersionMajor << "."
+ << cvd::kVersionMinor << ") != cvd_server("
+ << server_version.major() << "." << server_version.minor()
+ << "). Try `cvd kill-server` or `pkill cvd_server`."
+ << std::endl;
+ return false;
+ }
+ if (server_version.minor() < cvd::kVersionMinor) {
+ std::cout << "Minor version of cvd_server is older than latest. "
+ << "Attempting to restart..." << std::endl;
+ StopCvdServer(/*clear=*/false);
+ StartCvdServer(host_tool_directory);
+ if (num_retries > 0) {
+ return EnsureCvdServerRunning(host_tool_directory, num_retries - 1);
+ } else {
+ std::cout << "Unable to start the cvd_server with version "
+ << cvd::kVersionMajor << "." << cvd::kVersionMinor
+ << std::endl;
+ return false;
+ }
+ }
+ if (server_version.build() != android::build::GetBuildNumber()) {
+ std::cout << "WARNING: cvd_server client version ("
+ << android::build::GetBuildNumber()
+ << ") does not match server version ("
+ << server_version.build() << std::endl;
+ }
+ return true;
+ }
+
+ void StopCvdServer(bool clear) {
+ if (!server_) {
+ return;
+ }
+
+ cvd::Request request;
+ auto shutdown_request = request.mutable_shutdown_request();
+ if (clear) {
+ shutdown_request->set_clear(true);
+ }
+
+ // Send the server a pipe with the Shutdown request that it
+ // will close when it fully exits.
+ SharedFD read_pipe, write_pipe;
+ CHECK(cuttlefish::SharedFD::Pipe(&read_pipe, &write_pipe))
+ << "Unable to create shutdown pipe: " << strerror(errno);
+
+ auto response = SendRequest(request, /*extra_fd=*/write_pipe);
+
+ // If the server is already not running then SendRequest will fail.
+ // We treat this as success.
+ if (!response.ok()) {
+ server_.reset();
+ return;
+ }
+
+ CHECK(response->has_shutdown_response())
+ << "Shutdown call missing ShutdownResponse.";
+ CheckStatus(response->status(), "Shutdown");
+
+ // Clear out the server_ socket.
+ server_.reset();
+
+ // Close the write end of the pipe in this process. Now the only
+ // process that may have the write end still open is the cvd_server.
+ write_pipe->Close();
+
+ // Wait for the pipe to close by attempting to read from the pipe.
+ char buf[1]; // Any size >0 should work for read attempt.
+ CHECK(read_pipe->Read(buf, sizeof(buf)) <= 0)
+ << "Unexpected read value from cvd_server shutdown pipe.";
+ }
+
+ void HandleCommand(std::vector<std::string> args,
+ std::vector<std::string> env) {
+ cvd::Request request;
+ auto command_request = request.mutable_command_request();
+ for (const std::string& arg : args) {
+ command_request->add_args(arg);
+ }
+ for (const std::string& e : env) {
+ auto eq_pos = e.find('=');
+ if (eq_pos == std::string::npos) {
+ LOG(WARNING) << "Environment var in unknown format: " << e;
+ continue;
+ }
+ (*command_request->mutable_env())[e.substr(0, eq_pos)] =
+ e.substr(eq_pos + 1);
+ }
+
+ auto response = SendRequest(request);
+ CHECK(response.ok() && response->has_command_response())
+ << "HandleCommand call missing CommandResponse.";
+ CheckStatus(response->status(), "GetVersion");
+ }
+
+ private:
+ std::optional<UnixMessageSocket> server_;
+
+ android::base::Result<cvd::Response> SendRequest(
+ const cvd::Request& request, std::optional<SharedFD> extra_fd = {}) {
+ if (!server_) {
+ return android::base::Error() << "server_ not set, cannot SendRequest.";
+ }
+ // Serialize and send the request.
+ std::string serialized;
+ if (!request.SerializeToString(&serialized)) {
+ return android::base::Error() << "Unable to serialize request proto.";
+ }
+ UnixSocketMessage request_message;
+
+ std::vector<SharedFD> control_fds = {
+ SharedFD::Dup(0),
+ SharedFD::Dup(1),
+ SharedFD::Dup(2),
+ };
+ if (extra_fd) {
+ control_fds.push_back(*extra_fd);
+ }
+ auto control = ControlMessage::FromFileDescriptors(control_fds);
+ CHECK(control.ok()) << control.error();
+ request_message.control.emplace_back(std::move(*control));
+
+ request_message.data =
+ std::vector<char>(serialized.begin(), serialized.end());
+ auto write_result = server_->WriteMessage(request_message);
+ if (!write_result.ok()) {
+ return android::base::Error() << write_result.error();
+ }
+
+ // Read and parse the response.
+ auto read_result = server_->ReadMessage();
+ if (!read_result.ok()) {
+ return android::base::Error() << read_result.error();
+ }
+ serialized =
+ std::string(read_result->data.begin(), read_result->data.end());
+ cvd::Response response;
+ if (!response.ParseFromString(serialized)) {
+ return android::base::Error()
+ << "Unable to parse serialized response proto.";
+ }
+
+ return response;
+ }
+
+ void StartCvdServer(const std::string& host_tool_directory) {
+ SharedFD server_fd =
+ SharedFD::SocketLocalServer(cvd::kServerSocketPath,
+ /*is_abstract=*/true, SOCK_STREAM, 0666);
+ CHECK(server_fd->IsOpen()) << server_fd->StrError();
+
+ // TODO(b/196114111): Investigate fully "daemonizing" the cvd_server.
+ CHECK(setenv("ANDROID_HOST_OUT", host_tool_directory.c_str(),
+ /*overwrite=*/true) == 0);
+ Command command(HostBinaryPath("cvd_server"));
+ command.AddParameter("-server_fd=", server_fd);
+ SubprocessOptions options;
+ options.ExitWithParent(false);
+ command.Start(options);
+
+ // Connect to the server_fd, which waits for startup.
+ SetServer(SharedFD::SocketLocalClient(cvd::kServerSocketPath,
+ /*is_abstract=*/true, SOCK_STREAM));
+ }
+
+ void CheckStatus(const cvd::Status& status, const std::string& rpc) {
+ CHECK(status.code() == cvd::Status::OK)
+ << "Failed to call cvd_server " << rpc << " (" << status.code()
+ << "): " << status.message();
+ }
+};
+
+int CvdMain(int argc, char** argv, char** envp) {
+ android::base::InitLogging(argv, android::base::StderrLogger);
+
+ std::vector<std::string> args = ArgsToVec(argc, argv);
+ std::vector<Flag> flags;
+
+ // TODO(b/206893146): Make this decision inside the server.
+ if (args[0] == "acloud") {
+ bool passthrough = true;
+ ParseFlags({GflagsCompatFlag("acloud_passthrough", passthrough)}, args);
+ if (passthrough) {
+ auto android_top = StringFromEnv("ANDROID_BUILD_TOP", "");
+ if (android_top == "") {
+ LOG(ERROR) << "Could not find android environment. Please run "
+ << "\"source build/envsetup.sh\".";
+ return 1;
+ }
+ // TODO(b/206893146): Detect what the platform actually is.
+ auto py_acloud_path =
+ android_top + "/prebuilts/asuite/acloud/linux-x86/acloud";
+ char** new_argv = new char*[args.size() + 1];
+ for (size_t i = 0; i < args.size(); i++) {
+ new_argv[i] = args[i].data();
+ }
+ new_argv[args.size()] = nullptr;
+ execv(py_acloud_path.data(), new_argv);
+ delete[] new_argv;
+ PLOG(ERROR) << "execv(" << py_acloud_path << ", ...) failed";
+ return 1;
+ }
+ }
+ bool clean = false;
+ flags.emplace_back(GflagsCompatFlag("clean", clean));
+
+ CHECK(ParseFlags(flags, args));
+
+ CvdClient client(SharedFD::SocketLocalClient(cvd::kServerSocketPath,
+ /*is_abstract=*/true,
+ SOCK_STREAM));
+
+ // Special case for `cvd kill-server`, handled by directly
+ // stopping the cvd_server.
+ if (argc > 1 && strcmp("kill-server", argv[1]) == 0) {
+ client.StopCvdServer(/*clear=*/true);
+ return 0;
+ }
+
+ // Special case for --clean flag, used to clear any existing state.
+ if (clean) {
+ LOG(INFO) << "cvd invoked with --clean; "
+ << "stopping the cvd_server before continuing.";
+ client.StopCvdServer(/*clear=*/true);
+ client = CvdClient(SharedFD::SocketLocalClient(
+ cvd::kServerSocketPath, /*is_abstract=*/true, SOCK_STREAM));
+ }
+
+ // Handle all remaining commands by forwarding them to the cvd_server.
+ CHECK(client.EnsureCvdServerRunning(
+ android::base::Dirname(android::base::GetExecutableDirectory())))
+ << "Unable to ensure cvd_server is running.";
+
+ std::vector<std::string> env;
+ for (char** e = envp; *e != 0; e++) {
+ env.emplace_back(*e);
+ }
+ client.HandleCommand(args, env);
+ return 0;
+}
+
+} // namespace
+} // namespace cuttlefish
+
+int main(int argc, char** argv, char** envp) {
+ return cuttlefish::CvdMain(argc, argv, envp);
+}
diff --git a/common/libs/utils/size_utils.cpp b/host/commands/cvd/proto/Android.bp
similarity index 60%
copy from common/libs/utils/size_utils.cpp
copy to host/commands/cvd/proto/Android.bp
index 9f25445..75de449 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/commands/cvd/proto/Android.bp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,17 @@
* limitations under the License.
*/
-#include "common/libs/utils/size_utils.h"
-
-#include <unistd.h>
-
-namespace cuttlefish {
-
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
}
-} // namespace cuttlefish
+cc_library_static {
+ name: "libcuttlefish_cvd_proto",
+ host_supported: true,
+ proto: {
+ export_proto_headers: true,
+ type: "lite",
+ //include_dirs: ["external/protobuf/src"],
+ },
+ srcs: ["cvd_server.proto"],
+}
diff --git a/host/commands/cvd/proto/cvd_server.proto b/host/commands/cvd/proto/cvd_server.proto
new file mode 100644
index 0000000..91194bc
--- /dev/null
+++ b/host/commands/cvd/proto/cvd_server.proto
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package cuttlefish.cvd;
+
+message Status {
+ // Subset of status codes from gRPC.
+ enum Code {
+ OK = 0;
+ FAILED_PRECONDITION = 9;
+ }
+
+ Code code = 1;
+ string message = 2;
+}
+
+message Request {
+ oneof contents {
+ // Returns the version of the CvdServer.
+ VersionRequest version_request = 1;
+ // Requests the CvdServer to shutdown.
+ ShutdownRequest shutdown_request = 2;
+ // Requests the CvdServer to execute a command on behalf of the client.
+ CommandRequest command_request = 3;
+ }
+}
+
+message Response {
+ Status status = 1;
+ oneof contents {
+ VersionResponse version_response = 2;
+ ShutdownResponse shutdown_response = 3;
+ CommandResponse command_response = 4;
+ }
+}
+
+message Version {
+ int32 major = 1;
+ int32 minor = 2;
+ string build = 3;
+}
+
+message VersionRequest {}
+message VersionResponse {
+ Version version = 1;
+}
+
+message ShutdownRequest {
+ // If true, clears instance and assembly state before shutting down.
+ bool clear = 1;
+}
+message ShutdownResponse {}
+
+message CommandRequest {
+ // The args that should be executed, including the subcommand.
+ repeated string args = 1;
+ // Environment variables that will be used by the subcommand.
+ map<string, string> env = 2;
+}
+message CommandResponse {}
diff --git a/host/commands/cvd/server.cc b/host/commands/cvd/server.cc
new file mode 100644
index 0000000..1c5b2ea
--- /dev/null
+++ b/host/commands/cvd/server.cc
@@ -0,0 +1,511 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/commands/cvd/server.h"
+
+#include <future>
+#include <map>
+#include <optional>
+#include <thread>
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <build/version.h>
+
+#include "cvd_server.pb.h"
+
+#include "common/libs/fs/shared_buf.h"
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/fs/shared_select.h"
+#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
+#include "common/libs/utils/shared_fd_flag.h"
+#include "common/libs/utils/subprocess.h"
+#include "common/libs/utils/unix_sockets.h"
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/known_paths.h"
+
+namespace cuttlefish {
+namespace {
+
+using android::base::Error;
+
+constexpr char kHostBugreportBin[] = "cvd_internal_host_bugreport";
+constexpr char kStartBin[] = "cvd_internal_start";
+constexpr char kStatusBin[] = "cvd_internal_status";
+constexpr char kStopBin[] = "cvd_internal_stop";
+
+constexpr char kClearBin[] = "clear_placeholder"; // Unused, runs CvdClear()
+constexpr char kFleetBin[] = "fleet_placeholder"; // Unused, runs CvdFleet()
+constexpr char kHelpBin[] = "help_placeholder"; // Unused, prints kHelpMessage.
+constexpr char kHelpMessage[] = R"(Cuttlefish Virtual Device (CVD) CLI.
+
+usage: cvd <command> <args>
+
+Commands:
+ help Print this message.
+ help <command> Print help for a command.
+ start Start a device.
+ stop Stop a running device.
+ clear Stop all running devices and delete all instance and assembly directories.
+ fleet View the current fleet status.
+ kill-server Kill the cvd_server background process.
+ status Check and print the state of a running instance.
+ host_bugreport Capture a host bugreport, including configs, logs, and tombstones.
+
+Args:
+ <command args> Each command has its own set of args. See cvd help <command>.
+ --clean If provided, runs cvd kill-server before the requested command.
+)";
+
+const std::map<std::string, std::string> CommandToBinaryMap = {
+ {"help", kHelpBin},
+ {"host_bugreport", kHostBugreportBin},
+ {"cvd_host_bugreport", kHostBugreportBin},
+ {"start", kStartBin},
+ {"launch_cvd", kStartBin},
+ {"status", kStatusBin},
+ {"cvd_status", kStatusBin},
+ {"stop", kStopBin},
+ {"stop_cvd", kStopBin},
+ {"clear", kClearBin},
+ {"fleet", kFleetBin}};
+
+class CvdServer {
+ public:
+ void ServerLoop(const SharedFD& server) {
+ while (running_) {
+ SharedFDSet read_set;
+ read_set.Set(server);
+ int num_fds = Select(&read_set, nullptr, nullptr, nullptr);
+ if (num_fds <= 0) { // Ignore select error
+ PLOG(ERROR) << "Select call returned error.";
+ } else if (read_set.IsSet(server)) {
+ auto client = SharedFD::Accept(*server);
+ while (true) {
+ android::base::Result<void> result = {};
+ auto request_with_stdio = GetRequest(client);
+ if (!request_with_stdio.ok()) {
+ client->Close();
+ break;
+ }
+ auto request = request_with_stdio->request;
+ auto in = request_with_stdio->in;
+ auto out = request_with_stdio->out;
+ auto err = request_with_stdio->err;
+ auto extra = request_with_stdio->extra;
+ switch (request.contents_case()) {
+ case cvd::Request::ContentsCase::CONTENTS_NOT_SET:
+ // No more messages from this client.
+ client->Close();
+ break;
+ case cvd::Request::ContentsCase::kVersionRequest:
+ result = GetVersion(client);
+ break;
+ case cvd::Request::ContentsCase::kShutdownRequest:
+ if (!extra) {
+ result = Error()
+ << "Missing extra ShareFD for shutdown write_pipe";
+ } else {
+ result = Shutdown(client, request.shutdown_request(), out, err,
+ *extra);
+ }
+ break;
+ case cvd::Request::ContentsCase::kCommandRequest:
+ result = HandleCommand(client, request.command_request(), in, out,
+ err);
+ break;
+ default:
+ result = Error() << "Unknown request in cvd_server.";
+ break;
+ }
+ if (!result.ok()) {
+ LOG(ERROR) << result.error();
+ client->Close();
+ }
+ }
+ }
+ }
+ }
+
+ android::base::Result<void> GetVersion(const SharedFD& client) const {
+ cvd::Response response;
+ response.mutable_version_response()->mutable_version()->set_major(
+ cvd::kVersionMajor);
+ response.mutable_version_response()->mutable_version()->set_minor(
+ cvd::kVersionMinor);
+ response.mutable_version_response()->mutable_version()->set_build(
+ android::build::GetBuildNumber());
+ response.mutable_status()->set_code(cvd::Status::OK);
+ return SendResponse(client, response);
+ }
+
+ android::base::Result<void> Shutdown(const SharedFD& client,
+ const cvd::ShutdownRequest& request,
+ const SharedFD& out, const SharedFD& err,
+ const SharedFD& write_pipe) {
+ cvd::Response response;
+ response.mutable_shutdown_response();
+
+ if (request.clear()) {
+ *response.mutable_status() = CvdClear(out, err);
+ if (response.status().code() != cvd::Status::OK) {
+ return SendResponse(client, response);
+ }
+ }
+
+ if (!assemblies_.empty()) {
+ response.mutable_status()->set_code(cvd::Status::FAILED_PRECONDITION);
+ response.mutable_status()->set_message(
+ "Cannot shut down cvd_server while devices are being tracked. "
+ "Try `cvd kill-server`.");
+ return SendResponse(client, response);
+ }
+
+ // Intentionally leak the write_pipe fd so that it only closes
+ // when this process fully exits.
+ write_pipe->UNMANAGED_Dup();
+
+ WriteAll(out, "Stopping the cvd_server.\n");
+ running_ = false;
+ response.mutable_status()->set_code(cvd::Status::OK);
+ return SendResponse(client, response);
+ }
+
+ android::base::Result<void> HandleCommand(const SharedFD& client,
+ const cvd::CommandRequest& request,
+ const SharedFD& in,
+ const SharedFD& out,
+ const SharedFD& err) {
+ cvd::Response response;
+ response.mutable_command_response();
+
+ if (request.args_size() == 0) {
+ // No command to handle
+ response.mutable_status()->set_code(cvd::Status::FAILED_PRECONDITION);
+ response.mutable_status()->set_message("No args passed to HandleCommand");
+ return SendResponse(client, response);
+ }
+
+ std::vector<Flag> flags;
+
+ std::vector<std::string> args;
+ for (const std::string& arg : request.args()) {
+ args.push_back(arg);
+ }
+
+ std::string bin;
+ std::string program_name = cpp_basename(args[0]);
+ std::string subcommand_name = program_name;
+ if (program_name == "cvd") {
+ if (args.size() == 1) {
+ // Show help if user invokes `cvd` alone.
+ subcommand_name = "help";
+ } else {
+ subcommand_name = args[1];
+ }
+ }
+ auto subcommand_bin = CommandToBinaryMap.find(subcommand_name);
+ if (subcommand_bin == CommandToBinaryMap.end()) {
+ // Show help if subcommand not found.
+ bin = kHelpBin;
+ } else {
+ bin = subcommand_bin->second;
+ }
+
+ // Remove program name from args
+ size_t args_to_skip = 1;
+ if (program_name == "cvd" && args.size() > 1) {
+ args_to_skip = 2;
+ }
+ args.erase(args.begin(), args.begin() + args_to_skip);
+
+ // assembly_dir is used to possibly set CuttlefishConfig path env variable
+ // later. This env variable is used by subcommands when locating the config.
+ std::string assembly_dir =
+ StringFromEnv("HOME", ".") + "/cuttlefish_assembly";
+ flags.emplace_back(GflagsCompatFlag("assembly_dir", assembly_dir));
+
+ // Create a copy of args before parsing, to be passed to subcommands.
+ std::vector<std::string> args_copy = args;
+
+ CHECK(ParseFlags(flags, args));
+
+ auto host_artifacts_path = request.env().find("ANDROID_HOST_OUT");
+ if (host_artifacts_path == request.env().end()) {
+ response.mutable_status()->set_code(cvd::Status::FAILED_PRECONDITION);
+ response.mutable_status()->set_message(
+ "Missing ANDROID_HOST_OUT in client environment.");
+ return SendResponse(client, response);
+ }
+
+ if (bin == kHelpBin) {
+ // Handle `cvd help`
+ if (args.empty()) {
+ WriteAll(out, kHelpMessage);
+ response.mutable_status()->set_code(cvd::Status::OK);
+ return SendResponse(client, response);
+ }
+
+ // Certain commands have no detailed help text.
+ std::set<std::string> builtins = {"help", "clear", "kill-server"};
+ auto it = CommandToBinaryMap.find(args[0]);
+ if (it == CommandToBinaryMap.end() ||
+ builtins.find(args[0]) != builtins.end()) {
+ WriteAll(out, kHelpMessage);
+ response.mutable_status()->set_code(cvd::Status::OK);
+ return SendResponse(client, response);
+ }
+
+ // Handle `cvd help <subcommand>` by calling the subcommand with --help.
+ bin = it->second;
+ args_copy.push_back("--help");
+ } else if (bin == kClearBin) {
+ *response.mutable_status() = CvdClear(out, err);
+ return SendResponse(client, response);
+ } else if (bin == kFleetBin) {
+ *response.mutable_status() = CvdFleet(out);
+ return SendResponse(client, response);
+ } else if (bin == kStartBin) {
+ // Track this assembly_dir in the fleet.
+ AssemblyInfo info;
+ info.host_binaries_dir = host_artifacts_path->second + "/bin/";
+ assemblies_.emplace(assembly_dir, info);
+ }
+
+ Command command(assemblies_[assembly_dir].host_binaries_dir + bin);
+ for (const std::string& arg : args_copy) {
+ command.AddParameter(arg);
+ }
+
+ // Set CuttlefishConfig path based on assembly dir,
+ // used by subcommands when locating the CuttlefishConfig.
+ if (request.env().count(kCuttlefishConfigEnvVarName) == 0) {
+ auto config_path = GetCuttlefishConfigPath(assembly_dir);
+ if (config_path) {
+ command.AddEnvironmentVariable(kCuttlefishConfigEnvVarName,
+ *config_path);
+ }
+ }
+ for (auto& it : request.env()) {
+ command.AddEnvironmentVariable(it.first, it.second);
+ }
+
+ // Redirect stdin, stdout, stderr back to the cvd client
+ command.RedirectStdIO(Subprocess::StdIOChannel::kStdIn, in);
+ command.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, out);
+ command.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, err);
+ SubprocessOptions options;
+ options.ExitWithParent(false);
+ command.Start(options);
+
+ response.mutable_status()->set_code(cvd::Status::OK);
+ return SendResponse(client, response);
+ }
+
+ private:
+ using AssemblyDir = std::string;
+ struct AssemblyInfo {
+ std::string host_binaries_dir;
+ };
+ std::map<AssemblyDir, AssemblyInfo> assemblies_;
+ bool running_ = true;
+
+ struct RequestWithStdio {
+ cvd::Request request;
+ SharedFD in, out, err;
+ std::optional<SharedFD> extra;
+ };
+
+ std::optional<std::string> GetCuttlefishConfigPath(
+ const std::string& assembly_dir) const {
+ std::string assembly_dir_realpath;
+ if (DirectoryExists(assembly_dir)) {
+ CHECK(android::base::Realpath(assembly_dir, &assembly_dir_realpath));
+ std::string config_path =
+ AbsolutePath(assembly_dir_realpath + "/" + "cuttlefish_config.json");
+ if (FileExists(config_path)) {
+ return config_path;
+ }
+ }
+ return {};
+ }
+
+ UnixMessageSocket GetClient(const SharedFD& client) const {
+ UnixMessageSocket result = UnixMessageSocket(client);
+ CHECK(result.EnableCredentials(true).ok())
+ << "Unable to enable UnixMessageSocket credentials.";
+ return result;
+ }
+
+ android::base::Result<RequestWithStdio> GetRequest(
+ const SharedFD& client) const {
+ RequestWithStdio result;
+
+ UnixMessageSocket reader = GetClient(client);
+ auto read_result = reader.ReadMessage();
+ if (!read_result.ok()) {
+ return Error() << read_result.error();
+ }
+
+ if (read_result->data.empty()) {
+ return Error() << "Read empty packet, so the client has probably closed "
+ "the connection.";
+ }
+
+ std::string serialized(read_result->data.begin(), read_result->data.end());
+ cvd::Request request;
+ if (!request.ParseFromString(serialized)) {
+ return Error() << "Unable to parse serialized request proto.";
+ }
+ result.request = request;
+
+ if (!read_result->HasFileDescriptors()) {
+ return Error() << "Missing stdio fds from request.";
+ }
+ auto fds = read_result->FileDescriptors();
+ if (!fds.ok() || (fds->size() != 3 && fds->size() != 4)) {
+ return Error() << "Error reading stdio fds from request: " << fds.error();
+ }
+ result.in = (*fds)[0];
+ result.out = (*fds)[1];
+ result.err = (*fds)[2];
+ if (fds->size() == 4) {
+ result.extra = (*fds)[3];
+ }
+
+ if (read_result->HasCredentials()) {
+ // TODO(b/198453477): Use Credentials to control command access.
+ LOG(DEBUG) << "Has credentials, uid=" << read_result->Credentials()->uid;
+ }
+
+ return result;
+ }
+
+ android::base::Result<void> SendResponse(
+ const SharedFD& client, const cvd::Response& response) const {
+ std::string serialized;
+ if (!response.SerializeToString(&serialized)) {
+ return android::base::Error() << "Unable to serialize response proto.";
+ }
+ UnixSocketMessage message;
+ message.data = std::vector<char>(serialized.begin(), serialized.end());
+
+ UnixMessageSocket writer = GetClient(client);
+ return writer.WriteMessage(message);
+ }
+
+ cvd::Status CvdClear(const SharedFD& out, const SharedFD& err) {
+ cvd::Status status;
+ for (const auto& it : assemblies_) {
+ const AssemblyDir& assembly_dir = it.first;
+ const AssemblyInfo& assembly_info = it.second;
+ auto config_path = GetCuttlefishConfigPath(assembly_dir);
+ if (config_path) {
+ // Stop all instances that are using this assembly dir.
+ Command command(assembly_info.host_binaries_dir + kStopBin);
+ // Delete the instance dirs.
+ command.AddParameter("--clear_instance_dirs");
+ command.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, out);
+ command.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, err);
+ command.AddEnvironmentVariable(kCuttlefishConfigEnvVarName,
+ *config_path);
+ if (int wait_result = command.Start().Wait(); wait_result != 0) {
+ WriteAll(
+ out,
+ "Warning: error stopping instances for assembly dir " +
+ assembly_dir +
+ ".\nThis can happen if instances are already stopped.\n");
+ }
+
+ // Delete the assembly dir.
+ WriteAll(out, "Deleting " + assembly_dir + "\n");
+ if (DirectoryExists(assembly_dir) &&
+ !RecursivelyRemoveDirectory(assembly_dir)) {
+ status.set_code(cvd::Status::FAILED_PRECONDITION);
+ status.set_message("Unable to rmdir " + assembly_dir);
+ return status;
+ }
+ }
+ }
+ RemoveFile(StringFromEnv("HOME", ".") + "/cuttlefish_runtime");
+ RemoveFile(GetGlobalConfigFileLink());
+ WriteAll(out,
+ "Stopped all known instances and deleted all "
+ "known assembly and instance dirs.\n");
+
+ assemblies_.clear();
+ status.set_code(cvd::Status::OK);
+ return status;
+ }
+
+ cvd::Status CvdFleet(const SharedFD& out) const {
+ for (const auto& it : assemblies_) {
+ const AssemblyDir& assembly_dir = it.first;
+ const AssemblyInfo& assembly_info = it.second;
+ auto config_path = GetCuttlefishConfigPath(assembly_dir);
+ if (config_path) {
+ // Reads CuttlefishConfig::instance_names(), which must remain stable
+ // across changes to config file format (within server.h major version).
+ auto config = CuttlefishConfig::GetFromFile(*config_path);
+ if (config) {
+ WriteAll(out, "Group:\n");
+ WriteAll(out, " Assembly dir: " + assembly_dir + "\n");
+ WriteAll(out, " Instances:\n");
+ for (const std::string& instance_name : config->instance_names()) {
+ Command command(assembly_info.host_binaries_dir + kStatusBin);
+ command.AddParameter("--print");
+ command.AddParameter("--instance_name=", instance_name);
+ command.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, out);
+ command.AddEnvironmentVariable(kCuttlefishConfigEnvVarName,
+ *config_path);
+ if (int wait_result = command.Start().Wait(); wait_result != 0) {
+ WriteAll(out, " (unknown instance status error)");
+ }
+ }
+ }
+ }
+ }
+ cvd::Status status;
+ status.set_code(cvd::Status::OK);
+ return status;
+ }
+};
+
+int CvdServerMain(int argc, char** argv) {
+ android::base::InitLogging(argv, android::base::StderrLogger);
+
+ std::vector<Flag> flags;
+ SharedFD server_fd;
+ flags.emplace_back(
+ SharedFDFlag("server_fd", server_fd)
+ .Help("File descriptor to an already created vsock server"));
+ std::vector<std::string> args =
+ ArgsToVec(argc - 1, argv + 1); // Skip argv[0]
+ CHECK(ParseFlags(flags, args));
+
+ CHECK(server_fd->IsOpen()) << "Did not receive a valid cvd_server fd";
+ CvdServer server;
+ server.ServerLoop(server_fd);
+ return 0;
+}
+
+} // namespace
+} // namespace cuttlefish
+
+int main(int argc, char** argv) {
+ return cuttlefish::CvdServerMain(argc, argv);
+}
diff --git a/common/libs/utils/size_utils.cpp b/host/commands/cvd/server.h
similarity index 61%
copy from common/libs/utils/size_utils.cpp
copy to host/commands/cvd/server.h
index 9f25445..300c8c4 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/commands/cvd/server.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,16 @@
* limitations under the License.
*/
-#include "common/libs/utils/size_utils.h"
-
-#include <unistd.h>
-
namespace cuttlefish {
+namespace cvd {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+// Major version uprevs are backwards incompatible.
+// Minor version uprevs are backwards compatible within major version.
+constexpr int kVersionMajor = 1;
+constexpr int kVersionMinor = 1;
+// Pathname of the abstract cvd_server socket.
+constexpr char kServerSocketPath[] = "cvd_server";
+
+} // namespace cvd
} // namespace cuttlefish
diff --git a/host/commands/cvd_status/Android.bp b/host/commands/cvd_status/Android.bp
deleted file mode 100644
index ae48d19..0000000
--- a/host/commands/cvd_status/Android.bp
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Copyright (C) 2018 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-cc_binary {
- name: "cvd_status",
- srcs: [
- "cvd_status.cc",
- ],
- shared_libs: [
- "libbase",
- "libcuttlefish_fs",
- "libcuttlefish_utils",
- "libjsoncpp",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libcuttlefish_vm_manager",
- "libgflags",
- ],
- defaults: ["cuttlefish_host", "cuttlefish_libicuuc"],
-}
diff --git a/host/commands/cvd_status/cvd_status.cc b/host/commands/cvd_status/cvd_status.cc
deleted file mode 100644
index 81436d4..0000000
--- a/host/commands/cvd_status/cvd_status.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <inttypes.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <signal.h>
-
-#include <algorithm>
-#include <cstdlib>
-#include <fstream>
-#include <iomanip>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include <gflags/gflags.h>
-#include <android-base/logging.h>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/fs/shared_select.h"
-#include "common/libs/utils/environment.h"
-#include "host/commands/run_cvd/runner_defs.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/vm_manager/vm_manager.h"
-
-DEFINE_int32(wait_for_launcher, 5,
- "How many seconds to wait for the launcher to respond to the status "
- "command. A value of zero means wait indefinetly");
-
-int main(int argc, char** argv) {
- ::android::base::InitLogging(argv, android::base::StderrLogger);
- google::ParseCommandLineFlags(&argc, &argv, true);
-
- auto config = cuttlefish::CuttlefishConfig::Get();
- if (!config) {
- LOG(ERROR) << "Failed to obtain config object";
- return 1;
- }
-
- auto instance = config->ForDefaultInstance();
- auto monitor_path = instance.launcher_monitor_socket_path();
- if (monitor_path.empty()) {
- LOG(ERROR) << "No path to launcher monitor found";
- return 2;
- }
- auto monitor_socket = cuttlefish::SharedFD::SocketLocalClient(
- monitor_path.c_str(), false, SOCK_STREAM, FLAGS_wait_for_launcher);
- if (!monitor_socket->IsOpen()) {
- LOG(ERROR) << "Unable to connect to launcher monitor at " << monitor_path
- << ": " << monitor_socket->StrError();
- return 3;
- }
- auto request = cuttlefish::LauncherAction::kStatus;
- auto bytes_sent = monitor_socket->Send(&request, sizeof(request), 0);
- if (bytes_sent < 0) {
- LOG(ERROR) << "Error sending launcher monitor the status command: "
- << monitor_socket->StrError();
- return 4;
- }
- // Perform a select with a timeout to guard against launcher hanging
- cuttlefish::SharedFDSet read_set;
- read_set.Set(monitor_socket);
- struct timeval timeout = {FLAGS_wait_for_launcher, 0};
- int selected = cuttlefish::Select(&read_set, nullptr, nullptr,
- FLAGS_wait_for_launcher <= 0 ? nullptr : &timeout);
- if (selected < 0){
- LOG(ERROR) << "Failed communication with the launcher monitor: "
- << strerror(errno);
- return 5;
- }
- if (selected == 0) {
- LOG(ERROR) << "Timeout expired waiting for launcher monitor to respond";
- return 6;
- }
- cuttlefish::LauncherResponse response;
- auto bytes_recv = monitor_socket->Recv(&response, sizeof(response), 0);
- if (bytes_recv < 0) {
- LOG(ERROR) << "Error receiving response from launcher monitor: "
- << monitor_socket->StrError();
- return 7;
- }
- if (response != cuttlefish::LauncherResponse::kSuccess) {
- LOG(ERROR) << "Received '" << static_cast<char>(response)
- << "' response from launcher monitor";
- return 8;
- }
- LOG(INFO) << "run_cvd is active.";
- return 0;
-}
diff --git a/host/commands/fetcher/Android.bp b/host/commands/fetcher/Android.bp
index fdb97ec..f3dbbfd 100644
--- a/host/commands/fetcher/Android.bp
+++ b/host/commands/fetcher/Android.bp
@@ -29,6 +29,7 @@
static_libs: [
"libcuttlefish_host_config",
"libgflags",
+ "libext2_blkid",
],
target: {
host: {
diff --git a/host/commands/fetcher/build_api.cc b/host/commands/fetcher/build_api.cc
index 16f95db..90eb640 100644
--- a/host/commands/fetcher/build_api.cc
+++ b/host/commands/fetcher/build_api.cc
@@ -80,8 +80,8 @@
product = StringFromEnv("TARGET_PRODUCT", "");
}
-BuildApi::BuildApi(std::unique_ptr<CredentialSource> credential_source)
- : credential_source(std::move(credential_source)) {}
+BuildApi::BuildApi(CurlWrapper& curl, CredentialSource* credential_source)
+ : curl(curl), credential_source(credential_source) {}
std::vector<std::string> BuildApi::Headers() {
std::vector<std::string> headers;
@@ -93,59 +93,92 @@
std::string BuildApi::LatestBuildId(const std::string& branch,
const std::string& target) {
- std::string url = BUILD_API + "/builds?branch=" + branch
- + "&buildAttemptStatus=complete"
- + "&buildType=submitted&maxResults=1&successful=true&target=" + target;
- auto response = curl.DownloadToJson(url, Headers());
- CHECK(!response.isMember("error")) << "Error fetching the latest build of \""
- << target << "\" on \"" << branch << "\". Response was " << response;
+ std::string url =
+ BUILD_API + "/builds?branch=" + curl.UrlEscape(branch) +
+ "&buildAttemptStatus=complete" +
+ "&buildType=submitted&maxResults=1&successful=true&target=" +
+ curl.UrlEscape(target);
+ auto curl_response = curl.DownloadToJson(url, Headers());
+ const auto& json = curl_response.data;
+ if (!curl_response.HttpSuccess()) {
+ LOG(FATAL) << "Error fetching the latest build of \"" << target
+ << "\" on \"" << branch << "\". The server response was \""
+ << json << "\", and code was " << curl_response.http_code;
+ }
+ CHECK(!json.isMember("error"))
+ << "Response had \"error\" but had http success status. Received \""
+ << json << "\"";
- if (!response.isMember("builds") || response["builds"].size() != 1) {
+ if (!json.isMember("builds") || json["builds"].size() != 1) {
LOG(WARNING) << "expected to receive 1 build for \"" << target << "\" on \""
- << branch << "\", but received " << response["builds"].size()
- << ". Full response was " << response;
+ << branch << "\", but received " << json["builds"].size()
+ << ". Full response was " << json;
return "";
}
- return response["builds"][0]["buildId"].asString();
+ return json["builds"][0]["buildId"].asString();
}
std::string BuildApi::BuildStatus(const DeviceBuild& build) {
- std::string url = BUILD_API + "/builds/" + build.id + "/" + build.target;
- auto response_json = curl.DownloadToJson(url, Headers());
- CHECK(!response_json.isMember("error")) << "Error fetching the status of "
- << "build " << build << ". Response was " << response_json;
+ std::string url = BUILD_API + "/builds/" + curl.UrlEscape(build.id) + "/" +
+ curl.UrlEscape(build.target);
+ auto curl_response = curl.DownloadToJson(url, Headers());
+ const auto& json = curl_response.data;
+ if (!curl_response.HttpSuccess()) {
+ LOG(FATAL) << "Error fetching the status of \"" << build
+ << "\". The server response was \"" << json
+ << "\", and code was " << curl_response.http_code;
+ }
+ CHECK(!json.isMember("error"))
+ << "Response had \"error\" but had http success status. Received \""
+ << json << "\"";
- return response_json["buildAttemptStatus"].asString();
+ return json["buildAttemptStatus"].asString();
}
std::string BuildApi::ProductName(const DeviceBuild& build) {
- std::string url = BUILD_API + "/builds/" + build.id + "/" + build.target;
- auto response_json = curl.DownloadToJson(url, Headers());
- CHECK(!response_json.isMember("error")) << "Error fetching the status of "
- << "build " << build << ". Response was " << response_json;
- CHECK(response_json.isMember("target")) << "Build was missing target field.";
- return response_json["target"]["product"].asString();
+ std::string url = BUILD_API + "/builds/" + curl.UrlEscape(build.id) + "/" +
+ curl.UrlEscape(build.target);
+ auto curl_response = curl.DownloadToJson(url, Headers());
+ const auto& json = curl_response.data;
+ if (!curl_response.HttpSuccess()) {
+ LOG(FATAL) << "Error fetching the product name of \"" << build
+ << "\". The server response was \"" << json
+ << "\", and code was " << curl_response.http_code;
+ }
+ CHECK(!json.isMember("error"))
+ << "Response had \"error\" but had http success status. Received \""
+ << json << "\"";
+
+ CHECK(json.isMember("target")) << "Build was missing target field.";
+ return json["target"]["product"].asString();
}
std::vector<Artifact> BuildApi::Artifacts(const DeviceBuild& build) {
std::string page_token = "";
std::vector<Artifact> artifacts;
do {
- std::string url = BUILD_API + "/builds/" + build.id + "/" + build.target +
- "/attempts/latest/artifacts?maxResults=1000";
+ std::string url = BUILD_API + "/builds/" + curl.UrlEscape(build.id) + "/" +
+ curl.UrlEscape(build.target) +
+ "/attempts/latest/artifacts?maxResults=100";
if (page_token != "") {
- url += "&pageToken=" + page_token;
+ url += "&pageToken=" + curl.UrlEscape(page_token);
}
- auto artifacts_json = curl.DownloadToJson(url, Headers());
- CHECK(!artifacts_json.isMember("error"))
- << "Error fetching the artifacts of " << build << ". Response was "
- << artifacts_json;
- if (artifacts_json.isMember("nextPageToken")) {
- page_token = artifacts_json["nextPageToken"].asString();
+ auto curl_response = curl.DownloadToJson(url, Headers());
+ const auto& json = curl_response.data;
+ if (!curl_response.HttpSuccess()) {
+ LOG(FATAL) << "Error fetching the artifacts of \"" << build
+ << "\". The server response was \"" << json
+ << "\", and code was " << curl_response.http_code;
+ }
+ CHECK(!json.isMember("error"))
+ << "Response had \"error\" but had http success status. Received \""
+ << json << "\"";
+ if (json.isMember("nextPageToken")) {
+ page_token = json["nextPageToken"].asString();
} else {
page_token = "";
}
- for (const auto& artifact_json : artifacts_json["artifacts"]) {
+ for (const auto& artifact_json : json["artifacts"]) {
artifacts.emplace_back(artifact_json);
}
} while (page_token != "");
@@ -176,16 +209,27 @@
const std::string& artifact,
const std::string& path) {
std::string download_url_endpoint =
- BUILD_API + "/builds/" + build.id + "/" + build.target +
- "/attempts/latest/artifacts/" + artifact + "/url";
- auto download_url_json =
- curl.DownloadToJson(download_url_endpoint, Headers());
- if (!download_url_json.isMember("signedUrl")) {
- LOG(ERROR) << "URL endpoint did not have json path: " << download_url_json;
+ BUILD_API + "/builds/" + curl.UrlEscape(build.id) + "/" +
+ curl.UrlEscape(build.target) + "/attempts/latest/artifacts/" +
+ curl.UrlEscape(artifact) + "/url";
+ auto curl_response = curl.DownloadToJson(download_url_endpoint, Headers());
+ const auto& json = curl_response.data;
+ if (!(curl_response.HttpSuccess() || curl_response.HttpRedirect())) {
+ LOG(ERROR) << "Error fetching the url of \"" << artifact << "\" for \""
+ << build << "\". The server response was \"" << json
+ << "\", and code was " << curl_response.http_code;
return false;
}
- std::string url = download_url_json["signedUrl"].asString();
- return curl.DownloadToFile(url, path);
+ if (json.isMember("error")) {
+ LOG(ERROR) << "Response had \"error\" but had http success status. "
+ << "Received \"" << json << "\"";
+ }
+ if (!json.isMember("signedUrl")) {
+ LOG(ERROR) << "URL endpoint did not have json path: " << json;
+ return false;
+ }
+ std::string url = json["signedUrl"].asString();
+ return curl.DownloadToFile(url, path).HttpSuccess();
}
bool BuildApi::ArtifactToFile(const DirectoryBuild& build,
diff --git a/host/commands/fetcher/build_api.h b/host/commands/fetcher/build_api.h
index 505ad4b..769893f 100644
--- a/host/commands/fetcher/build_api.h
+++ b/host/commands/fetcher/build_api.h
@@ -81,34 +81,34 @@
std::ostream& operator<<(std::ostream&, const Build&);
class BuildApi {
- CurlWrapper curl;
- std::unique_ptr<CredentialSource> credential_source;
+ CurlWrapper& curl;
+ CredentialSource* credential_source;
std::vector<std::string> Headers();
public:
- BuildApi(std::unique_ptr<CredentialSource> credential_source);
- ~BuildApi() = default;
+ BuildApi(CurlWrapper&, CredentialSource*);
+ ~BuildApi() = default;
- std::string LatestBuildId(const std::string& branch,
- const std::string& target);
+ std::string LatestBuildId(const std::string& branch,
+ const std::string& target);
- std::string BuildStatus(const DeviceBuild&);
+ std::string BuildStatus(const DeviceBuild&);
- std::string ProductName(const DeviceBuild&);
+ std::string ProductName(const DeviceBuild&);
- std::vector<Artifact> Artifacts(const DeviceBuild&);
+ std::vector<Artifact> Artifacts(const DeviceBuild&);
- bool ArtifactToFile(const DeviceBuild& build, const std::string& artifact,
- const std::string& path);
+ bool ArtifactToFile(const DeviceBuild& build, const std::string& artifact,
+ const std::string& path);
- std::vector<Artifact> Artifacts(const DirectoryBuild&);
+ std::vector<Artifact> Artifacts(const DirectoryBuild&);
- bool ArtifactToFile(const DirectoryBuild& build, const std::string& artifact,
- const std::string& path);
+ bool ArtifactToFile(const DirectoryBuild& build, const std::string& artifact,
+ const std::string& path);
- std::vector<Artifact> Artifacts(const Build& build) {
- return std::visit([this](auto&& arg) { return Artifacts(arg); }, build);
- }
+ std::vector<Artifact> Artifacts(const Build& build) {
+ return std::visit([this](auto&& arg) { return Artifacts(arg); }, build);
+ }
bool ArtifactToFile(const Build& build, const std::string& artifact,
const std::string& path) {
diff --git a/host/commands/fetcher/credential_source.cc b/host/commands/fetcher/credential_source.cc
index 0144e2d..b1b70f4 100644
--- a/host/commands/fetcher/credential_source.cc
+++ b/host/commands/fetcher/credential_source.cc
@@ -27,7 +27,8 @@
} // namespace
-GceMetadataCredentialSource::GceMetadataCredentialSource() {
+GceMetadataCredentialSource::GceMetadataCredentialSource(CurlWrapper& curl)
+ : curl(curl) {
latest_credential = "";
expiration = std::chrono::steady_clock::now();
}
@@ -40,25 +41,33 @@
}
void GceMetadataCredentialSource::RefreshCredential() {
- Json::Value credential_json =
+ auto curl_response =
curl.DownloadToJson(REFRESH_URL, {"Metadata-Flavor: Google"});
+ const auto& json = curl_response.data;
+ if (!curl_response.HttpSuccess()) {
+ LOG(FATAL) << "Error fetching credentials. The server response was \""
+ << json << "\", and code was " << curl_response.http_code;
+ }
+ CHECK(!json.isMember("error"))
+ << "Response had \"error\" but had http success status. Received \""
+ << json << "\"";
- CHECK(!credential_json.isMember("error")) << "Error fetching credentials. " <<
- "Response was " << credential_json;
- bool has_access_token = credential_json.isMember("access_token");
- bool has_expires_in = credential_json.isMember("expires_in");
+ bool has_access_token = json.isMember("access_token");
+ bool has_expires_in = json.isMember("expires_in");
if (!has_access_token || !has_expires_in) {
LOG(FATAL) << "GCE credential was missing access_token or expires_in. "
- << "Full response was " << credential_json << "";
+ << "Full response was " << json << "";
}
- expiration = std::chrono::steady_clock::now()
- + std::chrono::seconds(credential_json["expires_in"].asInt());
- latest_credential = credential_json["access_token"].asString();
+ expiration = std::chrono::steady_clock::now() +
+ std::chrono::seconds(json["expires_in"].asInt());
+ latest_credential = json["access_token"].asString();
}
-std::unique_ptr<CredentialSource> GceMetadataCredentialSource::make() {
- return std::unique_ptr<CredentialSource>(new GceMetadataCredentialSource());
+std::unique_ptr<CredentialSource> GceMetadataCredentialSource::make(
+ CurlWrapper& curl) {
+ return std::unique_ptr<CredentialSource>(
+ new GceMetadataCredentialSource(curl));
}
FixedCredentialSource::FixedCredentialSource(const std::string& credential) {
diff --git a/host/commands/fetcher/credential_source.h b/host/commands/fetcher/credential_source.h
index 78ec51a..902e334 100644
--- a/host/commands/fetcher/credential_source.h
+++ b/host/commands/fetcher/credential_source.h
@@ -29,18 +29,18 @@
};
class GceMetadataCredentialSource : public CredentialSource {
- CurlWrapper curl;
+ CurlWrapper& curl;
std::string latest_credential;
std::chrono::steady_clock::time_point expiration;
void RefreshCredential();
public:
- GceMetadataCredentialSource();
- GceMetadataCredentialSource(GceMetadataCredentialSource&&) = default;
+ GceMetadataCredentialSource(CurlWrapper&);
+ GceMetadataCredentialSource(GceMetadataCredentialSource&&) = default;
- virtual std::string Credential();
+ virtual std::string Credential();
- static std::unique_ptr<CredentialSource> make();
+ static std::unique_ptr<CredentialSource> make(CurlWrapper&);
};
class FixedCredentialSource : public CredentialSource {
diff --git a/host/commands/fetcher/curl_wrapper.cc b/host/commands/fetcher/curl_wrapper.cc
index c32f4ce..60b2d23 100644
--- a/host/commands/fetcher/curl_wrapper.cc
+++ b/host/commands/fetcher/curl_wrapper.cc
@@ -13,14 +13,16 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "curl_wrapper.h"
+#include "host/commands/fetcher/curl_wrapper.h"
-#include <sstream>
-#include <string>
#include <stdio.h>
-#include <android-base/logging.h>
+#include <mutex>
+#include <sstream>
+#include <string>
+#include <thread>
+#include <android-base/logging.h>
#include <curl/curl.h>
#include <json/json.h>
@@ -49,113 +51,188 @@
return curl_headers;
}
-} // namespace
-
-CurlWrapper::CurlWrapper() {
- curl = curl_easy_init();
- if (!curl) {
- LOG(ERROR) << "failed to initialize curl";
- return;
+class CurlWrapperImpl : public CurlWrapper {
+ public:
+ CurlWrapperImpl() {
+ curl_ = curl_easy_init();
+ if (!curl_) {
+ LOG(ERROR) << "failed to initialize curl";
+ return;
+ }
}
+ ~CurlWrapperImpl() { curl_easy_cleanup(curl_); }
+
+ CurlResponse<std::string> DownloadToFile(
+ const std::string& url, const std::string& path,
+ const std::vector<std::string>& headers) {
+ std::lock_guard<std::mutex> lock(mutex_);
+ LOG(INFO) << "Attempting to save \"" << url << "\" to \"" << path << "\"";
+ if (!curl_) {
+ LOG(ERROR) << "curl was not initialized\n";
+ return {"", -1};
+ }
+ curl_slist* curl_headers = build_slist(headers);
+ curl_easy_reset(curl_);
+ curl_easy_setopt(curl_, CURLOPT_CAINFO,
+ "/etc/ssl/certs/ca-certificates.crt");
+ curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curl_headers);
+ curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());
+ char error_buf[CURL_ERROR_SIZE];
+ curl_easy_setopt(curl_, CURLOPT_ERRORBUFFER, error_buf);
+ curl_easy_setopt(curl_, CURLOPT_VERBOSE, 1L);
+ FILE* file = fopen(path.c_str(), "w");
+ if (!file) {
+ LOG(ERROR) << "could not open file " << path;
+ return {"", -1};
+ }
+ curl_easy_setopt(curl_, CURLOPT_WRITEDATA, (void*)file);
+ CURLcode res = curl_easy_perform(curl_);
+ if (curl_headers) {
+ curl_slist_free_all(curl_headers);
+ }
+ fclose(file);
+ if (res != CURLE_OK) {
+ LOG(ERROR) << "curl_easy_perform() failed. "
+ << "Code was \"" << res << "\". "
+ << "Strerror was \"" << curl_easy_strerror(res) << "\". "
+ << "Error buffer was \"" << error_buf << "\".";
+ return {{}, -1};
+ }
+ long http_code = 0;
+ curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, &http_code);
+ return {path, http_code};
+ }
+
+ CurlResponse<std::string> DownloadToString(
+ const std::string& url, const std::vector<std::string>& headers) {
+ std::lock_guard<std::mutex> lock(mutex_);
+ LOG(INFO) << "Attempting to download \"" << url << "\"";
+ if (!curl_) {
+ LOG(ERROR) << "curl was not initialized\n";
+ return {"", -1};
+ }
+ curl_slist* curl_headers = build_slist(headers);
+ curl_easy_reset(curl_);
+ curl_easy_setopt(curl_, CURLOPT_CAINFO,
+ "/etc/ssl/certs/ca-certificates.crt");
+ curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curl_headers);
+ curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());
+ std::stringstream data;
+ curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, file_write_callback);
+ curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &data);
+ char error_buf[CURL_ERROR_SIZE];
+ curl_easy_setopt(curl_, CURLOPT_ERRORBUFFER, error_buf);
+ curl_easy_setopt(curl_, CURLOPT_VERBOSE, 1L);
+ CURLcode res = curl_easy_perform(curl_);
+ if (curl_headers) {
+ curl_slist_free_all(curl_headers);
+ }
+ if (res != CURLE_OK) {
+ LOG(ERROR) << "curl_easy_perform() failed. "
+ << "Code was \"" << res << "\". "
+ << "Strerror was \"" << curl_easy_strerror(res) << "\". "
+ << "Error buffer was \"" << error_buf << "\".";
+ return {"", -1};
+ }
+ long http_code = 0;
+ curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, &http_code);
+ return {data.str(), http_code};
+ }
+
+ CurlResponse<Json::Value> DownloadToJson(
+ const std::string& url, const std::vector<std::string>& headers) {
+ CurlResponse<std::string> response = DownloadToString(url, headers);
+ const std::string& contents = response.data;
+ Json::CharReaderBuilder builder;
+ std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
+ Json::Value json;
+ std::string errorMessage;
+ if (!reader->parse(&*contents.begin(), &*contents.end(), &json,
+ &errorMessage)) {
+ LOG(ERROR) << "Could not parse json: " << errorMessage;
+ json["error"] = "Failed to parse json.";
+ json["response"] = contents;
+ }
+ return {json, response.http_code};
+ }
+
+ std::string UrlEscape(const std::string& text) override {
+ char* escaped_str = curl_easy_escape(curl_, text.c_str(), text.size());
+ std::string ret{escaped_str};
+ curl_free(escaped_str);
+ return ret;
+ }
+
+ private:
+ CURL* curl_;
+ std::mutex mutex_;
+};
+
+class CurlServerErrorRetryingWrapper : public CurlWrapper {
+ public:
+ CurlServerErrorRetryingWrapper(CurlWrapper& inner, int retry_attempts,
+ std::chrono::milliseconds retry_delay)
+ : inner_curl_(inner),
+ retry_attempts_(retry_attempts),
+ retry_delay_(retry_delay) {}
+
+ CurlResponse<std::string> DownloadToFile(
+ const std::string& url, const std::string& path,
+ const std::vector<std::string>& headers) {
+ return RetryImpl<std::string>(
+ [&, this]() { return inner_curl_.DownloadToFile(url, path, headers); });
+ }
+
+ CurlResponse<std::string> DownloadToString(
+ const std::string& url, const std::vector<std::string>& headers) {
+ return RetryImpl<std::string>(
+ [&, this]() { return inner_curl_.DownloadToString(url, headers); });
+ }
+
+ CurlResponse<Json::Value> DownloadToJson(
+ const std::string& url, const std::vector<std::string>& headers) {
+ return RetryImpl<Json::Value>(
+ [&, this]() { return inner_curl_.DownloadToJson(url, headers); });
+ }
+
+ std::string UrlEscape(const std::string& text) override {
+ return inner_curl_.UrlEscape(text);
+ }
+
+ private:
+ template <typename T>
+ CurlResponse<T> RetryImpl(std::function<CurlResponse<T>()> attempt_fn) {
+ CurlResponse<T> response;
+ for (int attempt = 0; attempt != retry_attempts_; ++attempt) {
+ if (attempt != 0) {
+ std::this_thread::sleep_for(retry_delay_);
+ }
+ response = attempt_fn();
+ if (!response.HttpServerError()) {
+ return response;
+ }
+ }
+ return response;
+ }
+
+ private:
+ CurlWrapper& inner_curl_;
+ int retry_attempts_;
+ std::chrono::milliseconds retry_delay_;
+};
+
+} // namespace
+
+/* static */ std::unique_ptr<CurlWrapper> CurlWrapper::Create() {
+ return std::unique_ptr<CurlWrapper>(new CurlWrapperImpl());
}
-CurlWrapper::~CurlWrapper() {
- curl_easy_cleanup(curl);
+/* static */ std::unique_ptr<CurlWrapper> CurlWrapper::WithServerErrorRetry(
+ CurlWrapper& inner, int retry_attempts,
+ std::chrono::milliseconds retry_delay) {
+ return std::unique_ptr<CurlWrapper>(
+ new CurlServerErrorRetryingWrapper(inner, retry_attempts, retry_delay));
}
-bool CurlWrapper::DownloadToFile(const std::string& url, const std::string& path) {
- return CurlWrapper::DownloadToFile(url, path, {});
-}
-
-bool CurlWrapper::DownloadToFile(const std::string& url, const std::string& path,
- const std::vector<std::string>& headers) {
- LOG(INFO) << "Attempting to save \"" << url << "\" to \"" << path << "\"";
- if (!curl) {
- LOG(ERROR) << "curl was not initialized\n";
- return false;
- }
- curl_slist* curl_headers = build_slist(headers);
- curl_easy_reset(curl);
- curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/ssl/certs/ca-certificates.crt");
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_headers);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- char error_buf[CURL_ERROR_SIZE];
- curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buf);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
- FILE* file = fopen(path.c_str(), "w");
- if (!file) {
- LOG(ERROR) << "could not open file " << path;
- return false;
- }
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*) file);
- CURLcode res = curl_easy_perform(curl);
- if (curl_headers) {
- curl_slist_free_all(curl_headers);
- }
- fclose(file);
- if (res != CURLE_OK) {
- LOG(ERROR) << "curl_easy_perform() failed. "
- << "Code was \"" << res << "\". "
- << "Strerror was \"" << curl_easy_strerror(res) << "\". "
- << "Error buffer was \"" << error_buf << "\".";
- return false;
- }
- return true;
-}
-
-std::string CurlWrapper::DownloadToString(const std::string& url) {
- return DownloadToString(url, {});
-}
-
-std::string CurlWrapper::DownloadToString(const std::string& url,
- const std::vector<std::string>& headers) {
- LOG(INFO) << "Attempting to download \"" << url << "\"";
- if (!curl) {
- LOG(ERROR) << "curl was not initialized\n";
- return "";
- }
- curl_slist* curl_headers = build_slist(headers);
- curl_easy_reset(curl);
- curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/ssl/certs/ca-certificates.crt");
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_headers);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- std::stringstream data;
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, file_write_callback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
- char error_buf[CURL_ERROR_SIZE];
- curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buf);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
- CURLcode res = curl_easy_perform(curl);
- if (curl_headers) {
- curl_slist_free_all(curl_headers);
- }
- if (res != CURLE_OK) {
- LOG(ERROR) << "curl_easy_perform() failed. "
- << "Code was \"" << res << "\". "
- << "Strerror was \"" << curl_easy_strerror(res) << "\". "
- << "Error buffer was \"" << error_buf << "\".";
- return "";
- }
- return data.str();
-}
-
-Json::Value CurlWrapper::DownloadToJson(const std::string& url) {
- return DownloadToJson(url, {});
-}
-
-Json::Value CurlWrapper::DownloadToJson(const std::string& url,
- const std::vector<std::string>& headers) {
- std::string contents = DownloadToString(url, headers);
- Json::CharReaderBuilder builder;
- std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
- Json::Value json;
- std::string errorMessage;
- if (!reader->parse(&*contents.begin(), &*contents.end(), &json, &errorMessage)) {
- LOG(ERROR) << "Could not parse json: " << errorMessage;
- json["error"] = "Failed to parse json.";
- json["response"] = contents;
- }
- return json;
-}
-
+CurlWrapper::~CurlWrapper() = default;
}
diff --git a/host/commands/fetcher/curl_wrapper.h b/host/commands/fetcher/curl_wrapper.h
index 6d3a2cb..6262a0a 100644
--- a/host/commands/fetcher/curl_wrapper.h
+++ b/host/commands/fetcher/curl_wrapper.h
@@ -15,31 +15,42 @@
#pragma once
+#include <chrono>
+#include <mutex>
#include <string>
-#include <curl/curl.h>
#include <json/json.h>
namespace cuttlefish {
-class CurlWrapper {
- CURL* curl;
-public:
- CurlWrapper();
- ~CurlWrapper();
- CurlWrapper(const CurlWrapper&) = delete;
- CurlWrapper& operator=(const CurlWrapper*) = delete;
- CurlWrapper(CurlWrapper&&) = default;
+template <typename T>
+struct CurlResponse {
+ bool HttpInfo() { return http_code >= 100 && http_code <= 199; }
+ bool HttpSuccess() { return http_code >= 200 && http_code <= 299; }
+ bool HttpRedirect() { return http_code >= 300 && http_code <= 399; }
+ bool HttpClientError() { return http_code >= 400 && http_code <= 499; }
+ bool HttpServerError() { return http_code >= 500 && http_code <= 599; }
- bool DownloadToFile(const std::string& url, const std::string& path);
- bool DownloadToFile(const std::string& url, const std::string& path,
- const std::vector<std::string>& headers);
- std::string DownloadToString(const std::string& url);
- std::string DownloadToString(const std::string& url,
- const std::vector<std::string>& headers);
- Json::Value DownloadToJson(const std::string& url);
- Json::Value DownloadToJson(const std::string& url,
- const std::vector<std::string>& headers);
+ T data;
+ long http_code;
+};
+
+class CurlWrapper {
+ public:
+ static std::unique_ptr<CurlWrapper> Create();
+ static std::unique_ptr<CurlWrapper> WithServerErrorRetry(
+ CurlWrapper&, int retry_attempts, std::chrono::milliseconds retry_delay);
+ virtual ~CurlWrapper();
+
+ virtual CurlResponse<std::string> DownloadToFile(
+ const std::string& url, const std::string& path,
+ const std::vector<std::string>& headers = {}) = 0;
+ virtual CurlResponse<std::string> DownloadToString(
+ const std::string& url, const std::vector<std::string>& headers = {}) = 0;
+ virtual CurlResponse<Json::Value> DownloadToJson(
+ const std::string& url, const std::vector<std::string>& headers = {}) = 0;
+
+ virtual std::string UrlEscape(const std::string&) = 0;
};
}
diff --git a/host/commands/fetcher/fetch_cvd.cc b/host/commands/fetcher/fetch_cvd.cc
index b84fbba..99a6617 100644
--- a/host/commands/fetcher/fetch_cvd.cc
+++ b/host/commands/fetcher/fetch_cvd.cc
@@ -17,6 +17,7 @@
#include <iterator>
#include <string>
+#include <curl/curl.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -78,9 +79,9 @@
const std::vector<Artifact>& artifacts) {
std::string product = std::visit([](auto&& arg) { return arg.product; }, build);
auto id = std::visit([](auto&& arg) { return arg.id; }, build);
- auto match = product + "-" + name + "-" + id;
+ auto match = product + "-" + name + "-" + id + ".zip";
for (const auto& artifact : artifacts) {
- if (artifact.Name().find(match) != std::string::npos) {
+ if (artifact.Name() == match) {
return artifact.Name();
}
}
@@ -268,13 +269,16 @@
curl_global_init(CURL_GLOBAL_DEFAULT);
{
+ auto curl = CurlWrapper::Create();
+ auto retrying_curl = CurlWrapper::WithServerErrorRetry(
+ *curl, 10, std::chrono::milliseconds(5000));
std::unique_ptr<CredentialSource> credential_source;
if (FLAGS_credential_source == "gce") {
- credential_source = GceMetadataCredentialSource::make();
+ credential_source = GceMetadataCredentialSource::make(*retrying_curl);
} else if (FLAGS_credential_source != "") {
credential_source = FixedCredentialSource::make(FLAGS_credential_source);
}
- BuildApi build_api(std::move(credential_source));
+ BuildApi build_api(*retrying_curl, credential_source.get());
auto default_build = ArgumentToBuild(&build_api, FLAGS_default_build,
DEFAULT_BUILD_TARGET,
@@ -293,6 +297,9 @@
if (FLAGS_otatools_build != "") {
ota_build = ArgumentToBuild(&build_api, FLAGS_otatools_build,
DEFAULT_BUILD_TARGET, retry_period);
+ } else if (FLAGS_system_build != "") {
+ ota_build = ArgumentToBuild(&build_api, FLAGS_system_build,
+ DEFAULT_BUILD_TARGET, retry_period);
}
std::vector<std::string> ota_tools_files =
download_ota_tools(&build_api, ota_build, target_dir);
diff --git a/host/commands/gnss_grpc_proxy/Android.bp b/host/commands/gnss_grpc_proxy/Android.bp
index e85a919..fcd82f4 100644
--- a/host/commands/gnss_grpc_proxy/Android.bp
+++ b/host/commands/gnss_grpc_proxy/Android.bp
@@ -33,6 +33,7 @@
"GnssGrpcProxyStub_cc",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
diff --git a/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp b/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp
index ff8e54e..c5ecc44 100644
--- a/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp
+++ b/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-#include <iostream>
+#include <chrono>
+#include <ctime>
#include <fstream>
+#include <iostream>
#include <memory>
#include <string>
@@ -28,11 +30,13 @@
#include <chrono>
#include <deque>
#include <mutex>
+#include <sstream>
#include <thread>
#include <vector>
-#include <gflags/gflags.h>
#include <android-base/logging.h>
+#include <android-base/strings.h>
+#include <gflags/gflags.h>
#include <common/libs/fs/shared_fd.h>
#include <common/libs/fs/shared_buf.h>
@@ -63,6 +67,9 @@
"NMEA file path for gnss grpc");
constexpr char CMD_GET_LOCATION[] = "CMD_GET_LOCATION";
+constexpr char CMD_GET_RAWMEASUREMENT[] = "CMD_GET_RAWMEASUREMENT";
+constexpr char END_OF_MSG_MARK[] = "\n\n\n\n";
+
constexpr uint32_t GNSS_SERIAL_BUFFER_SIZE = 4096;
// Logic and data behind the server's behavior.
class GnssGrpcProxyServiceImpl final : public GnssGrpcProxy::Service {
@@ -73,7 +80,6 @@
Status SendNmea(ServerContext* context, const SendNmeaRequest* request,
SendNmeaReply* reply) override {
reply->set_reply("Received nmea record.");
-
auto buffer = request->nmea();
std::lock_guard<std::mutex> lock(cached_nmea_mutex);
cached_nmea = request->nmea();
@@ -81,24 +87,54 @@
}
void sendToSerial() {
- LOG(DEBUG) << "Send NMEA to serial:" << cached_nmea;
std::lock_guard<std::mutex> lock(cached_nmea_mutex);
- ssize_t bytes_written = cuttlefish::WriteAll(gnss_in_, cached_nmea);
+ if (!isNMEA(cached_nmea)) {
+ return;
+ }
+ ssize_t bytes_written =
+ cuttlefish::WriteAll(gnss_in_, cached_nmea + END_OF_MSG_MARK);
if (bytes_written < 0) {
LOG(ERROR) << "Error writing to fd: " << gnss_in_->StrError();
}
}
+ void sendGnssRawToSerial() {
+ std::lock_guard<std::mutex> lock(cached_gnss_raw_mutex);
+ if (!isGnssRawMeasurement(cached_gnss_raw)) {
+ return;
+ }
+ if (previous_cached_gnss_raw == cached_gnss_raw) {
+ // Skip for same record
+ return;
+ } else {
+ // Update cached data
+ LOG(DEBUG) << "Skip same record";
+ previous_cached_gnss_raw = cached_gnss_raw;
+ }
+ ssize_t bytes_written =
+ cuttlefish::WriteAll(gnss_in_, cached_gnss_raw + END_OF_MSG_MARK);
+ LOG(DEBUG) << "Send Gnss Raw to serial: bytes_written: " << bytes_written;
+ if (bytes_written < 0) {
+ LOG(ERROR) << "Error writing to fd: " << gnss_in_->StrError();
+ }
+ }
+
void StartServer() {
// Create a new thread to handle writes to the gnss and to the any client
// connected to the socket.
read_thread_ = std::thread([this]() { ReadLoop(); });
}
- void StartReadFileThread() {
- // Create a new thread to handle writes to the gnss and to the any client
- // connected to the socket.
- file_read_thread_ = std::thread([this]() { ReadNmeaFromLocalFile(); });
+ void StartReadNmeaFileThread() {
+ // Create a new thread to read nmea data.
+ nmea_file_read_thread_ =
+ std::thread([this]() { ReadNmeaFromLocalFile(); });
+ }
+
+ void StartReadGnssRawMeasurementFileThread() {
+ // Create a new thread to read raw measurement data.
+ measurement_file_read_thread_ =
+ std::thread([this]() { ReadGnssRawMeasurement(); });
}
void ReadNmeaFromLocalFile() {
@@ -134,6 +170,70 @@
return;
}
}
+
+ void ReadGnssRawMeasurement() {
+ std::ifstream file(FLAGS_gnss_file_path);
+
+ if (file.is_open()) {
+ std::string line;
+ std::string cached_line = "";
+ std::string header = "";
+
+ while (!cached_line.empty() || std::getline(file, line)) {
+ if (!cached_line.empty()) {
+ line = cached_line;
+ cached_line = "";
+ }
+
+ // Get data header.
+ if (header.empty() && android::base::StartsWith(line, "# Raw")) {
+ header = line;
+ LOG(DEBUG) << "Header: " << header;
+ continue;
+ }
+
+ // Ignore not raw measurement data.
+ if (!android::base::StartsWith(line, "Raw")) {
+ continue;
+ }
+
+ {
+ std::lock_guard<std::mutex> lock(cached_gnss_raw_mutex);
+ cached_gnss_raw = header + "\n" + line;
+
+ std::string new_line = "";
+ while (std::getline(file, new_line)) {
+ // Group raw data by TimeNanos.
+ if (getTimeNanosFromLine(new_line) ==
+ getTimeNanosFromLine(line)) {
+ cached_gnss_raw += "\n" + new_line;
+ } else {
+ cached_line = new_line;
+ break;
+ }
+ }
+ }
+ std::this_thread::sleep_for(std::chrono::milliseconds(1000));
+ }
+ file.close();
+ } else {
+ LOG(ERROR) << "Can not open GNSS Raw file: " << FLAGS_gnss_file_path;
+ return;
+ }
+ }
+
+ ~GnssGrpcProxyServiceImpl() {
+ if (nmea_file_read_thread_.joinable()) {
+ nmea_file_read_thread_.join();
+ }
+ if (measurement_file_read_thread_.joinable()) {
+ measurement_file_read_thread_.join();
+ }
+ if (read_thread_.joinable()) {
+ read_thread_.join();
+ }
+ }
+
private:
[[noreturn]] void ReadLoop() {
cuttlefish::SharedFDSet read_set;
@@ -159,6 +259,12 @@
gnss_cmd_str = "";
total_read = 0;
}
+
+ if (gnss_cmd_str.find(CMD_GET_RAWMEASUREMENT) != std::string::npos) {
+ sendGnssRawToSerial();
+ gnss_cmd_str = "";
+ total_read = 0;
+ }
} else {
if (gnss_out_->GetErrno() == EAGAIN|| gnss_out_->GetErrno() == EWOULDBLOCK) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
@@ -171,12 +277,35 @@
}
}
+ std::string getTimeNanosFromLine(const std::string& line) {
+ // TimeNanos is in column #3.
+ std::vector<std::string> vals = android::base::Split(line, ",");
+ return vals.size() >= 3 ? vals[2] : "-1";
+ }
+
+ bool isGnssRawMeasurement(const std::string& inputStr) {
+ // TODO: add more logic check to by pass invalid data.
+ return !inputStr.empty() && android::base::StartsWith(inputStr, "# Raw");
+ }
+
+ bool isNMEA(const std::string& inputStr) {
+ return !inputStr.empty() &&
+ (android::base::StartsWith(inputStr, "$GPRMC") ||
+ android::base::StartsWith(inputStr, "$GPRMA"));
+ }
+
cuttlefish::SharedFD gnss_in_;
cuttlefish::SharedFD gnss_out_;
std::thread read_thread_;
- std::thread file_read_thread_;
+ std::thread nmea_file_read_thread_;
+ std::thread measurement_file_read_thread_;
+
std::string cached_nmea;
std::mutex cached_nmea_mutex;
+
+ std::string cached_gnss_raw;
+ std::string previous_cached_gnss_raw;
+ std::mutex cached_gnss_raw_mutex;
};
void RunServer() {
@@ -200,7 +329,10 @@
GnssGrpcProxyServiceImpl service(gnss_in, gnss_out);
service.StartServer();
if (!FLAGS_gnss_file_path.empty()) {
- service.StartReadFileThread();
+ // TODO: On-demand start the read file threads according to data type.
+ service.StartReadNmeaFileThread();
+ service.StartReadGnssRawMeasurementFileThread();
+
// In the local mode, we are not start a grpc server, use a infinite loop instead
while(true) {
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
@@ -232,4 +364,4 @@
RunServer();
return 0;
-}
+}
\ No newline at end of file
diff --git a/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto b/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto
index 2a12d2d..4bfc854 100644
--- a/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto
+++ b/host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto
@@ -2,6 +2,9 @@
package gnss_grpc_proxy;
+option java_multiple_files = true;
+option java_package = "com.android.cuttlefish.gnssproxy.proto";
+
// The greeting service definition.
service GnssGrpcProxy {
// Sends NmeaRequest
diff --git a/host/commands/stop_cvd/Android.bp b/host/commands/health/Android.bp
similarity index 87%
copy from host/commands/stop_cvd/Android.bp
copy to host/commands/health/Android.bp
index a670a25..3681332 100644
--- a/host/commands/stop_cvd/Android.bp
+++ b/host/commands/health/Android.bp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -18,15 +18,16 @@
}
cc_binary {
- name: "stop_cvd",
+ name: "health",
srcs: [
- "main.cc",
+ "health.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
- "libcuttlefish_allocd_utils",
+ "libfruit",
"libjsoncpp",
],
static_libs: [
diff --git a/host/commands/health/health.cpp b/host/commands/health/health.cpp
new file mode 100644
index 0000000..37cce86
--- /dev/null
+++ b/host/commands/health/health.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <iostream>
+//
+#include <android-base/logging.h>
+#include <gflags/gflags.h>
+//
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/vm_manager/vm_manager.h"
+
+std::string GetControlSocketPath(const cuttlefish::CuttlefishConfig& config) {
+ return config.ForDefaultInstance().PerInstanceInternalPath(
+ "crosvm_control.sock");
+}
+
+std::string USAGE_MESSAGE =
+ "<key> [value]\n"
+ "Excluding the value will enumerate the possible values to set\n"
+ "\n"
+ "\"status [value]\" - battery status: "
+ "unknown/charging/discharging/notcharging/full\n"
+ "\"health [value]\" - battery health\n"
+ "\"present [value]\" - battery present: 1 or 0\n"
+ "\"capacity [value]\" - battery capacity: 0 to 100\n"
+ "\"aconline [value]\" - battery ac online: 1 or 0\n";
+
+int status() {
+ std::cout
+ << "health status [value]\n"
+ "\"value\" - unknown, charging, discharging, notcharging, full\n";
+ return 0;
+}
+
+int health() {
+ std::cout << "health health [value]\n"
+ "\"value\" - unknown, good, overheat, dead, overvoltage, "
+ "unexpectedfailure,\n"
+ " cold, watchdogtimerexpire, safetytimerexpire, "
+ "overcurrent\n";
+ return 0;
+}
+
+int present() {
+ std::cout << "health present [value]\n"
+ "\"value\" - 1, 0\n";
+ return 0;
+}
+
+int capacity() {
+ std::cout << "health capacity [value]\n"
+ "\"value\" - 0 to 100\n";
+ return 0;
+}
+
+int aconline() {
+ std::cout << "health aconline [value]\n"
+ "\"value\" - 1, 0\n";
+ return 0;
+}
+
+int usage() {
+ std::cout << "health " << USAGE_MESSAGE;
+ return 1;
+}
+
+int main(int argc, char** argv) {
+ ::android::base::InitLogging(argv, android::base::StderrLogger);
+ gflags::SetUsageMessage(USAGE_MESSAGE);
+
+ auto config = cuttlefish::CuttlefishConfig::Get();
+ if (!config) {
+ LOG(ERROR) << "Failed to obtain config object";
+ return 1;
+ }
+
+ if (argc != 2 && argc != 3) {
+ return usage();
+ }
+
+ std::string key = argv[1];
+ std::string value = "";
+ if (argc == 3) {
+ value = argv[2];
+ }
+
+ if (argc == 2 || value == "--help" || value == "-h" || value == "help") {
+ if (key == "status") {
+ return status();
+ } else if (key == "health") {
+ return health();
+ } else if (key == "present") {
+ return present();
+ } else if (key == "capacity") {
+ return capacity();
+ } else if (key == "aconline") {
+ return aconline();
+ } else {
+ return usage();
+ }
+ }
+
+ cuttlefish::Command command(config->crosvm_binary());
+ command.AddParameter("battery");
+ command.AddParameter("goldfish");
+ command.AddParameter(key);
+ command.AddParameter(value);
+ command.AddParameter(GetControlSocketPath(*config));
+
+ std::string output, error;
+ auto ret = RunWithManagedStdio(std::move(command), NULL, &output, &error);
+ if (ret != 0) {
+ LOG(ERROR) << "goldfish battery returned: " << ret << "\n" << output << "\n" << error;
+ }
+ return ret;
+}
diff --git a/host/commands/cvd_host_bugreport/Android.bp b/host/commands/host_bugreport/Android.bp
similarity index 89%
rename from host/commands/cvd_host_bugreport/Android.bp
rename to host/commands/host_bugreport/Android.bp
index 4f6aeda..76f184b 100644
--- a/host/commands/cvd_host_bugreport/Android.bp
+++ b/host/commands/host_bugreport/Android.bp
@@ -18,14 +18,17 @@
}
cc_binary {
- name: "cvd_host_bugreport",
+ name: "cvd_internal_host_bugreport",
+ symlinks: ["cvd_host_bugreport"],
srcs: [
"main.cc",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
+ "libfruit",
"libjsoncpp",
"libziparchive",
],
diff --git a/host/commands/cvd_host_bugreport/main.cc b/host/commands/host_bugreport/main.cc
similarity index 100%
rename from host/commands/cvd_host_bugreport/main.cc
rename to host/commands/host_bugreport/main.cc
diff --git a/host/commands/kernel_log_monitor/Android.bp b/host/commands/kernel_log_monitor/Android.bp
index 02e2be8..7421115 100644
--- a/host/commands/kernel_log_monitor/Android.bp
+++ b/host/commands/kernel_log_monitor/Android.bp
@@ -24,6 +24,7 @@
"kernel_log_server.cc",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libcuttlefish_kernel_log_monitor_utils",
diff --git a/host/commands/kernel_log_monitor/kernel_log_server.cc b/host/commands/kernel_log_monitor/kernel_log_server.cc
index 03fc90d..249ad3c 100644
--- a/host/commands/kernel_log_monitor/kernel_log_server.cc
+++ b/host/commands/kernel_log_monitor/kernel_log_server.cc
@@ -16,7 +16,8 @@
#include "host/commands/kernel_log_monitor/kernel_log_server.h"
-#include <map>
+#include <string>
+#include <tuple>
#include <utility>
#include <android-base/logging.h>
@@ -25,29 +26,44 @@
#include "common/libs/fs/shared_select.h"
#include "host/libs/config/cuttlefish_config.h"
-using cuttlefish::SharedFD;
-
namespace {
-static const std::map<std::string, std::string> kInformationalPatterns = {
+
+using cuttlefish::SharedFD;
+using monitor::Event;
+
+constexpr struct {
+ std::string_view match; // Substring to match in the kernel logs
+ std::string_view prefix; // Prefix value to output, describing the entry
+} kInformationalPatterns[] = {
{"U-Boot ", "GUEST_UBOOT_VERSION: "},
{"] Linux version ", "GUEST_KERNEL_VERSION: "},
{"GUEST_BUILD_FINGERPRINT: ", "GUEST_BUILD_FINGERPRINT: "},
};
-static const std::map<std::string, monitor::Event> kStageToEventMap = {
- {cuttlefish::kBootStartedMessage, monitor::Event::BootStarted},
- {cuttlefish::kBootCompletedMessage, monitor::Event::BootCompleted},
- {cuttlefish::kBootFailedMessage, monitor::Event::BootFailed},
- {cuttlefish::kMobileNetworkConnectedMessage,
- monitor::Event::MobileNetworkConnected},
- {cuttlefish::kWifiConnectedMessage, monitor::Event::WifiNetworkConnected},
- {cuttlefish::kEthernetConnectedMessage,
- monitor::Event::EthernetNetworkConnected},
+enum EventFormat {
+ kBare, // Just an event, no extra data
+ kKeyValuePair, // <stage> <key>=<value>
+};
+
+constexpr struct {
+ std::string_view stage; // substring in the log identifying the stage
+ Event event; // emitted when the stage is encountered
+ EventFormat format; // how the log message is formatted
+} kStageTable[] = {
+ {cuttlefish::kBootStartedMessage, Event::BootStarted, kBare},
+ {cuttlefish::kBootCompletedMessage, Event::BootCompleted, kBare},
+ {cuttlefish::kBootFailedMessage, Event::BootFailed, kKeyValuePair},
+ {cuttlefish::kMobileNetworkConnectedMessage, Event::MobileNetworkConnected,
+ kBare},
+ {cuttlefish::kWifiConnectedMessage, Event::WifiNetworkConnected, kBare},
+ {cuttlefish::kEthernetConnectedMessage, Event::EthernetNetworkConnected,
+ kBare},
// TODO(b/131864854): Replace this with a string less likely to change
- {"init: starting service 'adbd'...", monitor::Event::AdbdStarted},
- {cuttlefish::kScreenChangedMessage, monitor::Event::ScreenChanged},
+ {"init: starting service 'adbd'...", Event::AdbdStarted, kBare},
+ {cuttlefish::kScreenChangedMessage, Event::ScreenChanged, kKeyValuePair},
+ {cuttlefish::kKernelLoadedMessage, Event::KernelLoaded, kBare},
{cuttlefish::kDisplayPowerModeChangedMessage,
- monitor::Event::DisplayPowerModeChanged},
+ monitor::Event::DisplayPowerModeChanged, kKeyValuePair},
};
void ProcessSubscriptions(
@@ -112,17 +128,13 @@
// Detect VIRTUAL_DEVICE_BOOT_*
for (ssize_t i=0; i<ret; i++) {
if ('\n' == buf[i]) {
- for (auto& info_kv : kInformationalPatterns) {
- auto& match = info_kv.first;
- auto& prefix = info_kv.second;
+ for (auto& [match, prefix] : kInformationalPatterns) {
auto pos = line_.find(match);
if (std::string::npos != pos) {
LOG(INFO) << prefix << line_.substr(pos + match.size());
}
}
- for (auto& stage_kv : kStageToEventMap) {
- auto& stage = stage_kv.first;
- auto event = stage_kv.second;
+ for (const auto& [stage, event, format] : kStageTable) {
auto pos = line_.find(stage);
if (std::string::npos != pos) {
// Log the stage
@@ -131,23 +143,26 @@
Json::Value message;
message["event"] = event;
Json::Value metadata;
- // Expect space-separated key=value pairs in the log message.
- const auto& fields = android::base::Split(
- line_.substr(pos + stage.size()), " ");
- for (std::string field : fields) {
- field = android::base::Trim(field);
- if (field.empty()) {
- // Expected; android::base::Split() always returns at least
- // one (possibly empty) string.
- LOG(DEBUG) << "Empty field for line: " << line_;
- continue;
+
+ if (format == kKeyValuePair) {
+ // Expect space-separated key=value pairs in the log message.
+ const auto& fields =
+ android::base::Split(line_.substr(pos + stage.size()), " ");
+ for (std::string field : fields) {
+ field = android::base::Trim(field);
+ if (field.empty()) {
+ // Expected; android::base::Split() always returns at least
+ // one (possibly empty) string.
+ LOG(DEBUG) << "Empty field for line: " << line_;
+ continue;
+ }
+ const auto& keyvalue = android::base::Split(field, "=");
+ if (keyvalue.size() != 2) {
+ LOG(WARNING) << "Field is not in key=value format: " << field;
+ continue;
+ }
+ metadata[keyvalue[0]] = keyvalue[1];
}
- const auto& keyvalue = android::base::Split(field, "=");
- if (keyvalue.size() != 2) {
- LOG(WARNING) << "Field is not in key=value format: " << field;
- continue;
- }
- metadata[keyvalue[0]] = keyvalue[1];
}
message["metadata"] = metadata;
ProcessSubscriptions(message, &subscribers_);
@@ -157,7 +172,7 @@
if (deprecated_boot_completed_) {
// Write to host kernel log
FILE* log = popen("/usr/bin/sudo /usr/bin/tee /dev/kmsg", "w");
- fprintf(log, "%s\n", stage.c_str());
+ fprintf(log, "%s\n", std::string(stage).c_str());
fclose(log);
}
}
diff --git a/host/commands/kernel_log_monitor/kernel_log_server.h b/host/commands/kernel_log_monitor/kernel_log_server.h
index dab675d..e6e0270 100644
--- a/host/commands/kernel_log_monitor/kernel_log_server.h
+++ b/host/commands/kernel_log_monitor/kernel_log_server.h
@@ -37,6 +37,9 @@
AdbdStarted = 5,
ScreenChanged = 6,
EthernetNetworkConnected = 7,
+ KernelLoaded = 8, // BootStarted actually comes quite late in the boot.
+ // KernelLoaded is the earliest possible indicator
+ // that we're booting a device.
DisplayPowerModeChanged = 9,
};
diff --git a/host/commands/kernel_log_monitor/main.cc b/host/commands/kernel_log_monitor/main.cc
index 3f708b7..c7269b0 100644
--- a/host/commands/kernel_log_monitor/main.cc
+++ b/host/commands/kernel_log_monitor/main.cc
@@ -94,7 +94,7 @@
return 2;
}
- monitor::KernelLogServer klog{pipe, instance.PerInstancePath("kernel.log"),
+ monitor::KernelLogServer klog{pipe, instance.PerInstanceLogPath("kernel.log"),
config->deprecated_boot_completed()};
for (auto subscriber_fd: subscriber_fds) {
diff --git a/host/commands/log_tee/Android.bp b/host/commands/log_tee/Android.bp
index 49b3e69..ed1f652 100644
--- a/host/commands/log_tee/Android.bp
+++ b/host/commands/log_tee/Android.bp
@@ -23,9 +23,11 @@
"log_tee.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
+ "libfruit",
"libjsoncpp",
"libnl",
],
diff --git a/host/commands/log_tee/log_tee.cpp b/host/commands/log_tee/log_tee.cpp
index 7021a99..b63c2ac 100644
--- a/host/commands/log_tee/log_tee.cpp
+++ b/host/commands/log_tee/log_tee.cpp
@@ -64,7 +64,7 @@
// There is no guarantee of success all the time since log line boundaries
// could be out sync with the reads, but that's ok.
if (android::base::StartsWith(trimmed, "[INFO")) {
- LOG(INFO) << trimmed;
+ LOG(DEBUG) << trimmed;
} else if (android::base::StartsWith(trimmed, "[ERROR")) {
LOG(ERROR) << trimmed;
} else if (android::base::StartsWith(trimmed, "[WARNING")) {
diff --git a/host/commands/logcat_receiver/Android.bp b/host/commands/logcat_receiver/Android.bp
index 305ab7f..63f5b1b 100644
--- a/host/commands/logcat_receiver/Android.bp
+++ b/host/commands/logcat_receiver/Android.bp
@@ -23,6 +23,7 @@
"main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libjsoncpp",
diff --git a/host/commands/metrics/Android.bp b/host/commands/metrics/Android.bp
index 67eb3b0..c454b53 100644
--- a/host/commands/metrics/Android.bp
+++ b/host/commands/metrics/Android.bp
@@ -23,6 +23,7 @@
"metrics.cc",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
diff --git a/host/commands/metrics/metrics.cc b/host/commands/metrics/metrics.cc
index 378155c..5fcf58e 100644
--- a/host/commands/metrics/metrics.cc
+++ b/host/commands/metrics/metrics.cc
@@ -32,7 +32,7 @@
CHECK(config) << "Could not open cuttlefish config";
auto instance = config->ForDefaultInstance();
- auto metrics_log_path = instance.PerInstancePath("metrics.log");
+ auto metrics_log_path = instance.PerInstanceLogPath("metrics.log");
if (config->run_as_daemon()) {
android::base::SetLogger(
diff --git a/host/commands/mk_cdisk/mk_cdisk.cc b/host/commands/mk_cdisk/mk_cdisk.cc
deleted file mode 100644
index 028547c..0000000
--- a/host/commands/mk_cdisk/mk_cdisk.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// Copyright (C) 2021 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <fstream>
-#include <iostream>
-
-#include <android-base/file.h>
-#include <android-base/logging.h>
-#include <android-base/result.h>
-#include <json/json.h>
-
-#include "common/libs/utils/files.h"
-#include "host/libs/image_aggregator/image_aggregator.h"
-
-using android::base::ErrnoError;
-using android::base::Error;
-using android::base::Result;
-
-using cuttlefish::CreateCompositeDisk;
-using cuttlefish::FileExists;
-using cuttlefish::ImagePartition;
-using cuttlefish::kLinuxFilesystem;
-
-// Returns `append` is appended to the end of filename preserving the extension.
-std::string AppendFileName(const std::string& filename,
- const std::string& append) {
- size_t pos = filename.find_last_of('.');
- if (pos == std::string::npos) {
- return filename + append;
- } else {
- return filename.substr(0, pos) + append + filename.substr(pos);
- }
-}
-
-// config JSON schema:
-// {
-// "partitions": [
-// {
-// "label": string,
-// "path": string,
-// "writable": bool, // optional. defaults to false.
-// }
-// ]
-// }
-
-Result<std::vector<ImagePartition>> LoadConfig(std::istream& in) {
- std::vector<ImagePartition> partitions;
-
- Json::CharReaderBuilder builder;
- Json::Value root;
- Json::String errs;
- if (!parseFromStream(builder, in, &root, &errs)) {
- return Error() << "bad config: " << errs;
- }
- for (const Json::Value& part : root["partitions"]) {
- const std::string label = part["label"].asString();
- const std::string path = part["path"].asString();
- const bool writable =
- part["writable"].asBool(); // default: false (if null)
-
- if (!FileExists(path)) {
- return Error() << "bad config: Can't find \'" << path << '\'';
- }
- partitions.push_back(
- ImagePartition{label, path, kLinuxFilesystem, .read_only = !writable});
- }
-
- if (partitions.empty()) {
- return Error() << "bad config: no partitions";
- }
- return partitions;
-}
-
-Result<std::vector<ImagePartition>> LoadConfig(const std::string& config_file) {
- if (config_file == "-") {
- return LoadConfig(std::cin);
- } else {
- std::ifstream in(config_file);
- if (!in) {
- return ErrnoError() << "Can't open file \'" << config_file << '\'';
- }
- return LoadConfig(in);
- }
-}
-
-struct CompositeDiskArgs {
- std::string config_file;
- std::string output_file;
-};
-
-Result<CompositeDiskArgs> ParseCompositeDiskArgs(int argc, char** argv) {
- if (argc != 3) {
- std::cerr << fmt::format(
- "Usage: {0} <config_file> <output_file>\n"
- " or {0} - <output_file> (read config from STDIN)\n",
- argv[0]);
- return Error() << "missing arguments.";
- }
- CompositeDiskArgs args{
- .config_file = argv[1],
- .output_file = argv[2],
- };
- return args;
-}
-
-Result<void> MakeCompositeDiskMain(int argc, char** argv) {
- setenv("ANDROID_LOG_TAGS", "*:v", /* overwrite */ 0);
- ::android::base::InitLogging(argv, android::base::StderrLogger);
-
- auto args = ParseCompositeDiskArgs(argc, argv);
- if (!args.ok()) {
- return args.error();
- }
- auto partitions = LoadConfig(args->config_file);
- if (!partitions.ok()) {
- return partitions.error();
- }
-
- // We need two implicit output paths: GPT header/footer
- // e.g. out.img will have out-header.img and out-footer.img
- std::string gpt_header = AppendFileName(args->output_file, "-header");
- std::string gpt_footer = AppendFileName(args->output_file, "-footer");
- CreateCompositeDisk(*partitions, gpt_header, gpt_footer, args->output_file);
- return {};
-}
-
-int main(int argc, char** argv) {
- auto result = MakeCompositeDiskMain(argc, argv);
- if (!result.ok()) {
- LOG(ERROR) << result.error();
- return EXIT_FAILURE;
- }
- return 0;
-}
diff --git a/host/commands/modem_simulator/Android.bp b/host/commands/modem_simulator/Android.bp
index c0d0371..c9a6bfb 100644
--- a/host/commands/modem_simulator/Android.bp
+++ b/host/commands/modem_simulator/Android.bp
@@ -38,6 +38,7 @@
"nvram_config.cpp"
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
diff --git a/host/commands/modem_simulator/call_service.cpp b/host/commands/modem_simulator/call_service.cpp
index 678da4f..bfb17c6 100644
--- a/host/commands/modem_simulator/call_service.cpp
+++ b/host/commands/modem_simulator/call_service.cpp
@@ -194,7 +194,7 @@
client.SendCommandResponse(kCmeErrorNoNetworkService);
return;
}
- auto local_host_port = GetHostPort();
+ auto local_host_port = GetHostId();
if (local_host_port == remote_port) {
client.SendCommandResponse(kCmeErrorOperationNotAllowed);
return;
@@ -219,11 +219,13 @@
int index = last_active_call_index_++;
auto call_token = std::make_pair(index, call_status.number);
- call_status.timeout_serial = thread_looper_->PostWithDelay(
- std::chrono::minutes(1),
- makeSafeCallback<CallService>(this, [call_token](CallService* me) {
- me->TimerWaitingRemoteCallResponse(call_token);
- }));
+ call_status.timeout_serial = thread_looper_->Post(
+ makeSafeCallback<CallService>(this,
+ [call_token](CallService* me) {
+ me->TimerWaitingRemoteCallResponse(
+ call_token);
+ }),
+ std::chrono::minutes(1));
active_calls_[index] = call_status;
} else {
@@ -237,8 +239,9 @@
in_emergency_mode_ = true;
SendUnsolicitedCommand("+WSOS: 1");
}
- thread_looper_->PostWithDelay(std::chrono::seconds(1),
- makeSafeCallback(this, &CallService::SimulatePendingCallsAnswered));
+ thread_looper_->Post(
+ makeSafeCallback(this, &CallService::SimulatePendingCallsAnswered),
+ std::chrono::seconds(1));
}
client.SendCommandResponse("OK");
@@ -249,11 +252,9 @@
CallStatus::CallState state) {
if (call.is_remote_call && call.remote_client != std::nullopt) {
std::stringstream ss;
- ss << "AT+REMOTECALL=" << state << ","
- << call.is_voice_mode << ","
- << call.is_multi_party << ",\""
- << GetHostPort() << "\","
- << call.is_international;
+ ss << "AT+REMOTECALL=" << state << "," << call.is_voice_mode << ","
+ << call.is_multi_party << ",\"" << GetHostId() << "\","
+ << call.is_international;
SendCommandToRemote(*(call.remote_client), ss.str());
if (state == CallStatus::CALL_STATE_HANGUP) {
diff --git a/host/commands/modem_simulator/cf_device_config.cpp b/host/commands/modem_simulator/cf_device_config.cpp
index 559e1f8..81c60e7 100644
--- a/host/commands/modem_simulator/cf_device_config.cpp
+++ b/host/commands/modem_simulator/cf_device_config.cpp
@@ -22,14 +22,13 @@
namespace cuttlefish {
namespace modem {
-int DeviceConfig::host_port() {
+int DeviceConfig::host_id() {
if (!cuttlefish::CuttlefishConfig::Get()) {
- return 6500;
+ return 1000;
}
auto config = cuttlefish::CuttlefishConfig::Get();
auto instance = config->ForDefaultInstance();
- auto host_port = instance.host_port();
- return host_port;
+ return instance.modem_simulator_host_id();
}
std::string DeviceConfig::PerInstancePath(const char* file_name) {
diff --git a/host/commands/modem_simulator/channel_monitor.cpp b/host/commands/modem_simulator/channel_monitor.cpp
index e598f2d..941a8b4 100644
--- a/host/commands/modem_simulator/channel_monitor.cpp
+++ b/host/commands/modem_simulator/channel_monitor.cpp
@@ -45,7 +45,7 @@
if (response.back() != '\r') {
response += '\r';
}
- LOG(VERBOSE) << " AT< " << response;
+ LOG(DEBUG) << " AT< " << response;
std::lock_guard<std::mutex> autolock(const_cast<Client*>(this)->write_mutex);
client_fd->Write(response.data(), response.size());
@@ -153,7 +153,7 @@
if (r_pos != std::string::npos) {
auto command = commands.substr(pos, r_pos - pos);
if (command.size() > 0) { // "\r\r" ?
- LOG(VERBOSE) << "AT> " << command;
+ LOG(DEBUG) << "AT> " << command;
modem_->DispatchCommand(client, command);
}
pos = r_pos + 1; // Skip '\r'
diff --git a/host/commands/modem_simulator/data_service.cpp b/host/commands/modem_simulator/data_service.cpp
index b48a777..1e11e69 100644
--- a/host/commands/modem_simulator/data_service.cpp
+++ b/host/commands/modem_simulator/data_service.cpp
@@ -335,10 +335,10 @@
// call again after 1 sec delay
count--;
- thread_looper_->PostWithDelay(
- std::chrono::seconds(1),
+ thread_looper_->Post(
makeSafeCallback(this, &DataService::updatePhysicalChannelconfigs,
- modem_tech, freq, cellBandwidthDownlink, count));
+ modem_tech, freq, cellBandwidthDownlink, count),
+ std::chrono::seconds(1));
}
} // namespace cuttlefish
diff --git a/host/commands/modem_simulator/device_config.h b/host/commands/modem_simulator/device_config.h
index 05bca77..d13a38a 100644
--- a/host/commands/modem_simulator/device_config.h
+++ b/host/commands/modem_simulator/device_config.h
@@ -26,7 +26,7 @@
class DeviceConfig {
public:
- static int host_port();
+ static int host_id();
static std::string PerInstancePath(const char* file_name);
static std::string DefaultHostArtifactsPath(const std::string& file);
static std::string ril_address_and_prefix();
diff --git a/host/commands/modem_simulator/main.cpp b/host/commands/modem_simulator/main.cpp
index 794ad77..41ab6ce 100644
--- a/host/commands/modem_simulator/main.cpp
+++ b/host/commands/modem_simulator/main.cpp
@@ -63,7 +63,7 @@
auto config = cuttlefish::CuttlefishConfig::Get();
auto instance = config->ForDefaultInstance();
- auto modem_log_path = instance.PerInstancePath("modem_simulator.log");
+ auto modem_log_path = instance.PerInstanceLogPath("modem_simulator.log");
{
auto log_path = instance.launcher_log_path();
@@ -114,7 +114,7 @@
// remote call, remote sms from other cuttlefish instance
std::string monitor_socket_name = "modem_simulator";
std::stringstream ss;
- ss << instance.host_port();
+ ss << instance.modem_simulator_host_id();
monitor_socket_name.append(ss.str());
auto monitor_socket = cuttlefish::SharedFD::SocketLocalServer(
diff --git a/host/commands/modem_simulator/misc_service.cpp b/host/commands/modem_simulator/misc_service.cpp
index 1a2b767..92de290 100644
--- a/host/commands/modem_simulator/misc_service.cpp
+++ b/host/commands/modem_simulator/misc_service.cpp
@@ -15,7 +15,6 @@
#include "host/commands/modem_simulator/misc_service.h"
-#include <ctime>
#include <fstream>
#include <iomanip>
@@ -135,31 +134,37 @@
client.SendCommandResponse(responses);
}
+long MiscService::TimeZoneOffset(time_t* utctime)
+{
+ struct tm local = *std::localtime(utctime);
+ time_t local_time = std::mktime(&local);
+ struct tm gmt = *std::gmtime(utctime);
+ // mktime() converts struct tm according to local timezone.
+ time_t gmt_time = std::mktime(&gmt);
+ return (long)difftime(local_time, gmt_time);
+}
+
void MiscService::TimeUpdate() {
auto now = std::time(0);
auto local_time = *std::localtime(&now);
auto gm_time = *std::gmtime(&now);
- auto t_local_time = std::mktime(&local_time);
- auto t_gm_time = std::mktime(&gm_time);
-
// Timezone offset is in number of quarter-hours
- auto tzdiff = (int)std::difftime(t_local_time, t_gm_time) / (15 * 60);
+ auto tzdiff = TimeZoneOffset(&now) / (15 * 60);
std::stringstream ss;
- ss << "%CTZV: \"" << std::setfill('0') << std::setw(2)
- << local_time.tm_year % 100 << "/" << std::setfill('0') << std::setw(2)
- << local_time.tm_mon + 1 << "/" << std::setfill('0') << std::setw(2)
- << local_time.tm_mday << "," << std::setfill('0') << std::setw(2)
- << local_time.tm_hour << ":" << std::setfill('0') << std::setw(2)
- << local_time.tm_min << ":" << std::setfill('0') << std::setw(2)
- << local_time.tm_sec << (tzdiff >= 0 ? '+' : '-')
+ ss << "%CTZV: " << std::setfill('0') << std::setw(2)
+ << gm_time.tm_year % 100 << "/" << std::setfill('0') << std::setw(2)
+ << gm_time.tm_mon + 1 << "/" << std::setfill('0') << std::setw(2)
+ << gm_time.tm_mday << ":" << std::setfill('0') << std::setw(2)
+ << gm_time.tm_hour << ":" << std::setfill('0') << std::setw(2)
+ << gm_time.tm_min << ":" << std::setfill('0') << std::setw(2)
+ << gm_time.tm_sec << (tzdiff >= 0 ? '+' : '-')
<< (tzdiff >= 0 ? tzdiff : -tzdiff) << ":" << local_time.tm_isdst;
if (!timezone_.empty()) {
ss << ":" << timezone_;
}
- ss << "\"";
SendUnsolicitedCommand(ss.str());
}
diff --git a/host/commands/modem_simulator/misc_service.h b/host/commands/modem_simulator/misc_service.h
index e795a06..e2a6c5f 100644
--- a/host/commands/modem_simulator/misc_service.h
+++ b/host/commands/modem_simulator/misc_service.h
@@ -17,6 +17,8 @@
#include "host/commands/modem_simulator/modem_service.h"
+#include <ctime>
+
namespace cuttlefish {
class MiscService : public ModemService, public std::enable_shared_from_this<MiscService> {
@@ -36,6 +38,7 @@
private:
void ParseTimeZone();
+ long TimeZoneOffset(time_t* utctime); // in seconds.
void FixTimeZone(std::string& line);
std::string timezone_;
std::vector<CommandHandler> InitializeCommandHandlers();
diff --git a/host/commands/modem_simulator/modem_service.cpp b/host/commands/modem_simulator/modem_service.cpp
index 062da6f..7996e31 100644
--- a/host/commands/modem_simulator/modem_service.cpp
+++ b/host/commands/modem_simulator/modem_service.cpp
@@ -137,11 +137,8 @@
}
}
-std::string ModemService::GetHostPort() {
- auto host_port = cuttlefish::modem::DeviceConfig::host_port();
- std::stringstream ss;
- ss << host_port;
- return ss.str();
+std::string ModemService::GetHostId() {
+ return std::to_string(cuttlefish::modem::DeviceConfig::host_id());
}
} // namespace cuttlefish
diff --git a/host/commands/modem_simulator/modem_service.h b/host/commands/modem_simulator/modem_service.h
index 0b75d7d..744f618 100644
--- a/host/commands/modem_simulator/modem_service.h
+++ b/host/commands/modem_simulator/modem_service.h
@@ -104,7 +104,7 @@
void SendCommandToRemote(cuttlefish::SharedFD remote_client,
std::string response);
void CloseRemoteConnection(cuttlefish::SharedFD remote_client);
- static std::string GetHostPort();
+ static std::string GetHostId();
int32_t service_id_;
const std::vector<CommandHandler> command_handlers_;
diff --git a/host/commands/modem_simulator/network_service.cpp b/host/commands/modem_simulator/network_service.cpp
index 56f14e5..af9c59e 100644
--- a/host/commands/modem_simulator/network_service.cpp
+++ b/host/commands/modem_simulator/network_service.cpp
@@ -31,15 +31,6 @@
// string type; four byte GERAN/UTRAN cell ID in hexadecimal format
static const std::string kCellId = "0000B804";
-// Check SignalStrength.java file for more details on how these map to
-// signal strength bars
-const std::pair<int, int> kGSMSignalStrength = std::make_pair(4, 30);
-const std::pair<int, int> kCDMASignalStrength = std::make_pair(4, 120);
-const std::pair<int, int> kEVDOSignalStrength = std::make_pair(4, 120);
-const std::pair<int, int> kLTESignalStrength = std::make_pair(4, 30);
-const std::pair<int, int> kWCDMASignalStrength = std::make_pair(4, 30);
-const std::pair<int, int> kNRSignalStrength = std::make_pair(45, 135);
-
NetworkService::NetworkService(int32_t service_id,
ChannelMonitor* channel_monitor,
ThreadLooper* thread_looper)
@@ -255,9 +246,10 @@
// Note: not saved to nvram config due to sim status may change after reboot
current_network_mode_ = M_MODEM_TECH_WCDMA;
}
- thread_looper_->PostWithDelay(std::chrono::seconds(1),
+ thread_looper_->Post(
makeSafeCallback(this, &NetworkService::UpdateRegisterState,
- voice_registration_status_.registration_state));
+ voice_registration_status_.registration_state),
+ std::chrono::seconds(1));
}
/**
@@ -318,7 +310,6 @@
client.SendCommandResponse(kCmeErrorOperationNotSupported);
return;
}
- signal_strength_.Reset();
client.SendCommandResponse("OK");
}
@@ -335,39 +326,87 @@
return wakeup_from_sleep;
}
-void NetworkService::SetSignalStrengthValue(int& value,
- const std::pair<int, int>& range,
- double percentd) {
- value = range.first + percentd * (range.second - range.first);
- AdjustSignalStrengthValue(value, range);
-}
-
-void NetworkService::AdjustSignalStrengthValue(int& value,
- const std::pair<int, int>& range) {
- if (value < range.first) {
- value = range.first;
- } else if (value > range.second) {
- value = range.second;
- }
-}
/**
+ * IMPORTANT NOTE: Current implementation of AT+CSQ differs from standards
+ * described in TS 27.007 8.5 which only only supports RSSI and BER.
+ *
+ * TODO(b/206814247): Rename AT+CSQ command.
+ *
* AT+CSQ
- * Execution command returns received signal strength indication <rssi>
- * and channel bit error rate <ber> from the MT.
+ * Execution command returns received signal strength indication. This is a
+ * Cuttlefish specific command.
*
- * command Possible response(s)
- * AT+CSQ +CSQ: <rssi>,<ber>
- * +CME ERROR: <err>
+ * Command Possible response(s)
+ * AT+CSQ +CSQ: <gsm_rssi>,<gsm_ber>,<cdma_dbm>,
+ * <cdma_ecio>,<evdo_dbm>,<evdo_ecio>,<evdo_snr>,
+ * <lte_rssi>,<lte_rsrp>,<lte_rsrq>,<lte_rssnr>,
+ * <lte_cqi>,<lte_ta>,<tdscdma_rscp>,<wcdma_rssi>,
+ * <wcdma_ber>,<nr_ss_rsrp>,<nr_ss_rsrq>,<nr_ss_sinr>,
+ * <nr_csi_rsrp>,<nr_csi_rsrq>,<nr_csi_sinr>
+ * +CME ERROR: <err>
*
- * <rssi>: integer type
- * 0 ‑113 dBm or less
- * 1 ‑111 dBm
- * 2...30 ‑109... ‑53 dBm
- * 31 ‑51 dBm or greater
- * 99 not known or not detectable
- * <ber>: integer type; channel bit error rate (in percent)
- * 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
- * 99 not known or not detectable
+ * <gsm_rssi>: Valid values are (0-31, 99) as defined in TS 27.007 8.5.
+ * <gsm_ber>: Bit error rate (0-7, 99) as defined in TS 27.007 8.5.
+ * <cdma_dbm>: Valid values are positive integers.
+ * This value is the actual RSSI value multiplied by -1.
+ * Example: If the actual RSSI is -75, then this response value will be 75.
+ * <cdma_ecio>: Valid values are positive integers.
+ * This value is the actual Ec/Io multiplied by -10.
+ * Example: If the actual Ec/Io is -12.5 dB, then this response value will
+ * be 125.
+ * <evdo_dbm>: Refer cdma_dbm.
+ * <evdo_ecio>: Refer cdma_ecio.
+ * <evdo_snr>: Valid values are 0-8.
+ * 8 is the highest signal to noise ratio.
+ * <lte_rssi>: Refer gsm_rssi.
+ * <lte_rsrp>:
+ * The current Reference Signal Receive Power in dBm multiplied by -1.
+ * Range: 44 to 140 dBm.
+ * INT_MAX: 0x7FFFFFFF denotes invalid value.
+ * Reference: 3GPP TS 36.133 9.1.4.
+ * <lte_rsrq>:
+ * The current Reference Signal Receive Quality in dB multiplied by -1.
+ * Range: 20 to 3 dB.
+ * INT_MAX: 0x7FFFFFFF denotes invalid value.
+ * Reference: 3GPP TS 36.133 9.1.7.
+ * <lte_rssnr>:
+ * The current reference signal signal-to-noise ratio in 0.1 dB units.
+ * Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB).
+ * INT_MAX : 0x7FFFFFFF denotes invalid value.
+ * Reference: 3GPP TS 36.101 8.1.1.
+ * <lte_cqi>: The current Channel Quality Indicator.
+ * Range: 0 to 15.
+ * INT_MAX : 0x7FFFFFFF denotes invalid value.
+ * Reference: 3GPP TS 36.101 9.2, 9.3, A.4.
+ * <lte_ta>:
+ * Timing advance in micro seconds for a one way trip from cell to device.
+ * Approximate distance can be calculated using 300m/us * timingAdvance.
+ * Range: 0 to 0x7FFFFFFE.
+ * INT_MAX : 0x7FFFFFFF denotes invalid value.
+ * Reference: 3GPP 36.321 section 6.1.3.5.
+ * <tdscdma_rscp>: P-CCPCH RSCP as defined in TS 25.225 5.1.1.
+ * Valid values are (0-96, 255) as defined in TS 27.007 8.69.
+ * INT_MAX denotes that the value is invalid/unreported.
+ * <wcdma_rssi>: Refer gsm_rssi.
+ * <wcdma_ber>: Refer gsm_ber.
+ * <nr_ss_rsrp>: SS reference signal received power, multiplied by -1.
+ * Reference: 3GPP TS 38.215.
+ * Range [44, 140], INT_MAX means invalid/unreported.
+ * <nr_ss_rsrq>: SS reference signal received quality, multiplied by -1.
+ * Reference: 3GPP TS 38.215.
+ * Range [3, 20], INT_MAX means invalid/unreported.
+ * <nr_ss_sinr>: SS signal-to-noise and interference ratio.
+ * Reference: 3GPP TS 38.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
+ * Range [-23, 40], INT_MAX means invalid/unreported.
+ * <nr_csi_rsrp>: CSI reference signal received power, multiplied by -1.
+ * Reference: 3GPP TS 38.215.
+ * Range [44, 140], INT_MAX means invalid/unreported.
+ * <nr_csi_rsrq>: CSI reference signal received quality, multiplied by -1.
+ * Reference: 3GPP TS 38.215.
+ * Range [3, 20], INT_MAX means invalid/unreported.
+ * <nr_csi_sinr>: CSI signal-to-noise and interference ratio.
+ * Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
+ * Range [-23, 40], INT_MAX means invalid/unreported.
*
* see RIL_REQUEST_SIGNAL_STRENGTH in RIL
*/
@@ -384,7 +423,7 @@
android_last_signal_time_ = time(0);
- auto response = GetSignalStrength();
+ auto response = BuildCSQCommandResponse(GetCurrentSignalStrength());
responses.push_back(response);
responses.push_back("OK");
@@ -392,11 +431,9 @@
}
bool NetworkService::IsHasNetwork() {
- if (radio_state_ == RADIO_STATE_OFF ||
- oper_selection_mode_ == OperatorSelectionMode::OPER_SELECTION_DEREGISTRATION) {
- return false;
- }
- return true;
+ return radio_state_ != RADIO_STATE_OFF &&
+ oper_selection_mode_ !=
+ OperatorSelectionMode::OPER_SELECTION_DEREGISTRATION;
}
/**
@@ -676,8 +713,10 @@
NvramConfig::SaveToFile();
- thread_looper_->PostWithDelay(std::chrono::seconds(1),
- makeSafeCallback(this, &NetworkService::UpdateRegisterState, registration_state));
+ thread_looper_->Post(
+ makeSafeCallback(this, &NetworkService::UpdateRegisterState,
+ registration_state),
+ std::chrono::seconds(1));
}
NetworkService::NetworkRegistrationStatus::AccessTechnoloy
@@ -987,13 +1026,13 @@
if (current != current_network_mode_) {
UpdateRegisterState(NET_REGISTRATION_UNREGISTERED);
- signal_strength_.Reset();
ss << "+CTEC: "<< current_network_mode_;
- thread_looper_->PostWithDelay(std::chrono::milliseconds(200),
+ thread_looper_->Post(
makeSafeCallback(this, &NetworkService::UpdateRegisterState,
- NET_REGISTRATION_HOME));
+ NET_REGISTRATION_HOME),
+ std::chrono::milliseconds(200));
} else {
ss << "+CTEC: DONE";
}
@@ -1071,60 +1110,75 @@
SendUnsolicitedCommand(ss.str());
}
-std::string NetworkService::GetSignalStrength() {
+int NetworkService::GetValueInRange(const std::pair<int, int>& range,
+ int percent) {
+ int range_size = range.second - range.first + 1;
+ return range.first + (int)((percent / 101.0) * range_size);
+}
+
+std::string NetworkService::BuildCSQCommandResponse(
+ const SignalStrength& signal_strength) {
+ std::stringstream ss;
+ // clang-format off
+ ss << "+CSQ: "
+ << signal_strength.gsm_rssi << ","
+ << signal_strength.gsm_ber << ","
+ << signal_strength.cdma_dbm << ","
+ << signal_strength.cdma_ecio << ","
+ << signal_strength.evdo_dbm << ","
+ << signal_strength.evdo_ecio << ","
+ << signal_strength.evdo_snr << ","
+ << signal_strength.lte_rssi << ","
+ << signal_strength.lte_rsrp << ","
+ << signal_strength.lte_rsrq << ","
+ << signal_strength.lte_rssnr << ","
+ << signal_strength.lte_cqi << ","
+ << signal_strength.lte_ta << ","
+ << signal_strength.tdscdma_rscp << ","
+ << signal_strength.wcdma_rssi << ","
+ << signal_strength.wcdma_ber << ","
+ << signal_strength.nr_ss_rsrp << ","
+ << signal_strength.nr_ss_rsrq << ","
+ << signal_strength.nr_ss_sinr << ","
+ << signal_strength.nr_csi_rsrp << ","
+ << signal_strength.nr_csi_rsrq << ","
+ << signal_strength.nr_csi_sinr;
+ // clang-format on
+ return ss.str();
+}
+
+NetworkService::SignalStrength NetworkService::GetCurrentSignalStrength() {
+ NetworkService::SignalStrength result;
+ if (!IsHasNetwork()) {
+ return result;
+ }
+ int percent = signal_strength_percent_;
switch (current_network_mode_) {
case M_MODEM_TECH_GSM:
- signal_strength_.gsm_rssi += (rand() % 3 - 1);
- AdjustSignalStrengthValue(signal_strength_.gsm_rssi, kGSMSignalStrength);
+ result.gsm_rssi = GetValueInRange(kRssiRange, percent);
break;
case M_MODEM_TECH_CDMA:
- signal_strength_.cdma_dbm += (rand() % 3 - 1);
- AdjustSignalStrengthValue(signal_strength_.cdma_dbm, kCDMASignalStrength);
+ result.cdma_dbm = GetValueInRange(kDbmRange, percent) * -1;
break;
case M_MODEM_TECH_EVDO:
- signal_strength_.evdo_dbm += (rand() % 3 - 1);
- AdjustSignalStrengthValue(signal_strength_.evdo_dbm, kEVDOSignalStrength);
+ result.evdo_dbm = GetValueInRange(kDbmRange, percent) * -1;
break;
case M_MODEM_TECH_LTE:
- signal_strength_.lte_rssi += (rand() % 3 - 1);
- AdjustSignalStrengthValue(signal_strength_.lte_rssi, kLTESignalStrength);
+ result.lte_rsrp = GetValueInRange(kRsrpRange, percent) * -1;
break;
case M_MODEM_TECH_WCDMA:
- signal_strength_.wcdma_rssi += (rand() % 3 - 1);
- AdjustSignalStrengthValue(signal_strength_.wcdma_rssi, kWCDMASignalStrength);
+ result.wcdma_rssi = GetValueInRange(kRssiRange, percent);
break;
case M_MODEM_TECH_NR:
- signal_strength_.nr_ss_rsrp += (rand() % 3 - 1);
- AdjustSignalStrengthValue(signal_strength_.nr_ss_rsrp, kNRSignalStrength);
+ // special for NR: it uses LTE as primary, so LTE signal strength is
+ // needed as well
+ result.lte_rsrp = GetValueInRange(kRsrpRange, percent) * -1;
+ result.nr_ss_rsrp = GetValueInRange(kRsrpRange, percent) * -1;
break;
default:
break;
}
-
- std::stringstream ss;
- ss << "+CSQ: " << signal_strength_.gsm_rssi << ","
- << signal_strength_.gsm_ber << ","
- << signal_strength_.cdma_dbm << ","
- << signal_strength_.cdma_ecio << ","
- << signal_strength_.evdo_dbm << ","
- << signal_strength_.evdo_ecio << ","
- << signal_strength_.evdo_snr << ","
- << signal_strength_.lte_rssi << ","
- << signal_strength_.lte_rsrp << ","
- << signal_strength_.lte_rsrq << ","
- << signal_strength_.lte_rssnr << ","
- << signal_strength_.lte_cqi << ","
- << signal_strength_.lte_ta << ","
- << signal_strength_.tdscdma_rscp << ","
- << signal_strength_.wcdma_rssi << ","
- << signal_strength_.wcdma_ber << ","
- << signal_strength_.nr_ss_rsrp << ","
- << signal_strength_.nr_ss_rsrq << ","
- << signal_strength_.nr_ss_sinr << ","
- << signal_strength_.nr_csi_rsrp << ","
- << signal_strength_.nr_csi_rsrq << ","
- << signal_strength_.nr_csi_sinr;;
- return ss.str();
+ return result;
}
/* AT+REMOTEREG: state*/
@@ -1136,12 +1190,11 @@
int stated = std::stoi(states, nullptr, 10);
UpdateRegisterState(NET_REGISTRATION_UNREGISTERED);
- signal_strength_.Reset();
- thread_looper_->PostWithDelay(
- std::chrono::seconds(1),
+ thread_looper_->Post(
makeSafeCallback(this, &NetworkService::UpdateRegisterState,
- (cuttlefish::NetworkService::RegistrationState)stated));
+ (cuttlefish::NetworkService::RegistrationState)stated),
+ std::chrono::seconds(1));
}
/* AT+REMOTECTEC: ctec */
@@ -1162,77 +1215,13 @@
current_network_mode_ = current_network_mode_new;
auto saved_state = voice_registration_status_.registration_state;
UpdateRegisterState(NET_REGISTRATION_UNREGISTERED);
- signal_strength_.Reset();
ss << "+CTEC: " << current_network_mode_;
- thread_looper_->PostWithDelay(
- std::chrono::seconds(1),
+ thread_looper_->Post(
makeSafeCallback(this, &NetworkService::UpdateRegisterState,
- saved_state));
- }
-}
-
-void NetworkService::applySignalPercentage(double percentd) {
- switch (current_network_mode_) {
- case M_MODEM_TECH_GSM:
- signal_strength_.gsm_rssi = 99;
- signal_strength_.gsm_ber = 0;
- SetSignalStrengthValue(signal_strength_.gsm_rssi, kGSMSignalStrength,
- percentd);
- break;
- case M_MODEM_TECH_CDMA:
- signal_strength_.cdma_dbm = 125;
- signal_strength_.cdma_ecio = 165;
- SetSignalStrengthValue(signal_strength_.cdma_dbm, kCDMASignalStrength,
- percentd);
- break;
- case M_MODEM_TECH_EVDO:
- signal_strength_.evdo_dbm = 125;
- signal_strength_.evdo_ecio = 165;
- signal_strength_.evdo_snr = -1;
- SetSignalStrengthValue(signal_strength_.evdo_dbm, kEVDOSignalStrength,
- percentd);
- break;
- case M_MODEM_TECH_LTE:
- signal_strength_.lte_rssi = 99;
- signal_strength_.lte_rsrp = -1;
- signal_strength_.lte_rsrq = -5;
- signal_strength_.lte_rssnr = -205;
- signal_strength_.lte_cqi = -1;
- signal_strength_.lte_ta = -1;
- SetSignalStrengthValue(signal_strength_.lte_rssi, kLTESignalStrength,
- percentd);
- break;
- case M_MODEM_TECH_WCDMA:
- signal_strength_.tdscdma_rscp = 99;
- signal_strength_.wcdma_rssi = 99;
- signal_strength_.wcdma_ber = 0;
- SetSignalStrengthValue(signal_strength_.wcdma_rssi, kWCDMASignalStrength,
- percentd);
- break;
- case M_MODEM_TECH_NR:
- // special for NR: it uses LTE as primary, so LTE signal strength is
- // needed as well
- signal_strength_.lte_rssi = 99;
- signal_strength_.lte_rsrp = -1;
- signal_strength_.lte_rsrq = -5;
- signal_strength_.lte_rssnr = -205;
- signal_strength_.lte_cqi = -1;
- signal_strength_.lte_ta = -1;
- SetSignalStrengthValue(signal_strength_.lte_rssi, kLTESignalStrength,
- percentd);
- signal_strength_.nr_ss_rsrp = 0;
- signal_strength_.nr_ss_rsrq = 0;
- signal_strength_.nr_ss_sinr = 45;
- signal_strength_.nr_csi_rsrp = 0;
- signal_strength_.nr_csi_rsrq = 0;
- signal_strength_.nr_csi_sinr = 30;
- SetSignalStrengthValue(signal_strength_.nr_ss_rsrp, kNRSignalStrength,
- percentd);
- break;
- default:
- break;
+ saved_state),
+ std::chrono::seconds(1));
}
}
@@ -1242,12 +1231,12 @@
(void)client;
std::stringstream ss;
std::string percents = command.substr(std::string("AT+REMOTESIGNAL:").size());
- double percentd = std::stoi(percents, nullptr, 10) / 100.0;
+ int percent = std::stoi(percents, nullptr, 10);
- if (percentd >= 0 && percentd <= 1.0) {
- percentd_ = percentd;
+ if (percent >= 0 && percent <= 100) {
+ signal_strength_percent_ = percent;
} else {
- LOG(DEBUG) << "out of bound signal strength: " << percentd;
+ LOG(DEBUG) << "out of bound signal strength percent: " << percent;
return;
}
@@ -1255,9 +1244,7 @@
}
void NetworkService::OnSignalStrengthChanged() {
- applySignalPercentage(percentd_);
- auto command = GetSignalStrength();
- SendUnsolicitedCommand(command);
+ SendUnsolicitedCommand(BuildCSQCommandResponse(GetCurrentSignalStrength()));
}
NetworkService::RegistrationState NetworkService::GetVoiceRegistrationState() const {
diff --git a/host/commands/modem_simulator/network_service.h b/host/commands/modem_simulator/network_service.h
index b64d4b9..68f0d5d 100644
--- a/host/commands/modem_simulator/network_service.h
+++ b/host/commands/modem_simulator/network_service.h
@@ -20,6 +20,7 @@
#include "host/commands/modem_simulator/data_service.h"
#include "host/commands/modem_simulator/misc_service.h"
#include "host/commands/modem_simulator/modem_service.h"
+#include "host/commands/modem_simulator/network_service_constants.h"
#include "host/commands/modem_simulator/sim_service.h"
namespace cuttlefish {
@@ -82,10 +83,6 @@
bool IsHasNetwork();
void UpdateRegisterState(RegistrationState state);
void AdjustSignalStrengthValue(int& value, const std::pair<int, int>& range);
- void SetSignalStrengthValue(int& value, const std::pair<int, int>& range,
- double percentd);
- std::string GetSignalStrength();
- void applySignalPercentage(double percentd);
MiscService* misc_service_ = nullptr;
SimService* sim_service_ = nullptr;
@@ -202,61 +199,37 @@
* Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
* Range [-23, 40], INT_MAX means invalid/unreported. */
- // Default invalid value
- SignalStrength():
- gsm_rssi(99), // [0, 31]
- gsm_ber(0), // [7, 99]
- cdma_dbm(125), // [0, 120]
- cdma_ecio(165), // [0, 160]
- evdo_dbm(125), // [0, 120]
- evdo_ecio(165), // [0, 160]
- evdo_snr(-1), // [0, 8]
- lte_rssi(99), // [0, 31]
- lte_rsrp(-1), // [43,140]
- lte_rsrq(-5), // [-3,34]
- lte_rssnr(-205), // [-200, 300]
- lte_cqi(-1), // [0, 15]
- lte_ta(-1), // [0, 1282]
- tdscdma_rscp(99), // [0, 96]
- wcdma_rssi(99), // [0, 31]
- wcdma_ber(0), // [7, 99]
- nr_ss_rsrp(0), // [44, 140]
- nr_ss_rsrq(0), // [3, 10]
- nr_ss_sinr(45), // [-23,40]
- nr_csi_rsrp(0), // [44, 140]
- nr_csi_rsrq(0), // [3, 20]
- nr_csi_sinr(30) // [-23, 23]
- {}
-
- // After radio power on, off, or set network mode, reset to invalid value
- void Reset() {
- gsm_rssi = INT_MAX;
- gsm_ber = INT_MAX;
- cdma_dbm = INT_MAX;
- cdma_ecio = INT_MAX;
- evdo_dbm = INT_MAX;
- evdo_ecio = INT_MAX;
- evdo_snr = INT_MAX;
- lte_rssi = INT_MAX;
- lte_rsrp = INT_MAX;
- lte_rsrq = INT_MAX;
- lte_rssnr = INT_MAX;
- lte_cqi = INT_MAX;
- lte_ta = INT_MAX;
- tdscdma_rscp = INT_MAX;
- wcdma_rssi = INT_MAX;
- wcdma_ber = INT_MAX;
- nr_ss_rsrp = INT_MAX;
- nr_ss_rsrq = INT_MAX;
- nr_ss_sinr = INT_MAX;
- nr_csi_rsrp = INT_MAX;
- nr_csi_rsrq = INT_MAX;
- nr_csi_sinr = INT_MAX;
- }
+ SignalStrength()
+ : gsm_rssi(kRssiUnknownValue),
+ gsm_ber(kBerUnknownValue),
+ cdma_dbm(kDbmUnknownValue),
+ cdma_ecio(kEcioUnknownValue),
+ evdo_dbm(kDbmUnknownValue),
+ evdo_ecio(kEcioUnknownValue),
+ evdo_snr(kSnrUnknownValue),
+ lte_rssi(kRssiUnknownValue),
+ lte_rsrp(INT_MAX),
+ lte_rsrq(INT_MAX),
+ lte_rssnr(INT_MAX),
+ lte_cqi(INT_MAX),
+ lte_ta(INT_MAX),
+ tdscdma_rscp(INT_MAX),
+ wcdma_rssi(kRssiUnknownValue),
+ wcdma_ber(kBerUnknownValue),
+ nr_ss_rsrp(INT_MAX),
+ nr_ss_rsrq(INT_MAX),
+ nr_ss_sinr(INT_MAX),
+ nr_csi_rsrp(INT_MAX),
+ nr_csi_rsrq(INT_MAX),
+ nr_csi_sinr(INT_MAX) {}
};
- double percentd_{0.8};
- SignalStrength signal_strength_;
+ int signal_strength_percent_{80};
+
+ static int GetValueInRange(const std::pair<int, int>& range, int percent);
+ static std::string BuildCSQCommandResponse(
+ const SignalStrength& signal_strength);
+ SignalStrength GetCurrentSignalStrength();
/* Data / voice Registration State */
struct NetworkRegistrationStatus {
diff --git a/host/commands/modem_simulator/network_service_constants.h b/host/commands/modem_simulator/network_service_constants.h
new file mode 100644
index 0000000..49d0319
--- /dev/null
+++ b/host/commands/modem_simulator/network_service_constants.h
@@ -0,0 +1,34 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+namespace cuttlefish {
+
+// Constants representing a not known or not detectable value for different
+// signal strength parameters.
+constexpr int kRssiUnknownValue = 99;
+constexpr int kBerUnknownValue = 99;
+constexpr int kDbmUnknownValue = -1;
+constexpr int kEcioUnknownValue = -1;
+constexpr int kSnrUnknownValue = -1;
+
+// Constants representing the range of values of different signal strength
+// parameters.
+constexpr auto kRssiRange = std::make_pair(4, 30);
+constexpr auto kDbmRange = std::make_pair(-120, -4);
+constexpr auto kRsrpRange = std::make_pair(-140, -44);
+
+} // namespace cuttlefish
diff --git a/host/commands/modem_simulator/sms_service.cpp b/host/commands/modem_simulator/sms_service.cpp
index 0da21a6..0caee16 100644
--- a/host/commands/modem_simulator/sms_service.cpp
+++ b/host/commands/modem_simulator/sms_service.cpp
@@ -256,8 +256,8 @@
return;
}
- auto local_host_port = GetHostPort();
- auto pdu = sms_pdu.CreateRemotePDU(local_host_port);
+ auto local_host_id = GetHostId();
+ auto pdu = sms_pdu.CreateRemotePDU(local_host_id);
std::string command = "AT+REMOTESMS=" + pdu + "\r";
std::string token = "REM0";
@@ -292,25 +292,22 @@
return;
} else if (port >= kRemotePortRange.first &&
port <= kRemotePortRange.second) {
- std::stringstream ss;
- ss << port;
- auto remote_host_port = ss.str();
- if (GetHostPort() == remote_host_port) { // Send SMS to local host port
- thread_looper_->PostWithDelay(
- std::chrono::seconds(1),
- makeSafeCallback<SmsService>(this, [&sms_pdu](SmsService* me) {
- me->HandleReceiveSMS(sms_pdu);
- }));
+ auto remote_host_port = std::to_string(port);
+ if (GetHostId() == remote_host_port) { // Send SMS to local host port
+ thread_looper_->Post(
+ makeSafeCallback<SmsService>(
+ this,
+ [&sms_pdu](SmsService* me) { me->HandleReceiveSMS(sms_pdu); }),
+ std::chrono::seconds(1));
} else { // Send SMS to remote host port
SendSmsToRemote(remote_host_port, sms_pdu);
}
} else if (sim_service_ && phone_number == sim_service_->GetPhoneNumber()) {
/* Local phone number */
- thread_looper_->PostWithDelay(
- std::chrono::seconds(1),
- makeSafeCallback<SmsService>(this, [sms_pdu](SmsService* me) {
- me->HandleReceiveSMS(sms_pdu);
- }));
+ thread_looper_->Post(
+ makeSafeCallback<SmsService>(
+ this, [sms_pdu](SmsService* me) { me->HandleReceiveSMS(sms_pdu); }),
+ std::chrono::seconds(1));
} /* else pretend send SMS success */
std::stringstream ss;
@@ -321,11 +318,12 @@
if (sms_pdu.IsNeededStatuReport()) {
int ref = message_reference_;
- thread_looper_->PostWithDelay(
- std::chrono::seconds(1),
- makeSafeCallback<SmsService>(this, [sms_pdu, ref](SmsService* me) {
- me->HandleSMSStatuReport(sms_pdu, ref);
- }));
+ thread_looper_->Post(
+ makeSafeCallback<SmsService>(this,
+ [sms_pdu, ref](SmsService* me) {
+ me->HandleSMSStatuReport(sms_pdu, ref);
+ }),
+ std::chrono::seconds(1));
}
}
diff --git a/host/commands/modem_simulator/thread_looper.cpp b/host/commands/modem_simulator/thread_looper.cpp
index d9df9df..cc6c39e 100644
--- a/host/commands/modem_simulator/thread_looper.cpp
+++ b/host/commands/modem_simulator/thread_looper.cpp
@@ -42,8 +42,8 @@
return serial;
}
-ThreadLooper::Serial ThreadLooper::PostWithDelay(
- std::chrono::steady_clock::duration delay, Callback cb) {
+ThreadLooper::Serial ThreadLooper::Post(
+ Callback cb, std::chrono::steady_clock::duration delay) {
CHECK(cb != nullptr);
auto serial = next_serial_++;
diff --git a/host/commands/modem_simulator/thread_looper.h b/host/commands/modem_simulator/thread_looper.h
index dbfd201..dcc4efb 100644
--- a/host/commands/modem_simulator/thread_looper.h
+++ b/host/commands/modem_simulator/thread_looper.h
@@ -60,7 +60,7 @@
typedef int32_t Serial;
Serial Post(Callback cb);
- Serial PostWithDelay(std::chrono::steady_clock::duration delay, Callback cb);
+ Serial Post(Callback cb, std::chrono::steady_clock::duration delay);
void Stop();
diff --git a/host/commands/modem_simulator/unittest/service_test.cpp b/host/commands/modem_simulator/unittest/service_test.cpp
index 5801586..7808122 100644
--- a/host/commands/modem_simulator/unittest/service_test.cpp
+++ b/host/commands/modem_simulator/unittest/service_test.cpp
@@ -41,31 +41,31 @@
{
cuttlefish::CuttlefishConfig tmp_config_obj;
std::string config_file = tmp_test_dir + "/.cuttlefish_config.json";
- std::string instance_dir = tmp_test_dir + "/cuttlefish_runtime.1";
- fs::create_directories(instance_dir);
+ tmp_config_obj.set_root_dir(tmp_test_dir + "/cuttlefish");
tmp_config_obj.set_ril_dns("8.8.8.8");
std::vector<int> instance_nums;
for (int i = 0; i < 1; i++) {
instance_nums.push_back(cuttlefish::GetInstance() + i);
}
for (const auto &num : instance_nums) {
- auto instance = tmp_config_obj.ForInstance(num);
- instance.set_instance_dir(instance_dir);
+ tmp_config_obj.ForInstance(num); // Trigger creation in map
}
for (auto instance : tmp_config_obj.Instances()) {
+ fs::create_directories(instance.instance_dir());
if (!tmp_config_obj.SaveToFile(
instance.PerInstancePath("cuttlefish_config.json"))) {
LOG(ERROR) << "Unable to save copy config object";
return;
}
+ std::string icfilename =
+ instance.PerInstancePath("/iccprofile_for_sim0.xml");
+ std::ofstream offile(icfilename, std::ofstream::out);
+ offile << std::string(myiccfile);
+ offile.close();
+ fs::copy_file(instance.PerInstancePath("/cuttlefish_config.json"),
+ config_file, fs::copy_options::overwrite_existing);
}
- fs::copy_file(instance_dir + "/cuttlefish_config.json", config_file,
- fs::copy_options::overwrite_existing);
- std::string icfilename = instance_dir + "/iccprofile_for_sim0.xml";
- std::ofstream offile(icfilename, std::ofstream::out);
- offile << std::string(myiccfile);
- offile.close();
::setenv("CUTTLEFISH_CONFIG_FILE", config_file.c_str(), 1);
}
diff --git a/host/commands/powerwash_cvd/Android.bp b/host/commands/powerwash_cvd/Android.bp
index adaacb9..5695f8b 100644
--- a/host/commands/powerwash_cvd/Android.bp
+++ b/host/commands/powerwash_cvd/Android.bp
@@ -23,9 +23,11 @@
"powerwash_cvd.cc",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
+ "libfruit",
"libjsoncpp",
],
static_libs: [
diff --git a/host/commands/restart_cvd/Android.bp b/host/commands/restart_cvd/Android.bp
index dc7a044..8b1b971 100644
--- a/host/commands/restart_cvd/Android.bp
+++ b/host/commands/restart_cvd/Android.bp
@@ -23,9 +23,11 @@
"restart_cvd.cc",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
+ "libfruit",
"libjsoncpp",
],
static_libs: [
diff --git a/host/commands/restart_cvd/restart_cvd.cc b/host/commands/restart_cvd/restart_cvd.cc
index 68ff3e6..6c165f9 100644
--- a/host/commands/restart_cvd/restart_cvd.cc
+++ b/host/commands/restart_cvd/restart_cvd.cc
@@ -44,7 +44,6 @@
#include "common/libs/utils/environment.h"
#include "host/commands/run_cvd/runner_defs.h"
#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/vm_manager/vm_manager.h"
DEFINE_int32(instance_num, cuttlefish::GetInstance(),
"Which instance to restart");
diff --git a/host/commands/run_cvd/Android.bp b/host/commands/run_cvd/Android.bp
index 09b11d5..2f6eb0b 100644
--- a/host/commands/run_cvd/Android.bp
+++ b/host/commands/run_cvd/Android.bp
@@ -22,28 +22,33 @@
srcs: [
"boot_state_machine.cc",
"launch.cc",
- "launch_adb.cpp",
"launch_modem.cpp",
"launch_streamer.cpp",
"main.cc",
+ "reporting.cpp",
"process_monitor.cc",
"server_loop.cpp",
+ "validate.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libcuttlefish_kernel_log_monitor_utils",
"libbase",
+ "libfruit",
"libjsoncpp",
"libnl",
],
static_libs: [
"libcuttlefish_host_config",
+ "libcuttlefish_host_config_adb",
"libcuttlefish_vm_manager",
"libgflags",
],
defaults: [
"cuttlefish_host",
"cuttlefish_libicuuc",
+ "cvd_cc_defaults",
],
}
diff --git a/host/commands/run_cvd/boot_state_machine.cc b/host/commands/run_cvd/boot_state_machine.cc
index 64eb893..803b65f 100644
--- a/host/commands/run_cvd/boot_state_machine.cc
+++ b/host/commands/run_cvd/boot_state_machine.cc
@@ -16,24 +16,180 @@
#include "host/commands/run_cvd/boot_state_machine.h"
+#include <gflags/gflags.h>
#include <memory>
#include <thread>
#include "android-base/logging.h"
#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/tee_logging.h"
#include "host/commands/kernel_log_monitor/kernel_log_server.h"
#include "host/commands/kernel_log_monitor/utils.h"
#include "host/commands/run_cvd/runner_defs.h"
+#include "host/libs/config/feature.h"
+
+DEFINE_int32(reboot_notification_fd, -1,
+ "A file descriptor to notify when boot completes.");
namespace cuttlefish {
+namespace {
-CvdBootStateMachine::CvdBootStateMachine(SharedFD fg_launcher_pipe,
- SharedFD reboot_notification,
- SharedFD boot_events_pipe)
- : fg_launcher_pipe_(fg_launcher_pipe),
- reboot_notification_(reboot_notification),
- state_(kBootStarted) {
- boot_event_handler_ = std::thread([this, boot_events_pipe]() {
+// Forks and returns the write end of a pipe to the child process. The parent
+// process waits for boot events to come through the pipe and exits accordingly.
+SharedFD DaemonizeLauncher(const CuttlefishConfig& config) {
+ auto instance = config.ForDefaultInstance();
+ SharedFD read_end, write_end;
+ if (!SharedFD::Pipe(&read_end, &write_end)) {
+ LOG(ERROR) << "Unable to create pipe";
+ return {}; // a closed FD
+ }
+ auto pid = fork();
+ if (pid) {
+ // Explicitly close here, otherwise we may end up reading forever if the
+ // child process dies.
+ write_end->Close();
+ RunnerExitCodes exit_code;
+ auto bytes_read = read_end->Read(&exit_code, sizeof(exit_code));
+ if (bytes_read != sizeof(exit_code)) {
+ LOG(ERROR) << "Failed to read a complete exit code, read " << bytes_read
+ << " bytes only instead of the expected " << sizeof(exit_code);
+ exit_code = RunnerExitCodes::kPipeIOError;
+ } else if (exit_code == RunnerExitCodes::kSuccess) {
+ LOG(INFO) << "Virtual device booted successfully";
+ } else if (exit_code == RunnerExitCodes::kVirtualDeviceBootFailed) {
+ LOG(ERROR) << "Virtual device failed to boot";
+ } else {
+ LOG(ERROR) << "Unexpected exit code: " << exit_code;
+ }
+ if (exit_code == RunnerExitCodes::kSuccess) {
+ LOG(INFO) << kBootCompletedMessage;
+ } else {
+ LOG(INFO) << kBootFailedMessage;
+ }
+ std::exit(exit_code);
+ } else {
+ // The child returns the write end of the pipe
+ if (daemon(/*nochdir*/ 1, /*noclose*/ 1) != 0) {
+ LOG(ERROR) << "Failed to daemonize child process: " << strerror(errno);
+ std::exit(RunnerExitCodes::kDaemonizationError);
+ }
+ // Redirect standard I/O
+ auto log_path = instance.launcher_log_path();
+ auto log = SharedFD::Open(log_path.c_str(), O_CREAT | O_WRONLY | O_APPEND,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+ if (!log->IsOpen()) {
+ LOG(ERROR) << "Failed to create launcher log file: " << log->StrError();
+ std::exit(RunnerExitCodes::kDaemonizationError);
+ }
+ ::android::base::SetLogger(
+ TeeLogger({{LogFileSeverity(), log, MetadataLevel::FULL}}));
+ auto dev_null = SharedFD::Open("/dev/null", O_RDONLY);
+ if (!dev_null->IsOpen()) {
+ LOG(ERROR) << "Failed to open /dev/null: " << dev_null->StrError();
+ std::exit(RunnerExitCodes::kDaemonizationError);
+ }
+ if (dev_null->UNMANAGED_Dup2(0) < 0) {
+ LOG(ERROR) << "Failed dup2 stdin: " << dev_null->StrError();
+ std::exit(RunnerExitCodes::kDaemonizationError);
+ }
+ if (log->UNMANAGED_Dup2(1) < 0) {
+ LOG(ERROR) << "Failed dup2 stdout: " << log->StrError();
+ std::exit(RunnerExitCodes::kDaemonizationError);
+ }
+ if (log->UNMANAGED_Dup2(2) < 0) {
+ LOG(ERROR) << "Failed dup2 seterr: " << log->StrError();
+ std::exit(RunnerExitCodes::kDaemonizationError);
+ }
+
+ read_end->Close();
+ return write_end;
+ }
+}
+
+class ProcessLeader : public Feature {
+ public:
+ INJECT(ProcessLeader(const CuttlefishConfig& config)) : config_(config) {}
+
+ SharedFD ForegroundLauncherPipe() { return foreground_launcher_pipe_; }
+
+ // Feature
+ std::string Name() const override { return "ProcessLeader"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ /* These two paths result in pretty different process state, but both
+ * achieve the same goal of making the current process the leader of a
+ * process group, and are therefore grouped together. */
+ if (config_.run_as_daemon()) {
+ foreground_launcher_pipe_ = DaemonizeLauncher(config_);
+ if (!foreground_launcher_pipe_->IsOpen()) {
+ return false;
+ }
+ } else {
+ // Make sure the launcher runs in its own process group even when running
+ // in the foreground
+ if (getsid(0) != getpid()) {
+ int retval = setpgid(0, 0);
+ if (retval) {
+ PLOG(ERROR) << "Failed to create new process group: ";
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ SharedFD foreground_launcher_pipe_;
+};
+
+// Maintains the state of the boot process, once a final state is reached
+// (success or failure) it sends the appropriate exit code to the foreground
+// launcher process
+class CvdBootStateMachine : public Feature {
+ public:
+ INJECT(CvdBootStateMachine(ProcessLeader& process_leader,
+ KernelLogPipeProvider& kernel_log_pipe_provider))
+ : process_leader_(process_leader),
+ kernel_log_pipe_provider_(kernel_log_pipe_provider),
+ state_(kBootStarted) {}
+
+ ~CvdBootStateMachine() { boot_event_handler_.join(); }
+
+ // Feature
+ std::string Name() const override { return "CvdBootStateMachine"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const {
+ return {
+ static_cast<Feature*>(&process_leader_),
+ static_cast<Feature*>(&kernel_log_pipe_provider_),
+ };
+ }
+ bool Setup() override {
+ fg_launcher_pipe_ = process_leader_.ForegroundLauncherPipe();
+ if (FLAGS_reboot_notification_fd >= 0) {
+ reboot_notification_ = SharedFD::Dup(FLAGS_reboot_notification_fd);
+ if (!reboot_notification_->IsOpen()) {
+ LOG(ERROR) << "Could not dup fd given for reboot_notification_fd";
+ return false;
+ }
+ close(FLAGS_reboot_notification_fd);
+ }
+ SharedFD boot_events_pipe = kernel_log_pipe_provider_.KernelLogPipe();
+ if (!boot_events_pipe->IsOpen()) {
+ LOG(ERROR) << "Could not get boot events pipe";
+ return false;
+ }
+ boot_event_handler_ = std::thread(
+ [this, boot_events_pipe]() { ThreadLoop(boot_events_pipe); });
+ return true;
+ }
+
+ void ThreadLoop(SharedFD boot_events_pipe) {
while (true) {
SharedFDSet fd_set;
fd_set.Set(boot_events_pipe);
@@ -50,61 +206,72 @@
break;
}
}
- });
-}
+ }
-CvdBootStateMachine::~CvdBootStateMachine() { boot_event_handler_.join(); }
+ // Returns true if the machine is left in a final state
+ bool OnBootEvtReceived(SharedFD boot_events_pipe) {
+ std::optional<monitor::ReadEventResult> read_result =
+ monitor::ReadEvent(boot_events_pipe);
+ if (!read_result) {
+ LOG(ERROR) << "Failed to read a complete kernel log boot event.";
+ state_ |= kGuestBootFailed;
+ return MaybeWriteNotification();
+ }
-// Returns true if the machine is left in a final state
-bool CvdBootStateMachine::OnBootEvtReceived(SharedFD boot_events_pipe) {
- std::optional<monitor::ReadEventResult> read_result =
- monitor::ReadEvent(boot_events_pipe);
- if (!read_result) {
- LOG(ERROR) << "Failed to read a complete kernel log boot event.";
- state_ |= kGuestBootFailed;
+ if (read_result->event == monitor::Event::BootCompleted) {
+ LOG(INFO) << "Virtual device booted successfully";
+ state_ |= kGuestBootCompleted;
+ } else if (read_result->event == monitor::Event::BootFailed) {
+ LOG(ERROR) << "Virtual device failed to boot";
+ state_ |= kGuestBootFailed;
+ } // Ignore the other signals
+
return MaybeWriteNotification();
}
+ bool BootCompleted() const { return state_ & kGuestBootCompleted; }
+ bool BootFailed() const { return state_ & kGuestBootFailed; }
- if (read_result->event == monitor::Event::BootCompleted) {
- LOG(INFO) << "Virtual device booted successfully";
- state_ |= kGuestBootCompleted;
- } else if (read_result->event == monitor::Event::BootFailed) {
- LOG(ERROR) << "Virtual device failed to boot";
- state_ |= kGuestBootFailed;
- } // Ignore the other signals
-
- return MaybeWriteNotification();
-}
-
-bool CvdBootStateMachine::BootCompleted() const {
- return state_ & kGuestBootCompleted;
-}
-
-bool CvdBootStateMachine::BootFailed() const {
- return state_ & kGuestBootFailed;
-}
-
-void CvdBootStateMachine::SendExitCode(RunnerExitCodes exit_code, SharedFD fd) {
- fd->Write(&exit_code, sizeof(exit_code));
- // The foreground process will exit after receiving the exit code, if we try
- // to write again we'll get a SIGPIPE
- fd->Close();
-}
-
-bool CvdBootStateMachine::MaybeWriteNotification() {
- std::vector<SharedFD> fds = {reboot_notification_, fg_launcher_pipe_};
- for (auto& fd : fds) {
- if (fd->IsOpen()) {
- if (BootCompleted()) {
- SendExitCode(RunnerExitCodes::kSuccess, fd);
- } else if (state_ & kGuestBootFailed) {
- SendExitCode(RunnerExitCodes::kVirtualDeviceBootFailed, fd);
+ void SendExitCode(RunnerExitCodes exit_code, SharedFD fd) {
+ fd->Write(&exit_code, sizeof(exit_code));
+ // The foreground process will exit after receiving the exit code, if we try
+ // to write again we'll get a SIGPIPE
+ fd->Close();
+ }
+ bool MaybeWriteNotification() {
+ std::vector<SharedFD> fds = {reboot_notification_, fg_launcher_pipe_};
+ for (auto& fd : fds) {
+ if (fd->IsOpen()) {
+ if (BootCompleted()) {
+ SendExitCode(RunnerExitCodes::kSuccess, fd);
+ } else if (state_ & kGuestBootFailed) {
+ SendExitCode(RunnerExitCodes::kVirtualDeviceBootFailed, fd);
+ }
}
}
+ // Either we sent the code before or just sent it, in any case the state is
+ // final
+ return BootCompleted() || (state_ & kGuestBootFailed);
}
- // Either we sent the code before or just sent it, in any case the state is
- // final
- return BootCompleted() || (state_ & kGuestBootFailed);
+
+ ProcessLeader& process_leader_;
+ KernelLogPipeProvider& kernel_log_pipe_provider_;
+
+ std::thread boot_event_handler_;
+ SharedFD fg_launcher_pipe_;
+ SharedFD reboot_notification_;
+ int state_;
+ static const int kBootStarted = 0;
+ static const int kGuestBootCompleted = 1 << 0;
+ static const int kGuestBootFailed = 1 << 1;
+};
+
+} // namespace
+
+fruit::Component<fruit::Required<const CuttlefishConfig, KernelLogPipeProvider>>
+bootStateMachineComponent() {
+ return fruit::createComponent()
+ .addMultibinding<Feature, ProcessLeader>()
+ .addMultibinding<Feature, CvdBootStateMachine>();
}
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/boot_state_machine.h b/host/commands/run_cvd/boot_state_machine.h
index 0d02e72..796bb6f 100644
--- a/host/commands/run_cvd/boot_state_machine.h
+++ b/host/commands/run_cvd/boot_state_machine.h
@@ -15,39 +15,13 @@
*/
#pragma once
-#include <memory>
-#include <thread>
-
-#include "common/libs/fs/shared_fd.h"
-#include "host/commands/run_cvd/runner_defs.h"
+#include "host/commands/run_cvd/launch.h"
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
namespace cuttlefish {
-// Maintains the state of the boot process, once a final state is reached
-// (success or failure) it sends the appropriate exit code to the foreground
-// launcher process
-class CvdBootStateMachine {
- public:
- CvdBootStateMachine(SharedFD fg_launcher_pipe, SharedFD reboot_notification,
- SharedFD boot_events_pipe);
- ~CvdBootStateMachine();
-
- private:
- // Returns true if the machine is left in a final state
- bool OnBootEvtReceived(SharedFD boot_events_pipe);
- bool BootCompleted() const;
- bool BootFailed() const;
-
- void SendExitCode(RunnerExitCodes exit_code, SharedFD fd);
- bool MaybeWriteNotification();
-
- std::thread boot_event_handler_;
- SharedFD fg_launcher_pipe_;
- SharedFD reboot_notification_;
- int state_;
- static const int kBootStarted = 0;
- static const int kGuestBootCompleted = 1 << 0;
- static const int kGuestBootFailed = 1 << 1;
-};
+fruit::Component<fruit::Required<const CuttlefishConfig, KernelLogPipeProvider>>
+bootStateMachineComponent();
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/launch.cc b/host/commands/run_cvd/launch.cc
index a6184b2..e9ec0c8 100644
--- a/host/commands/run_cvd/launch.cc
+++ b/host/commands/run_cvd/launch.cc
@@ -16,18 +16,29 @@
#include "host/commands/run_cvd/launch.h"
#include <android-base/logging.h>
+
+#include <unordered_set>
#include <utility>
+#include <vector>
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/files.h"
+#include "common/libs/utils/network.h"
#include "common/libs/utils/subprocess.h"
#include "host/commands/run_cvd/process_monitor.h"
+#include "host/commands/run_cvd/reporting.h"
#include "host/commands/run_cvd/runner_defs.h"
#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/inject.h"
#include "host/libs/config/known_paths.h"
+#include "host/libs/vm_manager/crosvm_builder.h"
+#include "host/libs/vm_manager/crosvm_manager.h"
+#include "host/libs/vm_manager/vm_manager.h"
namespace cuttlefish {
+using vm_manager::VmManager;
+
namespace {
template <typename T>
@@ -39,335 +50,804 @@
} // namespace
-KernelLogMonitorData LaunchKernelLogMonitor(
- const CuttlefishConfig& config, unsigned int number_of_event_pipes) {
- auto instance = config.ForDefaultInstance();
- auto log_name = instance.kernel_log_pipe_name();
- if (mkfifo(log_name.c_str(), 0600) != 0) {
- LOG(ERROR) << "Unable to create named pipe at " << log_name << ": "
- << strerror(errno);
- return {};
+class KernelLogMonitor : public CommandSource,
+ public KernelLogPipeProvider,
+ public DiagnosticInformation {
+ public:
+ INJECT(KernelLogMonitor(const CuttlefishConfig::InstanceSpecific& instance))
+ : instance_(instance) {}
+
+ // DiagnosticInformation
+ std::vector<std::string> Diagnostics() const override {
+ return {"Kernel log: " + instance_.PerInstancePath("kernel.log")};
}
- SharedFD pipe;
- // Open the pipe here (from the launcher) to ensure the pipe is not deleted
- // due to the usage counters in the kernel reaching zero. If this is not done
- // and the kernel_log_monitor crashes for some reason the VMM may get SIGPIPE.
- pipe = SharedFD::Open(log_name.c_str(), O_RDWR);
- Command command(KernelLogMonitorBinary());
- command.AddParameter("-log_pipe_fd=", pipe);
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command command(KernelLogMonitorBinary());
+ command.AddParameter("-log_pipe_fd=", fifo_);
- KernelLogMonitorData ret;
-
- if (number_of_event_pipes > 0) {
- command.AddParameter("-subscriber_fds=");
- for (unsigned int i = 0; i < number_of_event_pipes; ++i) {
- SharedFD event_pipe_write_end, event_pipe_read_end;
- if (!SharedFD::Pipe(&event_pipe_read_end, &event_pipe_write_end)) {
- LOG(ERROR) << "Unable to create kernel log events pipe: " << strerror(errno);
- std::exit(RunnerExitCodes::kPipeIOError);
+ if (!event_pipe_write_ends_.empty()) {
+ command.AddParameter("-subscriber_fds=");
+ for (size_t i = 0; i < event_pipe_write_ends_.size(); i++) {
+ if (i > 0) {
+ command.AppendToLastParameter(",");
+ }
+ command.AppendToLastParameter(event_pipe_write_ends_[i]);
}
- if (i > 0) {
- command.AppendToLastParameter(",");
+ }
+
+ return single_element_emplace(std::move(command));
+ }
+
+ // KernelLogPipeProvider
+ SharedFD KernelLogPipe() override {
+ CHECK(!event_pipe_read_ends_.empty()) << "No more kernel pipes left";
+ SharedFD ret = event_pipe_read_ends_.back();
+ event_pipe_read_ends_.pop_back();
+ return ret;
+ }
+
+ private:
+ // Feature
+ bool Enabled() const override { return true; }
+ std::string Name() const override { return "KernelLogMonitor"; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto log_name = instance_.kernel_log_pipe_name();
+ if (mkfifo(log_name.c_str(), 0600) != 0) {
+ LOG(ERROR) << "Unable to create named pipe at " << log_name << ": "
+ << strerror(errno);
+ return false;
+ }
+
+ // Open the pipe here (from the launcher) to ensure the pipe is not deleted
+ // due to the usage counters in the kernel reaching zero. If this is not
+ // done and the kernel_log_monitor crashes for some reason the VMM may get
+ // SIGPIPE.
+ fifo_ = SharedFD::Open(log_name, O_RDWR);
+ if (!fifo_->IsOpen()) {
+ LOG(ERROR) << "Unable to open \"" << log_name << "\"";
+ return false;
+ }
+
+ // TODO(schuffelen): Find a way to calculate this dynamically.
+ int number_of_event_pipes = 4;
+ if (number_of_event_pipes > 0) {
+ for (unsigned int i = 0; i < number_of_event_pipes; ++i) {
+ SharedFD event_pipe_write_end, event_pipe_read_end;
+ if (!SharedFD::Pipe(&event_pipe_read_end, &event_pipe_write_end)) {
+ PLOG(ERROR) << "Unable to create kernel log events pipe: ";
+ return false;
+ }
+ event_pipe_write_ends_.push_back(event_pipe_write_end);
+ event_pipe_read_ends_.push_back(event_pipe_read_end);
}
- command.AppendToLastParameter(event_pipe_write_end);
- ret.pipes.push_back(event_pipe_read_end);
}
+ return true;
}
- ret.commands.emplace_back(std::move(command));
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD fifo_;
+ std::vector<SharedFD> event_pipe_write_ends_;
+ std::vector<SharedFD> event_pipe_read_ends_;
+};
- return ret;
-}
+class LogTeeCreator {
+ public:
+ INJECT(LogTeeCreator(const CuttlefishConfig::InstanceSpecific& instance))
+ : instance_(instance) {}
-std::vector<Command> LaunchRootCanal(const CuttlefishConfig& config) {
- if (!config.enable_host_bluetooth()) {
- return {};
+ Command CreateLogTee(Command& cmd, const std::string& process_name) {
+ auto name_with_ext = process_name + "_logs.fifo";
+ auto logs_path = instance_.PerInstanceInternalPath(name_with_ext.c_str());
+ auto logs = SharedFD::Fifo(logs_path, 0666);
+ if (!logs->IsOpen()) {
+ LOG(FATAL) << "Failed to create fifo for " << process_name
+ << " output: " << logs->StrError();
+ }
+
+ cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, logs);
+ cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, logs);
+
+ Command log_tee_cmd(HostBinaryPath("log_tee"));
+ log_tee_cmd.AddParameter("--process_name=", process_name);
+ log_tee_cmd.AddParameter("--log_fd_in=", logs);
+
+ return log_tee_cmd;
}
- auto instance = config.ForDefaultInstance();
- Command command(RootCanalBinary());
+ private:
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
- // Test port
- command.AddParameter(instance.rootcanal_test_port());
- // HCI server port
- command.AddParameter(instance.rootcanal_hci_port());
- // Link server port
- command.AddParameter(instance.rootcanal_link_port());
- // Bluetooth controller properties file
- command.AddParameter("--controller_properties_file=",
- instance.rootcanal_config_file());
- // Default commands file
- command.AddParameter("--default_commands_file=",
- instance.rootcanal_default_commands_file());
+class RootCanal : public CommandSource {
+ public:
+ INJECT(RootCanal(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance,
+ LogTeeCreator& log_tee))
+ : config_(config), instance_(instance), log_tee_(log_tee) {}
- return single_element_emplace(std::move(command));
-}
-
-std::vector<Command> LaunchLogcatReceiver(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- auto log_name = instance.logcat_pipe_name();
- if (mkfifo(log_name.c_str(), 0600) != 0) {
- LOG(ERROR) << "Unable to create named pipe at " << log_name << ": "
- << strerror(errno);
- return {};
- }
-
- SharedFD pipe;
- // Open the pipe here (from the launcher) to ensure the pipe is not deleted
- // due to the usage counters in the kernel reaching zero. If this is not done
- // and the logcat_receiver crashes for some reason the VMM may get SIGPIPE.
- pipe = SharedFD::Open(log_name.c_str(), O_RDWR);
- Command command(LogcatReceiverBinary());
- command.AddParameter("-log_pipe_fd=", pipe);
-
- return single_element_emplace(std::move(command));
-}
-
-std::vector<Command> LaunchConfigServer(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- auto port = instance.config_server_port();
- auto socket = SharedFD::VsockServer(port, SOCK_STREAM);
- if (!socket->IsOpen()) {
- LOG(ERROR) << "Unable to create configuration server socket: "
- << socket->StrError();
- std::exit(RunnerExitCodes::kConfigServerError);
- }
- Command cmd(ConfigServerBinary());
- cmd.AddParameter("-server_fd=", socket);
- return single_element_emplace(std::move(cmd));
-}
-
-std::vector<Command> LaunchTombstoneReceiver(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
-
- std::string tombstoneDir = instance.PerInstancePath("tombstones");
- if (!DirectoryExists(tombstoneDir.c_str())) {
- LOG(DEBUG) << "Setting up " << tombstoneDir;
- if (mkdir(tombstoneDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) <
- 0) {
- LOG(ERROR) << "Failed to create tombstone directory: " << tombstoneDir
- << ". Error: " << errno;
- exit(RunnerExitCodes::kTombstoneDirCreationError);
+ // CommandSource
+ std::vector<Command> Commands() override {
+ if (!Enabled()) {
return {};
}
+ Command command(RootCanalBinary());
+
+ // Test port
+ command.AddParameter(instance_.rootcanal_test_port());
+ // HCI server port
+ command.AddParameter(instance_.rootcanal_hci_port());
+ // Link server port
+ command.AddParameter(instance_.rootcanal_link_port());
+ // Bluetooth controller properties file
+ command.AddParameter("--controller_properties_file=",
+ instance_.rootcanal_config_file());
+ // Default commands file
+ command.AddParameter("--default_commands_file=",
+ instance_.rootcanal_default_commands_file());
+
+ std::vector<Command> commands;
+ commands.emplace_back(log_tee_.CreateLogTee(command, "rootcanal"));
+ commands.emplace_back(std::move(command));
+ return commands;
}
- auto port = instance.tombstone_receiver_port();
- auto socket = SharedFD::VsockServer(port, SOCK_STREAM);
- if (!socket->IsOpen()) {
- LOG(ERROR) << "Unable to create tombstone server socket: "
- << socket->StrError();
- std::exit(RunnerExitCodes::kTombstoneServerError);
- return {};
- }
- Command cmd(TombstoneReceiverBinary());
- cmd.AddParameter("-server_fd=", socket);
- cmd.AddParameter("-tombstone_dir=", tombstoneDir);
+ // Feature
+ std::string Name() const override { return "RootCanal"; }
+ bool Enabled() const override { return config_.enable_host_bluetooth(); }
- return single_element_emplace(std::move(cmd));
-}
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override { return true; }
-std::vector<Command> LaunchMetrics() {
- return single_element_emplace(Command(MetricsBinary()));
-}
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ LogTeeCreator& log_tee_;
+};
-std::vector<Command> LaunchGnssGrpcProxyServerIfEnabled(
- const CuttlefishConfig& config) {
- if (!config.enable_gnss_grpc_proxy() || !FileExists(GnssGrpcProxyBinary())) {
- return {};
+class LogcatReceiver : public CommandSource, public DiagnosticInformation {
+ public:
+ INJECT(LogcatReceiver(const CuttlefishConfig::InstanceSpecific& instance))
+ : instance_(instance) {}
+ // DiagnosticInformation
+ std::vector<std::string> Diagnostics() const override {
+ return {"Logcat output: " + instance_.logcat_path()};
}
- Command gnss_grpc_proxy_cmd(GnssGrpcProxyBinary());
- auto instance = config.ForDefaultInstance();
-
- auto gnss_in_pipe_name = instance.gnss_in_pipe_name();
- if (mkfifo(gnss_in_pipe_name.c_str(), 0600) != 0) {
- auto error = errno;
- LOG(ERROR) << "Failed to create gnss input fifo for crosvm: "
- << strerror(error);
- return {};
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command command(LogcatReceiverBinary());
+ command.AddParameter("-log_pipe_fd=", pipe_);
+ return single_element_emplace(std::move(command));
}
- auto gnss_out_pipe_name = instance.gnss_out_pipe_name();
- if (mkfifo(gnss_out_pipe_name.c_str(), 0660) != 0) {
- auto error = errno;
- LOG(ERROR) << "Failed to create gnss output fifo for crosvm: "
- << strerror(error);
- return {};
- }
+ // Feature
+ std::string Name() const override { return "LogcatReceiver"; }
+ bool Enabled() const override { return true; }
- // These fds will only be read from or written to, but open them with
- // read and write access to keep them open in case the subprocesses exit
- SharedFD gnss_grpc_proxy_in_wr =
- SharedFD::Open(gnss_in_pipe_name.c_str(), O_RDWR);
- if (!gnss_grpc_proxy_in_wr->IsOpen()) {
- LOG(ERROR) << "Failed to open gnss_grpc_proxy input fifo for writes: "
- << gnss_grpc_proxy_in_wr->StrError();
- return {};
- }
-
- SharedFD gnss_grpc_proxy_out_rd =
- SharedFD::Open(gnss_out_pipe_name.c_str(), O_RDWR);
- if (!gnss_grpc_proxy_out_rd->IsOpen()) {
- LOG(ERROR) << "Failed to open gnss_grpc_proxy output fifo for reads: "
- << gnss_grpc_proxy_out_rd->StrError();
- return {};
- }
-
- const unsigned gnss_grpc_proxy_server_port =
- instance.gnss_grpc_proxy_server_port();
- gnss_grpc_proxy_cmd.AddParameter("--gnss_in_fd=", gnss_grpc_proxy_in_wr);
- gnss_grpc_proxy_cmd.AddParameter("--gnss_out_fd=", gnss_grpc_proxy_out_rd);
- gnss_grpc_proxy_cmd.AddParameter("--gnss_grpc_port=",
- gnss_grpc_proxy_server_port);
- if (!instance.gnss_file_path().empty()) {
- // If path is provided, proxy will start as local mode.
- gnss_grpc_proxy_cmd.AddParameter("--gnss_file_path=",
- instance.gnss_file_path());
- }
- return single_element_emplace(std::move(gnss_grpc_proxy_cmd));
-}
-
-std::vector<Command> LaunchBluetoothConnector(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- std::vector<std::string> fifo_paths = {
- instance.PerInstanceInternalPath("bt_fifo_vm.in"),
- instance.PerInstanceInternalPath("bt_fifo_vm.out"),
- };
- std::vector<SharedFD> fifos;
- for (const auto& path : fifo_paths) {
- unlink(path.c_str());
- if (mkfifo(path.c_str(), 0660) < 0) {
- PLOG(ERROR) << "Could not create " << path;
- return {};
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto log_name = instance_.logcat_pipe_name();
+ if (mkfifo(log_name.c_str(), 0600) != 0) {
+ LOG(ERROR) << "Unable to create named pipe at " << log_name << ": "
+ << strerror(errno);
+ return false;
}
- auto fd = SharedFD::Open(path, O_RDWR);
- if (!fd->IsOpen()) {
- LOG(ERROR) << "Could not open " << path << ": " << fd->StrError();
- return {};
+ // Open the pipe here (from the launcher) to ensure the pipe is not deleted
+ // due to the usage counters in the kernel reaching zero. If this is not
+ // done and the logcat_receiver crashes for some reason the VMM may get
+ // SIGPIPE.
+ pipe_ = SharedFD::Open(log_name.c_str(), O_RDWR);
+ if (!pipe_->IsOpen()) {
+ LOG(ERROR) << "Can't open \"" << log_name << "\": " << pipe_->StrError();
+ return false;
}
- fifos.push_back(fd);
+ return true;
}
- Command command(DefaultHostArtifactsPath("bin/bt_connector"));
- command.AddParameter("-bt_out=", fifos[0]);
- command.AddParameter("-bt_in=", fifos[1]);
- command.AddParameter("-hci_port=", instance.rootcanal_hci_port());
- command.AddParameter("-link_port=", instance.rootcanal_link_port());
- command.AddParameter("-test_port=", instance.rootcanal_test_port());
- return single_element_emplace(std::move(command));
-}
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD pipe_;
+};
-std::vector<Command> LaunchSecureEnvironment(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- std::vector<std::string> fifo_paths = {
- instance.PerInstanceInternalPath("keymaster_fifo_vm.in"),
- instance.PerInstanceInternalPath("keymaster_fifo_vm.out"),
- instance.PerInstanceInternalPath("gatekeeper_fifo_vm.in"),
- instance.PerInstanceInternalPath("gatekeeper_fifo_vm.out"),
- };
- std::vector<SharedFD> fifos;
- for (const auto& path : fifo_paths) {
- unlink(path.c_str());
- if (mkfifo(path.c_str(), 0600) < 0) {
- PLOG(ERROR) << "Could not create " << path;
- return {};
+class ConfigServer : public CommandSource {
+ public:
+ INJECT(ConfigServer(const CuttlefishConfig::InstanceSpecific& instance))
+ : instance_(instance) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command cmd(ConfigServerBinary());
+ cmd.AddParameter("-server_fd=", socket_);
+ return single_element_emplace(std::move(cmd));
+ }
+
+ // Feature
+ std::string Name() const override { return "ConfigServer"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto port = instance_.config_server_port();
+ socket_ = SharedFD::VsockServer(port, SOCK_STREAM);
+ if (!socket_->IsOpen()) {
+ LOG(ERROR) << "Unable to create configuration server socket: "
+ << socket_->StrError();
+ return false;
}
- auto fd = SharedFD::Open(path, O_RDWR);
- if (!fd->IsOpen()) {
- LOG(ERROR) << "Could not open " << path << ": " << fd->StrError();
- return {};
+ return true;
+ }
+
+ private:
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD socket_;
+};
+
+class TombstoneReceiver : public CommandSource {
+ public:
+ INJECT(TombstoneReceiver(const CuttlefishConfig::InstanceSpecific& instance))
+ : instance_(instance) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command cmd(TombstoneReceiverBinary());
+ cmd.AddParameter("-server_fd=", socket_);
+ cmd.AddParameter("-tombstone_dir=", tombstone_dir_);
+ return single_element_emplace(std::move(cmd));
+ }
+
+ // Feature
+ std::string Name() const override { return "TombstoneReceiver"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ tombstone_dir_ = instance_.PerInstancePath("tombstones");
+ if (!DirectoryExists(tombstone_dir_.c_str())) {
+ LOG(DEBUG) << "Setting up " << tombstone_dir_;
+ if (mkdir(tombstone_dir_.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) <
+ 0) {
+ LOG(ERROR) << "Failed to create tombstone directory: " << tombstone_dir_
+ << ". Error: " << errno;
+ return false;
+ }
}
- fifos.push_back(fd);
+
+ auto port = instance_.tombstone_receiver_port();
+ socket_ = SharedFD::VsockServer(port, SOCK_STREAM);
+ if (!socket_->IsOpen()) {
+ LOG(ERROR) << "Unable to create tombstone server socket: "
+ << socket_->StrError();
+ return false;
+ }
+ return true;
}
- Command command(HostBinaryPath("secure_env"));
- command.AddParameter("-keymaster_fd_out=", fifos[0]);
- command.AddParameter("-keymaster_fd_in=", fifos[1]);
- command.AddParameter("-gatekeeper_fd_out=", fifos[2]);
- command.AddParameter("-gatekeeper_fd_in=", fifos[3]);
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD socket_;
+ std::string tombstone_dir_;
+};
- const auto& secure_hals = config.secure_hals();
- bool secure_keymint = secure_hals.count(SecureHal::Keymint) > 0;
- command.AddParameter("-keymint_impl=", secure_keymint ? "tpm" : "software");
- bool secure_gatekeeper = secure_hals.count(SecureHal::Gatekeeper) > 0;
- auto gatekeeper_impl = secure_gatekeeper ? "tpm" : "software";
- command.AddParameter("-gatekeeper_impl=", gatekeeper_impl);
+class MetricsService : public CommandSource {
+ public:
+ INJECT(MetricsService(const CuttlefishConfig& config)) : config_(config) {}
- return single_element_emplace(std::move(command));
+ // CommandSource
+ std::vector<Command> Commands() override {
+ return single_element_emplace(Command(MetricsBinary()));
+ }
+
+ // Feature
+ std::string Name() const override { return "MetricsService"; }
+ bool Enabled() const override {
+ return config_.enable_metrics() == CuttlefishConfig::kYes;
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override { return true; }
+
+ private:
+ const CuttlefishConfig& config_;
+};
+
+class GnssGrpcProxyServer : public CommandSource {
+ public:
+ INJECT(
+ GnssGrpcProxyServer(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command gnss_grpc_proxy_cmd(GnssGrpcProxyBinary());
+ const unsigned gnss_grpc_proxy_server_port =
+ instance_.gnss_grpc_proxy_server_port();
+ gnss_grpc_proxy_cmd.AddParameter("--gnss_in_fd=", gnss_grpc_proxy_in_wr_);
+ gnss_grpc_proxy_cmd.AddParameter("--gnss_out_fd=", gnss_grpc_proxy_out_rd_);
+ gnss_grpc_proxy_cmd.AddParameter("--gnss_grpc_port=",
+ gnss_grpc_proxy_server_port);
+ if (!instance_.gnss_file_path().empty()) {
+ // If path is provided, proxy will start as local mode.
+ gnss_grpc_proxy_cmd.AddParameter("--gnss_file_path=",
+ instance_.gnss_file_path());
+ }
+ return single_element_emplace(std::move(gnss_grpc_proxy_cmd));
+ }
+
+ // Feature
+ std::string Name() const override { return "GnssGrpcProxyServer"; }
+ bool Enabled() const override {
+ return config_.enable_gnss_grpc_proxy() &&
+ FileExists(GnssGrpcProxyBinary());
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ std::vector<SharedFD> fifos;
+ std::vector<std::string> fifo_paths = {
+ instance_.PerInstanceInternalPath("gnsshvc_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("gnsshvc_fifo_vm.out"),
+ };
+ for (const auto& path : fifo_paths) {
+ unlink(path.c_str());
+ if (mkfifo(path.c_str(), 0660) < 0) {
+ PLOG(ERROR) << "Could not create " << path;
+ return false;
+ }
+ auto fd = SharedFD::Open(path, O_RDWR);
+ if (!fd->IsOpen()) {
+ LOG(ERROR) << "Could not open " << path << ": " << fd->StrError();
+ return false;
+ }
+ fifos.push_back(fd);
+ }
+
+ gnss_grpc_proxy_in_wr_ = fifos[0];
+ gnss_grpc_proxy_out_rd_ = fifos[1];
+ return true;
+ }
+
+ private:
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD gnss_grpc_proxy_in_wr_;
+ SharedFD gnss_grpc_proxy_out_rd_;
+};
+
+class BluetoothConnector : public CommandSource {
+ public:
+ INJECT(BluetoothConnector(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command command(DefaultHostArtifactsPath("bin/bt_connector"));
+ command.AddParameter("-bt_out=", fifos_[0]);
+ command.AddParameter("-bt_in=", fifos_[1]);
+ command.AddParameter("-hci_port=", instance_.rootcanal_hci_port());
+ command.AddParameter("-link_port=", instance_.rootcanal_link_port());
+ command.AddParameter("-test_port=", instance_.rootcanal_test_port());
+ return single_element_emplace(std::move(command));
+ }
+
+ // Feature
+ std::string Name() const override { return "BluetoothConnector"; }
+ bool Enabled() const override { return config_.enable_host_bluetooth(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ std::vector<std::string> fifo_paths = {
+ instance_.PerInstanceInternalPath("bt_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("bt_fifo_vm.out"),
+ };
+ for (const auto& path : fifo_paths) {
+ unlink(path.c_str());
+ if (mkfifo(path.c_str(), 0660) < 0) {
+ PLOG(ERROR) << "Could not create " << path;
+ return false;
+ }
+ auto fd = SharedFD::Open(path, O_RDWR);
+ if (!fd->IsOpen()) {
+ LOG(ERROR) << "Could not open " << path << ": " << fd->StrError();
+ return false;
+ }
+ fifos_.push_back(fd);
+ }
+ return true;
+ }
+
+ private:
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ std::vector<SharedFD> fifos_;
+};
+
+class SecureEnvironment : public CommandSource {
+ public:
+ INJECT(SecureEnvironment(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance,
+ KernelLogPipeProvider& kernel_log_pipe_provider))
+ : config_(config),
+ instance_(instance),
+ kernel_log_pipe_provider_(kernel_log_pipe_provider) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command command(HostBinaryPath("secure_env"));
+ command.AddParameter("-keymaster_fd_out=", fifos_[0]);
+ command.AddParameter("-keymaster_fd_in=", fifos_[1]);
+ command.AddParameter("-gatekeeper_fd_out=", fifos_[2]);
+ command.AddParameter("-gatekeeper_fd_in=", fifos_[3]);
+
+ const auto& secure_hals = config_.secure_hals();
+ bool secure_keymint = secure_hals.count(SecureHal::Keymint) > 0;
+ command.AddParameter("-keymint_impl=", secure_keymint ? "tpm" : "software");
+ bool secure_gatekeeper = secure_hals.count(SecureHal::Gatekeeper) > 0;
+ auto gatekeeper_impl = secure_gatekeeper ? "tpm" : "software";
+ command.AddParameter("-gatekeeper_impl=", gatekeeper_impl);
+
+ command.AddParameter("-kernel_events_fd=", kernel_log_pipe_);
+
+ return single_element_emplace(std::move(command));
+ }
+
+ // Feature
+ std::string Name() const override { return "SecureEnvironment"; }
+ bool Enabled() const override { return config_.enable_host_bluetooth(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override {
+ return {&kernel_log_pipe_provider_};
+ }
+ bool Setup() override {
+ std::vector<std::string> fifo_paths = {
+ instance_.PerInstanceInternalPath("keymaster_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("keymaster_fifo_vm.out"),
+ instance_.PerInstanceInternalPath("gatekeeper_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("gatekeeper_fifo_vm.out"),
+ };
+ std::vector<SharedFD> fifos;
+ for (const auto& path : fifo_paths) {
+ unlink(path.c_str());
+ if (mkfifo(path.c_str(), 0600) < 0) {
+ PLOG(ERROR) << "Could not create " << path;
+ return false;
+ }
+ auto fd = SharedFD::Open(path, O_RDWR);
+ if (!fd->IsOpen()) {
+ LOG(ERROR) << "Could not open " << path << ": " << fd->StrError();
+ return false;
+ }
+ fifos_.push_back(fd);
+ }
+
+ kernel_log_pipe_ = kernel_log_pipe_provider_.KernelLogPipe();
+
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ std::vector<SharedFD> fifos_;
+ KernelLogPipeProvider& kernel_log_pipe_provider_;
+ SharedFD kernel_log_pipe_;
+};
+
+class VehicleHalServer : public CommandSource {
+ public:
+ INJECT(VehicleHalServer(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command grpc_server(VehicleHalGrpcServerBinary());
+
+ const unsigned vhal_server_cid = 2;
+ const unsigned vhal_server_port = instance_.vehicle_hal_server_port();
+ const std::string vhal_server_power_state_file =
+ AbsolutePath(instance_.PerInstancePath("power_state"));
+ const std::string vhal_server_power_state_socket =
+ AbsolutePath(instance_.PerInstancePath("power_state_socket"));
+
+ grpc_server.AddParameter("--server_cid=", vhal_server_cid);
+ grpc_server.AddParameter("--server_port=", vhal_server_port);
+ grpc_server.AddParameter("--power_state_file=",
+ vhal_server_power_state_file);
+ grpc_server.AddParameter("--power_state_socket=",
+ vhal_server_power_state_socket);
+ return single_element_emplace(std::move(grpc_server));
+ }
+
+ // Feature
+ std::string Name() const override { return "VehicleHalServer"; }
+ bool Enabled() const override {
+ return config_.enable_vehicle_hal_grpc_server() &&
+ FileExists(VehicleHalGrpcServerBinary());
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override { return true; }
+
+ private:
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+class ConsoleForwarder : public CommandSource, public DiagnosticInformation {
+ public:
+ INJECT(ConsoleForwarder(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+ // DiagnosticInformation
+ std::vector<std::string> Diagnostics() const override {
+ if (Enabled()) {
+ return {"To access the console run: screen " + instance_.console_path()};
+ } else {
+ return {"Serial console is disabled; use -console=true to enable it."};
+ }
+ }
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command console_forwarder_cmd(ConsoleForwarderBinary());
+
+ console_forwarder_cmd.AddParameter("--console_in_fd=",
+ console_forwarder_in_wr_);
+ console_forwarder_cmd.AddParameter("--console_out_fd=",
+ console_forwarder_out_rd_);
+ return single_element_emplace(std::move(console_forwarder_cmd));
+ }
+
+ // Feature
+ std::string Name() const override { return "ConsoleForwarder"; }
+ bool Enabled() const override { return config_.console(); }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto console_in_pipe_name = instance_.console_in_pipe_name();
+ if (mkfifo(console_in_pipe_name.c_str(), 0600) != 0) {
+ auto error = errno;
+ LOG(ERROR) << "Failed to create console input fifo for crosvm: "
+ << strerror(error);
+ return false;
+ }
+
+ auto console_out_pipe_name = instance_.console_out_pipe_name();
+ if (mkfifo(console_out_pipe_name.c_str(), 0660) != 0) {
+ auto error = errno;
+ LOG(ERROR) << "Failed to create console output fifo for crosvm: "
+ << strerror(error);
+ return false;
+ }
+
+ // These fds will only be read from or written to, but open them with
+ // read and write access to keep them open in case the subprocesses exit
+ console_forwarder_in_wr_ =
+ SharedFD::Open(console_in_pipe_name.c_str(), O_RDWR);
+ if (!console_forwarder_in_wr_->IsOpen()) {
+ LOG(ERROR) << "Failed to open console_forwarder input fifo for writes: "
+ << console_forwarder_in_wr_->StrError();
+ return false;
+ }
+
+ console_forwarder_out_rd_ =
+ SharedFD::Open(console_out_pipe_name.c_str(), O_RDWR);
+ if (!console_forwarder_out_rd_->IsOpen()) {
+ LOG(ERROR) << "Failed to open console_forwarder output fifo for reads: "
+ << console_forwarder_out_rd_->StrError();
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD console_forwarder_in_wr_;
+ SharedFD console_forwarder_out_rd_;
+};
+
+class WmediumdServer : public CommandSource {
+ public:
+ INJECT(WmediumdServer(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance,
+ LogTeeCreator& log_tee))
+ : config_(config), instance_(instance), log_tee_(log_tee) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command cmd(WmediumdBinary());
+ cmd.AddParameter("-u", config_.vhost_user_mac80211_hwsim());
+ cmd.AddParameter("-a", config_.wmediumd_api_server_socket());
+ cmd.AddParameter("-c", config_path_);
+
+ std::vector<Command> commands;
+ commands.emplace_back(log_tee_.CreateLogTee(cmd, "wmediumd"));
+ commands.emplace_back(std::move(cmd));
+ return commands;
+ }
+
+ // Feature
+ std::string Name() const override { return "WmediumdServer"; }
+ bool Enabled() const override {
+#ifndef ENFORCE_MAC80211_HWSIM
+ return false;
+#else
+ return instance_.start_wmediumd();
+#endif
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ // If wmediumd configuration is given, use it
+ if (!config_.wmediumd_config().empty()) {
+ config_path_ = config_.wmediumd_config();
+ return true;
+ }
+ // Otherwise, generate wmediumd configuration using the current wifi mac
+ // prefix before start
+ config_path_ = instance_.PerInstanceInternalPath("wmediumd.cfg");
+ Command gen_config_cmd(WmediumdGenConfigBinary());
+ gen_config_cmd.AddParameter("-o", config_path_);
+ gen_config_cmd.AddParameter("-p", instance_.wifi_mac_prefix());
+
+ int success = gen_config_cmd.Start().Wait();
+ if (success != 0) {
+ LOG(ERROR) << "Unable to run " << gen_config_cmd.Executable()
+ << ". Exited with status " << success;
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ LogTeeCreator& log_tee_;
+ std::string config_path_;
+};
+
+class VmmCommands : public CommandSource {
+ public:
+ INJECT(VmmCommands(const CuttlefishConfig& config, VmManager& vmm))
+ : config_(config), vmm_(vmm) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ return vmm_.StartCommands(config_);
+ }
+
+ // Feature
+ std::string Name() const override { return "VirtualMachineManager"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override { return true; }
+
+ const CuttlefishConfig& config_;
+ VmManager& vmm_;
+};
+
+class OpenWrt : public CommandSource {
+ public:
+ INJECT(OpenWrt(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance,
+ LogTeeCreator& log_tee))
+ : config_(config), instance_(instance), log_tee_(log_tee) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ constexpr auto crosvm_for_ap_socket = "crosvm_for_ap_control.sock";
+
+ CrosvmBuilder ap_cmd;
+ ap_cmd.SetBinary(config_.crosvm_binary());
+ ap_cmd.AddControlSocket(
+ instance_.PerInstanceInternalPath(crosvm_for_ap_socket));
+
+ if (!config_.vhost_user_mac80211_hwsim().empty()) {
+ ap_cmd.Cmd().AddParameter("--vhost-user-mac80211-hwsim=",
+ config_.vhost_user_mac80211_hwsim());
+ }
+ SharedFD wifi_tap = ap_cmd.AddTap(instance_.wifi_tap_name());
+ // Only run the leases workaround if we are not using the new network
+ // bridge architecture - in that case, we have a wider DHCP address
+ // space and stale leases should be much less of an issue
+ if (!FileExists("/var/run/cuttlefish-dnsmasq-cvd-wbr.leases") &&
+ wifi_tap->IsOpen()) {
+ // TODO(schuffelen): QEMU also needs this and this is not the best place
+ // for this code. Find a better place to put it.
+ auto lease_file =
+ ForCurrentInstance("/var/run/cuttlefish-dnsmasq-cvd-wbr-") +
+ ".leases";
+ std::uint8_t dhcp_server_ip[] = {
+ 192, 168, 96, (std::uint8_t)(ForCurrentInstance(1) * 4 - 3)};
+ if (!ReleaseDhcpLeases(lease_file, wifi_tap, dhcp_server_ip)) {
+ LOG(ERROR)
+ << "Failed to release wifi DHCP leases. Connecting to the wifi "
+ << "network may not work.";
+ }
+ }
+ if (config_.enable_sandbox()) {
+ ap_cmd.Cmd().AddParameter("--seccomp-policy-dir=",
+ config_.seccomp_policy_dir());
+ } else {
+ ap_cmd.Cmd().AddParameter("--disable-sandbox");
+ }
+ ap_cmd.Cmd().AddParameter("--rwdisk=",
+ instance_.PerInstancePath("ap_overlay.img"));
+ ap_cmd.Cmd().AddParameter(
+ "--disk=", instance_.PerInstancePath("persistent_composite.img"));
+ ap_cmd.Cmd().AddParameter("--params=\"root=" + config_.ap_image_dev_path() +
+ "\"");
+
+ auto kernel_logs_path = instance_.PerInstanceLogPath("crosvm_openwrt.log");
+ ap_cmd.AddSerialConsoleReadOnly(kernel_logs_path);
+
+ ap_cmd.Cmd().AddParameter(config_.ap_kernel_image());
+
+ std::vector<Command> commands;
+ commands.emplace_back(log_tee_.CreateLogTee(ap_cmd.Cmd(), "openwrt"));
+ commands.emplace_back(std::move(ap_cmd.Cmd()));
+ return commands;
+ }
+
+ // Feature
+ std::string Name() const override { return "OpenWrt"; }
+ bool Enabled() const override {
+#ifndef ENFORCE_MAC80211_HWSIM
+ return false;
+#else
+ return instance_.start_ap() &&
+ config_.vm_manager() == vm_manager::CrosvmManager::name();
+#endif
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override { return true; }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ LogTeeCreator& log_tee_;
+};
+
+using PublicDeps = fruit::Required<const CuttlefishConfig, VmManager,
+ const CuttlefishConfig::InstanceSpecific>;
+fruit::Component<PublicDeps, KernelLogPipeProvider> launchComponent() {
+ using InternalDeps = fruit::Required<const CuttlefishConfig, VmManager,
+ const CuttlefishConfig::InstanceSpecific,
+ KernelLogPipeProvider>;
+ using Multi = Multibindings<InternalDeps>;
+ using Bases = Multi::Bases<CommandSource, DiagnosticInformation, Feature>;
+ return fruit::createComponent()
+ .bind<KernelLogPipeProvider, KernelLogMonitor>()
+ .install(Bases::Impls<BluetoothConnector>)
+ .install(Bases::Impls<ConfigServer>)
+ .install(Bases::Impls<ConsoleForwarder>)
+ .install(Bases::Impls<GnssGrpcProxyServer>)
+ .install(Bases::Impls<KernelLogMonitor>)
+ .install(Bases::Impls<LogcatReceiver>)
+ .install(Bases::Impls<MetricsService>)
+ .install(Bases::Impls<RootCanal>)
+ .install(Bases::Impls<SecureEnvironment>)
+ .install(Bases::Impls<TombstoneReceiver>)
+ .install(Bases::Impls<VehicleHalServer>)
+ .install(Bases::Impls<VmmCommands>)
+ .install(Bases::Impls<WmediumdServer>)
+ .install(Bases::Impls<OpenWrt>);
}
-std::vector<Command> LaunchVehicleHalServerIfEnabled(
- const CuttlefishConfig& config) {
- if (!config.enable_vehicle_hal_grpc_server() ||
- !FileExists(config.vehicle_hal_grpc_server_binary())) {
- return {};
- }
-
- Command grpc_server(config.vehicle_hal_grpc_server_binary());
- auto instance = config.ForDefaultInstance();
-
- const unsigned vhal_server_cid = 2;
- const unsigned vhal_server_port = instance.vehicle_hal_server_port();
- const std::string vhal_server_power_state_file =
- AbsolutePath(instance.PerInstancePath("power_state"));
- const std::string vhal_server_power_state_socket =
- AbsolutePath(instance.PerInstancePath("power_state_socket"));
-
- grpc_server.AddParameter("--server_cid=", vhal_server_cid);
- grpc_server.AddParameter("--server_port=", vhal_server_port);
- grpc_server.AddParameter("--power_state_file=", vhal_server_power_state_file);
- grpc_server.AddParameter("--power_state_socket=", vhal_server_power_state_socket);
- return single_element_emplace(std::move(grpc_server));
-}
-
-std::vector<Command> LaunchConsoleForwarderIfEnabled(
- const CuttlefishConfig& config) {
- if (!config.console()) {
- return {};
- }
-
- Command console_forwarder_cmd(ConsoleForwarderBinary());
- auto instance = config.ForDefaultInstance();
-
- auto console_in_pipe_name = instance.console_in_pipe_name();
- if (mkfifo(console_in_pipe_name.c_str(), 0600) != 0) {
- auto error = errno;
- LOG(ERROR) << "Failed to create console input fifo for crosvm: "
- << strerror(error);
- return {};
- }
-
- auto console_out_pipe_name = instance.console_out_pipe_name();
- if (mkfifo(console_out_pipe_name.c_str(), 0660) != 0) {
- auto error = errno;
- LOG(ERROR) << "Failed to create console output fifo for crosvm: "
- << strerror(error);
- return {};
- }
-
- // These fds will only be read from or written to, but open them with
- // read and write access to keep them open in case the subprocesses exit
- SharedFD console_forwarder_in_wr =
- SharedFD::Open(console_in_pipe_name.c_str(), O_RDWR);
- if (!console_forwarder_in_wr->IsOpen()) {
- LOG(ERROR) << "Failed to open console_forwarder input fifo for writes: "
- << console_forwarder_in_wr->StrError();
- return {};
- }
-
- SharedFD console_forwarder_out_rd =
- SharedFD::Open(console_out_pipe_name.c_str(), O_RDWR);
- if (!console_forwarder_out_rd->IsOpen()) {
- LOG(ERROR) << "Failed to open console_forwarder output fifo for reads: "
- << console_forwarder_out_rd->StrError();
- return {};
- }
-
- console_forwarder_cmd.AddParameter("--console_in_fd=", console_forwarder_in_wr);
- console_forwarder_cmd.AddParameter("--console_out_fd=", console_forwarder_out_rd);
- return single_element_emplace(std::move(console_forwarder_cmd));
-}
-
-} // namespace cuttlefish
+} // namespace cuttlefish
diff --git a/host/commands/run_cvd/launch.h b/host/commands/run_cvd/launch.h
index 30d5aff..ead43bc 100644
--- a/host/commands/run_cvd/launch.h
+++ b/host/commands/run_cvd/launch.h
@@ -15,51 +15,34 @@
#pragma once
+#include <fruit/fruit.h>
+
#include <string>
#include <vector>
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/subprocess.h"
+#include "host/libs/config/command_source.h"
+#include "host/libs/config/custom_actions.h"
#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
+#include "host/libs/config/kernel_log_pipe_provider.h"
+#include "host/libs/vm_manager/vm_manager.h"
namespace cuttlefish {
-struct KernelLogMonitorData {
- std::vector<SharedFD> pipes;
- std::vector<Command> commands;
-};
+fruit::Component<fruit::Required<const CuttlefishConfig, vm_manager::VmManager,
+ const CuttlefishConfig::InstanceSpecific>,
+ KernelLogPipeProvider>
+launchComponent();
-KernelLogMonitorData LaunchKernelLogMonitor(const CuttlefishConfig& config,
- unsigned int number_of_event_pipes);
-std::vector<Command> LaunchAdbConnectorIfEnabled(
- const CuttlefishConfig& config);
-std::vector<Command> LaunchSocketVsockProxyIfEnabled(
- const CuttlefishConfig& config, SharedFD adbd_events_pipe);
-std::vector<Command> LaunchModemSimulatorIfEnabled(
- const CuttlefishConfig& config);
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>>
+launchModemComponent();
-std::vector<Command> LaunchVNCServer(const CuttlefishConfig& config);
-
-std::vector<Command> LaunchTombstoneReceiver(const CuttlefishConfig& config);
-std::vector<Command> LaunchRootCanal(const CuttlefishConfig& config);
-std::vector<Command> LaunchLogcatReceiver(const CuttlefishConfig& config);
-std::vector<Command> LaunchConfigServer(const CuttlefishConfig& config);
-
-std::vector<Command> LaunchWebRTC(const CuttlefishConfig& config,
- SharedFD kernel_log_events_pipe);
-
-std::vector<Command> LaunchMetrics();
-
-std::vector<Command> LaunchGnssGrpcProxyServerIfEnabled(
- const CuttlefishConfig& config);
-
-std::vector<Command> LaunchSecureEnvironment(const CuttlefishConfig& config);
-
-std::vector<Command> LaunchBluetoothConnector(const CuttlefishConfig& config);
-std::vector<Command> LaunchVehicleHalServerIfEnabled(
- const CuttlefishConfig& config);
-
-std::vector<Command> LaunchConsoleForwarderIfEnabled(
- const CuttlefishConfig& config);
+fruit::Component<fruit::Required<const CuttlefishConfig, KernelLogPipeProvider,
+ const CuttlefishConfig::InstanceSpecific,
+ const CustomActionConfigProvider>>
+launchStreamerComponent();
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/launch_adb.cpp b/host/commands/run_cvd/launch_adb.cpp
deleted file mode 100644
index b7996ee..0000000
--- a/host/commands/run_cvd/launch_adb.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "host/commands/run_cvd/launch.h"
-
-#include <android-base/logging.h>
-#include <set>
-#include <string>
-#include <utility>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/utils/subprocess.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/config/known_paths.h"
-
-namespace cuttlefish {
-
-namespace {
-
-std::string GetAdbConnectorTcpArg(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- return std::string{"0.0.0.0:"} + std::to_string(instance.host_port());
-}
-
-std::string GetAdbConnectorVsockArg(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- return std::string{"vsock:"} + std::to_string(instance.vsock_guest_cid()) +
- std::string{":5555"};
-}
-
-bool AdbModeEnabled(const CuttlefishConfig& config, AdbMode mode) {
- return config.adb_mode().count(mode) > 0;
-}
-
-bool AdbVsockTunnelEnabled(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- return instance.vsock_guest_cid() > 2 &&
- AdbModeEnabled(config, AdbMode::VsockTunnel);
-}
-
-bool AdbVsockHalfTunnelEnabled(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- return instance.vsock_guest_cid() > 2 &&
- AdbModeEnabled(config, AdbMode::VsockHalfTunnel);
-}
-
-bool AdbTcpConnectorEnabled(const CuttlefishConfig& config) {
- bool vsock_tunnel = AdbVsockTunnelEnabled(config);
- bool vsock_half_tunnel = AdbVsockHalfTunnelEnabled(config);
- return config.run_adb_connector() && (vsock_tunnel || vsock_half_tunnel);
-}
-
-bool AdbVsockConnectorEnabled(const CuttlefishConfig& config) {
- return config.run_adb_connector() &&
- AdbModeEnabled(config, AdbMode::NativeVsock);
-}
-
-} // namespace
-
-std::vector<Command> LaunchAdbConnectorIfEnabled(
- const CuttlefishConfig& config) {
- Command adb_connector(AdbConnectorBinary());
- std::set<std::string> addresses;
-
- if (AdbTcpConnectorEnabled(config)) {
- addresses.insert(GetAdbConnectorTcpArg(config));
- }
- if (AdbVsockConnectorEnabled(config)) {
- addresses.insert(GetAdbConnectorVsockArg(config));
- }
-
- if (addresses.size() == 0) {
- return {};
- }
- std::string address_arg = "--addresses=";
- for (auto& arg : addresses) {
- address_arg += arg + ",";
- }
- address_arg.pop_back();
- adb_connector.AddParameter(address_arg);
- std::vector<Command> commands;
- commands.emplace_back(std::move(adb_connector));
- return std::move(commands);
-}
-
-std::vector<Command> LaunchSocketVsockProxyIfEnabled(
- const CuttlefishConfig& config, SharedFD adbd_events_pipe) {
- auto instance = config.ForDefaultInstance();
- auto append = [](const std::string& s, const int i) -> std::string {
- return s + std::to_string(i);
- };
- auto tcp_server =
- SharedFD::SocketLocalServer(instance.host_port(), SOCK_STREAM);
- CHECK(tcp_server->IsOpen())
- << "Unable to create socket_vsock_proxy server socket: "
- << tcp_server->StrError();
- std::vector<Command> commands;
- if (AdbVsockTunnelEnabled(config)) {
- Command adb_tunnel(SocketVsockProxyBinary());
- adb_tunnel.AddParameter("-adbd_events_fd=", adbd_events_pipe);
- /**
- * This socket_vsock_proxy (a.k.a. sv proxy) runs on the host. It assumes
- * that another sv proxy runs inside the guest. see:
- * shared/config/init.vendor.rc The sv proxy in the guest exposes
- * vsock:cid:6520 across the cuttlefish instances in multi-tenancy. cid is
- * different per instance.
- *
- * This host sv proxy should cooperate with the guest sv proxy. Thus, one
- * end of the tunnel is vsock:cid:6520 regardless of instance number.
- * Another end faces the host adb daemon via tcp. Thus, the server type is
- * tcp here. The tcp port differs from instance to instance, and is
- * instance.host_port()
- *
- */
- adb_tunnel.AddParameter("--server=tcp");
- adb_tunnel.AddParameter("--vsock_port=6520");
- adb_tunnel.AddParameter(std::string{"--server_fd="}, tcp_server);
- adb_tunnel.AddParameter(std::string{"--vsock_cid="} +
- std::to_string(instance.vsock_guest_cid()));
- commands.emplace_back(std::move(adb_tunnel));
- }
- if (AdbVsockHalfTunnelEnabled(config)) {
- Command adb_tunnel(SocketVsockProxyBinary());
- adb_tunnel.AddParameter("-adbd_events_fd=", adbd_events_pipe);
- /*
- * This socket_vsock_proxy (a.k.a. sv proxy) runs on the host, and
- * cooperates with the adbd inside the guest. See this file:
- * shared/device.mk, especially the line says "persist.adb.tcp.port="
- *
- * The guest adbd is listening on vsock:cid:5555 across cuttlefish
- * instances. Sv proxy faces the host adb daemon via tcp. The server type
- * should be therefore tcp, and the port should differ from instance to
- * instance and be equal to instance.host_port()
- */
- adb_tunnel.AddParameter("--server=tcp");
- adb_tunnel.AddParameter(append("--vsock_port=", 5555));
- adb_tunnel.AddParameter(std::string{"--server_fd="}, tcp_server);
- adb_tunnel.AddParameter(append("--vsock_cid=", instance.vsock_guest_cid()));
- commands.emplace_back(std::move(adb_tunnel));
- }
- return commands;
-}
-
-} // namespace cuttlefish
diff --git a/host/commands/run_cvd/launch_modem.cpp b/host/commands/run_cvd/launch_modem.cpp
index 07af9f1..f139e27 100644
--- a/host/commands/run_cvd/launch_modem.cpp
+++ b/host/commands/run_cvd/launch_modem.cpp
@@ -19,6 +19,7 @@
#include <string.h>
#include <sstream>
#include <string>
+#include <unordered_set>
#include <utility>
#include "common/libs/fs/shared_fd.h"
@@ -28,16 +29,10 @@
namespace cuttlefish {
-static bool StopModemSimulator() {
- auto config = CuttlefishConfig::Get();
- auto instance = config->ForDefaultInstance();
-
- std::string monitor_socket_name = "modem_simulator";
- std::stringstream ss;
- ss << instance.host_port();
- monitor_socket_name.append(ss.str());
- auto monitor_sock = SharedFD::SocketLocalClient(monitor_socket_name.c_str(),
- true, SOCK_STREAM);
+static bool StopModemSimulator(int id) {
+ std::string socket_name = "modem_simulator" + std::to_string(id);
+ auto monitor_sock =
+ SharedFD::SocketLocalClient(socket_name, true, SOCK_STREAM);
if (!monitor_sock->IsOpen()) {
LOG(ERROR) << "The connection to modem simulator is closed";
return false;
@@ -63,55 +58,88 @@
return true;
}
-std::vector<Command> LaunchModemSimulatorIfEnabled(
- const CuttlefishConfig& config) {
- if (!config.enable_modem_simulator()) {
- LOG(DEBUG) << "Modem simulator not enabled";
- return {};
- }
+class ModemSimulator : public CommandSource {
+ public:
+ INJECT(ModemSimulator(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
- int instance_number = config.modem_simulator_instance_number();
- if (instance_number > 3 /* max value */ || instance_number < 0) {
- LOG(ERROR)
- << "Modem simulator instance number should range between 1 and 3";
- return {};
- }
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command cmd(ModemSimulatorBinary(), [this](Subprocess* proc) {
+ auto stopped = StopModemSimulator(instance_.modem_simulator_host_id());
+ if (stopped) {
+ return StopperResult::kStopSuccess;
+ }
+ LOG(WARNING) << "Failed to stop modem simulator nicely, "
+ << "attempting to KILL";
+ return KillSubprocess(proc) == StopperResult::kStopSuccess
+ ? StopperResult::kStopCrash
+ : StopperResult::kStopFailure;
+ });
- Command cmd(ModemSimulatorBinary(), [](Subprocess* proc) {
- auto stopped = StopModemSimulator();
- if (stopped) {
- return true;
+ auto sim_type = config_.modem_simulator_sim_type();
+ cmd.AddParameter(std::string{"-sim_type="} + std::to_string(sim_type));
+ cmd.AddParameter("-server_fds=");
+ bool first_socket = true;
+ for (const auto& socket : sockets_) {
+ if (!first_socket) {
+ cmd.AppendToLastParameter(",");
+ }
+ cmd.AppendToLastParameter(socket);
+ first_socket = false;
}
- LOG(WARNING) << "Failed to stop modem simulator nicely, "
- << "attempting to KILL";
- return KillSubprocess(proc);
- });
- auto sim_type = config.modem_simulator_sim_type();
- cmd.AddParameter(std::string{"-sim_type="} + std::to_string(sim_type));
-
- auto instance = config.ForDefaultInstance();
- auto ports = instance.modem_simulator_ports();
- cmd.AddParameter("-server_fds=");
- for (int i = 0; i < instance_number; ++i) {
- auto pos = ports.find(',');
- auto temp = (pos != std::string::npos) ? ports.substr(0, pos) : ports;
- auto port = std::stoi(temp);
- ports = ports.substr(pos + 1);
-
- auto socket = SharedFD::VsockServer(port, SOCK_STREAM);
- CHECK(socket->IsOpen())
- << "Unable to create modem simulator server socket: "
- << socket->StrError();
- if (i > 0) {
- cmd.AppendToLastParameter(",");
- }
- cmd.AppendToLastParameter(socket);
+ std::vector<Command> commands;
+ commands.emplace_back(std::move(cmd));
+ return commands;
}
- std::vector<Command> commands;
- commands.emplace_back(std::move(cmd));
- return commands;
+ // Feature
+ std::string Name() const override { return "ModemSimulator"; }
+ bool Enabled() const override {
+ if (!config_.enable_modem_simulator()) {
+ LOG(DEBUG) << "Modem simulator not enabled";
+ }
+ return config_.enable_modem_simulator();
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ int instance_number = config_.modem_simulator_instance_number();
+ if (instance_number > 3 /* max value */ || instance_number < 0) {
+ LOG(ERROR)
+ << "Modem simulator instance number should range between 1 and 3";
+ return false;
+ }
+ auto ports = instance_.modem_simulator_ports();
+ for (int i = 0; i < instance_number; ++i) {
+ auto pos = ports.find(',');
+ auto temp = (pos != std::string::npos) ? ports.substr(0, pos) : ports;
+ auto port = std::stoi(temp);
+ ports = ports.substr(pos + 1);
+
+ auto socket = SharedFD::VsockServer(port, SOCK_STREAM);
+ CHECK(socket->IsOpen())
+ << "Unable to create modem simulator server socket: "
+ << socket->StrError();
+ sockets_.push_back(socket);
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ std::vector<SharedFD> sockets_;
+};
+
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>>
+launchModemComponent() {
+ return fruit::createComponent()
+ .addMultibinding<CommandSource, ModemSimulator>()
+ .addMultibinding<Feature, ModemSimulator>();
}
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/launch_streamer.cpp b/host/commands/run_cvd/launch_streamer.cpp
index 7ae3f1b..ab6a5f6 100644
--- a/host/commands/run_cvd/launch_streamer.cpp
+++ b/host/commands/run_cvd/launch_streamer.cpp
@@ -16,12 +16,14 @@
#include "host/commands/run_cvd/launch.h"
#include <android-base/logging.h>
+#include <sstream>
#include <string>
#include <utility>
#include "common/libs/fs/shared_buf.h"
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/files.h"
+#include "host/commands/run_cvd/reporting.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/known_paths.h"
#include "host/libs/vm_manager/crosvm_manager.h"
@@ -41,85 +43,12 @@
return server;
}
-// Creates the frame and input sockets and add the relevant arguments to the vnc
-// server and webrtc commands
-void CreateStreamerServers(Command* cmd, const CuttlefishConfig& config) {
- std::vector<SharedFD> touch_servers;
- SharedFD keyboard_server;
-
- auto instance = config.ForDefaultInstance();
- auto use_vsockets = config.vm_manager() == vm_manager::QemuManager::name();
- for (int i = 0; i < config.display_configs().size(); ++i) {
- touch_servers.push_back(
- use_vsockets
- ? SharedFD::VsockServer(instance.touch_server_port(), SOCK_STREAM)
- : CreateUnixInputServer(instance.touch_socket_path(i)));
- if (!touch_servers.back()->IsOpen()) {
- LOG(ERROR) << "Could not open touch server: "
- << touch_servers.back()->StrError();
- return;
- }
- }
- if (!touch_servers.empty()) {
- cmd->AddParameter("-touch_fds=", touch_servers[0]);
- for (int i = 1; i < touch_servers.size(); ++i) {
- cmd->AppendToLastParameter(",", touch_servers[i]);
- }
- }
-
- if (use_vsockets) {
- cmd->AddParameter("-write_virtio_input");
-
- keyboard_server =
- SharedFD::VsockServer(instance.keyboard_server_port(), SOCK_STREAM);
- } else {
- keyboard_server = CreateUnixInputServer(instance.keyboard_socket_path());
- }
-
- if (!keyboard_server->IsOpen()) {
- LOG(ERROR) << "Could not open keyboard server: "
- << keyboard_server->StrError();
- return;
- }
- cmd->AddParameter("-keyboard_fd=", keyboard_server);
-
- if (config.enable_webrtc() &&
- config.vm_manager() == vm_manager::CrosvmManager::name()) {
- SharedFD switches_server =
- CreateUnixInputServer(instance.switches_socket_path());
- if (!switches_server->IsOpen()) {
- LOG(ERROR) << "Could not open switches server: "
- << switches_server->StrError();
- return;
- }
- cmd->AddParameter("-switches_fd=", switches_server);
- }
-
- SharedFD frames_server = CreateUnixInputServer(instance.frames_socket_path());
- if (!frames_server->IsOpen()) {
- LOG(ERROR) << "Could not open frames server: " << frames_server->StrError();
- return;
- }
- cmd->AddParameter("-frame_server_fd=", frames_server);
-
- if (config.enable_audio()) {
- auto path = config.ForDefaultInstance().audio_server_path();
- auto audio_server =
- SharedFD::SocketLocalServer(path.c_str(), false, SOCK_SEQPACKET, 0666);
- if (!audio_server->IsOpen()) {
- LOG(ERROR) << "Could not create audio server: "
- << audio_server->StrError();
- return;
- }
- cmd->AddParameter("--audio_server_fd=", audio_server);
- }
-}
-
-std::vector<Command> LaunchCustomActionServers(Command& webrtc_cmd,
- const CuttlefishConfig& config) {
+std::vector<Command> LaunchCustomActionServers(
+ Command& webrtc_cmd,
+ const std::vector<CustomActionConfig>& custom_actions) {
bool first = true;
std::vector<Command> commands;
- for (const auto& custom_action : config.custom_actions()) {
+ for (const auto& custom_action : custom_actions) {
if (custom_action.server) {
// Create a socket pair that will be used for communication between
// WebRTC and the action server.
@@ -152,84 +81,255 @@
return commands;
}
+// Creates the frame and input sockets and add the relevant arguments to
+// webrtc commands
+class StreamerSockets : public virtual Feature {
+ public:
+ INJECT(StreamerSockets(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
+
+ void AppendCommandArguments(Command& cmd) {
+ if (config_.vm_manager() == vm_manager::QemuManager::name()) {
+ cmd.AddParameter("-write_virtio_input");
+ }
+ if (!touch_servers_.empty()) {
+ cmd.AddParameter("-touch_fds=", touch_servers_[0]);
+ for (int i = 1; i < touch_servers_.size(); ++i) {
+ cmd.AppendToLastParameter(",", touch_servers_[i]);
+ }
+ }
+ cmd.AddParameter("-keyboard_fd=", keyboard_server_);
+ cmd.AddParameter("-frame_server_fd=", frames_server_);
+ if (config_.enable_audio()) {
+ cmd.AddParameter("--audio_server_fd=", audio_server_);
+ }
+ }
+
+ // Feature
+ std::string Name() const override { return "StreamerSockets"; }
+ bool Enabled() const override {
+ bool is_qemu = config_.vm_manager() == vm_manager::QemuManager::name();
+ bool is_accelerated = config_.gpu_mode() != kGpuModeGuestSwiftshader;
+ return !(is_qemu && is_accelerated);
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+
+ bool Setup() override {
+ auto use_vsockets = config_.vm_manager() == vm_manager::QemuManager::name();
+ for (int i = 0; i < config_.display_configs().size(); ++i) {
+ touch_servers_.push_back(
+ use_vsockets ? SharedFD::VsockServer(instance_.touch_server_port(),
+ SOCK_STREAM)
+ : CreateUnixInputServer(instance_.touch_socket_path(i)));
+ if (!touch_servers_.back()->IsOpen()) {
+ LOG(ERROR) << "Could not open touch server: "
+ << touch_servers_.back()->StrError();
+ return false;
+ }
+ }
+ if (use_vsockets) {
+ keyboard_server_ =
+ SharedFD::VsockServer(instance_.keyboard_server_port(), SOCK_STREAM);
+ } else {
+ keyboard_server_ =
+ CreateUnixInputServer(instance_.keyboard_socket_path());
+ }
+ if (!keyboard_server_->IsOpen()) {
+ LOG(ERROR) << "Failed to open keyboard server"
+ << keyboard_server_->StrError();
+ return false;
+ }
+ frames_server_ = CreateUnixInputServer(instance_.frames_socket_path());
+ if (!frames_server_->IsOpen()) {
+ LOG(ERROR) << "Could not open frames server: "
+ << frames_server_->StrError();
+ return false;
+ }
+ // TODO(schuffelen): Make this a separate optional feature?
+ if (config_.enable_audio()) {
+ auto path = config_.ForDefaultInstance().audio_server_path();
+ audio_server_ =
+ SharedFD::SocketLocalServer(path, false, SOCK_SEQPACKET, 0666);
+ if (!audio_server_->IsOpen()) {
+ LOG(ERROR) << "Could not create audio server: "
+ << audio_server_->StrError();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ std::vector<SharedFD> touch_servers_;
+ SharedFD keyboard_server_;
+ SharedFD frames_server_;
+ SharedFD audio_server_;
+};
+
+class WebRtcServer : public virtual CommandSource,
+ public DiagnosticInformation {
+ public:
+ INJECT(WebRtcServer(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance,
+ StreamerSockets& sockets,
+ KernelLogPipeProvider& log_pipe_provider,
+ const CustomActionConfigProvider& custom_action_config))
+ : config_(config),
+ instance_(instance),
+ sockets_(sockets),
+ log_pipe_provider_(log_pipe_provider),
+ custom_action_config_(custom_action_config) {}
+ // DiagnosticInformation
+ std::vector<std::string> Diagnostics() const override {
+ if (!Enabled() || !config_.ForDefaultInstance().start_webrtc_sig_server()) {
+ // When WebRTC is enabled but an operator other than the one launched by
+ // run_cvd is used there is no way to know the url to which to point the
+ // browser to.
+ return {};
+ }
+ std::ostringstream out;
+ out << "Point your browser to https://" << config_.sig_server_address()
+ << ":" << config_.sig_server_port() << " to interact with the device.";
+ return {out.str()};
+ }
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ std::vector<Command> commands;
+ if (instance_.start_webrtc_sig_server()) {
+ Command sig_server(WebRtcSigServerBinary());
+ sig_server.AddParameter("-assets_dir=", config_.webrtc_assets_dir());
+ sig_server.AddParameter(
+ "-use_secure_http=",
+ config_.sig_server_secure() ? "true" : "false");
+ if (!config_.webrtc_certs_dir().empty()) {
+ sig_server.AddParameter("-certs_dir=", config_.webrtc_certs_dir());
+ }
+ sig_server.AddParameter("-http_server_port=", config_.sig_server_port());
+ commands.emplace_back(std::move(sig_server));
+ }
+
+ if (instance_.start_webrtc_sig_server_proxy()) {
+ Command sig_proxy(WebRtcSigServerProxyBinary());
+ sig_proxy.AddParameter("-use_secure_http=",
+ config_.sig_server_secure() ? "true" : "false");
+ if (!config_.webrtc_certs_dir().empty()) {
+ sig_proxy.AddParameter("-certs_dir=", config_.webrtc_certs_dir());
+ }
+ sig_proxy.AddParameter("-http_server_port=", config_.sig_server_port());
+ commands.emplace_back(std::move(sig_proxy));
+ }
+
+ auto stopper = [host_socket = std::move(host_socket_)](Subprocess* proc) {
+ struct timeval timeout;
+ timeout.tv_sec = 3;
+ timeout.tv_usec = 0;
+ CHECK(host_socket->SetSockOpt(SOL_SOCKET, SO_RCVTIMEO, &timeout,
+ sizeof(timeout)) == 0)
+ << "Could not set receive timeout";
+
+ WriteAll(host_socket, "C");
+ char response[1];
+ int read_ret = host_socket->Read(response, sizeof(response));
+ if (read_ret != 0) {
+ LOG(ERROR) << "Failed to read response from webrtc";
+ return KillSubprocess(proc);
+ }
+ return KillSubprocess(proc) == StopperResult::kStopSuccess
+ ? StopperResult::kStopCrash
+ : StopperResult::kStopFailure;
+ };
+
+ Command webrtc(WebRtcBinary(), stopper);
+ webrtc.UnsetFromEnvironment("http_proxy");
+ sockets_.AppendCommandArguments(webrtc);
+ if (config_.vm_manager() == vm_manager::CrosvmManager::name()) {
+ webrtc.AddParameter("-switches_fd=", switches_server_);
+ }
+ // Currently there is no way to ensure the signaling server will already
+ // have bound the socket to the port by the time the webrtc process runs
+ // (the common technique of doing it from the launcher is not possible here
+ // as the server library being used creates its own sockets). However, this
+ // issue is mitigated slightly by doing some retrying and backoff in the
+ // webrtc process when connecting to the websocket, so it shouldn't be an
+ // issue most of the time.
+ webrtc.AddParameter("--command_fd=", client_socket_);
+ webrtc.AddParameter("-kernel_log_events_fd=", kernel_log_events_pipe_);
+ webrtc.AddParameter("-client_dir=",
+ DefaultHostArtifactsPath("usr/share/webrtc/assets"));
+
+ // TODO get from launcher params
+ const auto& actions = custom_action_config_.CustomActions();
+ for (auto& action : LaunchCustomActionServers(webrtc, actions)) {
+ commands.emplace_back(std::move(action));
+ }
+ commands.emplace_back(std::move(webrtc));
+
+ return commands;
+ }
+
+ // Feature
+ bool Enabled() const override {
+ return sockets_.Enabled() && config_.enable_webrtc();
+ }
+
+ private:
+ std::string Name() const override { return "WebRtcServer"; }
+ std::unordered_set<Feature*> Dependencies() const override {
+ return {static_cast<Feature*>(&sockets_),
+ static_cast<Feature*>(&log_pipe_provider_)};
+ }
+
+ bool Setup() override {
+ if (!SharedFD::SocketPair(AF_LOCAL, SOCK_STREAM, 0, &client_socket_,
+ &host_socket_)) {
+ LOG(ERROR) << "Could not open command socket for webRTC";
+ return false;
+ }
+ if (config_.vm_manager() == vm_manager::CrosvmManager::name()) {
+ switches_server_ =
+ CreateUnixInputServer(instance_.switches_socket_path());
+ if (!switches_server_->IsOpen()) {
+ LOG(ERROR) << "Could not open switches server: "
+ << switches_server_->StrError();
+ return false;
+ }
+ }
+ kernel_log_events_pipe_ = log_pipe_provider_.KernelLogPipe();
+ if (!kernel_log_events_pipe_->IsOpen()) {
+ LOG(ERROR) << "Failed to get a kernel log events pipe: "
+ << kernel_log_events_pipe_->StrError();
+ return false;
+ }
+ return true;
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ StreamerSockets& sockets_;
+ KernelLogPipeProvider& log_pipe_provider_;
+ const CustomActionConfigProvider& custom_action_config_;
+ SharedFD kernel_log_events_pipe_;
+ SharedFD client_socket_;
+ SharedFD host_socket_;
+ SharedFD switches_server_;
+};
+
} // namespace
-std::vector<Command> LaunchVNCServer(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- // Launch the vnc server, don't wait for it to complete
- auto port_options = "-port=" + std::to_string(instance.vnc_server_port());
- Command vnc_server(VncServerBinary());
- vnc_server.AddParameter(port_options);
-
- CreateStreamerServers(&vnc_server, config);
-
- std::vector<Command> commands;
- commands.emplace_back(std::move(vnc_server));
- return std::move(commands);
-}
-
-std::vector<Command> LaunchWebRTC(const CuttlefishConfig& config,
- SharedFD kernel_log_events_pipe) {
- std::vector<Command> commands;
- if (config.ForDefaultInstance().start_webrtc_sig_server()) {
- Command sig_server(WebRtcSigServerBinary());
- sig_server.AddParameter("-assets_dir=", config.webrtc_assets_dir());
- if (!config.webrtc_certs_dir().empty()) {
- sig_server.AddParameter("-certs_dir=", config.webrtc_certs_dir());
- }
- sig_server.AddParameter("-http_server_port=", config.sig_server_port());
- commands.emplace_back(std::move(sig_server));
- }
-
- // Currently there is no way to ensure the signaling server will already have
- // bound the socket to the port by the time the webrtc process runs (the
- // common technique of doing it from the launcher is not possible here as the
- // server library being used creates its own sockets). However, this issue is
- // mitigated slightly by doing some retrying and backoff in the webrtc process
- // when connecting to the websocket, so it shouldn't be an issue most of the
- // time.
- SharedFD client_socket;
- SharedFD host_socket;
- CHECK(SharedFD::SocketPair(AF_LOCAL, SOCK_STREAM, 0, &client_socket,
- &host_socket))
- << "Could not open command socket for webRTC";
-
- auto stopper = [host_socket = std::move(host_socket)](Subprocess* proc) {
- struct timeval timeout;
- timeout.tv_sec = 3;
- timeout.tv_usec = 0;
- CHECK(host_socket->SetSockOpt(SOL_SOCKET, SO_RCVTIMEO, &timeout,
- sizeof(timeout)) == 0)
- << "Could not set receive timeout";
-
- WriteAll(host_socket, "C");
- char response[1];
- int read_ret = host_socket->Read(response, sizeof(response));
- if (read_ret != 0) {
- LOG(ERROR) << "Failed to read response from webrtc";
- }
- cuttlefish::KillSubprocess(proc);
- return true;
- };
-
- Command webrtc(WebRtcBinary(), SubprocessStopper(stopper));
-
- webrtc.UnsetFromEnvironment({"http_proxy"});
-
- CreateStreamerServers(&webrtc, config);
-
- webrtc.AddParameter("--command_fd=", client_socket);
- webrtc.AddParameter("-kernel_log_events_fd=", kernel_log_events_pipe);
-
- auto actions = LaunchCustomActionServers(webrtc, config);
-
- // TODO get from launcher params
- commands.emplace_back(std::move(webrtc));
- for (auto& action : actions) {
- commands.emplace_back(std::move(action));
- }
-
- return commands;
+fruit::Component<fruit::Required<const CuttlefishConfig, KernelLogPipeProvider,
+ const CuttlefishConfig::InstanceSpecific,
+ const CustomActionConfigProvider>>
+launchStreamerComponent() {
+ return fruit::createComponent()
+ .addMultibinding<CommandSource, WebRtcServer>()
+ .addMultibinding<DiagnosticInformation, WebRtcServer>()
+ .addMultibinding<Feature, StreamerSockets>()
+ .addMultibinding<Feature, WebRtcServer>();
}
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/main.cc b/host/commands/run_cvd/main.cc
index 944f76c..6cd70f5 100644
--- a/host/commands/run_cvd/main.cc
+++ b/host/commands/run_cvd/main.cc
@@ -14,181 +14,140 @@
* limitations under the License.
*/
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+#include <fruit/fruit.h>
+#include <gflags/gflags.h>
#include <unistd.h>
+
#include <fstream>
-#include <iostream>
#include <memory>
#include <string>
#include <utility>
#include <vector>
-#include <android-base/logging.h>
-#include <android-base/strings.h>
-#include <gflags/gflags.h>
-
#include "common/libs/fs/shared_buf.h"
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
-#include "common/libs/utils/network.h"
#include "common/libs/utils/size_utils.h"
#include "common/libs/utils/subprocess.h"
#include "common/libs/utils/tee_logging.h"
#include "host/commands/run_cvd/boot_state_machine.h"
#include "host/commands/run_cvd/launch.h"
#include "host/commands/run_cvd/process_monitor.h"
+#include "host/commands/run_cvd/reporting.h"
#include "host/commands/run_cvd/runner_defs.h"
#include "host/commands/run_cvd/server_loop.h"
+#include "host/commands/run_cvd/validate.h"
+#include "host/libs/config/adb/adb.h"
+#include "host/libs/config/config_flag.h"
+#include "host/libs/config/config_fragment.h"
+#include "host/libs/config/custom_actions.h"
#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/vm_manager/host_configuration.h"
#include "host/libs/vm_manager/vm_manager.h"
-DEFINE_int32(reboot_notification_fd, -1,
- "A file descriptor to notify when boot completes.");
-
namespace cuttlefish {
-using vm_manager::GetVmManager;
-using vm_manager::ValidateHostConfiguration;
-
namespace {
-constexpr char kGreenColor[] = "\033[1;32m";
-constexpr char kResetColor[] = "\033[0m";
+class CuttlefishEnvironment : public Feature, public DiagnosticInformation {
+ public:
+ INJECT(
+ CuttlefishEnvironment(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
-bool WriteCuttlefishEnvironment(const CuttlefishConfig& config) {
- auto env = SharedFD::Open(config.cuttlefish_env_path().c_str(),
- O_CREAT | O_RDWR, 0755);
- if (!env->IsOpen()) {
- LOG(ERROR) << "Unable to create cuttlefish.env file";
- return false;
+ // DiagnosticInformation
+ std::vector<std::string> Diagnostics() const override {
+ auto config_path = instance_.PerInstancePath("cuttlefish_config.json");
+ return {
+ "Launcher log: " + instance_.launcher_log_path(),
+ "Instance configuration: " + config_path,
+ "Instance environment: " + config_.cuttlefish_env_path(),
+ };
}
- auto instance = config.ForDefaultInstance();
- std::string config_env = "export CUTTLEFISH_PER_INSTANCE_PATH=\"" +
- instance.PerInstancePath(".") + "\"\n";
- config_env += "export ANDROID_SERIAL=" + instance.adb_ip_and_port() + "\n";
- env->Write(config_env.c_str(), config_env.size());
- return true;
+
+ // Feature
+ std::string Name() const override { return "CuttlefishEnvironment"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto env =
+ SharedFD::Open(config_.cuttlefish_env_path(), O_CREAT | O_RDWR, 0755);
+ if (!env->IsOpen()) {
+ LOG(ERROR) << "Unable to create cuttlefish.env file";
+ return false;
+ }
+ std::string config_env = "export CUTTLEFISH_PER_INSTANCE_PATH=\"" +
+ instance_.PerInstancePath(".") + "\"\n";
+ config_env += "export ANDROID_SERIAL=" + instance_.adb_ip_and_port() + "\n";
+ auto written = WriteAll(env, config_env);
+ if (written != config_env.size()) {
+ LOG(ERROR) << "Failed to write all of \"" << config_env << "\", "
+ << "only wrote " << written << " bytes. Error was "
+ << env->StrError();
+ return false;
+ }
+ return true;
+ }
+
+ private:
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+fruit::Component<ServerLoop> runCvdComponent(
+ const CuttlefishConfig* config,
+ const CuttlefishConfig::InstanceSpecific* instance) {
+ return fruit::createComponent()
+ .addMultibinding<DiagnosticInformation, CuttlefishEnvironment>()
+ .addMultibinding<Feature, CuttlefishEnvironment>()
+ .bindInstance(*config)
+ .bindInstance(*instance)
+ .install(AdbConfigComponent)
+ .install(AdbConfigFragmentComponent)
+ .install(bootStateMachineComponent)
+ .install(ConfigFlagPlaceholder)
+ .install(CustomActionsComponent)
+ .install(LaunchAdbComponent)
+ .install(launchComponent)
+ .install(launchModemComponent)
+ .install(launchStreamerComponent)
+ .install(serverLoopComponent)
+ .install(validationComponent)
+ .install(vm_manager::VmManagerComponent);
}
-// Forks and returns the write end of a pipe to the child process. The parent
-// process waits for boot events to come through the pipe and exits accordingly.
-SharedFD DaemonizeLauncher(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- SharedFD read_end, write_end;
- if (!SharedFD::Pipe(&read_end, &write_end)) {
- LOG(ERROR) << "Unable to create pipe";
- return {}; // a closed FD
- }
- auto pid = fork();
- if (pid) {
- // Explicitly close here, otherwise we may end up reading forever if the
- // child process dies.
- write_end->Close();
- RunnerExitCodes exit_code;
- auto bytes_read = read_end->Read(&exit_code, sizeof(exit_code));
- if (bytes_read != sizeof(exit_code)) {
- LOG(ERROR) << "Failed to read a complete exit code, read " << bytes_read
- << " bytes only instead of the expected " << sizeof(exit_code);
- exit_code = RunnerExitCodes::kPipeIOError;
- } else if (exit_code == RunnerExitCodes::kSuccess) {
- LOG(INFO) << "Virtual device booted successfully";
- } else if (exit_code == RunnerExitCodes::kVirtualDeviceBootFailed) {
- LOG(ERROR) << "Virtual device failed to boot";
- } else {
- LOG(ERROR) << "Unexpected exit code: " << exit_code;
- }
- if (exit_code == RunnerExitCodes::kSuccess) {
- LOG(INFO) << kBootCompletedMessage;
- } else {
- LOG(INFO) << kBootFailedMessage;
- }
- std::exit(exit_code);
- } else {
- // The child returns the write end of the pipe
- if (daemon(/*nochdir*/ 1, /*noclose*/ 1) != 0) {
- LOG(ERROR) << "Failed to daemonize child process: " << strerror(errno);
- std::exit(RunnerExitCodes::kDaemonizationError);
- }
- // Redirect standard I/O
- auto log_path = instance.launcher_log_path();
- auto log = SharedFD::Open(log_path.c_str(), O_CREAT | O_WRONLY | O_APPEND,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
- if (!log->IsOpen()) {
- LOG(ERROR) << "Failed to create launcher log file: " << log->StrError();
- std::exit(RunnerExitCodes::kDaemonizationError);
- }
- ::android::base::SetLogger(
- TeeLogger({{LogFileSeverity(), log, MetadataLevel::FULL}}));
- auto dev_null = SharedFD::Open("/dev/null", O_RDONLY);
- if (!dev_null->IsOpen()) {
- LOG(ERROR) << "Failed to open /dev/null: " << dev_null->StrError();
- std::exit(RunnerExitCodes::kDaemonizationError);
- }
- if (dev_null->UNMANAGED_Dup2(0) < 0) {
- LOG(ERROR) << "Failed dup2 stdin: " << dev_null->StrError();
- std::exit(RunnerExitCodes::kDaemonizationError);
- }
- if (log->UNMANAGED_Dup2(1) < 0) {
- LOG(ERROR) << "Failed dup2 stdout: " << log->StrError();
- std::exit(RunnerExitCodes::kDaemonizationError);
- }
- if (log->UNMANAGED_Dup2(2) < 0) {
- LOG(ERROR) << "Failed dup2 seterr: " << log->StrError();
- std::exit(RunnerExitCodes::kDaemonizationError);
- }
-
- read_end->Close();
- return write_end;
- }
-}
-
-std::string GetConfigFilePath(const CuttlefishConfig& config) {
- auto instance = config.ForDefaultInstance();
- return instance.PerInstancePath("cuttlefish_config.json");
-}
-
-void PrintStreamingInformation(const CuttlefishConfig& config) {
- if (config.ForDefaultInstance().start_webrtc_sig_server()) {
- // TODO (jemoreira): Change this when webrtc is moved to the debian package.
- LOG(INFO) << kGreenColor << "Point your browser to https://"
- << config.sig_server_address() << ":" << config.sig_server_port()
- << " to interact with the device." << kResetColor;
- } else if (config.enable_vnc_server()) {
- LOG(INFO) << kGreenColor << "VNC server started on port "
- << config.ForDefaultInstance().vnc_server_port() << kResetColor;
- }
- // When WebRTC is enabled but an operator other than the one launched by
- // run_cvd is used there is no way to know the url to which to point the
- // browser to.
-}
-
-} // namespace
-
-int RunCvdMain(int argc, char** argv) {
- setenv("ANDROID_LOG_TAGS", "*:v", /* overwrite */ 0);
- ::android::base::InitLogging(argv, android::base::StderrLogger);
- google::ParseCommandLineFlags(&argc, &argv, false);
-
+bool IsStdinValid() {
if (isatty(0)) {
- LOG(FATAL) << "stdin was a tty, expected to be passed the output of a previous stage. "
+ LOG(ERROR) << "stdin was a tty, expected to be passed the output of a "
+ "previous stage. "
<< "Did you mean to run launch_cvd?";
- return RunnerExitCodes::kInvalidHostConfiguration;
+ return false;
} else {
int error_num = errno;
if (error_num == EBADF) {
- LOG(FATAL) << "stdin was not a valid file descriptor, expected to be passed the output "
+ LOG(ERROR) << "stdin was not a valid file descriptor, expected to be "
+ "passed the output "
<< "of assemble_cvd. Did you mean to run launch_cvd?";
- return RunnerExitCodes::kInvalidHostConfiguration;
+ return false;
}
}
+ return true;
+}
+const CuttlefishConfig* FindConfigFromStdin() {
std::string input_files_str;
{
auto input_fd = SharedFD::Dup(0);
auto bytes_read = ReadAll(input_fd, &input_files_str);
if (bytes_read < 0) {
- LOG(FATAL) << "Failed to read input files. Error was \"" << input_fd->StrError() << "\"";
+ LOG(ERROR) << "Failed to read input files. Error was \""
+ << input_fd->StrError() << "\"";
+ return nullptr;
}
}
std::vector<std::string> input_files = android::base::Split(input_files_str, "\n");
@@ -199,183 +158,78 @@
setenv(kCuttlefishConfigEnvVarName, file.c_str(), /* overwrite */ false);
}
}
- if (!found_config) {
- return RunnerExitCodes::kCuttlefishConfigurationInitError;
- }
+ return CuttlefishConfig::Get();
+}
- auto config = CuttlefishConfig::Get();
- auto instance = config->ForDefaultInstance();
-
+void ConfigureLogs(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance) {
auto log_path = instance.launcher_log_path();
- {
- std::ofstream launcher_log_ofstream(log_path.c_str());
- auto assembly_path = config->AssemblyPath("assemble_cvd.log");
- std::ifstream assembly_log_ifstream(assembly_path);
- if (assembly_log_ifstream) {
- auto assemble_log = ReadFile(assembly_path);
- launcher_log_ofstream << assemble_log;
- }
+ std::ofstream launcher_log_ofstream(log_path.c_str());
+ auto assembly_path = config.AssemblyPath("assemble_cvd.log");
+ std::ifstream assembly_log_ifstream(assembly_path);
+ if (assembly_log_ifstream) {
+ auto assemble_log = ReadFile(assembly_path);
+ launcher_log_ofstream << assemble_log;
}
::android::base::SetLogger(LogToStderrAndFiles({log_path}));
+}
+bool ChdirIntoRuntimeDir(const CuttlefishConfig::InstanceSpecific& instance) {
// Change working directory to the instance directory as early as possible to
// ensure all host processes have the same working dir. This helps stop_cvd
// find the running processes when it can't establish a communication with the
// launcher.
auto chdir_ret = chdir(instance.instance_dir().c_str());
if (chdir_ret != 0) {
- auto error = errno;
- LOG(ERROR) << "Unable to change dir into instance directory ("
- << instance.instance_dir() << "): " << strerror(error);
- return RunnerExitCodes::kInstanceDirCreationError;
+ PLOG(ERROR) << "Unable to change dir into instance directory ("
+ << instance.instance_dir() << "): ";
+ return false;
+ }
+ return true;
+}
+
+} // namespace
+
+int RunCvdMain(int argc, char** argv) {
+ setenv("ANDROID_LOG_TAGS", "*:v", /* overwrite */ 0);
+ ::android::base::InitLogging(argv, android::base::StderrLogger);
+ google::ParseCommandLineFlags(&argc, &argv, false);
+
+ CHECK(IsStdinValid()) << "Invalid stdin";
+ auto config = FindConfigFromStdin();
+ CHECK(config) << "Could not find config";
+ auto instance = config->ForDefaultInstance();
+
+ ConfigureLogs(*config, instance);
+ CHECK(ChdirIntoRuntimeDir(instance)) << "Could not enter runtime dir";
+
+ fruit::Injector<ServerLoop> injector(runCvdComponent, config, &instance);
+
+ for (auto& fragment : injector.getMultibindings<ConfigFragment>()) {
+ CHECK(config->LoadFragment(*fragment)) << "Failed to load config fragment";
}
- auto used_tap_devices = TapInterfacesInUse();
- if (used_tap_devices.count(instance.wifi_tap_name())) {
- LOG(ERROR) << "Wifi TAP device already in use";
- return RunnerExitCodes::kTapDeviceInUse;
- } else if (used_tap_devices.count(instance.mobile_tap_name())) {
- LOG(ERROR) << "Mobile TAP device already in use";
- return RunnerExitCodes::kTapDeviceInUse;
- } else if (used_tap_devices.count(instance.ethernet_tap_name())) {
- LOG(ERROR) << "Ethernet TAP device already in use";
- }
+ // One of the setup features can consume most output, so print this early.
+ DiagnosticInformation::PrintAll(
+ injector.getMultibindings<DiagnosticInformation>());
- auto vm_manager = GetVmManager(config->vm_manager(), config->target_arch());
-
-#ifndef __ANDROID__
- // Check host configuration
- std::vector<std::string> config_commands;
- if (!ValidateHostConfiguration(&config_commands)) {
- LOG(ERROR) << "Validation of user configuration failed";
- std::cout << "Execute the following to correctly configure:" << std::endl;
- for (auto& command : config_commands) {
- std::cout << " " << command << std::endl;
- }
- std::cout << "You may need to logout for the changes to take effect"
- << std::endl;
- return RunnerExitCodes::kInvalidHostConfiguration;
- }
-#endif
-
- if (!WriteCuttlefishEnvironment(*config)) {
- LOG(ERROR) << "Unable to write cuttlefish environment file";
- }
-
- PrintStreamingInformation(*config);
-
- if (config->console()) {
- LOG(INFO) << kGreenColor << "To access the console run: screen "
- << instance.console_path() << kResetColor;
- } else {
- LOG(INFO) << kGreenColor
- << "Serial console is disabled; use -console=true to enable it"
- << kResetColor;
- }
-
- LOG(INFO) << kGreenColor
- << "The following files contain useful debugging information:"
- << kResetColor;
- LOG(INFO) << kGreenColor
- << " Launcher log: " << instance.launcher_log_path()
- << kResetColor;
- LOG(INFO) << kGreenColor
- << " Android's logcat output: " << instance.logcat_path()
- << kResetColor;
- LOG(INFO) << kGreenColor
- << " Kernel log: " << instance.PerInstancePath("kernel.log")
- << kResetColor;
- LOG(INFO) << kGreenColor
- << " Instance configuration: " << GetConfigFilePath(*config)
- << kResetColor;
- LOG(INFO) << kGreenColor
- << " Instance environment: " << config->cuttlefish_env_path()
- << kResetColor;
-
- auto launcher_monitor_path = instance.launcher_monitor_socket_path();
- auto launcher_monitor_socket = SharedFD::SocketLocalServer(
- launcher_monitor_path.c_str(), false, SOCK_STREAM, 0666);
- if (!launcher_monitor_socket->IsOpen()) {
- LOG(ERROR) << "Error when opening launcher server: "
- << launcher_monitor_socket->StrError();
- return RunnerExitCodes::kMonitorCreationFailed;
- }
- SharedFD foreground_launcher_pipe;
- if (config->run_as_daemon()) {
- foreground_launcher_pipe = DaemonizeLauncher(*config);
- if (!foreground_launcher_pipe->IsOpen()) {
- return RunnerExitCodes::kDaemonizationError;
- }
- } else {
- // Make sure the launcher runs in its own process group even when running in
- // foreground
- if (getsid(0) != getpid()) {
- int retval = setpgid(0, 0);
- if (retval) {
- LOG(ERROR) << "Failed to create new process group: " << strerror(errno);
- std::exit(RunnerExitCodes::kProcessGroupError);
- }
- }
- }
-
- SharedFD reboot_notification;
- if (FLAGS_reboot_notification_fd >= 0) {
- reboot_notification = SharedFD::Dup(FLAGS_reboot_notification_fd);
- close(FLAGS_reboot_notification_fd);
- }
+ const auto& features = injector.getMultibindings<Feature>();
+ CHECK(Feature::RunSetup(features)) << "Failed to run feature setup.";
// Monitor and restart host processes supporting the CVD
ProcessMonitor process_monitor(config->restart_subprocesses());
- if (config->enable_metrics() == CuttlefishConfig::kYes) {
- process_monitor.AddCommands(LaunchMetrics());
+ for (auto& command_source : injector.getMultibindings<CommandSource>()) {
+ if (command_source->Enabled()) {
+ process_monitor.AddCommands(command_source->Commands());
+ }
}
- process_monitor.AddCommands(LaunchModemSimulatorIfEnabled(*config));
-
- auto kernel_log_monitor = LaunchKernelLogMonitor(*config, 3);
- SharedFD boot_events_pipe = kernel_log_monitor.pipes[0];
- SharedFD adbd_events_pipe = kernel_log_monitor.pipes[1];
- SharedFD webrtc_events_pipe = kernel_log_monitor.pipes[2];
- kernel_log_monitor.pipes.clear();
- process_monitor.AddCommands(std::move(kernel_log_monitor.commands));
-
- CvdBootStateMachine boot_state_machine(foreground_launcher_pipe,
- reboot_notification, boot_events_pipe);
-
- process_monitor.AddCommands(LaunchRootCanal(*config));
- process_monitor.AddCommands(LaunchLogcatReceiver(*config));
- process_monitor.AddCommands(LaunchConfigServer(*config));
- process_monitor.AddCommands(LaunchTombstoneReceiver(*config));
- process_monitor.AddCommands(LaunchGnssGrpcProxyServerIfEnabled(*config));
- process_monitor.AddCommands(LaunchSecureEnvironment(*config));
- if (config->enable_host_bluetooth()) {
- process_monitor.AddCommands(LaunchBluetoothConnector(*config));
- }
- process_monitor.AddCommands(LaunchVehicleHalServerIfEnabled(*config));
- process_monitor.AddCommands(LaunchConsoleForwarderIfEnabled(*config));
-
- // The streamer needs to launch before the VMM because it serves on several
- // sockets (input devices, vsock frame server) when using crosvm.
- if (config->enable_vnc_server()) {
- process_monitor.AddCommands(LaunchVNCServer(*config));
- }
- if (config->enable_webrtc()) {
- process_monitor.AddCommands(LaunchWebRTC(*config, webrtc_events_pipe));
- }
-
- // Start the guest VM
- process_monitor.AddCommands(vm_manager->StartCommands(*config));
-
- // Start other host processes
- process_monitor.AddCommands(
- LaunchSocketVsockProxyIfEnabled(*config, adbd_events_pipe));
- process_monitor.AddCommands(LaunchAdbConnectorIfEnabled(*config));
CHECK(process_monitor.StartAndMonitorProcesses())
<< "Could not start subprocesses";
- ServerLoop(launcher_monitor_socket, &process_monitor); // Should not return
+ injector.get<ServerLoop&>().Run(process_monitor); // Should not return
LOG(ERROR) << "The server loop returned, it should never happen!!";
return RunnerExitCodes::kServerError;
diff --git a/host/commands/run_cvd/process_monitor.cc b/host/commands/run_cvd/process_monitor.cc
index a4f7f72..9c11ce7 100644
--- a/host/commands/run_cvd/process_monitor.cc
+++ b/host/commands/run_cvd/process_monitor.cc
@@ -118,7 +118,7 @@
}
static void LogSubprocessExit(const std::string& name, pid_t pid, int wstatus) {
- LOG(INFO) << "Detected exit of monitored subprocess " << name;
+ LOG(INFO) << "Detected unexpected exit of monitored subprocess " << name;
if (WIFEXITED(wstatus)) {
LOG(INFO) << "Subprocess " << name << " (" << pid
<< ") has exited with exit code " << WEXITSTATUS(wstatus);
@@ -139,8 +139,7 @@
LOG(DEBUG) << "Starting monitoring subprocesses";
for (auto& monitored : monitored_processes_) {
- cuttlefish::SubprocessOptions options;
- options.InGroup(true);
+ auto options = SubprocessOptions().InGroup(true);
monitored.proc.reset(new Subprocess(monitored.cmd->Start(options)));
CHECK(monitored.proc->Started()) << "Failed to start process";
}
@@ -185,8 +184,7 @@
} else {
LogSubprocessExit(it->cmd->GetShortName(), it->proc->pid(), wstatus);
if (restart_subprocesses_) {
- cuttlefish::SubprocessOptions options;
- options.InGroup(true);
+ auto options = SubprocessOptions().InGroup(true);
it->proc.reset(new Subprocess(it->cmd->Start(options)));
} else {
monitored_processes_.erase(it);
@@ -195,21 +193,25 @@
}
parent_comms_thread.join(); // Should have exited if `running` is false
- // Processes were started in the order they appear in the vector, stop them in
- // reverse order for symmetry.
auto stop = [](const auto& it) {
- if (!it.proc->Stop()) {
+ auto stop_result = it.proc->Stop();
+ if (stop_result == StopperResult::kStopFailure) {
LOG(WARNING) << "Error in stopping \"" << it.cmd->GetShortName() << "\"";
return false;
}
int wstatus = 0;
- auto ret = it.proc->Wait(&wstatus, 0);
- if (ret < 0) {
+ auto pid = it.proc->Wait(&wstatus, 0);
+ if (pid < 0) {
LOG(WARNING) << "Failed to wait for process " << it.cmd->GetShortName();
return false;
}
+ if (stop_result == StopperResult::kStopCrash) {
+ LogSubprocessExit(it.cmd->GetShortName(), pid, wstatus);
+ }
return true;
};
+ // Processes were started in the order they appear in the vector, stop them in
+ // reverse order for symmetry.
size_t stopped = std::count_if(monitored.rbegin(), monitored.rend(), stop);
LOG(DEBUG) << "Done monitoring subprocesses";
return stopped == monitored.size();
diff --git a/host/commands/run_cvd/reporting.cpp b/host/commands/run_cvd/reporting.cpp
new file mode 100644
index 0000000..db25185
--- /dev/null
+++ b/host/commands/run_cvd/reporting.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/commands/run_cvd/reporting.h"
+
+#include <android-base/logging.h>
+#include <fruit/fruit.h>
+#include <string>
+#include <vector>
+
+namespace cuttlefish {
+
+static constexpr char kGreenColor[] = "\033[1;32m";
+static constexpr char kResetColor[] = "\033[0m";
+
+DiagnosticInformation::~DiagnosticInformation() = default;
+
+void DiagnosticInformation::PrintAll(
+ const std::vector<DiagnosticInformation*>& infos) {
+ LOG(INFO) << kGreenColor
+ << "The following files contain useful debugging information:"
+ << kResetColor;
+ for (const auto& info : infos) {
+ for (const auto& line : info->Diagnostics()) {
+ LOG(INFO) << kGreenColor << " " << line << kResetColor;
+ }
+ }
+}
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.cpp b/host/commands/run_cvd/reporting.h
similarity index 64%
copy from common/libs/utils/size_utils.cpp
copy to host/commands/run_cvd/reporting.h
index 9f25445..f6b4d5a 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/commands/run_cvd/reporting.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,20 @@
* limitations under the License.
*/
-#include "common/libs/utils/size_utils.h"
+#pragma once
-#include <unistd.h>
+#include <fruit/fruit.h>
+#include <string>
+#include <vector>
namespace cuttlefish {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+class DiagnosticInformation {
+ public:
+ virtual ~DiagnosticInformation();
+ virtual std::vector<std::string> Diagnostics() const = 0;
+
+ static void PrintAll(const std::vector<DiagnosticInformation*>&);
+};
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/server_loop.cpp b/host/commands/run_cvd/server_loop.cpp
index 5e77b9d..3beb1d5 100644
--- a/host/commands/run_cvd/server_loop.cpp
+++ b/host/commands/run_cvd/server_loop.cpp
@@ -16,6 +16,7 @@
#include "host/commands/run_cvd/server_loop.h"
+#include <fruit/fruit.h>
#include <gflags/gflags.h>
#include <unistd.h>
#include <string>
@@ -26,6 +27,7 @@
#include "host/commands/run_cvd/runner_defs.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/data_image.h"
+#include "host/libs/config/feature.h"
namespace cuttlefish {
@@ -47,167 +49,203 @@
return true;
}
-void DeleteFifos(const CuttlefishConfig::InstanceSpecific& instance) {
- // TODO(schuffelen): Create these FIFOs in assemble_cvd instead of run_cvd.
- std::vector<std::string> pipes = {
- instance.kernel_log_pipe_name(),
- instance.console_in_pipe_name(),
- instance.console_out_pipe_name(),
- instance.logcat_pipe_name(),
- instance.PerInstanceInternalPath("keymaster_fifo_vm.in"),
- instance.PerInstanceInternalPath("keymaster_fifo_vm.out"),
- instance.PerInstanceInternalPath("gatekeeper_fifo_vm.in"),
- instance.PerInstanceInternalPath("gatekeeper_fifo_vm.out"),
- instance.PerInstanceInternalPath("bt_fifo_vm.in"),
- instance.PerInstanceInternalPath("bt_fifo_vm.out"),
- };
- for (const auto& pipe : pipes) {
- unlink(pipe.c_str());
- }
-}
+class ServerLoopImpl : public ServerLoop, public Feature {
+ public:
+ INJECT(ServerLoopImpl(const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific& instance))
+ : config_(config), instance_(instance) {}
-bool PowerwashFiles() {
- auto config = CuttlefishConfig::Get();
- if (!config) {
- LOG(ERROR) << "Could not load the config.";
- return false;
- }
- auto instance = config->ForDefaultInstance();
-
- DeleteFifos(instance);
-
- // TODO(schuffelen): Clean up duplication with assemble_cvd
- auto kregistry_path = instance.access_kregistry_path();
- unlink(kregistry_path.c_str());
- CreateBlankImage(kregistry_path, 2 /* mb */, "none");
-
- auto pstore_path = instance.pstore_path();
- unlink(pstore_path.c_str());
- CreateBlankImage(pstore_path, 2 /* mb */, "none");
-
- auto sdcard_path = instance.sdcard_path();
- auto sdcard_size = FileSize(sdcard_path);
- unlink(sdcard_path.c_str());
- // round up
- auto sdcard_mb_size = (sdcard_size + (1 << 20) - 1) / (1 << 20);
- LOG(DEBUG) << "Size in mb is " << sdcard_mb_size;
- CreateBlankImage(sdcard_path, sdcard_mb_size, "sdcard");
-
- auto overlay_path = instance.PerInstancePath("overlay.img");
- unlink(overlay_path.c_str());
- if (!CreateQcowOverlay(config->crosvm_binary(),
- instance.os_composite_disk_path(), overlay_path)) {
- LOG(ERROR) << "CreateQcowOverlay failed";
- return false;
- }
- return true;
-}
-
-void RestartRunCvd(const CuttlefishConfig& config, int notification_fd) {
- auto config_path = config.AssemblyPath("cuttlefish_config.json");
- auto followup_stdin = SharedFD::MemfdCreate("pseudo_stdin");
- WriteAll(followup_stdin, config_path + "\n");
- followup_stdin->LSeek(0, SEEK_SET);
- followup_stdin->UNMANAGED_Dup2(0);
-
- auto argv_vec = gflags::GetArgvs();
- char** argv = new char*[argv_vec.size() + 2];
- for (size_t i = 0; i < argv_vec.size(); i++) {
- argv[i] = argv_vec[i].data();
- }
- // Will take precedence over any earlier arguments.
- std::string reboot_notification =
- "-reboot_notification_fd=" + std::to_string(notification_fd);
- argv[argv_vec.size()] = reboot_notification.data();
- argv[argv_vec.size() + 1] = nullptr;
-
- execv("/proc/self/exe", argv);
- // execve should not return, so something went wrong.
- PLOG(ERROR) << "execv returned: ";
-}
-
-} // namespace
-
-void ServerLoop(SharedFD server, ProcessMonitor* process_monitor) {
- while (true) {
- // TODO: use select to handle simultaneous connections.
- auto client = SharedFD::Accept(*server);
- LauncherAction action;
- while (client->IsOpen() && client->Read(&action, sizeof(action)) > 0) {
- switch (action) {
- case LauncherAction::kStop:
- if (process_monitor->StopMonitoredProcesses()) {
+ // ServerLoop
+ void Run(ProcessMonitor& process_monitor) override {
+ while (true) {
+ // TODO: use select to handle simultaneous connections.
+ auto client = SharedFD::Accept(*server_);
+ LauncherAction action;
+ while (client->IsOpen() && client->Read(&action, sizeof(action)) > 0) {
+ switch (action) {
+ case LauncherAction::kStop:
+ if (process_monitor.StopMonitoredProcesses()) {
+ auto response = LauncherResponse::kSuccess;
+ client->Write(&response, sizeof(response));
+ std::exit(0);
+ } else {
+ auto response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
+ }
+ break;
+ case LauncherAction::kStatus: {
+ // TODO(schuffelen): Return more information on a side channel
auto response = LauncherResponse::kSuccess;
client->Write(&response, sizeof(response));
- std::exit(0);
- } else {
- auto response = LauncherResponse::kError;
- client->Write(&response, sizeof(response));
- }
- break;
- case LauncherAction::kStatus: {
- // TODO(schuffelen): Return more information on a side channel
- auto response = LauncherResponse::kSuccess;
- client->Write(&response, sizeof(response));
- break;
- }
- case LauncherAction::kPowerwash: {
- LOG(INFO) << "Received a Powerwash request from the monitor socket";
- if (!process_monitor->StopMonitoredProcesses()) {
- LOG(ERROR) << "Stopping processes failed.";
- auto response = LauncherResponse::kError;
- client->Write(&response, sizeof(response));
break;
}
- if (!PowerwashFiles()) {
- LOG(ERROR) << "Powerwashing files failed.";
- auto response = LauncherResponse::kError;
+ case LauncherAction::kPowerwash: {
+ LOG(INFO) << "Received a Powerwash request from the monitor socket";
+ if (!process_monitor.StopMonitoredProcesses()) {
+ LOG(ERROR) << "Stopping processes failed.";
+ auto response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
+ break;
+ }
+ if (!PowerwashFiles()) {
+ LOG(ERROR) << "Powerwashing files failed.";
+ auto response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
+ break;
+ }
+ auto response = LauncherResponse::kSuccess;
client->Write(&response, sizeof(response));
+
+ RestartRunCvd(client->UNMANAGED_Dup());
+ // RestartRunCvd should not return, so something went wrong.
+ response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
+ LOG(FATAL) << "run_cvd in a bad state";
break;
}
- auto response = LauncherResponse::kSuccess;
- client->Write(&response, sizeof(response));
+ case LauncherAction::kRestart: {
+ if (!process_monitor.StopMonitoredProcesses()) {
+ LOG(ERROR) << "Stopping processes failed.";
+ auto response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
+ break;
+ }
+ DeleteFifos();
- auto config = CuttlefishConfig::Get();
- CHECK(config) << "Could not load config";
- RestartRunCvd(*config, client->UNMANAGED_Dup());
- // RestartRunCvd should not return, so something went wrong.
- response = LauncherResponse::kError;
- client->Write(&response, sizeof(response));
- LOG(FATAL) << "run_cvd in a bad state";
- break;
- }
- case LauncherAction::kRestart: {
- if (!process_monitor->StopMonitoredProcesses()) {
- LOG(ERROR) << "Stopping processes failed.";
- auto response = LauncherResponse::kError;
+ auto response = LauncherResponse::kSuccess;
client->Write(&response, sizeof(response));
+ RestartRunCvd(client->UNMANAGED_Dup());
+ // RestartRunCvd should not return, so something went wrong.
+ response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
+ LOG(FATAL) << "run_cvd in a bad state";
break;
}
-
- auto config = CuttlefishConfig::Get();
- CHECK(config) << "Could not load config";
- auto instance = config->ForDefaultInstance();
- DeleteFifos(instance);
-
- auto response = LauncherResponse::kSuccess;
- client->Write(&response, sizeof(response));
- CHECK(config) << "Could not load config";
- RestartRunCvd(*config, client->UNMANAGED_Dup());
- // RestartRunCvd should not return, so something went wrong.
- response = LauncherResponse::kError;
- client->Write(&response, sizeof(response));
- LOG(FATAL) << "run_cvd in a bad state";
- break;
+ default:
+ LOG(ERROR) << "Unrecognized launcher action: "
+ << static_cast<char>(action);
+ auto response = LauncherResponse::kError;
+ client->Write(&response, sizeof(response));
}
- default:
- LOG(ERROR) << "Unrecognized launcher action: "
- << static_cast<char>(action);
- auto response = LauncherResponse::kError;
- client->Write(&response, sizeof(response));
}
}
}
+
+ // Feature
+ std::string Name() const override { return "ServerLoop"; }
+
+ private:
+ bool Enabled() const override { return true; }
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() {
+ auto launcher_monitor_path = instance_.launcher_monitor_socket_path();
+ server_ = SharedFD::SocketLocalServer(launcher_monitor_path.c_str(), false,
+ SOCK_STREAM, 0666);
+ if (!server_->IsOpen()) {
+ LOG(ERROR) << "Error when opening launcher server: "
+ << server_->StrError();
+ return false;
+ }
+ return true;
+ }
+
+ void DeleteFifos() {
+ // TODO(schuffelen): Create these FIFOs in assemble_cvd instead of run_cvd.
+ std::vector<std::string> pipes = {
+ instance_.kernel_log_pipe_name(),
+ instance_.console_in_pipe_name(),
+ instance_.console_out_pipe_name(),
+ instance_.logcat_pipe_name(),
+ instance_.PerInstanceInternalPath("keymaster_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("keymaster_fifo_vm.out"),
+ instance_.PerInstanceInternalPath("gatekeeper_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("gatekeeper_fifo_vm.out"),
+ instance_.PerInstanceInternalPath("bt_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("bt_fifo_vm.out"),
+ instance_.PerInstanceInternalPath("gnsshvc_fifo_vm.in"),
+ instance_.PerInstanceInternalPath("gnsshvc_fifo_vm.out"),
+ };
+ for (const auto& pipe : pipes) {
+ unlink(pipe.c_str());
+ }
+ }
+
+ bool PowerwashFiles() {
+ DeleteFifos();
+
+ // TODO(schuffelen): Clean up duplication with assemble_cvd
+ unlink(instance_.PerInstancePath("NVChip").c_str());
+
+ auto kregistry_path = instance_.access_kregistry_path();
+ unlink(kregistry_path.c_str());
+ CreateBlankImage(kregistry_path, 2 /* mb */, "none");
+
+ auto pstore_path = instance_.pstore_path();
+ unlink(pstore_path.c_str());
+ CreateBlankImage(pstore_path, 2 /* mb */, "none");
+
+ auto sdcard_path = instance_.sdcard_path();
+ auto sdcard_size = FileSize(sdcard_path);
+ unlink(sdcard_path.c_str());
+ // round up
+ auto sdcard_mb_size = (sdcard_size + (1 << 20) - 1) / (1 << 20);
+ LOG(DEBUG) << "Size in mb is " << sdcard_mb_size;
+ CreateBlankImage(sdcard_path, sdcard_mb_size, "sdcard");
+ std::vector<std::string> overlay_files{"overlay.img"};
+ if (instance_.start_ap()) {
+ overlay_files.emplace_back("ap_overlay.img");
+ }
+ for (auto overlay_file : {"overlay.img", "ap_overlay.img"}) {
+ auto overlay_path = instance_.PerInstancePath(overlay_file);
+ unlink(overlay_path.c_str());
+ if (!CreateQcowOverlay(config_.crosvm_binary(),
+ config_.os_composite_disk_path(), overlay_path)) {
+ LOG(ERROR) << "CreateQcowOverlay failed";
+ return false;
+ }
+ }
+ return true;
+ }
+
+ void RestartRunCvd(int notification_fd) {
+ auto config_path = config_.AssemblyPath("cuttlefish_config.json");
+ auto followup_stdin = SharedFD::MemfdCreate("pseudo_stdin");
+ WriteAll(followup_stdin, config_path + "\n");
+ followup_stdin->LSeek(0, SEEK_SET);
+ followup_stdin->UNMANAGED_Dup2(0);
+
+ auto argv_vec = gflags::GetArgvs();
+ char** argv = new char*[argv_vec.size() + 2];
+ for (size_t i = 0; i < argv_vec.size(); i++) {
+ argv[i] = argv_vec[i].data();
+ }
+ // Will take precedence over any earlier arguments.
+ std::string reboot_notification =
+ "-reboot_notification_fd=" + std::to_string(notification_fd);
+ argv[argv_vec.size()] = reboot_notification.data();
+ argv[argv_vec.size() + 1] = nullptr;
+
+ execv("/proc/self/exe", argv);
+ // execve should not return, so something went wrong.
+ PLOG(ERROR) << "execv returned: ";
+ }
+
+ const CuttlefishConfig& config_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ SharedFD server_;
+};
+
+} // namespace
+
+ServerLoop::~ServerLoop() = default;
+
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>,
+ ServerLoop>
+serverLoopComponent() {
+ return fruit::createComponent()
+ .bind<ServerLoop, ServerLoopImpl>()
+ .addMultibinding<Feature, ServerLoopImpl>();
}
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/server_loop.h b/host/commands/run_cvd/server_loop.h
index 327aff4..2364cb9 100644
--- a/host/commands/run_cvd/server_loop.h
+++ b/host/commands/run_cvd/server_loop.h
@@ -16,11 +16,22 @@
#pragma once
+#include <fruit/fruit.h>
+
#include "common/libs/fs/shared_fd.h"
#include "host/commands/run_cvd/process_monitor.h"
+#include "host/libs/config/cuttlefish_config.h"
namespace cuttlefish {
-void ServerLoop(SharedFD server, ProcessMonitor* process_monitor);
+class ServerLoop {
+ public:
+ virtual ~ServerLoop();
+ virtual void Run(ProcessMonitor& process_monitor) = 0;
+};
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>,
+ ServerLoop>
+serverLoopComponent();
}
diff --git a/host/commands/run_cvd/validate.cpp b/host/commands/run_cvd/validate.cpp
new file mode 100644
index 0000000..73a7a25
--- /dev/null
+++ b/host/commands/run_cvd/validate.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <fruit/fruit.h>
+#include <iostream>
+
+#include "common/libs/utils/network.h"
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
+#include "host/libs/vm_manager/host_configuration.h"
+
+namespace cuttlefish {
+namespace {
+
+using vm_manager::ValidateHostConfiguration;
+
+class ValidateTapDevices : public Feature {
+ public:
+ INJECT(ValidateTapDevices(const CuttlefishConfig::InstanceSpecific& instance))
+ : instance_(instance) {}
+
+ std::string Name() const override { return "ValidateTapDevices"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto used_tap_devices = TapInterfacesInUse();
+ if (used_tap_devices.count(instance_.wifi_tap_name())) {
+ LOG(ERROR) << "Wifi TAP device already in use";
+ return false;
+ } else if (used_tap_devices.count(instance_.mobile_tap_name())) {
+ LOG(ERROR) << "Mobile TAP device already in use";
+ return false;
+ } else if (used_tap_devices.count(instance_.ethernet_tap_name())) {
+ LOG(ERROR) << "Ethernet TAP device already in use";
+ return false;
+ }
+ return true;
+ }
+
+ private:
+ const CuttlefishConfig::InstanceSpecific& instance_;
+};
+
+class ValidateHostConfigurationFeature : public Feature {
+ public:
+ INJECT(ValidateHostConfigurationFeature()) {}
+
+ bool Enabled() const override {
+#ifndef __ANDROID__
+ return true;
+#else
+ return false;
+#endif
+ }
+ std::string Name() const override { return "ValidateHostConfiguration"; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ // Check host configuration
+ std::vector<std::string> config_commands;
+ if (!ValidateHostConfiguration(&config_commands)) {
+ LOG(ERROR) << "Validation of user configuration failed";
+ std::cout << "Execute the following to correctly configure:" << std::endl;
+ for (auto& command : config_commands) {
+ std::cout << " " << command << std::endl;
+ }
+ std::cout << "You may need to logout for the changes to take effect"
+ << std::endl;
+ return false;
+ }
+ return true;
+ }
+};
+
+} // namespace
+
+fruit::Component<fruit::Required<const CuttlefishConfig::InstanceSpecific>>
+validationComponent() {
+ return fruit::createComponent()
+ .addMultibinding<Feature, ValidateHostConfigurationFeature>()
+ .addMultibinding<Feature, ValidateTapDevices>();
+}
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.cpp b/host/commands/run_cvd/validate.h
similarity index 63%
copy from common/libs/utils/size_utils.cpp
copy to host/commands/run_cvd/validate.h
index 9f25445..99c5c07 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/commands/run_cvd/validate.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,17 @@
* limitations under the License.
*/
-#include "common/libs/utils/size_utils.h"
+#pragma once
-#include <unistd.h>
+#include <fruit/fruit.h>
+
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
namespace cuttlefish {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+fruit::Component<fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific>>
+validationComponent();
-} // namespace cuttlefish
+}
diff --git a/host/commands/secure_env/Android.bp b/host/commands/secure_env/Android.bp
index 3ceeda5..f838cf1 100644
--- a/host/commands/secure_env/Android.bp
+++ b/host/commands/secure_env/Android.bp
@@ -17,8 +17,45 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-cc_binary_host {
- name: "secure_env",
+cc_defaults {
+ name: "secure_env_defaults",
+ shared_libs: [
+ "libext2_blkid",
+ "libbase",
+ "libcppbor_external",
+ "libcppcose_rkp",
+ "libcuttlefish_fs",
+ "libcuttlefish_kernel_log_monitor_utils",
+ "libcuttlefish_security",
+ "libcuttlefish_utils",
+ "libfruit",
+ "libgatekeeper",
+ "libjsoncpp",
+ "libkeymaster_portable",
+ "libkeymaster_messages",
+ "libsoft_attestation_cert",
+ "liblog",
+ "libcrypto",
+ "libcutils",
+ "libpuresoftkeymasterdevice_host",
+ "ms-tpm-20-ref-lib",
+ "tpm2-tss2-esys",
+ "tpm2-tss2-mu",
+ "tpm2-tss2-rc",
+ "tpm2-tss2-tcti",
+ ],
+ static_libs: [
+ "libcuttlefish_host_config",
+ "libgflags",
+ "libscrypt_static",
+ ],
+ cflags: [
+ "-fno-rtti", // Required for libkeymaster_portable
+ ],
+}
+
+cc_library_host_static {
+ name: "libsecure_env",
srcs: [
"composite_serialization.cpp",
"device_tpm.cpp",
@@ -42,36 +79,35 @@
"tpm_keymaster_context.cpp",
"tpm_keymaster_enforcement.cpp",
"tpm_random_source.cpp",
+ "tpm_remote_provisioning_context.cpp",
"tpm_resource_manager.cpp",
"tpm_serialize.cpp",
],
- shared_libs: [
- "libbase",
- "libcuttlefish_fs",
- "libcuttlefish_security",
- "libcuttlefish_utils",
- "libgatekeeper",
- "libjsoncpp",
- "libkeymaster_portable",
- "libkeymaster_messages",
- "libsoft_attestation_cert",
- "liblog",
- "libcrypto",
- "libcutils",
- "libpuresoftkeymasterdevice_host",
- "ms-tpm-20-ref-lib",
- "tpm2-tss2-esys",
- "tpm2-tss2-mu",
- "tpm2-tss2-rc",
- "tpm2-tss2-tcti",
+ defaults: ["cuttlefish_buildhost_only", "secure_env_defaults"],
+}
+
+cc_binary_host {
+ name: "secure_env",
+ srcs: [
+ "secure_env.cpp",
],
static_libs: [
- "libcuttlefish_host_config",
- "libgflags",
- "libscrypt_static",
+ "libsecure_env",
],
- defaults: ["cuttlefish_buildhost_only"],
- cflags: [
- "-fno-rtti", // Required for libkeymaster_portable
+ defaults: ["cuttlefish_buildhost_only", "secure_env_defaults"],
+}
+
+cc_test_host {
+ name: "libsecure_env_test",
+ srcs: [
+ "test_tpm.cpp",
+ "encrypted_serializable_test.cpp",
],
+ static_libs: [
+ "libsecure_env",
+ ],
+ defaults: ["cuttlefish_buildhost_only", "secure_env_defaults"],
+ test_options: {
+ unit_test: true,
+ },
}
diff --git a/host/commands/secure_env/composite_serialization.cpp b/host/commands/secure_env/composite_serialization.cpp
index e3d6e43..791a604 100644
--- a/host/commands/secure_env/composite_serialization.cpp
+++ b/host/commands/secure_env/composite_serialization.cpp
@@ -17,6 +17,8 @@
using keymaster::Serializable;
+namespace cuttlefish {
+
CompositeSerializable::CompositeSerializable(
const std::vector<Serializable*>& members) : members_(members) {
}
@@ -46,3 +48,5 @@
}
return true;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/composite_serialization.h b/host/commands/secure_env/composite_serialization.h
index dfe2883..c83d159 100644
--- a/host/commands/secure_env/composite_serialization.h
+++ b/host/commands/secure_env/composite_serialization.h
@@ -19,6 +19,8 @@
#include "keymaster/serializable.h"
+namespace cuttlefish {
+
/**
* A keymaster::Serializable type that refers to multiple other
* keymaster::Serializable instances by pointer. When data is serialized or
@@ -37,3 +39,5 @@
private:
std::vector<keymaster::Serializable*> members_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/device_tpm.cpp b/host/commands/secure_env/device_tpm.cpp
index 6e4b4be..81ffbf3 100644
--- a/host/commands/secure_env/device_tpm.cpp
+++ b/host/commands/secure_env/device_tpm.cpp
@@ -20,6 +20,8 @@
#include <tss2/tss2_tcti.h>
#include <tss2/tss2_tcti_device.h>
+namespace cuttlefish {
+
static void FinalizeTcti(TSS2_TCTI_CONTEXT* tcti_context) {
if (tcti_context == nullptr) {
return;
@@ -52,3 +54,5 @@
TSS2_TCTI_CONTEXT* DeviceTpm::TctiContext() {
return tpm_.get();
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/device_tpm.h b/host/commands/secure_env/device_tpm.h
index a52666e..48988ad 100644
--- a/host/commands/secure_env/device_tpm.h
+++ b/host/commands/secure_env/device_tpm.h
@@ -21,6 +21,8 @@
#include "host/commands/secure_env/tpm.h"
+namespace cuttlefish {
+
/*
* Exposes a TSS2_TCTI_CONTEXT for interacting with a TPM device node.
*/
@@ -33,3 +35,5 @@
private:
std::unique_ptr<TSS2_TCTI_CONTEXT, void(*)(TSS2_TCTI_CONTEXT*)> tpm_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/encrypted_serializable.cpp b/host/commands/secure_env/encrypted_serializable.cpp
index 3845212..75891fc 100644
--- a/host/commands/secure_env/encrypted_serializable.cpp
+++ b/host/commands/secure_env/encrypted_serializable.cpp
@@ -16,13 +16,16 @@
#include "encrypted_serializable.h"
#include <vector>
-
+//
#include <android-base/logging.h>
#include "host/commands/secure_env/tpm_auth.h"
#include "host/commands/secure_env/tpm_encrypt_decrypt.h"
+#include "host/commands/secure_env/tpm_random_source.h"
#include "host/commands/secure_env/tpm_serialize.h"
+namespace cuttlefish {
+
EncryptedSerializable::EncryptedSerializable(
TpmResourceManager& resource_manager,
std::function<TpmObjectSlot(TpmResourceManager&)> parent_key_fn,
@@ -172,11 +175,14 @@
SerializeTpmKeyPublic serialize_public(&key_public);
SerializeTpmKeyPrivate serialize_private(&key_private);
auto encrypted_size = RoundUpToBlockSize(wrapped_.SerializedSize());
- return serialize_public.SerializedSize()
- + serialize_private.SerializedSize()
- + sizeof(uint32_t)
- + sizeof(uint32_t)
- + encrypted_size;
+ size_t size = serialize_public.SerializedSize(); // tpm key public part
+ size += serialize_private.SerializedSize(); // tpm key private part
+ size += sizeof(uint32_t); // block size
+ size += sizeof(uint32_t); // initialization vector length
+ size += sizeof(((TPM2B_IV*)nullptr)->buffer); // initialization vector
+ size += sizeof(uint32_t); // wrapped size
+ size += encrypted_size; // encrypted data
+ return size;
}
uint8_t* EncryptedSerializable::Serialize(
@@ -195,6 +201,15 @@
return buf;
}
+ TPM2B_IV iv;
+ iv.size = sizeof(iv.buffer);
+ auto rc = TpmRandomSource(resource_manager_.Esys())
+ .GenerateRandom(iv.buffer, sizeof(iv.buffer));
+ if (rc != KM_ERROR_OK) {
+ LOG(ERROR) << "Failed to get random data";
+ return buf;
+ }
+
auto wrapped_size = wrapped_.SerializedSize();
auto encrypted_size = RoundUpToBlockSize(wrapped_size);
std::vector<uint8_t> unencrypted(encrypted_size + 1, 0);
@@ -206,13 +221,9 @@
return buf;
}
std::vector<uint8_t> encrypted(encrypted_size, 0);
- if (!TpmEncrypt(
- resource_manager_.Esys(),
- key_slot->get(),
- TpmAuth(ESYS_TR_PASSWORD),
- unencrypted.data(),
- encrypted.data(),
- encrypted_size)) {
+ if (!TpmEncrypt( //
+ resource_manager_.Esys(), key_slot->get(), TpmAuth(ESYS_TR_PASSWORD),
+ iv, unencrypted.data(), encrypted.data(), encrypted_size)) {
LOG(ERROR) << "Encryption failed";
return buf;
}
@@ -222,6 +233,8 @@
buf = serialize_public.Serialize(buf, end);
buf = serialize_private.Serialize(buf, end);
buf = keymaster::append_uint32_to_buf(buf, end, BLOCK_SIZE);
+ buf = keymaster::append_uint32_to_buf(buf, end, iv.size);
+ buf = keymaster::append_to_buf(buf, end, iv.buffer, iv.size);
buf = keymaster::append_uint32_to_buf(buf, end, wrapped_size);
buf = keymaster::append_to_buf(buf, end, encrypted.data(), encrypted_size);
return buf;
@@ -262,6 +275,22 @@
<< ", expected " << BLOCK_SIZE;
return false;
}
+ uint32_t iv_size = 0;
+ if (!keymaster::copy_uint32_from_buf(buf_ptr, end, &iv_size)) {
+ LOG(ERROR) << "Failed to read iv size";
+ return false;
+ }
+ TPM2B_IV iv;
+ if (iv_size != sizeof(iv.buffer)) {
+ LOG(ERROR) << "iv size mismatch: received " << iv_size << ", expected "
+ << sizeof(iv.buffer);
+ return false;
+ }
+ iv.size = sizeof(iv.buffer);
+ if (!keymaster::copy_from_buf(buf_ptr, end, iv.buffer, sizeof(iv.buffer))) {
+ LOG(ERROR) << "Failed to read wrapped size";
+ return false;
+ }
uint32_t wrapped_size = 0;
if (!keymaster::copy_uint32_from_buf(buf_ptr, end, &wrapped_size)) {
LOG(ERROR) << "Failed to read wrapped size";
@@ -275,13 +304,9 @@
return false;
}
std::vector<uint8_t> decrypted_data(encrypted_size, 0);
- if (!TpmDecrypt(
- resource_manager_.Esys(),
- key_slot->get(),
- TpmAuth(ESYS_TR_PASSWORD),
- encrypted_data.data(),
- decrypted_data.data(),
- encrypted_size)) {
+ if (!TpmDecrypt( //
+ resource_manager_.Esys(), key_slot->get(), TpmAuth(ESYS_TR_PASSWORD),
+ iv, encrypted_data.data(), decrypted_data.data(), encrypted_size)) {
LOG(ERROR) << "Failed to decrypt encrypted data";
return false;
}
@@ -298,3 +323,5 @@
}
return true;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/encrypted_serializable.h b/host/commands/secure_env/encrypted_serializable.h
index c4a2e08..336c40c 100644
--- a/host/commands/secure_env/encrypted_serializable.h
+++ b/host/commands/secure_env/encrypted_serializable.h
@@ -19,6 +19,8 @@
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* A keymaster::Serializable that wraps another keymaster::Serializable,
* encrypting the data with a TPM to ensure privacy.
@@ -57,3 +59,5 @@
std::function<TpmObjectSlot(TpmResourceManager&)> parent_key_fn_;
keymaster::Serializable& wrapped_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/encrypted_serializable_test.cpp b/host/commands/secure_env/encrypted_serializable_test.cpp
new file mode 100644
index 0000000..f1e6923
--- /dev/null
+++ b/host/commands/secure_env/encrypted_serializable_test.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/commands/secure_env/encrypted_serializable.h"
+
+#include <gtest/gtest.h>
+#include <keymaster/serializable.h>
+#include <string.h>
+
+#include "host/commands/secure_env/primary_key_builder.h"
+#include "host/commands/secure_env/test_tpm.h"
+#include "host/commands/secure_env/tpm_resource_manager.h"
+
+namespace cuttlefish {
+
+TEST(TpmEncryptedSerializable, BinaryData) {
+ TestTpm tpm;
+ TpmResourceManager resource_manager(tpm.Esys());
+
+ uint8_t input_data[] = {1, 2, 3, 4, 5};
+ keymaster::Buffer input(input_data, sizeof(input_data));
+ EncryptedSerializable encrypt_input(resource_manager,
+ ParentKeyCreator("test"), input);
+
+ std::vector<uint8_t> encrypted_data(encrypt_input.SerializedSize());
+ auto encrypt_return = encrypt_input.Serialize(
+ encrypted_data.data(), encrypted_data.data() + encrypted_data.size());
+
+ keymaster::Buffer output(sizeof(input_data));
+ EncryptedSerializable decrypt_intermediate(resource_manager,
+ ParentKeyCreator("test"), output);
+ const uint8_t* encrypted_data_ptr = encrypted_data.data();
+ auto decrypt_return = decrypt_intermediate.Deserialize(
+ &encrypted_data_ptr, encrypted_data_ptr + encrypted_data.size());
+
+ ASSERT_EQ(encrypt_return, encrypted_data.data() + encrypted_data.size());
+ ASSERT_TRUE(decrypt_return);
+ ASSERT_EQ(encrypted_data_ptr, encrypted_data.data() + encrypted_data.size());
+ ASSERT_EQ(0, memcmp(input_data, output.begin(), sizeof(input_data)));
+}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/fragile_tpm_storage.cpp b/host/commands/secure_env/fragile_tpm_storage.cpp
index ae66164..107d895 100644
--- a/host/commands/secure_env/fragile_tpm_storage.cpp
+++ b/host/commands/secure_env/fragile_tpm_storage.cpp
@@ -23,6 +23,8 @@
#include "host/commands/secure_env/json_serializable.h"
#include "host/commands/secure_env/tpm_random_source.h"
+namespace cuttlefish {
+
static constexpr char kEntries[] = "entries";
static constexpr char kKey[] = "key";
static constexpr char kHandle[] = "handle";
@@ -238,3 +240,5 @@
}
return true;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/fragile_tpm_storage.h b/host/commands/secure_env/fragile_tpm_storage.h
index b52b373..9a92910 100644
--- a/host/commands/secure_env/fragile_tpm_storage.h
+++ b/host/commands/secure_env/fragile_tpm_storage.h
@@ -26,6 +26,8 @@
#include "host/commands/secure_env/gatekeeper_storage.h"
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* Manager for data stored inside the TPM with an index outside of the TPM. The
* contents of the data cannot be corrupted or decrypted by accessing the index,
@@ -58,3 +60,5 @@
std::string index_file_;
Json::Value index_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/gatekeeper_responder.cpp b/host/commands/secure_env/gatekeeper_responder.cpp
index 7d43a18..756bb72 100644
--- a/host/commands/secure_env/gatekeeper_responder.cpp
+++ b/host/commands/secure_env/gatekeeper_responder.cpp
@@ -18,6 +18,8 @@
#include <android-base/logging.h>
#include <gatekeeper/gatekeeper_messages.h>
+namespace cuttlefish {
+
GatekeeperResponder::GatekeeperResponder(
cuttlefish::GatekeeperChannel& channel, gatekeeper::GateKeeper& gatekeeper)
: channel_(channel), gatekeeper_(gatekeeper) {
@@ -60,3 +62,5 @@
return false;
}
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/gatekeeper_responder.h b/host/commands/secure_env/gatekeeper_responder.h
index bd27955..fcf7b28 100644
--- a/host/commands/secure_env/gatekeeper_responder.h
+++ b/host/commands/secure_env/gatekeeper_responder.h
@@ -19,6 +19,8 @@
#include "common/libs/security/gatekeeper_channel.h"
+namespace cuttlefish {
+
class GatekeeperResponder {
private:
cuttlefish::GatekeeperChannel& channel_;
@@ -29,3 +31,5 @@
bool ProcessMessage();
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/gatekeeper_storage.h b/host/commands/secure_env/gatekeeper_storage.h
index d272f71..1882ab0 100644
--- a/host/commands/secure_env/gatekeeper_storage.h
+++ b/host/commands/secure_env/gatekeeper_storage.h
@@ -20,6 +20,8 @@
#include <json/json.h>
#include <tss2/tss2_tpm2_types.h>
+namespace cuttlefish {
+
/**
* Data storage tailored to Gatekeeper's storage needs: storing binary blobs
* that can be destroyed without a trace or corrupted with an obvious trace, but
@@ -40,3 +42,5 @@
virtual bool Write(const Json::Value& key, const TPM2B_MAX_NV_BUFFER& data)
= 0;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/hmac_serializable.cpp b/host/commands/secure_env/hmac_serializable.cpp
index c40b736..9366797 100644
--- a/host/commands/secure_env/hmac_serializable.cpp
+++ b/host/commands/secure_env/hmac_serializable.cpp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2020 The Android Open Source Project
+// cOpyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,20 +16,23 @@
#include "hmac_serializable.h"
#include <android-base/logging.h>
+#include <optional>
+#include <vector>
#include "host/commands/secure_env/tpm_auth.h"
#include "host/commands/secure_env/tpm_hmac.h"
+namespace cuttlefish {
+
HmacSerializable::HmacSerializable(
TpmResourceManager& resource_manager,
std::function<TpmObjectSlot(TpmResourceManager&)> signing_key_fn,
- uint32_t digest_size,
- Serializable* wrapped) :
- resource_manager_(resource_manager),
- signing_key_fn_(signing_key_fn),
- digest_size_(digest_size),
- wrapped_(wrapped) {
-}
+ uint32_t digest_size, Serializable* wrapped, const Serializable* aad)
+ : resource_manager_(resource_manager),
+ signing_key_fn_(signing_key_fn),
+ digest_size_(digest_size),
+ wrapped_(wrapped),
+ aad_(aad) {}
size_t HmacSerializable::SerializedSize() const {
auto digest_size = sizeof(uint32_t) + digest_size_;
@@ -51,13 +54,13 @@
LOG(ERROR) << "Could not retrieve key";
return buf;
}
+ auto maced_data = AppendAad(signed_data, wrapped_size);
+ if (!maced_data) {
+ return buf;
+ }
auto hmac_data =
- TpmHmac(
- resource_manager_,
- key->get(),
- TpmAuth(ESYS_TR_PASSWORD),
- signed_data,
- wrapped_size);
+ TpmHmac(resource_manager_, key->get(), TpmAuth(ESYS_TR_PASSWORD),
+ maced_data->data(), maced_data->size());
if (!hmac_data) {
LOG(ERROR) << "Failed to produce hmac";
return buf;
@@ -99,13 +102,13 @@
LOG(ERROR) << "Could not retrieve key";
return false;
}
+ auto maced_data = AppendAad(signed_data.get(), signed_data_size);
+ if (!maced_data) {
+ return false;
+ }
auto hmac_check =
- TpmHmac(
- resource_manager_,
- key->get(),
- TpmAuth(ESYS_TR_PASSWORD),
- signed_data.get(),
- signed_data_size);
+ TpmHmac(resource_manager_, key->get(), TpmAuth(ESYS_TR_PASSWORD),
+ maced_data->data(), maced_data->size());
if (!hmac_check) {
LOG(ERROR) << "Unable to calculate signature check";
return false;
@@ -125,3 +128,24 @@
return wrapped_->Deserialize(
const_cast<const uint8_t**>(&inner_buf), inner_buf_end);
}
+
+std::optional<std::vector<uint8_t>> HmacSerializable::AppendAad(
+ const uint8_t* sensitive, size_t sensitive_size) const {
+ if (!aad_) {
+ return std::vector<uint8_t>(sensitive, sensitive + sensitive_size);
+ }
+ std::vector<uint8_t> output(sensitive_size + aad_->SerializedSize());
+ std::copy(sensitive, sensitive + sensitive_size, output.begin());
+
+ const uint8_t* actual_output_end =
+ aad_->Serialize(&output[sensitive_size], output.data() + output.size());
+ const ptrdiff_t actual_aad_size = actual_output_end - output.data();
+ if (actual_aad_size != output.size()) {
+ LOG(ERROR) << "Serialized aad did not match expected size. Expected: "
+ << output.size() << ", actual: " << actual_aad_size;
+ return std::nullopt;
+ }
+ return output;
+}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/hmac_serializable.h b/host/commands/secure_env/hmac_serializable.h
index 4b90124..35a6236 100644
--- a/host/commands/secure_env/hmac_serializable.h
+++ b/host/commands/secure_env/hmac_serializable.h
@@ -15,10 +15,15 @@
#pragma once
+#include <optional>
+#include <vector>
+
#include <keymaster/serializable.h>
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* A keymaster::Serializable that wraps another keymaster::Serializable,
* protecting it from tampering while it is stored elsewhere. This stores
@@ -38,17 +43,23 @@
*/
class HmacSerializable : public keymaster::Serializable {
public:
- HmacSerializable(TpmResourceManager&,
- std::function<TpmObjectSlot(TpmResourceManager&)>,
- uint32_t digest_size,
- Serializable*);
+ HmacSerializable(TpmResourceManager&,
+ std::function<TpmObjectSlot(TpmResourceManager&)>,
+ uint32_t digest_size, Serializable*, const Serializable* aad);
- size_t SerializedSize() const override;
- uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const override;
- bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end) override;
+ size_t SerializedSize() const override;
+ uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const override;
+ bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end) override;
+
private:
TpmResourceManager& resource_manager_;
std::function<TpmObjectSlot(TpmResourceManager&)> signing_key_fn_;
uint32_t digest_size_;
- keymaster::Serializable* wrapped_;
+ Serializable* wrapped_;
+ const Serializable* aad_;
+
+ std::optional<std::vector<uint8_t>> AppendAad(const uint8_t* sensitive,
+ size_t sensitive_size) const;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/in_process_tpm.cpp b/host/commands/secure_env/in_process_tpm.cpp
index f240c08..551283e 100644
--- a/host/commands/secure_env/in_process_tpm.cpp
+++ b/host/commands/secure_env/in_process_tpm.cpp
@@ -37,13 +37,18 @@
#include <android-base/logging.h>
+#include <mutex>
+
+namespace cuttlefish {
+
struct __attribute__((__packed__)) tpm_message_header {
uint16_t tag;
uint32_t length;
uint32_t ordinal;
};
-struct InProcessTpm::Impl {
+class InProcessTpm::Impl {
+ public:
static Impl* FromContext(TSS2_TCTI_CONTEXT* context) {
auto offset = offsetof(Impl, tcti_context_);
char* context_char = reinterpret_cast<char*>(context);
@@ -94,63 +99,88 @@
return TSS2_RC_SUCCESS;
}
+ Impl() {
+ {
+ std::lock_guard<std::mutex> lock(global_mutex);
+ // This is a limitation of ms-tpm-20-ref
+ CHECK(!global_instance) << "InProcessTpm internally uses global data, so "
+ << "only one can exist.";
+ global_instance = this;
+ }
+
+ tcti_context_.v1.magic = 0xFAD;
+ tcti_context_.v1.version = 1;
+ tcti_context_.v1.transmit = Impl::Transmit;
+ tcti_context_.v1.receive = Impl::Receive;
+ _plat__NVEnable(NULL);
+ if (_plat__NVNeedsManufacture()) {
+ // Can't use android logging here due to a macro conflict with TPM
+ // internals
+ LOG(DEBUG) << "Manufacturing TPM state";
+ if (TPM_Manufacture(1)) {
+ LOG(FATAL) << "Failed to manufacture TPM state";
+ }
+ }
+ _rpc__Signal_PowerOn(false);
+ _rpc__Signal_NvOn();
+
+ ESYS_CONTEXT* esys = nullptr;
+ auto rc = Esys_Initialize(&esys, TctiContext(), nullptr);
+ if (rc != TPM2_RC_SUCCESS) {
+ LOG(FATAL) << "Could not initialize esys: " << Tss2_RC_Decode(rc) << " ("
+ << rc << ")";
+ }
+
+ rc = Esys_Startup(esys, TPM2_SU_CLEAR);
+ if (rc != TPM2_RC_SUCCESS) {
+ LOG(FATAL) << "TPM2_Startup failed: " << Tss2_RC_Decode(rc) << " (" << rc
+ << ")";
+ }
+
+ TPM2B_AUTH auth = {};
+ Esys_TR_SetAuth(esys, ESYS_TR_RH_LOCKOUT, &auth);
+
+ rc = Esys_DictionaryAttackLockReset(
+ /* esysContext */ esys,
+ /* lockHandle */ ESYS_TR_RH_LOCKOUT,
+ /* shandle1 */ ESYS_TR_PASSWORD,
+ /* shandle2 */ ESYS_TR_NONE,
+ /* shandle3 */ ESYS_TR_NONE);
+
+ if (rc != TPM2_RC_SUCCESS) {
+ LOG(FATAL) << "Could not reset TPM lockout: " << Tss2_RC_Decode(rc)
+ << " (" << rc << ")";
+ }
+
+ Esys_Finalize(&esys);
+ }
+
+ ~Impl() {
+ _rpc__Signal_NvOff();
+ _rpc__Signal_PowerOff();
+ std::lock_guard<std::mutex> lock(global_mutex);
+ global_instance = nullptr;
+ }
+
+ TSS2_TCTI_CONTEXT* TctiContext() {
+ return reinterpret_cast<TSS2_TCTI_CONTEXT*>(&tcti_context_);
+ }
+
+ private:
+ static std::mutex global_mutex;
+ static Impl* global_instance;
TSS2_TCTI_CONTEXT_COMMON_CURRENT tcti_context_;
std::list<std::vector<uint8_t>> command_queue_;
std::mutex queue_mutex_;
};
-InProcessTpm::InProcessTpm() : impl_(new Impl()) {
- impl_->tcti_context_.v1.magic = 0xFAD;
- impl_->tcti_context_.v1.version = 1;
- impl_->tcti_context_.v1.transmit = Impl::Transmit;
- impl_->tcti_context_.v1.receive = Impl::Receive;
- _plat__NVEnable(NULL);
- if (_plat__NVNeedsManufacture()) {
- // Can't use android logging here due to a macro conflict with TPM internals
- LOG(DEBUG) << "Manufacturing TPM state";
- if (TPM_Manufacture(1)) {
- LOG(FATAL) << "Failed to manufacture TPM state";
- }
- }
- _rpc__Signal_PowerOn(false);
- _rpc__Signal_NvOn();
+std::mutex InProcessTpm::Impl::global_mutex;
+InProcessTpm::Impl* InProcessTpm::Impl::global_instance;
- ESYS_CONTEXT* esys = nullptr;
- auto rc = Esys_Initialize(&esys, TctiContext(), nullptr);
- if (rc != TPM2_RC_SUCCESS) {
- LOG(FATAL) << "Could not initialize esys: " << Tss2_RC_Decode(rc)
- << " (" << rc << ")";
- }
+InProcessTpm::InProcessTpm() : impl_(new Impl()) {}
- rc = Esys_Startup(esys, TPM2_SU_CLEAR);
- if (rc != TPM2_RC_SUCCESS) {
- LOG(FATAL) << "TPM2_Startup failed: " << Tss2_RC_Decode(rc)
- << " (" << rc << ")";
- }
+InProcessTpm::~InProcessTpm() = default;
- TPM2B_AUTH auth = {};
- Esys_TR_SetAuth(esys, ESYS_TR_RH_LOCKOUT, &auth);
+TSS2_TCTI_CONTEXT* InProcessTpm::TctiContext() { return impl_->TctiContext(); }
- rc = Esys_DictionaryAttackLockReset(
- /* esysContext */ esys,
- /* lockHandle */ ESYS_TR_RH_LOCKOUT,
- /* shandle1 */ ESYS_TR_PASSWORD,
- /* shandle2 */ ESYS_TR_NONE,
- /* shandle3 */ ESYS_TR_NONE);
-
- if (rc != TPM2_RC_SUCCESS) {
- LOG(FATAL) << "Could not reset TPM lockout: " << Tss2_RC_Decode(rc)
- << " (" << rc << ")";
- }
-
- Esys_Finalize(&esys);
-}
-
-InProcessTpm::~InProcessTpm() {
- _rpc__Signal_NvOff();
- _rpc__Signal_PowerOff();
-}
-
-TSS2_TCTI_CONTEXT* InProcessTpm::TctiContext() {
- return reinterpret_cast<TSS2_TCTI_CONTEXT*>(&impl_->tcti_context_);
-}
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/in_process_tpm.h b/host/commands/secure_env/in_process_tpm.h
index 35fecfb..624e7c4 100644
--- a/host/commands/secure_env/in_process_tpm.h
+++ b/host/commands/secure_env/in_process_tpm.h
@@ -23,6 +23,8 @@
#include "host/commands/secure_env/tpm.h"
+namespace cuttlefish {
+
/*
* Exposes a TSS2_TCTI_CONTEXT for interacting with an in-process TPM simulator.
*
@@ -41,7 +43,9 @@
TSS2_TCTI_CONTEXT* TctiContext() override;
private:
- struct Impl;
+ class Impl;
- std::unique_ptr<Impl> impl_;
+ std::unique_ptr<Impl> impl_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/insecure_fallback_storage.cpp b/host/commands/secure_env/insecure_fallback_storage.cpp
index f906bd5..643a3ce 100644
--- a/host/commands/secure_env/insecure_fallback_storage.cpp
+++ b/host/commands/secure_env/insecure_fallback_storage.cpp
@@ -23,6 +23,8 @@
#include "host/commands/secure_env/json_serializable.h"
#include "host/commands/secure_env/tpm_random_source.h"
+namespace cuttlefish {
+
static constexpr char kEntries[] = "entries";
static constexpr char kKey[] = "key";
static constexpr char kValue[] = "value";
@@ -147,3 +149,5 @@
}
return true;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/insecure_fallback_storage.h b/host/commands/secure_env/insecure_fallback_storage.h
index 93788a0..64405be 100644
--- a/host/commands/secure_env/insecure_fallback_storage.h
+++ b/host/commands/secure_env/insecure_fallback_storage.h
@@ -23,6 +23,8 @@
#include "host/commands/secure_env/gatekeeper_storage.h"
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* A GatekeeperStorage fallback implementation that is less secure. It uses an
* index file that is signed and encrypted by the TPM and the sensitive data
@@ -54,3 +56,5 @@
std::string index_file_;
Json::Value index_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/json_serializable.cpp b/host/commands/secure_env/json_serializable.cpp
index d4f2fd8..630fb529 100644
--- a/host/commands/secure_env/json_serializable.cpp
+++ b/host/commands/secure_env/json_serializable.cpp
@@ -24,6 +24,8 @@
#include "host/commands/secure_env/hmac_serializable.h"
#include "host/commands/secure_env/primary_key_builder.h"
+namespace cuttlefish {
+
static constexpr char kUniqueKey[] = "JsonSerializable";
class JsonSerializable : public keymaster::Serializable {
@@ -89,8 +91,9 @@
EncryptedSerializable encryption(
resource_manager, parent_key_fn, sensitive_material);
auto signing_key_fn = SigningKeyCreator(kUniqueKey);
- HmacSerializable sign_check(
- resource_manager, signing_key_fn, TPM2_SHA256_DIGEST_SIZE, &encryption);
+ HmacSerializable sign_check(resource_manager, signing_key_fn,
+ TPM2_SHA256_DIGEST_SIZE, &encryption,
+ /*aad=*/nullptr);
auto size = sign_check.SerializedSize();
LOG(INFO) << "size : " << size;
@@ -139,8 +142,9 @@
EncryptedSerializable encryption(
resource_manager, parent_key_fn, sensitive_material);
auto signing_key_fn = SigningKeyCreator(kUniqueKey);
- HmacSerializable sign_check(
- resource_manager, signing_key_fn, TPM2_SHA256_DIGEST_SIZE, &encryption);
+ HmacSerializable sign_check(resource_manager, signing_key_fn,
+ TPM2_SHA256_DIGEST_SIZE, &encryption,
+ /*aad=*/nullptr);
auto buf = reinterpret_cast<const uint8_t*>(buffer.data());
auto buf_end = buf + buffer.size();
@@ -151,3 +155,5 @@
return json;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/json_serializable.h b/host/commands/secure_env/json_serializable.h
index f96aab3..984f396 100644
--- a/host/commands/secure_env/json_serializable.h
+++ b/host/commands/secure_env/json_serializable.h
@@ -19,7 +19,11 @@
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
bool WriteProtectedJsonToFile(
TpmResourceManager&, const std::string& filename, Json::Value);
Json::Value ReadProtectedJsonFromFile(
TpmResourceManager&, const std::string& filename);
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/keymaster_responder.cpp b/host/commands/secure_env/keymaster_responder.cpp
index a564254..46081ca 100644
--- a/host/commands/secure_env/keymaster_responder.cpp
+++ b/host/commands/secure_env/keymaster_responder.cpp
@@ -18,6 +18,8 @@
#include <android-base/logging.h>
#include <keymaster/android_keymaster_messages.h>
+namespace cuttlefish {
+
KeymasterResponder::KeymasterResponder(
cuttlefish::KeymasterChannel& channel, keymaster::AndroidKeymaster& keymaster)
: channel_(channel), keymaster_(keymaster) {
@@ -65,6 +67,8 @@
HANDLE_MESSAGE(DELETE_KEY, DeleteKey)
HANDLE_MESSAGE(DELETE_ALL_KEYS, DeleteAllKeys)
HANDLE_MESSAGE(IMPORT_WRAPPED_KEY, ImportWrappedKey)
+ HANDLE_MESSAGE(GENERATE_RKP_KEY, GenerateRkpKey)
+ HANDLE_MESSAGE(GENERATE_CSR, GenerateCsr)
HANDLE_MESSAGE(GENERATE_TIMESTAMP_TOKEN, GenerateTimestampToken)
#undef HANDLE_MESSAGE
#define HANDLE_MESSAGE_W_RETURN(ENUM_NAME, METHOD_NAME) \
@@ -81,7 +85,10 @@
HANDLE_MESSAGE_W_RETURN(VERIFY_AUTHORIZATION, VerifyAuthorization)
HANDLE_MESSAGE_W_RETURN(DEVICE_LOCKED, DeviceLocked)
HANDLE_MESSAGE_W_RETURN(GET_VERSION_2, GetVersion2)
-#undef HANDLE_MESSAGE
+ HANDLE_MESSAGE_W_RETURN(CONFIGURE_VENDOR_PATCHLEVEL,
+ ConfigureVendorPatchlevel)
+ HANDLE_MESSAGE_W_RETURN(CONFIGURE_BOOT_PATCHLEVEL, ConfigureBootPatchlevel)
+#undef HANDLE_MESSAGE_W_RETURN
#define HANDLE_MESSAGE_W_RETURN_NO_ARG(ENUM_NAME, METHOD_NAME) \
case ENUM_NAME: {\
auto response = keymaster_.METHOD_NAME(); \
@@ -89,7 +96,7 @@
}
HANDLE_MESSAGE_W_RETURN_NO_ARG(GET_HMAC_SHARING_PARAMETERS, GetHmacSharingParameters)
HANDLE_MESSAGE_W_RETURN_NO_ARG(EARLY_BOOT_ENDED, EarlyBootEnded)
-#undef HANDLE_MESSAGE
+#undef HANDLE_MESSAGE_W_RETURN_NO_ARG
case ADD_RNG_ENTROPY: {
AddEntropyRequest request(keymaster_.message_version());
if (!request.Deserialize(&buffer, end)) {
@@ -107,3 +114,5 @@
return false;
}
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/keymaster_responder.h b/host/commands/secure_env/keymaster_responder.h
index f8fb6ec..2bbd893 100644
--- a/host/commands/secure_env/keymaster_responder.h
+++ b/host/commands/secure_env/keymaster_responder.h
@@ -19,6 +19,8 @@
#include "common/libs/security/keymaster_channel.h"
+namespace cuttlefish {
+
class KeymasterResponder {
private:
cuttlefish::KeymasterChannel& channel_;
@@ -29,3 +31,5 @@
bool ProcessMessage();
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/primary_key_builder.cpp b/host/commands/secure_env/primary_key_builder.cpp
index a44ff24..b333002 100644
--- a/host/commands/secure_env/primary_key_builder.cpp
+++ b/host/commands/secure_env/primary_key_builder.cpp
@@ -19,6 +19,8 @@
#include <tss2/tss2_mu.h>
#include <tss2/tss2_rc.h>
+namespace cuttlefish {
+
PrimaryKeyBuilder::PrimaryKeyBuilder() : public_area_({}) {
public_area_.nameAlg = TPM2_ALG_SHA256;
};
@@ -133,3 +135,5 @@
return key_builder.CreateKey(resource_manager);
};
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/primary_key_builder.h b/host/commands/secure_env/primary_key_builder.h
index 46e5461..70170e7 100644
--- a/host/commands/secure_env/primary_key_builder.h
+++ b/host/commands/secure_env/primary_key_builder.h
@@ -22,6 +22,8 @@
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
class PrimaryKeyBuilder {
public:
PrimaryKeyBuilder();
@@ -40,3 +42,5 @@
std::function<TpmObjectSlot(TpmResourceManager&)>
ParentKeyCreator(const std::string& unique);
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/proxy_keymaster_context.h b/host/commands/secure_env/proxy_keymaster_context.h
new file mode 100644
index 0000000..bcb1657
--- /dev/null
+++ b/host/commands/secure_env/proxy_keymaster_context.h
@@ -0,0 +1,152 @@
+//
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <map>
+#include <vector>
+
+#include <keymaster/key.h>
+#include <keymaster/keymaster_context.h>
+#include <keymaster/km_openssl/attestation_record.h>
+
+#include "tpm_attestation_record.h"
+
+namespace cuttlefish {
+
+class TpmAttestationRecordContext;
+class TpmResourceManager;
+class TpmKeyBlobMaker;
+class TpmRandomSource;
+class TpmRemoteProvisioningContext;
+
+/**
+ * Implementation of KeymasterContext that proxies to another implementation.
+ *
+ * Because AndroidKeymaster wraps a KeymasterContext and puts it into a unique
+ * pointer, it doesn't let the implementor manage the lifetime of the
+ * KeymasterContext implementation. This proxy breaks that relationship, and
+ * allows the lifetimes to be distinct as long as the KeymasterContext instance
+ * outlives the AndroidKeymaster instance.
+ */
+class ProxyKeymasterContext : public keymaster::KeymasterContext {
+ public:
+ ProxyKeymasterContext(KeymasterContext& wrapped) : wrapped_(wrapped) {}
+ ~ProxyKeymasterContext() = default;
+
+ keymaster::KmVersion GetKmVersion() const override {
+ return wrapped_.GetKmVersion();
+ }
+
+ keymaster_error_t SetSystemVersion(uint32_t os_version,
+ uint32_t os_patchlevel) override {
+ return wrapped_.SetSystemVersion(os_version, os_patchlevel);
+ }
+ void GetSystemVersion(uint32_t* os_version,
+ uint32_t* os_patchlevel) const override {
+ return wrapped_.GetSystemVersion(os_version, os_patchlevel);
+ }
+
+ const keymaster::KeyFactory* GetKeyFactory(
+ keymaster_algorithm_t algorithm) const override {
+ return wrapped_.GetKeyFactory(algorithm);
+ }
+ const keymaster::OperationFactory* GetOperationFactory(
+ keymaster_algorithm_t algorithm,
+ keymaster_purpose_t purpose) const override {
+ return wrapped_.GetOperationFactory(algorithm, purpose);
+ }
+ const keymaster_algorithm_t* GetSupportedAlgorithms(
+ size_t* algorithms_count) const override {
+ return wrapped_.GetSupportedAlgorithms(algorithms_count);
+ }
+
+ keymaster_error_t UpgradeKeyBlob(
+ const keymaster::KeymasterKeyBlob& key_to_upgrade,
+ const keymaster::AuthorizationSet& upgrade_params,
+ keymaster::KeymasterKeyBlob* upgraded_key) const override {
+ return wrapped_.UpgradeKeyBlob(key_to_upgrade, upgrade_params,
+ upgraded_key);
+ }
+
+ keymaster_error_t ParseKeyBlob(
+ const keymaster::KeymasterKeyBlob& blob,
+ const keymaster::AuthorizationSet& additional_params,
+ keymaster::UniquePtr<keymaster::Key>* key) const override {
+ return wrapped_.ParseKeyBlob(blob, additional_params, key);
+ }
+
+ keymaster_error_t AddRngEntropy(const uint8_t* buf,
+ size_t length) const override {
+ return wrapped_.AddRngEntropy(buf, length);
+ }
+
+ keymaster::KeymasterEnforcement* enforcement_policy() override {
+ return wrapped_.enforcement_policy();
+ }
+
+ keymaster::CertificateChain GenerateAttestation(
+ const keymaster::Key& key,
+ const keymaster::AuthorizationSet& attest_params,
+ keymaster::UniquePtr<keymaster::Key> attest_key,
+ const keymaster::KeymasterBlob& issuer_subject,
+ keymaster_error_t* error) const override {
+ return wrapped_.GenerateAttestation(
+ key, attest_params, std::move(attest_key), issuer_subject, error);
+ }
+
+ keymaster::CertificateChain GenerateSelfSignedCertificate(
+ const keymaster::Key& key, const keymaster::AuthorizationSet& cert_params,
+ bool fake_signature, keymaster_error_t* error) const override {
+ return wrapped_.GenerateSelfSignedCertificate(key, cert_params,
+ fake_signature, error);
+ }
+
+ keymaster_error_t UnwrapKey(
+ const keymaster::KeymasterKeyBlob& wrapped_key_blob,
+ const keymaster::KeymasterKeyBlob& wrapping_key_blob,
+ const keymaster::AuthorizationSet& wrapping_key_params,
+ const keymaster::KeymasterKeyBlob& masking_key,
+ keymaster::AuthorizationSet* wrapped_key_params,
+ keymaster_key_format_t* wrapped_key_format,
+ keymaster::KeymasterKeyBlob* wrapped_key_material) const override {
+ return wrapped_.UnwrapKey(
+ wrapped_key_blob, wrapping_key_blob, wrapping_key_params, masking_key,
+ wrapped_key_params, wrapped_key_format, wrapped_key_material);
+ }
+
+ keymaster::RemoteProvisioningContext* GetRemoteProvisioningContext()
+ const override {
+ return wrapped_.GetRemoteProvisioningContext();
+ }
+
+ keymaster_error_t SetVendorPatchlevel(uint32_t vendor_patchlevel) override {
+ return wrapped_.SetVendorPatchlevel(vendor_patchlevel);
+ }
+ keymaster_error_t SetBootPatchlevel(uint32_t boot_patchlevel) override {
+ return wrapped_.SetBootPatchlevel(boot_patchlevel);
+ }
+ std::optional<uint32_t> GetVendorPatchlevel() const override {
+ return wrapped_.GetVendorPatchlevel();
+ }
+ std::optional<uint32_t> GetBootPatchlevel() const override {
+ return wrapped_.GetBootPatchlevel();
+ }
+
+ private:
+ KeymasterContext& wrapped_;
+};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/secure_env.cpp b/host/commands/secure_env/secure_env.cpp
index c050c58..114a7bd 100644
--- a/host/commands/secure_env/secure_env.cpp
+++ b/host/commands/secure_env/secure_env.cpp
@@ -16,22 +16,26 @@
#include <thread>
#include <android-base/logging.h>
+#include <fruit/fruit.h>
#include <gflags/gflags.h>
#include <keymaster/android_keymaster.h>
-#include <keymaster/soft_keymaster_logger.h>
#include <keymaster/contexts/pure_soft_keymaster_context.h>
+#include <keymaster/soft_keymaster_logger.h>
#include <tss2/tss2_esys.h>
#include <tss2/tss2_rc.h>
#include "common/libs/fs/shared_fd.h"
#include "common/libs/security/gatekeeper_channel.h"
#include "common/libs/security/keymaster_channel.h"
+#include "host/commands/kernel_log_monitor/kernel_log_server.h"
+#include "host/commands/kernel_log_monitor/utils.h"
#include "host/commands/secure_env/device_tpm.h"
#include "host/commands/secure_env/fragile_tpm_storage.h"
#include "host/commands/secure_env/gatekeeper_responder.h"
-#include "host/commands/secure_env/insecure_fallback_storage.h"
#include "host/commands/secure_env/in_process_tpm.h"
+#include "host/commands/secure_env/insecure_fallback_storage.h"
#include "host/commands/secure_env/keymaster_responder.h"
+#include "host/commands/secure_env/proxy_keymaster_context.h"
#include "host/commands/secure_env/soft_gatekeeper.h"
#include "host/commands/secure_env/tpm_gatekeeper.h"
#include "host/commands/secure_env/tpm_keymaster_context.h"
@@ -39,13 +43,15 @@
#include "host/commands/secure_env/tpm_resource_manager.h"
#include "host/libs/config/logging.h"
-// Copied from AndroidKeymaster4Device
-constexpr size_t kOperationTableSize = 16;
-
DEFINE_int32(keymaster_fd_in, -1, "A pipe for keymaster communication");
DEFINE_int32(keymaster_fd_out, -1, "A pipe for keymaster communication");
DEFINE_int32(gatekeeper_fd_in, -1, "A pipe for gatekeeper communication");
DEFINE_int32(gatekeeper_fd_out, -1, "A pipe for gatekeeper communication");
+DEFINE_int32(kernel_events_fd, -1,
+ "A pipe for monitoring events based on "
+ "messages written to the kernel log. This "
+ "is used by secure_env to monitor for "
+ "device reboots.");
DEFINE_string(tpm_impl,
"in_memory",
@@ -57,37 +63,96 @@
DEFINE_string(gatekeeper_impl, "tpm",
"The gatekeeper implementation. \"tpm\" or \"software\"");
-int main(int argc, char** argv) {
- cuttlefish::DefaultSubprocessLogging(argv);
+namespace cuttlefish {
+namespace {
+
+// Copied from AndroidKeymaster4Device
+constexpr size_t kOperationTableSize = 16;
+
+// Dup a command line file descriptor into a SharedFD.
+SharedFD DupFdFlag(gflags::int32 fd) {
+ CHECK(fd != -1);
+ SharedFD duped = SharedFD::Dup(fd);
+ CHECK(duped->IsOpen()) << "Could not dup output fd: " << duped->StrError();
+ // The original FD is intentionally kept open so that we can re-exec this
+ // process without having to do a bunch of argv book-keeping.
+ return duped;
+}
+
+// Re-launch this process with all the same flags it was originallys started
+// with.
+[[noreturn]] void ReExecSelf() {
+ // Allocate +1 entry for terminating nullptr.
+ std::vector<char*> argv(gflags::GetArgvs().size() + 1, nullptr);
+ for (size_t i = 0; i < gflags::GetArgvs().size(); ++i) {
+ argv[i] = strdup(gflags::GetArgvs()[i].c_str());
+ CHECK(argv[i] != nullptr) << "OOM";
+ }
+ execv("/proc/self/exe", argv.data());
+ char buf[128];
+ LOG(FATAL) << "Exec failed, secure_env is out of sync with the guest: "
+ << errno << "(" << strerror_r(errno, buf, sizeof(buf)) << ")";
+ abort(); // LOG(FATAL) isn't marked as noreturn
+}
+
+// Spin up a thread that monitors for a kernel loaded event, then re-execs
+// this process. This way, secure_env's boot tracking matches up with the guest.
+std::thread StartKernelEventMonitor(SharedFD kernel_events_fd) {
+ return std::thread([kernel_events_fd]() {
+ while (kernel_events_fd->IsOpen()) {
+ auto read_result = monitor::ReadEvent(kernel_events_fd);
+ CHECK(read_result.has_value()) << kernel_events_fd->StrError();
+ if (read_result->event == monitor::Event::KernelLoaded) {
+ LOG(DEBUG) << "secure_env detected guest reboot, restarting.";
+ ReExecSelf();
+ }
+ }
+ });
+}
+
+fruit::Component<TpmResourceManager> SecureEnvComponent() {
+ return fruit::createComponent()
+ .registerProvider([]() -> Tpm* { // fruit will take ownership
+ if (FLAGS_tpm_impl == "in_memory") {
+ return new InProcessTpm();
+ } else if (FLAGS_tpm_impl == "host_device") {
+ return new DeviceTpm("/dev/tpm0");
+ } else {
+ LOG(FATAL) << "Unknown TPM implementation: " << FLAGS_tpm_impl;
+ abort();
+ }
+ })
+ .registerProvider([](Tpm* tpm) {
+ if (tpm->TctiContext() == nullptr) {
+ LOG(FATAL) << "Unable to connect to TPM implementation.";
+ }
+ ESYS_CONTEXT* esys_ptr = nullptr;
+ std::unique_ptr<ESYS_CONTEXT, void (*)(ESYS_CONTEXT*)> esys(
+ nullptr, [](ESYS_CONTEXT* esys) { Esys_Finalize(&esys); });
+ auto rc = Esys_Initialize(&esys_ptr, tpm->TctiContext(), nullptr);
+ if (rc != TPM2_RC_SUCCESS) {
+ LOG(FATAL) << "Could not initialize esys: " << Tss2_RC_Decode(rc)
+ << " (" << rc << ")";
+ }
+ esys.reset(esys_ptr);
+ return esys;
+ })
+ .registerProvider(
+ [](std::unique_ptr<ESYS_CONTEXT, void (*)(ESYS_CONTEXT*)>& esys) {
+ return new TpmResourceManager(
+ esys.get()); // fruit will take ownership
+ });
+}
+
+} // namespace
+
+int SecureEnvMain(int argc, char** argv) {
+ DefaultSubprocessLogging(argv);
gflags::ParseCommandLineFlags(&argc, &argv, true);
keymaster::SoftKeymasterLogger km_logger;
- std::unique_ptr<Tpm> tpm;
- if (FLAGS_tpm_impl == "in_memory") {
- tpm.reset(new InProcessTpm());
- } else if (FLAGS_tpm_impl == "host_device") {
- tpm.reset(new DeviceTpm("/dev/tpm0"));
- } else {
- LOG(FATAL) << "Unknown TPM implementation: " << FLAGS_tpm_impl;
- }
-
- if (tpm->TctiContext() == nullptr) {
- LOG(FATAL) << "Unable to connect to TPM implementation.";
- }
-
- std::unique_ptr<TpmResourceManager> resource_manager;
- std::unique_ptr<ESYS_CONTEXT, void(*)(ESYS_CONTEXT*)> esys(
- nullptr, [](ESYS_CONTEXT* esys) { Esys_Finalize(&esys); });
- if (FLAGS_keymint_impl == "tpm" || FLAGS_gatekeeper_impl == "tpm") {
- ESYS_CONTEXT* esys_ptr = nullptr;
- auto rc = Esys_Initialize(&esys_ptr, tpm->TctiContext(), nullptr);
- if (rc != TPM2_RC_SUCCESS) {
- LOG(FATAL) << "Could not initialize esys: " << Tss2_RC_Decode(rc)
- << " (" << rc << ")";
- }
- esys.reset(esys_ptr);
- resource_manager.reset(new TpmResourceManager(esys.get()));
- }
+ fruit::Injector<TpmResourceManager> injector(SecureEnvComponent);
+ TpmResourceManager* resource_manager = injector.get<TpmResourceManager*>();
std::unique_ptr<GatekeeperStorage> secure_storage;
std::unique_ptr<GatekeeperStorage> insecure_storage;
@@ -109,54 +174,36 @@
new TpmKeymasterEnforcement(*resource_manager, *tpm_gatekeeper));
}
- // keymaster::AndroidKeymaster puts the given pointer into a UniquePtr,
- // taking ownership.
- keymaster::KeymasterContext* keymaster_context;
+ std::unique_ptr<keymaster::KeymasterContext> keymaster_context;
if (FLAGS_keymint_impl == "software") {
// TODO: See if this is the right KM version.
- keymaster_context =
- new keymaster::PureSoftKeymasterContext(keymaster::KmVersion::KEYMASTER_4,
- KM_SECURITY_LEVEL_SOFTWARE);
+ keymaster_context.reset(new keymaster::PureSoftKeymasterContext(
+ keymaster::KmVersion::KEYMINT_2, KM_SECURITY_LEVEL_SOFTWARE));
} else if (FLAGS_keymint_impl == "tpm") {
- keymaster_context =
- new TpmKeymasterContext(*resource_manager, *keymaster_enforcement);
+ keymaster_context.reset(
+ new TpmKeymasterContext(*resource_manager, *keymaster_enforcement));
} else {
LOG(FATAL) << "Unknown keymaster implementation " << FLAGS_keymint_impl;
return -1;
}
+ // keymaster::AndroidKeymaster puts the context pointer into a UniquePtr,
+ // taking ownership.
keymaster::AndroidKeymaster keymaster{
- keymaster_context, kOperationTableSize,
- keymaster::MessageVersion(keymaster::KmVersion::KEYMINT_1,
+ new ProxyKeymasterContext(*keymaster_context), kOperationTableSize,
+ keymaster::MessageVersion(keymaster::KmVersion::KEYMINT_2,
0 /* km_date */)};
- CHECK(FLAGS_keymaster_fd_in != -1);
- auto keymaster_in = cuttlefish::SharedFD::Dup(FLAGS_keymaster_fd_in);
- CHECK(keymaster_in->IsOpen()) << "Could not dup input fd: "
- << keymaster_in->StrError();
- close(FLAGS_keymaster_fd_in);
+ auto keymaster_in = DupFdFlag(FLAGS_keymaster_fd_in);
+ auto keymaster_out = DupFdFlag(FLAGS_keymaster_fd_out);
+ auto gatekeeper_in = DupFdFlag(FLAGS_gatekeeper_fd_in);
+ auto gatekeeper_out = DupFdFlag(FLAGS_gatekeeper_fd_out);
+ auto kernel_events_fd = DupFdFlag(FLAGS_kernel_events_fd);
- CHECK(FLAGS_keymaster_fd_out != -1);
- auto keymaster_out = cuttlefish::SharedFD::Dup(FLAGS_keymaster_fd_out);
- CHECK(keymaster_out->IsOpen()) << "Could not dup output fd: "
- << keymaster_out->StrError();
- close(FLAGS_keymaster_fd_out);
+ std::vector<std::thread> threads;
- CHECK(FLAGS_gatekeeper_fd_in != -1);
- auto gatekeeper_in = cuttlefish::SharedFD::Dup(FLAGS_gatekeeper_fd_in);
- CHECK(gatekeeper_in->IsOpen()) << "Could not dup input fd: "
- << gatekeeper_in->StrError();
- close(FLAGS_gatekeeper_fd_in);
-
- CHECK(FLAGS_gatekeeper_fd_out != -1);
- auto gatekeeper_out = cuttlefish::SharedFD::Dup(FLAGS_gatekeeper_fd_out);
- CHECK(gatekeeper_out->IsOpen()) << "Could not dup output fd: "
- << keymaster_out->StrError();
- close(FLAGS_gatekeeper_fd_out);
-
- std::thread keymaster_thread([keymaster_in, keymaster_out, &keymaster]() {
+ threads.emplace_back([keymaster_in, keymaster_out, &keymaster]() {
while (true) {
- cuttlefish::KeymasterChannel keymaster_channel(
- keymaster_in, keymaster_out);
+ KeymasterChannel keymaster_channel(keymaster_in, keymaster_out);
KeymasterResponder keymaster_responder(keymaster_channel, keymaster);
@@ -165,10 +212,9 @@
}
});
- std::thread gatekeeper_thread([gatekeeper_in, gatekeeper_out, &gatekeeper]() {
+ threads.emplace_back([gatekeeper_in, gatekeeper_out, &gatekeeper]() {
while (true) {
- cuttlefish::GatekeeperChannel gatekeeper_channel(
- gatekeeper_in, gatekeeper_out);
+ GatekeeperChannel gatekeeper_channel(gatekeeper_in, gatekeeper_out);
GatekeeperResponder gatekeeper_responder(gatekeeper_channel, *gatekeeper);
@@ -177,6 +223,17 @@
}
});
- keymaster_thread.join();
- gatekeeper_thread.join();
+ threads.emplace_back(StartKernelEventMonitor(kernel_events_fd));
+
+ for (auto& t : threads) {
+ t.join();
+ }
+
+ return 0;
+}
+
+} // namespace cuttlefish
+
+int main(int argc, char** argv) {
+ return cuttlefish::SecureEnvMain(argc, argv);
}
diff --git a/host/commands/secure_env/test_tpm.cpp b/host/commands/secure_env/test_tpm.cpp
new file mode 100644
index 0000000..14e43be
--- /dev/null
+++ b/host/commands/secure_env/test_tpm.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/commands/secure_env/test_tpm.h"
+
+#include <android-base/logging.h>
+#include <tss2/tss2_rc.h>
+
+namespace cuttlefish {
+
+TestTpm::TestTpm() {
+ auto rc = Esys_Initialize(&esys_, tpm_.TctiContext(), nullptr);
+ if (rc != TPM2_RC_SUCCESS) {
+ LOG(FATAL) << "Could not initialize esys: " << Tss2_RC_Decode(rc) << " ("
+ << rc << ")";
+ }
+}
+
+TestTpm::~TestTpm() { Esys_Finalize(&esys_); }
+
+ESYS_CONTEXT* TestTpm::Esys() { return esys_; }
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.cpp b/host/commands/secure_env/test_tpm.h
similarity index 69%
copy from common/libs/utils/size_utils.cpp
copy to host/commands/secure_env/test_tpm.h
index 9f25445..fb39680 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/commands/secure_env/test_tpm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,22 @@
* limitations under the License.
*/
-#include "common/libs/utils/size_utils.h"
+#include <tss2/tss2_esys.h>
-#include <unistd.h>
+#include "host/commands/secure_env/in_process_tpm.h"
namespace cuttlefish {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+class TestTpm {
+ public:
+ TestTpm();
+ ~TestTpm();
+
+ ESYS_CONTEXT* Esys();
+
+ private:
+ InProcessTpm tpm_;
+ ESYS_CONTEXT* esys_;
+};
} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm.h b/host/commands/secure_env/tpm.h
index 201e5e7..3175ca7 100644
--- a/host/commands/secure_env/tpm.h
+++ b/host/commands/secure_env/tpm.h
@@ -17,9 +17,13 @@
#include <tss2/tss2_tcti.h>
+namespace cuttlefish {
+
class Tpm {
public:
virtual ~Tpm() = default;
virtual TSS2_TCTI_CONTEXT* TctiContext() = 0;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_attestation_record.cpp b/host/commands/secure_env/tpm_attestation_record.cpp
index 75a2920..70239c9 100644
--- a/host/commands/secure_env/tpm_attestation_record.cpp
+++ b/host/commands/secure_env/tpm_attestation_record.cpp
@@ -22,10 +22,29 @@
#include <android-base/logging.h>
+namespace cuttlefish {
+
+namespace {
+using VerifiedBootParams = keymaster::AttestationContext::VerifiedBootParams;
using keymaster::AuthorizationSet;
+VerifiedBootParams MakeVbParams() {
+ // Cuttlefish is hard-coded to verifiedbootstate=orange
+ // See device/google/cuttlefish/host/libs/config/bootconfig_args.cpp
+ VerifiedBootParams vb_params;
+ static uint8_t empty_vb_key[32] = {};
+ vb_params.verified_boot_key = {empty_vb_key, sizeof(empty_vb_key)};
+ vb_params.verified_boot_hash = {empty_vb_key, sizeof(empty_vb_key)};
+ vb_params.verified_boot_state = KM_VERIFIED_BOOT_UNVERIFIED;
+ vb_params.device_locked = false;
+ return vb_params;
+}
+
+} // namespace
+
TpmAttestationRecordContext::TpmAttestationRecordContext()
- : keymaster::AttestationContext(::keymaster::KmVersion::KEYMINT_1),
+ : keymaster::AttestationContext(::keymaster::KmVersion::KEYMINT_2),
+ vb_params_(MakeVbParams()),
unique_id_hbk_(16) {
RAND_bytes(unique_id_hbk_.data(), unique_id_hbk_.size());
}
@@ -35,15 +54,10 @@
}
keymaster_error_t TpmAttestationRecordContext::VerifyAndCopyDeviceIds(
- const AuthorizationSet& attestation_params,
- AuthorizationSet* attestation) const {
+ const AuthorizationSet& /*attestation_params*/,
+ AuthorizationSet* /*attestation*/) const {
LOG(DEBUG) << "TODO(schuffelen): Implement VerifyAndCopyDeviceIds";
- attestation->Difference(attestation_params);
- attestation->Union(attestation_params);
- if (int index = attestation->find(keymaster::TAG_ATTESTATION_APPLICATION_ID)) {
- attestation->erase(index);
- }
- return KM_ERROR_OK;
+ return KM_ERROR_UNIMPLEMENTED;
}
keymaster::Buffer TpmAttestationRecordContext::GenerateUniqueId(
@@ -54,28 +68,11 @@
application_id, reset_since_rotation);
}
-const keymaster::AttestationContext::VerifiedBootParams*
-TpmAttestationRecordContext::GetVerifiedBootParams(keymaster_error_t* error) const {
- LOG(DEBUG) << "TODO(schuffelen): Implement GetVerifiedBootParams";
- if (!vb_params_) {
- vb_params_.reset(new VerifiedBootParams{});
-
- // TODO(schuffelen): Get this data out of vbmeta
- static uint8_t fake_vb_key[32];
- static bool fake_vb_key_initialized = false;
- if (!fake_vb_key_initialized) {
- for (int i = 0; i < sizeof(fake_vb_key); i++) {
- fake_vb_key[i] = rand();
- }
- fake_vb_key_initialized = true;
- }
- vb_params_->verified_boot_key = {fake_vb_key, sizeof(fake_vb_key)};
- vb_params_->verified_boot_hash = {fake_vb_key, sizeof(fake_vb_key)};
- vb_params_->verified_boot_state = KM_VERIFIED_BOOT_VERIFIED;
- vb_params_->device_locked = true;
- }
+const VerifiedBootParams* TpmAttestationRecordContext::GetVerifiedBootParams(
+ keymaster_error_t* error) const {
+ static VerifiedBootParams vb_params = MakeVbParams();
*error = KM_ERROR_OK;
- return vb_params_.get();
+ return &vb_params;
}
keymaster::KeymasterKeyBlob
@@ -89,3 +86,5 @@
keymaster_error_t* error) const {
return keymaster::getAttestationChain(algorithm, error);
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_attestation_record.h b/host/commands/secure_env/tpm_attestation_record.h
index 1609351..2a2a4cd 100644
--- a/host/commands/secure_env/tpm_attestation_record.h
+++ b/host/commands/secure_env/tpm_attestation_record.h
@@ -20,6 +20,8 @@
#include <keymaster/attestation_context.h>
+namespace cuttlefish {
+
class TpmAttestationRecordContext : public keymaster::AttestationContext {
public:
TpmAttestationRecordContext();
@@ -37,8 +39,9 @@
keymaster_algorithm_t algorithm, keymaster_error_t* error) const override;
keymaster::CertificateChain GetAttestationChain(
keymaster_algorithm_t algorithm, keymaster_error_t* error) const override;
-
private:
- mutable std::unique_ptr<VerifiedBootParams> vb_params_;
- std::vector<uint8_t> unique_id_hbk_;
+ VerifiedBootParams vb_params_;
+ std::vector<uint8_t> unique_id_hbk_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_auth.cpp b/host/commands/secure_env/tpm_auth.cpp
index 10f4b2d..937dd5d 100644
--- a/host/commands/secure_env/tpm_auth.cpp
+++ b/host/commands/secure_env/tpm_auth.cpp
@@ -17,6 +17,8 @@
#include <tuple>
+namespace cuttlefish {
+
TpmAuth::TpmAuth(ESYS_TR auth): TpmAuth(auth, ESYS_TR_NONE, ESYS_TR_NONE) {}
TpmAuth::TpmAuth(ESYS_TR auth1, ESYS_TR auth2)
: TpmAuth(auth1, auth2, ESYS_TR_NONE) {}
@@ -41,3 +43,5 @@
ESYS_TR TpmAuth::auth3() const {
return auth3_;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_auth.h b/host/commands/secure_env/tpm_auth.h
index 196b5fd..dec75c4 100644
--- a/host/commands/secure_env/tpm_auth.h
+++ b/host/commands/secure_env/tpm_auth.h
@@ -17,6 +17,8 @@
#include <tss2/tss2_esys.h>
+namespace cuttlefish {
+
/**
* Authorization wrapper for TPM2 calls.
*
@@ -41,3 +43,5 @@
ESYS_TR auth2_;
ESYS_TR auth3_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_commands.cpp b/host/commands/secure_env/tpm_commands.cpp
index 78e9d7f..932202a 100644
--- a/host/commands/secure_env/tpm_commands.cpp
+++ b/host/commands/secure_env/tpm_commands.cpp
@@ -21,6 +21,8 @@
#include <cstddef>
#include <string>
+namespace cuttlefish {
+
std::string TpmCommandName(std::uint32_t command_num) {
switch(command_num) {
#define MATCH_TPM_COMMAND(name) case name: return #name;
@@ -145,3 +147,5 @@
return "Unknown";
}
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_commands.h b/host/commands/secure_env/tpm_commands.h
index ee75844..421aa51 100644
--- a/host/commands/secure_env/tpm_commands.h
+++ b/host/commands/secure_env/tpm_commands.h
@@ -19,4 +19,8 @@
#include <cstddef>
#include <string>
+namespace cuttlefish {
+
std::string TpmCommandName(std::uint32_t command_num);
+
+}
diff --git a/host/commands/secure_env/tpm_encrypt_decrypt.cpp b/host/commands/secure_env/tpm_encrypt_decrypt.cpp
index 4a1711e..c81d7d6 100644
--- a/host/commands/secure_env/tpm_encrypt_decrypt.cpp
+++ b/host/commands/secure_env/tpm_encrypt_decrypt.cpp
@@ -22,23 +22,23 @@
#include <android-base/logging.h>
#include <tss2/tss2_rc.h>
+namespace cuttlefish {
+
using keymaster::KeymasterBlob;
-static bool TpmEncryptDecrypt(
- ESYS_CONTEXT* esys,
- ESYS_TR key_handle,
- TpmAuth auth,
- uint8_t* data_in,
- uint8_t* data_out,
- size_t data_size,
- bool decrypt) {
+static bool TpmEncryptDecrypt( //
+ ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth, const TPM2B_IV& iv,
+ uint8_t* data_in, uint8_t* data_out, size_t data_size, bool decrypt) {
+ if (iv.size != sizeof(iv.buffer)) {
+ LOG(ERROR) << "Input IV had wrong size: " << iv.size;
+ return false;
+ }
// TODO(schuffelen): Pipeline this for performance. Will require reevaluating
// the initialization vector logic.
std::vector<unsigned char> converted(data_size);
// malloc for parity with Esys_EncryptDecrypt2
TPM2B_IV* init_vector_in = (TPM2B_IV*) malloc(sizeof(TPM2B_IV));
- *init_vector_in = {};
- init_vector_in->size = 16;
+ *init_vector_in = iv;
for (auto processed = 0; processed < data_size;) {
TPM2B_MAX_BUFFER in_data;
in_data.size =
@@ -77,24 +77,18 @@
return true;
}
-bool TpmEncrypt(
- ESYS_CONTEXT* esys,
- ESYS_TR key_handle,
- TpmAuth auth,
- uint8_t* data_in,
- uint8_t* data_out,
- size_t data_size) {
- return TpmEncryptDecrypt(
- esys, key_handle, auth, data_in, data_out, data_size, false);
+bool TpmEncrypt(ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth,
+ const TPM2B_IV& iv, uint8_t* data_in, uint8_t* data_out,
+ size_t data_size) {
+ return TpmEncryptDecrypt( //
+ esys, key_handle, auth, iv, data_in, data_out, data_size, false);
}
-bool TpmDecrypt(
- ESYS_CONTEXT* esys,
- ESYS_TR key_handle,
- TpmAuth auth,
- uint8_t* data_in,
- uint8_t* data_out,
- size_t data_size) {
- return TpmEncryptDecrypt(
- esys, key_handle, auth, data_in, data_out, data_size, true);
+bool TpmDecrypt(ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth,
+ const TPM2B_IV& iv, uint8_t* data_in, uint8_t* data_out,
+ size_t data_size) {
+ return TpmEncryptDecrypt( //
+ esys, key_handle, auth, iv, data_in, data_out, data_size, true);
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_encrypt_decrypt.h b/host/commands/secure_env/tpm_encrypt_decrypt.h
index b75bafb..a811cb7 100644
--- a/host/commands/secure_env/tpm_encrypt_decrypt.h
+++ b/host/commands/secure_env/tpm_encrypt_decrypt.h
@@ -20,20 +20,20 @@
#include "host/commands/secure_env/tpm_auth.h"
+namespace cuttlefish {
+
/**
* Encrypt `data_in` to `data_out`, which are both buffers of size `data_size`.
*
* There are no integrity guarantees on this data: if the encrypted data is
* corrupted, decrypting it could either fail or produce corrupted output.
+ *
+ * `iv` should be generated randomly, and can be stored unencrypted next to
+ * the plaintext.
*/
-bool TpmEncrypt(
- ESYS_CONTEXT* esys,
- ESYS_TR key_handle,
- TpmAuth auth,
- uint8_t* data_in,
- uint8_t* data_out,
- size_t data_size);
-
+bool TpmEncrypt(ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth,
+ const TPM2B_IV& iv, uint8_t* data_in, uint8_t* data_out,
+ size_t data_size);
/**
* Decrypt `data_in` to `data_out`, which are both buffers of size `data_size`.
@@ -41,10 +41,8 @@
* There are no integrity guarantees on this data: if the encrypted data is
* corrupted, decrypting it could either fail or produce corrupted output.
*/
-bool TpmDecrypt(
- ESYS_CONTEXT* esys,
- ESYS_TR key_handle,
- TpmAuth auth,
- uint8_t* data_in,
- uint8_t* data_out,
- size_t data_size);
+bool TpmDecrypt(ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth,
+ const TPM2B_IV& iv, uint8_t* data_in, uint8_t* data_out,
+ size_t data_size);
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_gatekeeper.cpp b/host/commands/secure_env/tpm_gatekeeper.cpp
index e4f61e7..c8497d5 100644
--- a/host/commands/secure_env/tpm_gatekeeper.cpp
+++ b/host/commands/secure_env/tpm_gatekeeper.cpp
@@ -29,6 +29,8 @@
#include "host/commands/secure_env/tpm_hmac.h"
#include "host/commands/secure_env/tpm_random_source.h"
+namespace cuttlefish {
+
TpmGatekeeper::TpmGatekeeper(
TpmResourceManager& resource_manager,
GatekeeperStorage& secure_storage,
@@ -240,3 +242,4 @@
return true;
}
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_gatekeeper.h b/host/commands/secure_env/tpm_gatekeeper.h
index 021ab58..1c35bdc 100644
--- a/host/commands/secure_env/tpm_gatekeeper.h
+++ b/host/commands/secure_env/tpm_gatekeeper.h
@@ -21,6 +21,8 @@
#include "host/commands/secure_env/gatekeeper_storage.h"
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* See method descriptions for this class in
* system/gatekeeper/include/gatekeeper/gatekeeper.h
@@ -81,3 +83,5 @@
GatekeeperStorage& secure_storage_;
GatekeeperStorage& insecure_storage_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_hmac.cpp b/host/commands/secure_env/tpm_hmac.cpp
index 80003d0..b566659 100644
--- a/host/commands/secure_env/tpm_hmac.cpp
+++ b/host/commands/secure_env/tpm_hmac.cpp
@@ -20,6 +20,8 @@
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/* For data large enough to fit in a single TPM2_HMAC call. */
static UniqueEsysPtr<TPM2B_DIGEST> OneshotHmac(
TpmResourceManager& resource_manager,
@@ -153,3 +155,5 @@
auto fn = data_size > TPM2_MAX_DIGEST_BUFFER ? SegmentedHmac : OneshotHmac;
return fn(resource_manager, key_handle, auth, data, data_size);
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_hmac.h b/host/commands/secure_env/tpm_hmac.h
index e4686b6..09aa011 100644
--- a/host/commands/secure_env/tpm_hmac.h
+++ b/host/commands/secure_env/tpm_hmac.h
@@ -21,6 +21,8 @@
#include "host/commands/secure_env/tpm_auth.h"
+namespace cuttlefish {
+
class TpmResourceManager;
struct EsysDeleter {
@@ -49,3 +51,5 @@
TpmAuth auth,
const uint8_t* data,
size_t data_size);
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_key_blob_maker.cpp b/host/commands/secure_env/tpm_key_blob_maker.cpp
index 64f344a..38236d8 100644
--- a/host/commands/secure_env/tpm_key_blob_maker.cpp
+++ b/host/commands/secure_env/tpm_key_blob_maker.cpp
@@ -26,6 +26,8 @@
#include "host/commands/secure_env/hmac_serializable.h"
#include "host/commands/secure_env/primary_key_builder.h"
+namespace cuttlefish {
+
using keymaster::AuthorizationSet;
using keymaster::KeymasterKeyBlob;
using keymaster::Serializable;
@@ -41,9 +43,76 @@
static keymaster_error_t SplitEnforcedProperties(
const keymaster::AuthorizationSet& key_description,
keymaster::AuthorizationSet* hw_enforced,
- keymaster::AuthorizationSet* sw_enforced) {
+ keymaster::AuthorizationSet* sw_enforced,
+ keymaster::AuthorizationSet* hidden) {
for (auto& entry : key_description) {
switch (entry.tag) {
+ // These cannot be specified by the client.
+ case KM_TAG_BOOT_PATCHLEVEL:
+ case KM_TAG_ORIGIN:
+ case KM_TAG_OS_PATCHLEVEL:
+ case KM_TAG_OS_VERSION:
+ case KM_TAG_ROOT_OF_TRUST:
+ case KM_TAG_VENDOR_PATCHLEVEL:
+ LOG(DEBUG) << "Root of trust and origin tags may not be specified";
+ return KM_ERROR_INVALID_TAG;
+
+ // These are hidden
+ case KM_TAG_APPLICATION_DATA:
+ case KM_TAG_APPLICATION_ID:
+ hidden->push_back(entry);
+ break;
+
+ // These should not be in key descriptions because they're for operation
+ // parameters.
+ case KM_TAG_ASSOCIATED_DATA:
+ case KM_TAG_AUTH_TOKEN:
+ case KM_TAG_CONFIRMATION_TOKEN:
+ case KM_TAG_INVALID:
+ case KM_TAG_MAC_LENGTH:
+ case KM_TAG_NONCE:
+ LOG(DEBUG) << "Tag " << entry.tag
+ << " not allowed in key generation/import";
+ break;
+
+ // These are provided to support attestation key generation, but should
+ // not be included in the key characteristics.
+ case KM_TAG_ATTESTATION_APPLICATION_ID:
+ case KM_TAG_ATTESTATION_CHALLENGE:
+ case KM_TAG_ATTESTATION_ID_BRAND:
+ case KM_TAG_ATTESTATION_ID_DEVICE:
+ case KM_TAG_ATTESTATION_ID_IMEI:
+ case KM_TAG_ATTESTATION_ID_MANUFACTURER:
+ case KM_TAG_ATTESTATION_ID_MEID:
+ case KM_TAG_ATTESTATION_ID_MODEL:
+ case KM_TAG_ATTESTATION_ID_PRODUCT:
+ case KM_TAG_ATTESTATION_ID_SERIAL:
+ case KM_TAG_CERTIFICATE_SERIAL:
+ case KM_TAG_CERTIFICATE_SUBJECT:
+ case KM_TAG_CERTIFICATE_NOT_BEFORE:
+ case KM_TAG_CERTIFICATE_NOT_AFTER:
+ case KM_TAG_RESET_SINCE_ID_ROTATION:
+ break;
+
+ // strongbox-only tags
+ case KM_TAG_DEVICE_UNIQUE_ATTESTATION:
+ LOG(DEBUG) << "Strongbox-only tag: " << entry.tag;
+ return KM_ERROR_UNSUPPORTED_TAG;
+
+ case KM_TAG_ROLLBACK_RESISTANT:
+ return KM_ERROR_UNSUPPORTED_TAG;
+
+ case KM_TAG_ROLLBACK_RESISTANCE:
+ LOG(DEBUG) << "Rollback resistance is not implemented.";
+ return KM_ERROR_ROLLBACK_RESISTANCE_UNAVAILABLE;
+
+ // These are nominally HW tags, but we don't actually support HW key
+ // attestation yet.
+ case KM_TAG_ALLOW_WHILE_ON_BODY:
+ case KM_TAG_EXPORTABLE:
+ case KM_TAG_IDENTITY_CREDENTIAL_KEY:
+ case KM_TAG_STORAGE_KEY:
+
case KM_TAG_PURPOSE:
case KM_TAG_ALGORITHM:
case KM_TAG_KEY_SIZE:
@@ -63,17 +132,32 @@
case KM_TAG_EC_CURVE:
case KM_TAG_ECIES_SINGLE_HASH_MODE:
case KM_TAG_USER_AUTH_TYPE:
- case KM_TAG_ORIGIN:
- case KM_TAG_OS_VERSION:
- case KM_TAG_OS_PATCHLEVEL:
case KM_TAG_EARLY_BOOT_ONLY:
case KM_TAG_UNLOCKED_DEVICE_REQUIRED:
hw_enforced->push_back(entry);
break;
- default:
+
+ // The remaining tags are all software.
+ case KM_TAG_ACTIVE_DATETIME:
+ case KM_TAG_ALL_APPLICATIONS:
+ case KM_TAG_ALL_USERS:
+ case KM_TAG_BOOTLOADER_ONLY:
+ case KM_TAG_CREATION_DATETIME:
+ case KM_TAG_INCLUDE_UNIQUE_ID:
+ case KM_TAG_MAX_BOOT_LEVEL:
+ case KM_TAG_ORIGINATION_EXPIRE_DATETIME:
+ case KM_TAG_RSA_OAEP_MGF_DIGEST:
+ case KM_TAG_TRUSTED_CONFIRMATION_REQUIRED:
+ case KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED:
+ case KM_TAG_UNIQUE_ID:
+ case KM_TAG_USAGE_COUNT_LIMIT:
+ case KM_TAG_USAGE_EXPIRE_DATETIME:
+ case KM_TAG_USER_ID:
sw_enforced->push_back(entry);
+ break;
}
}
+
return KM_ERROR_OK;
}
@@ -102,20 +186,9 @@
KeymasterKeyBlob* blob,
AuthorizationSet* hw_enforced,
AuthorizationSet* sw_enforced) const {
- std::set<keymaster_tag_t> protected_tags = {
- KM_TAG_ROOT_OF_TRUST,
- KM_TAG_ORIGIN,
- KM_TAG_OS_VERSION,
- KM_TAG_OS_PATCHLEVEL,
- };
- for (auto tag : protected_tags) {
- if (key_description.Contains(tag)) {
- LOG(ERROR) << "Invalid tag " << tag;
- return KM_ERROR_INVALID_TAG;
- }
- }
- auto rc =
- SplitEnforcedProperties(key_description, hw_enforced, sw_enforced);
+ AuthorizationSet hidden;
+ auto rc = SplitEnforcedProperties(key_description, hw_enforced, sw_enforced,
+ &hidden);
if (rc != KM_ERROR_OK) {
return rc;
}
@@ -125,13 +198,22 @@
hw_enforced->push_back(keymaster::TAG_OS_VERSION, os_version_);
hw_enforced->push_back(keymaster::TAG_OS_PATCHLEVEL, os_patchlevel_);
+ if (vendor_patchlevel_) {
+ hw_enforced->push_back(keymaster::TAG_VENDOR_PATCHLEVEL,
+ *vendor_patchlevel_);
+ }
+ if (boot_patchlevel_) {
+ hw_enforced->push_back(keymaster::TAG_BOOT_PATCHLEVEL, *boot_patchlevel_);
+ }
+
return UnvalidatedCreateKeyBlob(key_material, *hw_enforced, *sw_enforced,
- blob);
+ hidden, blob);
}
keymaster_error_t TpmKeyBlobMaker::UnvalidatedCreateKeyBlob(
const KeymasterKeyBlob& key_material, const AuthorizationSet& hw_enforced,
- const AuthorizationSet& sw_enforced, KeymasterKeyBlob* blob) const {
+ const AuthorizationSet& sw_enforced, const AuthorizationSet& hidden,
+ KeymasterKeyBlob* blob) const {
keymaster::Buffer key_material_buffer(
key_material.key_material, key_material.key_material_size);
AuthorizationSet hw_enforced_mutable = hw_enforced;
@@ -142,8 +224,12 @@
EncryptedSerializable encryption(
resource_manager_, parent_key_fn, sensitive_material);
auto signing_key_fn = SigningKeyCreator(kUniqueKey);
- HmacSerializable sign_check(
- resource_manager_, signing_key_fn, TPM2_SHA256_DIGEST_SIZE, &encryption);
+ // TODO(b/154956668) The "hidden" tags should also be mixed into the TPM ACL
+ // so that the TPM requires them to be presented to unwrap the key. This is
+ // necessary to meet the requirement that full breach of KeyMint means an
+ // attacker cannot unwrap keys w/o the application id/data.
+ HmacSerializable sign_check(resource_manager_, signing_key_fn,
+ TPM2_SHA256_DIGEST_SIZE, &encryption, &hidden);
auto generated_blob = SerializableToKeyBlob(sign_check);
LOG(VERBOSE) << "Keymaster key size: " << generated_blob.key_material_size;
if (generated_blob.key_material_size != 0) {
@@ -155,9 +241,8 @@
}
keymaster_error_t TpmKeyBlobMaker::UnwrapKeyBlob(
- const keymaster_key_blob_t& blob,
- AuthorizationSet* hw_enforced,
- AuthorizationSet* sw_enforced,
+ const keymaster_key_blob_t& blob, AuthorizationSet* hw_enforced,
+ AuthorizationSet* sw_enforced, const AuthorizationSet& hidden,
KeymasterKeyBlob* key_material) const {
keymaster::Buffer key_material_buffer(blob.key_material_size);
CompositeSerializable sensitive_material(
@@ -166,17 +251,17 @@
EncryptedSerializable encryption(
resource_manager_, parent_key_fn, sensitive_material);
auto signing_key_fn = SigningKeyCreator(kUniqueKey);
- HmacSerializable sign_check(
- resource_manager_, signing_key_fn, TPM2_SHA256_DIGEST_SIZE, &encryption);
+ HmacSerializable sign_check(resource_manager_, signing_key_fn,
+ TPM2_SHA256_DIGEST_SIZE, &encryption, &hidden);
auto buf = blob.key_material;
auto buf_end = buf + blob.key_material_size;
if (!sign_check.Deserialize(&buf, buf_end)) {
LOG(ERROR) << "Failed to deserialize key.";
- return KM_ERROR_UNKNOWN_ERROR;
+ return KM_ERROR_INVALID_KEY_BLOB;
}
if (key_material_buffer.available_read() == 0) {
LOG(ERROR) << "Key material was corrupted and the size was too large";
- return KM_ERROR_UNKNOWN_ERROR;
+ return KM_ERROR_INVALID_KEY_BLOB;
}
*key_material = KeymasterKeyBlob(
key_material_buffer.peek_read(), key_material_buffer.available_read());
@@ -185,8 +270,22 @@
keymaster_error_t TpmKeyBlobMaker::SetSystemVersion(
uint32_t os_version, uint32_t os_patchlevel) {
- // TODO(b/155697375): Only accept new values of these from the bootloader
+ // TODO(b/201561154): Only accept new values of these from the bootloader
os_version_ = os_version;
os_patchlevel_ = os_patchlevel;
return KM_ERROR_OK;
}
+
+keymaster_error_t TpmKeyBlobMaker::SetVendorPatchlevel(uint32_t patchlevel) {
+ // TODO(b/201561154): Only accept new values of these from the bootloader
+ vendor_patchlevel_ = patchlevel;
+ return KM_ERROR_OK;
+}
+
+keymaster_error_t TpmKeyBlobMaker::SetBootPatchlevel(uint32_t boot_patchlevel) {
+ // TODO(b/201561154): Only accept new values of these from the bootloader
+ boot_patchlevel_ = boot_patchlevel;
+ return KM_ERROR_OK;
+}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_key_blob_maker.h b/host/commands/secure_env/tpm_key_blob_maker.h
index a0483b4..b76d1dc 100644
--- a/host/commands/secure_env/tpm_key_blob_maker.h
+++ b/host/commands/secure_env/tpm_key_blob_maker.h
@@ -15,10 +15,14 @@
#pragma once
+#include <optional>
+//
#include <keymaster/soft_key_factory.h>
-
+//
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* Encrypts key data using a TPM-resident key and signs it with a TPM-resident
* key for privacy and integrity.
@@ -43,6 +47,7 @@
const keymaster::KeymasterKeyBlob& key_material,
const keymaster::AuthorizationSet& hw_enforced,
const keymaster::AuthorizationSet& sw_enforced,
+ const keymaster::AuthorizationSet& hidden,
keymaster::KeymasterKeyBlob* blob) const;
/**
@@ -60,11 +65,19 @@
const keymaster_key_blob_t& blob,
keymaster::AuthorizationSet* hw_enforced,
keymaster::AuthorizationSet* sw_enforced,
+ const keymaster::AuthorizationSet& hidden,
keymaster::KeymasterKeyBlob* key_material) const;
keymaster_error_t SetSystemVersion(uint32_t os_version, uint32_t os_patchlevel);
-private:
+ keymaster_error_t SetVendorPatchlevel(uint32_t vendor_patchlevel);
+ keymaster_error_t SetBootPatchlevel(uint32_t boot_patchlevel);
+
+ private:
TpmResourceManager& resource_manager_;
uint32_t os_version_;
uint32_t os_patchlevel_;
+ std::optional<uint32_t> vendor_patchlevel_;
+ std::optional<uint32_t> boot_patchlevel_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_keymaster_context.cpp b/host/commands/secure_env/tpm_keymaster_context.cpp
index 850d48b..6171d8c 100644
--- a/host/commands/secure_env/tpm_keymaster_context.cpp
+++ b/host/commands/secure_env/tpm_keymaster_context.cpp
@@ -28,22 +28,45 @@
#include <keymaster/km_openssl/triple_des_key.h>
#include "host/commands/secure_env/tpm_attestation_record.h"
-#include "host/commands/secure_env/tpm_random_source.h"
#include "host/commands/secure_env/tpm_key_blob_maker.h"
+#include "host/commands/secure_env/tpm_random_source.h"
+#include "host/commands/secure_env/tpm_remote_provisioning_context.h"
+namespace cuttlefish {
+
+namespace {
using keymaster::AuthorizationSet;
using keymaster::KeymasterKeyBlob;
using keymaster::KeyFactory;
using keymaster::OperationFactory;
+keymaster::AuthorizationSet GetHiddenTags(
+ const AuthorizationSet& authorizations) {
+ keymaster::AuthorizationSet output;
+ keymaster_blob_t entry;
+ if (authorizations.GetTagValue(keymaster::TAG_APPLICATION_ID, &entry)) {
+ output.push_back(keymaster::TAG_APPLICATION_ID, entry.data,
+ entry.data_length);
+ }
+ if (authorizations.GetTagValue(keymaster::TAG_APPLICATION_DATA, &entry)) {
+ output.push_back(keymaster::TAG_APPLICATION_DATA, entry.data,
+ entry.data_length);
+ }
+ return output;
+}
+
+} // namespace
+
TpmKeymasterContext::TpmKeymasterContext(
TpmResourceManager& resource_manager,
keymaster::KeymasterEnforcement& enforcement)
- : resource_manager_(resource_manager)
- , enforcement_(enforcement)
- , key_blob_maker_(new TpmKeyBlobMaker(resource_manager_))
- , random_source_(new TpmRandomSource(resource_manager_.Esys()))
- , attestation_context_(new TpmAttestationRecordContext()) {
+ : resource_manager_(resource_manager),
+ enforcement_(enforcement),
+ key_blob_maker_(new TpmKeyBlobMaker(resource_manager_)),
+ random_source_(new TpmRandomSource(resource_manager_.Esys())),
+ attestation_context_(new TpmAttestationRecordContext()),
+ remote_provisioning_context_(
+ new TpmRemoteProvisioningContext(resource_manager_)) {
key_factories_.emplace(
KM_ALGORITHM_RSA, new keymaster::RsaKeyFactory(*key_blob_maker_, *this));
key_factories_.emplace(
@@ -187,7 +210,7 @@
return key_blob_maker_->UnvalidatedCreateKeyBlob(
key->key_material(), key->hw_enforced(), key->sw_enforced(),
- upgraded_key);
+ GetHiddenTags(upgrade_params), upgraded_key);
}
keymaster_error_t TpmKeymasterContext::ParseKeyBlob(
@@ -198,12 +221,10 @@
keymaster::AuthorizationSet sw_enforced;
keymaster::KeymasterKeyBlob key_material;
- auto rc =
- key_blob_maker_->UnwrapKeyBlob(
- blob,
- &hw_enforced,
- &sw_enforced,
- &key_material);
+ keymaster::AuthorizationSet hidden = GetHiddenTags(additional_params);
+
+ auto rc = key_blob_maker_->UnwrapKeyBlob(blob, &hw_enforced, &sw_enforced,
+ hidden, &key_material);
if (rc != KM_ERROR_OK) {
LOG(ERROR) << "Failed to unwrap key: " << rc;
return rc;
@@ -247,18 +268,20 @@
keymaster::CertificateChain TpmKeymasterContext::GenerateAttestation(
const keymaster::Key& key, const keymaster::AuthorizationSet& attest_params,
- keymaster::UniquePtr<keymaster::Key> /* attest_key */,
- const keymaster::KeymasterBlob& /* issuer_subject */,
+ keymaster::UniquePtr<keymaster::Key> attest_key,
+ const keymaster::KeymasterBlob& issuer_subject,
keymaster_error_t* error) const {
LOG(INFO) << "TODO(b/155697200): Link attestation back to the TPM";
keymaster_algorithm_t key_algorithm;
if (!key.authorizations().GetTagValue(keymaster::TAG_ALGORITHM,
&key_algorithm)) {
+ LOG(ERROR) << "Cannot find key algorithm (TAG_ALGORITHM)";
*error = KM_ERROR_UNKNOWN_ERROR;
return {};
}
if ((key_algorithm != KM_ALGORITHM_RSA && key_algorithm != KM_ALGORITHM_EC)) {
+ LOG(ERROR) << "Invalid algorithm: " << key_algorithm;
*error = KM_ERROR_INCOMPATIBLE_ALGORITHM;
return {};
}
@@ -277,12 +300,20 @@
// hardware/interfaces/keymaster/4.1/vts/functional/DeviceUniqueAttestationTest.cpp:203
// at commit 36dcf1a404a9cf07ca5a2a6ad92371507194fe1b .
if (attest_params.find(keymaster::TAG_DEVICE_UNIQUE_ATTESTATION) != -1) {
+ LOG(ERROR) << "TAG_DEVICE_UNIQUE_ATTESTATION not supported";
*error = KM_ERROR_UNIMPLEMENTED;
return {};
}
+ keymaster::AttestKeyInfo attest_key_info(attest_key, &issuer_subject, error);
+ if (*error != KM_ERROR_OK) {
+ LOG(ERROR)
+ << "Error creating attestation key info from given key and subject";
+ return {};
+ }
+
return keymaster::generate_attestation(asymmetric_key, attest_params,
- {} /* attest_key */,
+ std::move(attest_key_info),
*attestation_context_, error);
}
@@ -319,3 +350,40 @@
LOG(ERROR) << "TODO(b/155697375): Implement UnwrapKey";
return KM_ERROR_UNIMPLEMENTED;
}
+
+keymaster::RemoteProvisioningContext*
+TpmKeymasterContext::GetRemoteProvisioningContext() const {
+ return remote_provisioning_context_.get();
+}
+
+keymaster_error_t TpmKeymasterContext::SetVendorPatchlevel(
+ uint32_t vendor_patchlevel) {
+ if (vendor_patchlevel_.has_value() &&
+ vendor_patchlevel != vendor_patchlevel_.value()) {
+ // Can't set patchlevel to a different value.
+ return KM_ERROR_INVALID_ARGUMENT;
+ }
+ vendor_patchlevel_ = vendor_patchlevel;
+ return key_blob_maker_->SetVendorPatchlevel(*vendor_patchlevel_);
+}
+
+keymaster_error_t TpmKeymasterContext::SetBootPatchlevel(
+ uint32_t boot_patchlevel) {
+ if (boot_patchlevel_.has_value() &&
+ boot_patchlevel != boot_patchlevel_.value()) {
+ // Can't set patchlevel to a different value.
+ return KM_ERROR_INVALID_ARGUMENT;
+ }
+ boot_patchlevel_ = boot_patchlevel;
+ return key_blob_maker_->SetBootPatchlevel(*boot_patchlevel_);
+}
+
+std::optional<uint32_t> TpmKeymasterContext::GetVendorPatchlevel() const {
+ return vendor_patchlevel_;
+}
+
+std::optional<uint32_t> TpmKeymasterContext::GetBootPatchlevel() const {
+ return boot_patchlevel_;
+}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_keymaster_context.h b/host/commands/secure_env/tpm_keymaster_context.h
index 54ba973..2e23f3b 100644
--- a/host/commands/secure_env/tpm_keymaster_context.h
+++ b/host/commands/secure_env/tpm_keymaster_context.h
@@ -23,10 +23,13 @@
#include "tpm_attestation_record.h"
+namespace cuttlefish {
+
class TpmAttestationRecordContext;
class TpmResourceManager;
class TpmKeyBlobMaker;
class TpmRandomSource;
+class TpmRemoteProvisioningContext;
/**
* Implementation of KeymasterContext that wraps its keys with a TPM.
@@ -41,11 +44,15 @@
std::unique_ptr<TpmKeyBlobMaker> key_blob_maker_;
std::unique_ptr<TpmRandomSource> random_source_;
std::unique_ptr<TpmAttestationRecordContext> attestation_context_;
+ std::unique_ptr<TpmRemoteProvisioningContext> remote_provisioning_context_;
std::map<keymaster_algorithm_t, std::unique_ptr<keymaster::KeyFactory>> key_factories_;
std::vector<keymaster_algorithm_t> supported_algorithms_;
uint32_t os_version_;
uint32_t os_patchlevel_;
-public:
+ std::optional<uint32_t> vendor_patchlevel_;
+ std::optional<uint32_t> boot_patchlevel_;
+
+ public:
TpmKeymasterContext(TpmResourceManager&, keymaster::KeymasterEnforcement&);
~TpmKeymasterContext() = default;
@@ -102,4 +109,14 @@
keymaster::AuthorizationSet* wrapped_key_params,
keymaster_key_format_t* wrapped_key_format,
keymaster::KeymasterKeyBlob* wrapped_key_material) const override;
+
+ keymaster::RemoteProvisioningContext* GetRemoteProvisioningContext()
+ const override;
+
+ keymaster_error_t SetVendorPatchlevel(uint32_t vendor_patchlevel) override;
+ keymaster_error_t SetBootPatchlevel(uint32_t boot_patchlevel) override;
+ std::optional<uint32_t> GetVendorPatchlevel() const override;
+ std::optional<uint32_t> GetBootPatchlevel() const override;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_keymaster_enforcement.cpp b/host/commands/secure_env/tpm_keymaster_enforcement.cpp
index f5b8903..60a9a5a 100644
--- a/host/commands/secure_env/tpm_keymaster_enforcement.cpp
+++ b/host/commands/secure_env/tpm_keymaster_enforcement.cpp
@@ -15,16 +15,16 @@
#include "host/commands/secure_env/tpm_keymaster_enforcement.h"
+#include <android-base/endian.h>
#include <android-base/logging.h>
-#if defined(__BIONIC__)
-#include <sys/endian.h> // for be64toh
-#endif
#include "host/commands/secure_env/primary_key_builder.h"
#include "host/commands/secure_env/tpm_hmac.h"
#include "host/commands/secure_env/tpm_key_blob_maker.h"
#include "host/commands/secure_env/tpm_random_source.h"
+namespace cuttlefish {
+
using keymaster::km_id_t;
using keymaster::HmacSharingParameters;
using keymaster::HmacSharingParametersArray;
@@ -99,7 +99,7 @@
bool TpmKeymasterEnforcement::expiration_date_passed(
uint64_t expiration_date) const {
- return expiration_date > get_wall_clock_time_ms();
+ return expiration_date < get_wall_clock_time_ms();
}
bool TpmKeymasterEnforcement::auth_token_timed_out(
@@ -294,18 +294,38 @@
return response;
}
+keymaster_error_t TpmKeymasterEnforcement::GenerateTimestampToken(
+ keymaster::TimestampToken* token) {
+ token->timestamp = get_current_time_ms();
+ token->security_level = SecurityLevel();
+ token->mac = KeymasterBlob();
+
+ auto signing_key_builder = PrimaryKeyBuilder();
+ signing_key_builder.SigningKey();
+ signing_key_builder.UniqueData("timestamp_token");
+ auto signing_key = signing_key_builder.CreateKey(resource_manager_);
+ if (!signing_key) {
+ LOG(ERROR) << "Could not make signing key for verifying authorization";
+ return KM_ERROR_UNKNOWN_ERROR;
+ }
+ std::vector<uint8_t> token_buf_to_sign(token->SerializedSize(), 0);
+ auto hmac =
+ TpmHmac(resource_manager_, signing_key->get(), TpmAuth(ESYS_TR_PASSWORD),
+ token_buf_to_sign.data(), token_buf_to_sign.size());
+ if (!hmac) {
+ LOG(ERROR) << "Could not calculate timestamp token hmac";
+ return KM_ERROR_UNKNOWN_ERROR;
+ } else if (hmac->size == 0) {
+ LOG(ERROR) << "hmac was too short";
+ return KM_ERROR_UNKNOWN_ERROR;
+ }
+ token->mac = KeymasterBlob(hmac->buffer, hmac->size);
+
+ return KM_ERROR_OK;
+}
+
bool TpmKeymasterEnforcement::CreateKeyId(
const keymaster_key_blob_t& key_blob, km_id_t* keyid) const {
- keymaster::AuthorizationSet hw_enforced;
- keymaster::AuthorizationSet sw_enforced;
- keymaster::KeymasterKeyBlob key_material;
- auto rc =
- TpmKeyBlobMaker(resource_manager_)
- .UnwrapKeyBlob(key_blob, &hw_enforced, &sw_enforced, &key_material);
- if (rc != KM_ERROR_OK) {
- LOG(ERROR) << "Could not unwrap key: " << rc;
- return false;
- }
auto signing_key_builder = PrimaryKeyBuilder();
signing_key_builder.SigningKey();
signing_key_builder.UniqueData("key_id");
@@ -314,12 +334,9 @@
LOG(ERROR) << "Could not make signing key for key id";
return false;
}
- auto hmac = TpmHmac(
- resource_manager_,
- signing_key->get(),
- TpmAuth(ESYS_TR_PASSWORD),
- key_material.key_material,
- key_material.key_material_size);
+ auto hmac =
+ TpmHmac(resource_manager_, signing_key->get(), TpmAuth(ESYS_TR_PASSWORD),
+ key_blob.key_material, key_blob.key_material_size);
if (!hmac) {
LOG(ERROR) << "Failed to make a signature for a key id";
return false;
@@ -332,3 +349,5 @@
memcpy(keyid, hmac->buffer, sizeof(km_id_t));
return true;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_keymaster_enforcement.h b/host/commands/secure_env/tpm_keymaster_enforcement.h
index 1d6a1e5..8db5930 100644
--- a/host/commands/secure_env/tpm_keymaster_enforcement.h
+++ b/host/commands/secure_env/tpm_keymaster_enforcement.h
@@ -20,6 +20,8 @@
#include "host/commands/secure_env/tpm_gatekeeper.h"
#include "host/commands/secure_env/tpm_resource_manager.h"
+namespace cuttlefish {
+
/**
* Implementation of keymaster::KeymasterEnforcement that depends on having a
* TPM available. See the definitions in
@@ -49,6 +51,9 @@
keymaster::VerifyAuthorizationResponse VerifyAuthorization(
const keymaster::VerifyAuthorizationRequest& request) override;
+ keymaster_error_t GenerateTimestampToken(
+ keymaster::TimestampToken* token) override;
+
bool CreateKeyId(
const keymaster_key_blob_t& key_blob,
keymaster::km_id_t* keyid) const override;
@@ -59,3 +64,5 @@
bool have_saved_params_ = false;
keymaster::HmacSharingParameters saved_params_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_random_source.cpp b/host/commands/secure_env/tpm_random_source.cpp
index 8695e4a..569edbc 100644
--- a/host/commands/secure_env/tpm_random_source.cpp
+++ b/host/commands/secure_env/tpm_random_source.cpp
@@ -19,6 +19,8 @@
#include "tss2/tss2_esys.h"
#include "tss2/tss2_rc.h"
+namespace cuttlefish {
+
TpmRandomSource::TpmRandomSource(ESYS_CONTEXT* esys) : esys_(esys) {
}
@@ -62,6 +64,11 @@
keymaster_error_t TpmRandomSource::AddRngEntropy(
const uint8_t* buffer, size_t size) const {
+ if (size > 2048) {
+ // IKeyMintDevice.aidl specifies that there's an upper limit of 2KiB.
+ return KM_ERROR_INVALID_INPUT_LENGTH;
+ }
+
TPM2B_SENSITIVE_DATA in_data;
while (size > MAX_STIR_RANDOM_BUFFER_SIZE) {
memcpy(in_data.buffer, buffer, MAX_STIR_RANDOM_BUFFER_SIZE);
@@ -97,3 +104,5 @@
}
return KM_ERROR_OK;
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_random_source.h b/host/commands/secure_env/tpm_random_source.h
index 2e7d8a1..c9a91c7 100644
--- a/host/commands/secure_env/tpm_random_source.h
+++ b/host/commands/secure_env/tpm_random_source.h
@@ -19,6 +19,8 @@
struct ESYS_CONTEXT;
+namespace cuttlefish {
+
/**
* Secure random number generator, pulling data from a TPM.
*
@@ -36,3 +38,5 @@
private:
ESYS_CONTEXT* esys_;
};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_remote_provisioning_context.cpp b/host/commands/secure_env/tpm_remote_provisioning_context.cpp
new file mode 100644
index 0000000..e88fc29
--- /dev/null
+++ b/host/commands/secure_env/tpm_remote_provisioning_context.cpp
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <algorithm>
+#include <cassert>
+#include <optional>
+
+#include <android-base/logging.h>
+#include <keymaster/cppcose/cppcose.h>
+#include <openssl/bn.h>
+#include <openssl/ec.h>
+#include <openssl/err.h>
+#include <openssl/hkdf.h>
+#include <openssl/rand.h>
+
+#include "host/commands/secure_env/primary_key_builder.h"
+#include "host/commands/secure_env/tpm_hmac.h"
+#include "tpm_remote_provisioning_context.h"
+#include "tpm_resource_manager.h"
+
+using namespace cppcose;
+
+namespace cuttlefish {
+
+TpmRemoteProvisioningContext::TpmRemoteProvisioningContext(
+ TpmResourceManager& resource_manager)
+ : resource_manager_(resource_manager) {
+ std::tie(devicePrivKey_, bcc_) = GenerateBcc(/*testMode=*/false);
+}
+
+std::vector<uint8_t> TpmRemoteProvisioningContext::DeriveBytesFromHbk(
+ const std::string& context, size_t num_bytes) const {
+ PrimaryKeyBuilder key_builder;
+ key_builder.SigningKey();
+ key_builder.UniqueData("HardwareBoundKey");
+ TpmObjectSlot key = key_builder.CreateKey(resource_manager_);
+
+ auto hbk =
+ TpmHmac(resource_manager_, key->get(), TpmAuth(ESYS_TR_PASSWORD),
+ reinterpret_cast<const uint8_t*>(context.data()), context.size());
+
+ std::vector<uint8_t> result(num_bytes);
+ if (!HKDF(result.data(), num_bytes, //
+ EVP_sha256(), //
+ hbk->buffer, hbk->size, //
+ nullptr /* salt */, 0 /* salt len */, //
+ reinterpret_cast<const uint8_t*>(context.data()), context.size())) {
+ // Should never fail. Even if it could the API has no way of reporting the
+ // error.
+ LOG(ERROR) << "Error calculating HMAC: " << ERR_peek_last_error();
+ }
+
+ return result;
+}
+
+std::unique_ptr<cppbor::Map> TpmRemoteProvisioningContext::CreateDeviceInfo()
+ const {
+ auto result = std::make_unique<cppbor::Map>();
+ result->add(cppbor::Tstr("brand"), cppbor::Tstr("Google"));
+ result->add(cppbor::Tstr("manufacturer"), cppbor::Tstr("Google"));
+ result->add(cppbor::Tstr("product"),
+ cppbor::Tstr("Cuttlefish Virtual Device"));
+ result->canonicalize();
+ return result;
+}
+
+std::pair<std::vector<uint8_t> /* privKey */, cppbor::Array /* BCC */>
+TpmRemoteProvisioningContext::GenerateBcc(bool testMode) const {
+ std::vector<uint8_t> privKey(ED25519_PRIVATE_KEY_LEN);
+ std::vector<uint8_t> pubKey(ED25519_PUBLIC_KEY_LEN);
+
+ std::vector<uint8_t> seed;
+ if (testMode) {
+ // Length is hard-coded in the BoringCrypto API without a constant
+ seed.resize(32);
+ RAND_bytes(seed.data(), seed.size());
+ } else {
+ // TODO: Switch to P256 signing keys that are TPM-bound.
+ seed = DeriveBytesFromHbk("BccKey", 32);
+ }
+ ED25519_keypair_from_seed(pubKey.data(), privKey.data(), seed.data());
+
+ auto coseKey = cppbor::Map()
+ .add(CoseKey::KEY_TYPE, OCTET_KEY_PAIR)
+ .add(CoseKey::ALGORITHM, EDDSA)
+ .add(CoseKey::CURVE, ED25519)
+ .add(CoseKey::KEY_OPS, VERIFY)
+ .add(CoseKey::PUBKEY_X, pubKey)
+ .canonicalize();
+ auto sign1Payload =
+ cppbor::Map()
+ .add(1 /* Issuer */, "Issuer")
+ .add(2 /* Subject */, "Subject")
+ .add(-4670552 /* Subject Pub Key */, coseKey.encode())
+ .add(-4670553 /* Key Usage (little-endian order) */,
+ std::vector<uint8_t>{0x20} /* keyCertSign = 1<<5 */)
+ .canonicalize()
+ .encode();
+ auto coseSign1 = constructCoseSign1(privKey, /* signing key */
+ cppbor::Map(), /* extra protected */
+ sign1Payload, {} /* AAD */);
+ assert(coseSign1);
+
+ return {privKey,
+ cppbor::Array().add(std::move(coseKey)).add(coseSign1.moveValue())};
+}
+
+ErrMsgOr<std::vector<uint8_t>>
+TpmRemoteProvisioningContext::BuildProtectedDataPayload(
+ bool isTestMode, //
+ const std::vector<uint8_t>& macKey, //
+ const std::vector<uint8_t>& aad) const {
+ std::vector<uint8_t> devicePrivKey;
+ cppbor::Array bcc;
+ if (isTestMode) {
+ std::tie(devicePrivKey, bcc) = GenerateBcc(/*testMode=*/true);
+ } else {
+ devicePrivKey = devicePrivKey_;
+ auto clone = bcc_.clone();
+ if (!clone->asArray()) {
+ return "The BCC is not an array";
+ }
+ bcc = std::move(*clone->asArray());
+ }
+ auto sign1 = constructCoseSign1(devicePrivKey, macKey, aad);
+ if (!sign1) {
+ return sign1.moveMessage();
+ }
+ return cppbor::Array().add(sign1.moveValue()).add(std::move(bcc)).encode();
+}
+
+std::optional<cppcose::HmacSha256>
+TpmRemoteProvisioningContext::GenerateHmacSha256(
+ const cppcose::bytevec& input) const {
+ auto signing_key_builder = PrimaryKeyBuilder();
+ signing_key_builder.SigningKey();
+ signing_key_builder.UniqueData("Public Key Authentication Key");
+ auto signing_key = signing_key_builder.CreateKey(resource_manager_);
+ if (!signing_key) {
+ LOG(ERROR) << "Could not make MAC key for authenticating the pubkey";
+ return std::nullopt;
+ }
+
+ auto tpm_digest =
+ TpmHmac(resource_manager_, signing_key->get(), TpmAuth(ESYS_TR_PASSWORD),
+ input.data(), input.size());
+
+ if (!tpm_digest) {
+ LOG(ERROR) << "Could not calculate hmac";
+ return std::nullopt;
+ }
+
+ cppcose::HmacSha256 hmac;
+ if (tpm_digest->size != hmac.size()) {
+ LOG(ERROR) << "TPM-generated digest was too short. Actual size: "
+ << tpm_digest->size << " expected " << hmac.size() << " bytes";
+ return std::nullopt;
+ }
+
+ std::copy(tpm_digest->buffer, tpm_digest->buffer + tpm_digest->size,
+ hmac.begin());
+ return hmac;
+}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_remote_provisioning_context.h b/host/commands/secure_env/tpm_remote_provisioning_context.h
new file mode 100644
index 0000000..eb09b00
--- /dev/null
+++ b/host/commands/secure_env/tpm_remote_provisioning_context.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <keymaster/remote_provisioning_context.h>
+
+#include "host/commands/secure_env/tpm_resource_manager.h"
+#include "keymaster/cppcose/cppcose.h"
+
+namespace cuttlefish {
+
+/**
+ * TPM-backed implementation of the provisioning context.
+ */
+class TpmRemoteProvisioningContext
+ : public keymaster::RemoteProvisioningContext {
+ public:
+ TpmRemoteProvisioningContext(TpmResourceManager& resource_manager);
+ ~TpmRemoteProvisioningContext() override = default;
+ std::vector<uint8_t> DeriveBytesFromHbk(const std::string& context,
+ size_t numBytes) const override;
+ std::unique_ptr<cppbor::Map> CreateDeviceInfo() const override;
+ cppcose::ErrMsgOr<std::vector<uint8_t>> BuildProtectedDataPayload(
+ bool isTestMode, //
+ const std::vector<uint8_t>& macKey, //
+ const std::vector<uint8_t>& aad) const override;
+ std::optional<cppcose::HmacSha256> GenerateHmacSha256(
+ const cppcose::bytevec& input) const override;
+ std::pair<std::vector<uint8_t>, cppbor::Array> GenerateBcc(
+ bool testMode) const;
+
+ private:
+ std::vector<uint8_t> devicePrivKey_;
+ cppbor::Array bcc_;
+ TpmResourceManager& resource_manager_;
+};
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_resource_manager.cpp b/host/commands/secure_env/tpm_resource_manager.cpp
index 3651ec8..defe153 100644
--- a/host/commands/secure_env/tpm_resource_manager.cpp
+++ b/host/commands/secure_env/tpm_resource_manager.cpp
@@ -18,6 +18,8 @@
#include <android-base/logging.h>
#include <tss2/tss2_rc.h>
+namespace cuttlefish {
+
TpmResourceManager::ObjectSlot::ObjectSlot(TpmResourceManager* resource_manager)
: ObjectSlot(resource_manager, ESYS_TR_NONE) {
}
@@ -75,3 +77,5 @@
}
return TpmObjectSlot{new ObjectSlot(this)};
}
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_resource_manager.h b/host/commands/secure_env/tpm_resource_manager.h
index e1ed83f..d4ce2f2 100644
--- a/host/commands/secure_env/tpm_resource_manager.h
+++ b/host/commands/secure_env/tpm_resource_manager.h
@@ -21,6 +21,8 @@
#include <tss2/tss2_esys.h>
+namespace cuttlefish {
+
/**
* Object slot manager for TPM memory. The TPM can only hold a fixed number of
* objects at once. Some TPM operations are defined to consume slots either
@@ -60,3 +62,5 @@
};
using TpmObjectSlot = std::shared_ptr<TpmResourceManager::ObjectSlot>;
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_serialize.cpp b/host/commands/secure_env/tpm_serialize.cpp
index 1cf07ff..5e3fc8c 100644
--- a/host/commands/secure_env/tpm_serialize.cpp
+++ b/host/commands/secure_env/tpm_serialize.cpp
@@ -21,6 +21,8 @@
#include "tss2/tss2_mu.h"
#include "tss2/tss2_rc.h"
+namespace cuttlefish {
+
template<typename T>
int MarshalFn = 0; // Break code without an explicit specialization.
@@ -82,3 +84,5 @@
template class TpmSerializable<TPM2B_PRIVATE>;
template class TpmSerializable<TPM2B_PUBLIC>;
+
+} // namespace cuttlefish
diff --git a/host/commands/secure_env/tpm_serialize.h b/host/commands/secure_env/tpm_serialize.h
index 17884a5..4043ea3 100644
--- a/host/commands/secure_env/tpm_serialize.h
+++ b/host/commands/secure_env/tpm_serialize.h
@@ -24,6 +24,8 @@
#include <android-base/logging.h>
+namespace cuttlefish {
+
/**
* An implementation of a keymaster::Serializable type that refers to a TPM type
* by an unmanaged pointer. When the TpmSerializable serializes or deserializes
@@ -50,3 +52,5 @@
using SerializeTpmKeyPrivate = TpmSerializable<TPM2B_PRIVATE>;
using SerializeTpmKeyPublic = TpmSerializable<TPM2B_PUBLIC>;
+
+} // namespace cuttlefish
diff --git a/host/commands/launch/Android.bp b/host/commands/start/Android.bp
similarity index 87%
rename from host/commands/launch/Android.bp
rename to host/commands/start/Android.bp
index 6adf7a2..82d1327 100644
--- a/host/commands/launch/Android.bp
+++ b/host/commands/start/Android.bp
@@ -18,17 +18,20 @@
}
cc_binary {
- name: "launch_cvd",
+ name: "cvd_internal_start",
+ symlinks: ["launch_cvd"],
srcs: [
"filesystem_explorer.cc",
"flag_forwarder.cc",
- "launch_cvd.cc",
+ "main.cc",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
"libjsoncpp",
+ "libfruit",
"libnl",
"libxml2",
"libz",
@@ -39,7 +42,9 @@
"libgflags",
],
required: [
+ "assemble_cvd",
"mkenvimage",
+ "run_cvd",
],
defaults: ["cuttlefish_host", "cuttlefish_libicuuc"],
}
diff --git a/host/commands/launch/filesystem_explorer.cc b/host/commands/start/filesystem_explorer.cc
similarity index 100%
rename from host/commands/launch/filesystem_explorer.cc
rename to host/commands/start/filesystem_explorer.cc
diff --git a/host/commands/launch/filesystem_explorer.h b/host/commands/start/filesystem_explorer.h
similarity index 100%
rename from host/commands/launch/filesystem_explorer.h
rename to host/commands/start/filesystem_explorer.h
diff --git a/host/commands/launch/flag_forwarder.cc b/host/commands/start/flag_forwarder.cc
similarity index 99%
rename from host/commands/launch/flag_forwarder.cc
rename to host/commands/start/flag_forwarder.cc
index 692e453..aa492c5 100644
--- a/host/commands/launch/flag_forwarder.cc
+++ b/host/commands/start/flag_forwarder.cc
@@ -290,8 +290,7 @@
// Ensure this is set on by putting it at the end.
cmd.AddParameter("--helpxml");
std::string helpxml_input, helpxml_output, helpxml_error;
- cuttlefish::SubprocessOptions options;
- options.Verbose(false);
+ auto options = cuttlefish::SubprocessOptions().Verbose(false);
int helpxml_ret = cuttlefish::RunWithManagedStdio(std::move(cmd), &helpxml_input,
&helpxml_output, &helpxml_error,
options);
diff --git a/host/commands/launch/flag_forwarder.h b/host/commands/start/flag_forwarder.h
similarity index 100%
rename from host/commands/launch/flag_forwarder.h
rename to host/commands/start/flag_forwarder.h
diff --git a/host/commands/launch/launch_cvd.cc b/host/commands/start/main.cc
similarity index 98%
rename from host/commands/launch/launch_cvd.cc
rename to host/commands/start/main.cc
index f67ce48..c11ac67 100644
--- a/host/commands/launch/launch_cvd.cc
+++ b/host/commands/start/main.cc
@@ -23,13 +23,12 @@
#include "common/libs/fs/shared_buf.h"
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/subprocess.h"
-#include "host/commands/launch/filesystem_explorer.h"
+#include "host/commands/start/filesystem_explorer.h"
+#include "host/commands/start/flag_forwarder.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/host_tools_version.h"
#include "host/libs/config/fetcher_config.h"
-#include "flag_forwarder.h"
-
/**
* If stdin is a tty, that means a user is invoking launch_cvd on the command
* line and wants automatic file detection for assemble_cvd.
diff --git a/host/commands/stop_cvd/Android.bp b/host/commands/status/Android.bp
similarity index 90%
copy from host/commands/stop_cvd/Android.bp
copy to host/commands/status/Android.bp
index a670a25..4ce0e8c 100644
--- a/host/commands/stop_cvd/Android.bp
+++ b/host/commands/status/Android.bp
@@ -18,15 +18,17 @@
}
cc_binary {
- name: "stop_cvd",
+ name: "cvd_internal_status",
+ symlinks: ["cvd_status"],
srcs: [
"main.cc",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
- "libcuttlefish_allocd_utils",
+ "libfruit",
"libjsoncpp",
],
static_libs: [
diff --git a/host/commands/status/main.cc b/host/commands/status/main.cc
new file mode 100644
index 0000000..0817e30
--- /dev/null
+++ b/host/commands/status/main.cc
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <inttypes.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include <algorithm>
+#include <cstdlib>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include <android-base/logging.h>
+
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/fs/shared_select.h"
+#include "common/libs/utils/environment.h"
+#include "common/libs/utils/flag_parser.h"
+#include "common/libs/utils/tee_logging.h"
+#include "host/commands/run_cvd/runner_defs.h"
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/vm_manager/vm_manager.h"
+
+#define CHECK_PRINT(print, condition, message) \
+ if (print) { \
+ if (!(condition)) { \
+ std::cout << " Status: Stopped (" << message << ")" << std::endl; \
+ exit(0); \
+ } \
+ } else \
+ CHECK(condition) << message
+
+namespace cuttlefish {
+
+int CvdStatusMain(int argc, char** argv) {
+ ::android::base::InitLogging(argv, android::base::StderrLogger);
+ ::android::base::SetLogger(LogToStderrAndFiles({}));
+
+ std::vector<Flag> flags;
+
+ std::int32_t wait_for_launcher;
+ flags.emplace_back(
+ GflagsCompatFlag("wait_for_launcher", wait_for_launcher)
+ .Help("How many seconds to wait for the launcher to respond to the "
+ "status command. A value of zero means wait indefinitely"));
+ std::string instance_name;
+ flags.emplace_back(GflagsCompatFlag("instance_name", instance_name)
+ .Help("Name of the instance to check. If not "
+ "provided, DefaultInstance is used."));
+ bool print;
+ flags.emplace_back(GflagsCompatFlag("print", print)
+ .Help("If provided, prints status and instance config "
+ "information to stdout instead of CHECK"));
+
+ flags.emplace_back(HelpFlag(flags));
+ flags.emplace_back(UnexpectedArgumentGuard());
+
+ std::vector<std::string> args =
+ ArgsToVec(argc - 1, argv + 1); // Skip argv[0]
+ CHECK(ParseFlags(flags, args)) << "Could not process command line flags.";
+
+ auto config = CuttlefishConfig::Get();
+ CHECK(config) << "Failed to obtain config object";
+
+ auto instance = instance_name.empty()
+ ? config->ForDefaultInstance()
+ : config->ForInstanceName(instance_name);
+
+ if (print) {
+ std::cout << " " << instance.instance_name() << std::endl;
+ std::cout << " Dir: " << instance.instance_dir() << std::endl;
+ std::cout << " Web access: https://" << config->sig_server_address()
+ << ":" << std::to_string(config->sig_server_port())
+ << "/client.html?deviceId=" << instance.instance_name()
+ << std::endl;
+ }
+
+ auto monitor_path = instance.launcher_monitor_socket_path();
+ CHECK_PRINT(print, !monitor_path.empty(),
+ "No path to launcher monitor found");
+
+ auto monitor_socket = SharedFD::SocketLocalClient(
+ monitor_path.c_str(), false, SOCK_STREAM, wait_for_launcher);
+ CHECK_PRINT(print, monitor_socket->IsOpen(),
+ "Unable to connect to launcher monitor at " + monitor_path +
+ ": " + monitor_socket->StrError());
+
+ auto request = LauncherAction::kStatus;
+ auto bytes_sent = monitor_socket->Send(&request, sizeof(request), 0);
+ CHECK_PRINT(print, bytes_sent > 0,
+ "Error sending launcher monitor the status command: " +
+ monitor_socket->StrError());
+
+ // Perform a select with a timeout to guard against launcher hanging
+ SharedFDSet read_set;
+ read_set.Set(monitor_socket);
+ struct timeval timeout = {wait_for_launcher, 0};
+ int selected = Select(&read_set, nullptr, nullptr,
+ wait_for_launcher <= 0 ? nullptr : &timeout);
+ CHECK_PRINT(print, selected >= 0,
+ std::string("Failed communication with the launcher monitor: ") +
+ strerror(errno));
+ CHECK_PRINT(print, selected > 0,
+ "Timeout expired waiting for launcher monitor to respond");
+
+ LauncherResponse response;
+ auto bytes_recv = monitor_socket->Recv(&response, sizeof(response), 0);
+ CHECK_PRINT(print, bytes_recv > 0,
+ std::string("Error receiving response from launcher monitor: ") +
+ monitor_socket->StrError());
+ CHECK_PRINT(print, response == LauncherResponse::kSuccess,
+ std::string("Received '") + static_cast<char>(response) +
+ "' response from launcher monitor");
+
+ if (print) {
+ std::cout << " Status: Running" << std::endl;
+ } else {
+ LOG(INFO) << "run_cvd is active.";
+ }
+ return 0;
+}
+
+} // namespace cuttlefish
+
+int main(int argc, char** argv) {
+ return cuttlefish::CvdStatusMain(argc, argv);
+}
diff --git a/host/commands/stop_cvd/Android.bp b/host/commands/stop/Android.bp
similarity index 91%
rename from host/commands/stop_cvd/Android.bp
rename to host/commands/stop/Android.bp
index a670a25..7d705fd 100644
--- a/host/commands/stop_cvd/Android.bp
+++ b/host/commands/stop/Android.bp
@@ -18,15 +18,18 @@
}
cc_binary {
- name: "stop_cvd",
+ name: "cvd_internal_stop",
+ symlinks: ["stop_cvd"],
srcs: [
"main.cc",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libcuttlefish_allocd_utils",
+ "libfruit",
"libjsoncpp",
],
static_libs: [
diff --git a/host/commands/stop_cvd/main.cc b/host/commands/stop/main.cc
similarity index 75%
rename from host/commands/stop_cvd/main.cc
rename to host/commands/stop/main.cc
index 9e4fdd4..feeca9e 100644
--- a/host/commands/stop_cvd/main.cc
+++ b/host/commands/stop/main.cc
@@ -37,30 +37,26 @@
#include <vector>
#include <android-base/strings.h>
-#include <gflags/gflags.h>
#include <android-base/logging.h>
#include "common/libs/fs/shared_fd.h"
#include "common/libs/fs/shared_select.h"
#include "common/libs/utils/environment.h"
+#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
#include "host/commands/run_cvd/runner_defs.h"
#include "host/libs/allocd/request.h"
#include "host/libs/allocd/utils.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/vm_manager/vm_manager.h"
-DEFINE_int32(wait_for_launcher, 5,
- "How many seconds to wait for the launcher to respond to the stop "
- "command. A value of zero means wait indefinetly");
-
namespace cuttlefish {
namespace {
-std::set<std::string> FallbackPaths() {
+std::set<std::string> FallbackDirs() {
std::set<std::string> paths;
std::string parent_path = StringFromEnv("HOME", ".");
paths.insert(parent_path + "/cuttlefish_assembly");
- paths.insert(parent_path + "/cuttlefish_assembly/*");
std::unique_ptr<DIR, int(*)(DIR*)> dir(opendir(parent_path.c_str()), closedir);
for (auto entity = readdir(dir.get()); entity != nullptr; entity = readdir(dir.get())) {
@@ -68,43 +64,26 @@
if (!android::base::StartsWith(subdir, "cuttlefish_runtime.")) {
continue;
}
- auto instance_dir = parent_path + "/" + subdir;
- // Add the instance directory
- paths.insert(instance_dir);
- // Add files in instance dir
- paths.insert(instance_dir + "/*");
- // Add files in the tombstone directory
- paths.insert(instance_dir + "/tombstones/*");
- // Add files in the internal directory
- paths.insert(instance_dir + "/" + std::string(kInternalDirName) + "/*");
- // Add files in the shared directory
- paths.insert(instance_dir + "/" + std::string(kSharedDirName) + "/*");
+ paths.insert(parent_path + "/" + subdir);
}
return paths;
}
-std::set<std::string> PathsForInstance(const CuttlefishConfig& config,
- const CuttlefishConfig::InstanceSpecific instance) {
+std::set<std::string> DirsForInstance(
+ const CuttlefishConfig& config,
+ const CuttlefishConfig::InstanceSpecific instance) {
return {
- config.assembly_dir(),
- config.assembly_dir() + "/*",
- instance.instance_dir(),
- instance.PerInstancePath("*"),
- instance.PerInstancePath("tombstones"),
- instance.PerInstancePath("tombstones/*"),
- instance.instance_internal_dir(),
- instance.PerInstanceInternalPath("*"),
- instance.PerInstancePath(kSharedDirName),
- instance.PerInstancePath(kSharedDirName) + "/*",
+ config.assembly_dir(),
+ instance.instance_dir(),
};
}
// Gets a set of the possible process groups of a previous launch
-std::set<pid_t> GetCandidateProcessGroups(const std::set<std::string>& paths) {
+std::set<pid_t> GetCandidateProcessGroups(const std::set<std::string>& dirs) {
std::stringstream cmd;
cmd << "lsof -t 2>/dev/null";
- for (const auto& path : paths) {
- cmd << " " << path;
+ for (const auto& dir : dirs) {
+ cmd << " +D " << dir;
}
std::string cmd_str = cmd.str();
std::shared_ptr<FILE> cmd_out(popen(cmd_str.c_str(), "r"), pclose);
@@ -128,10 +107,10 @@
return ret;
}
-int FallBackStop(const std::set<std::string>& paths) {
+int FallBackStop(const std::set<std::string>& dirs) {
auto exit_code = 1; // Having to fallback is an error
- auto process_groups = GetCandidateProcessGroups(paths);
+ auto process_groups = GetCandidateProcessGroups(dirs);
for (auto pgid: process_groups) {
LOG(INFO) << "Sending SIGKILL to process group " << pgid;
auto retval = killpg(pgid, SIGKILL);
@@ -145,14 +124,15 @@
return exit_code;
}
-bool CleanStopInstance(const CuttlefishConfig::InstanceSpecific& instance) {
+bool CleanStopInstance(const CuttlefishConfig::InstanceSpecific& instance,
+ std::int32_t wait_for_launcher) {
auto monitor_path = instance.launcher_monitor_socket_path();
if (monitor_path.empty()) {
LOG(ERROR) << "No path to launcher monitor found";
return false;
}
auto monitor_socket = SharedFD::SocketLocalClient(
- monitor_path.c_str(), false, SOCK_STREAM, FLAGS_wait_for_launcher);
+ monitor_path.c_str(), false, SOCK_STREAM, wait_for_launcher);
if (!monitor_socket->IsOpen()) {
LOG(ERROR) << "Unable to connect to launcher monitor at " << monitor_path
<< ": " << monitor_socket->StrError();
@@ -168,9 +148,9 @@
// Perform a select with a timeout to guard against launcher hanging
SharedFDSet read_set;
read_set.Set(monitor_socket);
- struct timeval timeout = {FLAGS_wait_for_launcher, 0};
+ struct timeval timeout = {wait_for_launcher, 0};
int selected = Select(&read_set, nullptr, nullptr,
- FLAGS_wait_for_launcher <= 0 ? nullptr : &timeout);
+ wait_for_launcher <= 0 ? nullptr : &timeout);
if (selected < 0){
LOG(ERROR) << "Failed communication with the launcher monitor: "
<< strerror(errno);
@@ -197,10 +177,11 @@
}
int StopInstance(const CuttlefishConfig& config,
- const CuttlefishConfig::InstanceSpecific& instance) {
- bool res = CleanStopInstance(instance);
+ const CuttlefishConfig::InstanceSpecific& instance,
+ std::int32_t wait_for_launcher) {
+ bool res = CleanStopInstance(instance, wait_for_launcher);
if (!res) {
- return FallBackStop(PathsForInstance(config, instance));
+ return FallBackStop(DirsForInstance(config, instance));
}
return 0;
}
@@ -230,18 +211,35 @@
int StopCvdMain(int argc, char** argv) {
::android::base::InitLogging(argv, android::base::StderrLogger);
- google::ParseCommandLineFlags(&argc, &argv, true);
+
+ std::vector<Flag> flags;
+
+ std::int32_t wait_for_launcher;
+ flags.emplace_back(
+ GflagsCompatFlag("wait_for_launcher", wait_for_launcher)
+ .Help("How many seconds to wait for the launcher to respond to the "
+ "status command. A value of zero means wait indefinitely"));
+ bool clear_instance_dirs;
+ flags.emplace_back(
+ GflagsCompatFlag("clear_instance_dirs", clear_instance_dirs)
+ .Help("If provided, deletes the instance dir after attempting to "
+ "stop each instance."));
+ flags.emplace_back(HelpFlag(flags));
+ flags.emplace_back(UnexpectedArgumentGuard());
+ std::vector<std::string> args =
+ ArgsToVec(argc - 1, argv + 1); // Skip argv[0]
+ CHECK(ParseFlags(flags, args)) << "Could not process command line flags.";
auto config = CuttlefishConfig::Get();
if (!config) {
LOG(ERROR) << "Failed to obtain config object";
- return FallBackStop(FallbackPaths());
+ return FallBackStop(FallbackDirs());
}
int ret = 0;
for (const auto& instance : config->Instances()) {
auto session_id = instance.session_id();
- int exit_status = StopInstance(*config, instance);
+ int exit_status = StopInstance(*config, instance, wait_for_launcher);
if (exit_status == 0 && instance.use_allocd()) {
// only release session resources if the instance was stopped
SharedFD allocd_sock =
@@ -254,6 +252,14 @@
ReleaseAllocdResources(allocd_sock, session_id);
}
+ if (clear_instance_dirs) {
+ if (DirectoryExists(instance.instance_dir())) {
+ LOG(INFO) << "Deleting instance dir " << instance.instance_dir();
+ if (!RecursivelyRemoveDirectory(instance.instance_dir())) {
+ LOG(ERROR) << "Unable to rmdir " << instance.instance_dir();
+ }
+ }
+ }
ret |= exit_status;
}
diff --git a/host/commands/tapsetiff/tapsetiff.py b/host/commands/tapsetiff/tapsetiff.py
deleted file mode 100755
index 8a0999e..0000000
--- a/host/commands/tapsetiff/tapsetiff.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/python3
-
-# Copyright (C) 2020 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http:#www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import fcntl
-import struct
-import sys
-
-TUNSETIFF = 0x400454ca
-IFF_TAP = 0x0002
-IFF_NO_PI = 0x1000
-IFF_VNET_HDR = 0x4000
-
-tun_fd = int(sys.argv[1])
-tap_name = sys.argv[2]
-
-ifr = struct.pack('16sH', tap_name.encode('utf-8'), IFF_TAP | IFF_NO_PI | IFF_VNET_HDR)
-fcntl.ioctl(tun_fd, TUNSETIFF, ifr)
diff --git a/host/commands/tombstone_receiver/Android.bp b/host/commands/tombstone_receiver/Android.bp
index 51830fc..b50cde4 100644
--- a/host/commands/tombstone_receiver/Android.bp
+++ b/host/commands/tombstone_receiver/Android.bp
@@ -23,6 +23,7 @@
"main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libjsoncpp",
diff --git a/host/commands/tombstone_receiver/main.cpp b/host/commands/tombstone_receiver/main.cpp
index 2e0ea69..5fa495d 100644
--- a/host/commands/tombstone_receiver/main.cpp
+++ b/host/commands/tombstone_receiver/main.cpp
@@ -22,23 +22,21 @@
#include <iomanip>
#include <sstream>
-#include "host/libs/config/logging.h"
#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/flag_parser.h"
+#include "common/libs/utils/shared_fd_flag.h"
+#include "host/libs/config/logging.h"
-DEFINE_int32(
- server_fd, -1,
- "File descriptor to an already created vsock server. If negative a new "
- "server will be created at the port specified on the config file");
-DEFINE_string(tombstone_dir, "", "directory to write out tombstones in");
+namespace cuttlefish {
static uint num_tombstones_in_last_second = 0;
static std::string last_tombstone_name = "";
-static std::string next_tombstone_path() {
+static std::string next_tombstone_path(const std::string& tombstone_dir) {
auto in_time_t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::stringstream ss;
- ss << FLAGS_tombstone_dir << "/tombstone_" <<
- std::put_time(std::gmtime(&in_time_t), "%Y-%m-%d-%H%M%S");
+ ss << tombstone_dir << "/tombstone_"
+ << std::put_time(std::gmtime(&in_time_t), "%Y-%m-%d-%H%M%S");
auto retval = ss.str();
// Gives tombstones unique names
@@ -54,23 +52,38 @@
return retval;
}
-#define CHUNK_RECV_MAX_LEN (1024)
-int main(int argc, char** argv) {
- cuttlefish::DefaultSubprocessLogging(argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
+static constexpr size_t CHUNK_RECV_MAX_LEN = 1024;
- cuttlefish::SharedFD server_fd = cuttlefish::SharedFD::Dup(FLAGS_server_fd);
- close(FLAGS_server_fd);
+int TombstoneReceiverMain(int argc, char** argv) {
+ DefaultSubprocessLogging(argv);
- CHECK(server_fd->IsOpen()) << "Error inheriting tombstone server: "
- << server_fd->StrError();
+ std::vector<Flag> flags;
+
+ std::string tombstone_dir;
+ flags.emplace_back(GflagsCompatFlag("tombstone_dir", tombstone_dir)
+ .Help("directory to write out tombstones in"));
+
+ SharedFD server_fd;
+ flags.emplace_back(
+ SharedFDFlag("server_fd", server_fd)
+ .Help("File descriptor to an already created vsock server"));
+
+ flags.emplace_back(HelpFlag(flags));
+ flags.emplace_back(UnexpectedArgumentGuard());
+
+ std::vector<std::string> args =
+ ArgsToVec(argc - 1, argv + 1); // Skip argv[0]
+ CHECK(ParseFlags(flags, args)) << "Could not process command line flags.";
+
+ CHECK(server_fd->IsOpen()) << "Did not receive a server fd";
+
LOG(DEBUG) << "Host is starting server on port "
<< server_fd->VsockServerPort();
// Server loop
while (true) {
- auto conn = cuttlefish::SharedFD::Accept(*server_fd);
- std::ofstream file(next_tombstone_path(),
+ auto conn = SharedFD::Accept(*server_fd);
+ std::ofstream file(next_tombstone_path(tombstone_dir),
std::ofstream::out | std::ofstream::binary);
while (file.is_open()) {
@@ -87,3 +100,9 @@
return 0;
}
+
+} // namespace cuttlefish
+
+int main(int argc, char** argv) {
+ return cuttlefish::TombstoneReceiverMain(argc, argv);
+}
diff --git a/host/commands/mk_cdisk/Android.bp b/host/commands/wmediumd_control/Android.bp
similarity index 82%
rename from host/commands/mk_cdisk/Android.bp
rename to host/commands/wmediumd_control/Android.bp
index a0cf8ba..5d86cb0 100644
--- a/host/commands/mk_cdisk/Android.bp
+++ b/host/commands/wmediumd_control/Android.bp
@@ -18,24 +18,23 @@
}
cc_binary {
- name: "mk_cdisk",
+ name: "wmediumd_control",
srcs: [
- "mk_cdisk.cc",
+ "main.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
+ "libfruit",
"libjsoncpp",
- "liblog",
"libz",
],
static_libs: [
- "libcdisk_spec",
- "libext2_uuid",
- "libimage_aggregator",
- "libprotobuf-cpp-lite",
- "libsparse",
+ "libcuttlefish_host_config",
+ "libcuttlefish_wmediumd_controller",
+ "libgflags",
],
defaults: ["cuttlefish_host"],
}
diff --git a/host/commands/wmediumd_control/main.cpp b/host/commands/wmediumd_control/main.cpp
new file mode 100644
index 0000000..205d918
--- /dev/null
+++ b/host/commands/wmediumd_control/main.cpp
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <gflags/gflags.h>
+
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/wmediumd_controller/wmediumd_controller.h"
+
+const std::string usageMessage =
+ "wmediumd control commandline utility\n\n"
+ " Usage: wmediumd_control [option] command [args...]\n\n"
+ " Commands:\n\n"
+ " set_snr mac1 mac2 snr\n"
+ " set SNR between two nodes. (0 <= snr <= 255)\n\n"
+ " reload_config [path]\n"
+ " force reload wmediumd configuration file\n\n"
+ " if path is not specified, reload current configuration file\n\n"
+ " start_pcap path\n"
+ " start packet capture and save capture result to file.\n"
+ " file format is pcap capture format.\n\n"
+ " stop_pcap\n"
+ " stop packet capture\n\n";
+
+DEFINE_string(wmediumd_api_server, "",
+ "Unix socket path of wmediumd api server");
+
+const int kMacAddrStringSize = 17;
+
+bool ValidMacAddr(const std::string& macAddr) {
+ if (macAddr.size() != kMacAddrStringSize) {
+ return false;
+ }
+
+ if (macAddr[2] != ':' || macAddr[5] != ':' || macAddr[8] != ':' ||
+ macAddr[11] != ':' || macAddr[14] != ':') {
+ return false;
+ }
+
+ for (int i = 0; i < kMacAddrStringSize; ++i) {
+ if ((i - 2) % 3 == 0) continue;
+ char c = macAddr[i];
+
+ if (isupper(c)) {
+ c = tolower(c);
+ }
+
+ if ((c < '0' || c > '9') && (c < 'a' || c > 'f')) return false;
+ }
+
+ return true;
+}
+
+bool HandleSetSnrCommand(cuttlefish::WmediumdController& client,
+ const std::vector<std::string>& args) {
+ if (args.size() != 4) {
+ LOG(ERROR) << "error: set_snr must provide 3 options";
+ return false;
+ }
+
+ if (!ValidMacAddr(args[1])) {
+ LOG(ERROR) << "error: invalid mac address " << args[1];
+ return false;
+ }
+
+ if (!ValidMacAddr(args[2])) {
+ LOG(ERROR) << "error: invalid mac address " << args[2];
+ return false;
+ }
+
+ uint8_t snr = 0;
+
+ auto parseResult =
+ android::base::ParseUint<decltype(snr)>(args[3].c_str(), &snr);
+
+ if (!parseResult) {
+ if (errno == EINVAL) {
+ LOG(ERROR) << "error: cannot parse snr: " << args[3];
+ } else if (errno == ERANGE) {
+ LOG(ERROR) << "error: snr exceeded range: " << args[3];
+ }
+
+ return false;
+ }
+
+ if (!client.SetSnr(args[1], args[2], snr)) {
+ return false;
+ }
+
+ return true;
+}
+
+bool HandleReloadConfigCommand(cuttlefish::WmediumdController& client,
+ const std::vector<std::string>& args) {
+ if (args.size() > 2) {
+ LOG(ERROR) << "error: reload_config must provide 0 or 1 option";
+ return false;
+ }
+
+ if (args.size() == 2) {
+ return client.ReloadConfig(args[1]);
+ } else {
+ return client.ReloadCurrentConfig();
+ }
+}
+
+bool HandleStartPcapCommand(cuttlefish::WmediumdController& client,
+ const std::vector<std::string>& args) {
+ if (args.size() != 2) {
+ LOG(ERROR) << "error: you must provide only 1 option(path)";
+ return false;
+ }
+
+ return client.StartPcap(args[1]);
+}
+
+bool HandleStopPcapCommand(cuttlefish::WmediumdController& client,
+ const std::vector<std::string>& args) {
+ if (args.size() != 1) {
+ LOG(ERROR) << "error: you must not provide option";
+ return false;
+ }
+
+ return client.StopPcap();
+}
+
+int main(int argc, char** argv) {
+ gflags::SetUsageMessage(usageMessage);
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
+
+ std::vector<std::string> args;
+
+ for (int i = 1; i < argc; ++i) {
+ args.push_back(argv[i]);
+ }
+
+ if (args.size() == 0) {
+ LOG(ERROR) << "error: you must provide at least 1 argument";
+ gflags::ShowUsageWithFlags(argv[0]);
+ return -1;
+ }
+
+ std::string wmediumdApiServerPath(FLAGS_wmediumd_api_server);
+
+ if (wmediumdApiServerPath == "") {
+ const auto cuttlefishConfig = cuttlefish::CuttlefishConfig::Get();
+
+ if (!cuttlefishConfig) {
+ LOG(ERROR) << "error: cannot get global cuttlefish config";
+ return -1;
+ }
+
+ wmediumdApiServerPath = cuttlefishConfig->wmediumd_api_server_socket();
+ }
+
+ auto client = cuttlefish::WmediumdController::New(wmediumdApiServerPath);
+
+ if (!client) {
+ LOG(ERROR) << "error: cannot connect to " << wmediumdApiServerPath;
+ return -1;
+ }
+
+ auto commandMap =
+ std::unordered_map<std::string,
+ std::function<bool(cuttlefish::WmediumdController&,
+ const std::vector<std::string>&)>>{{
+ {"set_snr", HandleSetSnrCommand},
+ {"reload_config", HandleReloadConfigCommand},
+ {"start_pcap", HandleStartPcapCommand},
+ {"stop_pcap", HandleStopPcapCommand},
+ }};
+
+ if (commandMap.find(args[0]) == std::end(commandMap)) {
+ LOG(ERROR) << "error: command " << args[0] << " does not exist";
+ gflags::ShowUsageWithFlags(argv[0]);
+ return -1;
+ }
+
+ if (!commandMap[args[0]](*client, args)) {
+ LOG(ERROR) << "error: failed to execute command " << args[0];
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/host/example_custom_actions/Android.bp b/host/example_custom_actions/Android.bp
index 36161f6..a213099 100644
--- a/host/example_custom_actions/Android.bp
+++ b/host/example_custom_actions/Android.bp
@@ -9,6 +9,7 @@
"cuttlefish_buildhost_only",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"liblog",
"libutils",
diff --git a/host/example_custom_actions/README.md b/host/example_custom_actions/README.md
index de3764d..44d4fae 100644
--- a/host/example_custom_actions/README.md
+++ b/host/example_custom_actions/README.md
@@ -2,11 +2,8 @@
following build vars:
```
-SOONG_CONFIG_NAMESPACES += cvd
-SOONG_CONFIG_cvd += custom_action_config custom_action_servers
-
-SOONG_CONFIG_cvd_custom_action_config := cuttlefish_example_action_config.json
-SOONG_CONFIG_cvd_custom_action_servers += cuttlefish_example_action_server
+$(call soong_config_set, cvd, custom_action_config, cuttlefish_example_action_config.json)
+$(call soong_config_append, cvd, custom_action_servers, cuttlefish_example_action_server)
```
See `device/google/cuttlefish/build/README.md` for more information.
diff --git a/host/frontend/adb_connector/Android.bp b/host/frontend/adb_connector/Android.bp
index d0927af..d866fd3 100644
--- a/host/frontend/adb_connector/Android.bp
+++ b/host/frontend/adb_connector/Android.bp
@@ -29,6 +29,7 @@
"libjsoncpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
diff --git a/host/commands/adbshell/Android.bp b/host/frontend/operator_proxy/Android.bp
similarity index 79%
rename from host/commands/adbshell/Android.bp
rename to host/frontend/operator_proxy/Android.bp
index 883503e..9f6bc6e 100644
--- a/host/commands/adbshell/Android.bp
+++ b/host/frontend/operator_proxy/Android.bp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -18,20 +18,26 @@
}
cc_binary_host {
- name: "adbshell",
+ name: "operator_proxy",
srcs: [
"main.cpp",
],
- cflags: [
- "-D_XOPEN_SOURCE",
- ],
shared_libs: [
"libbase",
- "libcuttlefish_utils",
+ "liblog",
+ "libcrypto",
+ "libjsoncpp",
+ "libssl",
+ "libcuttlefish_fs",
],
static_libs: [
+ "libcap",
+ "libgflags",
+ "libcuttlefish_utils",
"libcuttlefish_host_config",
- "libjsoncpp",
+ "libwebsockets",
],
defaults: ["cuttlefish_buildhost_only"],
}
+
+
diff --git a/host/frontend/operator_proxy/main.cpp b/host/frontend/operator_proxy/main.cpp
new file mode 100644
index 0000000..c0c4685
--- /dev/null
+++ b/host/frontend/operator_proxy/main.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <gflags/gflags.h>
+#include <libwebsockets.h>
+
+#include "common/libs/utils/files.h"
+#include "host/libs/config/cuttlefish_config.h"
+
+DEFINE_int32(http_server_port, 8443, "The port for the http server");
+DEFINE_bool(use_secure_http, true, "Whether to use HTTPS or HTTP.");
+DEFINE_string(certs_dir,
+ cuttlefish::DefaultHostArtifactsPath("usr/share/webrtc/certs"),
+ "Directory to certificates. It must contain a server.crt file, a "
+ "server.key file and (optionally) a CA.crt file.");
+DEFINE_string(operator_addr, "localhost:1080/",
+ "The address of the operator server to proxy");
+
+int main() {
+ struct lws_context_creation_info info;
+ struct lws_context *context;
+
+ lws_set_log_level(LLL_ERR, NULL);
+
+ struct lws_http_mount mount = {
+ .mount_next = nullptr,
+ .mountpoint = "/",
+ .mountpoint_len = static_cast<uint8_t>(1),
+ .origin = FLAGS_operator_addr.c_str(),
+ .def = nullptr,
+ .protocol = nullptr,
+ .cgienv = nullptr,
+ .extra_mimetypes = nullptr,
+ .interpret = nullptr,
+ .cgi_timeout = 0,
+ .cache_max_age = 0,
+ .auth_mask = 0,
+ .cache_reusable = 0,
+ .cache_revalidate = 0,
+ .cache_intermediaries = 0,
+ .origin_protocol = LWSMPRO_HTTP, // reverse proxy
+ .basic_auth_login_file = nullptr,
+ };
+
+ memset(&info, 0, sizeof info);
+ info.port = FLAGS_http_server_port;
+ info.mounts = &mount;
+ if (FLAGS_use_secure_http) {
+ std::string cert_file = FLAGS_certs_dir + "/server.crt";
+ std::string key_file = FLAGS_certs_dir + "/server.key";
+ std::string ca_file = FLAGS_certs_dir + "/CA.crt";
+
+ info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
+ info.ssl_cert_filepath = cert_file.c_str();
+ info.ssl_private_key_filepath = key_file.c_str();
+ if (cuttlefish::FileExists(ca_file)) {
+ info.ssl_ca_filepath = ca_file.c_str();
+ }
+ }
+
+ context = lws_create_context(&info);
+ CHECK(context) << "Unable to create reverse proxy";
+ LOG(VERBOSE) << "Started reverse proxy to signaling server";
+ while (lws_service(context, 0) >= 0) {
+ }
+ lws_context_destroy(context);
+ return 0;
+}
diff --git a/host/frontend/vnc_server/Android.bp b/host/frontend/vnc_server/Android.bp
deleted file mode 100644
index 468590b..0000000
--- a/host/frontend/vnc_server/Android.bp
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-cc_binary {
- name: "vnc_server",
- srcs: [
- "blackboard.cpp",
- "frame_buffer_watcher.cpp",
- "jpeg_compressor.cpp",
- "main.cpp",
- "simulated_hw_composer.cpp",
- "virtual_inputs.cpp",
- "vnc_client_connection.cpp",
- "vnc_server.cpp",
- ],
- shared_libs: [
- "libcuttlefish_fs",
- "libcuttlefish_utils",
- "libbase",
- "libjsoncpp",
- "liblog",
- ],
- header_libs: [
- "libcuttlefish_confui_host_headers",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libcuttlefish_screen_connector",
- "libcuttlefish_wayland_server",
- "libcuttlefish_confui",
- "libcuttlefish_confui_host",
- "libft2.nodep",
- "libteeui",
- "libteeui_localization",
- "libffi",
- "libjpeg",
- "libgflags",
- "libwayland_crosvm_gpu_display_extension_server_protocols",
- "libwayland_extension_server_protocols",
- "libwayland_server",
- ],
- defaults: ["cuttlefish_host"],
-}
diff --git a/host/frontend/vnc_server/blackboard.cpp b/host/frontend/vnc_server/blackboard.cpp
deleted file mode 100644
index 91a8d1e..0000000
--- a/host/frontend/vnc_server/blackboard.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "host/frontend/vnc_server/blackboard.h"
-
-#include <algorithm>
-#include <utility>
-
-#include <gflags/gflags.h>
-#include <android-base/logging.h>
-#include "host/frontend/vnc_server/frame_buffer_watcher.h"
-
-DEFINE_bool(debug_blackboard, false,
- "Turn on detailed logging for the blackboard");
-
-#define DLOG(LEVEL) \
- if (FLAGS_debug_blackboard) LOG(LEVEL)
-
-using cuttlefish::vnc::BlackBoard;
-using cuttlefish::vnc::Stripe;
-
-cuttlefish::vnc::SeqNumberVec cuttlefish::vnc::MakeSeqNumberVec() {
- return SeqNumberVec(FrameBufferWatcher::StripesPerFrame());
-}
-
-void BlackBoard::NewStripeReady(int index, StripeSeqNumber seq_num) {
- std::lock_guard<std::mutex> guard(m_);
- DLOG(INFO) << "new stripe arrived from frame watcher";
- auto& current_seq_num = most_recent_stripe_seq_nums_[index];
- current_seq_num = std::max(current_seq_num, seq_num);
- for (auto& client : clients_) {
- if (client.second.ready_to_receive) {
- client.second.new_frame_cv.notify_one();
- }
- }
-}
-
-void BlackBoard::Register(const VncClientConnection* conn) {
- {
- std::lock_guard<std::mutex> guard(m_);
- CHECK(!clients_.count(conn));
- clients_[conn]; // constructs new state in place
- }
- new_client_cv_.notify_one();
-}
-
-void BlackBoard::Unregister(const VncClientConnection* conn) {
- std::lock_guard<std::mutex> guard(m_);
- CHECK(clients_.count(conn));
- clients_.erase(clients_.find(conn));
-}
-
-bool BlackBoard::NoNewStripesFor(const SeqNumberVec& seq_nums) const {
- CHECK(seq_nums.size() == most_recent_stripe_seq_nums_.size());
- for (auto state_seq_num = seq_nums.begin(),
- held_seq_num = most_recent_stripe_seq_nums_.begin();
- state_seq_num != seq_nums.end(); ++state_seq_num, ++held_seq_num) {
- if (*state_seq_num < *held_seq_num) {
- return false;
- }
- }
- return true;
-}
-
-cuttlefish::vnc::StripePtrVec BlackBoard::WaitForSenderWork(
- const VncClientConnection* conn) {
- std::unique_lock<std::mutex> guard(m_);
- auto& state = GetStateForClient(conn);
- DLOG(INFO) << "Waiting for stripe...";
- while (!state.closed &&
- (!state.ready_to_receive || NoNewStripesFor(state.stripe_seq_nums))) {
- state.new_frame_cv.wait(guard);
- }
- DLOG(INFO) << "At least one new stripe is available, should unblock " << conn;
- state.ready_to_receive = false;
- auto new_stripes = frame_buffer_watcher_->StripesNewerThan(
- state.orientation, state.stripe_seq_nums);
- for (auto& s : new_stripes) {
- state.stripe_seq_nums[s->index] = s->seq_number;
- }
- return new_stripes;
-}
-
-void BlackBoard::WaitForAtLeastOneClientConnection() {
- std::unique_lock<std::mutex> guard(m_);
- while (clients_.empty()) {
- new_client_cv_.wait(guard);
- }
-}
-
-void BlackBoard::SetOrientation(const VncClientConnection* conn,
- ScreenOrientation orientation) {
- std::lock_guard<std::mutex> guard(m_);
- auto& state = GetStateForClient(conn);
- state.orientation = orientation;
- // After an orientation change the vnc client will need all stripes from
- // the new orientation, regardless of age.
- ResetToZero(&state.stripe_seq_nums);
-}
-
-void BlackBoard::SignalClientNeedsEntireScreen(
- const VncClientConnection* conn) {
- std::lock_guard<std::mutex> guard(m_);
- ResetToZero(&GetStateForClient(conn).stripe_seq_nums);
-}
-
-void BlackBoard::ResetToZero(SeqNumberVec* seq_nums) {
- seq_nums->assign(FrameBufferWatcher::StripesPerFrame(), StripeSeqNumber{});
-}
-
-void BlackBoard::FrameBufferUpdateRequestReceived(
- const VncClientConnection* conn) {
- std::lock_guard<std::mutex> guard(m_);
- DLOG(INFO) << "Received frame buffer update request";
- auto& state = GetStateForClient(conn);
- state.ready_to_receive = true;
- state.new_frame_cv.notify_one();
-}
-
-void BlackBoard::StopWaiting(const VncClientConnection* conn) {
- std::lock_guard<std::mutex> guard(m_);
- auto& state = GetStateForClient(conn);
- state.closed = true;
- // Wake up the thread that might be in WaitForSenderWork()
- state.new_frame_cv.notify_one();
-}
-
-void BlackBoard::set_frame_buffer_watcher(
- cuttlefish::vnc::FrameBufferWatcher* frame_buffer_watcher) {
- std::lock_guard<std::mutex> guard(m_);
- frame_buffer_watcher_ = frame_buffer_watcher;
-}
-
-void BlackBoard::set_jpeg_quality_level(int quality_level) {
- // NOTE all vnc clients share a common jpeg quality level because the
- // server doesn't compress per-client. The quality level for all clients
- // will be whatever the most recent set was by any client.
- std::lock_guard<std::mutex> guard(m_);
- if (quality_level < kJpegMinQualityEncoding ||
- quality_level > kJpegMaxQualityEncoding) {
- LOG(WARNING) << "Bogus jpeg quality level: " << quality_level
- << ". Quality must be in range [" << kJpegMinQualityEncoding
- << ", " << kJpegMaxQualityEncoding << "]";
- return;
- }
- jpeg_quality_level_ = 55 + (5 * (quality_level + 32));
- DLOG(INFO) << "jpeg quality level set to " << jpeg_quality_level_ << "%";
-}
-
-BlackBoard::ClientFBUState& BlackBoard::GetStateForClient(
- const VncClientConnection* conn) {
- CHECK(clients_.count(conn));
- return clients_[conn];
-}
diff --git a/host/frontend/vnc_server/blackboard.h b/host/frontend/vnc_server/blackboard.h
deleted file mode 100644
index af4baea..0000000
--- a/host/frontend/vnc_server/blackboard.h
+++ /dev/null
@@ -1,113 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <condition_variable>
-#include <memory>
-#include <mutex>
-#include <unordered_map>
-
-#include "common/libs/concurrency/thread_annotations.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-
-namespace cuttlefish {
-namespace vnc {
-
-class VncClientConnection;
-class FrameBufferWatcher;
-using StripePtrVec = std::vector<std::shared_ptr<const Stripe>>;
-using SeqNumberVec = std::vector<StripeSeqNumber>;
-
-SeqNumberVec MakeSeqNumberVec();
-
-class BlackBoard {
- private:
- struct ClientFBUState {
- bool ready_to_receive{};
- ScreenOrientation orientation{};
- std::condition_variable new_frame_cv;
- SeqNumberVec stripe_seq_nums = MakeSeqNumberVec();
- bool closed{};
- };
-
- public:
- class Registerer {
- public:
- Registerer(BlackBoard* bb, const VncClientConnection* conn)
- : bb_{bb}, conn_{conn} {
- bb->Register(conn);
- }
- ~Registerer() { bb_->Unregister(conn_); }
- Registerer(const Registerer&) = delete;
- Registerer& operator=(const Registerer&) = delete;
-
- private:
- BlackBoard* bb_{};
- const VncClientConnection* conn_{};
- };
-
- BlackBoard() = default;
- BlackBoard(const BlackBoard&) = delete;
- BlackBoard& operator=(const BlackBoard&) = delete;
-
- bool NoNewStripesFor(const SeqNumberVec& seq_nums) const REQUIRES(m_);
- void NewStripeReady(int index, StripeSeqNumber seq_num);
- void Register(const VncClientConnection* conn);
- void Unregister(const VncClientConnection* conn);
-
- StripePtrVec WaitForSenderWork(const VncClientConnection* conn);
-
- void WaitForAtLeastOneClientConnection();
-
- void FrameBufferUpdateRequestReceived(const VncClientConnection* conn);
- // Setting orientation implies needing the entire screen
- void SetOrientation(const VncClientConnection* conn,
- ScreenOrientation orientation);
- void SignalClientNeedsEntireScreen(const VncClientConnection* conn);
-
- void StopWaiting(const VncClientConnection* conn);
-
- void set_frame_buffer_watcher(FrameBufferWatcher* frame_buffer_watcher);
-
- // quality_level must be the value received from the client, in the range
- // [kJpegMinQualityEncoding, kJpegMaxQualityEncoding], else it is ignored.
- void set_jpeg_quality_level(int quality_level);
-
- int jpeg_quality_level() const {
- std::lock_guard<std::mutex> guard(m_);
- return jpeg_quality_level_;
- }
-
- private:
- ClientFBUState& GetStateForClient(const VncClientConnection* conn)
- REQUIRES(m_);
- static void ResetToZero(SeqNumberVec* seq_nums);
-
- mutable std::mutex m_;
- SeqNumberVec most_recent_stripe_seq_nums_ GUARDED_BY(m_) = MakeSeqNumberVec();
- std::unordered_map<const VncClientConnection*, ClientFBUState> clients_
- GUARDED_BY(m_);
- int jpeg_quality_level_ GUARDED_BY(m_) = 100;
- std::condition_variable new_client_cv_;
- // NOTE the FrameBufferWatcher pointer itself should be
- // guarded, but not the pointee.
- FrameBufferWatcher* frame_buffer_watcher_ GUARDED_BY(m_){};
-};
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/frame_buffer_watcher.cpp b/host/frontend/vnc_server/frame_buffer_watcher.cpp
deleted file mode 100644
index 3cc39c0..0000000
--- a/host/frontend/vnc_server/frame_buffer_watcher.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "host/frontend/vnc_server/frame_buffer_watcher.h"
-
-#include <algorithm>
-#include <cstdint>
-#include <cstring>
-#include <iterator>
-#include <memory>
-#include <mutex>
-#include <thread>
-#include <utility>
-
-#include <android-base/logging.h>
-#include "host/frontend/vnc_server/vnc_utils.h"
-
-using cuttlefish::vnc::FrameBufferWatcher;
-
-FrameBufferWatcher::FrameBufferWatcher(BlackBoard* bb,
- ScreenConnector& screen_connector)
- : bb_{bb}, hwcomposer{bb_, screen_connector} {
- for (auto& stripes_vec : stripes_) {
- std::generate_n(std::back_inserter(stripes_vec),
- SimulatedHWComposer::NumberOfStripes(),
- std::make_shared<Stripe>);
- }
- bb_->set_frame_buffer_watcher(this);
- auto num_workers = std::max(std::thread::hardware_concurrency(), 1u);
- std::generate_n(std::back_inserter(workers_), num_workers, [this] {
- return std::thread{&FrameBufferWatcher::Worker, this};
- });
-}
-
-FrameBufferWatcher::~FrameBufferWatcher() {
- {
- std::lock_guard<std::mutex> guard(m_);
- closed_ = true;
- }
- for (auto& tid : workers_) {
- tid.join();
- }
-}
-
-bool FrameBufferWatcher::closed() const {
- std::lock_guard<std::mutex> guard(m_);
- return closed_;
-}
-
-cuttlefish::vnc::Stripe FrameBufferWatcher::Rotated(Stripe stripe) {
- if (stripe.orientation == ScreenOrientation::Landscape) {
- LOG(FATAL) << "Rotating a landscape stripe, this is a mistake";
- }
- auto w = stripe.width;
- auto s = stripe.stride;
- auto h = stripe.height;
- const auto& raw = stripe.raw_data;
- Message rotated(raw.size(), 0xAA);
- for (std::uint16_t i = 0; i < w; ++i) {
- for (std::uint16_t j = 0; j < h; ++j) {
- size_t to = (i * h + j) * ScreenConnectorInfo::BytesPerPixel();
- size_t from = (w - (i + 1)) * ScreenConnectorInfo::BytesPerPixel() + s * j;
- CHECK(from < raw.size());
- CHECK(to < rotated.size());
- std::memcpy(&rotated[to], &raw[from], ScreenConnectorInfo::BytesPerPixel());
- }
- }
- std::swap(stripe.x, stripe.y);
- std::swap(stripe.width, stripe.height);
- // The new stride after rotating is the height, as it is not aligned again.
- stripe.stride = stripe.width * ScreenConnectorInfo::BytesPerPixel();
- stripe.raw_data = std::move(rotated);
- stripe.orientation = ScreenOrientation::Landscape;
- return stripe;
-}
-
-bool FrameBufferWatcher::StripeIsDifferentFromPrevious(
- const Stripe& stripe) const {
- return Stripes(stripe.orientation)[stripe.index]->raw_data != stripe.raw_data;
-}
-
-cuttlefish::vnc::StripePtrVec FrameBufferWatcher::StripesNewerThan(
- ScreenOrientation orientation, const SeqNumberVec& seq_numbers) const {
- std::lock_guard<std::mutex> guard(stripes_lock_);
- const auto& stripes = Stripes(orientation);
- CHECK(seq_numbers.size() == stripes.size());
- StripePtrVec new_stripes;
- auto seq_number_it = seq_numbers.begin();
- std::copy_if(stripes.begin(), stripes.end(), std::back_inserter(new_stripes),
- [seq_number_it](const StripePtrVec::value_type& s) mutable {
- return *(seq_number_it++) < s->seq_number;
- });
- return new_stripes;
-}
-
-cuttlefish::vnc::StripePtrVec& FrameBufferWatcher::Stripes(
- ScreenOrientation orientation) {
- return stripes_[static_cast<int>(orientation)];
-}
-
-const cuttlefish::vnc::StripePtrVec& FrameBufferWatcher::Stripes(
- ScreenOrientation orientation) const {
- return stripes_[static_cast<int>(orientation)];
-}
-
-bool FrameBufferWatcher::UpdateMostRecentSeqNumIfStripeIsNew(
- const Stripe& stripe) {
- if (most_recent_identical_stripe_seq_nums_[stripe.index] <=
- stripe.seq_number) {
- most_recent_identical_stripe_seq_nums_[stripe.index] = stripe.seq_number;
- return true;
- }
- return false;
-}
-
-bool FrameBufferWatcher::UpdateStripeIfStripeIsNew(
- const std::shared_ptr<const Stripe>& stripe) {
- std::lock_guard<std::mutex> guard(stripes_lock_);
- if (UpdateMostRecentSeqNumIfStripeIsNew(*stripe)) {
- Stripes(stripe->orientation)[stripe->index] = stripe;
- return true;
- }
- return false;
-}
-
-void FrameBufferWatcher::CompressStripe(JpegCompressor* jpeg_compressor,
- Stripe* stripe) {
- stripe->jpeg_data = jpeg_compressor->Compress(
- stripe->raw_data, bb_->jpeg_quality_level(), 0, 0, stripe->width,
- stripe->height, stripe->stride);
-}
-
-void FrameBufferWatcher::Worker() {
- JpegCompressor jpeg_compressor;
-#ifdef FUZZ_TEST_VNC
- std::default_random_engine e{std::random_device{}()};
- std::uniform_int_distribution<int> random{0, 2};
-#endif
- while (!closed()) {
- auto portrait_stripe = hwcomposer.GetNewStripe();
- if (closed()) {
- break;
- }
- {
- // TODO(haining) use if (with init) and else for c++17 instead of extra
- // scope and continue
- // if (std::lock_guard guard(stripes_lock_); /*condition*/) { }
- std::lock_guard<std::mutex> guard(stripes_lock_);
- if (!StripeIsDifferentFromPrevious(portrait_stripe)) {
- UpdateMostRecentSeqNumIfStripeIsNew(portrait_stripe);
- continue;
- }
- }
- auto seq_num = portrait_stripe.seq_number;
- auto index = portrait_stripe.index;
- auto landscape_stripe = Rotated(portrait_stripe);
- auto stripes = {std::make_shared<Stripe>(std::move(portrait_stripe)),
- std::make_shared<Stripe>(std::move(landscape_stripe))};
- for (auto& stripe : stripes) {
-#ifdef FUZZ_TEST_VNC
- if (random(e)) {
- usleep(10000);
- }
-#endif
- CompressStripe(&jpeg_compressor, stripe.get());
- }
- bool any_new_stripes = false;
- for (auto& stripe : stripes) {
- any_new_stripes = UpdateStripeIfStripeIsNew(stripe) || any_new_stripes;
- }
- if (any_new_stripes) {
- bb_->NewStripeReady(index, seq_num);
- }
- }
-}
-
-int FrameBufferWatcher::StripesPerFrame() {
- return SimulatedHWComposer::NumberOfStripes();
-}
-
-void FrameBufferWatcher::IncClientCount() {
- hwcomposer.ReportClientsConnected();
-}
-
-void FrameBufferWatcher::DecClientCount() {
- // Do nothing
-}
diff --git a/host/frontend/vnc_server/frame_buffer_watcher.h b/host/frontend/vnc_server/frame_buffer_watcher.h
deleted file mode 100644
index 9b559b6..0000000
--- a/host/frontend/vnc_server/frame_buffer_watcher.h
+++ /dev/null
@@ -1,81 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <memory>
-#include <mutex>
-#include <thread>
-#include <utility>
-#include <vector>
-
-#include "common/libs/concurrency/thread_annotations.h"
-#include "host/frontend/vnc_server/blackboard.h"
-#include "host/frontend/vnc_server/jpeg_compressor.h"
-#include "host/frontend/vnc_server/simulated_hw_composer.h"
-#include "host/libs/screen_connector/screen_connector.h"
-
-namespace cuttlefish {
-namespace vnc {
-class FrameBufferWatcher {
- public:
- explicit FrameBufferWatcher(BlackBoard* bb,
- ScreenConnector& screen_connector);
- FrameBufferWatcher(const FrameBufferWatcher&) = delete;
- FrameBufferWatcher& operator=(const FrameBufferWatcher&) = delete;
- ~FrameBufferWatcher();
-
- StripePtrVec StripesNewerThan(ScreenOrientation orientation,
- const SeqNumberVec& seq_num) const;
- void IncClientCount();
- void DecClientCount();
-
- static int StripesPerFrame();
-
- private:
- static Stripe Rotated(Stripe stripe);
-
- bool closed() const;
- bool StripeIsDifferentFromPrevious(const Stripe& stripe) const
- REQUIRES(stripes_lock_);
- // returns true if stripe is still considered new and seq number was updated
- bool UpdateMostRecentSeqNumIfStripeIsNew(const Stripe& stripe)
- REQUIRES(stripes_lock_);
- // returns true if stripe is still considered new and was updated
- bool UpdateStripeIfStripeIsNew(const std::shared_ptr<const Stripe>& stripe)
- EXCLUDES(stripes_lock_);
- // Compresses stripe->raw_data to stripe->jpeg_data
- void CompressStripe(JpegCompressor* jpeg_compressor, Stripe* stripe);
- void Worker();
- void Updater();
-
- StripePtrVec& Stripes(ScreenOrientation orientation) REQUIRES(stripes_lock_);
- const StripePtrVec& Stripes(ScreenOrientation orientation) const
- REQUIRES(stripes_lock_);
-
- std::vector<std::thread> workers_;
- mutable std::mutex stripes_lock_;
- std::array<StripePtrVec, kNumOrientations> stripes_ GUARDED_BY(stripes_lock_);
- SeqNumberVec most_recent_identical_stripe_seq_nums_
- GUARDED_BY(stripes_lock_) = MakeSeqNumberVec();
- mutable std::mutex m_;
- bool closed_ GUARDED_BY(m_){};
- BlackBoard* bb_{};
- SimulatedHWComposer hwcomposer;
-};
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/jpeg_compressor.cpp b/host/frontend/vnc_server/jpeg_compressor.cpp
deleted file mode 100644
index 05013eb..0000000
--- a/host/frontend/vnc_server/jpeg_compressor.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h> // stdio.h must appear before jpeglib.h
-#include <jpeglib.h>
-
-#include <android-base/logging.h>
-#include "host/frontend/vnc_server/jpeg_compressor.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-#include "host/libs/screen_connector/screen_connector.h"
-
-using cuttlefish::vnc::JpegCompressor;
-
-namespace {
-void InitCinfo(jpeg_compress_struct* cinfo, jpeg_error_mgr* err,
- std::uint16_t width, std::uint16_t height, int jpeg_quality) {
- cinfo->err = jpeg_std_error(err);
- jpeg_create_compress(cinfo);
-
- cinfo->image_width = width;
- cinfo->image_height = height;
- cinfo->input_components = cuttlefish::ScreenConnectorInfo::BytesPerPixel();
- cinfo->in_color_space = JCS_EXT_RGBX;
-
- jpeg_set_defaults(cinfo);
- jpeg_set_quality(cinfo, jpeg_quality, true);
-}
-} // namespace
-
-cuttlefish::Message JpegCompressor::Compress(const Message& frame,
- int jpeg_quality, std::uint16_t x,
- std::uint16_t y, std::uint16_t width,
- std::uint16_t height,
- int stride) {
- jpeg_compress_struct cinfo{};
- jpeg_error_mgr err{};
- InitCinfo(&cinfo, &err, width, height, jpeg_quality);
-
- auto* compression_buffer = buffer_.get();
- auto compression_buffer_size = buffer_capacity_;
- jpeg_mem_dest(&cinfo, &compression_buffer, &compression_buffer_size);
- jpeg_start_compress(&cinfo, true);
-
- while (cinfo.next_scanline < cinfo.image_height) {
- auto row = static_cast<JSAMPROW>(const_cast<std::uint8_t*>(
- &frame[(y * stride) +
- (cinfo.next_scanline * stride) +
- (x * cuttlefish::ScreenConnectorInfo::BytesPerPixel())]));
- jpeg_write_scanlines(&cinfo, &row, 1);
- }
- jpeg_finish_compress(&cinfo);
- jpeg_destroy_compress(&cinfo);
-
- UpdateBuffer(compression_buffer, compression_buffer_size);
- return {compression_buffer, compression_buffer + compression_buffer_size};
-}
-
-void JpegCompressor::UpdateBuffer(std::uint8_t* compression_buffer,
- unsigned long compression_buffer_size) {
- if (buffer_.get() != compression_buffer) {
- buffer_capacity_ = compression_buffer_size;
- buffer_.reset(compression_buffer);
- }
-}
diff --git a/host/frontend/vnc_server/jpeg_compressor.h b/host/frontend/vnc_server/jpeg_compressor.h
deleted file mode 100644
index b6ef487..0000000
--- a/host/frontend/vnc_server/jpeg_compressor.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cstdint>
-#include <cstdlib>
-#include <memory>
-
-#include "host/frontend/vnc_server/vnc_utils.h"
-
-namespace cuttlefish {
-namespace vnc {
-
-// libjpeg-turbo with jpeg_mem_dest (using memory as a destination) is funky.
-// If you give it a buffer that is big enough it will use it.
-// If you give it a buffer that is too small, it will allocate a new buffer
-// but will NOT free the buffer you gave it.
-// This class keeps track of the capacity of the working buffer, and frees the
-// old buffer if libjpeg-turbo silently discards it.
-class JpegCompressor {
- public:
- Message Compress(const Message& frame, int jpeg_quality, std::uint16_t x,
- std::uint16_t y, std::uint16_t width, std::uint16_t height,
- int screen_width);
-
- private:
- void UpdateBuffer(std::uint8_t* compression_buffer,
- unsigned long compression_buffer_size);
- struct Freer {
- void operator()(void* p) const { std::free(p); }
- };
-
- std::unique_ptr<std::uint8_t, Freer> buffer_;
- unsigned long buffer_capacity_{};
-};
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/keysyms.h b/host/frontend/vnc_server/keysyms.h
deleted file mode 100644
index ddcc0e4..0000000
--- a/host/frontend/vnc_server/keysyms.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cstdint>
-
-namespace cuttlefish {
-namespace xk {
-
-constexpr uint32_t BackSpace = 0xff08, Tab = 0xff09, Return = 0xff0d,
- Enter = Return, Escape = 0xff1b, MultiKey = 0xff20,
- Insert = 0xff63, Delete = 0xffff, Pause = 0xff13,
- Home = 0xff50, End = 0xff57, PageUp = 0xff55,
- PageDown = 0xff56, Left = 0xff51, Up = 0xff52,
- Right = 0xff53, Down = 0xff54, F1 = 0xffbe, F2 = 0xffbf,
- F3 = 0xffc0, F4 = 0xffc1, F5 = 0xffc2, F6 = 0xffc3,
- F7 = 0xffc4, F8 = 0xffc5, F9 = 0xffc6, F10 = 0xffc7,
- F11 = 0xffc8, F12 = 0xffc9, F13 = 0xffca, F14 = 0xffcb,
- F15 = 0xffcc, F16 = 0xffcd, F17 = 0xffce, F18 = 0xffcf,
- F19 = 0xffd0, F20 = 0xffd1, F21 = 0xffd2, F22 = 0xffd3,
- F23 = 0xffd4, F24 = 0xffd5, ShiftLeft = 0xffe1,
- ShiftRight = 0xffe2, ControlLeft = 0xffe3,
- ControlRight = 0xffe4, MetaLeft = 0xffe7, MetaRight = 0xffe8,
- AltLeft = 0xffe9, AltRight = 0xffea, CapsLock = 0xffe5,
- NumLock = 0xff7f, ScrollLock = 0xff14, Keypad0 = 0xffb0,
- Keypad1 = 0xffb1, Keypad2 = 0xffb2, Keypad3 = 0xffb3,
- Keypad4 = 0xffb4, Keypad5 = 0xffb5, Keypad6 = 0xffb6,
- Keypad7 = 0xffb7, Keypad8 = 0xffb8, Keypad9 = 0xffb9,
- KeypadMultiply = 0xffaa, KeypadSubtract = 0xffad,
- KeypadAdd = 0xffab, KeypadDecimal = 0xffae,
- KeypadEnter = 0xff8d, KeypadDivide = 0xffaf,
- KeypadEqual = 0xffbd, PlusMinus = 0xb1, SysReq = 0xff15,
- LineFeed = 0xff0a, KeypadSeparator = 0xffac, Yen = 0xa5,
- Cancel = 0xff69, Undo = 0xff65, Redo = 0xff66, Find = 0xff68,
- Print = 0xff61, VolumeDown = 0x1008ff11, Mute = 0x1008ff12,
- VolumeUp = 0x1008ff13, Menu = 0xff67,
- VNCMenu = 0xffed; // VNC seems to translate MENU to this
-
-} // namespace xk
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/main.cpp b/host/frontend/vnc_server/main.cpp
deleted file mode 100644
index e036b40..0000000
--- a/host/frontend/vnc_server/main.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <algorithm>
-#include <memory>
-#include <string>
-
-#include <gflags/gflags.h>
-
-#include "host/frontend/vnc_server/simulated_hw_composer.h"
-#include "host/frontend/vnc_server/vnc_server.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-#include "host/libs/config/logging.h"
-#include "host/libs/confui/host_mode_ctrl.h"
-#include "host/libs/confui/host_server.h"
-
-DEFINE_bool(agressive, false, "Whether to use agressive server");
-DEFINE_int32(frame_server_fd, -1, "");
-DEFINE_int32(port, 6444, "Port where to listen for connections");
-
-int main(int argc, char* argv[]) {
- cuttlefish::DefaultSubprocessLogging(argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
-
- auto& host_mode_ctrl = cuttlefish::HostModeCtrl::Get();
- auto screen_connector_ptr = cuttlefish::vnc::ScreenConnector::Get(
- FLAGS_frame_server_fd, host_mode_ctrl);
- auto& screen_connector = *(screen_connector_ptr.get());
-
- // create confirmation UI service, giving host_mode_ctrl and
- // screen_connector
- // keep this singleton object alive until the webRTC process ends
- static auto& host_confui_server =
- cuttlefish::confui::HostServer::Get(host_mode_ctrl, screen_connector);
-
- host_confui_server.Start();
- // lint does not like the spelling of "agressive", so needs NOTYPO
- cuttlefish::vnc::VncServer vnc_server(FLAGS_port, FLAGS_agressive, // NOTYPO
- screen_connector, host_confui_server);
- vnc_server.MainLoop();
-}
diff --git a/host/frontend/vnc_server/mocks.h b/host/frontend/vnc_server/mocks.h
deleted file mode 100644
index e69eb43..0000000
--- a/host/frontend/vnc_server/mocks.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-struct GceFrameBuffer {
- typedef uint32_t Pixel;
-
- static const int kRedShift = 0;
- static const int kRedBits = 8;
- static const int kGreenShift = 8;
- static const int kGreenBits = 8;
- static const int kBlueShift = 16;
- static const int kBlueBits = 8;
- static const int kAlphaShift = 24;
- static const int kAlphaBits = 8;
-};
-
-// Sensors
-struct gce_sensors_message {
- static constexpr const char* const kSensorsHALSocketName = "";
-};
diff --git a/host/frontend/vnc_server/simulated_hw_composer.cpp b/host/frontend/vnc_server/simulated_hw_composer.cpp
deleted file mode 100644
index a02ae4b..0000000
--- a/host/frontend/vnc_server/simulated_hw_composer.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "host/frontend/vnc_server/simulated_hw_composer.h"
-
-#include "host/frontend/vnc_server/vnc_utils.h"
-#include "host/libs/config/cuttlefish_config.h"
-
-using cuttlefish::vnc::SimulatedHWComposer;
-using ScreenConnector = cuttlefish::vnc::ScreenConnector;
-
-SimulatedHWComposer::SimulatedHWComposer(BlackBoard* bb,
- ScreenConnector& screen_connector)
- :
-#ifdef FUZZ_TEST_VNC
- engine_{std::random_device{}()},
-#endif
- bb_{bb},
- stripes_(kMaxQueueElements, &SimulatedHWComposer::EraseHalfOfElements),
- screen_connector_(screen_connector) {
- stripe_maker_ = std::thread(&SimulatedHWComposer::MakeStripes, this);
- screen_connector_.SetCallback(std::move(GetScreenConnectorCallback()));
-}
-
-SimulatedHWComposer::~SimulatedHWComposer() {
- close();
- stripe_maker_.join();
-}
-
-cuttlefish::vnc::Stripe SimulatedHWComposer::GetNewStripe() {
- auto s = stripes_.Pop();
-#ifdef FUZZ_TEST_VNC
- if (random_(engine_)) {
- usleep(7000);
- stripes_.Push(std::move(s));
- s = stripes_.Pop();
- }
-#endif
- return s;
-}
-
-bool SimulatedHWComposer::closed() {
- std::lock_guard<std::mutex> guard(m_);
- return closed_;
-}
-
-void SimulatedHWComposer::close() {
- std::lock_guard<std::mutex> guard(m_);
- closed_ = true;
-}
-
-// Assuming the number of stripes is less than half the size of the queue
-// this will be safe as the newest stripes won't be lost. In the real
-// hwcomposer, where stripes are coming in a different order, the full
-// queue case would probably need a different approach to be safe.
-void SimulatedHWComposer::EraseHalfOfElements(
- ThreadSafeQueue<Stripe>::QueueImpl* q) {
- q->erase(q->begin(), std::next(q->begin(), kMaxQueueElements / 2));
-}
-
-SimulatedHWComposer::GenerateProcessedFrameCallback
-SimulatedHWComposer::GetScreenConnectorCallback() {
- return [](std::uint32_t display_number, std::uint32_t frame_w,
- std::uint32_t frame_h, std::uint32_t frame_stride_bytes,
- std::uint8_t* frame_bytes,
- cuttlefish::vnc::VncScProcessedFrame& processed_frame) {
- processed_frame.display_number_ = display_number;
- // TODO(171305898): handle multiple displays.
- if (display_number != 0) {
- // BUG 186580833: display_number comes from surface_id in crosvm
- // create_surface from virtio_gpu.rs set_scanout. We cannot use it as
- // the display number. Either crosvm virtio-gpu is incorrectly ignoring
- // scanout id and instead using a monotonically increasing surface id
- // number as the scanout resource is replaced over time, or frontend code
- // here is incorrectly assuming surface id == display id.
- display_number = 0;
- }
-
- const std::uint32_t frame_bpp = 4;
- const std::uint32_t frame_size_bytes = frame_h * frame_stride_bytes;
-
- auto& raw_screen = processed_frame.raw_screen_;
- raw_screen.assign(frame_bytes, frame_bytes + frame_size_bytes);
-
- static std::uint32_t next_frame_number = 0;
-
- const auto num_stripes = SimulatedHWComposer::kNumStripes;
- for (int i = 0; i < num_stripes; ++i) {
- std::uint16_t y = (frame_h / num_stripes) * i;
-
- // Last frames on the right and/or bottom handle extra pixels
- // when a screen dimension is not evenly divisible by Frame::kNumSlots.
- std::uint16_t height = frame_h / num_stripes +
- (i + 1 == num_stripes ? frame_h % num_stripes : 0);
- const auto* raw_start = &raw_screen[y * frame_w * frame_bpp];
- const auto* raw_end = raw_start + (height * frame_w * frame_bpp);
- // creating a named object and setting individual data members in order
- // to make klp happy
- // TODO (haining) construct this inside the call when not compiling
- // on klp
- Stripe s{};
- s.index = i;
- s.x = 0;
- s.y = y;
- s.width = frame_w;
- s.stride = frame_stride_bytes;
- s.height = height;
- s.frame_id = next_frame_number++;
- s.raw_data.assign(raw_start, raw_end);
- s.orientation = ScreenOrientation::Portrait;
- processed_frame.stripes_.push_back(std::move(s));
- }
-
- processed_frame.display_number_ = display_number;
- processed_frame.is_success_ = true;
- };
-}
-
-void SimulatedHWComposer::MakeStripes() {
- std::uint64_t stripe_seq_num = 1;
- /*
- * callback should be set before the first WaitForAtLeastOneClientConnection()
- * (b/178504150) and the first OnFrameAfter().
- */
- if (!screen_connector_.IsCallbackSet()) {
- LOG(FATAL) << "ScreenConnector callback hasn't been set before MakeStripes";
- }
- while (!closed()) {
- bb_->WaitForAtLeastOneClientConnection();
- auto sim_hw_processed_frame = screen_connector_.OnNextFrame();
- // sim_hw_processed_frame has display number from the guest
- if (!sim_hw_processed_frame.is_success_) {
- continue;
- }
- while (!sim_hw_processed_frame.stripes_.empty()) {
- /*
- * ScreenConnector that supplies the frames into the queue
- * cannot be aware of stripe_seq_num. The callback was set at the
- * ScreenConnector creation time. ScreenConnector calls the callback
- * function autonomously to make the processed frames to supply the
- * queue with.
- *
- * Besides, ScreenConnector is not VNC specific. Thus, stripe_seq_num,
- * a VNC specific information, is maintained here.
- *
- * OnFrameAfter returns a sim_hw_processed_frame, that contains N consecutive stripes.
- * each stripe s has an invalid seq_number, default-initialzed
- * We set the field properly, and push to the stripes_
- */
- auto& s = sim_hw_processed_frame.stripes_.front();
- stripe_seq_num++;
- s.seq_number = StripeSeqNumber{stripe_seq_num};
- stripes_.Push(std::move(s));
- sim_hw_processed_frame.stripes_.pop_front();
- }
- }
-}
-
-int SimulatedHWComposer::NumberOfStripes() { return kNumStripes; }
-
-void SimulatedHWComposer::ReportClientsConnected() {
- screen_connector_.ReportClientsConnected(true);
-}
diff --git a/host/frontend/vnc_server/simulated_hw_composer.h b/host/frontend/vnc_server/simulated_hw_composer.h
deleted file mode 100644
index 9d62e3e..0000000
--- a/host/frontend/vnc_server/simulated_hw_composer.h
+++ /dev/null
@@ -1,74 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <condition_variable>
-#include <mutex>
-#ifdef FUZZ_TEST_VNC
-#include <random>
-#endif
-#include <thread>
-#include <deque>
-
-#include "common/libs/concurrency/thread_annotations.h"
-#include "common/libs/concurrency/thread_safe_queue.h"
-#include "host/frontend/vnc_server/blackboard.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/screen_connector/screen_connector.h"
-
-namespace cuttlefish {
-namespace vnc {
-class SimulatedHWComposer {
- public:
- using GenerateProcessedFrameCallback = ScreenConnector::GenerateProcessedFrameCallback;
-
- SimulatedHWComposer(BlackBoard* bb, ScreenConnector& screen_connector);
- SimulatedHWComposer(const SimulatedHWComposer&) = delete;
- SimulatedHWComposer& operator=(const SimulatedHWComposer&) = delete;
- ~SimulatedHWComposer();
-
- Stripe GetNewStripe();
-
- void ReportClientsConnected();
-
- // NOTE not constexpr on purpose
- static int NumberOfStripes();
-
- private:
- bool closed();
- void close();
- static void EraseHalfOfElements(ThreadSafeQueue<Stripe>::QueueImpl* q);
- void MakeStripes();
- GenerateProcessedFrameCallback GetScreenConnectorCallback();
-
-#ifdef FUZZ_TEST_VNC
- std::default_random_engine engine_;
- std::uniform_int_distribution<int> random_ =
- std::uniform_int_distribution<int>{0, 2};
-#endif
- static constexpr int kNumStripes = 8;
- constexpr static std::size_t kMaxQueueElements = 64;
- bool closed_ GUARDED_BY(m_){};
- std::mutex m_;
- BlackBoard* bb_{};
- ThreadSafeQueue<Stripe> stripes_;
- std::thread stripe_maker_;
- ScreenConnector& screen_connector_;
-};
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/virtual_inputs.cpp b/host/frontend/vnc_server/virtual_inputs.cpp
deleted file mode 100644
index 4876338..0000000
--- a/host/frontend/vnc_server/virtual_inputs.cpp
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "host/frontend/vnc_server/virtual_inputs.h"
-
-#include <android-base/logging.h>
-#include <android-base/strings.h>
-#include <gflags/gflags.h>
-#include <linux/input.h>
-#include <linux/uinput.h>
-
-#include <cstdint>
-#include <mutex>
-#include <thread>
-#include "keysyms.h"
-
-#include "common/libs/confui/confui.h"
-#include "common/libs/fs/shared_select.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/config/logging.h"
-
-using cuttlefish::vnc::VirtualInputs;
-
-DEFINE_string(touch_fds, "",
- "A list of fds for sockets where to accept touch connections");
-
-DEFINE_int32(keyboard_fd, -1,
- "A fd for a socket where to accept keyboard connections");
-
-DEFINE_bool(write_virtio_input, false,
- "Whether to write the virtio_input struct over the socket");
-
-namespace {
-// Necessary to define here as the virtio_input.h header is not available
-// in the host glibc.
-struct virtio_input_event {
- std::uint16_t type;
- std::uint16_t code;
- std::int32_t value;
-};
-
-void AddKeyMappings(std::map<uint32_t, uint16_t>* key_mapping) {
- (*key_mapping)[cuttlefish::xk::AltLeft] = KEY_LEFTALT;
- (*key_mapping)[cuttlefish::xk::ControlLeft] = KEY_LEFTCTRL;
- (*key_mapping)[cuttlefish::xk::ShiftLeft] = KEY_LEFTSHIFT;
- (*key_mapping)[cuttlefish::xk::AltRight] = KEY_RIGHTALT;
- (*key_mapping)[cuttlefish::xk::ControlRight] = KEY_RIGHTCTRL;
- (*key_mapping)[cuttlefish::xk::ShiftRight] = KEY_RIGHTSHIFT;
- (*key_mapping)[cuttlefish::xk::MetaLeft] = KEY_LEFTMETA;
- (*key_mapping)[cuttlefish::xk::MetaRight] = KEY_RIGHTMETA;
- (*key_mapping)[cuttlefish::xk::MultiKey] = KEY_COMPOSE;
-
- (*key_mapping)[cuttlefish::xk::CapsLock] = KEY_CAPSLOCK;
- (*key_mapping)[cuttlefish::xk::NumLock] = KEY_NUMLOCK;
- (*key_mapping)[cuttlefish::xk::ScrollLock] = KEY_SCROLLLOCK;
-
- (*key_mapping)[cuttlefish::xk::BackSpace] = KEY_BACKSPACE;
- (*key_mapping)[cuttlefish::xk::Tab] = KEY_TAB;
- (*key_mapping)[cuttlefish::xk::Return] = KEY_ENTER;
- (*key_mapping)[cuttlefish::xk::Escape] = KEY_ESC;
-
- (*key_mapping)[' '] = KEY_SPACE;
- (*key_mapping)['!'] = KEY_1;
- (*key_mapping)['"'] = KEY_APOSTROPHE;
- (*key_mapping)['#'] = KEY_3;
- (*key_mapping)['$'] = KEY_4;
- (*key_mapping)['%'] = KEY_5;
- (*key_mapping)['^'] = KEY_6;
- (*key_mapping)['&'] = KEY_7;
- (*key_mapping)['\''] = KEY_APOSTROPHE;
- (*key_mapping)['('] = KEY_9;
- (*key_mapping)[')'] = KEY_0;
- (*key_mapping)['*'] = KEY_8;
- (*key_mapping)['+'] = KEY_EQUAL;
- (*key_mapping)[','] = KEY_COMMA;
- (*key_mapping)['-'] = KEY_MINUS;
- (*key_mapping)['.'] = KEY_DOT;
- (*key_mapping)['/'] = KEY_SLASH;
- (*key_mapping)['0'] = KEY_0;
- (*key_mapping)['1'] = KEY_1;
- (*key_mapping)['2'] = KEY_2;
- (*key_mapping)['3'] = KEY_3;
- (*key_mapping)['4'] = KEY_4;
- (*key_mapping)['5'] = KEY_5;
- (*key_mapping)['6'] = KEY_6;
- (*key_mapping)['7'] = KEY_7;
- (*key_mapping)['8'] = KEY_8;
- (*key_mapping)['9'] = KEY_9;
- (*key_mapping)[':'] = KEY_SEMICOLON;
- (*key_mapping)[';'] = KEY_SEMICOLON;
- (*key_mapping)['<'] = KEY_COMMA;
- (*key_mapping)['='] = KEY_EQUAL;
- (*key_mapping)['>'] = KEY_DOT;
- (*key_mapping)['?'] = KEY_SLASH;
- (*key_mapping)['@'] = KEY_2;
- (*key_mapping)['A'] = KEY_A;
- (*key_mapping)['B'] = KEY_B;
- (*key_mapping)['C'] = KEY_C;
- (*key_mapping)['D'] = KEY_D;
- (*key_mapping)['E'] = KEY_E;
- (*key_mapping)['F'] = KEY_F;
- (*key_mapping)['G'] = KEY_G;
- (*key_mapping)['H'] = KEY_H;
- (*key_mapping)['I'] = KEY_I;
- (*key_mapping)['J'] = KEY_J;
- (*key_mapping)['K'] = KEY_K;
- (*key_mapping)['L'] = KEY_L;
- (*key_mapping)['M'] = KEY_M;
- (*key_mapping)['N'] = KEY_N;
- (*key_mapping)['O'] = KEY_O;
- (*key_mapping)['P'] = KEY_P;
- (*key_mapping)['Q'] = KEY_Q;
- (*key_mapping)['R'] = KEY_R;
- (*key_mapping)['S'] = KEY_S;
- (*key_mapping)['T'] = KEY_T;
- (*key_mapping)['U'] = KEY_U;
- (*key_mapping)['V'] = KEY_V;
- (*key_mapping)['W'] = KEY_W;
- (*key_mapping)['X'] = KEY_X;
- (*key_mapping)['Y'] = KEY_Y;
- (*key_mapping)['Z'] = KEY_Z;
- (*key_mapping)['['] = KEY_LEFTBRACE;
- (*key_mapping)['\\'] = KEY_BACKSLASH;
- (*key_mapping)[']'] = KEY_RIGHTBRACE;
- (*key_mapping)['-'] = KEY_MINUS;
- (*key_mapping)['_'] = KEY_MINUS;
- (*key_mapping)['`'] = KEY_GRAVE;
- (*key_mapping)['a'] = KEY_A;
- (*key_mapping)['b'] = KEY_B;
- (*key_mapping)['c'] = KEY_C;
- (*key_mapping)['d'] = KEY_D;
- (*key_mapping)['e'] = KEY_E;
- (*key_mapping)['f'] = KEY_F;
- (*key_mapping)['g'] = KEY_G;
- (*key_mapping)['h'] = KEY_H;
- (*key_mapping)['i'] = KEY_I;
- (*key_mapping)['j'] = KEY_J;
- (*key_mapping)['k'] = KEY_K;
- (*key_mapping)['l'] = KEY_L;
- (*key_mapping)['m'] = KEY_M;
- (*key_mapping)['n'] = KEY_N;
- (*key_mapping)['o'] = KEY_O;
- (*key_mapping)['p'] = KEY_P;
- (*key_mapping)['q'] = KEY_Q;
- (*key_mapping)['r'] = KEY_R;
- (*key_mapping)['s'] = KEY_S;
- (*key_mapping)['t'] = KEY_T;
- (*key_mapping)['u'] = KEY_U;
- (*key_mapping)['v'] = KEY_V;
- (*key_mapping)['w'] = KEY_W;
- (*key_mapping)['x'] = KEY_X;
- (*key_mapping)['y'] = KEY_Y;
- (*key_mapping)['z'] = KEY_Z;
- (*key_mapping)['{'] = KEY_LEFTBRACE;
- (*key_mapping)['\\'] = KEY_BACKSLASH;
- (*key_mapping)['|'] = KEY_BACKSLASH;
- (*key_mapping)['}'] = KEY_RIGHTBRACE;
- (*key_mapping)['~'] = KEY_GRAVE;
-
- (*key_mapping)[cuttlefish::xk::F1] = KEY_F1;
- (*key_mapping)[cuttlefish::xk::F2] = KEY_F2;
- (*key_mapping)[cuttlefish::xk::F3] = KEY_F3;
- (*key_mapping)[cuttlefish::xk::F4] = KEY_F4;
- (*key_mapping)[cuttlefish::xk::F5] = KEY_F5;
- (*key_mapping)[cuttlefish::xk::F6] = KEY_F6;
- (*key_mapping)[cuttlefish::xk::F7] = KEY_F7;
- (*key_mapping)[cuttlefish::xk::F8] = KEY_F8;
- (*key_mapping)[cuttlefish::xk::F9] = KEY_F9;
- (*key_mapping)[cuttlefish::xk::F10] = KEY_F10;
- (*key_mapping)[cuttlefish::xk::F11] = KEY_F11;
- (*key_mapping)[cuttlefish::xk::F12] = KEY_F12;
- (*key_mapping)[cuttlefish::xk::F13] = KEY_F13;
- (*key_mapping)[cuttlefish::xk::F14] = KEY_F14;
- (*key_mapping)[cuttlefish::xk::F15] = KEY_F15;
- (*key_mapping)[cuttlefish::xk::F16] = KEY_F16;
- (*key_mapping)[cuttlefish::xk::F17] = KEY_F17;
- (*key_mapping)[cuttlefish::xk::F18] = KEY_F18;
- (*key_mapping)[cuttlefish::xk::F19] = KEY_F19;
- (*key_mapping)[cuttlefish::xk::F20] = KEY_F20;
- (*key_mapping)[cuttlefish::xk::F21] = KEY_F21;
- (*key_mapping)[cuttlefish::xk::F22] = KEY_F22;
- (*key_mapping)[cuttlefish::xk::F23] = KEY_F23;
- (*key_mapping)[cuttlefish::xk::F24] = KEY_F24;
-
- (*key_mapping)[cuttlefish::xk::Keypad0] = KEY_KP0;
- (*key_mapping)[cuttlefish::xk::Keypad1] = KEY_KP1;
- (*key_mapping)[cuttlefish::xk::Keypad2] = KEY_KP2;
- (*key_mapping)[cuttlefish::xk::Keypad3] = KEY_KP3;
- (*key_mapping)[cuttlefish::xk::Keypad4] = KEY_KP4;
- (*key_mapping)[cuttlefish::xk::Keypad5] = KEY_KP5;
- (*key_mapping)[cuttlefish::xk::Keypad6] = KEY_KP6;
- (*key_mapping)[cuttlefish::xk::Keypad7] = KEY_KP7;
- (*key_mapping)[cuttlefish::xk::Keypad8] = KEY_KP8;
- (*key_mapping)[cuttlefish::xk::Keypad9] = KEY_KP9;
- (*key_mapping)[cuttlefish::xk::KeypadMultiply] = KEY_KPASTERISK;
- (*key_mapping)[cuttlefish::xk::KeypadSubtract] = KEY_KPMINUS;
- (*key_mapping)[cuttlefish::xk::KeypadAdd] = KEY_KPPLUS;
- (*key_mapping)[cuttlefish::xk::KeypadDecimal] = KEY_KPDOT;
- (*key_mapping)[cuttlefish::xk::KeypadEnter] = KEY_KPENTER;
- (*key_mapping)[cuttlefish::xk::KeypadDivide] = KEY_KPSLASH;
- (*key_mapping)[cuttlefish::xk::KeypadEqual] = KEY_KPEQUAL;
- (*key_mapping)[cuttlefish::xk::PlusMinus] = KEY_KPPLUSMINUS;
-
- (*key_mapping)[cuttlefish::xk::SysReq] = KEY_SYSRQ;
- (*key_mapping)[cuttlefish::xk::LineFeed] = KEY_LINEFEED;
- (*key_mapping)[cuttlefish::xk::Home] = KEY_HOME;
- (*key_mapping)[cuttlefish::xk::Up] = KEY_UP;
- (*key_mapping)[cuttlefish::xk::PageUp] = KEY_PAGEUP;
- (*key_mapping)[cuttlefish::xk::Left] = KEY_LEFT;
- (*key_mapping)[cuttlefish::xk::Right] = KEY_RIGHT;
- (*key_mapping)[cuttlefish::xk::End] = KEY_END;
- (*key_mapping)[cuttlefish::xk::Down] = KEY_DOWN;
- (*key_mapping)[cuttlefish::xk::PageDown] = KEY_PAGEDOWN;
- (*key_mapping)[cuttlefish::xk::Insert] = KEY_INSERT;
- (*key_mapping)[cuttlefish::xk::Delete] = KEY_DELETE;
- (*key_mapping)[cuttlefish::xk::Pause] = KEY_PAUSE;
- (*key_mapping)[cuttlefish::xk::KeypadSeparator] = KEY_KPCOMMA;
- (*key_mapping)[cuttlefish::xk::Yen] = KEY_YEN;
- (*key_mapping)[cuttlefish::xk::Cancel] = KEY_STOP;
- (*key_mapping)[cuttlefish::xk::Redo] = KEY_AGAIN;
- (*key_mapping)[cuttlefish::xk::Undo] = KEY_UNDO;
- (*key_mapping)[cuttlefish::xk::Find] = KEY_FIND;
- (*key_mapping)[cuttlefish::xk::Print] = KEY_PRINT;
- (*key_mapping)[cuttlefish::xk::VolumeDown] = KEY_VOLUMEDOWN;
- (*key_mapping)[cuttlefish::xk::Mute] = KEY_MUTE;
- (*key_mapping)[cuttlefish::xk::VolumeUp] = KEY_VOLUMEUP;
- (*key_mapping)[cuttlefish::xk::Menu] = KEY_MENU;
- (*key_mapping)[cuttlefish::xk::VNCMenu] = KEY_MENU;
-}
-
-void InitInputEvent(struct input_event* evt, uint16_t type, uint16_t code,
- int32_t value) {
- evt->type = type;
- evt->code = code;
- evt->value = value;
-}
-
-} // namespace
-
-class SocketVirtualInputs : public VirtualInputs {
- public:
- SocketVirtualInputs()
- : client_connector_([this]() { ClientConnectorLoop(); }) {}
-
- void GenerateKeyPressEvent(int key_code, bool down) override {
- struct input_event events[2];
- InitInputEvent(&events[0], EV_KEY, keymapping_[key_code], down);
- InitInputEvent(&events[1], EV_SYN, 0, 0);
-
- SendEvents(keyboard_socket_, events);
- }
-
- void PressPowerButton(bool down) override {
- struct input_event events[2];
- InitInputEvent(&events[0], EV_KEY, KEY_POWER, down);
- InitInputEvent(&events[1], EV_SYN, 0, 0);
-
- SendEvents(keyboard_socket_, events);
- }
-
- void HandlePointerEvent(bool touch_down, int x, int y) override {
- // TODO(b/124121375): Use multitouch when available
- struct input_event events[4];
- InitInputEvent(&events[0], EV_ABS, ABS_X, x);
- InitInputEvent(&events[1], EV_ABS, ABS_Y, y);
- InitInputEvent(&events[2], EV_KEY, BTN_TOUCH, touch_down);
- InitInputEvent(&events[3], EV_SYN, 0, 0);
-
- SendEvents(touch_socket_, events);
- }
-
- private:
- template<size_t num_events>
- void SendEvents(cuttlefish::SharedFD socket, struct input_event (&event_buffer)[num_events]) {
- std::lock_guard<std::mutex> lock(socket_mutex_);
- if (!socket->IsOpen()) {
- // This is unlikely as it would only happen between the start of the vnc
- // server and the connection of the VMM to the socket.
- // If it happens, just drop the events as the VM is not yet ready to
- // handle it.
- return;
- }
-
- if (FLAGS_write_virtio_input) {
- struct virtio_input_event virtio_events[num_events];
- for (size_t i = 0; i < num_events; i++) {
- virtio_events[i] = (struct virtio_input_event) {
- .type = event_buffer[i].type,
- .code = event_buffer[i].code,
- .value = event_buffer[i].value,
- };
- }
- auto ret = socket->Write(virtio_events, sizeof(virtio_events));
- if (ret < 0) {
- LOG(ERROR) << "Error sending input events: " << socket->StrError();
- }
- } else {
- auto ret = socket->Write(event_buffer, sizeof(event_buffer));
- if (ret < 0) {
- LOG(ERROR) << "Error sending input events: " << socket->StrError();
- }
- }
- }
-
- void ClientConnectorLoop() {
- auto touch_fd =
- std::stoi(android::base::Split(FLAGS_touch_fds, ",").front());
- auto touch_server = cuttlefish::SharedFD::Dup(touch_fd);
- close(touch_fd);
-
- auto keyboard_server = cuttlefish::SharedFD::Dup(FLAGS_keyboard_fd);
- close(FLAGS_keyboard_fd);
- FLAGS_keyboard_fd = -1;
- LOG(DEBUG) << "Input socket host accepting connections...";
-
- while (1) {
- cuttlefish::SharedFDSet read_set;
- read_set.Set(touch_server);
- read_set.Set(keyboard_server);
- cuttlefish::Select(&read_set, nullptr, nullptr, nullptr);
- {
- std::lock_guard<std::mutex> lock(socket_mutex_);
- if (read_set.IsSet(touch_server)) {
- touch_socket_ = cuttlefish::SharedFD::Accept(*touch_server);
- LOG(DEBUG) << "connected to touch";
- }
- if (read_set.IsSet(keyboard_server)) {
- keyboard_socket_ = cuttlefish::SharedFD::Accept(*keyboard_server);
- LOG(DEBUG) << "connected to keyboard";
- }
- }
- }
- }
- cuttlefish::SharedFD touch_socket_;
- cuttlefish::SharedFD keyboard_socket_;
- std::thread client_connector_;
- std::mutex socket_mutex_;
-};
-
-VirtualInputs::VirtualInputs() { AddKeyMappings(&keymapping_); }
-
-/**
- * Depending on the host mode (e.g. android, confirmation ui(tee), etc)
- * deliver the inputs to the right input implementation
- * e.g. ConfUI's input or regular socket based input
- */
-class VirtualInputDemux : public VirtualInputs {
- public:
- VirtualInputDemux(cuttlefish::confui::HostVirtualInput& confui_input)
- : confui_input_{confui_input} {}
- virtual ~VirtualInputDemux() = default;
-
- virtual void GenerateKeyPressEvent(int code, bool down) override;
- virtual void PressPowerButton(bool down) override;
- virtual void HandlePointerEvent(bool touch_down, int x, int y) override;
-
- private:
- SocketVirtualInputs socket_virtual_input_;
- cuttlefish::confui::HostVirtualInput& confui_input_;
-};
-
-void VirtualInputDemux::GenerateKeyPressEvent(int code, bool down) {
- // confui input is active only in the confirmation UI
- // also, socket virtual input should be inactive in the confirmation
- // UI session
- if (confui_input_.IsConfUiActive()) {
- if (code == cuttlefish::xk::Menu) {
- // release menu button in confirmation UI means for now cancel
- confui_input_.PressCancelButton(down);
- }
- ConfUiLog(DEBUG) << "the key" << code << "ignored."
- << "currently confirmation UI handles"
- << "menu and power only.";
- return;
- }
- socket_virtual_input_.GenerateKeyPressEvent(code, down);
-}
-
-void VirtualInputDemux::PressPowerButton(bool down) {
- if (confui_input_.IsConfUiActive()) {
- confui_input_.PressConfirmButton(down);
- return;
- }
- socket_virtual_input_.PressPowerButton(down);
-}
-
-void VirtualInputDemux::HandlePointerEvent(bool touch_down, int x, int y) {
- if (confui_input_.IsConfUiActive()) {
- ConfUiLog(DEBUG) << "currently confirmation UI ignores pointer events at ("
- << x << ", " << y << ")";
- return;
- }
- socket_virtual_input_.HandlePointerEvent(touch_down, x, y);
-}
-
-std::shared_ptr<VirtualInputs> VirtualInputs::Get(
- cuttlefish::confui::HostVirtualInput& confui_input) {
- return std::make_shared<VirtualInputDemux>(confui_input);
-}
diff --git a/host/frontend/vnc_server/virtual_inputs.h b/host/frontend/vnc_server/virtual_inputs.h
deleted file mode 100644
index f30202e..0000000
--- a/host/frontend/vnc_server/virtual_inputs.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <map>
-#include <memory>
-#include <mutex>
-
-#include "host/libs/confui/host_virtual_input.h"
-#include "vnc_utils.h"
-
-namespace cuttlefish {
-namespace vnc {
-
-class VirtualInputs {
- public:
- static std::shared_ptr<VirtualInputs> Get(
- cuttlefish::confui::HostVirtualInput& confui_input);
-
- virtual ~VirtualInputs() = default;
-
- virtual void GenerateKeyPressEvent(int code, bool down) = 0;
- virtual void PressPowerButton(bool down) = 0;
- virtual void HandlePointerEvent(bool touch_down, int x, int y) = 0;
-
- protected:
- VirtualInputs();
-
- std::map<uint32_t, uint16_t> keymapping_;
-};
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/vnc_client_connection.cpp b/host/frontend/vnc_server/vnc_client_connection.cpp
deleted file mode 100644
index ce16ec8..0000000
--- a/host/frontend/vnc_server/vnc_client_connection.cpp
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "host/frontend/vnc_server/vnc_client_connection.h"
-
-#include <netinet/in.h>
-#include <sys/time.h>
-
-#include <algorithm>
-#include <cmath>
-#include <cstdint>
-#include <cstring>
-#include <memory>
-#include <mutex>
-#include <string>
-#include <thread>
-#include <utility>
-#include <vector>
-
-#include <gflags/gflags.h>
-#include <android-base/logging.h>
-#include "common/libs/utils/tcp_socket.h"
-#include "host/frontend/vnc_server/keysyms.h"
-#include "host/frontend/vnc_server/mocks.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/screen_connector/screen_connector.h"
-
-using cuttlefish::Message;
-using cuttlefish::vnc::Stripe;
-using cuttlefish::vnc::StripePtrVec;
-using cuttlefish::vnc::VncClientConnection;
-
-struct ScreenRegionView {
- using Pixel = uint32_t;
- static constexpr int kSwiftShaderPadding = 4;
- static constexpr int kRedShift = 0;
- static constexpr int kGreenShift = 8;
- static constexpr int kBlueShift = 16;
- static constexpr int kRedBits = 8;
- static constexpr int kGreenBits = 8;
- static constexpr int kBlueBits = 8;
-};
-
-DEFINE_bool(debug_client, false, "Turn on detailed logging for the client");
-
-#define DLOG(LEVEL) \
- if (FLAGS_debug_client) LOG(LEVEL)
-
-namespace {
-class BigEndianChecker {
- public:
- BigEndianChecker() {
- uint32_t u = 1;
- is_big_endian_ = *reinterpret_cast<const char*>(&u) == 0;
- }
- bool operator()() const { return is_big_endian_; }
-
- private:
- bool is_big_endian_{};
-};
-
-const BigEndianChecker ImBigEndian;
-
-constexpr int32_t kDesktopSizeEncoding = -223;
-constexpr int32_t kTightEncoding = 7;
-
-// These are the lengths not counting the first byte. The first byte
-// indicates the message type.
-constexpr size_t kSetPixelFormatLength = 19;
-constexpr size_t kFramebufferUpdateRequestLength = 9;
-constexpr size_t kSetEncodingsLength = 3; // more bytes follow
-constexpr size_t kKeyEventLength = 7;
-constexpr size_t kPointerEventLength = 5;
-constexpr size_t kClientCutTextLength = 7; // more bytes follow
-
-std::string HostName() {
- auto config = cuttlefish::CuttlefishConfig::Get();
- auto instance = config->ForDefaultInstance();
- return !config || instance.device_title().empty() ? std::string{"localhost"}
- : instance.device_title();
-}
-
-std::uint16_t uint16_tAt(const void* p) {
- std::uint16_t u{};
- std::memcpy(&u, p, sizeof u);
- return ntohs(u);
-}
-
-std::uint32_t uint32_tAt(const void* p) {
- std::uint32_t u{};
- std::memcpy(&u, p, sizeof u);
- return ntohl(u);
-}
-
-std::int32_t int32_tAt(const void* p) {
- std::uint32_t u{};
- std::memcpy(&u, p, sizeof u);
- u = ntohl(u);
- std::int32_t s{};
- std::memcpy(&s, &u, sizeof s);
- return s;
-}
-
-std::uint32_t RedVal(std::uint32_t pixel) {
- return (pixel >> ScreenRegionView::kRedShift) &
- ((0x1 << ScreenRegionView::kRedBits) - 1);
-}
-
-std::uint32_t BlueVal(std::uint32_t pixel) {
- return (pixel >> ScreenRegionView::kBlueShift) &
- ((0x1 << ScreenRegionView::kBlueBits) - 1);
-}
-
-std::uint32_t GreenVal(std::uint32_t pixel) {
- return (pixel >> ScreenRegionView::kGreenShift) &
- ((0x1 << ScreenRegionView::kGreenBits) - 1);
-}
-} // namespace
-namespace cuttlefish {
-namespace vnc {
-bool operator==(const VncClientConnection::FrameBufferUpdateRequest& lhs,
- const VncClientConnection::FrameBufferUpdateRequest& rhs) {
- return lhs.x_pos == rhs.x_pos && lhs.y_pos == rhs.y_pos &&
- lhs.width == rhs.width && lhs.height == rhs.height;
-}
-
-bool operator!=(const VncClientConnection::FrameBufferUpdateRequest& lhs,
- const VncClientConnection::FrameBufferUpdateRequest& rhs) {
- return !(lhs == rhs);
-}
-} // namespace vnc
-} // namespace cuttlefish
-
-VncClientConnection::VncClientConnection(
- ClientSocket client, std::shared_ptr<VirtualInputs> virtual_inputs,
- BlackBoard* bb, bool aggressive)
- : client_{std::move(client)}, virtual_inputs_{virtual_inputs}, bb_{bb} {
- frame_buffer_request_handler_tid_ = std::thread(
- &VncClientConnection::FrameBufferUpdateRequestHandler, this, aggressive);
-}
-
-VncClientConnection::~VncClientConnection() {
- {
- std::lock_guard<std::mutex> guard(m_);
- closed_ = true;
- }
- bb_->StopWaiting(this);
- frame_buffer_request_handler_tid_.join();
-}
-
-void VncClientConnection::StartSession() {
- LOG(INFO) << "Starting session";
- SetupProtocol();
- LOG(INFO) << "Protocol set up";
- if (client_.closed()) {
- return;
- }
- SetupSecurityType();
- LOG(INFO) << "Security type set";
- if (client_.closed()) {
- return;
- }
- GetClientInit();
- LOG(INFO) << "Gotten client init";
- if (client_.closed()) {
- return;
- }
- SendServerInit();
- LOG(INFO) << "Sent server init";
- if (client_.closed()) {
- return;
- }
- NormalSession();
- LOG(INFO) << "vnc session terminated";
-}
-
-bool VncClientConnection::closed() {
- std::lock_guard<std::mutex> guard(m_);
- return closed_;
-}
-
-void VncClientConnection::SetupProtocol() {
- static constexpr char kRFBVersion[] = "RFB 003.008\n";
- static constexpr char kRFBVersionOld[] = "RFB 003.003\n";
- static constexpr auto kVersionLen = (sizeof kRFBVersion) - 1;
- client_.SendNoSignal(reinterpret_cast<const std::uint8_t*>(kRFBVersion),
- kVersionLen);
- auto client_protocol = client_.Recv(kVersionLen);
- if (std::memcmp(&client_protocol[0], kRFBVersion,
- std::min(kVersionLen, client_protocol.size())) != 0) {
- if (!std::memcmp(
- &client_protocol[0],
- kRFBVersionOld,
- std::min(kVersionLen, client_protocol.size()))) {
- // We'll deal with V3.3 as well.
- client_is_old_ = true;
- return;
- }
-
- client_protocol.push_back('\0');
- LOG(ERROR) << "vnc client wants a different protocol: "
- << reinterpret_cast<const char*>(&client_protocol[0]);
- }
-}
-
-void VncClientConnection::SetupSecurityType() {
- if (client_is_old_) {
- static constexpr std::uint8_t kVNCSecurity[4] = { 0x00, 0x00, 0x00, 0x02 };
- client_.SendNoSignal(kVNCSecurity);
-
- static constexpr std::uint8_t kChallenge[16] =
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
- client_.SendNoSignal(kChallenge);
-
- auto clientResponse = client_.Recv(16);
- (void)clientResponse; // Accept any response, we're not interested in actual security.
-
- static constexpr std::uint8_t kSuccess[4] = { 0x00, 0x00, 0x00, 0x00 };
- client_.SendNoSignal(kSuccess);
- return;
- }
-
- static constexpr std::uint8_t kNoneSecurity = 0x1;
- // The first '0x1' indicates the number of items that follow
- static constexpr std::uint8_t kOnlyNoneSecurity[] = {0x01, kNoneSecurity};
- client_.SendNoSignal(kOnlyNoneSecurity);
- auto client_security = client_.Recv(1);
- if (client_.closed()) {
- return;
- }
- if (client_security.front() != kNoneSecurity) {
- LOG(ERROR) << "vnc client is asking for security type "
- << static_cast<int>(client_security.front());
- }
- static constexpr std::uint8_t kZero[4] = {};
- client_.SendNoSignal(kZero);
-}
-
-void VncClientConnection::GetClientInit() {
- auto client_shared = client_.Recv(1);
-}
-
-void VncClientConnection::SendServerInit() {
- const std::string server_name = HostName();
- std::lock_guard<std::mutex> guard(m_);
- auto server_init = cuttlefish::CreateMessage(
- static_cast<std::uint16_t>(ScreenWidth()),
- static_cast<std::uint16_t>(ScreenHeight()), pixel_format_.bits_per_pixel,
- pixel_format_.depth, pixel_format_.big_endian, pixel_format_.true_color,
- pixel_format_.red_max, pixel_format_.green_max, pixel_format_.blue_max,
- pixel_format_.red_shift, pixel_format_.green_shift,
- pixel_format_.blue_shift, std::uint16_t{}, // padding
- std::uint8_t{}, // padding
- static_cast<std::uint32_t>(server_name.size()), server_name);
- client_.SendNoSignal(server_init);
-}
-
-Message VncClientConnection::MakeFrameBufferUpdateHeader(
- std::uint16_t num_stripes) {
- return cuttlefish::CreateMessage(std::uint8_t{0}, // message-type
- std::uint8_t{}, // padding
- std::uint16_t{num_stripes});
-}
-
-void VncClientConnection::AppendRawStripeHeader(Message* frame_buffer_update,
- const Stripe& stripe) {
- static constexpr int32_t kRawEncoding = 0;
- cuttlefish::AppendToMessage(frame_buffer_update, std::uint16_t{stripe.x},
- std::uint16_t{stripe.y}, std::uint16_t{stripe.width},
- std::uint16_t{stripe.height}, kRawEncoding);
-}
-
-void VncClientConnection::AppendJpegSize(Message* frame_buffer_update,
- size_t jpeg_size) {
- constexpr size_t kJpegSizeOneByteMax = 127;
- constexpr size_t kJpegSizeTwoByteMax = 16383;
- constexpr size_t kJpegSizeThreeByteMax = 4194303;
-
- if (jpeg_size <= kJpegSizeOneByteMax) {
- cuttlefish::AppendToMessage(frame_buffer_update,
- static_cast<std::uint8_t>(jpeg_size));
- } else if (jpeg_size <= kJpegSizeTwoByteMax) {
- auto sz = static_cast<std::uint32_t>(jpeg_size);
- cuttlefish::AppendToMessage(frame_buffer_update,
- static_cast<std::uint8_t>((sz & 0x7F) | 0x80),
- static_cast<std::uint8_t>((sz >> 7) & 0xFF));
- } else {
- if (jpeg_size > kJpegSizeThreeByteMax) {
- LOG(FATAL) << "jpeg size is too big: " << jpeg_size << " must be under "
- << kJpegSizeThreeByteMax;
- }
- const auto sz = static_cast<std::uint32_t>(jpeg_size);
- cuttlefish::AppendToMessage(frame_buffer_update,
- static_cast<std::uint8_t>((sz & 0x7F) | 0x80),
- static_cast<std::uint8_t>(((sz >> 7) & 0x7F) | 0x80),
- static_cast<std::uint8_t>((sz >> 14) & 0xFF));
- }
-}
-
-void VncClientConnection::AppendRawStripe(Message* frame_buffer_update,
- const Stripe& stripe) const {
- using Pixel = ScreenRegionView::Pixel;
- auto& fbu = *frame_buffer_update;
- AppendRawStripeHeader(&fbu, stripe);
- auto init_size = fbu.size();
- fbu.insert(fbu.end(), stripe.raw_data.begin(), stripe.raw_data.end());
- for (size_t i = init_size; i < fbu.size(); i += sizeof(Pixel)) {
- CHECK_LE(i + sizeof(Pixel), fbu.size());
- Pixel raw_pixel{};
- std::memcpy(&raw_pixel, &fbu[i], sizeof raw_pixel);
- auto red = RedVal(raw_pixel);
- auto green = GreenVal(raw_pixel);
- auto blue = BlueVal(raw_pixel);
- Pixel pixel = Pixel{red} << pixel_format_.red_shift |
- Pixel{blue} << pixel_format_.blue_shift |
- Pixel{green} << pixel_format_.green_shift;
-
- if (bool(pixel_format_.big_endian) != ImBigEndian()) {
- // flip them bits (refactor into function)
- auto p = reinterpret_cast<char*>(&pixel);
- std::swap(p[0], p[3]);
- std::swap(p[1], p[2]);
- }
- std::memcpy(&fbu[i], &pixel, sizeof pixel);
- }
-}
-
-Message VncClientConnection::MakeRawFrameBufferUpdate(
- const StripePtrVec& stripes) const {
- auto fbu =
- MakeFrameBufferUpdateHeader(static_cast<std::uint16_t>(stripes.size()));
- for (auto& stripe : stripes) {
- AppendRawStripe(&fbu, *stripe);
- }
- return fbu;
-}
-
-void VncClientConnection::AppendJpegStripeHeader(Message* frame_buffer_update,
- const Stripe& stripe) {
- static constexpr std::uint8_t kJpegEncoding = 0x90;
- cuttlefish::AppendToMessage(frame_buffer_update, stripe.x, stripe.y, stripe.width,
- stripe.height, kTightEncoding, kJpegEncoding);
- AppendJpegSize(frame_buffer_update, stripe.jpeg_data.size());
-}
-
-void VncClientConnection::AppendJpegStripe(Message* frame_buffer_update,
- const Stripe& stripe) {
- AppendJpegStripeHeader(frame_buffer_update, stripe);
- frame_buffer_update->insert(frame_buffer_update->end(),
- stripe.jpeg_data.begin(), stripe.jpeg_data.end());
-}
-
-Message VncClientConnection::MakeJpegFrameBufferUpdate(
- const StripePtrVec& stripes) {
- auto fbu =
- MakeFrameBufferUpdateHeader(static_cast<std::uint16_t>(stripes.size()));
- for (auto& stripe : stripes) {
- AppendJpegStripe(&fbu, *stripe);
- }
- return fbu;
-}
-
-Message VncClientConnection::MakeFrameBufferUpdate(
- const StripePtrVec& stripes) {
- return use_jpeg_compression_ ? MakeJpegFrameBufferUpdate(stripes)
- : MakeRawFrameBufferUpdate(stripes);
-}
-
-void VncClientConnection::FrameBufferUpdateRequestHandler(bool aggressive) {
- BlackBoard::Registerer reg(bb_, this);
-
- while (!closed()) {
- auto stripes = bb_->WaitForSenderWork(this);
- if (closed()) {
- break;
- }
- if (stripes.empty()) {
- LOG(FATAL) << "Got 0 stripes";
- }
- {
- // lock here so a portrait frame can't be sent after a landscape
- // DesktopSize update, or vice versa.
- std::lock_guard<std::mutex> guard(m_);
- DLOG(INFO) << "Sending update in "
- << (current_orientation_ == ScreenOrientation::Portrait
- ? "portrait"
- : "landscape")
- << " mode";
- client_.SendNoSignal(MakeFrameBufferUpdate(stripes));
- }
- if (aggressive) {
- bb_->FrameBufferUpdateRequestReceived(this);
- }
- }
-}
-
-void VncClientConnection::SendDesktopSizeUpdate() {
- static constexpr int32_t kDesktopSizeEncoding = -223;
- client_.SendNoSignal(cuttlefish::CreateMessage(
- std::uint8_t{0}, // message-type,
- std::uint8_t{}, // padding
- std::uint16_t{1}, // one pseudo rectangle
- std::uint16_t{0}, std::uint16_t{0},
- static_cast<std::uint16_t>(ScreenWidth()),
- static_cast<std::uint16_t>(ScreenHeight()), kDesktopSizeEncoding));
-}
-
-bool VncClientConnection::IsUrgent(
- const FrameBufferUpdateRequest& update_request) const {
- return !update_request.incremental ||
- update_request != previous_update_request_;
-}
-
-void VncClientConnection::HandleFramebufferUpdateRequest() {
- auto msg = client_.Recv(kFramebufferUpdateRequestLength);
- if (msg.size() != kFramebufferUpdateRequestLength) {
- return;
- }
- FrameBufferUpdateRequest fbur{msg[1] == 0, uint16_tAt(&msg[1]),
- uint16_tAt(&msg[3]), uint16_tAt(&msg[5]),
- uint16_tAt(&msg[7])};
- if (IsUrgent(fbur)) {
- bb_->SignalClientNeedsEntireScreen(this);
- }
- bb_->FrameBufferUpdateRequestReceived(this);
- previous_update_request_ = fbur;
-}
-
-void VncClientConnection::HandleSetEncodings() {
- auto msg = client_.Recv(kSetEncodingsLength);
- if (msg.size() != kSetEncodingsLength) {
- return;
- }
- auto count = uint16_tAt(&msg[1]);
- auto encodings = client_.Recv(count * sizeof(int32_t));
- if (encodings.size() % sizeof(int32_t) != 0) {
- return;
- }
- {
- std::lock_guard<std::mutex> guard(m_);
- use_jpeg_compression_ = false;
- }
- for (size_t i = 0; i < encodings.size(); i += sizeof(int32_t)) {
- auto enc = int32_tAt(&encodings[i]);
- DLOG(INFO) << "client requesting encoding: " << enc;
- if (enc == kTightEncoding) {
- // This is a deviation from the spec which says that if a jpeg quality
- // level is not specified, tight encoding won't use jpeg.
- std::lock_guard<std::mutex> guard(m_);
- use_jpeg_compression_ = true;
- }
- if (kJpegMinQualityEncoding <= enc && enc <= kJpegMaxQualityEncoding) {
- DLOG(INFO) << "jpeg compression level: " << enc;
- bb_->set_jpeg_quality_level(enc);
- }
- if (enc == kDesktopSizeEncoding) {
- supports_desktop_size_encoding_ = true;
- }
- }
-}
-
-void VncClientConnection::HandleSetPixelFormat() {
- std::lock_guard<std::mutex> guard(m_);
- auto msg = client_.Recv(kSetPixelFormatLength);
- if (msg.size() != kSetPixelFormatLength) {
- return;
- }
- pixel_format_.bits_per_pixel = msg[3];
- pixel_format_.depth = msg[4];
- pixel_format_.big_endian = msg[5];
- pixel_format_.true_color = msg[7];
- pixel_format_.red_max = uint16_tAt(&msg[8]);
- pixel_format_.green_max = uint16_tAt(&msg[10]);
- pixel_format_.blue_max = uint16_tAt(&msg[12]);
- pixel_format_.red_shift = msg[13];
- pixel_format_.green_shift = msg[14];
- pixel_format_.blue_shift = msg[15];
-}
-
-void VncClientConnection::HandlePointerEvent() {
- auto msg = client_.Recv(kPointerEventLength);
- if (msg.size() != kPointerEventLength) {
- return;
- }
- std::uint8_t button_mask = msg[0];
- auto x_pos = uint16_tAt(&msg[1]);
- auto y_pos = uint16_tAt(&msg[3]);
- {
- std::lock_guard<std::mutex> guard(m_);
- if (current_orientation_ == ScreenOrientation::Landscape) {
- std::tie(x_pos, y_pos) =
- std::make_pair(ScreenConnectorInfo::ScreenWidth(0) - y_pos, x_pos);
- }
- }
- virtual_inputs_->HandlePointerEvent(button_mask, x_pos, y_pos);
-}
-
-void VncClientConnection::UpdateAccelerometer(float /*x*/, float /*y*/,
- float /*z*/) {
- // TODO(jemoreira): Implement when vsoc sensor hal is updated
-}
-
-VncClientConnection::Coordinates VncClientConnection::CoordinatesForOrientation(
- ScreenOrientation orientation) const {
- // Compute the acceleration vector that we need to send to mimic
- // this change.
- constexpr float g = 9.81;
- constexpr float angle = 20.0;
- const float cos_angle = std::cos(angle / M_PI);
- const float sin_angle = std::sin(angle / M_PI);
- const float z = g * sin_angle;
- switch (orientation) {
- case ScreenOrientation::Portrait:
- return {0, g * cos_angle, z};
- case ScreenOrientation::Landscape:
- return {g * cos_angle, 0, z};
- }
-}
-
-int VncClientConnection::ScreenWidth() const {
- return current_orientation_ == ScreenOrientation::Portrait
- ? ScreenConnectorInfo::ScreenWidth(0)
- : ScreenConnectorInfo::ScreenHeight(0);
-}
-
-int VncClientConnection::ScreenHeight() const {
- return current_orientation_ == ScreenOrientation::Portrait
- ? ScreenConnectorInfo::ScreenHeight(0)
- : ScreenConnectorInfo::ScreenWidth(0);
-}
-
-void VncClientConnection::SetScreenOrientation(ScreenOrientation orientation) {
- std::lock_guard<std::mutex> guard(m_);
- auto coords = CoordinatesForOrientation(orientation);
- UpdateAccelerometer(coords.x, coords.y, coords.z);
- if (supports_desktop_size_encoding_) {
- auto previous_orientation = current_orientation_;
- current_orientation_ = orientation;
- if (current_orientation_ != previous_orientation &&
- supports_desktop_size_encoding_) {
- SendDesktopSizeUpdate();
- bb_->SetOrientation(this, current_orientation_);
- // TODO not sure if I should be sending a frame update along with this,
- // or just letting the next FBUR handle it. This seems to me like it's
- // sending one more frame buffer update than was requested, which is
- // maybe a violation of the spec?
- }
- }
-}
-
-bool VncClientConnection::RotateIfIsRotationCommand(std::uint32_t key) {
- // Due to different configurations on different platforms we're supporting
- // a set of options for rotating the screen. These are similar to what
- // the emulator supports and has supported.
- // ctrl+left and ctrl+right work on windows and linux
- // command+left and command+right work on Mac
- // ctrl+fn+F11 and ctrl+fn+F12 work when chromoting to ubuntu from a Mac
- if (!control_key_down_ && !meta_key_down_) {
- return false;
- }
- switch (key) {
- case cuttlefish::xk::Right:
- case cuttlefish::xk::F12:
- DLOG(INFO) << "switching to portrait";
- SetScreenOrientation(ScreenOrientation::Portrait);
- break;
- case cuttlefish::xk::Left:
- case cuttlefish::xk::F11:
- DLOG(INFO) << "switching to landscape";
- SetScreenOrientation(ScreenOrientation::Landscape);
- break;
- default:
- return false;
- }
- return true;
-}
-
-void VncClientConnection::HandleKeyEvent() {
- auto msg = client_.Recv(kKeyEventLength);
- if (msg.size() != kKeyEventLength) {
- return;
- }
-
- auto key = uint32_tAt(&msg[3]);
- bool key_down = msg[0];
- switch (key) {
- case cuttlefish::xk::ControlLeft:
- case cuttlefish::xk::ControlRight:
- control_key_down_ = key_down;
- break;
- case cuttlefish::xk::MetaLeft:
- case cuttlefish::xk::MetaRight:
- meta_key_down_ = key_down;
- break;
- case cuttlefish::xk::F5:
- key = cuttlefish::xk::Menu;
- break;
- case cuttlefish::xk::F7:
- virtual_inputs_->PressPowerButton(key_down);
- return;
- default:
- break;
- }
-
- if (RotateIfIsRotationCommand(key)) {
- return;
- }
-
- virtual_inputs_->GenerateKeyPressEvent(key, key_down);
-}
-
-void VncClientConnection::HandleClientCutText() {
- auto msg = client_.Recv(kClientCutTextLength);
- if (msg.size() != kClientCutTextLength) {
- return;
- }
- auto len = uint32_tAt(&msg[3]);
- client_.Recv(len);
-}
-
-void VncClientConnection::NormalSession() {
- static constexpr std::uint8_t kSetPixelFormatMessage{0};
- static constexpr std::uint8_t kSetEncodingsMessage{2};
- static constexpr std::uint8_t kFramebufferUpdateRequestMessage{3};
- static constexpr std::uint8_t kKeyEventMessage{4};
- static constexpr std::uint8_t kPointerEventMessage{5};
- static constexpr std::uint8_t kClientCutTextMessage{6};
- while (true) {
- if (client_.closed()) {
- return;
- }
- auto msg = client_.Recv(1);
- if (client_.closed()) {
- return;
- }
- auto msg_type = msg.front();
- DLOG(INFO) << "Received message type " << msg_type;
-
- switch (msg_type) {
- case kSetPixelFormatMessage:
- HandleSetPixelFormat();
- break;
-
- case kSetEncodingsMessage:
- HandleSetEncodings();
- break;
-
- case kFramebufferUpdateRequestMessage:
- HandleFramebufferUpdateRequest();
- break;
-
- case kKeyEventMessage:
- HandleKeyEvent();
- break;
-
- case kPointerEventMessage:
- HandlePointerEvent();
- break;
-
- case kClientCutTextMessage:
- HandleClientCutText();
- break;
-
- default:
- LOG(WARNING) << "message type not handled: "
- << static_cast<int>(msg_type);
- break;
- }
- }
-}
diff --git a/host/frontend/vnc_server/vnc_client_connection.h b/host/frontend/vnc_server/vnc_client_connection.h
deleted file mode 100644
index b26cf86..0000000
--- a/host/frontend/vnc_server/vnc_client_connection.h
+++ /dev/null
@@ -1,173 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "common/libs/concurrency/thread_annotations.h"
-#include "common/libs/fs/shared_fd.h"
-
-#include <cstdint>
-#include <memory>
-#include <mutex>
-#include <thread>
-#include <vector>
-
-#include "common/libs/utils/tcp_socket.h"
-#include "host/frontend/vnc_server/blackboard.h"
-#include "host/frontend/vnc_server/virtual_inputs.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-
-namespace cuttlefish {
-namespace vnc {
-
-class VncClientConnection {
- public:
- VncClientConnection(ClientSocket client,
- std::shared_ptr<VirtualInputs> virtual_inputs,
- BlackBoard* bb, bool aggressive);
- VncClientConnection(const VncClientConnection&) = delete;
- VncClientConnection& operator=(const VncClientConnection&) = delete;
- ~VncClientConnection();
-
- void StartSession();
-
- private:
- struct PixelFormat {
- std::uint8_t bits_per_pixel;
- std::uint8_t depth;
- std::uint8_t big_endian;
- std::uint8_t true_color;
- std::uint16_t red_max;
- std::uint16_t green_max;
- std::uint16_t blue_max;
- std::uint8_t red_shift;
- std::uint8_t green_shift;
- std::uint8_t blue_shift;
- };
-
- struct FrameBufferUpdateRequest {
- bool incremental;
- std::uint16_t x_pos;
- std::uint16_t y_pos;
- std::uint16_t width;
- std::uint16_t height;
- };
-
- friend bool operator==(const FrameBufferUpdateRequest&,
- const FrameBufferUpdateRequest&);
- friend bool operator!=(const FrameBufferUpdateRequest&,
- const FrameBufferUpdateRequest&);
-
- bool closed();
- void SetupProtocol();
- void SetupSecurityType();
-
- void GetClientInit();
-
- void SendServerInit() EXCLUDES(m_);
- static Message MakeFrameBufferUpdateHeader(std::uint16_t num_stripes);
-
- static void AppendRawStripeHeader(Message* frame_buffer_update,
- const Stripe& stripe);
- void AppendRawStripe(Message* frame_buffer_update, const Stripe& stripe) const
- REQUIRES(m_);
- Message MakeRawFrameBufferUpdate(const StripePtrVec& stripes) const
- REQUIRES(m_);
-
- static void AppendJpegSize(Message* frame_buffer_update, size_t jpeg_size);
- static void AppendJpegStripeHeader(Message* frame_buffer_update,
- const Stripe& stripe);
- static void AppendJpegStripe(Message* frame_buffer_update,
- const Stripe& stripe);
- static Message MakeJpegFrameBufferUpdate(const StripePtrVec& stripes);
-
- Message MakeFrameBufferUpdate(const StripePtrVec& frame) REQUIRES(m_);
-
- void FrameBufferUpdateRequestHandler(bool aggressive) EXCLUDES(m_);
-
- void SendDesktopSizeUpdate() REQUIRES(m_);
-
- bool IsUrgent(const FrameBufferUpdateRequest& update_request) const;
- static StripeSeqNumber MostRecentStripeSeqNumber(const StripePtrVec& stripes);
-
- void HandleFramebufferUpdateRequest() EXCLUDES(m_);
-
- void HandleSetEncodings();
-
- void HandleSetPixelFormat();
-
- void HandlePointerEvent() EXCLUDES(m_);
-
- void UpdateAccelerometer(float x, float y, float z);
-
- struct Coordinates {
- float x;
- float y;
- float z;
- };
-
- Coordinates CoordinatesForOrientation(ScreenOrientation orientation) const;
-
- int ScreenWidth() const REQUIRES(m_);
-
- int ScreenHeight() const REQUIRES(m_);
-
- void SetScreenOrientation(ScreenOrientation orientation) EXCLUDES(m_);
-
- // Returns true if key is special and the screen was rotated.
- bool RotateIfIsRotationCommand(std::uint32_t key);
-
- void HandleKeyEvent();
-
- void HandleClientCutText();
-
- void NormalSession();
-
- mutable std::mutex m_;
- ClientSocket client_;
- bool control_key_down_ = false;
- bool meta_key_down_ = false;
- std::shared_ptr<VirtualInputs> virtual_inputs_{};
-
- FrameBufferUpdateRequest previous_update_request_{};
- BlackBoard* bb_;
- bool use_jpeg_compression_ GUARDED_BY(m_) = false;
-
- std::thread frame_buffer_request_handler_tid_;
- bool closed_ GUARDED_BY(m_){};
-
- PixelFormat pixel_format_ GUARDED_BY(m_) = {
- std::uint8_t{32}, // bits per pixel
- std::uint8_t{24}, // depth
- std::uint8_t{0}, // big_endian
- std::uint8_t{1}, // true_color
- std::uint16_t{0xff}, // red_max, (maxes not used when true color flag is 0)
- std::uint16_t{0xff}, // green_max
- std::uint16_t{0xff}, // blue_max
- std::uint8_t{0}, // red_shift (shifts not used when true color flag is 0)
- std::uint8_t{8}, // green_shift
- std::uint8_t{16}, // blue_shift
- };
-
- bool supports_desktop_size_encoding_ = false;
- ScreenOrientation current_orientation_ GUARDED_BY(m_) =
- ScreenOrientation::Portrait;
-
- bool client_is_old_ = false;
-};
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/vnc_server.cpp b/host/frontend/vnc_server/vnc_server.cpp
deleted file mode 100644
index eff0d57..0000000
--- a/host/frontend/vnc_server/vnc_server.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "host/frontend/vnc_server/vnc_server.h"
-
-#include <memory>
-
-#include <android-base/logging.h>
-#include "common/libs/utils/tcp_socket.h"
-#include "host/frontend/vnc_server/blackboard.h"
-#include "host/frontend/vnc_server/frame_buffer_watcher.h"
-#include "host/frontend/vnc_server/jpeg_compressor.h"
-#include "host/frontend/vnc_server/virtual_inputs.h"
-#include "host/frontend/vnc_server/vnc_client_connection.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-
-using cuttlefish::vnc::VncServer;
-
-VncServer::VncServer(int port, bool aggressive,
- cuttlefish::vnc::ScreenConnector& screen_connector,
- cuttlefish::confui::HostVirtualInput& confui_input)
- : server_(port),
- virtual_inputs_(VirtualInputs::Get(confui_input)),
- frame_buffer_watcher_{&bb_, screen_connector},
- aggressive_{aggressive} {}
-
-void VncServer::MainLoop() {
- while (true) {
- LOG(DEBUG) << "Awaiting connections";
- auto connection = server_.Accept();
- LOG(DEBUG) << "Accepted a client connection";
- StartClient(std::move(connection));
- }
-}
-
-void VncServer::StartClient(ClientSocket sock) {
- std::thread t(&VncServer::StartClientThread, this, std::move(sock));
- t.detach();
-}
-
-void VncServer::StartClientThread(ClientSocket sock) {
- // NOTE if VncServer is expected to be destroyed, we have a problem here.
- // All of the client threads will be pointing to the VncServer's
- // data members. In the current setup, if the VncServer is destroyed with
- // clients still running, the clients will all be left with dangling
- // pointers.
- frame_buffer_watcher_.IncClientCount();
- VncClientConnection client(std::move(sock), virtual_inputs_, &bb_,
- aggressive_);
- client.StartSession();
- frame_buffer_watcher_.DecClientCount();
-}
diff --git a/host/frontend/vnc_server/vnc_server.h b/host/frontend/vnc_server/vnc_server.h
deleted file mode 100644
index 2751fd1..0000000
--- a/host/frontend/vnc_server/vnc_server.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include "common/libs/utils/tcp_socket.h"
-#include "host/frontend/vnc_server/blackboard.h"
-#include "host/frontend/vnc_server/frame_buffer_watcher.h"
-#include "host/frontend/vnc_server/jpeg_compressor.h"
-#include "host/frontend/vnc_server/virtual_inputs.h"
-#include "host/frontend/vnc_server/vnc_client_connection.h"
-#include "host/frontend/vnc_server/vnc_utils.h"
-#include "host/libs/confui/host_mode_ctrl.h"
-#include "host/libs/confui/host_virtual_input.h"
-#include "host/libs/screen_connector/screen_connector.h"
-
-namespace cuttlefish {
-namespace vnc {
-
-class VncServer {
- public:
- explicit VncServer(int port, bool aggressive,
- ScreenConnector& screen_connector,
- cuttlefish::confui::HostVirtualInput& confui_input);
-
- VncServer(const VncServer&) = delete;
- VncServer& operator=(const VncServer&) = delete;
-
- [[noreturn]] void MainLoop();
-
- private:
- void StartClient(ClientSocket sock);
-
- void StartClientThread(ClientSocket sock);
-
- ServerSocket server_;
-
- std::shared_ptr<VirtualInputs> virtual_inputs_;
- BlackBoard bb_;
-
- FrameBufferWatcher frame_buffer_watcher_;
- bool aggressive_{};
-};
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/vnc_server/vnc_utils.h b/host/frontend/vnc_server/vnc_utils.h
deleted file mode 100644
index 7ec19f7..0000000
--- a/host/frontend/vnc_server/vnc_utils.h
+++ /dev/null
@@ -1,90 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <array>
-#include <cstdint>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "common/libs/utils/size_utils.h"
-#include "common/libs/utils/tcp_socket.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/screen_connector/screen_connector.h"
-
-namespace cuttlefish {
-namespace vnc {
-
-// TODO(haining) when the hwcomposer gives a sequence number type, use that
-// instead. It might just work to replace this class with a type alias
-// using StripeSeqNumber = whatever_the_hwcomposer_uses;
-class StripeSeqNumber {
- public:
- StripeSeqNumber() = default;
- explicit StripeSeqNumber(std::uint64_t t) : t_{t} {}
- bool operator<(const StripeSeqNumber& other) const { return t_ < other.t_; }
-
- bool operator<=(const StripeSeqNumber& other) const { return t_ <= other.t_; }
-
- private:
- std::uint64_t t_{};
-};
-
-constexpr int32_t kJpegMaxQualityEncoding = -23;
-constexpr int32_t kJpegMinQualityEncoding = -32;
-
-enum class ScreenOrientation { Portrait, Landscape };
-constexpr int kNumOrientations = 2;
-
-struct Stripe {
- int index = -1;
- std::uint64_t frame_id{};
- std::uint16_t x{};
- std::uint16_t y{};
- std::uint16_t width{};
- std::uint16_t stride{};
- std::uint16_t height{};
- Message raw_data{};
- Message jpeg_data{};
- StripeSeqNumber seq_number{};
- ScreenOrientation orientation{};
-};
-
-/**
- * ScreenConnectorImpl will generate this, and enqueue
- *
- * It's basically a (processed) frame, so it:
- * must be efficiently std::move-able
- * Also, for the sake of algorithm simplicity:
- * must be default-constructable & assignable
- *
- */
-struct VncScProcessedFrame : public ScreenConnectorFrameInfo {
- Message raw_screen_;
- std::deque<Stripe> stripes_;
- std::unique_ptr<VncScProcessedFrame> Clone() {
- VncScProcessedFrame* cloned_frame = new VncScProcessedFrame();
- cloned_frame->raw_screen_ = raw_screen_;
- cloned_frame->stripes_ = stripes_;
- return std::unique_ptr<VncScProcessedFrame>(cloned_frame);
- }
-};
-using ScreenConnector = cuttlefish::ScreenConnector<VncScProcessedFrame>;
-
-} // namespace vnc
-} // namespace cuttlefish
diff --git a/host/frontend/webrtc/Android.bp b/host/frontend/webrtc/Android.bp
index 42f7fa4..7547498 100644
--- a/host/frontend/webrtc/Android.bp
+++ b/host/frontend/webrtc/Android.bp
@@ -31,7 +31,7 @@
"lib/utils.cpp",
"lib/video_track_source_impl.cpp",
"lib/vp8only_encoder_factory.cpp",
- "lib/ws_connection.cpp",
+ "lib/server_connection.cpp",
],
cflags: [
// libwebrtc headers need this
@@ -65,6 +65,7 @@
"libssl",
"libbase",
"libcuttlefish_fs",
+ "libfruit",
"libjsoncpp",
"libwebm_mkvmuxer",
],
@@ -77,6 +78,7 @@
"adb_handler.cpp",
"audio_handler.cpp",
"bluetooth_handler.cpp",
+ "client_server.cpp",
"connection_observer.cpp",
"cvd_video_frame_buffer.cpp",
"display_handler.cpp",
@@ -128,11 +130,14 @@
"libyuv",
],
shared_libs: [
+ "libext2_blkid",
+ "[email protected]",
"libbase",
"libcrypto",
"libcuttlefish_fs",
"libcuttlefish_kernel_log_monitor_utils",
"libjsoncpp",
+ "libfruit",
"libopus",
"libssl",
"libvpx",
@@ -141,3 +146,59 @@
],
defaults: ["cuttlefish_buildhost_only"],
}
+
+prebuilt_usr_share_host {
+ name: "webrtc_client.html",
+ src: "client/client.html",
+ filename: "client.html",
+ sub_dir: "webrtc/assets",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_style.css",
+ src: "client/style.css",
+ filename: "style.css",
+ sub_dir: "webrtc/assets",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_controls.css",
+ src: "client/controls.css",
+ filename: "controls.css",
+ sub_dir: "webrtc/assets",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_adb.js",
+ src: "client/js/adb.js",
+ filename: "adb.js",
+ sub_dir: "webrtc/assets/js",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_cf.js",
+ src: "client/js/cf_webrtc.js",
+ filename: "cf_webrtc.js",
+ sub_dir: "webrtc/assets/js",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_app.js",
+ src: "client/js/app.js",
+ filename: "app.js",
+ sub_dir: "webrtc/assets/js",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_controls.js",
+ src: "client/js/controls.js",
+ filename: "controls.js",
+ sub_dir: "webrtc/assets/js",
+}
+
+prebuilt_usr_share_host {
+ name: "webrtc_rootcanal.js",
+ src: "client/js/rootcanal.js",
+ filename: "rootcanal.js",
+ sub_dir: "webrtc/assets/js",
+}
diff --git a/host/frontend/webrtc/adb_handler.cpp b/host/frontend/webrtc/adb_handler.cpp
index c580f65..7ff55fb 100644
--- a/host/frontend/webrtc/adb_handler.cpp
+++ b/host/frontend/webrtc/adb_handler.cpp
@@ -44,7 +44,11 @@
}
auto local_client = SharedFD::SocketLocalClient(port, SOCK_STREAM);
- CHECK(local_client->IsOpen()) << "Failed to connect to adb socket: " << local_client->StrError();
+ if (!local_client->IsOpen()) {
+ LOG(WARNING) << "Failed to connect to ADB server socket (non-Android guest?) Using /dev/null workaround."
+ << local_client->StrError();
+ return SharedFD::Open("/dev/null", O_RDWR);
+ }
return local_client;
}
diff --git a/host/frontend/webrtc/audio_handler.cpp b/host/frontend/webrtc/audio_handler.cpp
index 1cd8938..52a2294 100644
--- a/host/frontend/webrtc/audio_handler.cpp
+++ b/host/frontend/webrtc/audio_handler.cpp
@@ -484,18 +484,69 @@
buffer.SendStatus(AudioStatus::VIRTIO_SND_S_OK, 0, buffer.len());
return;
}
- auto bytes_per_sample = stream_desc.bits_per_sample / 8;
- auto samples_per_channel =
- buffer.len() / stream_desc.channels / bytes_per_sample;
+ const auto bytes_per_sample = stream_desc.bits_per_sample / 8;
+ const auto samples_per_channel = stream_desc.sample_rate / 100;
+ const auto bytes_per_request =
+ samples_per_channel * bytes_per_sample * stream_desc.channels;
bool muted = false;
- auto res = audio_source_->GetMoreAudioData(
- const_cast<uint8_t*>(buffer.get()), bytes_per_sample,
- samples_per_channel, stream_desc.channels, stream_desc.sample_rate,
- muted);
- if (res < 0) {
- // This is likely a recoverable error, log the error but don't let the VMM
- // know about it so that it doesn't crash.
- LOG(ERROR) << "Failed to receive audio data from client";
+ size_t bytes_read = 0;
+ auto& holding_buffer = stream_descs_[stream_id].buffer;
+ auto rx_buffer = const_cast<uint8_t*>(buffer.get());
+ if (!holding_buffer.empty()) {
+ // Consume any bytes remaining from previous requests
+ bytes_read += holding_buffer.Take(rx_buffer + bytes_read,
+ buffer.len() - bytes_read);
+ }
+ while (buffer.len() - bytes_read >= bytes_per_request) {
+ // Skip the holding buffer in as many reads as possible to avoid the extra
+ // copies
+ auto write_pos = rx_buffer + bytes_read;
+ auto res = audio_source_->GetMoreAudioData(
+ write_pos, bytes_per_sample, samples_per_channel,
+ stream_desc.channels, stream_desc.sample_rate, muted);
+ if (res < 0) {
+ // This is likely a recoverable error, log the error but don't let the
+ // VMM know about it so that it doesn't crash.
+ LOG(ERROR) << "Failed to receive audio data from client";
+ break;
+ }
+ if (muted) {
+ // The source is muted, just fill the buffer with zeros and return
+ memset(rx_buffer + bytes_read, 0, buffer.len() - bytes_read);
+ bytes_read = buffer.len();
+ break;
+ }
+ auto bytes_received = res * bytes_per_sample * stream_desc.channels;
+ bytes_read += bytes_received;
+ }
+ if (bytes_read < buffer.len()) {
+ // There is some buffer left to fill, but it's less than 10ms, read into
+ // holding buffer to ensure the remainder is kept around for future reads
+ auto write_pos = holding_buffer.data();
+ // Holding buffer is the exact size we need to read into and is emptied
+ // before we try to read into it.
+ CHECK(holding_buffer.freeCapacity() >= bytes_per_request)
+ << "Buffer too small for receiving audio";
+ auto res = audio_source_->GetMoreAudioData(
+ write_pos, bytes_per_sample, samples_per_channel,
+ stream_desc.channels, stream_desc.sample_rate, muted);
+ if (res < 0) {
+ // This is likely a recoverable error, log the error but don't let the
+ // VMM know about it so that it doesn't crash.
+ LOG(ERROR) << "Failed to receive audio data from client";
+ } else if (muted) {
+ // The source is muted, just fill the buffer with zeros and return
+ memset(rx_buffer + bytes_read, 0, buffer.len() - bytes_read);
+ bytes_read = buffer.len();
+ } else {
+ auto bytes_received = res * bytes_per_sample * stream_desc.channels;
+ holding_buffer.count += bytes_received;
+ bytes_read += holding_buffer.Take(rx_buffer + bytes_read,
+ buffer.len() - bytes_read);
+ // If the entire buffer is not full by now there is a bug above
+ // somewhere
+ CHECK(bytes_read == buffer.len()) << "Failed to read entire buffer";
+ }
}
}
buffer.SendStatus(AudioStatus::VIRTIO_SND_S_OK, 0, buffer.len());
@@ -514,12 +565,24 @@
return added_len;
}
+size_t AudioHandler::HoldingBuffer::Take(uint8_t* dst, size_t len) {
+ auto n = std::min(len, count);
+ std::copy(buffer.begin(), buffer.begin() + n, dst);
+ std::copy(buffer.begin() + n, buffer.begin() + count, buffer.begin());
+ count -= n;
+ return n;
+}
+
bool AudioHandler::HoldingBuffer::empty() const { return count == 0; }
bool AudioHandler::HoldingBuffer::full() const {
return count == buffer.size();
}
+size_t AudioHandler::HoldingBuffer::freeCapacity() const {
+ return buffer.size() - count;
+}
+
uint8_t* AudioHandler::HoldingBuffer::data() { return buffer.data(); }
} // namespace cuttlefish
diff --git a/host/frontend/webrtc/audio_handler.h b/host/frontend/webrtc/audio_handler.h
index 4da645c..fc4734a 100644
--- a/host/frontend/webrtc/audio_handler.h
+++ b/host/frontend/webrtc/audio_handler.h
@@ -35,9 +35,12 @@
void Reset(size_t size);
size_t Add(const volatile uint8_t* data, size_t max_len);
+ size_t Take(uint8_t* dst, size_t len);
bool empty() const;
bool full() const;
+ size_t freeCapacity() const;
uint8_t* data();
+ uint8_t* end();
};
struct StreamDesc {
std::mutex mtx;
diff --git a/host/frontend/webrtc/client/client.html b/host/frontend/webrtc/client/client.html
new file mode 100644
index 0000000..4039c26
--- /dev/null
+++ b/host/frontend/webrtc/client/client.html
@@ -0,0 +1,156 @@
+<?--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="style.css" >
+ <link rel="stylesheet" type="text/css" href="controls.css" >
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined">
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
+ </head>
+
+ <body>
+ <div id="loader"></div>
+ <div id="error-message-div">
+ <h3 id="error-message" class="hidden">
+ <span class="material-icons close-btn">close</span>
+ </h3>
+ </div>
+ <section id="device-connection">
+ <div id='header'>
+ <div id='app-controls'>
+ <div id="keyboard-capture-control" title="Capture Keyboard"></div>
+ <div id="mic-capture-control" title="Capture Microphone"></div>
+ <div id="camera-control" title="Capture Camera"></div>
+ <audio controls id="device-audio"></audio>
+ <div id="record-video-control" title="Capture Display as Webm"></div>
+ </div>
+ <div id='status-div'>
+ <h3 id='status-message' class='connecting'>Connecting to device</h3>
+ </div>
+ </div>
+ <div id='controls-and-displays'>
+ <div id='control-panel-default-buttons' class='control-panel-column'>
+ <button id='device-details-button' title='Device Details' class='material-icons'>
+ settings
+ </button>
+ <button id='bluetooth-modal-button' title='Bluetooth console' class='material-icons'>
+ settings_bluetooth
+ </button>
+ </div>
+ <div id='control-panel-custom-buttons' class='control-panel-column'></div>
+ <div id='device-displays'>
+ </div>
+ </div>
+ </section>
+ <div id='device-details-modal' class='modal'>
+ <div id='device-details-modal-header' class='modal-header'>
+ <h2>Device Details</h2>
+ <button id='device-details-close' title='Close' class='material-icons modal-close'>close</button>
+ </div>
+ <hr>
+ <h3>Hardware Configuration</h3>
+ <span id='device-details-hardware'>unknown</span>
+ </div>
+
+ <div id='bluetooth-modal' class='modal-wrapper'>
+ <div id='bluetooth-prompt' class='modal'>
+ <div id='bluetooth-prompt-header' class='modal-header'>
+ <h2>Bluetooth</h2>
+ <button id='bluetooth-prompt-close' title='Close' class='material-icons modal-close'>close</button>
+ </div>
+ <div>
+ <div id='bluetooth-prompt-text' class='bluetooth-text'>
+ We have enabled a BT Wizard to simplify adding a<br>bluetooth device.<br>
+ Alternatively, you can enter the BT Console if you<br>want to exercise full control.</div><br>
+ <div class='bluetooth-button'>
+ <button id='bluetooth-prompt-wizard' title='Start Wizard' class='modal-button-highlight'>Start Wizard</button>
+ <button id='bluetooth-prompt-list' title='Device List' class='modal-button'>Device List</button>
+ <button id='bluetooth-prompt-console' title='BT Console' class='modal-button'>BT Console</button>
+ </div>
+ </div>
+ </div>
+ <div id='bluetooth-wizard' class='modal'>
+ <div id='bluetooth-wizard-modal-header' class='modal-header'>
+ <h2>BT Wizard</h2>
+ <button id='bluetooth-wizard-close' title='Close' class='material-icons modal-close'>close</button>
+ </div>
+ <div>
+ <div class='bluetooth-text-field'><input type="text" id='bluetooth-wizard-name' placeholder="Device Name"></input></div>
+ <div class='bluetooth-drop-down'>
+ <select id='bluetooth-wizard-type' validate-mac="true" required>
+ <option value="beacon">Beacon</option>
+ <option value="beacon_swarm">Beacon Swarm</option>
+ <!-- Disabled because they were "started but never finished" (according to mylesgw@)
+ <option value="car_kit">Car Kit</option>
+ <option value="classic">Classic</option> -->
+ <option value="keyboard">Keyboard</option>
+ <option value="remote_loopback">Remote Loopback</option>
+ <option value="scripted_beacon">Scripted Beacon</option>
+ <!-- Disabled because it will never show up in the UI
+ <option value="sniffer">Sniffer</option> -->
+ </select>
+ </div>
+ <div class='bluetooth-text-field'><input type="text" id='bluetooth-wizard-mac' placeholder="Device MAC" validate-mac="true" required></input><span></span></div>
+ <div class='bluetooth-button'>
+ <button id='bluetooth-wizard-device' title='Add Device' class='modal-button-highlight' disabled>Add Device</button>
+ <button id='bluetooth-wizard-cancel' title='Cancel' class='modal-button'>Cancel</button>
+ </div>
+ </div>
+ </div>
+ <div id='bluetooth-wizard-confirm' class='modal'>
+ <div id='bluetooth-wizard-confirm-header' class='modal-header'>
+ <h2>BT Wizard</h2>
+ <button id='bluetooth-wizard-confirm-close' title='Close' class='material-icons modal-close'>close</button>
+ </div>
+ <div id='bluetooth-wizard-text' class='bluetooth-text'>Device added. See device details below.</div><br>
+ <div class='bluetooth-text'>
+ <p>Name: <b>GKeyboard</b></p>
+ <p>Type: <b>Keyboard</b></p>
+ <p>MAC Addr: <b>be:ac:01:55:00:03</b></p>
+ </div>
+ <div class='bluetooth-button'><button id='bluetooth-wizard-another' title='Add Another' class='modal-button-highlight'>Add Another</button></div>
+ </div>
+ <div id='bluetooth-list' class='modal'>
+ <div id='bluetooth-list-header' class='modal-header'>
+ <h2>Device List</h2>
+ <button id='bluetooth-list-close' title='Close' class='material-icons modal-close'>close</button>
+ </div>
+ <div class='bluetooth-text'>
+ <div><button title="Delete" data-device-id="delete" class="bluetooth-list-trash material-icons">delete</button>GKeyboard | Keyboard | be:ac:01:55:00:03</div>
+ <div><button title="Delete" data-device-id="delete" class="bluetooth-list-trash material-icons">delete</button>GHeadphones | Audio | dc:fa:32:00:55:02</div>
+ </div>
+ </div>
+ <div id='bluetooth-console' class='modal'>
+ <div id='bluetooth-console-modal-header' class='modal-header'>
+ <h2>BT Console</h2>
+ <button id='bluetooth-console-close' title='Close' class='material-icons modal-close'>close</button>
+ </div>
+ <div>
+ <div colspan='2'><textarea id='bluetooth-console-view' readonly rows='10' cols='60'></textarea></div>
+ <div width='1'><p id='bluetooth-console-cmd-label'>Command:</p></div>
+ <div width='100'><input id='bluetooth-console-input' type='text'></input></div>
+ </div>
+ </div>
+ </div>
+ <script src="js/adb.js"></script>
+ <script src="js/rootcanal.js"></script>
+ <script src="js/cf_webrtc.js" type="module"></script>
+ <script src="js/controls.js"></script>
+ <script src="js/app.js"></script>
+ </body>
+</html>
diff --git a/host/frontend/webrtc_operator/assets/controls.css b/host/frontend/webrtc/client/controls.css
similarity index 100%
rename from host/frontend/webrtc_operator/assets/controls.css
rename to host/frontend/webrtc/client/controls.css
diff --git a/host/frontend/webrtc/client/js/adb.js b/host/frontend/webrtc/client/js/adb.js
new file mode 100644
index 0000000..b011114
--- /dev/null
+++ b/host/frontend/webrtc/client/js/adb.js
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+let adb_ws;
+
+let utf8Encoder = new TextEncoder();
+let utf8Decoder = new TextDecoder();
+
+const A_CNXN = 0x4e584e43;
+const A_OPEN = 0x4e45504f;
+const A_WRTE = 0x45545257;
+const A_OKAY = 0x59414b4f;
+
+const kLocalChannelId = 666;
+
+let array = new Uint8Array();
+
+function setU32LE(array, offset, x) {
+ array[offset] = x & 0xff;
+ array[offset + 1] = (x >> 8) & 0xff;
+ array[offset + 2] = (x >> 16) & 0xff;
+ array[offset + 3] = x >> 24;
+}
+
+function getU32LE(array, offset) {
+ let x = array[offset] | (array[offset + 1] << 8) | (array[offset + 2] << 16) |
+ (array[offset + 3] << 24);
+
+ return x >>> 0; // convert signed to unsigned if necessary.
+}
+
+function computeChecksum(array) {
+ let sum = 0;
+ let i;
+ for (i = 0; i < array.length; ++i) {
+ sum = ((sum + array[i]) & 0xffffffff) >>> 0;
+ }
+
+ return sum;
+}
+
+function createAdbMessage(command, arg0, arg1, payload) {
+ let arrayBuffer = new ArrayBuffer(24 + payload.length);
+ let array = new Uint8Array(arrayBuffer);
+ setU32LE(array, 0, command);
+ setU32LE(array, 4, arg0);
+ setU32LE(array, 8, arg1);
+ setU32LE(array, 12, payload.length);
+ setU32LE(array, 16, computeChecksum(payload));
+ setU32LE(array, 20, command ^ 0xffffffff);
+ array.set(payload, 24);
+
+ return arrayBuffer;
+}
+
+function adbOpenConnection() {
+ let systemIdentity = utf8Encoder.encode('Cray_II:1234:whatever');
+
+ let arrayBuffer =
+ createAdbMessage(A_CNXN, 0x1000000, 256 * 1024, systemIdentity);
+
+ adb_ws.send(arrayBuffer);
+}
+
+function adbShell(command) {
+ let destination = utf8Encoder.encode('shell:' + command);
+
+ let arrayBuffer = createAdbMessage(A_OPEN, kLocalChannelId, 0, destination);
+ adb_ws.send(arrayBuffer);
+ awaitConnection();
+}
+
+function adbSendOkay(remoteId) {
+ let payload = new Uint8Array(0);
+
+ let arrayBuffer =
+ createAdbMessage(A_OKAY, kLocalChannelId, remoteId, payload);
+
+ adb_ws.send(arrayBuffer);
+}
+
+function JoinArrays(arr1, arr2) {
+ let arr = new Uint8Array(arr1.length + arr2.length);
+ arr.set(arr1, 0);
+ arr.set(arr2, arr1.length);
+ return arr;
+}
+
+// Simple lifecycle management that executes callbacks based on connection
+// state.
+//
+// Any attempt to initiate a command (e.g. creating a connection, sending a
+// message) (re)starts a timer. Any response back from any command stops that
+// timer.
+const timeoutMs = 3000;
+let connectedCb;
+let disconnectedCb;
+let disconnectedTimeout;
+function awaitConnection() {
+ clearTimeout(disconnectedTimeout);
+ if (disconnectedCb) {
+ disconnectedTimeout = setTimeout(disconnectedCb, timeoutMs);
+ }
+}
+function connected() {
+ if (disconnectedTimeout) {
+ clearTimeout(disconnectedTimeout);
+ }
+ if (connectedCb) {
+ connectedCb();
+ }
+}
+
+function adbOnMessage(arrayBuffer) {
+ // console.debug("adb_ws: onmessage (" + arrayBuffer.byteLength + " bytes)");
+ array = JoinArrays(array, new Uint8Array(arrayBuffer));
+
+ while (array.length > 0) {
+ if (array.length < 24) {
+ // Incomplete package, must wait for more data.
+ return;
+ }
+
+ let command = getU32LE(array, 0);
+ let magic = getU32LE(array, 20);
+
+ if (command != ((magic ^ 0xffffffff) >>> 0)) {
+ console.error('adb message command vs magic failed.');
+ console.error('command = ' + command + ', magic = ' + magic);
+ return;
+ }
+
+ let payloadLength = getU32LE(array, 12);
+
+ if (array.length < 24 + payloadLength) {
+ // Incomplete package, must wait for more data.
+ return;
+ }
+
+ let payloadChecksum = getU32LE(array, 16);
+ let checksum = computeChecksum(array.slice(24));
+
+ if (payloadChecksum != checksum) {
+ console.error('adb message checksum mismatch.');
+ // This can happen if a shell command executes while another
+ // channel is receiving data.
+ }
+
+ switch (command) {
+ case A_CNXN: {
+ console.info('WebRTC adb connected.');
+ connected();
+ break;
+ }
+
+ case A_OKAY: {
+ let remoteId = getU32LE(array, 4);
+ console.debug('WebRTC adb channel created w/ remoteId ' + remoteId);
+ connected();
+ break;
+ }
+
+ case A_WRTE: {
+ let remoteId = getU32LE(array, 4);
+ adbSendOkay(remoteId);
+ break;
+ }
+ }
+ array = array.subarray(24 + payloadLength, array.length);
+ }
+}
+
+function init_adb(devConn, ccb = connectedCb, dcb = disconnectedCb) {
+ if (adb_ws) return;
+
+ adb_ws = {
+ send: function(buffer) {
+ devConn.sendAdbMessage(buffer);
+ }
+ };
+ connectedCb = ccb;
+ disconnectedCb = dcb;
+ awaitConnection();
+
+ devConn.onAdbMessage(msg => adbOnMessage(msg));
+
+ adbOpenConnection();
+}
diff --git a/host/frontend/webrtc/client/js/app.js b/host/frontend/webrtc/client/js/app.js
new file mode 100644
index 0000000..2b9a178
--- /dev/null
+++ b/host/frontend/webrtc/client/js/app.js
@@ -0,0 +1,1017 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+async function ConnectDevice(deviceId, serverConnector) {
+ console.debug('Connect: ' + deviceId);
+ // Prepare messages in case of connection failure
+ let connectionAttemptDuration = 0;
+ const intervalMs = 15000;
+ let connectionInterval = setInterval(() => {
+ connectionAttemptDuration += intervalMs;
+ if (connectionAttemptDuration > 30000) {
+ showError(
+ 'Connection should have occurred by now. ' +
+ 'Please attempt to restart the guest device.');
+ clearInterval(connectionInterval);
+ } else if (connectionAttemptDuration > 15000) {
+ showWarning('Connection is taking longer than expected');
+ }
+ }, intervalMs);
+
+ let module = await import('./cf_webrtc.js');
+ let deviceConnection = await module.Connect(deviceId, serverConnector);
+ console.info('Connected to ' + deviceId);
+ clearInterval(connectionInterval);
+ return deviceConnection;
+}
+
+function setupMessages() {
+ let closeBtn = document.querySelector('#error-message .close-btn');
+ closeBtn.addEventListener('click', evt => {
+ evt.target.parentElement.className = 'hidden';
+ });
+}
+
+function showMessage(msg, className) {
+ let element = document.getElementById('error-message');
+ if (element.childNodes.length < 2) {
+ // First time, no text node yet
+ element.insertAdjacentText('afterBegin', msg);
+ } else {
+ element.childNodes[0].data = msg;
+ }
+ element.className = className;
+}
+
+function showWarning(msg) {
+ showMessage(msg, 'warning');
+}
+
+function showError(msg) {
+ showMessage(msg, 'error');
+}
+
+
+class DeviceDetailsUpdater {
+ #element;
+
+ constructor() {
+ this.#element = document.getElementById('device-details-hardware');
+ }
+
+ setHardwareDetailsText(text) {
+ this.#element.dataset.hardwareDetailsText = text;
+ return this;
+ }
+
+ setDeviceStateDetailsText(text) {
+ this.#element.dataset.deviceStateDetailsText = text;
+ return this;
+ }
+
+ update() {
+ this.#element.textContent =
+ [
+ this.#element.dataset.hardwareDetailsText,
+ this.#element.dataset.deviceStateDetailsText,
+ ].filter(e => e /*remove empty*/)
+ .join('\n');
+ }
+} // DeviceDetailsUpdater
+
+class DeviceControlApp {
+ #deviceConnection = {};
+ #currentRotation = 0;
+ #displayDescriptions = [];
+ #buttons = {};
+ #recording = {};
+ #phys = {};
+ #deviceCount = 0;
+
+ constructor(deviceConnection) {
+ this.#deviceConnection = deviceConnection;
+ }
+
+ start() {
+ console.debug('Device description: ', this.#deviceConnection.description);
+ this.#deviceConnection.onControlMessage(msg => this.#onControlMessage(msg));
+ let keyboardCaptureCtrl = createToggleControl(
+ document.getElementById('keyboard-capture-control'), 'keyboard');
+ let micCaptureCtrl = createToggleControl(
+ document.getElementById('mic-capture-control'), 'mic');
+ let cameraCtrl = createToggleControl(
+ document.getElementById('camera-control'), 'videocam');
+ let videoCaptureCtrl = createToggleControl(
+ document.getElementById('record-video-control'), 'movie_creation');
+
+ keyboardCaptureCtrl.OnClick(
+ enabled => this.#onKeyboardCaptureToggle(enabled));
+ micCaptureCtrl.OnClick(enabled => this.#onMicCaptureToggle(enabled));
+ cameraCtrl.OnClick(enabled => this.#onCameraCaptureToggle(enabled));
+ videoCaptureCtrl.OnClick(enabled => this.#onVideoCaptureToggle(enabled));
+
+ this.#showDeviceUI();
+ }
+
+ #showDeviceUI() {
+ window.onresize = evt => this.#resizeDeviceDisplays();
+ // Set up control panel buttons
+ this.#buttons = {};
+ this.#buttons['power'] = createControlPanelButton(
+ 'power', 'Power', 'power_settings_new',
+ evt => this.#onControlPanelButton(evt));
+ this.#buttons['home'] = createControlPanelButton(
+ 'home', 'Home', 'home', evt => this.#onControlPanelButton(evt));
+ this.#buttons['menu'] = createControlPanelButton(
+ 'menu', 'Menu', 'menu', evt => this.#onControlPanelButton(evt));
+ this.#buttons['rotate'] = createControlPanelButton(
+ 'rotate', 'Rotate', 'screen_rotation',
+ evt => this.#onRotateButton(evt));
+ this.#buttons['rotate'].adb = true;
+ this.#buttons['volumemute'] = createControlPanelButton(
+ 'volumemute', 'Volume Mute', 'volume_mute',
+ evt => this.#onControlPanelButton(evt));
+ this.#buttons['volumedown'] = createControlPanelButton(
+ 'volumedown', 'Volume Down', 'volume_down',
+ evt => this.#onControlPanelButton(evt));
+ this.#buttons['volumeup'] = createControlPanelButton(
+ 'volumeup', 'Volume Up', 'volume_up',
+ evt => this.#onControlPanelButton(evt));
+
+ createModalButton(
+ 'device-details-button', 'device-details-modal',
+ 'device-details-close');
+ createModalButton(
+ 'bluetooth-modal-button', 'bluetooth-prompt',
+ 'bluetooth-prompt-close');
+ createModalButton(
+ 'bluetooth-prompt-wizard', 'bluetooth-wizard',
+ 'bluetooth-wizard-close', 'bluetooth-prompt');
+ createModalButton(
+ 'bluetooth-wizard-device', 'bluetooth-wizard-confirm',
+ 'bluetooth-wizard-confirm-close', 'bluetooth-wizard');
+ createModalButton(
+ 'bluetooth-wizard-another', 'bluetooth-wizard',
+ 'bluetooth-wizard-close', 'bluetooth-wizard-confirm');
+ createModalButton(
+ 'bluetooth-prompt-list', 'bluetooth-list',
+ 'bluetooth-list-close', 'bluetooth-prompt');
+ createModalButton(
+ 'bluetooth-prompt-console', 'bluetooth-console',
+ 'bluetooth-console-close', 'bluetooth-prompt');
+ createModalButton(
+ 'bluetooth-wizard-cancel', 'bluetooth-prompt',
+ 'bluetooth-wizard-close', 'bluetooth-wizard');
+
+ positionModal('device-details-button', 'bluetooth-modal');
+ positionModal('device-details-button', 'bluetooth-prompt');
+ positionModal('device-details-button', 'bluetooth-wizard');
+ positionModal('device-details-button', 'bluetooth-wizard-confirm');
+ positionModal('device-details-button', 'bluetooth-list');
+ positionModal('device-details-button', 'bluetooth-console');
+
+ createButtonListener('bluetooth-prompt-list', null, this.#deviceConnection,
+ evt => this.#onRootCanalCommand(this.#deviceConnection, "list", evt));
+ createButtonListener('bluetooth-wizard-device', null, this.#deviceConnection,
+ evt => this.#onRootCanalCommand(this.#deviceConnection, "add", evt));
+ createButtonListener('bluetooth-list-trash', null, this.#deviceConnection,
+ evt => this.#onRootCanalCommand(this.#deviceConnection, "del", evt));
+ createButtonListener('bluetooth-prompt-wizard', null, this.#deviceConnection,
+ evt => this.#onRootCanalCommand(this.#deviceConnection, "list", evt));
+ createButtonListener('bluetooth-wizard-another', null, this.#deviceConnection,
+ evt => this.#onRootCanalCommand(this.#deviceConnection, "list", evt));
+
+ if (this.#deviceConnection.description.custom_control_panel_buttons.length >
+ 0) {
+ document.getElementById('control-panel-custom-buttons').style.display =
+ 'flex';
+ for (const button of this.#deviceConnection.description
+ .custom_control_panel_buttons) {
+ if (button.shell_command) {
+ // This button's command is handled by sending an ADB shell command.
+ this.#buttons[button.command] = createControlPanelButton(
+ button.command, button.title, button.icon_name,
+ e => this.#onCustomShellButton(button.shell_command, e),
+ 'control-panel-custom-buttons');
+ this.#buttons[button.command].adb = true;
+ } else if (button.device_states) {
+ // This button corresponds to variable hardware device state(s).
+ this.#buttons[button.command] = createControlPanelButton(
+ button.command, button.title, button.icon_name,
+ this.#getCustomDeviceStateButtonCb(button.device_states),
+ 'control-panel-custom-buttons');
+ for (const device_state of button.device_states) {
+ // hinge_angle is currently injected via an adb shell command that
+ // triggers a guest binary.
+ if ('hinge_angle_value' in device_state) {
+ this.#buttons[button.command].adb = true;
+ }
+ }
+ } else {
+ // This button's command is handled by custom action server.
+ this.#buttons[button.command] = createControlPanelButton(
+ button.command, button.title, button.icon_name,
+ evt => this.#onControlPanelButton(evt),
+ 'control-panel-custom-buttons');
+ }
+ }
+ }
+
+ // Set up displays
+ this.#createDeviceDisplays();
+
+ // Set up audio
+ const deviceAudio = document.getElementById('device-audio');
+ for (const audio_desc of this.#deviceConnection.description.audio_streams) {
+ let stream_id = audio_desc.stream_id;
+ this.#deviceConnection.getStream(stream_id)
+ .then(stream => {
+ deviceAudio.srcObject = stream;
+ let playPromise = deviceAudio.play();
+ if (playPromise !== undefined) {
+ playPromise.catch(error => {
+ showWarning(
+ 'Audio failed to play automatically, click on the play button to activate it');
+ });
+ }
+ })
+ .catch(e => console.error('Unable to get audio stream: ', e));
+ }
+
+ // Set up touch input
+ this.#startMouseTracking();
+
+ this.#updateDeviceHardwareDetails(
+ this.#deviceConnection.description.hardware);
+
+ // Show the error message and disable buttons when the WebRTC connection
+ // fails.
+ this.#deviceConnection.onConnectionStateChange(state => {
+ if (state == 'disconnected' || state == 'failed') {
+ this.#showWebrtcError();
+ }
+ });
+
+ let bluetoothConsole =
+ cmdConsole('bluetooth-console-view', 'bluetooth-console-input');
+ bluetoothConsole.addCommandListener(cmd => {
+ let inputArr = cmd.split(' ');
+ let command = inputArr[0];
+ inputArr.shift();
+ let args = inputArr;
+ this.#deviceConnection.sendBluetoothMessage(
+ createRootcanalMessage(command, args));
+ });
+ this.#deviceConnection.onBluetoothMessage(msg => {
+ let decoded = decodeRootcanalMessage(msg);
+ let deviceCount = btUpdateDeviceList(decoded);
+ if (deviceCount > 0) {
+ this.#deviceCount = deviceCount;
+ createButtonListener('bluetooth-list-trash', null, this.#deviceConnection,
+ evt => this.#onRootCanalCommand(this.#deviceConnection, "del", evt));
+ }
+ btUpdateAdded(decoded);
+ let phyList = btParsePhys(decoded);
+ if (phyList) {
+ this.#phys = phyList;
+ }
+ bluetoothConsole.addLine(decoded);
+ });
+ }
+
+ #onRootCanalCommand(deviceConnection, cmd, evt) {
+ if (cmd == "list") {
+ deviceConnection.sendBluetoothMessage(createRootcanalMessage("list", []));
+ }
+ if (cmd == "del") {
+ let id = evt.srcElement.getAttribute("data-device-id");
+ deviceConnection.sendBluetoothMessage(createRootcanalMessage("del", [id]));
+ deviceConnection.sendBluetoothMessage(createRootcanalMessage("list", []));
+ }
+ if (cmd == "add") {
+ let name = document.getElementById('bluetooth-wizard-name').value;
+ let type = document.getElementById('bluetooth-wizard-type').value;
+ if (type == "remote_loopback") {
+ deviceConnection.sendBluetoothMessage(createRootcanalMessage("add", [type]));
+ } else {
+ let mac = document.getElementById('bluetooth-wizard-mac').value;
+ deviceConnection.sendBluetoothMessage(createRootcanalMessage("add", [type, mac]));
+ }
+ let phyId = this.#phys["LOW_ENERGY"].toString();
+ if (type == "remote_loopback") {
+ phyId = this.#phys["BR_EDR"].toString();
+ }
+ let devId = this.#deviceCount.toString();
+ this.#deviceCount++;
+ deviceConnection.sendBluetoothMessage(createRootcanalMessage("add_device_to_phy", [devId, phyId]));
+ }
+ }
+
+ #showWebrtcError() {
+ document.getElementById('status-message').className = 'error';
+ document.getElementById('status-message').textContent =
+ 'No connection to the guest device. ' +
+ 'Please ensure the WebRTC process on the host machine is active.';
+ document.getElementById('status-message').style.visibility = 'visible';
+ const deviceDisplays = document.getElementById('device-displays');
+ deviceDisplays.style.display = 'none';
+ for (const [_, button] of Object.entries(this.#buttons)) {
+ button.disabled = true;
+ }
+ }
+
+ #takePhoto() {
+ const imageCapture = this.#deviceConnection.imageCapture;
+ if (imageCapture) {
+ const photoSettings = {
+ imageWidth: this.#deviceConnection.cameraWidth,
+ imageHeight: this.#deviceConnection.cameraHeight
+ };
+ imageCapture.takePhoto(photoSettings)
+ .then(blob => blob.arrayBuffer())
+ .then(buffer => this.#deviceConnection.sendOrQueueCameraData(buffer))
+ .catch(error => console.error(error));
+ }
+ }
+
+ #getCustomDeviceStateButtonCb(device_states) {
+ let states = device_states;
+ let index = 0;
+ return e => {
+ if (e.type == 'mousedown') {
+ // Reset any overridden device state.
+ adbShell('cmd device_state state reset');
+ // Send a device_state message for the current state.
+ let message = {
+ command: 'device_state',
+ ...states[index],
+ };
+ this.#deviceConnection.sendControlMessage(JSON.stringify(message));
+ console.debug('Control message sent: ', JSON.stringify(message));
+ let lidSwitchOpen = null;
+ if ('lid_switch_open' in states[index]) {
+ lidSwitchOpen = states[index].lid_switch_open;
+ }
+ let hingeAngle = null;
+ if ('hinge_angle_value' in states[index]) {
+ hingeAngle = states[index].hinge_angle_value;
+ // TODO(b/181157794): Use a custom Sensor HAL for hinge_angle
+ // injection instead of this guest binary.
+ adbShell(
+ '/vendor/bin/cuttlefish_sensor_injection hinge_angle ' +
+ states[index].hinge_angle_value);
+ }
+ // Update the Device Details view.
+ this.#updateDeviceStateDetails(lidSwitchOpen, hingeAngle);
+ // Cycle to the next state.
+ index = (index + 1) % states.length;
+ }
+ }
+ }
+
+ #resizeDeviceDisplays() {
+ // Padding between displays.
+ const deviceDisplayWidthPadding = 10;
+ // Padding for the display info above each display video.
+ const deviceDisplayHeightPadding = 38;
+
+ let deviceDisplayList = document.getElementsByClassName('device-display');
+ let deviceDisplayVideoList =
+ document.getElementsByClassName('device-display-video');
+ let deviceDisplayInfoList =
+ document.getElementsByClassName('device-display-info');
+
+ const deviceDisplays = document.getElementById('device-displays');
+ const rotationDegrees = this.#getTransformRotation(deviceDisplays);
+ const rotationRadians = rotationDegrees * Math.PI / 180;
+
+ // Auto-scale the screen based on window size.
+ let availableWidth = deviceDisplays.clientWidth;
+ let availableHeight = deviceDisplays.clientHeight - deviceDisplayHeightPadding;
+
+ // Reserve space for padding between the displays.
+ availableWidth = availableWidth -
+ (this.#displayDescriptions.length * deviceDisplayWidthPadding);
+
+ // Loop once over all of the displays to compute the total space needed.
+ let neededWidth = 0;
+ let neededHeight = 0;
+ for (let i = 0; i < deviceDisplayList.length; i++) {
+ let deviceDisplayDescription = this.#displayDescriptions[i];
+ let deviceDisplayVideo = deviceDisplayVideoList[i];
+
+ const originalDisplayWidth = deviceDisplayDescription.x_res;
+ const originalDisplayHeight = deviceDisplayDescription.y_res;
+
+ const neededBoundingBoxWidth =
+ Math.abs(Math.cos(rotationRadians) * originalDisplayWidth) +
+ Math.abs(Math.sin(rotationRadians) * originalDisplayHeight);
+ const neededBoundingBoxHeight =
+ Math.abs(Math.sin(rotationRadians) * originalDisplayWidth) +
+ Math.abs(Math.cos(rotationRadians) * originalDisplayHeight);
+
+ neededWidth = neededWidth + neededBoundingBoxWidth;
+ neededHeight = Math.max(neededHeight, neededBoundingBoxHeight);
+ }
+
+ const scaling =
+ Math.min(availableWidth / neededWidth, availableHeight / neededHeight);
+
+ // Loop again over all of the displays to set the sizes and positions.
+ let deviceDisplayLeftOffset = 0;
+ for (let i = 0; i < deviceDisplayList.length; i++) {
+ let deviceDisplay = deviceDisplayList[i];
+ let deviceDisplayVideo = deviceDisplayVideoList[i];
+ let deviceDisplayInfo = deviceDisplayInfoList[i];
+ let deviceDisplayDescription = this.#displayDescriptions[i];
+
+ let rotated = this.#currentRotation == 1 ? ' (Rotated)' : '';
+ deviceDisplayInfo.textContent = `Display ${i} - ` +
+ `${deviceDisplayDescription.x_res}x` +
+ `${deviceDisplayDescription.y_res} ` +
+ `(${deviceDisplayDescription.dpi} DPI)${rotated}`;
+
+ const originalDisplayWidth = deviceDisplayDescription.x_res;
+ const originalDisplayHeight = deviceDisplayDescription.y_res;
+
+ const scaledDisplayWidth = originalDisplayWidth * scaling;
+ const scaledDisplayHeight = originalDisplayHeight * scaling;
+
+ const neededBoundingBoxWidth =
+ Math.abs(Math.cos(rotationRadians) * originalDisplayWidth) +
+ Math.abs(Math.sin(rotationRadians) * originalDisplayHeight);
+ const neededBoundingBoxHeight =
+ Math.abs(Math.sin(rotationRadians) * originalDisplayWidth) +
+ Math.abs(Math.cos(rotationRadians) * originalDisplayHeight);
+
+ const scaledBoundingBoxWidth = neededBoundingBoxWidth * scaling;
+ const scaledBoundingBoxHeight = neededBoundingBoxHeight * scaling;
+
+ const offsetX = (scaledBoundingBoxWidth - scaledDisplayWidth) / 2;
+ const offsetY = (scaledBoundingBoxHeight - scaledDisplayHeight) / 2;
+
+ deviceDisplayVideo.style.width = scaledDisplayWidth;
+ deviceDisplayVideo.style.height = scaledDisplayHeight;
+ deviceDisplayVideo.style.transform = `translateX(${offsetX}px) ` +
+ `translateY(${offsetY}px) ` +
+ `rotateZ(${rotationDegrees}deg) `;
+
+ deviceDisplay.style.left = `${deviceDisplayLeftOffset}px`;
+ deviceDisplay.style.width = scaledBoundingBoxWidth;
+ deviceDisplay.style.height = scaledBoundingBoxHeight;
+
+ deviceDisplayLeftOffset = deviceDisplayLeftOffset + deviceDisplayWidthPadding +
+ scaledBoundingBoxWidth;
+ }
+ }
+
+ #getTransformRotation(element) {
+ if (!element.style.textIndent) {
+ return 0;
+ }
+ // Remove 'px' and convert to float.
+ return parseFloat(element.style.textIndent.slice(0, -2));
+ }
+
+ #onControlMessage(message) {
+ let message_data = JSON.parse(message.data);
+ console.debug('Control message received: ', message_data)
+ let metadata = message_data.metadata;
+ if (message_data.event == 'VIRTUAL_DEVICE_BOOT_STARTED') {
+ // Start the adb connection after receiving the BOOT_STARTED message.
+ // (This is after the adbd start message. Attempting to connect
+ // immediately after adbd starts causes issues.)
+ this.#initializeAdb();
+ }
+ if (message_data.event == 'VIRTUAL_DEVICE_SCREEN_CHANGED') {
+ if (metadata.rotation != this.#currentRotation) {
+ // Animate the screen rotation.
+ const targetRotation = metadata.rotation == 0 ? 0 : -90;
+
+ $('#device-displays')
+ .animate(
+ {
+ textIndent: targetRotation,
+ },
+ {
+ duration: 1000,
+ step: (now, tween) => {
+ this.#resizeDeviceDisplays();
+ },
+ });
+ }
+
+ this.#currentRotation = metadata.rotation;
+ }
+ if (message_data.event == 'VIRTUAL_DEVICE_CAPTURE_IMAGE') {
+ if (this.#deviceConnection.cameraEnabled) {
+ this.#takePhoto();
+ }
+ }
+ if (message_data.event == 'VIRTUAL_DEVICE_DISPLAY_POWER_MODE_CHANGED') {
+ this.#updateDisplayVisibility(metadata.display, metadata.mode);
+ }
+ }
+
+ #updateDeviceStateDetails(lidSwitchOpen, hingeAngle) {
+ let deviceStateDetailsTextLines = [];
+ if (lidSwitchOpen != null) {
+ let state = lidSwitchOpen ? 'Opened' : 'Closed';
+ deviceStateDetailsTextLines.push(`Lid Switch - ${state}`);
+ }
+ if (hingeAngle != null) {
+ deviceStateDetailsTextLines.push(`Hinge Angle - ${hingeAngle}`);
+ }
+ let deviceStateDetailsText = deviceStateDetailsTextLines.join('\n');
+ new DeviceDetailsUpdater()
+ .setDeviceStateDetailsText(deviceStateDetailsText)
+ .update();
+ }
+
+ #updateDeviceHardwareDetails(hardware) {
+ let hardwareDetailsTextLines = [];
+ Object.keys(hardware).forEach((key) => {
+ let value = hardware[key];
+ hardwareDetailsTextLines.push(`${key} - ${value}`);
+ });
+
+ let hardwareDetailsText = hardwareDetailsTextLines.join('\n');
+ new DeviceDetailsUpdater()
+ .setHardwareDetailsText(hardwareDetailsText)
+ .update();
+ }
+
+ // Creates a <video> element and a <div> container element for each display.
+ // The extra <div> container elements are used to maintain the width and
+ // height of the device as the CSS 'transform' property used on the <video>
+ // element for rotating the device only affects the visuals of the element
+ // and not its layout.
+ #createDeviceDisplays() {
+ console.debug(
+ 'Display descriptions: ', this.#deviceConnection.description.displays);
+ this.#displayDescriptions = this.#deviceConnection.description.displays;
+ let anyDisplayLoaded = false;
+ const deviceDisplays = document.getElementById('device-displays');
+ for (const deviceDisplayDescription of this.#displayDescriptions) {
+ let deviceDisplay = document.createElement('div');
+ deviceDisplay.classList.add('device-display');
+ // Start the screen as hidden. Only show when data is ready.
+ deviceDisplay.style.visibility = 'hidden';
+
+ let deviceDisplayInfo = document.createElement("div");
+ deviceDisplayInfo.classList.add("device-display-info");
+ deviceDisplayInfo.id = deviceDisplayDescription.stream_id + '_info';
+ deviceDisplay.appendChild(deviceDisplayInfo);
+
+ let deviceDisplayVideo = document.createElement('video');
+ deviceDisplayVideo.autoplay = true;
+ deviceDisplayVideo.muted = true;
+ deviceDisplayVideo.id = deviceDisplayDescription.stream_id;
+ deviceDisplayVideo.classList.add('device-display-video');
+ deviceDisplayVideo.addEventListener('loadeddata', (evt) => {
+ if (!anyDisplayLoaded) {
+ anyDisplayLoaded = true;
+ this.#onDeviceDisplayLoaded();
+ }
+ });
+ deviceDisplay.appendChild(deviceDisplayVideo);
+
+ deviceDisplays.appendChild(deviceDisplay);
+
+ let stream_id = deviceDisplayDescription.stream_id;
+ this.#deviceConnection.getStream(stream_id)
+ .then(stream => {
+ deviceDisplayVideo.srcObject = stream;
+ })
+ .catch(e => console.error('Unable to get display stream: ', e));
+ }
+ }
+
+ #initializeAdb() {
+ init_adb(
+ this.#deviceConnection, () => this.#showAdbConnected(),
+ () => this.#showAdbError());
+ }
+
+ #showAdbConnected() {
+ // Screen changed messages are not reported until after boot has completed.
+ // Certain default adb buttons change screen state, so wait for boot
+ // completion before enabling these buttons.
+ document.getElementById('status-message').className = 'connected';
+ document.getElementById('status-message').textContent =
+ 'adb connection established successfully.';
+ setTimeout(() => {
+ document.getElementById('status-message').style.visibility = 'hidden';
+ }, 5000);
+ for (const [_, button] of Object.entries(this.#buttons)) {
+ if (button.adb) {
+ button.disabled = false;
+ }
+ }
+ }
+
+ #showAdbError() {
+ document.getElementById('status-message').className = 'error';
+ document.getElementById('status-message').textContent =
+ 'adb connection failed.';
+ document.getElementById('status-message').style.visibility = 'visible';
+ for (const [_, button] of Object.entries(this.#buttons)) {
+ if (button.adb) {
+ button.disabled = true;
+ }
+ }
+ }
+
+ #onDeviceDisplayLoaded() {
+ document.getElementById('status-message').textContent =
+ 'Awaiting bootup and adb connection. Please wait...';
+ this.#resizeDeviceDisplays();
+
+ let deviceDisplayList = document.getElementsByClassName('device-display');
+ for (const deviceDisplay of deviceDisplayList) {
+ deviceDisplay.style.visibility = 'visible';
+ }
+
+ // Enable the buttons after the screen is visible.
+ for (const [key, button] of Object.entries(this.#buttons)) {
+ if (!button.adb) {
+ button.disabled = false;
+ }
+ }
+ // Start the adb connection if it is not already started.
+ this.#initializeAdb();
+ }
+
+ #onRotateButton(e) {
+ // Attempt to init adb again, in case the initial connection failed.
+ // This succeeds immediately if already connected.
+ this.#initializeAdb();
+ if (e.type == 'mousedown') {
+ adbShell(
+ '/vendor/bin/cuttlefish_sensor_injection rotate ' +
+ (this.#currentRotation == 0 ? 'landscape' : 'portrait'))
+ }
+ }
+
+ #onControlPanelButton(e) {
+ if (e.type == 'mouseout' && e.which == 0) {
+ // Ignore mouseout events if no mouse button is pressed.
+ return;
+ }
+ this.#deviceConnection.sendControlMessage(JSON.stringify({
+ command: e.target.dataset.command,
+ button_state: e.type == 'mousedown' ? 'down' : 'up',
+ }));
+ }
+
+ #onKeyboardCaptureToggle(enabled) {
+ if (enabled) {
+ document.addEventListener('keydown', evt => this.#onKeyEvent(evt));
+ document.addEventListener('keyup', evt => this.#onKeyEvent(evt));
+ } else {
+ document.removeEventListener('keydown', evt => this.#onKeyEvent(evt));
+ document.removeEventListener('keyup', evt => this.#onKeyEvent(evt));
+ }
+ }
+
+ #onKeyEvent(e) {
+ e.preventDefault();
+ this.#deviceConnection.sendKeyEvent(e.code, e.type);
+ }
+
+ #startMouseTracking() {
+ let $this = this;
+ let mouseIsDown = false;
+ let mouseCtx = {
+ down: false,
+ touchIdSlotMap: new Map(),
+ touchSlots: [],
+ };
+ function onStartDrag(e) {
+ e.preventDefault();
+
+ // console.debug("mousedown at " + e.pageX + " / " + e.pageY);
+ mouseCtx.down = true;
+
+ $this.#sendEventUpdate(mouseCtx, e);
+ }
+
+ function onEndDrag(e) {
+ e.preventDefault();
+
+ // console.debug("mouseup at " + e.pageX + " / " + e.pageY);
+ mouseCtx.down = false;
+
+ $this.#sendEventUpdate(mouseCtx, e);
+ }
+
+ function onContinueDrag(e) {
+ e.preventDefault();
+
+ // console.debug("mousemove at " + e.pageX + " / " + e.pageY + ", down=" +
+ // mouseIsDown);
+ if (mouseCtx.down) {
+ $this.#sendEventUpdate(mouseCtx, e);
+ }
+ }
+
+ let deviceDisplayList = document.getElementsByClassName('device-display');
+ if (window.PointerEvent) {
+ for (const deviceDisplay of deviceDisplayList) {
+ deviceDisplay.addEventListener('pointerdown', onStartDrag);
+ deviceDisplay.addEventListener('pointermove', onContinueDrag);
+ deviceDisplay.addEventListener('pointerup', onEndDrag);
+ }
+ } else if (window.TouchEvent) {
+ for (const deviceDisplay of deviceDisplayList) {
+ deviceDisplay.addEventListener('touchstart', onStartDrag);
+ deviceDisplay.addEventListener('touchmove', onContinueDrag);
+ deviceDisplay.addEventListener('touchend', onEndDrag);
+ }
+ } else if (window.MouseEvent) {
+ for (const deviceDisplay of deviceDisplayList) {
+ deviceDisplay.addEventListener('mousedown', onStartDrag);
+ deviceDisplay.addEventListener('mousemove', onContinueDrag);
+ deviceDisplay.addEventListener('mouseup', onEndDrag);
+ }
+ }
+ }
+
+ #sendEventUpdate(ctx, e) {
+ let eventType = e.type.substring(0, 5);
+
+ // The <video> element:
+ const deviceDisplay = e.target;
+
+ // Before the first video frame arrives there is no way to know width and
+ // height of the device's screen, so turn every click into a click at 0x0.
+ // A click at that position is not more dangerous than anywhere else since
+ // the user is clicking blind anyways.
+ const videoWidth = deviceDisplay.videoWidth ? deviceDisplay.videoWidth : 1;
+ const videoHeight =
+ deviceDisplay.videoHeight ? deviceDisplay.videoHeight : 1;
+ const elementWidth =
+ deviceDisplay.offsetWidth ? deviceDisplay.offsetWidth : 1;
+ const elementHeight =
+ deviceDisplay.offsetHeight ? deviceDisplay.offsetHeight : 1;
+
+ // vh*ew > eh*vw? then scale h instead of w
+ const scaleHeight = videoHeight * elementWidth > videoWidth * elementHeight;
+ let elementScaling = 0, videoScaling = 0;
+ if (scaleHeight) {
+ elementScaling = elementHeight;
+ videoScaling = videoHeight;
+ } else {
+ elementScaling = elementWidth;
+ videoScaling = videoWidth;
+ }
+
+ // The screen uses the 'object-fit: cover' property in order to completely
+ // fill the element while maintaining the screen content's aspect ratio.
+ // Therefore:
+ // - If vh*ew > eh*vw, w is scaled so that content width == element width
+ // - Otherwise, h is scaled so that content height == element height
+ const scaleWidth = videoHeight * elementWidth > videoWidth * elementHeight;
+
+ // Convert to coordinates relative to the video by scaling.
+ // (This matches the scaling used by 'object-fit: cover'.)
+ //
+ // This scaling is needed to translate from the in-browser x/y to the
+ // on-device x/y.
+ // - When the device screen has not been resized, this is simple: scale
+ // the coordinates based on the ratio between the input video size and
+ // the in-browser size.
+ // - When the device screen has been resized, this scaling is still needed
+ // even though the in-browser size and device size are identical. This
+ // is due to the way WindowManager handles a resized screen, resized via
+ // `adb shell wm size`:
+ // - The ABS_X and ABS_Y max values of the screen retain their
+ // original values equal to the value set when launching the device
+ // (which equals the video size here).
+ // - The sent ABS_X and ABS_Y values need to be scaled based on the
+ // ratio between the max size (video size) and in-browser size.
+ const scaling =
+ scaleWidth ? videoWidth / elementWidth : videoHeight / elementHeight;
+
+ let xArr = [];
+ let yArr = [];
+ let idArr = [];
+ let slotArr = [];
+
+ if (eventType == 'mouse' || eventType == 'point') {
+ xArr.push(e.offsetX);
+ yArr.push(e.offsetY);
+
+ let thisId = -1;
+ if (eventType == 'point') {
+ thisId = e.pointerId;
+ }
+
+ slotArr.push(0);
+ idArr.push(thisId);
+ } else if (eventType == 'touch') {
+ // touchstart: list of touch points that became active
+ // touchmove: list of touch points that changed
+ // touchend: list of touch points that were removed
+ let changes = e.changedTouches;
+ let rect = e.target.getBoundingClientRect();
+ for (let i = 0; i < changes.length; i++) {
+ xArr.push(changes[i].pageX - rect.left);
+ yArr.push(changes[i].pageY - rect.top);
+ if (ctx.touchIdSlotMap.has(changes[i].identifier)) {
+ let slot = ctx.touchIdSlotMap.get(changes[i].identifier);
+
+ slotArr.push(slot);
+ if (e.type == 'touchstart') {
+ // error
+ console.error('touchstart when already have slot');
+ return;
+ } else if (e.type == 'touchmove') {
+ idArr.push(changes[i].identifier);
+ } else if (e.type == 'touchend') {
+ ctx.touchSlots[slot] = false;
+ ctx.touchIdSlotMap.delete(changes[i].identifier);
+ idArr.push(-1);
+ }
+ } else {
+ if (e.type == 'touchstart') {
+ let slot = -1;
+ for (let j = 0; j < ctx.touchSlots.length; j++) {
+ if (!ctx.touchSlots[j]) {
+ slot = j;
+ break;
+ }
+ }
+ if (slot == -1) {
+ slot = ctx.touchSlots.length;
+ ctx.touchSlots.push(true);
+ }
+ slotArr.push(slot);
+ ctx.touchSlots[slot] = true;
+ ctx.touchIdSlotMap.set(changes[i].identifier, slot);
+ idArr.push(changes[i].identifier);
+ } else if (e.type == 'touchmove') {
+ // error
+ console.error('touchmove when no slot');
+ return;
+ } else if (e.type == 'touchend') {
+ // error
+ console.error('touchend when no slot');
+ return;
+ }
+ }
+ }
+ }
+
+ for (let i = 0; i < xArr.length; i++) {
+ xArr[i] = xArr[i] * scaling;
+ yArr[i] = yArr[i] * scaling;
+
+ // Substract the offset produced by the difference in aspect ratio, if
+ // any.
+ if (scaleWidth) {
+ // Width was scaled, leaving excess content height, so subtract from y.
+ yArr[i] -= (elementHeight * scaling - videoHeight) / 2;
+ } else {
+ // Height was scaled, leaving excess content width, so subtract from x.
+ xArr[i] -= (elementWidth * scaling - videoWidth) / 2;
+ }
+
+ xArr[i] = Math.trunc(xArr[i]);
+ yArr[i] = Math.trunc(yArr[i]);
+ }
+
+ // NOTE: Rotation is handled automatically because the CSS rotation through
+ // transforms also rotates the coordinates of events on the object.
+
+ const display_label = deviceDisplay.id;
+
+ this.#deviceConnection.sendMultiTouch(
+ {idArr, xArr, yArr, down: ctx.down, slotArr, display_label});
+ }
+
+ #updateDisplayVisibility(displayId, powerMode) {
+ const display = document.getElementById('display_' + displayId).parentElement;
+ if (display == null) {
+ console.error('Unknown display id: ' + displayId);
+ return;
+ }
+ switch (powerMode) {
+ case 'On':
+ display.style.visibility = 'visible';
+ break;
+ case 'Off':
+ display.style.visibility = 'hidden';
+ break;
+ default:
+ console.error('Display ' + displayId + ' has unknown display power mode: ' + powerMode);
+ }
+ }
+
+ #onMicCaptureToggle(enabled) {
+ return this.#deviceConnection.useMic(enabled);
+ }
+
+ #onCameraCaptureToggle(enabled) {
+ return this.#deviceConnection.useCamera(enabled);
+ }
+
+ #getZeroPaddedString(value, desiredLength) {
+ const s = String(value);
+ return '0'.repeat(desiredLength - s.length) + s;
+ }
+
+ #getTimestampString() {
+ const now = new Date();
+ return [
+ now.getFullYear(),
+ this.#getZeroPaddedString(now.getMonth(), 2),
+ this.#getZeroPaddedString(now.getDay(), 2),
+ this.#getZeroPaddedString(now.getHours(), 2),
+ this.#getZeroPaddedString(now.getMinutes(), 2),
+ this.#getZeroPaddedString(now.getSeconds(), 2),
+ ].join('_');
+ }
+
+ #onVideoCaptureToggle(enabled) {
+ const recordToggle = document.getElementById('record-video-control');
+ if (enabled) {
+ let recorders = [];
+
+ const timestamp = this.#getTimestampString();
+
+ let deviceDisplayVideoList =
+ document.getElementsByClassName('device-display-video');
+ for (let i = 0; i < deviceDisplayVideoList.length; i++) {
+ const deviceDisplayVideo = deviceDisplayVideoList[i];
+
+ const recorder = new MediaRecorder(deviceDisplayVideo.captureStream());
+ const recordedData = [];
+
+ recorder.ondataavailable = event => recordedData.push(event.data);
+ recorder.onstop = event => {
+ const recording = new Blob(recordedData, { type: "video/webm" });
+
+ const downloadLink = document.createElement('a');
+ downloadLink.setAttribute('download', timestamp + '_display_' + i + '.webm');
+ downloadLink.setAttribute('href', URL.createObjectURL(recording));
+ downloadLink.click();
+ };
+
+ recorder.start();
+ recorders.push(recorder);
+ }
+ this.#recording['recorders'] = recorders;
+
+ recordToggle.style.backgroundColor = 'red';
+ } else {
+ for (const recorder of this.#recording['recorders']) {
+ recorder.stop();
+ }
+ recordToggle.style.backgroundColor = '';
+ }
+ return Promise.resolve(enabled);
+ }
+
+ #onCustomShellButton(shell_command, e) {
+ // Attempt to init adb again, in case the initial connection failed.
+ // This succeeds immediately if already connected.
+ this.#initializeAdb();
+ if (e.type == 'mousedown') {
+ adbShell(shell_command);
+ }
+ }
+} // DeviceControlApp
+
+window.addEventListener("load", async evt => {
+ try {
+ setupMessages();
+ let connectorModule = await import('./server_connector.js');
+ let deviceConnection = await ConnectDevice(
+ connectorModule.deviceId(), await connectorModule.createConnector());
+ let deviceControlApp = new DeviceControlApp(deviceConnection);
+ deviceControlApp.start();
+ document.getElementById('device-connection').style.display = 'block';
+ } catch(err) {
+ console.error('Unable to connect: ', err);
+ showError(
+ 'No connection to the guest device. ' +
+ 'Please ensure the WebRTC process on the host machine is active.');
+ }
+ document.getElementById('loader').style.display = 'none';
+});
diff --git a/host/frontend/webrtc/client/js/cf_webrtc.js b/host/frontend/webrtc/client/js/cf_webrtc.js
new file mode 100644
index 0000000..5c91383
--- /dev/null
+++ b/host/frontend/webrtc/client/js/cf_webrtc.js
@@ -0,0 +1,496 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function createDataChannel(pc, label, onMessage) {
+ console.debug('creating data channel: ' + label);
+ let dataChannel = pc.createDataChannel(label);
+ // Return an object with a send function like that of the dataChannel, but
+ // that only actually sends over the data channel once it has connected.
+ return {
+ channelPromise: new Promise((resolve, reject) => {
+ dataChannel.onopen = (event) => {
+ resolve(dataChannel);
+ };
+ dataChannel.onclose = () => {
+ console.debug(
+ 'Data channel=' + label + ' state=' + dataChannel.readyState);
+ };
+ dataChannel.onmessage = onMessage ? onMessage : (msg) => {
+ console.debug('Data channel=' + label + ' data="' + msg.data + '"');
+ };
+ dataChannel.onerror = err => {
+ reject(err);
+ };
+ }),
+ send: function(msg) {
+ this.channelPromise = this.channelPromise.then(channel => {
+ channel.send(msg);
+ return channel;
+ })
+ },
+ };
+}
+
+function awaitDataChannel(pc, label, onMessage) {
+ console.debug('expecting data channel: ' + label);
+ // Return an object with a send function like that of the dataChannel, but
+ // that only actually sends over the data channel once it has connected.
+ return {
+ channelPromise: new Promise((resolve, reject) => {
+ let prev_ondatachannel = pc.ondatachannel;
+ pc.ondatachannel = ev => {
+ let dataChannel = ev.channel;
+ if (dataChannel.label == label) {
+ dataChannel.onopen = (event) => {
+ resolve(dataChannel);
+ };
+ dataChannel.onclose = () => {
+ console.debug(
+ 'Data channel=' + label + ' state=' + dataChannel.readyState);
+ };
+ dataChannel.onmessage = onMessage ? onMessage : (msg) => {
+ console.debug('Data channel=' + label + ' data="' + msg.data + '"');
+ };
+ dataChannel.onerror = err => {
+ reject(err);
+ };
+ } else if (prev_ondatachannel) {
+ prev_ondatachannel(ev);
+ }
+ };
+ }),
+ send: function(msg) {
+ this.channelPromise = this.channelPromise.then(channel => {
+ channel.send(msg);
+ return channel;
+ })
+ },
+ };
+}
+
+class DeviceConnection {
+ #pc;
+ #control;
+ #description;
+
+ #cameraDataChannel;
+ #cameraInputQueue;
+ #controlChannel;
+ #inputChannel;
+ #adbChannel;
+ #bluetoothChannel;
+
+ #streams;
+ #streamPromiseResolvers;
+ #micSenders = [];
+ #cameraSenders = [];
+ #camera_res_x;
+ #camera_res_y;
+
+ #onAdbMessage;
+ #onControlMessage;
+ #onBluetoothMessage;
+
+ constructor(pc, control) {
+ this.#pc = pc;
+ this.#control = control;
+ this.#cameraDataChannel = pc.createDataChannel('camera-data-channel');
+ this.#cameraDataChannel.binaryType = 'arraybuffer';
+ this.#cameraInputQueue = new Array();
+ var self = this;
+ this.#cameraDataChannel.onbufferedamountlow = () => {
+ if (self.#cameraInputQueue.length > 0) {
+ self.sendCameraData(self.#cameraInputQueue.shift());
+ }
+ };
+ this.#inputChannel = createDataChannel(pc, 'input-channel');
+ this.#adbChannel = createDataChannel(pc, 'adb-channel', (msg) => {
+ if (this.#onAdbMessage) {
+ this.#onAdbMessage(msg.data);
+ } else {
+ console.error('Received unexpected ADB message');
+ }
+ });
+ this.#controlChannel = awaitDataChannel(pc, 'device-control', (msg) => {
+ if (this.#onControlMessage) {
+ this.#onControlMessage(msg);
+ } else {
+ console.error('Received unexpected Control message');
+ }
+ });
+ this.#bluetoothChannel =
+ createDataChannel(pc, 'bluetooth-channel', (msg) => {
+ if (this.#onBluetoothMessage) {
+ this.#onBluetoothMessage(msg.data);
+ } else {
+ console.error('Received unexpected Bluetooth message');
+ }
+ });
+ this.#streams = {};
+ this.#streamPromiseResolvers = {};
+
+ pc.addEventListener('track', e => {
+ console.debug('Got remote stream: ', e);
+ for (const stream of e.streams) {
+ this.#streams[stream.id] = stream;
+ if (this.#streamPromiseResolvers[stream.id]) {
+ for (let resolver of this.#streamPromiseResolvers[stream.id]) {
+ resolver();
+ }
+ delete this.#streamPromiseResolvers[stream.id];
+ }
+ }
+ });
+ }
+
+ set description(desc) {
+ this.#description = desc;
+ }
+
+ get description() {
+ return this.#description;
+ }
+
+ get imageCapture() {
+ if (this.#cameraSenders && this.#cameraSenders.length > 0) {
+ let track = this.#cameraSenders[0].track;
+ return new ImageCapture(track);
+ }
+ return undefined;
+ }
+
+ get cameraWidth() {
+ return this.#camera_res_x;
+ }
+
+ get cameraHeight() {
+ return this.#camera_res_y;
+ }
+
+ get cameraEnabled() {
+ return this.#cameraSenders && this.#cameraSenders.length > 0;
+ }
+
+ getStream(stream_id) {
+ return new Promise((resolve, reject) => {
+ if (this.#streams[stream_id]) {
+ resolve(this.#streams[stream_id]);
+ } else {
+ if (!this.#streamPromiseResolvers[stream_id]) {
+ this.#streamPromiseResolvers[stream_id] = [];
+ }
+ this.#streamPromiseResolvers[stream_id].push(resolve);
+ }
+ });
+ }
+
+ #sendJsonInput(evt) {
+ this.#inputChannel.send(JSON.stringify(evt));
+ }
+
+ sendMousePosition({x, y, down, display_label}) {
+ this.#sendJsonInput({
+ type: 'mouse',
+ down: down ? 1 : 0,
+ x,
+ y,
+ display_label,
+ });
+ }
+
+ // TODO (b/124121375): This should probably be an array of pointer events and
+ // have different properties.
+ sendMultiTouch({idArr, xArr, yArr, down, slotArr, display_label}) {
+ this.#sendJsonInput({
+ type: 'multi-touch',
+ id: idArr,
+ x: xArr,
+ y: yArr,
+ down: down ? 1 : 0,
+ slot: slotArr,
+ display_label: display_label,
+ });
+ }
+
+ sendKeyEvent(code, type) {
+ this.#sendJsonInput({type: 'keyboard', keycode: code, event_type: type});
+ }
+
+ disconnect() {
+ this.#pc.close();
+ }
+
+ // Sends binary data directly to the in-device adb daemon (skipping the host)
+ sendAdbMessage(msg) {
+ this.#adbChannel.send(msg);
+ }
+
+ // Provide a callback to receive data from the in-device adb daemon
+ onAdbMessage(cb) {
+ this.#onAdbMessage = cb;
+ }
+
+ // Send control commands to the device
+ sendControlMessage(msg) {
+ this.#controlChannel.send(msg);
+ }
+
+ async #useDevice(in_use, senders_arr, device_opt) {
+ // An empty array means no tracks are currently in use
+ if (senders_arr.length > 0 === !!in_use) {
+ console.warn('Device is already ' + (in_use ? '' : 'not ') + 'in use');
+ return in_use;
+ }
+ let renegotiation_needed = false;
+ if (in_use) {
+ try {
+ let stream = await navigator.mediaDevices.getUserMedia(device_opt);
+ stream.getTracks().forEach(track => {
+ console.info(`Using ${track.kind} device: ${track.label}`);
+ senders_arr.push(this.#pc.addTrack(track));
+ renegotiation_needed = true;
+ });
+ } catch (e) {
+ console.error('Failed to add stream to peer connection: ', e);
+ // Don't return yet, if there were errors some tracks may have been
+ // added so the connection should be renegotiated again.
+ }
+ } else {
+ for (const sender of senders_arr) {
+ console.info(
+ `Removing ${sender.track.kind} device: ${sender.track.label}`);
+ let track = sender.track;
+ track.stop();
+ this.#pc.removeTrack(sender);
+ renegotiation_needed = true;
+ }
+ // Empty the array passed by reference, just assigning [] won't do that.
+ senders_arr.length = 0;
+ }
+ if (renegotiation_needed) {
+ this.#control.renegotiateConnection();
+ }
+ // Return the new state
+ return senders_arr.length > 0;
+ }
+
+ async useMic(in_use) {
+ return this.#useDevice(in_use, this.#micSenders, {audio: true, video: false});
+ }
+
+ async useCamera(in_use) {
+ return this.#useDevice(in_use, this.#micSenders, {audio: false, video: true});
+ }
+
+ sendCameraResolution(stream) {
+ const cameraTracks = stream.getVideoTracks();
+ if (cameraTracks.length > 0) {
+ const settings = cameraTracks[0].getSettings();
+ this.#camera_res_x = settings.width;
+ this.#camera_res_y = settings.height;
+ this.sendControlMessage(JSON.stringify({
+ command: 'camera_settings',
+ width: settings.width,
+ height: settings.height,
+ frame_rate: settings.frameRate,
+ facing: settings.facingMode
+ }));
+ }
+ }
+
+ sendOrQueueCameraData(data) {
+ if (this.#cameraDataChannel.bufferedAmount > 0 ||
+ this.#cameraInputQueue.length > 0) {
+ this.#cameraInputQueue.push(data);
+ } else {
+ this.sendCameraData(data);
+ }
+ }
+
+ sendCameraData(data) {
+ const MAX_SIZE = 65535;
+ const END_MARKER = 'EOF';
+ for (let i = 0; i < data.byteLength; i += MAX_SIZE) {
+ // range is clamped to the valid index range
+ this.#cameraDataChannel.send(data.slice(i, i + MAX_SIZE));
+ }
+ this.#cameraDataChannel.send(END_MARKER);
+ }
+
+ // Provide a callback to receive control-related comms from the device
+ onControlMessage(cb) {
+ this.#onControlMessage = cb;
+ }
+
+ sendBluetoothMessage(msg) {
+ this.#bluetoothChannel.send(msg);
+ }
+
+ onBluetoothMessage(cb) {
+ this.#onBluetoothMessage = cb;
+ }
+
+ // Provide a callback to receive connectionstatechange states.
+ onConnectionStateChange(cb) {
+ this.#pc.addEventListener(
+ 'connectionstatechange', evt => cb(this.#pc.connectionState));
+ }
+}
+
+class Controller {
+ #pc;
+ #serverConnector;
+
+ constructor(serverConnector) {
+ this.#serverConnector = serverConnector;
+ serverConnector.onDeviceMsg(msg => this.#onDeviceMessage(msg));
+ }
+
+ #onDeviceMessage(message) {
+ let type = message.type;
+ switch (type) {
+ case 'offer':
+ this.#onOffer({type: 'offer', sdp: message.sdp});
+ break;
+ case 'answer':
+ this.#onAnswer({type: 'answer', sdp: message.sdp});
+ break;
+ case 'ice-candidate':
+ this.#onIceCandidate(new RTCIceCandidate({
+ sdpMid: message.mid,
+ sdpMLineIndex: message.mLineIndex,
+ candidate: message.candidate
+ }));
+ break;
+ case 'error':
+ console.error('Device responded with error message: ', message.error);
+ break;
+ default:
+ console.error('Unrecognized message type from device: ', type);
+ }
+ }
+
+ async #sendClientDescription(desc) {
+ console.debug('sendClientDescription');
+ return this.#serverConnector.sendToDevice({type: 'answer', sdp: desc.sdp});
+ }
+
+ async #sendIceCandidate(candidate) {
+ console.debug('sendIceCandidate');
+ return this.#serverConnector.sendToDevice({type: 'ice-candidate', candidate});
+ }
+
+ async #onOffer(desc) {
+ console.debug('Remote description (offer): ', desc);
+ try {
+ await this.#pc.setRemoteDescription(desc);
+ let answer = await this.#pc.createAnswer();
+ console.debug('Answer: ', answer);
+ await this.#pc.setLocalDescription(answer);
+ await this.#sendClientDescription(answer);
+ } catch (e) {
+ console.error('Error processing remote description (offer)', e)
+ throw e;
+ }
+ }
+
+ async #onAnswer(answer) {
+ console.debug('Remote description (answer): ', answer);
+ try {
+ await this.#pc.setRemoteDescription(answer);
+ } catch (e) {
+ console.error('Error processing remote description (answer)', e)
+ throw e;
+ }
+ }
+
+ #onIceCandidate(iceCandidate) {
+ console.debug(`Remote ICE Candidate: `, iceCandidate);
+ this.#pc.addIceCandidate(iceCandidate);
+ }
+
+ ConnectDevice(pc) {
+ this.#pc = pc;
+ console.debug('ConnectDevice');
+ // ICE candidates will be generated when we add the offer. Adding it here
+ // instead of in _onOffer because this function is called once per peer
+ // connection, while _onOffer may be called more than once due to
+ // renegotiations.
+ this.#pc.addEventListener('icecandidate', evt => {
+ if (evt.candidate) this.#sendIceCandidate(evt.candidate);
+ });
+ this.#serverConnector.sendToDevice({type: 'request-offer'});
+ }
+
+ async renegotiateConnection() {
+ console.debug('Re-negotiating connection');
+ let offer = await this.#pc.createOffer();
+ console.debug('Local description (offer): ', offer);
+ await this.#pc.setLocalDescription(offer);
+ this.#serverConnector.sendToDevice({type: 'offer', sdp: offer.sdp});
+ }
+}
+
+function createPeerConnection(infra_config) {
+ let pc_config = {iceServers: []};
+ for (const stun of infra_config.ice_servers) {
+ pc_config.iceServers.push({urls: 'stun:' + stun});
+ }
+ let pc = new RTCPeerConnection(pc_config);
+
+ pc.addEventListener('icecandidate', evt => {
+ console.debug('Local ICE Candidate: ', evt.candidate);
+ });
+ pc.addEventListener('iceconnectionstatechange', evt => {
+ console.debug(`ICE State Change: ${pc.iceConnectionState}`);
+ });
+ pc.addEventListener(
+ 'connectionstatechange',
+ evt => console.debug(
+ `WebRTC Connection State Change: ${pc.connectionState}`));
+ return pc;
+}
+
+export async function Connect(deviceId, serverConnector) {
+ let requestRet = await serverConnector.requestDevice(deviceId);
+ let deviceInfo = requestRet.deviceInfo;
+ let infraConfig = requestRet.infraConfig;
+ console.debug('Device available:');
+ console.debug(deviceInfo);
+ let pc_config = {iceServers: []};
+ if (infraConfig.ice_servers && infraConfig.ice_servers.length > 0) {
+ for (const server of infraConfig.ice_servers) {
+ pc_config.iceServers.push(server);
+ }
+ }
+ let pc = createPeerConnection(infraConfig);
+
+ let control = new Controller(serverConnector);
+ let deviceConnection = new DeviceConnection(pc, control);
+ deviceConnection.description = deviceInfo;
+
+ return new Promise((resolve, reject) => {
+ pc.addEventListener('connectionstatechange', evt => {
+ let state = pc.connectionState;
+ if (state == 'connected') {
+ resolve(deviceConnection);
+ } else if (state == 'failed') {
+ reject(evt);
+ }
+ });
+ control.ConnectDevice(pc);
+ });
+}
diff --git a/host/frontend/webrtc/client/js/controls.js b/host/frontend/webrtc/client/js/controls.js
new file mode 100644
index 0000000..268c7d8
--- /dev/null
+++ b/host/frontend/webrtc/client/js/controls.js
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function createToggleControl(elm, iconName, onChangeCb) {
+ let icon = document.createElement('span');
+ icon.classList.add('toggle-control-icon');
+ icon.classList.add('material-icons-outlined');
+ if (iconName) {
+ icon.appendChild(document.createTextNode(iconName));
+ }
+ elm.appendChild(icon);
+ let toggle = document.createElement('label');
+ toggle.classList.add('toggle-control-switch');
+ let input = document.createElement('input');
+ input.type = 'checkbox';
+ toggle.appendChild(input);
+ let slider = document.createElement('span');
+ slider.classList.add('toggle-control-slider');
+ toggle.appendChild(slider);
+ elm.classList.add('toggle-control');
+ elm.appendChild(toggle);
+ return {
+ // A callback can later be associated with the toggle element by calling
+ // .OnClick(onChangeCb) on the returned object. The callback should accept a
+ // boolean parameter indicating whether the toggle is in ON position and
+ // return a promise of the new position.
+ OnClick: cb => input.onchange =
+ e => {
+ let nextPr = cb(e.target.checked);
+ if (nextPr && 'then' in nextPr) {
+ nextPr.then(checked => {
+ e.target.checked = !!checked;
+ });
+ }
+ },
+ };
+}
+
+function createButtonListener(button_id_class, func,
+ deviceConnection, listener) {
+ let buttons = [];
+ let ele = document.getElementById(button_id_class);
+ if (ele != null) {
+ buttons.push(ele);
+ } else {
+ buttons = document.getElementsByClassName(button_id_class);
+ }
+ for (var button of buttons) {
+ if (func != null) {
+ button.onclick = func;
+ }
+ button.addEventListener('mousedown', listener);
+ }
+}
+
+function createInputListener(input_id, func, listener) {
+ input = document.getElementById(input_id);
+ if (func != null) {
+ input.oninput = func;
+ }
+ input.addEventListener('input', listener);
+}
+
+function validateMacAddress(val) {
+ var regex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;
+ return (regex.test(val));
+}
+
+function validateMacWrapper() {
+ let type = document.getElementById('bluetooth-wizard-type').value;
+ let button = document.getElementById("bluetooth-wizard-device");
+ let macField = document.getElementById('bluetooth-wizard-mac');
+ if (this.id == 'bluetooth-wizard-type') {
+ if (type == "remote_loopback") {
+ button.disabled = false;
+ macField.setCustomValidity('');
+ macField.disabled = true;
+ macField.required = false;
+ macField.placeholder = 'N/A';
+ macField.value = '';
+ return;
+ }
+ }
+ macField.disabled = false;
+ macField.required = true;
+ macField.placeholder = 'Device MAC';
+ if (validateMacAddress($(macField).val())) {
+ button.disabled = false;
+ macField.setCustomValidity('');
+ } else {
+ button.disabled = true;
+ macField.setCustomValidity('MAC address invalid');
+ }
+}
+
+$('[validate-mac]').bind('input', validateMacWrapper);
+$('[validate-mac]').bind('select', validateMacWrapper);
+
+function parseDevice(device) {
+ let id, name, mac;
+ var regex = /([0-9]+):([^@ ]*)(@(([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})))?/;
+ if (regex.test(device)) {
+ let regexMatches = device.match(regex);
+ id = regexMatches[1];
+ name = regexMatches[2];
+ mac = regexMatches[4];
+ }
+ if (mac === undefined) {
+ mac = "";
+ }
+ return [id, name, mac];
+}
+
+function btUpdateAdded(devices) {
+ let deviceArr = devices.split('\r\n');
+ let [id, name, mac] = parseDevice(deviceArr[0]);
+ if (name) {
+ let div = document.getElementById('bluetooth-wizard-confirm').getElementsByClassName('bluetooth-text')[1];
+ div.innerHTML = "";
+ div.innerHTML += "<p>Name: <b>" + id + "</b></p>";
+ div.innerHTML += "<p>Type: <b>" + name + "</b></p>";
+ div.innerHTML += "<p>MAC Addr: <b>" + mac + "</b></p>";
+ return true;
+ }
+ return false;
+}
+
+function parsePhy(phy) {
+ let id = phy.substring(0, phy.indexOf(":"));
+ phy = phy.substring(phy.indexOf(":") + 1);
+ let name = phy.substring(0, phy.indexOf(":"));
+ let devices = phy.substring(phy.indexOf(":") + 1);
+ return [id, name, devices];
+}
+
+function btParsePhys(phys) {
+ if (phys.indexOf("Phys:") < 0) {
+ return null;
+ }
+ let phyDict = {};
+ phys = phys.split('Phys:')[1];
+ let phyArr = phys.split('\r\n');
+ for (var phy of phyArr.slice(1)) {
+ phy = phy.trim();
+ if (phy.length == 0 || phy.indexOf("deleted") >= 0) {
+ continue;
+ }
+ let [id, name, devices] = parsePhy(phy);
+ phyDict[name] = id;
+ }
+ return phyDict;
+}
+
+function btUpdateDeviceList(devices) {
+ let deviceArr = devices.split('\r\n');
+ if (deviceArr[0].indexOf("Devices:") >= 0) {
+ let div = document.getElementById('bluetooth-list').getElementsByClassName('bluetooth-text')[0];
+ div.innerHTML = "";
+ let count = 0;
+ for (var device of deviceArr.slice(1)) {
+ if (device.indexOf("Phys:") >= 0) {
+ break;
+ }
+ count++;
+ if (device.indexOf("deleted") >= 0) {
+ continue;
+ }
+ let [id, name, mac] = parseDevice(device);
+ let innerDiv = '<div><button title="Delete" data-device-id="'
+ innerDiv += id;
+ innerDiv += '" class="bluetooth-list-trash material-icons">delete</button>';
+ innerDiv += name;
+ if (mac) {
+ innerDiv += " | "
+ innerDiv += mac;
+ }
+ innerDiv += '</div>';
+ div.innerHTML += innerDiv;
+ }
+ return count;
+ }
+ return -1;
+}
+
+function createControlPanelButton(
+ command, title, icon_name, listener,
+ parent_id = 'control-panel-default-buttons') {
+ let button = document.createElement('button');
+ document.getElementById(parent_id).appendChild(button);
+ button.title = title;
+ button.dataset.command = command;
+ button.disabled = true;
+ // Capture mousedown/up/out commands instead of click to enable
+ // hold detection. mouseout is used to catch if the user moves the
+ // mouse outside the button while holding down.
+ button.addEventListener('mousedown', listener);
+ button.addEventListener('mouseup', listener);
+ button.addEventListener('mouseout', listener);
+ // Set the button image using Material Design icons.
+ // See http://google.github.io/material-design-icons
+ // and https://material.io/resources/icons
+ button.classList.add('material-icons');
+ button.innerHTML = icon_name;
+ return button;
+}
+
+function positionModal(button_id, modal_id) {
+ const modalButton = document.getElementById(button_id);
+ const modalDiv = document.getElementById(modal_id);
+
+ // Position the modal to the right of the show modal button.
+ modalDiv.style.top = modalButton.offsetTop;
+ modalDiv.style.left = modalButton.offsetWidth + 30;
+}
+
+function createModalButton(button_id, modal_id, close_id, hide_id) {
+ const modalButton = document.getElementById(button_id);
+ const modalDiv = document.getElementById(modal_id);
+ const modalHeader = modalDiv.querySelector('.modal-header');
+ const modalClose = document.getElementById(close_id);
+ const modalDivHide = document.getElementById(hide_id);
+
+ positionModal(button_id, modal_id);
+
+ function showHideModal(show) {
+ if (show) {
+ modalButton.classList.add('modal-button-opened')
+ modalDiv.style.display = 'block';
+ } else {
+ modalButton.classList.remove('modal-button-opened')
+ modalDiv.style.display = 'none';
+ }
+ if (modalDivHide != null) {
+ modalDivHide.style.display = 'none';
+ }
+ }
+ // Allow the show modal button to toggle the modal,
+ modalButton.addEventListener(
+ 'click', evt => showHideModal(modalDiv.style.display != 'block'));
+ // but the close button always closes.
+ modalClose.addEventListener('click', evt => showHideModal(false));
+
+ // Allow the modal to be dragged by the header.
+ let modalOffsets = {
+ midDrag: false,
+ mouseDownOffsetX: null,
+ mouseDownOffsetY: null,
+ };
+ modalHeader.addEventListener('mousedown', evt => {
+ modalOffsets.midDrag = true;
+ // Store the offset of the mouse location from the
+ // modal's current location.
+ modalOffsets.mouseDownOffsetX = parseInt(modalDiv.style.left) - evt.clientX;
+ modalOffsets.mouseDownOffsetY = parseInt(modalDiv.style.top) - evt.clientY;
+ });
+ modalHeader.addEventListener('mousemove', evt => {
+ let offsets = modalOffsets;
+ if (offsets.midDrag) {
+ // Move the modal to the mouse location plus the
+ // offset calculated on the initial mouse-down.
+ modalDiv.style.left = evt.clientX + offsets.mouseDownOffsetX;
+ modalDiv.style.top = evt.clientY + offsets.mouseDownOffsetY;
+ }
+ });
+ document.addEventListener('mouseup', evt => {
+ modalOffsets.midDrag = false;
+ });
+}
+
+function cmdConsole(consoleViewName, consoleInputName) {
+ let consoleView = document.getElementById(consoleViewName);
+
+ let addString =
+ function(str) {
+ consoleView.value += str;
+ consoleView.scrollTop = consoleView.scrollHeight;
+ }
+
+ let addLine =
+ function(line) {
+ addString(line + '\r\n');
+ }
+
+ let commandCallbacks = [];
+
+ let addCommandListener =
+ function(f) {
+ commandCallbacks.push(f);
+ }
+
+ let onCommand =
+ function(cmd) {
+ cmd = cmd.trim();
+
+ if (cmd.length == 0) return;
+
+ commandCallbacks.forEach(f => {
+ f(cmd);
+ })
+ }
+
+ addCommandListener(cmd => addLine('>> ' + cmd));
+
+ let consoleInput = document.getElementById(consoleInputName);
+
+ consoleInput.addEventListener('keydown', e => {
+ if ((e.key && e.key == 'Enter') || e.keyCode == 13) {
+ let command = e.target.value;
+
+ e.target.value = '';
+
+ onCommand(command);
+ }
+ });
+
+ return {
+ consoleView: consoleView,
+ consoleInput: consoleInput,
+ addLine: addLine,
+ addString: addString,
+ addCommandListener: addCommandListener,
+ };
+}
diff --git a/host/frontend/webrtc_operator/assets/js/rootcanal.js b/host/frontend/webrtc/client/js/rootcanal.js
similarity index 84%
rename from host/frontend/webrtc_operator/assets/js/rootcanal.js
rename to host/frontend/webrtc/client/js/rootcanal.js
index 4443bcd..e3783c7 100644
--- a/host/frontend/webrtc_operator/assets/js/rootcanal.js
+++ b/host/frontend/webrtc/client/js/rootcanal.js
@@ -19,12 +19,12 @@
function rootCanalCalculateMessageSize(name, args) {
let result = 0;
- result += 1 + name.length; // length of name + it's data
- result += 1; // count of args
+ result += 1 + name.length; // length of name + it's data
+ result += 1; // count of args
- for(let i = 0; i < args.length; i++) {
- result += 1; // length of args[i]
- result += args[i].length; // data of args[i]
+ for (let i = 0; i < args.length; i++) {
+ result += 1; // length of args[i]
+ result += args[i].length; // data of args[i]
}
return result;
@@ -59,7 +59,7 @@
pos = rootCanalAddString(array, pos, command);
pos = rootCanalAddU8(array, pos, args.length);
- for(let i = 0; i < args.length; i++) {
+ for (let i = 0; i < args.length; i++) {
pos = rootCanalAddString(array, pos, args[i]);
}
@@ -71,4 +71,4 @@
let message = array.slice(1);
return utf8Decoder.decode(message);
-}
\ No newline at end of file
+}
diff --git a/host/frontend/webrtc/client/style.css b/host/frontend/webrtc/client/style.css
new file mode 100644
index 0000000..93aaa05
--- /dev/null
+++ b/host/frontend/webrtc/client/style.css
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+body {
+ background-color:black;
+ margin: 0;
+ touch-action: none;
+ overscroll-behavior: none;
+}
+
+#device-connection {
+ display: none;
+ max-height: 100vh;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+#loader {
+ border-left: 12px solid #4285F4;
+ border-top: 12px solid #34A853;
+ border-right: 12px solid #FBBC05;
+ border-bottom: 12px solid #EA4335;
+ border-radius: 50%;
+ width: 70px;
+ height: 70px;
+ animation: spin 1.2s linear infinite;
+ margin: 100px;
+}
+
+/* Top header row. */
+
+#header {
+ height: 64px;
+ /* Items inside this use a row Flexbox.*/
+ display: flex;
+ align-items: center;
+}
+
+#camera-control {
+ display: none !important;
+}
+#record-video-control {
+ display: none !important;
+}
+
+#app-controls {
+ margin-left: 10px;
+}
+#app-controls > div {
+ display: inline-block;
+ position: relative;
+ margin-right: 6px;
+}
+#device-audio {
+ height: 44px;
+}
+
+#error-message-div {
+ flex-grow: 1;
+}
+#error-message {
+ color: white;
+ font-family: 'Open Sans', sans-serif;
+ padding: 10px;
+ margin: 10px;
+ border-radius: 10px;
+}
+#error-message .close-btn {
+ float: right;
+ cursor: pointer;
+}
+#error-message.hidden {
+ display: none;
+}
+#error-message.warning {
+ /* dark red */
+ background-color: #927836;
+}
+#error-message.error {
+ /* dark red */
+ background-color: #900000;
+}
+#status-div {
+ flex-grow: 1;
+}
+#status-message {
+ color: white;
+ font-family: 'Open Sans', sans-serif;
+ padding: 10px;
+ margin: 10px;
+}
+#status-message.connecting {
+ /* dark yellow */
+ background-color: #927836;
+}
+#status-message.error {
+ /* dark red */
+ background-color: #900000;
+}
+#status-message.connected {
+ /* dark green */
+ background-color: #007000;
+}
+
+/* Control panel buttons and device screen(s). */
+
+#controls-and-displays {
+ height: calc(100% - 84px);
+
+ /* Items inside this use a row Flexbox.*/
+ display: flex;
+}
+
+#controls-and-displays > div {
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+.modal {
+ /* Start out hidden, and use absolute positioning. */
+ display: none;
+ position: absolute;
+
+ border-radius: 10px;
+ padding: 20px;
+ padding-top: 1px;
+
+ background-color: #5f6368ea; /* Semi-transparent Google grey 500 */
+ color: white;
+ font-family: 'Open Sans', sans-serif;
+}
+.modal-header {
+ cursor: move;
+ /* Items inside this use a row Flexbox.*/
+ display: flex;
+ justify-content: space-between;
+}
+.modal-close {
+ color: white;
+ border: none;
+ outline: none;
+ background-color: transparent;
+}
+.modal-button, .modal-button-highlight {
+ background: #e8eaed; /* Google grey 200 */
+ border-radius: 10px;
+ box-shadow: 1px 1px #444444;
+ padding: 10px 20px;
+ color: #000000;
+ display: inline-block;
+ font: normal bold 14px/1 "Open Sans", sans-serif;
+ text-align: center;
+}
+#bluetooth-wizard-mac:valid {
+ border: 2px solid black;
+}
+#bluetooth-wizard-mac:invalid {
+ border: 2px solid red;
+}
+#bluetooth-wizard-mac:invalid + span::before {
+ font-weight: bold;
+ content: 'X';
+ color: red;
+}
+#bluetooth-wizard-mac:valid + span::before {
+ font-weight: bold;
+ content: 'OK';
+ color: green;
+}
+.modal-button {
+ background: #e8eaed; /* Google grey 200 */
+}
+.modal-button-highlight {
+ background: #f4cccc;
+}
+#device-details-modal span {
+ white-space: pre;
+}
+#bluetooth-console-input {
+ width: 100%;
+}
+#bluetooth-console-cmd-label {
+ color: white;
+}
+.bluetooth-text, .bluetooth-text-bold, .bluetooth-text-field input {
+ font: normal 18px/1 "Open Sans", sans-serif;
+}
+.bluetooth-text, .bluetooth-text-bold {
+ color: white;
+}
+.bluetooth-text-bold {
+ font: bold;
+}
+.bluetooth-button {
+ text-align: center;
+}
+.bluetooth-drop-down select {
+ font: normal 18px/1 "Open Sans", sans-serif;
+ color: black;
+ width: 500px;
+ margin: 5px;
+ rows: 10;
+ columns: 60;
+}
+.bluetooth-text-field input {
+ color: black;
+ width: 500px;
+ margin: 5px;
+ rows: 10;
+ columns: 60;
+}
+.bluetooth-list-trash {
+ background: #00000000;
+ border: 0px;
+ color: #ffffff;
+}
+
+.control-panel-column {
+ width: 50px;
+ /* Items inside this use a column Flexbox.*/
+ display: flex;
+ flex-direction: column;
+}
+#control-panel-custom-buttons {
+ display: none;
+ /* Give the custom buttons column a blue background. */
+ background-color: #1c4587ff;
+ height: fit-content;
+ border-radius: 10px;
+}
+
+.control-panel-column button {
+ margin: 0px 0px 5px 0px;
+ height: 50px;
+ font-size: 32px;
+
+ color: #e8eaed; /* Google grey 200 */
+ border: none;
+ outline: none;
+ background-color: transparent;
+}
+.control-panel-column button:disabled {
+ color: #9aa0a6; /* Google grey 500 */
+}
+.control-panel-column button.modal-button-opened {
+ border-radius: 10px;
+ background-color: #5f6368; /* Google grey 700 */
+}
+
+#device-displays {
+ /* Take up the remaining width of the window.*/
+ flex-grow: 1;
+ /* Don't grow taller than the window.*/
+ max-height: 100vh;
+ /* Allows child elements to be positioned relative to this element. */
+ position: relative;
+}
+
+/*
+ * Container <div> used to wrap each display's <video> element which is used for
+ * maintaining each display's width and height while the display is potentially
+ * rotating.
+ */
+.device-display {
+ /* Prevents #device-displays from using this element when computing flex size. */
+ position: absolute;
+}
+
+/* Container <div> to show info about the individual display. */
+.device-display-info {
+ color: white;
+ /* dark green */
+ background-color: #007000;
+ font-family: 'Open Sans', sans-serif;
+ text-indent: 0px;
+ border-radius: 10px;
+ padding: 10px;
+ margin-bottom: 10px;
+}
+
+/* The actual <video> element for each display. */
+.device-display-video {
+ position: absolute;
+ left: 0px;
+ touch-action: none;
+ object-fit: cover;
+}
diff --git a/host/frontend/webrtc/client_server.cpp b/host/frontend/webrtc/client_server.cpp
new file mode 100644
index 0000000..cfd4bb7
--- /dev/null
+++ b/host/frontend/webrtc/client_server.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "host/frontend/webrtc/client_server.h"
+#include <android-base/logging.h>
+
+namespace cuttlefish {
+struct ClientFilesServer::Config {
+ Config(const std::string& dir)
+ : dir_(dir),
+ mount_({
+ .mount_next = nullptr, /* linked-list "next" */
+ .mountpoint = "/", /* mountpoint URL */
+ .origin = dir_.c_str(), /* serve from dir */
+ .def = "client.html", /* default filename */
+ .protocol = nullptr,
+ .cgienv = nullptr,
+ .extra_mimetypes = nullptr,
+ .interpret = nullptr,
+ .cgi_timeout = 0,
+ .cache_max_age = 0,
+ .auth_mask = 0,
+ .cache_reusable = 0,
+ .cache_revalidate = 0,
+ .cache_intermediaries = 0,
+ .origin_protocol = LWSMPRO_FILE, /* files in a dir */
+ .mountpoint_len = 1, /* char count */
+ .basic_auth_login_file = nullptr,
+ }) {
+ memset(&info_, 0, sizeof info_);
+ info_.port = 0; // let the kernel select an available port
+ info_.iface = "127.0.0.1"; // listen only on localhost
+ info_.mounts = &mount_;
+ }
+
+ std::string dir_;
+ lws_http_mount mount_;
+ lws_context_creation_info info_;
+};
+
+ClientFilesServer::ClientFilesServer(std::unique_ptr<Config> config,
+ lws_context* context)
+ : config_(std::move(config)),
+ context_(context),
+ running_(true),
+ server_thread_([this]() { Serve(); }) {}
+
+ClientFilesServer::~ClientFilesServer() {
+ if (running_) {
+ running_ = false;
+ server_thread_.join();
+ }
+ if (context_) {
+ // Release the port and other resources
+ lws_context_destroy(context_);
+ }
+}
+
+std::unique_ptr<ClientFilesServer> ClientFilesServer::New(
+ const std::string& dir) {
+ std::unique_ptr<Config> conf(new Config(dir));
+ if (!conf) {
+ return nullptr;
+ }
+
+ auto ctx = lws_create_context(&conf->info_);
+ if (!ctx) {
+ LOG(ERROR) << "Failed to create lws context";
+ return nullptr;
+ }
+ return std::unique_ptr<ClientFilesServer>(
+ new ClientFilesServer(std::move(conf), ctx));
+}
+
+int ClientFilesServer::port() const {
+ // Get the port for the first (and only) vhost.
+ return lws_get_vhost_listen_port(lws_get_vhost_by_name(context_, "default"));
+}
+
+void ClientFilesServer::Serve() {
+ while (running_) {
+ if (lws_service(context_, 0) < 0) {
+ LOG(ERROR) << "Error serving client files";
+ return;
+ }
+ }
+}
+} // namespace cuttlefish
+
diff --git a/host/frontend/webrtc/client_server.h b/host/frontend/webrtc/client_server.h
new file mode 100644
index 0000000..8d6376e
--- /dev/null
+++ b/host/frontend/webrtc/client_server.h
@@ -0,0 +1,47 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <atomic>
+#include <memory>
+#include <string>
+#include <thread>
+
+#include <libwebsockets.h>
+
+namespace cuttlefish {
+// Utility class to serve the client files in a thread
+class ClientFilesServer {
+ public:
+ ~ClientFilesServer();
+
+ static std::unique_ptr<ClientFilesServer> New(const std::string& dir);
+
+ int port() const;
+
+ private:
+ struct Config;
+
+ ClientFilesServer(std::unique_ptr<Config> config, lws_context* context);
+
+ void Serve();
+
+ std::unique_ptr<Config> config_;
+ lws_context* context_;
+ std::atomic<bool> running_;
+ std::thread server_thread_;
+};
+} // namespace cuttlefish
diff --git a/host/frontend/webrtc/connection_observer.cpp b/host/frontend/webrtc/connection_observer.cpp
index 0975faa..d51f3c1 100644
--- a/host/frontend/webrtc/connection_observer.cpp
+++ b/host/frontend/webrtc/connection_observer.cpp
@@ -96,26 +96,25 @@
* i.e. when it is not in the confirmation UI mode (or TEE),
* the control flow will fall back to this ConnectionObserverForAndroid
*/
-class ConnectionObserverForAndroid
+class ConnectionObserverImpl
: public cuttlefish::webrtc_streaming::ConnectionObserver {
public:
- ConnectionObserverForAndroid(
+ ConnectionObserverImpl(
cuttlefish::InputSockets &input_sockets,
cuttlefish::KernelLogEventsHandler *kernel_log_events_handler,
std::map<std::string, cuttlefish::SharedFD>
commands_to_custom_action_servers,
std::weak_ptr<DisplayHandler> display_handler,
- CameraController *camera_controller)
+ CameraController *camera_controller,
+ cuttlefish::confui::HostVirtualInput &confui_input)
: input_sockets_(input_sockets),
kernel_log_events_handler_(kernel_log_events_handler),
commands_to_custom_action_servers_(commands_to_custom_action_servers),
weak_display_handler_(display_handler),
- camera_controller_(camera_controller) {}
- virtual ~ConnectionObserverForAndroid() {
+ camera_controller_(camera_controller),
+ confui_input_(confui_input) {}
+ virtual ~ConnectionObserverImpl() {
auto display_handler = weak_display_handler_.lock();
- if (display_handler) {
- display_handler->DecClientCount();
- }
if (kernel_log_subscription_id_ != -1) {
kernel_log_events_handler_->Unsubscribe(kernel_log_subscription_id_);
}
@@ -125,7 +124,6 @@
/*ctrl_msg_sender*/) override {
auto display_handler = weak_display_handler_.lock();
if (display_handler) {
- display_handler->IncClientCount();
std::thread th([this]() {
// The encoder in libwebrtc won't drop 5 consecutive frames due to frame
// size, so we make sure at least 5 frames are sent every time a client
@@ -142,69 +140,89 @@
});
th.detach();
}
+ }
+
+ void OnTouchEvent(const std::string &display_label, int x, int y,
+ bool down) override {
+ if (confui_input_.IsConfUiActive()) {
+ ConfUiLog(DEBUG) << "delivering a touch event in confirmation UI mode";
+ confui_input_.TouchEvent(x, y, down);
+ return;
+ }
+ auto buffer = GetEventBuffer();
+ if (!buffer) {
+ LOG(ERROR) << "Failed to allocate event buffer";
+ return;
+ }
+ buffer->AddEvent(EV_ABS, ABS_X, x);
+ buffer->AddEvent(EV_ABS, ABS_Y, y);
+ buffer->AddEvent(EV_KEY, BTN_TOUCH, down);
+ buffer->AddEvent(EV_SYN, SYN_REPORT, 0);
+ cuttlefish::WriteAll(input_sockets_.GetTouchClientByLabel(display_label),
+ reinterpret_cast<const char *>(buffer->data()),
+ buffer->size());
+ }
+
+ void OnMultiTouchEvent(const std::string &display_label, Json::Value id,
+ Json::Value slot, Json::Value x, Json::Value y,
+ bool down, int size) {
+ auto buffer = GetEventBuffer();
+ if (!buffer) {
+ LOG(ERROR) << "Failed to allocate event buffer";
+ return;
}
- void OnTouchEvent(const std::string &display_label, int x, int y,
- bool down) override {
- auto buffer = GetEventBuffer();
- if (!buffer) {
- LOG(ERROR) << "Failed to allocate event buffer";
- return;
- }
- buffer->AddEvent(EV_ABS, ABS_X, x);
- buffer->AddEvent(EV_ABS, ABS_Y, y);
- buffer->AddEvent(EV_KEY, BTN_TOUCH, down);
- buffer->AddEvent(EV_SYN, SYN_REPORT, 0);
- cuttlefish::WriteAll(input_sockets_.GetTouchClientByLabel(display_label),
- reinterpret_cast<const char *>(buffer->data()),
- buffer->size());
- }
+ for (int i = 0; i < size; i++) {
+ auto this_slot = slot[i].asInt();
+ auto this_id = id[i].asInt();
+ auto this_x = x[i].asInt();
+ auto this_y = y[i].asInt();
- void OnMultiTouchEvent(const std::string &display_label, Json::Value id,
- Json::Value slot, Json::Value x, Json::Value y,
- bool down, int size) override {
- auto buffer = GetEventBuffer();
- if (!buffer) {
- LOG(ERROR) << "Failed to allocate event buffer";
- return;
- }
-
- for (int i = 0; i < size; i++) {
- auto this_slot = slot[i].asInt();
- auto this_id = id[i].asInt();
- auto this_x = x[i].asInt();
- auto this_y = y[i].asInt();
- buffer->AddEvent(EV_ABS, ABS_MT_SLOT, this_slot);
+ if (confui_input_.IsConfUiActive()) {
if (down) {
- bool is_new = active_touch_slots_.insert(this_slot).second;
- if (is_new) {
- buffer->AddEvent(EV_ABS, ABS_MT_TRACKING_ID, this_id);
- if (active_touch_slots_.size() == 1) {
- buffer->AddEvent(EV_KEY, BTN_TOUCH, 1);
- }
- }
- buffer->AddEvent(EV_ABS, ABS_MT_POSITION_X, this_x);
- buffer->AddEvent(EV_ABS, ABS_MT_POSITION_Y, this_y);
- // send ABS_X and ABS_Y for single-touch compatibility
- buffer->AddEvent(EV_ABS, ABS_X, this_x);
- buffer->AddEvent(EV_ABS, ABS_Y, this_y);
- } else {
- // released touch
+ ConfUiLog(DEBUG) << "Delivering event (" << x << ", " << y
+ << ") to conf ui";
+ }
+ confui_input_.TouchEvent(this_x, this_y, down);
+ continue;
+ }
+
+ buffer->AddEvent(EV_ABS, ABS_MT_SLOT, this_slot);
+ if (down) {
+ bool is_new = active_touch_slots_.insert(this_slot).second;
+ if (is_new) {
buffer->AddEvent(EV_ABS, ABS_MT_TRACKING_ID, this_id);
- active_touch_slots_.erase(this_slot);
- if (active_touch_slots_.empty()) {
- buffer->AddEvent(EV_KEY, BTN_TOUCH, 0);
+ if (active_touch_slots_.size() == 1) {
+ buffer->AddEvent(EV_KEY, BTN_TOUCH, 1);
}
}
+ buffer->AddEvent(EV_ABS, ABS_MT_POSITION_X, this_x);
+ buffer->AddEvent(EV_ABS, ABS_MT_POSITION_Y, this_y);
+ // send ABS_X and ABS_Y for single-touch compatibility
+ buffer->AddEvent(EV_ABS, ABS_X, this_x);
+ buffer->AddEvent(EV_ABS, ABS_Y, this_y);
+ } else {
+ // released touch
+ buffer->AddEvent(EV_ABS, ABS_MT_TRACKING_ID, this_id);
+ active_touch_slots_.erase(this_slot);
+ if (active_touch_slots_.empty()) {
+ buffer->AddEvent(EV_KEY, BTN_TOUCH, 0);
+ }
}
-
- buffer->AddEvent(EV_SYN, SYN_REPORT, 0);
- cuttlefish::WriteAll(input_sockets_.GetTouchClientByLabel(display_label),
- reinterpret_cast<const char *>(buffer->data()),
- buffer->size());
}
+ buffer->AddEvent(EV_SYN, SYN_REPORT, 0);
+ cuttlefish::WriteAll(input_sockets_.GetTouchClientByLabel(display_label),
+ reinterpret_cast<const char *>(buffer->data()),
+ buffer->size());
+ }
+
void OnKeyboardEvent(uint16_t code, bool down) override {
+ if (confui_input_.IsConfUiActive()) {
+ ConfUiLog(DEBUG) << "keyboard event ignored in confirmation UI mode";
+ return;
+ }
+
auto buffer = GetEventBuffer();
if (!buffer) {
LOG(ERROR) << "Failed to allocate event buffer";
@@ -355,107 +373,6 @@
std::weak_ptr<DisplayHandler> weak_display_handler_;
std::set<int32_t> active_touch_slots_;
cuttlefish::CameraController *camera_controller_;
-};
-
-class ConnectionObserverDemuxer
- : public cuttlefish::webrtc_streaming::ConnectionObserver {
- public:
- ConnectionObserverDemuxer(
- /* params for the base class */
- cuttlefish::InputSockets &input_sockets,
- cuttlefish::KernelLogEventsHandler *kernel_log_events_handler,
- std::map<std::string, cuttlefish::SharedFD>
- commands_to_custom_action_servers,
- std::weak_ptr<DisplayHandler> display_handler,
- CameraController *camera_controller,
- /* params for this class */
- cuttlefish::confui::HostVirtualInput &confui_input)
- : android_input_(input_sockets, kernel_log_events_handler,
- commands_to_custom_action_servers, display_handler,
- camera_controller),
- confui_input_{confui_input} {}
- virtual ~ConnectionObserverDemuxer() = default;
-
- void OnConnected(std::function<void(const uint8_t *, size_t, bool)>
- ctrl_msg_sender) override {
- android_input_.OnConnected(ctrl_msg_sender);
- }
-
- void OnTouchEvent(const std::string &label, int x, int y,
- bool down) override {
- if (confui_input_.IsConfUiActive()) {
- ConfUiLog(DEBUG) << "touch event ignored in confirmation UI mode";
- return;
- }
- android_input_.OnTouchEvent(label, x, y, down);
- }
-
- void OnMultiTouchEvent(const std::string &label, Json::Value id,
- Json::Value slot, Json::Value x, Json::Value y,
- bool down, int size) override {
- if (confui_input_.IsConfUiActive()) {
- ConfUiLog(DEBUG) << "multi-touch event ignored in confirmation UI mode";
- return;
- }
- android_input_.OnMultiTouchEvent(label, id, slot, x, y, down, size);
- }
-
- void OnKeyboardEvent(uint16_t code, bool down) override {
- if (confui_input_.IsConfUiActive()) {
- switch (code) {
- case KEY_POWER:
- confui_input_.PressConfirmButton(down);
- break;
- case KEY_MENU:
- confui_input_.PressCancelButton(down);
- break;
- default:
- ConfUiLog(DEBUG) << "key" << code
- << "is ignored in confirmation UI mode";
- break;
- }
- return;
- }
- android_input_.OnKeyboardEvent(code, down);
- }
-
- void OnSwitchEvent(uint16_t code, bool state) override {
- android_input_.OnSwitchEvent(code, state);
- }
-
- void OnAdbChannelOpen(std::function<bool(const uint8_t *, size_t)>
- adb_message_sender) override {
- android_input_.OnAdbChannelOpen(adb_message_sender);
- }
-
- void OnAdbMessage(const uint8_t *msg, size_t size) override {
- android_input_.OnAdbMessage(msg, size);
- }
-
- void OnControlChannelOpen(
- std::function<bool(const Json::Value)> control_message_sender) override {
- android_input_.OnControlChannelOpen(control_message_sender);
- }
-
- void OnControlMessage(const uint8_t *msg, size_t size) override {
- android_input_.OnControlMessage(msg, size);
- }
-
- void OnBluetoothChannelOpen(std::function<bool(const uint8_t *, size_t)>
- bluetooth_message_sender) override {
- android_input_.OnBluetoothChannelOpen(bluetooth_message_sender);
- }
-
- void OnBluetoothMessage(const uint8_t *msg, size_t size) override {
- android_input_.OnBluetoothMessage(msg, size);
- }
-
- void OnCameraData(const std::vector<char> &data) override {
- android_input_.OnCameraData(data);
- }
-
- private:
- ConnectionObserverForAndroid android_input_;
cuttlefish::confui::HostVirtualInput &confui_input_;
};
@@ -470,10 +387,10 @@
std::shared_ptr<cuttlefish::webrtc_streaming::ConnectionObserver>
CfConnectionObserverFactory::CreateObserver() {
return std::shared_ptr<cuttlefish::webrtc_streaming::ConnectionObserver>(
- new ConnectionObserverDemuxer(input_sockets_, kernel_log_events_handler_,
- commands_to_custom_action_servers_,
- weak_display_handler_, camera_controller_,
- confui_input_));
+ new ConnectionObserverImpl(input_sockets_, kernel_log_events_handler_,
+ commands_to_custom_action_servers_,
+ weak_display_handler_, camera_controller_,
+ confui_input_));
}
void CfConnectionObserverFactory::AddCustomActionServer(
diff --git a/host/frontend/webrtc/display_handler.cpp b/host/frontend/webrtc/display_handler.cpp
index 334c35f..3de1516 100644
--- a/host/frontend/webrtc/display_handler.cpp
+++ b/host/frontend/webrtc/display_handler.cpp
@@ -91,19 +91,4 @@
display_sinks_[buffer_display]->OnFrame(buffer, time_stamp);
}
}
-
-void DisplayHandler::IncClientCount() {
- client_count_++;
- if (client_count_ == 1) {
- screen_connector_.ReportClientsConnected(true);
- }
-}
-
-void DisplayHandler::DecClientCount() {
- client_count_--;
- if (client_count_ == 0) {
- screen_connector_.ReportClientsConnected(false);
- }
-}
-
} // namespace cuttlefish
diff --git a/host/frontend/webrtc/display_handler.h b/host/frontend/webrtc/display_handler.h
index 7703b08..1411984 100644
--- a/host/frontend/webrtc/display_handler.h
+++ b/host/frontend/webrtc/display_handler.h
@@ -60,9 +60,6 @@
[[noreturn]] void Loop();
void SendLastFrame();
- void IncClientCount();
- void DecClientCount();
-
private:
GenerateProcessedFrameCallback GetScreenConnectorCallback();
std::vector<std::shared_ptr<webrtc_streaming::VideoSink>> display_sinks_;
@@ -71,6 +68,5 @@
std::uint32_t last_buffer_display_ = 0;
std::mutex last_buffer_mutex_;
std::mutex next_frame_mutex_;
- int client_count_ = 0;
};
} // namespace cuttlefish
diff --git a/host/frontend/webrtc/lib/camera_streamer.cpp b/host/frontend/webrtc/lib/camera_streamer.cpp
index 7634e28..c9c7cf0 100644
--- a/host/frontend/webrtc/lib/camera_streamer.cpp
+++ b/host/frontend/webrtc/lib/camera_streamer.cpp
@@ -23,7 +23,7 @@
namespace webrtc_streaming {
CameraStreamer::CameraStreamer(unsigned int port, unsigned int cid)
- : cid_(cid), port_(port) {}
+ : cid_(cid), port_(port), camera_session_active_(false) {}
CameraStreamer::~CameraStreamer() { Disconnect(); }
@@ -47,9 +47,10 @@
LOG(INFO) << "Connected!";
}
auto resolution = resolution_.load();
- if (resolution.height <= 0 || resolution.width <= 0) {
- // We don't have a valid resolution that is necessary for
- // potential frame scaling
+ if (resolution.height <= 0 || resolution.width <= 0 ||
+ !camera_session_active_.load()) {
+ // Nobody is receiving frames or we don't have a valid resolution that is
+ // necessary for potential frame scaling
return;
}
auto frame = client_frame.video_frame_buffer()->ToI420().get();
@@ -142,7 +143,16 @@
}
reader_thread_ = std::thread([this] {
while (cvd_connection_.IsConnected()) {
+ static constexpr auto kEventKey = "event";
+ static constexpr auto kMessageStart =
+ "VIRTUAL_DEVICE_START_CAMERA_SESSION";
+ static constexpr auto kMessageStop = "VIRTUAL_DEVICE_STOP_CAMERA_SESSION";
auto json_value = cvd_connection_.ReadJsonMessage();
+ if (json_value[kEventKey] == kMessageStart) {
+ camera_session_active_ = true;
+ } else if (json_value[kEventKey] == kMessageStop) {
+ camera_session_active_ = false;
+ }
if (!json_value.empty()) {
SendMessage(json_value);
}
diff --git a/host/frontend/webrtc/lib/camera_streamer.h b/host/frontend/webrtc/lib/camera_streamer.h
index ceab2e6..3afed62 100644
--- a/host/frontend/webrtc/lib/camera_streamer.h
+++ b/host/frontend/webrtc/lib/camera_streamer.h
@@ -67,6 +67,7 @@
unsigned int cid_;
unsigned int port_;
std::thread reader_thread_;
+ std::atomic<bool> camera_session_active_;
};
} // namespace webrtc_streaming
diff --git a/host/frontend/webrtc/lib/client_handler.cpp b/host/frontend/webrtc/lib/client_handler.cpp
index 4893f8d..9be1ca0 100644
--- a/host/frontend/webrtc/lib/client_handler.cpp
+++ b/host/frontend/webrtc/lib/client_handler.cpp
@@ -103,6 +103,39 @@
} // namespace
+// Video streams initiating in the client may be added and removed at unexpected
+// times, causing the webrtc objects to be destroyed and created every time.
+// This class hides away that complexity and allows to set up sinks only once.
+class ClientVideoTrackImpl : public ClientVideoTrackInterface {
+ public:
+ void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame> *sink,
+ const rtc::VideoSinkWants &wants) override {
+ sink_ = sink;
+ wants_ = wants;
+ if (video_track_) {
+ video_track_->AddOrUpdateSink(sink, wants);
+ }
+ }
+
+ void SetVideoTrack(webrtc::VideoTrackInterface *track) {
+ video_track_ = track;
+ if (sink_) {
+ video_track_->AddOrUpdateSink(sink_, wants_);
+ }
+ }
+
+ void UnsetVideoTrack(webrtc::VideoTrackInterface *track) {
+ if (track == video_track_) {
+ video_track_ = nullptr;
+ }
+ }
+
+ private:
+ webrtc::VideoTrackInterface* video_track_;
+ rtc::VideoSinkInterface<webrtc::VideoFrame> *sink_ = nullptr;
+ rtc::VideoSinkWants wants_ = {};
+};
+
class InputChannelHandler : public webrtc::DataChannelObserver {
public:
InputChannelHandler(
@@ -439,7 +472,8 @@
: client_id_(client_id),
observer_(observer),
send_to_client_(send_to_client_cb),
- on_connection_changed_cb_(on_connection_changed_cb) {}
+ on_connection_changed_cb_(on_connection_changed_cb),
+ camera_track_(new ClientVideoTrackImpl()) {}
ClientHandler::~ClientHandler() {
for (auto &data_channel : data_channels_) {
@@ -499,15 +533,8 @@
return true;
}
-webrtc::VideoTrackInterface *ClientHandler::GetCameraStream() const {
- for (const auto &tranceiver : peer_connection_->GetTransceivers()) {
- auto track = tranceiver->receiver()->track();
- if (track &&
- track->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
- return static_cast<webrtc::VideoTrackInterface *>(track.get());
- }
- }
- return nullptr;
+ClientVideoTrackInterface* ClientHandler::GetCameraStream() {
+ return camera_track_.get();
}
void ClientHandler::LogAndReplyError(const std::string &error_msg) const {
@@ -518,10 +545,24 @@
send_to_client_(reply);
}
+void ClientHandler::AddPendingIceCandidates() {
+ // Add any ice candidates that arrived before the remote description
+ for (auto& candidate: pending_ice_candidates_) {
+ peer_connection_->AddIceCandidate(std::move(candidate),
+ [this](webrtc::RTCError error) {
+ if (!error.ok()) {
+ LogAndReplyError(error.message());
+ }
+ });
+ }
+ pending_ice_candidates_.clear();
+}
+
void ClientHandler::OnCreateSDPSuccess(
webrtc::SessionDescriptionInterface *desc) {
std::string offer_str;
desc->ToString(&offer_str);
+ std::string sdp_type = desc->type();
peer_connection_->SetLocalDescription(
// The peer connection wraps this raw pointer with a scoped_refptr, so
// it's guaranteed to be deleted at some point
@@ -533,7 +574,7 @@
desc = nullptr;
Json::Value reply;
- reply["type"] = "offer";
+ reply["type"] = sdp_type;
reply["sdp"] = offer_str;
state_ = State::kAwaitingAnswer;
@@ -582,6 +623,42 @@
webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
// The created offer wil be sent to the client on
// OnSuccess(webrtc::SessionDescriptionInterface* desc)
+ } else if (type == "offer") {
+ auto result = ValidationResult::ValidateJsonObject(
+ message, type, {{"sdp", Json::ValueType::stringValue}});
+ if (!result.ok()) {
+ LogAndReplyError(result.error());
+ return;
+ }
+ auto remote_desc_str = message["sdp"].asString();
+ auto remote_desc = webrtc::CreateSessionDescription(
+ webrtc::SdpType::kOffer, remote_desc_str, nullptr /*error*/);
+ if (!remote_desc) {
+ LogAndReplyError("Failed to parse answer.");
+ return;
+ }
+
+ rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface> observer(
+ new rtc::RefCountedObject<
+ CvdOnSetRemoteDescription>([this](webrtc::RTCError error) {
+ if (!error.ok()) {
+ LogAndReplyError(error.message());
+ // The remote description was rejected, this client can't be
+ // trusted anymore.
+ Close();
+ return;
+ }
+ remote_description_added_ = true;
+ AddPendingIceCandidates();
+ peer_connection_->CreateAnswer(
+ // No memory leak here because this is a ref counted objects and
+ // the peer connection immediately wraps it with a scoped_refptr
+ new rtc::RefCountedObject<CvdCreateSessionDescriptionObserver>(
+ weak_from_this()),
+ webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
+ }));
+ peer_connection_->SetRemoteDescription(std::move(remote_desc), observer);
+ state_ = State::kConnecting;
} else if (type == "answer") {
if (state_ != State::kAwaitingAnswer) {
LogAndReplyError("Received unexpected SDP answer");
@@ -611,6 +688,8 @@
}
}));
peer_connection_->SetRemoteDescription(std::move(remote_desc), observer);
+ remote_description_added_ = true;
+ AddPendingIceCandidates();
state_ = State::kConnecting;
} else if (type == "ice-candidate") {
@@ -648,12 +727,21 @@
LogAndReplyError("Failed to parse ICE candidate");
return;
}
- peer_connection_->AddIceCandidate(std::move(candidate),
- [this](webrtc::RTCError error) {
- if (!error.ok()) {
- LogAndReplyError(error.message());
- }
- });
+ if (remote_description_added_) {
+ peer_connection_->AddIceCandidate(std::move(candidate),
+ [this](webrtc::RTCError error) {
+ if (!error.ok()) {
+ LogAndReplyError(error.message());
+ }
+ });
+ } else {
+ // Store the ice candidate to be added later if it arrives before the
+ // remote description. This could happen if the client uses polling
+ // instead of websockets because the candidates are generated immediately
+ // after the remote (offer) description is set and the events and the ajax
+ // calls are asynchronous.
+ pending_ice_candidates_.push_back(std::move(candidate));
+ }
} else {
LogAndReplyError("Unknown client message type: " + type);
return;
@@ -820,11 +908,22 @@
}
void ClientHandler::OnTrack(
rtc::scoped_refptr<webrtc::RtpTransceiverInterface> transceiver) {
- // ignore
+ auto track = transceiver->receiver()->track();
+ if (track && track->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
+ // It's ok to take the raw pointer here because we make sure to unset it
+ // when the track is removed
+ camera_track_->SetVideoTrack(
+ static_cast<webrtc::VideoTrackInterface *>(track.get()));
+ }
}
void ClientHandler::OnRemoveTrack(
rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) {
- // ignore
+ auto track = receiver->track();
+ if (track && track->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
+ // this only unsets if the track matches the one already in store
+ camera_track_->UnsetVideoTrack(
+ reinterpret_cast<webrtc::VideoTrackInterface *>(track.get()));
+ }
}
} // namespace webrtc_streaming
diff --git a/host/frontend/webrtc/lib/client_handler.h b/host/frontend/webrtc/lib/client_handler.h
index f7f587b..ea58552 100644
--- a/host/frontend/webrtc/lib/client_handler.h
+++ b/host/frontend/webrtc/lib/client_handler.h
@@ -40,6 +40,9 @@
class BluetoothChannelHandler;
class CameraChannelHandler;
+class ClientVideoTrackInterface;
+class ClientVideoTrackImpl;
+
class ClientHandler : public webrtc::PeerConnectionObserver,
public std::enable_shared_from_this<ClientHandler> {
public:
@@ -58,7 +61,7 @@
bool AddAudio(rtc::scoped_refptr<webrtc::AudioTrackInterface> track,
const std::string& label);
- webrtc::VideoTrackInterface* GetCameraStream() const;
+ ClientVideoTrackInterface* GetCameraStream();
void HandleMessage(const Json::Value& client_message);
@@ -117,6 +120,7 @@
void Close();
void LogAndReplyError(const std::string& error_msg) const;
+ void AddPendingIceCandidates();
int client_id_;
State state_ = State::kNew;
@@ -130,6 +134,18 @@
std::unique_ptr<ControlChannelHandler> control_handler_;
std::unique_ptr<BluetoothChannelHandler> bluetooth_handler_;
std::unique_ptr<CameraChannelHandler> camera_data_handler_;
+ std::unique_ptr<ClientVideoTrackImpl> camera_track_;
+ bool remote_description_added_ = false;
+ std::vector<std::unique_ptr<webrtc::IceCandidateInterface>>
+ pending_ice_candidates_;
+};
+
+class ClientVideoTrackInterface {
+ public:
+ virtual ~ClientVideoTrackInterface() = default;
+ virtual void AddOrUpdateSink(
+ rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
+ const rtc::VideoSinkWants& wants) = 0;
};
} // namespace webrtc_streaming
diff --git a/host/frontend/webrtc/lib/server_connection.cpp b/host/frontend/webrtc/lib/server_connection.cpp
new file mode 100644
index 0000000..b9c90d7
--- /dev/null
+++ b/host/frontend/webrtc/lib/server_connection.cpp
@@ -0,0 +1,634 @@
+//
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+//
+
+#include "host/frontend/webrtc/lib/server_connection.h"
+
+#include <android-base/logging.h>
+#include <libwebsockets.h>
+
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/fs/shared_select.h"
+#include "common/libs/utils/files.h"
+
+namespace cuttlefish {
+namespace webrtc_streaming {
+
+// ServerConnection over Unix socket
+class UnixServerConnection : public ServerConnection {
+ public:
+ UnixServerConnection(SharedFD conn,
+ std::weak_ptr<ServerConnectionObserver> observer,
+ SharedFD thread_notifier_);
+ ~UnixServerConnection() override;
+
+ bool Send(const Json::Value& msg) override;
+
+ private:
+ void Connect() override;
+ void ReadLoop();
+
+ SharedFD conn_;
+ std::mutex write_mtx_;
+ std::weak_ptr<ServerConnectionObserver> observer_;
+ // The event fd must be declared before the thread to ensure it's initialized
+ // before the thread starts and is safe to be accessed from it.
+ SharedFD thread_notifier_;
+ std::atomic_bool running_ = true;
+ std::thread thread_;
+};
+
+// ServerConnection using websockets
+class WsConnectionContext;
+
+class WsConnection : public std::enable_shared_from_this<WsConnection> {
+ public:
+ struct CreateConnectionSul {
+ lws_sorted_usec_list_t sul = {};
+ std::weak_ptr<WsConnection> weak_this;
+ };
+
+ WsConnection(int port, const std::string& addr, const std::string& path,
+ ServerConfig::Security secure,
+ const std::vector<std::pair<std::string, std::string>>& headers,
+ std::weak_ptr<ServerConnectionObserver> observer,
+ std::shared_ptr<WsConnectionContext> context);
+
+ ~WsConnection();
+
+ void Connect();
+ bool Send(const Json::Value& msg);
+
+ void ConnectInner();
+
+ void OnError(const std::string& error);
+ void OnReceive(const uint8_t* data, size_t len, bool is_binary);
+ void OnOpen();
+ void OnClose();
+ void OnWriteable();
+
+ void AddHttpHeaders(unsigned char** p, unsigned char* end) const;
+
+ private:
+ struct WsBuffer {
+ WsBuffer() = default;
+ WsBuffer(const uint8_t* data, size_t len, bool binary)
+ : buffer_(LWS_PRE + len), is_binary_(binary) {
+ memcpy(&buffer_[LWS_PRE], data, len);
+ }
+
+ uint8_t* data() { return &buffer_[LWS_PRE]; }
+ bool is_binary() const { return is_binary_; }
+ size_t size() const { return buffer_.size() - LWS_PRE; }
+
+ private:
+ std::vector<uint8_t> buffer_;
+ bool is_binary_;
+ };
+ bool Send(const uint8_t* data, size_t len, bool binary = false);
+
+ CreateConnectionSul extended_sul_;
+ struct lws* wsi_;
+ const int port_;
+ const std::string addr_;
+ const std::string path_;
+ const ServerConfig::Security security_;
+ const std::vector<std::pair<std::string, std::string>> headers_;
+
+ std::weak_ptr<ServerConnectionObserver> observer_;
+
+ // each element contains the data to be sent and whether it's binary or not
+ std::deque<WsBuffer> write_queue_;
+ std::mutex write_queue_mutex_;
+ // The connection object should not outlive the context object. This reference
+ // guarantees it.
+ std::shared_ptr<WsConnectionContext> context_;
+};
+
+class WsConnectionContext
+ : public std::enable_shared_from_this<WsConnectionContext> {
+ public:
+ static std::shared_ptr<WsConnectionContext> Create();
+
+ WsConnectionContext(struct lws_context* lws_ctx);
+ ~WsConnectionContext();
+
+ std::unique_ptr<ServerConnection> CreateConnection(
+ int port, const std::string& addr, const std::string& path,
+ ServerConfig::Security secure,
+ std::weak_ptr<ServerConnectionObserver> observer,
+ const std::vector<std::pair<std::string, std::string>>& headers);
+
+ void RememberConnection(void*, std::weak_ptr<WsConnection>);
+ void ForgetConnection(void*);
+ std::shared_ptr<WsConnection> GetConnection(void*);
+
+ struct lws_context* lws_context() {
+ return lws_context_;
+ }
+
+ private:
+ void Start();
+
+ std::map<void*, std::weak_ptr<WsConnection>> weak_by_ptr_;
+ std::mutex map_mutex_;
+ struct lws_context* lws_context_;
+ std::thread message_loop_;
+};
+
+std::unique_ptr<ServerConnection> ServerConnection::Connect(
+ const ServerConfig& conf,
+ std::weak_ptr<ServerConnectionObserver> observer) {
+ std::unique_ptr<ServerConnection> ret;
+ // If the provided address points to an existing UNIX socket in the file
+ // system connect to it, otherwise assume it's a network address and connect
+ // using websockets
+ if (FileIsSocket(conf.addr)) {
+ auto conn = SharedFD::SocketLocalClient(conf.addr, false, SOCK_SEQPACKET);
+ if (!conn->IsOpen()) {
+ LOG(ERROR) << "Failed to connect to unix socket: " << conn->StrError();
+ if (auto o = observer.lock(); o) {
+ o->OnError("Failed to connect to unix socket");
+ }
+ // Safe to return null here since OnOpen wasn't called and therefore the
+ // connection won't be accessed.
+ return nullptr;
+ }
+ auto thread_notifier = SharedFD::Event();
+ if (!thread_notifier->IsOpen()) {
+ LOG(ERROR) << "Failed to create eventfd for background thread";
+ return nullptr;
+ }
+ ret.reset(new UnixServerConnection(conn, observer, thread_notifier));
+ } else {
+ // This can be a local variable since the ws connection will keep a
+ // reference to it.
+ auto ws_context = WsConnectionContext::Create();
+ CHECK(ws_context) << "Failed to create websocket context";
+ ret = ws_context->CreateConnection(conf.port, conf.addr, conf.path,
+ conf.security, observer,
+ conf.http_headers);
+ }
+ ret->Connect();
+ return ret;
+}
+
+void ServerConnection::Reconnect() { Connect(); }
+
+// UnixServerConnection implementation
+
+UnixServerConnection::UnixServerConnection(
+ SharedFD conn, std::weak_ptr<ServerConnectionObserver> observer,
+ SharedFD thread_notifier)
+ : conn_(conn),
+ observer_(observer),
+ thread_notifier_(thread_notifier),
+ thread_([this]() { ReadLoop(); }) {}
+
+UnixServerConnection::~UnixServerConnection() {
+ if (!thread_notifier_->IsOpen()) {
+ // The thread won't be running if this isn't open
+ return;
+ }
+ running_ = false;
+ if (thread_notifier_->EventfdWrite(1) < 0) {
+ LOG(ERROR) << "Failed to notify background thread, this thread may block";
+ }
+ if (thread_.joinable()) {
+ thread_.join();
+ }
+}
+
+bool UnixServerConnection::Send(const Json::Value& msg) {
+ Json::StreamWriterBuilder factory;
+ auto str = Json::writeString(factory, msg);
+ std::lock_guard<std::mutex> lock(write_mtx_);
+ auto res =
+ conn_->Send(reinterpret_cast<const uint8_t*>(str.c_str()), str.size(), 0);
+ if (res < 0) {
+ LOG(ERROR) << "Failed to send data to signaling server: "
+ << conn_->StrError();
+ // Don't call OnError() here, the receiving thread probably did it already
+ // or is about to do it.
+ }
+ // A SOCK_SEQPACKET unix socket will send the entire message or fail, but it
+ // won't send a partial message.
+ return res == str.size();
+}
+
+void UnixServerConnection::Connect() {
+ if (auto observer = observer_.lock(); observer) {
+ observer->OnOpen();
+ }
+}
+
+void UnixServerConnection::ReadLoop() {
+ if (!thread_notifier_->IsOpen()) {
+ LOG(ERROR) << "The UnixServerConnection's background thread is unable to "
+ "receive notifications so it can't run";
+ return;
+ }
+ std::vector<uint8_t> buffer(4096, 0);
+ while (running_) {
+ SharedFDSet rset;
+ rset.Set(thread_notifier_);
+ rset.Set(conn_);
+ auto res = Select(&rset, nullptr, nullptr, nullptr);
+ if (res < 0) {
+ LOG(ERROR) << "Failed to select from background thread";
+ break;
+ }
+ if (rset.IsSet(thread_notifier_)) {
+ eventfd_t val;
+ auto res = thread_notifier_->EventfdRead(&val);
+ if (res < 0) {
+ LOG(ERROR) << "Error reading from event fd: "
+ << thread_notifier_->StrError();
+ break;
+ }
+ }
+ if (rset.IsSet(conn_)) {
+ auto size = conn_->Recv(buffer.data(), 0, MSG_TRUNC | MSG_PEEK);
+ if (size > buffer.size()) {
+ // Enlarge enough to accommodate size bytes and be a multiple of 4096
+ auto new_size = (size + 4095) & ~4095;
+ buffer.resize(new_size);
+ }
+ auto res = conn_->Recv(buffer.data(), buffer.size(), MSG_TRUNC);
+ if (res < 0) {
+ LOG(ERROR) << "Failed to read from server: " << conn_->StrError();
+ if (auto observer = observer_.lock(); observer) {
+ observer->OnError(conn_->StrError());
+ }
+ return;
+ }
+ auto observer = observer_.lock();
+ if (observer) {
+ observer->OnReceive(buffer.data(), res, false);
+ }
+ }
+ }
+}
+
+// WsConnection implementation
+
+int LwsCallback(struct lws* wsi, enum lws_callback_reasons reason, void* user,
+ void* in, size_t len);
+void CreateConnectionCallback(lws_sorted_usec_list_t* sul);
+
+namespace {
+
+constexpr char kProtocolName[] = "cf-webrtc-device";
+constexpr int kBufferSize = 65536;
+
+const uint32_t backoff_ms[] = {1000, 2000, 3000, 4000, 5000};
+
+const lws_retry_bo_t kRetry = {
+ .retry_ms_table = backoff_ms,
+ .retry_ms_table_count = LWS_ARRAY_SIZE(backoff_ms),
+ .conceal_count = LWS_ARRAY_SIZE(backoff_ms),
+
+ .secs_since_valid_ping = 3, /* force PINGs after secs idle */
+ .secs_since_valid_hangup = 10, /* hangup after secs idle */
+
+ .jitter_percent = 20,
+};
+
+const struct lws_protocols kProtocols[2] = {
+ {kProtocolName, LwsCallback, 0, kBufferSize, 0, NULL, 0},
+ {NULL, NULL, 0, 0, 0, NULL, 0}};
+
+} // namespace
+
+std::shared_ptr<WsConnectionContext> WsConnectionContext::Create() {
+ struct lws_context_creation_info context_info = {};
+ context_info.port = CONTEXT_PORT_NO_LISTEN;
+ context_info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
+ context_info.protocols = kProtocols;
+ struct lws_context* lws_ctx = lws_create_context(&context_info);
+ if (!lws_ctx) {
+ return nullptr;
+ }
+ return std::shared_ptr<WsConnectionContext>(new WsConnectionContext(lws_ctx));
+}
+
+WsConnectionContext::WsConnectionContext(struct lws_context* lws_ctx)
+ : lws_context_(lws_ctx) {
+ Start();
+}
+
+WsConnectionContext::~WsConnectionContext() {
+ lws_context_destroy(lws_context_);
+ if (message_loop_.joinable()) {
+ message_loop_.join();
+ }
+}
+
+void WsConnectionContext::Start() {
+ message_loop_ = std::thread([this]() {
+ for (;;) {
+ if (lws_service(lws_context_, 0) < 0) {
+ break;
+ }
+ }
+ });
+}
+
+// This wrapper is needed because the ServerConnection objects are meant to be
+// referenced by std::unique_ptr but WsConnection needs to be referenced by
+// std::shared_ptr because it's also (weakly) referenced by the websocket
+// thread.
+class WsConnectionWrapper : public ServerConnection {
+ public:
+ WsConnectionWrapper(std::shared_ptr<WsConnection> conn) : conn_(conn) {}
+
+ bool Send(const Json::Value& msg) override { return conn_->Send(msg); }
+
+ private:
+ void Connect() override { return conn_->Connect(); }
+ std::shared_ptr<WsConnection> conn_;
+};
+
+std::unique_ptr<ServerConnection> WsConnectionContext::CreateConnection(
+ int port, const std::string& addr, const std::string& path,
+ ServerConfig::Security security,
+ std::weak_ptr<ServerConnectionObserver> observer,
+ const std::vector<std::pair<std::string, std::string>>& headers) {
+ return std::unique_ptr<ServerConnection>(
+ new WsConnectionWrapper(std::make_shared<WsConnection>(
+ port, addr, path, security, headers, observer, shared_from_this())));
+}
+
+std::shared_ptr<WsConnection> WsConnectionContext::GetConnection(void* raw) {
+ std::shared_ptr<WsConnection> connection;
+ {
+ std::lock_guard<std::mutex> lock(map_mutex_);
+ if (weak_by_ptr_.count(raw) == 0) {
+ return nullptr;
+ }
+ connection = weak_by_ptr_[raw].lock();
+ if (!connection) {
+ weak_by_ptr_.erase(raw);
+ }
+ }
+ return connection;
+}
+
+void WsConnectionContext::RememberConnection(void* raw,
+ std::weak_ptr<WsConnection> conn) {
+ std::lock_guard<std::mutex> lock(map_mutex_);
+ weak_by_ptr_.emplace(
+ std::pair<void*, std::weak_ptr<WsConnection>>(raw, conn));
+}
+
+void WsConnectionContext::ForgetConnection(void* raw) {
+ std::lock_guard<std::mutex> lock(map_mutex_);
+ weak_by_ptr_.erase(raw);
+}
+
+WsConnection::WsConnection(
+ int port, const std::string& addr, const std::string& path,
+ ServerConfig::Security security,
+ const std::vector<std::pair<std::string, std::string>>& headers,
+ std::weak_ptr<ServerConnectionObserver> observer,
+ std::shared_ptr<WsConnectionContext> context)
+ : port_(port),
+ addr_(addr),
+ path_(path),
+ security_(security),
+ headers_(headers),
+ observer_(observer),
+ context_(context) {}
+
+WsConnection::~WsConnection() {
+ context_->ForgetConnection(this);
+ // This will cause the callback to be called which will drop the connection
+ // after seeing the context doesn't remember this object
+ lws_callback_on_writable(wsi_);
+}
+
+void WsConnection::Connect() {
+ memset(&extended_sul_.sul, 0, sizeof(extended_sul_.sul));
+ extended_sul_.weak_this = weak_from_this();
+ lws_sul_schedule(context_->lws_context(), 0, &extended_sul_.sul,
+ CreateConnectionCallback, 1);
+}
+
+void WsConnection::AddHttpHeaders(unsigned char** p, unsigned char* end) const {
+ for (const auto& header_entry : headers_) {
+ const auto& name = header_entry.first;
+ const auto& value = header_entry.second;
+ auto res = lws_add_http_header_by_name(
+ wsi_, reinterpret_cast<const unsigned char*>(name.c_str()),
+ reinterpret_cast<const unsigned char*>(value.c_str()), value.size(), p,
+ end);
+ if (res != 0) {
+ LOG(ERROR) << "Unable to add header: " << name;
+ }
+ }
+ if (!headers_.empty()) {
+ // Let LWS know we added some headers.
+ lws_client_http_body_pending(wsi_, 1);
+ }
+}
+
+void WsConnection::OnError(const std::string& error) {
+ auto observer = observer_.lock();
+ if (observer) {
+ observer->OnError(error);
+ }
+}
+void WsConnection::OnReceive(const uint8_t* data, size_t len, bool is_binary) {
+ auto observer = observer_.lock();
+ if (observer) {
+ observer->OnReceive(data, len, is_binary);
+ }
+}
+void WsConnection::OnOpen() {
+ auto observer = observer_.lock();
+ if (observer) {
+ observer->OnOpen();
+ }
+}
+void WsConnection::OnClose() {
+ auto observer = observer_.lock();
+ if (observer) {
+ observer->OnClose();
+ }
+}
+
+void WsConnection::OnWriteable() {
+ WsBuffer buffer;
+ {
+ std::lock_guard<std::mutex> lock(write_queue_mutex_);
+ if (write_queue_.size() == 0) {
+ return;
+ }
+ buffer = std::move(write_queue_.front());
+ write_queue_.pop_front();
+ }
+ auto flags = lws_write_ws_flags(
+ buffer.is_binary() ? LWS_WRITE_BINARY : LWS_WRITE_TEXT, true, true);
+ auto res = lws_write(wsi_, buffer.data(), buffer.size(),
+ (enum lws_write_protocol)flags);
+ if (res != buffer.size()) {
+ LOG(WARNING) << "Unable to send the entire message!";
+ }
+}
+
+bool WsConnection::Send(const Json::Value& msg) {
+ Json::StreamWriterBuilder factory;
+ auto str = Json::writeString(factory, msg);
+ return Send(reinterpret_cast<const uint8_t*>(str.c_str()), str.size());
+}
+
+bool WsConnection::Send(const uint8_t* data, size_t len, bool binary) {
+ if (!wsi_) {
+ LOG(WARNING) << "Send called on an uninitialized connection!!";
+ return false;
+ }
+ WsBuffer buffer(data, len, binary);
+ {
+ std::lock_guard<std::mutex> lock(write_queue_mutex_);
+ write_queue_.emplace_back(std::move(buffer));
+ }
+
+ lws_callback_on_writable(wsi_);
+ return true;
+}
+
+int LwsCallback(struct lws* wsi, enum lws_callback_reasons reason, void* user,
+ void* in, size_t len) {
+ constexpr int DROP = -1;
+ constexpr int OK = 0;
+
+ // For some values of `reason`, `user` doesn't point to the value provided
+ // when the connection was created. This function object should be used with
+ // care.
+ auto with_connection =
+ [wsi, user](std::function<void(std::shared_ptr<WsConnection>)> cb) {
+ auto context = reinterpret_cast<WsConnectionContext*>(user);
+ auto connection = context->GetConnection(wsi);
+ if (!connection) {
+ return DROP;
+ }
+ cb(connection);
+ return OK;
+ };
+
+ switch (reason) {
+ case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
+ return with_connection([in](std::shared_ptr<WsConnection> connection) {
+ connection->OnError(in ? (char*)in : "(null)");
+ });
+
+ case LWS_CALLBACK_CLIENT_RECEIVE:
+ return with_connection(
+ [in, len, wsi](std::shared_ptr<WsConnection> connection) {
+ connection->OnReceive((const uint8_t*)in, len,
+ lws_frame_is_binary(wsi));
+ });
+
+ case LWS_CALLBACK_CLIENT_ESTABLISHED:
+ return with_connection([](std::shared_ptr<WsConnection> connection) {
+ connection->OnOpen();
+ });
+
+ case LWS_CALLBACK_CLIENT_CLOSED:
+ return with_connection([](std::shared_ptr<WsConnection> connection) {
+ connection->OnClose();
+ });
+
+ case LWS_CALLBACK_CLIENT_WRITEABLE:
+ return with_connection([](std::shared_ptr<WsConnection> connection) {
+ connection->OnWriteable();
+ });
+
+ case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:
+ return with_connection(
+ [in, len](std::shared_ptr<WsConnection> connection) {
+ auto p = reinterpret_cast<unsigned char**>(in);
+ auto end = (*p) + len;
+ connection->AddHttpHeaders(p, end);
+ });
+
+ case LWS_CALLBACK_CLIENT_HTTP_WRITEABLE:
+ // This callback is only called when we add additional HTTP headers, let
+ // LWS know we're done modifying the HTTP request.
+ lws_client_http_body_pending(wsi, 0);
+ return 0;
+
+ default:
+ LOG(VERBOSE) << "Unhandled value: " << reason;
+ return lws_callback_http_dummy(wsi, reason, user, in, len);
+ }
+}
+
+void CreateConnectionCallback(lws_sorted_usec_list_t* sul) {
+ std::shared_ptr<WsConnection> connection =
+ reinterpret_cast<WsConnection::CreateConnectionSul*>(sul)
+ ->weak_this.lock();
+ if (!connection) {
+ LOG(WARNING) << "The object was already destroyed by the time of the first "
+ << "connection attempt. That's unusual.";
+ return;
+ }
+ connection->ConnectInner();
+}
+
+void WsConnection::ConnectInner() {
+ struct lws_client_connect_info connect_info;
+
+ memset(&connect_info, 0, sizeof(connect_info));
+
+ connect_info.context = context_->lws_context();
+ connect_info.port = port_;
+ connect_info.address = addr_.c_str();
+ connect_info.path = path_.c_str();
+ connect_info.host = connect_info.address;
+ connect_info.origin = connect_info.address;
+ switch (security_) {
+ case ServerConfig::Security::kAllowSelfSigned:
+ connect_info.ssl_connection = LCCSCF_ALLOW_SELFSIGNED |
+ LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK |
+ LCCSCF_USE_SSL;
+ break;
+ case ServerConfig::Security::kStrict:
+ connect_info.ssl_connection = LCCSCF_USE_SSL;
+ break;
+ case ServerConfig::Security::kInsecure:
+ connect_info.ssl_connection = 0;
+ break;
+ }
+ connect_info.protocol = "webrtc-operator";
+ connect_info.local_protocol_name = kProtocolName;
+ connect_info.pwsi = &wsi_;
+ connect_info.retry_and_idle_policy = &kRetry;
+ // There is no guarantee the connection object still exists when the callback
+ // is called. Put the context instead as the user data which is guaranteed to
+ // still exist and holds a weak ptr to the connection.
+ connect_info.userdata = context_.get();
+
+ if (lws_client_connect_via_info(&connect_info)) {
+ // wsi_ is not initialized until after the call to
+ // lws_client_connect_via_info(). Luckily, this is guaranteed to run before
+ // the protocol callback is called because it runs in the same loop.
+ context_->RememberConnection(wsi_, weak_from_this());
+ } else {
+ LOG(ERROR) << "Connection failed!";
+ }
+}
+
+} // namespace webrtc_streaming
+} // namespace cuttlefish
diff --git a/host/frontend/webrtc/lib/server_connection.h b/host/frontend/webrtc/lib/server_connection.h
new file mode 100644
index 0000000..247681e
--- /dev/null
+++ b/host/frontend/webrtc/lib/server_connection.h
@@ -0,0 +1,90 @@
+//
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+//
+
+#pragma once
+
+#include <string.h>
+
+#include <deque>
+#include <functional>
+#include <map>
+#include <memory>
+#include <mutex>
+#include <string>
+#include <thread>
+#include <vector>
+
+#include <json/json.h>
+#include <libwebsockets.h>
+
+namespace cuttlefish {
+namespace webrtc_streaming {
+
+struct ServerConfig {
+ enum class Security {
+ kInsecure,
+ kAllowSelfSigned,
+ kStrict,
+ };
+
+ // The ip address or domain name of the operator server.
+ std::string addr;
+ int port;
+ // The path component of the operator server's register url.
+ std::string path;
+ // The security level to use when connecting to the operator server.
+ Security security;
+ // A list of key value pairs to include as HTTP handshake headers when
+ // connecting to the operator.
+ std::vector<std::pair<std::string, std::string>> http_headers;
+};
+
+class ServerConnectionObserver {
+ public:
+ virtual ~ServerConnectionObserver() = default;
+ // Called when the connection to the server has been established. This is the
+ // cue to start using Send().
+ virtual void OnOpen() = 0;
+ virtual void OnClose() = 0;
+ // Called when the connection to the server has failed with an unrecoverable
+ // error.
+ virtual void OnError(const std::string& error) = 0;
+ virtual void OnReceive(const uint8_t* msg, size_t length, bool is_binary) = 0;
+};
+
+// Represents a connection to the signaling server. When a connection is created
+// it connects with the server automatically but sends no info.
+class ServerConnection {
+ public:
+ static std::unique_ptr<ServerConnection> Connect(
+ const ServerConfig& conf,
+ std::weak_ptr<ServerConnectionObserver> observer);
+
+ // Destroying the connection will disconnect from the signaling server and
+ // release any open fds.
+ virtual ~ServerConnection() = default;
+
+ // Sends data to the server encoded as JSON.
+ virtual bool Send(const Json::Value&) = 0;
+
+ // makes re-connect request
+ virtual void Reconnect();
+
+ private:
+ virtual void Connect() = 0;
+};
+
+} // namespace webrtc_streaming
+} // namespace cuttlefish
diff --git a/host/frontend/webrtc/lib/streamer.cpp b/host/frontend/webrtc/lib/streamer.cpp
index 71bbab5..e99f014 100644
--- a/host/frontend/webrtc/lib/streamer.cpp
+++ b/host/frontend/webrtc/lib/streamer.cpp
@@ -62,12 +62,10 @@
constexpr auto kControlPanelButtonHingeAngleValue = "hinge_angle_value";
constexpr auto kCustomControlPanelButtonsField = "custom_control_panel_buttons";
-void SendJson(WsConnection* ws_conn, const Json::Value& data) {
- Json::StreamWriterBuilder factory;
- auto data_str = Json::writeString(factory, data);
- ws_conn->Send(reinterpret_cast<const uint8_t*>(data_str.c_str()),
- data_str.size());
-}
+constexpr int kRegistrationRetries = 3;
+constexpr int kRetryFirstIntervalMs = 1000;
+constexpr int kReconnectRetries = 100;
+constexpr int kReconnectIntervalMs = 1000;
bool ParseMessage(const uint8_t* data, size_t length, Json::Value* msg_out) {
auto str = reinterpret_cast<const char*>(data);
@@ -136,10 +134,14 @@
} // namespace
-class Streamer::Impl : public WsConnectionObserver {
+
+class Streamer::Impl : public ServerConnectionObserver,
+ public std::enable_shared_from_this<ServerConnectionObserver> {
public:
std::shared_ptr<ClientHandler> CreateClientHandler(int client_id);
+ void Register(std::weak_ptr<OperatorObserver> observer);
+
void SendMessageToClient(int client_id, const Json::Value& msg);
void DestroyClientHandler(int client_id);
void SetupCameraForClient(int client_id);
@@ -157,7 +159,7 @@
// no need for extra synchronization mechanisms (mutex)
StreamerConfig config_;
OperatorServerConfig operator_config_;
- std::shared_ptr<WsConnection> server_connection_;
+ std::unique_ptr<ServerConnection> server_connection_;
std::shared_ptr<ConnectionObserverFactory> connection_observer_factory_;
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
peer_connection_factory_;
@@ -173,6 +175,8 @@
std::vector<ControlPanelButtonDescriptor> custom_control_panel_buttons_;
std::shared_ptr<AudioDeviceModuleWrapper> audio_device_module_;
std::unique_ptr<CameraStreamer> camera_streamer_;
+ int registration_retries_left_ = kRegistrationRetries;
+ int retry_interval_ms_ = kRetryFirstIntervalMs;
};
Streamer::Streamer(std::unique_ptr<Streamer::Impl> impl)
@@ -307,22 +311,7 @@
// No need to block the calling thread on this, the observer will be notified
// when the connection is established.
impl_->signal_thread_->PostTask(RTC_FROM_HERE, [this, observer]() {
- impl_->operator_observer_ = observer;
- // This can be a local variable since the connection object will keep a
- // reference to it.
- auto ws_context = WsConnectionContext::Create();
- CHECK(ws_context) << "Failed to create websocket context";
- impl_->server_connection_ = ws_context->CreateConnection(
- impl_->config_.operator_server.port,
- impl_->config_.operator_server.addr,
- impl_->config_.operator_server.path,
- impl_->config_.operator_server.security, impl_,
- impl_->config_.operator_server.http_headers);
-
- CHECK(impl_->server_connection_)
- << "Unable to create websocket connection object";
-
- impl_->server_connection_->Connect();
+ impl_->Register(observer);
});
}
@@ -345,6 +334,21 @@
}
}
+void Streamer::Impl::Register(std::weak_ptr<OperatorObserver> observer) {
+ operator_observer_ = observer;
+ // When the connection is established the OnOpen function will be called where
+ // the registration will take place
+ if (!server_connection_) {
+ server_connection_ =
+ ServerConnection::Connect(config_.operator_server, weak_from_this());
+ } else {
+ // in case connection attempt is retried, just call Reconnect().
+ // Recreating server_connection_ object will destroy existing WSConnection
+ // object and task re-scheduling will fail
+ server_connection_->Reconnect();
+ }
+}
+
void Streamer::Impl::OnOpen() {
// Called from the websocket thread.
// Connected to operator.
@@ -354,6 +358,9 @@
cuttlefish::webrtc_signaling::kRegisterType;
register_obj[cuttlefish::webrtc_signaling::kDeviceIdField] =
config_.device_id;
+ CHECK(config_.client_files_port >= 0) << "Invalide device port provided";
+ register_obj[cuttlefish::webrtc_signaling::kDevicePortField] =
+ config_.client_files_port;
Json::Value device_info;
Json::Value displays(Json::ValueType::arrayValue);
@@ -409,7 +416,7 @@
}
device_info[kCustomControlPanelButtonsField] = custom_control_panel_buttons;
register_obj[cuttlefish::webrtc_signaling::kDeviceInfoField] = device_info;
- SendJson(server_connection_.get(), register_obj);
+ server_connection_->Send(register_obj);
// Do this last as OnRegistered() is user code and may take some time to
// complete (although it shouldn't...)
auto observer = operator_observer_.lock();
@@ -430,17 +437,38 @@
observer->OnClose();
}
});
+ LOG(INFO) << "Trying to re-connect to operator..";
+ registration_retries_left_ = kReconnectRetries;
+ retry_interval_ms_ = kReconnectIntervalMs;
+ signal_thread_->PostDelayedTask(
+ RTC_FROM_HERE, [this]() { Register(operator_observer_); },
+ retry_interval_ms_);
}
void Streamer::Impl::OnError(const std::string& error) {
// Called from websocket thread.
- LOG(ERROR) << "Error on connection with the operator: " << error;
- signal_thread_->PostTask(RTC_FROM_HERE, [this]() {
- auto observer = operator_observer_.lock();
- if (observer) {
- observer->OnError();
- }
- });
+ if (registration_retries_left_) {
+ LOG(WARNING) << "Connection to operator failed (" << error << "), "
+ << registration_retries_left_ << " retries left"
+ << " (will retry in " << retry_interval_ms_ / 1000 << "s)";
+ --registration_retries_left_;
+ signal_thread_->PostDelayedTask(
+ RTC_FROM_HERE,
+ [this]() {
+ // Need to reconnect and register again with operator
+ Register(operator_observer_);
+ },
+ retry_interval_ms_);
+ retry_interval_ms_ *= 2;
+ } else {
+ LOG(ERROR) << "Error on connection with the operator: " << error;
+ signal_thread_->PostTask(RTC_FROM_HERE, [this]() {
+ auto observer = operator_observer_.lock();
+ if (observer) {
+ observer->OnError();
+ }
+ });
+ }
}
void Streamer::Impl::HandleConfigMessage(const Json::Value& server_message) {
@@ -635,8 +663,8 @@
cuttlefish::webrtc_signaling::kForwardType;
wrapper[cuttlefish::webrtc_signaling::kClientIdField] = client_id;
// This is safe to call from the webrtc threads because
- // WsConnection is thread safe
- SendJson(server_connection_.get(), wrapper);
+ // ServerConnection(s) are thread safe
+ server_connection_->Send(wrapper);
}
void Streamer::Impl::DestroyClientHandler(int client_id) {
diff --git a/host/frontend/webrtc/lib/streamer.h b/host/frontend/webrtc/lib/streamer.h
index 50a7e12..bc2297e 100644
--- a/host/frontend/webrtc/lib/streamer.h
+++ b/host/frontend/webrtc/lib/streamer.h
@@ -32,7 +32,7 @@
#include "host/frontend/webrtc/lib/connection_observer.h"
#include "host/frontend/webrtc/lib/local_recorder.h"
#include "host/frontend/webrtc/lib/video_sink.h"
-#include "host/frontend/webrtc/lib/ws_connection.h"
+#include "host/frontend/webrtc/lib/server_connection.h"
namespace cuttlefish {
namespace webrtc_streaming {
@@ -42,18 +42,9 @@
struct StreamerConfig {
// The id with which to register with the operator server.
std::string device_id;
- struct {
- // The ip address or domain name of the operator server.
- std::string addr;
- int port;
- // The path component of the operator server's register url.
- std::string path;
- // The security level to use when connecting to the operator server.
- WsConnection::Security security;
- // A list of key value pairs to include as HTTP handshake headers when
- // connecting to the operator.
- std::vector<std::pair<std::string, std::string>> http_headers;
- } operator_server;
+ // The port on which the client files are being served
+ int client_files_port;
+ ServerConfig operator_server;
// The port ranges webrtc is allowed to use.
// [0,0] means all ports
std::pair<uint16_t, uint16_t> udp_port_range = {15550, 15558};
diff --git a/host/frontend/webrtc/lib/utils.cpp b/host/frontend/webrtc/lib/utils.cpp
index 78460c3..e84b897 100644
--- a/host/frontend/webrtc/lib/utils.cpp
+++ b/host/frontend/webrtc/lib/utils.cpp
@@ -28,6 +28,9 @@
std::string ValidateField(const Json::Value &obj, const std::string &type,
const std::string &field_name,
const Json::ValueType &field_type, bool required) {
+ if (!obj.isObject()) {
+ return "Expected object with name-value pairs";
+ }
if (!obj.isMember(field_name) && !required) {
return "";
}
diff --git a/host/frontend/webrtc/lib/ws_connection.cpp b/host/frontend/webrtc/lib/ws_connection.cpp
deleted file mode 100644
index 5303c21..0000000
--- a/host/frontend/webrtc/lib/ws_connection.cpp
+++ /dev/null
@@ -1,446 +0,0 @@
-//
-// Copyright (C) 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-//
-
-#include "host/frontend/webrtc/lib/ws_connection.h"
-
-#include <android-base/logging.h>
-#include <libwebsockets.h>
-
-class WsConnectionContextImpl;
-
-class WsConnectionImpl : public WsConnection,
- public std::enable_shared_from_this<WsConnectionImpl> {
- public:
- struct CreateConnectionSul {
- lws_sorted_usec_list_t sul = {};
- std::weak_ptr<WsConnectionImpl> weak_this;
- };
-
- WsConnectionImpl(
- int port, const std::string& addr, const std::string& path,
- Security secure,
- const std::vector<std::pair<std::string, std::string>>& headers,
- std::weak_ptr<WsConnectionObserver> observer,
- std::shared_ptr<WsConnectionContextImpl> context);
-
- ~WsConnectionImpl() override;
-
- void Connect() override;
- void ConnectInner();
-
- bool Send(const uint8_t* data, size_t len, bool binary = false) override;
-
- void OnError(const std::string& error);
- void OnReceive(const uint8_t* data, size_t len, bool is_binary);
- void OnOpen();
- void OnClose();
- void OnWriteable();
-
- void AddHttpHeaders(unsigned char** p, unsigned char* end) const;
-
- private:
- struct WsBuffer {
- WsBuffer() = default;
- WsBuffer(const uint8_t* data, size_t len, bool binary)
- : buffer_(LWS_PRE + len), is_binary_(binary) {
- memcpy(&buffer_[LWS_PRE], data, len);
- }
-
- uint8_t* data() { return &buffer_[LWS_PRE]; }
- bool is_binary() const { return is_binary_; }
- size_t size() const { return buffer_.size() - LWS_PRE; }
-
- private:
- std::vector<uint8_t> buffer_;
- bool is_binary_;
- };
-
- CreateConnectionSul extended_sul_;
- struct lws* wsi_;
- const int port_;
- const std::string addr_;
- const std::string path_;
- const Security security_;
- const std::vector<std::pair<std::string, std::string>> headers_;
-
- std::weak_ptr<WsConnectionObserver> observer_;
-
- // each element contains the data to be sent and whether it's binary or not
- std::deque<WsBuffer> write_queue_;
- std::mutex write_queue_mutex_;
- // The connection object should not outlive the context object. This reference
- // guarantees it.
- std::shared_ptr<WsConnectionContextImpl> context_;
-};
-
-class WsConnectionContextImpl
- : public WsConnectionContext,
- public std::enable_shared_from_this<WsConnectionContextImpl> {
- public:
- WsConnectionContextImpl(struct lws_context* lws_ctx);
- ~WsConnectionContextImpl() override;
-
- std::shared_ptr<WsConnection> CreateConnection(
- int port, const std::string& addr, const std::string& path,
- WsConnection::Security secure,
- std::weak_ptr<WsConnectionObserver> observer,
- const std::vector<std::pair<std::string, std::string>>& headers) override;
-
- void RememberConnection(void*, std::weak_ptr<WsConnectionImpl>);
- void ForgetConnection(void*);
- std::shared_ptr<WsConnectionImpl> GetConnection(void*);
-
- struct lws_context* lws_context() {
- return lws_context_;
- }
-
- private:
- void Start();
-
- std::map<void*, std::weak_ptr<WsConnectionImpl>> weak_by_ptr_;
- std::mutex map_mutex_;
- struct lws_context* lws_context_;
- std::thread message_loop_;
-};
-
-int LwsCallback(struct lws* wsi, enum lws_callback_reasons reason, void* user,
- void* in, size_t len);
-void CreateConnectionCallback(lws_sorted_usec_list_t* sul);
-
-namespace {
-
-constexpr char kProtocolName[] = "cf-webrtc-device";
-constexpr int kBufferSize = 65536;
-
-const uint32_t backoff_ms[] = {1000, 2000, 3000, 4000, 5000};
-
-const lws_retry_bo_t kRetry = {
- .retry_ms_table = backoff_ms,
- .retry_ms_table_count = LWS_ARRAY_SIZE(backoff_ms),
- .conceal_count = LWS_ARRAY_SIZE(backoff_ms),
-
- .secs_since_valid_ping = 3, /* force PINGs after secs idle */
- .secs_since_valid_hangup = 10, /* hangup after secs idle */
-
- .jitter_percent = 20,
-};
-
-const struct lws_protocols kProtocols[2] = {
- {kProtocolName, LwsCallback, 0, kBufferSize, 0, NULL, 0},
- {NULL, NULL, 0, 0, 0, NULL, 0}};
-
-} // namespace
-
-std::shared_ptr<WsConnectionContext> WsConnectionContext::Create() {
- struct lws_context_creation_info context_info = {};
- context_info.port = CONTEXT_PORT_NO_LISTEN;
- context_info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
- context_info.protocols = kProtocols;
- struct lws_context* lws_ctx = lws_create_context(&context_info);
- if (!lws_ctx) {
- return nullptr;
- }
- return std::shared_ptr<WsConnectionContext>(
- new WsConnectionContextImpl(lws_ctx));
-}
-
-WsConnectionContextImpl::WsConnectionContextImpl(struct lws_context* lws_ctx)
- : lws_context_(lws_ctx) {
- Start();
-}
-
-WsConnectionContextImpl::~WsConnectionContextImpl() {
- lws_context_destroy(lws_context_);
- if (message_loop_.joinable()) {
- message_loop_.join();
- }
-}
-
-void WsConnectionContextImpl::Start() {
- message_loop_ = std::thread([this]() {
- for (;;) {
- if (lws_service(lws_context_, 0) < 0) {
- break;
- }
- }
- });
-}
-
-std::shared_ptr<WsConnection> WsConnectionContextImpl::CreateConnection(
- int port, const std::string& addr, const std::string& path,
- WsConnection::Security security,
- std::weak_ptr<WsConnectionObserver> observer,
- const std::vector<std::pair<std::string, std::string>>& headers) {
- return std::shared_ptr<WsConnection>(new WsConnectionImpl(
- port, addr, path, security, headers, observer, shared_from_this()));
-}
-
-std::shared_ptr<WsConnectionImpl> WsConnectionContextImpl::GetConnection(
- void* raw) {
- std::shared_ptr<WsConnectionImpl> connection;
- {
- std::lock_guard<std::mutex> lock(map_mutex_);
- if (weak_by_ptr_.count(raw) == 0) {
- return nullptr;
- }
- connection = weak_by_ptr_[raw].lock();
- if (!connection) {
- weak_by_ptr_.erase(raw);
- }
- }
- return connection;
-}
-
-void WsConnectionContextImpl::RememberConnection(
- void* raw, std::weak_ptr<WsConnectionImpl> conn) {
- std::lock_guard<std::mutex> lock(map_mutex_);
- weak_by_ptr_.emplace(
- std::pair<void*, std::weak_ptr<WsConnectionImpl>>(raw, conn));
-}
-
-void WsConnectionContextImpl::ForgetConnection(void* raw) {
- std::lock_guard<std::mutex> lock(map_mutex_);
- weak_by_ptr_.erase(raw);
-}
-
-WsConnectionImpl::WsConnectionImpl(
- int port, const std::string& addr, const std::string& path,
- Security security,
- const std::vector<std::pair<std::string, std::string>>& headers,
- std::weak_ptr<WsConnectionObserver> observer,
- std::shared_ptr<WsConnectionContextImpl> context)
- : port_(port),
- addr_(addr),
- path_(path),
- security_(security),
- headers_(headers),
- observer_(observer),
- context_(context) {}
-
-WsConnectionImpl::~WsConnectionImpl() {
- context_->ForgetConnection(this);
- // This will cause the callback to be called which will drop the connection
- // after seeing the context doesn't remember this object
- lws_callback_on_writable(wsi_);
-}
-
-void WsConnectionImpl::Connect() {
- memset(&extended_sul_.sul, 0, sizeof(extended_sul_.sul));
- extended_sul_.weak_this = weak_from_this();
- lws_sul_schedule(context_->lws_context(), 0, &extended_sul_.sul,
- CreateConnectionCallback, 1);
-}
-
-void WsConnectionImpl::AddHttpHeaders(unsigned char** p,
- unsigned char* end) const {
- for (const auto& header_entry: headers_) {
- const auto& name = header_entry.first;
- const auto& value = header_entry.second;
- auto res = lws_add_http_header_by_name(
- wsi_, reinterpret_cast<const unsigned char*>(name.c_str()),
- reinterpret_cast<const unsigned char*>(value.c_str()), value.size(), p,
- end);
- if (res != 0) {
- LOG(ERROR) << "Unable to add header: " << name;
- }
- }
- if (!headers_.empty()) {
- // Let LWS know we added some headers.
- lws_client_http_body_pending(wsi_, 1);
- }
-}
-
-void WsConnectionImpl::OnError(const std::string& error) {
- auto observer = observer_.lock();
- if (observer) {
- observer->OnError(error);
- }
-}
-void WsConnectionImpl::OnReceive(const uint8_t* data, size_t len,
- bool is_binary) {
- auto observer = observer_.lock();
- if (observer) {
- observer->OnReceive(data, len, is_binary);
- }
-}
-void WsConnectionImpl::OnOpen() {
- auto observer = observer_.lock();
- if (observer) {
- observer->OnOpen();
- }
-}
-void WsConnectionImpl::OnClose() {
- auto observer = observer_.lock();
- if (observer) {
- observer->OnClose();
- }
-}
-
-void WsConnectionImpl::OnWriteable() {
- WsBuffer buffer;
- {
- std::lock_guard<std::mutex> lock(write_queue_mutex_);
- if (write_queue_.size() == 0) {
- return;
- }
- buffer = std::move(write_queue_.front());
- write_queue_.pop_front();
- }
- auto flags = lws_write_ws_flags(
- buffer.is_binary() ? LWS_WRITE_BINARY : LWS_WRITE_TEXT, true, true);
- auto res = lws_write(wsi_, buffer.data(), buffer.size(),
- (enum lws_write_protocol)flags);
- if (res != buffer.size()) {
- LOG(WARNING) << "Unable to send the entire message!";
- }
-}
-
-bool WsConnectionImpl::Send(const uint8_t* data, size_t len, bool binary) {
- if (!wsi_) {
- LOG(WARNING) << "Send called on an uninitialized connection!!";
- return false;
- }
- WsBuffer buffer(data, len, binary);
- {
- std::lock_guard<std::mutex> lock(write_queue_mutex_);
- write_queue_.emplace_back(std::move(buffer));
- }
-
- lws_callback_on_writable(wsi_);
- return true;
-}
-
-int LwsCallback(struct lws* wsi, enum lws_callback_reasons reason, void* user,
- void* in, size_t len) {
- constexpr int DROP = -1;
- constexpr int OK = 0;
-
- // For some values of `reason`, `user` doesn't point to the value provided
- // when the connection was created. This function object should be used with
- // care.
- auto with_connection =
- [wsi, user](std::function<void(std::shared_ptr<WsConnectionImpl>)> cb) {
- auto context = reinterpret_cast<WsConnectionContextImpl*>(user);
- auto connection = context->GetConnection(wsi);
- if (!connection) {
- return DROP;
- }
- cb(connection);
- return OK;
- };
-
- switch (reason) {
- case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
- return with_connection(
- [in](std::shared_ptr<WsConnectionImpl> connection) {
- connection->OnError(in ? (char*)in : "(null)");
- });
-
- case LWS_CALLBACK_CLIENT_RECEIVE:
- return with_connection(
- [in, len, wsi](std::shared_ptr<WsConnectionImpl> connection) {
- connection->OnReceive((const uint8_t*)in, len,
- lws_frame_is_binary(wsi));
- });
-
- case LWS_CALLBACK_CLIENT_ESTABLISHED:
- return with_connection([](std::shared_ptr<WsConnectionImpl> connection) {
- connection->OnOpen();
- });
-
- case LWS_CALLBACK_CLIENT_CLOSED:
- return with_connection([](std::shared_ptr<WsConnectionImpl> connection) {
- connection->OnClose();
- });
-
- case LWS_CALLBACK_CLIENT_WRITEABLE:
- return with_connection([](std::shared_ptr<WsConnectionImpl> connection) {
- connection->OnWriteable();
- });
-
- case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:
- return with_connection(
- [in, len](std::shared_ptr<WsConnectionImpl> connection) {
- auto p = reinterpret_cast<unsigned char**>(in);
- auto end = (*p) + len;
- connection->AddHttpHeaders(p, end);
- });
-
- case LWS_CALLBACK_CLIENT_HTTP_WRITEABLE:
- // This callback is only called when we add additional HTTP headers, let
- // LWS know we're done modifying the HTTP request.
- lws_client_http_body_pending(wsi, 0);
- return 0;
-
- default:
- LOG(VERBOSE) << "Unhandled value: " << reason;
- return lws_callback_http_dummy(wsi, reason, user, in, len);
- }
-}
-
-void CreateConnectionCallback(lws_sorted_usec_list_t* sul) {
- std::shared_ptr<WsConnectionImpl> connection =
- reinterpret_cast<WsConnectionImpl::CreateConnectionSul*>(sul)
- ->weak_this.lock();
- if (!connection) {
- LOG(WARNING) << "The object was already destroyed by the time of the first "
- << "connection attempt. That's unusual.";
- return;
- }
- connection->ConnectInner();
-}
-
-void WsConnectionImpl::ConnectInner() {
- struct lws_client_connect_info connect_info;
-
- memset(&connect_info, 0, sizeof(connect_info));
-
- connect_info.context = context_->lws_context();
- connect_info.port = port_;
- connect_info.address = addr_.c_str();
- connect_info.path = path_.c_str();
- connect_info.host = connect_info.address;
- connect_info.origin = connect_info.address;
- switch (security_) {
- case Security::kAllowSelfSigned:
- connect_info.ssl_connection = LCCSCF_ALLOW_SELFSIGNED |
- LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK |
- LCCSCF_USE_SSL;
- break;
- case Security::kStrict:
- connect_info.ssl_connection = LCCSCF_USE_SSL;
- break;
- case Security::kInsecure:
- connect_info.ssl_connection = 0;
- break;
- }
- connect_info.protocol = "webrtc-operator";
- connect_info.local_protocol_name = kProtocolName;
- connect_info.pwsi = &wsi_;
- connect_info.retry_and_idle_policy = &kRetry;
- // There is no guarantee the connection object still exists when the callback
- // is called. Put the context instead as the user data which is guaranteed to
- // still exist and holds a weak ptr to the connection.
- connect_info.userdata = context_.get();
-
- if (lws_client_connect_via_info(&connect_info)) {
- // wsi_ is not initialized until after the call to
- // lws_client_connect_via_info(). Luckily, this is guaranteed to run before
- // the protocol callback is called because it runs in the same loop.
- context_->RememberConnection(wsi_, weak_from_this());
- } else {
- LOG(ERROR) << "Connection failed!";
- }
-}
diff --git a/host/frontend/webrtc/lib/ws_connection.h b/host/frontend/webrtc/lib/ws_connection.h
deleted file mode 100644
index 1c03265..0000000
--- a/host/frontend/webrtc/lib/ws_connection.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-// Copyright (C) 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-//
-
-#pragma once
-
-#include <string.h>
-
-#include <deque>
-#include <functional>
-#include <map>
-#include <memory>
-#include <mutex>
-#include <string>
-#include <thread>
-#include <vector>
-
-#include <libwebsockets.h>
-
-class WsConnectionObserver {
- public:
- virtual ~WsConnectionObserver() = default;
- virtual void OnOpen() = 0;
- virtual void OnClose() = 0;
- virtual void OnError(const std::string& error) = 0;
- virtual void OnReceive(const uint8_t* msg, size_t length, bool is_binary) = 0;
-};
-
-class WsConnection {
- public:
- enum class Security {
- kInsecure,
- kAllowSelfSigned,
- kStrict,
- };
-
- virtual ~WsConnection() = default;
-
- virtual void Connect() = 0;
-
- virtual bool Send(const uint8_t* data, size_t len, bool binary = false) = 0;
-
- protected:
- WsConnection() = default;
-};
-
-class WsConnectionContext {
- public:
- static std::shared_ptr<WsConnectionContext> Create();
-
- virtual ~WsConnectionContext() = default;
-
- virtual std::shared_ptr<WsConnection> CreateConnection(
- int port, const std::string& addr, const std::string& path,
- WsConnection::Security secure,
- std::weak_ptr<WsConnectionObserver> observer,
- const std::vector<std::pair<std::string, std::string>>& headers = {}) = 0;
-
- protected:
- WsConnectionContext() = default;
-};
diff --git a/host/frontend/webrtc/main.cpp b/host/frontend/webrtc/main.cpp
index 57d5644..b607dca 100644
--- a/host/frontend/webrtc/main.cpp
+++ b/host/frontend/webrtc/main.cpp
@@ -30,6 +30,7 @@
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/files.h"
#include "host/frontend/webrtc/audio_handler.h"
+#include "host/frontend/webrtc/client_server.h"
#include "host/frontend/webrtc/connection_observer.h"
#include "host/frontend/webrtc/display_handler.h"
#include "host/frontend/webrtc/kernel_log_events_handler.h"
@@ -59,6 +60,7 @@
"Whether to send input events in virtio format.");
DEFINE_int32(audio_server_fd, -1, "An fd to listen on for audio frames");
DEFINE_int32(camera_streamer_fd, -1, "An fd to send client camera frames");
+DEFINE_string(client_dir, "webrtc", "Location of the client files");
using cuttlefish::AudioHandler;
using cuttlefish::CfConnectionObserverFactory;
@@ -68,6 +70,7 @@
using cuttlefish::webrtc_streaming::Streamer;
using cuttlefish::webrtc_streaming::StreamerConfig;
using cuttlefish::webrtc_streaming::VideoSink;
+using cuttlefish::webrtc_streaming::ServerConfig;
class CfOperatorObserver
: public cuttlefish::webrtc_streaming::OperatorObserver {
@@ -131,6 +134,12 @@
return std::make_unique<cuttlefish::AudioServer>(audio_server_fd);
}
+fruit::Component<cuttlefish::CustomActionConfigProvider> WebRtcComponent() {
+ return fruit::createComponent()
+ .install(cuttlefish::ConfigFlagPlaceholder)
+ .install(cuttlefish::CustomActionsComponent);
+};
+
int main(int argc, char** argv) {
cuttlefish::DefaultSubprocessLogging(argv);
::gflags::ParseCommandLineFlags(&argc, &argv, true);
@@ -197,6 +206,8 @@
auto screen_connector_ptr = cuttlefish::DisplayHandler::ScreenConnector::Get(
FLAGS_frame_server_fd, host_mode_ctrl);
auto& screen_connector = *(screen_connector_ptr.get());
+ auto client_server = cuttlefish::ClientFilesServer::New(FLAGS_client_dir);
+ CHECK(client_server) << "Failed to initialize client files server";
// create confirmation UI service, giving host_mode_ctrl and
// screen_connector
@@ -207,15 +218,21 @@
StreamerConfig streamer_config;
streamer_config.device_id = instance.webrtc_device_id();
+ streamer_config.client_files_port = client_server->port();
streamer_config.tcp_port_range = cvd_config->webrtc_tcp_port_range();
streamer_config.udp_port_range = cvd_config->webrtc_udp_port_range();
streamer_config.operator_server.addr = cvd_config->sig_server_address();
streamer_config.operator_server.port = cvd_config->sig_server_port();
streamer_config.operator_server.path = cvd_config->sig_server_path();
- streamer_config.operator_server.security =
- cvd_config->sig_server_strict()
- ? WsConnection::Security::kStrict
- : WsConnection::Security::kAllowSelfSigned;
+ if (cvd_config->sig_server_secure()) {
+ streamer_config.operator_server.security =
+ cvd_config->sig_server_strict()
+ ? ServerConfig::Security::kStrict
+ : ServerConfig::Security::kAllowSelfSigned;
+ } else {
+ streamer_config.operator_server.security =
+ ServerConfig::Security::kInsecure;
+ }
if (!cvd_config->sig_server_headers_path().empty()) {
streamer_config.operator_server.http_headers =
@@ -265,7 +282,6 @@
CHECK(local_recorder) << "Could not create local recorder";
streamer->RecordDisplays(*local_recorder);
- display_handler->IncClientCount();
}
observer_factory->SetDisplayHandler(display_handler);
@@ -310,7 +326,17 @@
action_server_fds[server] = fd;
}
- for (const auto& custom_action : cvd_config->custom_actions()) {
+ fruit::Injector<cuttlefish::CustomActionConfigProvider> injector(
+ WebRtcComponent);
+ for (auto& fragment :
+ injector.getMultibindings<cuttlefish::ConfigFragment>()) {
+ CHECK(cvd_config->LoadFragment(*fragment))
+ << "Failed to load config fragment";
+ }
+
+ const auto& actions_provider =
+ injector.get<cuttlefish::CustomActionConfigProvider&>();
+ for (const auto& custom_action : actions_provider.CustomActions()) {
if (custom_action.shell_command) {
if (custom_action.buttons.size() != 1) {
LOG(FATAL) << "Expected exactly one button for custom action command: "
diff --git a/host/frontend/webrtc_operator/Android.bp b/host/frontend/webrtc_operator/Android.bp
index 54eda44..c734ae0 100644
--- a/host/frontend/webrtc_operator/Android.bp
+++ b/host/frontend/webrtc_operator/Android.bp
@@ -38,6 +38,7 @@
"webrtc_signaling_headers",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"liblog",
"libcrypto",
@@ -67,51 +68,23 @@
}
prebuilt_usr_share_host {
- name: "webrtc_style.css",
- src: "assets/style.css",
- filename: "style.css",
+ name: "webrtc_index.css",
+ src: "assets/index.css",
+ filename: "index.css",
sub_dir: "webrtc/assets",
}
prebuilt_usr_share_host {
- name: "webrtc_controls.css",
- src: "assets/controls.css",
- filename: "controls.css",
- sub_dir: "webrtc/assets",
-}
-
-prebuilt_usr_share_host {
- name: "webrtc_adb.js",
- src: "assets/js/adb.js",
- filename: "adb.js",
+ name: "webrtc_index.js",
+ src: "assets/js/index.js",
+ filename: "index.js",
sub_dir: "webrtc/assets/js",
}
prebuilt_usr_share_host {
- name: "webrtc_cf.js",
- src: "assets/js/cf_webrtc.js",
- filename: "cf_webrtc.js",
- sub_dir: "webrtc/assets/js",
-}
-
-prebuilt_usr_share_host {
- name: "webrtc_app.js",
- src: "assets/js/app.js",
- filename: "app.js",
- sub_dir: "webrtc/assets/js",
-}
-
-prebuilt_usr_share_host {
- name: "webrtc_controls.js",
- src: "assets/js/controls.js",
- filename: "controls.js",
- sub_dir: "webrtc/assets/js",
-}
-
-prebuilt_usr_share_host {
- name: "webrtc_rootcanal.js",
- src: "assets/js/rootcanal.js",
- filename: "rootcanal.js",
+ name: "webrtc_server_connector.js",
+ src: "assets/js/server_connector.js",
+ filename: "server_connector.js",
sub_dir: "webrtc/assets/js",
}
diff --git a/common/libs/utils/size_utils.cpp b/host/frontend/webrtc_operator/assets/index.css
similarity index 64%
copy from common/libs/utils/size_utils.cpp
copy to host/frontend/webrtc_operator/assets/index.css
index 9f25445..335e075 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/frontend/webrtc_operator/assets/index.css
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,24 @@
* limitations under the License.
*/
-#include "common/libs/utils/size_utils.h"
-
-#include <unistd.h>
-
-namespace cuttlefish {
-
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
+body {
+ background-color:black;
+ margin: 0;
}
-} // namespace cuttlefish
+#device-selector {
+ color: whitesmoke;
+}
+
+#device-selector li.device-entry {
+ cursor: pointer;
+}
+
+#refresh-list {
+ cursor: pointer;
+}
+
+#device-list .device-entry button {
+ margin-left: 10px;
+}
+
diff --git a/host/frontend/webrtc_operator/assets/index.html b/host/frontend/webrtc_operator/assets/index.html
index f0dc25e..09d8c70 100644
--- a/host/frontend/webrtc_operator/assets/index.html
+++ b/host/frontend/webrtc_operator/assets/index.html
@@ -18,11 +18,8 @@
<head>
<title>My Virtual Device Playground</title>
- <link rel="stylesheet" type="text/css" href="style.css" >
- <link rel="stylesheet" type="text/css" href="controls.css" >
- <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined">
+ <link rel="stylesheet" type="text/css" href="index.css" >
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
@@ -30,57 +27,6 @@
<h1>Available devices <span id='refresh-list'>↻</span></h1>
<ul id="device-list"></ul>
</section>
- <section id='device-connection'>
- <div id='header'>
- <div id='app-controls'>
- <div id="keyboard-capture-control" title="Capture Keyboard"></div>
- <div id="mic-capture-control" title="Capture Microphone"></div>
- <div id="camera-control" title="Capture Camera"></div>
- <audio autoplay controls id="device-audio"></audio>
- </div>
- <div id='status-div'>
- <h3 id='status-message' class='connecting'>Connecting to device</h3>
- </div>
- </div>
- <div id='controls-and-displays'>
- <div id='control-panel-default-buttons' class='control-panel-column'>
- <button id='device-details-button' title='Device Details' class='material-icons'>
- settings
- </button>
- <button id='bluetooth-console-button' title='Bluetooth console' class='material-icons'>
- settings_bluetooth
- </button>
- </div>
- <div id='control-panel-custom-buttons' class='control-panel-column'></div>
- <div id='device-displays'>
- </div>
- </div>
- </section>
- <div id='device-details-modal' class='modal'>
- <div id='device-details-modal-header' class='modal-header'>
- <h2>Device Details</h2>
- <button id='device-details-close' title='Close' class='material-icons modal-close'>close</button>
- </div>
- <hr>
- <h3>Hardware Configuration</h3>
- <span id='device-details-hardware'>unknown</span>
- </div>
- <div id='bluetooth-console-modal' class='modal'>
- <div id='bluetooth-console-modal-header' class='modal-header'>
- <h2>Bluetooth Console</h2>
- <button id='bluetooth-console-close' title='Close' class='material-icons modal-close'>close</button>
- </div>
- <div>
- <table>
- <tr><td colspan='2'><textarea id='bluetooth-console-view' readonly rows='10' cols='60'></textarea></td></tr>
- <tr><td width='1'><p id='bluetooth-console-cmd-label'>Command:</p></td><td width='100'><input id='bluetooth-console-input' type='text'></input></td></tr>
- </table>
- </div>
- </div>
- <script src="js/adb.js"></script>
- <script src="js/rootcanal.js"></script>
- <script src="js/cf_webrtc.js" type="module"></script>
- <script src="js/controls.js"></script>
- <script src="js/app.js"></script>
+ <script src="js/index.js"></script>
</body>
</html>
diff --git a/host/frontend/webrtc_operator/assets/js/adb.js b/host/frontend/webrtc_operator/assets/js/adb.js
deleted file mode 100644
index 75540ae..0000000
--- a/host/frontend/webrtc_operator/assets/js/adb.js
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-let adb_ws;
-
-let utf8Encoder = new TextEncoder();
-let utf8Decoder = new TextDecoder();
-
-const A_CNXN = 0x4e584e43;
-const A_OPEN = 0x4e45504f;
-const A_WRTE = 0x45545257;
-const A_OKAY = 0x59414b4f;
-
-const kLocalChannelId = 666;
-
-let array = new Uint8Array();
-
-function setU32LE(array, offset, x) {
- array[offset] = x & 0xff;
- array[offset + 1] = (x >> 8) & 0xff;
- array[offset + 2] = (x >> 16) & 0xff;
- array[offset + 3] = x >> 24;
-}
-
-function getU32LE(array, offset) {
- let x = array[offset]
- | (array[offset + 1] << 8)
- | (array[offset + 2] << 16)
- | (array[offset + 3] << 24);
-
- return x >>> 0; // convert signed to unsigned if necessary.
-}
-
-function computeChecksum(array) {
- let sum = 0;
- let i;
- for (i = 0; i < array.length; ++i) {
- sum = ((sum + array[i]) & 0xffffffff) >>> 0;
- }
-
- return sum;
-}
-
-function createAdbMessage(command, arg0, arg1, payload) {
- let arrayBuffer = new ArrayBuffer(24 + payload.length);
- let array = new Uint8Array(arrayBuffer);
- setU32LE(array, 0, command);
- setU32LE(array, 4, arg0);
- setU32LE(array, 8, arg1);
- setU32LE(array, 12, payload.length);
- setU32LE(array, 16, computeChecksum(payload));
- setU32LE(array, 20, command ^ 0xffffffff);
- array.set(payload, 24);
-
- return arrayBuffer;
-}
-
-function adbOpenConnection() {
- let systemIdentity = utf8Encoder.encode("Cray_II:1234:whatever");
-
- let arrayBuffer = createAdbMessage(
- A_CNXN, 0x1000000, 256 * 1024, systemIdentity);
-
- adb_ws.send(arrayBuffer);
-}
-
-function adbShell(command) {
- let destination = utf8Encoder.encode("shell:" + command);
-
- let arrayBuffer = createAdbMessage(A_OPEN, kLocalChannelId, 0, destination);
- adb_ws.send(arrayBuffer);
- awaitConnection();
-}
-
-function adbSendOkay(remoteId) {
- let payload = new Uint8Array(0);
-
- let arrayBuffer = createAdbMessage(
- A_OKAY, kLocalChannelId, remoteId, payload);
-
- adb_ws.send(arrayBuffer);
-}
-
-function JoinArrays(arr1, arr2) {
- let arr = new Uint8Array(arr1.length + arr2.length);
- arr.set(arr1, 0);
- arr.set(arr2, arr1.length);
- return arr;
-}
-
-// Simple lifecycle management that executes callbacks based on connection state.
-//
-// Any attempt to initiate a command (e.g. creating a connection, sending a message)
-// (re)starts a timer. Any response back from any command stops that timer.
-const timeoutMs = 3000;
-let connectedCb;
-let disconnectedCb;
-let disconnectedTimeout;
-function awaitConnection() {
- clearTimeout(disconnectedTimeout);
- if (disconnectedCb) {
- disconnectedTimeout = setTimeout(disconnectedCb, timeoutMs);
- }
-}
-function connected() {
- if (disconnectedTimeout) {
- clearTimeout(disconnectedTimeout);
- }
- if (connectedCb) {
- connectedCb();
- }
-}
-
-function adbOnMessage(arrayBuffer) {
- // console.log("adb_ws: onmessage (" + arrayBuffer.byteLength + " bytes)");
- array = JoinArrays(array, new Uint8Array(arrayBuffer));
-
- while (array.length > 0) {
- if (array.length < 24) {
- // Incomplete package, must wait for more data.
- return;
- }
-
- let command = getU32LE(array, 0);
- let magic = getU32LE(array, 20);
-
- if (command != ((magic ^ 0xffffffff) >>> 0)) {
- console.log("command = " + command + ", magic = " + magic);
- console.log("adb message command vs magic failed.");
- return;
- }
-
- let payloadLength = getU32LE(array, 12);
-
- if (array.length < 24 + payloadLength) {
- // Incomplete package, must wait for more data.
- return;
- }
-
- let payloadChecksum = getU32LE(array, 16);
- let checksum = computeChecksum(array.slice(24));
-
- if (payloadChecksum != checksum) {
- console.log("adb message checksum mismatch.");
- // This can happen if a shell command executes while another
- // channel is receiving data.
- }
-
- switch (command) {
- case A_CNXN:
- {
- console.log("WebRTC adb connected.");
- connected();
- break;
- }
-
- case A_OKAY:
- {
- let remoteId = getU32LE(array, 4);
- console.log("WebRTC adb channel created w/ remoteId " + remoteId);
- connected();
- break;
- }
-
- case A_WRTE:
- {
- let remoteId = getU32LE(array, 4);
- adbSendOkay(remoteId);
- break;
- }
- }
- array = array.subarray(24 + payloadLength, array.length);
- }
-}
-
-function init_adb(devConn, ccb = connectedCb, dcb = disconnectedCb) {
- if (adb_ws) return;
-
- adb_ws = {
- send: function(buffer) {
- devConn.sendAdbMessage(buffer);
- }
- };
- connectedCb = ccb;
- disconnectedCb = dcb;
- awaitConnection();
-
- devConn.onAdbMessage(msg => adbOnMessage(msg));
-
- adbOpenConnection();
-}
diff --git a/host/frontend/webrtc_operator/assets/js/app.js b/host/frontend/webrtc_operator/assets/js/app.js
deleted file mode 100644
index db9c8a7..0000000
--- a/host/frontend/webrtc_operator/assets/js/app.js
+++ /dev/null
@@ -1,972 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-'use strict';
-
-function ConnectToDevice(device_id) {
- console.log('ConnectToDevice ', device_id);
- const keyboardCaptureCtrl = document.getElementById('keyboard-capture-control');
- createToggleControl(keyboardCaptureCtrl, "keyboard", onKeyboardCaptureToggle);
- const micCaptureCtrl = document.getElementById('mic-capture-control');
- createToggleControl(micCaptureCtrl, "mic", onMicCaptureToggle);
- const cameraCtrl = document.getElementById('camera-control');
- createToggleControl(cameraCtrl, "videocam", onVideoCaptureToggle);
-
- const deviceAudio = document.getElementById('device-audio');
- const deviceDisplays = document.getElementById('device-displays');
- const statusMessage = document.getElementById('status-message');
-
- let connectionAttemptDuration = 0;
- const intervalMs = 500;
- let deviceStatusEllipsisCount = 0;
- let animateDeviceStatusMessage = setInterval(function() {
- connectionAttemptDuration += intervalMs;
- if (connectionAttemptDuration > 30000) {
- statusMessage.className = 'error';
- statusMessage.textContent = 'Connection should have occurred by now. ' +
- 'Please attempt to restart the guest device.';
- } else {
- if (connectionAttemptDuration > 15000) {
- statusMessage.textContent = 'Connection is taking longer than expected';
- } else {
- statusMessage.textContent = 'Connecting to device';
- }
- deviceStatusEllipsisCount = (deviceStatusEllipsisCount + 1) % 4;
- statusMessage.textContent += '.'.repeat(deviceStatusEllipsisCount);
- }
- }, intervalMs);
-
- let buttons = {};
- let mouseIsDown = false;
- let deviceConnection;
- let touchIdSlotMap = new Map();
- let touchSlots = new Array();
- let deviceStateLidSwitchOpen = null;
- let deviceStateHingeAngleValue = null;
-
- function showAdbConnected() {
- // Screen changed messages are not reported until after boot has completed.
- // Certain default adb buttons change screen state, so wait for boot
- // completion before enabling these buttons.
- statusMessage.className = 'connected';
- statusMessage.textContent =
- 'adb connection established successfully.';
- setTimeout(function() {
- statusMessage.style.visibility = 'hidden';
- }, 5000);
- for (const [_, button] of Object.entries(buttons)) {
- if (button.adb) {
- button.button.disabled = false;
- }
- }
- }
-
- function initializeAdb() {
- init_adb(
- deviceConnection,
- showAdbConnected,
- function() {
- statusMessage.className = 'error';
- statusMessage.textContent = 'adb connection failed.';
- statusMessage.style.visibility = 'visible';
- for (const [_, button] of Object.entries(buttons)) {
- if (button.adb) {
- button.button.disabled = true;
- }
- }
- });
- }
-
- let currentRotation = 0;
- let currentDisplayDescriptions;
- function onControlMessage(message) {
- let message_data = JSON.parse(message.data);
- console.log(message_data)
- let metadata = message_data.metadata;
- if (message_data.event == 'VIRTUAL_DEVICE_BOOT_STARTED') {
- // Start the adb connection after receiving the BOOT_STARTED message.
- // (This is after the adbd start message. Attempting to connect
- // immediately after adbd starts causes issues.)
- initializeAdb();
- }
- if (message_data.event == 'VIRTUAL_DEVICE_SCREEN_CHANGED') {
- if (metadata.rotation != currentRotation) {
- // Animate the screen rotation.
- const targetRotation = metadata.rotation == 0 ? 0 : -90;
-
- $(deviceDisplays).animate(
- {
- textIndent: targetRotation,
- },
- {
- duration: 1000,
- step: function(now, tween) {
- resizeDeviceDisplays();
- },
- }
- );
- }
-
- currentRotation = metadata.rotation;
- }
- if (message_data.event == 'VIRTUAL_DEVICE_CAPTURE_IMAGE') {
- if (deviceConnection.cameraEnabled) {
- takePhoto();
- }
- }
- if (message_data.event == 'VIRTUAL_DEVICE_DISPLAY_POWER_MODE_CHANGED') {
- updateDisplayVisibility(metadata.display, metadata.mode);
- }
- }
-
- function updateDisplayVisibility(displayId, powerMode) {
- const display = document.getElementById('display_' + displayId).parentElement;
- if (display == null) {
- console.error('Unknown display id: ' + displayId);
- return;
- }
- switch (powerMode) {
- case 'On':
- display.style.visibility = 'visible';
- break;
- case 'Off':
- display.style.visibility = 'hidden';
- break;
- default:
- console.error('Display ' + displayId + ' has unknown display power mode: ' + powerMode);
- }
- }
-
- function getTransformRotation(element) {
- if (!element.style.textIndent) {
- return 0;
- }
- // Remove 'px' and convert to float.
- return parseFloat(element.style.textIndent.slice(0, -2));
- }
-
- let anyDeviceDisplayLoaded = false;
- function onDeviceDisplayLoaded() {
- if (anyDeviceDisplayLoaded) {
- return;
- }
- anyDeviceDisplayLoaded = true;
-
- clearInterval(animateDeviceStatusMessage);
- statusMessage.textContent = 'Awaiting bootup and adb connection. Please wait...';
- resizeDeviceDisplays();
-
- let deviceDisplayList =
- document.getElementsByClassName("device-display");
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.style.visibility = 'visible';
- }
-
- // Enable the buttons after the screen is visible.
- for (const [_, button] of Object.entries(buttons)) {
- if (!button.adb) {
- button.button.disabled = false;
- }
- }
- // Start the adb connection if it is not already started.
- initializeAdb();
- }
-
- // Creates a <video> element and a <div> container element for each display.
- // The extra <div> container elements are used to maintain the width and
- // height of the device as the CSS 'transform' property used on the <video>
- // element for rotating the device only affects the visuals of the element
- // and not its layout.
- function createDeviceDisplays(devConn) {
- for (const deviceDisplayDescription of currentDisplayDescriptions) {
- let deviceDisplay = document.createElement("div");
- deviceDisplay.classList.add("device-display");
- // Start the screen as hidden. Only show when data is ready.
- deviceDisplay.style.visibility = 'hidden';
-
- let deviceDisplayInfo = document.createElement("div");
- deviceDisplayInfo.classList.add("device-display-info");
- deviceDisplayInfo.id = deviceDisplayDescription.stream_id + '_info';
- deviceDisplay.appendChild(deviceDisplayInfo);
-
- let deviceDisplayVideo = document.createElement("video");
- deviceDisplayVideo.autoplay = true;
- deviceDisplayVideo.id = deviceDisplayDescription.stream_id;
- deviceDisplayVideo.classList.add("device-display-video");
- deviceDisplayVideo.addEventListener('loadeddata', (evt) => {
- onDeviceDisplayLoaded();
- });
- deviceDisplay.appendChild(deviceDisplayVideo);
-
- deviceDisplays.appendChild(deviceDisplay);
-
- let stream_id = deviceDisplayDescription.stream_id;
- devConn.getStream(stream_id).then(stream => {
- deviceDisplayVideo.srcObject = stream;
- }).catch(e => console.error('Unable to get display stream: ', e));
- }
- }
-
- function takePhoto() {
- const imageCapture = deviceConnection.imageCapture;
- if (imageCapture) {
- const photoSettings = {
- imageWidth: deviceConnection.cameraWidth,
- imageHeight: deviceConnection.cameraHeight
- }
- imageCapture.takePhoto(photoSettings)
- .then(blob => blob.arrayBuffer())
- .then(buffer => deviceConnection.sendOrQueueCameraData(buffer))
- .catch(error => console.log(error));
- }
- }
-
- function resizeDeviceDisplays() {
- // Padding between displays.
- const deviceDisplayWidthPadding = 10;
- // Padding for the display info above each display video.
- const deviceDisplayHeightPadding = 38;
-
- let deviceDisplayList =
- document.getElementsByClassName("device-display");
- let deviceDisplayVideoList =
- document.getElementsByClassName("device-display-video");
- let deviceDisplayInfoList =
- document.getElementsByClassName("device-display-info");
-
- const rotationDegrees = getTransformRotation(deviceDisplays);
- const rotationRadians = rotationDegrees * Math.PI / 180;
-
- // Auto-scale the screen based on window size.
- let availableWidth = deviceDisplays.clientWidth;
- let availableHeight = deviceDisplays.clientHeight - deviceDisplayHeightPadding;
-
- // Reserve space for padding between the displays.
- availableWidth = availableWidth -
- (currentDisplayDescriptions.length * deviceDisplayWidthPadding);
-
- // Loop once over all of the displays to compute the total space needed.
- let neededWidth = 0;
- let neededHeight = 0;
- for (let i = 0; i < deviceDisplayList.length; i++) {
- let deviceDisplayDescription = currentDisplayDescriptions[i];
- let deviceDisplayVideo = deviceDisplayVideoList[i];
-
- const originalDisplayWidth = deviceDisplayDescription.x_res;
- const originalDisplayHeight = deviceDisplayDescription.y_res;
-
- const neededBoundingBoxWidth =
- Math.abs(Math.cos(rotationRadians) * originalDisplayWidth) +
- Math.abs(Math.sin(rotationRadians) * originalDisplayHeight);
- const neededBoundingBoxHeight =
- Math.abs(Math.sin(rotationRadians) * originalDisplayWidth) +
- Math.abs(Math.cos(rotationRadians) * originalDisplayHeight);
-
- neededWidth = neededWidth + neededBoundingBoxWidth;
- neededHeight = Math.max(neededHeight, neededBoundingBoxHeight);
- }
-
- const scaling = Math.min(availableWidth / neededWidth,
- availableHeight / neededHeight);
-
- // Loop again over all of the displays to set the sizes and positions.
- let deviceDisplayLeftOffset = 0;
- for (let i = 0; i < deviceDisplayList.length; i++) {
- let deviceDisplay = deviceDisplayList[i];
- let deviceDisplayVideo = deviceDisplayVideoList[i];
- let deviceDisplayInfo = deviceDisplayInfoList[i];
- let deviceDisplayDescription = currentDisplayDescriptions[i];
-
- let rotated = currentRotation == 1 ? ' (Rotated)' : '';
- deviceDisplayInfo.textContent = `Display ${i} - ` +
- `${deviceDisplayDescription.x_res}x` +
- `${deviceDisplayDescription.y_res} ` +
- `(${deviceDisplayDescription.dpi} DPI)${rotated}`;
-
- const originalDisplayWidth = deviceDisplayDescription.x_res;
- const originalDisplayHeight = deviceDisplayDescription.y_res;
-
- const scaledDisplayWidth = originalDisplayWidth * scaling;
- const scaledDisplayHeight = originalDisplayHeight * scaling;
-
- const neededBoundingBoxWidth =
- Math.abs(Math.cos(rotationRadians) * originalDisplayWidth) +
- Math.abs(Math.sin(rotationRadians) * originalDisplayHeight);
- const neededBoundingBoxHeight =
- Math.abs(Math.sin(rotationRadians) * originalDisplayWidth) +
- Math.abs(Math.cos(rotationRadians) * originalDisplayHeight);
-
- const scaledBoundingBoxWidth = neededBoundingBoxWidth * scaling;
- const scaledBoundingBoxHeight = neededBoundingBoxHeight * scaling;
-
- const offsetX = (scaledBoundingBoxWidth - scaledDisplayWidth) / 2;
- const offsetY = (scaledBoundingBoxHeight - scaledDisplayHeight) / 2;
-
- deviceDisplayVideo.style.width = scaledDisplayWidth;
- deviceDisplayVideo.style.height = scaledDisplayHeight;
- deviceDisplayVideo.style.transform =
- `translateX(${offsetX}px) ` +
- `translateY(${offsetY}px) ` +
- `rotateZ(${rotationDegrees}deg) `;
-
- deviceDisplay.style.left = `${deviceDisplayLeftOffset}px`;
- deviceDisplay.style.width = scaledBoundingBoxWidth;
- deviceDisplay.style.height = scaledBoundingBoxHeight;
-
- deviceDisplayLeftOffset =
- deviceDisplayLeftOffset +
- deviceDisplayWidthPadding +
- scaledBoundingBoxWidth;
- }
- }
- window.onresize = resizeDeviceDisplays;
-
- function createControlPanelButton(command, title, icon_name,
- listener=onControlPanelButton,
- parent_id='control-panel-default-buttons') {
- let button = document.createElement('button');
- document.getElementById(parent_id).appendChild(button);
- button.title = title;
- button.dataset.command = command;
- button.disabled = true;
- // Capture mousedown/up/out commands instead of click to enable
- // hold detection. mouseout is used to catch if the user moves the
- // mouse outside the button while holding down.
- button.addEventListener('mousedown', listener);
- button.addEventListener('mouseup', listener);
- button.addEventListener('mouseout', listener);
- // Set the button image using Material Design icons.
- // See http://google.github.io/material-design-icons
- // and https://material.io/resources/icons
- button.classList.add('material-icons');
- button.innerHTML = icon_name;
- buttons[command] = { 'button': button }
- return buttons[command];
- }
- createControlPanelButton('power', 'Power', 'power_settings_new');
- createControlPanelButton('home', 'Home', 'home');
- createControlPanelButton('menu', 'Menu', 'menu');
- createControlPanelButton('rotate', 'Rotate', 'screen_rotation', onRotateButton);
- buttons['rotate'].adb = true;
- createControlPanelButton('volumemute', 'Volume Mute', 'volume_mute');
- createControlPanelButton('volumedown', 'Volume Down', 'volume_down');
- createControlPanelButton('volumeup', 'Volume Up', 'volume_up');
-
- let modalOffsets = {}
- function createModalButton(button_id, modal_id, close_id) {
- const modalButton = document.getElementById(button_id);
- const modalDiv = document.getElementById(modal_id);
- const modalHeader = modalDiv.querySelector('.modal-header');
- const modalClose = document.getElementById(close_id);
-
- // Position the modal to the right of the show modal button.
- modalDiv.style.top = modalButton.offsetTop;
- modalDiv.style.left = modalButton.offsetWidth + 30;
-
- function showHideModal(show) {
- if (show) {
- modalButton.classList.add('modal-button-opened')
- modalDiv.style.display = 'block';
- } else {
- modalButton.classList.remove('modal-button-opened')
- modalDiv.style.display = 'none';
- }
- }
- // Allow the show modal button to toggle the modal,
- modalButton.addEventListener('click',
- evt => showHideModal(modalDiv.style.display != 'block'));
- // but the close button always closes.
- modalClose.addEventListener('click',
- evt => showHideModal(false));
-
- // Allow the modal to be dragged by the header.
- modalOffsets[modal_id] = {
- midDrag: false,
- mouseDownOffsetX: null,
- mouseDownOffsetY: null,
- }
- modalHeader.addEventListener('mousedown',
- evt => {
- modalOffsets[modal_id].midDrag = true;
- // Store the offset of the mouse location from the
- // modal's current location.
- modalOffsets[modal_id].mouseDownOffsetX =
- parseInt(modalDiv.style.left) - evt.clientX;
- modalOffsets[modal_id].mouseDownOffsetY =
- parseInt(modalDiv.style.top) - evt.clientY;
- });
- modalHeader.addEventListener('mousemove',
- evt => {
- let offsets = modalOffsets[modal_id];
- if (offsets.midDrag) {
- // Move the modal to the mouse location plus the
- // offset calculated on the initial mouse-down.
- modalDiv.style.left =
- evt.clientX + offsets.mouseDownOffsetX;
- modalDiv.style.top =
- evt.clientY + offsets.mouseDownOffsetY;
- }
- });
- document.addEventListener('mouseup',
- evt => {
- modalOffsets[modal_id].midDrag = false;
- });
- }
-
- createModalButton(
- 'device-details-button', 'device-details-modal', 'device-details-close');
- createModalButton(
- 'bluetooth-console-button', 'bluetooth-console-modal', 'bluetooth-console-close');
-
- let options = {
- wsUrl: ((location.protocol == 'http:') ? 'ws://' : 'wss://') +
- location.host + '/connect_client',
- };
-
- function showWebrtcError() {
- statusMessage.className = 'error';
- statusMessage.textContent = 'No connection to the guest device. ' +
- 'Please ensure the WebRTC process on the host machine is active.';
- statusMessage.style.visibility = 'visible';
- deviceDisplays.style.display = 'none';
- for (const [_, button] of Object.entries(buttons)) {
- button.button.disabled = true;
- }
- }
-
- import('./cf_webrtc.js')
- .then(webrtcModule => webrtcModule.Connect(device_id, options))
- .then(devConn => {
- deviceConnection = devConn;
-
- console.log(deviceConnection.description);
-
- currentDisplayDescriptions = devConn.description.displays;
-
- createDeviceDisplays(devConn);
- for (const audio_desc of devConn.description.audio_streams) {
- let stream_id = audio_desc.stream_id;
- devConn.getStream(stream_id).then(stream => {
- deviceAudio.srcObject = stream;
- }).catch(e => console.error('Unable to get audio stream: ', e));
- }
- startMouseTracking(); // TODO stopMouseTracking() when disconnected
- updateDeviceHardwareDetails(deviceConnection.description.hardware);
- if (deviceConnection.description.custom_control_panel_buttons.length > 0) {
- document.getElementById('control-panel-custom-buttons').style.display = 'flex';
- for (const button of deviceConnection.description.custom_control_panel_buttons) {
- if (button.shell_command) {
- // This button's command is handled by sending an ADB shell command.
- createControlPanelButton(button.command, button.title, button.icon_name,
- e => onCustomShellButton(button.shell_command, e),
- 'control-panel-custom-buttons');
- buttons[button.command].adb = true;
- } else if (button.device_states) {
- // This button corresponds to variable hardware device state(s).
- createControlPanelButton(button.command, button.title, button.icon_name,
- getCustomDeviceStateButtonCb(button.device_states),
- 'control-panel-custom-buttons');
- for (const device_state of button.device_states) {
- // hinge_angle is currently injected via an adb shell command that
- // triggers a guest binary.
- if ('hinge_angle_value' in device_state) {
- buttons[button.command].adb = true;
- }
- }
- } else {
- // This button's command is handled by custom action server.
- createControlPanelButton(button.command, button.title, button.icon_name,
- onControlPanelButton,
- 'control-panel-custom-buttons');
- }
- }
- }
- deviceConnection.onControlMessage(msg => onControlMessage(msg));
- // Show the error message and disable buttons when the WebRTC connection fails.
- deviceConnection.onConnectionStateChange(state => {
- if (state == 'disconnected' || state == 'failed') {
- showWebrtcError();
- }
- });
- deviceConnection.onBluetoothMessage(msg => {
- bluetoothConsole.addLine(decodeRootcanalMessage(msg));
- });
- }, rejection => {
- console.error('Unable to connect: ', rejection);
- showWebrtcError();
- });
-
- let hardwareDetailsText = '';
- let deviceStateDetailsText = '';
- function updateDeviceDetailsText() {
- document.getElementById('device-details-hardware').textContent = [
- hardwareDetailsText,
- deviceStateDetailsText,
- ].filter(e => e /*remove empty*/).join('\n');
- }
- function updateDeviceHardwareDetails(hardware) {
- let hardwareDetailsTextLines = [];
- Object.keys(hardware).forEach(function(key) {
- let value = hardware[key];
- hardwareDetailsTextLines.push(`${key} - ${value}`);
- });
-
- hardwareDetailsText = hardwareDetailsTextLines.join('\n');
- updateDeviceDetailsText();
- }
- function updateDeviceStateDetails() {
- let deviceStateDetailsTextLines = [];
- if (deviceStateLidSwitchOpen != null) {
- let state = deviceStateLidSwitchOpen ? 'Opened' : 'Closed';
- deviceStateDetailsTextLines.push(`Lid Switch - ${state}`);
- }
- if (deviceStateHingeAngleValue != null) {
- deviceStateDetailsTextLines.push(`Hinge Angle - ${deviceStateHingeAngleValue}`);
- }
- deviceStateDetailsText = deviceStateDetailsTextLines.join('\n');
- updateDeviceDetailsText();
- }
-
- function onKeyboardCaptureToggle(enabled) {
- if (enabled) {
- startKeyboardTracking();
- } else {
- stopKeyboardTracking();
- }
- }
-
- function onMicCaptureToggle(enabled) {
- deviceConnection.useMic(enabled);
- }
-
- function onVideoCaptureToggle(enabled) {
- deviceConnection.useVideo(enabled);
- }
-
- function cmdConsole(consoleViewName, consoleInputName) {
- let consoleView = document.getElementById(consoleViewName);
-
- let addString = function(str) {
- consoleView.value += str;
- consoleView.scrollTop = consoleView.scrollHeight;
- }
-
- let addLine = function(line) {
- addString(line + "\r\n");
- }
-
- let commandCallbacks = [];
-
- let addCommandListener = function(f) {
- commandCallbacks.push(f);
- }
-
- let onCommand = function(cmd) {
- cmd = cmd.trim();
-
- if (cmd.length == 0) return;
-
- commandCallbacks.forEach(f => {
- f(cmd);
- })
- }
-
- addCommandListener(cmd => addLine(">> " + cmd));
-
- let consoleInput = document.getElementById(consoleInputName);
-
- consoleInput.addEventListener('keydown', e => {
- if ((e.key && e.key == 'Enter') || e.keyCode == 13) {
- let command = e.target.value;
-
- e.target.value = '';
-
- onCommand(command);
- }
- })
-
- return {
- consoleView: consoleView,
- consoleInput: consoleInput,
- addLine: addLine,
- addString: addString,
- addCommandListener: addCommandListener,
- };
- }
-
- var bluetoothConsole = cmdConsole(
- 'bluetooth-console-view', 'bluetooth-console-input');
-
- bluetoothConsole.addCommandListener(cmd => {
- let inputArr = cmd.split(' ');
- let command = inputArr[0];
- inputArr.shift();
- let args = inputArr;
- deviceConnection.sendBluetoothMessage(createRootcanalMessage(command, args));
- })
-
- function onControlPanelButton(e) {
- if (e.type == 'mouseout' && e.which == 0) {
- // Ignore mouseout events if no mouse button is pressed.
- return;
- }
- deviceConnection.sendControlMessage(JSON.stringify({
- command: e.target.dataset.command,
- button_state: e.type == 'mousedown' ? "down" : "up",
- }));
- }
-
- function onRotateButton(e) {
- // Attempt to init adb again, in case the initial connection failed.
- // This succeeds immediately if already connected.
- initializeAdb();
- if (e.type == 'mousedown') {
- adbShell(
- '/vendor/bin/cuttlefish_sensor_injection rotate ' +
- (currentRotation == 0 ? 'landscape' : 'portrait'))
- }
- }
-
- function onCustomShellButton(shell_command, e) {
- // Attempt to init adb again, in case the initial connection failed.
- // This succeeds immediately if already connected.
- initializeAdb();
- if (e.type == 'mousedown') {
- adbShell(shell_command);
- }
- }
-
- function getCustomDeviceStateButtonCb(device_states) {
- let states = device_states;
- let index = 0;
- return e => {
- if (e.type == 'mousedown') {
- // Reset any overridden device state.
- adbShell('cmd device_state state reset');
- // Send a device_state message for the current state.
- let message = {
- command: 'device_state',
- ...states[index],
- };
- deviceConnection.sendControlMessage(JSON.stringify(message));
- console.log(JSON.stringify(message));
- if ('lid_switch_open' in states[index]) {
- deviceStateLidSwitchOpen = states[index].lid_switch_open;
- }
- if ('hinge_angle_value' in states[index]) {
- deviceStateHingeAngleValue = states[index].hinge_angle_value;
- // TODO(b/181157794): Use a custom Sensor HAL for hinge_angle injection
- // instead of this guest binary.
- adbShell(
- '/vendor/bin/cuttlefish_sensor_injection hinge_angle ' +
- states[index].hinge_angle_value);
- }
- // Update the Device Details view.
- updateDeviceStateDetails();
- // Cycle to the next state.
- index = (index + 1) % states.length;
- }
- }
- }
-
- function startMouseTracking() {
- let deviceDisplayList = document.getElementsByClassName("device-display");
- if (window.PointerEvent) {
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.addEventListener('pointerdown', onStartDrag);
- deviceDisplay.addEventListener('pointermove', onContinueDrag);
- deviceDisplay.addEventListener('pointerup', onEndDrag);
- }
- } else if (window.TouchEvent) {
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.addEventListener('touchstart', onStartDrag);
- deviceDisplay.addEventListener('touchmove', onContinueDrag);
- deviceDisplay.addEventListener('touchend', onEndDrag);
- }
- } else if (window.MouseEvent) {
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.addEventListener('mousedown', onStartDrag);
- deviceDisplay.addEventListener('mousemove', onContinueDrag);
- deviceDisplay.addEventListener('mouseup', onEndDrag);
- }
- }
- }
-
- function stopMouseTracking() {
- let deviceDisplayList = document.getElementsByClassName("device-display");
- if (window.PointerEvent) {
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.removeEventListener('pointerdown', onStartDrag);
- deviceDisplay.removeEventListener('pointermove', onContinueDrag);
- deviceDisplay.removeEventListener('pointerup', onEndDrag);
- }
- } else if (window.TouchEvent) {
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.removeEventListener('touchstart', onStartDrag);
- deviceDisplay.removeEventListener('touchmove', onContinueDrag);
- deviceDisplay.removeEventListener('touchend', onEndDrag);
- }
- } else if (window.MouseEvent) {
- for (const deviceDisplay of deviceDisplayList) {
- deviceDisplay.removeEventListener('mousedown', onStartDrag);
- deviceDisplay.removeEventListener('mousemove', onContinueDrag);
- deviceDisplay.removeEventListener('mouseup', onEndDrag);
- }
- }
- }
-
- function startKeyboardTracking() {
- document.addEventListener('keydown', onKeyEvent);
- document.addEventListener('keyup', onKeyEvent);
- }
-
- function stopKeyboardTracking() {
- document.removeEventListener('keydown', onKeyEvent);
- document.removeEventListener('keyup', onKeyEvent);
- }
-
- function onStartDrag(e) {
- e.preventDefault();
-
- // console.log("mousedown at " + e.pageX + " / " + e.pageY);
- mouseIsDown = true;
-
- sendEventUpdate(true, e);
- }
-
- function onEndDrag(e) {
- e.preventDefault();
-
- // console.log("mouseup at " + e.pageX + " / " + e.pageY);
- mouseIsDown = false;
-
- sendEventUpdate(false, e);
- }
-
- function onContinueDrag(e) {
- e.preventDefault();
-
- // console.log("mousemove at " + e.pageX + " / " + e.pageY + ", down=" +
- // mouseIsDown);
- if (mouseIsDown) {
- sendEventUpdate(true, e);
- }
- }
-
- function sendEventUpdate(down, e) {
- console.assert(deviceConnection, 'Can\'t send mouse update without device');
- var eventType = e.type.substring(0, 5);
-
- // The <video> element:
- const deviceDisplay = e.target;
-
- // Before the first video frame arrives there is no way to know width and
- // height of the device's screen, so turn every click into a click at 0x0.
- // A click at that position is not more dangerous than anywhere else since
- // the user is clicking blind anyways.
- const videoWidth = deviceDisplay.videoWidth? deviceDisplay.videoWidth: 1;
- const videoHeight = deviceDisplay.videoHeight? deviceDisplay.videoHeight: 1;
- const elementWidth = deviceDisplay.offsetWidth? deviceDisplay.offsetWidth: 1;
- const elementHeight = deviceDisplay.offsetHeight? deviceDisplay.offsetHeight: 1;
-
- // vh*ew > eh*vw? then scale h instead of w
- const scaleHeight = videoHeight * elementWidth > videoWidth * elementHeight;
- var elementScaling = 0, videoScaling = 0;
- if (scaleHeight) {
- elementScaling = elementHeight;
- videoScaling = videoHeight;
- } else {
- elementScaling = elementWidth;
- videoScaling = videoWidth;
- }
-
- // The screen uses the 'object-fit: cover' property in order to completely
- // fill the element while maintaining the screen content's aspect ratio.
- // Therefore:
- // - If vh*ew > eh*vw, w is scaled so that content width == element width
- // - Otherwise, h is scaled so that content height == element height
- const scaleWidth = videoHeight * elementWidth > videoWidth * elementHeight;
-
- // Convert to coordinates relative to the video by scaling.
- // (This matches the scaling used by 'object-fit: cover'.)
- //
- // This scaling is needed to translate from the in-browser x/y to the
- // on-device x/y.
- // - When the device screen has not been resized, this is simple: scale
- // the coordinates based on the ratio between the input video size and
- // the in-browser size.
- // - When the device screen has been resized, this scaling is still needed
- // even though the in-browser size and device size are identical. This
- // is due to the way WindowManager handles a resized screen, resized via
- // `adb shell wm size`:
- // - The ABS_X and ABS_Y max values of the screen retain their
- // original values equal to the value set when launching the device
- // (which equals the video size here).
- // - The sent ABS_X and ABS_Y values need to be scaled based on the
- // ratio between the max size (video size) and in-browser size.
- const scaling = scaleWidth ? videoWidth / elementWidth : videoHeight / elementHeight;
-
- var xArr = [];
- var yArr = [];
- var idArr = [];
- var slotArr = [];
-
- if (eventType == "mouse" || eventType == "point") {
- xArr.push(e.offsetX);
- yArr.push(e.offsetY);
-
- let thisId = -1;
- if (eventType == "point") {
- thisId = e.pointerId;
- }
-
- slotArr.push(0);
- idArr.push(thisId);
- } else if (eventType == "touch") {
- // touchstart: list of touch points that became active
- // touchmove: list of touch points that changed
- // touchend: list of touch points that were removed
- let changes = e.changedTouches;
- let rect = e.target.getBoundingClientRect();
- for (var i=0; i < changes.length; i++) {
- xArr.push(changes[i].pageX - rect.left);
- yArr.push(changes[i].pageY - rect.top);
- if (touchIdSlotMap.has(changes[i].identifier)) {
- let slot = touchIdSlotMap.get(changes[i].identifier);
-
- slotArr.push(slot);
- if (e.type == 'touchstart') {
- // error
- console.error('touchstart when already have slot');
- return;
- } else if (e.type == 'touchmove') {
- idArr.push(changes[i].identifier);
- } else if (e.type == 'touchend') {
- touchSlots[slot] = false;
- touchIdSlotMap.delete(changes[i].identifier);
- idArr.push(-1);
- }
- } else {
- if (e.type == 'touchstart') {
- let slot = -1;
- for (var j=0; j < touchSlots.length; j++) {
- if (!touchSlots[j]) {
- slot = j;
- break;
- }
- }
- if (slot == -1) {
- slot = touchSlots.length;
- touchSlots.push(true);
- }
- slotArr.push(slot);
- touchSlots[slot] = true;
- touchIdSlotMap.set(changes[i].identifier, slot);
- idArr.push(changes[i].identifier);
- } else if (e.type == 'touchmove') {
- // error
- console.error('touchmove when no slot');
- return;
- } else if (e.type == 'touchend') {
- // error
- console.error('touchend when no slot');
- return;
- }
- }
- }
- }
-
- for (var i=0; i < xArr.length; i++) {
- xArr[i] = xArr[i] * scaling;
- yArr[i] = yArr[i] * scaling;
-
- // Substract the offset produced by the difference in aspect ratio, if any.
- if (scaleWidth) {
- // Width was scaled, leaving excess content height, so subtract from y.
- yArr[i] -= (elementHeight * scaling - videoHeight) / 2;
- } else {
- // Height was scaled, leaving excess content width, so subtract from x.
- xArr[i] -= (elementWidth * scaling - videoWidth) / 2;
- }
-
- xArr[i] = Math.trunc(xArr[i]);
- yArr[i] = Math.trunc(yArr[i]);
- }
-
- // NOTE: Rotation is handled automatically because the CSS rotation through
- // transforms also rotates the coordinates of events on the object.
-
- const display_label = deviceDisplay.id;
-
- deviceConnection.sendMultiTouch(
- {idArr, xArr, yArr, down, slotArr, display_label});
- }
-
- function onKeyEvent(e) {
- e.preventDefault();
- console.assert(deviceConnection, 'Can\'t send key event without device');
- deviceConnection.sendKeyEvent(e.code, e.type);
- }
-}
-
-/******************************************************************************/
-
-function ConnectDeviceCb(dev_id) {
- console.log('Connect: ' + dev_id);
- // Hide the device selection screen
- document.getElementById('device-selector').style.display = 'none';
- // Show the device control screen
- document.getElementById('device-connection').style.visibility = 'visible';
- ConnectToDevice(dev_id);
-}
-
-function ShowNewDeviceList(device_ids) {
- let ul = document.getElementById('device-list');
- ul.innerHTML = "";
- let count = 1;
- let device_to_button_map = {};
- for (const dev_id of device_ids) {
- const button_id = 'connect_' + count++;
- ul.innerHTML += ('<li class="device_entry" title="Connect to ' + dev_id
- + '">' + dev_id + '<button id="' + button_id
- + '" >Connect</button></li>');
- device_to_button_map[dev_id] = button_id;
- }
-
- for (const [dev_id, button_id] of Object.entries(device_to_button_map)) {
- document.getElementById(button_id).addEventListener(
- 'click', evt => ConnectDeviceCb(dev_id));
- }
-}
-
-function UpdateDeviceList() {
- let url = ((location.protocol == 'http:') ? 'ws:' : 'wss:') + location.host +
- '/list_devices';
- let ws = new WebSocket(url);
- ws.onopen = () => {
- ws.send("give me those device ids");
- };
- ws.onmessage = msg => {
- let device_ids = JSON.parse(msg.data);
- ShowNewDeviceList(device_ids);
- };
-}
-
-// Get any devices that are already connected
-UpdateDeviceList();
-// Update the list at the user's request
-document.getElementById('refresh-list')
- .addEventListener('click', evt => UpdateDeviceList());
diff --git a/host/frontend/webrtc_operator/assets/js/cf_webrtc.js b/host/frontend/webrtc_operator/assets/js/cf_webrtc.js
deleted file mode 100644
index c83ee38..0000000
--- a/host/frontend/webrtc_operator/assets/js/cf_webrtc.js
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-function createDataChannel(pc, label, onMessage) {
- console.log('creating data channel: ' + label);
- let dataChannel = pc.createDataChannel(label);
- // Return an object with a send function like that of the dataChannel, but
- // that only actually sends over the data channel once it has connected.
- return {
- channelPromise: new Promise((resolve, reject) => {
- dataChannel.onopen = (event) => {
- resolve(dataChannel);
- };
- dataChannel.onclose = () => {
- console.log(
- 'Data channel=' + label + ' state=' + dataChannel.readyState);
- };
- dataChannel.onmessage = onMessage ? onMessage : (msg) => {
- console.log('Data channel=' + label + ' data="' + msg.data + '"');
- };
- dataChannel.onerror = err => {
- reject(err);
- };
- }),
- send: function(msg) {
- this.channelPromise = this.channelPromise.then(channel => {
- channel.send(msg);
- return channel;
- })
- },
- };
-}
-
-function awaitDataChannel(pc, label, onMessage) {
- console.log('expecting data channel: ' + label);
- // Return an object with a send function like that of the dataChannel, but
- // that only actually sends over the data channel once it has connected.
- return {
- channelPromise: new Promise((resolve, reject) => {
- let prev_ondatachannel = pc.ondatachannel;
- pc.ondatachannel = ev => {
- let dataChannel = ev.channel;
- if (dataChannel.label == label) {
- dataChannel.onopen = (event) => {
- resolve(dataChannel);
- };
- dataChannel.onclose = () => {
- console.log(
- 'Data channel=' + label + ' state=' + dataChannel.readyState);
- };
- dataChannel.onmessage = onMessage ? onMessage : (msg) => {
- console.log('Data channel=' + label + ' data="' + msg.data + '"');
- };
- dataChannel.onerror = err => {
- reject(err);
- };
- } else if (prev_ondatachannel) {
- prev_ondatachannel(ev);
- }
- };
- }),
- send: function(msg) {
- this.channelPromise = this.channelPromise.then(channel => {
- channel.send(msg);
- return channel;
- })
- },
- };
-}
-
-class DeviceConnection {
- constructor(pc, control, media_stream) {
- this._pc = pc;
- this._control = control;
- this._media_stream = media_stream;
- // Disable the microphone by default
- this.useMic(false);
- this.useVideo(false);
- this._cameraDataChannel = pc.createDataChannel('camera-data-channel');
- this._cameraDataChannel.binaryType = 'arraybuffer'
- this._cameraInputQueue = new Array();
- var self = this;
- this._cameraDataChannel.onbufferedamountlow = () => {
- if (self._cameraInputQueue.length > 0) {
- self.sendCameraData(self._cameraInputQueue.shift());
- }
- }
- this._inputChannel = createDataChannel(pc, 'input-channel');
- this._adbChannel = createDataChannel(pc, 'adb-channel', (msg) => {
- if (this._onAdbMessage) {
- this._onAdbMessage(msg.data);
- } else {
- console.error('Received unexpected ADB message');
- }
- });
- this._controlChannel = awaitDataChannel(pc, 'device-control', (msg) => {
- if (this._onControlMessage) {
- this._onControlMessage(msg);
- } else {
- console.error('Received unexpected Control message');
- }
- });
- this._bluetoothChannel = createDataChannel(pc, 'bluetooth-channel', (msg) => {
- if (this._onBluetoothMessage) {
- this._onBluetoothMessage(msg.data);
- } else {
- console.error('Received unexpected Bluetooth message');
- }
- });
- this.sendCameraResolution();
- this._streams = {};
- this._streamPromiseResolvers = {};
-
- pc.addEventListener('track', e => {
- console.log('Got remote stream: ', e);
- for (const stream of e.streams) {
- this._streams[stream.id] = stream;
- if (this._streamPromiseResolvers[stream.id]) {
- for (let resolver of this._streamPromiseResolvers[stream.id]) {
- resolver();
- }
- delete this._streamPromiseResolvers[stream.id];
- }
- }
- });
- }
-
- set description(desc) {
- this._description = desc;
- }
-
- get description() {
- return this._description;
- }
-
- get imageCapture() {
- if (this._media_stream) {
- const track = this._media_stream.getVideoTracks()[0]
- return new ImageCapture(track);
- }
- return undefined;
- }
-
- get cameraWidth() {
- return this._x_res;
- }
-
- get cameraHeight() {
- return this._y_res;
- }
-
- get cameraEnabled() {
- if (this._media_stream) {
- return this._media_stream.getVideoTracks().some(track => track.enabled);
- }
- }
-
- getStream(stream_id) {
- return new Promise((resolve, reject) => {
- if (this._streams[stream_id]) {
- resolve(this._streams[stream_id]);
- } else {
- if (!this._streamPromiseResolvers[stream_id]) {
- this._streamPromiseResolvers[stream_id] = [];
- }
- this._streamPromiseResolvers[stream_id].push(resolve);
- }
- });
- }
-
- _sendJsonInput(evt) {
- this._inputChannel.send(JSON.stringify(evt));
- }
-
- sendMousePosition({x, y, down, display_label}) {
- this._sendJsonInput({
- type: 'mouse',
- down: down ? 1 : 0,
- x,
- y,
- display_label,
- });
- }
-
- // TODO (b/124121375): This should probably be an array of pointer events and
- // have different properties.
- sendMultiTouch({idArr, xArr, yArr, down, slotArr, display_label}) {
- this._sendJsonInput({
- type: 'multi-touch',
- id: idArr,
- x: xArr,
- y: yArr,
- down: down ? 1 : 0,
- slot: slotArr,
- display_label: display_label,
- });
- }
-
- sendKeyEvent(code, type) {
- this._sendJsonInput({type: 'keyboard', keycode: code, event_type: type});
- }
-
- disconnect() {
- this._pc.close();
- }
-
- // Sends binary data directly to the in-device adb daemon (skipping the host)
- sendAdbMessage(msg) {
- this._adbChannel.send(msg);
- }
-
- // Provide a callback to receive data from the in-device adb daemon
- onAdbMessage(cb) {
- this._onAdbMessage = cb;
- }
-
- // Send control commands to the device
- sendControlMessage(msg) {
- this._controlChannel.send(msg);
- }
-
- useMic(in_use) {
- if (this._media_stream) {
- this._media_stream.getAudioTracks().forEach(track => track.enabled = in_use);
- }
- }
-
- useVideo(in_use) {
- if (this._media_stream) {
- this._media_stream.getVideoTracks().forEach(track => track.enabled = in_use);
- }
- }
-
- sendCameraResolution() {
- if (this._media_stream) {
- const cameraTracks = this._media_stream.getVideoTracks();
- if (cameraTracks.length > 0) {
- const settings = cameraTracks[0].getSettings();
- this._x_res = settings.width;
- this._y_res = settings.height;
- this.sendControlMessage(JSON.stringify({
- command: 'camera_settings',
- width: settings.width,
- height: settings.height,
- frame_rate: settings.frameRate,
- facing: settings.facingMode
- }));
- }
- }
- }
-
- sendOrQueueCameraData(data) {
- if (this._cameraDataChannel.bufferedAmount > 0 || this._cameraInputQueue.length > 0) {
- this._cameraInputQueue.push(data);
- } else {
- this.sendCameraData(data);
- }
- }
-
- sendCameraData(data) {
- const MAX_SIZE = 65535;
- const END_MARKER = 'EOF';
- for (let i = 0; i < data.byteLength; i += MAX_SIZE) {
- // range is clamped to the valid index range
- this._cameraDataChannel.send(data.slice(i, i + MAX_SIZE));
- }
- this._cameraDataChannel.send(END_MARKER);
- }
-
- // Provide a callback to receive control-related comms from the device
- onControlMessage(cb) {
- this._onControlMessage = cb;
- }
-
- sendBluetoothMessage(msg) {
- this._bluetoothChannel.send(msg);
- }
-
- onBluetoothMessage(cb) {
- this._onBluetoothMessage = cb;
- }
-
- // Provide a callback to receive connectionstatechange states.
- onConnectionStateChange(cb) {
- this._pc.addEventListener(
- 'connectionstatechange',
- evt => cb(this._pc.connectionState));
- }
-}
-
-
-class WebRTCControl {
- constructor({
- wsUrl = '',
- }) {
- /*
- * Private attributes:
- *
- * _wsPromise: promises the underlying websocket, should resolve when the
- * socket passes to OPEN state, will be rejecte/replaced by a
- * rejected promise if an error is detected on the socket.
- *
- * _onOffer
- * _onIceCandidate
- */
-
- this._promiseResolvers = {};
-
- this._wsPromise = new Promise((resolve, reject) => {
- let ws = new WebSocket(wsUrl);
- ws.onopen = () => {
- console.info(`Connected to ${wsUrl}`);
- resolve(ws);
- };
- ws.onerror = evt => {
- console.error('WebSocket error:', evt);
- reject(evt);
- // If the promise was already resolved the previous line has no effect
- this._wsPromise = Promise.reject(new Error(evt));
- };
- ws.onmessage = e => {
- let data = JSON.parse(e.data);
- this._onWebsocketMessage(data);
- };
- });
- }
-
- _onWebsocketMessage(message) {
- const type = message.message_type;
- if (message.error) {
- console.error(message.error);
- this._on_connection_failed(message.error);
- return;
- }
- switch (type) {
- case 'config':
- this._infra_config = message;
- break;
- case 'device_info':
- if (this._on_device_available) {
- this._on_device_available(message.device_info);
- delete this._on_device_available;
- } else {
- console.error('Received unsolicited device info');
- }
- break;
- case 'device_msg':
- this._onDeviceMessage(message.payload);
- break;
- default:
- console.error('Unrecognized message type from server: ', type);
- this._on_connection_failed('Unrecognized message type from server: ' + type);
- console.error(message);
- }
- }
-
- _onDeviceMessage(message) {
- let type = message.type;
- switch (type) {
- case 'offer':
- if (this._onOffer) {
- this._onOffer({type: 'offer', sdp: message.sdp});
- } else {
- console.error('Receive offer, but nothing is wating for it');
- }
- break;
- case 'ice-candidate':
- if (this._onIceCandidate) {
- this._onIceCandidate(new RTCIceCandidate({
- sdpMid: message.mid,
- sdpMLineIndex: message.mLineIndex,
- candidate: message.candidate
- }));
- } else {
- console.error('Received ice candidate but nothing is waiting for it');
- }
- break;
- default:
- console.error('Unrecognized message type from device: ', type);
- }
- }
-
- async _wsSendJson(obj) {
- let ws = await this._wsPromise;
- return ws.send(JSON.stringify(obj));
- }
- async _sendToDevice(payload) {
- this._wsSendJson({message_type: 'forward', payload});
- }
-
- onOffer(cb) {
- this._onOffer = cb;
- }
-
- onIceCandidate(cb) {
- this._onIceCandidate = cb;
- }
-
- async requestDevice(device_id) {
- return new Promise((resolve, reject) => {
- this._on_device_available = (deviceInfo) => resolve({
- deviceInfo,
- infraConfig: this._infra_config,
- });
- this._on_connection_failed = (error) => reject(error);
- this._wsSendJson({
- message_type: 'connect',
- device_id,
- });
- });
- }
-
- ConnectDevice() {
- console.log('ConnectDevice');
- this._sendToDevice({type: 'request-offer'});
- }
-
- /**
- * Sends a remote description to the device.
- */
- async sendClientDescription(desc) {
- console.log('sendClientDescription');
- this._sendToDevice({type: 'answer', sdp: desc.sdp});
- }
-
- /**
- * Sends an ICE candidate to the device
- */
- async sendIceCandidate(candidate) {
- this._sendToDevice({type: 'ice-candidate', candidate});
- }
-}
-
-function createPeerConnection(infra_config) {
- let pc_config = {iceServers: []};
- for (const stun of infra_config.ice_servers) {
- pc_config.iceServers.push({urls: 'stun:' + stun});
- }
- let pc = new RTCPeerConnection(pc_config);
-
- pc.addEventListener('icecandidate', evt => {
- console.log('Local ICE Candidate: ', evt.candidate);
- });
- pc.addEventListener('iceconnectionstatechange', evt => {
- console.log(`ICE State Change: ${pc.iceConnectionState}`);
- });
- pc.addEventListener(
- 'connectionstatechange',
- evt =>
- console.log(`WebRTC Connection State Change: ${pc.connectionState}`));
- return pc;
-}
-
-export async function Connect(deviceId, options) {
- let control = new WebRTCControl(options);
- let requestRet = await control.requestDevice(deviceId);
- let deviceInfo = requestRet.deviceInfo;
- let infraConfig = requestRet.infraConfig;
- console.log('Device available:');
- console.log(deviceInfo);
- let pc_config = {iceServers: []};
- if (infraConfig.ice_servers && infraConfig.ice_servers.length > 0) {
- for (const server of infraConfig.ice_servers) {
- pc_config.iceServers.push(server);
- }
- }
- let pc = createPeerConnection(infraConfig, control);
-
- let mediaStream;
- try {
- mediaStream =
- await navigator.mediaDevices.getUserMedia({video: true, audio: true});
- const tracks = mediaStream.getTracks();
- tracks.forEach(track => {
- console.log(`Using ${track.kind} device: ${track.label}`);
- pc.addTrack(track, mediaStream);
- });
- } catch (e) {
- console.error("Failed to open audio device: ", e);
- }
-
- let deviceConnection = new DeviceConnection(pc, control, mediaStream);
- deviceConnection.description = deviceInfo;
- async function acceptOfferAndReplyAnswer(offer) {
- try {
- await pc.setRemoteDescription(offer);
- let answer = await pc.createAnswer();
- console.log('Answer: ', answer);
- await pc.setLocalDescription(answer);
- await control.sendClientDescription(answer);
- } catch (e) {
- console.error('Error establishing WebRTC connection: ', e)
- throw e;
- }
- }
- control.onOffer(desc => {
- console.log('Offer: ', desc);
- acceptOfferAndReplyAnswer(desc);
- });
- control.onIceCandidate(iceCandidate => {
- console.log(`Remote ICE Candidate: `, iceCandidate);
- pc.addIceCandidate(iceCandidate);
- });
-
- pc.addEventListener('icecandidate', evt => {
- if (evt.candidate) control.sendIceCandidate(evt.candidate);
- });
- let connected_promise = new Promise((resolve, reject) => {
- pc.addEventListener('connectionstatechange', evt => {
- let state = pc.connectionState;
- if (state == 'connected') {
- resolve(deviceConnection);
- } else if (state == 'failed') {
- reject(evt);
- }
- });
- });
- control.ConnectDevice();
-
- return connected_promise;
-}
diff --git a/host/frontend/webrtc_operator/assets/js/controls.js b/host/frontend/webrtc_operator/assets/js/controls.js
deleted file mode 100644
index 31db046..0000000
--- a/host/frontend/webrtc_operator/assets/js/controls.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-function createToggleControl(elm, iconName, onChangeCb) {
- let icon = document.createElement("span");
- icon.classList.add("toggle-control-icon");
- icon.classList.add("material-icons-outlined");
- if (iconName) {
- icon.appendChild(document.createTextNode(iconName));
- }
- elm.appendChild(icon);
- let toggle = document.createElement("label");
- toggle.classList.add("toggle-control-switch");
- let input = document.createElement("input");
- input.type = "checkbox";
- toggle.appendChild(input);
- let slider = document.createElement("span");
- slider.classList.add("toggle-control-slider");
- toggle.appendChild(slider);
- elm.classList.add("toggle-control");
- elm.appendChild(toggle);
- if (onChangeCb) {
- input.onchange = e => onChangeCb(e.target.checked);
- }
-}
diff --git a/host/frontend/webrtc_operator/assets/js/index.js b/host/frontend/webrtc_operator/assets/js/index.js
new file mode 100644
index 0000000..c04f308
--- /dev/null
+++ b/host/frontend/webrtc_operator/assets/js/index.js
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+class DeviceListApp {
+ #url;
+ #selectDeviceCb;
+
+ constructor({url, selectDeviceCb}) {
+ this.#url = url;
+ this.#selectDeviceCb = selectDeviceCb;
+ }
+
+ start() {
+ // Get any devices that are already connected
+ this.#UpdateDeviceList();
+
+ // Update the list at the user's request
+ document.getElementById('refresh-list')
+ .addEventListener('click', evt => this.#UpdateDeviceList());
+ }
+
+ async #UpdateDeviceList() {
+ try {
+ const device_ids = await fetch(this.#url, {
+ method: 'GET',
+ cache: 'no-cache',
+ redirect: 'follow',
+ });
+ this.#ShowNewDeviceList(await device_ids.json());
+ } catch (e) {
+ console.error('Error getting list of device ids: ', e);
+ }
+ }
+
+ #ShowNewDeviceList(device_ids) {
+ let ul = document.getElementById('device-list');
+ ul.innerHTML = '';
+ let count = 1;
+ let device_to_button_map = {};
+ for (const devId of device_ids) {
+ const buttonId = 'connect_' + count++;
+ let entry = this.#createDeviceEntry(devId, buttonId);
+ ul.appendChild(entry);
+ device_to_button_map[devId] = buttonId;
+ }
+
+ for (const [devId, buttonId] of Object.entries(device_to_button_map)) {
+ let button = document.getElementById(buttonId);
+ button.addEventListener('click', evt => {
+ this.#selectDeviceCb(devId);
+ });
+ }
+ }
+
+ #createDeviceEntry(devId, buttonId) {
+ let li = document.createElement('li');
+ li.className = 'device_entry';
+ li.title = 'Connect to ' + devId;
+ let div = document.createElement('div');
+ let span = document.createElement('span');
+ span.appendChild(document.createTextNode(devId));
+ let button = document.createElement('button');
+ button.id = buttonId;
+ button.appendChild(document.createTextNode('Connect'));
+ div.appendChild(span);
+ div.appendChild(button);
+ li.appendChild(div);
+ return li;
+ }
+} // DeviceListApp
+
+window.addEventListener('load', e => {
+ let listDevicesUrl = '/devices';
+ let selectDeviceCb = deviceId => {
+ return new Promise((resolve, reject) => {
+ let client = window.open(`client.html?deviceId=${deviceId}`, deviceId);
+ client.addEventListener('load', evt => {
+ console.log('loaded');
+ resolve();
+ });
+ });
+ };
+ let deviceListApp = new DeviceListApp({url: listDevicesUrl, selectDeviceCb});
+ deviceListApp.start();
+});
diff --git a/host/frontend/webrtc_operator/assets/js/server_connector.js b/host/frontend/webrtc_operator/assets/js/server_connector.js
new file mode 100644
index 0000000..ff19a0a
--- /dev/null
+++ b/host/frontend/webrtc_operator/assets/js/server_connector.js
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+// The public elements in this file implement the Server Connector Interface,
+// part of the contract between the signaling server and the webrtc client.
+// No changes that break backward compatibility are allowed here. Any new
+// features must be added as a new function/class in the interface. Any
+// additions to the interface must be checked for existence by the client before
+// using it.
+
+// The id of the device the client is supposed to connect to.
+// The List Devices page in the signaling server may choose any way to pass the
+// device id to the client page, this function retrieves that information once
+// the client loaded.
+// In this case the device id is passed as a parameter in the url.
+export function deviceId() {
+ const urlParams = new URLSearchParams(window.location.search);
+ return urlParams.get('deviceId');
+}
+
+// Creates a connector capable of communicating with the signaling server.
+export async function createConnector() {
+ try {
+ let ws = await connectWs();
+ console.debug(`Connected to ${ws.url}`);
+ return new WebsocketConnector(ws);
+ } catch (e) {
+ console.error('WebSocket error:', e);
+ }
+ console.warn('Failed to connect websocket, trying polling instead');
+
+ return new PollingConnector();
+}
+
+// A connector object provides high level functions for communicating with the
+// signaling server, while hiding away implementation details.
+// This class is an interface and shouldn't be instantiated direclty.
+// Only the public methods present in this class form part of the Server
+// Connector Interface, any implementations of the interface are considered
+// internal and not accessible to client code.
+class Connector {
+ constructor() {
+ if (this.constructor == Connector) {
+ throw new Error('Connector is an abstract class');
+ }
+ }
+
+ // Selects a particular device in the signaling server and opens the signaling
+ // channel with it (but doesn't send any message to the device). Returns a
+ // promise to an object with the following properties:
+ // - deviceInfo: The info object provided by the device when it registered
+ // with the server.
+ // - infraConfig: The server's infrastructure configuration (mainly STUN and
+ // TURN servers)
+ // The promise may take a long time to resolve if, for example, the server
+ // decides to wait for a device with the provided id to register with it. The
+ // promise may be rejected if there are connectivity issues, a device with
+ // that id doesn't exist or this client doesn't have rights to access that
+ // device.
+ async requestDevice(deviceId) {
+ throw 'Not implemented!';
+ }
+
+ // Sends a message to the device selected with requestDevice. It's an error to
+ // call this function before the promise from requestDevice() has resolved.
+ // Returns an empty promise that is rejected when the message can not be
+ // delivered, either because the device has not been requested yet or because
+ // of connectivity issues.
+ async sendToDevice(msg) {
+ throw 'Not implemented!';
+ }
+}
+
+// End of Server Connector Interface.
+
+// The following code is internal and shouldn't be accessed outside this file.
+
+function httpUrl(path) {
+ return location.protocol + '//' + location.host + '/' + path;
+}
+
+function websocketUrl(path) {
+ return ((location.protocol == 'http:') ? 'ws://' : 'wss://') + location.host +
+ '/' + path;
+}
+
+const kPollConfigUrl = httpUrl('infra_config');
+const kPollConnectUrl = httpUrl('connect');
+const kPollForwardUrl = httpUrl('forward');
+const kPollMessagesUrl = httpUrl('poll_messages');
+
+async function connectWs() {
+ return new Promise((resolve, reject) => {
+ let url = websocketUrl('connect_client');
+ let ws = new WebSocket(url);
+ ws.onopen = () => {
+ resolve(ws);
+ };
+ ws.onerror = evt => {
+ reject(evt);
+ };
+ });
+}
+
+async function ajaxPostJson(url, data) {
+ const response = await fetch(url, {
+ method: 'POST',
+ cache: 'no-cache',
+ headers: {'Content-Type': 'application/json'},
+ redirect: 'follow',
+ body: JSON.stringify(data),
+ });
+ return response.json();
+}
+
+// Implementation of the connector interface using websockets
+class WebsocketConnector extends Connector {
+ #websocket;
+ #futures = {};
+ #onDeviceMsgCb = msg =>
+ console.error('Received device message without registered listener');
+
+ onDeviceMsg(cb) {
+ this.#onDeviceMsgCb = cb;
+ }
+
+ constructor(ws) {
+ super();
+ ws.onmessage = e => {
+ let data = JSON.parse(e.data);
+ this.#onWebsocketMessage(data);
+ };
+ this.#websocket = ws;
+ }
+
+ async requestDevice(deviceId) {
+ return new Promise((resolve, reject) => {
+ this.#futures.onDeviceAvailable = (device) => resolve(device);
+ this.#futures.onConnectionFailed = (error) => reject(error);
+ this.#wsSendJson({
+ message_type: 'connect',
+ device_id: deviceId,
+ });
+ });
+ }
+
+ async sendToDevice(msg) {
+ return this.#wsSendJson({message_type: 'forward', payload: msg});
+ }
+
+ #onWebsocketMessage(message) {
+ const type = message.message_type;
+ if (message.error) {
+ console.error(message.error);
+ this.#futures.onConnectionFailed(message.error);
+ return;
+ }
+ switch (type) {
+ case 'config':
+ this.#futures.infraConfig = message;
+ break;
+ case 'device_info':
+ if (this.#futures.onDeviceAvailable) {
+ this.#futures.onDeviceAvailable({
+ deviceInfo: message.device_info,
+ infraConfig: this.#futures.infraConfig,
+ });
+ delete this.#futures.onDeviceAvailable;
+ } else {
+ console.error('Received unsolicited device info');
+ }
+ break;
+ case 'device_msg':
+ this.#onDeviceMsgCb(message.payload);
+ break;
+ default:
+ console.error('Unrecognized message type from server: ', type);
+ this.#futures.onConnectionFailed(
+ 'Unrecognized message type from server: ' + type);
+ console.error(message);
+ }
+ }
+
+ async #wsSendJson(obj) {
+ return this.#websocket.send(JSON.stringify(obj));
+ }
+}
+
+// Implementation of the Connector interface using HTTP long polling
+class PollingConnector extends Connector {
+ #connId = undefined;
+ #config = undefined;
+ #pollerSchedule;
+ #onDeviceMsgCb = msg =>
+ console.error('Received device message without registered listener');
+
+ onDeviceMsg(cb) {
+ this.#onDeviceMsgCb = cb;
+ }
+
+ constructor() {
+ super();
+ }
+
+ async requestDevice(deviceId) {
+ let config = await this.#getConfig();
+ let response = await ajaxPostJson(kPollConnectUrl, {device_id: deviceId});
+ this.#connId = response.connection_id;
+
+ this.#startPolling();
+
+ return {
+ deviceInfo: response.device_info,
+ infraConfig: config,
+ };
+ }
+
+ async sendToDevice(msg) {
+ // Forward messages act like polling messages as well
+ let device_messages = await this.#forward(msg);
+ for (const message of device_messages) {
+ this.#onDeviceMsgCb(message);
+ }
+ }
+
+ async #getConfig() {
+ if (this.#config === undefined) {
+ this.#config = await (await fetch(kPollConfigUrl, {
+ method: 'GET',
+ redirect: 'follow',
+ })).json();
+ }
+ return this.#config;
+ }
+
+ async #forward(msg) {
+ return await ajaxPostJson(kPollForwardUrl, {
+ connection_id: this.#connId,
+ payload: msg,
+ });
+ }
+
+ async #pollMessages() {
+ return await ajaxPostJson(kPollMessagesUrl, {
+ connection_id: this.#connId,
+ });
+ }
+
+ #startPolling() {
+ if (this.#pollerSchedule !== undefined) {
+ return;
+ }
+
+ let currentPollDelay = 1000;
+ let pollerRoutine = async () => {
+ let messages = await this.#pollMessages();
+
+ // Do exponential backoff on the polling up to 60 seconds
+ currentPollDelay = Math.min(60000, 2 * currentPollDelay);
+ for (const message of messages) {
+ this.#onDeviceMsgCb(message);
+ // There is at least one message, poll sooner
+ currentPollDelay = 1000;
+ }
+ this.#pollerSchedule = setTimeout(pollerRoutine, currentPollDelay);
+ };
+
+ this.#pollerSchedule = setTimeout(pollerRoutine, currentPollDelay);
+ }
+}
diff --git a/host/frontend/webrtc_operator/client_handler.cpp b/host/frontend/webrtc_operator/client_handler.cpp
index 7b631a6..a69241c 100644
--- a/host/frontend/webrtc_operator/client_handler.cpp
+++ b/host/frontend/webrtc_operator/client_handler.cpp
@@ -15,6 +15,9 @@
#include "host/frontend/webrtc_operator/client_handler.h"
+#include <algorithm>
+#include <random>
+
#include <android-base/logging.h>
#include "host/frontend/webrtc_operator/constants/signaling_constants.h"
@@ -22,27 +25,42 @@
namespace cuttlefish {
-ClientHandler::ClientHandler(struct lws* wsi, DeviceRegistry* registry,
+namespace {
+std::string RandomClientSecret(size_t len) {
+ static constexpr auto chars =
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz";
+ std::string ret(len, '\0');
+ std::default_random_engine e{std::random_device{}()};
+ std::uniform_int_distribution<int> random{
+ 0, static_cast<int>(std::strlen(chars)) - 1};
+ std::generate_n(ret.begin(), len, [&]() { return chars[random(e)]; });
+ return ret;
+}
+}
+
+ClientWSHandler::ClientWSHandler(struct lws* wsi, DeviceRegistry* registry,
const ServerConfig& server_config)
: SignalHandler(wsi, registry, server_config),
device_handler_(),
client_id_(0) {}
-void ClientHandler::OnClosed() {
+void ClientWSHandler::OnClosed() {
auto device_handler = device_handler_.lock();
if (device_handler) {
device_handler->SendClientDisconnectMessage(client_id_);
}
}
-void ClientHandler::SendDeviceMessage(const Json::Value& device_message) {
+void ClientWSHandler::SendDeviceMessage(const Json::Value& device_message) {
Json::Value message;
message[webrtc_signaling::kTypeField] = webrtc_signaling::kDeviceMessageType;
message[webrtc_signaling::kPayloadField] = device_message;
Reply(message);
}
-void ClientHandler::handleMessage(const std::string& type,
+void ClientWSHandler::handleMessage(const std::string& type,
const Json::Value& message) {
if (type == webrtc_signaling::kConnectType) {
handleConnectionRequest(message);
@@ -53,7 +71,7 @@
}
}
-void ClientHandler::handleConnectionRequest(const Json::Value& message) {
+void ClientWSHandler::handleConnectionRequest(const Json::Value& message) {
if (client_id_ > 0) {
LogAndReplyError(
"Attempt to connect to multiple devices over same websocket");
@@ -90,7 +108,7 @@
Reply(device_info_reply);
}
-void ClientHandler::handleForward(const Json::Value& message) {
+void ClientWSHandler::handleForward(const Json::Value& message) {
if (client_id_ == 0) {
LogAndReplyError("Forward failed: No device asociated to client");
Close();
@@ -112,14 +130,232 @@
message[webrtc_signaling::kPayloadField]);
}
-ClientHandlerFactory::ClientHandlerFactory(DeviceRegistry* registry,
+ClientWSHandlerFactory::ClientWSHandlerFactory(DeviceRegistry* registry,
const ServerConfig& server_config)
: registry_(registry),
server_config_(server_config) {}
-std::shared_ptr<WebSocketHandler> ClientHandlerFactory::Build(struct lws* wsi) {
+std::shared_ptr<WebSocketHandler> ClientWSHandlerFactory::Build(struct lws* wsi) {
return std::shared_ptr<WebSocketHandler>(
- new ClientHandler(wsi, registry_, server_config_));
+ new ClientWSHandler(wsi, registry_, server_config_));
+}
+
+/******************************************************************************/
+
+class PollConnectionHandler : public ClientHandler {
+ public:
+ PollConnectionHandler() = default;
+
+ void SendDeviceMessage(const Json::Value& message) override {
+ constexpr size_t kMaxMessagesInQueue = 1000;
+ if (messages_.size() > kMaxMessagesInQueue) {
+ LOG(ERROR) << "Polling client " << client_id_ << " reached "
+ << kMaxMessagesInQueue
+ << " messages queued. Started to drop messages.";
+ return;
+ }
+ messages_.push_back(message);
+ }
+
+ std::vector<Json::Value> PollMessages() {
+ std::vector<Json::Value> ret;
+ std::swap(ret, messages_);
+ return ret;
+ }
+
+ void SetDeviceHandler(std::weak_ptr<DeviceHandler> device_handler) {
+ device_handler_ = device_handler;
+ }
+
+ void SetClientId(size_t client_id) { client_id_ = client_id; }
+
+ size_t client_id() const { return client_id_; }
+ std::shared_ptr<DeviceHandler> device_handler() const {
+ return device_handler_.lock();
+ }
+
+ private:
+ size_t client_id_ = 0;
+ std::weak_ptr<DeviceHandler> device_handler_;
+ std::vector<Json::Value> messages_;
+};
+
+std::shared_ptr<PollConnectionHandler> PollConnectionStore::Get(
+ const std::string& conn_id) const {
+ if (!handlers_.count(conn_id)) {
+ return nullptr;
+ }
+ return handlers_.at(conn_id);
+}
+
+std::string PollConnectionStore::Add(std::shared_ptr<PollConnectionHandler> handler) {
+ std::string conn_id;
+ do {
+ conn_id = RandomClientSecret(64);
+ } while (handlers_.count(conn_id));
+ handlers_[conn_id] = handler;
+ return conn_id;
+}
+
+ClientDynHandler::ClientDynHandler(struct lws* wsi,
+ PollConnectionStore* poll_store)
+ : DynHandler(wsi), poll_store_(poll_store) {}
+
+HttpStatusCode ClientDynHandler::DoGet() {
+ // No message from the client uses the GET method because all of them
+ // change the server state somehow
+ return HttpStatusCode::MethodNotAllowed;
+}
+
+void ClientDynHandler::Reply(const Json::Value& json) {
+ Json::StreamWriterBuilder factory;
+ auto replyAsString = Json::writeString(factory, json);
+ AppendDataOut(replyAsString);
+}
+
+void ClientDynHandler::ReplyError(const std::string& message) {
+ LOG(ERROR) << message;
+ Json::Value reply;
+ reply["type"] = "error";
+ reply["error"] = message;
+ Reply(reply);
+}
+
+HttpStatusCode ClientDynHandler::DoPost() {
+ auto& data = GetDataIn();
+ Json::Value json_message;
+ std::shared_ptr<PollConnectionHandler> poll_handler;
+ if (data.size() > 0) {
+ Json::CharReaderBuilder builder;
+ std::unique_ptr<Json::CharReader> json_reader(builder.newCharReader());
+ std::string error_message;
+ if (!json_reader->parse(data.c_str(), data.c_str() + data.size(), &json_message,
+ &error_message)) {
+ ReplyError("Error parsing JSON: " + error_message);
+ // Rate limiting would be a good idea here
+ return HttpStatusCode::BadRequest;
+ }
+
+ std::string conn_id;
+ if (json_message.isMember(webrtc_signaling::kClientSecretField)) {
+ conn_id =
+ json_message[webrtc_signaling::kClientSecretField].asString();
+ poll_handler = poll_store_->Get(conn_id);
+ if (!poll_handler) {
+ ReplyError("Error: Unknown connection id" + conn_id);
+ return HttpStatusCode::Unauthorized;
+ }
+ }
+ }
+ return DoPostInner(poll_handler, json_message);
+}
+
+HttpStatusCode ClientDynHandler::Poll(
+ std::shared_ptr<PollConnectionHandler> poll_handler) {
+ if (!poll_handler) {
+ ReplyError("Poll failed: No device associated to client");
+ return HttpStatusCode::Unauthorized;
+ }
+ auto messages = poll_handler->PollMessages();
+ Json::Value reply(Json::arrayValue);
+ for (auto& msg : messages) {
+ reply.append(msg);
+ }
+ Reply(reply);
+ return HttpStatusCode::Ok;
+}
+
+ConnectHandler::ConnectHandler(struct lws* wsi, DeviceRegistry* registry,
+ PollConnectionStore* poll_store)
+ : ClientDynHandler(wsi, poll_store), registry_(registry) {}
+
+HttpStatusCode ConnectHandler::DoPostInner(
+ std::shared_ptr<PollConnectionHandler> poll_handler,
+ const Json::Value& message) {
+ if (!message.isMember(webrtc_signaling::kDeviceIdField) ||
+ !message[webrtc_signaling::kDeviceIdField].isString()) {
+ ReplyError("Invalid connection request: Missing device id");
+ return HttpStatusCode::BadRequest;
+ }
+ auto device_id = message[webrtc_signaling::kDeviceIdField].asString();
+
+ auto device_handler = registry_->GetDevice(device_id);
+ if (!device_handler) {
+ ReplyError("Connection failed: Device not found: '" + device_id + "'");
+ return HttpStatusCode::NotFound;
+ }
+
+ poll_handler = std::make_shared<PollConnectionHandler>();
+ poll_handler->SetClientId(device_handler->RegisterClient(poll_handler));
+ poll_handler->SetDeviceHandler(device_handler);
+ auto conn_id = poll_store_->Add(poll_handler);
+
+ Json::Value device_info_reply;
+ device_info_reply[webrtc_signaling::kClientSecretField] = conn_id;
+ device_info_reply[webrtc_signaling::kTypeField] =
+ webrtc_signaling::kDeviceInfoType;
+ device_info_reply[webrtc_signaling::kDeviceInfoField] =
+ device_handler->device_info();
+ Reply(device_info_reply);
+
+ return HttpStatusCode::Ok;
+}
+
+ForwardHandler::ForwardHandler(struct lws* wsi,
+ PollConnectionStore* poll_store)
+ : ClientDynHandler(wsi, poll_store) {}
+
+HttpStatusCode ForwardHandler::DoPostInner(
+ std::shared_ptr<PollConnectionHandler> poll_handler,
+ const Json::Value& message) {
+ if (!poll_handler) {
+ ReplyError("Forward failed: No device associated to client");
+ return HttpStatusCode::Unauthorized;
+ }
+ auto client_id = poll_handler->client_id();
+ if (client_id == 0) {
+ ReplyError("Forward failed: No device associated to client");
+ return HttpStatusCode::Unauthorized;
+ }
+ if (!message.isMember(webrtc_signaling::kPayloadField)) {
+ ReplyError("Forward failed: No payload present in message");
+ return HttpStatusCode::BadRequest;
+ }
+ auto device_handler = poll_handler->device_handler();
+ if (!device_handler) {
+ ReplyError("Forward failed: Device disconnected");
+ return HttpStatusCode::NotFound;
+ }
+ device_handler->SendClientMessage(client_id,
+ message[webrtc_signaling::kPayloadField]);
+ // Don't waste an HTTP session returning nothing, send any pending device
+ // messages to the client instead.
+ return Poll(poll_handler);
+}
+
+PollHandler::PollHandler(struct lws* wsi, PollConnectionStore* poll_store)
+ : ClientDynHandler(wsi, poll_store) {}
+
+HttpStatusCode PollHandler::DoPostInner(
+ std::shared_ptr<PollConnectionHandler> poll_handler,
+ const Json::Value& /*message*/) {
+ return Poll(poll_handler);
+}
+
+ConfigHandler::ConfigHandler(struct lws* wsi, const ServerConfig& server_config)
+ : DynHandler(wsi), server_config_(server_config) {}
+
+HttpStatusCode ConfigHandler::DoGet() {
+ Json::Value reply = server_config_.ToJson();
+ reply[webrtc_signaling::kTypeField] = webrtc_signaling::kConfigType;
+ Json::StreamWriterBuilder factory;
+ auto replyAsString = Json::writeString(factory, reply);
+ AppendDataOut(replyAsString);
+ return HttpStatusCode::Ok;
+}
+
+HttpStatusCode ConfigHandler::DoPost() {
+ return HttpStatusCode::MethodNotAllowed;
}
} // namespace cuttlefish
diff --git a/host/frontend/webrtc_operator/client_handler.h b/host/frontend/webrtc_operator/client_handler.h
index b10f3e8..2cb6a0e 100644
--- a/host/frontend/webrtc_operator/client_handler.h
+++ b/host/frontend/webrtc_operator/client_handler.h
@@ -27,18 +27,27 @@
namespace cuttlefish {
class DeviceHandler;
-class ClientHandler : public SignalHandler,
- public std::enable_shared_from_this<ClientHandler> {
+
+class ClientHandler {
public:
- ClientHandler(struct lws* wsi, DeviceRegistry* registry,
- const ServerConfig& server_config);
- void SendDeviceMessage(const Json::Value& message);
+ virtual ~ClientHandler() = default;
+ virtual void SendDeviceMessage(const Json::Value& message) = 0;
+};
+
+class ClientWSHandler : public ClientHandler,
+ public SignalHandler,
+ public std::enable_shared_from_this<ClientHandler> {
+ public:
+ ClientWSHandler(struct lws* wsi, DeviceRegistry* registry,
+ const ServerConfig& server_config);
+
+ void SendDeviceMessage(const Json::Value& message) override;
void OnClosed() override;
protected:
void handleMessage(const std::string& type,
- const Json::Value& message) override;
+ const Json::Value& message) override;
private:
void handleConnectionRequest(const Json::Value& message);
@@ -50,14 +59,91 @@
size_t client_id_;
};
-class ClientHandlerFactory : public WebSocketHandlerFactory {
+class ClientWSHandlerFactory : public WebSocketHandlerFactory {
public:
- ClientHandlerFactory(DeviceRegistry* registry,
- const ServerConfig& server_config);
+ ClientWSHandlerFactory(DeviceRegistry* registry,
+ const ServerConfig& server_config);
std::shared_ptr<WebSocketHandler> Build(struct lws* wsi) override;
private:
DeviceRegistry* registry_;
const ServerConfig& server_config_;
};
+
+class PollConnectionHandler;
+
+class PollConnectionStore {
+ public:
+ PollConnectionStore() = default;
+
+ std::shared_ptr<PollConnectionHandler> Get(const std::string& conn_id) const;
+ std::string Add(std::shared_ptr<PollConnectionHandler> handler);
+ private:
+ std::map<std::string, std::shared_ptr<PollConnectionHandler>>
+ handlers_;
+};
+
+class ClientDynHandler : public DynHandler,
+ public std::enable_shared_from_this<ClientHandler> {
+ public:
+ ClientDynHandler(struct lws* wsi, PollConnectionStore* poll_store);
+
+ HttpStatusCode DoGet() override;
+ HttpStatusCode DoPost() override;
+
+ protected:
+ virtual HttpStatusCode DoPostInner(std::shared_ptr<PollConnectionHandler>,
+ const Json::Value&) = 0;
+ // In the base class because it's shared by some of the subclasses
+ HttpStatusCode Poll(std::shared_ptr<PollConnectionHandler>);
+
+ void Reply(const Json::Value& json);
+ void ReplyError(const std::string& message);
+ bool ParseInput();
+
+ PollConnectionStore* poll_store_;
+};
+
+class ConnectHandler : public ClientDynHandler {
+ public:
+ ConnectHandler(struct lws* wsi, DeviceRegistry* registry,
+ PollConnectionStore* poll_store);
+
+ protected:
+ HttpStatusCode DoPostInner(std::shared_ptr<PollConnectionHandler>,
+ const Json::Value&) override;
+ private:
+ DeviceRegistry* registry_;
+};
+
+class ForwardHandler : public ClientDynHandler {
+ public:
+ ForwardHandler(struct lws* wsi, PollConnectionStore* poll_store);
+
+ protected:
+ HttpStatusCode DoPostInner(std::shared_ptr<PollConnectionHandler>,
+ const Json::Value&) override;
+};
+
+class PollHandler : public ClientDynHandler {
+ public:
+ PollHandler(struct lws* wsi, PollConnectionStore* poll_store);
+
+ protected:
+ HttpStatusCode DoPostInner(std::shared_ptr<PollConnectionHandler>,
+ const Json::Value&) override;
+};
+
+class ConfigHandler : public DynHandler {
+ public:
+ ConfigHandler(struct lws* wsi, const ServerConfig& server_config);
+
+ HttpStatusCode DoGet() override;
+
+ HttpStatusCode DoPost() override;
+
+ private:
+ const ServerConfig& server_config_;
+};
+
} // namespace cuttlefish
diff --git a/host/frontend/webrtc_operator/constants/signaling_constants.h b/host/frontend/webrtc_operator/constants/signaling_constants.h
index ecd3a3d..e03a8a8 100644
--- a/host/frontend/webrtc_operator/constants/signaling_constants.h
+++ b/host/frontend/webrtc_operator/constants/signaling_constants.h
@@ -24,6 +24,8 @@
constexpr auto kClientIdField = "client_id";
constexpr auto kPayloadField = "payload";
constexpr auto kServersField = "ice_servers";
+constexpr auto kClientSecretField = "connection_id";
+constexpr auto kDevicePortField = "device_port";
// These are defined in the IceServer dictionary
constexpr auto kUrlsField = "urls";
constexpr auto kUsernameField = "username";
@@ -38,6 +40,7 @@
constexpr auto kClientMessageType = "client_msg";
constexpr auto kClientDisconnectType = "client_disconnected";
constexpr auto kDeviceMessageType = "device_msg";
+constexpr auto kPollType = "client_poll";
} // namespace webrtc_signaling
} // namespace cuttlefish
diff --git a/host/frontend/webrtc_operator/device_list_handler.cpp b/host/frontend/webrtc_operator/device_list_handler.cpp
index 314feea..c92e8e8 100644
--- a/host/frontend/webrtc_operator/device_list_handler.cpp
+++ b/host/frontend/webrtc_operator/device_list_handler.cpp
@@ -18,12 +18,10 @@
namespace cuttlefish {
DeviceListHandler::DeviceListHandler(struct lws* wsi,
- const DeviceRegistry& registry)
- : WebSocketHandler(wsi), registry_(registry) {}
+ DeviceRegistry& registry)
+ : DynHandler(wsi), registry_(registry) {}
-void DeviceListHandler::OnReceive(const uint8_t* /*msg*/, size_t /*len*/,
- bool /*binary*/) {
- // Ignore the message, just send the reply
+HttpStatusCode DeviceListHandler::DoGet() {
Json::Value reply(Json::ValueType::arrayValue);
for (const auto& id : registry_.ListDeviceIds()) {
@@ -31,18 +29,11 @@
}
Json::StreamWriterBuilder json_factory;
auto replyAsString = Json::writeString(json_factory, reply);
- EnqueueMessage(replyAsString.c_str(), replyAsString.size());
- Close();
+ AppendDataOut(replyAsString);
+ return HttpStatusCode::Ok;
+}
+HttpStatusCode DeviceListHandler::DoPost() {
+ return HttpStatusCode::NotFound;
}
-void DeviceListHandler::OnConnected() {}
-
-void DeviceListHandler::OnClosed() {}
-
-DeviceListHandlerFactory::DeviceListHandlerFactory(const DeviceRegistry& registry)
- : registry_(registry) {}
-
-std::shared_ptr<WebSocketHandler> DeviceListHandlerFactory::Build(struct lws* wsi) {
- return std::shared_ptr<WebSocketHandler>(new DeviceListHandler(wsi, registry_));
-}
} // namespace cuttlefish
diff --git a/host/frontend/webrtc_operator/device_list_handler.h b/host/frontend/webrtc_operator/device_list_handler.h
index 99d1f9c..2dc8406 100644
--- a/host/frontend/webrtc_operator/device_list_handler.h
+++ b/host/frontend/webrtc_operator/device_list_handler.h
@@ -25,24 +25,15 @@
namespace cuttlefish {
-class DeviceListHandler : public WebSocketHandler {
+class DeviceListHandler : public DynHandler {
public:
- DeviceListHandler(struct lws* wsi, const DeviceRegistry& registry);
+ DeviceListHandler(struct lws* wsi, DeviceRegistry& registry);
- void OnReceive(const uint8_t* msg, size_t len, bool binary) override;
- void OnConnected() override;
- void OnClosed() override;
+ HttpStatusCode DoGet() override;
+ HttpStatusCode DoPost() override;
private:
- const DeviceRegistry& registry_;
+ DeviceRegistry& registry_;
};
-class DeviceListHandlerFactory : public WebSocketHandlerFactory {
- public:
- DeviceListHandlerFactory(const DeviceRegistry& registry);
- std::shared_ptr<WebSocketHandler> Build(struct lws* wsi) override;
-
- private:
- const DeviceRegistry& registry_;
-};
} // namespace cuttlefish
diff --git a/host/frontend/webrtc_operator/server.cpp b/host/frontend/webrtc_operator/server.cpp
index c1f08f7..65295cf 100644
--- a/host/frontend/webrtc_operator/server.cpp
+++ b/host/frontend/webrtc_operator/server.cpp
@@ -41,7 +41,11 @@
constexpr auto kRegisterDeviceUriPath = "/register_device";
constexpr auto kConnectClientUriPath = "/connect_client";
-constexpr auto kListDevicesUriPath = "/list_devices";
+constexpr auto kListDevicesUriPath = "/devices";
+const constexpr auto kInfraConfigPath = "/infra_config";
+const constexpr auto kConnectPath = "/connect";
+const constexpr auto kForwardPath = "/forward";
+const constexpr auto kPollPath = "/poll_messages";
} // namespace
@@ -50,23 +54,59 @@
::gflags::ParseCommandLineFlags(&argc, &argv, true);
cuttlefish::DeviceRegistry device_registry;
+ cuttlefish::PollConnectionStore poll_store;
cuttlefish::ServerConfig server_config({FLAGS_stun_server});
- cuttlefish::WebSocketServer wss(
- "webrtc-operator", FLAGS_certs_dir, FLAGS_assets_dir, FLAGS_http_server_port);
+ cuttlefish::WebSocketServer wss =
+ FLAGS_use_secure_http
+ ? cuttlefish::WebSocketServer("webrtc-operator", FLAGS_certs_dir,
+ FLAGS_assets_dir,
+ FLAGS_http_server_port)
+ : cuttlefish::WebSocketServer("webrtc-operator", FLAGS_assets_dir,
+ FLAGS_http_server_port);
+ // Device list endpoint
+ wss.RegisterDynHandlerFactory(
+ kListDevicesUriPath, [&device_registry](struct lws* wsi) {
+ return std::unique_ptr<cuttlefish::DynHandler>(
+ new cuttlefish::DeviceListHandler(wsi, device_registry));
+ });
+
+ // Websocket signaling endpoints
auto device_handler_factory_p =
std::unique_ptr<cuttlefish::WebSocketHandlerFactory>(
- new cuttlefish::DeviceHandlerFactory(&device_registry, server_config));
- wss.RegisterHandlerFactory(kRegisterDeviceUriPath, std::move(device_handler_factory_p));
+ new cuttlefish::DeviceHandlerFactory(&device_registry,
+ server_config));
+ wss.RegisterHandlerFactory(kRegisterDeviceUriPath,
+ std::move(device_handler_factory_p));
auto client_handler_factory_p =
std::unique_ptr<cuttlefish::WebSocketHandlerFactory>(
- new cuttlefish::ClientHandlerFactory(&device_registry, server_config));
- wss.RegisterHandlerFactory(kConnectClientUriPath, std::move(client_handler_factory_p));
- auto device_list_handler_factory_p =
- std::unique_ptr<cuttlefish::WebSocketHandlerFactory>(
- new cuttlefish::DeviceListHandlerFactory(device_registry));
- wss.RegisterHandlerFactory(kListDevicesUriPath, std::move(device_list_handler_factory_p));
+ new cuttlefish::ClientWSHandlerFactory(&device_registry,
+ server_config));
+ wss.RegisterHandlerFactory(kConnectClientUriPath,
+ std::move(client_handler_factory_p));
+
+ // Polling signaling endpoints
+ wss.RegisterDynHandlerFactory(
+ kInfraConfigPath, [&server_config](struct lws* wsi) {
+ return std::unique_ptr<cuttlefish::DynHandler>(
+ new cuttlefish::ConfigHandler(wsi, server_config));
+ });
+ wss.RegisterDynHandlerFactory(
+ kConnectPath, [&device_registry, &poll_store](struct lws* wsi) {
+ return std::unique_ptr<cuttlefish::DynHandler>(
+ new cuttlefish::ConnectHandler(wsi, &device_registry, &poll_store));
+ });
+ wss.RegisterDynHandlerFactory(
+ kForwardPath, [&poll_store](struct lws* wsi) {
+ return std::unique_ptr<cuttlefish::DynHandler>(
+ new cuttlefish::ForwardHandler(wsi, &poll_store));
+ });
+ wss.RegisterDynHandlerFactory(
+ kPollPath, [&poll_store](struct lws* wsi) {
+ return std::unique_ptr<cuttlefish::DynHandler>(
+ new cuttlefish::PollHandler(wsi, &poll_store));
+ });
wss.Serve();
return 0;
diff --git a/host/libs/allocd/Android.bp b/host/libs/allocd/Android.bp
index 3c52507..c624817 100644
--- a/host/libs/allocd/Android.bp
+++ b/host/libs/allocd/Android.bp
@@ -41,6 +41,7 @@
"resource.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
@@ -60,6 +61,7 @@
"test/client.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libbase",
"libcuttlefish_allocd_utils",
"libcuttlefish_fs",
diff --git a/host/libs/audio_connector/server.cpp b/host/libs/audio_connector/server.cpp
index c153df9..4f0570c 100644
--- a/host/libs/audio_connector/server.cpp
+++ b/host/libs/audio_connector/server.cpp
@@ -335,7 +335,9 @@
};
std::vector<uint8_t> buffer(sizeof(vio_status) + size, 0);
std::memcpy(buffer.data(), &vio_status, sizeof(vio_status));
- std::memcpy(buffer.data() + sizeof(vio_status), data, size);
+ if (data) {
+ std::memcpy(buffer.data() + sizeof(vio_status), data, size);
+ }
auto status_sent = control_socket_->Send(buffer.data(), buffer.size(), 0);
if (status_sent < sizeof(vio_status) + size) {
LOG(ERROR) << "Failed to send entire command status: "
diff --git a/host/libs/config/Android.bp b/host/libs/config/Android.bp
index 3697f4e..b3d0efb 100644
--- a/host/libs/config/Android.bp
+++ b/host/libs/config/Android.bp
@@ -21,10 +21,12 @@
name: "libcuttlefish_host_config",
srcs: [
"bootconfig_args.cpp",
+ "config_flag.cpp",
"custom_actions.cpp",
"cuttlefish_config.cpp",
"cuttlefish_config_instance.cpp",
"data_image.cpp",
+ "feature.cpp",
"fetcher_config.cpp",
"host_tools_version.cpp",
"kernel_args.cpp",
@@ -32,9 +34,11 @@
"logging.cpp",
],
shared_libs: [
+ "libext2_blkid",
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
+ "libfruit",
"libgflags",
"libjsoncpp",
"libz",
diff --git a/host/libs/config/adb/Android.bp b/host/libs/config/adb/Android.bp
new file mode 100644
index 0000000..c1b74de
--- /dev/null
+++ b/host/libs/config/adb/Android.bp
@@ -0,0 +1,64 @@
+//
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_library_static {
+ name: "libcuttlefish_host_config_adb",
+ srcs: [
+ "config.cpp",
+ "data.cpp",
+ "flags.cpp",
+ "launch.cpp",
+ "strings.cpp",
+ ],
+ shared_libs: [
+ "libcuttlefish_fs",
+ "libcuttlefish_utils",
+ "libbase",
+ "libfruit",
+ "libgflags",
+ "libjsoncpp",
+ "libz",
+ ],
+ defaults: ["cuttlefish_host"],
+}
+
+cc_test_host {
+ name: "libcuttlefish_host_config_adb_test",
+ srcs: [
+ "test.cpp",
+ ],
+ static_libs: [
+ "libbase",
+ "libcuttlefish_fs",
+ "libcuttlefish_host_config",
+ "libcuttlefish_host_config_adb",
+ "libcuttlefish_utils",
+ ],
+ shared_libs: [
+ "libext2_blkid",
+ "libgflags",
+ "libfruit",
+ "libjsoncpp",
+ "liblog",
+ ],
+ defaults: ["cuttlefish_host"],
+ test_options: {
+ unit_test: true,
+ },
+}
diff --git a/host/libs/config/adb/adb.h b/host/libs/config/adb/adb.h
new file mode 100644
index 0000000..08b1549
--- /dev/null
+++ b/host/libs/config/adb/adb.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <fruit/fruit.h>
+#include <set>
+
+#include "host/libs/config/command_source.h"
+#include "host/libs/config/config_flag.h"
+#include "host/libs/config/config_fragment.h"
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
+#include "host/libs/config/kernel_log_pipe_provider.h"
+
+namespace cuttlefish {
+
+enum class AdbMode {
+ VsockTunnel,
+ VsockHalfTunnel,
+ NativeVsock,
+ Unknown,
+};
+
+AdbMode StringToAdbMode(const std::string& mode);
+std::string AdbModeToString(AdbMode mode);
+
+class AdbConfig {
+ public:
+ virtual ~AdbConfig() = default;
+ virtual const std::set<AdbMode>& Modes() const = 0;
+ virtual bool SetModes(const std::set<AdbMode>&) = 0;
+ virtual bool SetModes(std::set<AdbMode>&&) = 0;
+
+ virtual bool RunConnector() const = 0;
+ virtual bool SetRunConnector(bool) = 0;
+};
+
+class AdbConfigFragment : public ConfigFragment {};
+class AdbConfigFlag : public FlagFeature {};
+
+fruit::Component<AdbConfig> AdbConfigComponent();
+fruit::Component<fruit::Required<AdbConfig, ConfigFlag>, AdbConfigFlag>
+AdbConfigFlagComponent();
+fruit::Component<fruit::Required<AdbConfig>, AdbConfigFragment>
+AdbConfigFragmentComponent();
+fruit::Component<fruit::Required<KernelLogPipeProvider, const AdbConfig,
+ const CuttlefishConfig::InstanceSpecific>>
+LaunchAdbComponent();
+
+} // namespace cuttlefish
diff --git a/host/libs/config/adb/config.cpp b/host/libs/config/adb/config.cpp
new file mode 100644
index 0000000..6fc6378
--- /dev/null
+++ b/host/libs/config/adb/config.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "host/libs/config/adb/adb.h"
+
+#include <android-base/logging.h>
+#include <fruit/fruit.h>
+#include <json/json.h>
+
+#include "host/libs/config/config_fragment.h"
+
+namespace cuttlefish {
+namespace {
+
+class AdbConfigFragmentImpl : public AdbConfigFragment {
+ public:
+ INJECT(AdbConfigFragmentImpl(AdbConfig& config)) : config_(config) {}
+
+ std::string Name() const override { return "AdbConfigFragmentImpl"; }
+
+ Json::Value Serialize() const override {
+ Json::Value json;
+ json[kMode] = Json::Value(Json::arrayValue);
+ for (const auto& mode : config_.Modes()) {
+ json[kMode].append(AdbModeToString(mode));
+ }
+ json[kConnectorEnabled] = config_.RunConnector();
+ return json;
+ }
+ bool Deserialize(const Json::Value& json) override {
+ if (!json.isMember(kMode) || json[kMode].type() != Json::arrayValue) {
+ LOG(ERROR) << "Invalid value for " << kMode;
+ return false;
+ }
+ std::set<AdbMode> modes;
+ for (auto& mode : json[kMode]) {
+ if (mode.type() != Json::stringValue) {
+ LOG(ERROR) << "Invalid mode type" << mode;
+ return false;
+ }
+ modes.insert(StringToAdbMode(mode.asString()));
+ }
+ if (!config_.SetModes(std::move(modes))) {
+ LOG(ERROR) << "Failed to set adb modes";
+ return false;
+ }
+
+ if (!json.isMember(kConnectorEnabled) ||
+ json[kConnectorEnabled].type() != Json::booleanValue) {
+ LOG(ERROR) << "Invalid value for " << kConnectorEnabled;
+ return false;
+ }
+ if (!config_.SetRunConnector(json[kConnectorEnabled].asBool())) {
+ LOG(ERROR) << "Failed to set whether to run the adb connector";
+ }
+ return true;
+ }
+
+ private:
+ static constexpr char kMode[] = "mode";
+ static constexpr char kConnectorEnabled[] = "connector_enabled";
+ AdbConfig& config_;
+};
+
+} // namespace
+
+fruit::Component<fruit::Required<AdbConfig>, AdbConfigFragment>
+AdbConfigFragmentComponent() {
+ return fruit::createComponent()
+ .bind<AdbConfigFragment, AdbConfigFragmentImpl>()
+ .addMultibinding<ConfigFragment, AdbConfigFragment>();
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/adb/data.cpp b/host/libs/config/adb/data.cpp
new file mode 100644
index 0000000..81db3e9
--- /dev/null
+++ b/host/libs/config/adb/data.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "host/libs/config/adb/adb.h"
+
+#include <fruit/fruit.h>
+#include <set>
+
+namespace cuttlefish {
+namespace {}
+
+class AdbConfigImpl : public AdbConfig {
+ public:
+ INJECT(AdbConfigImpl()) {}
+
+ const std::set<AdbMode>& Modes() const override { return modes_; }
+ bool SetModes(const std::set<AdbMode>& modes) override {
+ modes_ = modes;
+ return true;
+ }
+ bool SetModes(std::set<AdbMode>&& modes) override {
+ modes_ = std::move(modes);
+ return true;
+ }
+
+ bool RunConnector() const override { return run_connector_; }
+ bool SetRunConnector(bool run) override {
+ run_connector_ = run;
+ return true;
+ }
+
+ private:
+ std::set<AdbMode> modes_;
+ bool run_connector_;
+};
+
+fruit::Component<AdbConfig> AdbConfigComponent() {
+ return fruit::createComponent().bind<AdbConfig, AdbConfigImpl>();
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/adb/flags.cpp b/host/libs/config/adb/flags.cpp
new file mode 100644
index 0000000..56451f7
--- /dev/null
+++ b/host/libs/config/adb/flags.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "host/libs/config/adb/adb.h"
+
+#include <android-base/strings.h>
+
+#include "common/libs/utils/flag_parser.h"
+#include "host/libs/config/config_flag.h"
+#include "host/libs/config/feature.h"
+
+namespace cuttlefish {
+namespace {
+
+class AdbConfigFlagImpl : public AdbConfigFlag {
+ public:
+ INJECT(AdbConfigFlagImpl(AdbConfig& config, ConfigFlag& config_flag))
+ : config_(config), config_flag_(config_flag) {
+ mode_flag_ = GflagsCompatFlag("adb_mode").Help(mode_help);
+ mode_flag_.Getter([this]() {
+ std::stringstream modes;
+ for (const auto& mode : config_.Modes()) {
+ modes << "," << AdbModeToString(mode);
+ }
+ return modes.str().substr(1); // First comma
+ });
+ mode_flag_.Setter([this](const FlagMatch& match) {
+ // TODO(schuffelen): Error on unknown types?
+ std::set<AdbMode> modes;
+ for (auto& mode : android::base::Split(match.value, ",")) {
+ modes.insert(StringToAdbMode(mode));
+ }
+ return config_.SetModes(modes);
+ });
+ }
+
+ std::string Name() const override { return "AdbConfigFlagImpl"; }
+
+ std::unordered_set<FlagFeature*> Dependencies() const override {
+ return {static_cast<FlagFeature*>(&config_flag_)};
+ }
+
+ bool Process(std::vector<std::string>& args) override {
+ // Defaults
+ config_.SetModes({AdbMode::VsockHalfTunnel});
+ bool run_adb_connector = !IsRunningInContainer();
+ Flag run_flag = GflagsCompatFlag("run_adb_connector", run_adb_connector);
+ if (!ParseFlags({run_flag, mode_flag_}, args)) {
+ LOG(ERROR) << "Failed to parse adb config flags";
+ return false;
+ }
+ config_.SetRunConnector(run_adb_connector);
+
+ auto adb_modes_check = config_.Modes();
+ adb_modes_check.erase(AdbMode::Unknown);
+ if (adb_modes_check.size() < 1) {
+ LOG(INFO) << "ADB not enabled";
+ }
+
+ return true;
+ }
+ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {
+ bool run = config_.RunConnector();
+ Flag run_flag = GflagsCompatFlag("run_adb_connector", run).Help(run_help);
+ return WriteGflagsCompatXml({run_flag, mode_flag_}, out);
+ }
+
+ private:
+ static constexpr char run_help[] =
+ "Maintain adb connection by sending 'adb connect' commands to the "
+ "server. Only relevant with -adb_mode=tunnel or vsock_tunnel.";
+ static constexpr char mode_help[] =
+ "Mode for ADB connection."
+ "'vsock_tunnel' for a TCP connection tunneled through vsock, "
+ "'native_vsock' for a direct connection to the guest ADB over "
+ "vsock, 'vsock_half_tunnel' for a TCP connection forwarded to "
+ "the guest ADB server, or a comma separated list of types as in "
+ "'native_vsock,vsock_half_tunnel'";
+
+ AdbConfig& config_;
+ ConfigFlag& config_flag_;
+ Flag mode_flag_;
+};
+
+} // namespace
+
+fruit::Component<fruit::Required<AdbConfig, ConfigFlag>, AdbConfigFlag>
+AdbConfigFlagComponent() {
+ return fruit::createComponent()
+ .bind<AdbConfigFlag, AdbConfigFlagImpl>()
+ .addMultibinding<FlagFeature, AdbConfigFlag>();
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/adb/launch.cpp b/host/libs/config/adb/launch.cpp
new file mode 100644
index 0000000..35c904a
--- /dev/null
+++ b/host/libs/config/adb/launch.cpp
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "host/libs/config/adb/adb.h"
+
+#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/known_paths.h"
+
+namespace cuttlefish {
+namespace {
+
+class AdbHelper {
+ public:
+ INJECT(AdbHelper(const CuttlefishConfig::InstanceSpecific& instance,
+ const AdbConfig& config))
+ : instance_(instance), config_(config) {}
+
+ bool ModeEnabled(const AdbMode& mode) const {
+ return config_.Modes().count(mode) > 0;
+ }
+
+ std::string ConnectorTcpArg() const {
+ return "0.0.0.0:" + std::to_string(instance_.adb_host_port());
+ }
+
+ std::string ConnectorVsockArg() const {
+ return "vsock:" + std::to_string(instance_.vsock_guest_cid()) + ":5555";
+ }
+
+ bool VsockTunnelEnabled() const {
+ return instance_.vsock_guest_cid() > 2 && ModeEnabled(AdbMode::VsockTunnel);
+ }
+
+ bool VsockHalfTunnelEnabled() const {
+ return instance_.vsock_guest_cid() > 2 &&
+ ModeEnabled(AdbMode::VsockHalfTunnel);
+ }
+
+ bool TcpConnectorEnabled() const {
+ bool vsock_tunnel = VsockTunnelEnabled();
+ bool vsock_half_tunnel = VsockHalfTunnelEnabled();
+ return config_.RunConnector() && (vsock_tunnel || vsock_half_tunnel);
+ }
+
+ bool VsockConnectorEnabled() const {
+ return config_.RunConnector() && ModeEnabled(AdbMode::NativeVsock);
+ }
+
+ private:
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ const AdbConfig& config_;
+};
+
+class AdbConnector : public CommandSource {
+ public:
+ INJECT(AdbConnector(const AdbHelper& helper)) : helper_(helper) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ Command console_forwarder_cmd(ConsoleForwarderBinary());
+ Command adb_connector(AdbConnectorBinary());
+ std::set<std::string> addresses;
+
+ if (helper_.TcpConnectorEnabled()) {
+ addresses.insert(helper_.ConnectorTcpArg());
+ }
+ if (helper_.VsockConnectorEnabled()) {
+ addresses.insert(helper_.ConnectorVsockArg());
+ }
+
+ if (addresses.size() == 0) {
+ return {};
+ }
+ std::string address_arg = "--addresses=";
+ for (auto& arg : addresses) {
+ address_arg += arg + ",";
+ }
+ address_arg.pop_back();
+ adb_connector.AddParameter(address_arg);
+ std::vector<Command> commands;
+ commands.emplace_back(std::move(adb_connector));
+ return std::move(commands);
+ }
+
+ // Feature
+ std::string Name() const override { return "AdbConnector"; }
+ bool Enabled() const override {
+ return helper_.TcpConnectorEnabled() || helper_.VsockConnectorEnabled();
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override { return true; }
+
+ const AdbHelper& helper_;
+};
+
+class SocketVsockProxy : public CommandSource {
+ public:
+ INJECT(SocketVsockProxy(const AdbHelper& helper,
+ const CuttlefishConfig::InstanceSpecific& instance,
+ KernelLogPipeProvider& log_pipe_provider))
+ : helper_(helper),
+ instance_(instance),
+ log_pipe_provider_(log_pipe_provider) {}
+
+ // CommandSource
+ std::vector<Command> Commands() override {
+ std::vector<Command> commands;
+ if (helper_.VsockTunnelEnabled()) {
+ Command adb_tunnel(SocketVsockProxyBinary());
+ adb_tunnel.AddParameter("-adbd_events_fd=", kernel_log_pipe_);
+ /**
+ * This socket_vsock_proxy (a.k.a. sv proxy) runs on the host. It assumes
+ * that another sv proxy runs inside the guest. see:
+ * shared/config/init.vendor.rc The sv proxy in the guest exposes
+ * vsock:cid:6520 across the cuttlefish instances in multi-tenancy. cid is
+ * different per instance.
+ *
+ * This host sv proxy should cooperate with the guest sv proxy. Thus, one
+ * end of the tunnel is vsock:cid:6520 regardless of instance number.
+ * Another end faces the host adb daemon via tcp. Thus, the server type is
+ * tcp here. The tcp port differs from instance to instance, and is
+ * instance.adb_host_port()
+ *
+ */
+ adb_tunnel.AddParameter("--server=tcp");
+ adb_tunnel.AddParameter("--vsock_port=6520");
+ adb_tunnel.AddParameter("--server_fd=", tcp_server_);
+ adb_tunnel.AddParameter("--vsock_cid=", instance_.vsock_guest_cid());
+ commands.emplace_back(std::move(adb_tunnel));
+ }
+ if (helper_.VsockHalfTunnelEnabled()) {
+ Command adb_tunnel(SocketVsockProxyBinary());
+ adb_tunnel.AddParameter("-adbd_events_fd=", kernel_log_pipe_);
+ /*
+ * This socket_vsock_proxy (a.k.a. sv proxy) runs on the host, and
+ * cooperates with the adbd inside the guest. See this file:
+ * shared/device.mk, especially the line says "persist.adb.tcp.port="
+ *
+ * The guest adbd is listening on vsock:cid:5555 across cuttlefish
+ * instances. Sv proxy faces the host adb daemon via tcp. The server type
+ * should be therefore tcp, and the port should differ from instance to
+ * instance and be equal to instance.adb_host_port()
+ */
+ adb_tunnel.AddParameter("--server=tcp");
+ adb_tunnel.AddParameter("--vsock_port=", 5555);
+ adb_tunnel.AddParameter("--server_fd=", tcp_server_);
+ adb_tunnel.AddParameter("--vsock_cid=", instance_.vsock_guest_cid());
+ commands.emplace_back(std::move(adb_tunnel));
+ }
+ return commands;
+ }
+
+ // Feature
+ std::string Name() const override { return "SocketVsockProxy"; }
+ bool Enabled() const override {
+ return helper_.VsockTunnelEnabled() || helper_.VsockHalfTunnelEnabled();
+ }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override {
+ return {static_cast<Feature*>(&log_pipe_provider_)};
+ }
+ bool Setup() override {
+ tcp_server_ =
+ SharedFD::SocketLocalServer(instance_.adb_host_port(), SOCK_STREAM);
+ if (!tcp_server_->IsOpen()) {
+ LOG(ERROR) << "Unable to create socket_vsock_proxy server socket: "
+ << tcp_server_->StrError();
+ return false;
+ }
+ kernel_log_pipe_ = log_pipe_provider_.KernelLogPipe();
+ return true;
+ }
+
+ const AdbHelper& helper_;
+ const CuttlefishConfig::InstanceSpecific& instance_;
+ KernelLogPipeProvider& log_pipe_provider_;
+ SharedFD kernel_log_pipe_;
+ SharedFD tcp_server_;
+};
+
+} // namespace
+
+fruit::Component<fruit::Required<KernelLogPipeProvider, const AdbConfig,
+ const CuttlefishConfig::InstanceSpecific>>
+LaunchAdbComponent() {
+ return fruit::createComponent()
+ .addMultibinding<CommandSource, AdbConnector>()
+ .addMultibinding<CommandSource, SocketVsockProxy>()
+ .addMultibinding<Feature, AdbConnector>()
+ .addMultibinding<Feature, SocketVsockProxy>();
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/adb/strings.cpp b/host/libs/config/adb/strings.cpp
new file mode 100644
index 0000000..4de9e23
--- /dev/null
+++ b/host/libs/config/adb/strings.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "host/libs/config/adb/adb.h"
+
+#include <algorithm>
+#include <string>
+
+namespace cuttlefish {
+
+AdbMode StringToAdbMode(const std::string& mode_cased) {
+ std::string mode = mode_cased;
+ std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
+ if (mode == "vsock_tunnel") {
+ return AdbMode::VsockTunnel;
+ } else if (mode == "vsock_half_tunnel") {
+ return AdbMode::VsockHalfTunnel;
+ } else if (mode == "native_vsock") {
+ return AdbMode::NativeVsock;
+ } else {
+ return AdbMode::Unknown;
+ }
+}
+
+std::string AdbModeToString(AdbMode mode) {
+ switch (mode) {
+ case AdbMode::VsockTunnel:
+ return "vsock_tunnel";
+ case AdbMode::VsockHalfTunnel:
+ return "vsock_half_tunnel";
+ case AdbMode::NativeVsock:
+ return "native_vsock";
+ case AdbMode::Unknown: // fall through
+ default:
+ return "unknown";
+ }
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/adb/test.cpp b/host/libs/config/adb/test.cpp
new file mode 100644
index 0000000..226ac83
--- /dev/null
+++ b/host/libs/config/adb/test.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <fruit/fruit.h>
+#include <gtest/gtest.h>
+#include <host/libs/config/adb/adb.h>
+
+#include <string>
+
+#include "host/libs/config/feature.h"
+
+namespace cuttlefish {
+
+struct TestData {
+ INJECT(TestData(AdbConfig& config, AdbConfigFragment& fragment))
+ : config(config), fragment(fragment) {}
+
+ AdbConfig& config;
+ AdbConfigFragment& fragment;
+};
+
+fruit::Component<TestData> TestComponent() {
+ return fruit::createComponent()
+ .install(AdbConfigComponent)
+ .install(AdbConfigFlagComponent)
+ .install(AdbConfigFragmentComponent)
+ .install(ConfigFlagPlaceholder);
+}
+
+TEST(AdbConfigTest, SetFromFlags) {
+ fruit::Injector<TestData> injector(TestComponent);
+ TestData& data = injector.get<TestData&>();
+ std::vector<std::string> args = {
+ "--adb_mode=vsock_tunnel,vsock_half_tunnel,native_vsock,unknown",
+ "--run_adb_connector=false",
+ };
+ auto flags = injector.getMultibindings<FlagFeature>();
+ ASSERT_TRUE(FlagFeature::ProcessFlags(flags, args));
+ ASSERT_TRUE(args.empty());
+
+ std::set<AdbMode> modes = {AdbMode::VsockTunnel, AdbMode::VsockHalfTunnel,
+ AdbMode::NativeVsock, AdbMode::Unknown};
+ ASSERT_EQ(data.config.Modes(), modes);
+ ASSERT_FALSE(data.config.RunConnector());
+}
+
+TEST(AdbConfigTest, SerializeDeserialize) {
+ fruit::Injector<TestData> injector1(TestComponent);
+ TestData& data1 = injector1.get<TestData&>();
+ ASSERT_TRUE(
+ data1.config.SetModes({AdbMode::VsockTunnel, AdbMode::VsockHalfTunnel,
+ AdbMode::NativeVsock, AdbMode::Unknown}));
+ ASSERT_TRUE(data1.config.SetRunConnector(false));
+
+ fruit::Injector<TestData> injector2(TestComponent);
+ TestData& data2 = injector2.get<TestData&>();
+ ASSERT_TRUE(data2.fragment.Deserialize(data1.fragment.Serialize()));
+ ASSERT_EQ(data1.config.Modes(), data2.config.Modes());
+ ASSERT_EQ(data1.config.RunConnector(), data2.config.RunConnector());
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/bootconfig_args.cpp b/host/libs/config/bootconfig_args.cpp
index 1f926eb..0c1a026 100644
--- a/host/libs/config/bootconfig_args.cpp
+++ b/host/libs/config/bootconfig_args.cpp
@@ -24,6 +24,7 @@
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/known_paths.h"
#include "host/libs/vm_manager/crosvm_manager.h"
#include "host/libs/vm_manager/qemu_manager.h"
#include "host/libs/vm_manager/vm_manager.h"
@@ -47,15 +48,6 @@
return os.str();
}
-std::string mac_to_str(const std::array<unsigned char, 6>& mac) {
- std::ostringstream stream;
- stream << std::hex << (int)mac[0];
- for (int i = 1; i < 6; i++) {
- stream << ":" << std::hex << (int)mac[i];
- }
- return stream.str();
-}
-
// TODO(schuffelen): Move more of this into host/libs/vm_manager, as a
// substitute for the vm_manager comparisons.
std::vector<std::string> VmManagerBootconfig(const CuttlefishConfig& config) {
@@ -86,7 +78,8 @@
auto vmm = vm_manager::GetVmManager(config.vm_manager(), config.target_arch());
bootconfig_args.push_back(
vmm->ConfigureBootDevices(instance.virtual_disk_paths().size()));
- AppendVector(&bootconfig_args, vmm->ConfigureGpuMode(config.gpu_mode()));
+ AppendVector(&bootconfig_args, vmm->ConfigureGraphics(config.gpu_mode(),
+ config.hwcomposer()));
bootconfig_args.push_back(
concat("androidboot.serialno=", instance.serial_number()));
@@ -108,6 +101,11 @@
instance.tombstone_receiver_port()));
}
+ if (instance.confui_host_vsock_port()) {
+ bootconfig_args.push_back(concat("androidboot.vsock_confirmationui_port=",
+ instance.confui_host_vsock_port()));
+ }
+
if (instance.config_server_port()) {
bootconfig_args.push_back(
concat("androidboot.cuttlefish_config_server_port=",
@@ -126,7 +124,7 @@
if (config.enable_vehicle_hal_grpc_server() &&
instance.vehicle_hal_server_port() &&
- FileExists(config.vehicle_hal_grpc_server_binary())) {
+ FileExists(VehicleHalGrpcServerBinary())) {
constexpr int vehicle_hal_server_cid = 2;
bootconfig_args.push_back(concat(
"androidboot.vendor.vehiclehal.server.cid=", vehicle_hal_server_cid));
@@ -144,11 +142,6 @@
instance.audiocontrol_server_port()));
}
- if (instance.frames_server_port()) {
- bootconfig_args.push_back(concat("androidboot.vsock_frames_port=",
- instance.frames_server_port()));
- }
-
if (instance.camera_server_port()) {
bootconfig_args.push_back(concat("androidboot.vsock_camera_port=",
instance.camera_server_port()));
@@ -162,11 +155,11 @@
instance.modem_simulator_ports()));
}
- // TODO(b/158131610): Set this in crosvm instead
- bootconfig_args.push_back(concat("androidboot.wifi_mac_address=",
- mac_to_str(instance.wifi_mac_address())));
+ bootconfig_args.push_back(concat("androidboot.fstab_suffix=",
+ config.userdata_format()));
- bootconfig_args.push_back("androidboot.verifiedbootstate=orange");
+ bootconfig_args.push_back(
+ concat("androidboot.wifi_mac_prefix=", instance.wifi_mac_prefix()));
// Non-native architecture implies a significantly slower execution speed, so
// set a large timeout multiplier.
@@ -174,7 +167,7 @@
bootconfig_args.push_back("androidboot.hw_timeout_multiplier=50");
}
- // TODO(b/173815685): Create an extra_bootconfig flag and add it to bootconfig
+ AppendVector(&bootconfig_args, config.extra_bootconfig_args());
return bootconfig_args;
}
diff --git a/guest/hals/audio/Android.bp b/host/libs/config/command_source.h
similarity index 62%
rename from guest/hals/audio/Android.bp
rename to host/libs/config/command_source.h
index c6faae7..845bfa1 100644
--- a/guest/hals/audio/Android.bp
+++ b/host/libs/config/command_source.h
@@ -1,3 +1,4 @@
+//
// Copyright (C) 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,16 +13,20 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
+#pragma once
-cc_library_shared {
- name: "audio.primary.cutf",
- relative_install_path: "hw",
- defaults: ["cuttlefish_guest_only"],
- vendor: true,
- srcs: ["audio_hw.c"],
- cflags: ["-Wno-unused-parameter"],
- shared_libs: ["libcutils", "libhardware", "liblog", "libtinyalsa"],
-}
+#include <fruit/fruit.h>
+#include <vector>
+
+#include "common/libs/utils/subprocess.h"
+#include "host/libs/config/feature.h"
+
+namespace cuttlefish {
+
+class CommandSource : public virtual Feature {
+ public:
+ virtual ~CommandSource() = default;
+ virtual std::vector<Command> Commands() = 0;
+};
+
+} // namespace cuttlefish
diff --git a/host/libs/config/config_flag.cpp b/host/libs/config/config_flag.cpp
new file mode 100644
index 0000000..d7b5f00
--- /dev/null
+++ b/host/libs/config/config_flag.cpp
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/libs/config/config_flag.h"
+
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+#include <gflags/gflags.h>
+#include <json/json.h>
+#include <fstream>
+#include <set>
+#include <string>
+
+#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
+#include "host/libs/config/cuttlefish_config.h"
+
+// To support other files that use this from gflags.
+DEFINE_string(system_image_dir, "", "");
+
+using gflags::FlagSettingMode::SET_FLAGS_DEFAULT;
+
+namespace cuttlefish {
+
+namespace {
+
+class SystemImageDirFlagImpl : public SystemImageDirFlag {
+ public:
+ INJECT(SystemImageDirFlagImpl()) {
+ auto help = "Location of the system partition images.";
+ flag_ = GflagsCompatFlag("system_image_dir", path_).Help(help);
+ }
+ const std::string& Path() override { return path_; }
+
+ std::string Name() const override { return "SystemImageDirFlagImpl"; }
+ std::unordered_set<FlagFeature*> Dependencies() const override { return {}; }
+ bool Process(std::vector<std::string>& args) override {
+ path_ = DefaultGuestImagePath("");
+ if (!flag_.Parse(args)) {
+ return false;
+ }
+ // To support other files that use this from gflags.
+ FLAGS_system_image_dir = path_;
+ gflags::SetCommandLineOptionWithMode("system_image_dir", path_.c_str(),
+ SET_FLAGS_DEFAULT);
+ return true;
+ }
+ bool WriteGflagsCompatHelpXml(std::ostream&) const override {
+ // TODO(schuffelen): Write something here when this is removed from gflags
+ return true;
+ }
+
+ private:
+ std::string path_;
+ Flag flag_;
+};
+
+class ConfigReader : public FlagFeature {
+ public:
+ INJECT(ConfigReader()) = default;
+
+ bool HasConfig(const std::string& name) const {
+ return allowed_config_presets_.count(name) > 0;
+ }
+ const std::set<std::string>& AvailableConfigs() const {
+ return allowed_config_presets_;
+ }
+ std::optional<Json::Value> ReadConfig(const std::string& name) const {
+ auto path =
+ DefaultHostArtifactsPath("etc/cvd_config/cvd_config_" + name + ".json");
+ Json::Value config;
+ Json::CharReaderBuilder builder;
+ std::ifstream ifs(path);
+ std::string errorMessage;
+ if (!Json::parseFromStream(builder, ifs, &config, &errorMessage)) {
+ LOG(ERROR) << "Could not read config file " << path << ": "
+ << errorMessage;
+ return {};
+ }
+ return config;
+ }
+
+ // FlagFeature
+ std::string Name() const override { return "ConfigReader"; }
+ std::unordered_set<FlagFeature*> Dependencies() const override { return {}; }
+ bool Process(std::vector<std::string>&) override {
+ for (const std::string& file :
+ DirectoryContents(DefaultHostArtifactsPath("etc/cvd_config"))) {
+ std::string_view local_file(file);
+ if (android::base::ConsumePrefix(&local_file, "cvd_config_") &&
+ android::base::ConsumeSuffix(&local_file, ".json")) {
+ allowed_config_presets_.emplace(local_file);
+ }
+ }
+ return true;
+ }
+ bool WriteGflagsCompatHelpXml(std::ostream&) const override { return true; }
+
+ private:
+ std::set<std::string> allowed_config_presets_;
+};
+
+class ConfigFlagImpl : public ConfigFlag {
+ public:
+ INJECT(ConfigFlagImpl(ConfigReader& cr, SystemImageDirFlag& s))
+ : config_reader_(cr), system_image_dir_flag_(s) {
+ is_default_ = true;
+ config_ = "phone"; // default value
+ auto help =
+ "Config preset name. Will automatically set flag fields using the "
+ "values from this file of presets. See "
+ "device/google/cuttlefish/shared/config/config_*.json for possible "
+ "values.";
+ auto getter = [this]() { return config_; };
+ auto setter = [this](const FlagMatch& m) { return ChooseConfig(m.value); };
+ flag_ = GflagsCompatFlag("config").Help(help).Getter(getter).Setter(setter);
+ }
+
+ std::string Name() const override { return "ConfigFlagImpl"; }
+ std::unordered_set<FlagFeature*> Dependencies() const override {
+ return {
+ static_cast<FlagFeature*>(&config_reader_),
+ static_cast<FlagFeature*>(&system_image_dir_flag_),
+ };
+ }
+ bool Process(std::vector<std::string>& args) override {
+ if (!flag_.Parse(args)) {
+ LOG(ERROR) << "Failed to parse `--config` flag";
+ return false;
+ }
+
+ if (auto info_cfg = FindAndroidInfoConfig(); is_default_ && info_cfg) {
+ config_ = *info_cfg;
+ }
+ LOG(INFO) << "Launching CVD using --config='" << config_ << "'.";
+ auto config_values = config_reader_.ReadConfig(config_);
+ if (!config_values) {
+ LOG(ERROR) << "Failed to read config for " << config_;
+ return false;
+ }
+ for (const std::string& flag : config_values->getMemberNames()) {
+ std::string value;
+ if (flag == "custom_actions") {
+ Json::StreamWriterBuilder factory;
+ value = Json::writeString(factory, (*config_values)[flag]);
+ } else {
+ value = (*config_values)[flag].asString();
+ }
+ args.insert(args.begin(), "--" + flag + "=" + value);
+ // To avoid the flag forwarder from thinking this song is different from a
+ // default. Should fail silently if the flag doesn't exist.
+ gflags::SetCommandLineOptionWithMode(flag.c_str(), value.c_str(),
+ SET_FLAGS_DEFAULT);
+ }
+ return true;
+ }
+ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {
+ return flag_.WriteGflagsCompatXml(out);
+ }
+
+ private:
+ bool ChooseConfig(const std::string& name) {
+ if (!config_reader_.HasConfig(name)) {
+ LOG(ERROR) << "Invalid --config option '" << name << "'. Valid options: "
+ << android::base::Join(config_reader_.AvailableConfigs(), ",");
+ return false;
+ }
+ config_ = name;
+ is_default_ = false;
+ return true;
+ }
+ std::optional<std::string> FindAndroidInfoConfig() const {
+ auto info_path = system_image_dir_flag_.Path() + "/android-info.txt";
+ if (!FileExists(info_path)) {
+ return {};
+ }
+ std::ifstream ifs{info_path};
+ if (!ifs.is_open()) {
+ return {};
+ }
+ std::string android_info;
+ ifs >> android_info;
+ std::string_view local_android_info(android_info);
+ if (!android::base::ConsumePrefix(&local_android_info, "config=")) {
+ return {};
+ }
+ if (!config_reader_.HasConfig(std::string{local_android_info})) {
+ LOG(WARNING) << info_path << " contains invalid config preset: '"
+ << local_android_info << "'.";
+ return {};
+ }
+ return std::string{local_android_info};
+ }
+
+ ConfigReader& config_reader_;
+ SystemImageDirFlag& system_image_dir_flag_;
+ std::string config_;
+ bool is_default_;
+ Flag flag_;
+};
+
+class ConfigFlagPlaceholderImpl : public ConfigFlag {
+ public:
+ INJECT(ConfigFlagPlaceholderImpl()) {}
+
+ std::string Name() const override { return "ConfigFlagPlaceholderImpl"; }
+ std::unordered_set<FlagFeature*> Dependencies() const override { return {}; }
+ bool Process(std::vector<std::string>&) override { return true; }
+ bool WriteGflagsCompatHelpXml(std::ostream&) const override { return true; }
+};
+
+} // namespace
+
+fruit::Component<SystemImageDirFlag, ConfigFlag> ConfigFlagComponent() {
+ return fruit::createComponent()
+ .addMultibinding<FlagFeature, ConfigReader>()
+ .bind<ConfigFlag, ConfigFlagImpl>()
+ .addMultibinding<FlagFeature, ConfigFlag>()
+ .bind<SystemImageDirFlag, SystemImageDirFlagImpl>()
+ .addMultibinding<FlagFeature, SystemImageDirFlag>();
+}
+
+fruit::Component<ConfigFlag> ConfigFlagPlaceholder() {
+ return fruit::createComponent()
+ .addMultibinding<FlagFeature, ConfigFlag>()
+ .bind<ConfigFlag, ConfigFlagPlaceholderImpl>();
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/config_flag.h b/host/libs/config/config_flag.h
new file mode 100644
index 0000000..04258eb
--- /dev/null
+++ b/host/libs/config/config_flag.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <fruit/fruit.h>
+#include <string>
+
+#include "host/libs/config/feature.h"
+
+namespace cuttlefish {
+
+// TODO(schuffelen): Move this to a more central location?
+class SystemImageDirFlag : public FlagFeature {
+ public:
+ virtual const std::string& Path() = 0;
+};
+
+class ConfigFlag : public FlagFeature {};
+
+fruit::Component<SystemImageDirFlag, ConfigFlag> ConfigFlagComponent();
+
+fruit::Component<ConfigFlag> ConfigFlagPlaceholder();
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/size_utils.cpp b/host/libs/config/config_fragment.h
similarity index 64%
copy from common/libs/utils/size_utils.cpp
copy to host/libs/config/config_fragment.h
index 9f25445..cc1bfc1 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/host/libs/config/config_fragment.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,16 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#pragma once
-#include "common/libs/utils/size_utils.h"
-
-#include <unistd.h>
+#include <json/json.h>
+#include <memory>
+#include <string>
namespace cuttlefish {
-uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {
- uint64_t align = 1ULL << align_log;
- return ((val + (align - 1)) / align) * align;
-}
+class ConfigFragment {
+ public:
+ virtual ~ConfigFragment();
+
+ virtual std::string Name() const = 0;
+ virtual Json::Value Serialize() const = 0;
+ virtual bool Deserialize(const Json::Value&) = 0;
+};
} // namespace cuttlefish
diff --git a/host/libs/config/custom_actions.cpp b/host/libs/config/custom_actions.cpp
index 1cc2e06..af5524e 100644
--- a/host/libs/config/custom_actions.cpp
+++ b/host/libs/config/custom_actions.cpp
@@ -16,12 +16,16 @@
#include "host/libs/config/custom_actions.h"
#include <android-base/logging.h>
+#include <android-base/strings.h>
#include <json/json.h>
+#include <fstream>
#include <optional>
#include <string>
#include <vector>
+#include "common/libs/utils/files.h"
+#include "common/libs/utils/flag_parser.h"
#include "host/libs/config/cuttlefish_config.h"
namespace cuttlefish {
@@ -38,42 +42,41 @@
const char* kCustomActionButtonTitle = "title";
const char* kCustomActionButtonIconName = "icon_name";
-} //namespace
-
-
-CustomActionConfig::CustomActionConfig(const Json::Value& dictionary) {
- if (dictionary.isMember(kCustomActionShellCommand) +
- dictionary.isMember(kCustomActionServer) +
- dictionary.isMember(kCustomActionDeviceStates) !=
- 1) {
- LOG(FATAL) << "Custom action must contain exactly one of shell_command, "
+std::optional<CustomActionConfig> CustomActionConfigFromJson(
+ const Json::Value& dictionary) {
+ bool has_shell_command = dictionary.isMember(kCustomActionShellCommand);
+ bool has_server = dictionary.isMember(kCustomActionServer);
+ bool has_device_states = dictionary.isMember(kCustomActionDeviceStates);
+ if (!!has_shell_command + !!has_server + !!has_device_states != 1) {
+ LOG(ERROR) << "Custom action must contain exactly one of shell_command, "
<< "server, or device_states";
- return;
+ return {};
}
- if (dictionary.isMember(kCustomActionShellCommand)) {
+ CustomActionConfig config;
+ if (has_shell_command) {
// Shell command with one button.
Json::Value button_entry = dictionary[kCustomActionButton];
- buttons = {{button_entry[kCustomActionButtonCommand].asString(),
- button_entry[kCustomActionButtonTitle].asString(),
- button_entry[kCustomActionButtonIconName].asString()}};
- shell_command = dictionary[kCustomActionShellCommand].asString();
- } else if (dictionary.isMember(kCustomActionServer)) {
+ config.buttons = {{button_entry[kCustomActionButtonCommand].asString(),
+ button_entry[kCustomActionButtonTitle].asString(),
+ button_entry[kCustomActionButtonIconName].asString()}};
+ config.shell_command = dictionary[kCustomActionShellCommand].asString();
+ } else if (has_server) {
// Action server with possibly multiple buttons.
for (const Json::Value& button_entry : dictionary[kCustomActionButtons]) {
ControlPanelButton button = {
button_entry[kCustomActionButtonCommand].asString(),
button_entry[kCustomActionButtonTitle].asString(),
button_entry[kCustomActionButtonIconName].asString()};
- buttons.push_back(button);
+ config.buttons.push_back(button);
}
- server = dictionary[kCustomActionServer].asString();
- } else if (dictionary.isMember(kCustomActionDeviceStates)) {
+ config.server = dictionary[kCustomActionServer].asString();
+ } else if (has_device_states) {
// Device state(s) with one button.
// Each button press cycles to the next state, then repeats to the first.
Json::Value button_entry = dictionary[kCustomActionButton];
- buttons = {{button_entry[kCustomActionButtonCommand].asString(),
- button_entry[kCustomActionButtonTitle].asString(),
- button_entry[kCustomActionButtonIconName].asString()}};
+ config.buttons = {{button_entry[kCustomActionButtonCommand].asString(),
+ button_entry[kCustomActionButtonTitle].asString(),
+ button_entry[kCustomActionButtonIconName].asString()}};
for (const Json::Value& device_state_entry :
dictionary[kCustomActionDeviceStates]) {
DeviceState state;
@@ -86,40 +89,42 @@
state.hinge_angle_value =
device_state_entry[kCustomActionDeviceStateHingeAngleValue].asInt();
}
- device_states.push_back(state);
+ config.device_states.push_back(state);
}
} else {
- LOG(FATAL) << "Unknown custom action type.";
+ LOG(ERROR) << "Unknown custom action type.";
+ return {};
}
+ return config;
}
-Json::Value CustomActionConfig::ToJson() const {
- Json::Value custom_action;
- if (shell_command) {
+Json::Value ToJson(const CustomActionConfig& custom_action) {
+ Json::Value json;
+ if (custom_action.shell_command) {
// Shell command with one button.
- custom_action[kCustomActionShellCommand] = *shell_command;
- custom_action[kCustomActionButton] = Json::Value();
- custom_action[kCustomActionButton][kCustomActionButtonCommand] =
- buttons[0].command;
- custom_action[kCustomActionButton][kCustomActionButtonTitle] =
- buttons[0].title;
- custom_action[kCustomActionButton][kCustomActionButtonIconName] =
- buttons[0].icon_name;
- } else if (server) {
+ json[kCustomActionShellCommand] = *custom_action.shell_command;
+ json[kCustomActionButton] = Json::Value();
+ json[kCustomActionButton][kCustomActionButtonCommand] =
+ custom_action.buttons[0].command;
+ json[kCustomActionButton][kCustomActionButtonTitle] =
+ custom_action.buttons[0].title;
+ json[kCustomActionButton][kCustomActionButtonIconName] =
+ custom_action.buttons[0].icon_name;
+ } else if (custom_action.server) {
// Action server with possibly multiple buttons.
- custom_action[kCustomActionServer] = *server;
- custom_action[kCustomActionButtons] = Json::Value(Json::arrayValue);
- for (const auto& button : buttons) {
+ json[kCustomActionServer] = *custom_action.server;
+ json[kCustomActionButtons] = Json::Value(Json::arrayValue);
+ for (const auto& button : custom_action.buttons) {
Json::Value button_entry;
button_entry[kCustomActionButtonCommand] = button.command;
button_entry[kCustomActionButtonTitle] = button.title;
button_entry[kCustomActionButtonIconName] = button.icon_name;
- custom_action[kCustomActionButtons].append(button_entry);
+ json[kCustomActionButtons].append(button_entry);
}
- } else if (!device_states.empty()) {
+ } else if (!custom_action.device_states.empty()) {
// Device state(s) with one button.
- custom_action[kCustomActionDeviceStates] = Json::Value(Json::arrayValue);
- for (const auto& device_state : device_states) {
+ json[kCustomActionDeviceStates] = Json::Value(Json::arrayValue);
+ for (const auto& device_state : custom_action.device_states) {
Json::Value device_state_entry;
if (device_state.lid_switch_open) {
device_state_entry[kCustomActionDeviceStateLidSwitchOpen] =
@@ -129,19 +134,167 @@
device_state_entry[kCustomActionDeviceStateHingeAngleValue] =
*device_state.hinge_angle_value;
}
- custom_action[kCustomActionDeviceStates].append(device_state_entry);
+ json[kCustomActionDeviceStates].append(device_state_entry);
}
- custom_action[kCustomActionButton] = Json::Value();
- custom_action[kCustomActionButton][kCustomActionButtonCommand] =
- buttons[0].command;
- custom_action[kCustomActionButton][kCustomActionButtonTitle] =
- buttons[0].title;
- custom_action[kCustomActionButton][kCustomActionButtonIconName] =
- buttons[0].icon_name;
+ json[kCustomActionButton] = Json::Value();
+ json[kCustomActionButton][kCustomActionButtonCommand] =
+ custom_action.buttons[0].command;
+ json[kCustomActionButton][kCustomActionButtonTitle] =
+ custom_action.buttons[0].title;
+ json[kCustomActionButton][kCustomActionButtonIconName] =
+ custom_action.buttons[0].icon_name;
} else {
LOG(FATAL) << "Unknown custom action type.";
}
- return custom_action;
+ return json;
+}
+
+std::string DefaultCustomActionConfig() {
+ auto custom_action_config_dir =
+ DefaultHostArtifactsPath("etc/cvd_custom_action_config");
+ if (DirectoryExists(custom_action_config_dir)) {
+ auto custom_action_configs = DirectoryContents(custom_action_config_dir);
+ // Two entries are always . and ..
+ if (custom_action_configs.size() > 3) {
+ LOG(ERROR) << "Expected at most one custom action config in "
+ << custom_action_config_dir << ". Please delete extras.";
+ } else if (custom_action_configs.size() == 3) {
+ for (const auto& config : custom_action_configs) {
+ if (android::base::EndsWithIgnoreCase(config, ".json")) {
+ return custom_action_config_dir + "/" + config;
+ }
+ }
+ }
+ }
+ return "";
+}
+
+class CustomActionConfigImpl : public CustomActionConfigProvider {
+ public:
+ INJECT(CustomActionConfigImpl(ConfigFlag& config)) : config_(config) {
+ custom_action_config_flag_ = GflagsCompatFlag("custom_action_config");
+ custom_action_config_flag_.Help(
+ "Path to a custom action config JSON. Defaults to the file provided by "
+ "build variable CVD_CUSTOM_ACTION_CONFIG. If this build variable is "
+ "empty then the custom action config will be empty as well.");
+ custom_action_config_flag_.Getter(
+ [this]() { return custom_action_config_; });
+ custom_action_config_flag_.Setter([this](const FlagMatch& match) {
+ if (!match.value.empty() && !FileExists(match.value)) {
+ LOG(ERROR) << "custom_action_config file \"" << match.value << "\" "
+ << "does not exist.";
+ return false;
+ }
+ custom_action_config_ = match.value;
+ return true;
+ });
+ // TODO(schuffelen): Access ConfigFlag directly for these values.
+ custom_actions_flag_ = GflagsCompatFlag("custom_actions");
+ custom_actions_flag_.Help(
+ "Serialized JSON of an array of custom action objects (in the same "
+ "format as custom action config JSON files). For use within --config "
+ "preset config files; prefer --custom_action_config to specify a "
+ "custom config file on the command line. Actions in this flag are "
+ "combined with actions in --custom_action_config.");
+ custom_actions_flag_.Setter([this](const FlagMatch& match) {
+ // Load the custom action from the --config preset file.
+ Json::CharReaderBuilder builder;
+ std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
+ std::string errorMessage;
+ Json::Value custom_action_array(Json::arrayValue);
+ if (!reader->parse(&*match.value.begin(), &*match.value.end(),
+ &custom_action_array, &errorMessage)) {
+ LOG(ERROR) << "Could not read custom actions config flag: "
+ << errorMessage;
+ return false;
+ }
+ return AddJsonCustomActionConfigs(custom_action_array);
+ });
+ }
+
+ const std::vector<CustomActionConfig>& CustomActions() const override {
+ return custom_actions_;
+ }
+
+ // ConfigFragment
+ Json::Value Serialize() const override {
+ Json::Value actions_array(Json::arrayValue);
+ for (const auto& action : CustomActions()) {
+ actions_array.append(ToJson(action));
+ }
+ return actions_array;
+ }
+ bool Deserialize(const Json::Value& custom_actions_json) override {
+ return AddJsonCustomActionConfigs(custom_actions_json);
+ }
+
+ // FlagFeature
+ std::string Name() const override { return "CustomActionConfig"; }
+ std::unordered_set<FlagFeature*> Dependencies() const override {
+ return {static_cast<FlagFeature*>(&config_)};
+ }
+
+ bool Process(std::vector<std::string>& args) override {
+ custom_action_config_ = DefaultCustomActionConfig();
+ if (!ParseFlags(Flags(), args)) {
+ return false;
+ }
+ if (custom_action_config_ != "") {
+ Json::CharReaderBuilder builder;
+ std::ifstream ifs(custom_action_config_);
+ std::string errorMessage;
+ Json::Value custom_action_array(Json::arrayValue);
+ if (!Json::parseFromStream(builder, ifs, &custom_action_array,
+ &errorMessage)) {
+ LOG(ERROR) << "Could not read custom actions config file "
+ << custom_action_config_ << ": " << errorMessage;
+ return false;
+ }
+ return AddJsonCustomActionConfigs(custom_action_array);
+ }
+ return true;
+ }
+ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {
+ return WriteGflagsCompatXml(Flags(), out);
+ }
+
+ private:
+ std::vector<Flag> Flags() const {
+ return {custom_action_config_flag_, custom_actions_flag_};
+ }
+
+ bool AddJsonCustomActionConfigs(const Json::Value& custom_action_array) {
+ if (custom_action_array.type() != Json::arrayValue) {
+ LOG(ERROR) << "Expected a JSON array of custom actions";
+ return false;
+ }
+ for (const auto& custom_action_json : custom_action_array) {
+ auto custom_action = CustomActionConfigFromJson(custom_action_json);
+ if (custom_action) {
+ custom_actions_.push_back(*custom_action);
+ } else {
+ LOG(ERROR) << "Validation failed on a custom action";
+ return false;
+ }
+ }
+ return true;
+ }
+
+ ConfigFlag& config_;
+ Flag custom_action_config_flag_;
+ std::string custom_action_config_;
+ Flag custom_actions_flag_;
+ std::vector<CustomActionConfig> custom_actions_;
+};
+
+} // namespace
+
+fruit::Component<fruit::Required<ConfigFlag>, CustomActionConfigProvider>
+CustomActionsComponent() {
+ return fruit::createComponent()
+ .bind<CustomActionConfigProvider, CustomActionConfigImpl>()
+ .addMultibinding<ConfigFragment, CustomActionConfigProvider>()
+ .addMultibinding<FlagFeature, CustomActionConfigProvider>();
}
} // namespace cuttlefish
diff --git a/host/libs/config/custom_actions.h b/host/libs/config/custom_actions.h
index 6279401..73f3901 100644
--- a/host/libs/config/custom_actions.h
+++ b/host/libs/config/custom_actions.h
@@ -15,12 +15,15 @@
*/
#pragma once
-#include <json/json.h>
-
+#include <fruit/fruit.h>
#include <optional>
#include <string>
#include <vector>
+#include "host/libs/config/config_flag.h"
+#include "host/libs/config/config_fragment.h"
+#include "host/libs/config/feature.h"
+
namespace cuttlefish {
struct ControlPanelButton {
@@ -35,13 +38,18 @@
};
struct CustomActionConfig {
- CustomActionConfig(const Json::Value&);
- Json::Value ToJson() const;
-
std::vector<ControlPanelButton> buttons;
std::optional<std::string> shell_command;
std::optional<std::string> server;
std::vector<DeviceState> device_states;
};
+class CustomActionConfigProvider : public FlagFeature, public ConfigFragment {
+ public:
+ virtual const std::vector<CustomActionConfig>& CustomActions() const = 0;
+};
+
+fruit::Component<fruit::Required<ConfigFlag>, CustomActionConfigProvider>
+CustomActionsComponent();
+
} // namespace cuttlefish
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index b5160d0..0b0022f 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -40,9 +40,26 @@
namespace cuttlefish {
namespace {
+static constexpr int kDefaultInstance = 1;
+
+int InstanceFromString(std::string instance_str) {
+ if (android::base::StartsWith(instance_str, kVsocUserPrefix)) {
+ instance_str = instance_str.substr(std::string(kVsocUserPrefix).size());
+ } else if (android::base::StartsWith(instance_str, kCvdNamePrefix)) {
+ instance_str = instance_str.substr(std::string(kCvdNamePrefix).size());
+ }
+
+ int instance = std::stoi(instance_str);
+ if (instance <= 0) {
+ LOG(INFO) << "Failed to interpret \"" << instance_str << "\" as an id, "
+ << "using instance id " << kDefaultInstance;
+ return kDefaultInstance;
+ }
+ return instance;
+}
+
int InstanceFromEnvironment() {
static constexpr char kInstanceEnvironmentVariable[] = "CUTTLEFISH_INSTANCE";
- static constexpr int kDefaultInstance = 1;
// CUTTLEFISH_INSTANCE environment variable
std::string instance_str = StringFromEnv(kInstanceEnvironmentVariable, "");
@@ -60,15 +77,8 @@
LOG(DEBUG) << "Non-vsoc user, using instance id " << kDefaultInstance;
return kDefaultInstance;
}
- instance_str = instance_str.substr(std::string(kVsocUserPrefix).size());
}
- int instance = std::stoi(instance_str);
- if (instance <= 0) {
- LOG(INFO) << "Failed to interpret \"" << instance_str << "\" as an id, "
- << "using instance id " << kDefaultInstance;
- return kDefaultInstance;
- }
- return instance;
+ return InstanceFromString(instance_str);
}
const char* kInstances = "instances";
@@ -81,18 +91,47 @@
const char* const kGpuModeDrmVirgl = "drm_virgl";
const char* const kGpuModeGfxStream = "gfxstream";
+const char* const kHwComposerAuto = "auto";
+const char* const kHwComposerDrmMinigbm = "drm_minigbm";
+const char* const kHwComposerRanchu = "ranchu";
+
std::string DefaultEnvironmentPath(const char* environment_key,
const char* default_value,
const char* subpath) {
return StringFromEnv(environment_key, default_value) + "/" + subpath;
}
-static constexpr char kAssemblyDir[] = "assembly_dir";
-std::string CuttlefishConfig::assembly_dir() const {
- return (*dictionary_)[kAssemblyDir].asString();
+ConfigFragment::~ConfigFragment() = default;
+
+static constexpr char kFragments[] = "fragments";
+bool CuttlefishConfig::LoadFragment(ConfigFragment& fragment) const {
+ if (!dictionary_->isMember(kFragments)) {
+ LOG(ERROR) << "Fragments member was missing";
+ return false;
+ }
+ const Json::Value& json_fragments = (*dictionary_)[kFragments];
+ if (!json_fragments.isMember(fragment.Name())) {
+ LOG(ERROR) << "Could not find a fragment called " << fragment.Name();
+ return false;
+ }
+ return fragment.Deserialize(json_fragments[fragment.Name()]);
}
-void CuttlefishConfig::set_assembly_dir(const std::string& assembly_dir) {
- (*dictionary_)[kAssemblyDir] = assembly_dir;
+bool CuttlefishConfig::SaveFragment(const ConfigFragment& fragment) {
+ Json::Value& json_fragments = (*dictionary_)[kFragments];
+ if (json_fragments.isMember(fragment.Name())) {
+ LOG(ERROR) << "Already have a fragment called " << fragment.Name();
+ return false;
+ }
+ json_fragments[fragment.Name()] = fragment.Serialize();
+ return true;
+}
+
+static constexpr char kRootDir[] = "root_dir";
+std::string CuttlefishConfig::root_dir() const {
+ return (*dictionary_)[kRootDir].asString();
+}
+void CuttlefishConfig::set_root_dir(const std::string& root_dir) {
+ (*dictionary_)[kRootDir] = root_dir;
}
static constexpr char kVmManager[] = "vm_manager";
@@ -111,6 +150,30 @@
(*dictionary_)[kGpuMode] = name;
}
+static constexpr char kGpuCaptureBinary[] = "gpu_capture_binary";
+std::string CuttlefishConfig::gpu_capture_binary() const {
+ return (*dictionary_)[kGpuCaptureBinary].asString();
+}
+void CuttlefishConfig::set_gpu_capture_binary(const std::string& name) {
+ (*dictionary_)[kGpuCaptureBinary] = name;
+}
+
+static constexpr char kHWComposer[] = "hwcomposer";
+std::string CuttlefishConfig::hwcomposer() const {
+ return (*dictionary_)[kHWComposer].asString();
+}
+void CuttlefishConfig::set_hwcomposer(const std::string& name) {
+ (*dictionary_)[kHWComposer] = name;
+}
+
+static constexpr char kEnableGpuUdmabuf[] = "enable_gpu_udmabuf";
+void CuttlefishConfig::set_enable_gpu_udmabuf(const bool enable_gpu_udmabuf) {
+ (*dictionary_)[kEnableGpuUdmabuf] = enable_gpu_udmabuf;
+}
+bool CuttlefishConfig::enable_gpu_udmabuf() const {
+ return (*dictionary_)[kEnableGpuUdmabuf].asBool();
+}
+
static constexpr char kCpus[] = "cpus";
int CuttlefishConfig::cpus() const { return (*dictionary_)[kCpus].asInt(); }
void CuttlefishConfig::set_cpus(int cpus) { (*dictionary_)[kCpus] = cpus; }
@@ -190,35 +253,6 @@
return (*dictionary_)[kCuttlefishEnvPath].asString();
}
-static AdbMode stringToAdbMode(std::string mode) {
- std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
- if (mode == "vsock_tunnel") {
- return AdbMode::VsockTunnel;
- } else if (mode == "vsock_half_tunnel") {
- return AdbMode::VsockHalfTunnel;
- } else if (mode == "native_vsock") {
- return AdbMode::NativeVsock;
- } else {
- return AdbMode::Unknown;
- }
-}
-
-static constexpr char kAdbMode[] = "adb_mode";
-std::set<AdbMode> CuttlefishConfig::adb_mode() const {
- std::set<AdbMode> args_set;
- for (auto& mode : (*dictionary_)[kAdbMode]) {
- args_set.insert(stringToAdbMode(mode.asString()));
- }
- return args_set;
-}
-void CuttlefishConfig::set_adb_mode(const std::set<std::string>& mode) {
- Json::Value mode_json_obj(Json::arrayValue);
- for (const auto& arg : mode) {
- mode_json_obj.append(arg);
- }
- (*dictionary_)[kAdbMode] = mode_json_obj;
-}
-
static SecureHal StringToSecureHal(std::string mode) {
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if (mode == "keymint") {
@@ -286,14 +320,6 @@
return (*dictionary_)[kEnableGnssGrpcProxy].asBool();
}
-static constexpr char kEnableVncServer[] = "enable_vnc_server";
-bool CuttlefishConfig::enable_vnc_server() const {
- return (*dictionary_)[kEnableVncServer].asBool();
-}
-void CuttlefishConfig::set_enable_vnc_server(bool enable_vnc_server) {
- (*dictionary_)[kEnableVncServer] = enable_vnc_server;
-}
-
static constexpr char kEnableSandbox[] = "enable_sandbox";
void CuttlefishConfig::set_enable_sandbox(const bool enable_sandbox) {
(*dictionary_)[kEnableSandbox] = enable_sandbox;
@@ -330,30 +356,6 @@
return (*dictionary_)[kEnableVehicleHalServer].asBool();
}
-static constexpr char kVehicleHalServerBinary[] = "vehicle_hal_server_binary";
-void CuttlefishConfig::set_vehicle_hal_grpc_server_binary(const std::string& vehicle_hal_server_binary) {
- (*dictionary_)[kVehicleHalServerBinary] = vehicle_hal_server_binary;
-}
-std::string CuttlefishConfig::vehicle_hal_grpc_server_binary() const {
- return (*dictionary_)[kVehicleHalServerBinary].asString();
-}
-
-static constexpr char kCustomActions[] = "custom_actions";
-void CuttlefishConfig::set_custom_actions(const std::vector<CustomActionConfig>& actions) {
- Json::Value actions_array(Json::arrayValue);
- for (const auto& action : actions) {
- actions_array.append(action.ToJson());
- }
- (*dictionary_)[kCustomActions] = actions_array;
-}
-std::vector<CustomActionConfig> CuttlefishConfig::custom_actions() const {
- std::vector<CustomActionConfig> result;
- for (Json::Value custom_action : (*dictionary_)[kCustomActions]) {
- result.push_back(CustomActionConfig(custom_action));
- }
- return result;
-}
-
static constexpr char kWebRTCAssetsDir[] = "webrtc_assets_dir";
void CuttlefishConfig::set_webrtc_assets_dir(const std::string& webrtc_assets_dir) {
(*dictionary_)[kWebRTCAssetsDir] = webrtc_assets_dir;
@@ -379,14 +381,6 @@
(*dictionary_)[kRestartSubprocesses] = restart_subprocesses;
}
-static constexpr char kRunAdbConnector[] = "run_adb_connector";
-bool CuttlefishConfig::run_adb_connector() const {
- return (*dictionary_)[kRunAdbConnector].asBool();
-}
-void CuttlefishConfig::set_run_adb_connector(bool run_adb_connector) {
- (*dictionary_)[kRunAdbConnector] = run_adb_connector;
-}
-
static constexpr char kRunAsDaemon[] = "run_as_daemon";
bool CuttlefishConfig::run_as_daemon() const {
return (*dictionary_)[kRunAsDaemon].asBool();
@@ -411,14 +405,6 @@
(*dictionary_)[kBlankDataImageMb] = blank_data_image_mb;
}
-static constexpr char kBlankDataImageFmt[] = "blank_data_image_fmt";
-std::string CuttlefishConfig::blank_data_image_fmt() const {
- return (*dictionary_)[kBlankDataImageFmt].asString();
-}
-void CuttlefishConfig::set_blank_data_image_fmt(const std::string& blank_data_image_fmt) {
- (*dictionary_)[kBlankDataImageFmt] = blank_data_image_fmt;
-}
-
static constexpr char kBootloader[] = "bootloader";
std::string CuttlefishConfig::bootloader() const {
return (*dictionary_)[kBootloader].asString();
@@ -498,6 +484,14 @@
return (*dictionary_)[kSigServerPath].asString();
}
+static constexpr char kSigServerSecure[] = "webrtc_sig_server_secure";
+void CuttlefishConfig::set_sig_server_secure(bool secure) {
+ (*dictionary_)[kSigServerSecure] = secure;
+}
+bool CuttlefishConfig::sig_server_secure() const {
+ return (*dictionary_)[kSigServerSecure].asBool();
+}
+
static constexpr char kSigServerStrict[] = "webrtc_sig_server_strict";
void CuttlefishConfig::set_sig_server_strict(bool strict) {
(*dictionary_)[kSigServerStrict] = strict;
@@ -615,7 +609,8 @@
}
static constexpr char kExtraKernelCmdline[] = "extra_kernel_cmdline";
-void CuttlefishConfig::set_extra_kernel_cmdline(std::string extra_cmdline) {
+void CuttlefishConfig::set_extra_kernel_cmdline(
+ const std::string& extra_cmdline) {
Json::Value args_json_obj(Json::arrayValue);
for (const auto& arg : android::base::Split(extra_cmdline, " ")) {
args_json_obj.append(arg);
@@ -630,6 +625,23 @@
return cmdline;
}
+static constexpr char kExtraBootconfigArgs[] = "extra_bootconfig_args";
+void CuttlefishConfig::set_extra_bootconfig_args(
+ const std::string& extra_bootconfig_args) {
+ Json::Value args_json_obj(Json::arrayValue);
+ for (const auto& arg : android::base::Split(extra_bootconfig_args, " ")) {
+ args_json_obj.append(arg);
+ }
+ (*dictionary_)[kExtraBootconfigArgs] = args_json_obj;
+}
+std::vector<std::string> CuttlefishConfig::extra_bootconfig_args() const {
+ std::vector<std::string> bootconfig;
+ for (const Json::Value& arg : (*dictionary_)[kExtraBootconfigArgs]) {
+ bootconfig.push_back(arg.asString());
+ }
+ return bootconfig;
+}
+
static constexpr char kRilDns[] = "ril_dns";
void CuttlefishConfig::set_ril_dns(const std::string& ril_dns) {
(*dictionary_)[kRilDns] = ril_dns;
@@ -690,6 +702,46 @@
return (*dictionary_)[kVhostNet].asBool();
}
+static constexpr char kVhostUserMac80211Hwsim[] = "vhost_user_mac80211_hwsim";
+void CuttlefishConfig::set_vhost_user_mac80211_hwsim(const std::string& path) {
+ (*dictionary_)[kVhostUserMac80211Hwsim] = path;
+}
+std::string CuttlefishConfig::vhost_user_mac80211_hwsim() const {
+ return (*dictionary_)[kVhostUserMac80211Hwsim].asString();
+}
+
+static constexpr char kWmediumdApiServerSocket[] = "wmediumd_api_server_socket";
+void CuttlefishConfig::set_wmediumd_api_server_socket(const std::string& path) {
+ (*dictionary_)[kWmediumdApiServerSocket] = path;
+}
+std::string CuttlefishConfig::wmediumd_api_server_socket() const {
+ return (*dictionary_)[kWmediumdApiServerSocket].asString();
+}
+
+static constexpr char kApRootfsImage[] = "ap_rootfs_image";
+std::string CuttlefishConfig::ap_rootfs_image() const {
+ return (*dictionary_)[kApRootfsImage].asString();
+}
+void CuttlefishConfig::set_ap_rootfs_image(const std::string& ap_rootfs_image) {
+ (*dictionary_)[kApRootfsImage] = ap_rootfs_image;
+}
+
+static constexpr char kApKernelImage[] = "ap_kernel_image";
+std::string CuttlefishConfig::ap_kernel_image() const {
+ return (*dictionary_)[kApKernelImage].asString();
+}
+void CuttlefishConfig::set_ap_kernel_image(const std::string& ap_kernel_image) {
+ (*dictionary_)[kApKernelImage] = ap_kernel_image;
+}
+
+static constexpr char kWmediumdConfig[] = "wmediumd_config";
+void CuttlefishConfig::set_wmediumd_config(const std::string& config) {
+ (*dictionary_)[kWmediumdConfig] = config;
+}
+std::string CuttlefishConfig::wmediumd_config() const {
+ return (*dictionary_)[kWmediumdConfig].asString();
+}
+
static constexpr char kRecordScreen[] = "record_screen";
void CuttlefishConfig::set_record_screen(bool record_screen) {
(*dictionary_)[kRecordScreen] = record_screen;
@@ -738,15 +790,29 @@
(*dictionary_)[kBootconfigSupported] = bootconfig_supported;
}
-// Creates the (initially empty) config object and populates it with values from
-// the config file if the CUTTLEFISH_CONFIG_FILE env variable is present.
-// Returns nullptr if there was an error loading from file
-/*static*/ CuttlefishConfig* CuttlefishConfig::BuildConfigImpl() {
- auto config_file_path = StringFromEnv(kCuttlefishConfigEnvVarName,
- GetGlobalConfigFileLink());
+static constexpr char kUserdataFormat[] = "userdata_format";
+std::string CuttlefishConfig::userdata_format() const {
+ return (*dictionary_)[kUserdataFormat].asString();
+}
+void CuttlefishConfig::set_userdata_format(const std::string& userdata_format) {
+ auto fmt = userdata_format;
+ std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::tolower);
+ (*dictionary_)[kUserdataFormat] = fmt;
+}
+
+static constexpr char kApImageDevPath[] = "ap_image_dev_path";
+std::string CuttlefishConfig::ap_image_dev_path() const {
+ return (*dictionary_)[kApImageDevPath].asString();
+}
+void CuttlefishConfig::set_ap_image_dev_path(const std::string& dev_path) {
+ (*dictionary_)[kApImageDevPath] = dev_path;
+}
+
+/*static*/ CuttlefishConfig* CuttlefishConfig::BuildConfigImpl(
+ const std::string& path) {
auto ret = new CuttlefishConfig();
if (ret) {
- auto loaded = ret->LoadFromFile(config_file_path.c_str());
+ auto loaded = ret->LoadFromFile(path.c_str());
if (!loaded) {
delete ret;
return nullptr;
@@ -755,8 +821,19 @@
return ret;
}
+/*static*/ std::unique_ptr<const CuttlefishConfig>
+CuttlefishConfig::GetFromFile(const std::string& path) {
+ return std::unique_ptr<const CuttlefishConfig>(BuildConfigImpl(path));
+}
+
+// Creates the (initially empty) config object and populates it with values from
+// the config file if the CUTTLEFISH_CONFIG_FILE env variable is present.
+// Returns nullptr if there was an error loading from file
/*static*/ const CuttlefishConfig* CuttlefishConfig::Get() {
- static std::shared_ptr<CuttlefishConfig> config(BuildConfigImpl());
+ auto config_file_path =
+ StringFromEnv(kCuttlefishConfigEnvVarName, GetGlobalConfigFileLink());
+ static std::shared_ptr<CuttlefishConfig> config(
+ BuildConfigImpl(config_file_path));
return config.get();
}
@@ -800,11 +877,28 @@
return !ofs.fail();
}
+std::string CuttlefishConfig::instances_dir() const {
+ return AbsolutePath(root_dir() + "/instances");
+}
+
+std::string CuttlefishConfig::InstancesPath(
+ const std::string& file_name) const {
+ return AbsolutePath(instances_dir() + "/" + file_name);
+}
+
+std::string CuttlefishConfig::assembly_dir() const {
+ return AbsolutePath(root_dir() + "/assembly");
+}
+
std::string CuttlefishConfig::AssemblyPath(
const std::string& file_name) const {
return AbsolutePath(assembly_dir() + "/" + file_name);
}
+std::string CuttlefishConfig::os_composite_disk_path() const {
+ return AssemblyPath("os_composite.img");
+}
+
CuttlefishConfig::MutableInstanceSpecific CuttlefishConfig::ForInstance(int num) {
return MutableInstanceSpecific(this, std::to_string(num));
}
@@ -813,8 +907,13 @@
return InstanceSpecific(this, std::to_string(num));
}
+CuttlefishConfig::InstanceSpecific CuttlefishConfig::ForInstanceName(
+ const std::string& name) const {
+ return ForInstance(InstanceFromString(name));
+}
+
CuttlefishConfig::InstanceSpecific CuttlefishConfig::ForDefaultInstance() const {
- return InstanceSpecific(this, std::to_string(GetInstance()));
+ return ForInstance(GetInstance());
}
std::vector<CuttlefishConfig::InstanceSpecific> CuttlefishConfig::Instances() const {
@@ -826,6 +925,39 @@
return instances;
}
+std::vector<std::string> CuttlefishConfig::instance_dirs() const {
+ std::vector<std::string> result;
+ for (const auto& instance : Instances()) {
+ result.push_back(instance.instance_dir());
+ }
+ return result;
+}
+
+static constexpr char kInstanceNames[] = "instance_names";
+void CuttlefishConfig::set_instance_names(
+ const std::vector<std::string>& instance_names) {
+ Json::Value args_json_obj(Json::arrayValue);
+ for (const auto& name : instance_names) {
+ args_json_obj.append(name);
+ }
+ (*dictionary_)[kInstanceNames] = args_json_obj;
+}
+std::vector<std::string> CuttlefishConfig::instance_names() const {
+ // NOTE: The structure of this field needs to remain stable, since
+ // cvd_server may call this on config JSON files from various builds.
+ //
+ // This info is duplicated into its own field here so it is simpler
+ // to keep stable, rather than parsing from Instances()::instance_name.
+ //
+ // Any non-stable changes must be accompanied by an uprev to the
+ // cvd_server major version.
+ std::vector<std::string> names;
+ for (const Json::Value& name : (*dictionary_)[kInstanceNames]) {
+ names.push_back(name.asString());
+ }
+ return names;
+}
+
int GetInstance() {
static int instance_id = InstanceFromEnvironment();
return instance_id;
@@ -864,7 +996,7 @@
}
std::string DefaultHostArtifactsPath(const std::string& file_name) {
- return (StringFromEnv("ANDROID_SOONG_HOST_OUT", StringFromEnv("HOME", ".")) + "/") +
+ return (StringFromEnv("ANDROID_HOST_OUT", StringFromEnv("HOME", ".")) + "/") +
file_name;
}
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index db3207e..fc38be8 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -26,7 +26,7 @@
#include <vector>
#include "common/libs/utils/environment.h"
-#include "host/libs/config/custom_actions.h"
+#include "host/libs/config/config_fragment.h"
namespace Json {
class Value;
@@ -35,13 +35,11 @@
namespace cuttlefish {
constexpr char kLogcatSerialMode[] = "serial";
constexpr char kLogcatVsockMode[] = "vsock";
-}
-
-namespace cuttlefish {
constexpr char kDefaultUuidPrefix[] = "699acfc4-c8c4-11e7-882b-5065f31dc1";
constexpr char kCuttlefishConfigEnvVarName[] = "CUTTLEFISH_CONFIG_FILE";
constexpr char kVsocUserPrefix[] = "vsoc-";
+constexpr char kCvdNamePrefix[] = "cvd-";
constexpr char kBootStartedMessage[] ="VIRTUAL_DEVICE_BOOT_STARTED";
constexpr char kBootCompletedMessage[] = "VIRTUAL_DEVICE_BOOT_COMPLETED";
constexpr char kBootFailedMessage[] = "VIRTUAL_DEVICE_BOOT_FAILED";
@@ -56,14 +54,9 @@
"VIRTUAL_DEVICE_DISPLAY_POWER_MODE_CHANGED";
constexpr char kInternalDirName[] = "internal";
constexpr char kSharedDirName[] = "shared";
+constexpr char kLogDirName[] = "logs";
constexpr char kCrosvmVarEmptyDir[] = "/var/empty";
-
-enum class AdbMode {
- VsockTunnel,
- VsockHalfTunnel,
- NativeVsock,
- Unknown,
-};
+constexpr char kKernelLoadedMessage[] = "] Linux version";
enum class SecureHal {
Unknown,
@@ -75,6 +68,8 @@
class CuttlefishConfig {
public:
static const CuttlefishConfig* Get();
+ static std::unique_ptr<const CuttlefishConfig> GetFromFile(
+ const std::string& path);
static bool ConfigExists();
CuttlefishConfig();
@@ -86,17 +81,35 @@
// processes by passing the --config_file option.
bool SaveToFile(const std::string& file) const;
- std::string assembly_dir() const;
- void set_assembly_dir(const std::string& assembly_dir);
+ bool SaveFragment(const ConfigFragment&);
+ bool LoadFragment(ConfigFragment&) const;
+ std::string root_dir() const;
+ void set_root_dir(const std::string& root_dir);
+
+ std::string instances_dir() const;
+ std::string InstancesPath(const std::string&) const;
+
+ std::string assembly_dir() const;
std::string AssemblyPath(const std::string&) const;
+ std::string os_composite_disk_path() const;
+
std::string vm_manager() const;
void set_vm_manager(const std::string& name);
std::string gpu_mode() const;
void set_gpu_mode(const std::string& name);
+ std::string gpu_capture_binary() const;
+ void set_gpu_capture_binary(const std::string&);
+
+ std::string hwcomposer() const;
+ void set_hwcomposer(const std::string&);
+
+ void set_enable_gpu_udmabuf(const bool enable_gpu_udmabuf);
+ bool enable_gpu_udmabuf() const;
+
int cpus() const;
void set_cpus(int cpus);
@@ -122,9 +135,6 @@
void set_cuttlefish_env_path(const std::string& path);
std::string cuttlefish_env_path() const;
- void set_adb_mode(const std::set<std::string>& modes);
- std::set<AdbMode> adb_mode() const;
-
void set_secure_hals(const std::set<std::string>& hals);
std::set<SecureHal> secure_hals() const;
@@ -140,9 +150,6 @@
void set_tpm_device(const std::string& tpm_device);
std::string tpm_device() const;
- void set_enable_vnc_server(bool enable_vnc_server);
- bool enable_vnc_server() const;
-
void set_enable_sandbox(const bool enable_sandbox);
bool enable_sandbox() const;
@@ -161,18 +168,9 @@
void set_enable_vehicle_hal_grpc_server(bool enable_vhal_server);
bool enable_vehicle_hal_grpc_server() const;
- void set_vehicle_hal_grpc_server_binary(const std::string& vhal_server_binary);
- std::string vehicle_hal_grpc_server_binary() const;
-
- void set_custom_actions(const std::vector<CustomActionConfig>& actions);
- std::vector<CustomActionConfig> custom_actions() const;
-
void set_restart_subprocesses(bool restart_subprocesses);
bool restart_subprocesses() const;
- void set_run_adb_connector(bool run_adb_connector);
- bool run_adb_connector() const;
-
void set_enable_gnss_grpc_proxy(const bool enable_gnss_grpc_proxy);
bool enable_gnss_grpc_proxy() const;
@@ -185,9 +183,6 @@
void set_blank_data_image_mb(int blank_data_image_mb);
int blank_data_image_mb() const;
- void set_blank_data_image_fmt(const std::string& blank_data_image_fmt);
- std::string blank_data_image_fmt() const;
-
void set_bootloader(const std::string& bootloader_path);
std::string bootloader() const;
@@ -221,9 +216,12 @@
void set_metrics_binary(const std::string& metrics_binary);
std::string metrics_binary() const;
- void set_extra_kernel_cmdline(std::string extra_cmdline);
+ void set_extra_kernel_cmdline(const std::string& extra_cmdline);
std::vector<std::string> extra_kernel_cmdline() const;
+ void set_extra_bootconfig_args(const std::string& extra_bootconfig_args);
+ std::vector<std::string> extra_bootconfig_args() const;
+
// A directory containing the SSL certificates for the signaling server
void set_webrtc_certs_dir(const std::string& certs_dir);
std::string webrtc_certs_dir() const;
@@ -250,6 +248,11 @@
void set_sig_server_path(const std::string& path);
std::string sig_server_path() const;
+ // Whether the webrtc process should use a secure connection (WSS) to the
+ // signaling server.
+ void set_sig_server_secure(bool secure);
+ bool sig_server_secure() const;
+
// Whether the webrtc process should attempt to verify the authenticity of the
// signaling server (reject self signed certificates)
void set_sig_server_strict(bool strict);
@@ -292,6 +295,21 @@
void set_vhost_net(bool vhost_net);
bool vhost_net() const;
+ void set_vhost_user_mac80211_hwsim(const std::string& path);
+ std::string vhost_user_mac80211_hwsim() const;
+
+ void set_wmediumd_api_server_socket(const std::string& path);
+ std::string wmediumd_api_server_socket() const;
+
+ void set_ap_rootfs_image(const std::string& path);
+ std::string ap_rootfs_image() const;
+
+ void set_ap_kernel_image(const std::string& path);
+ std::string ap_kernel_image() const;
+
+ void set_wmediumd_config(const std::string& path);
+ std::string wmediumd_config() const;
+
void set_record_screen(bool record_screen);
bool record_screen() const;
@@ -310,21 +328,32 @@
void set_bootconfig_supported(bool bootconfig_supported);
bool bootconfig_supported() const;
+ void set_userdata_format(const std::string& userdata_format);
+ std::string userdata_format() const;
+
+ // The path of an AP image in composite disk
+ std::string ap_image_dev_path() const;
+ void set_ap_image_dev_path(const std::string& dev_path);
+
class InstanceSpecific;
class MutableInstanceSpecific;
MutableInstanceSpecific ForInstance(int instance_num);
InstanceSpecific ForInstance(int instance_num) const;
+ InstanceSpecific ForInstanceName(const std::string& name) const;
InstanceSpecific ForDefaultInstance() const;
std::vector<InstanceSpecific> Instances() const;
+ std::vector<std::string> instance_dirs() const;
+
+ void set_instance_names(const std::vector<std::string>& instance_names);
+ std::vector<std::string> instance_names() const;
// A view into an existing CuttlefishConfig object for a particular instance.
class InstanceSpecific {
const CuttlefishConfig* config_;
std::string id_;
friend InstanceSpecific CuttlefishConfig::ForInstance(int num) const;
- friend InstanceSpecific CuttlefishConfig::ForDefaultInstance() const;
friend std::vector<InstanceSpecific> CuttlefishConfig::Instances() const;
InstanceSpecific(const CuttlefishConfig* config, const std::string& id)
@@ -337,8 +366,8 @@
// If any of the following port numbers is 0, the relevant service is not
// running on the guest.
- // Port number to connect to vnc server on the host
- int vnc_server_port() const;
+ // Port number for qemu to run a vnc server on the host
+ int qemu_vnc_server_port() const;
// Port number to connect to the tombstone receiver on the host
int tombstone_receiver_port() const;
// Port number to connect to the config server on the host
@@ -349,15 +378,14 @@
// Port number to connect to the touch server on the host. (Only
// operational if QEMU is the vmm.)
int touch_server_port() const;
- // Port number to connect to the frame server on the host. (Only
- // operational if using swiftshader as the GPU.)
- int frames_server_port() const;
// Port number to connect to the vehicle HAL server on the host
int vehicle_hal_server_port() const;
// Port number to connect to the audiocontrol server on the guest
int audiocontrol_server_port() const;
// Port number to connect to the adb server on the host
- int host_port() const;
+ int adb_host_port() const;
+ // Device-specific ID to distinguish modem simulators. Must be 4 digits.
+ int modem_simulator_host_id() const;
// Port number to connect to the gnss grpc proxy server on the host
int gnss_grpc_proxy_server_port() const;
std::string adb_ip_and_port() const;
@@ -371,7 +399,6 @@
std::string rootcanal_default_commands_file() const;
std::string adb_device_name() const;
- std::string device_title() const;
std::string gnss_file_path() const;
std::string mobile_bridge_name() const;
std::string mobile_tap_name() const;
@@ -388,6 +415,7 @@
// directory..
std::string PerInstancePath(const char* file_name) const;
std::string PerInstanceInternalPath(const char* file_name) const;
+ std::string PerInstanceLogPath(const std::string& file_name) const;
std::string instance_dir() const;
@@ -398,8 +426,7 @@
std::string switches_socket_path() const;
std::string frames_socket_path() const;
- // mock hal guest socket that will be vsock/virtio later on
- std::string confui_hal_guest_socket_path() const;
+ int confui_host_vsock_port() const;
std::string access_kregistry_path() const;
@@ -427,14 +454,10 @@
std::string sdcard_path() const;
- std::string os_composite_disk_path() const;
-
std::string persistent_composite_disk_path() const;
std::string uboot_env_image_path() const;
- std::string vendor_boot_image_path() const;
-
std::string audio_server_path() const;
// modem simulator related
@@ -447,12 +470,24 @@
// Whether this instance should start the webrtc signaling server
bool start_webrtc_sig_server() const;
+ // Whether to start a reverse proxy to the webrtc signaling server already
+ // running in the host
+ bool start_webrtc_sig_server_proxy() const;
+
+ // Whether this instance should start the wmediumd process
+ bool start_wmediumd() const;
+
+ // Whether this instance should start an ap instance
+ bool start_ap() const;
+
// Wifi MAC address inside the guest
- std::array<unsigned char, 6> wifi_mac_address() const;
+ int wifi_mac_prefix() const;
std::string factory_reset_protected_path() const;
std::string persistent_bootconfig_path() const;
+
+ std::string id() const;
};
// A view into an existing CuttlefishConfig object for a particular instance.
@@ -461,13 +496,12 @@
std::string id_;
friend MutableInstanceSpecific CuttlefishConfig::ForInstance(int num);
- MutableInstanceSpecific(CuttlefishConfig* config, const std::string& id)
- : config_(config), id_(id) {}
+ MutableInstanceSpecific(CuttlefishConfig* config, const std::string& id);
Json::Value* Dictionary();
public:
void set_serial_number(const std::string& serial_number);
- void set_vnc_server_port(int vnc_server_port);
+ void set_qemu_vnc_server_port(int qemu_vnc_server_port);
void set_tombstone_receiver_port(int tombstone_receiver_port);
void set_config_server_port(int config_server_port);
void set_frames_server_port(int config_server_port);
@@ -477,8 +511,10 @@
void set_keymaster_vsock_port(int keymaster_vsock_port);
void set_vehicle_hal_server_port(int vehicle_server_port);
void set_audiocontrol_server_port(int audiocontrol_server_port);
- void set_host_port(int host_port);
+ void set_adb_host_port(int adb_host_port);
+ void set_modem_simulator_host_id(int modem_simulator_id);
void set_adb_ip_and_port(const std::string& ip_port);
+ void set_confui_host_vsock_port(int confui_host_port);
void set_rootcanal_hci_port(int rootcanal_hci_port);
void set_rootcanal_link_port(int rootcanal_link_port);
void set_rootcanal_test_port(int rootcanal_test_port);
@@ -486,7 +522,6 @@
void set_rootcanal_config_file(const std::string& rootcanal_config_file);
void set_rootcanal_default_commands_file(
const std::string& rootcanal_default_commands_file);
- void set_device_title(const std::string& title);
void set_mobile_bridge_name(const std::string& mobile_bridge_name);
void set_mobile_tap_name(const std::string& mobile_tap_name);
void set_wifi_tap_name(const std::string& wifi_tap_name);
@@ -495,14 +530,16 @@
void set_use_allocd(bool use_allocd);
void set_vsock_guest_cid(int vsock_guest_cid);
void set_uuid(const std::string& uuid);
- void set_instance_dir(const std::string& instance_dir);
// modem simulator related
void set_modem_simulator_ports(const std::string& modem_simulator_ports);
void set_virtual_disk_paths(const std::vector<std::string>& disk_paths);
void set_webrtc_device_id(const std::string& id);
void set_start_webrtc_signaling_server(bool start);
+ void set_start_webrtc_sig_server_proxy(bool start);
+ void set_start_wmediumd(bool start);
+ void set_start_ap(bool start);
// Wifi MAC address inside the guest
- void set_wifi_mac_address(const std::array<unsigned char, 6>&);
+ void set_wifi_mac_prefix(const int wifi_mac_prefix);
// Gnss grpc proxy server port inside the host
void set_gnss_grpc_proxy_server_port(int gnss_grpc_proxy_server_port);
// Gnss grpc proxy local file path
@@ -514,7 +551,7 @@
void SetPath(const std::string& key, const std::string& path);
bool LoadFromFile(const char* file);
- static CuttlefishConfig* BuildConfigImpl();
+ static CuttlefishConfig* BuildConfigImpl(const std::string& path);
CuttlefishConfig(const CuttlefishConfig&) = delete;
CuttlefishConfig& operator=(const CuttlefishConfig&) = delete;
@@ -561,4 +598,9 @@
extern const char* const kGpuModeGuestSwiftshader;
extern const char* const kGpuModeDrmVirgl;
extern const char* const kGpuModeGfxStream;
+
+// HwComposer modes
+extern const char* const kHwComposerAuto;
+extern const char* const kHwComposerDrmMinigbm;
+extern const char* const kHwComposerRanchu;
} // namespace cuttlefish
diff --git a/host/libs/config/cuttlefish_config_instance.cpp b/host/libs/config/cuttlefish_config_instance.cpp
index 14e7037..518a6e1 100644
--- a/host/libs/config/cuttlefish_config_instance.cpp
+++ b/host/libs/config/cuttlefish_config_instance.cpp
@@ -26,8 +26,18 @@
const char* kInstances = "instances";
+std::string IdToName(const std::string& id) { return kCvdNamePrefix + id; }
+
} // namespace
+static constexpr char kInstanceDir[] = "instance_dir";
+CuttlefishConfig::MutableInstanceSpecific::MutableInstanceSpecific(
+ CuttlefishConfig* config, const std::string& id)
+ : config_(config), id_(id) {
+ // Legacy for acloud
+ (*Dictionary())[kInstanceDir] = config_->InstancesPath(IdToName(id));
+}
+
Json::Value* CuttlefishConfig::MutableInstanceSpecific::Dictionary() {
return &(*config_->dictionary_)[kInstances][id_];
}
@@ -36,13 +46,8 @@
return &(*config_->dictionary_)[kInstances][id_];
}
-static constexpr char kInstanceDir[] = "instance_dir";
std::string CuttlefishConfig::InstanceSpecific::instance_dir() const {
- return (*Dictionary())[kInstanceDir].asString();
-}
-void CuttlefishConfig::MutableInstanceSpecific::set_instance_dir(
- const std::string& instance_dir) {
- (*Dictionary())[kInstanceDir] = instance_dir;
+ return config_->InstancesPath(IdToName(id_));
}
std::string CuttlefishConfig::InstanceSpecific::instance_internal_dir() const {
@@ -140,7 +145,7 @@
}
std::string CuttlefishConfig::InstanceSpecific::logcat_path() const {
- return AbsolutePath(PerInstancePath("logcat"));
+ return AbsolutePath(PerInstanceLogPath("logcat"));
}
std::string CuttlefishConfig::InstanceSpecific::launcher_monitor_socket_path()
@@ -158,17 +163,13 @@
}
std::string CuttlefishConfig::InstanceSpecific::launcher_log_path() const {
- return AbsolutePath(PerInstancePath("launcher.log"));
+ return AbsolutePath(PerInstanceLogPath("launcher.log"));
}
std::string CuttlefishConfig::InstanceSpecific::sdcard_path() const {
return AbsolutePath(PerInstancePath("sdcard.img"));
}
-std::string CuttlefishConfig::InstanceSpecific::os_composite_disk_path() const {
- return AbsolutePath(PerInstancePath("os_composite.img"));
-}
-
std::string CuttlefishConfig::InstanceSpecific::persistent_composite_disk_path()
const {
return AbsolutePath(PerInstancePath("persistent_composite.img"));
@@ -178,10 +179,6 @@
return AbsolutePath(PerInstancePath("uboot_env.img"));
}
-std::string CuttlefishConfig::InstanceSpecific::vendor_boot_image_path() const {
- return AbsolutePath(PerInstancePath("vendor_boot_repacked.img"));
-}
-
static constexpr char kMobileBridgeName[] = "mobile_bridge_name";
std::string CuttlefishConfig::InstanceSpecific::audio_server_path() const {
@@ -205,9 +202,14 @@
(*Dictionary())[kMobileTapName] = mobile_tap_name;
}
-std::string CuttlefishConfig::InstanceSpecific::confui_hal_guest_socket_path()
- const {
- return PerInstanceInternalPath("confui_mock_hal_guest.sock");
+static constexpr char kConfUiHostPort[] = "confirmation_ui_host_port";
+int CuttlefishConfig::InstanceSpecific::confui_host_vsock_port() const {
+ return (*Dictionary())[kConfUiHostPort].asInt();
+}
+
+void CuttlefishConfig::MutableInstanceSpecific::set_confui_host_vsock_port(
+ int port) {
+ (*Dictionary())[kConfUiHostPort] = port;
}
static constexpr char kWifiTapName[] = "wifi_tap_name";
@@ -263,12 +265,21 @@
(*Dictionary())[kUuid] = uuid;
}
-static constexpr char kHostPort[] = "host_port";
-int CuttlefishConfig::InstanceSpecific::host_port() const {
+static constexpr char kHostPort[] = "adb_host_port";
+int CuttlefishConfig::InstanceSpecific::adb_host_port() const {
return (*Dictionary())[kHostPort].asInt();
}
-void CuttlefishConfig::MutableInstanceSpecific::set_host_port(int host_port) {
- (*Dictionary())[kHostPort] = host_port;
+void CuttlefishConfig::MutableInstanceSpecific::set_adb_host_port(int port) {
+ (*Dictionary())[kHostPort] = port;
+}
+
+static constexpr char kModemSimulatorId[] = "modem_simulator_host_id";
+int CuttlefishConfig::InstanceSpecific::modem_simulator_host_id() const {
+ return (*Dictionary())[kModemSimulatorId].asInt();
+}
+void CuttlefishConfig::MutableInstanceSpecific::set_modem_simulator_host_id(
+ int id) {
+ (*Dictionary())[kModemSimulatorId] = id;
}
static constexpr char kAdbIPAndPort[] = "adb_ip_and_port";
@@ -288,29 +299,13 @@
return "NO_ADB_MODE_SET_NO_VALID_DEVICE_NAME";
}
-static constexpr char kDeviceTitle[] = "device_title";
-std::string CuttlefishConfig::InstanceSpecific::device_title() const {
- return (*Dictionary())[kDeviceTitle].asString();
+static constexpr char kQemuVncServerPort[] = "qemu_vnc_server_port";
+int CuttlefishConfig::InstanceSpecific::qemu_vnc_server_port() const {
+ return (*Dictionary())[kQemuVncServerPort].asInt();
}
-void CuttlefishConfig::MutableInstanceSpecific::set_device_title(
- const std::string& title) {
- (*Dictionary())[kDeviceTitle] = title;
-}
-
-static constexpr char kVncServerPort[] = "vnc_server_port";
-int CuttlefishConfig::InstanceSpecific::vnc_server_port() const {
- return (*Dictionary())[kVncServerPort].asInt();
-}
-void CuttlefishConfig::MutableInstanceSpecific::set_vnc_server_port(int vnc_server_port) {
- (*Dictionary())[kVncServerPort] = vnc_server_port;
-}
-
-static constexpr char kFramesServerPort[] = "frames_server_port";
-int CuttlefishConfig::InstanceSpecific::frames_server_port() const {
- return (*Dictionary())[kFramesServerPort].asInt();
-}
-void CuttlefishConfig::MutableInstanceSpecific::set_frames_server_port(int frames_server_port) {
- (*Dictionary())[kFramesServerPort] = frames_server_port;
+void CuttlefishConfig::MutableInstanceSpecific::set_qemu_vnc_server_port(
+ int qemu_vnc_server_port) {
+ (*Dictionary())[kQemuVncServerPort] = qemu_vnc_server_port;
}
static constexpr char kTouchServerPort[] = "touch_server_port";
@@ -438,6 +433,31 @@
return (*Dictionary())[kStartSigServer].asBool();
}
+static constexpr char kStartSigServerProxy[] = "webrtc_start_sig_server_proxy";
+void CuttlefishConfig::MutableInstanceSpecific::
+ set_start_webrtc_sig_server_proxy(bool start) {
+ (*Dictionary())[kStartSigServerProxy] = start;
+}
+bool CuttlefishConfig::InstanceSpecific::start_webrtc_sig_server_proxy() const {
+ return (*Dictionary())[kStartSigServerProxy].asBool();
+}
+
+static constexpr char kStartWmediumd[] = "start_wmediumd";
+void CuttlefishConfig::MutableInstanceSpecific::set_start_wmediumd(bool start) {
+ (*Dictionary())[kStartWmediumd] = start;
+}
+bool CuttlefishConfig::InstanceSpecific::start_wmediumd() const {
+ return (*Dictionary())[kStartWmediumd].asBool();
+}
+
+static constexpr char kStartAp[] = "start_ap";
+void CuttlefishConfig::MutableInstanceSpecific::set_start_ap(bool start) {
+ (*Dictionary())[kStartAp] = start;
+}
+bool CuttlefishConfig::InstanceSpecific::start_ap() const {
+ return (*Dictionary())[kStartAp].asBool();
+}
+
std::string CuttlefishConfig::InstanceSpecific::touch_socket_path(
int screen_idx) const {
return PerInstanceInternalPath(
@@ -456,26 +476,13 @@
return PerInstanceInternalPath("frames.sock");
}
-static constexpr char kWifiMacAddress[] = "wifi_mac_address";
-void CuttlefishConfig::MutableInstanceSpecific::set_wifi_mac_address(
- const std::array<unsigned char, 6>& mac_address) {
- Json::Value mac_address_obj(Json::arrayValue);
- for (const auto& num : mac_address) {
- mac_address_obj.append(num);
- }
- (*Dictionary())[kWifiMacAddress] = mac_address_obj;
+static constexpr char kWifiMacPrefix[] = "wifi_mac_prefix";
+int CuttlefishConfig::InstanceSpecific::wifi_mac_prefix() const {
+ return (*Dictionary())[kWifiMacPrefix].asInt();
}
-std::array<unsigned char, 6> CuttlefishConfig::InstanceSpecific::wifi_mac_address() const {
- std::array<unsigned char, 6> mac_address{0, 0, 0, 0, 0, 0};
- auto mac_address_obj = (*Dictionary())[kWifiMacAddress];
- if (mac_address_obj.size() != 6) {
- LOG(ERROR) << kWifiMacAddress << " entry had wrong size";
- return {};
- }
- for (int i = 0; i < 6; i++) {
- mac_address[i] = mac_address_obj[i].asInt();
- }
- return mac_address;
+void CuttlefishConfig::MutableInstanceSpecific::set_wifi_mac_prefix(
+ int wifi_mac_prefix) {
+ (*Dictionary())[kWifiMacPrefix] = wifi_mac_prefix;
}
std::string CuttlefishConfig::InstanceSpecific::factory_reset_protected_path() const {
@@ -502,8 +509,20 @@
return PerInstancePath(relative_path.c_str());
}
-std::string CuttlefishConfig::InstanceSpecific::instance_name() const {
- return "cvd-" + id_;
+std::string CuttlefishConfig::InstanceSpecific::PerInstanceLogPath(
+ const std::string& file_name) const {
+ if (file_name.size() == 0) {
+ // Don't append a / if file_name is empty.
+ return PerInstancePath(kLogDirName);
+ }
+ auto relative_path = (std::string(kLogDirName) + "/") + file_name;
+ return PerInstancePath(relative_path.c_str());
}
+std::string CuttlefishConfig::InstanceSpecific::instance_name() const {
+ return IdToName(id_);
+}
+
+std::string CuttlefishConfig::InstanceSpecific::id() const { return id_; }
+
} // namespace cuttlefish
diff --git a/host/libs/config/data_image.cpp b/host/libs/config/data_image.cpp
index 044dadb..52992e6 100644
--- a/host/libs/config/data_image.cpp
+++ b/host/libs/config/data_image.cpp
@@ -1,14 +1,18 @@
#include "host/libs/config/data_image.h"
#include <android-base/logging.h>
+#include <android-base/result.h>
+
+#include "blkid.h"
#include "common/libs/fs/shared_buf.h"
-
#include "common/libs/utils/files.h"
#include "common/libs/utils/subprocess.h"
-
#include "host/libs/config/mbr.h"
+using android::base::Error;
+using android::base::Result;
+
namespace cuttlefish {
namespace {
@@ -20,18 +24,71 @@
const int FSCK_ERROR_CORRECTED = 1;
const int FSCK_ERROR_CORRECTED_REQUIRES_REBOOT = 2;
-bool ForceFsckImage(const char* data_image) {
- auto fsck_path = HostBinaryPath("fsck.f2fs");
+// Currently the Cuttlefish bootloaders are built only for x86 (32-bit),
+// ARM (QEMU only, 32-bit) and AArch64 (64-bit), and U-Boot will hard-code
+// these search paths. Install all bootloaders to one of these paths.
+// NOTE: For now, just ignore the 32-bit ARM version, as Debian doesn't
+// build an EFI monolith for this architecture.
+const std::string kBootPathIA32 = "EFI/BOOT/BOOTIA32.EFI";
+const std::string kBootPathAA64 = "EFI/BOOT/BOOTAA64.EFI";
+
+// These are the paths Debian installs the monoliths to. If another distro
+// uses an alternative monolith path, add it to this table
+const std::pair<std::string, std::string> kGrubBlobTable[] = {
+ {"/usr/lib/grub/i386-efi/monolithic/grubia32.efi", kBootPathIA32},
+ {"/usr/lib/grub/arm64-efi/monolithic/grubaa64.efi", kBootPathAA64},
+};
+
+bool ForceFsckImage(const CuttlefishConfig& config,
+ const std::string& data_image) {
+ std::string fsck_path;
+ if (config.userdata_format() == "f2fs") {
+ fsck_path = HostBinaryPath("fsck.f2fs");
+ } else if (config.userdata_format() == "ext4") {
+ fsck_path = "/sbin/e2fsck";
+ }
int fsck_status = execute({fsck_path, "-y", "-f", data_image});
if (fsck_status & ~(FSCK_ERROR_CORRECTED|FSCK_ERROR_CORRECTED_REQUIRES_REBOOT)) {
- LOG(ERROR) << "`fsck.f2fs -y -f " << data_image << "` failed with code "
+ LOG(ERROR) << "`" << fsck_path << " -y -f " << data_image << "` failed with code "
<< fsck_status;
return false;
}
return true;
}
-bool ResizeImage(const char* data_image, int data_image_mb) {
+bool NewfsMsdos(const std::string& data_image, int data_image_mb,
+ int offset_num_mb) {
+ off_t image_size_bytes = static_cast<off_t>(data_image_mb) << 20;
+ off_t offset_size_bytes = static_cast<off_t>(offset_num_mb) << 20;
+ image_size_bytes -= offset_size_bytes;
+ off_t image_size_sectors = image_size_bytes / 512;
+ auto newfs_msdos_path = HostBinaryPath("newfs_msdos");
+ return execute({newfs_msdos_path,
+ "-F",
+ "32",
+ "-m",
+ "0xf8",
+ "-o",
+ "0",
+ "-c",
+ "8",
+ "-h",
+ "255",
+ "-u",
+ "63",
+ "-S",
+ "512",
+ "-s",
+ std::to_string(image_size_sectors),
+ "-C",
+ std::to_string(data_image_mb) + "M",
+ "-@",
+ std::to_string(offset_size_bytes),
+ data_image}) == 0;
+}
+
+bool ResizeImage(const CuttlefishConfig& config, const std::string& data_image,
+ int data_image_mb) {
auto file_mb = FileSize(data_image) >> 20;
if (file_mb > data_image_mb) {
LOG(ERROR) << data_image << " is already " << file_mb << " MB, will not "
@@ -48,18 +105,23 @@
<< data_image << "` failed:" << fd->StrError();
return false;
}
- bool fsck_success = ForceFsckImage(data_image);
+ bool fsck_success = ForceFsckImage(config, data_image);
if (!fsck_success) {
return false;
}
- auto resize_path = HostBinaryPath("resize.f2fs");
+ std::string resize_path;
+ if (config.userdata_format() == "f2fs") {
+ resize_path = HostBinaryPath("resize.f2fs");
+ } else if (config.userdata_format() == "ext4") {
+ resize_path = "/sbin/resize2fs";
+ }
int resize_status = execute({resize_path, data_image});
if (resize_status != 0) {
- LOG(ERROR) << "`resize.f2fs " << data_image << "` failed with code "
+ LOG(ERROR) << "`" << resize_path << " " << data_image << "` failed with code "
<< resize_status;
return false;
}
- fsck_success = ForceFsckImage(data_image);
+ fsck_success = ForceFsckImage(config, data_image);
if (!fsck_success) {
return false;
}
@@ -68,7 +130,7 @@
}
} // namespace
-void CreateBlankImage(
+bool CreateBlankImage(
const std::string& image, int num_mb, const std::string& image_fmt) {
LOG(DEBUG) << "Creating " << image;
@@ -80,124 +142,405 @@
if (fd->Truncate(image_size_bytes) != 0) {
LOG(ERROR) << "`truncate --size=" << num_mb << "M " << image
<< "` failed:" << fd->StrError();
- return;
+ return false;
}
}
if (image_fmt == "ext4") {
- execute({"/sbin/mkfs.ext4", image});
+ if (execute({"/sbin/mkfs.ext4", image}) != 0) {
+ return false;
+ }
} else if (image_fmt == "f2fs") {
auto make_f2fs_path = cuttlefish::HostBinaryPath("make_f2fs");
- execute({make_f2fs_path, "-t", image_fmt, image, "-C", "utf8", "-O",
- "compression,extra_attr,prjquota", "-g", "android"});
+ if (execute({make_f2fs_path, "-t", image_fmt, image, "-C", "utf8", "-O",
+ "compression,extra_attr,project_quota", "-g", "android"}) != 0) {
+ return false;
+ }
} else if (image_fmt == "sdcard") {
// Reserve 1MB in the image for the MBR and padding, to simulate what
// other OSes do by default when partitioning a drive
off_t offset_size_bytes = 1 << 20;
image_size_bytes -= offset_size_bytes;
- off_t image_size_sectors = image_size_bytes / 512;
- auto newfs_msdos_path = HostBinaryPath("newfs_msdos");
- execute({newfs_msdos_path, "-F", "32", "-m", "0xf8", "-a", "4088",
- "-o", "0", "-c", "8", "-h", "255",
- "-u", "63", "-S", "512",
- "-s", std::to_string(image_size_sectors),
- "-C", std::to_string(num_mb) + "M",
- "-@", std::to_string(offset_size_bytes),
- image});
+ if (!NewfsMsdos(image, num_mb, 1)) {
+ LOG(ERROR) << "Failed to create SD-Card filesystem";
+ return false;
+ }
// Write the MBR after the filesystem is formatted, as the formatting tools
// don't consistently preserve the image contents
MasterBootRecord mbr = {
- .partitions = {{
- .partition_type = 0xC,
- .first_lba = (std::uint32_t) offset_size_bytes / SECTOR_SIZE,
- .num_sectors = (std::uint32_t) image_size_bytes / SECTOR_SIZE,
- }},
- .boot_signature = { 0x55, 0xAA },
+ .partitions = {{
+ .partition_type = 0xC,
+ .first_lba = (std::uint32_t) offset_size_bytes / SECTOR_SIZE,
+ .num_sectors = (std::uint32_t) image_size_bytes / SECTOR_SIZE,
+ }},
+ .boot_signature = {0x55, 0xAA},
};
auto fd = SharedFD::Open(image, O_RDWR);
if (WriteAllBinary(fd, &mbr) != sizeof(MasterBootRecord)) {
LOG(ERROR) << "Writing MBR to " << image << " failed:" << fd->StrError();
- return;
+ return false;
}
} else if (image_fmt != "none") {
LOG(WARNING) << "Unknown image format '" << image_fmt
<< "' for " << image << ", treating as 'none'.";
}
+ return true;
}
-DataImageResult ApplyDataImagePolicy(const CuttlefishConfig& config,
- const std::string& data_image) {
- bool data_exists = FileHasContent(data_image.c_str());
- bool remove{};
- bool create{};
- bool resize{};
-
- if (config.data_policy() == kDataPolicyUseExisting) {
- if (!data_exists) {
- LOG(ERROR) << "Specified data image file does not exists: " << data_image;
- return DataImageResult::Error;
- }
- if (config.blank_data_image_mb() > 0) {
- LOG(ERROR) << "You should NOT use -blank_data_image_mb with -data_policy="
- << kDataPolicyUseExisting;
- return DataImageResult::Error;
- }
- create = false;
- remove = false;
- resize = false;
- } else if (config.data_policy() == kDataPolicyAlwaysCreate) {
- remove = data_exists;
- create = true;
- resize = false;
- } else if (config.data_policy() == kDataPolicyCreateIfMissing) {
- create = !data_exists;
- remove = false;
- resize = false;
- } else if (config.data_policy() == kDataPolicyResizeUpTo) {
- create = false;
- remove = false;
- resize = true;
- } else {
- LOG(ERROR) << "Invalid data_policy: " << config.data_policy();
- return DataImageResult::Error;
+std::string GetFsType(const std::string& path) {
+ std::string fs_type;
+ blkid_cache cache;
+ if (blkid_get_cache(&cache, NULL) < 0) {
+ LOG(INFO) << "blkid_get_cache failed";
+ return fs_type;
+ }
+ blkid_dev dev = blkid_get_dev(cache, path.c_str(), BLKID_DEV_NORMAL);
+ if (!dev) {
+ LOG(INFO) << "blkid_get_dev failed";
+ blkid_put_cache(cache);
+ return fs_type;
}
- if (remove) {
- RemoveFile(data_image.c_str());
- }
-
- if (create) {
- if (config.blank_data_image_mb() <= 0) {
- LOG(ERROR) << "-blank_data_image_mb is required to create data image";
- return DataImageResult::Error;
+ const char *type, *value;
+ blkid_tag_iterate iter = blkid_tag_iterate_begin(dev);
+ while (blkid_tag_next(iter, &type, &value) == 0) {
+ if (!strcmp(type, "TYPE")) {
+ fs_type = value;
}
- CreateBlankImage(data_image.c_str(), config.blank_data_image_mb(),
- config.blank_data_image_fmt());
- return DataImageResult::FileUpdated;
- } else if (resize) {
- if (!data_exists) {
- LOG(ERROR) << data_image << " does not exist, but resizing was requested";
- return DataImageResult::Error;
- }
- bool success = ResizeImage(data_image.c_str(), config.blank_data_image_mb());
- return success ? DataImageResult::FileUpdated : DataImageResult::Error;
- } else {
- LOG(DEBUG) << data_image << " exists. Not creating it.";
- return DataImageResult::NoChange;
}
+ blkid_tag_iterate_end(iter);
+ blkid_put_cache(cache);
+ return fs_type;
}
-bool InitializeMiscImage(const std::string& misc_image) {
- bool misc_exists = FileHasContent(misc_image.c_str());
+struct DataImageTag {};
- if (misc_exists) {
- LOG(DEBUG) << "misc partition image: use existing";
+class FixedDataImagePath : public DataImagePath {
+ public:
+ INJECT(FixedDataImagePath(ANNOTATED(DataImageTag, std::string) path))
+ : path_(path) {}
+
+ const std::string& Path() const override { return path_; }
+
+ private:
+ std::string path_;
+};
+
+fruit::Component<DataImagePath> FixedDataImagePathComponent(
+ const std::string* path) {
+ return fruit::createComponent()
+ .bind<DataImagePath, FixedDataImagePath>()
+ .bindInstance<fruit::Annotated<DataImageTag, std::string>>(*path);
+}
+
+class InitializeDataImageImpl : public InitializeDataImage {
+ public:
+ INJECT(InitializeDataImageImpl(const CuttlefishConfig& config,
+ DataImagePath& data_path))
+ : config_(config), data_path_(data_path) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeDataImageImpl"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ auto action = ChooseAction();
+ if (!action.ok()) {
+ LOG(ERROR) << "Failed to select a userdata processing action: "
+ << action.error();
+ return false;
+ }
+ auto result = EvaluateAction(*action);
+ if (!result.ok()) {
+ LOG(ERROR) << "Failed to evaluate userdata action: " << result.error();
+ return false;
+ }
return true;
}
- LOG(DEBUG) << "misc partition image: creating empty";
- CreateBlankImage(misc_image, 1 /* mb */, "none");
- return true;
+ private:
+ enum class DataImageAction { kNoAction, kCreateImage, kResizeImage };
+
+ Result<DataImageAction> ChooseAction() {
+ if (config_.data_policy() == kDataPolicyAlwaysCreate) {
+ return DataImageAction::kCreateImage;
+ }
+ if (!FileHasContent(data_path_.Path())) {
+ if (config_.data_policy() == kDataPolicyUseExisting) {
+ return Error() << "A data image must exist to use -data_policy="
+ << kDataPolicyUseExisting;
+ } else if (config_.data_policy() == kDataPolicyResizeUpTo) {
+ return Error() << data_path_.Path()
+ << " does not exist, but resizing was requested";
+ }
+ return DataImageAction::kCreateImage;
+ }
+ if (GetFsType(data_path_.Path()) != config_.userdata_format()) {
+ if (config_.data_policy() == kDataPolicyResizeUpTo) {
+ return Error()
+ << "Changing the fs format is incompatible with -data_policy="
+ << kDataPolicyResizeUpTo;
+ }
+ return DataImageAction::kCreateImage;
+ }
+ if (config_.data_policy() == kDataPolicyResizeUpTo) {
+ return DataImageAction::kResizeImage;
+ }
+ return DataImageAction::kNoAction;
+ }
+
+ Result<void> EvaluateAction(DataImageAction action) {
+ switch (action) {
+ case DataImageAction::kNoAction:
+ LOG(DEBUG) << data_path_.Path() << " exists. Not creating it.";
+ return {};
+ case DataImageAction::kCreateImage: {
+ RemoveFile(data_path_.Path());
+ if (config_.blank_data_image_mb() == 0) {
+ return Error() << "Expected `-blank_data_image_mb` to be set for "
+ << "image creation.";
+ }
+ bool success =
+ CreateBlankImage(data_path_.Path(), config_.blank_data_image_mb(),
+ config_.userdata_format());
+ if (!success) {
+ return Error() << "Failed to create a blank image at \""
+ << data_path_.Path() << "\" with size "
+ << config_.blank_data_image_mb() << " and format \""
+ << config_.userdata_format() << "\"";
+ }
+ return {};
+ }
+ case DataImageAction::kResizeImage: {
+ if (config_.blank_data_image_mb() == 0) {
+ return Error() << "Expected `-blank_data_image_mb` to be set for "
+ << "image resizing.";
+ }
+ bool success = ResizeImage(config_, data_path_.Path(),
+ config_.blank_data_image_mb());
+ if (!success) {
+ return Error() << "Failed to resize \"" << data_path_.Path()
+ << "\" to " << config_.blank_data_image_mb() << " MB";
+ }
+ return {};
+ }
+ }
+ }
+
+ const CuttlefishConfig& config_;
+ DataImagePath& data_path_;
+};
+
+fruit::Component<fruit::Required<const CuttlefishConfig, DataImagePath>,
+ InitializeDataImage>
+InitializeDataImageComponent() {
+ return fruit::createComponent()
+ .addMultibinding<Feature, InitializeDataImage>()
+ .bind<InitializeDataImage, InitializeDataImageImpl>();
+}
+
+struct MiscImageTag {};
+
+class FixedMiscImagePath : public MiscImagePath {
+ public:
+ INJECT(FixedMiscImagePath(ANNOTATED(MiscImageTag, std::string) path))
+ : path_(path) {}
+
+ const std::string& Path() const override { return path_; }
+
+ private:
+ std::string path_;
+};
+
+class InitializeMiscImageImpl : public InitializeMiscImage {
+ public:
+ INJECT(InitializeMiscImageImpl(MiscImagePath& misc_path))
+ : misc_path_(misc_path) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeMiscImageImpl"; }
+ bool Enabled() const override { return true; }
+
+ private:
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Setup() override {
+ bool misc_exists = FileHasContent(misc_path_.Path());
+
+ if (misc_exists) {
+ LOG(DEBUG) << "misc partition image: use existing at \""
+ << misc_path_.Path() << "\"";
+ return true;
+ }
+
+ LOG(DEBUG) << "misc partition image: creating empty at \""
+ << misc_path_.Path() << "\"";
+ if (!CreateBlankImage(misc_path_.Path(), 1 /* mb */, "none")) {
+ LOG(ERROR) << "Failed to create misc image";
+ return false;
+ }
+ return true;
+ }
+
+ private:
+ MiscImagePath& misc_path_;
+};
+
+fruit::Component<MiscImagePath> FixedMiscImagePathComponent(
+ const std::string* path) {
+ return fruit::createComponent()
+ .bind<MiscImagePath, FixedMiscImagePath>()
+ .bindInstance<fruit::Annotated<MiscImageTag, std::string>>(*path);
+}
+
+fruit::Component<fruit::Required<MiscImagePath>, InitializeMiscImage>
+InitializeMiscImageComponent() {
+ return fruit::createComponent()
+ .addMultibinding<Feature, InitializeMiscImage>()
+ .bind<InitializeMiscImage, InitializeMiscImageImpl>();
+}
+
+struct EspImageTag {};
+struct KernelPathTag {};
+struct InitRamFsTag {};
+struct RootFsTag {};
+
+class InitializeEspImageImpl : public InitializeEspImage {
+ public:
+ INJECT(InitializeEspImageImpl(ANNOTATED(EspImageTag, std::string) esp_image,
+ ANNOTATED(KernelPathTag, std::string)
+ kernel_path,
+ ANNOTATED(InitRamFsTag, std::string)
+ initramfs_path,
+ ANNOTATED(RootFsTag, std::string) rootfs_path))
+ : esp_image_(esp_image),
+ kernel_path_(kernel_path),
+ initramfs_path_(initramfs_path),
+ rootfs_path_(rootfs_path) {}
+
+ // Feature
+ std::string Name() const override { return "InitializeEspImageImpl"; }
+ std::unordered_set<Feature*> Dependencies() const override { return {}; }
+ bool Enabled() const override { return !rootfs_path_.empty(); }
+
+ protected:
+ bool Setup() override {
+ bool esp_exists = FileHasContent(esp_image_);
+ if (esp_exists) {
+ LOG(DEBUG) << "esp partition image: use existing";
+ return true;
+ }
+
+ LOG(DEBUG) << "esp partition image: creating default";
+
+ // newfs_msdos won't make a partition smaller than 257 mb
+ // this should be enough for anybody..
+ auto tmp_esp_image = esp_image_ + ".tmp";
+ if (!NewfsMsdos(tmp_esp_image, 257 /* mb */, 0 /* mb (offset) */)) {
+ LOG(ERROR) << "Failed to create filesystem for " << tmp_esp_image;
+ return false;
+ }
+
+ // For licensing and build reproducibility reasons, pick up the bootloaders
+ // from the host Linux distribution (if present) and pack them into the
+ // automatically generated ESP. If the user wants their own bootloaders,
+ // they can use -esp_image=/path/to/esp.img to override, so we don't need
+ // to accommodate customizations of this packing process.
+
+ // Currently we only support Debian based distributions, and GRUB is built
+ // for those distros to always load grub.cfg from EFI/debian/grub.cfg, and
+ // nowhere else. If you want to add support for other distros, make the
+ // extra directories below and copy the initial grub.cfg there as well
+ auto mmd = HostBinaryPath("mmd");
+ auto success =
+ execute({mmd, "-i", tmp_esp_image, "EFI", "EFI/BOOT", "EFI/debian"});
+ if (success != 0) {
+ LOG(ERROR) << "Failed to create directories in " << tmp_esp_image;
+ return false;
+ }
+
+ // The grub binaries are small, so just copy all the architecture blobs
+ // we can find, which minimizes complexity. If the user removed the grub bin
+ // package from their system, the ESP will be empty and Other OS will not be
+ // supported
+ auto mcopy = HostBinaryPath("mcopy");
+ bool copied = false;
+ for (auto grub : kGrubBlobTable) {
+ if (!FileExists(grub.first)) {
+ continue;
+ }
+ success = execute({mcopy, "-o", "-i", tmp_esp_image, "-s", grub.first,
+ "::" + grub.second});
+ if (success != 0) {
+ LOG(ERROR) << "Failed to copy " << grub.first << " to " << grub.second
+ << " in " << tmp_esp_image;
+ return false;
+ }
+ copied = true;
+ }
+
+ if (!copied) {
+ LOG(ERROR) << "No GRUB binaries were found on this system; Other OS "
+ "support will be broken";
+ return false;
+ }
+
+ auto grub_cfg = DefaultHostArtifactsPath("etc/grub/grub.cfg");
+ CHECK(FileExists(grub_cfg)) << "Missing file " << grub_cfg << "!";
+ success =
+ execute({mcopy, "-i", tmp_esp_image, "-s", grub_cfg, "::EFI/debian/"});
+ if (success != 0) {
+ LOG(ERROR) << "Failed to copy " << grub_cfg << " to " << tmp_esp_image;
+ return false;
+ }
+
+ if (!kernel_path_.empty()) {
+ success = execute(
+ {mcopy, "-i", tmp_esp_image, "-s", kernel_path_, "::vmlinuz"});
+ if (success != 0) {
+ LOG(ERROR) << "Failed to copy " << kernel_path_ << " to "
+ << tmp_esp_image;
+ return false;
+ }
+
+ if (!initramfs_path_.empty()) {
+ success = execute({mcopy, "-i", tmp_esp_image, "-s", initramfs_path_,
+ "::initrd.img"});
+ if (success != 0) {
+ LOG(ERROR) << "Failed to copy " << initramfs_path_ << " to "
+ << tmp_esp_image;
+ return false;
+ }
+ }
+ }
+
+ if (!cuttlefish::RenameFile(tmp_esp_image, esp_image_)) {
+ LOG(ERROR) << "Renaming " << tmp_esp_image << " to " << esp_image_
+ << " failed";
+ return false;
+ }
+ return true;
+ }
+
+ private:
+ std::string esp_image_;
+ std::string kernel_path_;
+ std::string initramfs_path_;
+ std::string rootfs_path_;
+};
+
+fruit::Component<InitializeEspImage> InitializeEspImageComponent(
+ const std::string* esp_image, const std::string* kernel_path,
+ const std::string* initramfs_path, const std::string* rootfs_path) {
+ return fruit::createComponent()
+ .addMultibinding<Feature, InitializeEspImage>()
+ .bind<InitializeEspImage, InitializeEspImageImpl>()
+ .bindInstance<fruit::Annotated<EspImageTag, std::string>>(*esp_image)
+ .bindInstance<fruit::Annotated<KernelPathTag, std::string>>(*kernel_path)
+ .bindInstance<fruit::Annotated<InitRamFsTag, std::string>>(
+ *initramfs_path)
+ .bindInstance<fruit::Annotated<RootFsTag, std::string>>(*rootfs_path);
}
} // namespace cuttlefish
diff --git a/host/libs/config/data_image.h b/host/libs/config/data_image.h
index 6a6a810..c60ec51 100644
--- a/host/libs/config/data_image.h
+++ b/host/libs/config/data_image.h
@@ -1,21 +1,48 @@
#pragma once
#include <string>
+//
+#include <fruit/fruit.h>
#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/config/feature.h"
namespace cuttlefish {
-enum class DataImageResult {
- Error,
- NoChange,
- FileUpdated,
+class DataImagePath {
+ public:
+ virtual ~DataImagePath() = default;
+ virtual const std::string& Path() const = 0;
};
-DataImageResult ApplyDataImagePolicy(const CuttlefishConfig& config,
- const std::string& path);
-bool InitializeMiscImage(const std::string& misc_image);
-void CreateBlankImage(
+class InitializeDataImage : public Feature {};
+
+fruit::Component<DataImagePath> FixedDataImagePathComponent(
+ const std::string* path);
+fruit::Component<fruit::Required<const CuttlefishConfig, DataImagePath>,
+ InitializeDataImage>
+InitializeDataImageComponent();
+
+class InitializeEspImage : public Feature {};
+
+fruit::Component<InitializeEspImage> InitializeEspImageComponent(
+ const std::string* esp_image, const std::string* kernel_path,
+ const std::string* initramfs_path, const std::string* root_fs);
+
+bool CreateBlankImage(
const std::string& image, int num_mb, const std::string& image_fmt);
+class MiscImagePath {
+ public:
+ virtual ~MiscImagePath() = default;
+ virtual const std::string& Path() const = 0;
+};
+
+class InitializeMiscImage : public Feature {};
+
+fruit::Component<MiscImagePath> FixedMiscImagePathComponent(
+ const std::string* path);
+fruit::Component<fruit::Required<MiscImagePath>, InitializeMiscImage>
+InitializeMiscImageComponent();
+
} // namespace cuttlefish
diff --git a/host/libs/config/feature.cpp b/host/libs/config/feature.cpp
new file mode 100644
index 0000000..3604fb4
--- /dev/null
+++ b/host/libs/config/feature.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/libs/config/feature.h"
+
+#include <unordered_set>
+
+namespace cuttlefish {
+
+Feature::~Feature() {}
+
+/* static */ bool Feature::RunSetup(const std::vector<Feature*>& features) {
+ std::unordered_set<Feature*> enabled;
+ for (const auto& feature : features) {
+ CHECK(feature != nullptr) << "Received null feature";
+ if (feature->Enabled()) {
+ enabled.insert(feature);
+ }
+ }
+ // Collect these in a vector first to trigger any obvious dependency issues.
+ std::vector<Feature*> ordered_features;
+ auto add_feature = [&ordered_features](Feature* feature) -> bool {
+ ordered_features.push_back(feature);
+ return true;
+ };
+ if (!FeatureSuperclass<Feature>::TopologicalVisit(enabled, add_feature)) {
+ LOG(ERROR) << "Dependency issue detected, not performing any setup.";
+ return false;
+ }
+ // TODO(b/189153501): This can potentially be parallelized.
+ for (auto& feature : ordered_features) {
+ LOG(DEBUG) << "Running setup for " << feature->Name();
+ if (!feature->Setup()) {
+ LOG(ERROR) << "Setup failed for " << feature->Name();
+ return false;
+ }
+ }
+ return true;
+}
+
+bool FlagFeature::ProcessFlags(const std::vector<FlagFeature*>& features,
+ std::vector<std::string>& flags) {
+ std::unordered_set<FlagFeature*> features_set(features.begin(),
+ features.end());
+ if (features_set.count(nullptr)) {
+ LOG(ERROR) << "Received null feature";
+ return false;
+ }
+ auto handle = [&flags](FlagFeature* feature) -> bool {
+ return feature->Process(flags);
+ };
+ if (!FeatureSuperclass<FlagFeature>::TopologicalVisit(features_set, handle)) {
+ LOG(ERROR) << "Unable to parse flags.";
+ return false;
+ }
+ return true;
+}
+
+bool FlagFeature::WriteGflagsHelpXml(const std::vector<FlagFeature*>& features,
+ std::ostream& out) {
+ // Lifted from external/gflags/src/gflags_reporting.cc:ShowXMLOfFlags
+ out << "<?xml version=\"1.0\"?>\n";
+ out << "<AllFlags>\n";
+ out << " <program>program</program>\n";
+ out << " <usage>usage</usage>\n";
+ for (const auto& feature : features) {
+ if (!feature) {
+ LOG(ERROR) << "Received null feature";
+ return false;
+ }
+ if (!feature->WriteGflagsCompatHelpXml(out)) {
+ LOG(ERROR) << "Failure to write xml";
+ return false;
+ }
+ }
+ out << "</AllFlags>";
+ return true;
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/feature.h b/host/libs/config/feature.h
new file mode 100644
index 0000000..02d1542
--- /dev/null
+++ b/host/libs/config/feature.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <android-base/logging.h>
+#include <ostream>
+#include <string>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
+
+namespace cuttlefish {
+
+// TODO(schuffelen): Rename this "Feature"
+template <typename Subclass>
+class FeatureSuperclass {
+ public:
+ virtual ~FeatureSuperclass() = default;
+
+ virtual std::string Name() const = 0;
+
+ static bool TopologicalVisit(const std::unordered_set<Subclass*>& features,
+ const std::function<bool(Subclass*)>& callback);
+
+ private:
+ virtual std::unordered_set<Subclass*> Dependencies() const = 0;
+};
+
+// TODO(schuffelen): Rename this "SetupFeature"
+class Feature : public virtual FeatureSuperclass<Feature> {
+ public:
+ virtual ~Feature();
+
+ static bool RunSetup(const std::vector<Feature*>& features);
+
+ virtual bool Enabled() const = 0;
+
+ private:
+ virtual bool Setup() = 0;
+};
+
+class FlagFeature : public FeatureSuperclass<FlagFeature> {
+ public:
+ static bool ProcessFlags(const std::vector<FlagFeature*>& features,
+ std::vector<std::string>& flags);
+ static bool WriteGflagsHelpXml(const std::vector<FlagFeature*>& features,
+ std::ostream& out);
+
+ private:
+ // Must be executed in dependency order following Dependencies(). Expected to
+ // mutate the `flags` argument to remove handled flags, and possibly introduce
+ // new flag values (e.g. from a file).
+ virtual bool Process(std::vector<std::string>& flags) = 0;
+
+ // TODO(schuffelen): Migrate the xml help to human-readable help output after
+ // the gflags migration is done.
+
+ // Write an xml fragment that is compatible with gflags' `--helpxml` format.
+ virtual bool WriteGflagsCompatHelpXml(std::ostream& out) const = 0;
+};
+
+template <typename Subclass>
+bool FeatureSuperclass<Subclass>::TopologicalVisit(
+ const std::unordered_set<Subclass*>& features,
+ const std::function<bool(Subclass*)>& callback) {
+ enum class Status { UNVISITED, VISITING, VISITED };
+ std::unordered_map<Subclass*, Status> features_status;
+ for (const auto& feature : features) {
+ features_status[feature] = Status::UNVISITED;
+ }
+ std::function<bool(Subclass*)> visit;
+ visit = [&callback, &features_status, &visit](Subclass* feature) -> bool {
+ if (features_status.count(feature) == 0) {
+ LOG(ERROR) << "Dependency edge to " << feature->Name() << " but it is not"
+ << " part of the feature graph. This feature is either "
+ << "disabled or not correctly registered.";
+ return false;
+ } else if (features_status[feature] == Status::VISITED) {
+ return true;
+ } else if (features_status[feature] == Status::VISITING) {
+ LOG(ERROR) << "Cycle detected while visiting " << feature->Name();
+ return false;
+ }
+ features_status[feature] = Status::VISITING;
+ for (const auto& dependency : feature->Dependencies()) {
+ CHECK(dependency != nullptr)
+ << "Feature " << feature->Name() << " has a null dependency.";
+ if (!visit(dependency)) {
+ LOG(ERROR) << "Error detected while visiting " << feature->Name();
+ return false;
+ }
+ }
+ features_status[feature] = Status::VISITED;
+ if (!callback(feature)) {
+ LOG(ERROR) << "Callback error on " << feature->Name();
+ return false;
+ }
+ return true;
+ };
+ for (const auto& feature : features) {
+ if (!visit(feature)) { // `visit` will log the error chain.
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/config/inject.h b/host/libs/config/inject.h
new file mode 100644
index 0000000..4e2a6e0
--- /dev/null
+++ b/host/libs/config/inject.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <fruit/fruit.h>
+#include <type_traits>
+
+namespace cuttlefish {
+
+/**
+ * This is a template helper to add bindings for a set of implementation
+ * classes that may each be part of multiple multibindings. To be more specific,
+ * for these example classes:
+ *
+ * class ImplementationA : public IntX, IntY {};
+ * class ImplementationB : public IntY, IntZ {};
+ *
+ * can be installed with
+ *
+ * using Deps = fruit::Required<...>;
+ * using Bases = Multibindings<Deps>::Bases<IntX, IntY, IntZ>;
+ * return fruit::createComponent()
+ * .install(Bases::Impls<ImplementationA, ImplementationB>);
+ *
+ * Note that not all implementations have to implement all interfaces. Invalid
+ * combinations are filtered out at compile-time through SFINAE.
+ */
+template <typename Deps>
+struct Multibindings {
+ /* SFINAE logic for an individual interface binding. The class does implement
+ * the interface, so add a multibinding. */
+ template <typename Base, typename Impl,
+ std::enable_if_t<std::is_base_of<Base, Impl>::value, bool> = true>
+ static fruit::Component<Deps> OneBaseOneImpl() {
+ return fruit::createComponent().addMultibinding<Base, Impl>();
+ }
+ /* SFINAE logic for an individual interface binding. The class does not
+ * implement the interface, so do not add a multibinding. */
+ template <typename Base, typename Impl,
+ std::enable_if_t<!std::is_base_of<Base, Impl>::value, bool> = true>
+ static fruit::Component<Deps> OneBaseOneImpl() {
+ return fruit::createComponent();
+ }
+
+ template <typename Base>
+ struct OneBase {
+ template <typename... ImplTypes>
+ static fruit::Component<Deps> Impls() {
+ return fruit::createComponent().installComponentFunctions(
+ fruit::componentFunction(OneBaseOneImpl<Base, ImplTypes>)...);
+ }
+ };
+
+ template <typename... BaseTypes>
+ struct Bases {
+ template <typename... ImplTypes>
+ static fruit::Component<Deps> Impls() {
+ return fruit::createComponent().installComponentFunctions(
+ fruit::componentFunction(
+ OneBase<BaseTypes>::template Impls<ImplTypes...>)...);
+ }
+ };
+};
+
+} // namespace cuttlefish
diff --git a/host/libs/config/kernel_args.cpp b/host/libs/config/kernel_args.cpp
index f5393d5..9a1277d 100644
--- a/host/libs/config/kernel_args.cpp
+++ b/host/libs/config/kernel_args.cpp
@@ -58,6 +58,8 @@
// Crosvm ARM only supports earlycon uart over mmio.
vm_manager_cmdline.push_back(" earlycon=uart8250,mmio,0x3f8");
}
+ // Cuttlefish does not use CMA, so don't reserve RAM for it
+ vm_manager_cmdline.push_back(" cma=0");
} else {
// To update the uart8250 address:
// $ qemu-system-x86_64 -kernel bzImage -serial stdio | grep ttyS0
@@ -80,7 +82,7 @@
vm_manager_cmdline.push_back("ramoops.dump_oops=1");
} else {
// crosvm requires these additional parameters on x86_64 in bootloader mode
- AppendVector(&vm_manager_cmdline, {"reboot=k"});
+ AppendVector(&vm_manager_cmdline, {"acpi=noirq", "reboot=k"});
}
}
}
@@ -100,12 +102,6 @@
AppendVector(&kernel_cmdline, VmManagerKernelCmdline(config));
- if (config.enable_gnss_grpc_proxy()) {
- kernel_cmdline.push_back("gnss_cmdline.serdev=serial8250/serial0/serial0-0");
- kernel_cmdline.push_back("gnss_cmdline.type=0");
- kernel_cmdline.push_back("serdev_ttyport.pdev_tty_port=ttyS1");
- }
-
if (config.guest_audit_security()) {
kernel_cmdline.push_back("audit=1");
} else {
diff --git a/guest/hals/audio/Android.bp b/host/libs/config/kernel_log_pipe_provider.h
similarity index 62%
copy from guest/hals/audio/Android.bp
copy to host/libs/config/kernel_log_pipe_provider.h
index c6faae7..f7cc20b 100644
--- a/guest/hals/audio/Android.bp
+++ b/host/libs/config/kernel_log_pipe_provider.h
@@ -1,3 +1,4 @@
+//
// Copyright (C) 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,16 +13,19 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
+#pragma once
-cc_library_shared {
- name: "audio.primary.cutf",
- relative_install_path: "hw",
- defaults: ["cuttlefish_guest_only"],
- vendor: true,
- srcs: ["audio_hw.c"],
- cflags: ["-Wno-unused-parameter"],
- shared_libs: ["libcutils", "libhardware", "liblog", "libtinyalsa"],
-}
+#include <fruit/fruit.h>
+#include <vector>
+
+#include "common/libs/fs/shared_fd.h"
+
+namespace cuttlefish {
+
+class KernelLogPipeProvider : public virtual Feature {
+ public:
+ virtual ~KernelLogPipeProvider() = default;
+ virtual SharedFD KernelLogPipe() = 0;
+};
+
+} // namespace cuttlefish
diff --git a/host/libs/config/known_paths.cpp b/host/libs/config/known_paths.cpp
index 1581a06..5a457e6 100644
--- a/host/libs/config/known_paths.cpp
+++ b/host/libs/config/known_paths.cpp
@@ -64,6 +64,11 @@
return HostBinaryPath("tombstone_receiver");
}
+std::string VehicleHalGrpcServerBinary() {
+ return HostBinaryPath(
+ "android.hardware.automotive.vehicle@2.0-virtualization-grpc-server");
+}
+
std::string WebRtcBinary() {
return HostBinaryPath("webRTC");
}
@@ -72,8 +77,14 @@
return HostBinaryPath("webrtc_operator");
}
-std::string VncServerBinary() {
- return HostBinaryPath("vnc_server");
+std::string WebRtcSigServerProxyBinary() {
+ return HostBinaryPath("operator_proxy");
+}
+
+std::string WmediumdBinary() { return HostBinaryPath("wmediumd"); }
+
+std::string WmediumdGenConfigBinary() {
+ return HostBinaryPath("wmediumd_gen_config");
}
} // namespace cuttlefish
diff --git a/host/libs/config/known_paths.h b/host/libs/config/known_paths.h
index 71b6253..8c39e61 100644
--- a/host/libs/config/known_paths.h
+++ b/host/libs/config/known_paths.h
@@ -30,8 +30,11 @@
std::string RootCanalBinary();
std::string SocketVsockProxyBinary();
std::string TombstoneReceiverBinary();
+std::string VehicleHalGrpcServerBinary();
std::string WebRtcBinary();
std::string WebRtcSigServerBinary();
-std::string VncServerBinary();
+std::string WebRtcSigServerProxyBinary();
+std::string WmediumdBinary();
+std::string WmediumdGenConfigBinary();
} // namespace cuttlefish
diff --git a/host/libs/confui/Android.bp b/host/libs/confui/Android.bp
index b74eb24..d51c738 100644
--- a/host/libs/confui/Android.bp
+++ b/host/libs/confui/Android.bp
@@ -32,11 +32,13 @@
cc_library_static {
name: "libcuttlefish_confui_host",
srcs: [
+ "cbor.cc",
"host_renderer.cc",
"host_server.cc",
"host_utils.cc",
"server_common.cc",
"session.cc",
+ "sign.cc",
"fonts.S",
],
shared_libs: [
@@ -44,6 +46,8 @@
"libbase",
"libjsoncpp",
"liblog",
+ "libcrypto",
+ "[email protected]",
],
header_libs: [
"libcuttlefish_confui_host_headers",
diff --git a/host/libs/confui/cbor.cc b/host/libs/confui/cbor.cc
new file mode 100644
index 0000000..66ced51
--- /dev/null
+++ b/host/libs/confui/cbor.cc
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/libs/confui/cbor.h"
+
+#include <algorithm>
+
+namespace cuttlefish {
+namespace confui {
+bool Cbor::WriteBytes(uint64_t value, uint8_t size) {
+ if (!IsOk()) {
+ return false;
+ }
+
+ if (formatted_message_buffer_.size() + size >= kMax) {
+ buffer_status_ = Cbor::Error::OUT_OF_DATA;
+ return false;
+ }
+
+ switch (size) {
+ case 8:
+ formatted_message_buffer_.emplace_back(getByte(value, 7));
+ formatted_message_buffer_.emplace_back(getByte(value, 6));
+ formatted_message_buffer_.emplace_back(getByte(value, 5));
+ formatted_message_buffer_.emplace_back(getByte(value, 4));
+ [[fallthrough]];
+ case 4:
+ formatted_message_buffer_.emplace_back(getByte(value, 3));
+ formatted_message_buffer_.emplace_back(getByte(value, 2));
+ [[fallthrough]];
+ case 2:
+ formatted_message_buffer_.emplace_back(getByte(value, 1));
+ [[fallthrough]];
+ case 1:
+ formatted_message_buffer_.emplace_back(value);
+ break;
+ case 0:
+ break;
+ default:
+ buffer_status_ = Cbor::Error::MALFORMED;
+ return false;
+ }
+ return true;
+}
+
+// TODO(kwstephenkim): replace these using cbor libraries under external
+bool Cbor::WriteHeader(const Cbor::Type type, const std::uint64_t value) {
+ /**
+ * reference implementation is, as of 08/30/2021, here:
+ *
+ * https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/confirmationui/support/src/cbor.cpp;drc=master;bpv=0;bpt=1;l=58
+ *
+ */
+ if (!IsOk()) {
+ return false;
+ }
+
+ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };
+ std::map<Condition, const std::uint8_t> bits_to_set = {
+ {Condition::k24, static_cast<uint8_t>(value)},
+ {Condition::k0x100, 24},
+ {Condition::k0x10000, 25},
+ {Condition::k0x100000000, 26},
+ {Condition::kBeyond, 27}};
+ std::map<Condition, int> optional_byte_size = {{Condition::k24, 0},
+ {Condition::k0x100, 1},
+ {Condition::k0x10000, 2},
+ {Condition::k0x100000000, 4},
+ {Condition::kBeyond, 8}};
+ Condition cond = Condition::k24;
+
+ if (value < 24) {
+ cond = Condition::k24;
+ } else if (value < 0x100) {
+ cond = Condition::k0x100;
+ } else if (value < 0x10000) {
+ cond = Condition::k0x10000;
+ } else if (value < 0x100000000) {
+ cond = Condition::k0x100000000;
+ } else {
+ cond = Condition::kBeyond;
+ }
+
+ // see if we have rooms. 1 byte for the mandatory byte in the header
+ // n bytes for optional bytes in the header
+ if (formatted_message_buffer_.size() + optional_byte_size[cond] + 1 > kMax) {
+ buffer_status_ = Cbor::Error::OUT_OF_DATA;
+ return false;
+ }
+
+ std::uint8_t header = (static_cast<uint8_t>(type) << 5) | bits_to_set[cond];
+ formatted_message_buffer_.emplace_back(header);
+ return WriteBytes(value, optional_byte_size[cond]);
+}
+
+void Cbor::Init() {
+ // reference implementation was available in:
+ // 1.0/generic/GenericOperation.h
+ // See class template Operation, and its init()
+
+ /*
+ * formatted_message_buffer_ will be:
+ * header followed by std::string("prompt") followed by prompt_text_ (no
+ * null char) followed by std::string("extra") followed by extra_data_ (no
+ * ending null, surely)
+ *
+ */
+ if (!WriteHeader(Type::MAP, 2)) {
+ return;
+ }
+ const std::string prompt("prompt");
+ const std::string extra("extra");
+
+ (WriteTextToBuffer(prompt) && WriteTextToBuffer(prompt_text_) &&
+ WriteTextToBuffer(extra) && WriteBytesToBuffer(extra_data_));
+}
+
+bool Cbor::WriteTextToBuffer(const std::string& text) {
+ // write(WriteState, const StringBuffer<T, TextStr>() is ported here
+ if (!IsOk() || !WriteHeader(Type::TEXT_STRING, text.size())) {
+ return false;
+ }
+ buffer_status_ = CheckUTF8Copy(text);
+ return IsOk();
+}
+
+bool Cbor::WriteBytesToBuffer(const std::vector<std::uint8_t>& bytes) {
+ if (!IsOk() || !WriteHeader(Type::BYTE_STRING, bytes.size())) {
+ return false;
+ }
+ if (formatted_message_buffer_.size() + bytes.size() >= kMax) {
+ buffer_status_ = Cbor::Error::OUT_OF_DATA;
+ return false;
+ }
+ formatted_message_buffer_.insert(formatted_message_buffer_.end(),
+ std::begin(bytes), std::end(bytes));
+ return true;
+}
+
+Cbor::Error Cbor::CheckUTF8Copy(const std::string& text) {
+ auto begin = text.cbegin();
+ auto end = text.cend();
+
+ if (!IsOk()) {
+ return buffer_status_;
+ }
+
+ uint32_t multi_byte_length = 0;
+ Cbor::Error err_code = buffer_status_; // OK
+
+ while (begin != end) {
+ if (multi_byte_length) {
+ // parsing multi byte character - must start with 10xxxxxx
+ --multi_byte_length;
+ if ((*begin & 0xc0) != 0x80) {
+ return Cbor::Error::MALFORMED_UTF8;
+ }
+ } else if (!((*begin) & 0x80)) {
+ // 7bit character -> nothing to be done
+ } else {
+ // msb is set and we were not parsing a multi byte character
+ // so this must be a header byte
+ char c = *begin << 1;
+ while (c & 0x80) {
+ ++multi_byte_length;
+ c <<= 1;
+ }
+ // headers of the form 10xxxxxx are not allowed
+ if (multi_byte_length < 1) {
+ return Cbor::Error::MALFORMED_UTF8;
+ }
+ // chars longer than 4 bytes are not allowed (multi_byte_length does not
+ // count the header thus > 3
+ if (multi_byte_length > 3) {
+ return Cbor::Error::MALFORMED_UTF8;
+ }
+ }
+
+ if (formatted_message_buffer_.size() < kMax) {
+ formatted_message_buffer_.emplace_back(
+ static_cast<const std::uint8_t>(*begin));
+ begin++;
+ } else {
+ // not returning with this error to be consistent with the reference
+ // implementation
+ err_code = Cbor::Error::OUT_OF_DATA;
+ }
+ }
+ // if the string ends in the middle of a multi byte char it is invalid
+ if (multi_byte_length) {
+ return Cbor::Error::MALFORMED_UTF8;
+ }
+ return err_code;
+}
+
+} // end of namespace confui
+} // end of namespace cuttlefish
diff --git a/host/libs/confui/cbor.h b/host/libs/confui/cbor.h
new file mode 100644
index 0000000..1870dd6
--- /dev/null
+++ b/host/libs/confui/cbor.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include <android/hardware/keymaster/4.0/types.h>
+
+namespace cuttlefish {
+namespace confui {
+
+/** take prompt_text_, extra_data
+ * returns "message"
+ * using "message", communicating with host keymaster,
+ * returns signed confirmation when appropriate
+ */
+class Cbor {
+ // TODO(kwstephenkim): replace this using cbor libraries under external
+ enum class Error : uint32_t {
+ OK = 0,
+ OUT_OF_DATA = 1,
+ MALFORMED = 2,
+ MALFORMED_UTF8 = 3,
+ };
+
+ enum class MessageSize : uint32_t { MAX = 6144u };
+
+ enum class Type : uint8_t {
+ NUMBER = 0,
+ NEGATIVE = 1,
+ BYTE_STRING = 2,
+ TEXT_STRING = 3,
+ ARRAY = 4,
+ MAP = 5,
+ TAG = 6,
+ FLOAT = 7,
+ };
+
+ public:
+ using HardwareAuthToken =
+ android::hardware::keymaster::V4_0::HardwareAuthToken;
+ Cbor(const std::string& prompt_text,
+ const std::vector<std::uint8_t>& extra_data)
+ : prompt_text_(prompt_text),
+ extra_data_(extra_data),
+ buffer_status_{Error::OK} {
+ Init();
+ }
+
+ bool IsOk() const { return buffer_status_ == Error::OK; }
+ Error GetErrorCode() const { return buffer_status_; }
+ bool IsMessageTooLong() const { return buffer_status_ == Error::OUT_OF_DATA; }
+ bool IsMalformedUtf8() const {
+ return buffer_status_ == Error::MALFORMED_UTF8;
+ }
+ std::vector<std::uint8_t>&& GetMessage() {
+ return std::move(formatted_message_buffer_);
+ }
+ const std::uint32_t kMax = static_cast<std::uint32_t>(MessageSize::MAX);
+
+ private:
+ std::string prompt_text_;
+ std::vector<std::uint8_t> extra_data_;
+
+ // should be shorter than or equal to buf[std::uint32_t(MessageSize::MAX)]
+ std::vector<std::uint8_t> formatted_message_buffer_;
+ Error buffer_status_;
+ void Init();
+ /**
+ * formatted_message_buffer_.emplace_back(created_header)
+ */
+ bool WriteHeader(const Cbor::Type type, const std::uint64_t value);
+ bool WriteTextToBuffer(const std::string& text);
+ bool WriteBytesToBuffer(const std::vector<std::uint8_t>& bytes);
+
+ inline uint8_t getByte(const uint64_t& v, const uint8_t index) {
+ return v >> (index * 8);
+ }
+ bool WriteBytes(uint64_t value, uint8_t size);
+ Error CheckUTF8Copy(const std::string& text);
+};
+} // namespace confui
+} // end of namespace cuttlefish
diff --git a/host/libs/confui/host_mode_ctrl.h b/host/libs/confui/host_mode_ctrl.h
index 7cf991c..bf8b575 100644
--- a/host/libs/confui/host_mode_ctrl.h
+++ b/host/libs/confui/host_mode_ctrl.h
@@ -30,7 +30,7 @@
* mechanism to orchestrate concurrent executions of threads
* that work for screen connector
*
- * Within VNC or WebRTC service, it tells when it is now in the Android Mode or
+ * Within WebRTC service, it tells when it is now in the Android Mode or
* Confirmation UI mode
*/
class HostModeCtrl {
@@ -76,14 +76,14 @@
void SetMode(const ModeType mode) {
ConfUiLog(DEBUG) << cuttlefish::confui::thread::GetName()
- << "tries to acquire the lock in SetMode";
+ << " tries to acquire the lock in SetMode";
std::lock_guard<std::mutex> lock(mode_mtx_);
ConfUiLog(DEBUG) << cuttlefish::confui::thread::GetName()
- << "acquired the lock in SetMode";
+ << " acquired the lock in SetMode";
atomic_mode_ = mode;
if (atomic_mode_ == ModeType::kAndroidMode) {
ConfUiLog(DEBUG) << cuttlefish::confui::thread::GetName()
- << "signals kAndroidMode in SetMode";
+ << " signals kAndroidMode in SetMode";
and_mode_cv_.notify_all();
return;
}
diff --git a/host/libs/confui/host_renderer.cc b/host/libs/confui/host_renderer.cc
index f3e0c52..a7dac6a 100644
--- a/host/libs/confui/host_renderer.cc
+++ b/host/libs/confui/host_renderer.cc
@@ -31,31 +31,56 @@
return result << shift;
}
-ConfUiRenderer::ConfUiRenderer(const std::uint32_t display)
- : display_num_(display),
- lang_id_{"en"},
- prompt_("Am I Yumi Meow?"),
- current_height_(ScreenConnectorInfo::ScreenHeight(display_num_)),
- current_width_(ScreenConnectorInfo::ScreenWidth(display_num_)),
- color_bg_{kColorBackground},
- color_text_{kColorDisabled},
- shield_color_{kColorShield},
- is_inverted_{false},
- ctx_{GetDeviceContext()} {
- auto opted_frame = RepaintRawFrame(prompt_, lang_id_);
- if (opted_frame) {
- raw_frame_ = std::move(opted_frame.value());
+std::unique_ptr<ConfUiRenderer> ConfUiRenderer::GenerateRenderer(
+ const std::uint32_t display, const std::string& confirmation_msg,
+ const std::string& locale, const bool inverted, const bool magnified) {
+ ConfUiRenderer* raw_ptr = new ConfUiRenderer(display, confirmation_msg,
+ locale, inverted, magnified);
+ if (raw_ptr && raw_ptr->IsSetUpSuccessful()) {
+ return std::unique_ptr<ConfUiRenderer>(raw_ptr);
}
+ return nullptr;
}
-void ConfUiRenderer::SetConfUiMessage(const std::string& msg) {
- prompt_ = msg;
- SetText<LabelConfMsg>(msg);
+/**
+ * device configuration
+ *
+ * ctx_{# of pixels in 1 mm, # of pixels per 1 density independent pixels}
+ *
+ * The numbers are, however, to fit for the host webRTC local/remote clients
+ * in general, not necessarily the supposedly guest device (e.g. Auto, phone,
+ * etc)
+ *
+ */
+ConfUiRenderer::ConfUiRenderer(const std::uint32_t display,
+ const std::string& confirmation_msg,
+ const std::string& locale, const bool inverted,
+ const bool magnified)
+ : display_num_{display},
+ lang_id_{locale},
+ prompt_text_{confirmation_msg},
+ current_height_{ScreenConnectorInfo::ScreenHeight(display_num_)},
+ current_width_{ScreenConnectorInfo::ScreenWidth(display_num_)},
+ is_inverted_(inverted),
+ is_magnified_(magnified),
+ ctx_(6.45211, 400.0 / 412.0),
+ is_setup_well_(false) {
+ SetDeviceContext(current_width_, current_height_, is_inverted_,
+ is_magnified_);
+ layout_ = teeui::instantiateLayout(teeui::ConfUILayout(), ctx_);
+
+ if (auto error = UpdateLocale()) {
+ ConfUiLog(ERROR) << "Update Translation Error: " << Enum2Base(error.code());
+ // is_setup_well_ = false;
+ return;
+ }
+ UpdateColorScheme(is_inverted_);
+ SetText<LabelConfMsg>(prompt_text_);
+ is_setup_well_ = true;
}
-teeui::Error ConfUiRenderer::SetLangId(const std::string& lang_id) {
+teeui::Error ConfUiRenderer::UpdateLocale() {
using teeui::Error;
- lang_id_ = lang_id;
teeui::localization::selectLangId(lang_id_.c_str());
if (auto error = UpdateTranslations()) {
return error;
@@ -63,14 +88,25 @@
return Error::OK;
}
+template <typename Label>
+teeui::Error ConfUiRenderer::UpdateString() {
+ using namespace teeui;
+ const char* str;
+ auto& label = std::get<Label>(layout_);
+ str = localization::lookup(TranslationId(label.textId()));
+ if (str == nullptr) {
+ ConfUiLog(ERROR) << "Given translation_id" << label.textId() << "not found";
+ return Error::Localization;
+ }
+ label.setText({str, str + strlen(str)});
+ return Error::OK;
+}
+
teeui::Error ConfUiRenderer::UpdateTranslations() {
using namespace teeui;
if (auto error = UpdateString<LabelOK>()) {
return error;
}
- if (auto error = UpdateString<LabelOK>()) {
- return error;
- }
if (auto error = UpdateString<LabelCancel>()) {
return error;
}
@@ -83,41 +119,41 @@
return Error::OK;
}
-teeui::context<teeui::ConUIParameters> ConfUiRenderer::GetDeviceContext() {
+void ConfUiRenderer::SetDeviceContext(const unsigned long long w,
+ const unsigned long long h,
+ const bool is_inverted,
+ const bool is_magnified) {
using namespace teeui;
- const unsigned long long w = ScreenConnectorInfo::ScreenWidth(display_num_);
- const unsigned long long h = ScreenConnectorInfo::ScreenHeight(display_num_);
const auto screen_width = operator""_px(w);
const auto screen_height = operator""_px(h);
- context<teeui::ConUIParameters> ctx(6.45211, 400.0 / 412.0);
- ctx.setParam<RightEdgeOfScreen>(screen_width);
- ctx.setParam<BottomOfScreen>(screen_height);
- ctx.setParam<PowerButtonTop>(20.26_mm);
- ctx.setParam<PowerButtonBottom>(30.26_mm);
- ctx.setParam<VolUpButtonTop>(40.26_mm);
- ctx.setParam<VolUpButtonBottom>(50.26_mm);
- ctx.setParam<DefaultFontSize>(14_dp);
- ctx.setParam<BodyFontSize>(16_dp);
- return ctx;
-}
-
-bool ConfUiRenderer::InitLayout(const std::string& lang_id) {
- layout_ = teeui::instantiateLayout(teeui::ConfUILayout(), ctx_);
- SetLangId(lang_id);
- if (auto error = UpdateTranslations()) {
- ConfUiLog(ERROR) << "Update Translation Error";
- return false;
+ ctx_.setParam<RightEdgeOfScreen>(pxs(screen_width));
+ ctx_.setParam<BottomOfScreen>(pxs(screen_height));
+ if (is_magnified) {
+ ctx_.setParam<DefaultFontSize>(18_dp);
+ ctx_.setParam<BodyFontSize>(20_dp);
+ } else {
+ ctx_.setParam<DefaultFontSize>(14_dp);
+ ctx_.setParam<BodyFontSize>(16_dp);
}
- UpdateColorScheme(&ctx_);
- return true;
+ if (is_inverted) {
+ ctx_.setParam<ShieldColor>(kColorShieldInv);
+ ctx_.setParam<ColorText>(kColorTextInv);
+ ctx_.setParam<ColorBG>(kColorBackgroundInv);
+ ctx_.setParam<ColorButton>(kColorShieldInv);
+ } else {
+ ctx_.setParam<ShieldColor>(kColorShield);
+ ctx_.setParam<ColorText>(kColorText);
+ ctx_.setParam<ColorBG>(kColorBackground);
+ ctx_.setParam<ColorButton>(kColorShield);
+ }
}
-teeui::Error ConfUiRenderer::UpdatePixels(TeeUiFrame& raw_frame,
+teeui::Error ConfUiRenderer::UpdatePixels(TeeUiFrameWrapper& raw_frame,
std::uint32_t x, std::uint32_t y,
teeui::Color color) {
auto buffer = raw_frame.data();
- const auto height = ScreenConnectorInfo::ScreenHeight(display_num_);
- const auto width = ScreenConnectorInfo::ScreenWidth(display_num_);
+ const auto height = raw_frame.Height();
+ const auto width = raw_frame.Width();
auto pos = width * y + x;
if (pos >= (height * width)) {
ConfUiLog(ERROR) << "Rendering Out of Bound";
@@ -131,114 +167,69 @@
return teeui::Error::OK;
}
-std::tuple<TeeUiFrame&, bool> ConfUiRenderer::RenderRawFrame(
- const std::string& confirmation_msg, const std::string& lang_id) {
+void ConfUiRenderer::UpdateColorScheme(const bool is_inverted) {
+ using namespace teeui;
+ color_text_ = is_inverted ? kColorDisabledInv : kColorDisabled;
+ shield_color_ = is_inverted ? kColorShieldInv : kColorShield;
+ color_bg_ = is_inverted ? kColorBackgroundInv : kColorBackground;
+
+ ctx_.setParam<ShieldColor>(shield_color_);
+ ctx_.setParam<ColorText>(color_text_);
+ ctx_.setParam<ColorBG>(color_bg_);
+ return;
+}
+
+std::shared_ptr<TeeUiFrameWrapper> ConfUiRenderer::RenderRawFrame() {
/* we repaint only if one or more of the followng meet:
*
* 1. raw_frame_ is empty
* 2. the current_width_ and current_height_ is out of date
- * 3. lang_id is different (e.g. new locale)
*
- * in the future, maybe you wanna inverted, new background, etc?
*/
- if (lang_id != lang_id_ || !IsFrameReady() ||
- current_height_ != ScreenConnectorInfo::ScreenHeight(display_num_) ||
- current_width_ != ScreenConnectorInfo::ScreenWidth(display_num_)) {
- auto opted_new_frame = RepaintRawFrame(confirmation_msg, lang_id_);
- if (opted_new_frame) {
- // repainting from the scratch successful in a new frame
- raw_frame_ = std::move(opted_new_frame.value());
- return {raw_frame_, true};
+ const int w = ScreenConnectorInfo::ScreenWidth(display_num_);
+ const int h = ScreenConnectorInfo::ScreenHeight(display_num_);
+ if (!IsFrameReady() || current_height_ != h || current_width_ != w) {
+ auto new_frame = RepaintRawFrame(w, h);
+ if (!new_frame) {
+ // must repaint but failed
+ raw_frame_ = nullptr;
+ return nullptr;
}
- // repaint failed even if it was necessary, so returns invalid values
- raw_frame_.clear();
- return {raw_frame_, false};
+ // repainting from the scratch successful in a new frame
+ raw_frame_ = std::move(new_frame);
+ current_width_ = w;
+ current_height_ = h;
}
- // no need to repaint from the scratch. repaint the confirmation message only
- // the frame is mostly already in raw_frame_
- auto ret_code = RenderConfirmationMsgOnly(confirmation_msg);
- return {raw_frame_, (ret_code == teeui::Error::OK)};
+ return raw_frame_;
}
-std::optional<TeeUiFrame> ConfUiRenderer::RepaintRawFrame(
- const std::string& confirmation_msg, const std::string& lang_id) {
- /*
- * NOTE: DON'T use current_width_/height_ to create this frame
- * it may fail, and then we must not mess up the current_width_, height_
- *
- */
- if (!InitLayout(lang_id)) {
- return std::nullopt;
- }
- SetConfUiMessage(confirmation_msg);
- auto color = kColorEnabled;
- std::get<teeui::LabelOK>(layout_).setTextColor(color);
- std::get<teeui::LabelCancel>(layout_).setTextColor(color);
+std::unique_ptr<TeeUiFrameWrapper> ConfUiRenderer::RepaintRawFrame(
+ const int w, const int h) {
+ std::get<teeui::LabelOK>(layout_).setTextColor(kColorEnabled);
+ std::get<teeui::LabelCancel>(layout_).setTextColor(kColorEnabled);
- /* in the future, if ever we need to register a handler for the
- Label{OK,Cancel}. do this: std::get<teeui::LabelOK>(layout_)
- .setCB(teeui::makeCallback<teeui::Error, teeui::Event>(
- [](teeui::Event e, void* p) -> teeui::Error {
- LOG(DEBUG) << "Calling callback for Confirm?";
- return reinterpret_cast<decltype(owner)*>(p)->TapOk(e); },
- owner));
- */
- // we manually check if click happened, where if yes, and generate the label
- // event manually. So we won't register the handler here.
/**
* should be uint32_t for teeui APIs.
* It assumes that each raw frame buffer element is 4 bytes
*/
- TeeUiFrame new_raw_frame(
- ScreenConnectorInfo::ScreenSizeInBytes(display_num_) / 4,
- kColorBackground);
-
+ const teeui::Color background_color =
+ is_inverted_ ? kColorBackgroundInv : kColorBackground;
+ auto new_raw_frame =
+ std::make_unique<TeeUiFrameWrapper>(w, h, background_color);
auto draw_pixel = teeui::makePixelDrawer(
[this, &new_raw_frame](std::uint32_t x, std::uint32_t y,
teeui::Color color) -> teeui::Error {
- return this->UpdatePixels(new_raw_frame, x, y, color);
+ return this->UpdatePixels(*new_raw_frame, x, y, color);
});
// render all components
const auto error = drawElements(layout_, draw_pixel);
if (error) {
ConfUiLog(ERROR) << "Painting failed: " << error.code();
- return std::nullopt;
+ return nullptr;
}
- // set current frame's dimension as frame generation was successful
- current_height_ = ScreenConnectorInfo::ScreenHeight(display_num_);
- current_width_ = ScreenConnectorInfo::ScreenWidth(display_num_);
-
- return {new_raw_frame};
-}
-
-teeui::Error ConfUiRenderer::RenderConfirmationMsgOnly(
- const std::string& confirmation_msg) {
- // repaint labelbody on the raw_frame__ only
- auto callback_func = [this](std::uint32_t x, std::uint32_t y,
- teeui::Color color) -> teeui::Error {
- return UpdatePixels(raw_frame_, x, y, color);
- };
- auto draw_pixel = teeui::makePixelDrawer(callback_func);
- LabelConfMsg& label = std::get<LabelConfMsg>(layout_);
- auto b = GetBoundary(label);
- for (std::uint32_t i = 0; i != b.w; i++) {
- const auto col_index = i + b.x - 1;
- for (std::uint32_t j = 0; j != b.y; j++) {
- const auto row_index = (j + b.y - 1);
- raw_frame_[current_width_ * row_index + col_index] = color_bg_;
- }
- }
-
- SetConfUiMessage(confirmation_msg);
- ConfUiLog(DEBUG) << "Repaint Confirmation Msg with :" << prompt_;
- if (auto error = std::get<LabelConfMsg>(layout_).draw(draw_pixel)) {
- ConfUiLog(ERROR) << "Repainting Confirmation Message Label failed:"
- << error.code();
- return error;
- }
- return teeui::Error::OK;
+ return new_raw_frame;
}
} // end of namespace confui
diff --git a/host/libs/confui/host_renderer.h b/host/libs/confui/host_renderer.h
index c614109..6dac3e3 100644
--- a/host/libs/confui/host_renderer.h
+++ b/host/libs/confui/host_renderer.h
@@ -29,45 +29,78 @@
#include "common/libs/confui/confui.h"
#include "host/libs/confui/layouts/layout.h"
#include "host/libs/confui/server_common.h"
-#include "host/libs/screen_connector/screen_connector.h"
+#include "host/libs/screen_connector/screen_connector_common.h"
namespace cuttlefish {
namespace confui {
+class TeeUiFrameWrapper {
+ public:
+ TeeUiFrameWrapper(const int w, const int h, const teeui::Color color)
+ : w_(w), h_(h), teeui_frame_(ScreenSizeInBytes(w, h), color) {}
+ TeeUiFrameWrapper() = delete;
+ auto data() { return teeui_frame_.data(); }
+ int Width() const { return w_; }
+ int Height() const { return h_; }
+ bool IsEmpty() const { return teeui_frame_.empty(); }
+ auto Size() const { return teeui_frame_.size(); }
+ auto& operator[](const int idx) { return teeui_frame_[idx]; }
+ std::uint32_t ScreenStrideBytes() const {
+ return ScreenConnectorInfo::ComputeScreenStrideBytes(w_);
+ }
+
+ private:
+ static std::uint32_t ScreenSizeInBytes(const int w, const int h) {
+ return ScreenConnectorInfo::ComputeScreenSizeInBytes(w, h);
+ }
+
+ int w_;
+ int h_;
+ TeeUiFrame teeui_frame_;
+};
/**
* create a raw frame for confirmation UI dialog
+ *
+ * Many rendering code borrowed from the following source
+ * https://android.googlesource.com/trusty/app/confirmationui/+/0429cc7/src
*/
class ConfUiRenderer {
public:
using LabelConfMsg = teeui::LabelBody;
- ConfUiRenderer(const std::uint32_t display);
+ static std::unique_ptr<ConfUiRenderer> GenerateRenderer(
+ const std::uint32_t display, const std::string& confirmation_msg,
+ const std::string& locale, const bool inverted, const bool magnified);
/**
* this does not repaint from the scratch all the time
*
- * Unless repainting the whole thing is needed, it remove the message
- * label, and re-draw there. There seems yet no fancy way of doing this.
- * Thus, it repaint the background color on the top of the label, and
- * draw the label on the new background
- *
- * As HostRenderer is intended to be shared across sessions, HostRender
- * owns the buffer, and returns reference to the buffer. Note that no
- * 2 or more sessions are concurrently executed. Only 1 or 0 is active
- * at the given moment.
+ * It does repaint its frame buffer only when w/h of
+ * current display has changed
*/
- std::tuple<TeeUiFrame&, bool> RenderRawFrame(
- const std::string& confirmation_msg, const std::string& lang_id = "en");
+ std::shared_ptr<TeeUiFrameWrapper> RenderRawFrame();
- bool IsFrameReady() const { return !raw_frame_.empty(); }
+ bool IsFrameReady() const { return raw_frame_ && !raw_frame_->IsEmpty(); }
+
+ bool IsInConfirm(const std::uint32_t x, const std::uint32_t y) {
+ return IsInside<teeui::LabelOK>(x, y);
+ }
+ bool IsInCancel(const std::uint32_t x, const std::uint32_t y) {
+ return IsInside<teeui::LabelCancel>(x, y);
+ }
private:
+ bool IsSetUpSuccessful() const { return is_setup_well_; }
+ ConfUiRenderer(const std::uint32_t display,
+ const std::string& confirmation_msg, const std::string& locale,
+ const bool inverted, const bool magnified);
+
struct Boundary { // inclusive but.. LayoutElement's size is float
std::uint32_t x, y, w, h; // (x, y) is the top left
};
template <typename LayoutElement>
- Boundary GetBoundary(LayoutElement&& e) {
+ Boundary GetBoundary(LayoutElement&& e) const {
auto box = e.bounds_;
Boundary b;
// (x,y) is left top. so floor() makes sense
@@ -80,28 +113,28 @@
return b;
}
+ template <typename Element>
+ bool IsInside(const std::uint32_t x, const std::uint32_t y) const {
+ auto box = GetBoundary(std::get<Element>(layout_));
+ if (x >= box.x && x <= box.x + box.w && y >= box.y && y <= box.y + box.h) {
+ return true;
+ }
+ return false;
+ }
// essentially, to repaint from the scratch, so returns new frame
// when successful. Or, nullopt
- std::optional<TeeUiFrame> RepaintRawFrame(const std::string& confirmation_msg,
- const std::string& lang_id = "en");
+ std::unique_ptr<TeeUiFrameWrapper> RepaintRawFrame(const int w, const int h);
bool InitLayout(const std::string& lang_id);
teeui::Error UpdateTranslations();
- /**
- * could be confusing. update prompt_, and update the text_ in the Label
- * object, the GUI components. This does not render immediately. And..
- * to render it, we must clean up the existing dirty pixels, which
- * this method does not do.
- */
- void SetConfUiMessage(const std::string& s);
- teeui::Error SetLangId(const std::string& lang_id);
- teeui::context<teeui::ConUIParameters> GetDeviceContext();
+ teeui::Error UpdateLocale();
+ void SetDeviceContext(const unsigned long long w, const unsigned long long h,
+ bool is_inverted, bool is_magnified);
- // effectively, will be send to teeui as a callback function
- teeui::Error UpdatePixels(TeeUiFrame& buffer, std::uint32_t x,
+ // a callback function to be effectively sent to TeeUI library
+ teeui::Error UpdatePixels(TeeUiFrameWrapper& buffer, std::uint32_t x,
std::uint32_t y, teeui::Color color);
- // from Trusty
// second param is for type deduction
template <typename... Elements>
static teeui::Error drawElements(std::tuple<Elements...>& layout,
@@ -111,70 +144,49 @@
// draw the remaining elements in the order they appear in the layout tuple.
return (std::get<Elements>(layout).draw(drawPixel) || ...);
}
-
- // repaint the confirmation UI label only
- teeui::Error RenderConfirmationMsgOnly(const std::string& confirmation_msg);
-
- // from Trusty
- template <typename Context>
- void UpdateColorScheme(Context* ctx) {
- using namespace teeui;
- color_text_ = is_inverted_ ? kColorDisabledInv : kColorDisabled;
- shield_color_ = is_inverted_ ? kColorShieldInv : kColorShield;
- color_bg_ = is_inverted_ ? kColorBackgroundInv : kColorBackground;
-
- ctx->template setParam<ShieldColor>(shield_color_);
- ctx->template setParam<ColorText>(color_text_);
- ctx->template setParam<ColorBG>(color_bg_);
- return;
- }
-
+ void UpdateColorScheme(const bool is_inverted);
template <typename Label>
auto SetText(const std::string& text) {
return std::get<Label>(layout_).setText(
{text.c_str(), text.c_str() + text.size()});
}
- /**
- * source:
- * https://android.googlesource.com/trusty/app/confirmationui/+/0429cc7/src/trusty_confirmation_ui.cpp#49
- */
template <typename Label>
- teeui::Error UpdateString() {
- using namespace teeui;
- const char* str;
- auto& label = std::get<Label>(layout_);
- str = localization::lookup(TranslationId(label.textId()));
- if (str == nullptr) {
- ConfUiLog(ERROR) << "Given translation_id" << label.textId()
- << "not found";
- return Error::Localization;
- }
- label.setText({str, str + strlen(str)});
- return Error::OK;
- }
+ teeui::Error UpdateString();
- const int display_num_;
+ std::uint32_t display_num_;
teeui::layout_t<teeui::ConfUILayout> layout_;
std::string lang_id_;
- std::string prompt_; // confirmation ui message
- TeeUiFrame raw_frame_;
+ std::string prompt_text_; // confirmation ui message
+
+ /**
+ * Potentially, the same frame could be requested multiple times.
+ *
+ * While another thread/caller is using this frame, the frame should
+ * be kept here, too, to be returned upon future requests.
+ *
+ */
+ std::shared_ptr<TeeUiFrameWrapper> raw_frame_;
std::uint32_t current_height_;
std::uint32_t current_width_;
teeui::Color color_bg_;
teeui::Color color_text_;
teeui::Color shield_color_;
bool is_inverted_;
- teeui::context<teeui::ConUIParameters> ctx_;
+ bool is_magnified_;
+ teeui::context<teeui::ConfUIParameters> ctx_;
+ bool is_setup_well_;
- static constexpr const teeui::Color kColorEnabled = 0xff212121;
- static constexpr const teeui::Color kColorDisabled = 0xffbdbdbd;
- static constexpr const teeui::Color kColorEnabledInv = 0xffdedede;
- static constexpr const teeui::Color kColorDisabledInv = 0xff424242;
static constexpr const teeui::Color kColorBackground = 0xffffffff;
static constexpr const teeui::Color kColorBackgroundInv = 0xff212121;
- static constexpr const teeui::Color kColorShieldInv = 0xffc4cb80;
+ static constexpr const teeui::Color kColorDisabled = 0xffbdbdbd;
+ static constexpr const teeui::Color kColorDisabledInv = 0xff424242;
+ static constexpr const teeui::Color kColorEnabled = 0xff212121;
+ static constexpr const teeui::Color kColorEnabledInv = 0xffdedede;
static constexpr const teeui::Color kColorShield = 0xff778500;
+ static constexpr const teeui::Color kColorShieldInv = 0xffc4cb80;
+ static constexpr const teeui::Color kColorText = 0xff212121;
+ static constexpr const teeui::Color kColorTextInv = 0xffdedede;
};
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/host/libs/confui/host_server.cc b/host/libs/confui/host_server.cc
index c14e0ed..97e80f4 100644
--- a/host/libs/confui/host_server.cc
+++ b/host/libs/confui/host_server.cc
@@ -22,6 +22,7 @@
#include <tuple>
#include "common/libs/confui/confui.h"
+#include "common/libs/fs/shared_buf.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/confui/host_utils.h"
@@ -33,8 +34,8 @@
return config->ForDefaultInstance();
}
-static std::string HalGuestSocketPath() {
- return CuttlefishConfigDefaultInstance().confui_hal_guest_socket_path();
+static int HalHostVsockPort() {
+ return CuttlefishConfigDefaultInstance().confui_host_vsock_port();
}
HostServer& HostServer::Get(
@@ -50,16 +51,24 @@
: display_num_(0),
host_mode_ctrl_(host_mode_ctrl),
screen_connector_{screen_connector},
- renderer_(display_num_),
- hal_socket_path_(HalGuestSocketPath()),
- input_multiplexer_{/* max n_elems */ 20, /* n_Qs */ 2} {
- hal_cmd_q_id_ = input_multiplexer_.GetNewQueueId(); // return 0
- user_input_evt_q_id_ = input_multiplexer_.GetNewQueueId(); // return 1
+ hal_vsock_port_(HalHostVsockPort()) {
+ ConfUiLog(DEBUG) << "Confirmation UI Host session is listening on: "
+ << hal_vsock_port_;
+ const size_t max_elements = 20;
+ auto ignore_new =
+ [](ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>::QueueImpl*) {
+ // no op, so the queue is still full, and the new item will be discarded
+ return;
+ };
+ hal_cmd_q_id_ = input_multiplexer_.RegisterQueue(
+ HostServer::Multiplexer::CreateQueue(max_elements, ignore_new));
+ user_input_evt_q_id_ = input_multiplexer_.RegisterQueue(
+ HostServer::Multiplexer::CreateQueue(max_elements, ignore_new));
}
void HostServer::Start() {
- guest_hal_socket_ = cuttlefish::SharedFD::SocketLocalServer(
- hal_socket_path_, false, SOCK_STREAM, 0666);
+ guest_hal_socket_ =
+ cuttlefish::SharedFD::VsockServer(hal_vsock_port_, SOCK_STREAM);
if (!guest_hal_socket_->IsOpen()) {
ConfUiLog(FATAL) << "Confirmation UI host service mandates a server socket"
<< "to which the guest HAL to connect.";
@@ -70,67 +79,63 @@
hal_input_fetcher_thread_ =
thread::RunThread("HalInputLoop", hal_cmd_fetching);
main_loop_thread_ = thread::RunThread("MainLoop", main);
- ConfUiLog(DEBUG) << "configured internal socket based input.";
+ ConfUiLog(DEBUG) << "configured internal vsock based input.";
return;
}
void HostServer::HalCmdFetcherLoop() {
- hal_cli_socket_ = EstablishHalConnection();
- if (!hal_cli_socket_->IsOpen()) {
- ConfUiLog(FATAL)
- << "Confirmation UI host service mandates connection with HAL.";
- return;
- }
while (true) {
- auto opted_msg = RecvConfUiMsg(hal_cli_socket_);
- if (!opted_msg) {
- ConfUiLog(ERROR) << "Error in RecvConfUiMsg from HAL";
+ if (!hal_cli_socket_->IsOpen()) {
+ ConfUiLog(DEBUG) << "client is disconnected";
+ std::unique_lock<std::mutex> lk(socket_flag_mtx_);
+ hal_cli_socket_ = EstablishHalConnection();
+ is_socket_ok_ = true;
continue;
}
- auto input = std::move(opted_msg.value());
- input_multiplexer_.Push(hal_cmd_q_id_, std::move(input));
+ auto msg = RecvConfUiMsg(hal_cli_socket_);
+ if (!msg) {
+ ConfUiLog(ERROR) << "Error in RecvConfUiMsg from HAL";
+ hal_cli_socket_->Close();
+ is_socket_ok_ = false;
+ continue;
+ }
+ /*
+ * In case of Vts test, the msg could be a user input. For now, we do not
+ * enforce the input grace period for Vts. However, if ever we do, here is
+ * where the time point check should happen. Once it is enqueued, it is not
+ * always guaranteed to be picked up reasonably soon.
+ */
+ input_multiplexer_.Push(hal_cmd_q_id_, std::move(msg));
}
}
-bool HostServer::SendUserSelection(UserResponse::type selection) {
- if (!curr_session_) {
- ConfUiLog(FATAL) << "Current session must not be null";
- return false;
- }
- if (curr_session_->GetState() != MainLoopState::kInSession) {
+void HostServer::SendUserSelection(std::unique_ptr<ConfUiMessage>& input) {
+ if (!curr_session_ ||
+ curr_session_->GetState() != MainLoopState::kInSession ||
+ !curr_session_->IsReadyForUserInput()) {
// ignore
- return true;
+ return;
}
-
- std::lock_guard<std::mutex> lock(input_socket_mtx_);
- if (selection != UserResponse::kConfirm &&
- selection != UserResponse::kCancel) {
- ConfUiLog(FATAL) << selection << " must be either" << UserResponse::kConfirm
- << "or" << UserResponse::kCancel;
- return false; // not reaching here
- }
-
- ConfUiMessage input{GetCurrentSessionId(),
- ToString(ConfUiCmd::kUserInputEvent), selection};
-
input_multiplexer_.Push(user_input_evt_q_id_, std::move(input));
- return true;
}
-void HostServer::PressConfirmButton(const bool is_down) {
- if (!is_down) {
+void HostServer::TouchEvent(const int x, const int y, const bool is_down) {
+ if (!is_down || !curr_session_) {
return;
}
- // shared by N vnc/webRTC clients
- SendUserSelection(UserResponse::kConfirm);
+ std::unique_ptr<ConfUiMessage> input =
+ std::make_unique<ConfUiUserTouchMessage>(GetCurrentSessionId(), x, y);
+ SendUserSelection(input);
}
-void HostServer::PressCancelButton(const bool is_down) {
- if (!is_down) {
+void HostServer::UserAbortEvent() {
+ if (!curr_session_) {
return;
}
- // shared by N vnc/webRTC clients
- SendUserSelection(UserResponse::kCancel);
+ std::unique_ptr<ConfUiMessage> input =
+ std::make_unique<ConfUiUserSelectionMessage>(GetCurrentSessionId(),
+ UserResponse::kUserAbort);
+ SendUserSelection(input);
}
bool HostServer::IsConfUiActive() {
@@ -141,119 +146,105 @@
}
SharedFD HostServer::EstablishHalConnection() {
- ConfUiLog(DEBUG) << "Waiting hal accepting";
- auto new_cli = SharedFD::Accept(*guest_hal_socket_);
- ConfUiLog(DEBUG) << "hal client accepted";
- return new_cli;
-}
-
-std::unique_ptr<Session> HostServer::ComputeCurrentSession(
- const std::string& session_id) {
- if (curr_session_ && (GetCurrentSessionId() != session_id)) {
- ConfUiLog(FATAL) << curr_session_->GetId() << " is active and in the"
- << GetCurrentState() << "but HAL sends command to"
- << session_id;
+ using namespace std::chrono_literals;
+ while (true) {
+ ConfUiLog(VERBOSE) << "Waiting hal accepting";
+ auto new_cli = SharedFD::Accept(*guest_hal_socket_);
+ ConfUiLog(VERBOSE) << "hal client accepted";
+ if (new_cli->IsOpen()) {
+ return new_cli;
+ }
+ std::this_thread::sleep_for(500ms);
}
- if (curr_session_) {
- return std::move(curr_session_);
- }
-
- // pick up a new session, or create one
- auto result = GetSession(session_id);
- if (result) {
- return std::move(result);
- }
-
- auto raw_ptr = new Session(session_id, display_num_, renderer_,
- host_mode_ctrl_, screen_connector_);
- result = std::unique_ptr<Session>(raw_ptr);
- // note that the new session is directly going to curr_session_
- // when it is suspended, it will be moved to session_map_
- return std::move(result);
}
// read the comments in the header file
[[noreturn]] void HostServer::MainLoop() {
while (true) {
// this gets one input from either queue:
- // from HAL or from all webrtc/vnc clients
+ // from HAL or from all webrtc clients
// if no input, sleep until there is
- const auto input = input_multiplexer_.Pop();
- const auto& [session_id, cmd_str, additional_info] = input;
+ auto input_ptr = input_multiplexer_.Pop();
+ auto& input = *input_ptr;
+ const auto session_id = input.GetSessionId();
+ const auto cmd = input.GetType();
+ const std::string cmd_str(ToString(cmd));
// take input for the Finite States Machine below
- const ConfUiCmd cmd = ToCmd(cmd_str);
- const bool is_user_input = (cmd == ConfUiCmd::kUserInputEvent);
+ const bool is_user_input = (cmd == ConfUiCmd::kUserInputEvent) ||
+ (cmd == ConfUiCmd::kUserTouchEvent);
std::string src = is_user_input ? "input" : "hal";
+ ConfUiLog(VERBOSE) << "In Session " << GetCurrentSessionId() << ", "
+ << "in state " << GetCurrentState() << ", "
+ << "received input from " << src << " cmd =" << cmd_str
+ << " going to session " << session_id;
- ConfUiLog(DEBUG) << "In Session" << GetCurrentSessionId() << ","
- << "in state" << GetCurrentState() << ","
- << "received input from" << src << "cmd =" << cmd_str
- << "and additional_info =" << additional_info
- << "going to session" << session_id;
-
- FsmInput fsm_input = ToFsmInput(input);
-
- if (is_user_input && !curr_session_) {
- // discard the input, there's no session to take it yet
- // actually, no confirmation UI screen is available
- ConfUiLog(DEBUG) << "Took user input but no active session is available.";
- continue;
- }
-
- /**
- * if the curr_session_ is null, create one
- * if the curr_session_ is not null but the session id doesn't match,
- * something is wrong. Confirmation UI doesn't allow preemption by
- * another confirmation UI session back to back. When it's preempted,
- * HAL must send "kSuspend"
- *
- */
- curr_session_ = ComputeCurrentSession(session_id);
- ConfUiLog(DEBUG) << "Host service picked up "
- << (curr_session_ ? curr_session_->GetId()
- : "null session");
- ConfUiLog(DEBUG) << "The state of current session is "
- << (curr_session_ ? ToString(curr_session_->GetState())
- : "null session");
-
- if (is_user_input) {
- curr_session_->Transition(is_user_input, hal_cli_socket_, fsm_input,
- additional_info);
- } else {
- ConfUiCmd cmd = ToCmd(cmd_str);
- switch (cmd) {
- case ConfUiCmd::kSuspend:
- curr_session_->Suspend(hal_cli_socket_);
- break;
- case ConfUiCmd::kRestore:
- curr_session_->Restore(hal_cli_socket_);
- break;
- case ConfUiCmd::kAbort:
- curr_session_->Abort(hal_cli_socket_);
- break;
- default:
- curr_session_->Transition(is_user_input, hal_cli_socket_, fsm_input,
- additional_info);
- break;
+ if (!curr_session_) {
+ if (cmd != ConfUiCmd::kStart) {
+ ConfUiLog(VERBOSE) << ToString(cmd) << " to " << session_id
+ << " is ignored as there is no session to receive";
+ continue;
}
+ // the session is created as kInit
+ curr_session_ = CreateSession(input.GetSessionId());
}
-
- // check the session if it is inactive (e.g. init, suspended)
- // and if it is done (transitioned to init from any other state)
- if (curr_session_->IsSuspended()) {
- session_map_[GetCurrentSessionId()] = std::move(curr_session_);
- curr_session_ = nullptr;
- continue;
+ if (cmd == ConfUiCmd::kUserTouchEvent) {
+ ConfUiUserTouchMessage& touch_event =
+ static_cast<ConfUiUserTouchMessage&>(input);
+ auto [x, y] = touch_event.GetLocation();
+ const bool is_confirm = curr_session_->IsConfirm(x, y);
+ const bool is_cancel = curr_session_->IsCancel(x, y);
+ if (!is_confirm && !is_cancel) {
+ // ignore, take the next input
+ continue;
+ }
+ input_ptr = std::make_unique<ConfUiUserSelectionMessage>(
+ GetCurrentSessionId(),
+ (is_confirm ? UserResponse::kConfirm : UserResponse::kCancel));
}
+ Transition(input_ptr);
- if (curr_session_->GetState() == MainLoopState::kAwaitCleanup) {
+ // finalize
+ if (curr_session_ &&
+ curr_session_->GetState() == MainLoopState::kAwaitCleanup) {
curr_session_->CleanUp();
curr_session_ = nullptr;
}
- // otherwise, continue with keeping the curr_session_
} // end of the infinite while loop
}
+std::shared_ptr<Session> HostServer::CreateSession(const std::string& name) {
+ return std::make_shared<Session>(name, display_num_, host_mode_ctrl_,
+ screen_connector_);
+}
+
+static bool IsUserAbort(ConfUiMessage& msg) {
+ if (msg.GetType() != ConfUiCmd::kUserInputEvent) {
+ return false;
+ }
+ ConfUiUserSelectionMessage& selection =
+ static_cast<ConfUiUserSelectionMessage&>(msg);
+ return (selection.GetResponse() == UserResponse::kUserAbort);
+}
+
+void HostServer::Transition(std::unique_ptr<ConfUiMessage>& input_ptr) {
+ auto& input = *input_ptr;
+ const auto session_id = input.GetSessionId();
+ const auto cmd = input.GetType();
+ const std::string cmd_str(ToString(cmd));
+ FsmInput fsm_input = ToFsmInput(input);
+ ConfUiLog(VERBOSE) << "Handling " << ToString(cmd);
+ if (IsUserAbort(input)) {
+ curr_session_->UserAbort(hal_cli_socket_);
+ return;
+ }
+
+ if (cmd == ConfUiCmd::kAbort) {
+ curr_session_->Abort();
+ return;
+ }
+ curr_session_->Transition(hal_cli_socket_, fsm_input, input);
+}
+
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/host/libs/confui/host_server.h b/host/libs/confui/host_server.h
index be5caeb..904af33 100644
--- a/host/libs/confui/host_server.h
+++ b/host/libs/confui/host_server.h
@@ -35,7 +35,6 @@
#include "host/commands/kernel_log_monitor/utils.h"
#include "host/libs/config/logging.h"
#include "host/libs/confui/host_mode_ctrl.h"
-#include "host/libs/confui/host_renderer.h"
#include "host/libs/confui/host_virtual_input.h"
#include "host/libs/confui/server_common.h"
#include "host/libs/confui/session.h"
@@ -50,11 +49,11 @@
cuttlefish::ScreenConnectorFrameRenderer& screen_connector);
void Start(); // start this server itself
- virtual ~HostServer() = default;
+ virtual ~HostServer() {}
- // implement input interfaces. called by webRTC & vnc
- void PressConfirmButton(const bool is_down) override;
- void PressCancelButton(const bool is_down) override;
+ // implement input interfaces. called by webRTC
+ void TouchEvent(const int x, const int y, const bool is_down) override;
+ void UserAbortEvent() override;
bool IsConfUiActive() override;
private:
@@ -89,7 +88,7 @@
* should render the Android guest frames but keep the confirmation
* UI session and frame
*
- * The inputs are I = {u, g}. 'u' is the user input from vnc/webRTC
+ * The inputs are I = {u, g}. 'u' is the user input from webRTC
* clients. Note that the host service serialized the concurrent user
* inputs from multiple clients. 'g' is the command from the HAL service
*
@@ -115,21 +114,10 @@
SharedFD EstablishHalConnection();
- // failed to start dialog, etc
- // basically, will reset the session, so start from the beginning in the same
- // session
- void ResetOnCommandFailure();
+ std::shared_ptr<Session> CreateSession(const std::string& session_name);
+ void SendUserSelection(std::unique_ptr<ConfUiMessage>& input);
- // note: the picked session will be removed from session_map_
- std::unique_ptr<Session> GetSession(const std::string& session_id) {
- if (session_map_.find(session_id) == session_map_.end()) {
- return nullptr;
- }
- std::unique_ptr<Session> temp = std::move(session_map_[session_id]);
- session_map_.erase(session_id);
- return temp;
- }
-
+ void Transition(std::unique_ptr<ConfUiMessage>& input_ptr);
std::string GetCurrentSessionId() {
if (curr_session_) {
return curr_session_->GetId();
@@ -143,29 +131,23 @@
}
return ToString(curr_session_->GetState());
}
- std::unique_ptr<Session> ComputeCurrentSession(const std::string& session_id);
- bool SendUserSelection(UserResponse::type selection);
const std::uint32_t display_num_;
HostModeCtrl& host_mode_ctrl_;
ScreenConnectorFrameRenderer& screen_connector_;
- // this member creates a raw frame
- ConfUiRenderer renderer_;
-
std::string input_socket_path_;
- std::string hal_socket_path_;
+ int hal_vsock_port_;
- // session id to Session object map, for those that are suspended
- std::unordered_map<std::string, std::unique_ptr<Session>> session_map_;
- // curr_session_ doesn't belong to session_map_
- std::unique_ptr<Session> curr_session_;
+ std::shared_ptr<Session> curr_session_;
SharedFD guest_hal_socket_;
// ACCEPTED fd on guest_hal_socket_
SharedFD hal_cli_socket_;
- std::mutex input_socket_mtx_;
+ using Multiplexer =
+ Multiplexer<std::unique_ptr<ConfUiMessage>,
+ ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>>;
/*
* Multiplexer has N queues. When pop(), it is going to sleep until
* there's at least one item in at least one queue. The lower the Q
@@ -174,12 +156,16 @@
* For HostServer, we have a queue for the user input events, and
* another for hal cmd/msg queues
*/
- Multiplexer<ConfUiMessage> input_multiplexer_;
+ Multiplexer input_multiplexer_;
int hal_cmd_q_id_; // Q id in input_multiplexer_
int user_input_evt_q_id_; // Q id in input_multiplexer_
std::thread main_loop_thread_;
std::thread hal_input_fetcher_thread_;
+
+ std::mutex socket_flag_mtx_;
+ std::condition_variable socket_flag_cv_;
+ bool is_socket_ok_;
};
} // end of namespace confui
diff --git a/host/libs/confui/host_virtual_input.h b/host/libs/confui/host_virtual_input.h
index ec800cb..65ec577 100644
--- a/host/libs/confui/host_virtual_input.h
+++ b/host/libs/confui/host_virtual_input.h
@@ -23,13 +23,13 @@
enum class ConfUiKeys : std::uint32_t { Confirm = 7, Cancel = 8 };
/**
- * vnc, webrtc will deliver the user inputs from their client
+ * webrtc will deliver the user inputs from their client
* to this class object
*/
class HostVirtualInput {
public:
- virtual void PressConfirmButton(const bool is_down) = 0;
- virtual void PressCancelButton(const bool is_down) = 0;
+ virtual void TouchEvent(const int x, const int y, const bool is_down) = 0;
+ virtual void UserAbortEvent() = 0;
virtual ~HostVirtualInput() = default;
// guarantees that if this returns true, it is confirmation UI mode
virtual bool IsConfUiActive() = 0;
diff --git a/host/libs/confui/layouts/layout.h b/host/libs/confui/layouts/layout.h
index bb40b67..4f6c4dc 100644
--- a/host/libs/confui/layouts/layout.h
+++ b/host/libs/confui/layouts/layout.h
@@ -29,38 +29,13 @@
DECLARE_PARAMETER(RightEdgeOfScreen);
DECLARE_PARAMETER(BottomOfScreen);
-DECLARE_PARAMETER(PowerButtonTop);
-DECLARE_PARAMETER(PowerButtonBottom);
-DECLARE_PARAMETER(VolUpButtonTop);
-DECLARE_PARAMETER(VolUpButtonBottom);
DECLARE_PARAMETER(DefaultFontSize); // 14_dp regular and 18_dp magnified
DECLARE_PARAMETER(BodyFontSize); // 16_dp regular and 20_dp magnified
DECLARE_TYPED_PARAMETER(ShieldColor, ::teeui::Color);
DECLARE_TYPED_PARAMETER(ColorText, ::teeui::Color);
DECLARE_TYPED_PARAMETER(ColorBG, ::teeui::Color);
-NEW_PARAMETER_SET(ConUIParameters, RightEdgeOfScreen, BottomOfScreen,
- PowerButtonTop, PowerButtonBottom, VolUpButtonTop,
- VolUpButtonBottom, DefaultFontSize, BodyFontSize, ShieldColor,
- ColorText, ColorBG);
-
CONSTANT(BorderWidth, 24_dp);
-CONSTANT(PowerButtonCenter, (PowerButtonTop() + PowerButtonBottom()) / 2_px);
-CONSTANT(VolUpButtonCenter, (VolUpButtonTop() + VolUpButtonBottom()) / 2.0_px);
-CONSTANT(GrayZone, 12_dp);
-CONSTANT(RightLabelEdge, RightEdgeOfScreen() - BorderWidth - GrayZone);
-CONSTANT(LabelWidth, RightLabelEdge - BorderWidth);
-
-CONSTANT(SQRT2, 1.4142135623_dp);
-CONSTANT(SQRT8, 2.828427125_dp);
-
-CONSTANT(ARROW_SHAPE,
- CONVEX_OBJECTS(
- CONVEX_OBJECT(Vec2d{.0_dp, .0_dp}, Vec2d{6.0_dp, 6.0_dp},
- Vec2d{6.0_dp - SQRT8, 6.0_dp}, Vec2d{-SQRT2, SQRT2}),
- CONVEX_OBJECT(Vec2d{6.0_dp - SQRT8, 6.0_dp}, Vec2d{6.0_dp, 6.0_dp},
- Vec2d{0.0_dp, 12.0_dp},
- Vec2d{-SQRT2, 12.0_dp - SQRT2})));
DECLARE_FONT_BUFFER(RobotoMedium, RobotoMedium, RobotoMedium_length);
DECLARE_FONT_BUFFER(RobotoRegular, RobotoRegular, RobotoRegular_length);
@@ -68,63 +43,32 @@
CONSTANT(DefaultFont, FONT(RobotoRegular));
-BEGIN_ELEMENT(LabelOK, teeui::Label)
-FontSize(DefaultFontSize());
-LineHeight(20_dp);
-NumberOfLines(2);
-Dimension(LabelWidth, HeightFromLines);
-Position(BorderWidth, PowerButtonCenter - dim_h / 2.0_px);
-DefaultText("Press Power Button Confirm");
-RightJustified;
-VerticallyCentered;
-TextColor(ColorText());
-Font(FONT(RobotoMedium));
-TextID(TEXT_ID(TranslationId::CONFIRM_PWR_BUTTON_DOUBLE_PRESS));
-END_ELEMENT();
+DECLARE_TYPED_PARAMETER(ColorButton, ::teeui::Color);
-BEGIN_ELEMENT(IconPower, teeui::Button, ConvexObjectCount(2))
-Dimension(BorderWidth, PowerButtonBottom() - PowerButtonTop());
-Position(RightEdgeOfScreen() - BorderWidth, PowerButtonTop());
-CornerRadius(3_dp);
-ButtonColor(ColorText());
-RoundTopLeft;
-RoundBottomLeft;
-ConvexObjectColor(ColorBG());
-ConvexObjects(ARROW_SHAPE);
-END_ELEMENT();
+NEW_PARAMETER_SET(ConfUIParameters, RightEdgeOfScreen, BottomOfScreen,
+ DefaultFontSize, BodyFontSize, ShieldColor, ColorText,
+ ColorBG, ColorButton);
-BEGIN_ELEMENT(LabelCancel, teeui::Label)
-FontSize(DefaultFontSize());
-LineHeight(20_dp);
-NumberOfLines(2);
-Dimension(LabelWidth, HeightFromLines);
-Position(BorderWidth, VolUpButtonCenter - dim_h / 2.0_px);
-DefaultText("Press Menu Button to Cancel");
-RightJustified;
-VerticallyCentered;
-TextColor(ColorText());
-Font(FONT(RobotoMedium));
-TextID(TEXT_ID(TranslationId::CANCEL));
-END_ELEMENT();
-
-BEGIN_ELEMENT(IconVolUp, teeui::Button, ConvexObjectCount(2))
-Dimension(BorderWidth, VolUpButtonBottom() - VolUpButtonTop());
-Position(RightEdgeOfScreen() - BorderWidth, VolUpButtonTop());
-CornerRadius(5_dp);
-ButtonColor(ColorBG());
-ConvexObjectColor(ColorText());
-ConvexObjects(ARROW_SHAPE);
-END_ELEMENT();
+CONSTANT(IconShieldDistanceFromTop, 100_dp);
+CONSTANT(LabelBorderZone, 4_dp);
+CONSTANT(RightLabelEdge, RightEdgeOfScreen() - BorderWidth);
+CONSTANT(LabelWidth, RightLabelEdge - BorderWidth);
+CONSTANT(ButtonHeight, 72_dp);
+CONSTANT(ButtonPositionX, 0);
+CONSTANT(ButtonPositionY, BottomOfScreen() - ButtonHeight);
+CONSTANT(ButtonWidth, 130_dp);
+CONSTANT(ButtonLabelDistance, 12_dp);
BEGIN_ELEMENT(IconShield, teeui::Label)
FontSize(24_dp);
LineHeight(24_dp);
NumberOfLines(1);
Dimension(LabelWidth, HeightFromLines);
-Position(BorderWidth, BOTTOM_EDGE_OF(LabelCancel) + 40_dp);
+Position(BorderWidth, IconShieldDistanceFromTop);
DefaultText(
"A"); // ShieldTTF has just one glyph at the code point for capital A
TextColor(ShieldColor());
+HorizontalTextAlignment(Alignment::CENTER);
Font(FONT(Shield));
END_ELEMENT();
@@ -132,8 +76,8 @@
FontSize(20_dp);
LineHeight(20_dp);
NumberOfLines(1);
-Dimension(RightEdgeOfScreen() - BorderWidth, HeightFromLines);
-Position(BorderWidth, BOTTOM_EDGE_OF(IconShield) + 12_dp);
+Dimension(LabelWidth, HeightFromLines);
+Position(BorderWidth, BOTTOM_EDGE_OF(IconShield) + 16_dp);
DefaultText("Android Protected Confirmation");
Font(FONT(RobotoMedium));
VerticallyCentered;
@@ -141,12 +85,56 @@
TextID(TEXT_ID(TranslationId::TITLE));
END_ELEMENT();
+BEGIN_ELEMENT(IconOk, teeui::Button, ConvexObjectCount(1))
+Dimension(ButtonWidth, ButtonHeight - BorderWidth);
+Position(RightEdgeOfScreen() - ButtonWidth - BorderWidth,
+ ButtonPositionY + ButtonLabelDistance);
+CornerRadius(4_dp);
+ButtonColor(ColorButton());
+RoundTopLeft;
+RoundBottomLeft;
+RoundTopRight;
+RoundBottomRight;
+END_ELEMENT();
+
+BEGIN_ELEMENT(LabelOK, teeui::Label)
+FontSize(BodyFontSize());
+LineHeight(BodyFontSize() * 1.4_px);
+NumberOfLines(1);
+Dimension(ButtonWidth - (LabelBorderZone * 2_dp),
+ ButtonHeight - BorderWidth - (LabelBorderZone * 2_dp));
+Position(RightEdgeOfScreen() - ButtonWidth - BorderWidth + LabelBorderZone,
+ ButtonPositionY + ButtonLabelDistance + LabelBorderZone);
+DefaultText("Confirm");
+Font(FONT(RobotoMedium));
+HorizontalTextAlignment(Alignment::CENTER);
+VerticalTextAlignment(Alignment::CENTER);
+TextColor(ColorBG());
+TextID(TEXT_ID(TranslationId::CONFIRM));
+END_ELEMENT();
+
+BEGIN_ELEMENT(LabelCancel, teeui::Label)
+FontSize(BodyFontSize());
+LineHeight(BodyFontSize() * 1.4_px);
+NumberOfLines(1);
+Dimension(ButtonWidth - (LabelBorderZone * 2_dp),
+ ButtonHeight - BorderWidth - (LabelBorderZone * 2_dp));
+Position(BorderWidth + LabelBorderZone,
+ ButtonPositionY + ButtonLabelDistance + LabelBorderZone);
+DefaultText("Cancel");
+HorizontalTextAlignment(Alignment::LEFT);
+Font(FONT(RobotoMedium));
+VerticallyCentered;
+TextColor(ColorButton());
+TextID(TEXT_ID(TranslationId::CANCEL));
+END_ELEMENT();
+
BEGIN_ELEMENT(LabelHint, teeui::Label)
FontSize(DefaultFontSize());
LineHeight(DefaultFontSize() * 1.5_px);
NumberOfLines(4);
Dimension(LabelWidth, HeightFromLines);
-Position(BorderWidth, BottomOfScreen() - BorderWidth - dim_h);
+Position(BorderWidth, ButtonPositionY - dim_h - 48_dp);
DefaultText(
"This confirmation provides an extra layer of security for the action "
"you're "
@@ -161,7 +149,7 @@
FontSize(BodyFontSize());
LineHeight(BodyFontSize() * 1.4_px);
NumberOfLines(20);
-Position(BorderWidth, BOTTOM_EDGE_OF(LabelTitle) + 18_dp);
+Position(BorderWidth, BOTTOM_EDGE_OF(LabelTitle) + 16_dp);
Dimension(LabelWidth, LabelHint::pos_y - pos_y - 24_dp);
DefaultText(
"12345678901234567890123456789012345678901234567890123456789012345678901234"
@@ -171,7 +159,7 @@
Font(FONT(RobotoRegular));
END_ELEMENT();
-NEW_LAYOUT(ConfUILayout, LabelOK, IconPower, LabelCancel, IconVolUp, IconShield,
- LabelTitle, LabelHint, LabelBody);
+NEW_LAYOUT(ConfUILayout, IconShield, LabelTitle, LabelHint, LabelBody, IconOk,
+ LabelOK, LabelCancel);
} // namespace teeui
diff --git a/host/libs/confui/server_common.cc b/host/libs/confui/server_common.cc
index cf46fe3..66adb55 100644
--- a/host/libs/confui/server_common.cc
+++ b/host/libs/confui/server_common.cc
@@ -17,60 +17,37 @@
#include "host/libs/confui/server_common.h"
namespace cuttlefish {
namespace confui {
-static FsmInput UserEvtToFsmInput(UserResponse::type user_response) {
- if (user_response == UserResponse::kConfirm) {
- return FsmInput::kUserUnknown;
- }
- if (user_response == UserResponse::kCancel) {
- return FsmInput::kUserCancel;
- }
- return FsmInput::kUserUnknown;
-}
-
-FsmInput ToFsmInput(const ConfUiMessage& confui_msg) {
- ConfUiCmd cmd = ToCmd(confui_msg.type_);
- if (cmd == ConfUiCmd::kUserInputEvent) {
- return UserEvtToFsmInput(confui_msg.msg_);
- }
- const auto hal_cmd = cmd;
- switch (hal_cmd) {
+FsmInput ToFsmInput(const ConfUiMessage& msg) {
+ const auto cmd = msg.GetType();
+ switch (cmd) {
+ case ConfUiCmd::kUserInputEvent:
+ return FsmInput::kUserEvent;
case ConfUiCmd::kUnknown:
return FsmInput::kHalUnknown;
case ConfUiCmd::kStart:
return FsmInput::kHalStart;
case ConfUiCmd::kStop:
return FsmInput::kHalStop;
- case ConfUiCmd::kSuspend:
- return FsmInput::kHalSuspend;
- case ConfUiCmd::kRestore:
- return FsmInput::kHalRestore;
case ConfUiCmd::kAbort:
return FsmInput::kHalAbort;
case ConfUiCmd::kCliAck:
case ConfUiCmd::kCliRespond:
default:
- ConfUiLog(FATAL) << "The" << ToString(hal_cmd)
- << "is not handled by Session";
+ ConfUiLog(FATAL) << "The" << ToString(cmd)
+ << "is not handled by the Session FSM but "
+ << "directly calls Abort()";
}
return FsmInput::kHalUnknown;
}
std::string ToString(FsmInput input) {
switch (input) {
- case FsmInput::kUserConfirm:
- return {"kUserConfirm"};
- case FsmInput::kUserCancel:
- return {"kUserCancel"};
- case FsmInput::kUserUnknown:
- return {"kUserUnknown"};
+ case FsmInput::kUserEvent:
+ return {"kUserEvent"};
case FsmInput::kHalStart:
return {"kHalStart"};
case FsmInput::kHalStop:
return {"kHalStop"};
- case FsmInput::kHalSuspend:
- return {"kHalSuspend"};
- case FsmInput::kHalRestore:
- return {"kHalRestore"};
case FsmInput::kHalAbort:
return {"kHalAbort"};
case FsmInput::kHalUnknown:
@@ -88,10 +65,10 @@
return "kInSession";
case MainLoopState::kWaitStop:
return "kWaitStop";
- case MainLoopState::kSuspended:
- return "kSuspended";
case MainLoopState::kAwaitCleanup:
return "kAwaitCleanup";
+ case MainLoopState::kTerminated:
+ return "kTerminated";
default:
return "kInvalid";
}
diff --git a/host/libs/confui/server_common.h b/host/libs/confui/server_common.h
index 6175d16..8ffd578 100644
--- a/host/libs/confui/server_common.h
+++ b/host/libs/confui/server_common.h
@@ -17,6 +17,7 @@
#pragma once
#include <cstdint>
+#include <memory>
#include <vector>
#include "common/libs/confui/confui.h"
@@ -27,8 +28,8 @@
kInit = 1,
kInSession = 2,
kWaitStop = 3, // wait ack after sending confirm/cancel
- kSuspended = 4,
kAwaitCleanup = 5,
+ kTerminated = 8,
kInvalid = 9
};
@@ -36,13 +37,9 @@
// FSM input to Session FSM
enum class FsmInput : std::uint32_t {
- kUserConfirm,
- kUserCancel,
- kUserUnknown,
+ kUserEvent = 1,
kHalStart,
kHalStop,
- kHalSuspend,
- kHalRestore,
kHalAbort,
kHalUnknown
};
@@ -50,7 +47,9 @@
std::string ToString(FsmInput input);
std::string ToString(const MainLoopState& state);
-FsmInput ToFsmInput(const ConfUiMessage& confui_msg);
+FsmInput ToFsmInput(const ConfUiMessage& msg);
+std::unique_ptr<ConfUiMessage> CreateFromUserSelection(
+ const std::string& session_id, const UserResponse::type user_selection);
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/host/libs/confui/session.cc b/host/libs/confui/session.cc
index 891250d..d12af9f 100644
--- a/host/libs/confui/session.cc
+++ b/host/libs/confui/session.cc
@@ -16,22 +16,45 @@
#include "host/libs/confui/session.h"
+#include <algorithm>
+
namespace cuttlefish {
namespace confui {
-Session::Session(const std::string& session_id, const std::uint32_t display_num,
- ConfUiRenderer& host_renderer, HostModeCtrl& host_mode_ctrl,
+Session::Session(const std::string& session_name,
+ const std::uint32_t display_num, HostModeCtrl& host_mode_ctrl,
ScreenConnectorFrameRenderer& screen_connector,
const std::string& locale)
- : session_id_{session_id},
+ : session_id_{session_name},
display_num_{display_num},
- renderer_{host_renderer},
host_mode_ctrl_{host_mode_ctrl},
screen_connector_{screen_connector},
locale_{locale},
state_{MainLoopState::kInit},
saved_state_{MainLoopState::kInit} {}
+/** return grace period + alpha
+ *
+ * grace period is the gap between user seeing the dialog
+ * and the UI starts to take the user inputs
+ * Grace period should be at least 1s.
+ * Session requests the Renderer to render the dialog,
+ * but it might not be immediate. So, add alpha to 1s
+ */
+static const std::chrono::milliseconds GetGracePeriod() {
+ using std::literals::chrono_literals::operator""ms;
+ return 1000ms + 100ms;
+}
+
+bool Session::IsReadyForUserInput() const {
+ using std::literals::chrono_literals::operator""ms;
+ if (!start_time_) {
+ return false;
+ }
+ const auto right_now = Clock::now();
+ return (right_now - *start_time_) >= GetGracePeriod();
+}
+
bool Session::IsConfUiActive() const {
if (state_ == MainLoopState::kInSession ||
state_ == MainLoopState::kWaitStop) {
@@ -40,234 +63,236 @@
return false;
}
-bool Session::RenderDialog(const std::string& msg, const std::string& locale) {
- auto [teeui_frame, is_success] = renderer_.RenderRawFrame(msg, locale);
- if (!is_success) {
+template <typename C, typename T>
+static bool Contains(const C& c, T&& item) {
+ auto itr = std::find(c.begin(), c.end(), std::forward<T>(item));
+ return itr != c.end();
+}
+
+bool Session::IsInverted() const {
+ return Contains(ui_options_, teeui::UIOption::AccessibilityInverted);
+}
+
+bool Session::IsMagnified() const {
+ return Contains(ui_options_, teeui::UIOption::AccessibilityMagnified);
+}
+
+bool Session::RenderDialog() {
+ renderer_ = ConfUiRenderer::GenerateRenderer(
+ display_num_, prompt_text_, locale_, IsInverted(), IsMagnified());
+ if (!renderer_) {
return false;
}
- prompt_ = msg;
- locale_ = locale;
-
- ConfUiLog(DEBUG) << "actually trying to render the frame"
- << thread::GetName();
- auto frame_width = ScreenConnectorInfo::ScreenWidth(display_num_);
- auto frame_height = ScreenConnectorInfo::ScreenHeight(display_num_);
- auto frame_stride_bytes =
- ScreenConnectorInfo::ScreenStrideBytes(display_num_);
- auto frame_bytes = reinterpret_cast<std::uint8_t*>(teeui_frame.data());
+ auto teeui_frame = renderer_->RenderRawFrame();
+ if (!teeui_frame) {
+ return false;
+ }
+ ConfUiLog(VERBOSE) << "actually trying to render the frame"
+ << thread::GetName();
+ auto frame_width = teeui_frame->Width();
+ auto frame_height = teeui_frame->Height();
+ auto frame_stride_bytes = teeui_frame->ScreenStrideBytes();
+ auto frame_bytes = reinterpret_cast<std::uint8_t*>(teeui_frame->data());
return screen_connector_.RenderConfirmationUi(
display_num_, frame_width, frame_height, frame_stride_bytes, frame_bytes);
}
-bool Session::IsSuspended() const {
- return (state_ == MainLoopState::kSuspended);
-}
-
-MainLoopState Session::Transition(const bool is_user_input, SharedFD& hal_cli,
- const FsmInput fsm_input,
- const std::string& additional_info) {
+MainLoopState Session::Transition(SharedFD& hal_cli, const FsmInput fsm_input,
+ const ConfUiMessage& conf_ui_message) {
+ bool should_keep_running = false;
+ bool already_terminated = false;
switch (state_) {
case MainLoopState::kInit: {
- HandleInit(is_user_input, hal_cli, fsm_input, additional_info);
+ should_keep_running = HandleInit(hal_cli, fsm_input, conf_ui_message);
} break;
case MainLoopState::kInSession: {
- HandleInSession(is_user_input, hal_cli, fsm_input);
+ should_keep_running =
+ HandleInSession(hal_cli, fsm_input, conf_ui_message);
} break;
case MainLoopState::kWaitStop: {
- if (is_user_input) {
- ConfUiLog(DEBUG) << "User input ignored" << ToString(fsm_input) << " : "
- << additional_info << "at state" << ToString(state_);
+ if (IsUserInput(fsm_input)) {
+ ConfUiLog(VERBOSE) << "User input ignored " << ToString(fsm_input)
+ << " : " << ToString(conf_ui_message)
+ << " at the state " << ToString(state_);
}
- HandleWaitStop(is_user_input, hal_cli, fsm_input);
+ should_keep_running = HandleWaitStop(hal_cli, fsm_input);
+ } break;
+ case MainLoopState::kTerminated: {
+ already_terminated = true;
} break;
default:
- // host service explicitly calls restore and suspend
- ConfUiLog(FATAL) << "Must not be in the state of" << ToString(state_);
+ ConfUiLog(FATAL) << "Must not be in the state of " << ToString(state_);
break;
}
+ if (!should_keep_running && !already_terminated) {
+ ScheduleToTerminate();
+ }
return state_;
};
-bool Session::Suspend(SharedFD hal_cli) {
- if (state_ == MainLoopState::kInit) {
- // HAL sent wrong command
- ConfUiLog(FATAL)
- << "HAL sent wrong command, suspend, when the session is in kIinit";
- return false;
- }
- if (state_ == MainLoopState::kSuspended) {
- ConfUiLog(DEBUG) << "Already kSuspended state";
- return false;
- }
- saved_state_ = state_;
- state_ = MainLoopState::kSuspended;
- host_mode_ctrl_.SetMode(HostModeCtrl::ModeType::kAndroidMode);
- if (!packet::SendAck(hal_cli, session_id_, /*is success*/ true,
- "suspended")) {
- ConfUiLog(FATAL) << "I/O error";
- return false;
- }
- return true;
-}
-
-bool Session::Restore(SharedFD hal_cli) {
- if (state_ == MainLoopState::kInit) {
- // HAL sent wrong command
- ConfUiLog(FATAL)
- << "HAL sent wrong command, restore, when the session is in kIinit";
- return false;
- }
-
- if (state_ != MainLoopState::kSuspended) {
- ConfUiLog(DEBUG) << "Already Restored to state " + ToString(state_);
- return false;
- }
- host_mode_ctrl_.SetMode(HostModeCtrl::ModeType::kConfUI_Mode);
- if (!RenderDialog(prompt_, locale_)) {
- // the confirmation UI is driven by a user app, not running from the start
- // automatically so that means webRTC/vnc should have been set up
- ConfUiLog(ERROR) << "Dialog is not rendered. However, it should."
- << "No webRTC can't initiate any confirmation UI.";
- if (!packet::SendAck(hal_cli, session_id_, false,
- "render failed in restore")) {
- ConfUiLog(FATAL) << "Rendering failed in restore, and ack failed in I/O";
- }
- state_ = MainLoopState::kInit;
- return false;
- }
- if (!packet::SendAck(hal_cli, session_id_, true, "restored")) {
- ConfUiLog(FATAL) << "Ack to restore failed in I/O";
- }
- state_ = saved_state_;
- saved_state_ = MainLoopState::kInit;
- return true;
-}
-
-bool Session::Kill(SharedFD hal_cli, const std::string& response_msg) {
- state_ = MainLoopState::kAwaitCleanup;
- saved_state_ = MainLoopState::kInvalid;
- if (!packet::SendAck(hal_cli, session_id_, true, response_msg)) {
- ConfUiLog(FATAL) << "I/O error in ack to Abort";
- return false;
- }
- return true;
-}
-
void Session::CleanUp() {
if (state_ != MainLoopState::kAwaitCleanup) {
ConfUiLog(FATAL) << "Clean up a session only when in kAwaitCleanup";
}
+ state_ = MainLoopState::kTerminated;
// common action done when the state is back to init state
host_mode_ctrl_.SetMode(HostModeCtrl::ModeType::kAndroidMode);
}
-void Session::ReportErrorToHal(SharedFD hal_cli, const std::string& msg) {
- // reset the session -- destroy it & recreate it with the same
- // session id
+void Session::ScheduleToTerminate() {
state_ = MainLoopState::kAwaitCleanup;
- if (!packet::SendAck(hal_cli, session_id_, false, msg)) {
- ConfUiLog(FATAL) << "I/O error in sending ack to report rendering failure";
+ saved_state_ = MainLoopState::kInvalid;
+}
+
+bool Session::ReportErrorToHal(SharedFD hal_cli, const std::string& msg) {
+ ScheduleToTerminate();
+ if (!SendAck(hal_cli, session_id_, false, msg)) {
+ ConfUiLog(ERROR) << "I/O error in sending ack to report rendering failure";
+ return false;
}
+ return true;
+}
+
+void Session::Abort() {
+ ConfUiLog(VERBOSE) << "Abort is called";
+ ScheduleToTerminate();
return;
}
-bool Session::Abort(SharedFD hal_cli) { return Kill(hal_cli, "aborted"); }
+void Session::UserAbort(SharedFD hal_cli) {
+ ConfUiLog(VERBOSE) << "it is a user abort input.";
+ SendAbortCmd(hal_cli, GetId());
+ Abort();
+ ScheduleToTerminate();
+}
-void Session::HandleInit(const bool is_user_input, SharedFD hal_cli,
- const FsmInput fsm_input,
- const std::string& additional_info) {
- using namespace cuttlefish::confui::packet;
- if (is_user_input) {
+bool Session::HandleInit(SharedFD hal_cli, const FsmInput fsm_input,
+ const ConfUiMessage& conf_ui_message) {
+ if (IsUserInput(fsm_input)) {
// ignore user input
state_ = MainLoopState::kInit;
- return;
+ return true;
}
- ConfUiLog(DEBUG) << ToString(fsm_input) << "is handled in HandleInit";
+ ConfUiLog(VERBOSE) << ToString(fsm_input) << "is handled in HandleInit";
if (fsm_input != FsmInput::kHalStart) {
ConfUiLog(ERROR) << "invalid cmd for Init State:" << ToString(fsm_input);
- // reset the session -- destroy it & recreate it with the same
- // session id
- ReportErrorToHal(hal_cli, "wrong hal command");
- return;
+ // ReportErrorToHal returns true if error report was successful
+ // However, anyway we abort this session on the host
+ ReportErrorToHal(hal_cli, HostError::kSystemError);
+ return false;
}
// Start Session
- ConfUiLog(DEBUG) << "Sending ack to hal_cli: "
- << Enum2Base(ConfUiCmd::kCliAck);
+ ConfUiLog(VERBOSE) << "Sending ack to hal_cli: "
+ << Enum2Base(ConfUiCmd::kCliAck);
host_mode_ctrl_.SetMode(HostModeCtrl::ModeType::kConfUI_Mode);
- auto confirmation_msg = additional_info;
- if (!RenderDialog(confirmation_msg, locale_)) {
+
+ auto start_cmd_msg = static_cast<const ConfUiStartMessage&>(conf_ui_message);
+ prompt_text_ = start_cmd_msg.GetPromptText();
+ locale_ = start_cmd_msg.GetLocale();
+ extra_data_ = start_cmd_msg.GetExtraData();
+ ui_options_ = start_cmd_msg.GetUiOpts();
+
+ // cbor_ can be correctly created after the session received kStart cmd
+ // at runtime
+ cbor_ = std::make_unique<Cbor>(prompt_text_, extra_data_);
+ if (cbor_->IsMessageTooLong()) {
+ ConfUiLog(ERROR) << "The prompt text and extra_data are too long to be "
+ << "properly encoded.";
+ ReportErrorToHal(hal_cli, HostError::kMessageTooLongError);
+ return false;
+ }
+ if (cbor_->IsMalformedUtf8()) {
+ ConfUiLog(ERROR) << "The prompt text appears to have incorrect UTF8 format";
+ ReportErrorToHal(hal_cli, HostError::kIncorrectUTF8);
+ return false;
+ }
+
+ if (!RenderDialog()) {
// the confirmation UI is driven by a user app, not running from the start
- // automatically so that means webRTC/vnc should have been set up
+ // automatically so that means webRTC should have been set up
ConfUiLog(ERROR) << "Dialog is not rendered. However, it should."
<< "No webRTC can't initiate any confirmation UI.";
- ReportErrorToHal(hal_cli, "rendering failed");
- return;
+ ReportErrorToHal(hal_cli, HostError::kUIError);
+ return false;
}
- if (!packet::SendAck(hal_cli, session_id_, true, "started")) {
- ConfUiLog(FATAL) << "Ack to kStart failed in I/O";
+ start_time_ = std::make_unique<TimePoint>(std::move(Clock::now()));
+ if (!SendAck(hal_cli, session_id_, true, "started")) {
+ ConfUiLog(ERROR) << "Ack to kStart failed in I/O";
+ return false;
}
state_ = MainLoopState::kInSession;
- return;
+ return true;
}
-void Session::HandleInSession(const bool is_user_input, SharedFD hal_cli,
- const FsmInput fsm_input) {
- if (!is_user_input) {
- ConfUiLog(FATAL) << "cmd" << ToString(fsm_input)
- << "should not be handled in HandleInSession";
- ReportErrorToHal(hal_cli, "wrong hal command");
- return;
+bool Session::HandleInSession(SharedFD hal_cli, const FsmInput fsm_input,
+ const ConfUiMessage& conf_ui_msg) {
+ auto invalid_input_handler = [&, this]() {
+ ReportErrorToHal(hal_cli, HostError::kSystemError);
+ ConfUiLog(ERROR) << "cmd " << ToString(fsm_input)
+ << " should not be handled in HandleInSession";
+ };
+
+ if (!IsUserInput(fsm_input)) {
+ invalid_input_handler();
+ return false;
}
- // send to hal_cli either confirm or cancel
- if (fsm_input != FsmInput::kUserConfirm &&
- fsm_input != FsmInput::kUserCancel) {
- /*
- * TODO([email protected]): change here when other user inputs must
- * be handled
- *
- */
- if (!packet::SendAck(hal_cli, session_id_, true,
- "invalid user input error")) {
- // note that input is what we control in memory
- ConfUiCheck(false) << "Input must be either confirm or cancel for now.";
+ const auto& user_input_msg =
+ static_cast<const ConfUiUserSelectionMessage&>(conf_ui_msg);
+ const auto response = user_input_msg.GetResponse();
+ if (response == UserResponse::kUnknown ||
+ response == UserResponse::kUserAbort) {
+ invalid_input_handler();
+ return false;
+ }
+
+ ConfUiLog(VERBOSE) << "In HandleInSession, session " << session_id_
+ << " is sending the user input " << ToString(fsm_input);
+
+ bool is_success = false;
+ if (response == UserResponse::kCancel) {
+ // no need to sign
+ is_success =
+ SendResponse(hal_cli, session_id_, UserResponse::kCancel,
+ std::vector<std::uint8_t>{}, std::vector<std::uint8_t>{});
+ } else {
+ // TODO(kwstephenkim): sign using cuttlefish host secure_env
+ message_ = std::move(cbor_->GetMessage());
+ auto message_opt = sign(message_);
+ if (!message_opt) {
+ ReportErrorToHal(hal_cli, HostError::kSystemError);
+ return false;
}
- return;
+ signed_confirmation_ = message_opt.value();
+ is_success = SendResponse(hal_cli, session_id_, UserResponse::kConfirm,
+ signed_confirmation_, message_);
}
- ConfUiLog(DEBUG) << "In HandlieInSession, session" << session_id_
- << "is sending the user input" << ToString(fsm_input);
- auto selection = UserResponse::kConfirm;
- if (fsm_input == FsmInput::kUserCancel) {
- selection = UserResponse::kCancel;
- }
- if (!packet::SendResponse(hal_cli, session_id_, selection)) {
- ConfUiLog(FATAL) << "I/O error in sending user response to HAL";
+ if (!is_success) {
+ ConfUiLog(ERROR) << "I/O error in sending user response to HAL";
+ return false;
}
state_ = MainLoopState::kWaitStop;
- return;
+ return true;
}
-void Session::HandleWaitStop(const bool is_user_input, SharedFD hal_cli,
- const FsmInput fsm_input) {
- using namespace cuttlefish::confui::packet;
-
- if (is_user_input) {
+bool Session::HandleWaitStop(SharedFD hal_cli, const FsmInput fsm_input) {
+ if (IsUserInput(fsm_input)) {
// ignore user input
state_ = MainLoopState::kWaitStop;
- return;
+ return true;
}
if (fsm_input == FsmInput::kHalStop) {
- ConfUiLog(DEBUG) << "Handling Abort in kWaitStop.";
- Kill(hal_cli, "stopped");
- return;
+ ConfUiLog(VERBOSE) << "Handling Abort in kWaitStop.";
+ ScheduleToTerminate();
+ return true;
}
+ ReportErrorToHal(hal_cli, HostError::kSystemError);
ConfUiLog(FATAL) << "In WaitStop, received wrong HAL command "
<< ToString(fsm_input);
- state_ = MainLoopState::kAwaitCleanup;
- return;
+ return false;
}
} // end of namespace confui
diff --git a/host/libs/confui/session.h b/host/libs/confui/session.h
index 87e98c9..1afccac 100644
--- a/host/libs/confui/session.h
+++ b/host/libs/confui/session.h
@@ -16,13 +16,19 @@
#pragma once
+#include <atomic>
+#include <chrono>
#include <memory>
+#include <string>
+
+#include <teeui/msg_formatting.h>
#include "common/libs/confui/confui.h"
+#include "host/libs/confui/cbor.h"
#include "host/libs/confui/host_mode_ctrl.h"
#include "host/libs/confui/host_renderer.h"
#include "host/libs/confui/server_common.h"
-#include "host/libs/confui/session.h"
+#include "host/libs/confui/sign.h"
#include "host/libs/screen_connector/screen_connector.h"
namespace cuttlefish {
@@ -37,8 +43,8 @@
*/
class Session {
public:
- Session(const std::string& session_id, const std::uint32_t display_num,
- ConfUiRenderer& host_renderer, HostModeCtrl& host_mode_ctrl,
+ Session(const std::string& session_name, const std::uint32_t display_num,
+ HostModeCtrl& host_mode_ctrl,
ScreenConnectorFrameRenderer& screen_connector,
const std::string& locale = "en");
@@ -48,9 +54,8 @@
MainLoopState GetState() { return state_; }
- MainLoopState Transition(const bool is_user_input, SharedFD& hal_cli,
- const FsmInput fsm_input,
- const std::string& additional_info);
+ MainLoopState Transition(SharedFD& hal_cli, const FsmInput fsm_input,
+ const ConfUiMessage& conf_ui_message);
/**
* this make a transition from kWaitStop or kInSession to kSuspend
@@ -63,49 +68,82 @@
bool Restore(SharedFD hal_cli);
// abort session
- bool Abort(SharedFD hal_cli);
+ void Abort();
+
+ // client on the host wants to abort
+ // should let the guest know it
+ void UserAbort(SharedFD hal_cli);
bool IsSuspended() const;
void CleanUp();
+ bool IsConfirm(const int x, const int y) {
+ return renderer_->IsInConfirm(x, y);
+ }
+
+ bool IsCancel(const int x, const int y) {
+ return renderer_->IsInCancel(x, y);
+ }
+
+ // tell if grace period has passed
+ bool IsReadyForUserInput() const;
+
private:
- /** create a frame, and render it on the vnc/webRTC client
+ bool IsUserInput(const FsmInput fsm_input) {
+ return fsm_input == FsmInput::kUserEvent;
+ }
+
+ /** create a frame, and render it on the webRTC client
*
* note that this does not check host_ctrl_mode_
*/
- bool RenderDialog(const std::string& msg, const std::string& locale);
+ bool RenderDialog();
// transition actions on each state per input
// the new state will be save to the state_ at the end of each call
- void HandleInit(const bool is_user_input, SharedFD hal_cli,
- const FsmInput fsm_input, const std::string& additional_info);
+ //
+ // when false is returned, the FSM must terminate
+ // and, no need to let the guest know
+ bool HandleInit(SharedFD hal_cli, const FsmInput fsm_input,
+ const ConfUiMessage& conf_ui_msg);
- void HandleWaitStop(const bool is_user_input, SharedFD hal_cli,
- const FsmInput fsm_input);
+ bool HandleWaitStop(SharedFD hal_cli, const FsmInput fsm_input);
- void HandleInSession(const bool is_user_input, SharedFD hal_cli,
- const FsmInput fsm_input);
-
- bool Kill(SharedFD hal_cli, const std::string& response_msg);
+ bool HandleInSession(SharedFD hal_cli, const FsmInput fsm_input,
+ const ConfUiMessage& conf_ui_msg);
// report with an error ack to HAL, and reset the FSM
- void ReportErrorToHal(SharedFD hal_cli, const std::string& msg);
+ bool ReportErrorToHal(SharedFD hal_cli, const std::string& msg);
+
+ void ScheduleToTerminate();
+
+ bool IsInverted() const;
+ bool IsMagnified() const;
const std::string session_id_;
const std::uint32_t display_num_;
- // host renderer is shared across sessions
- ConfUiRenderer& renderer_;
+ std::unique_ptr<ConfUiRenderer> renderer_;
HostModeCtrl& host_mode_ctrl_;
ScreenConnectorFrameRenderer& screen_connector_;
// only context to save
- std::string prompt_;
+ std::string prompt_text_;
std::string locale_;
+ std::vector<teeui::UIOption> ui_options_;
+ std::vector<std::uint8_t> extra_data_;
+ // the second argument for resultCB of promptUserConfirmation
+ std::vector<std::uint8_t> signed_confirmation_;
+ std::vector<std::uint8_t> message_;
- // effectively, this variables are shared with vnc, webRTC thread
+ std::unique_ptr<Cbor> cbor_;
+
+ // effectively, this variables are shared with webRTC thread
// the input demuxer will check the confirmation UI mode based on this
std::atomic<MainLoopState> state_;
MainLoopState saved_state_; // for restore/suspend
+ using Clock = std::chrono::steady_clock;
+ using TimePoint = std::chrono::time_point<Clock>;
+ std::unique_ptr<TimePoint> start_time_;
};
} // end of namespace confui
} // end of namespace cuttlefish
diff --git a/host/libs/confui/sign.cc b/host/libs/confui/sign.cc
new file mode 100644
index 0000000..683e9fc
--- /dev/null
+++ b/host/libs/confui/sign.cc
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "host/libs/confui/sign.h"
+
+#include <openssl/hmac.h>
+#include <openssl/sha.h>
+
+#include "host/libs/confui/sign_utils.h"
+
+namespace cuttlefish {
+namespace confui {
+class HMacImplementation {
+ public:
+ static std::optional<support::hmac_t> hmac256(
+ const support::auth_token_key_t& key,
+ std::initializer_list<support::ByteBufferProxy> buffers);
+};
+
+std::optional<support::hmac_t> HMacImplementation::hmac256(
+ const support::auth_token_key_t& key,
+ std::initializer_list<support::ByteBufferProxy> buffers) {
+ HMAC_CTX hmacCtx;
+ HMAC_CTX_init(&hmacCtx);
+ if (!HMAC_Init_ex(&hmacCtx, key.data(), key.size(), EVP_sha256(), nullptr)) {
+ return {};
+ }
+ for (auto& buffer : buffers) {
+ if (!HMAC_Update(&hmacCtx, buffer.data(), buffer.size())) {
+ return {};
+ }
+ }
+ support::hmac_t result;
+ if (!HMAC_Final(&hmacCtx, result.data(), nullptr)) {
+ return {};
+ }
+ return result;
+}
+
+/**
+ * The test key is 32byte word with all bytes set to TestKeyBits::BYTE.
+ */
+enum class TestKeyBits : uint8_t {
+ BYTE = 165 /* 0xA5 */,
+};
+
+std::optional<std::vector<std::uint8_t>> sign(
+ const std::vector<std::uint8_t>& message) {
+ // the same as userConfirm()
+ using namespace support;
+ auth_token_key_t key;
+ key.fill(static_cast<std::uint8_t>(TestKeyBits::BYTE));
+ using HMacer = HMacImplementation;
+ auto confirm_signed_opt =
+ HMacer::hmac256(key, {"confirmation token", message});
+ if (!confirm_signed_opt) {
+ return std::nullopt;
+ }
+ auto confirm_signed = confirm_signed_opt.value();
+ return {
+ std::vector<std::uint8_t>(confirm_signed.begin(), confirm_signed.end())};
+}
+
+} // namespace confui
+} // end of namespace cuttlefish
diff --git a/host/libs/confui/sign.h b/host/libs/confui/sign.h
new file mode 100644
index 0000000..d617da7
--- /dev/null
+++ b/host/libs/confui/sign.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <cstdint>
+#include <optional>
+#include <vector>
+
+namespace cuttlefish {
+namespace confui {
+
+// TODO(kwstephenkim): replace this with signing using secure env host services
+std::optional<std::vector<std::uint8_t>> sign(
+ const std::vector<std::uint8_t>& message);
+
+} // namespace confui
+} // end of namespace cuttlefish
diff --git a/host/libs/confui/sign_utils.h b/host/libs/confui/sign_utils.h
new file mode 100644
index 0000000..929f32a
--- /dev/null
+++ b/host/libs/confui/sign_utils.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <array>
+#include <cstdint>
+
+namespace cuttlefish {
+namespace confui {
+namespace support {
+using auth_token_key_t = std::array<std::uint8_t, 32>;
+using hmac_t = auth_token_key_t;
+
+template <typename T>
+auto bytes_cast(const T& v) -> const uint8_t (&)[sizeof(T)] {
+ return *reinterpret_cast<const uint8_t(*)[sizeof(T)]>(&v);
+}
+template <typename T>
+auto bytes_cast(T& v) -> uint8_t (&)[sizeof(T)] {
+ return *reinterpret_cast<uint8_t(*)[sizeof(T)]>(&v);
+}
+
+template <typename IntType, uint32_t byteOrder>
+struct choose_hton;
+
+template <typename IntType>
+struct choose_hton<IntType, __ORDER_LITTLE_ENDIAN__> {
+ inline static IntType hton(const IntType& value) {
+ IntType result = {};
+ const unsigned char* inbytes =
+ reinterpret_cast<const unsigned char*>(&value);
+ unsigned char* outbytes = reinterpret_cast<unsigned char*>(&result);
+ for (int i = sizeof(IntType) - 1; i >= 0; --i) {
+ *(outbytes++) = inbytes[i];
+ }
+ return result;
+ }
+};
+
+template <typename IntType>
+struct choose_hton<IntType, __ORDER_BIG_ENDIAN__> {
+ inline static IntType hton(const IntType& value) { return value; }
+};
+
+template <typename IntType>
+inline IntType hton(const IntType& value) {
+ return choose_hton<IntType, __BYTE_ORDER__>::hton(value);
+}
+
+class ByteBufferProxy {
+ template <typename T>
+ struct has_data {
+ template <typename U>
+ static int f(const U*, const void*) {
+ return 0;
+ }
+ template <typename U>
+ static int* f(const U* u, decltype(u->data())) {
+ return nullptr;
+ }
+ static constexpr bool value =
+ std::is_pointer<decltype(f((T*)nullptr, ""))>::value;
+ };
+
+ public:
+ template <typename T>
+ ByteBufferProxy(const T& buffer, decltype(buffer.data()) = nullptr)
+ : data_(reinterpret_cast<const uint8_t*>(buffer.data())),
+ size_(buffer.size()) {
+ static_assert(sizeof(decltype(*buffer.data())) == 1, "elements to large");
+ }
+
+ // this overload kicks in for types that have .c_str() but not .data(), such
+ // as hidl_string. std::string has both so we need to explicitly disable this
+ // overload if .data() is present.
+ template <typename T>
+ ByteBufferProxy(
+ const T& buffer,
+ std::enable_if_t<!has_data<T>::value, decltype(buffer.c_str())> = nullptr)
+ : data_(reinterpret_cast<const uint8_t*>(buffer.c_str())),
+ size_(buffer.size()) {
+ static_assert(sizeof(decltype(*buffer.c_str())) == 1, "elements to large");
+ }
+
+ template <size_t size>
+ ByteBufferProxy(const char (&buffer)[size])
+ : data_(reinterpret_cast<const uint8_t*>(buffer)), size_(size - 1) {
+ static_assert(size > 0, "even an empty string must be 0-terminated");
+ }
+
+ template <size_t size>
+ ByteBufferProxy(const uint8_t (&buffer)[size]) : data_(buffer), size_(size) {}
+
+ ByteBufferProxy() : data_(nullptr), size_(0) {}
+
+ const uint8_t* data() const { return data_; }
+ size_t size() const { return size_; }
+
+ const uint8_t* begin() const { return data_; }
+ const uint8_t* end() const { return data_ + size_; }
+
+ private:
+ const uint8_t* data_;
+ size_t size_;
+};
+
+// copied from:
+// hardware/interface/confirmationui/support/include/android/hardware/confirmationui/support/confirmationui_utils.h
+
+} // end of namespace support
+} // end of namespace confui
+} // end of namespace cuttlefish
diff --git a/host/libs/graphics_detector/Android.bp b/host/libs/graphics_detector/Android.bp
index bd6a55e..679825a 100644
--- a/host/libs/graphics_detector/Android.bp
+++ b/host/libs/graphics_detector/Android.bp
@@ -36,6 +36,7 @@
],
header_libs: [
"egl_headers",
+ "gl_headers",
"vulkan_headers",
],
shared_libs: [
@@ -44,3 +45,19 @@
],
defaults: ["cuttlefish_host"],
}
+
+cc_binary {
+ name: "detect_graphics",
+ srcs: [
+ "detect_graphics.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "liblog",
+ ],
+ static_libs: [
+ "libcuttlefish_graphics_detector",
+ "libgflags",
+ ],
+ defaults: ["cuttlefish_host"],
+}
diff --git a/host/libs/graphics_detector/detect_graphics.cpp b/host/libs/graphics_detector/detect_graphics.cpp
new file mode 100644
index 0000000..6032520
--- /dev/null
+++ b/host/libs/graphics_detector/detect_graphics.cpp
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+
+#include <gflags/gflags.h>
+
+#include "android-base/logging.h"
+#include "host/libs/graphics_detector/graphics_detector.h"
+
+int main(int argc, char* argv[]) {
+ ::android::base::InitLogging(argv, android::base::StdioLogger);
+ ::android::base::SetMinimumLogSeverity(android::base::VERBOSE);
+ ::gflags::ParseCommandLineFlags(&argc, &argv, true);
+ LOG(INFO) << cuttlefish::GetGraphicsAvailabilityWithSubprocessCheck();
+}
\ No newline at end of file
diff --git a/host/libs/graphics_detector/graphics_detector.cpp b/host/libs/graphics_detector/graphics_detector.cpp
index 367e637..5776c41 100644
--- a/host/libs/graphics_detector/graphics_detector.cpp
+++ b/host/libs/graphics_detector/graphics_detector.cpp
@@ -21,6 +21,7 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
+#include <GLES2/gl2.h>
#include <android-base/logging.h>
#include <android-base/strings.h>
#include <dlfcn.h>
@@ -57,50 +58,50 @@
void PopulateGlAvailability(GraphicsAvailability* availability) {
ManagedLibrary gl_lib(dlopen(kGlLib, RTLD_NOW | RTLD_LOCAL));
if (!gl_lib) {
- LOG(VERBOSE) << "Failed to dlopen " << kGlLib << ".";
+ LOG(DEBUG) << "Failed to dlopen " << kGlLib << ".";
return;
}
- LOG(VERBOSE) << "Loaded " << kGlLib << ".";
+ LOG(DEBUG) << "Loaded " << kGlLib << ".";
availability->has_gl = true;
}
void PopulateGles1Availability(GraphicsAvailability* availability) {
ManagedLibrary gles1_lib(dlopen(kGles1Lib, RTLD_NOW | RTLD_LOCAL));
if (!gles1_lib) {
- LOG(VERBOSE) << "Failed to dlopen " << kGles1Lib << ".";
+ LOG(DEBUG) << "Failed to dlopen " << kGles1Lib << ".";
return;
}
- LOG(VERBOSE) << "Loaded " << kGles1Lib << ".";
+ LOG(DEBUG) << "Loaded " << kGles1Lib << ".";
availability->has_gles1 = true;
}
void PopulateGles2Availability(GraphicsAvailability* availability) {
ManagedLibrary gles2_lib(dlopen(kGles2Lib, RTLD_NOW | RTLD_LOCAL));
if (!gles2_lib) {
- LOG(VERBOSE) << "Failed to dlopen " << kGles2Lib << ".";
+ LOG(DEBUG) << "Failed to dlopen " << kGles2Lib << ".";
return;
}
- LOG(VERBOSE) << "Loaded " << kGles2Lib << ".";
+ LOG(DEBUG) << "Loaded " << kGles2Lib << ".";
availability->has_gles2 = true;
}
void PopulateEglAvailability(GraphicsAvailability* availability) {
ManagedLibrary egllib(dlopen(kEglLib, RTLD_NOW | RTLD_LOCAL));
if (!egllib) {
- LOG(VERBOSE) << "Failed to dlopen " << kEglLib << ".";
+ LOG(DEBUG) << "Failed to dlopen " << kEglLib << ".";
return;
}
- LOG(VERBOSE) << "Loaded " << kEglLib << ".";
+ LOG(DEBUG) << "Loaded " << kEglLib << ".";
availability->has_egl = true;
PFNEGLGETPROCADDRESSPROC eglGetProcAddress =
reinterpret_cast<PFNEGLGETPROCADDRESSPROC>(
dlsym(egllib.get(), "eglGetProcAddress"));
if (eglGetProcAddress == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglGetProcAddress.";
+ LOG(DEBUG) << "Failed to find function eglGetProcAddress.";
return;
}
- LOG(VERBOSE) << "Loaded eglGetProcAddress.";
+ LOG(DEBUG) << "Loaded eglGetProcAddress.";
// Some implementations have it so that eglGetProcAddress is only for
// loading EXT functions.
@@ -115,155 +116,127 @@
PFNEGLGETERRORPROC eglGetError =
reinterpret_cast<PFNEGLGETERRORPROC>(EglLoadFunction("eglGetError"));
if (eglGetError == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglGetError.";
+ LOG(DEBUG) << "Failed to find function eglGetError.";
return;
}
- LOG(VERBOSE) << "Loaded eglGetError.";
+ LOG(DEBUG) << "Loaded eglGetError.";
PFNEGLGETDISPLAYPROC eglGetDisplay =
reinterpret_cast<PFNEGLGETDISPLAYPROC>(EglLoadFunction("eglGetDisplay"));
if (eglGetDisplay == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglGetDisplay.";
+ LOG(DEBUG) << "Failed to find function eglGetDisplay.";
return;
}
- LOG(VERBOSE) << "Loaded eglGetDisplay.";
-
- EGLDisplay default_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (default_display == EGL_NO_DISPLAY) {
- LOG(VERBOSE) << "Failed to get default display. " << eglGetError();
- return;
- }
- LOG(VERBOSE) << "Found default display.";
- availability->has_egl_default_display = true;
-
- PFNEGLINITIALIZEPROC eglInitialize =
- reinterpret_cast<PFNEGLINITIALIZEPROC>(EglLoadFunction("eglInitialize"));
- if (eglInitialize == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglQueryString";
- return;
- }
-
- EGLint client_version_major = 0;
- EGLint client_version_minor = 0;
- if (eglInitialize(default_display,
- &client_version_major,
- &client_version_minor) != EGL_TRUE) {
- LOG(VERBOSE) << "Failed to initialize default display.";
- return;
- }
- LOG(VERBOSE) << "Initialized default display.";
+ LOG(DEBUG) << "Loaded eglGetDisplay.";
PFNEGLQUERYSTRINGPROC eglQueryString =
reinterpret_cast<PFNEGLQUERYSTRINGPROC>(EglLoadFunction("eglQueryString"));
if (eglQueryString == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglQueryString";
+ LOG(DEBUG) << "Failed to find function eglQueryString";
return;
}
- LOG(VERBOSE) << "Loaded eglQueryString.";
+ LOG(DEBUG) << "Loaded eglQueryString.";
- std::string client_extensions;
- if (client_version_major >= 1 && client_version_minor >= 5) {
- client_extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
- }
- availability->egl_client_extensions = client_extensions;
-
- EGLDisplay display = EGL_NO_DISPLAY;
-
- if (client_extensions.find("EGL_EXT_platform_base") != std::string::npos) {
- LOG(VERBOSE) << "Client extension EGL_EXT_platform_base is supported.";
+ EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ if (display != EGL_NO_DISPLAY) {
+ LOG(DEBUG) << "Found default display.";
+ } else {
+ LOG(DEBUG) << "Failed to get default display. " << eglGetError()
+ << ". Attempting to get surfaceless display via "
+ << "eglGetPlatformDisplayEXT(EGL_PLATFORM_SURFACELESS_MESA)";
PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT =
reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(
EglLoadFunction("eglGetPlatformDisplayEXT"));
if (eglGetPlatformDisplayEXT == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglGetPlatformDisplayEXT";
- return;
+ LOG(DEBUG) << "Failed to find function eglGetPlatformDisplayEXT";
+ } else {
+ display = eglGetPlatformDisplayEXT(EGL_PLATFORM_SURFACELESS_MESA,
+ EGL_DEFAULT_DISPLAY, NULL);
}
+ }
- display =
- eglGetPlatformDisplayEXT(EGL_PLATFORM_SURFACELESS_MESA,
- EGL_DEFAULT_DISPLAY,
- NULL);
- } else {
- LOG(VERBOSE) << "Failed to find client extension EGL_EXT_platform_base.";
- }
if (display == EGL_NO_DISPLAY) {
- LOG(VERBOSE) << "Failed to get EGL_PLATFORM_SURFACELESS_MESA display..."
- << "failing back to EGL_DEFAULT_DISPLAY display.";
- display = default_display;
- }
- if (display == EGL_NO_DISPLAY) {
- LOG(VERBOSE) << "Failed to find display.";
+ LOG(DEBUG) << "Failed to find display.";
return;
}
+ PFNEGLINITIALIZEPROC eglInitialize =
+ reinterpret_cast<PFNEGLINITIALIZEPROC>(EglLoadFunction("eglInitialize"));
+ if (eglInitialize == nullptr) {
+ LOG(DEBUG) << "Failed to find function eglQueryString";
+ return;
+ }
+
+ EGLint client_version_major = 0;
+ EGLint client_version_minor = 0;
if (eglInitialize(display,
&client_version_major,
&client_version_minor) != EGL_TRUE) {
- LOG(VERBOSE) << "Failed to initialize surfaceless display.";
+ LOG(DEBUG) << "Failed to initialize display.";
return;
}
- LOG(VERBOSE) << "Initialized surfaceless display.";
+ LOG(DEBUG) << "Initialized display.";
const std::string version_string = eglQueryString(display, EGL_VERSION);
if (version_string.empty()) {
- LOG(VERBOSE) << "Failed to query client version.";
+ LOG(DEBUG) << "Failed to query client version.";
return;
}
- LOG(VERBOSE) << "Found version: " << version_string;
+ LOG(DEBUG) << "Found version: " << version_string;
availability->egl_version = version_string;
const std::string vendor_string = eglQueryString(display, EGL_VENDOR);
if (vendor_string.empty()) {
- LOG(VERBOSE) << "Failed to query vendor.";
+ LOG(DEBUG) << "Failed to query vendor.";
return;
}
- LOG(VERBOSE) << "Found vendor: " << vendor_string;
+ LOG(DEBUG) << "Found vendor: " << vendor_string;
availability->egl_vendor = vendor_string;
const std::string extensions_string = eglQueryString(display, EGL_EXTENSIONS);
if (extensions_string.empty()) {
- LOG(VERBOSE) << "Failed to query extensions.";
+ LOG(DEBUG) << "Failed to query extensions.";
return;
}
- LOG(VERBOSE) << "Found extensions: " << extensions_string;
+ LOG(DEBUG) << "Found extensions: " << extensions_string;
availability->egl_extensions = extensions_string;
if (extensions_string.find(kSurfacelessContextExt) == std::string::npos) {
- LOG(VERBOSE) << "Failed to find extension EGL_KHR_surfaceless_context.";
+ LOG(DEBUG) << "Failed to find extension EGL_KHR_surfaceless_context.";
return;
}
const std::string display_apis_string = eglQueryString(display,
EGL_CLIENT_APIS);
if (display_apis_string.empty()) {
- LOG(VERBOSE) << "Failed to query display apis.";
+ LOG(DEBUG) << "Failed to query display apis.";
return;
}
- LOG(VERBOSE) << "Found display apis: " << display_apis_string;
+ LOG(DEBUG) << "Found display apis: " << display_apis_string;
PFNEGLBINDAPIPROC eglBindAPI =
reinterpret_cast<PFNEGLBINDAPIPROC>(EglLoadFunction("eglBindAPI"));
if (eglBindAPI == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglBindAPI";
+ LOG(DEBUG) << "Failed to find function eglBindAPI";
return;
}
- LOG(VERBOSE) << "Loaded eglBindAPI.";
+ LOG(DEBUG) << "Loaded eglBindAPI.";
if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
- LOG(VERBOSE) << "Failed to bind GLES API.";
+ LOG(DEBUG) << "Failed to bind GLES API.";
return;
}
- LOG(VERBOSE) << "Bound GLES API.";
+ LOG(DEBUG) << "Bound GLES API.";
PFNEGLCHOOSECONFIGPROC eglChooseConfig =
reinterpret_cast<PFNEGLCHOOSECONFIGPROC>(
EglLoadFunction("eglChooseConfig"));
if (eglChooseConfig == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglChooseConfig";
+ LOG(DEBUG) << "Failed to find function eglChooseConfig";
return;
}
- LOG(VERBOSE) << "Loaded eglChooseConfig.";
+ LOG(DEBUG) << "Loaded eglChooseConfig.";
const EGLint framebuffer_config_attributes[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
@@ -282,28 +255,28 @@
&framebuffer_config,
1,
&num_framebuffer_configs) != EGL_TRUE) {
- LOG(VERBOSE) << "Failed to find matching framebuffer config.";
+ LOG(DEBUG) << "Failed to find matching framebuffer config.";
return;
}
- LOG(VERBOSE) << "Found matching framebuffer config.";
+ LOG(DEBUG) << "Found matching framebuffer config.";
PFNEGLCREATECONTEXTPROC eglCreateContext =
reinterpret_cast<PFNEGLCREATECONTEXTPROC>(
EglLoadFunction("eglCreateContext"));
if (eglCreateContext == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglCreateContext";
+ LOG(DEBUG) << "Failed to find function eglCreateContext";
return;
}
- LOG(VERBOSE) << "Loaded eglCreateContext.";
+ LOG(DEBUG) << "Loaded eglCreateContext.";
PFNEGLDESTROYCONTEXTPROC eglDestroyContext =
reinterpret_cast<PFNEGLDESTROYCONTEXTPROC>(
EglLoadFunction("eglDestroyContext"));
if (eglDestroyContext == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglDestroyContext";
+ LOG(DEBUG) << "Failed to find function eglDestroyContext";
return;
}
- LOG(VERBOSE) << "Loaded eglDestroyContext.";
+ LOG(DEBUG) << "Loaded eglDestroyContext.";
const EGLint context_attributes[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
@@ -315,38 +288,77 @@
EGL_NO_CONTEXT,
context_attributes);
if (context == EGL_NO_CONTEXT) {
- LOG(VERBOSE) << "Failed to create EGL context.";
+ LOG(DEBUG) << "Failed to create EGL context.";
return;
}
- LOG(VERBOSE) << "Created EGL context.";
+ LOG(DEBUG) << "Created EGL context.";
Closer context_closer([&]() { eglDestroyContext(display, context); });
PFNEGLMAKECURRENTPROC eglMakeCurrent =
reinterpret_cast<PFNEGLMAKECURRENTPROC>(EglLoadFunction("eglMakeCurrent"));
if (eglMakeCurrent == nullptr) {
- LOG(VERBOSE) << "Failed to find function eglMakeCurrent";
+ LOG(DEBUG) << "Failed to find function eglMakeCurrent";
return;
}
- LOG(VERBOSE) << "Loaded eglMakeCurrent.";
+ LOG(DEBUG) << "Loaded eglMakeCurrent.";
if (eglMakeCurrent(display,
EGL_NO_SURFACE,
EGL_NO_SURFACE,
context) != EGL_TRUE) {
- LOG(VERBOSE) << "Failed to make EGL context current.";
+ LOG(DEBUG) << "Failed to make EGL context current.";
return;
}
- LOG(VERBOSE) << "Make EGL context current.";
- availability->has_egl_surfaceless_with_gles = true;
+ LOG(DEBUG) << "Make EGL context current.";
+ availability->can_init_gles2_on_egl_surfaceless = true;
+
+ PFNGLGETSTRINGPROC glGetString =
+ reinterpret_cast<PFNGLGETSTRINGPROC>(eglGetProcAddress("glGetString"));
+
+ const GLubyte* gles2_vendor = glGetString(GL_VENDOR);
+ if (gles2_vendor == nullptr) {
+ LOG(DEBUG) << "Failed to query GLES2 vendor.";
+ return;
+ }
+ const std::string gles2_vendor_string((const char*)gles2_vendor);
+ LOG(DEBUG) << "Found GLES2 vendor: " << gles2_vendor_string;
+ availability->gles2_vendor = gles2_vendor_string;
+
+ const GLubyte* gles2_version = glGetString(GL_VERSION);
+ if (gles2_version == nullptr) {
+ LOG(DEBUG) << "Failed to query GLES2 vendor.";
+ return;
+ }
+ const std::string gles2_version_string((const char*)gles2_version);
+ LOG(DEBUG) << "Found GLES2 version: " << gles2_version_string;
+ availability->gles2_version = gles2_version_string;
+
+ const GLubyte* gles2_renderer = glGetString(GL_RENDERER);
+ if (gles2_renderer == nullptr) {
+ LOG(DEBUG) << "Failed to query GLES2 renderer.";
+ return;
+ }
+ const std::string gles2_renderer_string((const char*)gles2_renderer);
+ LOG(DEBUG) << "Found GLES2 renderer: " << gles2_renderer_string;
+ availability->gles2_renderer = gles2_renderer_string;
+
+ const GLubyte* gles2_extensions = glGetString(GL_EXTENSIONS);
+ if (gles2_extensions == nullptr) {
+ LOG(DEBUG) << "Failed to query GLES2 extensions.";
+ return;
+ }
+ const std::string gles2_extensions_string((const char*)gles2_extensions);
+ LOG(DEBUG) << "Found GLES2 extensions: " << gles2_extensions_string;
+ availability->gles2_extensions = gles2_extensions_string;
}
void PopulateVulkanAvailability(GraphicsAvailability* availability) {
ManagedLibrary vklib(dlopen(kVulkanLib, RTLD_NOW | RTLD_LOCAL));
if (!vklib) {
- LOG(VERBOSE) << "Failed to dlopen " << kVulkanLib << ".";
+ LOG(DEBUG) << "Failed to dlopen " << kVulkanLib << ".";
return;
}
- LOG(VERBOSE) << "Loaded " << kVulkanLib << ".";
+ LOG(DEBUG) << "Loaded " << kVulkanLib << ".";
availability->has_vulkan = true;
uint32_t instance_version = 0;
@@ -355,7 +367,7 @@
reinterpret_cast<PFN_vkGetInstanceProcAddr>(
dlsym(vklib.get(), "vkGetInstanceProcAddr"));
if (vkGetInstanceProcAddr == nullptr) {
- LOG(VERBOSE) << "Failed to find symbol vkGetInstanceProcAddr.";
+ LOG(DEBUG) << "Failed to find symbol vkGetInstanceProcAddr.";
return;
}
@@ -371,7 +383,7 @@
reinterpret_cast<PFN_vkCreateInstance>(
vkGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateInstance"));
if (vkCreateInstance == nullptr) {
- LOG(VERBOSE) << "Failed to get function vkCreateInstance.";
+ LOG(DEBUG) << "Failed to get function vkCreateInstance.";
return;
}
@@ -398,25 +410,25 @@
VkResult result = vkCreateInstance(&instance_create_info, nullptr, &instance);
if (result != VK_SUCCESS) {
if (result == VK_ERROR_OUT_OF_HOST_MEMORY) {
- LOG(VERBOSE) << "Failed to create Vulkan instance: "
+ LOG(DEBUG) << "Failed to create Vulkan instance: "
<< "VK_ERROR_OUT_OF_HOST_MEMORY.";
} else if (result == VK_ERROR_OUT_OF_DEVICE_MEMORY) {
- LOG(VERBOSE) << "Failed to create Vulkan instance: "
+ LOG(DEBUG) << "Failed to create Vulkan instance: "
<< "VK_ERROR_OUT_OF_DEVICE_MEMORY.";
} else if (result == VK_ERROR_INITIALIZATION_FAILED) {
- LOG(VERBOSE) << "Failed to create Vulkan instance: "
+ LOG(DEBUG) << "Failed to create Vulkan instance: "
<< "VK_ERROR_INITIALIZATION_FAILED.";
} else if (result == VK_ERROR_LAYER_NOT_PRESENT) {
- LOG(VERBOSE) << "Failed to create Vulkan instance: "
+ LOG(DEBUG) << "Failed to create Vulkan instance: "
<< "VK_ERROR_LAYER_NOT_PRESENT.";
} else if (result == VK_ERROR_EXTENSION_NOT_PRESENT) {
- LOG(VERBOSE) << "Failed to create Vulkan instance: "
+ LOG(DEBUG) << "Failed to create Vulkan instance: "
<< "VK_ERROR_EXTENSION_NOT_PRESENT.";
} else if (result == VK_ERROR_INCOMPATIBLE_DRIVER) {
- LOG(VERBOSE) << "Failed to create Vulkan instance: "
+ LOG(DEBUG) << "Failed to create Vulkan instance: "
<< "VK_ERROR_INCOMPATIBLE_DRIVER.";
} else {
- LOG(VERBOSE) << "Failed to create Vulkan instance.";
+ LOG(DEBUG) << "Failed to create Vulkan instance.";
}
return;
}
@@ -425,7 +437,7 @@
reinterpret_cast<PFN_vkDestroyInstance>(
vkGetInstanceProcAddr(instance, "vkDestroyInstance"));
if (vkDestroyInstance == nullptr) {
- LOG(VERBOSE) << "Failed to get function vkDestroyInstance.";
+ LOG(DEBUG) << "Failed to get function vkDestroyInstance.";
return;
}
@@ -435,7 +447,7 @@
reinterpret_cast<PFN_vkEnumeratePhysicalDevices>(
vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices"));
if (vkEnumeratePhysicalDevices == nullptr) {
- LOG(VERBOSE) << "Failed to "
+ LOG(DEBUG) << "Failed to "
<< "vkGetInstanceProcAddr(vkEnumeratePhysicalDevices).";
return;
}
@@ -444,7 +456,7 @@
reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(
vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties"));
if (vkGetPhysicalDeviceProperties == nullptr) {
- LOG(VERBOSE) << "Failed to "
+ LOG(DEBUG) << "Failed to "
<< "vkGetInstanceProcAddr(vkGetPhysicalDeviceProperties).";
return;
}
@@ -453,7 +465,7 @@
reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(
vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties"));
if (vkEnumerateDeviceExtensionProperties == nullptr) {
- LOG(VERBOSE) << "Failed to "
+ LOG(DEBUG) << "Failed to "
<< "vkGetInstanceProcAddr("
<< "vkEnumerateDeviceExtensionProperties"
<< ").";
@@ -464,32 +476,32 @@
result = vkEnumeratePhysicalDevices(instance, &device_count, nullptr);
if (result != VK_SUCCESS) {
if (result == VK_INCOMPLETE) {
- LOG(VERBOSE) << "Failed to enumerate physical device count: "
+ LOG(DEBUG) << "Failed to enumerate physical device count: "
<< "VK_INCOMPLETE";
} else if (result == VK_ERROR_OUT_OF_HOST_MEMORY) {
- LOG(VERBOSE) << "Failed to enumerate physical device count: "
+ LOG(DEBUG) << "Failed to enumerate physical device count: "
<< "VK_ERROR_OUT_OF_HOST_MEMORY";
} else if (result == VK_ERROR_OUT_OF_DEVICE_MEMORY) {
- LOG(VERBOSE) << "Failed to enumerate physical device count: "
+ LOG(DEBUG) << "Failed to enumerate physical device count: "
<< "VK_ERROR_OUT_OF_DEVICE_MEMORY";
} else if (result == VK_ERROR_INITIALIZATION_FAILED) {
- LOG(VERBOSE) << "Failed to enumerate physical device count: "
+ LOG(DEBUG) << "Failed to enumerate physical device count: "
<< "VK_ERROR_INITIALIZATION_FAILED";
} else {
- LOG(VERBOSE) << "Failed to enumerate physical device count.";
+ LOG(DEBUG) << "Failed to enumerate physical device count.";
}
return;
}
if (device_count == 0) {
- LOG(VERBOSE) << "No physical devices present.";
+ LOG(DEBUG) << "No physical devices present.";
return;
}
std::vector<VkPhysicalDevice> devices(device_count, VK_NULL_HANDLE);
result = vkEnumeratePhysicalDevices(instance, &device_count, devices.data());
if (result != VK_SUCCESS) {
- LOG(VERBOSE) << "Failed to enumerate physical devices.";
+ LOG(DEBUG) << "Failed to enumerate physical devices.";
return;
}
@@ -497,6 +509,8 @@
VkPhysicalDeviceProperties device_properties = {};
vkGetPhysicalDeviceProperties(device, &device_properties);
+ LOG(DEBUG) << "Found physical device: " << device_properties.deviceName;
+
uint32_t device_extensions_count = 0;
vkEnumerateDeviceExtensionProperties(device,
nullptr,
@@ -519,6 +533,9 @@
std::string device_extensions_string =
android::base::Join(device_extensions_strings, ' ');
+ LOG(DEBUG) << "Found physical device extensions: "
+ << device_extensions_string;
+
if (device_properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) {
availability->has_discrete_gpu = true;
availability->discrete_gpu_device_name = device_properties.deviceName;
@@ -528,6 +545,18 @@
}
}
+std::string ToLower(const std::string& v) {
+ std::string result = v;
+ std::transform(result.begin(), result.end(), result.begin(),
+ [](unsigned char c) { return std::tolower(c); });
+ return result;
+}
+
+bool IsLikelySoftwareRenderer(const std::string& renderer) {
+ const std::string lower_renderer = ToLower(renderer);
+ return lower_renderer.find("llvmpipe") != std::string::npos;
+}
+
GraphicsAvailability GetGraphicsAvailability() {
GraphicsAvailability availability;
@@ -544,7 +573,8 @@
bool ShouldEnableAcceleratedRendering(
const GraphicsAvailability& availability) {
- return availability.has_egl && availability.has_egl_surfaceless_with_gles &&
+ return availability.can_init_gles2_on_egl_surfaceless &&
+ !IsLikelySoftwareRenderer(availability.gles2_renderer) &&
availability.has_discrete_gpu;
}
@@ -560,13 +590,13 @@
}
int status;
if (waitpid(pid, &status, 0) != pid) {
- PLOG(ERROR) << "Failed to wait for graphics check subprocess";
+ PLOG(DEBUG) << "Failed to wait for graphics check subprocess";
return GraphicsAvailability{};
}
if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
return GetGraphicsAvailability();
}
- LOG(VERBOSE) << "Subprocess for detect_graphics failed with " << status;
+ LOG(DEBUG) << "Subprocess for detect_graphics failed with " << status;
return GraphicsAvailability{};
}
@@ -575,20 +605,32 @@
std::ios_base::fmtflags flags_backup(stream.flags());
stream << std::boolalpha;
stream << "Graphics Availability:\n";
- stream << "OpenGL available: " << availability.has_gl << "\n";
- stream << "OpenGL ES1 available: " << availability.has_gles1 << "\n";
- stream << "OpenGL ES2 available: " << availability.has_gles2 << "\n";
- stream << "EGL available: " << availability.has_egl << "\n";
+
+ stream << "\n";
+ stream << "OpenGL lib available: " << availability.has_gl << "\n";
+ stream << "OpenGL ES1 lib available: " << availability.has_gles1 << "\n";
+ stream << "OpenGL ES2 lib available: " << availability.has_gles2 << "\n";
+ stream << "EGL lib available: " << availability.has_egl << "\n";
+ stream << "Vulkan lib available: " << availability.has_vulkan << "\n";
+
+ stream << "\n";
stream << "EGL client extensions: " << availability.egl_client_extensions
<< "\n";
- stream << "EGL default display available: "
- << availability.has_egl_default_display << "\n";
+
+ stream << "\n";
stream << "EGL display vendor: " << availability.egl_vendor << "\n";
stream << "EGL display version: " << availability.egl_version << "\n";
stream << "EGL display extensions: " << availability.egl_extensions << "\n";
- stream << "EGL surfaceless display with GLES: "
- << availability.has_egl_surfaceless_with_gles << "\n";
- stream << "Vulkan available: " << availability.has_vulkan << "\n";
+
+ stream << "GLES2 can init on surfaceless display: "
+ << availability.can_init_gles2_on_egl_surfaceless << "\n";
+ stream << "\n";
+ stream << "GLES2 vendor: " << availability.gles2_vendor << "\n";
+ stream << "GLES2 version: " << availability.gles2_version << "\n";
+ stream << "GLES2 renderer: " << availability.gles2_renderer << "\n";
+ stream << "GLES2 extensions: " << availability.gles2_extensions << "\n";
+
+ stream << "\n";
stream << "Vulkan discrete GPU detected: " << availability.has_discrete_gpu
<< "\n";
if (availability.has_discrete_gpu) {
@@ -597,6 +639,11 @@
stream << "Vulkan discrete GPU device extensions: "
<< availability.discrete_gpu_device_extensions << "\n";
}
+
+ stream << "\n";
+ stream << "Accelerated rendering supported: "
+ << ShouldEnableAcceleratedRendering(availability);
+
stream.flags(flags_backup);
return stream;
}
diff --git a/host/libs/graphics_detector/graphics_detector.h b/host/libs/graphics_detector/graphics_detector.h
index 83a7068..1bacc3d 100644
--- a/host/libs/graphics_detector/graphics_detector.h
+++ b/host/libs/graphics_detector/graphics_detector.h
@@ -25,13 +25,20 @@
bool has_gles1 = false;
bool has_gles2 = false;
bool has_egl = false;
- bool has_egl_default_display = false;
+ bool has_vulkan = false;
+
std::string egl_client_extensions;
+
std::string egl_version;
std::string egl_vendor;
std::string egl_extensions;
- bool has_egl_surfaceless_with_gles = false;
- bool has_vulkan = false;
+
+ bool can_init_gles2_on_egl_surfaceless = false;
+ std::string gles2_vendor;
+ std::string gles2_version;
+ std::string gles2_renderer;
+ std::string gles2_extensions;
+
bool has_discrete_gpu = false;
std::string discrete_gpu_device_name;
std::string discrete_gpu_device_extensions;
diff --git a/host/libs/image_aggregator/image_aggregator.cc b/host/libs/image_aggregator/image_aggregator.cc
index b6b412d..4f50835 100644
--- a/host/libs/image_aggregator/image_aggregator.cc
+++ b/host/libs/image_aggregator/image_aggregator.cc
@@ -31,6 +31,7 @@
#include <android-base/file.h>
#include <android-base/logging.h>
+#include <android-base/strings.h>
#include <cdisk_spec.pb.h>
#include <google/protobuf/text_format.h>
#include <sparse/sparse.h>
@@ -39,6 +40,7 @@
#include "common/libs/fs/shared_buf.h"
#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/cf_endian.h"
#include "common/libs/utils/files.h"
#include "common/libs/utils/size_utils.h"
#include "common/libs/utils/subprocess.h"
@@ -48,6 +50,8 @@
namespace {
constexpr int GPT_NUM_PARTITIONS = 128;
+static const std::string CDISK_MAGIC = "composite_disk\x1d";
+static const std::string QCOW2_MAGIC = "QFI\xfb";
/**
* Creates a "Protective" MBR Partition Table header. The GUID
@@ -100,32 +104,53 @@
struct __attribute__((packed)) GptBeginning {
MasterBootRecord protective_mbr;
GptHeader header;
- std::uint8_t header_padding[420];
+ std::uint8_t header_padding[SECTOR_SIZE - sizeof(GptHeader)];
GptPartitionEntry entries[GPT_NUM_PARTITIONS];
std::uint8_t partition_alignment[3072];
};
-static_assert(sizeof(GptBeginning) == SECTOR_SIZE * 40);
+static_assert(AlignToPowerOf2(sizeof(GptBeginning), PARTITION_SIZE_SHIFT) ==
+ sizeof(GptBeginning));
struct __attribute__((packed)) GptEnd {
GptPartitionEntry entries[GPT_NUM_PARTITIONS];
GptHeader footer;
- std::uint8_t footer_padding[420];
+ std::uint8_t footer_padding[SECTOR_SIZE - sizeof(GptHeader)];
};
-static_assert(sizeof(GptEnd) == SECTOR_SIZE * 33);
+static_assert(sizeof(GptEnd) % SECTOR_SIZE == 0);
struct PartitionInfo {
MultipleImagePartition source;
- std::uint64_t guest_size;
- std::uint64_t host_size;
+ std::uint64_t size;
std::uint64_t offset;
+
+ std::uint64_t AlignedSize() const { return AlignToPartitionSize(size); }
};
+struct __attribute__((packed)) QCowHeader {
+ Be32 magic;
+ Be32 version;
+ Be64 backing_file_offset;
+ Be32 backing_file_size;
+ Be32 cluster_bits;
+ Be64 size;
+ Be32 crypt_method;
+ Be32 l1_size;
+ Be64 l1_table_offset;
+ Be64 refcount_table_offset;
+ Be32 refcount_table_clusters;
+ Be32 nb_snapshots;
+ Be64 snapshots_offset;
+};
+
+static_assert(sizeof(QCowHeader) == 72);
+
/*
- * Returns the file size of `file_path`. If `file_path` is an Android-Sparse
- * file, returns the file size it would have after being converted to a raw
- * file.
+ * Returns the expanded file size of `file_path`. Note that the raw size of
+ * files doesn't match how large they may appear inside a VM.
+ *
+ * Supported types: Composite disk image, Qcows2, Android-Sparse, Raw
*
* Android-Sparse is a file format invented by Android that optimizes for
* chunks of zeroes or repeated data. The Android build system can produce
@@ -133,15 +158,63 @@
* disk file, as the imag eflashing process also can handle Android-Sparse
* images.
*/
-std::uint64_t UnsparsedSize(const std::string& file_path) {
- auto fd = open(file_path.c_str(), O_RDONLY);
- CHECK(fd >= 0) << "Could not open \"" << file_path << "\""
- << strerror(errno);
- auto sparse = sparse_file_import(fd, /* verbose */ false, /* crc */ false);
- auto size =
- sparse ? sparse_file_len(sparse, false, true) : FileSize(file_path);
- close(fd);
- return size;
+std::uint64_t ExpandedStorageSize(const std::string& file_path) {
+ android::base::unique_fd fd(open(file_path.c_str(), O_RDONLY));
+ CHECK(fd.get() >= 0) << "Could not open \"" << file_path << "\""
+ << strerror(errno);
+
+ std::uint64_t file_size = FileSize(file_path);
+
+ // Try to read the disk in a nicely-aligned block size unless the whole file
+ // is smaller.
+ constexpr uint64_t MAGIC_BLOCK_SIZE = 4096;
+ std::string magic(std::min(file_size, MAGIC_BLOCK_SIZE), '\0');
+ if (!android::base::ReadFully(fd, magic.data(), magic.size())) {
+ PLOG(FATAL) << "Fail to read: " << file_path;
+ return 0;
+ }
+ CHECK(lseek(fd, 0, SEEK_SET) != -1)
+ << "Fail to seek(\"" << file_path << "\")" << strerror(errno);
+
+ // Composite disk image
+ if (android::base::StartsWith(magic, CDISK_MAGIC)) {
+ // seek to the beginning of proto message
+ CHECK(lseek(fd, CDISK_MAGIC.size(), SEEK_SET) != -1)
+ << "Fail to seek(\"" << file_path << "\")" << strerror(errno);
+ std::string message;
+ if (!android::base::ReadFdToString(fd, &message)) {
+ PLOG(FATAL) << "Fail to read(cdisk): " << file_path;
+ return 0;
+ }
+ CompositeDisk cdisk;
+ if (!cdisk.ParseFromString(message)) {
+ PLOG(FATAL) << "Fail to parse(cdisk): " << file_path;
+ return 0;
+ }
+ return cdisk.length();
+ }
+
+ // Qcow2 image
+ if (android::base::StartsWith(magic, QCOW2_MAGIC)) {
+ QCowHeader header;
+ if (!android::base::ReadFully(fd, &header, sizeof(QCowHeader))) {
+ PLOG(FATAL) << "Fail to read(qcow2 header): " << file_path;
+ return 0;
+ }
+ return header.size.as_uint64_t();
+ }
+
+ // Android-Sparse
+ if (auto sparse =
+ sparse_file_import(fd, /* verbose */ false, /* crc */ false);
+ sparse) {
+ auto size = sparse_file_len(sparse, false, true);
+ sparse_file_destroy(sparse);
+ return size;
+ }
+
+ // raw image file
+ return file_size;
}
/*
@@ -200,27 +273,24 @@
}
void AppendPartition(MultipleImagePartition source) {
- uint64_t host_size = 0;
+ uint64_t size = 0;
for (const auto& path : source.image_file_paths) {
- host_size += UnsparsedSize(path);
+ size += ExpandedStorageSize(path);
}
- auto guest_size = AlignToPowerOf2(host_size, PARTITION_SIZE_SHIFT);
- CHECK(host_size == guest_size || source.read_only)
+ auto aligned_size = AlignToPartitionSize(size);
+ CHECK(size == aligned_size || source.read_only)
<< "read-write partition " << source.label
<< " is not aligned to the size of " << (1 << PARTITION_SIZE_SHIFT);
partitions_.push_back(PartitionInfo{
.source = source,
- .guest_size = guest_size,
- .host_size = host_size,
+ .size = size,
.offset = next_disk_offset_,
});
- next_disk_offset_ =
- AlignToPowerOf2(next_disk_offset_ + guest_size, PARTITION_SIZE_SHIFT);
+ next_disk_offset_ = next_disk_offset_ + aligned_size;
}
std::uint64_t DiskSize() const {
- std::uint64_t val = next_disk_offset_ + sizeof(GptEnd);
- return AlignToPowerOf2(val, DISK_SIZE_SHIFT);
+ return AlignToPowerOf2(next_disk_offset_ + sizeof(GptEnd), DISK_SIZE_SHIFT);
}
/**
@@ -239,27 +309,27 @@
header->set_offset(0);
for (auto& partition : partitions_) {
- uint64_t host_size = 0;
+ uint64_t size = 0;
for (const auto& path : partition.source.image_file_paths) {
ComponentDisk* component = disk.add_component_disks();
component->set_file_path(AbsolutePath(path));
- component->set_offset(partition.offset + host_size);
+ component->set_offset(partition.offset + size);
component->set_read_write_capability(
partition.source.read_only ? ReadWriteCapability::READ_ONLY
: ReadWriteCapability::READ_WRITE);
- host_size += UnsparsedSize(path);
+ size += ExpandedStorageSize(path);
}
- CHECK(partition.host_size == host_size);
- // When partition's size differs from its size on the host
+ CHECK(partition.size == size);
+ // When partition's aligned size differs from its (unaligned) size
// reading the disk within the guest os would fail due to the gap.
// Putting any disk bigger than 4K can fill this gap.
// Here we reuse the header which is always > 4K.
// We don't fill the "writable" disk's hole and it should be an error
// because writes in the guest of can't be reflected to the backing file.
- if (partition.guest_size != partition.host_size) {
+ if (partition.AlignedSize() != partition.size) {
ComponentDisk* component = disk.add_component_disks();
component->set_file_path(AbsolutePath(header_file));
- component->set_offset(partition.offset + partition.host_size);
+ component->set_offset(partition.offset + partition.size);
component->set_read_write_capability(ReadWriteCapability::READ_ONLY);
}
}
@@ -284,19 +354,20 @@
return {};
}
GptBeginning gpt = {
- .protective_mbr = ProtectiveMbr(DiskSize()),
- .header = {
- .signature = {'E', 'F', 'I', ' ', 'P', 'A', 'R', 'T'},
- .revision = {0, 0, 1, 0},
- .header_size = sizeof(GptHeader),
- .current_lba = 1,
- .backup_lba = (next_disk_offset_ + sizeof(GptEnd)) / SECTOR_SIZE - 1,
- .first_usable_lba = sizeof(GptBeginning) / SECTOR_SIZE,
- .last_usable_lba = (next_disk_offset_ - SECTOR_SIZE) / SECTOR_SIZE,
- .partition_entries_lba = 2,
- .num_partition_entries = GPT_NUM_PARTITIONS,
- .partition_entry_size = sizeof(GptPartitionEntry),
- },
+ .protective_mbr = ProtectiveMbr(DiskSize()),
+ .header =
+ {
+ .signature = {'E', 'F', 'I', ' ', 'P', 'A', 'R', 'T'},
+ .revision = {0, 0, 1, 0},
+ .header_size = sizeof(GptHeader),
+ .current_lba = 1,
+ .backup_lba = (DiskSize() / SECTOR_SIZE) - 1,
+ .first_usable_lba = sizeof(GptBeginning) / SECTOR_SIZE,
+ .last_usable_lba = (next_disk_offset_ / SECTOR_SIZE) - 1,
+ .partition_entries_lba = 2,
+ .num_partition_entries = GPT_NUM_PARTITIONS,
+ .partition_entry_size = sizeof(GptPartitionEntry),
+ },
};
uuid_generate(gpt.header.disk_guid);
for (std::size_t i = 0; i < partitions_.size(); i++) {
@@ -304,7 +375,7 @@
gpt.entries[i] = GptPartitionEntry{
.first_lba = partition.offset / SECTOR_SIZE,
.last_lba =
- (partition.offset + partition.guest_size) / SECTOR_SIZE - 1,
+ (partition.offset + partition.AlignedSize()) / SECTOR_SIZE - 1,
};
uuid_generate(gpt.entries[i].unique_partition_guid);
if (uuid_parse(GetPartitionGUID(partition.source),
@@ -330,9 +401,10 @@
*/
GptEnd End(const GptBeginning& head) const {
GptEnd gpt;
- std::memcpy((void*) gpt.entries, (void*) head.entries, 128 * 128);
+ std::memcpy((void*)gpt.entries, (void*)head.entries, sizeof(gpt.entries));
gpt.footer = head.header;
- gpt.footer.partition_entries_lba = next_disk_offset_ / SECTOR_SIZE;
+ gpt.footer.partition_entries_lba =
+ (DiskSize() - sizeof(gpt.entries)) / SECTOR_SIZE - 1;
std::swap(gpt.footer.current_lba, gpt.footer.backup_lba);
gpt.footer.header_crc32 = 0;
gpt.footer.header_crc32 =
@@ -350,11 +422,17 @@
return true;
}
-bool WriteEnd(SharedFD out, const GptEnd& end, std::int64_t padding) {
- std::string end_str((const char*) &end, sizeof(GptEnd));
- end_str.resize(end_str.size() + padding, '\0');
- if (WriteAll(out, end_str) != end_str.size()) {
- LOG(ERROR) << "Could not write GPT end: " << out->StrError();
+bool WriteEnd(SharedFD out, const GptEnd& end) {
+ auto disk_size = (end.footer.current_lba + 1) * SECTOR_SIZE;
+ auto footer_start = (end.footer.last_usable_lba + 1) * SECTOR_SIZE;
+ auto padding = disk_size - footer_start - sizeof(GptEnd);
+ std::string padding_str(padding, '\0');
+ if (WriteAll(out, padding_str) != padding_str.size()) {
+ LOG(ERROR) << "Could not write GPT end padding: " << out->StrError();
+ return false;
+ }
+ if (WriteAllBinary(out, &end) != sizeof(end)) {
+ LOG(ERROR) << "Could not write GPT end contents: " << out->StrError();
return false;
}
return true;
@@ -435,8 +513,7 @@
<< "\" to \"" << output_path << "\": " << output->StrError();
}
// Handle disk images that are not aligned to PARTITION_SIZE_SHIFT
- std::uint64_t padding =
- AlignToPowerOf2(file_size, PARTITION_SIZE_SHIFT) - file_size;
+ std::uint64_t padding = AlignToPartitionSize(file_size) - file_size;
std::string padding_str;
padding_str.resize(padding, '\0');
if (WriteAll(output, padding_str) != padding_str.size()) {
@@ -444,9 +521,7 @@
<< "\": " << output->StrError();
}
}
- std::uint64_t padding =
- builder.DiskSize() - ((beginning.header.backup_lba + 1) * SECTOR_SIZE);
- if (!WriteEnd(output, builder.End(beginning), padding)) {
+ if (!WriteEnd(output, builder.End(beginning))) {
LOG(FATAL) << "Could not write GPT end to \"" << output_path
<< "\": " << output->StrError();
}
@@ -479,16 +554,14 @@
<< "\": " << header->StrError();
}
auto footer = SharedFD::Creat(footer_file, 0600);
- std::uint64_t padding =
- builder.DiskSize() - ((beginning.header.backup_lba + 1) * SECTOR_SIZE);
- if (!WriteEnd(footer, builder.End(beginning), padding)) {
+ if (!WriteEnd(footer, builder.End(beginning))) {
LOG(FATAL) << "Could not write GPT end to \"" << footer_file
<< "\": " << footer->StrError();
}
auto composite_proto = builder.MakeCompositeDiskSpec(header_file, footer_file);
std::ofstream composite(output_composite_path.c_str(),
std::ios::binary | std::ios::trunc);
- composite << "composite_disk\x1d";
+ composite << CDISK_MAGIC;
composite_proto.SerializeToOstream(&composite);
composite.flush();
}
@@ -500,6 +573,12 @@
crosvm_qcow2_cmd.AddParameter("create_qcow2");
crosvm_qcow2_cmd.AddParameter("--backing_file=", backing_file);
crosvm_qcow2_cmd.AddParameter(output_overlay_path);
+
+ auto devnull = SharedFD::Open("/dev/null", O_RDONLY);
+ CHECK(devnull->IsOpen()) << "Failed to open /dev/null";
+ crosvm_qcow2_cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, devnull);
+ crosvm_qcow2_cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, devnull);
+
int success = crosvm_qcow2_cmd.Start().Wait();
if (success != 0) {
LOG(FATAL) << "Unable to run crosvm create_qcow2. Exited with status " << success;
diff --git a/host/libs/screen_connector/screen_connector.h b/host/libs/screen_connector/screen_connector.h
index ca6b155..49e5253 100644
--- a/host/libs/screen_connector/screen_connector.h
+++ b/host/libs/screen_connector/screen_connector.h
@@ -16,8 +16,6 @@
#pragma once
-#include <cassert>
-#include <chrono>
#include <cstdint>
#include <functional>
#include <memory>
@@ -28,15 +26,15 @@
#include <type_traits>
#include <android-base/logging.h>
-#include "common/libs/concurrency/semaphore.h"
+
#include "common/libs/confui/confui.h"
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/size_utils.h"
-
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/confui/host_mode_ctrl.h"
#include "host/libs/confui/host_utils.h"
#include "host/libs/screen_connector/screen_connector_common.h"
+#include "host/libs/screen_connector/screen_connector_multiplexer.h"
#include "host/libs/screen_connector/screen_connector_queue.h"
#include "host/libs/screen_connector/wayland_screen_connector.h"
@@ -51,17 +49,15 @@
static_assert(std::is_base_of<ScreenConnectorFrameInfo, ProcessedFrameType>::value,
"ProcessedFrameType should inherit ScreenConnectorFrameInfo");
+ using FrameMultiplexer = ScreenConnectorInputMultiplexer<ProcessedFrameType>;
+
/**
- * This is the type of the callback function WebRTC/VNC is supposed to provide
+ * This is the type of the callback function WebRTC is supposed to provide
* ScreenConnector with.
*
- * The callback function should be defined so that the two parameters are
- * given by the callback function caller (e.g. ScreenConnectorSource) and used
- * to fill out the ProcessedFrameType object, msg.
+ * The callback function is how a raw bytes frame should be processed for
+ * WebRTC
*
- * The ProcessedFrameType object is internally created by ScreenConnector,
- * filled out by the ScreenConnectorSource, and returned via OnNextFrame()
- * call.
*/
using GenerateProcessedFrameCallback = std::function<void(
std::uint32_t /*display_number*/, std::uint32_t /*frame_width*/,
@@ -88,9 +84,9 @@
virtual ~ScreenConnector() = default;
/**
- * set the callback function to be eventually used by Wayland/Socket-Based Connectors
+ * set the callback function to be eventually used by Wayland-Based
+ * Connector
*
- * @param[in] To tell how ScreenConnectorSource caches the frame & meta info
*/
void SetCallback(GenerateProcessedFrameCallback&& frame_callback) {
std::lock_guard<std::mutex> lock(streamer_callback_mutex_);
@@ -115,7 +111,7 @@
processed_frame);
}
- sc_android_queue_.PushBack(std::move(processed_frame));
+ sc_frame_multiplexer_.PushToAndroidQueue(std::move(processed_frame));
});
}
@@ -131,44 +127,7 @@
*
* NOTE THAT THIS IS THE ONLY CONSUMER OF THE TWO QUEUES
*/
- ProcessedFrameType OnNextFrame() {
- on_next_frame_cnt_++;
- while (true) {
- ConfUiLog(VERBOSE) << "Streamer waiting Semaphore with host ctrl mode ="
- << static_cast<std::uint32_t>(
- host_mode_ctrl_.GetMode())
- << " and cnd = #" << on_next_frame_cnt_;
- sc_sem_.SemWait();
- ConfUiLog(VERBOSE)
- << "Streamer got Semaphore'ed resources with host ctrl mode ="
- << static_cast<std::uint32_t>(host_mode_ctrl_.GetMode())
- << "and cnd = #" << on_next_frame_cnt_;
- // do something
- if (!sc_android_queue_.Empty()) {
- auto mode = host_mode_ctrl_.GetMode();
- if (mode == HostModeCtrl::ModeType::kAndroidMode) {
- ConfUiLog(VERBOSE)
- << "Streamer gets Android frame with host ctrl mode ="
- << static_cast<std::uint32_t>(mode) << "and cnd = #"
- << on_next_frame_cnt_;
- return sc_android_queue_.PopFront();
- }
- // AndroidFrameFetchingLoop could have added 1 or 2 frames
- // before it becomes Conf UI mode.
- ConfUiLog(VERBOSE)
- << "Streamer ignores Android frame with host ctrl mode ="
- << static_cast<std::uint32_t>(mode) << "and cnd = #"
- << on_next_frame_cnt_;
- sc_android_queue_.PopFront();
- continue;
- }
- ConfUiLog(VERBOSE) << "Streamer gets Conf UI frame with host ctrl mode = "
- << static_cast<std::uint32_t>(
- host_mode_ctrl_.GetMode())
- << " and cnd = #" << on_next_frame_cnt_;
- return sc_confui_queue_.PopFront();
- }
- }
+ ProcessedFrameType OnNextFrame() { return sc_frame_multiplexer_.Pop(); }
/**
* ConfUi calls this when it has frames to render
@@ -197,39 +156,32 @@
callback_from_streamer_(display_number, frame_width, frame_height,
frame_stride_bytes, frame_bytes, processed_frame);
// now add processed_frame to the queue
- sc_confui_queue_.PushBack(std::move(processed_frame));
+ sc_frame_multiplexer_.PushToConfUiQueue(std::move(processed_frame));
return true;
}
- // Let the screen connector know when there are clients connected
- void ReportClientsConnected(bool have_clients) {
- // screen connector implementation must implement ReportClientsConnected
- sc_android_src_->ReportClientsConnected(have_clients);
- return ;
- }
-
protected:
- template <typename T,
- typename = std::enable_if_t<
- std::is_base_of<ScreenConnectorSource, T>::value, void>>
- ScreenConnector(std::unique_ptr<T>&& impl, HostModeCtrl& host_mode_ctrl)
+ ScreenConnector(std::unique_ptr<WaylandScreenConnector>&& impl,
+ HostModeCtrl& host_mode_ctrl)
: sc_android_src_{std::move(impl)},
host_mode_ctrl_{host_mode_ctrl},
on_next_frame_cnt_{0},
render_confui_cnt_{0},
- sc_android_queue_{sc_sem_},
- sc_confui_queue_{sc_sem_} {}
+ sc_frame_multiplexer_{host_mode_ctrl_} {}
ScreenConnector() = delete;
private:
- // either socket_based or wayland
- std::unique_ptr<ScreenConnectorSource> sc_android_src_;
+ std::unique_ptr<WaylandScreenConnector> sc_android_src_;
HostModeCtrl& host_mode_ctrl_;
unsigned long long int on_next_frame_cnt_;
unsigned long long int render_confui_cnt_;
- Semaphore sc_sem_;
- ScreenConnectorQueue<ProcessedFrameType> sc_android_queue_;
- ScreenConnectorQueue<ProcessedFrameType> sc_confui_queue_;
+ /**
+ * internally has conf ui & android queues.
+ *
+ * multiplexting the two input queues, so the consumer gets one input
+ * at a time from the right queue
+ */
+ FrameMultiplexer sc_frame_multiplexer_;
GenerateProcessedFrameCallback callback_from_streamer_;
std::mutex streamer_callback_mutex_; // mutex to set & read callback_from_streamer_
std::condition_variable streamer_callback_set_cv_;
diff --git a/host/libs/screen_connector/screen_connector_common.h b/host/libs/screen_connector/screen_connector_common.h
index 1df6d86..32bac76 100644
--- a/host/libs/screen_connector/screen_connector_common.h
+++ b/host/libs/screen_connector/screen_connector_common.h
@@ -18,9 +18,9 @@
#include <cstdint>
#include <functional>
-#include <type_traits>
#include <android-base/logging.h>
+
#include "common/libs/utils/size_utils.h"
#include "host/libs/config/cuttlefish_config.h"
@@ -41,17 +41,6 @@
std::uint32_t /*frame_stride_bytes*/, //
std::uint8_t* /*frame_pixels*/)>;
-class ScreenConnectorSource {
- public:
- virtual ~ScreenConnectorSource() = default;
- // Runs the given callback on the next available frame after the given
- // frame number and returns true if successful.
- virtual void SetFrameCallback(
- GenerateProcessedFrameCallbackImpl frame_callback) = 0;
- virtual void ReportClientsConnected(bool /*have_clients*/) { /* ignore by default */ }
- ScreenConnectorSource() = default;
-};
-
struct ScreenConnectorInfo {
// functions are intended to be inlined
static constexpr std::uint32_t BytesPerPixel() { return 4; }
@@ -72,12 +61,21 @@
CHECK_GE(display_configs.size(), display_number);
return display_configs[display_number].width;
}
- static std::uint32_t ScreenStrideBytes(std::uint32_t display_number) {
- return AlignToPowerOf2(ScreenWidth(display_number) * BytesPerPixel(), 4);
+ static std::uint32_t ComputeScreenStrideBytes(const std::uint32_t w) {
+ return AlignToPowerOf2(w * BytesPerPixel(), 4);
}
- static std::uint32_t ScreenSizeInBytes(std::uint32_t display_number) {
- return ScreenStrideBytes(display_number) * ScreenHeight(display_number);
+ static std::uint32_t ComputeScreenSizeInBytes(const std::uint32_t w,
+ const std::uint32_t h) {
+ return ComputeScreenStrideBytes(w) * h;
}
+ static std::uint32_t ScreenStrideBytes(const std::uint32_t display_number) {
+ return ComputeScreenStrideBytes(ScreenWidth(display_number));
+ }
+ static std::uint32_t ScreenSizeInBytes(const std::uint32_t display_number) {
+ return ComputeScreenStrideBytes(ScreenWidth(display_number)) *
+ ScreenHeight(display_number);
+ }
+
private:
static auto ChkAndGetConfig() -> decltype(cuttlefish::CuttlefishConfig::Get()) {
auto config = cuttlefish::CuttlefishConfig::Get();
diff --git a/host/libs/screen_connector/screen_connector_multiplexer.h b/host/libs/screen_connector/screen_connector_multiplexer.h
new file mode 100644
index 0000000..b620531
--- /dev/null
+++ b/host/libs/screen_connector/screen_connector_multiplexer.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <cstdint>
+
+#include "common/libs/concurrency/multiplexer.h"
+#include "common/libs/confui/confui.h"
+
+#include "host/libs/confui/host_mode_ctrl.h"
+#include "host/libs/screen_connector/screen_connector_queue.h"
+
+namespace cuttlefish {
+template <typename ProcessedFrameType>
+class ScreenConnectorInputMultiplexer {
+ using Queue = ScreenConnectorQueue<ProcessedFrameType>;
+ using Multiplexer = Multiplexer<ProcessedFrameType, Queue>;
+
+ public:
+ ScreenConnectorInputMultiplexer(HostModeCtrl& host_mode_ctrl)
+ : host_mode_ctrl_(host_mode_ctrl) {
+ sc_android_queue_id_ =
+ multiplexer_.RegisterQueue(multiplexer_.CreateQueue(/* q size */ 2));
+ sc_confui_queue_id_ =
+ multiplexer_.RegisterQueue(multiplexer_.CreateQueue(/* q size */ 2));
+ }
+
+ virtual ~ScreenConnectorInputMultiplexer() = default;
+
+ void PushToAndroidQueue(ProcessedFrameType&& t) {
+ multiplexer_.Push(sc_android_queue_id_, std::move(t));
+ }
+
+ void PushToConfUiQueue(ProcessedFrameType&& t) {
+ multiplexer_.Push(sc_confui_queue_id_, std::move(t));
+ }
+
+ // customize Pop()
+ ProcessedFrameType Pop() {
+ on_next_frame_cnt_++;
+
+ // is_discard_frame is thread-specific
+ bool is_discard_frame = false;
+
+ // callback to select the queue index, and update is_discard_frame
+ auto selector = [this, &is_discard_frame]() -> int {
+ if (multiplexer_.IsEmpty(sc_android_queue_id_)) {
+ ConfUiLog(VERBOSE)
+ << "Streamer gets Conf UI frame with host ctrl mode = "
+ << static_cast<std::uint32_t>(host_mode_ctrl_.GetMode())
+ << " and cnd = #" << on_next_frame_cnt_;
+ return sc_confui_queue_id_;
+ }
+ auto mode = host_mode_ctrl_.GetMode();
+ if (mode != HostModeCtrl::ModeType::kAndroidMode) {
+ // AndroidFrameFetchingLoop could have added 1 or 2 frames
+ // before it becomes Conf UI mode.
+ ConfUiLog(VERBOSE)
+ << "Streamer ignores Android frame with host ctrl mode ="
+ << static_cast<std::uint32_t>(mode) << "and cnd = #"
+ << on_next_frame_cnt_;
+ is_discard_frame = true;
+ }
+ ConfUiLog(VERBOSE) << "Streamer gets Android frame with host ctrl mode ="
+ << static_cast<std::uint32_t>(mode) << "and cnd = #"
+ << on_next_frame_cnt_;
+ return sc_android_queue_id_;
+ };
+
+ while (true) {
+ ConfUiLog(VERBOSE) << "Streamer waiting Semaphore with host ctrl mode ="
+ << static_cast<std::uint32_t>(
+ host_mode_ctrl_.GetMode())
+ << " and cnd = #" << on_next_frame_cnt_;
+ auto processed_frame = multiplexer_.Pop(selector);
+ if (!is_discard_frame) {
+ return processed_frame;
+ }
+ is_discard_frame = false;
+ }
+ }
+
+ private:
+ HostModeCtrl& host_mode_ctrl_;
+ Multiplexer multiplexer_;
+ unsigned long long int on_next_frame_cnt_;
+ int sc_android_queue_id_;
+ int sc_confui_queue_id_;
+};
+} // end of namespace cuttlefish
diff --git a/host/libs/screen_connector/screen_connector_queue.h b/host/libs/screen_connector/screen_connector_queue.h
index 2019168..66fd7f7 100644
--- a/host/libs/screen_connector/screen_connector_queue.h
+++ b/host/libs/screen_connector/screen_connector_queue.h
@@ -16,12 +16,11 @@
#pragma once
+#include <condition_variable>
#include <deque>
#include <memory>
-#include <thread>
#include <mutex>
-#include <condition_variable>
-#include <chrono>
+#include <thread>
#include "common/libs/concurrency/semaphore.h"
@@ -31,19 +30,17 @@
class ScreenConnectorQueue {
public:
- static const int kQSize = 2;
-
static_assert( is_movable<T>::value,
"Items in ScreenConnectorQueue should be std::mov-able");
- ScreenConnectorQueue(Semaphore& sc_sem)
- : q_mutex_(std::make_unique<std::mutex>()), sc_semaphore_(sc_sem) {}
+ ScreenConnectorQueue(const int q_max_size = 2)
+ : q_mutex_(std::make_unique<std::mutex>()), q_max_size_{q_max_size} {}
ScreenConnectorQueue(ScreenConnectorQueue&& cq) = delete;
ScreenConnectorQueue(const ScreenConnectorQueue& cq) = delete;
ScreenConnectorQueue& operator=(const ScreenConnectorQueue& cq) = delete;
ScreenConnectorQueue& operator=(ScreenConnectorQueue&& cq) = delete;
- bool Empty() const {
+ bool IsEmpty() const {
const std::lock_guard<std::mutex> lock(*q_mutex_);
return buffer_.empty();
}
@@ -60,23 +57,23 @@
}
/*
- * PushBack( std::move(src) );
+ * Push( std::move(src) );
*
- * Note: this queue is suppoed to be used only by ScreenConnector-
+ * Note: this queue is supposed to be used only by ScreenConnector-
* related components such as ScreenConnectorSource
*
- * The traditional assumption was that when webRTC or VNC calls
+ * The traditional assumption was that when webRTC calls
* OnFrameAfter, the call should be block until it could return
* one frame.
*
* Thus, the producers of this queue must not produce frames
- * much faster than the consumer, VNC or WebRTC consumes.
+ * much faster than the consumer, WebRTC consumes.
* Therefore, when the small buffer is full -- which means
- * VNC or WebRTC would not call OnFrameAfter --, the producer
+ * WebRTC would not call OnNextFrame --, the producer
* should stop adding itmes to the queue.
*
*/
- void PushBack(T&& item) {
+ void Push(T&& item) {
std::unique_lock<std::mutex> lock(*q_mutex_);
if (Full()) {
auto is_empty =
@@ -84,23 +81,11 @@
q_empty_.wait(lock, is_empty);
}
buffer_.push_back(std::move(item));
- /* Whether the total number of items in ALL queus is 0 or not
- * is tracked via a semaphore shared by all queues
- *
- * This is NOT intended to block queue from pushing an item
- * This IS intended to awake the screen_connector consumer thread
- * when one or more items are available at least in one queue
- */
- sc_semaphore_.SemPost();
}
- void PushBack(T& item) = delete;
- void PushBack(const T& item) = delete;
+ void Push(T& item) = delete;
+ void Push(const T& item) = delete;
- /*
- * PopFront must be preceded by sc_semaphore_.SemWaitItem()
- *
- */
- T PopFront() {
+ T Pop() {
const std::lock_guard<std::mutex> lock(*q_mutex_);
auto item = std::move(buffer_.front());
buffer_.pop_front();
@@ -114,12 +99,12 @@
bool Full() const {
// call this in a critical section
// after acquiring q_mutex_
- return kQSize == buffer_.size();
+ return q_max_size_ == buffer_.size();
}
std::deque<T> buffer_;
std::unique_ptr<std::mutex> q_mutex_;
std::condition_variable q_empty_;
- Semaphore& sc_semaphore_;
+ const int q_max_size_;
};
} // namespace cuttlefish
diff --git a/host/libs/screen_connector/wayland_screen_connector.h b/host/libs/screen_connector/wayland_screen_connector.h
index 36ed322..ab3120b 100644
--- a/host/libs/screen_connector/wayland_screen_connector.h
+++ b/host/libs/screen_connector/wayland_screen_connector.h
@@ -16,23 +16,19 @@
#pragma once
-#include "host/libs/screen_connector/screen_connector_common.h"
-
#include <memory>
+#include "host/libs/screen_connector/screen_connector_common.h"
#include "host/libs/wayland/wayland_server.h"
namespace cuttlefish {
-class WaylandScreenConnector : public ScreenConnectorSource {
+class WaylandScreenConnector {
public:
WaylandScreenConnector(int frames_fd);
-
- void SetFrameCallback(
- GenerateProcessedFrameCallbackImpl frame_callback) override;
+ void SetFrameCallback(GenerateProcessedFrameCallbackImpl frame_callback);
private:
std::unique_ptr<wayland::WaylandServer> server_;
};
-
}
diff --git a/host/libs/vm_manager/Android.bp b/host/libs/vm_manager/Android.bp
index 20c9027..0b0aaae 100644
--- a/host/libs/vm_manager/Android.bp
+++ b/host/libs/vm_manager/Android.bp
@@ -17,9 +17,32 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
+soong_config_module_type {
+ name: "cf_cc_defaults",
+ module_type: "cc_defaults",
+ config_namespace: "cvdhost",
+ bool_variables: ["enforce_mac80211_hwsim"],
+ properties: ["cflags"],
+}
+
+// This is the customization layer driven by soong config variables.
+cf_cc_defaults {
+ name: "cvd_cc_defaults",
+ soong_config_variables: {
+ // PRODUCT_ENFORCE_MAC80211_HWSIM sets this
+ enforce_mac80211_hwsim: {
+ cflags: ["-DENFORCE_MAC80211_HWSIM=true"],
+ conditions_default: {
+ cflags: [],
+ }
+ },
+ }
+}
+
cc_library_static {
name: "libcuttlefish_vm_manager",
srcs: [
+ "crosvm_builder.cpp",
"crosvm_manager.cpp",
"host_configuration.cpp",
"qemu_manager.cpp",
@@ -32,10 +55,15 @@
"libcuttlefish_fs",
"libcuttlefish_utils",
"libbase",
+ "libfruit",
"libjsoncpp",
],
static_libs: [
"libcuttlefish_host_config",
],
- defaults: ["cuttlefish_host", "cuttlefish_libicuuc"],
+ defaults: [
+ "cuttlefish_host",
+ "cuttlefish_libicuuc",
+ "cvd_cc_defaults",
+ ],
}
diff --git a/host/libs/vm_manager/crosvm_builder.cpp b/host/libs/vm_manager/crosvm_builder.cpp
new file mode 100644
index 0000000..cb7fbc4
--- /dev/null
+++ b/host/libs/vm_manager/crosvm_builder.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "host/libs/vm_manager/crosvm_builder.h"
+
+#include <android-base/logging.h>
+
+#include <string>
+
+#include "common/libs/utils/network.h"
+#include "common/libs/utils/subprocess.h"
+
+namespace cuttlefish {
+
+CrosvmBuilder::CrosvmBuilder() : command_("crosvm") {
+ command_.AddParameter("run");
+}
+
+void CrosvmBuilder::SetBinary(const std::string& binary) {
+ command_.SetExecutable(binary);
+}
+
+void CrosvmBuilder::AddControlSocket(const std::string& control_socket) {
+ // Store this value so it persists after std::move(this->Cmd())
+ auto crosvm = command_.Executable();
+ command_.SetStopper([crosvm, control_socket](Subprocess* proc) {
+ Command stop_cmd(crosvm);
+ stop_cmd.AddParameter("stop");
+ stop_cmd.AddParameter(control_socket);
+ if (stop_cmd.Start().Wait() == 0) {
+ return StopperResult::kStopSuccess;
+ }
+ LOG(WARNING) << "Failed to stop VMM nicely, attempting to KILL";
+ return KillSubprocess(proc) == StopperResult::kStopSuccess
+ ? StopperResult::kStopCrash
+ : StopperResult::kStopFailure;
+ });
+ command_.AddParameter("--socket=", control_socket);
+}
+
+void CrosvmBuilder::AddHvcSink() {
+ command_.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num_,
+ ",type=sink");
+}
+void CrosvmBuilder::AddHvcConsoleReadOnly(const std::string& output) {
+ command_.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num_,
+ ",type=file,path=", output, ",console=true");
+}
+void CrosvmBuilder::AddHvcReadOnly(const std::string& output) {
+ command_.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num_,
+ ",type=file,path=", output);
+}
+void CrosvmBuilder::AddHvcReadWrite(const std::string& output,
+ const std::string& input) {
+ command_.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num_,
+ ",type=file,path=", output, ",input=", input);
+}
+
+void CrosvmBuilder::AddSerialSink() {
+ command_.AddParameter("--serial=hardware=serial,num=", ++serial_num_,
+ ",type=sink");
+}
+void CrosvmBuilder::AddSerialConsoleReadOnly(const std::string& output) {
+ command_.AddParameter("--serial=hardware=serial,num=", ++serial_num_,
+ ",type=file,path=", output, ",earlycon=true");
+}
+void CrosvmBuilder::AddSerialConsoleReadWrite(const std::string& output,
+ const std::string& input) {
+ command_.AddParameter("--serial=hardware=serial,num=", ++serial_num_,
+ ",type=file,path=", output, ",input=", input,
+ ",earlycon=true");
+}
+void CrosvmBuilder::AddSerial(const std::string& output,
+ const std::string& input) {
+ command_.AddParameter("--serial=hardware=serial,num=", ++serial_num_,
+ ",type=file,path=", output, ",input=", input);
+}
+
+SharedFD CrosvmBuilder::AddTap(const std::string& tap_name) {
+ auto tap_fd = OpenTapInterface(tap_name);
+ if (tap_fd->IsOpen()) {
+ command_.AddParameter("--tap-fd=", tap_fd);
+ } else {
+ LOG(ERROR) << "Unable to connect to \"" << tap_name
+ << "\": " << tap_fd->StrError();
+ }
+ return tap_fd;
+}
+
+int CrosvmBuilder::HvcNum() { return hvc_num_; }
+
+Command& CrosvmBuilder::Cmd() { return command_; }
+
+} // namespace cuttlefish
diff --git a/host/libs/vm_manager/crosvm_builder.h b/host/libs/vm_manager/crosvm_builder.h
new file mode 100644
index 0000000..90457b2
--- /dev/null
+++ b/host/libs/vm_manager/crosvm_builder.h
@@ -0,0 +1,57 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <string>
+#include <utility>
+
+#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/subprocess.h"
+
+namespace cuttlefish {
+
+class CrosvmBuilder {
+ public:
+ CrosvmBuilder();
+
+ void SetBinary(const std::string&);
+ void AddControlSocket(const std::string&);
+
+ void AddHvcSink();
+ void AddHvcConsoleReadOnly(const std::string& output);
+ void AddHvcReadOnly(const std::string& output);
+ void AddHvcReadWrite(const std::string& output, const std::string& input);
+
+ void AddSerialSink();
+ void AddSerialConsoleReadOnly(const std::string& output);
+ void AddSerialConsoleReadWrite(const std::string& output,
+ const std::string& input);
+ // [[deprecated("do not add any more users")]]
+ void AddSerial(const std::string& output, const std::string& input);
+
+ SharedFD AddTap(const std::string& tap_name);
+
+ int HvcNum();
+
+ Command& Cmd();
+
+ private:
+ Command command_;
+ int hvc_num_;
+ int serial_num_;
+};
+
+} // namespace cuttlefish
diff --git a/host/libs/vm_manager/crosvm_manager.cpp b/host/libs/vm_manager/crosvm_manager.cpp
index e424fd5..2b729f5 100644
--- a/host/libs/vm_manager/crosvm_manager.cpp
+++ b/host/libs/vm_manager/crosvm_manager.cpp
@@ -16,23 +16,24 @@
#include "host/libs/vm_manager/crosvm_manager.h"
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/strings.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <vulkan/vulkan.h>
#include <cassert>
#include <string>
#include <vector>
-#include <android-base/strings.h>
-#include <android-base/logging.h>
-#include <vulkan/vulkan.h>
-
#include "common/libs/utils/environment.h"
+#include "common/libs/utils/files.h"
#include "common/libs/utils/network.h"
#include "common/libs/utils/subprocess.h"
-#include "common/libs/utils/files.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/config/known_paths.h"
+#include "host/libs/vm_manager/crosvm_builder.h"
#include "host/libs/vm_manager/qemu_manager.h"
namespace cuttlefish {
@@ -40,52 +41,10 @@
namespace {
-std::string GetControlSocketPath(const CuttlefishConfig& config) {
- return config.ForDefaultInstance()
- .PerInstanceInternalPath("crosvm_control.sock");
-}
-
-SharedFD AddTapFdParameter(Command* crosvm_cmd,
- const std::string& tap_name) {
- auto tap_fd = OpenTapInterface(tap_name);
- if (tap_fd->IsOpen()) {
- crosvm_cmd->AddParameter("--tap-fd=", tap_fd);
- } else {
- LOG(ERROR) << "Unable to connect to " << tap_name << ": "
- << tap_fd->StrError();
- }
- return tap_fd;
-}
-
-bool ReleaseDhcpLeases(const std::string& lease_path, SharedFD tap_fd) {
- auto lease_file_fd = SharedFD::Open(lease_path, O_RDONLY);
- if (!lease_file_fd->IsOpen()) {
- LOG(ERROR) << "Could not open leases file \"" << lease_path << '"';
- return false;
- }
- bool success = true;
- auto dhcp_leases = ParseDnsmasqLeases(lease_file_fd);
- for (auto& lease : dhcp_leases) {
- std::uint8_t dhcp_server_ip[] = {192, 168, 96, (std::uint8_t) (ForCurrentInstance(1) * 4 - 3)};
- if (!ReleaseDhcp4(tap_fd, lease.mac_address, lease.ip_address, dhcp_server_ip)) {
- LOG(ERROR) << "Failed to release " << lease;
- success = false;
- } else {
- LOG(INFO) << "Successfully dropped " << lease;
- }
- }
- return success;
-}
-
-bool Stop() {
- auto config = CuttlefishConfig::Get();
- Command command(config->crosvm_binary());
- command.AddParameter("stop");
- command.AddParameter(GetControlSocketPath(*config));
-
- auto process = command.Start();
-
- return process.Wait() == 0;
+std::string GetControlSocketPath(
+ const CuttlefishConfig::InstanceSpecific& instance,
+ const std::string& socket_name) {
+ return instance.PerInstanceInternalPath(socket_name.c_str());
}
} // namespace
@@ -98,8 +57,8 @@
#endif
}
-std::vector<std::string> CrosvmManager::ConfigureGpuMode(
- const std::string& gpu_mode) {
+std::vector<std::string> CrosvmManager::ConfigureGraphics(
+ const std::string& gpu_mode, const std::string& hwcomposer) {
// Override the default HAL search paths in all cases. We do this because
// the HAL search path allows for fallbacks, and fallbacks in conjunction
// with properities lead to non-deterministic behavior while loading the
@@ -108,10 +67,10 @@
return {
"androidboot.cpuvulkan.version=" + std::to_string(VK_API_VERSION_1_2),
"androidboot.hardware.gralloc=minigbm",
- "androidboot.hardware.hwcomposer=ranchu",
+ "androidboot.hardware.hwcomposer="+ hwcomposer,
"androidboot.hardware.egl=angle",
"androidboot.hardware.vulkan=pastel",
- };
+ "androidboot.opengles.version=196609"}; // OpenGL ES 3.1
}
if (gpu_mode == kGpuModeDrmVirgl) {
@@ -123,14 +82,13 @@
};
}
if (gpu_mode == kGpuModeGfxStream) {
- return {
- "androidboot.cpuvulkan.version=0",
- "androidboot.hardware.gralloc=minigbm",
- "androidboot.hardware.hwcomposer=ranchu",
- "androidboot.hardware.egl=emulation",
- "androidboot.hardware.vulkan=ranchu",
- "androidboot.hardware.gltransport=virtio-gpu-asg",
- };
+ return {"androidboot.cpuvulkan.version=0",
+ "androidboot.hardware.gralloc=minigbm",
+ "androidboot.hardware.hwcomposer=" + hwcomposer,
+ "androidboot.hardware.egl=emulation",
+ "androidboot.hardware.vulkan=ranchu",
+ "androidboot.hardware.gltransport=virtio-gpu-asg",
+ "androidboot.opengles.version=196608"}; // OpenGL ES 3.0
}
return {};
}
@@ -147,110 +105,73 @@
}
}
+constexpr auto crosvm_socket = "crosvm_control.sock";
+
std::vector<Command> CrosvmManager::StartCommands(
const CuttlefishConfig& config) {
auto instance = config.ForDefaultInstance();
- Command crosvm_cmd(config.crosvm_binary(), [](Subprocess* proc) {
- auto stopped = Stop();
- if (stopped) {
- return true;
- }
- LOG(WARNING) << "Failed to stop VMM nicely, attempting to KILL";
- return KillSubprocess(proc);
- });
-
- int hvc_num = 0;
- int serial_num = 0;
- auto add_hvc_sink = [&crosvm_cmd, &hvc_num]() {
- crosvm_cmd.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num,
- ",type=sink");
- };
- auto add_serial_sink = [&crosvm_cmd, &serial_num]() {
- crosvm_cmd.AddParameter("--serial=hardware=serial,num=", ++serial_num,
- ",type=sink");
- };
- auto add_hvc_console = [&crosvm_cmd, &hvc_num](const std::string& output) {
- crosvm_cmd.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num,
- ",type=file,path=", output, ",console=true");
- };
- auto add_serial_console_ro = [&crosvm_cmd,
- &serial_num](const std::string& output) {
- crosvm_cmd.AddParameter("--serial=hardware=serial,num=", ++serial_num,
- ",type=file,path=", output, ",earlycon=true");
- };
- auto add_serial_console = [&crosvm_cmd, &serial_num](
- const std::string& output,
- const std::string& input) {
- crosvm_cmd.AddParameter("--serial=hardware=serial,num=", ++serial_num,
- ",type=file,path=", output, ",input=", input,
- ",earlycon=true");
- };
- auto add_hvc_ro = [&crosvm_cmd, &hvc_num](const std::string& output) {
- crosvm_cmd.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num,
- ",type=file,path=", output);
- };
- auto add_hvc = [&crosvm_cmd, &hvc_num](const std::string& output,
- const std::string& input) {
- crosvm_cmd.AddParameter("--serial=hardware=virtio-console,num=", ++hvc_num,
- ",type=file,path=", output, ",input=", input);
- };
- // Deprecated; do not add any more users
- auto add_serial = [&crosvm_cmd, &serial_num](const std::string& output,
- const std::string& input) {
- crosvm_cmd.AddParameter("--serial=hardware=serial,num=", ++serial_num,
- ",type=file,path=", output, ",input=", input);
- };
-
- crosvm_cmd.AddParameter("run");
+ CrosvmBuilder crosvm_cmd;
+ crosvm_cmd.SetBinary(config.crosvm_binary());
+ crosvm_cmd.AddControlSocket(GetControlSocketPath(instance, crosvm_socket));
if (!config.smt()) {
- crosvm_cmd.AddParameter("--no-smt");
+ crosvm_cmd.Cmd().AddParameter("--no-smt");
}
if (config.vhost_net()) {
- crosvm_cmd.AddParameter("--vhost-net");
+ crosvm_cmd.Cmd().AddParameter("--vhost-net");
}
+#ifdef ENFORCE_MAC80211_HWSIM
+ if (!config.vhost_user_mac80211_hwsim().empty()) {
+ crosvm_cmd.Cmd().AddParameter("--vhost-user-mac80211-hwsim=",
+ config.vhost_user_mac80211_hwsim());
+ }
+#endif
+
if (config.protected_vm()) {
- crosvm_cmd.AddParameter("--protected-vm");
+ crosvm_cmd.Cmd().AddParameter("--protected-vm");
}
if (config.gdb_port() > 0) {
CHECK(config.cpus() == 1) << "CPUs must be 1 for crosvm gdb mode";
- crosvm_cmd.AddParameter("--gdb=", config.gdb_port());
+ crosvm_cmd.Cmd().AddParameter("--gdb=", config.gdb_port());
}
+ auto gpu_capture_enabled = !config.gpu_capture_binary().empty();
auto gpu_mode = config.gpu_mode();
+ auto udmabuf_string = config.enable_gpu_udmabuf() ? "true" : "false";
if (gpu_mode == kGpuModeGuestSwiftshader) {
- crosvm_cmd.AddParameter("--gpu=2D");
+ crosvm_cmd.Cmd().AddParameter("--gpu=2D,udmabuf=", udmabuf_string);
} else if (gpu_mode == kGpuModeDrmVirgl || gpu_mode == kGpuModeGfxStream) {
- crosvm_cmd.AddParameter(gpu_mode == kGpuModeGfxStream ?
- "--gpu=gfxstream," : "--gpu=",
- "egl=true,surfaceless=true,glx=false,gles=true");
+ crosvm_cmd.Cmd().AddParameter(
+ gpu_mode == kGpuModeGfxStream ? "--gpu=gfxstream," : "--gpu=",
+ "egl=true,surfaceless=true,glx=false,gles=true,udmabuf=", udmabuf_string);
}
for (const auto& display_config : config.display_configs()) {
- crosvm_cmd.AddParameter("--gpu-display=", "width=", display_config.width,
- ",", "height=", display_config.height);
+ crosvm_cmd.Cmd().AddParameter(
+ "--gpu-display=", "width=", display_config.width, ",",
+ "height=", display_config.height);
}
- crosvm_cmd.AddParameter("--wayland-sock=", instance.frames_socket_path());
+ crosvm_cmd.Cmd().AddParameter("--wayland-sock=",
+ instance.frames_socket_path());
- // crosvm_cmd.AddParameter("--null-audio");
- crosvm_cmd.AddParameter("--mem=", config.memory_mb());
- crosvm_cmd.AddParameter("--cpus=", config.cpus());
+ // crosvm_cmd.Cmd().AddParameter("--null-audio");
+ crosvm_cmd.Cmd().AddParameter("--mem=", config.memory_mb());
+ crosvm_cmd.Cmd().AddParameter("--cpus=", config.cpus());
auto disk_num = instance.virtual_disk_paths().size();
CHECK_GE(VmManager::kMaxDisks, disk_num)
<< "Provided too many disks (" << disk_num << "), maximum "
<< VmManager::kMaxDisks << "supported";
for (const auto& disk : instance.virtual_disk_paths()) {
- crosvm_cmd.AddParameter(config.protected_vm() ? "--disk=" :
- "--rwdisk=", disk);
+ crosvm_cmd.Cmd().AddParameter(
+ config.protected_vm() ? "--disk=" : "--rwdisk=", disk);
}
- crosvm_cmd.AddParameter("--socket=", GetControlSocketPath(config));
- if (config.enable_vnc_server() || config.enable_webrtc()) {
+ if (config.enable_webrtc()) {
auto touch_type_parameter =
config.enable_webrtc() ? "--multi-touch=" : "--single-touch=";
@@ -260,28 +181,41 @@
for (int i = 0; i < display_configs.size(); ++i) {
auto display_config = display_configs[i];
- crosvm_cmd.AddParameter(touch_type_parameter,
- instance.touch_socket_path(i), ":",
- display_config.width, ":", display_config.height);
+ crosvm_cmd.Cmd().AddParameter(
+ touch_type_parameter, instance.touch_socket_path(i), ":",
+ display_config.width, ":", display_config.height);
}
- crosvm_cmd.AddParameter("--keyboard=", instance.keyboard_socket_path());
+ crosvm_cmd.Cmd().AddParameter("--keyboard=",
+ instance.keyboard_socket_path());
}
if (config.enable_webrtc()) {
- crosvm_cmd.AddParameter("--switches=", instance.switches_socket_path());
+ crosvm_cmd.Cmd().AddParameter("--switches=",
+ instance.switches_socket_path());
}
- AddTapFdParameter(&crosvm_cmd, instance.mobile_tap_name());
- AddTapFdParameter(&crosvm_cmd, instance.ethernet_tap_name());
- auto wifi_tap = AddTapFdParameter(&crosvm_cmd, instance.wifi_tap_name());
+ SharedFD wifi_tap;
+ // GPU capture can only support named files and not file descriptors due to
+ // having to pass arguments to crosvm via a wrapper script.
+ if (!gpu_capture_enabled) {
+ crosvm_cmd.AddTap(instance.mobile_tap_name());
+ crosvm_cmd.AddTap(instance.ethernet_tap_name());
- if (FileExists(instance.access_kregistry_path())) {
- crosvm_cmd.AddParameter("--rw-pmem-device=",
- instance.access_kregistry_path());
+ // TODO(b/199103204): remove this as well when
+ // PRODUCT_ENFORCE_MAC80211_HWSIM is removed
+#ifndef ENFORCE_MAC80211_HWSIM
+ wifi_tap = crosvm_cmd.AddTap(instance.wifi_tap_name());
+#endif
+ }
+
+ bool is_arm = HostArch() == Arch::Arm || HostArch() == Arch::Arm64;
+ if (!is_arm && FileExists(instance.access_kregistry_path())) {
+ crosvm_cmd.Cmd().AddParameter("--rw-pmem-device=",
+ instance.access_kregistry_path());
}
if (FileExists(instance.pstore_path())) {
- crosvm_cmd.AddParameter("--pstore=path=", instance.pstore_path(),
- ",size=", FileSize(instance.pstore_path()));
+ crosvm_cmd.Cmd().AddParameter("--pstore=path=", instance.pstore_path(),
+ ",size=", FileSize(instance.pstore_path()));
}
if (config.enable_sandbox()) {
@@ -294,19 +228,20 @@
<< " does not exist " << std::endl;
return {};
}
- crosvm_cmd.AddParameter("--seccomp-policy-dir=", config.seccomp_policy_dir());
+ crosvm_cmd.Cmd().AddParameter("--seccomp-policy-dir=",
+ config.seccomp_policy_dir());
} else {
- crosvm_cmd.AddParameter("--disable-sandbox");
+ crosvm_cmd.Cmd().AddParameter("--disable-sandbox");
}
if (instance.vsock_guest_cid() >= 2) {
- crosvm_cmd.AddParameter("--cid=", instance.vsock_guest_cid());
+ crosvm_cmd.Cmd().AddParameter("--cid=", instance.vsock_guest_cid());
}
// Use a virtio-console instance for the main kernel console. All
// messages will switch from earlycon to virtio-console after the driver
// is loaded, and crosvm will append to the kernel log automatically
- add_hvc_console(instance.kernel_log_pipe_name());
+ crosvm_cmd.AddHvcConsoleReadOnly(instance.kernel_log_pipe_name());
if (config.console()) {
// stdin is the only currently supported way to write data to a serial port in
@@ -314,18 +249,18 @@
// the serial port output is received by the console forwarder as crosvm may
// print other messages to stdout.
if (config.kgdb() || config.use_bootloader()) {
- add_serial_console(instance.console_out_pipe_name(),
- instance.console_in_pipe_name());
+ crosvm_cmd.AddSerialConsoleReadWrite(instance.console_out_pipe_name(),
+ instance.console_in_pipe_name());
// In kgdb mode, we have the interactive console on ttyS0 (both Android's
// console and kdb), so we can disable the virtio-console port usually
// allocated to Android's serial console, and redirect it to a sink. This
// ensures that that the PCI device assignments (and thus sepolicy) don't
// have to change
- add_hvc_sink();
+ crosvm_cmd.AddHvcSink();
} else {
- add_serial_sink();
- add_hvc(instance.console_out_pipe_name(),
- instance.console_in_pipe_name());
+ crosvm_cmd.AddSerialSink();
+ crosvm_cmd.AddHvcReadWrite(instance.console_out_pipe_name(),
+ instance.console_in_pipe_name());
}
} else {
// Use an 8250 UART (ISA or platform device) for earlycon, as the
@@ -333,86 +268,160 @@
// In kgdb mode, earlycon is an interactive console, and so early
// dmesg will go there instead of the kernel.log
if (config.kgdb() || config.use_bootloader()) {
- add_serial_console_ro(instance.kernel_log_pipe_name());
+ crosvm_cmd.AddSerialConsoleReadOnly(instance.kernel_log_pipe_name());
}
// as above, create a fake virtio-console 'sink' port when the serial
// console is disabled, so the PCI device ID assignments don't move
// around
- add_hvc_sink();
+ crosvm_cmd.AddHvcSink();
}
- if (config.enable_gnss_grpc_proxy()) {
- add_serial(instance.gnss_out_pipe_name(), instance.gnss_in_pipe_name());
- }
-
- SharedFD log_out_rd, log_out_wr;
- if (!SharedFD::Pipe(&log_out_rd, &log_out_wr)) {
- LOG(ERROR) << "Failed to create log pipe for crosvm's stdout/stderr: "
- << log_out_rd->StrError();
+ auto crosvm_logs_path = instance.PerInstanceInternalPath("crosvm.fifo");
+ auto crosvm_logs = SharedFD::Fifo(crosvm_logs_path, 0666);
+ if (!crosvm_logs->IsOpen()) {
+ LOG(FATAL) << "Failed to create log fifo for crosvm's stdout/stderr: "
+ << crosvm_logs->StrError();
return {};
}
- crosvm_cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdOut, log_out_wr);
- crosvm_cmd.RedirectStdIO(Subprocess::StdIOChannel::kStdErr, log_out_wr);
- Command log_tee_cmd(HostBinaryPath("log_tee"));
- log_tee_cmd.AddParameter("--process_name=crosvm");
- log_tee_cmd.AddParameter("--log_fd_in=", log_out_rd);
+ Command crosvm_log_tee_cmd(HostBinaryPath("log_tee"));
+ crosvm_log_tee_cmd.AddParameter("--process_name=crosvm");
+ crosvm_log_tee_cmd.AddParameter("--log_fd_in=", crosvm_logs);
// Serial port for logcat, redirected to a pipe
- add_hvc_ro(instance.logcat_pipe_name());
+ crosvm_cmd.AddHvcReadOnly(instance.logcat_pipe_name());
- add_hvc(instance.PerInstanceInternalPath("keymaster_fifo_vm.out"),
- instance.PerInstanceInternalPath("keymaster_fifo_vm.in"));
- add_hvc(instance.PerInstanceInternalPath("gatekeeper_fifo_vm.out"),
- instance.PerInstanceInternalPath("gatekeeper_fifo_vm.in"));
+ crosvm_cmd.AddHvcReadWrite(
+ instance.PerInstanceInternalPath("keymaster_fifo_vm.out"),
+ instance.PerInstanceInternalPath("keymaster_fifo_vm.in"));
+ crosvm_cmd.AddHvcReadWrite(
+ instance.PerInstanceInternalPath("gatekeeper_fifo_vm.out"),
+ instance.PerInstanceInternalPath("gatekeeper_fifo_vm.in"));
if (config.enable_host_bluetooth()) {
- add_hvc(instance.PerInstanceInternalPath("bt_fifo_vm.out"),
- instance.PerInstanceInternalPath("bt_fifo_vm.in"));
+ crosvm_cmd.AddHvcReadWrite(
+ instance.PerInstanceInternalPath("bt_fifo_vm.out"),
+ instance.PerInstanceInternalPath("bt_fifo_vm.in"));
} else {
- add_hvc_sink();
+ crosvm_cmd.AddHvcSink();
}
+ if (config.enable_gnss_grpc_proxy()) {
+ crosvm_cmd.AddHvcReadWrite(
+ instance.PerInstanceInternalPath("gnsshvc_fifo_vm.out"),
+ instance.PerInstanceInternalPath("gnsshvc_fifo_vm.in"));
+ } else {
+ crosvm_cmd.AddHvcSink();
+ }
+
for (auto i = 0; i < VmManager::kMaxDisks - disk_num; i++) {
- add_hvc_sink();
+ crosvm_cmd.AddHvcSink();
}
- CHECK(hvc_num + disk_num == VmManager::kMaxDisks + VmManager::kDefaultNumHvcs)
- << "HVC count (" << hvc_num << ") + disk count (" << disk_num << ") "
- << "is not the expected total of "
+ CHECK(crosvm_cmd.HvcNum() + disk_num ==
+ VmManager::kMaxDisks + VmManager::kDefaultNumHvcs)
+ << "HVC count (" << crosvm_cmd.HvcNum() << ") + disk count (" << disk_num
+ << ") is not the expected total of "
<< VmManager::kMaxDisks + VmManager::kDefaultNumHvcs << " devices";
if (config.enable_audio()) {
- crosvm_cmd.AddParameter("--sound=",
- config.ForDefaultInstance().audio_server_path());
+ crosvm_cmd.Cmd().AddParameter(
+ "--sound=", config.ForDefaultInstance().audio_server_path());
}
// TODO(b/162071003): virtiofs crashes without sandboxing, this should be fixed
- if (config.enable_sandbox()) {
+ if (0 && config.enable_sandbox()) {
// Set up directory shared with virtiofs
- crosvm_cmd.AddParameter("--shared-dir=", instance.PerInstancePath(kSharedDirName),
- ":shared:type=fs");
+ crosvm_cmd.Cmd().AddParameter(
+ "--shared-dir=", instance.PerInstancePath(kSharedDirName),
+ ":shared:type=fs");
}
// This needs to be the last parameter
- crosvm_cmd.AddParameter("--bios=", config.bootloader());
+ crosvm_cmd.Cmd().AddParameter("--bios=", config.bootloader());
+ // TODO(b/199103204): remove this as well when PRODUCT_ENFORCE_MAC80211_HWSIM
+ // is removed
// Only run the leases workaround if we are not using the new network
// bridge architecture - in that case, we have a wider DHCP address
// space and stale leases should be much less of an issue
- if (!FileExists("/var/run/cuttlefish-dnsmasq-cvd-wbr.leases")) {
+ if (!FileExists("/var/run/cuttlefish-dnsmasq-cvd-wbr.leases") &&
+ wifi_tap->IsOpen()) {
// TODO(schuffelen): QEMU also needs this and this is not the best place for
// this code. Find a better place to put it.
auto lease_file =
ForCurrentInstance("/var/run/cuttlefish-dnsmasq-cvd-wbr-") + ".leases";
- if (!ReleaseDhcpLeases(lease_file, wifi_tap)) {
+
+ std::uint8_t dhcp_server_ip[] = {
+ 192, 168, 96, (std::uint8_t)(ForCurrentInstance(1) * 4 - 3)};
+ if (!ReleaseDhcpLeases(lease_file, wifi_tap, dhcp_server_ip)) {
LOG(ERROR) << "Failed to release wifi DHCP leases. Connecting to the wifi "
<< "network may not work.";
}
}
std::vector<Command> ret;
- ret.push_back(std::move(crosvm_cmd));
- ret.push_back(std::move(log_tee_cmd));
+
+ if (gpu_capture_enabled) {
+ const std::string gpu_capture_basename =
+ cpp_basename(config.gpu_capture_binary());
+
+ auto gpu_capture_logs_path =
+ instance.PerInstanceInternalPath("gpu_capture.fifo");
+ auto gpu_capture_logs = SharedFD::Fifo(gpu_capture_logs_path, 0666);
+ if (!gpu_capture_logs->IsOpen()) {
+ LOG(FATAL)
+ << "Failed to create log fifo for gpu capture's stdout/stderr: "
+ << gpu_capture_logs->StrError();
+ return {};
+ }
+
+ Command gpu_capture_log_tee_cmd(HostBinaryPath("log_tee"));
+ gpu_capture_log_tee_cmd.AddParameter("--process_name=",
+ gpu_capture_basename);
+ gpu_capture_log_tee_cmd.AddParameter("--log_fd_in=", gpu_capture_logs);
+
+ Command gpu_capture_command(config.gpu_capture_binary());
+ if (gpu_capture_basename == "ngfx") {
+ // Crosvm depends on command line arguments being passed as multiple
+ // arguments but ngfx only allows a single `--args`. To work around this,
+ // create a wrapper script that launches crosvm with all of the arguments
+ // and pass this wrapper script to ngfx.
+ const std::string crosvm_wrapper_path =
+ instance.PerInstanceInternalPath("crosvm_wrapper.sh");
+ const std::string crosvm_wrapper_content =
+ crosvm_cmd.Cmd().AsBashScript(crosvm_logs_path);
+
+ CHECK(android::base::WriteStringToFile(crosvm_wrapper_content,
+ crosvm_wrapper_path));
+ CHECK(MakeFileExecutable(crosvm_wrapper_path));
+
+ gpu_capture_command.AddParameter("--exe=", crosvm_wrapper_path);
+ gpu_capture_command.AddParameter("--launch-detached");
+ gpu_capture_command.AddParameter("--verbose");
+ gpu_capture_command.AddParameter("--activity=Frame Debugger");
+ } else {
+ // TODO(natsu): renderdoc
+ LOG(FATAL) << "Unhandled GPU capture binary: "
+ << config.gpu_capture_binary();
+ }
+
+ gpu_capture_command.RedirectStdIO(Subprocess::StdIOChannel::kStdOut,
+ gpu_capture_logs);
+ gpu_capture_command.RedirectStdIO(Subprocess::StdIOChannel::kStdErr,
+ gpu_capture_logs);
+
+ ret.push_back(std::move(gpu_capture_log_tee_cmd));
+ ret.push_back(std::move(gpu_capture_command));
+ } else {
+ crosvm_cmd.Cmd().RedirectStdIO(Subprocess::StdIOChannel::kStdOut,
+ crosvm_logs);
+ crosvm_cmd.Cmd().RedirectStdIO(Subprocess::StdIOChannel::kStdErr,
+ crosvm_logs);
+
+ ret.push_back(std::move(crosvm_cmd.Cmd()));
+ }
+
+ ret.push_back(std::move(crosvm_log_tee_cmd));
return ret;
}
diff --git a/host/libs/vm_manager/crosvm_manager.h b/host/libs/vm_manager/crosvm_manager.h
index 9d41d68..0c14da8 100644
--- a/host/libs/vm_manager/crosvm_manager.h
+++ b/host/libs/vm_manager/crosvm_manager.h
@@ -31,11 +31,11 @@
class CrosvmManager : public VmManager {
public:
static std::string name() { return "crosvm"; }
- CrosvmManager(Arch arch) : VmManager(arch) {}
virtual ~CrosvmManager() = default;
bool IsSupported() override;
- std::vector<std::string> ConfigureGpuMode(const std::string&) override;
+ std::vector<std::string> ConfigureGraphics(const std::string&,
+ const std::string&) override;
std::string ConfigureBootDevices(int num_disks) override;
std::vector<cuttlefish::Command> StartCommands(
diff --git a/host/libs/vm_manager/qemu_manager.cpp b/host/libs/vm_manager/qemu_manager.cpp
index c8c1084..c8bce99 100644
--- a/host/libs/vm_manager/qemu_manager.cpp
+++ b/host/libs/vm_manager/qemu_manager.cpp
@@ -85,14 +85,46 @@
return true;
}
+std::pair<int,int> GetQemuVersion(const std::string& qemu_binary)
+{
+ Command qemu_version_cmd(qemu_binary);
+ qemu_version_cmd.AddParameter("-version");
+
+ std::string qemu_version_input, qemu_version_output, qemu_version_error;
+ cuttlefish::SubprocessOptions options;
+ options.Verbose(false);
+ int qemu_version_ret =
+ cuttlefish::RunWithManagedStdio(std::move(qemu_version_cmd),
+ &qemu_version_input,
+ &qemu_version_output,
+ &qemu_version_error, options);
+ if (qemu_version_ret != 0) {
+ LOG(FATAL) << qemu_binary << " -version returned unexpected response "
+ << qemu_version_output << ". Stderr was " << qemu_version_error;
+ return { 0, 0 };
+ }
+
+ // Snip around the extra text we don't care about
+ qemu_version_output.erase(0, std::string("QEMU emulator version ").length());
+ auto space_pos = qemu_version_output.find(" ", 0);
+ if (space_pos != std::string::npos) {
+ qemu_version_output.resize(space_pos);
+ }
+
+ auto qemu_version_bits = android::base::Split(qemu_version_output, ".");
+ return { std::stoi(qemu_version_bits[0]), std::stoi(qemu_version_bits[1]) };
+}
+
} // namespace
+QemuManager::QemuManager(Arch arch) : arch_(arch) {}
+
bool QemuManager::IsSupported() {
return HostSupportsQemuCli();
}
-std::vector<std::string> QemuManager::ConfigureGpuMode(
- const std::string& gpu_mode) {
+std::vector<std::string> QemuManager::ConfigureGraphics(
+ const std::string& gpu_mode, const std::string& hwcomposer) {
if (gpu_mode == kGpuModeGuestSwiftshader) {
// Override the default HAL search paths in all cases. We do this because
// the HAL search path allows for fallbacks, and fallbacks in conjunction
@@ -101,8 +133,8 @@
return {
"androidboot.cpuvulkan.version=" + std::to_string(VK_API_VERSION_1_1),
"androidboot.hardware.gralloc=minigbm",
- "androidboot.hardware.hwcomposer=ranchu",
- "androidboot.hardware.egl=swiftshader",
+ "androidboot.hardware.hwcomposer=" + hwcomposer,
+ "androidboot.hardware.egl=angle",
"androidboot.hardware.vulkan=pastel",
};
}
@@ -140,11 +172,13 @@
auto stop = [](Subprocess* proc) {
auto stopped = Stop();
if (stopped) {
- return true;
+ return StopperResult::kStopSuccess;
}
LOG(WARNING) << "Failed to stop VMM nicely, "
<< "attempting to KILL";
- return KillSubprocess(proc);
+ return KillSubprocess(proc) == StopperResult::kStopSuccess
+ ? StopperResult::kStopCrash
+ : StopperResult::kStopFailure;
};
std::string qemu_binary = config.qemu_binary_dir();
switch (arch_) {
@@ -161,6 +195,8 @@
qemu_binary += "/qemu-system-x86_64";
break;
}
+
+ auto qemu_version = GetQemuVersion(qemu_binary);
Command qemu_cmd(qemu_binary, stop);
int hvc_num = 0;
@@ -228,6 +264,7 @@
};
bool is_arm = arch_ == Arch::Arm || arch_ == Arch::Arm64;
+ bool is_arm64 = arch_ == Arch::Arm64;
auto access_kregistry_size_bytes = 0;
if (FileExists(instance.access_kregistry_path())) {
@@ -249,8 +286,22 @@
qemu_cmd.AddParameter("guest=", instance.instance_name(), ",debug-threads=on");
qemu_cmd.AddParameter("-machine");
- auto machine = is_arm ? "virt,gic-version=2,mte=on"
- : "pc-i440fx-2.8,accel=kvm,nvdimm=on";
+ std::string machine = is_arm ? "virt" : "pc-i440fx-2.8,nvdimm=on";
+ if (IsHostCompatible(arch_)) {
+ machine += ",accel=kvm";
+ if (is_arm) {
+ machine += ",gic-version=3";
+ }
+ } else if (is_arm) {
+ // QEMU doesn't support GICv3 with TCG yet
+ machine += ",gic-version=2";
+ if (is_arm64) {
+ // Only enable MTE in TCG mode. We haven't started to run on ARMv8/ARMv9
+ // devices with KVM and MTE, so MTE will always require TCG
+ machine += ",mte=on";
+ }
+ CHECK(config.cpus() <= 8) << "CPUs must be no more than 8 with GICv2";
+ }
qemu_cmd.AddParameter(machine, ",usb=off,dump-guest-core=off");
qemu_cmd.AddParameter("-m");
@@ -292,7 +343,7 @@
qemu_cmd.AddParameter("-chardev");
qemu_cmd.AddParameter("socket,id=charmonitor,path=", GetMonitorPath(config),
- ",server,nowait");
+ ",server=on,wait=off");
qemu_cmd.AddParameter("-mon");
qemu_cmd.AddParameter("chardev=charmonitor,id=monitor,mode=control");
@@ -336,10 +387,6 @@
add_hvc_sink();
}
- if (config.enable_gnss_grpc_proxy()) {
- add_serial_console(instance.gnss_pipe_prefix());
- }
-
// Serial port for logcat, redirected to a pipe
add_hvc_ro(instance.logcat_pipe_name());
@@ -351,6 +398,12 @@
add_hvc_sink();
}
+ if (config.enable_gnss_grpc_proxy()) {
+ add_hvc(instance.PerInstanceInternalPath("gnsshvc_fifo_vm"));
+ } else {
+ add_hvc_sink();
+ }
+
auto disk_num = instance.virtual_disk_paths().size();
for (auto i = 0; i < VmManager::kMaxDisks - disk_num; i++) {
@@ -383,7 +436,7 @@
qemu_cmd.AddParameter("egl-headless");
qemu_cmd.AddParameter("-vnc");
- qemu_cmd.AddParameter(":", instance.vnc_server_port() - 5900);
+ qemu_cmd.AddParameter(":", instance.qemu_vnc_server_port());
} else {
qemu_cmd.AddParameter("-display");
qemu_cmd.AddParameter("none");
@@ -394,7 +447,7 @@
// As we will pass this to ramoops, define this region first so it is always
// located at this address. This is currently x86 only.
qemu_cmd.AddParameter("-object");
- qemu_cmd.AddParameter("memory-backend-file,id=objpmem0,share,mem-path=",
+ qemu_cmd.AddParameter("memory-backend-file,id=objpmem0,share=on,mem-path=",
instance.pstore_path(), ",size=", pstore_size_bytes);
qemu_cmd.AddParameter("-device");
@@ -403,9 +456,9 @@
// QEMU does not implement virtio-pmem-pci for ARM64 yet; restore this
// when the device has been added
- if (!is_arm && FileExists(instance.access_kregistry_path())) {
+ if (!is_arm && access_kregistry_size_bytes > 0) {
qemu_cmd.AddParameter("-object");
- qemu_cmd.AddParameter("memory-backend-file,id=objpmem1,share,mem-path=",
+ qemu_cmd.AddParameter("memory-backend-file,id=objpmem1,share=on,mem-path=",
instance.access_kregistry_path(), ",size=",
access_kregistry_size_bytes);
@@ -421,10 +474,14 @@
"max-bytes=1024,period=2000");
qemu_cmd.AddParameter("-device");
- qemu_cmd.AddParameter("virtio-mouse-pci");
+ qemu_cmd.AddParameter("virtio-mouse-pci,disable-legacy=on");
qemu_cmd.AddParameter("-device");
- qemu_cmd.AddParameter("virtio-keyboard-pci");
+ qemu_cmd.AddParameter("virtio-keyboard-pci,disable-legacy=on");
+
+ // device padding for unsupported "switches" input
+ qemu_cmd.AddParameter("-device");
+ qemu_cmd.AddParameter("virtio-keyboard-pci,disable-legacy=on");
auto vhost_net = config.vhost_net() ? ",vhost=on" : "";
@@ -444,16 +501,23 @@
qemu_cmd.AddParameter("-device");
qemu_cmd.AddParameter("virtio-net-pci-non-transitional,netdev=hostnet1,id=net1");
-
+#ifndef ENFORCE_MAC80211_HWSIM
qemu_cmd.AddParameter("-netdev");
qemu_cmd.AddParameter("tap,id=hostnet2,ifname=", instance.wifi_tap_name(),
",script=no,downscript=no", vhost_net);
-
qemu_cmd.AddParameter("-device");
qemu_cmd.AddParameter("virtio-net-pci-non-transitional,netdev=hostnet2,id=net2");
+#endif
+
+ auto display_configs = config.display_configs();
+ CHECK_GE(display_configs.size(), 1);
+ auto display_config = display_configs[0];
qemu_cmd.AddParameter("-device");
- qemu_cmd.AddParameter("virtio-gpu-pci,id=gpu0");
+ qemu_cmd.AddParameter(qemu_version.first < 6 ?
+ "virtio-gpu-pci" : "virtio-gpu-gl-pci", ",id=gpu0",
+ ",xres=", display_config.width,
+ ",yres=", display_config.height);
qemu_cmd.AddParameter("-cpu");
qemu_cmd.AddParameter(IsHostCompatible(arch_) ? "host" : "max");
diff --git a/host/libs/vm_manager/qemu_manager.h b/host/libs/vm_manager/qemu_manager.h
index 934a976..21ff3d0 100644
--- a/host/libs/vm_manager/qemu_manager.h
+++ b/host/libs/vm_manager/qemu_manager.h
@@ -31,15 +31,19 @@
public:
static std::string name() { return "qemu_cli"; }
- QemuManager(Arch arch) : VmManager(arch) {}
+ QemuManager(Arch);
virtual ~QemuManager() = default;
bool IsSupported() override;
- std::vector<std::string> ConfigureGpuMode(const std::string&) override;
+ std::vector<std::string> ConfigureGraphics(const std::string&,
+ const std::string&) override;
std::string ConfigureBootDevices(int num_disks) override;
std::vector<cuttlefish::Command> StartCommands(
const CuttlefishConfig& config) override;
+
+ private:
+ Arch arch_;
};
} // namespace vm_manager
diff --git a/host/libs/vm_manager/vm_manager.cpp b/host/libs/vm_manager/vm_manager.cpp
index 8c2ef57..b59ff68 100644
--- a/host/libs/vm_manager/vm_manager.cpp
+++ b/host/libs/vm_manager/vm_manager.cpp
@@ -17,6 +17,7 @@
#include "host/libs/vm_manager/vm_manager.h"
#include <android-base/logging.h>
+#include <fruit/fruit.h>
#include <iomanip>
#include <memory>
@@ -33,7 +34,7 @@
if (name == QemuManager::name()) {
vmm.reset(new QemuManager(arch));
} else if (name == CrosvmManager::name()) {
- vmm.reset(new CrosvmManager(arch));
+ vmm.reset(new CrosvmManager());
}
if (!vmm) {
LOG(ERROR) << "Invalid VM manager: " << name;
@@ -61,6 +62,17 @@
return {boot_devices_prop};
}
+fruit::Component<fruit::Required<const CuttlefishConfig>, VmManager>
+VmManagerComponent() {
+ return fruit::createComponent().registerProvider(
+ [](const CuttlefishConfig& config) {
+ auto vmm = GetVmManager(config.vm_manager(), config.target_arch());
+ CHECK(vmm) << "Invalid VMM/Arch: \"" << config.vm_manager() << "\""
+ << (int)config.target_arch() << "\"";
+ return vmm.release(); // fruit takes ownership of raw pointers
+ });
+}
+
} // namespace vm_manager
} // namespace cuttlefish
diff --git a/host/libs/vm_manager/vm_manager.h b/host/libs/vm_manager/vm_manager.h
index b538e8f..f829b6b 100644
--- a/host/libs/vm_manager/vm_manager.h
+++ b/host/libs/vm_manager/vm_manager.h
@@ -14,21 +14,18 @@
* limitations under the License.
*/
#pragma once
+#include <common/libs/utils/subprocess.h>
+#include <fruit/fruit.h>
+#include <host/libs/config/cuttlefish_config.h>
#include <string>
#include <vector>
-#include <common/libs/utils/subprocess.h>
-#include <host/libs/config/cuttlefish_config.h>
-
namespace cuttlefish {
namespace vm_manager {
// Superclass of every guest VM manager.
class VmManager {
- protected:
- const Arch arch_;
-
public:
// This is the number of HVC virtual console ports that should be configured
// by the VmManager. Because crosvm currently allocates these ports as the
@@ -40,7 +37,7 @@
// need to consume host resources, except for the PCI ID. Use this trick to
// keep the number of PCI IDs assigned constant for all flags/vm manager
// combinations
- static const int kDefaultNumHvcs = 6;
+ static const int kDefaultNumHvcs = 7;
// This is the number of virtual disks (block devices) that should be
// configured by the VmManager. Related to the description above regarding
@@ -58,11 +55,11 @@
// the persistent disk
static const int kDefaultNumBootDevices = 2;
- VmManager(Arch arch) : arch_(arch) {}
virtual ~VmManager() = default;
virtual bool IsSupported() = 0;
- virtual std::vector<std::string> ConfigureGpuMode(const std::string&) = 0;
+ virtual std::vector<std::string> ConfigureGraphics(const std::string&,
+ const std::string&) = 0;
virtual std::string ConfigureBootDevices(int num_disks) = 0;
// Starts the VMM. It will usually build a command and pass it to the
@@ -73,6 +70,9 @@
const CuttlefishConfig& config) = 0;
};
+fruit::Component<fruit::Required<const CuttlefishConfig>, VmManager>
+VmManagerComponent();
+
std::unique_ptr<VmManager> GetVmManager(const std::string&, Arch arch);
std::string ConfigureMultipleBootDevices(const std::string& pci_path, int pci_offset,
diff --git a/host/libs/websocket/websocket_handler.cpp b/host/libs/websocket/websocket_handler.cpp
index 9d6f636..c80b150 100644
--- a/host/libs/websocket/websocket_handler.cpp
+++ b/host/libs/websocket/websocket_handler.cpp
@@ -18,8 +18,18 @@
#include <android-base/logging.h>
#include <libwebsockets.h>
+#include "host/libs/websocket/websocket_server.h"
+
namespace cuttlefish {
+namespace {
+void AppendData(const char* data, size_t len, std::string& buffer) {
+ auto ptr = reinterpret_cast<const uint8_t*>(data);
+ buffer.reserve(buffer.size() + len);
+ buffer.insert(buffer.end(), ptr, ptr + len);
+}
+} // namespace
+
WebSocketHandler::WebSocketHandler(struct lws* wsi) : wsi_(wsi) {}
void WebSocketHandler::EnqueueMessage(const uint8_t* data, size_t len,
@@ -34,6 +44,8 @@
// updating the buffer.
void WebSocketHandler::WriteWsBuffer(WebSocketHandler::WsBuffer& ws_buffer) {
auto len = ws_buffer.data.size() - LWS_PRE;
+ // For http2 there must be LWS_PRE bytes at the end as well.
+ ws_buffer.data.resize(ws_buffer.data.size() + LWS_PRE);
auto flags = lws_write_ws_flags(
ws_buffer.binary ? LWS_WRITE_BINARY : LWS_WRITE_TEXT, true, true);
auto res = lws_write(wsi_, &ws_buffer.data[LWS_PRE], len,
@@ -44,7 +56,7 @@
if (res < 0) {
// This shouldn't happen since this function is called in response to a
// LWS_CALLBACK_SERVER_WRITEABLE call.
- LOG(FATAL) << "Failed to write data on the websocket";
+ LOG(ERROR) << "Failed to write data on the websocket";
}
}
@@ -67,4 +79,28 @@
lws_callback_on_writable(wsi_);
}
+DynHandler::DynHandler(struct lws* wsi) : wsi_(wsi), out_buffer_(LWS_PRE, 0) {}
+
+void DynHandler::AppendDataOut(const std::string& data) {
+ AppendData(data.c_str(), data.size(), out_buffer_);
+}
+
+void DynHandler::AppendDataIn(void* data, size_t len) {
+ AppendData(reinterpret_cast<char*>(data), len, in_buffer_);
+}
+
+int DynHandler::OnWritable() {
+ auto len = out_buffer_.size() - LWS_PRE;
+ // For http2 there must be LWS_PRE bytes at the end as well.
+ out_buffer_.resize(out_buffer_.size() + LWS_PRE);
+ auto res = lws_write(wsi_, reinterpret_cast<uint8_t*>(&out_buffer_[LWS_PRE]),
+ len, LWS_WRITE_HTTP_FINAL);
+ if (res != len) {
+ // This shouldn't happen since this function is called in response to a
+ // LWS_CALLBACK_SERVER_WRITEABLE call.
+ LOG(ERROR) << "Failed to write HTTP response";
+ }
+ return lws_http_transaction_completed(wsi_);
+}
+size_t DynHandler::content_len() const { return out_buffer_.size() - LWS_PRE; }
} // namespace cuttlefish
diff --git a/host/libs/websocket/websocket_handler.h b/host/libs/websocket/websocket_handler.h
index 45b51fa..e9a63ca 100644
--- a/host/libs/websocket/websocket_handler.h
+++ b/host/libs/websocket/websocket_handler.h
@@ -16,6 +16,7 @@
#pragma once
#include <deque>
+#include <string>
#include <vector>
struct lws;
@@ -63,4 +64,46 @@
virtual std::shared_ptr<WebSocketHandler> Build(struct lws* wsi) = 0;
};
+class WebSocketServer;
+
+enum class HttpStatusCode : int {
+ // From https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
+ Ok = 200,
+ NoContent = 204,
+ BadRequest = 400,
+ Unauthorized = 401,
+ NotFound = 404,
+ MethodNotAllowed = 405,
+ Conflict = 409,
+};
+
+class DynHandler {
+ public:
+ DynHandler(struct lws* wsi);
+
+ virtual ~DynHandler() = default;
+ // TODO (jemoreira): Allow more than just JSON replies
+ // TODO (jemoreira): Receive request parameters
+ // Handle a GET request.
+ virtual HttpStatusCode DoGet() = 0;
+ // Handle a POST request.
+ virtual HttpStatusCode DoPost() = 0;
+
+ protected:
+ void AppendDataOut(const std::string& data);
+ const std::string& GetDataIn() const { return in_buffer_; }
+
+ private:
+ friend WebSocketServer;
+ void AppendDataIn(void* data, size_t len);
+ int OnWritable();
+ size_t content_len() const;
+
+ struct lws* wsi_;
+ std::string in_buffer_ = {};
+ std::string out_buffer_ = {};
+};
+
+using DynHandlerFactory =
+ std::function<std::unique_ptr<DynHandler>(struct lws*)>;
} // namespace cuttlefish
diff --git a/host/libs/websocket/websocket_server.cpp b/host/libs/websocket/websocket_server.cpp
index 40f1357..f48209b 100644
--- a/host/libs/websocket/websocket_server.cpp
+++ b/host/libs/websocket/websocket_server.cpp
@@ -26,29 +26,158 @@
#include <host/libs/websocket/websocket_handler.h>
namespace cuttlefish {
-WebSocketServer::WebSocketServer(
- const char* protocol_name,
- const std::string &certs_dir,
- const std::string &assets_dir,
- int server_port) {
- std::string cert_file = certs_dir + "/server.crt";
- std::string key_file = certs_dir + "/server.key";
- std::string ca_file = certs_dir + "/CA.crt";
+namespace {
+
+std::string GetPath(struct lws* wsi) {
+ auto len = lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI);
+ std::string path(len + 1, '\0');
+ auto ret = lws_hdr_copy(wsi, path.data(), path.size(), WSI_TOKEN_GET_URI);
+ if (ret <= 0) {
+ len = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COLON_PATH);
+ path.resize(len + 1, '\0');
+ ret =
+ lws_hdr_copy(wsi, path.data(), path.size(), WSI_TOKEN_HTTP_COLON_PATH);
+ }
+ if (ret < 0) {
+ LOG(FATAL) << "Something went wrong getting the path";
+ }
+ path.resize(len);
+ return path;
+}
+
+const std::vector<std::pair<std::string, std::string>> kCORSHeaders = {
+ {"Access-Control-Allow-Origin:", "*"},
+ {"Access-Control-Allow-Methods:", "POST, GET, OPTIONS"},
+ {"Access-Control-Allow-Headers:",
+ "Content-Type, Access-Control-Allow-Headers, Authorization, "
+ "X-Requested-With, Accept"}};
+
+bool AddCORSHeaders(struct lws* wsi, unsigned char** buffer_ptr,
+ unsigned char* buffer_end) {
+ for (const auto& header : kCORSHeaders) {
+ const auto& name = header.first;
+ const auto& value = header.second;
+ if (lws_add_http_header_by_name(
+ wsi, reinterpret_cast<const unsigned char*>(name.c_str()),
+ reinterpret_cast<const unsigned char*>(value.c_str()), value.size(),
+ buffer_ptr, buffer_end)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool WriteCommonHttpHeaders(int status, const char* mime_type,
+ size_t content_len, struct lws* wsi) {
+ constexpr size_t BUFF_SIZE = 2048;
+ uint8_t header_buffer[LWS_PRE + BUFF_SIZE];
+ const auto start = &header_buffer[LWS_PRE];
+ auto p = &header_buffer[LWS_PRE];
+ auto end = start + BUFF_SIZE;
+ if (lws_add_http_common_headers(wsi, status, mime_type, content_len, &p,
+ end)) {
+ LOG(ERROR) << "Failed to write headers for response";
+ return false;
+ }
+ if (!AddCORSHeaders(wsi, &p, end)) {
+ LOG(ERROR) << "Failed to write CORS headers for response";
+ return false;
+ }
+ if (lws_finalize_write_http_header(wsi, start, &p, end)) {
+ LOG(ERROR) << "Failed to finalize headers for response";
+ return false;
+ }
+ return true;
+}
+
+} // namespace
+WebSocketServer::WebSocketServer(const char* protocol_name,
+ const std::string& assets_dir, int server_port)
+ : WebSocketServer(protocol_name, "", assets_dir, server_port) {}
+
+WebSocketServer::WebSocketServer(const char* protocol_name,
+ const std::string& certs_dir,
+ const std::string& assets_dir, int server_port)
+ : protocol_name_(protocol_name),
+ assets_dir_(assets_dir),
+ certs_dir_(certs_dir),
+ server_port_(server_port) {}
+
+void WebSocketServer::InitializeLwsObjects() {
+ std::string cert_file = certs_dir_ + "/server.crt";
+ std::string key_file = certs_dir_ + "/server.key";
+ std::string ca_file = certs_dir_ + "/CA.crt";
retry_ = {
.secs_since_valid_ping = 3,
.secs_since_valid_hangup = 10,
};
- struct lws_protocols protocols[] = {
- {protocol_name, ServerCallback, 4096, 0, 0, nullptr, 0},
- {nullptr, nullptr, 0, 0, 0, nullptr, 0}};
+ struct lws_protocols protocols[] = //
+ {{
+ .name = protocol_name_.c_str(),
+ .callback = WebsocketCallback,
+ .per_session_data_size = 0,
+ .rx_buffer_size = 0,
+ .id = 0,
+ .user = this,
+ .tx_packet_size = 0,
+ },
+ {
+ .name = "__http_polling__",
+ .callback = DynHttpCallback,
+ .per_session_data_size = 0,
+ .rx_buffer_size = 0,
+ .id = 0,
+ .user = this,
+ .tx_packet_size = 0,
+ },
+ {
+ .name = nullptr,
+ .callback = nullptr,
+ .per_session_data_size = 0,
+ .rx_buffer_size = 0,
+ .id = 0,
+ .user = nullptr,
+ .tx_packet_size = 0,
+ }};
- mount_ = {
- .mount_next = nullptr,
+ dyn_mounts_.reserve(dyn_handler_factories_.size());
+ for (auto& handler_entry : dyn_handler_factories_) {
+ auto& path = handler_entry.first;
+ dyn_mounts_.push_back({
+ .mount_next = nullptr,
+ .mountpoint = path.c_str(),
+ .mountpoint_len = static_cast<uint8_t>(path.size()),
+ .origin = "__http_polling__",
+ .def = nullptr,
+ .protocol = nullptr,
+ .cgienv = nullptr,
+ .extra_mimetypes = nullptr,
+ .interpret = nullptr,
+ .cgi_timeout = 0,
+ .cache_max_age = 0,
+ .auth_mask = 0,
+ .cache_reusable = 0,
+ .cache_revalidate = 0,
+ .cache_intermediaries = 0,
+ .origin_protocol = LWSMPRO_CALLBACK, // dynamic
+ .basic_auth_login_file = nullptr,
+ });
+ }
+ struct lws_http_mount* next_mount = nullptr;
+ // Set up the linked list after all the mounts have been created to ensure
+ // pointers are not invalidated.
+ for (auto& mount : dyn_mounts_) {
+ mount.mount_next = next_mount;
+ next_mount = &mount;
+ }
+
+ static_mount_ = {
+ .mount_next = next_mount,
.mountpoint = "/",
.mountpoint_len = 1,
- .origin = assets_dir.c_str(),
+ .origin = assets_dir_.c_str(),
.def = "index.html",
.protocol = nullptr,
.cgienv = nullptr,
@@ -71,20 +200,22 @@
"font-src https://fonts.gstatic.com/; "};
memset(&info, 0, sizeof info);
- info.port = server_port;
- info.mounts = &mount_;
+ info.port = server_port_;
+ info.mounts = &static_mount_;
info.protocols = protocols;
info.vhost_name = "localhost";
- info.ws_ping_pong_interval = 10;
info.headers = &headers_;
- info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
- info.ssl_cert_filepath = cert_file.c_str();
- info.ssl_private_key_filepath = key_file.c_str();
- if (FileExists(ca_file)) {
- info.ssl_ca_filepath = ca_file.c_str();
- }
info.retry_and_idle_policy = &retry_;
+ if (!certs_dir_.empty()) {
+ info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
+ info.ssl_cert_filepath = cert_file.c_str();
+ info.ssl_private_key_filepath = key_file.c_str();
+ if (FileExists(ca_file)) {
+ info.ssl_ca_filepath = ca_file.c_str();
+ }
+ }
+
context_ = lws_create_context(&info);
if (!context_) {
LOG(FATAL) << "Failed to create websocket context";
@@ -92,12 +223,19 @@
}
void WebSocketServer::RegisterHandlerFactory(
- const std::string &path,
+ const std::string& path,
std::unique_ptr<WebSocketHandlerFactory> handler_factory_p) {
handler_factories_[path] = std::move(handler_factory_p);
}
+void WebSocketServer::RegisterDynHandlerFactory(
+ const std::string& path,
+ DynHandlerFactory handler_factory) {
+ dyn_handler_factories_[path] = std::move(handler_factory);
+}
+
void WebSocketServer::Serve() {
+ InitializeLwsObjects();
int n = 0;
while (n >= 0) {
n = lws_service(context_, 0);
@@ -105,27 +243,127 @@
lws_context_destroy(context_);
}
-std::unordered_map<struct lws*, std::shared_ptr<WebSocketHandler>> WebSocketServer::handlers_ = {};
-std::unordered_map<std::string, std::unique_ptr<WebSocketHandlerFactory>>
- WebSocketServer::handler_factories_ = {};
-
-std::string WebSocketServer::GetPath(struct lws* wsi) {
- auto len = lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI);
- std::string path(len + 1, '\0');
- auto ret = lws_hdr_copy(wsi, path.data(), path.size(), WSI_TOKEN_GET_URI);
- if (ret <= 0) {
- len = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COLON_PATH);
- path.resize(len + 1, '\0');
- ret = lws_hdr_copy(wsi, path.data(), path.size(), WSI_TOKEN_HTTP_COLON_PATH);
+int WebSocketServer::WebsocketCallback(struct lws* wsi,
+ enum lws_callback_reasons reason,
+ void* user, void* in, size_t len) {
+ auto protocol = lws_get_protocol(wsi);
+ if (!protocol) {
+ // Some callback reasons are always handled by the first protocol, before a
+ // wsi struct is even created.
+ return lws_callback_http_dummy(wsi, reason, user, in, len);
}
- if (ret < 0) {
- LOG(FATAL) << "Something went wrong getting the path";
- }
- path.resize(len);
- return path;
+ return reinterpret_cast<WebSocketServer*>(protocol->user)
+ ->ServerCallback(wsi, reason, user, in, len);
}
-int WebSocketServer::ServerCallback(struct lws* wsi, enum lws_callback_reasons reason,
+int WebSocketServer::DynHttpCallback(struct lws* wsi,
+ enum lws_callback_reasons reason,
+ void* user, void* in, size_t len) {
+ auto protocol = lws_get_protocol(wsi);
+ if (!protocol) {
+ LOG(ERROR) << "No protocol associated with connection";
+ return 1;
+ }
+ return reinterpret_cast<WebSocketServer*>(protocol->user)
+ ->DynServerCallback(wsi, reason, user, in, len);
+}
+
+int WebSocketServer::DynServerCallback(struct lws* wsi,
+ enum lws_callback_reasons reason,
+ void* user, void* in, size_t len) {
+ switch (reason) {
+ case LWS_CALLBACK_HTTP: {
+ char* path_raw;
+ int path_len;
+ auto method = lws_http_get_uri_and_method(wsi, &path_raw, &path_len);
+ if (method < 0) {
+ return 1;
+ }
+ std::string path(path_raw, path_len);
+ auto handler = InstantiateDynHandler(path, wsi);
+ if (!handler) {
+ if (!WriteCommonHttpHeaders(static_cast<int>(HttpStatusCode::NotFound),
+ "application/json", 0, wsi)) {
+ return 1;
+ }
+ return lws_http_transaction_completed(wsi);
+ }
+ dyn_handlers_[wsi] = std::move(handler);
+ switch (method) {
+ case LWSHUMETH_GET: {
+ auto status = dyn_handlers_[wsi]->DoGet();
+ if (!WriteCommonHttpHeaders(static_cast<int>(status),
+ "application/json",
+ dyn_handlers_[wsi]->content_len(), wsi)) {
+ return 1;
+ }
+ // Write the response later, when the server is ready
+ lws_callback_on_writable(wsi);
+ break;
+ }
+ case LWSHUMETH_POST:
+ // Do nothing until the body has been read
+ break;
+ case LWSHUMETH_OPTIONS: {
+ // Response for CORS preflight
+ auto status = HttpStatusCode::NoContent;
+ if (!WriteCommonHttpHeaders(static_cast<int>(status), "", 0, wsi)) {
+ return 1;
+ }
+ lws_callback_on_writable(wsi);
+ break;
+ }
+ default:
+ LOG(ERROR) << "Unsupported HTTP method: " << method;
+ return 1;
+ }
+ break;
+ }
+ case LWS_CALLBACK_HTTP_BODY: {
+ auto handler = dyn_handlers_[wsi].get();
+ if (!handler) {
+ LOG(WARNING) << "Received body for unknown wsi";
+ return 1;
+ }
+ handler->AppendDataIn(in, len);
+ break;
+ }
+ case LWS_CALLBACK_HTTP_BODY_COMPLETION: {
+ auto handler = dyn_handlers_[wsi].get();
+ if (!handler) {
+ LOG(WARNING) << "Unexpected body completion event from unknown wsi";
+ return 1;
+ }
+ auto status = handler->DoPost();
+ if (!WriteCommonHttpHeaders(static_cast<int>(status), "application/json",
+ dyn_handlers_[wsi]->content_len(), wsi)) {
+ return 1;
+ }
+ lws_callback_on_writable(wsi);
+ break;
+ }
+ case LWS_CALLBACK_HTTP_WRITEABLE: {
+ auto handler = dyn_handlers_[wsi].get();
+ if (!handler) {
+ LOG(WARNING) << "Unknown wsi became writable";
+ return 1;
+ }
+ auto ret = handler->OnWritable();
+ dyn_handlers_.erase(wsi);
+ // Make sure the connection (in HTTP 1) or stream (in HTTP 2) is closed
+ // after the response is written
+ return ret;
+ }
+ case LWS_CALLBACK_CLOSED_HTTP:
+ break;
+ default:
+ return lws_callback_http_dummy(wsi, reason, user, in, len);
+ }
+ return 0;
+}
+
+int WebSocketServer::ServerCallback(struct lws* wsi,
+ enum lws_callback_reasons reason,
void* user, void* in, size_t len) {
switch (reason) {
case LWS_CALLBACK_ESTABLISHED: {
@@ -170,7 +408,7 @@
handler->OnReceive(reinterpret_cast<const uint8_t*>(in), len,
lws_frame_is_binary(wsi), is_final);
} else {
- LOG(WARNING) << "Unkwnown wsi sent data";
+ LOG(WARNING) << "Unknown wsi sent data";
}
break;
}
@@ -187,9 +425,21 @@
LOG(ERROR) << "Wrong path provided in URI: " << uri_path;
return nullptr;
} else {
- LOG(INFO) << "Creating handler for " << uri_path;
+ LOG(VERBOSE) << "Creating handler for " << uri_path;
return it->second->Build(wsi);
}
}
+std::unique_ptr<DynHandler> WebSocketServer::InstantiateDynHandler(
+ const std::string& uri_path, struct lws* wsi) {
+ auto it = dyn_handler_factories_.find(uri_path);
+ if (it == dyn_handler_factories_.end()) {
+ LOG(ERROR) << "Wrong path provided in URI: " << uri_path;
+ return nullptr;
+ } else {
+ LOG(VERBOSE) << "Creating handler for " << uri_path;
+ return it->second(wsi);
+ }
+}
+
} // namespace cuttlefish
diff --git a/host/libs/websocket/websocket_server.h b/host/libs/websocket/websocket_server.h
index 0695b3b..768578a 100644
--- a/host/libs/websocket/websocket_server.h
+++ b/host/libs/websocket/websocket_server.h
@@ -18,6 +18,7 @@
#include <string>
#include <unordered_map>
+#include <vector>
#include <android-base/logging.h>
#include <libwebsockets.h>
@@ -27,32 +28,62 @@
namespace cuttlefish {
class WebSocketServer {
public:
- WebSocketServer(
- const char* protocol_name,
- const std::string &certs_dir,
- const std::string &assets_dir,
- int port);
+ // Uses HTTP and WS
+ WebSocketServer(const char* protocol_name, const std::string& assets_dir,
+ int port);
+ // Uses HTTPS and WSS when a certificates directory is provided
+ WebSocketServer(const char* protocol_name, const std::string& certs_dir,
+ const std::string& assets_dir, int port);
~WebSocketServer() = default;
+ // Register a handler factory for websocket connections. A new handler will be
+ // created for each new websocket connection.
void RegisterHandlerFactory(
- const std::string &path,
- std::unique_ptr<WebSocketHandlerFactory> handler_factory_p);
+ const std::string& path,
+ std::unique_ptr<WebSocketHandlerFactory> handler_factory_p);
+
+ // Register a handler factory for dynamic HTTP requests. A new handler will be
+ // created for each HTTP request.
+ void RegisterDynHandlerFactory(const std::string& path,
+ DynHandlerFactory handler_factory);
+
void Serve();
-
private:
- static std::unordered_map<struct lws*, std::shared_ptr<WebSocketHandler>> handlers_;
- static std::unordered_map<std::string, std::unique_ptr<WebSocketHandlerFactory>>
- handler_factories_;
+ static int WebsocketCallback(struct lws* wsi,
+ enum lws_callback_reasons reason, void* user,
+ void* in, size_t len);
- static std::string GetPath(struct lws* wsi);
- static int ServerCallback(struct lws* wsi, enum lws_callback_reasons reason,
+ static int DynHttpCallback(struct lws* wsi, enum lws_callback_reasons reason,
+ void* user, void* in, size_t len);
+
+ int ServerCallback(struct lws* wsi, enum lws_callback_reasons reason,
void* user, void* in, size_t len);
- static std::shared_ptr<WebSocketHandler> InstantiateHandler(
+ int DynServerCallback(struct lws* wsi,
+ enum lws_callback_reasons reason, void* user,
+ void* in, size_t len);
+ std::shared_ptr<WebSocketHandler> InstantiateHandler(
+ const std::string& uri_path, struct lws* wsi);
+ std::unique_ptr<DynHandler> InstantiateDynHandler(
const std::string& uri_path, struct lws* wsi);
+ void InitializeLwsObjects();
+
+ std::unordered_map<struct lws*, std::shared_ptr<WebSocketHandler>> handlers_ =
+ {};
+ std::unordered_map<std::string, std::unique_ptr<WebSocketHandlerFactory>>
+ handler_factories_ = {};
+ std::unordered_map<struct lws*, std::unique_ptr<DynHandler>> dyn_handlers_ =
+ {};
+ std::unordered_map<std::string, DynHandlerFactory> dyn_handler_factories_ =
+ {};
+ std::string protocol_name_;
+ std::string assets_dir_;
+ std::string certs_dir_;
+ int server_port_;
struct lws_context* context_;
- struct lws_http_mount mount_;
+ struct lws_http_mount static_mount_;
+ std::vector<struct lws_http_mount> dyn_mounts_ = {};
struct lws_protocol_vhost_options headers_;
lws_retry_bo_t retry_;
};
diff --git a/host/commands/mk_cdisk/Android.bp b/host/libs/wmediumd_controller/Android.bp
similarity index 77%
copy from host/commands/mk_cdisk/Android.bp
copy to host/libs/wmediumd_controller/Android.bp
index a0cf8ba..e41e6da 100644
--- a/host/commands/mk_cdisk/Android.bp
+++ b/host/libs/wmediumd_controller/Android.bp
@@ -17,25 +17,21 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-cc_binary {
- name: "mk_cdisk",
+cc_library_static {
+ name: "libcuttlefish_wmediumd_controller",
srcs: [
- "mk_cdisk.cc",
+ "wmediumd_api_protocol.cpp",
+ "wmediumd_controller.cpp",
+ ],
+ export_include_dirs: [
+ ".",
],
shared_libs: [
+ "libbase",
"libcuttlefish_fs",
"libcuttlefish_utils",
- "libbase",
- "libjsoncpp",
- "liblog",
- "libz",
],
static_libs: [
- "libcdisk_spec",
- "libext2_uuid",
- "libimage_aggregator",
- "libprotobuf-cpp-lite",
- "libsparse",
],
defaults: ["cuttlefish_host"],
}
diff --git a/host/libs/wmediumd_controller/wmediumd_api_protocol.cpp b/host/libs/wmediumd_controller/wmediumd_api_protocol.cpp
new file mode 100644
index 0000000..b1ffc5e
--- /dev/null
+++ b/host/libs/wmediumd_controller/wmediumd_api_protocol.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "wmediumd_api_protocol.h"
+
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+
+#include <cstdlib>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "common/libs/fs/shared_buf.h"
+
+template <class T>
+static void AppendBinaryRepresentation(std::string& buf, const T& data) {
+ std::copy(reinterpret_cast<const char*>(&data),
+ reinterpret_cast<const char*>(&data) + sizeof(T),
+ std::back_inserter(buf));
+}
+
+namespace cuttlefish {
+
+std::string WmediumdMessage::Serialize(void) const {
+ std::string result;
+
+ AppendBinaryRepresentation(result, this->Type());
+
+ std::string body;
+ this->SerializeBody(body);
+
+ AppendBinaryRepresentation(result, static_cast<uint32_t>(body.size()));
+
+ std::copy(std::begin(body), std::end(body), std::back_inserter(result));
+
+ return result;
+}
+
+void WmediumdMessageSetControl::SerializeBody(std::string& buf) const {
+ AppendBinaryRepresentation(buf, flags_);
+}
+
+WmediumdMessageSetSnr::WmediumdMessageSetSnr(const std::string& node1,
+ const std::string& node2,
+ uint8_t snr) {
+ auto splitted_mac1 = android::base::Split(node1, ":");
+ auto splitted_mac2 = android::base::Split(node2, ":");
+
+ if (splitted_mac1.size() != 6) {
+ LOG(FATAL) << "invalid mac address length " << node1;
+ }
+
+ if (splitted_mac2.size() != 6) {
+ LOG(FATAL) << "invalid mac address length " << node2;
+ }
+
+ for (int i = 0; i < 6; i++) {
+ char* end_ptr;
+ node1_mac_[i] = (uint8_t)strtol(splitted_mac1[i].c_str(), &end_ptr, 16);
+ if (end_ptr != splitted_mac1[i].c_str() + splitted_mac1[i].size()) {
+ LOG(FATAL) << "cannot parse " << splitted_mac1[i] << " of " << node1;
+ }
+
+ node2_mac_[i] = (uint8_t)strtol(splitted_mac2[i].c_str(), &end_ptr, 16);
+ if (end_ptr != splitted_mac2[i].c_str() + splitted_mac2[i].size()) {
+ LOG(FATAL) << "cannot parse " << splitted_mac2[i] << " of " << node1;
+ }
+ }
+
+ snr_ = snr;
+}
+
+void WmediumdMessageSetSnr::SerializeBody(std::string& buf) const {
+ std::copy(std::begin(node1_mac_), std::end(node1_mac_),
+ std::back_inserter(buf));
+ std::copy(std::begin(node2_mac_), std::end(node2_mac_),
+ std::back_inserter(buf));
+ buf.push_back(snr_);
+}
+
+void WmediumdMessageReloadConfig::SerializeBody(std::string& buf) const {
+ std::copy(std::begin(config_path_), std::end(config_path_),
+ std::back_inserter(buf));
+ buf.push_back('\0');
+}
+
+void WmediumdMessageStartPcap::SerializeBody(std::string& buf) const {
+ std::copy(std::begin(pcap_path_), std::end(pcap_path_),
+ std::back_inserter(buf));
+ buf.push_back('\0');
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/wmediumd_controller/wmediumd_api_protocol.h b/host/libs/wmediumd_controller/wmediumd_api_protocol.h
new file mode 100644
index 0000000..b6fb90f
--- /dev/null
+++ b/host/libs/wmediumd_controller/wmediumd_api_protocol.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include "common/libs/fs/shared_fd.h"
+
+namespace cuttlefish {
+
+enum class WmediumdMessageType : uint32_t {
+ kInvalid = 0,
+ kAck = 1,
+ kRegister = 2,
+ kUnregister = 3,
+ kNetlink = 4,
+ kSetControl = 5,
+ kTxStart = 6,
+ kGetNodes = 7,
+ kSetSnr = 8,
+ kReloadConfig = 9,
+ kReloadCurrentConfig = 10,
+ kStartPcap = 11,
+ kStopPcap = 12,
+};
+
+class WmediumdMessage {
+ public:
+ virtual ~WmediumdMessage() {}
+
+ std::string Serialize(void) const;
+
+ virtual WmediumdMessageType Type() const = 0;
+
+ private:
+ virtual void SerializeBody(std::string&) const {};
+};
+
+class WmediumdMessageSetControl : public WmediumdMessage {
+ public:
+ WmediumdMessageSetControl(uint32_t flags) : flags_(flags) {}
+
+ WmediumdMessageType Type() const override {
+ return WmediumdMessageType::kSetControl;
+ }
+
+ private:
+ void SerializeBody(std::string& out) const override;
+ uint32_t flags_;
+};
+
+class WmediumdMessageSetSnr : public WmediumdMessage {
+ public:
+ WmediumdMessageSetSnr(const std::string& node1, const std::string& node2,
+ uint8_t snr);
+
+ WmediumdMessageType Type() const override {
+ return WmediumdMessageType::kSetSnr;
+ }
+
+ private:
+ void SerializeBody(std::string& out) const override;
+
+ uint8_t node1_mac_[6];
+ uint8_t node2_mac_[6];
+ uint8_t snr_;
+};
+
+class WmediumdMessageReloadConfig : public WmediumdMessage {
+ public:
+ WmediumdMessageReloadConfig(const std::string& configPath)
+ : config_path_(configPath) {}
+
+ WmediumdMessageType Type() const override {
+ return WmediumdMessageType::kReloadConfig;
+ }
+
+ private:
+ void SerializeBody(std::string& out) const override;
+
+ std::string config_path_;
+};
+
+class WmediumdMessageReloadCurrentConfig : public WmediumdMessage {
+ public:
+ WmediumdMessageReloadCurrentConfig() = default;
+
+ WmediumdMessageType Type() const override {
+ return WmediumdMessageType::kReloadCurrentConfig;
+ }
+};
+
+class WmediumdMessageStartPcap : public WmediumdMessage {
+ public:
+ WmediumdMessageStartPcap(const std::string& pcapPath)
+ : pcap_path_(pcapPath) {}
+
+ WmediumdMessageType Type() const override {
+ return WmediumdMessageType::kStartPcap;
+ }
+
+ private:
+ void SerializeBody(std::string& out) const override;
+
+ std::string pcap_path_;
+};
+
+class WmediumdMessageStopPcap : public WmediumdMessage {
+ public:
+ WmediumdMessageStopPcap() = default;
+
+ WmediumdMessageType Type() const override {
+ return WmediumdMessageType::kStopPcap;
+ }
+};
+
+} // namespace cuttlefish
diff --git a/host/libs/wmediumd_controller/wmediumd_controller.cpp b/host/libs/wmediumd_controller/wmediumd_controller.cpp
new file mode 100644
index 0000000..481aa6f
--- /dev/null
+++ b/host/libs/wmediumd_controller/wmediumd_controller.cpp
@@ -0,0 +1,104 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "wmediumd_controller.h"
+
+#include <android-base/logging.h>
+#include <sys/socket.h>
+
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include "common/libs/fs/shared_buf.h"
+
+#include "host/libs/wmediumd_controller/wmediumd_api_protocol.h"
+
+namespace cuttlefish {
+
+std::unique_ptr<WmediumdController> WmediumdController::New(
+ const std::string& serverSocketPath) {
+ std::unique_ptr<WmediumdController> result(new WmediumdController);
+
+ if (!result->Connect(serverSocketPath)) {
+ return nullptr;
+ }
+
+ return result;
+}
+
+bool WmediumdController::Connect(const std::string& serverSocketPath) {
+ wmediumd_socket_ =
+ SharedFD::SocketLocalClient(serverSocketPath, false, SOCK_STREAM);
+
+ if (!wmediumd_socket_->IsOpen()) {
+ LOG(ERROR) << "Cannot connect wmediumd control socket " << serverSocketPath
+ << ": " << wmediumd_socket_->StrError();
+ return false;
+ }
+
+ return SetControl(0);
+}
+
+bool WmediumdController::SetSnr(const std::string& node1,
+ const std::string& node2, uint8_t snr) {
+ return SendMessage(WmediumdMessageSetSnr(node1, node2, snr));
+}
+
+bool WmediumdController::SetControl(const uint32_t flags) {
+ return SendMessage(WmediumdMessageSetControl(flags));
+}
+
+bool WmediumdController::ReloadCurrentConfig(void) {
+ return SendMessage(WmediumdMessageReloadCurrentConfig());
+}
+
+bool WmediumdController::ReloadConfig(const std::string& configPath) {
+ return SendMessage(WmediumdMessageReloadConfig(configPath));
+}
+
+bool WmediumdController::StartPcap(const std::string& pcapPath) {
+ return SendMessage(WmediumdMessageStartPcap(pcapPath));
+}
+
+bool WmediumdController::StopPcap(void) {
+ return SendMessage(WmediumdMessageStopPcap());
+}
+
+bool WmediumdController::SendMessage(const WmediumdMessage& message) {
+ auto sendResult = SendAll(wmediumd_socket_, message.Serialize());
+
+ if (!sendResult) {
+ LOG(ERROR) << "sendmessage failed: " << wmediumd_socket_->StrError();
+ return false;
+ }
+
+ std::string recvBuf = RecvAll(wmediumd_socket_, sizeof(uint32_t) * 2);
+
+ if (recvBuf.size() != sizeof(uint32_t) * 2) {
+ LOG(ERROR) << "error: RecvAll failed while receiving result from server";
+ return false;
+ }
+
+ uint32_t type = *reinterpret_cast<const uint32_t*>(recvBuf.c_str());
+
+ if (static_cast<WmediumdMessageType>(type) != WmediumdMessageType::kAck) {
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace cuttlefish
diff --git a/host/libs/wmediumd_controller/wmediumd_controller.h b/host/libs/wmediumd_controller/wmediumd_controller.h
new file mode 100644
index 0000000..acd6363
--- /dev/null
+++ b/host/libs/wmediumd_controller/wmediumd_controller.h
@@ -0,0 +1,56 @@
+//
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include "common/libs/fs/shared_fd.h"
+#include "host/libs/wmediumd_controller/wmediumd_api_protocol.h"
+
+namespace cuttlefish {
+
+class WmediumdController {
+ public:
+ static std::unique_ptr<WmediumdController> New(
+ const std::string& serverSocketPath);
+
+ virtual ~WmediumdController() {}
+
+ WmediumdController(const WmediumdController& rhs) = delete;
+ WmediumdController& operator=(const WmediumdController& rhs) = delete;
+
+ WmediumdController(WmediumdController&& rhs) = delete;
+ WmediumdController& operator=(WmediumdController&& rhs) = delete;
+
+ bool SetControl(const uint32_t flags);
+ bool SetSnr(const std::string& node1, const std::string& node2, uint8_t snr);
+ bool ReloadCurrentConfig(void);
+ bool ReloadConfig(const std::string& configPath);
+ bool StartPcap(const std::string& pcapPath);
+ bool StopPcap(void);
+
+ private:
+ WmediumdController() {}
+
+ bool Connect(const std::string& serverSocketPath);
+ bool SendMessage(const WmediumdMessage& message);
+
+ SharedFD wmediumd_socket_;
+};
+
+} // namespace cuttlefish
diff --git a/host_package.mk b/host_package.mk
index bd6b51f..e1afedf 100644
--- a/host_package.mk
+++ b/host_package.mk
@@ -1,6 +1,6 @@
-cvd_host_packages := $(SOONG_HOST_OUT)/cvd-host_package.tar.gz
+cvd_host_packages := $(HOST_OUT)/cvd-host_package.tar.gz
ifeq ($(HOST_CROSS_OS)_$(HOST_CROSS_ARCH),linux_bionic_arm64)
- cvd_host_packages += $(SOONG_OUT_DIR)/host/$(HOST_CROSS_OS)-$(HOST_CROSS_ARCH)/cvd-host_package.tar.gz
+ cvd_host_packages += $(OUT_DIR)/host/$(HOST_CROSS_OS)-$(HOST_CROSS_ARCH)/cvd-host_package.tar.gz
endif
.PHONY: hosttar
diff --git a/multiarch-howto.md b/multiarch-howto.md
new file mode 100644
index 0000000..fe24a66
--- /dev/null
+++ b/multiarch-howto.md
@@ -0,0 +1,57 @@
+# Adjusting APT Sources for Multiarch
+
+The Cuttlefish host Debian packages can also be built and used on an `arm64`
+based system. However, because certain parts of it are still `amd64`, the
+APT sources of the system need to be adjusted for multiarch so that package
+dependencies can be correctly looked up and installed.
+
+For detailed context, see [Multiarch HOWTO](https://wiki.debian.org/Multiarch/HOWTO), and this document will use Ubuntu 21.04 (Hirsute) as an example for
+making such adjustments.
+
+The basic idea is to first limit the existing APT sources to `arm64` only,
+so that when a new architecture like `amd64` is added, APT won't try to
+fetch packages for the new architecture from the existing repository, as
+`arm64` packages are in "ports", while `amd64` ones are in the main
+repository. So a line in `/etc/apt/sources.list` such as:
+
+```
+deb http://ports.ubuntu.com/ubuntu-ports hirsute main restricted
+```
+
+would be changed to:
+
+```
+deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports hirsute main restricted
+```
+
+Next, each line of config like the above will be duplicated and modified into
+an entry that corresponds to what's in the main repository, with its
+architecture limited to `amd64`. For example, for the same line as shown above,
+a new entry will be added like this:
+
+```
+deb [arch=amd64] http://archive.ubuntu.com/ubuntu hirsute main restricted
+```
+
+The script below might be handy for this task:
+```bash
+#!/bin/bash
+cp /etc/apt/sources.list ~/sources.list.bak
+(
+ (grep ^deb /etc/apt/sources.list | sed 's/deb /deb [arch=arm64] /') && \
+ (grep ^deb /etc/apt/sources.list | sed 's/deb /deb [arch=amd64] /g; s/ports\.ubuntu/archive.ubuntu/g; s/ubuntu-ports/ubuntu/g') \
+) | tee /tmp/sources.list
+mv /tmp/sources.list /etc/apt/sources.list
+```
+**Note:** please run the above script as `root`, and adjust for differences in
+Ubuntu releases or location prefixed repositories for faster download (e.g.
+`us.archive.ubuntu.com` instead of `archive.ubuntu.com`).
+
+Finally, add the new architecture and do an APT update with:
+```bash
+sudo dpkg --add-architecture amd64
+sudo apt update
+```
+Make sure there's no errors or warnings in the output of `apt update`. To
+restore the previous APT sources list, use the backup file `sources.list.bak`
+saved by the script in your home directory.
diff --git a/required_images b/required_images
index 6f5c180..e6f0616 100644
--- a/required_images
+++ b/required_images
@@ -1,4 +1,5 @@
boot.img
+init_boot.img
bootloader
super.img
userdata.img
diff --git a/shared/BoardConfig.mk b/shared/BoardConfig.mk
index 2963874..bfaeefe 100644
--- a/shared/BoardConfig.mk
+++ b/shared/BoardConfig.mk
@@ -27,7 +27,7 @@
BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
-# Boot partition size: 32M
+# Boot partition size: 64M
# This is only used for OTA update packages. The image size on disk
# will not change (as is it not a filesystem.)
BOARD_BOOTIMAGE_PARTITION_SIZE := 67108864
@@ -36,6 +36,8 @@
endif
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE := 67108864
+BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE := 8388608
+
# Build a separate vendor.img partition
BOARD_USES_VENDORIMAGE := true
BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
@@ -58,30 +60,38 @@
# Build a separate vendor_dlkm partition
BOARD_USES_VENDOR_DLKMIMAGE := true
-BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
+BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
# Build a separate odm_dlkm partition
BOARD_USES_ODM_DLKMIMAGE := true
-BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
+BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
-# FIXME: Remove this once we generate the vbmeta digest correctly
-BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --flag 2
+# Enable AVB
+BOARD_AVB_ENABLE := true
+BOARD_AVB_ALGORITHM := SHA256_RSA4096
+BOARD_AVB_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
# Enable chained vbmeta for system image mixing
BOARD_AVB_VBMETA_SYSTEM := product system system_ext
-BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
-BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048
+BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
+BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA4096
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1
# Enable chained vbmeta for boot images
-BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
-BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA2048
+BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
+BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
+# Enable chained vbmeta for init_boot images
+BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
+BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA4096
+BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
+BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
+
# Using sha256 for dm-verity partitions. b/178983355
# system, system_other, product.
TARGET_AVB_SYSTEM_HASHTREE_ALGORITHM ?= sha256
@@ -144,7 +154,13 @@
USE_OPENGL_RENDERER := true
# Wifi.
+ifeq ($(PRODUCT_ENFORCE_MAC80211_HWSIM),true)
+BOARD_WLAN_DEVICE := emulator
+BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_simulated_cf
+WIFI_HIDL_FEATURE_DUAL_INTERFACE := true
+else
BOARD_WLAN_DEVICE := wlan0
+endif
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_simulated_cf
@@ -212,9 +228,6 @@
BOARD_KERNEL_CMDLINE += init=/init
BOARD_BOOTCONFIG += androidboot.hardware=cutf_cvm
-# TODO(b/179489292): Remove once kfence is enabled everywhere
-BOARD_KERNEL_CMDLINE += kfence.sample_interval=500
-
BOARD_KERNEL_CMDLINE += loop.max_part=7
# TODO(b/182417593): Move all of these module options to modules.options
@@ -224,17 +237,16 @@
BOARD_BOOTCONFIG += \
kernel.vmw_vsock_virtio_transport_common.virtio_transport_max_vsock_pkt_buf_size=16384
-ifeq ($(TARGET_USERDATAIMAGE_FILE_SYSTEM_TYPE),f2fs)
-BOARD_BOOTCONFIG += androidboot.fstab_suffix=f2fs
-endif
-
-ifeq ($(TARGET_USERDATAIMAGE_FILE_SYSTEM_TYPE),ext4)
-BOARD_BOOTCONFIG += androidboot.fstab_suffix=ext4
-endif
+BOARD_BOOTCONFIG += \
+ androidboot.vendor.apex.com.android.wifi.hal=com.google.cf.wifi
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
+ifndef BOARD_BOOT_HEADER_VERSION
BOARD_BOOT_HEADER_VERSION := 4
+endif
BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOT_HEADER_VERSION)
+BOARD_INIT_BOOT_HEADER_VERSION := 4
+BOARD_MKBOOTIMG_INIT_ARGS += --header_version $(BOARD_INIT_BOOT_HEADER_VERSION)
PRODUCT_COPY_FILES += \
device/google/cuttlefish/dtb.img:dtb.img \
device/google/cuttlefish/required_images:required_images \
@@ -253,16 +265,6 @@
endif
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
-# TARGET_KERNEL_USE is defined in kernel.mk, if not defined in the environment variable.
-# Keep in sync with GKI APEX in device.mk
-ifneq (,$(TARGET_KERNEL_USE))
- ifneq (,$(filter 5.4, $(TARGET_KERNEL_USE)))
- BOARD_KERNEL_MODULE_INTERFACE_VERSIONS := 5.4-android12-0
- else
- BOARD_KERNEL_MODULE_INTERFACE_VERSIONS := $(TARGET_KERNEL_USE)-android12-unstable
- endif
-endif
-
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
BOARD_HAVE_BLUETOOTH := true
diff --git a/shared/auto/device.mk b/shared/auto/device.mk
index 3e6604e..383e270 100644
--- a/shared/auto/device.mk
+++ b/shared/auto/device.mk
@@ -84,7 +84,7 @@
canhalsend
# Cuttlefish RIL support
-TARGET_USES_CF_RILD ?= false
+TARGET_USES_CF_RILD ?= true
ifeq ($(TARGET_USES_CF_RILD),true)
PRODUCT_PACKAGES += \
libcuttlefish-ril-2 \
diff --git a/shared/auto/overlay/frameworks/base/core/res/res/values/config.xml b/shared/auto/overlay/frameworks/base/core/res/res/values/config.xml
index e42a10f..4875dca 100644
--- a/shared/auto/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/shared/auto/overlay/frameworks/base/core/res/res/values/config.xml
@@ -22,20 +22,20 @@
See also packages/services/Car/service/res/values/config.xml
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Enable multi-user. -->
- <bool name="config_enableMultiUserUI" translatable="false">true</bool>
- <!-- If true, all guest users created on the device will be ephemeral. -->
- <bool name="config_guestUserEphemeral" translatable="false">true</bool>
- <!-- Maximum number of users allowed on the device. -->
- <integer name="config_multiuserMaximumUsers" translatable="false">4</integer>
- <!-- Restricting eth1 -->
- <string-array translatable="false" name="config_ethernet_interfaces">
- <item>eth1;11,12,14;;</item>
- </string-array>
- <!-- Car uses hardware amplifier for volume. -->
- <bool name="config_useFixedVolume">true</bool>
- <!--
- Handle volume keys directly in CarAudioService without passing them to the foreground app
- -->
- <bool name="config_handleVolumeKeysInWindowManager">true</bool>
+ <!-- Enable multi-user. -->
+ <bool name="config_enableMultiUserUI" translatable="false">true</bool>
+ <!-- If true, all guest users created on the device will be ephemeral. -->
+ <bool name="config_guestUserEphemeral" translatable="false">true</bool>
+ <!-- Maximum number of users allowed on the device. -->
+ <integer name="config_multiuserMaximumUsers" translatable="false">4</integer>
+ <!-- Restricting eth1 -->
+ <string-array translatable="false" name="config_ethernet_interfaces">
+ <item>eth1;11,12,14;;</item>
+ </string-array>
+ <!-- Car uses hardware amplifier for volume. -->
+ <bool name="config_useFixedVolume">true</bool>
+ <!--
+ Handle volume keys directly in CarAudioService without passing them to the foreground app
+ -->
+ <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
diff --git a/shared/auto/overlay/packages/services/Car/service/res/values/config.xml b/shared/auto/overlay/packages/services/Car/service/res/values/config.xml
index 6cfd2cc..ea4cb27 100644
--- a/shared/auto/overlay/packages/services/Car/service/res/values/config.xml
+++ b/shared/auto/overlay/packages/services/Car/service/res/values/config.xml
@@ -23,16 +23,6 @@
-->
<resources>
<bool name="audioUseDynamicRouting">true</bool>
- <!-- Configuration to enable muting of individual volume groups. If this is set to
- false, muting of individual volume groups is disabled, instead muting will toggle master
- mute. If this is set to true, car volume group muting is enabled and each individual
- volume group can be muted separately. -->
- <bool name="audioUseCarVolumeGroupMuting">false</bool>
- <!-- Configuration to enable IAudioControl#onDevicesToDuckChange API to inform HAL when to
- duck. If this is set to true, the API will receive signals indicating which output devices
- to duck as well as what usages are currently holding focus. If set to false, the API will
- not be called. -->
- <bool name="audioUseHalDuckingSignals">false</bool>
<!--
Lists all occupant (= driver + passenger) zones available in the car.
diff --git a/shared/config/Android.bp b/shared/config/Android.bp
index 03bbc08..c1ea54b 100644
--- a/shared/config/Android.bp
+++ b/shared/config/Android.bp
@@ -31,3 +31,22 @@
src: "config_tv.json",
sub_dir: "cvd_config",
}
+
+prebuilt_etc_host {
+ name: "grub.cfg",
+ src: "grub.cfg",
+ sub_dir: "grub",
+}
+
+prebuilt_etc {
+ name: "wpa_supplicant_overlay.conf.cf",
+ src: "wpa_supplicant_overlay.conf",
+ filename_from_src: true,
+ relative_install_path: "wifi",
+ installable: false,
+}
+
+filegroup {
+ name: "[email protected]",
+ srcs: ["[email protected]"]
+}
diff --git a/shared/config/config_auto.json b/shared/config/config_auto.json
index b8f2bfe..67dd3bc 100644
--- a/shared/config/config_auto.json
+++ b/shared/config/config_auto.json
@@ -1,6 +1,5 @@
{
- "x_res" : 1280,
- "y_res" : 800,
- "dpi" : 160,
+ "display0": "width=1080,height=600,dpi=120",
+ "display1": "width=400,height=600,dpi=120",
"memory_mb" : 4096
}
diff --git a/shared/config/fstab-erofs.ext4 b/shared/config/fstab-erofs.ext4
index ec7b3fe..7722fbe 100644
--- a/shared/config/fstab-erofs.ext4
+++ b/shared/config/fstab-erofs.ext4
@@ -1,6 +1,7 @@
-/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect
+/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=boot
+/dev/block/by-name/init_boot /init_boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=init_boot
/dev/block/by-name/vendor_boot /vendor_boot emmc defaults recoveryonly,slotselect
-system /system erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta_system
+system /system erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta_system,avb_keys=/avb
# Add all non-dynamic partitions except system, after this comment
/dev/block/by-name/userdata /data ext4 nodev,noatime,nosuid,errors=panic latemount,wait,check,quota,formattable,fileencryption=aes-256-xts:aes-256-cts,keydirectory=/metadata/vold/metadata_encryption,checkpoint=block
/dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid,errors=panic wait,formattable,first_stage_mount,check
@@ -10,8 +11,8 @@
product /product erofs ro wait,logical,first_stage_mount,slotselect,avb
system_ext /system_ext erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta_system
vendor /vendor erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta
-vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
-odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
+vendor_dlkm /vendor_dlkm erofs noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
+odm_dlkm /odm_dlkm erofs noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
/dev/block/zram0 none swap defaults zramsize=75%
/dev/block/vdc1 /sdcard vfat defaults recoveryonly
/devices/*/block/vdc auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
diff --git a/shared/config/fstab-erofs.f2fs b/shared/config/fstab-erofs.f2fs
index 1b5486e..0b28b93 100644
--- a/shared/config/fstab-erofs.f2fs
+++ b/shared/config/fstab-erofs.f2fs
@@ -1,6 +1,7 @@
-/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect
+/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=boot
+/dev/block/by-name/init_boot /init_boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=init_boot
/dev/block/by-name/vendor_boot /vendor_boot emmc defaults recoveryonly,slotselect
-system /system erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta_system
+system /system erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta_system,avb_keys=/avb
# Add all non-dynamic partitions except system, after this comment
/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,inlinecrypt,reserve_root=32768 latemount,wait,check,quota,formattable,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,fscompress,keydirectory=/metadata/vold/metadata_encryption,checkpoint=fs
/dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid,errors=panic wait,formattable,first_stage_mount,check
@@ -10,8 +11,8 @@
product /product erofs ro wait,logical,first_stage_mount,slotselect,avb
system_ext /system_ext erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta_system
vendor /vendor erofs ro wait,logical,first_stage_mount,slotselect,avb=vbmeta
-vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
-odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
+vendor_dlkm /vendor_dlkm erofs noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
+odm_dlkm /odm_dlkm erofs noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
/dev/block/zram0 none swap defaults zramsize=75%
/dev/block/vdc1 /sdcard vfat defaults recoveryonly
/devices/*/block/vdc auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
diff --git a/shared/config/fstab.ext4 b/shared/config/fstab.ext4
index 1677941..7567d14 100644
--- a/shared/config/fstab.ext4
+++ b/shared/config/fstab.ext4
@@ -1,6 +1,7 @@
-/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect
+/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=boot
+/dev/block/by-name/init_boot /init_boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=init_boot
/dev/block/by-name/vendor_boot /vendor_boot emmc defaults recoveryonly,slotselect
-system /system ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb=vbmeta_system
+system /system ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb=vbmeta_system,avb_keys=/avb
# Add all non-dynamic partitions except system, after this comment
/dev/block/by-name/userdata /data ext4 nodev,noatime,nosuid,errors=panic latemount,wait,check,quota,formattable,fileencryption=aes-256-xts:aes-256-cts,keydirectory=/metadata/vold/metadata_encryption,checkpoint=block
/dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid,errors=panic wait,formattable,first_stage_mount,check
diff --git a/shared/config/fstab.f2fs b/shared/config/fstab.f2fs
index 597e3f0..008ca00 100644
--- a/shared/config/fstab.f2fs
+++ b/shared/config/fstab.f2fs
@@ -1,6 +1,7 @@
-/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect
+/dev/block/by-name/boot /boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=boot
+/dev/block/by-name/init_boot /init_boot emmc defaults recoveryonly,slotselect,first_stage_mount,avb=init_boot
/dev/block/by-name/vendor_boot /vendor_boot emmc defaults recoveryonly,slotselect
-system /system ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb=vbmeta_system
+system /system ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb=vbmeta_system,avb_keys=/avb
# Add all non-dynamic partitions except system, after this comment
/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,inlinecrypt,reserve_root=32768 latemount,wait,check,quota,formattable,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,fscompress,keydirectory=/metadata/vold/metadata_encryption,checkpoint=fs
/dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid,errors=panic wait,formattable,first_stage_mount,check
diff --git a/shared/config/grub.cfg b/shared/config/grub.cfg
new file mode 100644
index 0000000..d15eb8e
--- /dev/null
+++ b/shared/config/grub.cfg
@@ -0,0 +1,43 @@
+# Root grub.cfg used either to boot raw kernel and/or initramfs.img, or to
+# chain to an installed distro's GRUB configuration file
+
+# These options are accessible to chain-loaded configurations as well:
+#
+# pnpacpi=off Disable on QEMU; allows serdev to claim platform serial
+# acpi=noirq Do not configure IRQ routing using ACPI tables
+# reboot=k Reboot using keyboard method, rather than ACPI
+# noexec=off Some kernels panic when setting up NX
+# noefi Some kernels panic when trying to use U-Boot EFI
+# panic=-1 Don't reboot on panic
+# console=hvc0 Switch kernel logging to virtio-console once available
+# console=ttyAMA0 QEMU on ARM64 uses alternative serial implementation
+#
+if [ "$grub_cpu" = "i386" ]; then
+ set cmdline="pnpacpi=off acpi=noirq reboot=k noexec=off console=ttyS0 noefi panic=-1 console=hvc0"
+elif [ "$grub_cpu" = "arm64" ]; then
+ set cmdline="console=ttyS0 console=ttyAMA0 noefi panic=-1 console=hvc0"
+else
+ echo "Warning: No architecture found for ${grub_cpu}"
+fi
+
+# Root filesystem is on a GUID partition with label "otheros_root"
+set rootfs="/dev/vda14"
+
+# Root filesystem with grub installed
+search --file --set root /boot/grub/grub.cfg --hint (hd0)
+if [ $? = 0 ]; then
+ set prefix=($root)/boot/grub
+ export cmdline
+ export rootfs
+ configfile $prefix/grub.cfg
+ normal_exit
+fi
+
+# Fall back if we couldn't chain to another GRUB install
+set timeout=0
+menuentry "Linux" {
+ linux /vmlinuz $cmdline root=$rootfs
+ if [ -e /initrd.img ]; then
+ initrd /initrd.img
+ fi
+}
diff --git a/shared/config/init.insmod.sh b/shared/config/init.insmod.sh
deleted file mode 100755
index ccbf716..0000000
--- a/shared/config/init.insmod.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/vendor/bin/sh
-
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-KERNEL_VERSION_NUMBER=`uname -r`
-MAINLINE_STR='mainline'
-if [[ $KERNEL_VERSION_NUMBER == *$MAINLINE_STR* ]]; then
- IS_MAINLINE=1
-else
- IS_MAINLINE=0
-fi
-
-KERNEL_VERSION_NUMBER=`echo $KERNEL_VERSION_NUMBER | grep -o -E '^[0-9]+\.[0-9]+'`
-# This folder on cuttlefish contains modules for multiple kernel versions.
-# Hence the need to filter them instead of relying on module.order
-VENDOR_MODULES='/vendor/lib/modules/*.ko'
-
-for f in $VENDOR_MODULES
-do
- MOD_VERSION=`modinfo $f`
- MOD_VERSION=`echo $MOD_VERSION | grep -o -E 'vermagic: [0-9a-zA-Z\.-]+'`
- MOD_VERSION_NUMBER=`echo $MOD_VERSION | grep -o -E '[0-9]+\.[0-9]+'`
- if [[ $MOD_VERSION == *$MAINLINE_STR* ]]; then
- IS_MOD_MAINLINE=1
- else
- IS_MOD_MAINLINE=0
- fi
-
- # TODO (137683279) When we have a few more kernel modules, we'll have to do the module
- # insertion of least dependencies.
- if [ $IS_MOD_MAINLINE -eq $IS_MAINLINE ] && [ $MOD_VERSION_NUMBER == $KERNEL_VERSION_NUMBER ]
- then
- `insmod $f`
- echo "Insmod " $f
- fi
-done
diff --git a/shared/config/init.vendor.rc b/shared/config/init.vendor.rc
index 94ef593..4876ead 100644
--- a/shared/config/init.vendor.rc
+++ b/shared/config/init.vendor.rc
@@ -11,9 +11,10 @@
setprop ro.hardware.vulkan ${ro.boot.hardware.vulkan}
setprop ro.cpuvulkan.version ${ro.boot.cpuvulkan.version}
setprop ro.hw_timeout_multiplier ${ro.boot.hw_timeout_multiplier}
+ setprop ro.opengles.version ${ro.boot.opengles.version}
# start module load in the background
- start vendor.insmod_sh
+ start vendor.dlkm_loader
on init
# ZRAM setup
@@ -47,10 +48,6 @@
mount_all --early
restorecon_recursive /vendor
- start setup_wifi
- # works around framework netiface enumeration issue
- start rename_eth0
-
# So GceBootReporter can print to kmsg
chmod 622 /dev/kmsg
@@ -58,21 +55,29 @@
# set RLIMIT_MEMLOCK to 64MB
setrlimit 8 67108864 67108864
- start bt_vhci_forwarder
+on post-fs-data
+ # works around framework netiface enumeration issue
+ # TODO(b/202731768): Add this `start rename_eth0` command to the init.rc for rename_netiface
+ start rename_eth0
+
+on post-fs-data && property:ro.vendor.wifi_impl=virt_wifi
+ # TODO(b/202731768): Add this `start setup_wifi` command to the init.rc for setup_wifi
+ start setup_wifi
on post-fs-data
mkdir /data/vendor/modem_dump 0777 system system
mkdir /data/vendor/radio 0777 system system
on late-fs
- # Wait for keymaster
- exec_start wait_for_keymaster
-
# Mount RW partitions which need run fsck
mount_all --late
write /dev/kmsg "GUEST_BUILD_FINGERPRINT: ${ro.build.fingerprint}"
+on post-fs-data && property:ro.vendor.wifi_impl=mac8011_hwsim_virtio
+ setprop vold.post_fs_data_done 1
+ start wifi-net-sh
+
on boot
chmod 0660 /dev/cpuctl
mkdir /data/vendor/wifi 0770 wifi wifi
@@ -80,16 +85,14 @@
mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi
start socket_vsock_proxy
setprop ro.hardware.audio.primary goldfish
+ symlink /dev/hvc6 /dev/gnss0
-service bt_vhci_forwarder /vendor/bin/bt_vhci_forwarder -virtio_console_dev=${vendor.ser.bt-uart}
- user bluetooth
- group bluetooth
-
-service setup_wifi /vendor/bin/setup_wifi
+service wifi-net-sh /vendor/bin/init.wifi.sh
+ class late_start
+ user root
+ group root wakelock wifi
oneshot
-
-service rename_eth0 /vendor/bin/rename_netiface eth0 rmnet0
- oneshot
+ disabled # Started on post-fs-data
on property:sys.boot_completed=1
trigger sys-boot-completed-set
@@ -101,7 +104,7 @@
on sys-boot-completed-set && property:persist.sys.zram_enabled=1
swapon_all
-service vendor.insmod_sh /vendor/bin/init.insmod.sh
+service vendor.dlkm_loader /vendor/bin/dlkm_loader
class main
user root
group root system
@@ -127,17 +130,6 @@
enable vsoc_input_service
start vsoc_input_service
-service wpa_supplicant /vendor/bin/hw/wpa_supplicant -g@android:wpa_wlan0
- interface [email protected]::ISupplicant default
- interface [email protected]::ISupplicant default
- interface [email protected]::ISupplicant default
- interface [email protected]::ISupplicant default
- interface [email protected]::ISupplicant default
- socket wpa_wlan0 dgram 660 wifi wifi
- group system wifi inet
- disabled
- oneshot
-
service bugreport /system/bin/dumpstate -d -p -z
class main
disabled
diff --git a/shared/config/input/Android.bp b/shared/config/input/Android.bp
new file mode 100644
index 0000000..3c85557
--- /dev/null
+++ b/shared/config/input/Android.bp
@@ -0,0 +1,47 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_defaults {
+ name: "crosvm_idc_defaults",
+ relative_install_path: "usr/idc",
+ soc_specific: true,
+}
+
+prebuilt_etc {
+ name: "Crosvm_Virtio_Multitouch_Touchscreen_0.idc",
+ src: "Crosvm_Virtio_Multitouch_Touchscreen_0.idc",
+ defaults: ["crosvm_idc_defaults"],
+}
+
+prebuilt_etc {
+ name: "Crosvm_Virtio_Multitouch_Touchscreen_1.idc",
+ src: "Crosvm_Virtio_Multitouch_Touchscreen_1.idc",
+ defaults: ["crosvm_idc_defaults"],
+}
+
+prebuilt_etc {
+ name: "Crosvm_Virtio_Multitouch_Touchscreen_2.idc",
+ src: "Crosvm_Virtio_Multitouch_Touchscreen_2.idc",
+ defaults: ["crosvm_idc_defaults"],
+}
+
+prebuilt_etc {
+ name: "Crosvm_Virtio_Multitouch_Touchscreen_3.idc",
+ src: "Crosvm_Virtio_Multitouch_Touchscreen_3.idc",
+ defaults: ["crosvm_idc_defaults"],
+}
diff --git a/shared/config/manifest.xml b/shared/config/manifest.xml
index 5917647..ab529eb 100644
--- a/shared/config/manifest.xml
+++ b/shared/config/manifest.xml
@@ -16,7 +16,7 @@
** limitations under the License.
*/
-->
-<manifest version="1.0" type="device" target-level="6">
+<manifest version="1.0" type="device" target-level="7">
<hal format="hidl">
<name>android.hardware.audio.effect</name>
<transport>hwbinder</transport>
diff --git a/shared/config/task_profiles.json b/shared/config/task_profiles.json
index 42366fc..0974952 100644
--- a/shared/config/task_profiles.json
+++ b/shared/config/task_profiles.json
@@ -27,6 +27,19 @@
]
},
{
+ "Name": "ServicePerformance",
+ "Actions": [
+ {
+ "Name": "JoinCgroup",
+ "Params":
+ {
+ "Controller": "cpu",
+ "Path": "system-background"
+ }
+ }
+ ]
+ },
+ {
"Name": "HighPerformance",
"Actions": [
{
@@ -433,6 +446,10 @@
"Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ]
},
{
+ "Name": "SCHED_SP_SYSTEM",
+ "Profiles": [ "ServicePerformance", "LowIoPriority", "TimerSlackNormal" ]
+ },
+ {
"Name": "SCHED_SP_RT_APP",
"Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]
},
diff --git a/shared/config/ueventd.rc b/shared/config/ueventd.rc
index 8f24201..1e51a82 100644
--- a/shared/config/ueventd.rc
+++ b/shared/config/ueventd.rc
@@ -26,6 +26,8 @@
/dev/hvc5 0660 bluetooth bluetooth
/dev/vhci 0660 bluetooth bluetooth
+# gnss hal can access hvc6 in addition to gnss0
+/dev/hvc6 0666 system system
/dev/gnss0 0666 system system
# Factory Reset Protection
diff --git a/shared/config/wpa_supplicant.rc b/shared/config/wpa_supplicant.rc
new file mode 100644
index 0000000..843279a
--- /dev/null
+++ b/shared/config/wpa_supplicant.rc
@@ -0,0 +1,10 @@
+service wpa_supplicant /vendor/bin/hw/wpa_supplicant -g@android:wpa_wlan0
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ interface [email protected]::ISupplicant default
+ socket wpa_wlan0 dgram 660 wifi wifi
+ group system wifi inet
+ disabled
+ oneshot
diff --git a/shared/device.mk b/shared/device.mk
index b7f788b..8bf4d19 100644
--- a/shared/device.mk
+++ b/shared/device.mk
@@ -26,13 +26,27 @@
# Enforce generic ramdisk allow list
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
+# Set Vendor SPL to match platform
+VENDOR_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
+
+# Set boot SPL
+BOOT_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
+
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.vendor.boot_security_patch=$(BOOT_SECURITY_PATCH)
+
PRODUCT_SOONG_NAMESPACES += device/generic/goldfish-opengl # for vulkan
PRODUCT_SOONG_NAMESPACES += device/generic/goldfish # for audio and wifi
-PRODUCT_SHIPPING_API_LEVEL := 31
+PRODUCT_SHIPPING_API_LEVEL := 33
PRODUCT_USE_DYNAMIC_PARTITIONS := true
DISABLE_RILD_OEM_HOOK := true
+# TODO(b/205788876) remove this condition when openwrt has an image for arm.
+ifndef PRODUCT_ENFORCE_MAC80211_HWSIM
+PRODUCT_ENFORCE_MAC80211_HWSIM := true
+endif
+
PRODUCT_SET_DEBUGFS_RESTRICTIONS := true
PRODUCT_SOONG_NAMESPACES += device/generic/goldfish-opengl # for vulkan
@@ -46,6 +60,9 @@
TARGET_ENABLE_HOST_BLUETOOTH_EMULATION ?= true
TARGET_USE_BTLINUX_HAL_IMPL ?= true
+# TODO(b/65201432): Swiftshader needs to create executable memory.
+PRODUCT_REQUIRES_INSECURE_EXECMEM_FOR_SWIFTSHADER := true
+
AB_OTA_UPDATER := true
AB_OTA_PARTITIONS += \
boot \
@@ -61,7 +78,9 @@
vendor_dlkm \
# Enable Virtual A/B
-$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression_with_xor.mk)
+
+PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
# Enable Scoped Storage related
$(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk)
@@ -76,7 +95,6 @@
# Explanation of specific properties:
# debug.hwui.swap_with_damage avoids boot failure on M http://b/25152138
-# ro.opengles.version OpenGLES 3.0
# ro.hardware.keystore_desede=true needed for CtsKeystoreTestCases
PRODUCT_VENDOR_PROPERTIES += \
tombstoned.max_tombstone_count=500 \
@@ -86,7 +104,6 @@
ro.com.android.dataroaming?=false \
ro.hardware.virtual_device=1 \
ro.logd.size=1M \
- ro.opengles.version=196608 \
wifi.interface=wlan0 \
persist.sys.zram_enabled=1 \
ro.hardware.keystore_desede=true \
@@ -157,9 +174,6 @@
PRODUCT_PACKAGES += \
CuttlefishService \
cuttlefish_sensor_injection \
- rename_netiface \
- setup_wifi \
- bt_vhci_forwarder \
socket_vsock_proxy \
tombstone_transmit \
tombstone_producer \
@@ -167,13 +181,8 @@
vsoc_input_service \
vtpm_manager \
-SOONG_CONFIG_NAMESPACES += cvd
-SOONG_CONFIG_cvd += launch_configs
-SOONG_CONFIG_cvd_launch_configs += \
- cvd_config_auto.json \
- cvd_config_phone.json \
- cvd_config_tablet.json \
- cvd_config_tv.json \
+$(call soong_config_append, cvd, launch_configs, cvd_config_auto.json cvd_config_phone.json cvd_config_tablet.json cvd_config_tv.json)
+$(call soong_config_append, cvd, grub_config, grub.cfg)
#
# Packages for AOSP-available stuff we use from the framework
@@ -183,7 +192,6 @@
ip \
sleep \
tcpdump \
- wpa_supplicant \
wificond \
#
@@ -196,12 +204,6 @@
libGLESv1_CM_angle \
libGLESv2_angle
-# SwiftShader provides a software-only implementation that is not thread-safe
-PRODUCT_PACKAGES += \
- libEGL_swiftshader \
- libGLESv1_CM_swiftshader \
- libGLESv2_swiftshader
-
# GL implementation for virgl
PRODUCT_PACKAGES += \
libGLES_mesa \
@@ -235,9 +237,18 @@
#
PRODUCT_PACKAGES += \
aidl_lazy_test_server \
- hidl_lazy_test_server
+ aidl_lazy_cb_test_server \
+ hidl_lazy_test_server \
+ hidl_lazy_cb_test_server
-DEVICE_PACKAGE_OVERLAYS := device/google/cuttlefish/shared/overlay
+# Runtime Resource Overlays
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += \
+ cuttlefish_overlay_frameworks_base_core \
+ cuttlefish_overlay_settings_provider \
+
+endif
+
# PRODUCT_AAPT_CONFIG and PRODUCT_AAPT_PREF_CONFIG are intentionally not set to
# pick up every density resources.
@@ -252,6 +263,7 @@
ifneq ($(LOCAL_SENSOR_FILE_OVERRIDES),true)
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.sensor.ambient_temperature.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.ambient_temperature.xml \
frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \
@@ -261,30 +273,12 @@
frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \
frameworks/native/data/etc/android.hardware.sensor.relative_humidity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.relative_humidity.xml
endif
+endif
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
PRODUCT_COPY_FILES += \
- hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_back.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_back.json \
- hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_front.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_front.json \
- hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_depth.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_depth.json \
- device/google/cuttlefish/shared/config/init.vendor.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.cutf_cvm.rc \
- device/google/cuttlefish/shared/config/init.product.rc:$(TARGET_COPY_OUT_PRODUCT)/etc/init/init.rc \
- device/google/cuttlefish/shared/config/ueventd.rc:$(TARGET_COPY_OUT_VENDOR)/ueventd.rc \
- device/google/cuttlefish/shared/config/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \
- device/google/cuttlefish/shared/config/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \
- device/google/cuttlefish/shared/config/media_codecs_performance.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance.xml \
- device/google/cuttlefish/shared/config/media_profiles.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml \
device/google/cuttlefish/shared/permissions/cuttlefish_excluded_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/cuttlefish_excluded_hardware.xml \
- device/google/cuttlefish/shared/permissions/privapp-permissions-cuttlefish.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/privapp-permissions-cuttlefish.xml \
- frameworks/av/media/libeffects/data/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
- frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
- frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \
- frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \
- frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_volumes.xml \
- frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml \
- frameworks/av/services/audiopolicy/config/surround_sound_configuration_5_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/surround_sound_configuration_5_0.xml \
frameworks/native/data/etc/android.hardware.audio.low_latency.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.low_latency.xml \
- frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
- frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \
frameworks/native/data/etc/android.hardware.camera.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \
frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \
frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
@@ -299,43 +293,75 @@
frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \
frameworks/native/data/etc/android.software.ipsec_tunnels.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.ipsec_tunnels.xml \
frameworks/native/data/etc/android.software.sip.voip.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.sip.voip.xml \
- frameworks/native/data/etc/android.software.verified_boot.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.verified_boot.xml \
- system/bt/vendor_libs/test_vendor_lib/data/controller_properties.json:vendor/etc/bluetooth/controller_properties.json \
+ frameworks/native/data/etc/android.software.verified_boot.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.verified_boot.xml
+endif
+PRODUCT_COPY_FILES += \
+ hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_back.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_back.json \
+ hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_front.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_front.json \
+ hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_depth.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_depth.json \
+ frameworks/native/data/etc/android.hardware.consumerir.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.consumerir.xml \
+ device/google/cuttlefish/shared/config/init.vendor.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.cutf_cvm.rc \
+ device/google/cuttlefish/shared/config/init.product.rc:$(TARGET_COPY_OUT_PRODUCT)/etc/init/init.rc \
+ device/google/cuttlefish/shared/config/ueventd.rc:$(TARGET_COPY_OUT_VENDOR)/etc/ueventd.rc \
+ device/google/cuttlefish/shared/config/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \
+ device/google/cuttlefish/shared/config/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \
+ device/google/cuttlefish/shared/config/media_codecs_performance.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance.xml \
+ device/google/cuttlefish/shared/config/media_profiles.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml \
+ device/google/cuttlefish/shared/permissions/privapp-permissions-cuttlefish.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/privapp-permissions-cuttlefish.xml \
+ frameworks/av/media/libeffects/data/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
+ frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
+ frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \
+ frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \
+ frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_volumes.xml \
+ frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml \
+ frameworks/av/services/audiopolicy/config/surround_sound_configuration_5_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/surround_sound_configuration_5_0.xml \
device/google/cuttlefish/shared/config/task_profiles.json:$(TARGET_COPY_OUT_VENDOR)/etc/task_profiles.json \
+
+# TODO(b/205065320): remove this when wifi vendor apex support mac80211_hwsim
+ifeq ($(PRODUCT_ENFORCE_MAC80211_HWSIM),true)
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \
+ frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \
+
+endif
+
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += com.google.cf.input.config
+else
+PRODUCT_COPY_FILES += \
device/google/cuttlefish/shared/config/input/Crosvm_Virtio_Multitouch_Touchscreen_0.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/Crosvm_Virtio_Multitouch_Touchscreen_0.idc \
device/google/cuttlefish/shared/config/input/Crosvm_Virtio_Multitouch_Touchscreen_1.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/Crosvm_Virtio_Multitouch_Touchscreen_1.idc \
device/google/cuttlefish/shared/config/input/Crosvm_Virtio_Multitouch_Touchscreen_2.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/Crosvm_Virtio_Multitouch_Touchscreen_2.idc \
device/google/cuttlefish/shared/config/input/Crosvm_Virtio_Multitouch_Touchscreen_3.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/Crosvm_Virtio_Multitouch_Touchscreen_3.idc
+endif
ifeq ($(TARGET_RO_FILE_SYSTEM_TYPE),ext4)
PRODUCT_COPY_FILES += \
device/google/cuttlefish/shared/config/fstab.f2fs:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.f2fs \
- device/google/cuttlefish/shared/config/fstab.f2fs:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/fstab.f2fs \
device/google/cuttlefish/shared/config/fstab.f2fs:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.f2fs \
device/google/cuttlefish/shared/config/fstab.f2fs:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.f2fs \
device/google/cuttlefish/shared/config/fstab.ext4:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.ext4 \
- device/google/cuttlefish/shared/config/fstab.ext4:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/fstab.ext4 \
device/google/cuttlefish/shared/config/fstab.ext4:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.ext4 \
device/google/cuttlefish/shared/config/fstab.ext4:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.ext4
else
PRODUCT_COPY_FILES += \
device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).f2fs:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.f2fs \
- device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).f2fs:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/fstab.f2fs \
device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).f2fs:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.f2fs \
device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).f2fs:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.f2fs \
device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).ext4:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.ext4 \
- device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).ext4:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/fstab.ext4 \
device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).ext4:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.ext4 \
device/google/cuttlefish/shared/config/fstab-$(TARGET_RO_FILE_SYSTEM_TYPE).ext4:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.ext4
endif
ifeq ($(TARGET_VULKAN_SUPPORT),true)
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.vulkan.level-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \
frameworks/native/data/etc/android.hardware.vulkan.version-1_0_3.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
frameworks/native/data/etc/android.software.vulkan.deqp.level-2021-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
frameworks/native/data/etc/android.software.opengles.deqp.level-2021-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml
endif
+endif
# Packages for HAL implementations
@@ -352,6 +378,12 @@
android.hardware.weaver-service.example
#
+# IR aidl HAL
+#
+PRODUCT_PACKAGES += \
+ android.hardware.ir-service.example
+
+#
# OemLock aidl HAL
#
PRODUCT_PACKAGES += \
@@ -387,6 +419,7 @@
#
# Bluetooth HAL and Compatibility Bluetooth library (for older revs).
#
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
ifeq ($(LOCAL_BLUETOOTH_PRODUCT_PACKAGE),)
ifeq ($(TARGET_ENABLE_HOST_BLUETOOTH_EMULATION),true)
ifeq ($(TARGET_USE_BTLINUX_HAL_IMPL),true)
@@ -400,9 +433,23 @@
DEVICE_MANIFEST_FILE += device/google/cuttlefish/shared/config/[email protected]
endif
+PRODUCT_COPY_FILES +=\
+ frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
+ frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml
+
PRODUCT_PACKAGES += $(LOCAL_BLUETOOTH_PRODUCT_PACKAGE)
-PRODUCT_PACKAGES += [email protected]
+PRODUCT_PACKAGES += [email protected] bt_vhci_forwarder
+
+# Bluetooth initialization configuration is copied to the init folder here instead of being added
+# as an init_rc attribute of the bt_vhci_forward binary. The bt_vhci_forward binary is used by
+# multiple targets with different initialization configurations.
+PRODUCT_COPY_FILES += \
+ device/google/cuttlefish/guest/commands/bt_vhci_forwarder/bt_vhci_forwarder.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/bt_vhci_forwarder.rc
+
+else
+PRODUCT_PACKAGES += com.google.cf.bt [email protected]
+endif
#
# Audio HAL
@@ -461,13 +508,21 @@
#
PRODUCT_PACKAGES += \
[email protected] \
- [email protected]
+ [email protected]
+
+#
+# Confirmation UI HAL
+#
+ifeq ($(LOCAL_CONFIRMATIONUI_PRODUCT_PACKAGE),)
+ LOCAL_CONFIRMATIONUI_PRODUCT_PACKAGE := [email protected]
+endif
+PRODUCT_PACKAGES += $(LOCAL_CONFIRMATIONUI_PRODUCT_PACKAGE)
#
# Dumpstate HAL
#
ifeq ($(LOCAL_DUMPSTATE_PRODUCT_PACKAGE),)
- LOCAL_DUMPSTATE_PRODUCT_PACKAGE := [email protected]
+ LOCAL_DUMPSTATE_PRODUCT_PACKAGE += android.hardware.dumpstate-service.example
endif
PRODUCT_PACKAGES += $(LOCAL_DUMPSTATE_PRODUCT_PACKAGE)
@@ -491,7 +546,7 @@
# Gatekeeper
#
ifeq ($(LOCAL_GATEKEEPER_PRODUCT_PACKAGE),)
- LOCAL_GATEKEEPER_PRODUCT_PACKAGE := [email protected]
+ LOCAL_GATEKEEPER_PRODUCT_PACKAGE := [email protected]
endif
PRODUCT_PACKAGES += \
$(LOCAL_GATEKEEPER_PRODUCT_PACKAGE)
@@ -505,8 +560,9 @@
# Health
ifeq ($(LOCAL_HEALTH_PRODUCT_PACKAGE),)
LOCAL_HEALTH_PRODUCT_PACKAGE := \
- [email protected] \
- [email protected]
+ android.hardware.health-service.cuttlefish \
+ android.hardware.health-service.cuttlefish_recovery \
+
endif
PRODUCT_PACKAGES += $(LOCAL_HEALTH_PRODUCT_PACKAGE)
@@ -516,7 +572,7 @@
# Identity Credential
PRODUCT_PACKAGES += \
- android.hardware.identity-service.example
+ android.hardware.identity-service.remote
# Input Classifier HAL
PRODUCT_PACKAGES += \
@@ -526,8 +582,12 @@
# Sensors
#
ifeq ($(LOCAL_SENSOR_PRODUCT_PACKAGE),)
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+ LOCAL_SENSOR_PRODUCT_PACKAGE := com.android.hardware.sensors
+else
LOCAL_SENSOR_PRODUCT_PACKAGE := [email protected]
endif
+endif
PRODUCT_PACKAGES += \
$(LOCAL_SENSOR_PRODUCT_PACKAGE)
#
@@ -546,26 +606,31 @@
# KeyMint HAL
#
ifeq ($(LOCAL_KEYMINT_PRODUCT_PACKAGE),)
- LOCAL_KEYMINT_PRODUCT_PACKAGE := android.hardware.security.keymint-service
+ LOCAL_KEYMINT_PRODUCT_PACKAGE := android.hardware.security.keymint-service.remote
+# Indicate that this KeyMint includes support for the ATTEST_KEY key purpose.
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.keystore.app_attest_key.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.keystore.app_attest_key.xml
endif
PRODUCT_PACKAGES += \
$(LOCAL_KEYMINT_PRODUCT_PACKAGE)
# Keymint configuration
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.software.device_id_attestation.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.device_id_attestation.xml
+endif
#
-# Power HAL
+# Power and PowerStats HALs
#
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += com.android.hardware.power
+else
PRODUCT_PACKAGES += \
- android.hardware.power-service.example
+ android.hardware.power-service.example \
+ android.hardware.power.stats-service.example \
-#
-# PowerStats HAL
-#
-PRODUCT_PACKAGES += \
- android.hardware.power.stats-service.example
+endif
#
# NeuralNetworks HAL
@@ -585,12 +650,21 @@
#
# USB
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += \
+ com.android.hardware.usb
+else
PRODUCT_PACKAGES += \
[email protected]
+endif
# Vibrator HAL
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += com.android.hardware.vibrator
+else
PRODUCT_PACKAGES += \
android.hardware.vibrator-service.example
+endif
# BootControl HAL
PRODUCT_PACKAGES += \
@@ -606,26 +680,6 @@
PRODUCT_PACKAGES += \
android.hardware.memtrack-service.example
-# GKI APEX
-# Keep in sync with BOARD_KERNEL_MODULE_INTERFACE_VERSIONS
-ifneq (,$(TARGET_KERNEL_USE))
- ifneq (,$(filter 5.4, $(TARGET_KERNEL_USE)))
- PRODUCT_PACKAGES += com.android.gki.kmi_5_4_android12_unstable
- else
- PRODUCT_PACKAGES += com.android.gki.kmi_$(subst .,_,$(TARGET_KERNEL_USE))_android12_unstable
- endif
-endif
-
-# Prevent GKI and boot image downgrades
-PRODUCT_PRODUCT_PROPERTIES += \
- ro.build.ab_update.gki.prevent_downgrade_version=true \
- ro.build.ab_update.gki.prevent_downgrade_spl=true \
-
-# WLAN driver configuration files
-PRODUCT_COPY_FILES += \
- external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant_template.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant.conf \
- $(LOCAL_PATH)/config/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf
-
# Fastboot HAL & fastbootd
PRODUCT_PACKAGES += \
[email protected] \
@@ -651,16 +705,73 @@
PRODUCT_PACKAGES += linker.recovery shell_and_utilities_recovery
endif
+# wifi
+
+# TODO(b/205065320): remove this when wifi vendor apex support mac80211_hwsim
+LOCAL_USE_WIFI_VENDOR_APEX := false
+ifneq ($(PRODUCT_ENFORCE_MAC80211_HWSIM),true)
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+LOCAL_USE_WIFI_VENDOR_APEX := true
+endif
+endif
+
+ifeq ($(LOCAL_USE_WIFI_VENDOR_APEX),true)
+
+PRODUCT_PACKAGES += com.google.cf.wifi
+# Demonstrate multi-installed vendor APEXes by installing another wifi HAL vendor APEX
+# which does not include the passpoint feature XML.
#
-# Shell script Vendor Module Loading
-#
+# The default is set in BoardConfig.mk using bootconfig.
+# This can be changed at CVD launch-time using
+# --extra_bootconfig_args "androidboot.vendor.apex.com.android.wifi.hal:=X"
+# or post-launch, at runtime using
+# setprop persist.vendor.apex.com.android.wifi.hal X && reboot
+# where X is the name of the APEX file to use.
+PRODUCT_PACKAGES += com.google.cf.wifi.no-passpoint
+
+$(call add_soong_config_namespace, wpa_supplicant)
+$(call add_soong_config_var_value, wpa_supplicant, platform_version, $(PLATFORM_VERSION))
+$(call add_soong_config_var_value, wpa_supplicant, nl80211_driver, CONFIG_DRIVER_NL80211_QCA)
+# TODO(b/205065320): Convert com.google.cf.wifi to use mac8011_hwsim_virtio
+PRODUCT_VENDOR_PROPERTIES += ro.vendor.wifi_impl=virt_wifi
+else
+
+PRODUCT_PACKAGES += \
+ rename_netiface \
+ wpa_supplicant
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/config/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \
+ device/google/cuttlefish/shared/config/wpa_supplicant.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/wpa_supplicant.rc
+
+# WLAN driver configuration files
+LOCAL_WPA_SUPPLICANT_OVERLAY ?= $(LOCAL_PATH)/config/wpa_supplicant_overlay.conf
+PRODUCT_COPY_FILES += \
+ external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant_template.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant.conf \
+ $(LOCAL_WPA_SUPPLICANT_OVERLAY):$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf
+
+ifeq ($(PRODUCT_ENFORCE_MAC80211_HWSIM),true)
+PRODUCT_PACKAGES += \
+ mac80211_create_radios \
+ hostapd \
+ [email protected]
+
+PRODUCT_COPY_FILES += \
+ device/google/cuttlefish/guest/services/wifi/init.wifi.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.wifi.sh \
+
+PRODUCT_VENDOR_PROPERTIES += ro.vendor.wifi_impl=mac8011_hwsim_virtio
+
+$(call soong_config_append,cvdhost,enforce_mac80211_hwsim,true)
+
+else
+PRODUCT_PACKAGES += setup_wifi
+PRODUCT_VENDOR_PROPERTIES += ro.vendor.wifi_impl=virt_wifi
+endif
+
+endif
# Host packages to install
PRODUCT_HOST_PACKAGES += socket_vsock_proxy
-PRODUCT_EXTRA_VNDK_VERSIONS := 28 29 30
+PRODUCT_EXTRA_VNDK_VERSIONS := 28 29 30 31
PRODUCT_SOONG_NAMESPACES += external/mesa3d
@@ -672,6 +783,10 @@
PRODUCT_VENDOR_PROPERTIES += \
ro.surface_flinger.running_without_sync_framework=true
+# Enable GPU-intensive background blur support on Cuttlefish when requested by apps
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.surface_flinger.supports_background_blur 1
+
# Set support one-handed mode
PRODUCT_PRODUCT_PROPERTIES += \
ro.support_one_handed_mode=true
@@ -683,3 +798,7 @@
# Set one_handed_mode translate animation duration milliseconds
PRODUCT_PRODUCT_PROPERTIES += \
persist.debug.one_handed_translate_animation_duration=300
+
+# Vendor Dlkm Locader
+PRODUCT_PACKAGES += \
+ dlkm_loader
diff --git a/shared/overlays/SettingsProvider/Android.bp b/shared/overlays/SettingsProvider/Android.bp
new file mode 100644
index 0000000..6072a34
--- /dev/null
+++ b/shared/overlays/SettingsProvider/Android.bp
@@ -0,0 +1,8 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+runtime_resource_overlay {
+ name: "cuttlefish_overlay_settings_provider",
+ soc_specific: true,
+}
diff --git a/shared/overlays/SettingsProvider/AndroidManifest.xml b/shared/overlays/SettingsProvider/AndroidManifest.xml
new file mode 100644
index 0000000..74656f1
--- /dev/null
+++ b/shared/overlays/SettingsProvider/AndroidManifest.xml
@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.providers.settings.cuttlefish.overlay">
+
+ <application android:hasCode="false" />
+
+ <overlay
+ android:targetPackage="com.android.providers.settings"
+ android:isStatic="true"
+ />
+</manifest>
diff --git a/shared/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/shared/overlays/SettingsProvider/res/values/defaults.xml
similarity index 100%
rename from shared/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
rename to shared/overlays/SettingsProvider/res/values/defaults.xml
diff --git a/shared/overlays/core/Android.bp b/shared/overlays/core/Android.bp
new file mode 100644
index 0000000..e297776
--- /dev/null
+++ b/shared/overlays/core/Android.bp
@@ -0,0 +1,8 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+runtime_resource_overlay {
+ name: "cuttlefish_overlay_frameworks_base_core",
+ soc_specific: true,
+}
diff --git a/shared/overlays/core/AndroidManifest.xml b/shared/overlays/core/AndroidManifest.xml
new file mode 100644
index 0000000..284ab6b
--- /dev/null
+++ b/shared/overlays/core/AndroidManifest.xml
@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.cuttlefish.overlay">
+
+ <application android:hasCode="false" />
+
+ <overlay
+ android:targetPackage="android"
+ android:isStatic="true"
+ />
+</manifest>
diff --git a/shared/overlay/frameworks/base/core/res/res/xml/power_profile.xml b/shared/overlays/core/res/xml/power_profile.xml
similarity index 100%
rename from shared/overlay/frameworks/base/core/res/res/xml/power_profile.xml
rename to shared/overlays/core/res/xml/power_profile.xml
diff --git a/shared/permissions/Android.bp b/shared/permissions/Android.bp
new file mode 100644
index 0000000..1b1e7bb
--- /dev/null
+++ b/shared/permissions/Android.bp
@@ -0,0 +1,10 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_etc {
+ name: "cuttlefish_excluded_hardware.prebuilt.xml",
+ src: "cuttlefish_excluded_hardware.xml",
+ relative_install_path: "permissions",
+ soc_specific: true,
+}
diff --git a/shared/phone/device.mk b/shared/phone/device.mk
index faa2c7c..b87aedc 100644
--- a/shared/phone/device.mk
+++ b/shared/phone/device.mk
@@ -32,9 +32,14 @@
Phone \
PhoneService \
Telecom \
- TeleService \
+ TeleService
+
+TARGET_USES_CF_RILD ?= true
+ifeq ($(TARGET_USES_CF_RILD),true)
+PRODUCT_PACKAGES += \
libcuttlefish-ril-2 \
libcuttlefish-rild
+endif
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.faketouch.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.faketouch.xml \
diff --git a/shared/phone/device_vendor.mk b/shared/phone/device_vendor.mk
index 61f72c1..2f5fda0 100644
--- a/shared/phone/device_vendor.mk
+++ b/shared/phone/device_vendor.mk
@@ -20,8 +20,10 @@
$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_vendor.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_vendor.mk)
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml
+endif
$(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
$(call inherit-product, device/google/cuttlefish/shared/device.mk)
@@ -33,22 +35,31 @@
ro.com.android.dataroaming=true \
ro.telephony.default_network=9 \
-# TODO: not existing anymore?
-PRODUCT_PACKAGES += \
- Phone \
- PhoneService \
-
+TARGET_USES_CF_RILD ?= true
+ifeq ($(TARGET_USES_CF_RILD),true)
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += com.google.cf.rild
+else
PRODUCT_PACKAGES += \
libcuttlefish-ril-2 \
libcuttlefish-rild
+endif
+endif
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.biometrics.face.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.biometrics.face.xml \
frameworks/native/data/etc/android.hardware.faketouch.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.faketouch.xml \
frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \
frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml
+endif
-DEVICE_PACKAGE_OVERLAYS += device/google/cuttlefish/shared/phone/overlay
+# Runtime Resource Overlays
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += com.google.aosp_cf_x86_64_phone.rros
+else
+PRODUCT_PACKAGES += cuttlefish_phone_overlay_frameworks_base_core
+endif
TARGET_BOARD_INFO_FILE ?= device/google/cuttlefish/shared/phone/android-info.txt
diff --git a/shared/phone/overlays/core/Android.bp b/shared/phone/overlays/core/Android.bp
new file mode 100644
index 0000000..23fddab
--- /dev/null
+++ b/shared/phone/overlays/core/Android.bp
@@ -0,0 +1,8 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+runtime_resource_overlay {
+ name: "cuttlefish_phone_overlay_frameworks_base_core",
+ soc_specific: true,
+}
diff --git a/shared/phone/overlays/core/AndroidManifest.xml b/shared/phone/overlays/core/AndroidManifest.xml
new file mode 100644
index 0000000..268a8bc
--- /dev/null
+++ b/shared/phone/overlays/core/AndroidManifest.xml
@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.cuttlefish.phone.overlay">
+
+ <application android:hasCode="false" />
+
+ <overlay
+ android:targetPackage="android"
+ android:isStatic="true"
+ />
+</manifest>
diff --git a/shared/phone/overlay/frameworks/base/core/res/res/values/config.xml b/shared/phone/overlays/core/res/values/config.xml
similarity index 96%
rename from shared/phone/overlay/frameworks/base/core/res/res/values/config.xml
rename to shared/phone/overlays/core/res/values/config.xml
index 61feabf..8eff541 100644
--- a/shared/phone/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/shared/phone/overlays/core/res/values/config.xml
@@ -68,4 +68,7 @@
<item>2:2:255</item> <!-- ID2:Fingerprint(HIDL):Weak -->
<item>3:8:255</item> <!-- ID3:Face(HIDL):Weak -->
</string-array>
+
+ <!-- Enable Night display, which requires HWC 2.0. -->
+ <bool name="config_nightDisplayAvailable">true</bool>
</resources>
diff --git a/shared/sepolicy/OWNERS b/shared/sepolicy/OWNERS
index 2975ddf..9b37b0e 100644
--- a/shared/sepolicy/OWNERS
+++ b/shared/sepolicy/OWNERS
@@ -1,12 +1,4 @@
[email protected]
+include platform/system/sepolicy:/OWNERS
+
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
diff --git a/shared/sepolicy/system_ext/private/logger_app.te b/shared/sepolicy/system_ext/private/logger_app.te
deleted file mode 100644
index 33d1934..0000000
--- a/shared/sepolicy/system_ext/private/logger_app.te
+++ /dev/null
@@ -1,17 +0,0 @@
-type logger_app, domain;
-
-# Taken from bonito-sepolicy:
-# https://cs.android.com/android/_/android/device/google/bonito-sepolicy/+/5396ef0aa04dc69ed04ecbc7f55eacf2a76b040b:vendor/qcom/common/logger_app.te;drc=dd2c2053296b0c00b5ef103adcabb8cd82eb0045
-userdebug_or_eng(`
- app_domain(logger_app)
- net_domain(logger_app)
-
- allow logger_app app_api_service:service_manager find;
- allow logger_app surfaceflinger_service:service_manager find;
- allow logger_app radio_vendor_data_file:file create_file_perms;
- allow logger_app radio_vendor_data_file:file rw_file_perms;
- allow logger_app radio_vendor_data_file:dir create_dir_perms;
- allow logger_app radio_vendor_data_file:dir rw_dir_perms;
-
- gpu_access(logger_app)
-')
diff --git a/shared/sepolicy/system_ext/private/seapp_contexts b/shared/sepolicy/system_ext/private/seapp_contexts
index 1cd8665..375870c 100644
--- a/shared/sepolicy/system_ext/private/seapp_contexts
+++ b/shared/sepolicy/system_ext/private/seapp_contexts
@@ -1,6 +1,5 @@
# Ramdump app
user=_app seinfo=platform name=com.android.ramdump domain=ramdump_app type=app_data_file levelFrom=all
-user=_app seinfo=platform name=com.android.pixellogger domain=logger_app type=app_data_file levelFrom=all
# Connectivity monitor
user=_app isPrivApp=true seinfo=platform name=com.google.android.connectivitymonitor domain=con_monitor_app type=app_data_file levelFrom=all
diff --git a/shared/sepolicy/vendor/adbd.te b/shared/sepolicy/vendor/adbd.te
index 4ed653a..c933fe7 100644
--- a/shared/sepolicy/vendor/adbd.te
+++ b/shared/sepolicy/vendor/adbd.te
@@ -1,9 +1,4 @@
allow adbd self:{ socket vsock_socket } {create listen accept rw_socket_perms_no_ioctl};
-# TODO(b/130668487): Label the vsock sockets.
-allow adbd unlabeled:{socket vsock_socket} rw_socket_perms_no_ioctl;
allow adbd kernel:system module_request;
-recovery_only(`
-# TODO(b/130668487): Label the vsock sockets.
-allow su unlabeled:{ socket vsock_socket } rw_socket_perms_no_ioctl;
-')
+gpu_access(adbd)
diff --git a/shared/sepolicy/vendor/bluetooth.te b/shared/sepolicy/vendor/bluetooth.te
new file mode 100644
index 0000000..aa2671a
--- /dev/null
+++ b/shared/sepolicy/vendor/bluetooth.te
@@ -0,0 +1 @@
+gpu_access(bluetooth)
diff --git a/shared/sepolicy/vendor/bootanim.te b/shared/sepolicy/vendor/bootanim.te
index 9ac7954..b183efa 100644
--- a/shared/sepolicy/vendor/bootanim.te
+++ b/shared/sepolicy/vendor/bootanim.te
@@ -1,6 +1,2 @@
-# TODO(b/65049764): Update this once the FD owner process is relabelled. This is probably one of the
-# processes whch is started before Android init.
-allow bootanim kernel:fd use;
-
allow bootanim self:process execmem;
gpu_access(bootanim)
diff --git a/shared/sepolicy/vendor/bug_map b/shared/sepolicy/vendor/bug_map
index 57cbf3c..86b097a 100644
--- a/shared/sepolicy/vendor/bug_map
+++ b/shared/sepolicy/vendor/bug_map
@@ -1,6 +1,7 @@
+init init capability b/199386018
init system_lib_file dir b/133444385
init system_lib_file file b/133444385
+kernel kernel capability b/179966921
migrate_legacy_obb_data dalvikcache_data_file file b/152338071
-system_server system_server process b/65201432
gmscore_app hal_camera_prop file b/156287758
priv_app radio_vendor_data_file dir b/188833462
diff --git a/shared/sepolicy/vendor/dlkm_loader.te b/shared/sepolicy/vendor/dlkm_loader.te
new file mode 100644
index 0000000..afdc65c
--- /dev/null
+++ b/shared/sepolicy/vendor/dlkm_loader.te
@@ -0,0 +1,16 @@
+type dlkm_loader, domain;
+type dlkm_loader_exec, exec_type, vendor_file_type, file_type;
+
+init_daemon_domain(dlkm_loader)
+
+# Allow insmod on vendor and system partitions
+allow dlkm_loader self:capability sys_module;
+allow dlkm_loader system_file:system module_load;
+allow dlkm_loader vendor_file:system module_load;
+
+# needed for libmodprobe to read kernel commandline
+allow dlkm_loader proc_cmdline:file r_file_perms;
+
+# dlkm_loader searches tracefs while looking for modules
+dontaudit dlkm_loader debugfs_bootreceiver_tracing:dir search;
+dontaudit dlkm_loader debugfs_mm_events_tracing:dir search;
diff --git a/shared/sepolicy/vendor/file.te b/shared/sepolicy/vendor/file.te
index 53c4628..803d3a8 100644
--- a/shared/sepolicy/vendor/file.te
+++ b/shared/sepolicy/vendor/file.te
@@ -1,7 +1,5 @@
# File types
type sensors_hal_socket, file_type;
-type tombstone_snapshot_file, file_type;
-type var_run_system_file, file_type;
type sysfs_gpu, fs_type, sysfs_type;
type sysfs_iio_devices, fs_type, sysfs_type;
type mediadrm_vendor_data_file, file_type, data_file_type;
diff --git a/shared/sepolicy/vendor/file_contexts b/shared/sepolicy/vendor/file_contexts
index 49ef362..f6903b7 100644
--- a/shared/sepolicy/vendor/file_contexts
+++ b/shared/sepolicy/vendor/file_contexts
@@ -4,6 +4,7 @@
/dev/block/by-name/misc u:object_r:misc_block_device:s0
/dev/block/by-name/boot_[ab] u:object_r:boot_block_device:s0
+/dev/block/by-name/init_boot_[ab] u:object_r:boot_block_device:s0
/dev/block/by-name/vendor_boot_[ab] u:object_r:boot_block_device:s0
/dev/block/by-name/vbmeta_[ab] u:object_r:ab_block_device:s0
/dev/block/by-name/vbmeta_system_[ab] u:object_r:ab_block_device:s0
@@ -27,22 +28,18 @@
/dev/vhci u:object_r:bt_device:s0
+# gnss hal can also read/write from hvc6
+# /dev/hvc6 u:object_r:serial_device:s0
+/dev/hvc6 u:object_r:gnss_device:s0
+
# ARM serial console device
/dev/ttyAMA[0-9]* u:object_r:serial_device:s0
#############################
-# Root files
-/ts_snap\.txt u:object_r:tombstone_snapshot_file:s0
-
-#############################
# data files
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
#############################
-# var files
-/var/run/system(/.*)? u:object_r:var_run_system_file:s0
-
-#############################
# sys files
# x86
/sys/devices/pci0000:00/0000:00:[0-9a-fA-F]{2}\.0/virtio[0-9]+/net(/.*)? u:object_r:sysfs_net:s0
@@ -57,6 +54,7 @@
# Vendor files
#
/vendor/bin/cuttlefish_sensor_injection u:object_r:cuttlefish_sensor_injection_exec:s0
+/vendor/bin/mac80211_create_radios u:object_r:mac80211_create_radios_exec:s0
/vendor/bin/socket_vsock_proxy u:object_r:socket_vsock_proxy_exec:s0
/vendor/bin/vsoc_input_service u:object_r:vsoc_input_service_exec:s0
/vendor/bin/rename_netiface u:object_r:rename_netiface_exec:s0
@@ -75,6 +73,7 @@
/vendor/bin/hw/android\.hardware\.drm@[0-9]+\.[0-9]+-service-lazy\.widevine u:object_r:hal_drm_widevine_exec:s0
/vendor/bin/hw/android\.hardware\.graphics\.allocator@4\.0-service\.minigbm u:object_r:hal_graphics_allocator_default_exec:s0
/vendor/bin/hw/android\.hardware\.gatekeeper@1\.0-service\.software u:object_r:hal_gatekeeper_default_exec:s0
+/vendor/bin/hw/android\.hardware\.health-service\.cuttlefish u:object_r:hal_health_default_exec:s0
/vendor/bin/hw/android\.hardware\.health\.storage-service\.cuttlefish u:object_r:hal_health_storage_default_exec:s0
/vendor/bin/hw/android\.hardware\.lights-service\.example u:object_r:hal_light_default_exec:s0
/vendor/bin/hw/android\.hardware\.neuralnetworks@1\.3-service-sample-.* u:object_r:hal_neuralnetworks_sample_exec:s0
@@ -87,15 +86,18 @@
/vendor/bin/hw/android\.hardware\.sensors@2\.1-service\.mock u:object_r:hal_sensors_default_exec:s0
/vendor/bin/hw/android\.hardware\.input\.classifier@1\.0-service.default u:object_r:hal_input_classifier_default_exec:s0
/vendor/bin/hw/android\.hardware\.thermal@2\.0-service\.mock u:object_r:hal_thermal_default_exec:s0
+/vendor/bin/hw/android\.hardware\.identity-service\.remote u:object_r:hal_identity_remote_exec:s0
/vendor/bin/hw/android\.hardware\.security\.keymint-service\.remote u:object_r:hal_keymint_remote_exec:s0
/vendor/bin/hw/android\.hardware\.keymaster@4\.1-service.remote u:object_r:hal_keymaster_remote_exec:s0
/vendor/bin/hw/android\.hardware\.gatekeeper@1\.0-service.remote u:object_r:hal_gatekeeper_remote_exec:s0
+/vendor/bin/hw/android\.hardware\.confirmationui@1\.0-service.cuttlefish u:object_r:hal_confirmationui_cuttlefish_exec:s0
/vendor/bin/hw/android\.hardware\.oemlock-service.example u:object_r:hal_oemlock_default_exec:s0
/vendor/bin/hw/android\.hardware\.weaver-service.example u:object_r:hal_weaver_default_exec:s0
/vendor/bin/hw/android\.hardware\.authsecret@1\.0-service u:object_r:hal_authsecret_default_exec:s0
/vendor/bin/hw/android\.hardware\.authsecret-service.example u:object_r:hal_authsecret_default_exec:s0
/vendor/bin/hw/android\.hardware\.rebootescrow-service\.default u:object_r:hal_rebootescrow_default_exec:s0
-/vendor/bin/init\.insmod\.sh u:object_r:init_insmod_sh_exec:s0
+/vendor/bin/dlkm_loader u:object_r:dlkm_loader_exec:s0
+/vendor/bin/init\.wifi\.sh u:object_r:init_wifi_sh_exec:s0
/vendor/lib(64)?/libdrm.so u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libglapi.so u:object_r:same_process_hal_file:s0
diff --git a/shared/sepolicy/vendor/gceservice.te b/shared/sepolicy/vendor/gceservice.te
index b6f84be..57181ec 100644
--- a/shared/sepolicy/vendor/gceservice.te
+++ b/shared/sepolicy/vendor/gceservice.te
@@ -13,12 +13,6 @@
allow gceservice kmsg_device:chr_file w_file_perms;
allow gceservice kmsg_device:chr_file getattr;
-# Read tombstone snapshot file
-allow gceservice tombstone_snapshot_file:file r_file_perms;
-# List tombstone files
-allow gceservice tombstone_data_file:dir r_dir_perms;
-allow gceservice tombstone_data_file:file getattr;
-
# Communicate with GCE Metadata Proxy over Unix domain sockets
# The proxy process uses the default label ("kernel") because it is
# started before Android init and thus before SELinux rule are applied.
diff --git a/shared/sepolicy/vendor/genfs_contexts b/shared/sepolicy/vendor/genfs_contexts
index 3a18743..a62ae44 100644
--- a/shared/sepolicy/vendor/genfs_contexts
+++ b/shared/sepolicy/vendor/genfs_contexts
@@ -29,8 +29,8 @@
dnl')dnl
dnl
# crosvm (x86)
-cf_pci_block_device(/devices/pci0000:00, 0x6, 5)
-cf_pci_gpu_device(/devices/pci0000:00, 0x11)
+cf_pci_block_device(/devices/pci0000:00, 0x7, 8)
+cf_pci_gpu_device(/devices/pci0000:00, 0x15)
## find /sys/devices/platform/* -type d -name 'rtc[0-9]' | sed 's,/rtc[0-9],,'
genfscon sysfs /devices/platform/rtc_cmos/rtc u:object_r:sysfs_rtc:s0
## find /sys/devices/platform/* -type d -name 'wakeup[0-9]'
@@ -38,33 +38,41 @@
cf_rtc_wakeup_alarmtimer(/devices/platform/rtc_cmos, 0, 1)
## currently disabled
#genfscon sysfs /devices/LNXSYSTM:00/GFSH0001:00/wakeup u:object_r:sysfs_wakeup:s0
+#genfscon sysfs /devices/platform/GFSH0001:00/power_supply u:object_r:sysfs_batteryinfo:s0
+#genfscon sysfs /devices/platform/GFSH0001:00/power_supply/ac/wakeup3 u:object_r:sysfs_wakeup:s0
+#genfscon sysfs /devices/platform/GFSH0001:00/power_supply/battery/wakeup4 u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/virtual/mac80211_hwsim/hwsim0/net u:object_r:sysfs_net:s0
+genfscon sysfs /devices/virtual/mac80211_hwsim/hwsim1/net u:object_r:sysfs_net:s0
# crosvm (arm64)
-cf_pci_block_device(/devices/platform/10000.pci, 0x6, 4)
-cf_pci_gpu_device(/devices/platform/10000.pci/pci0000:00, 0x11)
+cf_pci_block_device(/devices/platform/10000.pci, 0x7, 7)
+cf_pci_gpu_device(/devices/platform/10000.pci/pci0000:00, 0x13)
## find /sys/devices/platform/* -type d -name 'rtc[0-9]' | sed 's,/rtc[0-9],,'
genfscon sysfs /devices/platform/2000.rtc/rtc u:object_r:sysfs_rtc:s0
## find /sys/devices/platform/* -type d -name 'wakeup[0-9]'
## arm64 2000.rtc on crosvm does not currently expose a wakeup node
# qemu (x86)
-cf_pci_block_device(/devices/pci0000:00, 0x7, 5)
+cf_pci_block_device(/devices/pci0000:00, 0x8, 7)
+cf_pci_gpu_device(/devices/pci0000:00, 0x14)
## find /sys/devices/platform/* -type d -name 'rtc[0-9]' | sed 's,/rtc[0-9],,'
genfscon sysfs /devices/pnp0/00:04/rtc u:object_r:sysfs_rtc:s0
## find /sys/devices/platform/* -type d -name 'wakeup[0-9][0-9]'
cf_rtc_wakeup_alarmtimer(/devices/pnp0/00:04, 0, 19)
# qemu (arm64)
-cf_pci_block_device(/devices/platform/4010000000.pcie/pci0000:00, 0x6, 4)
-cf_pci_gpu_device(/devices/platform/4010000000.pcie/pci0000:00, 0x10)
+cf_pci_block_device(/devices/platform/4010000000.pcie/pci0000:00, 0x7, 7)
+cf_pci_gpu_device(/devices/platform/4010000000.pcie/pci0000:00, 0x13)
## find /sys/devices/platform/* -type d -name 'rtc[0-9]' | sed 's,/rtc[0-9],,'
genfscon sysfs /devices/platform/9010000.pl031/rtc u:object_r:sysfs_rtc:s0
## find /sys/devices/platform/* -type d -name 'wakeup[0-9]'
cf_rtc_wakeup_alarmtimer(/devices/platform/9010000.pl031, 0, 0)
# qemu (arm)
-cf_pci_block_device(/devices/platform/3f000000.pcie/pci0000:00, 0x6, 4)
-cf_pci_gpu_device(/devices/platform/3f000000.pcie/pci0000:00, 0xf)
+cf_pci_block_device(/devices/platform/3f000000.pcie/pci0000:00, 0x7, 7)
+cf_pci_gpu_device(/devices/platform/3f000000.pcie/pci0000:00, 0x13)
+genfscon sysfs /devices/platform/rtc-test.1/wakeup/wakeup2 u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/platform/rtc-test.2/wakeup/wakeup3 u:object_r:sysfs_wakeup:s0
# common on all platforms / vm managers
genfscon sysfs /devices/platform/rtc-test.0/rtc u:object_r:sysfs_rtc:s0
diff --git a/shared/sepolicy/vendor/hal_confirmationui_cuttlefish.te b/shared/sepolicy/vendor/hal_confirmationui_cuttlefish.te
new file mode 100644
index 0000000..13cd1a9
--- /dev/null
+++ b/shared/sepolicy/vendor/hal_confirmationui_cuttlefish.te
@@ -0,0 +1,14 @@
+type hal_confirmationui_cuttlefish, domain;
+hal_server_domain(hal_confirmationui_cuttlefish, hal_confirmationui)
+
+type hal_confirmationui_cuttlefish_exec, exec_type, vendor_file_type, file_type;
+init_daemon_domain(hal_confirmationui_cuttlefish)
+
+vendor_internal_prop(vendor_vsock_confirmationui_port_prop)
+get_prop(hal_confirmationui_cuttlefish, vendor_vsock_confirmationui_port_prop)
+
+allow hal_confirmationui_cuttlefish self:{ vsock_socket } { create getopt read write getattr connect shutdown };
+
+# Write to kernel log (/dev/kmsg)
+allow hal_confirmationui_cuttlefish kmsg_device:chr_file w_file_perms;
+allow hal_confirmationui_cuttlefish kmsg_device:chr_file getattr;
diff --git a/shared/sepolicy/vendor/hal_graphics_composer.te b/shared/sepolicy/vendor/hal_graphics_composer.te
index 4929038..cda5fdf 100644
--- a/shared/sepolicy/vendor/hal_graphics_composer.te
+++ b/shared/sepolicy/vendor/hal_graphics_composer.te
@@ -1,8 +1,5 @@
-vendor_restricted_prop(vendor_vsock_frames_port_prop)
-
allow hal_graphics_composer_server hal_graphics_allocator_default_tmpfs:file read;
allow hal_graphics_composer_server self:{ socket vsock_socket } create_socket_perms_no_ioctl;
gpu_access(hal_graphics_composer_server)
-get_prop(hal_graphics_composer_server, vendor_vsock_frames_port_prop)
get_prop(hal_graphics_composer_server, vendor_cuttlefish_config_server_port_prop)
diff --git a/shared/sepolicy/vendor/hal_identity_remote.te b/shared/sepolicy/vendor/hal_identity_remote.te
new file mode 100644
index 0000000..3f89226
--- /dev/null
+++ b/shared/sepolicy/vendor/hal_identity_remote.te
@@ -0,0 +1,5 @@
+type hal_identity_remote, domain;
+hal_server_domain(hal_identity_remote, hal_identity)
+
+type hal_identity_remote_exec, exec_type, vendor_file_type, file_type;
+init_daemon_domain(hal_identity_remote)
diff --git a/shared/sepolicy/vendor/hal_keymint_remote.te b/shared/sepolicy/vendor/hal_keymint_remote.te
index 27f8291..7d5f6d5 100644
--- a/shared/sepolicy/vendor/hal_keymint_remote.te
+++ b/shared/sepolicy/vendor/hal_keymint_remote.te
@@ -10,3 +10,6 @@
# Write to kernel log (/dev/kmsg)
allow hal_keymint_remote kmsg_device:chr_file w_file_perms;
allow hal_keymint_remote kmsg_device:chr_file getattr;
+
+get_prop(hal_keymint_remote, vendor_security_patch_level_prop)
+get_prop(hal_keymint_remote, vendor_boot_security_patch_level_prop)
diff --git a/shared/sepolicy/vendor/hal_wifi_default.te b/shared/sepolicy/vendor/hal_wifi_default.te
new file mode 100644
index 0000000..cde7ada
--- /dev/null
+++ b/shared/sepolicy/vendor/hal_wifi_default.te
@@ -0,0 +1,3 @@
+allow hal_wifi_default hal_wifi_default:netlink_route_socket {
+ create bind write read nlmsg_read nlmsg_readpriv };
+allow hal_wifi_default self:capability { sys_module };
diff --git a/shared/sepolicy/vendor/init.te b/shared/sepolicy/vendor/init.te
index 7f362ef..8676c60 100644
--- a/shared/sepolicy/vendor/init.te
+++ b/shared/sepolicy/vendor/init.te
@@ -12,8 +12,9 @@
allow init binfmt_miscfs:file w_file_perms;
allow init proc:dir mounton;
-# init relabel vbmeta* symlinks
+# init relabel vbmeta* and boot* symlinks under /dev/block/by-name/.
allow init ab_block_device:lnk_file relabelto;
+allow init boot_block_device:lnk_file relabelto;
# /mnt/sdcard -> /storage/self/primary symlink is deprecated. Ignore attempts to
# create it. This denial is fixed in core policy in Android R aosp/943799.
diff --git a/shared/sepolicy/vendor/init_insmod_sh.te b/shared/sepolicy/vendor/init_insmod_sh.te
deleted file mode 100644
index 5400a37..0000000
--- a/shared/sepolicy/vendor/init_insmod_sh.te
+++ /dev/null
@@ -1,11 +0,0 @@
-type init_insmod_sh, domain;
-type init_insmod_sh_exec, exec_type, vendor_file_type, file_type;
-
-init_daemon_domain(init_insmod_sh)
-
-allow init_insmod_sh vendor_shell_exec:file rx_file_perms;
-allow init_insmod_sh vendor_toolbox_exec:file rx_file_perms;
-
-# Allow insmod
-allow init_insmod_sh self:capability sys_module;
-allow init_insmod_sh vendor_file:system module_load;
diff --git a/shared/sepolicy/vendor/init_wifi_sh.te b/shared/sepolicy/vendor/init_wifi_sh.te
new file mode 100644
index 0000000..331a745
--- /dev/null
+++ b/shared/sepolicy/vendor/init_wifi_sh.te
@@ -0,0 +1,14 @@
+# cuttlefish-setup service: runs init.cuttlefish.sh script
+type init_wifi_sh, domain;
+type init_wifi_sh_exec, vendor_file_type, exec_type, file_type;
+
+init_daemon_domain(init_wifi_sh)
+
+allow init_wifi_sh self:capability { fowner chown net_admin net_raw };
+allow init_wifi_sh vendor_toolbox_exec:file execute_no_trans;
+allow init_wifi_sh mac80211_create_radios_exec:file execute_no_trans;
+
+vendor_internal_prop(vendor_wifi_mac_prefix);
+get_prop(init_wifi_sh, vendor_wifi_mac_prefix);
+
+allow init_wifi_sh self:netlink_generic_socket create_socket_perms_no_ioctl;
diff --git a/shared/sepolicy/vendor/libcuttlefish_rild.te b/shared/sepolicy/vendor/libcuttlefish_rild.te
index 8f3bbe7..28412c7 100644
--- a/shared/sepolicy/vendor/libcuttlefish_rild.te
+++ b/shared/sepolicy/vendor/libcuttlefish_rild.te
@@ -11,4 +11,4 @@
get_prop(libcuttlefish_rild, vendor_cuttlefish_config_server_port_prop)
get_prop(libcuttlefish_rild, vendor_modem_simulator_ports_prop)
-allow libcuttlefish_rild self:{ socket vsock_socket } create_socket_perms_no_ioctl;
+allow libcuttlefish_rild self:{ socket vsock_socket } { create_socket_perms_no_ioctl getattr };
diff --git a/shared/sepolicy/vendor/mac80211_create_radios.te b/shared/sepolicy/vendor/mac80211_create_radios.te
new file mode 100644
index 0000000..f7e6b7f
--- /dev/null
+++ b/shared/sepolicy/vendor/mac80211_create_radios.te
@@ -0,0 +1,2 @@
+type mac80211_create_radios, domain;
+type mac80211_create_radios_exec, exec_type, vendor_file_type, file_type;
diff --git a/shared/sepolicy/system_ext/private/mediatranscoding.te b/shared/sepolicy/vendor/mediatranscoding.te
similarity index 100%
rename from shared/sepolicy/system_ext/private/mediatranscoding.te
rename to shared/sepolicy/vendor/mediatranscoding.te
diff --git a/shared/sepolicy/vendor/property.te b/shared/sepolicy/vendor/property.te
index a727365..679941b 100644
--- a/shared/sepolicy/vendor/property.te
+++ b/shared/sepolicy/vendor/property.te
@@ -1,2 +1,3 @@
vendor_restricted_prop(vendor_cuttlefish_config_server_port_prop)
vendor_internal_prop(vendor_modem_simulator_ports_prop)
+vendor_internal_prop(vendor_boot_security_patch_level_prop)
diff --git a/shared/sepolicy/vendor/property_contexts b/shared/sepolicy/vendor/property_contexts
index ebbe271..9369d44 100644
--- a/shared/sepolicy/vendor/property_contexts
+++ b/shared/sepolicy/vendor/property_contexts
@@ -5,10 +5,12 @@
ro.boot.hardware.hwcomposer u:object_r:vendor_graphics_config_prop:s0 exact string
ro.boot.hardware.vulkan u:object_r:vendor_graphics_config_prop:s0 exact string
ro.boot.lcd_density u:object_r:vendor_graphics_config_prop:s0 exact int
-ro.boot.vsock_frames_port u:object_r:vendor_vsock_frames_port_prop:s0
ro.boot.vsock_keyboard_port u:object_r:vendor_vsock_keyboard_port:s0
+ro.boot.vsock_confirmationui_port u:object_r:vendor_vsock_confirmationui_port_prop:s0
ro.boot.modem_simulator_ports u:object_r:vendor_modem_simulator_ports_prop:s0
ro.boot.vsock_touch_port u:object_r:vendor_vsock_touch_port:s0
-ro.boot.wifi_mac_address u:object_r:vendor_wifi_mac_address:s0
+ro.boot.wifi_mac_prefix u:object_r:vendor_wifi_mac_prefix:s0 exact string
+ro.vendor.wifi_impl u:object_r:vendor_wifi_impl:s0 exact string
+ro.vendor.boot_security_patch u:object_r:vendor_boot_security_patch_level_prop:s0
vendor.bt.rootcanal_mac_address u:object_r:vendor_bt_rootcanal_prop:s0
vendor.bt.rootcanal_test_console u:object_r:vendor_bt_rootcanal_prop:s0
diff --git a/shared/sepolicy/vendor/rename_netiface.te b/shared/sepolicy/vendor/rename_netiface.te
index 1ec0f06..f648a7e 100644
--- a/shared/sepolicy/vendor/rename_netiface.te
+++ b/shared/sepolicy/vendor/rename_netiface.te
@@ -5,6 +5,6 @@
allow rename_netiface self:capability { net_admin net_raw sys_module };
allow rename_netiface self:udp_socket { create ioctl };
-allow rename_netiface self:netlink_route_socket { bind create nlmsg_write read write };
+allow rename_netiface self:netlink_route_socket { bind create nlmsg_write read write getattr };
allow rename_netiface kernel:system module_request;
diff --git a/shared/sepolicy/vendor/setup_wifi.te b/shared/sepolicy/vendor/setup_wifi.te
index 23a34eb..6a8d054 100644
--- a/shared/sepolicy/vendor/setup_wifi.te
+++ b/shared/sepolicy/vendor/setup_wifi.te
@@ -5,10 +5,8 @@
allow setup_wifi self:capability { net_admin net_raw sys_module };
allow setup_wifi self:udp_socket { create ioctl };
-allow setup_wifi self:netlink_route_socket { bind create nlmsg_write read write };
+allow setup_wifi self:netlink_route_socket { bind create nlmsg_write read write getattr };
allow setup_wifi kernel:system module_request;
-vendor_internal_prop(vendor_wifi_mac_address)
-
-get_prop(setup_wifi, vendor_wifi_mac_address)
+get_prop(setup_wifi, vendor_wifi_mac_prefix)
diff --git a/shared/sepolicy/vendor/shell.te b/shared/sepolicy/vendor/shell.te
index cc26032..2ef1897 100644
--- a/shared/sepolicy/vendor/shell.te
+++ b/shared/sepolicy/vendor/shell.te
@@ -1,5 +1,2 @@
allow shell serial_device:chr_file { getattr ioctl read write };
allow shell cuttlefish_sensor_injection_exec:file rx_file_perms;
-
-# TODO(b/130668487): Label the vsock sockets.
-allow shell adbd:{ socket vsock_socket } rw_socket_perms_no_ioctl;
diff --git a/shared/sepolicy/vendor/socket_vsock_proxy.te b/shared/sepolicy/vendor/socket_vsock_proxy.te
index d4e2b1a..6f72963 100644
--- a/shared/sepolicy/vendor/socket_vsock_proxy.te
+++ b/shared/sepolicy/vendor/socket_vsock_proxy.te
@@ -4,7 +4,7 @@
init_daemon_domain(socket_vsock_proxy)
allow socket_vsock_proxy self:global_capability_class_set { net_admin net_raw };
-allow socket_vsock_proxy self:{ socket vsock_socket } { create getopt read write listen accept bind shutdown };
+allow socket_vsock_proxy self:{ socket vsock_socket } { create getopt read write getattr listen accept bind shutdown };
# TODO: socket returned by accept() has unlabeled context on it. Give it a
# specific label.
diff --git a/shared/sepolicy/vendor/system_server.te b/shared/sepolicy/vendor/system_server.te
index 372ca50..1df4c7d 100644
--- a/shared/sepolicy/vendor/system_server.te
+++ b/shared/sepolicy/vendor/system_server.te
@@ -1,11 +1,7 @@
-# TODO(b/65201432): Switch into enforcing mode once execmem issue due to OpenGL is resolved. Also
-# remove the corresponding dontaudit.
-# The current (at the time of writing) implementation of OpenGL needs to create executable memory.
-# Unfortunately, we cannot grant execmem power using an allow rule because global policy
-# (system/sepolicy) contains a corresponding neverallow which would cause build-time errors if the
-# allow execmem rule were added here.
-permissive system_server;
gpu_access(system_server)
# Cuttlefish is still using the legacy wifi HAL (pre-HIDL)
get_prop(system_server, wifi_hal_prop)
+
+# TODO(b/65201432): Swiftshader needs to create executable memory.
+allow system_server self:process execmem;
diff --git a/shared/sepolicy/vendor/vendor_init.te b/shared/sepolicy/vendor/vendor_init.te
index 37e76e1..5bddb14 100644
--- a/shared/sepolicy/vendor/vendor_init.te
+++ b/shared/sepolicy/vendor/vendor_init.te
@@ -7,3 +7,8 @@
set_prop(vendor_init, vendor_bt_rootcanal_prop)
get_prop(vendor_init, vendor_graphics_config_prop)
+
+vendor_internal_prop(vendor_wifi_impl)
+set_prop(vendor_init, vendor_wifi_impl)
+
+set_prop(vendor_init, vendor_boot_security_patch_level_prop)
diff --git a/shared/tv/OWNERS b/shared/tv/OWNERS
new file mode 100644
index 0000000..4df9f27
--- /dev/null
+++ b/shared/tv/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 760438
+include device/google/atv:/OWNERS
diff --git a/shared/tv/device.mk b/shared/tv/device.mk
index 9b78ee1..f0ae93d 100644
--- a/shared/tv/device.mk
+++ b/shared/tv/device.mk
@@ -40,6 +40,9 @@
# Tuner HAL
PRODUCT_PACKAGES += [email protected]
+# Fallback IME and Home apps
+PRODUCT_PACKAGES += LeanbackIME TvSampleLeanbackLauncher TvProvision
+
# Enabling managed profiles
DEVICE_PACKAGE_OVERLAYS += device/google/cuttlefish/shared/tv/overlay
diff --git a/tags b/tags
new file mode 100644
index 0000000..a8a02a1
--- /dev/null
+++ b/tags
@@ -0,0 +1,13371 @@
+!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
+!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
+!_TAG_OUTPUT_FILESEP slash /slash or backslash/
+!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
+!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
+!_TAG_PROC_CWD /usr/local/google/home/jaeman/android/aosp/device/google/cuttlefish/ //
+!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
+!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
+!_TAG_PROGRAM_URL https://ctags.io/ /official site/
+!_TAG_PROGRAM_VERSION 5.9.0 //
+#app-controls host/frontend/webrtc_operator/assets/style.css /^#app-controls {$/;" i
+#app-controls > div host/frontend/webrtc_operator/assets/style.css /^#app-controls > div {$/;" s
+#bluetooth-console-cmd-label host/frontend/webrtc_operator/assets/style.css /^#bluetooth-console-cmd-label {$/;" i
+#bluetooth-console-input host/frontend/webrtc_operator/assets/style.css /^#bluetooth-console-input {$/;" i
+#camera-control host/frontend/webrtc_operator/assets/style.css /^#camera-control {$/;" i
+#control-panel-custom-buttons host/frontend/webrtc_operator/assets/style.css /^#control-panel-custom-buttons {$/;" i
+#controls-and-displays host/frontend/webrtc_operator/assets/style.css /^#controls-and-displays {$/;" i
+#controls-and-displays > div host/frontend/webrtc_operator/assets/style.css /^#controls-and-displays > div {$/;" s
+#device-audio host/frontend/webrtc_operator/assets/style.css /^#device-audio {$/;" i
+#device-connection host/frontend/webrtc_operator/assets/style.css /^#device-connection {$/;" i
+#device-details-modal span host/frontend/webrtc_operator/assets/style.css /^#device-details-modal span {$/;" s
+#device-displays host/frontend/webrtc_operator/assets/style.css /^#device-displays {$/;" i
+#device-list .device-entry button host/frontend/webrtc_operator/assets/index.css /^#device-list .device-entry button {$/;" s
+#device-selector host/frontend/webrtc_operator/assets/index.css /^#device-selector {$/;" i
+#device-selector li.device-entry host/frontend/webrtc_operator/assets/index.css /^#device-selector li.device-entry {$/;" c
+#error-message host/frontend/webrtc_operator/assets/style.css /^#error-message {$/;" i
+#error-message-div host/frontend/webrtc_operator/assets/style.css /^#error-message-div {$/;" i
+#error-message.error host/frontend/webrtc_operator/assets/style.css /^#error-message.error {$/;" c
+#error-message.warning host/frontend/webrtc_operator/assets/style.css /^#error-message.warning {$/;" c
+#header host/frontend/webrtc_operator/assets/style.css /^#header {$/;" i
+#loader host/frontend/webrtc_operator/assets/style.css /^#loader {$/;" i
+#record-video-control host/frontend/webrtc_operator/assets/style.css /^#record-video-control {$/;" i
+#refresh-list host/frontend/webrtc_operator/assets/index.css /^#refresh-list {$/;" i
+#status-div host/frontend/webrtc_operator/assets/style.css /^#status-div {$/;" i
+#status-message host/frontend/webrtc_operator/assets/style.css /^#status-message {$/;" i
+#status-message.connected host/frontend/webrtc_operator/assets/style.css /^#status-message.connected {$/;" c
+#status-message.connecting host/frontend/webrtc_operator/assets/style.css /^#status-message.connecting {$/;" c
+#status-message.error host/frontend/webrtc_operator/assets/style.css /^#status-message.error {$/;" c
+.control-panel-column host/frontend/webrtc_operator/assets/style.css /^.control-panel-column {$/;" c
+.control-panel-column button host/frontend/webrtc_operator/assets/style.css /^.control-panel-column button {$/;" s
+.control-panel-column button.modal-button-opened host/frontend/webrtc_operator/assets/style.css /^.control-panel-column button.modal-button-opened {$/;" c
+.control-panel-column button:disabled host/frontend/webrtc_operator/assets/style.css /^.control-panel-column button:disabled {$/;" s
+.device-display host/frontend/webrtc_operator/assets/style.css /^.device-display {$/;" c
+.device-display-info host/frontend/webrtc_operator/assets/style.css /^.device-display-info {$/;" c
+.device-display-video host/frontend/webrtc_operator/assets/style.css /^.device-display-video {$/;" c
+.modal host/frontend/webrtc_operator/assets/style.css /^.modal {$/;" c
+.modal-close host/frontend/webrtc_operator/assets/style.css /^.modal-close {$/;" c
+.modal-header host/frontend/webrtc_operator/assets/style.css /^.modal-header {$/;" c
+.toggle-control host/frontend/webrtc_operator/assets/controls.css /^.toggle-control {$/;" c
+.toggle-control .toggle-control-icon host/frontend/webrtc_operator/assets/controls.css /^.toggle-control .toggle-control-icon {$/;" c
+.toggle-control .toggle-control-slider host/frontend/webrtc_operator/assets/controls.css /^.toggle-control .toggle-control-slider {$/;" c
+.toggle-control .toggle-control-slider:before host/frontend/webrtc_operator/assets/controls.css /^.toggle-control .toggle-control-slider:before {$/;" c
+.toggle-control .toggle-control-switch host/frontend/webrtc_operator/assets/controls.css /^.toggle-control .toggle-control-switch {$/;" c
+.toggle-control .toggle-control-switch input host/frontend/webrtc_operator/assets/controls.css /^.toggle-control .toggle-control-switch input {$/;" s
+.toggle-control input:checked + .toggle-control-slider host/frontend/webrtc_operator/assets/controls.css /^.toggle-control input:checked + .toggle-control-slider {$/;" c
+.toggle-control input:checked + .toggle-control-slider:before host/frontend/webrtc_operator/assets/controls.css /^.toggle-control input:checked + .toggle-control-slider:before {$/;" c
+.toggle-control input:focus + .toggle-control-slider host/frontend/webrtc_operator/assets/controls.css /^.toggle-control input:focus + .toggle-control-slider {$/;" c
+0 host/example_custom_actions/custom_action_config.json /^ {$/;" o array:1.buttons
+0 host/example_custom_actions/custom_action_config.json /^ {$/;" o
+0 shared/config/cgroups.json /^ {$/;" o array:Cgroups
+0 shared/config/config_foldable.json /^ {$/;" o array:custom_actions.0.device_states
+0 shared/config/config_foldable.json /^ {$/;" o array:custom_actions.1.device_states
+0 shared/config/config_foldable.json /^ {$/;" o array:custom_actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.0.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.1.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.10.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.11.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.12.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.13.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.14.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.15.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.16.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.17.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.18.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.19.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.2.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.20.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.21.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.22.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.23.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.24.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.25.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.26.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.27.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.28.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.29.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.3.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.30.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.4.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.5.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.6.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.7.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.8.Actions
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles.9.Actions
+0 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ]$/;" s array:AggregateProfiles.1.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" /;" s array:AggregateProfiles.7.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.2.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNorma/;" s array:AggregateProfiles.8.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.3.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" /;" s array:AggregateProfiles.9.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.5.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "ServiceCapacityLow", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.10.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "ServiceCapacityRestricted", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.11.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "ServicePerformance", "LowIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.4.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "TimerSlackNormal" ]$/;" s array:AggregateProfiles.0.Profiles
+0 shared/config/task_profiles.json /^ "Profiles": [ "TimerSlackNormal" ]$/;" s array:AggregateProfiles.6.Profiles
+0 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+0 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+1 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="1" cmd="21" menuId="01" text="D0228103012181820281028D1708662F54266/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="1" cmd="21" menuId="01" text="D03A8103012181820281028D2F08666E901A00550/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <SELECTITEM id="1" cmd="24" menuId="01" text="D0218103012400820281828F0A01806DFB52A083DC/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <SELECTITEM id="1" cmd="24" menuId="50" text="D02D8103012400820281828F0A018053E34EE48BBE7F6E/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="1" cmd="21" menuId="01" text="D0228103012181820281028D1708662F54266/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="1" cmd="21" menuId="01" text="D03A8103012181820281028D2F08666E901A00550/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <SELECTITEM id="1" cmd="24" menuId="01" text="D0218103012400820281828F0A01806DFB52A083DC/;" i
+1 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <SELECTITEM id="1" cmd="24" menuId="50" text="D02D8103012400820281828F0A018053E34EE48BBE7F6E/;" i
+1 host/example_custom_actions/custom_action_config.json /^ {$/;" o array:1.buttons
+1 host/example_custom_actions/custom_action_config.json /^ {$/;" o
+1 shared/config/config_foldable.json /^ {$/;" o array:custom_actions
+1 shared/config/task_profiles.json /^ {$/;" o array:Profiles.28.Actions
+1 shared/config/task_profiles.json /^ {$/;" o array:Profiles.29.Actions
+1 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ]$/;" s array:AggregateProfiles.1.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" /;" s array:AggregateProfiles.7.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.2.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNorma/;" s array:AggregateProfiles.8.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.3.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" /;" s array:AggregateProfiles.9.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.5.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "ServiceCapacityLow", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.10.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "ServiceCapacityRestricted", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.11.Profiles
+1 shared/config/task_profiles.json /^ "Profiles": [ "ServicePerformance", "LowIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.4.Profiles
+1 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+1 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+10 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+10 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+11 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+11 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+12 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+13 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+14 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+15 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+16 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+17 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+18 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+19 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+2 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="2" cmd="21" menuId="02" text="D01A8103012101820281028D0F0883DC53555/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="2" cmd="21" menuId="02" text="D05C8103012181820281028D510875358BDD53F77/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="2" cmd="21" menuId="02" text="D081BB8103012181820281028D81AF08201C00530/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <SELECTITEM id="2" cmd="24" menuId="4E" text="D04E810301240082028182850F80005500530049004D53/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="2" cmd="21" menuId="02" text="D01A8103012101820281028D0F0883DC53555/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="2" cmd="21" menuId="02" text="D05C8103012181820281028D510875358BDD53F77/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="2" cmd="21" menuId="02" text="D081BB8103012181820281028D81AF08201C00530/;" i
+2 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <SELECTITEM id="2" cmd="24" menuId="4E" text="D04E810301240082028182850F80005500530049004D53/;" i
+2 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ]$/;" s array:AggregateProfiles.1.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" /;" s array:AggregateProfiles.7.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.2.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNorma/;" s array:AggregateProfiles.8.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.3.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" /;" s array:AggregateProfiles.9.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.5.Profiles
+2 shared/config/task_profiles.json /^ "Profiles": [ "ServicePerformance", "LowIoPriority", "TimerSlackNormal" ]$/;" s array:AggregateProfiles.4.Profiles
+2 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+2 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+20 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+21 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+22 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+23 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+24 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+25 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+26 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+27 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+28 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+29 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+2F00 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_DIR" id="2F00" structure="linear fixed">$/;" i
+2F00 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_DIR" id="2F00" structure="linear fixed">$/;" i
+2F05 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_PL" id="2F05" structure="transparent">$/;" i
+2F05 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_PL" id="2F05" structure="transparent">$/;" i
+2FE2 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_ICCID" id="2FE2" structure="transparent">$/;" i
+2FE2 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_ICCID" id="2FE2" structure="transparent">$/;" i
+3 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="3" cmd="21" menuId="03" text="D02E8103012181820281028D23084E2D56FD79FB5/;" i
+3 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <DISPLAYTEXT id="3" cmd="21" menuId="03" text="D05E8103012181820281028D5308004F005400415/;" i
+3 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="3" cmd="21" menuId="03" text="D02E8103012181820281028D23084E2D56FD79FB5/;" i
+3 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <DISPLAYTEXT id="3" cmd="21" menuId="03" text="D05E8103012181820281028D5308004F005400415/;" i
+3 shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" /;" s array:AggregateProfiles.7.Profiles
+3 shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNorma/;" s array:AggregateProfiles.8.Profiles
+3 shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" /;" s array:AggregateProfiles.9.Profiles
+3 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+3 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+30 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+4 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+4 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+4300 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <File id="4300">$/;" i
+4318 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <File id="4318">$/;" i
+4F09 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_PBC" id="4F09" structure="linear fixed">$/;" i
+4F09 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_PBC" id="4F09" structure="linear fixed">$/;" i
+4F11 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_ANR" id="4F11" structure="linear fixed">$/;" i
+4F11 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_ANR" id="4F11" structure="linear fixed">$/;" i
+4F30 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_PBR" id="4F30" structure="linear fixed">$/;" i
+4F30 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_PBR" id="4F30" structure="linear fixed">$/;" i
+4F33 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_IAP" id="4F33" structure="linear fixed">$/;" i
+4F33 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_IAP" id="4F33" structure="linear fixed">$/;" i
+4F3A host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_ADN" id="4F3A" structure="linear fixed">$/;" i
+4F3A host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_ADN" id="4F3A" structure="linear fixed">$/;" i
+4F4C host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_GAS" id="4F4C" structure="linear fixed">$/;" i
+4F4C host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_GAS" id="4F4C" structure="linear fixed">$/;" i
+5 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+5 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+6 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+6 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+6F07 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_IMSI" id="6F07" structure="transparent">$/;" i
+6F07 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_IMSI" id="6F07" structure="transparent">$/;" i
+6F11 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_VOICE_MAIL_INDICATOR_CPHS" id="6F11" structure="transparent">$/;" i
+6F11 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_VOICE_MAIL_INDICATOR_CPHS" id="6F11" structure="transparent">$/;" i
+6F3B host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_FDN" id="6F3B" structure="linear fixed">$/;" i
+6F3B host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_FDN" id="6F3B" structure="linear fixed">$/;" i
+6F40 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_MSISDN" id="6F40" structure="linear fixed">$/;" i
+6F40 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_MSISDN" id="6F40" structure="linear fixed">$/;" i
+6F7B host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_FPLMN" id="6F7B" structure="transparent">$/;" i
+6F7B host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_FPLMN" id="6F7B" structure="transparent">$/;" i
+6FAD host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_AD" id="6FAD" structure="transparent">$/;" i
+6FAD host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_AD" id="6FAD" structure="transparent">$/;" i
+6FC7 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_MBDN" id="6FC7" structure="linear fixed">$/;" i
+6FC7 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_MBDN" id="6FC7" structure="linear fixed">$/;" i
+6FC9 host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_MBI" id="6FC9" structure="linear fixed">$/;" i
+6FC9 host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_MBI" id="6FC9" structure="linear fixed">$/;" i
+6FCA host/commands/modem_simulator/files/iccprofile_for_sim0.xml /^ <EF name="EF_MWIS" id="6FCA" structure="linear fixed">$/;" i
+6FCA host/commands/modem_simulator/files/iccprofile_for_sim0_for_CtsCarrierApiTestCases.xml /^ <EF name="EF_MWIS" id="6FCA" structure="linear fixed">$/;" i
+7 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+7 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+8 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+8 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+9 shared/config/task_profiles.json /^ {$/;" o array:AggregateProfiles
+9 shared/config/task_profiles.json /^ {$/;" o array:Profiles
+AB host/commands/modem_simulator/sim_service.h /^ AB = 6, \/\/ All barring services$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+AB_OTA_UPDATER shared/device.mk /^AB_OTA_UPDATER := true$/;" m
+AC host/commands/modem_simulator/sim_service.h /^ AC = 8, \/\/ All incoming barring services$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+ACESS_TECH_EC_GSM_IoT host/commands/modem_simulator/network_service.h /^ ACESS_TECH_EC_GSM_IoT = 8,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_EGPRS host/commands/modem_simulator/network_service.h /^ ACESS_TECH_EGPRS = 3,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_EUTRAN host/commands/modem_simulator/network_service.h /^ ACESS_TECH_EUTRAN = 7,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_E_UTRA host/commands/modem_simulator/network_service.h /^ ACESS_TECH_E_UTRA = 10,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_E_UTRAN host/commands/modem_simulator/network_service.h /^ ACESS_TECH_E_UTRAN = 9,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_E_UTRA_NR host/commands/modem_simulator/network_service.h /^ ACESS_TECH_E_UTRA_NR = 13$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_GSM host/commands/modem_simulator/network_service.h /^ ACESS_TECH_GSM = 0,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_GSM_COMPACT host/commands/modem_simulator/network_service.h /^ ACESS_TECH_GSM_COMPACT = 1,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_HSDPA host/commands/modem_simulator/network_service.h /^ ACESS_TECH_HSDPA = 4,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_HSPA host/commands/modem_simulator/network_service.h /^ ACESS_TECH_HSPA = 6,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_HSUPA host/commands/modem_simulator/network_service.h /^ ACESS_TECH_HSUPA = 5,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_NG_RAN host/commands/modem_simulator/network_service.h /^ ACESS_TECH_NG_RAN = 12,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_NR host/commands/modem_simulator/network_service.h /^ ACESS_TECH_NR = 11,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACESS_TECH_UTRAN host/commands/modem_simulator/network_service.h /^ ACESS_TECH_UTRAN = 2,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+ACQUIRE common/libs/concurrency/thread_annotations.h /^#define ACQUIRE(/;" d
+ACQUIRED_AFTER common/libs/concurrency/thread_annotations.h /^#define ACQUIRED_AFTER(/;" d
+ACQUIRED_BEFORE common/libs/concurrency/thread_annotations.h /^#define ACQUIRED_BEFORE(/;" d
+ACQUIRE_SHARED common/libs/concurrency/thread_annotations.h /^#define ACQUIRE_SHARED(/;" d
+ACTIVE host/commands/modem_simulator/data_service.h /^ enum CidState {ACTIVE, NO_ACTIVE};$/;" e enum:cuttlefish::DataService::PDPContext::CidState
+AF_VSOCK common/libs/fs/vm_sockets.h /^#define AF_VSOCK /;" d
+AG host/commands/modem_simulator/sim_service.h /^ AG = 7, \/\/ All outgoing barring services$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+AI host/commands/modem_simulator/sim_service.h /^ AI = 4, \/\/ Barr all incoming calls$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+ALL_CF host/commands/modem_simulator/sup_service.h /^ ALL_CF = 4, \/\/ all call forwarding$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+ALL_CONDITIONAL_CF host/commands/modem_simulator/sup_service.h /^ ALL_CONDITIONAL_CF = 5, \/\/all conditional call forwarding$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+ALL_MATCHING_RULES_FAILED guest/hals/ril/reference-libril/ril.h /^ ALL_MATCHING_RULES_FAILED = 0x8CE,$/;" e enum:__anon0bfbaecf2f03
+ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H guest/hals/confirmationui/TrustyConfirmationUI.h /^#define ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H$/;" d
+ANDROID_RIL_H guest/hals/ril/reference-libril/ril.h /^#define ANDROID_RIL_H /;" d
+ANDROID_RIL_INTERNAL_H guest/hals/ril/reference-libril/ril_internal.h /^#define ANDROID_RIL_INTERNAL_H$/;" d
+ANDROID_WAKE_LOCK_NAME guest/hals/ril/reference-libril/ril.cpp /^#define ANDROID_WAKE_LOCK_NAME /;" d file:
+ANDROID_WAKE_LOCK_SECS guest/hals/ril/reference-libril/ril.cpp /^#define ANDROID_WAKE_LOCK_SECS /;" d file:
+ANDROID_WAKE_LOCK_USECS guest/hals/ril/reference-libril/ril.cpp /^#define ANDROID_WAKE_LOCK_USECS /;" d file:
+AO host/commands/modem_simulator/sim_service.h /^ AO = 1, \/\/ Barr all outgoing calls$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+ARRAY host/libs/confui/cbor.h /^ ARRAY = 4,$/;" e enum:cuttlefish::confui::Cbor::Type
+ASSERT_CAPABILITY common/libs/concurrency/thread_annotations.h /^#define ASSERT_CAPABILITY(/;" d
+ASSERT_SHARED_CAPABILITY common/libs/concurrency/thread_annotations.h /^#define ASSERT_SHARED_CAPABILITY(/;" d
+ASSERT_VALID_MSG_TYPE host/libs/audio_connector/shm_layout.h /^#define ASSERT_VALID_MSG_TYPE(/;" d
+ATCHANNEL_H guest/hals/ril/reference-ril/atchannel.h /^#define ATCHANNEL_H /;" d
+ATCommandType guest/hals/ril/reference-ril/atchannel.h /^} ATCommandType;$/;" t typeref:enum:__anon512a2c1f0103
+ATLine guest/hals/ril/reference-ril/atchannel.h /^typedef struct ATLine {$/;" s
+ATLine guest/hals/ril/reference-ril/atchannel.h /^} ATLine;$/;" t typeref:struct:ATLine
+ATOI_NULL_HANDLED guest/hals/ril/reference-libril/ril_service.cpp /^#define ATOI_NULL_HANDLED(/;" d file:
+ATOI_NULL_HANDLED_DEF guest/hals/ril/reference-libril/ril_service.cpp /^#define ATOI_NULL_HANDLED_DEF(/;" d file:
+ATResponse guest/hals/ril/reference-ril/atchannel.h /^} ATResponse;$/;" t typeref:struct:__anon512a2c1f0208
+ATUnsolHandler guest/hals/ril/reference-ril/atchannel.h /^typedef void (*ATUnsolHandler)(const char *s, const char *sms_pdu);$/;" t typeref:typename:void (*)(const char * s,const char * sms_pdu)
+AT_CME_Error guest/hals/ril/reference-ril/atchannel.h /^} AT_CME_Error;$/;" t typeref:enum:__anon512a2c1f0303
+AT_DEBUG guest/hals/ril/reference-ril/atchannel.h /^#define AT_DEBUG /;" d
+AT_DUMP guest/hals/ril/reference-ril/atchannel.c /^void AT_DUMP(const char* prefix __unused, const char* buff, int len)$/;" f typeref:typename:void
+AT_ERROR_CHANNEL_CLOSED guest/hals/ril/reference-ril/atchannel.h /^#define AT_ERROR_CHANNEL_CLOSED /;" d
+AT_ERROR_COMMAND_PENDING guest/hals/ril/reference-ril/atchannel.h /^#define AT_ERROR_COMMAND_PENDING /;" d
+AT_ERROR_GENERIC guest/hals/ril/reference-ril/atchannel.h /^#define AT_ERROR_GENERIC /;" d
+AT_ERROR_INVALID_RESPONSE guest/hals/ril/reference-ril/atchannel.h /^#define AT_ERROR_INVALID_RESPONSE /;" d
+AT_ERROR_INVALID_THREAD guest/hals/ril/reference-ril/atchannel.h /^#define AT_ERROR_INVALID_THREAD /;" d
+AT_ERROR_TIMEOUT guest/hals/ril/reference-ril/atchannel.h /^#define AT_ERROR_TIMEOUT /;" d
+AT_TOK_H guest/hals/ril/reference-ril/at_tok.h /^#define AT_TOK_H /;" d
+AUDIOSERVER_MULTILIB vsoc_arm64_only/BoardConfig.mk /^AUDIOSERVER_MULTILIB := first$/;" m
+AUDIOSERVER_MULTILIB vsoc_x86_64_only/BoardConfig.mk /^AUDIOSERVER_MULTILIB := first$/;" m
+AUTH_CONTEXT_EAP_AKA guest/hals/ril/reference-ril/reference-ril.c /^#define AUTH_CONTEXT_EAP_AKA /;" d file:
+AUTH_CONTEXT_EAP_SIM guest/hals/ril/reference-ril/reference-ril.c /^#define AUTH_CONTEXT_EAP_SIM /;" d file:
+A_CNXN host/frontend/webrtc_operator/assets/js/adb.js /^const A_CNXN = 0x4e584e43;$/;" C
+A_OKAY host/frontend/webrtc_operator/assets/js/adb.js /^const A_OKAY = 0x59414b4f;$/;" C
+A_OPEN host/frontend/webrtc_operator/assets/js/adb.js /^const A_OPEN = 0x4e45504f;$/;" C
+A_WRTE host/frontend/webrtc_operator/assets/js/adb.js /^const A_WRTE = 0x45545257;$/;" C
+Abort guest/hals/confirmationui/guest_session.cpp /^Return<void> GuestSession::Abort() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:Return<void>
+Abort host/libs/confui/session.cc /^void Session::Abort() {$/;" f class:cuttlefish::confui::Session typeref:typename:void
+AbortOperation guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::AbortOperation(const AbortOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+AbortOperation guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::AbortOperation(const AbortOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+AbsolutePath common/libs/utils/files.cpp /^std::string AbsolutePath(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:std::string
+Accept common/libs/fs/shared_fd.cpp /^FileInstance* FileInstance::Accept(struct sockaddr* addr,$/;" f class:cuttlefish::FileInstance typeref:typename:FileInstance *
+Accept common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Accept(const FileInstance& listener) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+Accept common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Accept(const FileInstance& listener, struct sockaddr* addr,$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+Accept common/libs/utils/tcp_socket.cpp /^ClientSocket ServerSocket::Accept() {$/;" f class:cuttlefish::ServerSocket typeref:typename:ClientSocket
+AcceptClient host/libs/audio_connector/server.cpp /^std::unique_ptr<AudioClientConnection> AudioServer::AcceptClient($/;" f class:cuttlefish::AudioServer typeref:typename:std::unique_ptr<AudioClientConnection>
+AcceptIncomingConnection host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::AcceptIncomingConnection() {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+AccessTechnoloy host/commands/modem_simulator/network_service.h /^ enum AccessTechnoloy {$/;" g struct:cuttlefish::NetworkService::NetworkRegistrationStatus
+AcquireResource host/libs/allocd/resource.cpp /^bool EthernetIface::AcquireResource() {$/;" f class:cuttlefish::EthernetIface typeref:typename:bool
+AcquireResource host/libs/allocd/resource.cpp /^bool MobileIface::AcquireResource() {$/;" f class:cuttlefish::MobileIface typeref:typename:bool
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.0
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.1
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.10
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.11
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.12
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.13
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.14
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.15
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.16
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.17
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.18
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.19
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.2
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.20
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.21
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.22
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.23
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.24
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.25
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.26
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.27
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.28
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.29
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.3
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.30
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.4
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.5
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.6
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.7
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.8
+Actions shared/config/task_profiles.json /^ "Actions": [$/;" a object:Profiles.9
+ActiveAudioLayer host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::ActiveAudioLayer(AudioLayer* audioLayer) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+AdbChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^AdbChannelHandler::AdbChannelHandler($/;" f class:cuttlefish::webrtc_streaming::AdbChannelHandler
+AdbChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^class AdbChannelHandler : public webrtc::DataChannelObserver {$/;" c namespace:cuttlefish::webrtc_streaming file:
+AdbConfig host/libs/config/adb/adb.h /^class AdbConfig {$/;" c namespace:cuttlefish
+AdbConfigComponent host/libs/config/adb/data.cpp /^fruit::Component<AdbConfig> AdbConfigComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<AdbConfig>
+AdbConfigFlag host/libs/config/adb/adb.h /^class AdbConfigFlag : public FlagFeature {};$/;" c namespace:cuttlefish
+AdbConfigFlagComponent host/libs/config/adb/flags.cpp /^AdbConfigFlagComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<AdbConfig,ConfigFlag>,AdbConfigFlag>
+AdbConfigFlagImpl host/libs/config/adb/flags.cpp /^class AdbConfigFlagImpl : public AdbConfigFlag {$/;" c namespace:cuttlefish::__anon459bf0e40111 file:
+AdbConfigFragment host/libs/config/adb/adb.h /^class AdbConfigFragment : public ConfigFragment {};$/;" c namespace:cuttlefish
+AdbConfigFragmentComponent host/libs/config/adb/config.cpp /^AdbConfigFragmentComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<AdbConfig>,AdbConfigFragment>
+AdbConfigFragmentImpl host/libs/config/adb/config.cpp /^class AdbConfigFragmentImpl : public AdbConfigFragment {$/;" c namespace:cuttlefish::__anone963d72d0111 file:
+AdbConfigImpl host/libs/config/adb/data.cpp /^class AdbConfigImpl : public AdbConfig {$/;" c namespace:cuttlefish file:
+AdbConnect host/frontend/adb_connector/adb_connection_maintainer.cpp /^bool AdbConnect(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:bool
+AdbConnector host/libs/config/adb/launch.cpp /^class AdbConnector : public CommandSource {$/;" c namespace:cuttlefish::__anon7ea6a0320111 file:
+AdbConnectorBinary host/libs/config/known_paths.cpp /^std::string AdbConnectorBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+AdbDisconnect host/frontend/adb_connector/adb_connection_maintainer.cpp /^bool AdbDisconnect(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:bool
+AdbHandler host/frontend/webrtc/adb_handler.cpp /^AdbHandler::AdbHandler($/;" f class:cuttlefish::webrtc_streaming::AdbHandler
+AdbHandler host/frontend/webrtc/adb_handler.h /^struct AdbHandler {$/;" s namespace:cuttlefish::webrtc_streaming
+AdbHelper host/libs/config/adb/launch.cpp /^class AdbHelper {$/;" c namespace:cuttlefish::__anon7ea6a0320111 file:
+AdbMode host/libs/config/adb/adb.h /^enum class AdbMode {$/;" g namespace:cuttlefish
+AdbModeToString host/libs/config/adb/strings.cpp /^std::string AdbModeToString(AdbMode mode) {$/;" f namespace:cuttlefish typeref:typename:std::string
+AdbSendMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^bool AdbSendMessage(const std::string& message) {$/;" f namespace:__anon734383cf0111 typeref:typename:bool
+AdbSendMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^bool AdbSendMessage(cuttlefish::SharedFD sock, const std::string& message) {$/;" f namespace:__anon734383cf0111 typeref:typename:bool
+AdbdStarted host/commands/kernel_log_monitor/kernel_log_server.h /^ AdbdStarted = 5,$/;" e enum:monitor::Event
+Add host/frontend/webrtc/audio_handler.cpp /^size_t AudioHandler::HoldingBuffer::Add(const volatile uint8_t* data,$/;" f class:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:size_t
+Add host/frontend/webrtc_operator/client_handler.cpp /^std::string PollConnectionStore::Add(std::shared_ptr<PollConnectionHandler> handler) {$/;" f class:cuttlefish::PollConnectionStore typeref:typename:std::string
+AddAddrInfo common/libs/net/netlink_request.cpp /^void NetlinkRequest::AddAddrInfo(int32_t if_index, int prefix_len) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+AddAudio host/frontend/webrtc/lib/client_handler.cpp /^bool ClientHandler::AddAudio($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:bool
+AddAudioStream host/frontend/webrtc/lib/streamer.cpp /^std::shared_ptr<AudioSink> Streamer::AddAudioStream(const std::string& label) {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:std::shared_ptr<AudioSink>
+AddCORSHeaders host/libs/websocket/websocket_server.cpp /^bool AddCORSHeaders(struct lws* wsi, unsigned char** buffer_ptr,$/;" f namespace:cuttlefish::__anon8185be2f0111 typeref:typename:bool
+AddCamera host/frontend/webrtc/lib/streamer.cpp /^CameraController* Streamer::AddCamera(unsigned int port, unsigned int cid) {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:CameraController *
+AddCommand host/commands/run_cvd/process_monitor.cc /^void ProcessMonitor::AddCommand(Command cmd) {$/;" f class:cuttlefish::ProcessMonitor typeref:typename:void
+AddCommands host/commands/run_cvd/process_monitor.h /^ void AddCommands(T&& commands) {$/;" f class:cuttlefish::ProcessMonitor typeref:typename:void
+AddControlSocket host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddControlSocket(const std::string& control_socket) {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddCustomActionServer host/frontend/webrtc/connection_observer.cpp /^void CfConnectionObserverFactory::AddCustomActionServer($/;" f class:cuttlefish::CfConnectionObserverFactory typeref:typename:void
+AddCustomControlPanelButton host/frontend/webrtc/lib/streamer.cpp /^void Streamer::AddCustomControlPanelButton(const std::string& command,$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+AddCustomControlPanelButtonWithDeviceStates host/frontend/webrtc/lib/streamer.cpp /^void Streamer::AddCustomControlPanelButtonWithDeviceStates($/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+AddCustomControlPanelButtonWithShellCommand host/frontend/webrtc/lib/streamer.cpp /^void Streamer::AddCustomControlPanelButtonWithShellCommand($/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+AddDisplay host/frontend/webrtc/lib/client_handler.cpp /^bool ClientHandler::AddDisplay($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:bool
+AddDisplay host/frontend/webrtc/lib/local_recorder.cpp /^void LocalRecorder::AddDisplay($/;" f class:cuttlefish::webrtc_streaming::LocalRecorder typeref:typename:void
+AddDisplay host/frontend/webrtc/lib/streamer.cpp /^std::shared_ptr<VideoSink> Streamer::AddDisplay(const std::string& label,$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:std::shared_ptr<VideoSink>
+AddEncodedSink host/frontend/webrtc/lib/video_track_source_impl.h /^ void AddEncodedSink($/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:void
+AddEvent host/frontend/webrtc/connection_observer.cpp /^ void AddEvent(uint16_t type, uint16_t code, int32_t value) override {$/;" f struct:cuttlefish::InputEventBufferImpl typeref:typename:void file:
+AddFilesToConfig host/commands/fetcher/fetch_cvd.cc /^void AddFilesToConfig(FileSource purpose, const Build& build,$/;" f namespace:cuttlefish::__anonccb356fd0211 typeref:typename:void
+AddGateway host/libs/allocd/alloc_utils.cpp /^bool AddGateway(const std::string& name, const std::string& gateway,$/;" f namespace:cuttlefish typeref:typename:bool
+AddHttpHeaders host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::AddHttpHeaders(unsigned char** p,$/;" f class:WsConnectionImpl typeref:typename:void
+AddHvcConsoleReadOnly host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddHvcConsoleReadOnly(const std::string& output) {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddHvcReadOnly host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddHvcReadOnly(const std::string& output) {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddHvcReadWrite host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddHvcReadWrite(const std::string& output,$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddHvcSink host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddHvcSink() {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddIfInfo common/libs/net/netlink_request.cpp /^void NetlinkRequest::AddIfInfo(int32_t if_index, bool operational) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+AddInt common/libs/net/netlink_request.h /^ void AddInt(uint16_t type, T value) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+AddInterface host/libs/allocd/resource_manager.cpp /^bool ResourceManager::AddInterface(const std::string& iface, IfaceType ty,$/;" f class:cuttlefish::ResourceManager typeref:typename:bool
+AddJsonCustomActionConfigs host/libs/config/custom_actions.cpp /^ bool AddJsonCustomActionConfigs(const Json::Value& custom_action_array) {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:bool file:
+AddMacAddress common/libs/net/netlink_request.cpp /^void NetlinkRequest::AddMacAddress(const std::array<unsigned char, 6>& address) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+AddOrUpdateSink host/frontend/webrtc/lib/client_handler.cpp /^ void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame> *sink,$/;" f class:cuttlefish::webrtc_streaming::ClientVideoTrackImpl typeref:typename:void file:
+AddParameter common/libs/utils/subprocess.h /^ void AddParameter(Args... args) {$/;" f class:cuttlefish::Command typeref:typename:void
+AddPendingIceCandidates host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::AddPendingIceCandidates() {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+AddRngEntropy guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::AddRngEntropy(const AddEntropyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+AddRngEntropy guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::AddRngEntropy(const AddEntropyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+AddRngEntropy host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t AddRngEntropy(const uint8_t* buf,$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+AddRngEntropy host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::AddRngEntropy($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+AddRngEntropy host/commands/secure_env/tpm_random_source.cpp /^keymaster_error_t TpmRandomSource::AddRngEntropy($/;" f class:cuttlefish::TpmRandomSource typeref:typename:keymaster_error_t
+AddSerial host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddSerial(const std::string& output,$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddSerialConsoleReadOnly host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddSerialConsoleReadOnly(const std::string& output) {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddSerialConsoleReadWrite host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddSerialConsoleReadWrite(const std::string& output,$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddSerialSink host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::AddSerialSink() {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+AddSink host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::AddSink(webrtc::AudioTrackSinkInterface* sink) {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+AddString common/libs/net/netlink_request.cpp /^void NetlinkRequest::AddString(uint16_t type, const std::string& value) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+AddSubscriber host/frontend/webrtc/kernel_log_events_handler.cpp /^int KernelLogEventsHandler::AddSubscriber($/;" f class:cuttlefish::KernelLogEventsHandler typeref:typename:int
+AddTap host/libs/vm_manager/crosvm_builder.cpp /^SharedFD CrosvmBuilder::AddTap(const std::string& tap_name) {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:SharedFD
+AddTapIface host/libs/allocd/alloc_utils.cpp /^bool AddTapIface(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+Address common/libs/net/network_interface.h /^ const std::string& Address() const {$/;" f class:cuttlefish::NetworkInterface typeref:typename:const std::string &
+AdjustSignalStrengthValue host/commands/modem_simulator/network_service.cpp /^void NetworkService::AdjustSignalStrengthValue(int& value,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+Adjusting APT Sources for Multiarch multiarch-howto.md /^# Adjusting APT Sources for Multiarch$/;" c
+AfterSelect host/commands/kernel_log_monitor/kernel_log_server.cc /^void KernelLogServer::AfterSelect(const cuttlefish::SharedFDSet& fd_read) {$/;" f class:monitor::KernelLogServer typeref:typename:void
+AggregateImage host/libs/image_aggregator/image_aggregator.cc /^void AggregateImage(const std::vector<ImagePartition>& partitions,$/;" f namespace:cuttlefish typeref:typename:void
+AggregateProfiles shared/config/task_profiles.json /^ "AggregateProfiles": [$/;" a
+AidlPackageCheck tests/hal/hal_implementation_test.cpp /^struct AidlPackageCheck {$/;" s file:
+Alias common/libs/utils/flag_parser.cpp /^Flag Flag::Alias(const FlagAlias& alias) && {$/;" f class:cuttlefish::Flag typeref:typename:Flag
+Alias common/libs/utils/flag_parser.cpp /^Flag& Flag::Alias(const FlagAlias& alias) & {$/;" f class:cuttlefish::Flag typeref:typename:Flag &
+AlignStride host/frontend/webrtc/cvd_video_frame_buffer.cpp /^inline int AlignStride(int width) {$/;" f namespace:cuttlefish::__anonfb30483e0111 typeref:typename:int
+AlignToPartitionSize host/libs/image_aggregator/image_aggregator.cc /^uint64_t AlignToPartitionSize(uint64_t size) {$/;" f namespace:cuttlefish typeref:typename:uint64_t
+AlignToPowerOf2 common/libs/utils/size_utils.h /^constexpr uint64_t AlignToPowerOf2(uint64_t val, uint8_t align_log) {$/;" f namespace:cuttlefish typeref:typename:uint64_t
+AlignedSize host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t AlignedSize() const { return AlignToPartitionSize(size); }$/;" f struct:cuttlefish::__anon02806fd80111::PartitionInfo typeref:typename:std::uint64_t file:
+Allocate host/commands/secure_env/fragile_tpm_storage.cpp /^bool FragileTpmStorage::Allocate(const Json::Value& key, uint16_t size) {$/;" f class:cuttlefish::FragileTpmStorage typeref:typename:bool
+Allocate host/commands/secure_env/insecure_fallback_storage.cpp /^bool InsecureFallbackStorage::Allocate(const Json::Value& key, uint16_t size) {$/;" f class:cuttlefish::InsecureFallbackStorage typeref:typename:bool
+AllocateNetworkInterfaces host/commands/assemble_cvd/alloc.cc /^std::optional<IfaceConfig> AllocateNetworkInterfaces() {$/;" f namespace:cuttlefish typeref:typename:std::optional<IfaceConfig>
+AllocateResourceID host/libs/allocd/resource_manager.cpp /^uint32_t ResourceManager::AllocateResourceID() {$/;" f class:cuttlefish::ResourceManager typeref:typename:uint32_t
+AllocateSessionID host/libs/allocd/resource_manager.cpp /^uint32_t ResourceManager::AllocateSessionID() {$/;" f class:cuttlefish::ResourceManager typeref:typename:uint32_t
+AllocateShm host/libs/audio_connector/server.cpp /^ScopedMMap AllocateShm(size_t size, const std::string& name, SharedFD* shm_fd) {$/;" f namespace:cuttlefish::__anon8078843e0111 typeref:typename:ScopedMMap
+Answer host/libs/config/cuttlefish_config.h /^ enum Answer {$/;" g class:cuttlefish::CuttlefishConfig
+Append common/libs/net/netlink_request.h /^ template <typename T> T* Append(const T& data) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:T *
+AppendAad host/commands/secure_env/hmac_serializable.cpp /^std::optional<std::vector<uint8_t>> HmacSerializable::AppendAad($/;" f class:cuttlefish::HmacSerializable typeref:typename:std::optional<std::vector<uint8_t>>
+AppendBinaryRepresentation host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^static void AppendBinaryRepresentation(std::string& buf, const T& data) {$/;" f typeref:typename:void file:
+AppendCommandArguments host/commands/run_cvd/launch_streamer.cpp /^ void AppendCommandArguments(Command& cmd) {$/;" f class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:void file:
+AppendData host/libs/websocket/websocket_handler.cpp /^void AppendData(const char* data, size_t len, std::string& buffer) {$/;" f namespace:cuttlefish::__anon79ba8e560111 typeref:typename:void
+AppendDataIn host/libs/websocket/websocket_handler.cpp /^void DynHandler::AppendDataIn(void* data, size_t len) {$/;" f class:cuttlefish::DynHandler typeref:typename:void
+AppendDataOut host/libs/websocket/websocket_handler.cpp /^void DynHandler::AppendDataOut(const std::string& data) {$/;" f class:cuttlefish::DynHandler typeref:typename:void
+AppendInNetworkByteOrder common/libs/utils/tcp_socket.cpp /^void AppendInNetworkByteOrder(Message* msg, const std::int32_t w) {$/;" f namespace:cuttlefish typeref:typename:void
+AppendInNetworkByteOrder common/libs/utils/tcp_socket.cpp /^void AppendInNetworkByteOrder(Message* msg, const std::string& str) {$/;" f namespace:cuttlefish typeref:typename:void
+AppendInNetworkByteOrder common/libs/utils/tcp_socket.cpp /^void AppendInNetworkByteOrder(Message* msg, const std::uint16_t s) {$/;" f namespace:cuttlefish typeref:typename:void
+AppendInNetworkByteOrder common/libs/utils/tcp_socket.cpp /^void AppendInNetworkByteOrder(Message* msg, const std::uint32_t w) {$/;" f namespace:cuttlefish typeref:typename:void
+AppendInNetworkByteOrder common/libs/utils/tcp_socket.cpp /^void AppendInNetworkByteOrder(Message* msg, const std::uint8_t b) {$/;" f namespace:cuttlefish typeref:typename:void
+AppendNewElement host/commands/modem_simulator/sim_service.cpp /^XMLElement* SimService::SimFileSystem::AppendNewElement(XMLElement* parent,$/;" f class:cuttlefish::SimService::SimFileSystem typeref:typename:XMLElement *
+AppendNewElementWithText host/commands/modem_simulator/sim_service.cpp /^XMLElement* SimService::SimFileSystem::AppendNewElementWithText($/;" f class:cuttlefish::SimService::SimFileSystem typeref:typename:XMLElement *
+AppendPartition host/libs/image_aggregator/image_aggregator.cc /^ void AppendPartition(ImagePartition source) {$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:void file:
+AppendPartition host/libs/image_aggregator/image_aggregator.cc /^ void AppendPartition(MultipleImagePartition source) {$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:void file:
+AppendRaw common/libs/net/netlink_request.cpp /^void* NetlinkRequest::AppendRaw(const void* data, size_t length) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void *
+AppendTag common/libs/net/netlink_request.cpp /^nlattr* NetlinkRequest::AppendTag($/;" f class:cuttlefish::NetlinkRequest typeref:typename:nlattr *
+AppendToBuffer common/libs/confui/packet.h /^void AppendToBuffer(Buffer& buffer, Args&&... args) {$/;" f namespace:cuttlefish::confui::packet::impl typeref:typename:void
+AppendToLastParameter common/libs/utils/subprocess.h /^ void AppendToLastParameter(Args... args) {$/;" f class:cuttlefish::Command typeref:typename:void
+AppendToMessage common/libs/utils/tcp_socket.h /^inline void AppendToMessage(Message*) {}$/;" f namespace:cuttlefish typeref:typename:void
+AppendToMessage common/libs/utils/tcp_socket.h /^void AppendToMessage(Message* msg, T v, Ts... vals) {$/;" f namespace:cuttlefish typeref:typename:void
+AppendVector host/libs/config/bootconfig_args.cpp /^void AppendVector(std::vector<T>* destination, const std::vector<T>& source) {$/;" f namespace:cuttlefish::__anond90bdb570111 typeref:typename:void
+AppendVector host/libs/config/kernel_args.cpp /^void AppendVector(std::vector<T>* destination, const std::vector<T>& source) {$/;" f namespace:cuttlefish::__anonfb53392e0111 typeref:typename:void
+ApplyChanges common/libs/net/network_interface_manager.cpp /^bool NetworkInterfaceManager::ApplyChanges(const NetworkInterface& iface) {$/;" f class:cuttlefish::NetworkInterfaceManager typeref:typename:bool
+Arch common/libs/utils/environment.h /^enum class Arch {$/;" g namespace:cuttlefish
+Archive common/libs/utils/archive.cpp /^Archive::Archive(const std::string& file) : file(file) {$/;" f class:cuttlefish::Archive
+Archive common/libs/utils/archive.h /^class Archive {$/;" c namespace:cuttlefish
+ArgsToString common/libs/confui/utils.h /^std::string ArgsToString(Args&&... args) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ArgsToStringWithDelim common/libs/confui/utils.h /^std::string ArgsToStringWithDelim(Delim&& delim, Args&&... args) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ArgsToVec common/libs/utils/flag_parser.cpp /^std::vector<std::string> ArgsToVec(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:std::vector<std::string>
+ArgumentToBuild host/commands/fetcher/build_api.cc /^Build ArgumentToBuild(BuildApi* build_api, const std::string& arg,$/;" f namespace:cuttlefish typeref:typename:Build
+ArgvForSubprocess host/commands/start/flag_forwarder.cc /^std::vector<std::string> FlagForwarder::ArgvForSubprocess($/;" f class:FlagForwarder typeref:typename:std::vector<std::string>
+Arm common/libs/utils/environment.h /^ Arm,$/;" e enum:cuttlefish::Arch
+Arm64 common/libs/utils/environment.h /^ Arm64,$/;" e enum:cuttlefish::Arch
+Artifact host/commands/fetcher/build_api.cc /^Artifact::Artifact(const Json::Value& json_artifact) {$/;" f class:cuttlefish::Artifact
+Artifact host/commands/fetcher/build_api.h /^ Artifact(const std::string& name) : name(name) {}$/;" f class:cuttlefish::Artifact
+Artifact host/commands/fetcher/build_api.h /^class Artifact {$/;" c namespace:cuttlefish
+ArtifactToFile host/commands/fetcher/build_api.cc /^bool BuildApi::ArtifactToFile(const DeviceBuild& build,$/;" f class:cuttlefish::BuildApi typeref:typename:bool
+ArtifactToFile host/commands/fetcher/build_api.cc /^bool BuildApi::ArtifactToFile(const DirectoryBuild& build,$/;" f class:cuttlefish::BuildApi typeref:typename:bool
+ArtifactToFile host/commands/fetcher/build_api.h /^ bool ArtifactToFile(const Build& build, const std::string& artifact,$/;" f class:cuttlefish::BuildApi typeref:typename:bool
+Artifacts host/commands/fetcher/build_api.cc /^std::vector<Artifact> BuildApi::Artifacts(const DeviceBuild& build) {$/;" f class:cuttlefish::BuildApi typeref:typename:std::vector<Artifact>
+Artifacts host/commands/fetcher/build_api.cc /^std::vector<Artifact> BuildApi::Artifacts(const DirectoryBuild& build) {$/;" f class:cuttlefish::BuildApi typeref:typename:std::vector<Artifact>
+Artifacts host/commands/fetcher/build_api.h /^ std::vector<Artifact> Artifacts(const Build& build) {$/;" f class:cuttlefish::BuildApi typeref:typename:std::vector<Artifact>
+AsBashScript common/libs/utils/subprocess.cpp /^std::string Command::AsBashScript($/;" f class:cuttlefish::Command typeref:typename:std::string
+AsCredentials common/libs/utils/unix_sockets.cpp /^Result<ucred> ControlMessage::AsCredentials() const {$/;" f class:cuttlefish::ControlMessage typeref:typename:Result<ucred>
+AsSharedFDs common/libs/utils/unix_sockets.cpp /^Result<std::vector<SharedFD>> ControlMessage::AsSharedFDs() const {$/;" f class:cuttlefish::ControlMessage typeref:typename:Result<std::vector<SharedFD>>
+AssembleCvdMain host/commands/assemble_cvd/assemble_cvd.cc /^int AssembleCvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+AssemblyPath host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::AssemblyPath(const std::string& file_name) const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+Attach host/libs/wayland/wayland_surface.cpp /^void Surface::Attach(struct wl_resource* buffer) {$/;" f class:wayland::Surface typeref:typename:void
+AttestKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::AttestKey(const AttestKeyRequest& request, AttestKeyResponse* response) {$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+AttestKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::AttestKey(const AttestKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+AudioChannelMap host/libs/audio_connector/shm_layout.h /^enum AudioChannelMap : uint8_t {$/;" g namespace:cuttlefish typeref:typename:uint8_t
+AudioClientConnection host/libs/audio_connector/server.h /^ AudioClientConnection(ScopedMMap tx_shm, ScopedMMap rx_shm,$/;" f class:cuttlefish::AudioClientConnection
+AudioClientConnection host/libs/audio_connector/server.h /^class AudioClientConnection {$/;" c namespace:cuttlefish
+AudioCommand host/libs/audio_connector/commands.h /^ AudioCommand(AudioCommandType type) : type_(type) {}$/;" f class:cuttlefish::AudioCommand
+AudioCommand host/libs/audio_connector/commands.h /^class AudioCommand {$/;" c namespace:cuttlefish
+AudioCommandType host/libs/audio_connector/shm_layout.h /^enum class AudioCommandType : uint32_t {$/;" g namespace:cuttlefish typeref:typename:uint32_t
+AudioDeviceModuleWrapper host/frontend/webrtc/lib/streamer.cpp /^ AudioDeviceModuleWrapper($/;" f class:cuttlefish::webrtc_streaming::__anonab9390d10111::AudioDeviceModuleWrapper file:
+AudioDeviceModuleWrapper host/frontend/webrtc/lib/streamer.cpp /^class AudioDeviceModuleWrapper : public AudioSource {$/;" c namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 file:
+AudioFrameBuffer host/frontend/webrtc/lib/audio_frame_buffer.h /^class AudioFrameBuffer {$/;" c namespace:cuttlefish::webrtc_streaming
+AudioHandler host/frontend/webrtc/audio_handler.cpp /^AudioHandler::AudioHandler($/;" f class:cuttlefish::AudioHandler
+AudioHandler host/frontend/webrtc/audio_handler.h /^class AudioHandler : public AudioServerExecutor {$/;" c namespace:cuttlefish
+AudioJackFeatures host/libs/audio_connector/shm_layout.h /^enum AudioJackFeatures: uint8_t {$/;" g namespace:cuttlefish typeref:typename:uint8_t
+AudioServer host/libs/audio_connector/server.h /^ AudioServer(SharedFD server_socket) : server_socket_(server_socket) {}$/;" f class:cuttlefish::AudioServer
+AudioServer host/libs/audio_connector/server.h /^class AudioServer {$/;" c namespace:cuttlefish
+AudioServerExecutor host/libs/audio_connector/server.h /^class AudioServerExecutor {$/;" c namespace:cuttlefish
+AudioSink host/frontend/webrtc/lib/audio_sink.h /^class AudioSink {$/;" c namespace:cuttlefish::webrtc_streaming
+AudioSource host/frontend/webrtc/lib/audio_source.h /^class AudioSource {$/;" c namespace:cuttlefish::webrtc_streaming
+AudioStatus host/libs/audio_connector/shm_layout.h /^enum class AudioStatus : uint32_t {$/;" g namespace:cuttlefish typeref:typename:uint32_t
+AudioStreamDirection host/libs/audio_connector/shm_layout.h /^enum class AudioStreamDirection : uint8_t {$/;" g namespace:cuttlefish typeref:typename:uint8_t
+AudioStreamFormat host/libs/audio_connector/shm_layout.h /^enum class AudioStreamFormat : uint8_t {$/;" g namespace:cuttlefish typeref:typename:uint8_t
+AudioStreamRate host/libs/audio_connector/shm_layout.h /^enum AudioStreamRate : uint8_t {$/;" g namespace:cuttlefish typeref:typename:uint8_t
+AudioTrackSourceImpl host/frontend/webrtc/lib/audio_track_source_impl.h /^class AudioTrackSourceImpl : public webrtc::AudioSourceInterface {$/;" c namespace:cuttlefish::webrtc_streaming
+AudioTrackSourceImplSinkWrapper host/frontend/webrtc/lib/audio_track_source_impl.h /^ AudioTrackSourceImplSinkWrapper(rtc::scoped_refptr<AudioTrackSourceImpl> obj)$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImplSinkWrapper
+AudioTrackSourceImplSinkWrapper host/frontend/webrtc/lib/audio_track_source_impl.h /^class AudioTrackSourceImplSinkWrapper : public AudioSink {$/;" c namespace:cuttlefish::webrtc_streaming
+Available devices ↻ host/frontend/webrtc_operator/assets/index.html /^ <h1>Available devices <span id='refresh-list'>↻<\/span><\/h1>$/;" h
+AvailableConfigs host/libs/config/config_flag.cpp /^ const std::set<std::string>& AvailableConfigs() const {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:const std::set<std::string> & file:
+AvailableFilesReport host/commands/start/filesystem_explorer.cc /^cuttlefish::FetcherConfig AvailableFilesReport() {$/;" f typeref:typename:cuttlefish::FetcherConfig
+AvailableSpaceAtPath host/commands/assemble_cvd/disk_flags.cc /^static uint64_t AvailableSpaceAtPath(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:uint64_t file:
+BAND_MODE_10_800M_2 guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_10_800M_2 = 15, \/\/"Band Class 10" (Secondary 800-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_5_450M guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_5_450M = 10, \/\/"Band Class 5" (450-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_7_700M_2 guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_7_700M_2 = 12, \/\/"Band Class 7" (Upper 700-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_8_1800M guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_8_1800M = 13, \/\/"Band Class 8" (1800-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_9_900M guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_9_900M = 14, \/\/"Band Class 9" (900-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_AUS guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_AUS = 4, \/\/"AUS band" (GSM-900 \/ DCS-1800 \/ WCDMA-850 \/ WCDMA-IM/;" e enum:__anon0bfbaecf0703
+BAND_MODE_AUS_2 guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_AUS_2 = 5, \/\/"AUS band 2" (GSM-900 \/ DCS-1800 \/ WCDMA-850)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_AWS guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_AWS = 17, \/\/"Band Class 15" (AWS Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_CELL_800 guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_CELL_800 = 6, \/\/"Cellular" (800-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_EURO guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_EURO = 1, \/\/"EURO band" (GSM-900 \/ DCS-1800 \/ WCDMA-IMT-2000)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_EURO_PAMR_400M guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_EURO_PAMR_400M = 16, \/\/"Band Class 11" (400-MHz European PAMR Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_IMT2000 guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_IMT2000 = 11, \/\/"Band Class 6" (2-GMHz IMT2000 Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_JPN guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_JPN = 3, \/\/"JPN band" (WCDMA-800 \/ WCDMA-IMT-2000)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_JTACS guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_JTACS = 8, \/\/"Band Class 3" (JTACS Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_KOREA_PCS guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_KOREA_PCS = 9, \/\/"Band Class 4" (Korean PCS Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_PCS guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_PCS = 7, \/\/"PCS" (1900-MHz Band)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_UNSPECIFIED = 0, \/\/"unspecified" (selected by baseband automatically)$/;" e enum:__anon0bfbaecf0703
+BAND_MODE_USA guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_USA = 2, \/\/"US band" (GSM-850 \/ PCS-1900 \/ WCDMA-850 \/ WCDMA-PCS/;" e enum:__anon0bfbaecf0703
+BAND_MODE_USA_2500M guest/hals/ril/reference-libril/ril.h /^ BAND_MODE_USA_2500M = 18 \/\/"Band Class 16" (US 2.5-GHz Band)$/;" e enum:__anon0bfbaecf0703
+BCDToString host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::BCDToString(std::string& data) {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+BLOCK_SIZE host/commands/secure_env/encrypted_serializable.cpp /^static constexpr uint32_t BLOCK_SIZE = 16;$/;" v namespace:cuttlefish typeref:typename:uint32_t file:
+BLUETOOTH_PROCESS guest/hals/ril/reference-libril/ril.cpp /^#define BLUETOOTH_PROCESS /;" d file:
+BOARD_AVB_ALGORITHM shared/BoardConfig.mk /^BOARD_AVB_ALGORITHM := SHA256_RSA4096$/;" m
+BOARD_AVB_BOOT_ALGORITHM shared/BoardConfig.mk /^BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096$/;" m
+BOARD_AVB_BOOT_KEY_PATH shared/BoardConfig.mk /^BOARD_AVB_BOOT_KEY_PATH := external\/avb\/test\/data\/testkey_rsa4096.pem$/;" m
+BOARD_AVB_BOOT_ROLLBACK_INDEX shared/BoardConfig.mk /^BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)$/;" m
+BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION shared/BoardConfig.mk /^BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2$/;" m
+BOARD_AVB_ENABLE shared/BoardConfig.mk /^BOARD_AVB_ENABLE := true$/;" m
+BOARD_AVB_KEY_PATH shared/BoardConfig.mk /^BOARD_AVB_KEY_PATH := external\/avb\/test\/data\/testkey_rsa4096.pem$/;" m
+BOARD_AVB_VBMETA_SYSTEM shared/BoardConfig.mk /^BOARD_AVB_VBMETA_SYSTEM := product system system_ext$/;" m
+BOARD_AVB_VBMETA_SYSTEM_ALGORITHM shared/BoardConfig.mk /^BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA4096$/;" m
+BOARD_AVB_VBMETA_SYSTEM_KEY_PATH shared/BoardConfig.mk /^BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external\/avb\/test\/data\/testkey_rsa4096.pem$/;" m
+BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX shared/BoardConfig.mk /^BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)$/;" m
+BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION shared/BoardConfig.mk /^BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1$/;" m
+BOARD_BOOTIMAGE_MAX_SIZE shared/BoardConfig.mk /^BOARD_BOOTIMAGE_MAX_SIZE := 8388608$/;" m
+BOARD_BOOTIMAGE_PARTITION_SIZE shared/BoardConfig.mk /^BOARD_BOOTIMAGE_PARTITION_SIZE := 67108864$/;" m
+BOARD_BOOTLOADER_IN_UPDATE_PACKAGE shared/BoardConfig.mk /^BOARD_BOOTLOADER_IN_UPDATE_PACKAGE := true$/;" m
+BOARD_BOOT_HEADER_VERSION shared/BoardConfig.mk /^BOARD_BOOT_HEADER_VERSION := 4$/;" m
+BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT shared/BoardConfig.mk /^BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT := true$/;" m
+BOARD_BUILD_SYSTEM_ROOT_IMAGE shared/BoardConfig.mk /^BOARD_BUILD_SYSTEM_ROOT_IMAGE := false$/;" m
+BOARD_DISK_IMAGE_MINIMUM_SIZE shared/BoardConfig.mk /^BOARD_DISK_IMAGE_MINIMUM_SIZE := 10737418240$/;" m
+BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE shared/BoardConfig.mk /^ BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true$/;" m
+BOARD_FLASH_BLOCK_SIZE shared/BoardConfig.mk /^BOARD_FLASH_BLOCK_SIZE := 512$/;" m
+BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD shared/BoardConfig.mk /^BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko$/;" m
+BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST shared/BoardConfig.mk /^BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := product system system_ext$/;" m
+BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_SIZE shared/BoardConfig.mk /^BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_SIZE := 5771362304 # 5.375GiB$/;" m
+BOARD_GOOGLE_VENDOR_DYNAMIC_PARTITIONS_PARTITION_LIST shared/BoardConfig.mk /^BOARD_GOOGLE_VENDOR_DYNAMIC_PARTITIONS_PARTITION_LIST := odm vendor vendor_dlkm odm_dlkm$/;" m
+BOARD_GOOGLE_VENDOR_DYNAMIC_PARTITIONS_SIZE shared/BoardConfig.mk /^BOARD_GOOGLE_VENDOR_DYNAMIC_PARTITIONS_SIZE := 1472200704$/;" m
+BOARD_GPU_DRIVERS shared/BoardConfig.mk /^BOARD_GPU_DRIVERS := virgl$/;" m
+BOARD_HAVE_BLUETOOTH shared/BoardConfig.mk /^BOARD_HAVE_BLUETOOTH := true$/;" m
+BOARD_HOSTAPD_DRIVER shared/BoardConfig.mk /^BOARD_HOSTAPD_DRIVER := NL80211$/;" m
+BOARD_HOSTAPD_PRIVATE_LIB shared/BoardConfig.mk /^BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_simulated_cf$/;" m
+BOARD_INCLUDE_DTB_IN_BOOTIMG shared/BoardConfig.mk /^BOARD_INCLUDE_DTB_IN_BOOTIMG := true$/;" m
+BOARD_IS_AUTOMOTIVE shared/auto/device.mk /^BOARD_IS_AUTOMOTIVE := true$/;" m
+BOARD_MALLOC_ALIGNMENT shared/BoardConfig.mk /^BOARD_MALLOC_ALIGNMENT := 16$/;" m
+BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT shared/BoardConfig.mk /^BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true$/;" m
+BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT shared/BoardConfig.mk /^ BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true$/;" m
+BOARD_ODMIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_ODMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)$/;" m
+BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4$/;" m
+BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST shared/BoardConfig.mk /^BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST := product system system_ext vbmeta_system$/;" m
+BOARD_PREBUILT_BOOTLOADER vsoc_arm64/bootloader.mk /^BOARD_PREBUILT_BOOTLOADER := \\$/;" m
+BOARD_PREBUILT_BOOTLOADER vsoc_arm_only/bootloader.mk /^BOARD_PREBUILT_BOOTLOADER := \\$/;" m
+BOARD_PREBUILT_BOOTLOADER vsoc_x86_64/bootloader.mk /^BOARD_PREBUILT_BOOTLOADER := \\$/;" m
+BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)$/;" m
+BOARD_RAMDISK_USE_LZ4 shared/BoardConfig.mk /^BOARD_RAMDISK_USE_LZ4 := true$/;" m
+BOARD_RECOVERYIMAGE_PARTITION_SIZE shared/BoardConfig.mk /^BOARD_RECOVERYIMAGE_PARTITION_SIZE := 67108864$/;" m
+BOARD_SUPER_IMAGE_IN_UPDATE_PACKAGE shared/BoardConfig.mk /^BOARD_SUPER_IMAGE_IN_UPDATE_PACKAGE := true$/;" m
+BOARD_SUPER_PARTITION_GROUPS shared/BoardConfig.mk /^BOARD_SUPER_PARTITION_GROUPS := google_system_dynamic_partitions google_vendor_dynamic_partition/;" m
+BOARD_SUPER_PARTITION_SIZE shared/BoardConfig.mk /^BOARD_SUPER_PARTITION_SIZE := 7516192768 # 7GiB$/;" m
+BOARD_SYSLOADER_MAX_SIZE shared/BoardConfig.mk /^BOARD_SYSLOADER_MAX_SIZE := 7340032$/;" m
+BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)$/;" m
+BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)$/;" m
+BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := $(TARGET_USERDATAIMAGE_FILE_SYSTEM_TYPE)$/;" m
+BOARD_USERDATAIMAGE_PARTITION_SIZE shared/BoardConfig.mk /^BOARD_USERDATAIMAGE_PARTITION_SIZE := $(TARGET_USERDATAIMAGE_PARTITION_SIZE)$/;" m
+BOARD_USES_GENERIC_AUDIO shared/BoardConfig.mk /^BOARD_USES_GENERIC_AUDIO := false$/;" m
+BOARD_USES_GENERIC_KERNEL_IMAGE shared/BoardConfig.mk /^BOARD_USES_GENERIC_KERNEL_IMAGE := true$/;" m
+BOARD_USES_METADATA_PARTITION shared/BoardConfig.mk /^BOARD_USES_METADATA_PARTITION := true$/;" m
+BOARD_USES_ODMIMAGE shared/BoardConfig.mk /^BOARD_USES_ODMIMAGE := true$/;" m
+BOARD_USES_ODM_DLKMIMAGE shared/BoardConfig.mk /^BOARD_USES_ODM_DLKMIMAGE := true$/;" m
+BOARD_USES_PRODUCTIMAGE shared/BoardConfig.mk /^BOARD_USES_PRODUCTIMAGE := true$/;" m
+BOARD_USES_SYSTEM_EXTIMAGE shared/BoardConfig.mk /^BOARD_USES_SYSTEM_EXTIMAGE := true$/;" m
+BOARD_USES_VENDORIMAGE shared/BoardConfig.mk /^BOARD_USES_VENDORIMAGE := true$/;" m
+BOARD_USES_VENDOR_DLKMIMAGE shared/BoardConfig.mk /^BOARD_USES_VENDOR_DLKMIMAGE := true$/;" m
+BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)$/;" m
+BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE shared/BoardConfig.mk /^BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE := 67108864$/;" m
+BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE shared/BoardConfig.mk /^BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4$/;" m
+BOARD_WLAN_DEVICE shared/BoardConfig.mk /^BOARD_WLAN_DEVICE := emulator$/;" m
+BOARD_WLAN_DEVICE shared/BoardConfig.mk /^BOARD_WLAN_DEVICE := wlan0$/;" m
+BOARD_WPA_SUPPLICANT_DRIVER shared/BoardConfig.mk /^BOARD_WPA_SUPPLICANT_DRIVER := NL80211$/;" m
+BOARD_WPA_SUPPLICANT_PRIVATE_LIB shared/BoardConfig.mk /^BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_simulated_cf$/;" m
+BOOL_TO_INT guest/hals/ril/reference-libril/ril_service.cpp /^#define BOOL_TO_INT(/;" d file:
+BOOTLOADER_BUILD host/libs/config/fetcher_config.h /^ BOOTLOADER_BUILD,$/;" e enum:cuttlefish::FileSource
+BOOT_SECURITY_PATCH shared/device.mk /^BOOT_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)$/;" m
+BUFF_SIZE common/libs/fs/shared_buf.cc /^const size_t BUFF_SIZE = 1 << 14;$/;" v namespace:cuttlefish::__anoncf090a650111 typeref:typename:const size_t
+BUILD_API host/commands/fetcher/build_api.cc /^const std::string BUILD_API =$/;" v namespace:cuttlefish::__anon948178400111 typeref:typename:const std::string
+BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES vsoc_x86/BoardConfig.mk /^BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES := true$/;" m
+BUILD_EMULATOR_OPENGL shared/BoardConfig.mk /^BUILD_EMULATOR_OPENGL := true$/;" m
+BUILD_EMULATOR_OPENGL_DRIVER shared/BoardConfig.mk /^BUILD_EMULATOR_OPENGL_DRIVER := true$/;" m
+BYTE host/libs/confui/sign.cc /^ BYTE = 165 \/* 0xA5 *\/,$/;" e enum:cuttlefish::confui::TestKeyBits file:
+BYTE_STRING host/libs/confui/cbor.h /^ BYTE_STRING = 2,$/;" e enum:cuttlefish::confui::Cbor::Type
+BackToPool host/frontend/webrtc/cvd_video_frame_buffer.cpp /^void BackToPool(std::vector<uint8_t> item) {$/;" f namespace:cuttlefish::__anonfb30483e0111 typeref:typename:void
+BadMessage host/libs/audio_connector/buffers.h /^ BadMessage,$/;" e enum:cuttlefish::Status
+BadRequest host/libs/websocket/websocket_handler.h /^ BadRequest = 400,$/;" e enum:cuttlefish::HttpStatusCode
+BaseDependencyTag build/cvd-host-package.go /^ blueprint.BaseDependencyTag$/;" M struct:cuttlefish.dependencyTag typeref:typename:blueprint.BaseDependencyTag
+Bases host/commands/run_cvd/launch.cc /^ using Bases = Multi::Bases<CommandSource, DiagnosticInformation, Feature>;$/;" t function:cuttlefish::launchComponent typeref:typename:Multi::Bases<CommandSource,DiagnosticInformation,Feature> file:
+Bases host/libs/config/inject.h /^ struct Bases {$/;" s struct:cuttlefish::Multibindings
+BeforeSelect host/commands/kernel_log_monitor/kernel_log_server.cc /^void KernelLogServer::BeforeSelect(cuttlefish::SharedFDSet* fd_read) const {$/;" f class:monitor::KernelLogServer typeref:typename:void
+BeginOperation guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::BeginOperation(const BeginOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+BeginOperation guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::BeginOperation(const BeginOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+Beginning host/libs/image_aggregator/image_aggregator.cc /^ GptBeginning Beginning() const {$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:GptBeginning file:
+Bind common/libs/fs/shared_fd.cpp /^int FileInstance::Bind(const struct sockaddr* addr, socklen_t addrlen) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+BindCompositorInterface host/libs/wayland/wayland_compositor.cpp /^void BindCompositorInterface(wl_display* display, Surfaces* surfaces) {$/;" f namespace:wayland typeref:typename:void
+BindDmabufInterface host/libs/wayland/wayland_dmabuf.cpp /^void BindDmabufInterface(wl_display* display) {$/;" f namespace:wayland typeref:typename:void
+BindSeatInterface host/libs/wayland/wayland_seat.cpp /^void BindSeatInterface(wl_display* display) {$/;" f namespace:wayland typeref:typename:void
+BindShellInterface host/libs/wayland/wayland_shell.cpp /^void BindShellInterface(wl_display* display) {$/;" f namespace:wayland typeref:typename:void
+BindSubcompositorInterface host/libs/wayland/wayland_subcompositor.cpp /^void BindSubcompositorInterface(wl_display* display) {$/;" f namespace:wayland typeref:typename:void
+BindVirtioGpuMetadataInterface host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^void BindVirtioGpuMetadataInterface(wl_display* display, Surfaces* surfaces) {$/;" f namespace:wayland typeref:typename:void
+BitsPerSample host/frontend/webrtc/audio_handler.cpp /^int BitsPerSample(uint8_t virtio_format) {$/;" f namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:int
+Bluetooth Console host/frontend/webrtc_operator/assets/client.html /^ <h2>Bluetooth Console<\/h2>$/;" i
+BluetoothChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^BluetoothChannelHandler::BluetoothChannelHandler($/;" f class:cuttlefish::webrtc_streaming::BluetoothChannelHandler
+BluetoothChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^class BluetoothChannelHandler : public webrtc::DataChannelObserver {$/;" c namespace:cuttlefish::webrtc_streaming file:
+BluetoothChecker guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^ public BluetoothChecker(Context context) {$/;" m class:BluetoothChecker
+BluetoothChecker guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^public class BluetoothChecker extends JobBase {$/;" c
+BluetoothConnector host/commands/run_cvd/launch.cc /^class BluetoothConnector : public CommandSource {$/;" c namespace:cuttlefish file:
+BluetoothDeathRecipient guest/hals/bt/remote/remote_bluetooth.cpp /^ BluetoothDeathRecipient(const sp<IBluetoothHci> hci) : mHci(hci) {}$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothDeathRecipient file:
+BluetoothDeathRecipient guest/hals/bt/remote/remote_bluetooth.cpp /^class BluetoothDeathRecipient : public hidl_death_recipient {$/;" c namespace:android::hardware::bluetooth::V1_1::remote file:
+BluetoothHandler host/frontend/webrtc/bluetooth_handler.cpp /^BluetoothHandler::BluetoothHandler($/;" f class:cuttlefish::webrtc_streaming::BluetoothHandler
+BluetoothHandler host/frontend/webrtc/bluetooth_handler.h /^struct BluetoothHandler {$/;" s namespace:cuttlefish::webrtc_streaming
+BluetoothHci guest/hals/bt/remote/remote_bluetooth.cpp /^BluetoothHci::BluetoothHci(const std::string& dev_path)$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci
+BluetoothHci guest/hals/bt/remote/remote_bluetooth.h /^class BluetoothHci : public IBluetoothHci {$/;" c namespace:android::hardware::bluetooth::V1_1::remote
+Boost shared/config/task_profiles.json /^ "Boost": "0",$/;" s object:Profiles.27.Actions.0.Params
+Boost shared/config/task_profiles.json /^ "Boost": "50%",$/;" s object:Profiles.26.Actions.0.Params
+BootCompleted host/commands/kernel_log_monitor/kernel_log_server.h /^ BootCompleted = 1,$/;" e enum:monitor::Event
+BootCompleted host/commands/run_cvd/boot_state_machine.cc /^ bool BootCompleted() const { return state_ & kGuestBootCompleted; }$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:bool file:
+BootFailed host/commands/kernel_log_monitor/kernel_log_server.h /^ BootFailed = 2,$/;" e enum:monitor::Event
+BootFailed host/commands/run_cvd/boot_state_machine.cc /^ bool BootFailed() const { return state_ & kGuestBootFailed; }$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:bool file:
+BootImageRepacker host/commands/assemble_cvd/disk_flags.cc /^class BootImageRepacker : public Feature {$/;" c namespace:cuttlefish file:
+BootStarted host/commands/kernel_log_monitor/kernel_log_server.h /^ BootStarted = 0,$/;" e enum:monitor::Event
+BootconfigArgsFromConfig host/libs/config/bootconfig_args.cpp /^std::vector<std::string> BootconfigArgsFromConfig($/;" f namespace:cuttlefish typeref:typename:std::vector<std::string>
+Boundary host/libs/confui/host_renderer.h /^ struct Boundary { \/\/ inclusive but.. LayoutElement's size is float$/;" s class:cuttlefish::confui::ConfUiRenderer
+BringUpIface host/libs/allocd/alloc_utils.cpp /^bool BringUpIface(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+BroadcastAddress common/libs/net/network_interface.h /^ const std::string& BroadcastAddress() const {$/;" f class:cuttlefish::NetworkInterface typeref:typename:const std::string &
+BroadcastConfig host/commands/modem_simulator/sms_service.h /^ struct BroadcastConfig {$/;" s class:cuttlefish::SmsService
+BufferType common/libs/confui/packet_types.h /^using BufferType = std::vector<std::uint8_t>;$/;" t namespace:cuttlefish::confui::packet typeref:typename:std::vector<std::uint8_t>
+Build host/commands/fetcher/build_api.h /^using Build = std::variant<DeviceBuild, DirectoryBuild>;$/;" t namespace:cuttlefish typeref:typename:std::variant<DeviceBuild,DirectoryBuild>
+Build host/frontend/webrtc_operator/client_handler.cpp /^std::shared_ptr<WebSocketHandler> ClientWSHandlerFactory::Build(struct lws* wsi) {$/;" f class:cuttlefish::ClientWSHandlerFactory typeref:typename:std::shared_ptr<WebSocketHandler>
+Build host/frontend/webrtc_operator/device_handler.cpp /^std::shared_ptr<WebSocketHandler> DeviceHandlerFactory::Build(struct lws* wsi) {$/;" f class:cuttlefish::DeviceHandlerFactory typeref:typename:std::shared_ptr<WebSocketHandler>
+BuildAddrRequest common/libs/net/network_interface_manager.cpp /^NetlinkRequest BuildAddrRequest($/;" f namespace:cuttlefish::__anon72e4bdb10111 typeref:typename:NetlinkRequest
+BuildApi host/commands/fetcher/build_api.cc /^BuildApi::BuildApi(CurlWrapper& curl, CredentialSource* credential_source)$/;" f class:cuttlefish::BuildApi
+BuildApi host/commands/fetcher/build_api.h /^class BuildApi {$/;" c namespace:cuttlefish
+BuildConfigImpl host/commands/modem_simulator/nvram_config.cpp /^NvramConfig* NvramConfig::BuildConfigImpl(size_t num_instances, int sim_type) {$/;" f class:cuttlefish::NvramConfig typeref:typename:NvramConfig *
+BuildConfigImpl host/libs/config/cuttlefish_config.cpp /^\/*static*\/ CuttlefishConfig* CuttlefishConfig::BuildConfigImpl() {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:CuttlefishConfig *
+BuildLinkRequest common/libs/net/network_interface_manager.cpp /^NetlinkRequest BuildLinkRequest($/;" f namespace:cuttlefish::__anon72e4bdb10111 typeref:typename:NetlinkRequest
+BuildParameter common/libs/utils/subprocess.cpp /^void Command::BuildParameter(std::stringstream* stream, SharedFD shared_fd) {$/;" f class:cuttlefish::Command typeref:typename:void
+BuildParameter common/libs/utils/subprocess.h /^ void BuildParameter(std::stringstream* stream, T t) {$/;" f class:cuttlefish::Command typeref:typename:void
+BuildParameter common/libs/utils/subprocess.h /^ void BuildParameter(std::stringstream* stream, T t, Args... args) {$/;" f class:cuttlefish::Command typeref:typename:void
+BuildProtectedDataPayload host/commands/secure_env/tpm_remote_provisioning_context.cpp /^TpmRemoteProvisioningContext::BuildProtectedDataPayload($/;" f class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:ErrMsgOr<std::vector<uint8_t>>
+BuildStatus host/commands/fetcher/build_api.cc /^std::string BuildApi::BuildStatus(const DeviceBuild& build) {$/;" f class:cuttlefish::BuildApi typeref:typename:std::string
+BuildSuperImage host/commands/assemble_cvd/super_image_mixer.cc /^bool BuildSuperImage(const std::string& combined_target_zip,$/;" f namespace:cuttlefish::__anonae6530d30111 typeref:typename:bool
+BuiltInAECIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::BuiltInAECIsAvailable() const { return false; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+BuiltInAGCIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::BuiltInAGCIsAvailable() const { return false; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+BuiltInNSIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::BuiltInNSIsAvailable() const { return false; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+ByteBufferProxy host/libs/confui/sign_utils.h /^ ByteBufferProxy($/;" f class:cuttlefish::confui::support::ByteBufferProxy
+ByteBufferProxy host/libs/confui/sign_utils.h /^ ByteBufferProxy() : data_(nullptr), size_(0) {}$/;" f class:cuttlefish::confui::support::ByteBufferProxy
+ByteBufferProxy host/libs/confui/sign_utils.h /^ ByteBufferProxy(const char (&buffer)[size])$/;" f class:cuttlefish::confui::support::ByteBufferProxy
+ByteBufferProxy host/libs/confui/sign_utils.h /^ ByteBufferProxy(const uint8_t (&buffer)[size]) : data_(buffer), size_(size) {}$/;" f class:cuttlefish::confui::support::ByteBufferProxy
+ByteBufferProxy host/libs/confui/sign_utils.h /^class ByteBufferProxy {$/;" c namespace:cuttlefish::confui::support
+ByteVecToString common/libs/confui/protocol_types.cpp /^static std::string ByteVecToString(const std::vector<T>& v) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string file:
+BytesPerPixel host/libs/screen_connector/screen_connector_common.h /^ static constexpr std::uint32_t BytesPerPixel() { return 4; }$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+CALL_FAIL_ACCESS_CLASS_BLOCKED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_ACCESS_CLASS_BLOCKED = 260, \/* Access class barring *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_ACCESS_INFORMATION_DISCARDED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_ACCESS_INFORMATION_DISCARDED = 43,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_ACM_LIMIT_EXCEEDED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_ACM_LIMIT_EXCEEDED = 68,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_BEARER_CAPABILITY_NOT_AUTHORIZED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_BEARER_CAPABILITY_NOT_AUTHORIZED = 57,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_BEARER_CAPABILITY_UNAVAILABLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_BEARER_CAPABILITY_UNAVAILABLE = 58,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_BEARER_SERVICE_NOT_IMPLEMENTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_BEARER_SERVICE_NOT_IMPLEMENTED = 65,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_BUSY guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_BUSY = 17,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CALL_BARRED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CALL_BARRED = 240,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CALL_REJECTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CALL_REJECTED = 21,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_ACCESS_BLOCKED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_ACCESS_BLOCKED = 1009, \/* CDMA network access probes blocked *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_ACCESS_FAILURE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_ACCESS_FAILURE = 1006,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_DROP guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_DROP = 1001,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_INTERCEPT guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_INTERCEPT = 1002,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_LOCKED_UNTIL_POWER_CYCLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_NOT_EMERGENCY guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_NOT_EMERGENCY = 1008, \/* For non-emergency number dialed$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_PREEMPTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_PREEMPTED = 1007,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_REORDER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_REORDER = 1003,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_RETRY_ORDER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_RETRY_ORDER = 1005,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CDMA_SO_REJECT guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CDMA_SO_REJECT = 1004,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CHANNEL_UNACCEPTABLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CHANNEL_UNACCEPTABLE = 6,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CONDITIONAL_IE_ERROR guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CONDITIONAL_IE_ERROR = 100,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_CONGESTION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_CONGESTION = 34,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_DESTINATION_OUT_OF_ORDER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_DESTINATION_OUT_OF_ORDER = 27,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_DIAL_MODIFIED_TO_DIAL guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_DIAL_MODIFIED_TO_DIAL = 246,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_DIAL_MODIFIED_TO_SS guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_DIAL_MODIFIED_TO_SS = 245,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_DIAL_MODIFIED_TO_USSD guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_DIAL_MODIFIED_TO_USSD = 244, \/* STK Call Control *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_ERROR_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_ERROR_UNSPECIFIED = 0xffff \/* This error will be deprecated soon,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_FACILITY_REJECTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_FACILITY_REJECTED = 29,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_FDN_BLOCKED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_FDN_BLOCKED = 241,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_IMEI_NOT_ACCEPTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_IMEI_NOT_ACCEPTED = 243,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_IMSI_UNKNOWN_IN_VLR guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_IMSI_UNKNOWN_IN_VLR = 242,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INCOMING_CALLS_BARRED_WITHIN_CUG guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INCOMING_CALLS_BARRED_WITHIN_CUG = 55,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INCOMPATIBLE_DESTINATION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INCOMPATIBLE_DESTINATION = 88,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INFORMATION_ELEMENT_NON_EXISTENT guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INFORMATION_ELEMENT_NON_EXISTENT = 99,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INTERWORKING_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INTERWORKING_UNSPECIFIED = 127,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INVALID_MANDATORY_INFORMATION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INVALID_MANDATORY_INFORMATION = 96,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INVALID_NUMBER_FORMAT guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INVALID_NUMBER_FORMAT = 28,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INVALID_TRANSACTION_IDENTIFIER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INVALID_TRANSACTION_IDENTIFIER = 81,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_INVALID_TRANSIT_NW_SELECTION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_INVALID_TRANSIT_NW_SELECTION = 91,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 101,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_MESSAGE_TYPE_NON_IMPLEMENTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_MESSAGE_TYPE_NON_IMPLEMENTED = 97,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 98,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NETWORK_DETACH guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NETWORK_DETACH = 261, \/* Explicit network detach *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NETWORK_OUT_OF_ORDER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NETWORK_OUT_OF_ORDER = 38,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NETWORK_REJECT guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NETWORK_REJECT = 252, \/* Explicit network reject *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NETWORK_RESP_TIMEOUT guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NETWORK_RESP_TIMEOUT = 251, \/* No response from network *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NORMAL guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NORMAL = 16,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NORMAL_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NORMAL_UNSPECIFIED = 31,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NO_ANSWER_FROM_USER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NO_ANSWER_FROM_USER = 19,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NO_ROUTE_TO_DESTINATION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NO_ROUTE_TO_DESTINATION = 3,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NO_USER_RESPONDING guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NO_USER_RESPONDING = 18,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NO_VALID_SIM guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NO_VALID_SIM = 249, \/* No valid SIM is present *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_NUMBER_CHANGED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_NUMBER_CHANGED = 22,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_1 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_1 = 0xf001,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_10 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_10 = 0xf00a,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_11 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_11 = 0xf00b,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_12 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_12 = 0xf00c,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_13 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_13 = 0xf00d,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_14 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_14 = 0xf00e,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_15 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_15 = 0xf00f,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_2 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_2 = 0xf002,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_3 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_3 = 0xf003,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_4 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_4 = 0xf004,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_5 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_5 = 0xf005,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_6 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_6 = 0xf006,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_7 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_7 = 0xf007,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_8 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_8 = 0xf008,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OEM_CAUSE_9 guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OEM_CAUSE_9 = 0xf009,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE = 70,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OPERATOR_DETERMINED_BARRING guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OPERATOR_DETERMINED_BARRING = 8,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_OUT_OF_SERVICE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_OUT_OF_SERVICE = 248, \/* No cellular coverage *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_PREEMPTION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_PREEMPTION = 25,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_PROTOCOL_ERROR_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_PROTOCOL_ERROR_UNSPECIFIED = 111,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_QOS_UNAVAILABLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_QOS_UNAVAILABLE = 49,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_ACCESS_FAILURE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_ACCESS_FAILURE = 253, \/* RRC connection failure. Eg.RACH *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_INTERNAL_ERROR guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_INTERNAL_ERROR = 250, \/* Internal error at Modem *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_LINK_FAILURE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_LINK_FAILURE = 254, \/* Radio Link Failure *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_LINK_LOST guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_LINK_LOST = 255, \/* Radio link lost due to poor coverage *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_OFF guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_OFF = 247, \/* Radio is OFF *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_RELEASE_ABNORMAL guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_RELEASE_ABNORMAL = 259, \/* RRC connection release, abnormal *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_RELEASE_NORMAL guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_RELEASE_NORMAL = 258, \/* RRC connection release, normal *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_SETUP_FAILURE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_SETUP_FAILURE = 257, \/* RRC connection setup failure *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RADIO_UPLINK_FAILURE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RADIO_UPLINK_FAILURE = 256, \/* Radio uplink failure *\/$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RECOVERY_ON_TIMER_EXPIRED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RECOVERY_ON_TIMER_EXPIRED = 102,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE = 44,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_REQUESTED_FACILITY_NOT_IMPLEMENTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_REQUESTED_FACILITY_NOT_IMPLEMENTED = 69,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_REQUESTED_FACILITY_NOT_SUBSCRIBED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_REQUESTED_FACILITY_NOT_SUBSCRIBED = 50,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RESOURCES_UNAVAILABLE_OR_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 47,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_RESP_TO_STATUS_ENQUIRY guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_RESP_TO_STATUS_ENQUIRY = 30,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_SEMANTICALLY_INCORRECT_MESSAGE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_SEMANTICALLY_INCORRECT_MESSAGE = 95,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_SERVICE_OPTION_NOT_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_SERVICE_OPTION_NOT_AVAILABLE = 63,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_SERVICE_OR_OPTION_NOT_IMPLEMENTED guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_SERVICE_OR_OPTION_NOT_IMPLEMENTED = 79,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_SWITCHING_EQUIPMENT_CONGESTION guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_SWITCHING_EQUIPMENT_CONGESTION = 42,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_TEMPORARY_FAILURE guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_TEMPORARY_FAILURE = 41,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_UNOBTAINABLE_NUMBER guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_UNOBTAINABLE_NUMBER = 1,$/;" e enum:__anon0bfbaecf2d03
+CALL_FAIL_USER_NOT_MEMBER_OF_CUG guest/hals/ril/reference-libril/ril.h /^ CALL_FAIL_USER_NOT_MEMBER_OF_CUG = 87,$/;" e enum:__anon0bfbaecf2d03
+CALL_ONREQUEST guest/hals/ril/reference-libril/ril_config.cpp /^#define CALL_ONREQUEST(/;" d file:
+CALL_ONREQUEST guest/hals/ril/reference-libril/ril_service.cpp /^#define CALL_ONREQUEST(/;" d file:
+CALL_ONSTATEREQUEST guest/hals/ril/reference-libril/ril_config.cpp /^#define CALL_ONSTATEREQUEST(/;" d file:
+CALL_ONSTATEREQUEST guest/hals/ril/reference-libril/ril_service.cpp /^#define CALL_ONSTATEREQUEST(/;" d file:
+CALL_STATE_ACTIVE host/commands/modem_simulator/call_service.h /^ CALL_STATE_ACTIVE = 0,$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CALL_STATE_ALERTING host/commands/modem_simulator/call_service.h /^ CALL_STATE_ALERTING,$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CALL_STATE_DIALING host/commands/modem_simulator/call_service.h /^ CALL_STATE_DIALING,$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CALL_STATE_HANGUP host/commands/modem_simulator/call_service.h /^ CALL_STATE_HANGUP$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CALL_STATE_HELD host/commands/modem_simulator/call_service.h /^ CALL_STATE_HELD,$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CALL_STATE_INCOMING host/commands/modem_simulator/call_service.h /^ CALL_STATE_INCOMING,$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CALL_STATE_WAITING host/commands/modem_simulator/call_service.h /^ CALL_STATE_WAITING,$/;" e enum:cuttlefish::CallService::CallStatus::CallState
+CAPABILITY common/libs/concurrency/thread_annotations.h /^#define CAPABILITY(/;" d
+CATEGORY_AIEC guest/hals/ril/reference-libril/ril.h /^ CATEGORY_AIEC = 1 << 6, \/* Automatically Initiated eCall (AIeC) *\/$/;" e enum:__anon0bfbaecfb403
+CATEGORY_AMBULANCE guest/hals/ril/reference-libril/ril.h /^ CATEGORY_AMBULANCE = 1 << 1,$/;" e enum:__anon0bfbaecfb403
+CATEGORY_FIRE_BRIGADE guest/hals/ril/reference-libril/ril.h /^ CATEGORY_FIRE_BRIGADE = 1 << 2,$/;" e enum:__anon0bfbaecfb403
+CATEGORY_MARINE_GUARD guest/hals/ril/reference-libril/ril.h /^ CATEGORY_MARINE_GUARD = 1 << 3,$/;" e enum:__anon0bfbaecfb403
+CATEGORY_MIEC guest/hals/ril/reference-libril/ril.h /^ CATEGORY_MIEC = 1 << 5, \/* Manually Initiated eCall (MIeC) *\/$/;" e enum:__anon0bfbaecfb403
+CATEGORY_MOUNTAIN_RESCUE guest/hals/ril/reference-libril/ril.h /^ CATEGORY_MOUNTAIN_RESCUE = 1 << 4,$/;" e enum:__anon0bfbaecfb403
+CATEGORY_POLICE guest/hals/ril/reference-libril/ril.h /^ CATEGORY_POLICE = 1 << 0,$/;" e enum:__anon0bfbaecfb403
+CATEGORY_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ CATEGORY_UNSPECIFIED = 0, \/* General emergency call, all categories *\/$/;" e enum:__anon0bfbaecfb403
+CD host/commands/modem_simulator/sup_service.h /^ CD = 6, \/\/ communication deflection$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+CDISK_MAGIC host/libs/image_aggregator/image_aggregator.cc /^static const std::string CDISK_MAGIC = "composite_disk\\x1d";$/;" v namespace:cuttlefish::__anon02806fd80111 typeref:typename:const std::string file:
+CDMA guest/hals/ril/reference-ril/reference-ril.c /^#define CDMA /;" d file:
+CDMA2000 guest/hals/ril/reference-libril/ril.h /^ CDMA2000 = 0x05, \/\/ CDMA 2000 Radio AccessNetwork$/;" e enum:__anon0bfbaecfa503
+CDMA_ALPHA_INFO_BUFFER_LENGTH guest/hals/ril/reference-libril/ril.h /^#define CDMA_ALPHA_INFO_BUFFER_LENGTH /;" d
+CDMA_NUMBER_INFO_BUFFER_LENGTH guest/hals/ril/reference-libril/ril.h /^#define CDMA_NUMBER_INFO_BUFFER_LENGTH /;" d
+CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_COMMITTED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_COMMITTED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED,$/;" e enum:__anon0bfbaecf4503
+CDMA_OTA_PROVISION_STATUS_SSD_UPDATED guest/hals/ril/reference-libril/ril.h /^ CDMA_OTA_PROVISION_STATUS_SSD_UPDATED,$/;" e enum:__anon0bfbaecf4503
+CDMA_SUBSCRIPTION_SOURCE_NV guest/hals/ril/reference-libril/ril.h /^ CDMA_SUBSCRIPTION_SOURCE_NV = 1$/;" e enum:__anon0bfbaecf0c03
+CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM guest/hals/ril/reference-libril/ril.h /^ CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM = 0,$/;" e enum:__anon0bfbaecf0c03
+CDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalStrength CDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5108 typeref:typename:RIL_CDMA_SignalStrength
+CDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalStrength CDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5208 typeref:typename:RIL_CDMA_SignalStrength
+CDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalStrength CDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_CDMA_SignalStrength
+CDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalStrength CDMA_SignalStrength;$/;" m struct:__anon0bfbaecf4f08 typeref:typename:RIL_CDMA_SignalStrength
+CDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalStrength CDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5008 typeref:typename:RIL_CDMA_SignalStrength
+CELL_CONNECTION_NONE guest/hals/ril/reference-libril/ril.h /^ CELL_CONNECTION_NONE = 0, \/\/ Cell is not a serving cell.$/;" e enum:__anon0bfbaecf6d03
+CELL_CONNECTION_PRIMARY_SERVING guest/hals/ril/reference-libril/ril.h /^ CELL_CONNECTION_PRIMARY_SERVING, \/\/ UE has connection to cell for signalling and$/;" e enum:__anon0bfbaecf6d03
+CELL_CONNECTION_SECONDARY_SERVING guest/hals/ril/reference-libril/ril.h /^ CELL_CONNECTION_SECONDARY_SERVING, \/\/ UE has connection to cell for data (3GPP 36.331, 25/;" e enum:__anon0bfbaecf6d03
+CFB host/commands/modem_simulator/sup_service.h /^ CFB = 1, \/\/communication forwarding on busy user$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+CFNL host/commands/modem_simulator/sup_service.h /^ CFNL = 7, \/\/ communication forwarding on not logged-in$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+CFNR host/commands/modem_simulator/sup_service.h /^ CFNR = 2, \/\/ communication forwarding on no reply$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+CFNRC host/commands/modem_simulator/sup_service.h /^ CFNRC = 3, \/\/ communication forwarding on subscriber not reachable$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+CFU host/commands/modem_simulator/sup_service.h /^ CFU = 0, \/\/ communication forwarding unconditional$/;" e enum:cuttlefish::SupService::CallForwardInfo::Reason
+CGFPCCFG guest/hals/ril/reference-ril/reference-ril.c /^#define CGFPCCFG /;" d file:
+CHMAPS host/frontend/webrtc/audio_handler.cpp /^const virtio_snd_chmap_info CHMAPS[] = {{$/;" v namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:const virtio_snd_chmap_info[]
+CHUNK_RECV_MAX_LEN host/commands/tombstone_receiver/main.cpp /^static constexpr size_t CHUNK_RECV_MAX_LEN = 1024;$/;" v namespace:cuttlefish typeref:typename:size_t file:
+CLIR_INVOCATION host/commands/modem_simulator/sup_service.h /^ CLIR_INVOCATION = 1, \/\/ restrict CLI presentation$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirType
+CLIR_NOT_PROVISIONED host/commands/modem_simulator/sup_service.h /^ CLIR_NOT_PROVISIONED = 0,$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirStatus
+CLIR_PRESENTATION_ALLOWED host/commands/modem_simulator/sup_service.h /^ CLIR_PRESENTATION_ALLOWED = 4,$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirStatus
+CLIR_PRESENTATION_RESTRICTED host/commands/modem_simulator/sup_service.h /^ CLIR_PRESENTATION_RESTRICTED = 3,$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirStatus
+CLIR_PROVISIONED host/commands/modem_simulator/sup_service.h /^ CLIR_PROVISIONED = 1,$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirStatus
+CLIR_SUPPRESSION host/commands/modem_simulator/sup_service.h /^ CLIR_SUPPRESSION = 2, \/\/ allow CLI presentation$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirType
+CLOSE_CHANNEL host/commands/modem_simulator/stk_service.h /^ CLOSE_CHANNEL = 0x41,$/;" e enum:cuttlefish::StkService::CommandType
+CMD_GET_LOCATION host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^constexpr char CMD_GET_LOCATION[] = "CMD_GET_LOCATION";$/;" v typeref:typename:char[]
+CMD_GET_RAWMEASUREMENT host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^constexpr char CMD_GET_RAWMEASUREMENT[] = "CMD_GET_RAWMEASUREMENT";$/;" v typeref:typename:char[]
+CME_ERROR_NON_CME guest/hals/ril/reference-ril/atchannel.h /^ CME_ERROR_NON_CME = -1,$/;" e enum:__anon512a2c1f0303
+CME_SIM_NOT_INSERTED guest/hals/ril/reference-ril/atchannel.h /^ CME_SIM_NOT_INSERTED = 10$/;" e enum:__anon512a2c1f0303
+CME_SUCCESS guest/hals/ril/reference-ril/atchannel.h /^ CME_SUCCESS = 0,$/;" e enum:__anon512a2c1f0303
+COMMON_LIBS_NET_NETLINK_CLIENT_H_ common/libs/net/netlink_client.h /^#define COMMON_LIBS_NET_NETLINK_CLIENT_H_$/;" d
+COMMON_LIBS_NET_NETLINK_REQUEST_H_ common/libs/net/netlink_request.h /^#define COMMON_LIBS_NET_NETLINK_REQUEST_H_$/;" d
+COMMON_LIBS_NET_NETWORK_INTERFACE_MANAGER_H_ common/libs/net/network_interface_manager.h /^#define COMMON_LIBS_NET_NETWORK_INTERFACE_MANAGER_H_$/;" d
+COMMON_LUNCH_CHOICES AndroidProducts.mk /^COMMON_LUNCH_CHOICES := \\$/;" m
+COMPLETE guest/hals/ril/reference-libril/ril.h /^ COMPLETE = 0x02, \/\/ The result contains the last part of the scan results$/;" e enum:__anon0bfbaecfb203
+CONCATENATED_VENDOR_RAMDISK host/commands/assemble_cvd/boot_image_utils.cc /^const char CONCATENATED_VENDOR_RAMDISK[] = "concatenated_vendor_ramdisk";$/;" v typeref:typename:const char[]
+CONFIG_DRIVER_$(BOARD_WPA_SUPPLICANT_DRIVER) guest/libs/wpa_supplicant_8_lib/Android.mk /^ CONFIG_DRIVER_$(BOARD_WPA_SUPPLICANT_DRIVER) := y$/;" m
+CONFIRMATIONUI_CMD_INIT guest/hals/confirmationui/include/TrustyIpc.h /^ CONFIRMATIONUI_CMD_INIT = (1 << CONFIRMATIONUI_REQ_SHIFT),$/;" e enum:confirmationui_cmd
+CONFIRMATIONUI_CMD_MSG guest/hals/confirmationui/include/TrustyIpc.h /^ CONFIRMATIONUI_CMD_MSG = (2 << CONFIRMATIONUI_REQ_SHIFT),$/;" e enum:confirmationui_cmd
+CONFIRMATIONUI_MAX_MSG_SIZE guest/hals/confirmationui/include/TrustyIpc.h /^#define CONFIRMATIONUI_MAX_MSG_SIZE /;" d
+CONFIRMATIONUI_PORT guest/hals/confirmationui/include/TrustyIpc.h /^#define CONFIRMATIONUI_PORT /;" d
+CONFIRMATIONUI_REQ_SHIFT guest/hals/confirmationui/include/TrustyIpc.h /^ CONFIRMATIONUI_REQ_SHIFT = 1,$/;" e enum:confirmationui_cmd
+CONFIRMATIONUI_RESP_BIT guest/hals/confirmationui/include/TrustyIpc.h /^ CONFIRMATIONUI_RESP_BIT = 1,$/;" e enum:confirmationui_cmd
+CPIO_EXT host/commands/assemble_cvd/boot_image_utils.cc /^const char CPIO_EXT[] = ".cpio";$/;" v typeref:typename:const char[]
+CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_FD_H_ common/libs/fs/shared_fd.h /^#define CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_FD_H_$/;" d
+CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_FD_STREAM_H_ common/libs/fs/shared_fd_stream.h /^#define CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_FD_STREAM_H_$/;" d
+CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_SELECT_H_ common/libs/fs/shared_select.h /^#define CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_SELECT_H_$/;" d
+CUTTLEFISH_DEVICE_TYPE_GUEST host/commands/metrics/proto/cf_log.proto /^ CUTTLEFISH_DEVICE_TYPE_GUEST = 2;$/;" e enum:cuttlefish.CuttlefishLogEvent.DeviceType
+CUTTLEFISH_DEVICE_TYPE_HOST host/commands/metrics/proto/cf_log.proto /^ CUTTLEFISH_DEVICE_TYPE_HOST = 1;$/;" e enum:cuttlefish.CuttlefishLogEvent.DeviceType
+CUTTLEFISH_DEVICE_TYPE_UNSPECIFIED host/commands/metrics/proto/cf_log.proto /^ CUTTLEFISH_DEVICE_TYPE_UNSPECIFIED = 0;$/;" e enum:cuttlefish.CuttlefishLogEvent.DeviceType
+CUTTLEFISH_ERROR_TYPE_UNSPECIFIED host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_ERROR_TYPE_UNSPECIFIED = 0;$/;" e enum:cuttlefish.MetricsEvent.ErrorType
+CUTTLEFISH_EVENT_TYPE_DEVICE_BOOT host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_EVENT_TYPE_DEVICE_BOOT = 3;$/;" e enum:cuttlefish.MetricsEvent.EventType
+CUTTLEFISH_EVENT_TYPE_ERROR host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_EVENT_TYPE_ERROR = 1;$/;" e enum:cuttlefish.MetricsEvent.EventType
+CUTTLEFISH_EVENT_TYPE_LOCK_SCREEN_AVAILABLE host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_EVENT_TYPE_LOCK_SCREEN_AVAILABLE = 4;$/;" e enum:cuttlefish.MetricsEvent.EventType
+CUTTLEFISH_EVENT_TYPE_UNSPECIFIED host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_EVENT_TYPE_UNSPECIFIED = 0;$/;" e enum:cuttlefish.MetricsEvent.EventType
+CUTTLEFISH_EVENT_TYPE_VM_INSTANTIATION host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_EVENT_TYPE_VM_INSTANTIATION = 2;$/;" e enum:cuttlefish.MetricsEvent.EventType
+CUTTLEFISH_EVENT_TYPE_VM_STOP host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_EVENT_TYPE_VM_STOP = 5;$/;" e enum:cuttlefish.MetricsEvent.EventType
+CUTTLEFISH_OS_TYPE_LINUX_AARCH32 host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_OS_TYPE_LINUX_AARCH32 = 3;$/;" e enum:cuttlefish.MetricsEvent.OsType
+CUTTLEFISH_OS_TYPE_LINUX_AARCH64 host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_OS_TYPE_LINUX_AARCH64 = 4;$/;" e enum:cuttlefish.MetricsEvent.OsType
+CUTTLEFISH_OS_TYPE_LINUX_X86 host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_OS_TYPE_LINUX_X86 = 1;$/;" e enum:cuttlefish.MetricsEvent.OsType
+CUTTLEFISH_OS_TYPE_LINUX_X86_64 host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_OS_TYPE_LINUX_X86_64 = 2;$/;" e enum:cuttlefish.MetricsEvent.OsType
+CUTTLEFISH_OS_TYPE_UNSPECIFIED host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_OS_TYPE_UNSPECIFIED = 0;$/;" e enum:cuttlefish.MetricsEvent.OsType
+CUTTLEFISH_VMM_TYPE_CROSVM host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_VMM_TYPE_CROSVM = 1;$/;" e enum:cuttlefish.MetricsEvent.VmmType
+CUTTLEFISH_VMM_TYPE_QEMU host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_VMM_TYPE_QEMU = 2;$/;" e enum:cuttlefish.MetricsEvent.VmmType
+CUTTLEFISH_VMM_TYPE_UNSPECIFIED host/commands/metrics/proto/cf_metrics_event.proto /^ CUTTLEFISH_VMM_TYPE_UNSPECIFIED = 0;$/;" e enum:cuttlefish.MetricsEvent.VmmType
+CachedStreamBuffer guest/hals/camera/cached_stream_buffer.cpp /^CachedStreamBuffer::CachedStreamBuffer()$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer
+CachedStreamBuffer guest/hals/camera/cached_stream_buffer.cpp /^CachedStreamBuffer::CachedStreamBuffer(CachedStreamBuffer&& from) noexcept {$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer
+CachedStreamBuffer guest/hals/camera/cached_stream_buffer.cpp /^CachedStreamBuffer::CachedStreamBuffer(const StreamBuffer& buffer)$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer
+CachedStreamBuffer guest/hals/camera/cached_stream_buffer.h /^class CachedStreamBuffer {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+CallForwardInfo host/commands/modem_simulator/sup_service.h /^ CallForwardInfo(Reason reason) :$/;" f struct:cuttlefish::SupService::CallForwardInfo
+CallForwardInfo host/commands/modem_simulator/sup_service.h /^ struct CallForwardInfo {$/;" s class:cuttlefish::SupService
+CallForwardInfoStatus host/commands/modem_simulator/sup_service.h /^ enum CallForwardInfoStatus {$/;" g struct:cuttlefish::SupService::CallForwardInfo
+CallService host/commands/modem_simulator/call_service.cpp /^CallService::CallService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::CallService
+CallService host/commands/modem_simulator/call_service.h /^class CallService : public ModemService, public std::enable_shared_from_this<CallService> {$/;" c namespace:cuttlefish
+CallState host/commands/modem_simulator/call_service.h /^ enum CallState {$/;" g struct:cuttlefish::CallService::CallStatus
+CallStateUpdate host/commands/modem_simulator/call_service.cpp /^void CallService::CallStateUpdate() {$/;" f class:cuttlefish::CallService typeref:typename:void
+CallStatus host/commands/modem_simulator/call_service.h /^ CallStatus()$/;" f struct:cuttlefish::CallService::CallStatus
+CallStatus host/commands/modem_simulator/call_service.h /^ CallStatus(const std::string_view number)$/;" f struct:cuttlefish::CallService::CallStatus
+CallStatus host/commands/modem_simulator/call_service.h /^ struct CallStatus {$/;" s class:cuttlefish::CallService
+CallToken host/commands/modem_simulator/call_service.h /^ using CallToken = std::pair<int, std::string>;$/;" t class:cuttlefish::CallService typeref:typename:std::pair<int,std::string>
+CallWaitingInfo host/commands/modem_simulator/sup_service.h /^ CallWaitingInfo() :$/;" f struct:cuttlefish::SupService::CallWaitingInfo
+CallWaitingInfo host/commands/modem_simulator/sup_service.h /^ struct CallWaitingInfo {$/;" s class:cuttlefish::SupService
+Callback host/commands/modem_simulator/thread_looper.h /^ typedef std::function<void()> Callback;$/;" t class:cuttlefish::ThreadLooper
+CameraChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^CameraChannelHandler::CameraChannelHandler($/;" f class:cuttlefish::webrtc_streaming::CameraChannelHandler
+CameraChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^class CameraChannelHandler : public webrtc::DataChannelObserver {$/;" c namespace:cuttlefish::webrtc_streaming file:
+CameraController host/frontend/webrtc/lib/camera_controller.h /^class CameraController {$/;" c namespace:cuttlefish
+CameraStreamer host/frontend/webrtc/lib/camera_streamer.cpp /^CameraStreamer::CameraStreamer(unsigned int port, unsigned int cid)$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer
+CameraStreamer host/frontend/webrtc/lib/camera_streamer.h /^class CameraStreamer : public rtc::VideoSinkInterface<webrtc::VideoFrame>,$/;" c namespace:cuttlefish::webrtc_streaming
+Cancel host/libs/confui/host_virtual_input.h /^enum class ConfUiKeys : std::uint32_t { Confirm = 7, Cancel = 8 };$/;" e enum:cuttlefish::confui::ConfUiKeys
+CancelSerial host/commands/modem_simulator/thread_looper.cpp /^bool ThreadLooper::CancelSerial(Serial serial) {$/;" f class:cuttlefish::ThreadLooper typeref:typename:bool
+CancelSubscription host/commands/kernel_log_monitor/kernel_log_server.h /^ CancelSubscription,$/;" e enum:monitor::SubscriptionAction
+Cbor host/libs/confui/cbor.h /^ Cbor(const std::string& prompt_text,$/;" f class:cuttlefish::confui::Cbor
+Cbor host/libs/confui/cbor.h /^class Cbor {$/;" c namespace:cuttlefish::confui
+CellInfo guest/hals/ril/reference-libril/ril.h /^ } CellInfo;$/;" m struct:__anon0bfbaecf6e08 typeref:union:__anon0bfbaecf6e08::__anon0bfbaecf6f0a
+CellInfo guest/hals/ril/reference-libril/ril.h /^ } CellInfo;$/;" m struct:__anon0bfbaecf7008 typeref:union:__anon0bfbaecf7008::__anon0bfbaecf710a
+CellInfo guest/hals/ril/reference-libril/ril.h /^ } CellInfo;$/;" m struct:__anon0bfbaecf7208 typeref:union:__anon0bfbaecf7208::__anon0bfbaecf730a
+CfAudioDeviceModule host/frontend/webrtc/lib/audio_device.cpp /^CfAudioDeviceModule::CfAudioDeviceModule() {}$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule
+CfAudioDeviceModule host/frontend/webrtc/lib/audio_device.h /^class CfAudioDeviceModule : public webrtc::AudioDeviceModule,$/;" c namespace:cuttlefish::webrtc_streaming
+CfConnectionObserverFactory host/frontend/webrtc/connection_observer.cpp /^CfConnectionObserverFactory::CfConnectionObserverFactory($/;" f class:cuttlefish::CfConnectionObserverFactory
+CfConnectionObserverFactory host/frontend/webrtc/connection_observer.h /^class CfConnectionObserverFactory$/;" c namespace:cuttlefish
+CfOperatorObserver host/frontend/webrtc/main.cpp /^class CfOperatorObserver$/;" c file:
+Cgroups shared/config/cgroups.json /^ "Cgroups": [$/;" a
+ChangeMode host/commands/modem_simulator/sim_service.h /^ enum ChangeMode {WITH_PIN, WITH_PUK};$/;" g struct:cuttlefish::SimService::PinStatus
+ChangePIN host/commands/modem_simulator/sim_service.cpp /^bool SimService::PinStatus::ChangePIN(ChangeMode mode,$/;" f class:cuttlefish::SimService::PinStatus typeref:typename:bool
+ChangePUK host/commands/modem_simulator/sim_service.cpp /^bool SimService::PinStatus::ChangePUK(const std::string_view puk,$/;" f class:cuttlefish::SimService::PinStatus typeref:typename:bool
+ChangePin1AndAdjustSimStatus host/commands/modem_simulator/sim_service.cpp /^bool SimService::ChangePin1AndAdjustSimStatus(PinStatus::ChangeMode mode,$/;" f class:cuttlefish::SimService typeref:typename:bool
+ChannelMonitor host/commands/modem_simulator/channel_monitor.cpp /^ChannelMonitor::ChannelMonitor(ModemSimulator* modem,$/;" f class:cuttlefish::ChannelMonitor
+ChannelMonitor host/commands/modem_simulator/channel_monitor.h /^class ChannelMonitor {$/;" c namespace:cuttlefish
+ChdirIntoRuntimeDir host/commands/run_cvd/main.cc /^bool ChdirIntoRuntimeDir(const CuttlefishConfig::InstanceSpecific& instance) {$/;" f namespace:cuttlefish::__anonadab6e0c0111 typeref:typename:bool
+CheckCredentials host/libs/allocd/resource_manager.cpp /^bool ResourceManager::CheckCredentials(SharedFD client_socket, uid_t uid) {$/;" f class:cuttlefish::ResourceManager typeref:typename:bool
+CheckIdx common/libs/concurrency/multiplexer.h /^ void CheckIdx(const int idx) {$/;" f class:cuttlefish::Multiplexer typeref:typename:void
+CheckMarked common/libs/fs/shared_fd.cpp /^void CheckMarked(fd_set* in_out_mask, SharedFDSet* in_out_set) {$/;" f namespace:cuttlefish::__anond70c3a4f0111 typeref:typename:void
+CheckPasswordValid host/commands/modem_simulator/sim_service.cpp /^bool SimService::PinStatus::CheckPasswordValid(std::string_view password) {$/;" f class:cuttlefish::SimService::PinStatus typeref:typename:bool
+CheckResponse common/libs/net/netlink_client.cpp /^bool NetlinkClientImpl::CheckResponse(uint32_t seq_no) {$/;" f class:cuttlefish::__anon61381e100111::NetlinkClientImpl typeref:typename:bool
+CheckUTF8Copy host/libs/confui/cbor.cc /^Cbor::Error Cbor::CheckUTF8Copy(const std::string& text) {$/;" f class:cuttlefish::confui::Cbor typeref:typename:Cbor::Error
+ChkAndGetConfig host/libs/screen_connector/screen_connector_common.h /^ static auto ChkAndGetConfig() -> decltype(cuttlefish::CuttlefishConfig::Get()) {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:decltype(cuttlefish::CuttlefishConfig::Get ())
+ChmapInfoCommand host/libs/audio_connector/commands.cpp /^ChmapInfoCommand::ChmapInfoCommand(uint32_t start_id, size_t count,$/;" f class:cuttlefish::ChmapInfoCommand
+ChmapInfoCommand host/libs/audio_connector/commands.h /^class ChmapInfoCommand : public InfoCommand<virtio_snd_chmap_info> {$/;" c namespace:cuttlefish
+ChmapsInfo host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::ChmapsInfo(ChmapInfoCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+ChooseAction host/libs/config/data_image.cpp /^ Result<DataImageAction> ChooseAction() {$/;" f class:cuttlefish::InitializeDataImageImpl typeref:typename:Result<DataImageAction> file:
+ChooseConfig host/libs/config/config_flag.cpp /^ bool ChooseConfig(const std::string& name) {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:bool file:
+CidState host/commands/modem_simulator/data_service.h /^ enum CidState {ACTIVE, NO_ACTIVE};$/;" g struct:cuttlefish::DataService::PDPContext
+Clamp shared/config/task_profiles.json /^ "Clamp": "0"$/;" s object:Profiles.26.Actions.0.Params
+Clamp shared/config/task_profiles.json /^ "Clamp": "30%"$/;" s object:Profiles.27.Actions.0.Params
+Class host/commands/modem_simulator/sim_service.h /^ enum Class : int32_t {$/;" g struct:cuttlefish::SimService::FacilityLock typeref:typename:int32_t
+CleanPriorFiles host/commands/assemble_cvd/clean.cc /^bool CleanPriorFiles(const std::set<std::string>& preserving,$/;" f namespace:cuttlefish typeref:typename:bool
+CleanPriorFiles host/commands/assemble_cvd/clean.cc /^bool CleanPriorFiles(const std::string& path, const std::set<std::string>& preserving) {$/;" f namespace:cuttlefish::__anon587bcda10111 typeref:typename:bool
+CleanPriorFiles host/commands/assemble_cvd/clean.cc /^bool CleanPriorFiles(const std::vector<std::string>& paths, const std::set<std::string>& preserv/;" f namespace:cuttlefish::__anon587bcda10111 typeref:typename:bool
+CleanStopInstance host/commands/stop/main.cc /^bool CleanStopInstance(const CuttlefishConfig::InstanceSpecific& instance) {$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:bool
+CleanUp host/libs/confui/session.cc /^void Session::CleanUp() {$/;" f class:cuttlefish::confui::Session typeref:typename:void
+CleanupBridgeGateway host/libs/allocd/alloc_utils.cpp /^void CleanupBridgeGateway(const std::string& name, const std::string& ipaddr,$/;" f namespace:cuttlefish typeref:typename:void
+CleanupEthernetIface host/libs/allocd/alloc_utils.cpp /^void CleanupEthernetIface(const std::string& name,$/;" f namespace:cuttlefish typeref:typename:void
+ClearFailureRecord host/commands/secure_env/soft_gatekeeper.h /^ virtual bool ClearFailureRecord(uint32_t uid, secure_id_t user_id, bool \/* secure *\/) {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+ClearFailureRecord host/commands/secure_env/tpm_gatekeeper.cpp /^bool TpmGatekeeper::ClearFailureRecord($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:bool
+Client host/commands/modem_simulator/channel_monitor.cpp /^Client::Client(cuttlefish::SharedFD fd) : client_fd(fd) {}$/;" f class:cuttlefish::Client
+Client host/commands/modem_simulator/channel_monitor.cpp /^Client::Client(cuttlefish::SharedFD fd, ClientType client_type)$/;" f class:cuttlefish::Client
+Client host/commands/modem_simulator/channel_monitor.h /^class Client {$/;" c namespace:cuttlefish
+ClientDynHandler host/frontend/webrtc_operator/client_handler.cpp /^ClientDynHandler::ClientDynHandler(struct lws* wsi,$/;" f class:cuttlefish::ClientDynHandler
+ClientDynHandler host/frontend/webrtc_operator/client_handler.h /^class ClientDynHandler : public DynHandler,$/;" c namespace:cuttlefish
+ClientHandler host/frontend/webrtc/lib/client_handler.cpp /^ClientHandler::ClientHandler($/;" f class:cuttlefish::webrtc_streaming::ClientHandler
+ClientHandler host/frontend/webrtc/lib/client_handler.h /^class ClientHandler : public webrtc::PeerConnectionObserver,$/;" c namespace:cuttlefish::webrtc_streaming
+ClientHandler host/frontend/webrtc_operator/client_handler.h /^class ClientHandler {$/;" c namespace:cuttlefish
+ClientInfo host/commands/metrics/proto/clientanalytics.proto /^message ClientInfo {$/;" m
+ClientSocket common/libs/utils/tcp_socket.cpp /^ClientSocket::ClientSocket(int port)$/;" f class:cuttlefish::ClientSocket
+ClientSocket common/libs/utils/tcp_socket.h /^ ClientSocket(ClientSocket&& other) : fd_{other.fd_} {}$/;" f class:cuttlefish::ClientSocket
+ClientSocket common/libs/utils/tcp_socket.h /^ explicit ClientSocket(SharedFD fd) : fd_(fd) {}$/;" f class:cuttlefish::ClientSocket
+ClientSocket common/libs/utils/tcp_socket.h /^class ClientSocket {$/;" c namespace:cuttlefish
+ClientType host/commands/modem_simulator/channel_monitor.h /^ enum ClientType { RIL, REMOTE };$/;" g class:cuttlefish::Client
+ClientVideoTrackImpl host/frontend/webrtc/lib/client_handler.cpp /^class ClientVideoTrackImpl : public ClientVideoTrackInterface {$/;" c namespace:cuttlefish::webrtc_streaming file:
+ClientVideoTrackInterface host/frontend/webrtc/lib/client_handler.h /^class ClientVideoTrackInterface {$/;" c namespace:cuttlefish::webrtc_streaming
+ClientWSHandler host/frontend/webrtc_operator/client_handler.cpp /^ClientWSHandler::ClientWSHandler(struct lws* wsi, DeviceRegistry* registry,$/;" f class:cuttlefish::ClientWSHandler
+ClientWSHandler host/frontend/webrtc_operator/client_handler.h /^class ClientWSHandler : public ClientHandler,$/;" c namespace:cuttlefish
+ClientWSHandlerFactory host/frontend/webrtc_operator/client_handler.cpp /^ClientWSHandlerFactory::ClientWSHandlerFactory(DeviceRegistry* registry,$/;" f class:cuttlefish::ClientWSHandlerFactory
+ClientWSHandlerFactory host/frontend/webrtc_operator/client_handler.h /^class ClientWSHandlerFactory : public WebSocketHandlerFactory {$/;" c namespace:cuttlefish
+ClirStatus host/commands/modem_simulator/sup_service.h /^ enum ClirStatus {$/;" g struct:cuttlefish::SupService::ClirStatusInfo
+ClirStatusInfo host/commands/modem_simulator/sup_service.h /^ struct ClirStatusInfo {$/;" s class:cuttlefish::SupService
+ClirType host/commands/modem_simulator/sup_service.h /^ enum ClirType {$/;" g struct:cuttlefish::SupService::ClirStatusInfo
+Clock host/libs/confui/session.h /^ using Clock = std::chrono::steady_clock;$/;" t class:cuttlefish::confui::Session typeref:typename:std::chrono::steady_clock
+Clone host/frontend/webrtc/display_handler.h /^ std::unique_ptr<WebRtcScProcessedFrame> Clone() {$/;" f struct:cuttlefish::WebRtcScProcessedFrame typeref:typename:std::unique_ptr<WebRtcScProcessedFrame>
+Close common/libs/fs/shared_fd.cpp /^void FileInstance::Close() {$/;" f class:cuttlefish::FileInstance typeref:typename:void
+Close host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::Close() {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+Close host/libs/websocket/websocket_handler.cpp /^void WebSocketHandler::Close() {$/;" f class:cuttlefish::WebSocketHandler typeref:typename:void
+CloseDir host/commands/fetcher/build_api.cc /^struct CloseDir {$/;" s namespace:cuttlefish file:
+CloseRemoteConnection host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::CloseRemoteConnection(cuttlefish::SharedFD client) {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+CloseRemoteConnection host/commands/modem_simulator/modem_service.cpp /^void ModemService::CloseRemoteConnection(cuttlefish::SharedFD remote_client) {$/;" f class:cuttlefish::ModemService typeref:typename:void
+ClosedInstance common/libs/fs/shared_fd.cpp /^\/* static *\/ std::shared_ptr<FileInstance> FileInstance::ClosedInstance() {$/;" f class:cuttlefish::FileInstance typeref:typename:std::shared_ptr<FileInstance>
+Closer host/libs/graphics_detector/graphics_detector.cpp /^ Closer(std::function<void()> on_close) : on_close_(on_close) {}$/;" f class:cuttlefish::__anon29a199ff0111::Closer file:
+Closer host/libs/graphics_detector/graphics_detector.cpp /^class Closer {$/;" c namespace:cuttlefish::__anon29a199ff0111 file:
+Clr common/libs/fs/shared_select.h /^ void Clr(const SharedFD& in) {$/;" f class:cuttlefish::SharedFDSet typeref:typename:void
+Cmd host/libs/vm_manager/crosvm_builder.cpp /^Command& CrosvmBuilder::Cmd() { return command_; }$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:Command &
+CmdReply host/libs/audio_connector/server.cpp /^bool AudioClientConnection::CmdReply(AudioStatus status, const void* data,$/;" f class:cuttlefish::AudioClientConnection typeref:typename:bool
+CombineTargetZipFiles host/commands/assemble_cvd/super_image_mixer.cc /^bool CombineTargetZipFiles(const std::string& default_target_zip,$/;" f namespace:cuttlefish::__anonae6530d30111 typeref:typename:bool
+Command common/libs/utils/subprocess.h /^ Command(const std::string& executable,$/;" f class:cuttlefish::Command
+Command common/libs/utils/subprocess.h /^class Command {$/;" c namespace:cuttlefish
+CommandHandler host/commands/modem_simulator/modem_service.cpp /^CommandHandler::CommandHandler(const std::string& command, f_func handler)$/;" f class:cuttlefish::CommandHandler
+CommandHandler host/commands/modem_simulator/modem_service.cpp /^CommandHandler::CommandHandler(const std::string& command, p_func handler)$/;" f class:cuttlefish::CommandHandler
+CommandHandler host/commands/modem_simulator/modem_service.h /^class CommandHandler {$/;" c namespace:cuttlefish
+CommandInfo guest/hals/ril/reference-libril/ril_internal.h /^typedef struct CommandInfo CommandInfo;$/;" t namespace:android typeref:struct:CommandInfo
+CommandInfo guest/hals/ril/reference-libril/ril_internal.h /^typedef struct CommandInfo {$/;" s namespace:android
+CommandInfo guest/hals/ril/reference-libril/ril_internal.h /^} CommandInfo;$/;" t namespace:android typeref:struct:android::CommandInfo
+CommandParser host/commands/modem_simulator/command_parser.h /^ explicit CommandParser(const std::string& command) : copy_command_(command) {$/;" f class:cuttlefish::CommandParser
+CommandParser host/commands/modem_simulator/command_parser.h /^class CommandParser {$/;" c namespace:cuttlefish
+CommandSource host/libs/config/command_source.h /^class CommandSource : public virtual Feature {$/;" c namespace:cuttlefish
+CommandToBinaryMap host/commands/cvd/main.cc /^const std::map<std::string, std::string> CommandToBinaryMap = {$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:const std::map<std::string,std::string>
+CommandType host/commands/modem_simulator/stk_service.h /^ enum CommandType {$/;" g class:cuttlefish::StkService
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::BluetoothConnector typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::ConfigServer typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::GnssGrpcProxyServer typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::LogcatReceiver typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::MetricsService typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::OpenWrt typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::RootCanal typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::SecureEnvironment typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::TombstoneReceiver typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::VehicleHalServer typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::VmmCommands typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch.cc /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::WmediumdServer typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch_modem.cpp /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::ModemSimulator typeref:typename:std::vector<Command> file:
+Commands host/commands/run_cvd/launch_streamer.cpp /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:std::vector<Command> file:
+Commands host/libs/config/adb/launch.cpp /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbConnector typeref:typename:std::vector<Command> file:
+Commands host/libs/config/adb/launch.cpp /^ std::vector<Command> Commands() override {$/;" f class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:std::vector<Command> file:
+Commit host/libs/wayland/wayland_surface.cpp /^void Surface::Commit() {$/;" f class:wayland::Surface typeref:typename:void
+Compare common/libs/net/netlink_request_test.cpp /^bool Compare(MatchResultListener* result_listener,$/;" f namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:bool
+Compare host/commands/modem_simulator/modem_service.cpp /^int CommandHandler::Compare(const std::string& command) const {$/;" f class:cuttlefish::CommandHandler typeref:typename:int
+CompareHmacSharingParams host/commands/secure_env/tpm_keymaster_enforcement.cpp /^class CompareHmacSharingParams {$/;" c namespace:cuttlefish file:
+CompleteReleaseFrame common/libs/utils/network.cpp /^struct __attribute__((packed)) CompleteReleaseFrame {$/;" s namespace:cuttlefish file:
+ComponentDisk host/libs/image_aggregator/cdisk_spec.proto /^message ComponentDisk {$/;" m
+CompositeDisk host/libs/image_aggregator/cdisk_spec.proto /^message CompositeDisk {$/;" m
+CompositeDiskBuilder host/libs/image_aggregator/image_aggregator.cc /^ CompositeDiskBuilder() : next_disk_offset_(sizeof(GptBeginning)) {}$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder file:
+CompositeDiskBuilder host/libs/image_aggregator/image_aggregator.cc /^class CompositeDiskBuilder {$/;" c namespace:cuttlefish::__anon02806fd80111 file:
+CompositeSerializable host/commands/secure_env/composite_serialization.cpp /^CompositeSerializable::CompositeSerializable($/;" f class:cuttlefish::CompositeSerializable
+CompositeSerializable host/commands/secure_env/composite_serialization.h /^class CompositeSerializable : public keymaster::Serializable {$/;" c namespace:cuttlefish
+ComputeFastHash host/commands/secure_env/soft_gatekeeper.h /^ fast_hash_t ComputeFastHash(const SizedBuffer& password, uint64_t salt) {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:fast_hash_t
+ComputePasswordSignature host/commands/secure_env/soft_gatekeeper.h /^ virtual void ComputePasswordSignature(uint8_t* signature, uint32_t signature_length,$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:void
+ComputePasswordSignature host/commands/secure_env/tpm_gatekeeper.cpp /^void TpmGatekeeper::ComputePasswordSignature($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:void
+ComputeScreenSizeInBytes host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ComputeScreenSizeInBytes(const std::uint32_t w,$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+ComputeScreenStrideBytes host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ComputeScreenStrideBytes(const std::uint32_t w) {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+ComputeSharedHmac guest/hals/keymaster/remote/remote_keymaster.cpp /^ComputeSharedHmacResponse RemoteKeymaster::ComputeSharedHmac($/;" f class:keymaster::RemoteKeymaster typeref:typename:ComputeSharedHmacResponse
+ComputeSharedHmac guest/hals/keymint/remote/remote_keymaster.cpp /^ComputeSharedHmacResponse RemoteKeymaster::ComputeSharedHmac($/;" f class:keymaster::RemoteKeymaster typeref:typename:ComputeSharedHmacResponse
+ComputeSharedHmac host/commands/secure_env/tpm_keymaster_enforcement.cpp /^keymaster_error_t TpmKeymasterEnforcement::ComputeSharedHmac($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:keymaster_error_t
+ComputeSignature host/commands/secure_env/soft_gatekeeper.h /^ virtual void ComputeSignature(uint8_t* signature, uint32_t signature_length, const uint8_t*,$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:void
+ComputeSignature host/commands/secure_env/tpm_gatekeeper.cpp /^void TpmGatekeeper::ComputeSignature($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:void
+Condition host/libs/confui/cbor.cc /^ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };$/;" g function:cuttlefish::confui::Cbor::WriteHeader file:
+ConfUiAbortMessage common/libs/confui/protocol_types.h /^using ConfUiAbortMessage = ConfUiGenericMessage<ConfUiCmd::kAbort>;$/;" t namespace:cuttlefish::confui typeref:typename:ConfUiGenericMessage<ConfUiCmd::kAbort>
+ConfUiAckMessage common/libs/confui/protocol_types.h /^ ConfUiAckMessage(const std::string& session_id, const bool is_success,$/;" f class:cuttlefish::confui::ConfUiAckMessage
+ConfUiAckMessage common/libs/confui/protocol_types.h /^class ConfUiAckMessage : public ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfUiAckMessage guest/hals/confirmationui/TrustyConfirmationUI.h /^ using ConfUiAckMessage = cuttlefish::confui::ConfUiAckMessage;$/;" t class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:cuttlefish::confui::ConfUiAckMessage
+ConfUiAckMessage guest/hals/confirmationui/guest_session.h /^ using ConfUiAckMessage = cuttlefish::confui::ConfUiAckMessage;$/;" t class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:cuttlefish::confui::ConfUiAckMessage
+ConfUiCheck common/libs/confui/utils.h /^#define ConfUiCheck(/;" d
+ConfUiCliResponseMessage common/libs/confui/protocol_types.h /^ ConfUiCliResponseMessage(const std::string& session_id,$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage
+ConfUiCliResponseMessage common/libs/confui/protocol_types.h /^class ConfUiCliResponseMessage : public ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfUiCmd common/libs/confui/protocol_types.h /^enum class ConfUiCmd : std::uint32_t {$/;" g namespace:cuttlefish::confui typeref:typename:std::uint32_t
+ConfUiGenericMessage common/libs/confui/protocol_types.h /^ ConfUiGenericMessage(const std::string& session_id)$/;" f class:cuttlefish::confui::ConfUiGenericMessage
+ConfUiGenericMessage common/libs/confui/protocol_types.h /^class ConfUiGenericMessage : public ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfUiKeys host/libs/confui/host_virtual_input.h /^enum class ConfUiKeys : std::uint32_t { Confirm = 7, Cancel = 8 };$/;" g namespace:cuttlefish::confui typeref:typename:std::uint32_t
+ConfUiLog common/libs/confui/utils.h /^#define ConfUiLog(/;" d
+ConfUiMessage common/libs/confui/protocol_types.h /^ ConfUiMessage(const std::string& session_id) : session_id_{session_id} {}$/;" f class:cuttlefish::confui::ConfUiMessage
+ConfUiMessage common/libs/confui/protocol_types.h /^class ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfUiMessage guest/hals/confirmationui/TrustyConfirmationUI.h /^ using ConfUiMessage = cuttlefish::confui::ConfUiMessage;$/;" t class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:cuttlefish::confui::ConfUiMessage
+ConfUiMessage guest/hals/confirmationui/guest_session.h /^ using ConfUiMessage = cuttlefish::confui::ConfUiMessage;$/;" t class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:cuttlefish::confui::ConfUiMessage
+ConfUiPacketInfo common/libs/confui/packet_types.h /^using ConfUiPacketInfo = std::vector<std::vector<std::uint8_t>>;$/;" t namespace:cuttlefish::confui::packet typeref:typename:std::vector<std::vector<std::uint8_t>>
+ConfUiRenderer host/libs/confui/host_renderer.cc /^ConfUiRenderer::ConfUiRenderer(const std::uint32_t display,$/;" f class:cuttlefish::confui::ConfUiRenderer
+ConfUiRenderer host/libs/confui/host_renderer.h /^class ConfUiRenderer {$/;" c namespace:cuttlefish::confui
+ConfUiStartMessage common/libs/confui/protocol_types.h /^ ConfUiStartMessage(const std::string session_id,$/;" f class:cuttlefish::confui::ConfUiStartMessage
+ConfUiStartMessage common/libs/confui/protocol_types.h /^class ConfUiStartMessage : public ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfUiStopMessage common/libs/confui/protocol_types.h /^using ConfUiStopMessage = ConfUiGenericMessage<ConfUiCmd::kStop>;$/;" t namespace:cuttlefish::confui typeref:typename:ConfUiGenericMessage<ConfUiCmd::kStop>
+ConfUiUserSelectionMessage common/libs/confui/protocol_types.h /^ ConfUiUserSelectionMessage(const std::string& session_id,$/;" f class:cuttlefish::confui::ConfUiUserSelectionMessage
+ConfUiUserSelectionMessage common/libs/confui/protocol_types.h /^class ConfUiUserSelectionMessage : public ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfUiUserTouchMessage common/libs/confui/protocol_types.h /^ ConfUiUserTouchMessage(const std::string& session_id, const int x,$/;" f class:cuttlefish::confui::ConfUiUserTouchMessage
+ConfUiUserTouchMessage common/libs/confui/protocol_types.h /^class ConfUiUserTouchMessage : public ConfUiMessage {$/;" c namespace:cuttlefish::confui
+ConfigExists host/libs/config/cuttlefish_config.cpp /^\/*static*\/ bool CuttlefishConfig::ConfigExists() {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+ConfigFileLocation host/commands/modem_simulator/nvram_config.cpp /^std::string NvramConfig::ConfigFileLocation() const {$/;" f class:cuttlefish::NvramConfig typeref:typename:std::string
+ConfigFlag host/libs/config/config_flag.h /^class ConfigFlag : public FlagFeature {};$/;" c namespace:cuttlefish
+ConfigFlagComponent host/libs/config/config_flag.cpp /^fruit::Component<SystemImageDirFlag, ConfigFlag> ConfigFlagComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<SystemImageDirFlag,ConfigFlag>
+ConfigFlagImpl host/libs/config/config_flag.cpp /^class ConfigFlagImpl : public ConfigFlag {$/;" c namespace:cuttlefish::__anon2e549bd00111 file:
+ConfigFlagPlaceholder host/libs/config/config_flag.cpp /^fruit::Component<ConfigFlag> ConfigFlagPlaceholder() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<ConfigFlag>
+ConfigFlagPlaceholderImpl host/libs/config/config_flag.cpp /^class ConfigFlagPlaceholderImpl : public ConfigFlag {$/;" c namespace:cuttlefish::__anon2e549bd00111 file:
+ConfigFragment host/libs/config/config_fragment.h /^class ConfigFragment {$/;" c namespace:cuttlefish
+ConfigHandler host/frontend/webrtc_operator/client_handler.cpp /^ConfigHandler::ConfigHandler(struct lws* wsi, const ServerConfig& server_config)$/;" f class:cuttlefish::ConfigHandler
+ConfigHandler host/frontend/webrtc_operator/client_handler.h /^class ConfigHandler : public DynHandler {$/;" c namespace:cuttlefish
+ConfigReader host/libs/config/config_flag.cpp /^class ConfigReader : public FlagFeature {$/;" c namespace:cuttlefish::__anon2e549bd00111 file:
+ConfigServer host/commands/run_cvd/launch.cc /^class ConfigServer : public CommandSource {$/;" c namespace:cuttlefish file:
+ConfigServerBinary host/libs/config/known_paths.cpp /^std::string ConfigServerBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+Configure guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::Configure(const ConfigureRequest& request, ConfigureResponse* response) {$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+Configure guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::Configure(const ConfigureRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ConfigureBootDevices host/libs/vm_manager/crosvm_manager.cpp /^std::string CrosvmManager::ConfigureBootDevices(int num_disks) {$/;" f class:cuttlefish::vm_manager::CrosvmManager typeref:typename:std::string
+ConfigureBootDevices host/libs/vm_manager/qemu_manager.cpp /^std::string QemuManager::ConfigureBootDevices(int num_disks) {$/;" f class:cuttlefish::vm_manager::QemuManager typeref:typename:std::string
+ConfigureBootPatchlevel guest/hals/keymint/remote/remote_keymaster.cpp /^ConfigureBootPatchlevelResponse RemoteKeymaster::ConfigureBootPatchlevel($/;" f class:keymaster::RemoteKeymaster typeref:typename:ConfigureBootPatchlevelResponse
+ConfigureGpuMode host/libs/vm_manager/crosvm_manager.cpp /^std::vector<std::string> CrosvmManager::ConfigureGpuMode($/;" f class:cuttlefish::vm_manager::CrosvmManager typeref:typename:std::vector<std::string>
+ConfigureGpuMode host/libs/vm_manager/qemu_manager.cpp /^std::vector<std::string> QemuManager::ConfigureGpuMode($/;" f class:cuttlefish::vm_manager::QemuManager typeref:typename:std::vector<std::string>
+ConfigureLogs host/commands/run_cvd/main.cc /^void ConfigureLogs(const CuttlefishConfig& config,$/;" f namespace:cuttlefish::__anonadab6e0c0111 typeref:typename:void
+ConfigureMultipleBootDevices host/libs/vm_manager/vm_manager.cpp /^std::string ConfigureMultipleBootDevices(const std::string& pci_path,$/;" f namespace:cuttlefish::vm_manager typeref:typename:std::string
+ConfigureVendorPatchlevel guest/hals/keymint/remote/remote_keymaster.cpp /^ConfigureVendorPatchlevelResponse RemoteKeymaster::ConfigureVendorPatchlevel($/;" f class:keymaster::RemoteKeymaster typeref:typename:ConfigureVendorPatchlevelResponse
+Confirm host/libs/confui/host_virtual_input.h /^enum class ConfUiKeys : std::uint32_t { Confirm = 7, Cancel = 8 };$/;" e enum:cuttlefish::confui::ConfUiKeys
+Conflict host/libs/websocket/websocket_handler.h /^ Conflict = 409,$/;" e enum:cuttlefish::HttpStatusCode
+Connect common/libs/fs/shared_fd.cpp /^int FileInstance::Connect(const struct sockaddr* addr, socklen_t addrlen) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+Connect common/libs/utils/vsock_connection.cpp /^bool VsockClientConnection::Connect(unsigned int port, unsigned int cid) {$/;" f class:cuttlefish::VsockClientConnection typeref:typename:bool
+Connect common/libs/utils/vsock_connection.cpp /^bool VsockServerConnection::Connect(unsigned int port, unsigned int cid) {$/;" f class:cuttlefish::VsockServerConnection typeref:typename:bool
+Connect host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::Connect() {$/;" f class:WsConnectionImpl typeref:typename:void
+Connect host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^export async function Connect(deviceId, serverConnector) {$/;" f
+Connect host/libs/wmediumd_controller/wmediumd_controller.cpp /^bool WmediumdController::Connect(const std::string& serverSocketPath) {$/;" f class:cuttlefish::WmediumdController typeref:typename:bool
+ConnectAsync common/libs/utils/vsock_connection.cpp /^std::future<bool> VsockConnection::ConnectAsync(unsigned int port,$/;" f class:cuttlefish::VsockConnection typeref:typename:std::future<bool>
+ConnectDevice host/frontend/webrtc_operator/assets/js/app.js /^async function ConnectDevice(deviceId, serverConnector) {$/;" f
+ConnectDevice host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ ConnectDevice(pc) {$/;" m class:Controller
+ConnectHandler host/frontend/webrtc_operator/client_handler.cpp /^ConnectHandler::ConnectHandler(struct lws* wsi, DeviceRegistry* registry,$/;" f class:cuttlefish::ConnectHandler
+ConnectHandler host/frontend/webrtc_operator/client_handler.h /^class ConnectHandler : public ClientDynHandler {$/;" c namespace:cuttlefish
+ConnectInner host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::ConnectInner() {$/;" f class:WsConnectionImpl typeref:typename:void
+ConnectToHost guest/hals/confirmationui/TrustyConfirmationUI.cpp /^cuttlefish::SharedFD TrustyConfirmationUI::ConnectToHost() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:cuttlefish::SharedFD
+ConnectToRemoteCvd host/commands/modem_simulator/modem_service.cpp /^cuttlefish::SharedFD ModemService::ConnectToRemoteCvd(std::string port) {$/;" f class:cuttlefish::ModemService typeref:typename:cuttlefish::SharedFD
+ConnectWithTimeout common/libs/fs/shared_fd.cpp /^int FileInstance::ConnectWithTimeout(const struct sockaddr* addr,$/;" f class:cuttlefish::FileInstance typeref:typename:int
+Connecting to device host/frontend/webrtc_operator/assets/client.html /^ <h3 id='status-message' class='connecting'>Connecting to device<\/h3>$/;" j
+ConnectionObserver host/frontend/webrtc/lib/connection_observer.h /^class ConnectionObserver {$/;" c namespace:cuttlefish::webrtc_streaming
+ConnectionObserverFactory host/frontend/webrtc/lib/connection_observer.h /^class ConnectionObserverFactory {$/;" c namespace:cuttlefish::webrtc_streaming
+ConnectionObserverImpl host/frontend/webrtc/connection_observer.cpp /^ ConnectionObserverImpl($/;" f class:cuttlefish::ConnectionObserverImpl file:
+ConnectionObserverImpl host/frontend/webrtc/connection_observer.cpp /^class ConnectionObserverImpl$/;" c namespace:cuttlefish file:
+ConnectivityChecker guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ public ConnectivityChecker(Context context, EventReporter eventReporter) {$/;" m class:ConnectivityChecker
+ConnectivityChecker guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^public class ConnectivityChecker extends JobBase {$/;" c
+Connector host/frontend/webrtc_operator/assets/js/server_connector.js /^class Connector {$/;" c
+ConnectorTcpArg host/libs/config/adb/launch.cpp /^ std::string ConnectorTcpArg() const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:std::string file:
+ConnectorVsockArg host/libs/config/adb/launch.cpp /^ std::string ConnectorVsockArg() const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:std::string file:
+ConsoleForwarder host/commands/console_forwarder/main.cpp /^ ConsoleForwarder(std::string console_path, SharedFD console_in,$/;" f class:cuttlefish::ConsoleForwarder file:
+ConsoleForwarder host/commands/console_forwarder/main.cpp /^class ConsoleForwarder {$/;" c namespace:cuttlefish file:
+ConsoleForwarder host/commands/run_cvd/launch.cc /^class ConsoleForwarder : public CommandSource, public DiagnosticInformation {$/;" c namespace:cuttlefish file:
+ConsoleForwarderBinary host/libs/config/known_paths.cpp /^std::string ConsoleForwarderBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+ConsoleForwarderMain host/commands/console_forwarder/main.cpp /^int ConsoleForwarderMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+ConsoleSeverity common/libs/utils/tee_logging.cpp /^LogSeverity ConsoleSeverity() {$/;" f namespace:cuttlefish typeref:typename:LogSeverity
+Contains host/libs/confui/session.cc /^static bool Contains(const C& c, T&& item) {$/;" f namespace:cuttlefish::confui typeref:typename:bool file:
+ContentType host/commands/fetcher/build_api.h /^ const std::string& ContentType() const { return content_type; }$/;" f class:cuttlefish::Artifact typeref:typename:const std::string &
+Contents common/libs/utils/archive.cpp /^std::vector<std::string> Archive::Contents() {$/;" f class:cuttlefish::Archive typeref:typename:std::vector<std::string>
+ContinueSubscription host/commands/kernel_log_monitor/kernel_log_server.h /^ ContinueSubscription,$/;" e enum:monitor::SubscriptionAction
+ControlChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^ControlChannelHandler::ControlChannelHandler($/;" f class:cuttlefish::webrtc_streaming::ControlChannelHandler
+ControlChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^class ControlChannelHandler : public webrtc::DataChannelObserver {$/;" c namespace:cuttlefish::webrtc_streaming file:
+ControlMessage common/libs/utils/unix_sockets.cpp /^ControlMessage::ControlMessage(ControlMessage&& existing) {$/;" f class:cuttlefish::ControlMessage
+ControlMessage common/libs/utils/unix_sockets.h /^struct ControlMessage {$/;" s namespace:cuttlefish
+ControlPanelButton host/libs/config/custom_actions.h /^struct ControlPanelButton {$/;" s namespace:cuttlefish
+ControlPanelButtonDescriptor host/frontend/webrtc/lib/streamer.cpp /^struct ControlPanelButtonDescriptor {$/;" s namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 file:
+Controller host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^class Controller {$/;" c
+Controller shared/config/cgroups.json /^ "Controller": "cpuset",$/;" s object:Cgroups.0
+Controller shared/config/task_profiles.json /^ "Controller": "blkio",$/;" s object:Profiles.20.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "blkio",$/;" s object:Profiles.21.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "blkio",$/;" s object:Profiles.22.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "blkio",$/;" s object:Profiles.23.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpu",$/;" s object:Profiles.0.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpu",$/;" s object:Profiles.1.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpu",$/;" s object:Profiles.2.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpu",$/;" s object:Profiles.3.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpu",$/;" s object:Profiles.4.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpu",$/;" s object:Profiles.5.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.10.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.11.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.12.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.13.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.14.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.15.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.16.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.17.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.18.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.19.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.6.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.7.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.8.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "cpuset",$/;" s object:Profiles.9.Actions.0.Params
+Controller shared/config/task_profiles.json /^ "Controller": "memory",$/;" s object:Profiles.30.Actions.0.Params
+CopyFrom common/libs/fs/shared_fd.cpp /^bool FileInstance::CopyFrom(FileInstance& in, size_t length) {$/;" f class:cuttlefish::FileInstance typeref:typename:bool
+CountSizeAndNewLines common/libs/utils/tee_logging.cpp /^static std::pair<int, int> CountSizeAndNewLines(const char* message) {$/;" f namespace:cuttlefish typeref:typename:std::pair<int,int> file:
+Crc32 host/commands/fetcher/build_api.h /^ unsigned int Crc32() const { return crc32; }$/;" f class:cuttlefish::Artifact typeref:typename:unsigned int
+Creat common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Creat(const std::string& path, mode_t mode) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+Create host/commands/fetcher/curl_wrapper.cc /^\/* static *\/ std::unique_ptr<CurlWrapper> CurlWrapper::Create() {$/;" f class:cuttlefish::CurlWrapper typeref:typename:std::unique_ptr<CurlWrapper>
+Create host/frontend/webrtc/lib/client_handler.cpp /^std::shared_ptr<ClientHandler> ClientHandler::Create($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::shared_ptr<ClientHandler>
+Create host/frontend/webrtc/lib/local_recorder.cpp /^std::unique_ptr<LocalRecorder> LocalRecorder::Create($/;" f class:cuttlefish::webrtc_streaming::LocalRecorder typeref:typename:std::unique_ptr<LocalRecorder>
+Create host/frontend/webrtc/lib/streamer.cpp /^std::unique_ptr<Streamer> Streamer::Create($/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:std::unique_ptr<Streamer>
+Create host/frontend/webrtc/lib/ws_connection.cpp /^std::shared_ptr<WsConnectionContext> WsConnectionContext::Create() {$/;" f class:WsConnectionContext typeref:typename:std::shared_ptr<WsConnectionContext>
+Create host/libs/audio_connector/server.cpp /^std::unique_ptr<AudioClientConnection> AudioClientConnection::Create($/;" f class:cuttlefish::AudioClientConnection typeref:typename:std::unique_ptr<AudioClientConnection>
+Create host/libs/msg_queue/msg_queue.cc /^std::unique_ptr<SysVMessageQueue> SysVMessageQueue::Create($/;" f class:cuttlefish::SysVMessageQueue typeref:typename:std::unique_ptr<SysVMessageQueue>
+CreateAndStartThread host/frontend/webrtc/lib/streamer.cpp /^std::unique_ptr<rtc::Thread> CreateAndStartThread(const std::string& name) {$/;" f namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:std::unique_ptr<rtc::Thread>
+CreateAudioServer host/frontend/webrtc/main.cpp /^std::unique_ptr<cuttlefish::AudioServer> CreateAudioServer() {$/;" f typeref:typename:std::unique_ptr<cuttlefish::AudioServer>
+CreateBlankImage host/libs/config/data_image.cpp /^bool CreateBlankImage($/;" f namespace:cuttlefish typeref:typename:bool
+CreateBridge host/libs/allocd/alloc_utils.cpp /^bool CreateBridge(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+CreateClientHandler host/frontend/webrtc/lib/streamer.cpp /^std::shared_ptr<ClientHandler> Streamer::Impl::CreateClientHandler($/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::shared_ptr<ClientHandler>
+CreateCompositeDisk host/libs/image_aggregator/image_aggregator.cc /^void CreateCompositeDisk(std::vector<ImagePartition> partitions,$/;" f namespace:cuttlefish typeref:typename:void
+CreateCompositeDisk host/libs/image_aggregator/image_aggregator.cc /^void CreateCompositeDisk(std::vector<MultipleImagePartition> partitions,$/;" f namespace:cuttlefish typeref:typename:void
+CreateConnection host/frontend/webrtc/lib/ws_connection.cpp /^std::shared_ptr<WsConnection> WsConnectionContextImpl::CreateConnection($/;" f class:WsConnectionContextImpl typeref:typename:std::shared_ptr<WsConnection>
+CreateConnectionCallback host/frontend/webrtc/lib/ws_connection.cpp /^void CreateConnectionCallback(lws_sorted_usec_list_t* sul) {$/;" f typeref:typename:void
+CreateConnectionSul host/frontend/webrtc/lib/ws_connection.cpp /^ struct CreateConnectionSul {$/;" s class:WsConnectionImpl file:
+CreateDeviceInfo host/commands/secure_env/tpm_remote_provisioning_context.cpp /^std::unique_ptr<cppbor::Map> TpmRemoteProvisioningContext::CreateDeviceInfo()$/;" f class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:std::unique_ptr<cppbor::Map>
+CreateDynamicDiskFiles host/commands/assemble_cvd/disk_flags.cc /^void CreateDynamicDiskFiles(const FetcherConfig& fetcher_config,$/;" f namespace:cuttlefish typeref:typename:void
+CreateEbtables host/libs/allocd/alloc_utils.cpp /^bool CreateEbtables(const std::string& name, bool use_ipv4,$/;" f namespace:cuttlefish typeref:typename:bool
+CreateEthernetBridgeIface host/libs/allocd/alloc_utils.cpp /^bool CreateEthernetBridgeIface(const std::string& name,$/;" f namespace:cuttlefish typeref:typename:bool
+CreateEthernetIface host/libs/allocd/alloc_utils.cpp /^bool CreateEthernetIface(const std::string& name, const std::string& bridge_name,$/;" f namespace:cuttlefish typeref:typename:bool
+CreateGatekeeperMessage common/libs/security/gatekeeper_channel.cpp /^ManagedGatekeeperMessage CreateGatekeeperMessage($/;" f namespace:cuttlefish typeref:typename:ManagedGatekeeperMessage
+CreateInterface host/libs/allocd/request.h /^ CreateInterface, \/\/ Request to create new network interface$/;" e enum:cuttlefish::RequestType
+CreateKey host/commands/secure_env/encrypted_serializable.cpp /^static bool CreateKey($/;" f namespace:cuttlefish typeref:typename:bool file:
+CreateKey host/commands/secure_env/primary_key_builder.cpp /^TpmObjectSlot PrimaryKeyBuilder::CreateKey($/;" f class:cuttlefish::PrimaryKeyBuilder typeref:typename:TpmObjectSlot
+CreateKeyBlob host/commands/secure_env/tpm_key_blob_maker.cpp /^keymaster_error_t TpmKeyBlobMaker::CreateKeyBlob($/;" f class:cuttlefish::TpmKeyBlobMaker typeref:typename:keymaster_error_t
+CreateKeyId host/commands/secure_env/tpm_keymaster_enforcement.cpp /^bool TpmKeymasterEnforcement::CreateKeyId($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:bool
+CreateKeymasterMessage common/libs/security/keymaster_channel.cpp /^ManagedKeymasterMessage CreateKeymasterMessage($/;" f namespace:cuttlefish typeref:typename:ManagedKeymasterMessage
+CreateMemFDWithData common/libs/utils/unix_sockets_test.cpp /^SharedFD CreateMemFDWithData(const std::string& data) {$/;" f namespace:cuttlefish typeref:typename:SharedFD
+CreateMessage common/libs/utils/tcp_socket.h /^Message CreateMessage(Ts... vals) {$/;" f namespace:cuttlefish typeref:typename:Message
+CreateMobileIface host/libs/allocd/alloc_utils.cpp /^bool CreateMobileIface(const std::string& name, uint16_t id,$/;" f namespace:cuttlefish typeref:typename:bool
+CreateObserver host/frontend/webrtc/connection_observer.cpp /^CfConnectionObserverFactory::CreateObserver() {$/;" f class:cuttlefish::CfConnectionObserverFactory typeref:typename:std::shared_ptr<cuttlefish::webrtc_streaming::ConnectionObserver>
+CreateOsCompositeDisk host/commands/assemble_cvd/disk_flags.cc /^bool CreateOsCompositeDisk(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish typeref:typename:bool
+CreatePDU host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::CreatePDU() {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+CreatePersistentCompositeDisk host/commands/assemble_cvd/disk_flags.cc /^bool CreatePersistentCompositeDisk($/;" f namespace:cuttlefish typeref:typename:bool
+CreateQcowOverlay host/commands/run_cvd/server_loop.cpp /^bool CreateQcowOverlay(const std::string& crosvm_path,$/;" f namespace:cuttlefish::__anon527e8bd40111 typeref:typename:bool
+CreateQcowOverlay host/libs/image_aggregator/image_aggregator.cc /^void CreateQcowOverlay(const std::string& crosvm_path,$/;" f namespace:cuttlefish typeref:typename:void
+CreateQueue common/libs/concurrency/multiplexer.h /^ static QueuePtr CreateQueue(Args&&... args) {$/;" f class:cuttlefish::Multiplexer typeref:typename:QueuePtr
+CreateRemotePDU host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::CreateRemotePDU(std::string& host_port) {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+CreateServerTcpSocket host/frontend/webrtc/lib/port_range_socket_factory.cpp /^rtc::AsyncPacketSocket* PortRangeSocketFactory::CreateServerTcpSocket($/;" f class:cuttlefish::webrtc_streaming::PortRangeSocketFactory typeref:typename:rtc::AsyncPacketSocket *
+CreateSession host/libs/confui/host_server.cc /^std::shared_ptr<Session> HostServer::CreateSession(const std::string& name) {$/;" f class:cuttlefish::confui::HostServer typeref:typename:std::shared_ptr<Session>
+CreateSocketPair host/libs/audio_connector/server.cpp /^bool CreateSocketPair(SharedFD* local, SharedFD* remote) {$/;" f namespace:cuttlefish::__anon8078843e0111 typeref:typename:bool
+CreateStatuReport host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::CreateStatuReport(int message_reference) {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+CreateString common/libs/confui/protocol_types.h /^ static std::string CreateString(Args&&... args) {$/;" f class:cuttlefish::confui::ConfUiMessage typeref:typename:std::string
+CreateTap host/libs/allocd/alloc_utils.cpp /^bool CreateTap(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+CreateUdpSocket host/frontend/webrtc/lib/port_range_socket_factory.cpp /^rtc::AsyncPacketSocket* PortRangeSocketFactory::CreateUdpSocket($/;" f class:cuttlefish::webrtc_streaming::PortRangeSocketFactory typeref:typename:rtc::AsyncPacketSocket *
+CreateUnixInputServer host/commands/run_cvd/launch_streamer.cpp /^SharedFD CreateUnixInputServer(const std::string& path) {$/;" f namespace:cuttlefish::__anon6b0274e10111 typeref:typename:SharedFD
+CreateVideoEncoder host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^std::unique_ptr<webrtc::VideoEncoder> VP8OnlyEncoderFactory::CreateVideoEncoder($/;" f class:cuttlefish::webrtc_streaming::VP8OnlyEncoderFactory typeref:typename:std::unique_ptr<webrtc::VideoEncoder>
+CreateWifiWrapper guest/commands/setup_wifi/main.cpp /^int CreateWifiWrapper(const std::string& source,$/;" f typeref:typename:int
+CreationTime host/commands/fetcher/build_api.h /^ unsigned long CreationTime() const { return creation_time; }$/;" f class:cuttlefish::Artifact typeref:typename:unsigned long
+Credential host/commands/fetcher/credential_source.cc /^std::string FixedCredentialSource::Credential() {$/;" f class:cuttlefish::FixedCredentialSource typeref:typename:std::string
+Credential host/commands/fetcher/credential_source.cc /^std::string GceMetadataCredentialSource::Credential() {$/;" f class:cuttlefish::GceMetadataCredentialSource typeref:typename:std::string
+CredentialSource host/commands/fetcher/credential_source.h /^class CredentialSource {$/;" c namespace:cuttlefish
+Credentials common/libs/utils/unix_sockets.cpp /^Result<ucred> UnixSocketMessage::Credentials() {$/;" f class:cuttlefish::UnixSocketMessage typeref:typename:Result<ucred>
+CrosvmBuilder host/libs/vm_manager/crosvm_builder.cpp /^CrosvmBuilder::CrosvmBuilder() : command_("crosvm") {$/;" f class:cuttlefish::CrosvmBuilder
+CrosvmBuilder host/libs/vm_manager/crosvm_builder.h /^class CrosvmBuilder {$/;" c namespace:cuttlefish
+CrosvmManager host/libs/vm_manager/crosvm_manager.h /^class CrosvmManager : public VmManager {$/;" c namespace:cuttlefish::vm_manager
+CurlResponse host/commands/fetcher/curl_wrapper.h /^struct CurlResponse {$/;" s namespace:cuttlefish
+CurlServerErrorRetryingWrapper host/commands/fetcher/curl_wrapper.cc /^ CurlServerErrorRetryingWrapper(CurlWrapper& inner, int retry_attempts,$/;" f class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper file:
+CurlServerErrorRetryingWrapper host/commands/fetcher/curl_wrapper.cc /^class CurlServerErrorRetryingWrapper : public CurlWrapper {$/;" c namespace:cuttlefish::__anondfffca8d0111 file:
+CurlWrapper host/commands/fetcher/curl_wrapper.h /^class CurlWrapper {$/;" c namespace:cuttlefish
+CurlWrapperImpl host/commands/fetcher/curl_wrapper.cc /^ CurlWrapperImpl() {$/;" f class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl file:
+CurlWrapperImpl host/commands/fetcher/curl_wrapper.cc /^class CurlWrapperImpl : public CurlWrapper {$/;" c namespace:cuttlefish::__anondfffca8d0111 file:
+CurrentDirectory common/libs/utils/files.cpp /^std::string CurrentDirectory() {$/;" f namespace:cuttlefish typeref:typename:std::string
+CurrentFlagsToTypes host/commands/start/flag_forwarder.cc /^std::map<std::string, std::string> CurrentFlagsToTypes() {$/;" f namespace:__anon4552bec90111 typeref:typename:std::map<std::string,std::string>
+Custom Actions build/README.md /^## Custom Actions$/;" s
+CustomActionConfig host/libs/config/custom_actions.h /^struct CustomActionConfig {$/;" s namespace:cuttlefish
+CustomActionConfigFromJson host/libs/config/custom_actions.cpp /^std::optional<CustomActionConfig> CustomActionConfigFromJson($/;" f namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:std::optional<CustomActionConfig>
+CustomActionConfigImpl host/libs/config/custom_actions.cpp /^class CustomActionConfigImpl : public CustomActionConfigProvider {$/;" c namespace:cuttlefish::__anon12e4c76c0111 file:
+CustomActionConfigProvider host/libs/config/custom_actions.h /^class CustomActionConfigProvider : public FlagFeature, public ConfigFragment {$/;" c namespace:cuttlefish
+CustomActions host/libs/config/custom_actions.cpp /^ const std::vector<CustomActionConfig>& CustomActions() const override {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:const std::vector<CustomActionConfig> & file:
+CustomActionsComponent host/libs/config/custom_actions.cpp /^CustomActionsComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<ConfigFlag>,CustomActionConfigProvider>
+Cuttlefish Getting Started README.md /^# Cuttlefish Getting Started$/;" c
+CuttlefishConfig host/libs/config/cuttlefish_config.cpp /^CuttlefishConfig::CuttlefishConfig() : dictionary_(new Json::Value()) {}$/;" f class:cuttlefish::CuttlefishConfig
+CuttlefishConfig host/libs/config/cuttlefish_config.h /^class CuttlefishConfig {$/;" c namespace:cuttlefish
+CuttlefishConfigDefaultInstance host/libs/confui/host_server.cc /^static auto CuttlefishConfigDefaultInstance() {$/;" f namespace:cuttlefish::confui typeref:typename:auto file:
+CuttlefishEnvironment host/commands/run_cvd/main.cc /^class CuttlefishEnvironment : public Feature, public DiagnosticInformation {$/;" c namespace:cuttlefish::__anonadab6e0c0111 file:
+CuttlefishLogEvent host/commands/metrics/proto/cf_log.proto /^message CuttlefishLogEvent {$/;" m package:cuttlefish
+CuttlefishRecoveryUI recovery/recovery_ui.cpp /^class CuttlefishRecoveryUI : public EthernetRecoveryUI {$/;" c file:
+CvdAudioFrameBuffer host/frontend/webrtc/audio_handler.cpp /^ CvdAudioFrameBuffer(const uint8_t* buffer, int bits_per_sample,$/;" f class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer file:
+CvdAudioFrameBuffer host/frontend/webrtc/audio_handler.cpp /^class CvdAudioFrameBuffer : public webrtc_streaming::AudioFrameBuffer {$/;" c namespace:cuttlefish::__anon2a3d92f70111 file:
+CvdBootStateMachine host/commands/run_cvd/boot_state_machine.cc /^class CvdBootStateMachine : public Feature {$/;" c namespace:cuttlefish::__anone7ed366f0111 file:
+CvdCreateSessionDescriptionObserver host/frontend/webrtc/lib/client_handler.cpp /^ CvdCreateSessionDescriptionObserver($/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdCreateSessionDescriptionObserver file:
+CvdCreateSessionDescriptionObserver host/frontend/webrtc/lib/client_handler.cpp /^class CvdCreateSessionDescriptionObserver$/;" c namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 file:
+CvdFile host/libs/config/fetcher_config.cpp /^CvdFile::CvdFile() {$/;" f class:cuttlefish::CvdFile
+CvdFile host/libs/config/fetcher_config.cpp /^CvdFile::CvdFile(const FileSource& source, const std::string& build_id,$/;" f class:cuttlefish::CvdFile
+CvdFile host/libs/config/fetcher_config.h /^struct CvdFile {$/;" s namespace:cuttlefish
+CvdFileToJson host/libs/config/fetcher_config.cpp /^Json::Value CvdFileToJson(const CvdFile& cvd_file) {$/;" f namespace:cuttlefish::__anonf7286d770211 typeref:typename:Json::Value
+CvdHostBugreportMain host/commands/host_bugreport/main.cc /^int CvdHostBugreportMain(int argc, char** argv) {$/;" f namespace:cuttlefish::__anond3364bd20111 typeref:typename:int
+CvdMain host/commands/cvd/main.cc /^int CvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish::__anon483fb9980111 typeref:typename:int
+CvdOnSetRemoteDescription host/frontend/webrtc/lib/client_handler.cpp /^ CvdOnSetRemoteDescription($/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdOnSetRemoteDescription file:
+CvdOnSetRemoteDescription host/frontend/webrtc/lib/client_handler.cpp /^class CvdOnSetRemoteDescription$/;" c namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 file:
+CvdSetSessionDescriptionObserver host/frontend/webrtc/lib/client_handler.cpp /^ CvdSetSessionDescriptionObserver(std::weak_ptr<ClientHandler> client_handler)$/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdSetSessionDescriptionObserver file:
+CvdSetSessionDescriptionObserver host/frontend/webrtc/lib/client_handler.cpp /^class CvdSetSessionDescriptionObserver$/;" c namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 file:
+CvdStatusMain host/commands/status/main.cc /^int CvdStatusMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+CvdVideoFrameBuffer host/frontend/webrtc/cvd_video_frame_buffer.cpp /^CvdVideoFrameBuffer::CvdVideoFrameBuffer(int width, int height)$/;" f class:cuttlefish::CvdVideoFrameBuffer
+CvdVideoFrameBuffer host/frontend/webrtc/cvd_video_frame_buffer.h /^class CvdVideoFrameBuffer : public webrtc_streaming::VideoFrameBuffer {$/;" c namespace:cuttlefish
+D guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^#define D(/;" d
+DATA host/commands/modem_simulator/sim_service.h /^ DATA = 1 << 1, \/\/ to all bear service$/;" e enum:cuttlefish::SimService::FacilityLock::Class
+DATA_REQ_REASOPN_HANDOVER guest/hals/ril/reference-libril/ril.h /^ DATA_REQ_REASOPN_HANDOVER = 0x03, \/\/ The reason of the data request is IWLAN data handov/;" e enum:__anon0bfbaecfbe03
+DATA_REQ_REASOPN_NORMAL guest/hals/ril/reference-libril/ril.h /^ DATA_REQ_REASOPN_NORMAL = 0x01, \/\/ The reason of the data request is normal$/;" e enum:__anon0bfbaecfbe03
+DATA_REQ_REASOPN_SHUTDOWN guest/hals/ril/reference-libril/ril.h /^ DATA_REQ_REASOPN_SHUTDOWN = 0x02, \/\/ The reason of the data request is device shutdown$/;" e enum:__anon0bfbaecfbe03
+DEBUG guest/hals/ril/reference-libril/ril_event.cpp /^#define DEBUG /;" d file:
+DECLARE_TYPE common/libs/utils/cf_endian.h /^#define DECLARE_TYPE(/;" d
+DEFAULT host/commands/modem_simulator/sim_service.h /^ DEFAULT = 7, \/\/ all classes$/;" e enum:cuttlefish::SimService::FacilityLock::Class
+DEFAULT host/commands/modem_simulator/sup_service.h /^ DEFAULT = 0, \/\/ "use subscription default value"$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirType
+DEFAULT_BRANCH host/commands/fetcher/fetch_cvd.cc /^const std::string DEFAULT_BRANCH = "aosp-master";$/;" v namespace:__anonccb356fd0111 typeref:typename:const std::string
+DEFAULT_BUILD host/libs/config/fetcher_config.h /^ DEFAULT_BUILD,$/;" e enum:cuttlefish::FileSource
+DEFAULT_BUILD_TARGET host/commands/fetcher/fetch_cvd.cc /^const std::string DEFAULT_BUILD_TARGET = "aosp_cf_x86_64_phone-userdebug";$/;" v namespace:__anonccb356fd0111 typeref:typename:const std::string
+DEFAULT_MTU guest/hals/ril/reference-ril/reference-ril.c /^#define DEFAULT_MTU /;" d file:
+DF_ADF host/commands/modem_simulator/sim_service.cpp /^static const std::string DF_ADF = "7FFF"; \/\/ UICC access$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+DF_CDMA host/commands/modem_simulator/sim_service.cpp /^static const std::string DF_CDMA = "7F25";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+DF_GRAPHICS host/commands/modem_simulator/sim_service.cpp /^static const std::string DF_GRAPHICS = "5F50";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+DF_GSM host/commands/modem_simulator/sim_service.cpp /^static const std::string DF_GSM = "7F20";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+DF_PHONEBOOK host/commands/modem_simulator/sim_service.cpp /^static const std::string DF_PHONEBOOK = "5F3A";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+DF_TELECOM host/commands/modem_simulator/sim_service.cpp /^static const std::string DF_TELECOM = "7F10";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+DHCPCD_USE_DBUS shared/BoardConfig.mk /^DHCPCD_USE_DBUS := no$/;" m
+DHCPCD_USE_IPV6 shared/BoardConfig.mk /^DHCPCD_USE_IPV6 := no$/;" m
+DHCPCD_USE_SCRIPT shared/BoardConfig.mk /^DHCPCD_USE_SCRIPT := yes$/;" m
+DISABLE host/commands/modem_simulator/sim_service.h /^ DISABLE,$/;" e enum:cuttlefish::SimService::FacilityLock::LockStatus
+DISABLE host/commands/modem_simulator/sup_service.h /^ DISABLE = 0,$/;" e enum:cuttlefish::SupService::CallForwardInfo::CallForwardInfoStatus
+DISABLE_RILD_OEM_HOOK shared/device.mk /^DISABLE_RILD_OEM_HOOK := true$/;" m
+DISK_SIZE_SHIFT common/libs/utils/size_utils.h /^constexpr int DISK_SIZE_SHIFT = 16;$/;" v namespace:cuttlefish typeref:typename:int
+DISPLAY_TEXT host/commands/modem_simulator/stk_service.h /^ DISPLAY_TEXT = 0x21,$/;" e enum:cuttlefish::StkService::CommandType
+DONT_WAKE guest/hals/ril/reference-libril/ril.cpp /^enum WakeType {DONT_WAKE, WAKE_PARTIAL};$/;" e enum:android::WakeType file:
+DONT_WAKE guest/hals/ril/reference-libril/ril_ex.h /^enum SocketWakeType {DONT_WAKE, WAKE_PARTIAL};$/;" e enum:SocketWakeType
+DaemonizeLauncher host/commands/run_cvd/boot_state_machine.cc /^SharedFD DaemonizeLauncher(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish::__anone7ed366f0111 typeref:typename:SharedFD
+DataAvailable common/libs/utils/vsock_connection.cpp /^bool VsockConnection::DataAvailable() const {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+DataImageAction host/libs/config/data_image.cpp /^ enum class DataImageAction { kNoAction, kCreateImage, kResizeImage };$/;" g class:cuttlefish::InitializeDataImageImpl file:
+DataImagePath host/libs/config/data_image.h /^class DataImagePath {$/;" c namespace:cuttlefish
+DataImageTag host/libs/config/data_image.cpp /^struct DataImageTag {};$/;" s namespace:cuttlefish file:
+DataService host/commands/modem_simulator/data_service.cpp /^DataService::DataService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::DataService
+DataService host/commands/modem_simulator/data_service.h /^class DataService : public ModemService, public std::enable_shared_from_this<DataService> {$/;" c namespace:cuttlefish
+DataU host/frontend/webrtc/cvd_video_frame_buffer.cpp /^const uint8_t *CvdVideoFrameBuffer::DataU() const { return u_.data(); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:const uint8_t *
+DataU host/frontend/webrtc/cvd_video_frame_buffer.h /^ uint8_t *DataU() { return u_.data(); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:uint8_t *
+DataU host/frontend/webrtc/lib/video_track_source_impl.cpp /^ const uint8_t *DataU() const override { return frame_buffer_->DataU(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:const uint8_t * file:
+DataV host/frontend/webrtc/cvd_video_frame_buffer.cpp /^const uint8_t *CvdVideoFrameBuffer::DataV() const { return v_.data(); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:const uint8_t *
+DataV host/frontend/webrtc/cvd_video_frame_buffer.h /^ uint8_t *DataV() { return v_.data(); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:uint8_t *
+DataV host/frontend/webrtc/lib/video_track_source_impl.cpp /^ const uint8_t *DataV() const override { return frame_buffer_->DataV(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:const uint8_t * file:
+DataY host/frontend/webrtc/cvd_video_frame_buffer.cpp /^const uint8_t *CvdVideoFrameBuffer::DataY() const { return y_.data(); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:const uint8_t *
+DataY host/frontend/webrtc/cvd_video_frame_buffer.h /^ uint8_t *DataY() { return y_.data(); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:uint8_t *
+DataY host/frontend/webrtc/lib/video_track_source_impl.cpp /^ const uint8_t *DataY() const override { return frame_buffer_->DataY(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:const uint8_t * file:
+DeAndroidSparse host/libs/image_aggregator/image_aggregator.cc /^void DeAndroidSparse(const std::vector<ImagePartition>& partitions) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:void
+Debug Cuttlefish README.md /^## Debug Cuttlefish$/;" s chapter:Cuttlefish Getting Started
+DecodeBase64 common/libs/utils/base64.cpp /^bool DecodeBase64(const std::string &data, std::vector<uint8_t> *buffer) {$/;" f namespace:cuttlefish typeref:typename:bool
+DecodePDU host/commands/modem_simulator/pdu_parser.cpp /^bool PDUParser::DecodePDU(std::string& pdu) {$/;" f class:cuttlefish::PDUParser typeref:typename:bool
+Default common/libs/net/netlink_client.cpp /^NetlinkClientFactory* NetlinkClientFactory::Default() {$/;" f class:cuttlefish::NetlinkClientFactory typeref:typename:NetlinkClientFactory *
+DefaultCustomActionConfig host/libs/config/custom_actions.cpp /^std::string DefaultCustomActionConfig() {$/;" f namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:std::string
+DefaultEnvironmentPath host/libs/config/cuttlefish_config.cpp /^std::string DefaultEnvironmentPath(const char* environment_key,$/;" f namespace:cuttlefish typeref:typename:std::string
+DefaultGuestImagePath host/libs/config/cuttlefish_config.cpp /^std::string DefaultGuestImagePath(const std::string& file_name) {$/;" f namespace:cuttlefish typeref:typename:std::string
+DefaultHostArtifactsPath host/commands/modem_simulator/cf_device_config.cpp /^std::string DeviceConfig::DefaultHostArtifactsPath(const std::string& file) {$/;" f class:cuttlefish::modem::DeviceConfig typeref:typename:std::string
+DefaultHostArtifactsPath host/libs/config/cuttlefish_config.cpp /^std::string DefaultHostArtifactsPath(const std::string& file_name) {$/;" f namespace:cuttlefish typeref:typename:std::string
+DefaultNetworkInterfaces host/commands/assemble_cvd/alloc.cc /^IfaceConfig DefaultNetworkInterfaces(int num) {$/;" f namespace:cuttlefish typeref:typename:IfaceConfig
+DefaultRecord host/commands/secure_env/tpm_gatekeeper.cpp /^gatekeeper::failure_record_t DefaultRecord($/;" f namespace:cuttlefish typeref:typename:gatekeeper::failure_record_t
+DefaultSubprocessLogging host/libs/config/logging.cpp /^void DefaultSubprocessLogging(char* argv[]) {$/;" f namespace:cuttlefish typeref:typename:void
+DeleteAllKeys guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::DeleteAllKeys(const DeleteAllKeysRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+DeleteAllKeys guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::DeleteAllKeys(const DeleteAllKeysRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+DeleteFifos host/commands/run_cvd/server_loop.cpp /^ void DeleteFifos() {$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:void file:
+DeleteIface host/libs/allocd/alloc_utils.cpp /^bool DeleteIface(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+DeleteKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::DeleteKey(const DeleteKeyRequest& request, DeleteKeyResponse* response) {$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+DeleteKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::DeleteKey(const DeleteKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+DeleteTmpFileIfNotChanged host/commands/assemble_cvd/boot_image_utils.cc /^bool DeleteTmpFileIfNotChanged(const std::string& tmp_file, const std::string& current_file) {$/;" f namespace:cuttlefish::__anonbfa95aa40111 typeref:typename:bool
+DeliverEvent host/frontend/webrtc/kernel_log_events_handler.cpp /^void KernelLogEventsHandler::DeliverEvent(const Json::Value& event) {$/;" f class:cuttlefish::KernelLogEventsHandler typeref:typename:void
+DeliverSecureInputEvent guest/hals/confirmationui/guest_session.cpp /^Return<ResponseCode> GuestSession::DeliverSecureInputEvent($/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:Return<ResponseCode>
+Dependencies host/commands/assemble_cvd/disk_flags.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::BootImageRepacker typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/assemble_cvd/disk_flags.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::InitializeAccessKregistryImage typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/assemble_cvd/disk_flags.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::InitializeMetadataImage typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/assemble_cvd/flag_feature.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override {$/;" f class:cuttlefish::ParseGflagsImpl typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/commands/run_cvd/boot_state_machine.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/boot_state_machine.cc /^ std::unordered_set<Feature*> Dependencies() const {$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::BluetoothConnector typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::ConfigServer typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::GnssGrpcProxyServer typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::LogcatReceiver typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::MetricsService typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::OpenWrt typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::RootCanal typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::TombstoneReceiver typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::VehicleHalServer typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::VmmCommands typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::WmediumdServer typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch.cc /^ std::unordered_set<Feature*> Dependencies() const override {$/;" f class:cuttlefish::SecureEnvironment typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch_modem.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::ModemSimulator typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch_streamer.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/launch_streamer.cpp /^ std::unordered_set<Feature*> Dependencies() const override {$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/main.cc /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/server_loop.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/validate.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon8d12954e0111::ValidateHostConfigurationFeature typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/commands/run_cvd/validate.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon8d12954e0111::ValidateTapDevices typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/libs/config/adb/flags.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override {$/;" f class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/libs/config/adb/launch.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon7ea6a0320111::AdbConnector typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/libs/config/adb/launch.cpp /^ std::unordered_set<Feature*> Dependencies() const override {$/;" f class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/libs/config/config_flag.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagPlaceholderImpl typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/libs/config/config_flag.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/libs/config/config_flag.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/libs/config/config_flag.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/libs/config/custom_actions.cpp /^ std::unordered_set<FlagFeature*> Dependencies() const override {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:std::unordered_set<FlagFeature * > file:
+Dependencies host/libs/config/data_image.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::InitializeDataImageImpl typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/libs/config/data_image.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::InitializeEspImageImpl typeref:typename:std::unordered_set<Feature * > file:
+Dependencies host/libs/config/data_image.cpp /^ std::unordered_set<Feature*> Dependencies() const override { return {}; }$/;" f class:cuttlefish::InitializeMiscImageImpl typeref:typename:std::unordered_set<Feature * > file:
+DepsMutator build/cvd-host-package.go /^func (c *cvdHostPackage) DepsMutator(ctx android.BottomUpMutatorContext) {$/;" f struct:cuttlefish.cvdHostPackage
+DeriveBytesFromHbk host/commands/secure_env/tpm_remote_provisioning_context.cpp /^std::vector<uint8_t> TpmRemoteProvisioningContext::DeriveBytesFromHbk($/;" f class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:std::vector<uint8_t>
+Deserialize host/commands/secure_env/composite_serialization.cpp /^bool CompositeSerializable::Deserialize($/;" f class:cuttlefish::CompositeSerializable typeref:typename:bool
+Deserialize host/commands/secure_env/encrypted_serializable.cpp /^bool EncryptedSerializable::Deserialize($/;" f class:cuttlefish::EncryptedSerializable typeref:typename:bool
+Deserialize host/commands/secure_env/hmac_serializable.cpp /^bool HmacSerializable::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {$/;" f class:cuttlefish::HmacSerializable typeref:typename:bool
+Deserialize host/commands/secure_env/json_serializable.cpp /^bool JsonSerializable::Deserialize($/;" f class:cuttlefish::JsonSerializable typeref:typename:bool
+Deserialize host/commands/secure_env/tpm_serialize.cpp /^bool TpmSerializable<T>::Deserialize($/;" f class:cuttlefish::TpmSerializable typeref:typename:bool
+Deserialize host/libs/config/adb/config.cpp /^ bool Deserialize(const Json::Value& json) override {$/;" f class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl typeref:typename:bool file:
+Deserialize host/libs/config/custom_actions.cpp /^ bool Deserialize(const Json::Value& custom_actions_json) override {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:bool file:
+DestroyBridge host/libs/allocd/alloc_utils.cpp /^bool DestroyBridge(const std::string& name) { return DeleteIface(name); }$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyClientHandler host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::DestroyClientHandler(int client_id) {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+DestroyEbtables host/libs/allocd/alloc_utils.cpp /^bool DestroyEbtables(const std::string& name, bool use_ipv4,$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyEthernetBridgeIface host/libs/allocd/alloc_utils.cpp /^bool DestroyEthernetBridgeIface(const std::string& name,$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyEthernetIface host/libs/allocd/alloc_utils.cpp /^bool DestroyEthernetIface(const std::string& name, bool has_ipv4_bridge,$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyGateway host/libs/allocd/alloc_utils.cpp /^bool DestroyGateway(const std::string& name, const std::string& gateway,$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyIface host/libs/allocd/alloc_utils.cpp /^bool DestroyIface(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyInterface host/libs/allocd/request.h /^ DestroyInterface, \/\/ Request to destroy a managed network interface$/;" e enum:cuttlefish::RequestType
+DestroyMobileIface host/libs/allocd/alloc_utils.cpp /^bool DestroyMobileIface(const std::string& name, uint16_t id,$/;" f namespace:cuttlefish typeref:typename:bool
+DestroyUserData host/libs/wayland/wayland_utils.h /^void DestroyUserData(wl_resource* resource) {$/;" f namespace:wayland typeref:typename:void
+Device Details host/frontend/webrtc_operator/assets/client.html /^ <h2>Device Details<\/h2>$/;" i
+DeviceBuild host/commands/fetcher/build_api.h /^ DeviceBuild(const std::string& id, const std::string& target) {$/;" f struct:cuttlefish::DeviceBuild
+DeviceBuild host/commands/fetcher/build_api.h /^struct DeviceBuild {$/;" s namespace:cuttlefish
+DeviceConfig common/libs/device_config/device_config.proto /^message DeviceConfig {$/;" m package:cuttlefish
+DeviceConfig host/commands/modem_simulator/device_config.h /^class DeviceConfig {$/;" c namespace:cuttlefish::modem
+DeviceConfigHelper common/libs/device_config/device_config.cpp /^DeviceConfigHelper::DeviceConfigHelper(const DeviceConfig& device_config)$/;" f class:cuttlefish::DeviceConfigHelper
+DeviceConfigHelper common/libs/device_config/device_config.h /^class DeviceConfigHelper {$/;" c namespace:cuttlefish
+DeviceConnection host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^class DeviceConnection {$/;" c
+DeviceControlApp host/frontend/webrtc_operator/assets/js/app.js /^class DeviceControlApp {$/;" c
+DeviceDetailsUpdater host/frontend/webrtc_operator/assets/js/app.js /^class DeviceDetailsUpdater {$/;" c
+DeviceHandler host/frontend/webrtc_operator/device_handler.cpp /^DeviceHandler::DeviceHandler(struct lws* wsi, DeviceRegistry* registry,$/;" f class:cuttlefish::DeviceHandler
+DeviceHandler host/frontend/webrtc_operator/device_handler.h /^class DeviceHandler : public SignalHandler,$/;" c namespace:cuttlefish
+DeviceHandlerFactory host/frontend/webrtc_operator/device_handler.cpp /^DeviceHandlerFactory::DeviceHandlerFactory(DeviceRegistry* registry,$/;" f class:cuttlefish::DeviceHandlerFactory
+DeviceHandlerFactory host/frontend/webrtc_operator/device_handler.h /^class DeviceHandlerFactory : public WebSocketHandlerFactory {$/;" c namespace:cuttlefish
+DeviceListApp host/frontend/webrtc_operator/assets/js/index.js /^class DeviceListApp {$/;" c
+DeviceListHandler host/frontend/webrtc_operator/device_list_handler.cpp /^DeviceListHandler::DeviceListHandler(struct lws* wsi,$/;" f class:cuttlefish::DeviceListHandler
+DeviceListHandler host/frontend/webrtc_operator/device_list_handler.h /^class DeviceListHandler : public DynHandler {$/;" c namespace:cuttlefish
+DeviceLocked guest/hals/keymaster/remote/remote_keymaster.cpp /^DeviceLockedResponse RemoteKeymaster::DeviceLocked($/;" f class:keymaster::RemoteKeymaster typeref:typename:DeviceLockedResponse
+DeviceLocked guest/hals/keymint/remote/remote_keymaster.cpp /^DeviceLockedResponse RemoteKeymaster::DeviceLocked($/;" f class:keymaster::RemoteKeymaster typeref:typename:DeviceLockedResponse
+DeviceRegistry host/frontend/webrtc_operator/device_registry.h /^class DeviceRegistry {$/;" c namespace:cuttlefish
+DeviceState host/libs/config/custom_actions.h /^struct DeviceState {$/;" s namespace:cuttlefish
+DeviceTpm host/commands/secure_env/device_tpm.cpp /^DeviceTpm::DeviceTpm(const std::string& path) : tpm_(nullptr, &FinalizeTcti) {$/;" f class:cuttlefish::DeviceTpm
+DeviceTpm host/commands/secure_env/device_tpm.h /^class DeviceTpm : public Tpm {$/;" c namespace:cuttlefish
+DeviceType host/commands/metrics/proto/cf_log.proto /^ enum DeviceType {$/;" g message:cuttlefish.CuttlefishLogEvent
+Dhcp4MessageTypeOption common/libs/utils/network.cpp /^struct __attribute__((packed)) Dhcp4MessageTypeOption {$/;" s namespace:cuttlefish file:
+Dhcp4ReleaseMessage common/libs/utils/network.cpp /^struct __attribute__((packed)) Dhcp4ReleaseMessage {$/;" s namespace:cuttlefish file:
+Dhcp4ServerIdentifier common/libs/utils/network.cpp /^struct __attribute__((packed)) Dhcp4ServerIdentifier {$/;" s namespace:cuttlefish file:
+DiagnosticInformation host/commands/run_cvd/reporting.h /^class DiagnosticInformation {$/;" c namespace:cuttlefish
+Diagnostics host/commands/run_cvd/launch.cc /^ std::vector<std::string> Diagnostics() const override {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:std::vector<std::string> file:
+Diagnostics host/commands/run_cvd/launch.cc /^ std::vector<std::string> Diagnostics() const override {$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:std::vector<std::string> file:
+Diagnostics host/commands/run_cvd/launch.cc /^ std::vector<std::string> Diagnostics() const override {$/;" f class:cuttlefish::LogcatReceiver typeref:typename:std::vector<std::string> file:
+Diagnostics host/commands/run_cvd/launch_streamer.cpp /^ std::vector<std::string> Diagnostics() const override {$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:std::vector<std::string> file:
+Diagnostics host/commands/run_cvd/main.cc /^ std::vector<std::string> Diagnostics() const override {$/;" f class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:std::vector<std::string> file:
+Dictionary host/commands/modem_simulator/nvram_config.cpp /^Json::Value* NvramConfig::InstanceSpecific::Dictionary() {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:Json::Value *
+Dictionary host/commands/modem_simulator/nvram_config.cpp /^const Json::Value* NvramConfig::InstanceSpecific::Dictionary() const {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:const Json::Value *
+Dictionary host/libs/config/cuttlefish_config_instance.cpp /^Json::Value* CuttlefishConfig::MutableInstanceSpecific::Dictionary() {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:Json::Value *
+Dictionary host/libs/config/cuttlefish_config_instance.cpp /^const Json::Value* CuttlefishConfig::InstanceSpecific::Dictionary() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:const Json::Value *
+DirectoryBuild host/commands/fetcher/build_api.cc /^DirectoryBuild::DirectoryBuild(const std::vector<std::string>& paths,$/;" f class:cuttlefish::DirectoryBuild
+DirectoryBuild host/commands/fetcher/build_api.h /^struct DirectoryBuild {$/;" s namespace:cuttlefish
+DirectoryContents common/libs/utils/files.cpp /^std::vector<std::string> DirectoryContents(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:std::vector<std::string>
+DirectoryCrc host/libs/config/host_tools_version.cpp /^static std::map<std::string, uint32_t> DirectoryCrc(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:std::map<std::string,uint32_t> file:
+DirectoryExists common/libs/utils/files.cpp /^bool DirectoryExists(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:bool
+Disconnect common/libs/utils/vsock_connection.cpp /^void VsockConnection::Disconnect() {$/;" f class:cuttlefish::VsockConnection typeref:typename:void
+Disconnect host/frontend/webrtc/lib/camera_streamer.cpp /^void CameraStreamer::Disconnect() {$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:void
+DiskChangesComponent host/commands/assemble_cvd/disk_flags.cc /^static fruit::Component<> DiskChangesComponent(const FetcherConfig* fetcher,$/;" f namespace:cuttlefish typeref:typename:fruit::Component<> file:
+DiskChangesPerInstanceComponent host/commands/assemble_cvd/disk_flags.cc /^static fruit::Component<> DiskChangesPerInstanceComponent($/;" f namespace:cuttlefish typeref:typename:fruit::Component<> file:
+DiskSize host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t DiskSize() const {$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:std::uint64_t file:
+DispatchCommand host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::DispatchCommand(const Client& client, std::string& command) {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+Display host/frontend/webrtc/lib/local_recorder.cpp /^LocalRecorder::Display::Display(LocalRecorder::Impl& impl) : impl_(impl) {$/;" f class:cuttlefish::webrtc_streaming::LocalRecorder::Display
+Display host/frontend/webrtc/lib/local_recorder.cpp /^class LocalRecorder::Display$/;" c class:cuttlefish::webrtc_streaming::LocalRecorder file:
+DisplayConfig common/libs/device_config/device_config.proto /^ message DisplayConfig {$/;" m message:cuttlefish.DeviceConfig
+DisplayConfig host/libs/config/cuttlefish_config.h /^ struct DisplayConfig {$/;" s class:cuttlefish::CuttlefishConfig
+DisplayDescriptor host/frontend/webrtc/lib/streamer.cpp /^struct DisplayDescriptor {$/;" s namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 file:
+DisplayHandler host/frontend/webrtc/display_handler.cpp /^DisplayHandler::DisplayHandler($/;" f class:cuttlefish::DisplayHandler
+DisplayHandler host/frontend/webrtc/display_handler.h /^class DisplayHandler {$/;" c namespace:cuttlefish
+DisplayPowerModeChanged host/commands/kernel_log_monitor/kernel_log_server.h /^ DisplayPowerModeChanged = 9,$/;" e enum:monitor::Event
+DnsmasqDhcp4Lease common/libs/utils/network.h /^struct DnsmasqDhcp4Lease {$/;" s namespace:cuttlefish
+DoGet host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ClientDynHandler::DoGet() {$/;" f class:cuttlefish::ClientDynHandler typeref:typename:HttpStatusCode
+DoGet host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ConfigHandler::DoGet() {$/;" f class:cuttlefish::ConfigHandler typeref:typename:HttpStatusCode
+DoGet host/frontend/webrtc_operator/device_list_handler.cpp /^HttpStatusCode DeviceListHandler::DoGet() {$/;" f class:cuttlefish::DeviceListHandler typeref:typename:HttpStatusCode
+DoIoctl guest/commands/vsoc_input_service/virtual_device_base.cpp /^bool DoIoctl(int fd, int request, const uint32_t value) {$/;" f namespace:__anon40cdc2c70111 typeref:typename:bool
+DoPost host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ClientDynHandler::DoPost() {$/;" f class:cuttlefish::ClientDynHandler typeref:typename:HttpStatusCode
+DoPost host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ConfigHandler::DoPost() {$/;" f class:cuttlefish::ConfigHandler typeref:typename:HttpStatusCode
+DoPost host/frontend/webrtc_operator/device_list_handler.cpp /^HttpStatusCode DeviceListHandler::DoPost() {$/;" f class:cuttlefish::DeviceListHandler typeref:typename:HttpStatusCode
+DoPostInner host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ConnectHandler::DoPostInner($/;" f class:cuttlefish::ConnectHandler typeref:typename:HttpStatusCode
+DoPostInner host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ForwardHandler::DoPostInner($/;" f class:cuttlefish::ForwardHandler typeref:typename:HttpStatusCode
+DoPostInner host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode PollHandler::DoPostInner($/;" f class:cuttlefish::PollHandler typeref:typename:HttpStatusCode
+DoVerify host/commands/secure_env/soft_gatekeeper.h /^ bool DoVerify(const password_handle_t* expected_handle, const SizedBuffer& password) {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+DoesCompositeMatchCurrentDiskConfig host/commands/assemble_cvd/disk_flags.cc /^bool DoesCompositeMatchCurrentDiskConfig($/;" f namespace:cuttlefish typeref:typename:bool
+DomKeyCodeToLinux host/frontend/webrtc/lib/keyboard.cpp /^uint16_t DomKeyCodeToLinux(const std::string& dom_KEY_code) {$/;" f typeref:typename:uint16_t
+DownloadToFile host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<std::string> DownloadToFile($/;" f class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:CurlResponse<std::string> file:
+DownloadToFile host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<std::string> DownloadToFile($/;" f class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl typeref:typename:CurlResponse<std::string> file:
+DownloadToJson host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<Json::Value> DownloadToJson($/;" f class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:CurlResponse<Json::Value> file:
+DownloadToJson host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<Json::Value> DownloadToJson($/;" f class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl typeref:typename:CurlResponse<Json::Value> file:
+DownloadToString host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<std::string> DownloadToString($/;" f class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:CurlResponse<std::string> file:
+DownloadToString host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<std::string> DownloadToString($/;" f class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl typeref:typename:CurlResponse<std::string> file:
+DropItemsIfAtCapacity common/libs/concurrency/thread_safe_queue.h /^ bool DropItemsIfAtCapacity() {$/;" f class:cuttlefish::ThreadSafeQueue typeref:typename:bool
+Dump common/libs/net/netlink_request_test.cpp /^void Dump(MatchResultListener* result_listener, const char* title,$/;" f namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:void
+Dup common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Dup(int unmanaged_fd) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+DupFdFlag host/commands/secure_env/secure_env.cpp /^SharedFD DupFdFlag(gflags::int32 fd) {$/;" f namespace:cuttlefish::__anon0a6d9b510111 typeref:typename:SharedFD
+Duration host/commands/metrics/proto/common.proto /^message Duration {$/;" m
+DynHandler host/libs/websocket/websocket_handler.cpp /^DynHandler::DynHandler(struct lws* wsi) : wsi_(wsi), out_buffer_(LWS_PRE, 0) {}$/;" f class:cuttlefish::DynHandler
+DynHandler host/libs/websocket/websocket_handler.h /^class DynHandler {$/;" c namespace:cuttlefish
+DynHandlerFactory host/libs/websocket/websocket_handler.h /^using DynHandlerFactory =$/;" t namespace:cuttlefish
+DynHttpCallback host/libs/websocket/websocket_server.cpp /^int WebSocketServer::DynHttpCallback(struct lws* wsi,$/;" f class:cuttlefish::WebSocketServer typeref:typename:int
+DynServerCallback host/libs/websocket/websocket_server.cpp /^int WebSocketServer::DynServerCallback(struct lws* wsi,$/;" f class:cuttlefish::WebSocketServer typeref:typename:int
+DynamicFlag host/commands/start/flag_forwarder.cc /^ DynamicFlag(const std::string& subprocess, const std::string& name,$/;" f class:DynamicFlag file:
+DynamicFlag host/commands/start/flag_forwarder.cc /^class DynamicFlag : public SubprocessFlag {$/;" c file:
+EFId host/commands/modem_simulator/sim_service.h /^ enum EFId: int32_t {$/;" g struct:cuttlefish::SimService::SimFileSystem typeref:typename:int32_t
+EF_AD host/commands/modem_simulator/sim_service.h /^ EF_AD = 0x6FAD,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_ADN host/commands/modem_simulator/sim_service.h /^ EF_ADN = 0x6F3A,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CFF_CPHS host/commands/modem_simulator/sim_service.h /^ EF_CFF_CPHS = 0x6F13,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CFIS host/commands/modem_simulator/sim_service.h /^ EF_CFIS = 0x6FCB,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_CDMAHOME host/commands/modem_simulator/sim_service.h /^ EF_CSIM_CDMAHOME = 0x6F28,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_EPRL host/commands/modem_simulator/sim_service.h /^ EF_CSIM_EPRL = 0x6F5A,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_IMSIM host/commands/modem_simulator/sim_service.h /^ EF_CSIM_IMSIM = 0x6F22,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_LI host/commands/modem_simulator/sim_service.h /^ EF_CSIM_LI = 0x6F3A,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_MDN host/commands/modem_simulator/sim_service.h /^ EF_CSIM_MDN = 0x6F44,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_MIPUPP host/commands/modem_simulator/sim_service.h /^ EF_CSIM_MIPUPP = 0x6F4D,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSIM_SPN host/commands/modem_simulator/sim_service.h /^ EF_CSIM_SPN =0x6F41,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CSP_CPHS host/commands/modem_simulator/sim_service.h /^ EF_CSP_CPHS = 0x6F15,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_CST host/commands/modem_simulator/sim_service.h /^ EF_CST = 0x6F32,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_DOMAIN host/commands/modem_simulator/sim_service.h /^ EF_DOMAIN = 0x6F03,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_EHPLMN host/commands/modem_simulator/sim_service.h /^ EF_EHPLMN = 0x6FD9,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_EXT1 host/commands/modem_simulator/sim_service.h /^ EF_EXT1 = 0x6F4A,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_EXT2 host/commands/modem_simulator/sim_service.h /^ EF_EXT2 = 0x6F4B,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_EXT3 host/commands/modem_simulator/sim_service.h /^ EF_EXT3 = 0x6F4C,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_EXT5 host/commands/modem_simulator/sim_service.h /^ EF_EXT5 = 0x6F4E,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_EXT6 host/commands/modem_simulator/sim_service.h /^ EF_EXT6 = 0x6FC8, \/\/ Ext record for EF[MBDN]$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_FDN host/commands/modem_simulator/sim_service.h /^ EF_FDN = 0x6F3B,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_FPLMN host/commands/modem_simulator/sim_service.h /^ EF_FPLMN = 0x6F7B,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_GID1 host/commands/modem_simulator/sim_service.h /^ EF_GID1 = 0x6F3E,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_GID2 host/commands/modem_simulator/sim_service.h /^ EF_GID2 = 0x6F3F,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_HPLMN_W_ACT host/commands/modem_simulator/sim_service.h /^ EF_HPLMN_W_ACT = 0x6F62,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_HPPLMN host/commands/modem_simulator/sim_service.h /^ EF_HPPLMN = 0x6F31,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_ICCID host/commands/modem_simulator/sim_service.h /^ EF_ICCID = 0x2FE2,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_IMG host/commands/modem_simulator/sim_service.h /^ EF_IMG = 0x4F20,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_IMPI host/commands/modem_simulator/sim_service.h /^ EF_IMPI = 0x6F02,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_IMPU host/commands/modem_simulator/sim_service.h /^ EF_IMPU = 0x6F04,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_INFO_CPHS host/commands/modem_simulator/sim_service.h /^ EF_INFO_CPHS = 0x6F16,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_IST host/commands/modem_simulator/sim_service.h /^ EF_IST = 0x6F07,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_LI host/commands/modem_simulator/sim_service.h /^ EF_LI = 0x6F05,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_LRPLMNSI host/commands/modem_simulator/sim_service.h /^ EF_LRPLMNSI = 0x6FDC,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_MAILBOX_CPHS host/commands/modem_simulator/sim_service.h /^ EF_MAILBOX_CPHS = 0x6F17,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_MBDN host/commands/modem_simulator/sim_service.h /^ EF_MBDN = 0x6FC7,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_MBI host/commands/modem_simulator/sim_service.h /^ EF_MBI = 0x6FC9,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_MSISDN host/commands/modem_simulator/sim_service.h /^ EF_MSISDN = 0x6F40,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_MWIS host/commands/modem_simulator/sim_service.h /^ EF_MWIS = 0x6FCA,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_OPL host/commands/modem_simulator/sim_service.h /^ EF_OPL = 0x6FC6,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_OPLMN_W_ACT host/commands/modem_simulator/sim_service.h /^ EF_OPLMN_W_ACT = 0x6F61,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_PBR host/commands/modem_simulator/sim_service.h /^ EF_PBR = 0x4F30,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_PCSCF host/commands/modem_simulator/sim_service.h /^ EF_PCSCF = 0x6F09,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_PL host/commands/modem_simulator/sim_service.h /^ EF_PL = 0x2F05,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_PLMN_W_ACT host/commands/modem_simulator/sim_service.h /^ EF_PLMN_W_ACT = 0x6F60,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_PNN host/commands/modem_simulator/sim_service.h /^ EF_PNN = 0x6FC5,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_PSI host/commands/modem_simulator/sim_service.h /^ EF_PSI = 0x6FE5,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_RUIM_SPN host/commands/modem_simulator/sim_service.h /^ EF_RUIM_SPN =0x6F41,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SDN host/commands/modem_simulator/sim_service.h /^ EF_SDN = 0x6F49,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SMS host/commands/modem_simulator/sim_service.h /^ EF_SMS = 0x6F3C,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SPDI host/commands/modem_simulator/sim_service.h /^ EF_SPDI = 0x6FCD,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SPN host/commands/modem_simulator/sim_service.h /^ EF_SPN = 0x6F46,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SPN_CPHS host/commands/modem_simulator/sim_service.h /^ EF_SPN_CPHS = 0x6F14,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SPN_SHORT_CPHS host/commands/modem_simulator/sim_service.h /^ EF_SPN_SHORT_CPHS = 0x6F18,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_SST host/commands/modem_simulator/sim_service.h /^ EF_SST = 0x6F38,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EF_TYPE_CYCLIC guest/hals/ril/reference-ril/reference-ril.c /^#define EF_TYPE_CYCLIC /;" d file:
+EF_TYPE_LINEAR_FIXED guest/hals/ril/reference-ril/reference-ril.c /^#define EF_TYPE_LINEAR_FIXED /;" d file:
+EF_TYPE_TRANSPARENT guest/hals/ril/reference-ril/reference-ril.c /^#define EF_TYPE_TRANSPARENT /;" d file:
+EF_VOICE_MAIL_INDICATOR_CPHS host/commands/modem_simulator/sim_service.h /^ EF_VOICE_MAIL_INDICATOR_CPHS = 0x6F11,$/;" e enum:cuttlefish::SimService::SimFileSystem::EFId
+EGLAPI host/libs/graphics_detector/include/EGL/eglplatform.h /^#define EGLAPI /;" d
+EGLAPIENTRY host/libs/graphics_detector/include/EGL/eglplatform.h /^#define EGLAPIENTRY /;" d
+EGLAPIENTRYP host/libs/graphics_detector/include/EGL/eglext.h /^typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dp/;" t typeref:struct:wl_buffer * ()(EGLDisplay dpy,EGLImageKHR image)EGLAPI struct wl_buffer * EGLAPIENTRY eglCreateWaylandBufferFromImageWL (EGLDisplay dpy,EGLImageKHR image)
+EGLAPIENTRYP host/libs/graphics_detector/include/EGL/eglplatform.h /^#define EGLAPIENTRYP /;" d
+EGLAttrib host/libs/graphics_detector/include/EGL/egl.h /^typedef intptr_t EGLAttrib;$/;" t typeref:typename:intptr_t
+EGLAttribKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef intptr_t EGLAttribKHR;$/;" t typeref:typename:intptr_t
+EGLBoolean host/libs/graphics_detector/include/EGL/egl.h /^typedef unsigned int EGLBoolean;$/;" t typeref:typename:unsigned int
+EGLClientBuffer host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLClientBuffer;$/;" t typeref:typename:void *
+EGLClientPixmapHI host/libs/graphics_detector/include/EGL/eglext.h /^struct EGLClientPixmapHI {$/;" s
+EGLConfig host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLConfig;$/;" t typeref:typename:void *
+EGLContext host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLContext;$/;" t typeref:typename:void *
+EGLDEBUGPROCKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageTyp/;" t typeref:typename:void (EGLAPIENTRY *)(EGLenum error,const char * command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char * message)
+EGLDeviceEXT host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLDeviceEXT;$/;" t typeref:typename:void *
+EGLDisplay host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLDisplay;$/;" t typeref:typename:void *
+EGLGetBlobFuncANDROID host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void/;" t typeref:typename:EGLsizeiANDROID (*)(const void * key,EGLsizeiANDROID keySize,void * value,EGLsizeiANDROID valueSize)
+EGLImage host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLImage;$/;" t typeref:typename:void *
+EGLImageKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLImageKHR;$/;" t typeref:typename:void *
+EGLLabelKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLLabelKHR;$/;" t typeref:typename:void *
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef Display *EGLNativeDisplayType;$/;" t typeref:typename:Display *
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef HDC EGLNativeDisplayType;$/;" t typeref:typename:HDC
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef int EGLNativeDisplayType;$/;" t typeref:typename:int
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef int EGLNativeDisplayType;$/;" t typeref:typename:int
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef intptr_t EGLNativeDisplayType;$/;" t typeref:typename:intptr_t
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct gbm_device *EGLNativeDisplayType;$/;" t typeref:struct:gbm_device *
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct wl_display *EGLNativeDisplayType;$/;" t typeref:struct:wl_display *
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef void *EGLNativeDisplayType;$/;" t typeref:typename:void *
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef void *EGLNativeDisplayType;$/;" t typeref:typename:void *
+EGLNativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef void* EGLNativeDisplayType;$/;" t typeref:typename:void *
+EGLNativeFileDescriptorKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef int EGLNativeFileDescriptorKHR;$/;" t typeref:typename:int
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef HBITMAP EGLNativePixmapType;$/;" t typeref:typename:HBITMAP
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef Pixmap EGLNativePixmapType;$/;" t typeref:typename:Pixmap
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef int EGLNativePixmapType;$/;" t typeref:typename:int
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef intptr_t EGLNativePixmapType;$/;" t typeref:typename:intptr_t
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef khronos_uintptr_t EGLNativePixmapType;$/;" t typeref:typename:khronos_uintptr_t
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef khronos_uintptr_t EGLNativePixmapType;$/;" t typeref:typename:khronos_uintptr_t
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct egl_native_pixmap_t* EGLNativePixmapType;$/;" t typeref:struct:egl_native_pixmap_t *
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct gbm_bo *EGLNativePixmapType;$/;" t typeref:struct:gbm_bo *
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct wl_egl_pixmap *EGLNativePixmapType;$/;" t typeref:struct:wl_egl_pixmap *
+EGLNativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef void *EGLNativePixmapType;$/;" t typeref:typename:void *
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef HWND EGLNativeWindowType;$/;" t typeref:typename:HWND
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef Window EGLNativeWindowType;$/;" t typeref:typename:Window
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef int EGLNativeWindowType;$/;" t typeref:typename:int
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef intptr_t EGLNativeWindowType;$/;" t typeref:typename:intptr_t
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef khronos_uintptr_t EGLNativeWindowType;$/;" t typeref:typename:khronos_uintptr_t
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef khronos_uintptr_t EGLNativeWindowType;$/;" t typeref:typename:khronos_uintptr_t
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct ANativeWindow* EGLNativeWindowType;$/;" t typeref:struct:ANativeWindow *
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef struct wl_egl_window *EGLNativeWindowType;$/;" t typeref:struct:wl_egl_window *
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef void *EGLNativeWindowType;$/;" t typeref:typename:void *
+EGLNativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef void *EGLNativeWindowType;$/;" t typeref:typename:void *
+EGLObjectKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLObjectKHR;$/;" t typeref:typename:void *
+EGLOutputLayerEXT host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLOutputLayerEXT;$/;" t typeref:typename:void *
+EGLOutputPortEXT host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLOutputPortEXT;$/;" t typeref:typename:void *
+EGLSetBlobFuncANDROID host/libs/graphics_detector/include/EGL/eglext.h /^typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *val/;" t typeref:typename:void (*)(const void * key,EGLsizeiANDROID keySize,const void * value,EGLsizeiANDROID valueSize)
+EGLStreamKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLStreamKHR;$/;" t typeref:typename:void *
+EGLSurface host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLSurface;$/;" t typeref:typename:void *
+EGLSync host/libs/graphics_detector/include/EGL/egl.h /^typedef void *EGLSync;$/;" t typeref:typename:void *
+EGLSyncKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLSyncKHR;$/;" t typeref:typename:void *
+EGLSyncNV host/libs/graphics_detector/include/EGL/eglext.h /^typedef void *EGLSyncNV;$/;" t typeref:typename:void *
+EGLTime host/libs/graphics_detector/include/EGL/egl.h /^typedef khronos_utime_nanoseconds_t EGLTime;$/;" t typeref:typename:khronos_utime_nanoseconds_t
+EGLTimeKHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef khronos_utime_nanoseconds_t EGLTimeKHR;$/;" t typeref:typename:khronos_utime_nanoseconds_t
+EGLTimeNV host/libs/graphics_detector/include/EGL/eglext.h /^typedef khronos_utime_nanoseconds_t EGLTimeNV;$/;" t typeref:typename:khronos_utime_nanoseconds_t
+EGL_ALPHA_FORMAT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_ALPHA_FORMAT /;" d
+EGL_ALPHA_FORMAT_NONPRE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_ALPHA_FORMAT_NONPRE /;" d
+EGL_ALPHA_FORMAT_PRE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_ALPHA_FORMAT_PRE /;" d
+EGL_ALPHA_MASK_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_ALPHA_MASK_SIZE /;" d
+EGL_ALPHA_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_ALPHA_SIZE /;" d
+EGL_ALREADY_SIGNALED_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ALREADY_SIGNALED_NV /;" d
+EGL_ANDROID_GLES_layers host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_GLES_layers /;" d
+EGL_ANDROID_blob_cache host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_blob_cache /;" d
+EGL_ANDROID_create_native_client_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_create_native_client_buffer /;" d
+EGL_ANDROID_framebuffer_target host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_framebuffer_target /;" d
+EGL_ANDROID_front_buffer_auto_refresh host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_front_buffer_auto_refresh /;" d
+EGL_ANDROID_get_frame_timestamps host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_get_frame_timestamps /;" d
+EGL_ANDROID_get_native_client_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_get_native_client_buffer /;" d
+EGL_ANDROID_image_native_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_image_native_buffer /;" d
+EGL_ANDROID_native_fence_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_native_fence_sync /;" d
+EGL_ANDROID_presentation_time host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_presentation_time /;" d
+EGL_ANDROID_recordable host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANDROID_recordable /;" d
+EGL_ANGLE_d3d_share_handle_client_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANGLE_d3d_share_handle_client_buffer /;" d
+EGL_ANGLE_device_d3d host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANGLE_device_d3d /;" d
+EGL_ANGLE_query_surface_pointer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANGLE_query_surface_pointer /;" d
+EGL_ANGLE_surface_d3d_texture_2d_share_handle host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANGLE_surface_d3d_texture_2d_share_handle /;" d
+EGL_ANGLE_window_fixed_size host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ANGLE_window_fixed_size /;" d
+EGL_ARM_image_format host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ARM_image_format /;" d
+EGL_ARM_implicit_external_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ARM_implicit_external_sync /;" d
+EGL_ARM_pixmap_multisample_discard host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ARM_pixmap_multisample_discard /;" d
+EGL_AUTO_STEREO_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_AUTO_STEREO_NV /;" d
+EGL_BACK_BUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BACK_BUFFER /;" d
+EGL_BAD_ACCESS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_ACCESS /;" d
+EGL_BAD_ALLOC host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_ALLOC /;" d
+EGL_BAD_ATTRIBUTE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_ATTRIBUTE /;" d
+EGL_BAD_CONFIG host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_CONFIG /;" d
+EGL_BAD_CONTEXT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_CONTEXT /;" d
+EGL_BAD_CURRENT_SURFACE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_CURRENT_SURFACE /;" d
+EGL_BAD_DEVICE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BAD_DEVICE_EXT /;" d
+EGL_BAD_DISPLAY host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_DISPLAY /;" d
+EGL_BAD_MATCH host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_MATCH /;" d
+EGL_BAD_NATIVE_PIXMAP host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_NATIVE_PIXMAP /;" d
+EGL_BAD_NATIVE_WINDOW host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_NATIVE_WINDOW /;" d
+EGL_BAD_OUTPUT_LAYER_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BAD_OUTPUT_LAYER_EXT /;" d
+EGL_BAD_OUTPUT_PORT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BAD_OUTPUT_PORT_EXT /;" d
+EGL_BAD_PARAMETER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_PARAMETER /;" d
+EGL_BAD_STATE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BAD_STATE_KHR /;" d
+EGL_BAD_STREAM_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BAD_STREAM_KHR /;" d
+EGL_BAD_SURFACE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BAD_SURFACE /;" d
+EGL_BIND_TO_TEXTURE_RGB host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BIND_TO_TEXTURE_RGB /;" d
+EGL_BIND_TO_TEXTURE_RGBA host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BIND_TO_TEXTURE_RGBA /;" d
+EGL_BITMAP_ORIGIN_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_ORIGIN_KHR /;" d
+EGL_BITMAP_PITCH_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PITCH_KHR /;" d
+EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR /;" d
+EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR /;" d
+EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR /;" d
+EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR /;" d
+EGL_BITMAP_PIXEL_RED_OFFSET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR /;" d
+EGL_BITMAP_PIXEL_SIZE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_PIXEL_SIZE_KHR /;" d
+EGL_BITMAP_POINTER_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BITMAP_POINTER_KHR /;" d
+EGL_BLUE_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BLUE_SIZE /;" d
+EGL_BOTTOM_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BOTTOM_NV /;" d
+EGL_BUFFER_AGE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BUFFER_AGE_EXT /;" d
+EGL_BUFFER_AGE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_BUFFER_AGE_KHR /;" d
+EGL_BUFFER_DESTROYED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BUFFER_DESTROYED /;" d
+EGL_BUFFER_PRESERVED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BUFFER_PRESERVED /;" d
+EGL_BUFFER_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_BUFFER_SIZE /;" d
+EGL_CAST host/libs/graphics_detector/include/EGL/eglplatform.h /^#define EGL_CAST(/;" d
+EGL_CLIENT_APIS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CLIENT_APIS /;" d
+EGL_CLIENT_PIXMAP_POINTER_HI host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CLIENT_PIXMAP_POINTER_HI /;" d
+EGL_CL_EVENT_HANDLE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CL_EVENT_HANDLE /;" d
+EGL_CL_EVENT_HANDLE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CL_EVENT_HANDLE_KHR /;" d
+EGL_COLORSPACE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_COLORSPACE /;" d
+EGL_COLORSPACE_LINEAR host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_COLORSPACE_LINEAR /;" d
+EGL_COLORSPACE_sRGB host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_COLORSPACE_sRGB /;" d
+EGL_COLOR_ARGB_HI host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_ARGB_HI /;" d
+EGL_COLOR_BUFFER_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_COLOR_BUFFER_TYPE /;" d
+EGL_COLOR_COMPONENT_TYPE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_COMPONENT_TYPE_EXT /;" d
+EGL_COLOR_COMPONENT_TYPE_FIXED_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT /;" d
+EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT /;" d
+EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM /;" d
+EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM /;" d
+EGL_COLOR_FORMAT_HI host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_FORMAT_HI /;" d
+EGL_COLOR_RGBA_HI host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_RGBA_HI /;" d
+EGL_COLOR_RGB_HI host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COLOR_RGB_HI /;" d
+EGL_COMPOSITE_DEADLINE_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COMPOSITE_DEADLINE_ANDROID /;" d
+EGL_COMPOSITE_INTERVAL_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COMPOSITE_INTERVAL_ANDROID /;" d
+EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID /;" d
+EGL_COMPOSITION_LATCH_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COMPOSITION_LATCH_TIME_ANDROID /;" d
+EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT /;" d
+EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT /;" d
+EGL_CONDITION_SATISFIED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONDITION_SATISFIED /;" d
+EGL_CONDITION_SATISFIED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONDITION_SATISFIED_KHR /;" d
+EGL_CONDITION_SATISFIED_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONDITION_SATISFIED_NV /;" d
+EGL_CONFIG_CAVEAT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONFIG_CAVEAT /;" d
+EGL_CONFIG_ID host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONFIG_ID /;" d
+EGL_CONFORMANT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONFORMANT /;" d
+EGL_CONFORMANT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONFORMANT_KHR /;" d
+EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR /;" d
+EGL_CONSUMER_AUTO_ORIENTATION_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONSUMER_AUTO_ORIENTATION_NV /;" d
+EGL_CONSUMER_FRAME_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONSUMER_FRAME_KHR /;" d
+EGL_CONSUMER_LATENCY_USEC_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONSUMER_LATENCY_USEC_KHR /;" d
+EGL_CONSUMER_MAX_FRAME_HINT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONSUMER_MAX_FRAME_HINT_NV /;" d
+EGL_CONSUMER_METADATA_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONSUMER_METADATA_NV /;" d
+EGL_CONTEXT_CLIENT_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_CLIENT_TYPE /;" d
+EGL_CONTEXT_CLIENT_VERSION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_CLIENT_VERSION /;" d
+EGL_CONTEXT_FLAGS_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_FLAGS_KHR /;" d
+EGL_CONTEXT_LOST host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_LOST /;" d
+EGL_CONTEXT_MAJOR_VERSION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_MAJOR_VERSION /;" d
+EGL_CONTEXT_MAJOR_VERSION_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_MAJOR_VERSION_KHR /;" d
+EGL_CONTEXT_MINOR_VERSION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_MINOR_VERSION /;" d
+EGL_CONTEXT_MINOR_VERSION_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_MINOR_VERSION_KHR /;" d
+EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT /;" d
+EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR /;" d
+EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT /;" d
+EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR /;" d
+EGL_CONTEXT_OPENGL_DEBUG host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_DEBUG /;" d
+EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR /;" d
+EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE /;" d
+EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR /;" d
+EGL_CONTEXT_OPENGL_NO_ERROR_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR /;" d
+EGL_CONTEXT_OPENGL_PROFILE_MASK host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_PROFILE_MASK /;" d
+EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR /;" d
+EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY /;" d
+EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT /;" d
+EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR /;" d
+EGL_CONTEXT_OPENGL_ROBUST_ACCESS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS /;" d
+EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR /;" d
+EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT /;" d
+EGL_CONTEXT_PRIORITY_HIGH_IMG host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_PRIORITY_HIGH_IMG /;" d
+EGL_CONTEXT_PRIORITY_LEVEL_IMG host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_PRIORITY_LEVEL_IMG /;" d
+EGL_CONTEXT_PRIORITY_LOW_IMG host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_PRIORITY_LOW_IMG /;" d
+EGL_CONTEXT_PRIORITY_MEDIUM_IMG host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG /;" d
+EGL_CONTEXT_PRIORITY_REALTIME_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_PRIORITY_REALTIME_NV /;" d
+EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR /;" d
+EGL_CONTEXT_RELEASE_BEHAVIOR_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR /;" d
+EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR /;" d
+EGL_CORE_NATIVE_ENGINE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_CORE_NATIVE_ENGINE /;" d
+EGL_COVERAGE_BUFFERS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COVERAGE_BUFFERS_NV /;" d
+EGL_COVERAGE_SAMPLES_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COVERAGE_SAMPLES_NV /;" d
+EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV /;" d
+EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV /;" d
+EGL_COVERAGE_SAMPLE_RESOLVE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_COVERAGE_SAMPLE_RESOLVE_NV /;" d
+EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT /;" d
+EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT /;" d
+EGL_CUDA_DEVICE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CUDA_DEVICE_NV /;" d
+EGL_CUDA_EVENT_HANDLE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_CUDA_EVENT_HANDLE_NV /;" d
+EGL_D3D11_DEVICE_ANGLE host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_D3D11_DEVICE_ANGLE /;" d
+EGL_D3D9_DEVICE_ANGLE host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_D3D9_DEVICE_ANGLE /;" d
+EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE /;" d
+EGL_DEBUG_CALLBACK_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEBUG_CALLBACK_KHR /;" d
+EGL_DEBUG_MSG_CRITICAL_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEBUG_MSG_CRITICAL_KHR /;" d
+EGL_DEBUG_MSG_ERROR_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEBUG_MSG_ERROR_KHR /;" d
+EGL_DEBUG_MSG_INFO_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEBUG_MSG_INFO_KHR /;" d
+EGL_DEBUG_MSG_WARN_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEBUG_MSG_WARN_KHR /;" d
+EGL_DEFAULT_DISPLAY host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_DEFAULT_DISPLAY /;" d
+EGL_DEPTH_ENCODING_NONE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEPTH_ENCODING_NONE_NV /;" d
+EGL_DEPTH_ENCODING_NONLINEAR_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEPTH_ENCODING_NONLINEAR_NV /;" d
+EGL_DEPTH_ENCODING_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEPTH_ENCODING_NV /;" d
+EGL_DEPTH_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_DEPTH_SIZE /;" d
+EGL_DEQUEUE_READY_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEQUEUE_READY_TIME_ANDROID /;" d
+EGL_DEVICE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DEVICE_EXT /;" d
+EGL_DISCARD_SAMPLES_ARM host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DISCARD_SAMPLES_ARM /;" d
+EGL_DISPLAY_PRESENT_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DISPLAY_PRESENT_TIME_ANDROID /;" d
+EGL_DISPLAY_SCALING host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_DISPLAY_SCALING /;" d
+EGL_DMA_BUF_PLANE0_FD_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE0_FD_EXT /;" d
+EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT /;" d
+EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT /;" d
+EGL_DMA_BUF_PLANE0_OFFSET_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE0_OFFSET_EXT /;" d
+EGL_DMA_BUF_PLANE0_PITCH_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE0_PITCH_EXT /;" d
+EGL_DMA_BUF_PLANE1_FD_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE1_FD_EXT /;" d
+EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT /;" d
+EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT /;" d
+EGL_DMA_BUF_PLANE1_OFFSET_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE1_OFFSET_EXT /;" d
+EGL_DMA_BUF_PLANE1_PITCH_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE1_PITCH_EXT /;" d
+EGL_DMA_BUF_PLANE2_FD_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE2_FD_EXT /;" d
+EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT /;" d
+EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT /;" d
+EGL_DMA_BUF_PLANE2_OFFSET_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE2_OFFSET_EXT /;" d
+EGL_DMA_BUF_PLANE2_PITCH_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE2_PITCH_EXT /;" d
+EGL_DMA_BUF_PLANE3_FD_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE3_FD_EXT /;" d
+EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT /;" d
+EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT /;" d
+EGL_DMA_BUF_PLANE3_OFFSET_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE3_OFFSET_EXT /;" d
+EGL_DMA_BUF_PLANE3_PITCH_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DMA_BUF_PLANE3_PITCH_EXT /;" d
+EGL_DONT_CARE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_DONT_CARE /;" d
+EGL_DRAW host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_DRAW /;" d
+EGL_DRM_BUFFER_FORMAT_ARGB32_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA /;" d
+EGL_DRM_BUFFER_FORMAT_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_FORMAT_MESA /;" d
+EGL_DRM_BUFFER_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_MESA /;" d
+EGL_DRM_BUFFER_STRIDE_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_STRIDE_MESA /;" d
+EGL_DRM_BUFFER_USE_CURSOR_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_USE_CURSOR_MESA /;" d
+EGL_DRM_BUFFER_USE_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_USE_MESA /;" d
+EGL_DRM_BUFFER_USE_SCANOUT_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_USE_SCANOUT_MESA /;" d
+EGL_DRM_BUFFER_USE_SHARE_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_BUFFER_USE_SHARE_MESA /;" d
+EGL_DRM_CONNECTOR_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_CONNECTOR_EXT /;" d
+EGL_DRM_CRTC_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_CRTC_EXT /;" d
+EGL_DRM_DEVICE_FILE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_DEVICE_FILE_EXT /;" d
+EGL_DRM_MASTER_FD_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_MASTER_FD_EXT /;" d
+EGL_DRM_PLANE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_DRM_PLANE_EXT /;" d
+EGL_EGLEXT_VERSION host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EGLEXT_VERSION /;" d
+EGL_EGL_PROTOTYPES host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_EGL_PROTOTYPES /;" d
+EGL_EXTENSIONS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_EXTENSIONS /;" d
+EGL_EXTERNAL_REF_ID_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXTERNAL_REF_ID_EXT /;" d
+EGL_EXT_bind_to_front host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_bind_to_front /;" d
+EGL_EXT_buffer_age host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_buffer_age /;" d
+EGL_EXT_client_extensions host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_client_extensions /;" d
+EGL_EXT_client_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_client_sync /;" d
+EGL_EXT_compositor host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_compositor /;" d
+EGL_EXT_create_context_robustness host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_create_context_robustness /;" d
+EGL_EXT_device_base host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_device_base /;" d
+EGL_EXT_device_drm host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_device_drm /;" d
+EGL_EXT_device_enumeration host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_device_enumeration /;" d
+EGL_EXT_device_openwf host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_device_openwf /;" d
+EGL_EXT_device_query host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_device_query /;" d
+EGL_EXT_gl_colorspace_bt2020_linear host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_bt2020_linear /;" d
+EGL_EXT_gl_colorspace_bt2020_pq host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_bt2020_pq /;" d
+EGL_EXT_gl_colorspace_display_p3 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_display_p3 /;" d
+EGL_EXT_gl_colorspace_display_p3_linear host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_display_p3_linear /;" d
+EGL_EXT_gl_colorspace_display_p3_passthrough host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_display_p3_passthrough /;" d
+EGL_EXT_gl_colorspace_scrgb host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_scrgb /;" d
+EGL_EXT_gl_colorspace_scrgb_linear host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_gl_colorspace_scrgb_linear /;" d
+EGL_EXT_image_dma_buf_import host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_image_dma_buf_import /;" d
+EGL_EXT_image_dma_buf_import_modifiers host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_image_dma_buf_import_modifiers /;" d
+EGL_EXT_image_gl_colorspace host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_image_gl_colorspace /;" d
+EGL_EXT_image_implicit_sync_control host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_image_implicit_sync_control /;" d
+EGL_EXT_multiview_window host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_multiview_window /;" d
+EGL_EXT_output_base host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_output_base /;" d
+EGL_EXT_output_drm host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_output_drm /;" d
+EGL_EXT_output_openwf host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_output_openwf /;" d
+EGL_EXT_pixel_format_float host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_pixel_format_float /;" d
+EGL_EXT_platform_base host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_platform_base /;" d
+EGL_EXT_platform_device host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_platform_device /;" d
+EGL_EXT_platform_wayland host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_platform_wayland /;" d
+EGL_EXT_platform_x11 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_platform_x11 /;" d
+EGL_EXT_protected_content host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_protected_content /;" d
+EGL_EXT_protected_surface host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_protected_surface /;" d
+EGL_EXT_stream_consumer_egloutput host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_stream_consumer_egloutput /;" d
+EGL_EXT_surface_CTA861_3_metadata host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_surface_CTA861_3_metadata /;" d
+EGL_EXT_surface_SMPTE2086_metadata host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_surface_SMPTE2086_metadata /;" d
+EGL_EXT_swap_buffers_with_damage host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_swap_buffers_with_damage /;" d
+EGL_EXT_sync_reuse host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_sync_reuse /;" d
+EGL_EXT_yuv_surface host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_EXT_yuv_surface /;" d
+EGL_FALSE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_FALSE /;" d
+EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID /;" d
+EGL_FIRST_COMPOSITION_START_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID /;" d
+EGL_FIXED_SIZE_ANGLE host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FIXED_SIZE_ANGLE /;" d
+EGL_FOREVER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_FOREVER /;" d
+EGL_FOREVER_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FOREVER_KHR /;" d
+EGL_FOREVER_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FOREVER_NV /;" d
+EGL_FORMAT_RGBA_8888_EXACT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FORMAT_RGBA_8888_EXACT_KHR /;" d
+EGL_FORMAT_RGBA_8888_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FORMAT_RGBA_8888_KHR /;" d
+EGL_FORMAT_RGB_565_EXACT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FORMAT_RGB_565_EXACT_KHR /;" d
+EGL_FORMAT_RGB_565_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FORMAT_RGB_565_KHR /;" d
+EGL_FRAMEBUFFER_TARGET_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FRAMEBUFFER_TARGET_ANDROID /;" d
+EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID /;" d
+EGL_FRONT_BUFFER_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_FRONT_BUFFER_EXT /;" d
+EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV /;" d
+EGL_GL_COLORSPACE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_COLORSPACE /;" d
+EGL_GL_COLORSPACE_BT2020_LINEAR_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT /;" d
+EGL_GL_COLORSPACE_BT2020_PQ_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_BT2020_PQ_EXT /;" d
+EGL_GL_COLORSPACE_DEFAULT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_DEFAULT_EXT /;" d
+EGL_GL_COLORSPACE_DISPLAY_P3_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_DISPLAY_P3_EXT /;" d
+EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT /;" d
+EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT /;" d
+EGL_GL_COLORSPACE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_KHR /;" d
+EGL_GL_COLORSPACE_LINEAR host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_COLORSPACE_LINEAR /;" d
+EGL_GL_COLORSPACE_LINEAR_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_LINEAR_KHR /;" d
+EGL_GL_COLORSPACE_SCRGB_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_SCRGB_EXT /;" d
+EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT /;" d
+EGL_GL_COLORSPACE_SRGB host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_COLORSPACE_SRGB /;" d
+EGL_GL_COLORSPACE_SRGB_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_COLORSPACE_SRGB_KHR /;" d
+EGL_GL_RENDERBUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_RENDERBUFFER /;" d
+EGL_GL_RENDERBUFFER_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_RENDERBUFFER_KHR /;" d
+EGL_GL_TEXTURE_2D host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_2D /;" d
+EGL_GL_TEXTURE_2D_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_2D_KHR /;" d
+EGL_GL_TEXTURE_3D host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_3D /;" d
+EGL_GL_TEXTURE_3D_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_3D_KHR /;" d
+EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X /;" d
+EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR /;" d
+EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y /;" d
+EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR /;" d
+EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z /;" d
+EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR /;" d
+EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X /;" d
+EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR /;" d
+EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y /;" d
+EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR /;" d
+EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z /;" d
+EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR /;" d
+EGL_GL_TEXTURE_LEVEL host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_LEVEL /;" d
+EGL_GL_TEXTURE_LEVEL_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_LEVEL_KHR /;" d
+EGL_GL_TEXTURE_ZOFFSET host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GL_TEXTURE_ZOFFSET /;" d
+EGL_GL_TEXTURE_ZOFFSET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_GL_TEXTURE_ZOFFSET_KHR /;" d
+EGL_GREEN_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_GREEN_SIZE /;" d
+EGL_HEIGHT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_HEIGHT /;" d
+EGL_HI_clientpixmap host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_HI_clientpixmap /;" d
+EGL_HI_colorformats host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_HI_colorformats /;" d
+EGL_HORIZONTAL_RESOLUTION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_HORIZONTAL_RESOLUTION /;" d
+EGL_IMAGE_PRESERVED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_IMAGE_PRESERVED /;" d
+EGL_IMAGE_PRESERVED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_IMAGE_PRESERVED_KHR /;" d
+EGL_IMG_context_priority host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_IMG_context_priority /;" d
+EGL_IMG_image_plane_attribs host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_IMG_image_plane_attribs /;" d
+EGL_IMPORT_EXPLICIT_SYNC_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_IMPORT_EXPLICIT_SYNC_EXT /;" d
+EGL_IMPORT_IMPLICIT_SYNC_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_IMPORT_IMPLICIT_SYNC_EXT /;" d
+EGL_IMPORT_SYNC_TYPE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_IMPORT_SYNC_TYPE_EXT /;" d
+EGL_ITU_REC2020_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ITU_REC2020_EXT /;" d
+EGL_ITU_REC601_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ITU_REC601_EXT /;" d
+EGL_ITU_REC709_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_ITU_REC709_EXT /;" d
+EGL_KHR_cl_event host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_cl_event /;" d
+EGL_KHR_cl_event2 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_cl_event2 /;" d
+EGL_KHR_client_get_all_proc_addresses host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_client_get_all_proc_addresses /;" d
+EGL_KHR_config_attribs host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_config_attribs /;" d
+EGL_KHR_context_flush_control host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_context_flush_control /;" d
+EGL_KHR_create_context host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_create_context /;" d
+EGL_KHR_create_context_no_error host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_create_context_no_error /;" d
+EGL_KHR_debug host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_debug /;" d
+EGL_KHR_display_reference host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_display_reference /;" d
+EGL_KHR_fence_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_fence_sync /;" d
+EGL_KHR_get_all_proc_addresses host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_get_all_proc_addresses /;" d
+EGL_KHR_gl_colorspace host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_gl_colorspace /;" d
+EGL_KHR_gl_renderbuffer_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_gl_renderbuffer_image /;" d
+EGL_KHR_gl_texture_2D_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_gl_texture_2D_image /;" d
+EGL_KHR_gl_texture_3D_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_gl_texture_3D_image /;" d
+EGL_KHR_gl_texture_cubemap_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_gl_texture_cubemap_image /;" d
+EGL_KHR_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_image /;" d
+EGL_KHR_image_base host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_image_base /;" d
+EGL_KHR_image_pixmap host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_image_pixmap /;" d
+EGL_KHR_lock_surface host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_lock_surface /;" d
+EGL_KHR_lock_surface2 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_lock_surface2 /;" d
+EGL_KHR_lock_surface3 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_lock_surface3 /;" d
+EGL_KHR_mutable_render_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_mutable_render_buffer /;" d
+EGL_KHR_no_config_context host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_no_config_context /;" d
+EGL_KHR_partial_update host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_partial_update /;" d
+EGL_KHR_platform_android host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_platform_android /;" d
+EGL_KHR_platform_gbm host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_platform_gbm /;" d
+EGL_KHR_platform_wayland host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_platform_wayland /;" d
+EGL_KHR_platform_x11 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_platform_x11 /;" d
+EGL_KHR_reusable_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_reusable_sync /;" d
+EGL_KHR_stream host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream /;" d
+EGL_KHR_stream_attrib host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream_attrib /;" d
+EGL_KHR_stream_consumer_gltexture host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream_consumer_gltexture /;" d
+EGL_KHR_stream_cross_process_fd host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream_cross_process_fd /;" d
+EGL_KHR_stream_fifo host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream_fifo /;" d
+EGL_KHR_stream_producer_aldatalocator host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream_producer_aldatalocator /;" d
+EGL_KHR_stream_producer_eglsurface host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_stream_producer_eglsurface /;" d
+EGL_KHR_surfaceless_context host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_surfaceless_context /;" d
+EGL_KHR_swap_buffers_with_damage host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_swap_buffers_with_damage /;" d
+EGL_KHR_vg_parent_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_vg_parent_image /;" d
+EGL_KHR_wait_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_KHR_wait_sync /;" d
+EGL_LARGEST_PBUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_LARGEST_PBUFFER /;" d
+EGL_LAST_COMPOSITION_START_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LAST_COMPOSITION_START_TIME_ANDROID /;" d
+EGL_LEFT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LEFT_NV /;" d
+EGL_LEVEL host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_LEVEL /;" d
+EGL_LINUX_DMA_BUF_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LINUX_DMA_BUF_EXT /;" d
+EGL_LINUX_DRM_FOURCC_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LINUX_DRM_FOURCC_EXT /;" d
+EGL_LOCK_SURFACE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LOCK_SURFACE_BIT_KHR /;" d
+EGL_LOCK_USAGE_HINT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LOCK_USAGE_HINT_KHR /;" d
+EGL_LOSE_CONTEXT_ON_RESET host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_LOSE_CONTEXT_ON_RESET /;" d
+EGL_LOSE_CONTEXT_ON_RESET_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LOSE_CONTEXT_ON_RESET_EXT /;" d
+EGL_LOSE_CONTEXT_ON_RESET_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LOSE_CONTEXT_ON_RESET_KHR /;" d
+EGL_LOWER_LEFT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_LOWER_LEFT_KHR /;" d
+EGL_LUMINANCE_BUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_LUMINANCE_BUFFER /;" d
+EGL_LUMINANCE_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_LUMINANCE_SIZE /;" d
+EGL_MAP_PRESERVE_PIXELS_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MAP_PRESERVE_PIXELS_KHR /;" d
+EGL_MATCH_FORMAT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MATCH_FORMAT_KHR /;" d
+EGL_MATCH_NATIVE_PIXMAP host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MATCH_NATIVE_PIXMAP /;" d
+EGL_MAX_PBUFFER_HEIGHT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MAX_PBUFFER_HEIGHT /;" d
+EGL_MAX_PBUFFER_PIXELS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MAX_PBUFFER_PIXELS /;" d
+EGL_MAX_PBUFFER_WIDTH host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MAX_PBUFFER_WIDTH /;" d
+EGL_MAX_STREAM_METADATA_BLOCKS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MAX_STREAM_METADATA_BLOCKS_NV /;" d
+EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV /;" d
+EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV /;" d
+EGL_MAX_SWAP_INTERVAL host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MAX_SWAP_INTERVAL /;" d
+EGL_MESA_drm_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MESA_drm_image /;" d
+EGL_MESA_image_dma_buf_export host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MESA_image_dma_buf_export /;" d
+EGL_MESA_platform_gbm host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MESA_platform_gbm /;" d
+EGL_MESA_platform_surfaceless host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MESA_platform_surfaceless /;" d
+EGL_MESA_query_driver host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MESA_query_driver /;" d
+EGL_METADATA0_SIZE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA0_SIZE_NV /;" d
+EGL_METADATA0_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA0_TYPE_NV /;" d
+EGL_METADATA1_SIZE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA1_SIZE_NV /;" d
+EGL_METADATA1_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA1_TYPE_NV /;" d
+EGL_METADATA2_SIZE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA2_SIZE_NV /;" d
+EGL_METADATA2_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA2_TYPE_NV /;" d
+EGL_METADATA3_SIZE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA3_SIZE_NV /;" d
+EGL_METADATA3_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA3_TYPE_NV /;" d
+EGL_METADATA_SCALING_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_METADATA_SCALING_EXT /;" d
+EGL_MIN_SWAP_INTERVAL host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MIN_SWAP_INTERVAL /;" d
+EGL_MIPMAP_LEVEL host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MIPMAP_LEVEL /;" d
+EGL_MIPMAP_TEXTURE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MIPMAP_TEXTURE /;" d
+EGL_MULTISAMPLE_RESOLVE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MULTISAMPLE_RESOLVE /;" d
+EGL_MULTISAMPLE_RESOLVE_BOX host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MULTISAMPLE_RESOLVE_BOX /;" d
+EGL_MULTISAMPLE_RESOLVE_BOX_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT /;" d
+EGL_MULTISAMPLE_RESOLVE_DEFAULT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_MULTISAMPLE_RESOLVE_DEFAULT /;" d
+EGL_MULTIVIEW_VIEW_COUNT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MULTIVIEW_VIEW_COUNT_EXT /;" d
+EGL_MUTABLE_RENDER_BUFFER_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR /;" d
+EGL_NATIVE_BUFFER_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_ANDROID /;" d
+EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG /;" d
+EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG /;" d
+EGL_NATIVE_BUFFER_TIZEN host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_TIZEN /;" d
+EGL_NATIVE_BUFFER_USAGE_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_USAGE_ANDROID /;" d
+EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID /;" d
+EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID /;" d
+EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID /;" d
+EGL_NATIVE_PIXMAP_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_PIXMAP_KHR /;" d
+EGL_NATIVE_RENDERABLE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NATIVE_RENDERABLE /;" d
+EGL_NATIVE_SURFACE_TIZEN host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NATIVE_SURFACE_TIZEN /;" d
+EGL_NATIVE_VISUAL_ID host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NATIVE_VISUAL_ID /;" d
+EGL_NATIVE_VISUAL_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NATIVE_VISUAL_TYPE /;" d
+EGL_NOK_swap_region host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NOK_swap_region /;" d
+EGL_NOK_swap_region2 host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NOK_swap_region2 /;" d
+EGL_NOK_texture_from_pixmap host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NOK_texture_from_pixmap /;" d
+EGL_NONE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NONE /;" d
+EGL_NON_CONFORMANT_CONFIG host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NON_CONFORMANT_CONFIG /;" d
+EGL_NOT_INITIALIZED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NOT_INITIALIZED /;" d
+EGL_NO_CONFIG_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_CONFIG_KHR /;" d
+EGL_NO_CONTEXT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_CONTEXT /;" d
+EGL_NO_DEVICE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_DEVICE_EXT /;" d
+EGL_NO_DISPLAY host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_DISPLAY /;" d
+EGL_NO_FILE_DESCRIPTOR_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_FILE_DESCRIPTOR_KHR /;" d
+EGL_NO_IMAGE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_IMAGE /;" d
+EGL_NO_IMAGE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_IMAGE_KHR /;" d
+EGL_NO_NATIVE_FENCE_FD_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_NATIVE_FENCE_FD_ANDROID /;" d
+EGL_NO_OUTPUT_LAYER_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_OUTPUT_LAYER_EXT /;" d
+EGL_NO_OUTPUT_PORT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_OUTPUT_PORT_EXT /;" d
+EGL_NO_RESET_NOTIFICATION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_RESET_NOTIFICATION /;" d
+EGL_NO_RESET_NOTIFICATION_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_RESET_NOTIFICATION_EXT /;" d
+EGL_NO_RESET_NOTIFICATION_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_RESET_NOTIFICATION_KHR /;" d
+EGL_NO_STREAM_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_STREAM_KHR /;" d
+EGL_NO_SURFACE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_SURFACE /;" d
+EGL_NO_SYNC host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_SYNC /;" d
+EGL_NO_SYNC_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_SYNC_KHR /;" d
+EGL_NO_SYNC_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NO_SYNC_NV /;" d
+EGL_NO_TEXTURE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_NO_TEXTURE /;" d
+EGL_NV_3dvision_surface host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_3dvision_surface /;" d
+EGL_NV_context_priority_realtime host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_context_priority_realtime /;" d
+EGL_NV_coverage_sample host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_coverage_sample /;" d
+EGL_NV_coverage_sample_resolve host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_coverage_sample_resolve /;" d
+EGL_NV_cuda_event host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_cuda_event /;" d
+EGL_NV_depth_nonlinear host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_depth_nonlinear /;" d
+EGL_NV_device_cuda host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_device_cuda /;" d
+EGL_NV_native_query host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_native_query /;" d
+EGL_NV_post_convert_rounding host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_post_convert_rounding /;" d
+EGL_NV_post_sub_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_post_sub_buffer /;" d
+EGL_NV_quadruple_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_quadruple_buffer /;" d
+EGL_NV_robustness_video_memory_purge host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_robustness_video_memory_purge /;" d
+EGL_NV_stream_consumer_gltexture_yuv host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_consumer_gltexture_yuv /;" d
+EGL_NV_stream_cross_display host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_cross_display /;" d
+EGL_NV_stream_cross_object host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_cross_object /;" d
+EGL_NV_stream_cross_partition host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_cross_partition /;" d
+EGL_NV_stream_cross_process host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_cross_process /;" d
+EGL_NV_stream_cross_system host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_cross_system /;" d
+EGL_NV_stream_dma host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_dma /;" d
+EGL_NV_stream_fifo_next host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_fifo_next /;" d
+EGL_NV_stream_fifo_synchronous host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_fifo_synchronous /;" d
+EGL_NV_stream_flush host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_flush /;" d
+EGL_NV_stream_frame_limits host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_frame_limits /;" d
+EGL_NV_stream_metadata host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_metadata /;" d
+EGL_NV_stream_origin host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_origin /;" d
+EGL_NV_stream_remote host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_remote /;" d
+EGL_NV_stream_reset host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_reset /;" d
+EGL_NV_stream_socket host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_socket /;" d
+EGL_NV_stream_socket_inet host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_socket_inet /;" d
+EGL_NV_stream_socket_unix host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_socket_unix /;" d
+EGL_NV_stream_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_stream_sync /;" d
+EGL_NV_sync host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_sync /;" d
+EGL_NV_system_time host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_system_time /;" d
+EGL_NV_triple_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_NV_triple_buffer /;" d
+EGL_OBJECT_CONTEXT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_CONTEXT_KHR /;" d
+EGL_OBJECT_DISPLAY_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_DISPLAY_KHR /;" d
+EGL_OBJECT_IMAGE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_IMAGE_KHR /;" d
+EGL_OBJECT_STREAM_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_STREAM_KHR /;" d
+EGL_OBJECT_SURFACE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_SURFACE_KHR /;" d
+EGL_OBJECT_SYNC_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_SYNC_KHR /;" d
+EGL_OBJECT_THREAD_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OBJECT_THREAD_KHR /;" d
+EGL_OPENGL_API host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENGL_API /;" d
+EGL_OPENGL_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENGL_BIT /;" d
+EGL_OPENGL_ES2_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENGL_ES2_BIT /;" d
+EGL_OPENGL_ES3_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENGL_ES3_BIT /;" d
+EGL_OPENGL_ES3_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OPENGL_ES3_BIT_KHR /;" d
+EGL_OPENGL_ES_API host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENGL_ES_API /;" d
+EGL_OPENGL_ES_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENGL_ES_BIT /;" d
+EGL_OPENVG_API host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENVG_API /;" d
+EGL_OPENVG_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENVG_BIT /;" d
+EGL_OPENVG_IMAGE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_OPENVG_IMAGE /;" d
+EGL_OPENWF_DEVICE_ID_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OPENWF_DEVICE_ID_EXT /;" d
+EGL_OPENWF_PIPELINE_ID_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OPENWF_PIPELINE_ID_EXT /;" d
+EGL_OPENWF_PORT_ID_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OPENWF_PORT_ID_EXT /;" d
+EGL_OPTIMAL_FORMAT_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_OPTIMAL_FORMAT_BIT_KHR /;" d
+EGL_PBUFFER_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_PBUFFER_BIT /;" d
+EGL_PENDING_FRAME_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PENDING_FRAME_NV /;" d
+EGL_PENDING_METADATA_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PENDING_METADATA_NV /;" d
+EGL_PIXEL_ASPECT_RATIO host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_PIXEL_ASPECT_RATIO /;" d
+EGL_PIXMAP_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_PIXMAP_BIT /;" d
+EGL_PLATFORM_ANDROID_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_ANDROID_KHR /;" d
+EGL_PLATFORM_DEVICE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_DEVICE_EXT /;" d
+EGL_PLATFORM_GBM_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_GBM_KHR /;" d
+EGL_PLATFORM_GBM_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_GBM_MESA /;" d
+EGL_PLATFORM_SURFACELESS_MESA host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_SURFACELESS_MESA /;" d
+EGL_PLATFORM_WAYLAND_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_WAYLAND_EXT /;" d
+EGL_PLATFORM_WAYLAND_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_WAYLAND_KHR /;" d
+EGL_PLATFORM_X11_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_X11_EXT /;" d
+EGL_PLATFORM_X11_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_X11_KHR /;" d
+EGL_PLATFORM_X11_SCREEN_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_X11_SCREEN_EXT /;" d
+EGL_PLATFORM_X11_SCREEN_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PLATFORM_X11_SCREEN_KHR /;" d
+EGL_POST_SUB_BUFFER_SUPPORTED_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_POST_SUB_BUFFER_SUPPORTED_NV /;" d
+EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT /;" d
+EGL_PRODUCER_AUTO_ORIENTATION_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PRODUCER_AUTO_ORIENTATION_NV /;" d
+EGL_PRODUCER_FRAME_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PRODUCER_FRAME_KHR /;" d
+EGL_PRODUCER_MAX_FRAME_HINT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PRODUCER_MAX_FRAME_HINT_NV /;" d
+EGL_PRODUCER_METADATA_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PRODUCER_METADATA_NV /;" d
+EGL_PROTECTED_CONTENT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_PROTECTED_CONTENT_EXT /;" d
+EGL_QUADRUPLE_BUFFER_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_QUADRUPLE_BUFFER_NV /;" d
+EGL_READ host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_READ /;" d
+EGL_READS_DONE_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_READS_DONE_TIME_ANDROID /;" d
+EGL_READ_SURFACE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_READ_SURFACE_BIT_KHR /;" d
+EGL_RECORDABLE_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_RECORDABLE_ANDROID /;" d
+EGL_RED_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_RED_SIZE /;" d
+EGL_RENDERABLE_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_RENDERABLE_TYPE /;" d
+EGL_RENDERING_COMPLETE_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_RENDERING_COMPLETE_TIME_ANDROID /;" d
+EGL_RENDER_BUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_RENDER_BUFFER /;" d
+EGL_REQUESTED_PRESENT_TIME_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_REQUESTED_PRESENT_TIME_ANDROID /;" d
+EGL_RGB_BUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_RGB_BUFFER /;" d
+EGL_RIGHT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_RIGHT_NV /;" d
+EGL_SAMPLES host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SAMPLES /;" d
+EGL_SAMPLE_BUFFERS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SAMPLE_BUFFERS /;" d
+EGL_SAMPLE_RANGE_HINT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SAMPLE_RANGE_HINT_EXT /;" d
+EGL_SIGNALED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SIGNALED /;" d
+EGL_SIGNALED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SIGNALED_KHR /;" d
+EGL_SIGNALED_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SIGNALED_NV /;" d
+EGL_SINGLE_BUFFER host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SINGLE_BUFFER /;" d
+EGL_SLOW_CONFIG host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SLOW_CONFIG /;" d
+EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT /;" d
+EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT /;" d
+EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT /;" d
+EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT /;" d
+EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT /;" d
+EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT /;" d
+EGL_SMPTE2086_MAX_LUMINANCE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_MAX_LUMINANCE_EXT /;" d
+EGL_SMPTE2086_MIN_LUMINANCE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_MIN_LUMINANCE_EXT /;" d
+EGL_SMPTE2086_WHITE_POINT_X_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_WHITE_POINT_X_EXT /;" d
+EGL_SMPTE2086_WHITE_POINT_Y_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SMPTE2086_WHITE_POINT_Y_EXT /;" d
+EGL_SOCKET_HANDLE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SOCKET_HANDLE_NV /;" d
+EGL_SOCKET_TYPE_INET_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SOCKET_TYPE_INET_NV /;" d
+EGL_SOCKET_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SOCKET_TYPE_NV /;" d
+EGL_SOCKET_TYPE_UNIX_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SOCKET_TYPE_UNIX_NV /;" d
+EGL_STENCIL_SIZE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_STENCIL_SIZE /;" d
+EGL_STREAM_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_BIT_KHR /;" d
+EGL_STREAM_CONSUMER_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_CONSUMER_NV /;" d
+EGL_STREAM_CROSS_DISPLAY_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_CROSS_DISPLAY_NV /;" d
+EGL_STREAM_CROSS_OBJECT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_CROSS_OBJECT_NV /;" d
+EGL_STREAM_CROSS_PARTITION_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_CROSS_PARTITION_NV /;" d
+EGL_STREAM_CROSS_PROCESS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_CROSS_PROCESS_NV /;" d
+EGL_STREAM_CROSS_SYSTEM_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_CROSS_SYSTEM_NV /;" d
+EGL_STREAM_DMA_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_DMA_NV /;" d
+EGL_STREAM_DMA_SERVER_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_DMA_SERVER_NV /;" d
+EGL_STREAM_ENDPOINT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_ENDPOINT_NV /;" d
+EGL_STREAM_FIFO_LENGTH_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_FIFO_LENGTH_KHR /;" d
+EGL_STREAM_FIFO_SYNCHRONOUS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_FIFO_SYNCHRONOUS_NV /;" d
+EGL_STREAM_FRAME_MAJOR_AXIS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_FRAME_MAJOR_AXIS_NV /;" d
+EGL_STREAM_FRAME_ORIGIN_X_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_FRAME_ORIGIN_X_NV /;" d
+EGL_STREAM_FRAME_ORIGIN_Y_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_FRAME_ORIGIN_Y_NV /;" d
+EGL_STREAM_LOCAL_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_LOCAL_NV /;" d
+EGL_STREAM_PRODUCER_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_PRODUCER_NV /;" d
+EGL_STREAM_PROTOCOL_FD_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_PROTOCOL_FD_NV /;" d
+EGL_STREAM_PROTOCOL_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_PROTOCOL_NV /;" d
+EGL_STREAM_PROTOCOL_SOCKET_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_PROTOCOL_SOCKET_NV /;" d
+EGL_STREAM_STATE_CONNECTING_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_CONNECTING_KHR /;" d
+EGL_STREAM_STATE_CREATED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_CREATED_KHR /;" d
+EGL_STREAM_STATE_DISCONNECTED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_DISCONNECTED_KHR /;" d
+EGL_STREAM_STATE_EMPTY_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_EMPTY_KHR /;" d
+EGL_STREAM_STATE_INITIALIZING_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_INITIALIZING_NV /;" d
+EGL_STREAM_STATE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_KHR /;" d
+EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR /;" d
+EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR /;" d
+EGL_STREAM_TIME_CONSUMER_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_TIME_CONSUMER_KHR /;" d
+EGL_STREAM_TIME_NOW_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_TIME_NOW_KHR /;" d
+EGL_STREAM_TIME_PENDING_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_TIME_PENDING_NV /;" d
+EGL_STREAM_TIME_PRODUCER_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_TIME_PRODUCER_KHR /;" d
+EGL_STREAM_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_STREAM_TYPE_NV /;" d
+EGL_SUCCESS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SUCCESS /;" d
+EGL_SUPPORT_RESET_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SUPPORT_RESET_NV /;" d
+EGL_SUPPORT_REUSE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SUPPORT_REUSE_NV /;" d
+EGL_SURFACE_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SURFACE_TYPE /;" d
+EGL_SWAP_BEHAVIOR host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SWAP_BEHAVIOR /;" d
+EGL_SWAP_BEHAVIOR_PRESERVED_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT /;" d
+EGL_SWAP_INTERVAL_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SWAP_INTERVAL_EXT /;" d
+EGL_SYNC_CLIENT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CLIENT_EXT /;" d
+EGL_SYNC_CLIENT_SIGNAL_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CLIENT_SIGNAL_EXT /;" d
+EGL_SYNC_CL_EVENT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_CL_EVENT /;" d
+EGL_SYNC_CL_EVENT_COMPLETE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_CL_EVENT_COMPLETE /;" d
+EGL_SYNC_CL_EVENT_COMPLETE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CL_EVENT_COMPLETE_KHR /;" d
+EGL_SYNC_CL_EVENT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CL_EVENT_KHR /;" d
+EGL_SYNC_CONDITION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_CONDITION /;" d
+EGL_SYNC_CONDITION_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CONDITION_KHR /;" d
+EGL_SYNC_CONDITION_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CONDITION_NV /;" d
+EGL_SYNC_CUDA_EVENT_COMPLETE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV /;" d
+EGL_SYNC_CUDA_EVENT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_CUDA_EVENT_NV /;" d
+EGL_SYNC_FENCE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_FENCE /;" d
+EGL_SYNC_FENCE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_FENCE_KHR /;" d
+EGL_SYNC_FENCE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_FENCE_NV /;" d
+EGL_SYNC_FLUSH_COMMANDS_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_FLUSH_COMMANDS_BIT /;" d
+EGL_SYNC_FLUSH_COMMANDS_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR /;" d
+EGL_SYNC_FLUSH_COMMANDS_BIT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV /;" d
+EGL_SYNC_NATIVE_FENCE_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_NATIVE_FENCE_ANDROID /;" d
+EGL_SYNC_NATIVE_FENCE_FD_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID /;" d
+EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID /;" d
+EGL_SYNC_NEW_FRAME_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_NEW_FRAME_NV /;" d
+EGL_SYNC_PRIOR_COMMANDS_COMPLETE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE /;" d
+EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR /;" d
+EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV /;" d
+EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM /;" d
+EGL_SYNC_REUSABLE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_REUSABLE_KHR /;" d
+EGL_SYNC_STATUS host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_STATUS /;" d
+EGL_SYNC_STATUS_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_STATUS_KHR /;" d
+EGL_SYNC_STATUS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_STATUS_NV /;" d
+EGL_SYNC_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_SYNC_TYPE /;" d
+EGL_SYNC_TYPE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_TYPE_KHR /;" d
+EGL_SYNC_TYPE_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_SYNC_TYPE_NV /;" d
+EGL_TEXTURE_2D host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TEXTURE_2D /;" d
+EGL_TEXTURE_EXTERNAL_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TEXTURE_EXTERNAL_WL /;" d
+EGL_TEXTURE_FORMAT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TEXTURE_FORMAT /;" d
+EGL_TEXTURE_RGB host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TEXTURE_RGB /;" d
+EGL_TEXTURE_RGBA host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TEXTURE_RGBA /;" d
+EGL_TEXTURE_TARGET host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TEXTURE_TARGET /;" d
+EGL_TEXTURE_Y_UV_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TEXTURE_Y_UV_WL /;" d
+EGL_TEXTURE_Y_U_V_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TEXTURE_Y_U_V_WL /;" d
+EGL_TEXTURE_Y_XUXV_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TEXTURE_Y_XUXV_WL /;" d
+EGL_TIMEOUT_EXPIRED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TIMEOUT_EXPIRED /;" d
+EGL_TIMEOUT_EXPIRED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIMEOUT_EXPIRED_KHR /;" d
+EGL_TIMEOUT_EXPIRED_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIMEOUT_EXPIRED_NV /;" d
+EGL_TIMESTAMPS_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIMESTAMPS_ANDROID /;" d
+EGL_TIMESTAMP_INVALID_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIMESTAMP_INVALID_ANDROID /;" d
+EGL_TIMESTAMP_PENDING_ANDROID host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIMESTAMP_PENDING_ANDROID /;" d
+EGL_TIZEN_image_native_buffer host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIZEN_image_native_buffer /;" d
+EGL_TIZEN_image_native_surface host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TIZEN_image_native_surface /;" d
+EGL_TOP_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TOP_NV /;" d
+EGL_TRACK_REFERENCES_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TRACK_REFERENCES_KHR /;" d
+EGL_TRANSPARENT_BLUE_VALUE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TRANSPARENT_BLUE_VALUE /;" d
+EGL_TRANSPARENT_GREEN_VALUE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TRANSPARENT_GREEN_VALUE /;" d
+EGL_TRANSPARENT_RED_VALUE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TRANSPARENT_RED_VALUE /;" d
+EGL_TRANSPARENT_RGB host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TRANSPARENT_RGB /;" d
+EGL_TRANSPARENT_TYPE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TRANSPARENT_TYPE /;" d
+EGL_TRIPLE_BUFFER_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_TRIPLE_BUFFER_NV /;" d
+EGL_TRUE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_TRUE /;" d
+EGL_UNKNOWN host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_UNKNOWN /;" d
+EGL_UNSIGNALED host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_UNSIGNALED /;" d
+EGL_UNSIGNALED_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_UNSIGNALED_KHR /;" d
+EGL_UNSIGNALED_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_UNSIGNALED_NV /;" d
+EGL_UPPER_LEFT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_UPPER_LEFT_KHR /;" d
+EGL_VENDOR host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VENDOR /;" d
+EGL_VERSION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION /;" d
+EGL_VERSION_1_0 host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION_1_0 /;" d
+EGL_VERSION_1_1 host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION_1_1 /;" d
+EGL_VERSION_1_2 host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION_1_2 /;" d
+EGL_VERSION_1_3 host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION_1_3 /;" d
+EGL_VERSION_1_4 host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION_1_4 /;" d
+EGL_VERSION_1_5 host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERSION_1_5 /;" d
+EGL_VERTICAL_RESOLUTION host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VERTICAL_RESOLUTION /;" d
+EGL_VG_ALPHA_FORMAT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_ALPHA_FORMAT /;" d
+EGL_VG_ALPHA_FORMAT_NONPRE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_ALPHA_FORMAT_NONPRE /;" d
+EGL_VG_ALPHA_FORMAT_PRE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_ALPHA_FORMAT_PRE /;" d
+EGL_VG_ALPHA_FORMAT_PRE_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_ALPHA_FORMAT_PRE_BIT /;" d
+EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR /;" d
+EGL_VG_COLORSPACE host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_COLORSPACE /;" d
+EGL_VG_COLORSPACE_LINEAR host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_COLORSPACE_LINEAR /;" d
+EGL_VG_COLORSPACE_LINEAR_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_COLORSPACE_LINEAR_BIT /;" d
+EGL_VG_COLORSPACE_LINEAR_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR /;" d
+EGL_VG_COLORSPACE_sRGB host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_VG_COLORSPACE_sRGB /;" d
+EGL_VG_PARENT_IMAGE_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_VG_PARENT_IMAGE_KHR /;" d
+EGL_WAYLAND_BUFFER_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_WAYLAND_BUFFER_WL /;" d
+EGL_WAYLAND_PLANE_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_WAYLAND_PLANE_WL /;" d
+EGL_WAYLAND_Y_INVERTED_WL host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_WAYLAND_Y_INVERTED_WL /;" d
+EGL_WIDTH host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_WIDTH /;" d
+EGL_WINDOW_BIT host/libs/graphics_detector/include/EGL/egl.h /^#define EGL_WINDOW_BIT /;" d
+EGL_WL_bind_wayland_display host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_WL_bind_wayland_display /;" d
+EGL_WL_create_wayland_buffer_from_image host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_WL_create_wayland_buffer_from_image /;" d
+EGL_WRITE_SURFACE_BIT_KHR host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_WRITE_SURFACE_BIT_KHR /;" d
+EGL_X_AXIS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_X_AXIS_NV /;" d
+EGL_YUV_BUFFER_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_BUFFER_EXT /;" d
+EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT /;" d
+EGL_YUV_CHROMA_SITING_0_5_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CHROMA_SITING_0_5_EXT /;" d
+EGL_YUV_CHROMA_SITING_0_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CHROMA_SITING_0_EXT /;" d
+EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT /;" d
+EGL_YUV_COLOR_SPACE_HINT_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_COLOR_SPACE_HINT_EXT /;" d
+EGL_YUV_CSC_STANDARD_2020_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CSC_STANDARD_2020_EXT /;" d
+EGL_YUV_CSC_STANDARD_601_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CSC_STANDARD_601_EXT /;" d
+EGL_YUV_CSC_STANDARD_709_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CSC_STANDARD_709_EXT /;" d
+EGL_YUV_CSC_STANDARD_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_CSC_STANDARD_EXT /;" d
+EGL_YUV_DEPTH_RANGE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_DEPTH_RANGE_EXT /;" d
+EGL_YUV_DEPTH_RANGE_FULL_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_DEPTH_RANGE_FULL_EXT /;" d
+EGL_YUV_DEPTH_RANGE_LIMITED_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT /;" d
+EGL_YUV_FULL_RANGE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_FULL_RANGE_EXT /;" d
+EGL_YUV_NARROW_RANGE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_NARROW_RANGE_EXT /;" d
+EGL_YUV_NUMBER_OF_PLANES_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_NUMBER_OF_PLANES_EXT /;" d
+EGL_YUV_ORDER_AYUV_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_AYUV_EXT /;" d
+EGL_YUV_ORDER_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_EXT /;" d
+EGL_YUV_ORDER_UYVY_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_UYVY_EXT /;" d
+EGL_YUV_ORDER_VYUY_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_VYUY_EXT /;" d
+EGL_YUV_ORDER_YUV_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_YUV_EXT /;" d
+EGL_YUV_ORDER_YUYV_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_YUYV_EXT /;" d
+EGL_YUV_ORDER_YVU_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_YVU_EXT /;" d
+EGL_YUV_ORDER_YVYU_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_ORDER_YVYU_EXT /;" d
+EGL_YUV_PLANE0_TEXTURE_UNIT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV /;" d
+EGL_YUV_PLANE1_TEXTURE_UNIT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV /;" d
+EGL_YUV_PLANE2_TEXTURE_UNIT_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV /;" d
+EGL_YUV_PLANE_BPP_0_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE_BPP_0_EXT /;" d
+EGL_YUV_PLANE_BPP_10_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE_BPP_10_EXT /;" d
+EGL_YUV_PLANE_BPP_8_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE_BPP_8_EXT /;" d
+EGL_YUV_PLANE_BPP_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_PLANE_BPP_EXT /;" d
+EGL_YUV_SUBSAMPLE_4_2_0_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_SUBSAMPLE_4_2_0_EXT /;" d
+EGL_YUV_SUBSAMPLE_4_2_2_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_SUBSAMPLE_4_2_2_EXT /;" d
+EGL_YUV_SUBSAMPLE_4_4_4_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_SUBSAMPLE_4_4_4_EXT /;" d
+EGL_YUV_SUBSAMPLE_EXT host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_YUV_SUBSAMPLE_EXT /;" d
+EGL_Y_AXIS_NV host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_Y_AXIS_NV /;" d
+EGL_Y_INVERTED_NOK host/libs/graphics_detector/include/EGL/eglext.h /^#define EGL_Y_INVERTED_NOK /;" d
+EGLenum host/libs/graphics_detector/include/EGL/egl.h /^typedef unsigned int EGLenum;$/;" t typeref:typename:unsigned int
+EGLint host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef khronos_int32_t EGLint;$/;" t typeref:typename:khronos_int32_t
+EGLnsecsANDROID host/libs/graphics_detector/include/EGL/eglext.h /^typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;$/;" t typeref:typename:khronos_stime_nanoseconds_t
+EGLsizeiANDROID host/libs/graphics_detector/include/EGL/eglext.h /^typedef khronos_ssize_t EGLsizeiANDROID;$/;" t typeref:typename:khronos_ssize_t
+EGLuint64KHR host/libs/graphics_detector/include/EGL/eglext.h /^typedef khronos_uint64_t EGLuint64KHR;$/;" t typeref:typename:khronos_uint64_t
+EGLuint64NV host/libs/graphics_detector/include/EGL/eglext.h /^typedef khronos_utime_nanoseconds_t EGLuint64NV;$/;" t typeref:typename:khronos_utime_nanoseconds_t
+EMULATOR_RADIO_INTERFACE guest/hals/ril/reference-ril/reference-ril.c /^#define EMULATOR_RADIO_INTERFACE /;" d file:
+ENABLE host/commands/modem_simulator/sim_service.h /^ ENABLE,$/;" e enum:cuttlefish::SimService::FacilityLock::LockStatus
+ENABLE host/commands/modem_simulator/sup_service.h /^ ENABLE = 1,$/;" e enum:cuttlefish::SupService::CallForwardInfo::CallForwardInfoStatus
+END tests/ril/runtests.sh /^ cat <<END$/;" h
+END tests/wifi/runtests.sh /^ cat <<END$/;" h
+END_OF_MSG_MARK host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^constexpr char END_OF_MSG_MARK[] = "\\n\\n\\n\\n";$/;" v typeref:typename:char[]
+EOF tools/create_base_image_arm.sh /^ cat > ${tmpfile} << "EOF"$/;" h
+EOF tools/create_base_image_gce.sh /^sudo tee \/mnt\/image\/etc\/sysctl.d\/80-nsjail.conf >\/dev\/null <<EOF$/;" h
+EOF tools/create_base_image_hostlib.sh /^ cat <<EOF$/;" h
+EOF tools/network-setup.sh /^ cat >>$USER_HOME\/.ssh\/config << EOF$/;" h
+EOF tools/network-setup.sh /^cat > \/etc\/systemd\/system\/iptables-rockpi.service << EOF$/;" h
+EOF tools/network-setup.sh /^cat > \/usr\/local\/sbin\/iptables-rockpi.sh << EOF$/;" h
+EOF tools/network-setup.sh /^cat >\/etc\/dnsmasq.d\/${ROCKNET}.conf << EOF$/;" h
+EOF tools/network-setup.sh /^cat >\/etc\/network\/interfaces.d\/${ROCKNET}.conf <<EOF$/;" h
+EOF tools/network-setup.sh /^cat >\/etc\/udev\/rules.d\/82-${ROCKNET}.rules <<EOF$/;" h
+EPDG guest/hals/ril/reference-libril/ril.h /^ EPDG = 1, \/* Key type to be used for ePDG *\/$/;" e enum:__anon0bfbaecf2b03
+ERASURE host/commands/modem_simulator/sup_service.h /^ ERASURE = 4,$/;" e enum:cuttlefish::SupService::CallForwardInfo::CallForwardInfoStatus
+ETHERNET_NETWORK_CONNECTED_MESSAGE guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private static final String ETHERNET_NETWORK_CONNECTED_MESSAGE =$/;" f class:ConnectivityChecker file:
+EUTRAN guest/hals/ril/reference-libril/ril.h /^ EUTRAN = 0x03, \/\/ Evolved Universal Terrestrial Radio Access Network$/;" e enum:__anon0bfbaecfa503
+EUTRAN_BAND_1 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_1 = 1,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_10 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_10 = 10,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_11 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_11 = 11,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_12 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_12 = 12,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_13 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_13 = 13,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_14 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_14 = 14,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_17 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_17 = 17,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_18 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_18 = 18,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_19 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_19 = 19,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_2 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_2 = 2,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_20 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_20 = 20,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_21 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_21 = 21,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_22 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_22 = 22,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_23 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_23 = 23,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_24 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_24 = 24,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_25 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_25 = 25,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_26 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_26 = 26,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_27 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_27 = 27,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_28 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_28 = 28,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_3 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_3 = 3,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_30 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_30 = 30,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_31 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_31 = 31,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_33 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_33 = 33,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_34 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_34 = 34,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_35 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_35 = 35,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_36 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_36 = 36,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_37 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_37 = 37,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_38 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_38 = 38,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_39 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_39 = 39,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_4 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_4 = 4,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_40 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_40 = 40,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_41 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_41 = 41,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_42 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_42 = 42,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_43 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_43 = 43,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_44 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_44 = 44,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_45 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_45 = 45,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_46 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_46 = 46,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_47 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_47 = 47,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_48 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_48 = 48,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_5 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_5 = 5,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_6 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_6 = 6,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_65 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_65 = 65,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_66 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_66 = 66,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_68 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_68 = 68,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_7 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_7 = 7,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_70 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_70 = 70,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_8 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_8 = 8,$/;" e enum:__anon0bfbaecfa903
+EUTRAN_BAND_9 guest/hals/ril/reference-libril/ril.h /^ EUTRAN_BAND_9 = 9,$/;" e enum:__anon0bfbaecfa903
+EVDO guest/hals/ril/reference-ril/reference-ril.c /^#define EVDO /;" d file:
+EVDO_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_EVDO_SignalStrength EVDO_SignalStrength;$/;" m struct:__anon0bfbaecf5108 typeref:typename:RIL_EVDO_SignalStrength
+EVDO_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_EVDO_SignalStrength EVDO_SignalStrength;$/;" m struct:__anon0bfbaecf5208 typeref:typename:RIL_EVDO_SignalStrength
+EVDO_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_EVDO_SignalStrength EVDO_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_EVDO_SignalStrength
+EVDO_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_EVDO_SignalStrength EVDO_SignalStrength;$/;" m struct:__anon0bfbaecf4f08 typeref:typename:RIL_EVDO_SignalStrength
+EVDO_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_EVDO_SignalStrength EVDO_SignalStrength;$/;" m struct:__anon0bfbaecf5008 typeref:typename:RIL_EVDO_SignalStrength
+EXCLUDES common/libs/concurrency/thread_annotations.h /^#define EXCLUDES(/;" d
+EXCLUDE_BUILD_RAMDUMP_UPLOADER_DEBUG_TOOL shared/BoardConfig.mk /^EXCLUDE_BUILD_RAMDUMP_UPLOADER_DEBUG_TOOL := true$/;" m
+EXTERNAL host/commands/metrics/proto/common.proto /^ EXTERNAL = 1;$/;" e enum:UserType
+EXTERNAL_VSOC_LIBNL_INCLUDE guest/libs/wpa_supplicant_8_lib/Android.mk /^EXTERNAL_VSOC_LIBNL_INCLUDE := external\/gce\/libnl\/include$/;" m
+EXTERNAL_VSOC_LIBNL_INCLUDE guest/libs/wpa_supplicant_8_lib/Android.mk /^EXTERNAL_VSOC_LIBNL_INCLUDE :=$/;" m
+EarlyBootEnded guest/hals/keymaster/remote/remote_keymaster.cpp /^EarlyBootEndedResponse RemoteKeymaster::EarlyBootEnded() {$/;" f class:keymaster::RemoteKeymaster typeref:typename:EarlyBootEndedResponse
+EarlyBootEnded guest/hals/keymint/remote/remote_keymaster.cpp /^EarlyBootEndedResponse RemoteKeymaster::EarlyBootEnded() {$/;" f class:keymaster::RemoteKeymaster typeref:typename:EarlyBootEndedResponse
+EbtablesBroute host/libs/allocd/alloc_utils.cpp /^bool EbtablesBroute(const std::string& name, bool use_ipv4, bool add,$/;" f namespace:cuttlefish typeref:typename:bool
+EbtablesFilter host/libs/allocd/alloc_utils.cpp /^bool EbtablesFilter(const std::string& name, bool use_ipv4, bool add,$/;" f namespace:cuttlefish typeref:typename:bool
+EmitEvent guest/commands/vsoc_input_service/virtual_device_base.cpp /^bool VirtualDeviceBase::EmitEvent(uint16_t type,$/;" f class:VirtualDeviceBase typeref:typename:bool
+EnableBuiltInAEC host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::EnableBuiltInAEC(bool enable) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+EnableBuiltInAGC host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::EnableBuiltInAGC(bool enable) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+EnableBuiltInNS host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::EnableBuiltInNS(bool enable) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+EnableCredentials common/libs/utils/unix_sockets.cpp /^Result<void> UnixMessageSocket::EnableCredentials(bool enable) {$/;" f class:cuttlefish::UnixMessageSocket typeref:typename:Result<void>
+Enabled host/commands/assemble_cvd/disk_flags.cc /^ bool Enabled() const override { return !config_.protected_vm(); }$/;" f class:cuttlefish::InitializeAccessKregistryImage typeref:typename:bool file:
+Enabled host/commands/assemble_cvd/disk_flags.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::InitializeMetadataImage typeref:typename:bool file:
+Enabled host/commands/assemble_cvd/disk_flags.cc /^ bool Enabled() const override {$/;" f class:cuttlefish::BootImageRepacker typeref:typename:bool file:
+Enabled host/commands/run_cvd/boot_state_machine.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:bool file:
+Enabled host/commands/run_cvd/boot_state_machine.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return config_.console(); }$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return config_.enable_host_bluetooth(); }$/;" f class:cuttlefish::BluetoothConnector typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return config_.enable_host_bluetooth(); }$/;" f class:cuttlefish::RootCanal typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return config_.enable_host_bluetooth(); }$/;" f class:cuttlefish::SecureEnvironment typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::ConfigServer typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::LogcatReceiver typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::TombstoneReceiver typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::VmmCommands typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override {$/;" f class:cuttlefish::GnssGrpcProxyServer typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override {$/;" f class:cuttlefish::MetricsService typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override {$/;" f class:cuttlefish::OpenWrt typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override {$/;" f class:cuttlefish::VehicleHalServer typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch.cc /^ bool Enabled() const override {$/;" f class:cuttlefish::WmediumdServer typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch_modem.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::ModemSimulator typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch_streamer.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:bool file:
+Enabled host/commands/run_cvd/launch_streamer.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:bool file:
+Enabled host/commands/run_cvd/main.cc /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:bool file:
+Enabled host/commands/run_cvd/server_loop.cpp /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:bool file:
+Enabled host/commands/run_cvd/validate.cpp /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::__anon8d12954e0111::ValidateTapDevices typeref:typename:bool file:
+Enabled host/commands/run_cvd/validate.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::__anon8d12954e0111::ValidateHostConfigurationFeature typeref:typename:bool file:
+Enabled host/libs/config/adb/launch.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbConnector typeref:typename:bool file:
+Enabled host/libs/config/adb/launch.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:bool file:
+Enabled host/libs/config/data_image.cpp /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::InitializeDataImageImpl typeref:typename:bool file:
+Enabled host/libs/config/data_image.cpp /^ bool Enabled() const override { return true; }$/;" f class:cuttlefish::InitializeMiscImageImpl typeref:typename:bool file:
+Enabled host/libs/config/data_image.cpp /^ bool Enabled() const override {$/;" f class:cuttlefish::InitializeEspImageImpl typeref:typename:bool file:
+EncodeBase64 common/libs/utils/base64.cpp /^bool EncodeBase64(const void *data, size_t size, std::string *out) {$/;" f namespace:cuttlefish typeref:typename:bool
+EncoderLoop host/frontend/webrtc/lib/local_recorder.cpp /^void LocalRecorder::Display::EncoderLoop() {$/;" f class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:void
+EncryptedSerializable host/commands/secure_env/encrypted_serializable.cpp /^EncryptedSerializable::EncryptedSerializable($/;" f class:cuttlefish::EncryptedSerializable
+EncryptedSerializable host/commands/secure_env/encrypted_serializable.h /^class EncryptedSerializable : public keymaster::Serializable {$/;" c namespace:cuttlefish
+End host/libs/image_aggregator/image_aggregator.cc /^ GptEnd End(const GptBeginning& head) const {$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:GptEnd file:
+EnqueueMessage host/libs/websocket/websocket_handler.cpp /^void WebSocketHandler::EnqueueMessage(const uint8_t* data, size_t len,$/;" f class:cuttlefish::WebSocketHandler typeref:typename:void
+EnqueueMessage host/libs/websocket/websocket_handler.h /^ void EnqueueMessage(const char* data, size_t len, bool binary = false) {$/;" f class:cuttlefish::WebSocketHandler typeref:typename:void
+EnqueueWrite host/commands/console_forwarder/main.cpp /^ void EnqueueWrite(std::shared_ptr<std::vector<char>> buf_ptr, SharedFD fd) {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:void file:
+EnsureDirectoryExists host/commands/assemble_cvd/clean.cc /^bool EnsureDirectoryExists(const std::string& directory_path) {$/;" f namespace:cuttlefish typeref:typename:bool
+Enum2Base common/libs/confui/utils.h /^constexpr typename std::underlying_type_t<T> Enum2Base(T t) {$/;" f namespace:cuttlefish typeref:typename:std::underlying_type_t<T>
+Error host/libs/confui/cbor.h /^ enum class Error : uint32_t {$/;" g class:cuttlefish::confui::Cbor typeref:typename:uint32_t
+ErrorCodeV41 guest/hals/keymaster/remote/remote_keymaster4_device.h /^using ErrorCodeV41 = ::android::hardware::keymaster::V4_1::ErrorCode;$/;" t namespace:keymaster::V4_1 typeref:typename:::android::hardware::keymaster::V4_1::ErrorCode
+ErrorFD common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::ErrorFD(int error) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+ErrorType host/commands/metrics/proto/cf_metrics_event.proto /^ enum ErrorType {$/;" g message:cuttlefish.MetricsEvent
+EspImageTag host/libs/config/data_image.cpp /^struct EspImageTag {};$/;" s namespace:cuttlefish file:
+EstablishAndMaintainConnection host/frontend/adb_connector/adb_connection_maintainer.cpp /^[[noreturn]] void cuttlefish::EstablishAndMaintainConnection(std::string address) {$/;" f class:cuttlefish typeref:typename:void
+EstablishConnection host/frontend/adb_connector/adb_connection_maintainer.cpp /^void EstablishConnection(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:void
+EstablishHalConnection host/libs/confui/host_server.cc /^SharedFD HostServer::EstablishHalConnection() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:SharedFD
+Esys host/commands/secure_env/test_tpm.cpp /^ESYS_CONTEXT* TestTpm::Esys() { return esys_; }$/;" f class:cuttlefish::TestTpm typeref:typename:ESYS_CONTEXT *
+Esys host/commands/secure_env/tpm_resource_manager.cpp /^ESYS_CONTEXT* TpmResourceManager::Esys() {$/;" f class:cuttlefish::TpmResourceManager typeref:typename:ESYS_CONTEXT *
+EsysDeleter host/commands/secure_env/tpm_hmac.h /^struct EsysDeleter {$/;" s namespace:cuttlefish
+EthernetBridge host/libs/allocd/resource.h /^ EthernetBridge,$/;" e enum:cuttlefish::ResourceType
+EthernetIface host/libs/allocd/resource.h /^ EthernetIface(const std::string& name, uid_t uid, uint16_t iface_id,$/;" f class:cuttlefish::EthernetIface
+EthernetIface host/libs/allocd/resource.h /^ EthernetIface,$/;" e enum:cuttlefish::ResourceType
+EthernetIface host/libs/allocd/resource.h /^class EthernetIface : public StaticResource {$/;" c namespace:cuttlefish
+EthernetNetworkConfig host/libs/allocd/alloc_utils.h /^struct EthernetNetworkConfig {$/;" s namespace:cuttlefish
+EthernetNetworkConnected host/commands/kernel_log_monitor/kernel_log_server.h /^ EthernetNetworkConnected = 7,$/;" e enum:monitor::Event
+EvaluateAction host/libs/config/data_image.cpp /^ Result<void> EvaluateAction(DataImageAction action) {$/;" f class:cuttlefish::InitializeDataImageImpl typeref:typename:Result<void> file:
+Event common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Event(int initval, int flags) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+Event host/commands/kernel_log_monitor/kernel_log_server.h /^enum Event : int32_t {$/;" g namespace:monitor typeref:typename:int32_t
+Event host/commands/modem_simulator/thread_looper.h /^ struct Event {$/;" s class:cuttlefish::ThreadLooper
+EventCallback host/commands/kernel_log_monitor/kernel_log_server.h /^using EventCallback = std::function<SubscriptionAction(Json::Value)>;$/;" t namespace:monitor
+EventFormat host/commands/kernel_log_monitor/kernel_log_server.cc /^enum EventFormat {$/;" g namespace:__anonfa7764770111 file:
+EventLoop guest/commands/vsoc_input_service/vsoc_input_service.cpp /^void EventLoop(std::shared_ptr<VirtualDeviceBase> device,$/;" f namespace:__anon7d4eee310111 typeref:typename:void
+EventReporter guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public EventReporter() {$/;" m class:EventReporter
+EventReporter guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^public class EventReporter extends JobBase {$/;" c
+EventType host/commands/metrics/proto/cf_metrics_event.proto /^ enum EventType {$/;" g message:cuttlefish.MetricsEvent
+EventfdRead common/libs/fs/shared_fd.cpp /^int FileInstance::EventfdRead(eventfd_t* value) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+EventfdWrite common/libs/fs/shared_fd.cpp /^int FileInstance::EventfdWrite(eventfd_t value) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+Executable common/libs/utils/subprocess.h /^ const std::string& Executable() const { return command_[0]; }$/;" f class:cuttlefish::Command typeref:typename:const std::string &
+ExitOnFail tools/create_base_image.go /^ ExitOnFail$/;" c package:main
+ExitWithParent common/libs/utils/subprocess.h /^ bool ExitWithParent() const { return exit_with_parent_; }$/;" f class:cuttlefish::SubprocessOptions typeref:typename:bool
+ExitWithParent common/libs/utils/subprocess.h /^ void ExitWithParent(bool exit_with_parent) {$/;" f class:cuttlefish::SubprocessOptions typeref:typename:void
+ExpandedStorageSize host/libs/image_aggregator/image_aggregator.cc /^std::uint64_t ExpandedStorageSize(const std::string& file_path) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:std::uint64_t
+ExportKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::ExportKey(const ExportKeyRequest& request, ExportKeyResponse* response) {$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ExportKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::ExportKey(const ExportKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ExtractAll common/libs/utils/archive.cpp /^bool Archive::ExtractAll(const std::string& target_directory) {$/;" f class:cuttlefish::Archive typeref:typename:bool
+ExtractFiles common/libs/utils/archive.cpp /^bool Archive::ExtractFiles(const std::vector<std::string>& to_extract,$/;" f class:cuttlefish::Archive typeref:typename:bool
+ExtractImages host/commands/fetcher/install_zip.cc /^std::vector<std::string> ExtractImages(const std::string& archive_file,$/;" f typeref:typename:std::vector<std::string>
+ExtractKernelParamsFromFetcherConfig host/commands/assemble_cvd/assemble_cvd.cc /^static void ExtractKernelParamsFromFetcherConfig($/;" f namespace:cuttlefish::__anon1e335d460111 typeref:typename:void file:
+ExtractToMemory common/libs/utils/archive.cpp /^std::string Archive::ExtractToMemory(const std::string& path) {$/;" f class:cuttlefish::Archive typeref:typename:std::string
+ExtractValue host/commands/assemble_cvd/boot_image_utils.cc /^std::string ExtractValue(const std::string& dictionary, const std::string& key) {$/;" f namespace:cuttlefish::__anonbfa95aa40111 typeref:typename:std::string
+FAX host/commands/modem_simulator/sim_service.h /^ FAX = 1 << 2, \/\/ facsimile services$/;" e enum:cuttlefish::SimService::FacilityLock::Class
+FD host/commands/modem_simulator/sim_service.h /^ FD = 10, \/\/ SIM fixed FDN dialing lock, PIN2 is required as a password$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+FLOAT host/libs/confui/cbor.h /^ FLOAT = 7,$/;" e enum:cuttlefish::confui::Cbor::Type
+FSCK_ERROR_CORRECTED host/libs/config/data_image.cpp /^const int FSCK_ERROR_CORRECTED = 1;$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const int
+FSCK_ERROR_CORRECTED_REQUIRES_REBOOT host/libs/config/data_image.cpp /^const int FSCK_ERROR_CORRECTED_REQUIRES_REBOOT = 2;$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const int
+FULL common/libs/utils/tee_logging.h /^ FULL,$/;" e enum:cuttlefish::MetadataLevel
+FULL_MATCH host/commands/modem_simulator/modem_service.h /^ enum MatchMode {FULL_MATCH = 0, PARTIAL_MATCH = 1};$/;" e enum:cuttlefish::CommandHandler::MatchMode
+FacilityLock host/commands/modem_simulator/sim_service.h /^ FacilityLock(LockStatus status) : lock_status(status) {}$/;" f struct:cuttlefish::SimService::FacilityLock
+FacilityLock host/commands/modem_simulator/sim_service.h /^ struct FacilityLock {$/;" s class:cuttlefish::SimService
+Failure host/libs/allocd/request.h /^ Failure \/\/ Request failed$/;" e enum:cuttlefish::RequestStatus
+FailureRecordMap host/commands/secure_env/soft_gatekeeper.h /^ typedef std::unordered_map<uint32_t, failure_record_t> FailureRecordMap;$/;" t class:gatekeeper::SoftGateKeeper typeref:typename:std::unordered_map<uint32_t,failure_record_t>
+FallBackStop host/commands/stop/main.cc /^int FallBackStop(const std::set<std::string>& paths) {$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:int
+FallbackPaths host/commands/stop/main.cc /^std::set<std::string> FallbackPaths() {$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:std::set<std::string>
+FastHashMap host/commands/secure_env/soft_gatekeeper.h /^ typedef std::unordered_map<uint64_t, fast_hash_t> FastHashMap;$/;" t class:gatekeeper::SoftGateKeeper typeref:typename:std::unordered_map<uint64_t,fast_hash_t>
+Fcntl common/libs/fs/shared_fd.cpp /^int FileInstance::Fcntl(int command, int value) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+Feature host/libs/config/feature.h /^class Feature : public virtual FeatureSuperclass<Feature> {$/;" c namespace:cuttlefish
+FeatureSuperclass host/libs/config/feature.h /^class FeatureSuperclass {$/;" c namespace:cuttlefish
+FetchCvdMain host/commands/fetcher/fetch_cvd.cc /^int FetchCvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+FetcherConfig host/libs/config/fetcher_config.cpp /^FetcherConfig::FetcherConfig() : dictionary_(new Json::Value()) {$/;" f class:cuttlefish::FetcherConfig
+FetcherConfig host/libs/config/fetcher_config.h /^class FetcherConfig {$/;" c namespace:cuttlefish
+Fifo common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Fifo(const std::string& path, mode_t mode) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+FileCrc host/libs/config/host_tools_version.cpp /^static uint32_t FileCrc(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:uint32_t file:
+FileDescriptors common/libs/utils/unix_sockets.cpp /^Result<std::vector<SharedFD>> UnixSocketMessage::FileDescriptors() {$/;" f class:cuttlefish::UnixSocketMessage typeref:typename:Result<std::vector<SharedFD>>
+FileExists common/libs/utils/files.cpp /^bool FileExists(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:bool
+FileHasContent common/libs/utils/files.cpp /^bool FileHasContent(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:bool
+FileInstance common/libs/fs/shared_fd.cpp /^FileInstance::FileInstance(int fd, int in_errno)$/;" f class:cuttlefish::FileInstance
+FileInstance common/libs/fs/shared_fd.h /^class FileInstance {$/;" c namespace:cuttlefish
+FileModificationTime common/libs/utils/files.cpp /^std::chrono::system_clock::time_point FileModificationTime(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:std::chrono::system_clock::time_point
+FileSize common/libs/utils/files.cpp /^off_t FileSize(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:off_t
+FileSizes common/libs/utils/files.h /^struct FileSizes {$/;" s namespace:cuttlefish
+FileSource host/libs/config/fetcher_config.h /^enum FileSource {$/;" g namespace:cuttlefish
+FinalizeTcti host/commands/secure_env/device_tpm.cpp /^static void FinalizeTcti(TSS2_TCTI_CONTEXT* tcti_context) {$/;" f namespace:cuttlefish typeref:typename:void file:
+FindAndroidInfoConfig host/libs/config/config_flag.cpp /^ std::optional<std::string> FindAndroidInfoConfig() const {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:std::optional<std::string> file:
+FindAttribute host/commands/modem_simulator/sim_service.cpp /^XMLElement* SimService::SimFileSystem::FindAttribute(XMLElement *parent,$/;" f class:cuttlefish::SimService::SimFileSystem typeref:typename:XMLElement *
+FindConfigFromStdin host/commands/run_cvd/main.cc /^const CuttlefishConfig* FindConfigFromStdin() {$/;" f namespace:cuttlefish::__anonadab6e0c0111 typeref:typename:const CuttlefishConfig *
+FindCvdFileWithSuffix host/libs/config/fetcher_config.cpp /^std::string FetcherConfig::FindCvdFileWithSuffix(const std::string& suffix) const {$/;" f class:cuttlefish::FetcherConfig typeref:typename:std::string
+FindFetcherConfig host/commands/assemble_cvd/assemble_cvd.cc /^FetcherConfig FindFetcherConfig(const std::vector<std::string>& files) {$/;" f namespace:cuttlefish::__anon1e335d460111 typeref:typename:FetcherConfig
+FindImports host/commands/assemble_cvd/super_image_mixer.cc /^void FindImports(Archive* archive, const std::string& build_prop_file) {$/;" f namespace:cuttlefish::__anonae6530d30111 typeref:typename:void
+FindSession host/libs/allocd/resource_manager.cpp /^std::optional<std::shared_ptr<Session>> ResourceManager::FindSession($/;" f class:cuttlefish::ResourceManager typeref:typename:std::optional<std::shared_ptr<Session>>
+FinishOperation guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::FinishOperation(const FinishOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+FinishOperation guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::FinishOperation(const FinishOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+FixTimeZone host/commands/modem_simulator/misc_service.cpp /^void MiscService::FixTimeZone(std::string& line) {$/;" f class:cuttlefish::MiscService typeref:typename:void
+FixedCredentialSource host/commands/fetcher/credential_source.cc /^FixedCredentialSource::FixedCredentialSource(const std::string& credential) {$/;" f class:cuttlefish::FixedCredentialSource
+FixedCredentialSource host/commands/fetcher/credential_source.h /^class FixedCredentialSource : public CredentialSource {$/;" c namespace:cuttlefish
+FixedDataImagePath host/libs/config/data_image.cpp /^class FixedDataImagePath : public DataImagePath {$/;" c namespace:cuttlefish file:
+FixedDataImagePathComponent host/libs/config/data_image.cpp /^fruit::Component<DataImagePath> FixedDataImagePathComponent($/;" f namespace:cuttlefish typeref:typename:fruit::Component<DataImagePath>
+FixedMiscImagePath host/libs/config/data_image.cpp /^class FixedMiscImagePath : public MiscImagePath {$/;" c namespace:cuttlefish file:
+FixedMiscImagePathComponent host/libs/config/data_image.cpp /^fruit::Component<MiscImagePath> FixedMiscImagePathComponent($/;" f namespace:cuttlefish typeref:typename:fruit::Component<MiscImagePath>
+Flag common/libs/utils/flag_parser.h /^class Flag {$/;" c namespace:cuttlefish
+FlagAlias common/libs/utils/flag_parser.h /^struct FlagAlias {$/;" s namespace:cuttlefish
+FlagAliasMode common/libs/utils/flag_parser.h /^enum class FlagAliasMode {$/;" g namespace:cuttlefish
+FlagFeature host/libs/config/feature.h /^class FlagFeature : public FeatureSuperclass<FlagFeature> {$/;" c namespace:cuttlefish
+FlagForwarder host/commands/start/flag_forwarder.cc /^FlagForwarder::FlagForwarder(std::set<std::string> subprocesses)$/;" f class:FlagForwarder
+FlagForwarder host/commands/start/flag_forwarder.h /^class FlagForwarder {$/;" c
+FlagMatch common/libs/utils/flag_parser.h /^struct FlagMatch {$/;" s namespace:cuttlefish
+FlagProcessResult common/libs/utils/flag_parser.h /^ enum class FlagProcessResult {$/;" g class:cuttlefish::Flag
+Flags host/libs/config/custom_actions.cpp /^ std::vector<Flag> Flags() const {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:std::vector<Flag> file:
+FlagsComponent host/commands/assemble_cvd/assemble_cvd.cc /^fruit::Component<> FlagsComponent() {$/;" f namespace:cuttlefish::__anon1e335d460111 typeref:typename:fruit::Component<>
+FlagsForSubprocess host/commands/start/flag_forwarder.cc /^std::vector<gflags::CommandLineFlagInfo> FlagsForSubprocess(std::string helpxml_output) {$/;" f namespace:__anon4552bec90111 typeref:typename:std::vector<gflags::CommandLineFlagInfo>
+ForCurrentInstance host/libs/config/cuttlefish_config.cpp /^int ForCurrentInstance(int base) { return base + GetInstance() - 1; }$/;" f namespace:cuttlefish typeref:typename:int
+ForCurrentInstance host/libs/config/cuttlefish_config.cpp /^std::string ForCurrentInstance(const char* prefix) {$/;" f namespace:cuttlefish typeref:typename:std::string
+ForDefaultInstance host/libs/config/cuttlefish_config.cpp /^CuttlefishConfig::InstanceSpecific CuttlefishConfig::ForDefaultInstance()$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:CuttlefishConfig::InstanceSpecific
+ForInstance host/commands/modem_simulator/nvram_config.cpp /^NvramConfig::InstanceSpecific NvramConfig::ForInstance(int num) const {$/;" f class:cuttlefish::NvramConfig typeref:typename:NvramConfig::InstanceSpecific
+ForInstance host/libs/config/cuttlefish_config.cpp /^CuttlefishConfig::InstanceSpecific CuttlefishConfig::ForInstance($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:CuttlefishConfig::InstanceSpecific
+ForInstance host/libs/config/cuttlefish_config.cpp /^CuttlefishConfig::MutableInstanceSpecific CuttlefishConfig::ForInstance($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:CuttlefishConfig::MutableInstanceSpecific
+ForceFsckImage host/libs/config/data_image.cpp /^bool ForceFsckImage(const CuttlefishConfig& config,$/;" f namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:bool
+ForegroundLauncherPipe host/commands/run_cvd/boot_state_machine.cc /^ SharedFD ForegroundLauncherPipe() { return foreground_launcher_pipe_; }$/;" f class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:SharedFD file:
+ForgetConnection host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionContextImpl::ForgetConnection(void* raw) {$/;" f class:WsConnectionContextImpl typeref:typename:void
+ForwardCommand guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::ForwardCommand(AndroidKeymasterCommand command, const Serializable& req,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ForwardCommand guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::ForwardCommand(AndroidKeymasterCommand command,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ForwardHandler host/frontend/webrtc_operator/client_handler.cpp /^ForwardHandler::ForwardHandler(struct lws* wsi,$/;" f class:cuttlefish::ForwardHandler
+ForwardHandler host/frontend/webrtc_operator/client_handler.h /^class ForwardHandler : public ClientDynHandler {$/;" c namespace:cuttlefish
+FragileTpmStorage host/commands/secure_env/fragile_tpm_storage.cpp /^FragileTpmStorage::FragileTpmStorage($/;" f class:cuttlefish::FragileTpmStorage
+FragileTpmStorage host/commands/secure_env/fragile_tpm_storage.h /^class FragileTpmStorage : public GatekeeperStorage {$/;" c namespace:cuttlefish
+FrameCallback host/libs/wayland/wayland_surfaces.h /^ using FrameCallback =$/;" t class:wayland::Surfaces
+FrameMultiplexer host/libs/screen_connector/screen_connector.h /^ using FrameMultiplexer = ScreenConnectorInputMultiplexer<ProcessedFrameType>;$/;" t class:cuttlefish::ScreenConnector typeref:typename:ScreenConnectorInputMultiplexer<ProcessedFrameType>
+FromContext host/commands/secure_env/in_process_tpm.cpp /^ static Impl* FromContext(TSS2_TCTI_CONTEXT* context) {$/;" f class:cuttlefish::InProcessTpm::Impl typeref:typename:Impl * file:
+FromCredentials common/libs/utils/unix_sockets.cpp /^ControlMessage ControlMessage::FromCredentials(const ucred& credentials) {$/;" f class:cuttlefish::ControlMessage typeref:typename:ControlMessage
+FromFileDescriptors common/libs/utils/unix_sockets.cpp /^Result<ControlMessage> ControlMessage::FromFileDescriptors($/;" f class:cuttlefish::ControlMessage typeref:typename:Result<ControlMessage>
+FromPool host/frontend/webrtc/cvd_video_frame_buffer.cpp /^std::vector<uint8_t> FromPool(int size) {$/;" f namespace:cuttlefish::__anonfb30483e0111 typeref:typename:std::vector<uint8_t>
+FromRaw common/libs/utils/unix_sockets.cpp /^ControlMessage ControlMessage::FromRaw(const cmsghdr* cmsg) {$/;" f class:cuttlefish::ControlMessage typeref:typename:ControlMessage
+FromString host/commands/start/flag_forwarder.cc /^T FromString(const std::string& str) {$/;" f namespace:__anon4552bec90111 typeref:typename:T
+FsmInput host/libs/confui/server_common.h /^enum class FsmInput : std::uint32_t {$/;" g namespace:cuttlefish::confui typeref:typename:std::uint32_t
+Full host/libs/screen_connector/screen_connector_queue.h /^ bool Full() const {$/;" f class:cuttlefish::ScreenConnectorQueue typeref:typename:bool
+FullOTA_GetBlockDifferences shared/releasetools.py /^def FullOTA_GetBlockDifferences(info):$/;" f
+GENERATED host/libs/config/fetcher_config.h /^ GENERATED,$/;" e enum:cuttlefish::FileSource
+GERAN guest/hals/ril/reference-libril/ril.h /^ GERAN = 0x01, \/\/ GSM EDGE Radio Access Network$/;" e enum:__anon0bfbaecfa503
+GERAN_BAND_450 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_450 = 3,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_480 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_480 = 4,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_710 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_710 = 5,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_750 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_750 = 6,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_850 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_850 = 8,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_DCS1800 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_DCS1800 = 12,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_E900 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_E900 = 10,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_ER900 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_ER900 = 14,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_P900 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_P900 = 9,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_PCS1900 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_PCS1900 = 13,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_R900 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_R900 = 11,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_T380 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_T380 = 1,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_T410 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_T410 = 2,$/;" e enum:__anon0bfbaecfa703
+GERAN_BAND_T810 guest/hals/ril/reference-libril/ril.h /^ GERAN_BAND_T810 = 7,$/;" e enum:__anon0bfbaecfa703
+GET_CHANNEL_STATUS host/commands/modem_simulator/stk_service.h /^ GET_CHANNEL_STATUS = 0x44$/;" e enum:cuttlefish::StkService::CommandType
+GET_INKEY host/commands/modem_simulator/stk_service.h /^ GET_INKEY = 0x22,$/;" e enum:cuttlefish::StkService::CommandType
+GET_INPUT host/commands/modem_simulator/stk_service.h /^ GET_INPUT = 0x23,$/;" e enum:cuttlefish::StkService::CommandType
+GID shared/config/cgroups.json /^ "GID": "system"$/;" s object:Cgroups.0
+GNSS_SERIAL_BUFFER_SIZE host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^constexpr uint32_t GNSS_SERIAL_BUFFER_SIZE = 4096;$/;" v typeref:typename:uint32_t
+GOOGLE host/commands/metrics/proto/common.proto /^ GOOGLE = 0;$/;" e enum:UserType
+GPT_NUM_PARTITIONS host/libs/image_aggregator/image_aggregator.cc /^constexpr int GPT_NUM_PARTITIONS = 128;$/;" v namespace:cuttlefish::__anon02806fd80111 typeref:typename:int
+GRPCPP_GRPCPP_H host/commands/gnss_grpc_proxy/grpcpp.h /^#define GRPCPP_GRPCPP_H$/;" d
+GSM guest/hals/ril/reference-ril/reference-ril.c /^#define GSM /;" d file:
+GUARDED_BY common/libs/concurrency/thread_annotations.h /^#define GUARDED_BY(/;" d
+GUEST_GCE_NETWORK_NETWORK_INTERFACE_H_ common/libs/net/network_interface.h /^#define GUEST_GCE_NETWORK_NETWORK_INTERFACE_H_$/;" d
+GW_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_GW_SignalStrength GW_SignalStrength;$/;" m struct:__anon0bfbaecf5108 typeref:typename:RIL_GW_SignalStrength
+GW_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_GW_SignalStrength GW_SignalStrength;$/;" m struct:__anon0bfbaecf5208 typeref:typename:RIL_GW_SignalStrength
+GW_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_GW_SignalStrength GW_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_GW_SignalStrength
+GW_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_GW_SignalStrength GW_SignalStrength;$/;" m struct:__anon0bfbaecf4f08 typeref:typename:RIL_GW_SignalStrength
+GW_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_GW_SignalStrength GW_SignalStrength;$/;" m struct:__anon0bfbaecf5008 typeref:typename:RIL_GW_SignalStrength
+Gatekeeper host/libs/config/cuttlefish_config.h /^ Gatekeeper,$/;" e enum:cuttlefish::SecureHal
+GatekeeperChannel common/libs/security/gatekeeper_channel.cpp /^GatekeeperChannel::GatekeeperChannel(SharedFD input, SharedFD output)$/;" f class:cuttlefish::GatekeeperChannel
+GatekeeperChannel common/libs/security/gatekeeper_channel.h /^class GatekeeperChannel {$/;" c namespace:cuttlefish
+GatekeeperCommandDestroyer common/libs/security/gatekeeper_channel.h /^class GatekeeperCommandDestroyer {$/;" c namespace:cuttlefish
+GatekeeperRawMessage common/libs/security/gatekeeper_channel.h /^struct GatekeeperRawMessage {$/;" s namespace:gatekeeper
+GatekeeperResponder host/commands/secure_env/gatekeeper_responder.cpp /^GatekeeperResponder::GatekeeperResponder($/;" f class:cuttlefish::GatekeeperResponder
+GatekeeperResponder host/commands/secure_env/gatekeeper_responder.h /^class GatekeeperResponder {$/;" c namespace:cuttlefish
+GatekeeperStorage host/commands/secure_env/gatekeeper_storage.h /^class GatekeeperStorage {$/;" c namespace:cuttlefish
+GatewayConfig host/libs/allocd/alloc_utils.h /^struct GatewayConfig {$/;" s namespace:cuttlefish
+GceBroadcastReceiver guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java /^public class GceBroadcastReceiver extends BroadcastReceiver {$/;" c
+GceFuture guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public GceFuture(String name) {$/;" m class:GceFuture
+GceFuture guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^public class GceFuture<T> extends AbstractFuture<T> {$/;" c
+GceMetadataCredentialSource host/commands/fetcher/credential_source.cc /^GceMetadataCredentialSource::GceMetadataCredentialSource(CurlWrapper& curl)$/;" f class:cuttlefish::GceMetadataCredentialSource
+GceMetadataCredentialSource host/commands/fetcher/credential_source.h /^class GceMetadataCredentialSource : public CredentialSource {$/;" c namespace:cuttlefish
+GceService guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public GceService() {}$/;" m class:GceService
+GceService guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^public class GceService extends Service {$/;" c
+GceWifiManager guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public GceWifiManager(Context context, EventReporter eventReporter, JobExecutor executor) {$/;" m class:GceWifiManager
+GceWifiManager guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^public class GceWifiManager extends JobBase {$/;" c
+GenerateAndroidBuildActions build/cvd-host-package.go /^func (c *cvdHostPackage) GenerateAndroidBuildActions(ctx android.ModuleContext) {$/;" f struct:cuttlefish.cvdHostPackage
+GenerateAttestation host/commands/secure_env/proxy_keymaster_context.h /^ keymaster::CertificateChain GenerateAttestation($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster::CertificateChain
+GenerateAttestation host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster::CertificateChain TpmKeymasterContext::GenerateAttestation($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster::CertificateChain
+GenerateBcc host/commands/secure_env/tpm_remote_provisioning_context.cpp /^TpmRemoteProvisioningContext::GenerateBcc(bool testMode) const {$/;" f class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:std::pair<std::vector<uint8_t>,cppbor::Array>
+GenerateCsr guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::GenerateCsr(const GenerateCsrRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GenerateHmacSha256 host/commands/secure_env/tpm_remote_provisioning_context.cpp /^TpmRemoteProvisioningContext::GenerateHmacSha256($/;" f class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:std::optional<cppcose::HmacSha256>
+GenerateKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::GenerateKey(const GenerateKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GenerateKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::GenerateKey(const GenerateKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GenerateKeyFrame host/frontend/webrtc/lib/video_track_source_impl.h /^ void GenerateKeyFrame() override {}$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:void
+GeneratePersistentBootconfig host/commands/assemble_cvd/disk_flags.cc /^static void GeneratePersistentBootconfig($/;" f namespace:cuttlefish typeref:typename:void file:
+GenerateProcessedFrameCallback host/frontend/webrtc/display_handler.h /^ using GenerateProcessedFrameCallback = ScreenConnector::GenerateProcessedFrameCallback;$/;" t class:cuttlefish::DisplayHandler typeref:typename:ScreenConnector::GenerateProcessedFrameCallback
+GenerateProcessedFrameCallback host/libs/screen_connector/screen_connector.h /^ using GenerateProcessedFrameCallback = std::function<void($/;" t class:cuttlefish::ScreenConnector
+GenerateProcessedFrameCallbackImpl host/libs/screen_connector/screen_connector_common.h /^using GenerateProcessedFrameCallbackImpl =$/;" t namespace:cuttlefish
+GenerateRandom host/commands/secure_env/tpm_random_source.cpp /^keymaster_error_t TpmRandomSource::GenerateRandom($/;" f class:cuttlefish::TpmRandomSource typeref:typename:keymaster_error_t
+GenerateRandomHandle host/commands/secure_env/fragile_tpm_storage.cpp /^TPM2_HANDLE FragileTpmStorage::GenerateRandomHandle() {$/;" f class:cuttlefish::FragileTpmStorage typeref:typename:TPM2_HANDLE
+GenerateRenderer host/libs/confui/host_renderer.cc /^std::unique_ptr<ConfUiRenderer> ConfUiRenderer::GenerateRenderer($/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::unique_ptr<ConfUiRenderer>
+GenerateRkpKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::GenerateRkpKey(const GenerateRkpKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GenerateSelfSignedCertificate host/commands/secure_env/proxy_keymaster_context.h /^ keymaster::CertificateChain GenerateSelfSignedCertificate($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster::CertificateChain
+GenerateSelfSignedCertificate host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster::CertificateChain TpmKeymasterContext::GenerateSelfSignedCertificate($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster::CertificateChain
+GenerateTimestampToken guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::GenerateTimestampToken($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GenerateTimestampToken host/commands/secure_env/tpm_keymaster_enforcement.cpp /^keymaster_error_t TpmKeymasterEnforcement::GenerateTimestampToken($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:keymaster_error_t
+GenerateUniqueId host/commands/secure_env/tpm_attestation_record.cpp /^keymaster::Buffer TpmAttestationRecordContext::GenerateUniqueId($/;" f class:cuttlefish::TpmAttestationRecordContext typeref:typename:keymaster::Buffer
+Get common/libs/device_config/guest_device_config.cpp /^std::unique_ptr<DeviceConfigHelper> DeviceConfigHelper::Get() {$/;" f class:cuttlefish::DeviceConfigHelper typeref:typename:std::unique_ptr<DeviceConfigHelper>
+Get common/libs/device_config/host_device_config.cpp /^std::unique_ptr<DeviceConfigHelper> DeviceConfigHelper::Get() {$/;" f class:cuttlefish::DeviceConfigHelper typeref:typename:std::unique_ptr<DeviceConfigHelper>
+Get host/commands/modem_simulator/nvram_config.cpp /^\/* static *\/ const NvramConfig* NvramConfig::Get() {$/;" f class:cuttlefish::NvramConfig typeref:typename:const NvramConfig *
+Get host/frontend/webrtc_operator/client_handler.cpp /^std::shared_ptr<PollConnectionHandler> PollConnectionStore::Get($/;" f class:cuttlefish::PollConnectionStore typeref:typename:std::shared_ptr<PollConnectionHandler>
+Get host/libs/config/cuttlefish_config.cpp /^\/*static*\/ const CuttlefishConfig* CuttlefishConfig::Get() {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:const CuttlefishConfig *
+Get host/libs/confui/host_mode_ctrl.h /^ static HostModeCtrl& Get() {$/;" f class:cuttlefish::HostModeCtrl typeref:typename:HostModeCtrl &
+Get host/libs/confui/host_server.cc /^HostServer& HostServer::Get($/;" f class:cuttlefish::confui::HostServer typeref:typename:HostServer &
+Get host/libs/confui/host_utils.cc /^std::optional<std::thread::id> ThreadTracer::Get(const std::string& name) {$/;" f class:cuttlefish::confui::thread::ThreadTracer typeref:typename:std::optional<std::thread::id>
+Get host/libs/confui/host_utils.cc /^std::string ThreadTracer::Get(const std::thread::id tid) {$/;" f class:cuttlefish::confui::thread::ThreadTracer typeref:typename:std::string
+Get host/libs/screen_connector/screen_connector.h /^ static std::unique_ptr<ScreenConnector<ProcessedFrameType>> Get($/;" f class:cuttlefish::ScreenConnector typeref:typename:std::unique_ptr<ScreenConnector<ProcessedFrameType>>
+GetAbs guest/commands/vsoc_input_service/virtual_device_base.cpp /^const std::vector<const uint32_t>& VirtualDeviceBase::GetAbs() const {$/;" f class:VirtualDeviceBase typeref:typename:const std::vector<const uint32_t> &
+GetAbs guest/commands/vsoc_input_service/virtual_touchscreen.cpp /^const std::vector<const uint32_t>& VirtualTouchScreen::GetAbs() const {$/;" f class:cuttlefish_input_service::VirtualTouchScreen typeref:typename:const std::vector<const uint32_t> &
+GetActiveInterfaces host/libs/allocd/resource_manager.h /^ const std::set<std::string>& GetActiveInterfaces() {$/;" f class:cuttlefish::Session typeref:typename:const std::set<std::string> &
+GetAttestationChain host/commands/secure_env/tpm_attestation_record.cpp /^TpmAttestationRecordContext::GetAttestationChain(keymaster_algorithm_t algorithm,$/;" f class:cuttlefish::TpmAttestationRecordContext typeref:typename:keymaster::CertificateChain
+GetAttestationKey host/commands/secure_env/tpm_attestation_record.cpp /^TpmAttestationRecordContext::GetAttestationKey(keymaster_algorithm_t algorithm,$/;" f class:cuttlefish::TpmAttestationRecordContext typeref:typename:keymaster::KeymasterKeyBlob
+GetAudioSource host/frontend/webrtc/lib/streamer.cpp /^std::shared_ptr<AudioSource> Streamer::GetAudioSource() {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:std::shared_ptr<AudioSource>
+GetAuthTokenKey host/commands/secure_env/soft_gatekeeper.h /^ virtual bool GetAuthTokenKey(const uint8_t** auth_token_key, uint32_t* length) const {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+GetAuthTokenKey host/commands/secure_env/tpm_gatekeeper.cpp /^bool TpmGatekeeper::GetAuthTokenKey($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:bool
+GetBootPatchlevel host/commands/secure_env/proxy_keymaster_context.h /^ std::optional<uint32_t> GetBootPatchlevel() const override {$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:std::optional<uint32_t>
+GetBootPatchlevel host/commands/secure_env/tpm_keymaster_context.cpp /^std::optional<uint32_t> TpmKeymasterContext::GetBootPatchlevel() const {$/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:std::optional<uint32_t>
+GetBoundary host/libs/confui/host_renderer.h /^ Boundary GetBoundary(LayoutElement&& e) const {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:Boundary
+GetBridgeName host/libs/allocd/resource.h /^ std::string GetBridgeName() { return bridge_name_; }$/;" f class:cuttlefish::EthernetIface typeref:typename:std::string
+GetCameraStream host/frontend/webrtc/lib/client_handler.cpp /^ClientVideoTrackInterface* ClientHandler::GetCameraStream() {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:ClientVideoTrackInterface *
+GetCandidateProcessGroups host/commands/stop/main.cc /^std::set<pid_t> GetCandidateProcessGroups(const std::set<std::string>& paths) {$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:std::set<pid_t>
+GetCommonIccEFPath host/commands/modem_simulator/sim_service.cpp /^std::string SimService::SimFileSystem::GetCommonIccEFPath(EFId efid) {$/;" f class:cuttlefish::SimService::SimFileSystem typeref:typename:std::string
+GetConfigFilePath host/commands/assemble_cvd/flags.cc /^std::string GetConfigFilePath(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish typeref:typename:std::string
+GetConnection host/frontend/webrtc/lib/ws_connection.cpp /^std::shared_ptr<WsConnectionImpl> WsConnectionContextImpl::GetConnection($/;" f class:WsConnectionContextImpl typeref:typename:std::shared_ptr<WsConnectionImpl>
+GetControlSocketPath host/commands/health/health.cpp /^std::string GetControlSocketPath(const cuttlefish::CuttlefishConfig& config) {$/;" f typeref:typename:std::string
+GetControlSocketPath host/libs/vm_manager/crosvm_manager.cpp /^std::string GetControlSocketPath($/;" f namespace:cuttlefish::vm_manager::__anon9162129c0111 typeref:typename:std::string
+GetCurrentSelectItem host/commands/modem_simulator/stk_service.cpp /^XMLElement* StkService::GetCurrentSelectItem() {$/;" f class:cuttlefish::StkService typeref:typename:XMLElement *
+GetCurrentSessionId host/libs/confui/host_server.h /^ std::string GetCurrentSessionId() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:std::string
+GetCurrentState host/libs/confui/host_server.h /^ std::string GetCurrentState() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:std::string
+GetCurrentTimeStamp host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::GetCurrentTimeStamp() {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+GetCuttlefishEnvPath host/commands/assemble_cvd/flags.cc /^std::string GetCuttlefishEnvPath() {$/;" f namespace:cuttlefish typeref:typename:std::string
+GetDataIn host/libs/websocket/websocket_handler.h /^ const std::string& GetDataIn() const { return in_buffer_; }$/;" f class:cuttlefish::DynHandler typeref:typename:const std::string &
+GetDefaultVsockCid host/libs/config/cuttlefish_config.cpp /^int GetDefaultVsockCid() {$/;" f namespace:cuttlefish typeref:typename:int
+GetDevice host/frontend/webrtc_operator/device_registry.cpp /^std::shared_ptr<DeviceHandler> DeviceRegistry::GetDevice($/;" f class:cuttlefish::DeviceRegistry typeref:typename:std::shared_ptr<DeviceHandler>
+GetDeviceConfig common/libs/device_config/device_config.h /^ const DeviceConfig& GetDeviceConfig() const { return device_config_; }$/;" f class:cuttlefish::DeviceConfigHelper typeref:typename:const DeviceConfig &
+GetDeviceConfig common/libs/device_config/device_config_shared.cpp /^DeviceConfig GetDeviceConfig() {$/;" f namespace:cuttlefish typeref:typename:DeviceConfig
+GetEncoderSelector host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^VP8OnlyEncoderFactory::GetEncoderSelector() const {$/;" f class:cuttlefish::webrtc_streaming::VP8OnlyEncoderFactory typeref:typename:std::unique_ptr<webrtc::VideoEncoderFactory::EncoderSelectorInterface>
+GetEntry host/commands/secure_env/insecure_fallback_storage.cpp /^Json::Value* InsecureFallbackStorage::GetEntry(const Json::Value& key) {$/;" f class:cuttlefish::InsecureFallbackStorage typeref:typename:Json::Value *
+GetEntry host/commands/secure_env/insecure_fallback_storage.cpp /^const Json::Value* InsecureFallbackStorage::GetEntry($/;" f class:cuttlefish::InsecureFallbackStorage typeref:typename:const Json::Value *
+GetErrno common/libs/fs/shared_fd.h /^ int GetErrno() const { return errno_; }$/;" f class:cuttlefish::FileInstance typeref:typename:int
+GetErrorCode host/libs/confui/cbor.h /^ Error GetErrorCode() const { return buffer_status_; }$/;" f class:cuttlefish::confui::Cbor typeref:typename:Error
+GetEventBuffer host/frontend/webrtc/connection_observer.cpp /^std::unique_ptr<InputEventBuffer> GetEventBuffer() {$/;" f namespace:cuttlefish typeref:typename:std::unique_ptr<InputEventBuffer>
+GetEventTypes guest/commands/vsoc_input_service/virtual_device_base.cpp /^const std::vector<const uint32_t>& VirtualDeviceBase::GetEventTypes() const {$/;" f class:VirtualDeviceBase typeref:typename:const std::vector<const uint32_t> &
+GetEventTypes guest/commands/vsoc_input_service/virtual_keyboard.cpp /^const std::vector<const uint32_t>& VirtualKeyboard::GetEventTypes() const {$/;" f class:cuttlefish_input_service::VirtualKeyboard typeref:typename:const std::vector<const uint32_t> &
+GetEventTypes guest/commands/vsoc_input_service/virtual_power_button.cpp /^const std::vector<const uint32_t>& VirtualPowerButton::GetEventTypes() const {$/;" f class:cuttlefish_input_service::VirtualPowerButton typeref:typename:const std::vector<const uint32_t> &
+GetEventTypes guest/commands/vsoc_input_service/virtual_touchscreen.cpp /^const std::vector<const uint32_t>& VirtualTouchScreen::GetEventTypes() const {$/;" f class:cuttlefish_input_service::VirtualTouchScreen typeref:typename:const std::vector<const uint32_t> &
+GetExtraData common/libs/confui/protocol_types.h /^ std::vector<std::uint8_t> GetExtraData() const { return extra_data_; }$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::vector<std::uint8_t>
+GetFailureRecord host/commands/secure_env/soft_gatekeeper.h /^ virtual bool GetFailureRecord(uint32_t uid, secure_id_t user_id, failure_record_t* record,$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+GetFailureRecord host/commands/secure_env/tpm_gatekeeper.cpp /^bool TpmGatekeeper::GetFailureRecord($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:bool
+GetFailureRecordImpl host/commands/secure_env/tpm_gatekeeper.cpp /^static bool GetFailureRecordImpl($/;" f namespace:cuttlefish typeref:typename:bool file:
+GetFsType host/libs/config/data_image.cpp /^std::string GetFsType(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:std::string
+GetGlobalConfigFileLink host/libs/config/cuttlefish_config.cpp /^std::string GetGlobalConfigFileLink() {$/;" f namespace:cuttlefish typeref:typename:std::string
+GetGlobalID host/libs/allocd/resource.h /^ uint32_t GetGlobalID() { return global_id_; }$/;" f class:cuttlefish::StaticResource typeref:typename:uint32_t
+GetGracePeriod host/libs/confui/session.cc /^static const std::chrono::milliseconds GetGracePeriod() {$/;" f namespace:cuttlefish::confui typeref:typename:const std::chrono::milliseconds file:
+GetGraphicsAvailability host/libs/graphics_detector/graphics_detector.cpp /^GraphicsAvailability GetGraphicsAvailability() {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:GraphicsAvailability
+GetGraphicsAvailabilityWithSubprocessCheck host/libs/graphics_detector/graphics_detector.cpp /^GraphicsAvailability GetGraphicsAvailabilityWithSubprocessCheck() {$/;" f namespace:cuttlefish typeref:typename:GraphicsAvailability
+GetHandle host/commands/secure_env/fragile_tpm_storage.cpp /^TPM2_HANDLE FragileTpmStorage::GetHandle(const Json::Value& key) const {$/;" f class:cuttlefish::FragileTpmStorage typeref:typename:TPM2_HANDLE
+GetHasIpv4 host/libs/allocd/resource.h /^ bool GetHasIpv4() { return has_ipv4_; }$/;" f class:cuttlefish::EthernetIface typeref:typename:bool
+GetHasIpv6 host/libs/allocd/resource.h /^ bool GetHasIpv6() { return has_ipv6_; }$/;" f class:cuttlefish::EthernetIface typeref:typename:bool
+GetHiddenTags host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster::AuthorizationSet GetHiddenTags($/;" f namespace:cuttlefish::__anone862986b0111 typeref:typename:keymaster::AuthorizationSet
+GetHmacSharingParameters guest/hals/keymaster/remote/remote_keymaster.cpp /^GetHmacSharingParametersResponse RemoteKeymaster::GetHmacSharingParameters() {$/;" f class:keymaster::RemoteKeymaster typeref:typename:GetHmacSharingParametersResponse
+GetHmacSharingParameters guest/hals/keymint/remote/remote_keymaster.cpp /^GetHmacSharingParametersResponse RemoteKeymaster::GetHmacSharingParameters() {$/;" f class:keymaster::RemoteKeymaster typeref:typename:GetHmacSharingParametersResponse
+GetHmacSharingParameters host/commands/secure_env/tpm_keymaster_enforcement.cpp /^keymaster_error_t TpmKeymasterEnforcement::GetHmacSharingParameters($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:keymaster_error_t
+GetHostId host/commands/modem_simulator/modem_service.cpp /^std::string ModemService::GetHostId() {$/;" f class:cuttlefish::ModemService typeref:typename:std::string
+GetIccProfile host/commands/modem_simulator/sim_service.cpp /^XMLElement* SimService::GetIccProfile() {$/;" f class:cuttlefish::SimService typeref:typename:XMLElement *
+GetId host/libs/confui/host_utils.cc /^std::optional<std::thread::id> GetId(const std::string& name) {$/;" f namespace:cuttlefish::confui::thread typeref:typename:std::optional<std::thread::id>
+GetId host/libs/confui/session.h /^ std::string GetId() { return session_id_; }$/;" f class:cuttlefish::confui::Session typeref:typename:std::string
+GetIfaceId host/libs/allocd/resource.h /^ uint16_t GetIfaceId() { return iface_id_; }$/;" f class:cuttlefish::EthernetIface typeref:typename:uint16_t
+GetIfaceId host/libs/allocd/resource.h /^ uint16_t GetIfaceId() { return iface_id_; }$/;" f class:cuttlefish::MobileIface typeref:typename:uint16_t
+GetInstance host/libs/config/cuttlefish_config.cpp /^int GetInstance() {$/;" f namespace:cuttlefish typeref:typename:int
+GetIpAddr host/libs/allocd/resource.h /^ std::string GetIpAddr() { return ipaddr_; }$/;" f class:cuttlefish::EthernetIface typeref:typename:std::string
+GetIpAddr host/libs/allocd/resource.h /^ std::string GetIpAddr() { return ipaddr_; }$/;" f class:cuttlefish::MobileIface typeref:typename:std::string
+GetKernelConfigAndSetDefaults host/commands/assemble_cvd/flags.cc /^bool GetKernelConfigAndSetDefaults(KernelConfig* kernel_config) {$/;" f namespace:cuttlefish typeref:typename:bool
+GetKeyCharacteristics guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::GetKeyCharacteristics(const GetKeyCharacteristicsRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GetKeyCharacteristics guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::GetKeyCharacteristics($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GetKeyFactory host/commands/secure_env/proxy_keymaster_context.h /^ const keymaster::KeyFactory* GetKeyFactory($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:const keymaster::KeyFactory *
+GetKeyFactory host/commands/secure_env/tpm_keymaster_context.cpp /^const KeyFactory* TpmKeymasterContext::GetKeyFactory($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:const KeyFactory *
+GetKeys guest/commands/vsoc_input_service/virtual_device_base.cpp /^const std::vector<const uint32_t>& VirtualDeviceBase::GetKeys() const {$/;" f class:VirtualDeviceBase typeref:typename:const std::vector<const uint32_t> &
+GetKeys guest/commands/vsoc_input_service/virtual_keyboard.cpp /^const std::vector<const uint32_t>& VirtualKeyboard::GetKeys() const {$/;" f class:cuttlefish_input_service::VirtualKeyboard typeref:typename:const std::vector<const uint32_t> &
+GetKeys guest/commands/vsoc_input_service/virtual_power_button.cpp /^const std::vector<const uint32_t>& VirtualPowerButton::GetKeys() const {$/;" f class:cuttlefish_input_service::VirtualPowerButton typeref:typename:const std::vector<const uint32_t> &
+GetKeys guest/commands/vsoc_input_service/virtual_touchscreen.cpp /^const std::vector<const uint32_t>& VirtualTouchScreen::GetKeys() const {$/;" f class:cuttlefish_input_service::VirtualTouchScreen typeref:typename:const std::vector<const uint32_t> &
+GetKmVersion host/commands/secure_env/proxy_keymaster_context.h /^ keymaster::KmVersion GetKmVersion() const override {$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster::KmVersion
+GetKmVersion host/commands/secure_env/tpm_keymaster_context.h /^ keymaster::KmVersion GetKmVersion() const override {$/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster::KmVersion
+GetLegacyConfigFilePath host/commands/assemble_cvd/assemble_cvd.cc /^std::string GetLegacyConfigFilePath(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish::__anon1e335d460111 typeref:typename:std::string
+GetLinuxVersion host/libs/vm_manager/host_configuration.cpp /^std::pair<int,int> GetLinuxVersion() {$/;" f namespace:cuttlefish::vm_manager::__anon1edaaabd0111 typeref:typename:std::pair<int,int>
+GetLocale common/libs/confui/protocol_types.h /^ std::string GetLocale() const { return locale_; }$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::string
+GetLocation common/libs/confui/protocol_types.h /^ std::pair<int, int> GetLocation() { return {x_, y_}; }$/;" f class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:std::pair<int,int>
+GetMessage common/libs/confui/protocol_types.h /^ auto GetMessage() const { return message_; }$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:auto
+GetMessage host/libs/confui/cbor.h /^ std::vector<std::uint8_t>&& GetMessage() {$/;" f class:cuttlefish::confui::Cbor typeref:typename:std::vector<std::uint8_t> &&
+GetMillisecondsSinceBoot host/commands/secure_env/soft_gatekeeper.h /^ virtual uint64_t GetMillisecondsSinceBoot() const {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:uint64_t
+GetMillisecondsSinceBoot host/commands/secure_env/tpm_gatekeeper.cpp /^uint64_t TpmGatekeeper::GetMillisecondsSinceBoot() const {$/;" f class:cuttlefish::TpmGatekeeper typeref:typename:uint64_t
+GetMode host/libs/confui/host_mode_ctrl.h /^ auto GetMode() {$/;" f class:cuttlefish::HostModeCtrl typeref:typename:auto
+GetMode host/libs/screen_connector/screen_connector_ctrl.h /^ auto GetMode() {$/;" f class:cuttlefish::ScreenConnectorCtrl typeref:typename:auto
+GetMonitorPath host/libs/vm_manager/qemu_manager.cpp /^std::string GetMonitorPath(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish::vm_manager::__anonb2b4da3a0111 typeref:typename:std::string
+GetMoreAudioData host/frontend/webrtc/lib/audio_device.cpp /^int CfAudioDeviceModule::GetMoreAudioData(void* data, int bytes_per_sample,$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int
+GetMoreAudioData host/frontend/webrtc/lib/streamer.cpp /^ int GetMoreAudioData(void* data, int bytes_per_sample,$/;" f class:cuttlefish::webrtc_streaming::__anonab9390d10111::AudioDeviceModuleWrapper typeref:typename:int file:
+GetName host/libs/allocd/resource.h /^ std::string GetName() { return name_; }$/;" f class:cuttlefish::StaticResource typeref:typename:std::string
+GetName host/libs/confui/host_utils.cc /^std::string GetName(const std::thread::id tid) {$/;" f namespace:cuttlefish::confui::thread typeref:typename:std::string
+GetNextHexInt host/commands/modem_simulator/command_parser.cpp /^int CommandParser::GetNextHexInt() {$/;" f class:cuttlefish::CommandParser typeref:typename:int
+GetNextInt host/commands/modem_simulator/command_parser.cpp /^int CommandParser::GetNextInt() {$/;" f class:cuttlefish::CommandParser typeref:typename:int
+GetNextStr host/commands/modem_simulator/command_parser.cpp /^std::string_view CommandParser::GetNextStr() {$/;" f class:cuttlefish::CommandParser typeref:typename:std::string_view
+GetNextStr host/commands/modem_simulator/command_parser.cpp /^std::string_view CommandParser::GetNextStr(char flag) {$/;" f class:cuttlefish::CommandParser typeref:typename:std::string_view
+GetNextStrDeciToHex host/commands/modem_simulator/command_parser.cpp /^std::string CommandParser::GetNextStrDeciToHex() {$/;" f class:cuttlefish::CommandParser typeref:typename:std::string
+GetOperationFactory host/commands/secure_env/proxy_keymaster_context.h /^ const keymaster::OperationFactory* GetOperationFactory($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:const keymaster::OperationFactory *
+GetOperationFactory host/commands/secure_env/tpm_keymaster_context.cpp /^const OperationFactory* TpmKeymasterContext::GetOperationFactory($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:const OperationFactory *
+GetPartitionGUID host/libs/image_aggregator/image_aggregator.cc /^ static const char* GetPartitionGUID(MultipleImagePartition source) {$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:const char * file:
+GetPasswordKey host/commands/secure_env/soft_gatekeeper.h /^ virtual void GetPasswordKey(const uint8_t** password_key, uint32_t* length) {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:void
+GetPasswordKey host/commands/secure_env/tpm_gatekeeper.cpp /^void TpmGatekeeper::GetPasswordKey($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:void
+GetPath host/libs/websocket/websocket_server.cpp /^std::string GetPath(struct lws* wsi) {$/;" f namespace:cuttlefish::__anon8185be2f0111 typeref:typename:std::string
+GetPhoneNumber host/commands/modem_simulator/sim_service.cpp /^std::string SimService::GetPhoneNumber() {$/;" f class:cuttlefish::SimService typeref:typename:std::string
+GetPhoneNumberFromAddress host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::GetPhoneNumberFromAddress() {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+GetPlayoutUnderrunCount host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::GetPlayoutUnderrunCount() const { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+GetPromptText common/libs/confui/protocol_types.h /^ std::string GetPromptText() const { return prompt_text_; }$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::string
+GetProperties guest/commands/vsoc_input_service/virtual_device_base.cpp /^const std::vector<const uint32_t>& VirtualDeviceBase::GetProperties() const {$/;" f class:VirtualDeviceBase typeref:typename:const std::vector<const uint32_t> &
+GetProperties guest/commands/vsoc_input_service/virtual_touchscreen.cpp /^const std::vector<const uint32_t>& VirtualTouchScreen::GetProperties() const {$/;" f class:cuttlefish_input_service::VirtualTouchScreen typeref:typename:const std::vector<const uint32_t> &
+GetQemuVersion host/libs/vm_manager/qemu_manager.cpp /^std::pair<int,int> GetQemuVersion(const std::string& qemu_binary)$/;" f namespace:cuttlefish::vm_manager::__anonb2b4da3a0111 typeref:typename:std::pair<int,int>
+GetRandom host/commands/secure_env/soft_gatekeeper.h /^ virtual void GetRandom(void* random, uint32_t requested_length) const {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:void
+GetRandom host/commands/secure_env/tpm_gatekeeper.cpp /^void TpmGatekeeper::GetRandom(void* random, uint32_t requested_size) const {$/;" f class:cuttlefish::TpmGatekeeper typeref:typename:void
+GetRawFromServer common/libs/device_config/guest_device_config.cpp /^bool GetRawFromServer(DeviceConfig* data) {$/;" f namespace:cuttlefish::__anon4ec25d870111 typeref:typename:bool
+GetRemoteProvisioningContext host/commands/secure_env/proxy_keymaster_context.h /^ keymaster::RemoteProvisioningContext* GetRemoteProvisioningContext()$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster::RemoteProvisioningContext *
+GetRemoteProvisioningContext host/commands/secure_env/tpm_keymaster_context.cpp /^TpmKeymasterContext::GetRemoteProvisioningContext() const {$/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster::RemoteProvisioningContext *
+GetResolutionFromSettings host/frontend/webrtc/lib/camera_streamer.cpp /^CameraStreamer::Resolution CameraStreamer::GetResolutionFromSettings($/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:CameraStreamer::Resolution
+GetResourceType host/libs/allocd/resource.h /^ ResourceType GetResourceType() { return ty_; }$/;" f class:cuttlefish::StaticResource typeref:typename:ResourceType
+GetResponse common/libs/confui/protocol_types.h /^ auto GetResponse() const { return response_; }$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:auto
+GetResponse common/libs/confui/protocol_types.h /^ auto GetResponse() const { return response_; }$/;" f class:cuttlefish::confui::ConfUiUserSelectionMessage typeref:typename:auto
+GetResponse common/libs/confui/protocol_types.h /^ auto GetResponse() const { return response_; }$/;" f class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:auto
+GetRootElement host/commands/modem_simulator/sim_service.cpp /^XMLElement* SimService::SimFileSystem::GetRootElement() {$/;" f class:cuttlefish::SimService::SimFileSystem typeref:typename:XMLElement *
+GetScreenConnectorCallback host/frontend/webrtc/display_handler.cpp /^DisplayHandler::GenerateProcessedFrameCallback DisplayHandler::GetScreenConnectorCallback() {$/;" f class:cuttlefish::DisplayHandler typeref:typename:DisplayHandler::GenerateProcessedFrameCallback
+GetSecurityLevel host/commands/secure_env/tpm_attestation_record.cpp /^keymaster_security_level_t TpmAttestationRecordContext::GetSecurityLevel() const {$/;" f class:cuttlefish::TpmAttestationRecordContext typeref:typename:keymaster_security_level_t
+GetSessionID host/libs/allocd/resource_manager.h /^ uint32_t GetSessionID() { return session_id_; }$/;" f class:cuttlefish::Session typeref:typename:uint32_t
+GetSessionId common/libs/confui/protocol_types.h /^ std::string GetSessionId() const { return session_id_; }$/;" f class:cuttlefish::confui::ConfUiMessage typeref:typename:std::string
+GetSessionId guest/hals/confirmationui/guest_session.h /^ std::string GetSessionId() const { return session_name_; }$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::string
+GetShortName common/libs/utils/subprocess.h /^ std::string GetShortName() const {$/;" f class:cuttlefish::Command typeref:typename:std::string
+GetSign common/libs/confui/protocol_types.h /^ auto GetSign() const { return sign_; }$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:auto
+GetSignalStrength host/commands/modem_simulator/network_service.cpp /^std::string NetworkService::GetSignalStrength() {$/;" f class:cuttlefish::NetworkService typeref:typename:std::string
+GetSimOperator host/commands/modem_simulator/sim_service.cpp /^std::string SimService::GetSimOperator() {$/;" f class:cuttlefish::SimService typeref:typename:std::string
+GetSimStatus host/commands/modem_simulator/sim_service.cpp /^SimService::SimStatus SimService::GetSimStatus() const {$/;" f class:cuttlefish::SimService typeref:typename:SimService::SimStatus
+GetSockName common/libs/fs/shared_fd.cpp /^int FileInstance::GetSockName(struct sockaddr* addr, socklen_t* addrlen) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+GetSockOpt common/libs/fs/shared_fd.cpp /^int FileInstance::GetSockOpt(int level, int optname, void* optval,$/;" f class:cuttlefish::FileInstance typeref:typename:int
+GetState host/libs/confui/session.h /^ MainLoopState GetState() { return state_; }$/;" f class:cuttlefish::confui::Session typeref:typename:MainLoopState
+GetStats host/frontend/webrtc/lib/video_track_source_impl.cpp /^bool VideoTrackSourceImpl::GetStats(Stats *stats) {$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:bool
+GetStatusMessage common/libs/confui/protocol_types.h /^ std::string GetStatusMessage() const { return status_message_; }$/;" f class:cuttlefish::confui::ConfUiAckMessage typeref:typename:std::string
+GetSuplementaryGroups common/libs/utils/users.cpp /^std::vector<gid_t> GetSuplementaryGroups() {$/;" f namespace:cuttlefish::__anonced26a190111 typeref:typename:std::vector<gid_t>
+GetSupportedAlgorithms host/commands/secure_env/proxy_keymaster_context.h /^ const keymaster_algorithm_t* GetSupportedAlgorithms($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:const keymaster_algorithm_t *
+GetSupportedAlgorithms host/commands/secure_env/tpm_keymaster_context.cpp /^const keymaster_algorithm_t* TpmKeymasterContext::GetSupportedAlgorithms($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:const keymaster_algorithm_t *
+GetSupportedFormats host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^std::vector<webrtc::SdpVideoFormat> VP8OnlyEncoderFactory::GetSupportedFormats()$/;" f class:cuttlefish::webrtc_streaming::VP8OnlyEncoderFactory typeref:typename:std::vector<webrtc::SdpVideoFormat>
+GetSystemVersion host/commands/secure_env/proxy_keymaster_context.h /^ void GetSystemVersion(uint32_t* os_version,$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:void
+GetSystemVersion host/commands/secure_env/tpm_keymaster_context.cpp /^void TpmKeymasterContext::GetSystemVersion($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:void
+GetThreadTracer host/libs/confui/host_utils.cc /^ThreadTracer& GetThreadTracer() {$/;" f namespace:cuttlefish::confui::thread typeref:typename:ThreadTracer &
+GetTouchClientByLabel host/frontend/webrtc/connection_observer.h /^ SharedFD GetTouchClientByLabel(const std::string& label) {$/;" f struct:cuttlefish::InputSockets typeref:typename:SharedFD
+GetType common/libs/confui/protocol_types.h /^ ConfUiCmd GetType() const override { return ConfUiCmd::kCliAck; }$/;" f class:cuttlefish::confui::ConfUiAckMessage typeref:typename:ConfUiCmd
+GetType common/libs/confui/protocol_types.h /^ ConfUiCmd GetType() const override { return ConfUiCmd::kCliRespond; }$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:ConfUiCmd
+GetType common/libs/confui/protocol_types.h /^ ConfUiCmd GetType() const override { return ConfUiCmd::kStart; }$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:ConfUiCmd
+GetType common/libs/confui/protocol_types.h /^ ConfUiCmd GetType() const override { return ConfUiCmd::kUserInputEvent; }$/;" f class:cuttlefish::confui::ConfUiUserSelectionMessage typeref:typename:ConfUiCmd
+GetType common/libs/confui/protocol_types.h /^ ConfUiCmd GetType() const override { return ConfUiCmd::kUserTouchEvent; }$/;" f class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:ConfUiCmd
+GetType common/libs/confui/protocol_types.h /^ ConfUiCmd GetType() const override { return cmd; }$/;" f class:cuttlefish::confui::ConfUiGenericMessage typeref:typename:ConfUiCmd
+GetUID host/libs/allocd/resource_manager.h /^ uid_t GetUID() { return uid_; }$/;" f class:cuttlefish::Session typeref:typename:uid_t
+GetUiOpts common/libs/confui/protocol_types.h /^ std::vector<teeui::UIOption> GetUiOpts() const { return ui_opts_; }$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::vector<teeui::UIOption>
+GetUid host/libs/allocd/resource.h /^ uid_t GetUid() { return uid_; }$/;" f class:cuttlefish::StaticResource typeref:typename:uid_t
+GetUseEbtablesLegacy host/libs/allocd/resource.h /^ bool GetUseEbtablesLegacy() { return use_ebtables_legacy_; }$/;" f class:cuttlefish::EthernetIface typeref:typename:bool
+GetUserData host/libs/wayland/wayland_utils.h /^T* GetUserData(wl_resource* resource) {$/;" f namespace:wayland typeref:typename:T *
+GetUserIDFromSock host/libs/allocd/resource_manager.cpp /^uid_t GetUserIDFromSock(SharedFD client_socket) {$/;" f namespace:cuttlefish typeref:typename:uid_t
+GetUserImages shared/releasetools.py /^def GetUserImages(input_tmp, input_zip):$/;" f
+GetUserName host/libs/allocd/alloc_utils.cpp /^std::optional<std::string> GetUserName(uid_t uid) {$/;" f namespace:cuttlefish typeref:typename:std::optional<std::string>
+GetUsimEFPath host/commands/modem_simulator/sim_service.cpp /^std::string SimService::SimFileSystem::GetUsimEFPath(EFId efid) {$/;" f class:cuttlefish::SimService::SimFileSystem typeref:typename:std::string
+GetVendorPatchlevel host/commands/secure_env/proxy_keymaster_context.h /^ std::optional<uint32_t> GetVendorPatchlevel() const override {$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:std::optional<uint32_t>
+GetVendorPatchlevel host/commands/secure_env/tpm_keymaster_context.cpp /^std::optional<uint32_t> TpmKeymasterContext::GetVendorPatchlevel() const {$/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:std::optional<uint32_t>
+GetVerifiedBootParams host/commands/secure_env/tpm_attestation_record.cpp /^const VerifiedBootParams* TpmAttestationRecordContext::GetVerifiedBootParams($/;" f class:cuttlefish::TpmAttestationRecordContext typeref:typename:const VerifiedBootParams *
+GetVersion guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::GetVersion(const GetVersionRequest& request, GetVersionResponse* response)/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GetVersion guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::GetVersion(const GetVersionRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+GetVmManager host/libs/vm_manager/vm_manager.cpp /^std::unique_ptr<VmManager> GetVmManager(const std::string& name, Arch arch) {$/;" f namespace:cuttlefish::vm_manager typeref:typename:std::unique_ptr<VmManager>
+GetVoiceRegistrationState host/commands/modem_simulator/network_service.cpp /^NetworkService::RegistrationState NetworkService::GetVoiceRegistrationState() const {$/;" f class:cuttlefish::NetworkService typeref:typename:NetworkService::RegistrationState
+GetVsockServerPort host/libs/config/cuttlefish_config.cpp /^int GetVsockServerPort($/;" f namespace:cuttlefish typeref:typename:int
+Getter common/libs/utils/flag_parser.cpp /^Flag Flag::Getter(std::function<std::string()> fn) && {$/;" f class:cuttlefish::Flag typeref:typename:Flag
+Getter common/libs/utils/flag_parser.cpp /^Flag& Flag::Getter(std::function<std::string()> fn) & {$/;" f class:cuttlefish::Flag typeref:typename:Flag &
+GflagsCompatFlag common/libs/utils/flag_parser.cpp /^Flag GflagsCompatFlag(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:Flag
+GflagsCompatFlag common/libs/utils/flag_parser.cpp /^Flag GflagsCompatFlag(const std::string& name, bool& value) {$/;" f namespace:cuttlefish typeref:typename:Flag
+GflagsCompatFlag common/libs/utils/flag_parser.cpp /^Flag GflagsCompatFlag(const std::string& name, int32_t& value) {$/;" f namespace:cuttlefish typeref:typename:Flag
+GflagsCompatFlag common/libs/utils/flag_parser.cpp /^Flag GflagsCompatFlag(const std::string& name, std::string& value) {$/;" f namespace:cuttlefish typeref:typename:Flag
+GflagsCompatNumericFlagGeneric common/libs/utils/flag_parser.cpp /^static Flag GflagsCompatNumericFlagGeneric(const std::string& name, T& value) {$/;" f namespace:cuttlefish typeref:typename:Flag file:
+GflagsComponent host/commands/assemble_cvd/flag_feature.cpp /^fruit::Component<fruit::Required<ConfigFlag>, ParseGflags> GflagsComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<ConfigFlag>,ParseGflags>
+GfxstreamEnabledTest tests/graphics/src/com/android/cuttlefish/tests/GfxstreamEnabledTest.java /^public class GfxstreamEnabledTest extends BaseHostJUnit4Test {$/;" c
+GnssGrpcProxy host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^service GnssGrpcProxy {$/;" s package:gnss_grpc_proxy
+GnssGrpcProxyBinary host/libs/config/known_paths.cpp /^std::string GnssGrpcProxyBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+GnssGrpcProxyServer host/commands/run_cvd/launch.cc /^class GnssGrpcProxyServer : public CommandSource {$/;" c namespace:cuttlefish file:
+GnssGrpcProxyServiceImpl host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ GnssGrpcProxyServiceImpl(cuttlefish::SharedFD gnss_in,$/;" f class:GnssGrpcProxyServiceImpl file:
+GnssGrpcProxyServiceImpl host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^class GnssGrpcProxyServiceImpl final : public GnssGrpcProxy::Service {$/;" c file:
+GptBeginning host/libs/image_aggregator/image_aggregator.cc /^struct __attribute__((packed)) GptBeginning {$/;" s namespace:cuttlefish::__anon02806fd80111 file:
+GptEnd host/libs/image_aggregator/image_aggregator.cc /^struct __attribute__((packed)) GptEnd {$/;" s namespace:cuttlefish::__anon02806fd80111 file:
+GptHeader host/libs/image_aggregator/image_aggregator.cc /^struct __attribute__((packed)) GptHeader {$/;" s namespace:cuttlefish::__anon02806fd80111 file:
+GptPartitionEntry host/libs/image_aggregator/image_aggregator.cc /^struct __attribute__((packed)) GptPartitionEntry {$/;" s namespace:cuttlefish::__anon02806fd80111 file:
+GraphicsAvailability host/libs/graphics_detector/graphics_detector.h /^struct GraphicsAvailability {$/;" s namespace:cuttlefish
+GroupIdFromName common/libs/utils/users.cpp /^gid_t GroupIdFromName(const std::string& group_name) {$/;" f namespace:cuttlefish::__anonced26a190111 typeref:typename:gid_t
+GuessSeverity common/libs/utils/tee_logging.cpp /^static LogSeverity GuessSeverity($/;" f namespace:cuttlefish typeref:typename:LogSeverity file:
+GuestSession guest/hals/confirmationui/guest_session.h /^ GuestSession(const std::uint32_t session_id, ListenerState& listener_state,$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession
+GuestSession guest/hals/confirmationui/guest_session.h /^class GuestSession {$/;" c namespace:android::hardware::confirmationui::V1_0::implementation
+HANDLE_MESSAGE host/commands/secure_env/keymaster_responder.cpp /^#define HANDLE_MESSAGE(/;" d file:
+HANDLE_MESSAGE_W_RETURN host/commands/secure_env/keymaster_responder.cpp /^#define HANDLE_MESSAGE_W_RETURN(/;" d file:
+HANDLE_MESSAGE_W_RETURN_NO_ARG host/commands/secure_env/keymaster_responder.cpp /^#define HANDLE_MESSAGE_W_RETURN_NO_ARG(/;" d file:
+HANDOVER_CANCELED guest/hals/ril/reference-libril/ril.h /^ HANDOVER_CANCELED = 3$/;" e enum:__anon0bfbaecf8e03
+HANDOVER_COMPLETED guest/hals/ril/reference-libril/ril.h /^ HANDOVER_COMPLETED = 1,$/;" e enum:__anon0bfbaecf8e03
+HANDOVER_FAILED guest/hals/ril/reference-libril/ril.h /^ HANDOVER_FAILED = 2,$/;" e enum:__anon0bfbaecf8e03
+HANDOVER_STARTED guest/hals/ril/reference-libril/ril.h /^ HANDOVER_STARTED = 0,$/;" e enum:__anon0bfbaecf8e03
+HANDSHAKE_RETRY_COUNT guest/hals/ril/reference-ril/atchannel.c /^#define HANDSHAKE_RETRY_COUNT /;" d file:
+HANDSHAKE_TIMEOUT_MSEC guest/hals/ril/reference-ril/atchannel.c /^#define HANDSHAKE_TIMEOUT_MSEC /;" d file:
+HCI_ACLDATA_PKT guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_ACLDATA_PKT /;" d file:
+HCI_EVENT_PKT guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_EVENT_PKT /;" d file:
+HCI_ISODATA_PKT guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_ISODATA_PKT /;" d file:
+HCI_MAX_ACL_SIZE guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_MAX_ACL_SIZE /;" d file:
+HCI_MAX_ACL_SIZE host/commands/bt_connector/main.cpp /^#define HCI_MAX_ACL_SIZE /;" d file:
+HCI_MAX_FRAME_SIZE guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_MAX_FRAME_SIZE /;" d file:
+HCI_MAX_FRAME_SIZE host/commands/bt_connector/main.cpp /^#define HCI_MAX_FRAME_SIZE /;" d file:
+HCI_SCODATA_PKT guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_SCODATA_PKT /;" d file:
+HCI_VENDOR_PKT guest/commands/bt_vhci_forwarder/main.cpp /^#define HCI_VENDOR_PKT /;" d file:
+HIDL_FETCH_IBluetoothHci guest/hals/bt/remote/remote_bluetooth.cpp /^IBluetoothHci* HIDL_FETCH_IBluetoothHci(const char* \/* name *\/) {$/;" f namespace:android::hardware::bluetooth::V1_1::remote typeref:typename:IBluetoothHci *
+HIDL_FETCH_ICameraProvider guest/hals/camera/vsock_camera_provider_2_7.cpp /^extern "C" ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {$/;" f namespace:android::hardware::camera::provider::V2_7::implementation typeref:typename:ICameraProvider *
+HIDL_FETCH_IHealth guest/hals/health/health.cpp /^extern "C" IHealth* HIDL_FETCH_IHealth(const char* instance) {$/;" f typeref:typename:IHealth *
+HMacImplementation host/libs/confui/sign.cc /^class HMacImplementation {$/;" c namespace:cuttlefish::confui file:
+HMacer host/libs/confui/sign.cc /^ using HMacer = HMacImplementation;$/;" t function:cuttlefish::confui::sign typeref:typename:HMacImplementation file:
+HOST_CROSS_2ND_ARCH vsoc_arm64/BoardConfig.mk /^HOST_CROSS_2ND_ARCH :=$/;" m
+HOST_CROSS_2ND_ARCH vsoc_arm64_only/BoardConfig.mk /^HOST_CROSS_2ND_ARCH :=$/;" m
+HOST_CROSS_2ND_ARCH vsoc_arm_only/BoardConfig.mk /^HOST_CROSS_2ND_ARCH :=$/;" m
+HOST_CROSS_ARCH vsoc_arm64/BoardConfig.mk /^HOST_CROSS_ARCH := arm64$/;" m
+HOST_CROSS_ARCH vsoc_arm64_only/BoardConfig.mk /^HOST_CROSS_ARCH := arm64$/;" m
+HOST_CROSS_ARCH vsoc_arm_only/BoardConfig.mk /^HOST_CROSS_ARCH := arm64$/;" m
+HOST_CROSS_OS vsoc_arm64/BoardConfig.mk /^HOST_CROSS_OS := linux_bionic$/;" m
+HOST_CROSS_OS vsoc_arm64_only/BoardConfig.mk /^HOST_CROSS_OS := linux_bionic$/;" m
+HOST_CROSS_OS vsoc_arm_only/BoardConfig.mk /^HOST_CROSS_OS := linux_bionic$/;" m
+HOST_TOOLS host/commands/fetcher/fetch_cvd.cc /^const std::string HOST_TOOLS = "cvd-host_package.tar.gz";$/;" v namespace:cuttlefish::__anonccb356fd0211 typeref:typename:const std::string
+HalCmdFetcherLoop host/libs/confui/host_server.cc /^void HostServer::HalCmdFetcherLoop() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+HalHostVsockPort host/libs/confui/host_server.cc /^static int HalHostVsockPort() {$/;" f namespace:cuttlefish::confui typeref:typename:int file:
+HandleAcceptCall host/commands/modem_simulator/call_service.cpp /^void CallService::HandleAcceptCall(const Client& client) {$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleActivateDataCall host/commands/modem_simulator/data_service.cpp /^void DataService::HandleActivateDataCall(const Client& client,$/;" f class:cuttlefish::DataService typeref:typename:void
+HandleBroadcastConfig host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleBroadcastConfig(const Client& client, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleCLIP host/commands/modem_simulator/sup_service.cpp /^void SupService::HandleCLIP(const Client& client) {$/;" f class:cuttlefish::SupService typeref:typename:void
+HandleCLIR host/commands/modem_simulator/sup_service.cpp /^void SupService::HandleCLIR(const Client& client, std::string& command) {$/;" f class:cuttlefish::SupService typeref:typename:void
+HandleCSIM_IO host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleCSIM_IO(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleCallForward host/commands/modem_simulator/sup_service.cpp /^void SupService::HandleCallForward(const Client& client, std::string& command) {$/;" f class:cuttlefish::SupService typeref:typename:void
+HandleCallWaiting host/commands/modem_simulator/sup_service.cpp /^void SupService::HandleCallWaiting(const Client& client, std::string& command) {$/;" f class:cuttlefish::SupService typeref:typename:void
+HandleCancelUssd host/commands/modem_simulator/call_service.cpp /^void CallService::HandleCancelUssd(const Client& client,$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleCdmaRoamingPreference host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleCdmaRoamingPreference(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleCdmaSubscriptionSource host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleCdmaSubscriptionSource(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleChangeOrEnterPIN host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleChangeOrEnterPIN(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleChangePassword host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleChangePassword(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleClientMessage host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::HandleClientMessage(const Json::Value& server_message) {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+HandleCloseLogicalChannel host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleCloseLogicalChannel(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleCommand host/commands/modem_simulator/modem_service.cpp /^void CommandHandler::HandleCommand(const Client& client,$/;" f class:cuttlefish::CommandHandler typeref:typename:void
+HandleCommandDefaultSupported host/commands/modem_simulator/modem_service.cpp /^void ModemService::HandleCommandDefaultSupported(const Client& client) {$/;" f class:cuttlefish::ModemService typeref:typename:void
+HandleConfigMessage host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::HandleConfigMessage(const Json::Value& server_message) {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+HandleConnection common/frontend/socket_vsock_proxy/main.cpp /^void HandleConnection(cuttlefish::SharedFD vsock,$/;" f namespace:__anon913036200111 typeref:typename:void
+HandleCurrentCalls host/commands/modem_simulator/call_service.cpp /^void CallService::HandleCurrentCalls(const Client& client) {$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleDataNetworkRegistration host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleDataNetworkRegistration(const Client& client,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleDeleteSmsOnSim host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleDeleteSmsOnSim(const Client& client, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleDial host/commands/modem_simulator/call_service.cpp /^void CallService::HandleDial(const Client& client, const std::string& command) {$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleEmergencyMode host/commands/modem_simulator/call_service.cpp /^void CallService::HandleEmergencyMode(const Client& client,$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleEnterDataState host/commands/modem_simulator/data_service.cpp /^void DataService::HandleEnterDataState(const Client& client,$/;" f class:cuttlefish::DataService typeref:typename:void
+HandleFacilityLock host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleFacilityLock(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleForward host/frontend/webrtc_operator/device_handler.cpp /^void DeviceHandler::HandleForward(const Json::Value& message) {$/;" f class:cuttlefish::DeviceHandler typeref:typename:void
+HandleGetIMEI host/commands/modem_simulator/misc_service.cpp /^void MiscService::HandleGetIMEI(const Client& client, std::string& command) {$/;" f class:cuttlefish::MiscService typeref:typename:void
+HandleGetIMSI host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleGetIMSI(const Client& client) {$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleGetIccId host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleGetIccId(const Client& client) {$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleGetPreferredNetworkType host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleGetPreferredNetworkType(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleGetSmscAddress host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleGetSmscAddress(const Client& client) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleHangup host/commands/modem_simulator/call_service.cpp /^void CallService::HandleHangup(const Client& client,$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleInSession host/libs/confui/session.cc /^bool Session::HandleInSession(SharedFD hal_cli, const FsmInput fsm_input,$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+HandleIncomingMessage host/commands/kernel_log_monitor/kernel_log_server.cc /^bool KernelLogServer::HandleIncomingMessage() {$/;" f class:monitor::KernelLogServer typeref:typename:bool
+HandleInit host/libs/confui/session.cc /^bool Session::HandleInit(SharedFD hal_cli, const FsmInput fsm_input,$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+HandleMessage host/frontend/webrtc/lib/camera_streamer.cpp /^void CameraStreamer::HandleMessage(const Json::Value& message) {$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:void
+HandleMessage host/frontend/webrtc/lib/camera_streamer.cpp /^void CameraStreamer::HandleMessage(const std::vector<char>& message) {$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:void
+HandleMessage host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::HandleMessage(const Json::Value &message) {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+HandleModemCommand host/commands/modem_simulator/modem_service.cpp /^bool ModemService::HandleModemCommand(const Client& client,$/;" f class:cuttlefish::ModemService typeref:typename:bool
+HandleMute host/commands/modem_simulator/call_service.cpp /^void CallService::HandleMute(const Client& client, const std::string& command) {$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleOpenLogicalChannel host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleOpenLogicalChannel(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandlePDPContext host/commands/modem_simulator/data_service.cpp /^void DataService::HandlePDPContext(const Client& client,$/;" f class:cuttlefish::DataService typeref:typename:void
+HandleQueryAvailableNetwork host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleQueryAvailableNetwork(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleQueryDataCallList host/commands/modem_simulator/data_service.cpp /^void DataService::HandleQueryDataCallList(const Client& client) {$/;" f class:cuttlefish::DataService typeref:typename:void
+HandleQueryNetworkSelectionMode host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleQueryNetworkSelectionMode(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleQueryPDPContextList host/commands/modem_simulator/data_service.cpp /^void DataService::HandleQueryPDPContextList(const Client& client) {$/;" f class:cuttlefish::DataService typeref:typename:void
+HandleQueryRemainTimes host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleQueryRemainTimes(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleQuerySupportedTechs host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleQuerySupportedTechs(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleRadioPower host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleRadioPower(const Client& client, std::string& command) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleRadioPowerReq host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleRadioPowerReq(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleReadDynamicParam host/commands/modem_simulator/data_service.cpp /^void DataService::HandleReadDynamicParam(const Client& client,$/;" f class:cuttlefish::DataService typeref:typename:void
+HandleReceiveRemoteCTEC host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleReceiveRemoteCTEC(const Client& client,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleReceiveRemoteSMS host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleReceiveRemoteSMS(const Client& \/*client*\/, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleReceiveRemoteSignal host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleReceiveRemoteSignal(const Client& client,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleReceiveRemoteVoiceDataReg host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleReceiveRemoteVoiceDataReg(const Client& client,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleReceiveSMS host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleReceiveSMS(PDUParser sms_pdu) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleRegistrationRequest host/frontend/webrtc_operator/device_handler.cpp /^void DeviceHandler::HandleRegistrationRequest(const Json::Value& message) {$/;" f class:cuttlefish::DeviceHandler typeref:typename:void
+HandleRejectCall host/commands/modem_simulator/call_service.cpp /^void CallService::HandleRejectCall(const Client& client) {$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleReloadConfigCommand host/commands/wmediumd_control/main.cpp /^bool HandleReloadConfigCommand(cuttlefish::WmediumdController& client,$/;" f typeref:typename:bool
+HandleRemoteCall host/commands/modem_simulator/call_service.cpp /^void CallService::HandleRemoteCall(const Client& client,$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleReportStkServiceIsRunning host/commands/modem_simulator/stk_service.cpp /^void StkService::HandleReportStkServiceIsRunning(const Client& client) {$/;" f class:cuttlefish::StkService typeref:typename:void
+HandleRequestOperator host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleRequestOperator(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleSIMStatusReq host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleSIMStatusReq(const Client& client) {$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleSIM_IO host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleSIM_IO(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleSMSAcknowledge host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleSMSAcknowledge(const Client& client, std::string& \/*command*\/) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleSMSStatuReport host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleSMSStatuReport(PDUParser sms_pdu, int message_reference) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleSendDtmf host/commands/modem_simulator/call_service.cpp /^void CallService::HandleSendDtmf(const Client& client,$/;" f class:cuttlefish::CallService typeref:typename:void
+HandleSendEnvelope host/commands/modem_simulator/stk_service.cpp /^void StkService::HandleSendEnvelope(const Client& client , std::string& command) {$/;" f class:cuttlefish::StkService typeref:typename:void
+HandleSendSMS host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleSendSMS(const Client& client, std::string& \/*command*\/) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleSendSMSPDU host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleSendSMSPDU(const Client& client, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleSendTerminalResponseToSim host/commands/modem_simulator/stk_service.cpp /^void StkService::HandleSendTerminalResponseToSim(const Client& client, std::string& command) {$/;" f class:cuttlefish::StkService typeref:typename:void
+HandleSetNetworkSelectionMode host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleSetNetworkSelectionMode(const Client& client, std::string& command) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleSetPreferredNetworkType host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleSetPreferredNetworkType(const Client& client, std::string& command) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleSetSmscAddress host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleSetSmscAddress(const Client& client, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleSetSnrCommand host/commands/wmediumd_control/main.cpp /^bool HandleSetSnrCommand(cuttlefish::WmediumdController& client,$/;" f typeref:typename:bool
+HandleSignalStrength host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleSignalStrength(const Client& client) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleSimAuthentication host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleSimAuthentication(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleSuppServiceNotifications host/commands/modem_simulator/sup_service.cpp /^void SupService::HandleSuppServiceNotifications(const Client& client, std::string& \/*command*\//;" f class:cuttlefish::SupService typeref:typename:void
+HandleSurfaceFrame host/libs/wayland/wayland_surfaces.cpp /^void Surfaces::HandleSurfaceFrame(std::uint32_t display_number,$/;" f class:wayland::Surfaces typeref:typename:void
+HandleTransmitLogicalChannel host/commands/modem_simulator/sim_service.cpp /^void SimService::HandleTransmitLogicalChannel(const Client& client,$/;" f class:cuttlefish::SimService typeref:typename:void
+HandleUSSD host/commands/modem_simulator/sup_service.cpp /^void SupService::HandleUSSD(const Client& client, std::string& \/*command*\/) {$/;" f class:cuttlefish::SupService typeref:typename:void
+HandleVoiceNetworkRegistration host/commands/modem_simulator/network_service.cpp /^void NetworkService::HandleVoiceNetworkRegistration(const Client& client,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+HandleWaitStop host/libs/confui/session.cc /^bool Session::HandleWaitStop(SharedFD hal_cli, const FsmInput fsm_input) {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+HandleWriteSMSPduToSim host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleWriteSMSPduToSim(const Client& client, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+HandleWriteSMSToSim host/commands/modem_simulator/sms_service.cpp /^void SmsService::HandleWriteSMSToSim(const Client& client, std::string& command) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+Hardware Configuration host/frontend/webrtc_operator/assets/client.html /^ <h3>Hardware Configuration<\/h3>$/;" j
+HardwareAuthToken host/libs/confui/cbor.h /^ using HardwareAuthToken =$/;" t class:cuttlefish::confui::Cbor typeref:typename:android::hardware::keymaster::V4_0::HardwareAuthToken
+HasAlias common/libs/utils/flag_parser.cpp /^bool Flag::HasAlias(const FlagAlias& test) const {$/;" f class:cuttlefish::Flag typeref:typename:bool
+HasConfig host/libs/config/config_flag.cpp /^ bool HasConfig(const std::string& name) const {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:bool file:
+HasCredentials common/libs/utils/unix_sockets.cpp /^bool UnixSocketMessage::HasCredentials() {$/;" f class:cuttlefish::UnixSocketMessage typeref:typename:bool
+HasFileDescriptors common/libs/utils/unix_sockets.cpp /^bool UnixSocketMessage::HasFileDescriptors() {$/;" f class:cuttlefish::UnixSocketMessage typeref:typename:bool
+HasKey host/commands/secure_env/fragile_tpm_storage.cpp /^bool FragileTpmStorage::HasKey(const Json::Value& key) const {$/;" f class:cuttlefish::FragileTpmStorage typeref:typename:bool
+HasKey host/commands/secure_env/insecure_fallback_storage.cpp /^bool InsecureFallbackStorage::HasKey(const Json::Value& key) const {$/;" f class:cuttlefish::InsecureFallbackStorage typeref:typename:bool
+Headers host/commands/fetcher/build_api.cc /^std::vector<std::string> BuildApi::Headers() {$/;" f class:cuttlefish::BuildApi typeref:typename:std::vector<std::string>
+HealthImpl guest/hals/health/health.cpp /^ HealthImpl(std::unique_ptr<healthd_config>&& config)$/;" f class:android::hardware::health::V2_1::implementation::HealthImpl file:
+HealthImpl guest/hals/health/health.cpp /^class HealthImpl : public Health {$/;" c namespace:android::hardware::health::V2_1::implementation file:
+Height host/libs/confui/host_renderer.h /^ int Height() const { return h_; }$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:int
+Help common/libs/utils/flag_parser.cpp /^Flag Flag::Help(const std::string& help) && {$/;" f class:cuttlefish::Flag typeref:typename:Flag
+Help common/libs/utils/flag_parser.cpp /^Flag& Flag::Help(const std::string& help) & {$/;" f class:cuttlefish::Flag typeref:typename:Flag &
+HelpFlag common/libs/utils/flag_parser.cpp /^Flag HelpFlag(const std::vector<Flag>& flags, const std::string& text) {$/;" f namespace:cuttlefish typeref:typename:Flag
+Hex2ToByte host/commands/modem_simulator/pdu_parser.cpp /^int PDUParser::Hex2ToByte(const std::string& hex) {$/;" f class:cuttlefish::PDUParser typeref:typename:int
+HexCharToInt host/commands/modem_simulator/pdu_parser.cpp /^int PDUParser::HexCharToInt(char c) {$/;" f class:cuttlefish::PDUParser typeref:typename:int
+HmacSerializable host/commands/secure_env/hmac_serializable.cpp /^HmacSerializable::HmacSerializable($/;" f class:cuttlefish::HmacSerializable
+HmacSerializable host/commands/secure_env/hmac_serializable.h /^class HmacSerializable : public keymaster::Serializable {$/;" c namespace:cuttlefish
+HoldingBuffer host/frontend/webrtc/audio_handler.h /^ struct HoldingBuffer {$/;" s class:cuttlefish::AudioHandler
+HostArch common/libs/utils/environment.cpp /^Arch HostArch() {$/;" f namespace:cuttlefish typeref:typename:Arch
+HostArchStr common/libs/utils/environment.cpp /^std::string HostArchStr() {$/;" f namespace:cuttlefish typeref:typename:std::string
+HostBinaryPath host/libs/config/cuttlefish_config.cpp /^std::string HostBinaryPath(const std::string& binary_name) {$/;" f namespace:cuttlefish typeref:typename:std::string
+HostError common/libs/confui/protocol_types.h /^struct HostError {$/;" s namespace:cuttlefish::confui
+HostMessageFetcherLoop guest/hals/confirmationui/TrustyConfirmationUI.cpp /^void TrustyConfirmationUI::HostMessageFetcherLoop() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:void
+HostModeCtrl host/libs/confui/host_mode_ctrl.h /^ HostModeCtrl() : atomic_mode_(ModeType::kAndroidMode) {}$/;" f class:cuttlefish::HostModeCtrl
+HostModeCtrl host/libs/confui/host_mode_ctrl.h /^class HostModeCtrl {$/;" c namespace:cuttlefish
+HostServer host/libs/confui/host_server.cc /^HostServer::HostServer($/;" f class:cuttlefish::confui::HostServer
+HostServer host/libs/confui/host_server.h /^class HostServer : public HostVirtualInput {$/;" c namespace:cuttlefish::confui
+HostSupportsQemuCli host/libs/config/cuttlefish_config.cpp /^bool HostSupportsQemuCli() {$/;" f namespace:cuttlefish typeref:typename:bool
+HostToolsCrc host/libs/config/host_tools_version.cpp /^std::map<std::string, uint32_t> HostToolsCrc() {$/;" f namespace:cuttlefish typeref:typename:std::map<std::string,uint32_t>
+HostToolsUpdated host/commands/start/main.cc /^bool HostToolsUpdated() {$/;" f namespace:__anon8e1e78490111 typeref:typename:bool
+HostVirtualInput host/libs/confui/host_virtual_input.h /^class HostVirtualInput {$/;" c namespace:cuttlefish::confui
+HttpClientError host/commands/fetcher/curl_wrapper.h /^ bool HttpClientError() { return http_code >= 400 && http_code <= 499; }$/;" f struct:cuttlefish::CurlResponse typeref:typename:bool
+HttpInfo host/commands/fetcher/curl_wrapper.h /^ bool HttpInfo() { return http_code >= 100 && http_code <= 199; }$/;" f struct:cuttlefish::CurlResponse typeref:typename:bool
+HttpRedirect host/commands/fetcher/curl_wrapper.h /^ bool HttpRedirect() { return http_code >= 300 && http_code <= 399; }$/;" f struct:cuttlefish::CurlResponse typeref:typename:bool
+HttpServerError host/commands/fetcher/curl_wrapper.h /^ bool HttpServerError() { return http_code >= 500 && http_code <= 599; }$/;" f struct:cuttlefish::CurlResponse typeref:typename:bool
+HttpStatusCode host/libs/websocket/websocket_handler.h /^enum class HttpStatusCode : int {$/;" g namespace:cuttlefish typeref:typename:int
+HttpSuccess host/commands/fetcher/curl_wrapper.h /^ bool HttpSuccess() { return http_code >= 200 && http_code <= 299; }$/;" f struct:cuttlefish::CurlResponse typeref:typename:bool
+HvcNum host/libs/vm_manager/crosvm_builder.cpp /^int CrosvmBuilder::HvcNum() { return hvc_num_; }$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:int
+ID host/libs/allocd/request.h /^ ID, \/\/ Allocate and return a new Session ID$/;" e enum:cuttlefish::RequestType
+INIT_BOOTCHART shared/BoardConfig.mk /^INIT_BOOTCHART := true$/;" m
+INJECT host/commands/assemble_cvd/disk_flags.cc /^ INJECT(BootImageRepacker(const CuttlefishConfig& config)) : config_(config) {}$/;" f class:cuttlefish::BootImageRepacker file:
+INJECT host/commands/assemble_cvd/disk_flags.cc /^ INJECT(InitializeAccessKregistryImage($/;" f class:cuttlefish::InitializeAccessKregistryImage file:
+INJECT host/commands/assemble_cvd/disk_flags.cc /^ INJECT(InitializeMetadataImage()) {}$/;" f class:cuttlefish::InitializeMetadataImage file:
+INJECT host/commands/assemble_cvd/flag_feature.cpp /^ INJECT(ParseGflagsImpl(ConfigFlag& config)) : config_(config) {}$/;" f class:cuttlefish::ParseGflagsImpl file:
+INJECT host/commands/run_cvd/boot_state_machine.cc /^ INJECT(CvdBootStateMachine(ProcessLeader& process_leader,$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine file:
+INJECT host/commands/run_cvd/boot_state_machine.cc /^ INJECT(ProcessLeader(const CuttlefishConfig& config)) : config_(config) {}$/;" f class:cuttlefish::__anone7ed366f0111::ProcessLeader file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT($/;" f class:cuttlefish::GnssGrpcProxyServer file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(BluetoothConnector(const CuttlefishConfig& config,$/;" f class:cuttlefish::BluetoothConnector file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(ConfigServer(const CuttlefishConfig::InstanceSpecific& instance))$/;" f class:cuttlefish::ConfigServer file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(ConsoleForwarder(const CuttlefishConfig& config,$/;" f class:cuttlefish::ConsoleForwarder file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(KernelLogMonitor(const CuttlefishConfig::InstanceSpecific& instance))$/;" f class:cuttlefish::KernelLogMonitor file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(LogcatReceiver(const CuttlefishConfig::InstanceSpecific& instance))$/;" f class:cuttlefish::LogcatReceiver file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(MetricsService(const CuttlefishConfig& config)) : config_(config) {}$/;" f class:cuttlefish::MetricsService file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(OpenWrt(const CuttlefishConfig& config,$/;" f class:cuttlefish::OpenWrt file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(RootCanal(const CuttlefishConfig& config,$/;" f class:cuttlefish::RootCanal file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(SecureEnvironment(const CuttlefishConfig& config,$/;" f class:cuttlefish::SecureEnvironment file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(TombstoneReceiver(const CuttlefishConfig::InstanceSpecific& instance))$/;" f class:cuttlefish::TombstoneReceiver file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(VehicleHalServer(const CuttlefishConfig& config,$/;" f class:cuttlefish::VehicleHalServer file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(VmmCommands(const CuttlefishConfig& config, VmManager& vmm))$/;" f class:cuttlefish::VmmCommands file:
+INJECT host/commands/run_cvd/launch.cc /^ INJECT(WmediumdServer(const CuttlefishConfig& config,$/;" f class:cuttlefish::WmediumdServer file:
+INJECT host/commands/run_cvd/launch_modem.cpp /^ INJECT(ModemSimulator(const CuttlefishConfig& config,$/;" f class:cuttlefish::ModemSimulator file:
+INJECT host/commands/run_cvd/launch_streamer.cpp /^ INJECT(StreamerSockets(const CuttlefishConfig& config,$/;" f class:cuttlefish::__anon6b0274e10111::StreamerSockets file:
+INJECT host/commands/run_cvd/launch_streamer.cpp /^ INJECT(WebRtcServer(const CuttlefishConfig& config,$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer file:
+INJECT host/commands/run_cvd/main.cc /^ INJECT($/;" f class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment file:
+INJECT host/commands/run_cvd/server_loop.cpp /^ INJECT(ServerLoopImpl(const CuttlefishConfig& config,$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl file:
+INJECT host/commands/run_cvd/validate.cpp /^ INJECT(ValidateHostConfigurationFeature()) {}$/;" f class:cuttlefish::__anon8d12954e0111::ValidateHostConfigurationFeature file:
+INJECT host/commands/run_cvd/validate.cpp /^ INJECT(ValidateTapDevices(const CuttlefishConfig::InstanceSpecific& instance))$/;" f class:cuttlefish::__anon8d12954e0111::ValidateTapDevices file:
+INJECT host/libs/config/adb/config.cpp /^ INJECT(AdbConfigFragmentImpl(AdbConfig& config)) : config_(config) {}$/;" f class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl file:
+INJECT host/libs/config/adb/data.cpp /^ INJECT(AdbConfigImpl()) {}$/;" f class:cuttlefish::AdbConfigImpl file:
+INJECT host/libs/config/adb/flags.cpp /^ INJECT(AdbConfigFlagImpl(AdbConfig& config, ConfigFlag& config_flag))$/;" f class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl file:
+INJECT host/libs/config/adb/launch.cpp /^ INJECT(AdbConnector(const AdbHelper& helper)) : helper_(helper) {}$/;" f class:cuttlefish::__anon7ea6a0320111::AdbConnector file:
+INJECT host/libs/config/adb/launch.cpp /^ INJECT(AdbHelper(const CuttlefishConfig::InstanceSpecific& instance,$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper file:
+INJECT host/libs/config/adb/launch.cpp /^ INJECT(SocketVsockProxy(const AdbHelper& helper,$/;" f class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy file:
+INJECT host/libs/config/adb/test.cpp /^ INJECT(TestData(AdbConfig& config, AdbConfigFragment& fragment))$/;" f struct:cuttlefish::TestData file:
+INJECT host/libs/config/config_flag.cpp /^ INJECT(ConfigFlagImpl(ConfigReader& cr, SystemImageDirFlag& s))$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl file:
+INJECT host/libs/config/config_flag.cpp /^ INJECT(ConfigFlagPlaceholderImpl()) {}$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagPlaceholderImpl file:
+INJECT host/libs/config/config_flag.cpp /^ INJECT(SystemImageDirFlagImpl()) {$/;" f class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl file:
+INJECT host/libs/config/custom_actions.cpp /^ INJECT(CustomActionConfigImpl(ConfigFlag& config)) : config_(config) {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl file:
+INJECT host/libs/config/data_image.cpp /^ INJECT(FixedDataImagePath(ANNOTATED(DataImageTag, std::string) path))$/;" f class:cuttlefish::FixedDataImagePath file:
+INJECT host/libs/config/data_image.cpp /^ INJECT(FixedMiscImagePath(ANNOTATED(MiscImageTag, std::string) path))$/;" f class:cuttlefish::FixedMiscImagePath file:
+INJECT host/libs/config/data_image.cpp /^ INJECT(InitializeDataImageImpl(const CuttlefishConfig& config,$/;" f class:cuttlefish::InitializeDataImageImpl file:
+INJECT host/libs/config/data_image.cpp /^ INJECT(InitializeEspImageImpl(ANNOTATED(EspImageTag, std::string) esp_image,$/;" f class:cuttlefish::InitializeEspImageImpl file:
+INJECT host/libs/config/data_image.cpp /^ INJECT(InitializeMiscImageImpl(MiscImagePath& misc_path))$/;" f class:cuttlefish::InitializeMiscImageImpl file:
+INOTIFY_MAX_EVENT_SIZE guest/monitoring/tombstone_transmit/tombstone_transmit.cpp /^#define INOTIFY_MAX_EVENT_SIZE /;" d file:
+INTENT_ACTION_BLUETOOTH_CHANGED guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public static final String INTENT_ACTION_BLUETOOTH_CHANGED = "com.android.google.gce.gceserv/;" f class:GceService
+INTENT_ACTION_CONFIGURE guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public static final String INTENT_ACTION_CONFIGURE = "com.android.google.gce.gceservice.CONF/;" f class:GceService
+INTENT_ACTION_NETWORK_CHANGED guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public static final String INTENT_ACTION_NETWORK_CHANGED = "com.android.google.gce.gceservic/;" f class:GceService
+INTERNAL_extra_source tools/create_base_image.go /^var INTERNAL_extra_source string$/;" v package:main typeref:typename:string
+INTERROGATE host/commands/modem_simulator/sup_service.h /^ INTERROGATE = 2,$/;" e enum:cuttlefish::SupService::CallForwardInfo::CallForwardInfoStatus
+INVALID_HEX_CHAR guest/hals/ril/reference-libril/ril_service.cpp /^#define INVALID_HEX_CHAR /;" d file:
+IOCTL_VM_SOCKETS_GET_LOCAL_CID common/libs/fs/vm_sockets.h /^#define IOCTL_VM_SOCKETS_GET_LOCAL_CID /;" d
+IOError host/libs/audio_connector/buffers.h /^ IOError,$/;" e enum:cuttlefish::Status
+IR host/commands/modem_simulator/sim_service.h /^ IR = 5, \/\/ Barr all call, when roaming outside Home Country$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+ISIM_ABSENT guest/hals/ril/reference-ril/reference-ril.c /^ ISIM_ABSENT = 12,$/;" e enum:__anon70d7df6f0303 file:
+ISIM_NETWORK_PERSONALIZATION guest/hals/ril/reference-ril/reference-ril.c /^ ISIM_NETWORK_PERSONALIZATION = 17,$/;" e enum:__anon70d7df6f0303 file:
+ISIM_NOT_READY guest/hals/ril/reference-ril/reference-ril.c /^ ISIM_NOT_READY = 13,$/;" e enum:__anon70d7df6f0303 file:
+ISIM_PIN guest/hals/ril/reference-ril/reference-ril.c /^ ISIM_PIN = 15,$/;" e enum:__anon70d7df6f0303 file:
+ISIM_PUK guest/hals/ril/reference-ril/reference-ril.c /^ ISIM_PUK = 16,$/;" e enum:__anon70d7df6f0303 file:
+ISIM_READY guest/hals/ril/reference-ril/reference-ril.c /^ ISIM_READY = 14,$/;" e enum:__anon70d7df6f0303 file:
+IS_MULTIMODE guest/hals/ril/reference-ril/reference-ril.c /^#define IS_MULTIMODE(/;" d file:
+ITERATION_PERIOD_MS guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ private static final int ITERATION_PERIOD_MS = 10 * 1000;$/;" f class:JobExecutor file:
+IfaceConfig host/commands/assemble_cvd/alloc.h /^struct IfaceConfig {$/;" s namespace:cuttlefish
+IfaceData host/commands/assemble_cvd/alloc.h /^struct IfaceData {$/;" s namespace:cuttlefish
+IfaceTyToStr host/libs/allocd/utils.cpp /^std::string IfaceTyToStr(IfaceType iface) {$/;" f namespace:cuttlefish typeref:typename:std::string
+IfaceTyToStrMap host/libs/allocd/utils.cpp /^const std::map<IfaceType, std::string> IfaceTyToStrMap = {$/;" v namespace:cuttlefish typeref:typename:const std::map<IfaceType,std::string>
+IfaceType host/libs/allocd/request.h /^enum class IfaceType : uint16_t {$/;" g namespace:cuttlefish typeref:typename:uint16_t
+IgnoreOnFail tools/create_base_image.go /^ IgnoreOnFail OnFail = iota$/;" c package:main typeref:type:OnFail
+ImagePartition host/libs/image_aggregator/image_aggregator.h /^struct ImagePartition {$/;" s namespace:cuttlefish
+ImagePartitionType host/libs/image_aggregator/image_aggregator.h /^enum ImagePartitionType {$/;" g namespace:cuttlefish
+Impl host/commands/secure_env/in_process_tpm.cpp /^ Impl() {$/;" f class:cuttlefish::InProcessTpm::Impl file:
+Impl host/commands/secure_env/in_process_tpm.cpp /^class InProcessTpm::Impl {$/;" c class:cuttlefish::InProcessTpm file:
+Impl host/frontend/webrtc/lib/local_recorder.cpp /^class LocalRecorder::Impl {$/;" c class:cuttlefish::webrtc_streaming::LocalRecorder file:
+Impl host/frontend/webrtc/lib/streamer.cpp /^class Streamer::Impl : public WsConnectionObserver {$/;" c class:cuttlefish::webrtc_streaming::Streamer file:
+Impls host/libs/config/inject.h /^ static fruit::Component<Deps> Impls() {$/;" f struct:cuttlefish::Multibindings::Bases typeref:typename:fruit::Component<Deps>
+Impls host/libs/config/inject.h /^ static fruit::Component<Deps> Impls() {$/;" f struct:cuttlefish::Multibindings::OneBase typeref:typename:fruit::Component<Deps>
+ImportKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::ImportKey(const ImportKeyRequest& request, ImportKeyResponse* response) {$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ImportKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::ImportKey(const ImportKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ImportWrappedKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::ImportWrappedKey(const ImportWrappedKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ImportWrappedKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::ImportWrappedKey(const ImportWrappedKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+ImsCdmaSms guest/hals/ril/reference-libril/ril_service.cpp /^struct ImsCdmaSms {$/;" s file:
+InGroup common/libs/utils/subprocess.h /^ bool InGroup() const { return in_group_; }$/;" f class:cuttlefish::SubprocessOptions typeref:typename:bool
+InGroup common/libs/utils/subprocess.h /^ void InGroup(bool in_group) {$/;" f class:cuttlefish::SubprocessOptions typeref:typename:void
+InGroup common/libs/utils/users.cpp /^bool InGroup(const std::string& group) {$/;" f namespace:cuttlefish typeref:typename:bool
+InProcessTpm host/commands/secure_env/in_process_tpm.cpp /^InProcessTpm::InProcessTpm() : impl_(new Impl()) {}$/;" f class:cuttlefish::InProcessTpm
+InProcessTpm host/commands/secure_env/in_process_tpm.h /^class InProcessTpm : public Tpm {$/;" c namespace:cuttlefish
+IncrementalOTA_GetBlockDifferences shared/releasetools.py /^def IncrementalOTA_GetBlockDifferences(info):$/;" f
+Index common/libs/net/network_interface.h /^ size_t Index() const {$/;" f class:cuttlefish::NetworkInterface typeref:typename:size_t
+InfoCommand host/libs/audio_connector/commands.h /^ InfoCommand(AudioCommandType type, uint32_t start_id, size_t count, R* reply)$/;" f class:cuttlefish::InfoCommand
+InfoCommand host/libs/audio_connector/commands.h /^class InfoCommand : public AudioCommand {$/;" c namespace:cuttlefish
+Init host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::Init() { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+Init host/libs/confui/cbor.cc /^void Cbor::Init() {$/;" f class:cuttlefish::confui::Cbor typeref:typename:void
+InitBootloaderEnvPartition host/commands/assemble_cvd/boot_config.cc /^bool InitBootloaderEnvPartition(const CuttlefishConfig& config,$/;" f namespace:cuttlefish typeref:typename:bool
+InitDefaultNvramConfig host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InitDefaultNvramConfig() {$/;" f class:cuttlefish::NvramConfig typeref:typename:void
+InitFilesystemAndCreateConfig host/commands/assemble_cvd/assemble_cvd.cc /^const CuttlefishConfig* InitFilesystemAndCreateConfig($/;" f namespace:cuttlefish::__anon1e335d460111 typeref:typename:const CuttlefishConfig *
+InitMicrophone host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::InitMicrophone() { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+InitNvramConfigService host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InitNvramConfigService(size_t num_instances, int sim_type) {$/;" f class:cuttlefish::NvramConfig typeref:typename:void
+InitPlayout host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::InitPlayout() { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+InitRamFsTag host/libs/config/data_image.cpp /^struct InitRamFsTag {};$/;" s namespace:cuttlefish file:
+InitRecording host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::InitRecording() { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+InitSpeaker host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::InitSpeaker() { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+Initialize guest/hals/keymaster/remote/remote_keymaster.cpp /^bool RemoteKeymaster::Initialize() {$/;" f class:keymaster::RemoteKeymaster typeref:typename:bool
+Initialize guest/hals/keymint/remote/remote_keymaster.cpp /^bool RemoteKeymaster::Initialize() {$/;" f class:keymaster::RemoteKeymaster typeref:typename:bool
+Initialize host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::Initialize($/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+InitializeAccessKregistryImage host/commands/assemble_cvd/disk_flags.cc /^class InitializeAccessKregistryImage : public Feature {$/;" c namespace:cuttlefish file:
+InitializeCommandHandlers host/commands/modem_simulator/call_service.cpp /^std::vector<CommandHandler> CallService::InitializeCommandHandlers() {$/;" f class:cuttlefish::CallService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/data_service.cpp /^std::vector<CommandHandler> DataService::InitializeCommandHandlers() {$/;" f class:cuttlefish::DataService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/misc_service.cpp /^std::vector<CommandHandler> MiscService::InitializeCommandHandlers() {$/;" f class:cuttlefish::MiscService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/network_service.cpp /^std::vector<CommandHandler> NetworkService::InitializeCommandHandlers() {$/;" f class:cuttlefish::NetworkService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/sim_service.cpp /^std::vector<CommandHandler> SimService::InitializeCommandHandlers() {$/;" f class:cuttlefish::SimService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/sms_service.cpp /^std::vector<CommandHandler> SmsService::InitializeCommandHandlers() {$/;" f class:cuttlefish::SmsService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/stk_service.cpp /^std::vector<CommandHandler> StkService::InitializeCommandHandlers() {$/;" f class:cuttlefish::StkService typeref:typename:std::vector<CommandHandler>
+InitializeCommandHandlers host/commands/modem_simulator/sup_service.cpp /^std::vector<CommandHandler> SupService::InitializeCommandHandlers() {$/;" f class:cuttlefish::SupService typeref:typename:std::vector<CommandHandler>
+InitializeCuttlefishConfiguration host/commands/assemble_cvd/flags.cc /^CuttlefishConfig InitializeCuttlefishConfiguration($/;" f namespace:cuttlefish typeref:typename:CuttlefishConfig
+InitializeDataImage host/libs/config/data_image.h /^class InitializeDataImage : public Feature {};$/;" c namespace:cuttlefish
+InitializeDataImageComponent host/libs/config/data_image.cpp /^InitializeDataImageComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig,DataImagePath>,InitializeDataImage>
+InitializeDataImageImpl host/libs/config/data_image.cpp /^class InitializeDataImageImpl : public InitializeDataImage {$/;" c namespace:cuttlefish file:
+InitializeEspImage host/libs/config/data_image.h /^class InitializeEspImage : public Feature {};$/;" c namespace:cuttlefish
+InitializeEspImageComponent host/libs/config/data_image.cpp /^fruit::Component<InitializeEspImage> InitializeEspImageComponent($/;" f namespace:cuttlefish typeref:typename:fruit::Component<InitializeEspImage>
+InitializeEspImageImpl host/libs/config/data_image.cpp /^class InitializeEspImageImpl : public InitializeEspImage {$/;" c namespace:cuttlefish file:
+InitializeFacilityLock host/commands/modem_simulator/sim_service.cpp /^void SimService::InitializeFacilityLock() {$/;" f class:cuttlefish::SimService typeref:typename:void
+InitializeLwsObjects host/libs/websocket/websocket_server.cpp /^void WebSocketServer::InitializeLwsObjects() {$/;" f class:cuttlefish::WebSocketServer typeref:typename:void
+InitializeMetadataImage host/commands/assemble_cvd/disk_flags.cc /^class InitializeMetadataImage : public Feature {$/;" c namespace:cuttlefish file:
+InitializeMiscImage host/libs/config/data_image.h /^class InitializeMiscImage : public Feature {};$/;" c namespace:cuttlefish
+InitializeMiscImageComponent host/libs/config/data_image.cpp /^InitializeMiscImageComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<MiscImagePath>,InitializeMiscImage>
+InitializeMiscImageImpl host/libs/config/data_image.cpp /^class InitializeMiscImageImpl : public InitializeMiscImage {$/;" c namespace:cuttlefish file:
+InitializeNetworkConfiguration common/libs/device_config/host_device_config.cpp /^bool InitializeNetworkConfiguration(const CuttlefishConfig& cuttlefish_config,$/;" f namespace:cuttlefish::__anonf277137d0111 typeref:typename:bool
+InitializeNetworkOperator host/commands/modem_simulator/network_service.cpp /^void NetworkService::InitializeNetworkOperator() {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+InitializeScreenConfiguration common/libs/device_config/host_device_config.cpp /^void InitializeScreenConfiguration(const CuttlefishConfig& cuttlefish_config,$/;" f namespace:cuttlefish::__anonf277137d0111 typeref:typename:void
+InitializeServiceState host/commands/modem_simulator/call_service.cpp /^void CallService::InitializeServiceState() {$/;" f class:cuttlefish::CallService typeref:typename:void
+InitializeServiceState host/commands/modem_simulator/data_service.cpp /^void DataService::InitializeServiceState() {$/;" f class:cuttlefish::DataService typeref:typename:void
+InitializeServiceState host/commands/modem_simulator/network_service.cpp /^void NetworkService::InitializeServiceState() {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+InitializeServiceState host/commands/modem_simulator/sim_service.cpp /^void SimService::InitializeServiceState() {$/;" f class:cuttlefish::SimService typeref:typename:void
+InitializeServiceState host/commands/modem_simulator/sms_service.cpp /^void SmsService::InitializeServiceState() {$/;" f class:cuttlefish::SmsService typeref:typename:void
+InitializeServiceState host/commands/modem_simulator/sup_service.cpp /^void SupService::InitializeServiceState() {$/;" f class:cuttlefish::SupService typeref:typename:void
+InitializeSimFileSystemAndSimState host/commands/modem_simulator/sim_service.cpp /^void SimService::InitializeSimFileSystemAndSimState() {$/;" f class:cuttlefish::SimService typeref:typename:void
+InitializeSimOperator host/commands/modem_simulator/network_service.cpp /^void NetworkService::InitializeSimOperator() {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+Initialized host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::Initialized() const { return true; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+InjectHingeAngle guest/commands/sensor_injection/main.cpp /^void InjectHingeAngle(int angle) {$/;" f typeref:typename:void
+InjectOrientation guest/commands/sensor_injection/main.cpp /^void InjectOrientation(bool portrait) {$/;" f typeref:typename:void
+InputChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^InputChannelHandler::InputChannelHandler($/;" f class:cuttlefish::webrtc_streaming::InputChannelHandler
+InputChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^class InputChannelHandler : public webrtc::DataChannelObserver {$/;" c namespace:cuttlefish::webrtc_streaming file:
+InputEvent guest/commands/vsoc_input_service/vsoc_input_service.h /^struct InputEvent {$/;" s namespace:cuttlefish::input_events
+InputEventBuffer host/frontend/webrtc/connection_observer.cpp /^struct InputEventBuffer {$/;" s namespace:cuttlefish file:
+InputEventBufferImpl host/frontend/webrtc/connection_observer.cpp /^ InputEventBufferImpl() {$/;" f struct:cuttlefish::InputEventBufferImpl file:
+InputEventBufferImpl host/frontend/webrtc/connection_observer.cpp /^struct InputEventBufferImpl : public InputEventBuffer {$/;" s namespace:cuttlefish file:
+InputSockets host/frontend/webrtc/connection_observer.h /^struct InputSockets {$/;" s namespace:cuttlefish
+InsecureFallbackStorage host/commands/secure_env/insecure_fallback_storage.cpp /^InsecureFallbackStorage::InsecureFallbackStorage($/;" f class:cuttlefish::InsecureFallbackStorage
+InsecureFallbackStorage host/commands/secure_env/insecure_fallback_storage.h /^class InsecureFallbackStorage : public GatekeeperStorage {$/;" c namespace:cuttlefish
+Insert host/commands/modem_simulator/thread_looper.cpp /^void ThreadLooper::Insert(const Event &event) {$/;" f class:cuttlefish::ThreadLooper typeref:typename:void
+Insert host/libs/allocd/resource_manager.h /^ void Insert($/;" f class:cuttlefish::Session typeref:typename:void
+InstallAlwaysNeededDependencyTag build/cvd-host-package.go /^ android.InstallAlwaysNeededDependencyTag \/\/ to force installation of both "deps" and manually/;" M struct:cuttlefish.dependencyTag typeref:typename:android.InstallAlwaysNeededDependencyTag
+InstanceFromEnvironment host/libs/config/cuttlefish_config.cpp /^int InstanceFromEnvironment() {$/;" f namespace:cuttlefish::__anon2cec80f10111 typeref:typename:int
+InstanceSpecific host/commands/modem_simulator/nvram_config.h /^ InstanceSpecific(const NvramConfig* config, const std::string& id)$/;" f class:cuttlefish::NvramConfig::InstanceSpecific
+InstanceSpecific host/commands/modem_simulator/nvram_config.h /^ class InstanceSpecific {$/;" c class:cuttlefish::NvramConfig
+InstanceSpecific host/libs/config/cuttlefish_config.h /^ InstanceSpecific(const CuttlefishConfig* config, const std::string& id)$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific
+InstanceSpecific host/libs/config/cuttlefish_config.h /^ class InstanceSpecific {$/;" c class:cuttlefish::CuttlefishConfig
+Instances host/libs/config/cuttlefish_config.cpp /^std::vector<CuttlefishConfig::InstanceSpecific> CuttlefishConfig::Instances()$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::vector<CuttlefishConfig::InstanceSpecific>
+InstantiateDynHandler host/libs/websocket/websocket_server.cpp /^std::unique_ptr<DynHandler> WebSocketServer::InstantiateDynHandler($/;" f class:cuttlefish::WebSocketServer typeref:typename:std::unique_ptr<DynHandler>
+InstantiateHandler host/libs/websocket/websocket_server.cpp /^std::shared_ptr<WebSocketHandler> WebSocketServer::InstantiateHandler($/;" f class:cuttlefish::WebSocketServer typeref:typename:std::shared_ptr<WebSocketHandler>
+IntToHexString host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::IntToHexString(int value) {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+IntToHexStringTimeZoneDiff host/commands/modem_simulator/pdu_parser.cpp /^std::string PDUParser::IntToHexStringTimeZoneDiff(int tzdiff_hour) {$/;" f class:cuttlefish::PDUParser typeref:typename:std::string
+Interactive guest/hals/confirmationui/guest_session.h /^ Interactive = 3,$/;" e enum:android::hardware::confirmationui::V1_0::implementation::GuestSession::ListenerState
+InterfaceState guest/hals/ril/reference-ril/reference-ril.c /^enum InterfaceState {$/;" g file:
+InternalDeps host/commands/run_cvd/launch.cc /^ using InternalDeps = fruit::Required<const CuttlefishConfig, VmManager,$/;" t function:cuttlefish::launchComponent typeref:typename:fruit::Required<const CuttlefishConfig,VmManager,const CuttlefishConfig::InstanceSpecific,KernelLogPipeProvider> file:
+IntersectPortRanges host/frontend/webrtc/lib/port_range_socket_factory.cpp /^std::pair<uint16_t, uint16_t> IntersectPortRanges($/;" f namespace:cuttlefish::webrtc_streaming::__anonff3d797e0111 typeref:typename:std::pair<uint16_t,uint16_t>
+Invalid host/libs/allocd/request.h /^ Invalid = 0, \/\/ Invalid Request$/;" e enum:cuttlefish::RequestType
+Invalid host/libs/allocd/request.h /^ Invalid = 0, \/\/ Invalid status$/;" e enum:cuttlefish::RequestStatus
+Invalid host/libs/allocd/request.h /^ Invalid = 0, \/\/ an invalid interface$/;" e enum:cuttlefish::IfaceType
+Invalid host/libs/allocd/resource.h /^ Invalid = 0,$/;" e enum:cuttlefish::ResourceType
+InvalidFlagGuard common/libs/utils/flag_parser.cpp /^Flag InvalidFlagGuard() {$/;" f namespace:cuttlefish typeref:typename:Flag
+IoStatusMsg host/libs/audio_connector/shm_layout.h /^struct IoStatusMsg {$/;" s namespace:cuttlefish
+IoTransferMsg host/libs/audio_connector/shm_layout.h /^struct IoTransferMsg {$/;" s namespace:cuttlefish
+Ioctl common/libs/fs/shared_fd.cpp /^int FileInstance::Ioctl(int request, void* val) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+IptableConfig host/libs/allocd/alloc_utils.cpp /^bool IptableConfig(const std::string& network, bool add) {$/;" f namespace:cuttlefish typeref:typename:bool
+IsATTY common/libs/fs/shared_fd.cpp /^bool FileInstance::IsATTY() {$/;" f class:cuttlefish::FileInstance typeref:typename:bool
+IsAndroidMode host/libs/confui/host_mode_ctrl.h /^ auto IsAndroidMode() { return (atomic_mode_ == ModeType::kAndroidMode); }$/;" f class:cuttlefish::HostModeCtrl typeref:typename:auto
+IsCallbackSet host/libs/screen_connector/screen_connector.h /^ bool IsCallbackSet() const override {$/;" f class:cuttlefish::ScreenConnector typeref:typename:bool
+IsCancel host/libs/confui/session.h /^ bool IsCancel(const int x, const int y) {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsCapture host/frontend/webrtc/audio_handler.cpp /^bool IsCapture(uint32_t stream_id) {$/;" f namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:bool
+IsConfUiActive host/libs/confui/host_server.cc /^bool HostServer::IsConfUiActive() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:bool
+IsConfUiActive host/libs/confui/session.cc /^bool Session::IsConfUiActive() const {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsConfirm host/libs/confui/session.h /^ bool IsConfirm(const int x, const int y) {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsConfirmatioUiMode host/libs/confui/host_mode_ctrl.h /^ auto IsConfirmatioUiMode() {$/;" f class:cuttlefish::HostModeCtrl typeref:typename:auto
+IsConnected common/libs/utils/vsock_connection.cpp /^bool VsockConnection::IsConnected() const { return fd_->IsOpen(); }$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+IsConnectionReady host/frontend/webrtc/lib/camera_streamer.cpp /^bool CameraStreamer::IsConnectionReady() {$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:bool
+IsCredentials common/libs/utils/unix_sockets.cpp /^bool ControlMessage::IsCredentials() const {$/;" f class:cuttlefish::ControlMessage typeref:typename:bool
+IsDirectoryEmpty common/libs/utils/files.cpp /^bool IsDirectoryEmpty(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:bool
+IsEmpty common/libs/concurrency/multiplexer.h /^ bool IsEmpty(const int idx) { return queues_[idx]->IsEmpty(); }$/;" f class:cuttlefish::Multiplexer typeref:typename:bool
+IsEmpty common/libs/concurrency/thread_safe_queue.h /^ bool IsEmpty() {$/;" f class:cuttlefish::ThreadSafeQueue typeref:typename:bool
+IsEmpty host/libs/confui/host_renderer.h /^ bool IsEmpty() const { return teeui_frame_.empty(); }$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:bool
+IsEmpty host/libs/screen_connector/screen_connector_queue.h /^ bool IsEmpty() const {$/;" f class:cuttlefish::ScreenConnectorQueue typeref:typename:bool
+IsFDNEnabled host/commands/modem_simulator/sim_service.cpp /^bool SimService::IsFDNEnabled() {$/;" f class:cuttlefish::SimService typeref:typename:bool
+IsFileDescriptors common/libs/utils/unix_sockets.cpp /^bool ControlMessage::IsFileDescriptors() const {$/;" f class:cuttlefish::ControlMessage typeref:typename:bool
+IsFinalResponseError host/commands/modem_simulator/unittest/service_test.cpp /^ inline bool IsFinalResponseError(std::string response) {$/;" f class:ModemServiceTest typeref:typename:bool file:
+IsFinalResponseSuccess host/commands/modem_simulator/unittest/service_test.cpp /^ inline bool IsFinalResponseSuccess(std::string response) {$/;" f class:ModemServiceTest typeref:typename:bool file:
+IsFixedDialNumber host/commands/modem_simulator/sim_service.cpp /^bool SimService::IsFixedDialNumber(std::string_view number) {$/;" f class:cuttlefish::SimService typeref:typename:bool
+IsFrameReady host/libs/confui/host_renderer.h /^ bool IsFrameReady() const { return raw_frame_ && !raw_frame_->IsEmpty(); }$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+IsFull common/libs/concurrency/thread_safe_queue.h /^ bool IsFull() {$/;" f class:cuttlefish::ThreadSafeQueue typeref:typename:bool
+IsHardwareBacked host/commands/secure_env/soft_gatekeeper.h /^ virtual bool IsHardwareBacked() const { return false; }$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+IsHardwareBacked host/commands/secure_env/tpm_gatekeeper.cpp /^bool TpmGatekeeper::IsHardwareBacked() const {$/;" f class:cuttlefish::TpmGatekeeper typeref:typename:bool
+IsHasNetwork host/commands/modem_simulator/network_service.cpp /^bool NetworkService::IsHasNetwork() {$/;" f class:cuttlefish::NetworkService typeref:typename:bool
+IsHostCompatible common/libs/utils/environment.cpp /^bool IsHostCompatible(Arch arch) {$/;" f namespace:cuttlefish typeref:typename:bool
+IsInCancel host/libs/confui/host_renderer.h /^ bool IsInCancel(const std::uint32_t x, const std::uint32_t y) {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+IsInConfirm host/libs/confui/host_renderer.h /^ bool IsInConfirm(const std::uint32_t x, const std::uint32_t y) {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+IsInside host/libs/confui/host_renderer.h /^ bool IsInside(const std::uint32_t x, const std::uint32_t y) const {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+IsInteger host/frontend/adb_connector/adb_connection_maintainer.cpp /^bool IsInteger(const std::string& str) {$/;" f namespace:__anon734383cf0111 typeref:typename:bool
+IsIntermediateResponse host/commands/modem_simulator/unittest/service_test.cpp /^ inline bool IsIntermediateResponse(std::string response) {$/;" f class:ModemServiceTest typeref:typename:bool file:
+IsInverted host/libs/confui/session.cc /^bool Session::IsInverted() const {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsLikelySoftwareRenderer host/libs/graphics_detector/graphics_detector.cpp /^bool IsLikelySoftwareRenderer(const std::string& renderer) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:bool
+IsMagnified host/libs/confui/session.cc /^bool Session::IsMagnified() const {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsMalformedUtf8 host/libs/confui/cbor.h /^ bool IsMalformedUtf8() const {$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+IsMessageTooLong host/libs/confui/cbor.h /^ bool IsMessageTooLong() const { return buffer_status_ == Error::OUT_OF_DATA; }$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+IsNeededStatuReport host/commands/modem_simulator/pdu_parser.cpp /^bool PDUParser::IsNeededStatuReport() {$/;" f class:cuttlefish::PDUParser typeref:typename:bool
+IsOk host/libs/confui/cbor.h /^ bool IsOk() const { return buffer_status_ == Error::OK; }$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+IsOnlyDigits common/libs/confui/utils.h /^inline bool IsOnlyDigits(const std::string& src) {$/;" f namespace:cuttlefish::confui typeref:typename:bool
+IsOpen common/libs/fs/shared_fd.h /^ bool IsOpen() const { return fd_ != -1; }$/;" f class:cuttlefish::FileInstance typeref:typename:bool
+IsOperational common/libs/net/network_interface.h /^ bool IsOperational() const {$/;" f class:cuttlefish::NetworkInterface typeref:typename:bool
+IsRadioOn host/commands/modem_simulator/modem_simulator.cpp /^bool ModemSimulator::IsRadioOn() const {$/;" f class:cuttlefish::ModemSimulator typeref:typename:bool
+IsReadyForUserInput host/libs/confui/session.cc /^bool Session::IsReadyForUserInput() const {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsRegular common/libs/fs/shared_fd.h /^ bool IsRegular() const { return is_regular_file_; }$/;" f class:cuttlefish::FileInstance typeref:typename:bool
+IsRegularFile common/libs/fs/shared_fd.cpp /^bool IsRegularFile(const int fd) {$/;" f namespace:cuttlefish::__anond70c3a4f0111 typeref:typename:bool
+IsRunningInContainer common/libs/utils/environment.cpp /^bool IsRunningInContainer() {$/;" f namespace:cuttlefish typeref:typename:bool
+IsRunningInDocker common/libs/utils/environment.cpp /^static bool IsRunningInDocker() {$/;" f namespace:cuttlefish typeref:typename:bool file:
+IsSet common/libs/fs/shared_fd.cpp /^bool FileInstance::IsSet(fd_set* in) const {$/;" f class:cuttlefish::FileInstance typeref:typename:bool
+IsSet common/libs/fs/shared_select.h /^ bool IsSet(const SharedFD& in) const {$/;" f class:cuttlefish::SharedFDSet typeref:typename:bool
+IsSetUpSuccessful host/libs/confui/host_renderer.h /^ bool IsSetUpSuccessful() const { return is_setup_well_; }$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+IsStdinValid host/commands/run_cvd/main.cc /^bool IsStdinValid() {$/;" f namespace:cuttlefish::__anonadab6e0c0111 typeref:typename:bool
+IsSuccess common/libs/confui/protocol_types.h /^ bool IsSuccess() const { return is_success_; }$/;" f class:cuttlefish::confui::ConfUiAckMessage typeref:typename:bool
+IsSupported host/libs/vm_manager/crosvm_manager.cpp /^bool CrosvmManager::IsSupported() {$/;" f class:cuttlefish::vm_manager::CrosvmManager typeref:typename:bool
+IsSupported host/libs/vm_manager/qemu_manager.cpp /^bool QemuManager::IsSupported() {$/;" f class:cuttlefish::vm_manager::QemuManager typeref:typename:bool
+IsUsbConnected recovery/recovery_ui.cpp /^ bool IsUsbConnected() override {$/;" f class:CuttlefishRecoveryUI typeref:typename:bool file:
+IsUserAbort host/libs/confui/host_server.cc /^static bool IsUserAbort(ConfUiMessage& msg) {$/;" f namespace:cuttlefish::confui typeref:typename:bool file:
+IsUserInput host/libs/confui/session.h /^ bool IsUserInput(const FsmInput fsm_input) {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+IsValidPDU host/commands/modem_simulator/pdu_parser.cpp /^bool PDUParser::IsValidPDU() {$/;" f class:cuttlefish::PDUParser typeref:typename:bool
+IsWaitingSmsPdu host/commands/modem_simulator/modem_simulator.cpp /^bool ModemSimulator::IsWaitingSmsPdu() {$/;" f class:cuttlefish::ModemSimulator typeref:typename:bool
+IsWaitingSmsPdu host/commands/modem_simulator/sms_service.h /^ bool IsWaitingSmsPdu() { return is_waiting_sms_pdu_; }$/;" f class:cuttlefish::SmsService typeref:typename:bool
+IsWaitingSmsToSim host/commands/modem_simulator/sms_service.h /^ bool IsWaitingSmsToSim() { return is_waiting_sms_to_sim_; }$/;" f class:cuttlefish::SmsService typeref:typename:bool
+JACKS host/frontend/webrtc/audio_handler.cpp /^const virtio_snd_jack_info JACKS[] = {};$/;" v namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:const virtio_snd_jack_info[]
+JackInfoCommand host/libs/audio_connector/commands.cpp /^JackInfoCommand::JackInfoCommand(uint32_t start_id, size_t count,$/;" f class:cuttlefish::JackInfoCommand
+JackInfoCommand host/libs/audio_connector/commands.h /^class JackInfoCommand : public InfoCommand<virtio_snd_jack_info> {$/;" c namespace:cuttlefish
+JacksInfo host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::JacksInfo(JackInfoCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+JobBase guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^ JobBase(String tag) {$/;" m class:JobBase
+JobBase guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^public abstract class JobBase {$/;" c
+JobExecutor guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ public JobExecutor() {$/;" m class:JobExecutor
+JobExecutor guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^public class JobExecutor {$/;" c
+JoinArrays host/frontend/webrtc_operator/assets/js/adb.js /^function JoinArrays(arr1, arr2) {$/;" f
+Json host/libs/config/cuttlefish_config.h /^namespace Json {$/;" n
+Json host/libs/config/fetcher_config.h /^namespace Json {$/;" n
+JsonHandleCreateInterfaceRequest host/libs/allocd/resource_manager.cpp /^Json::Value ResourceManager::JsonHandleCreateInterfaceRequest($/;" f class:cuttlefish::ResourceManager typeref:typename:Json::Value
+JsonHandleDestroyInterfaceRequest host/libs/allocd/resource_manager.cpp /^Json::Value ResourceManager::JsonHandleDestroyInterfaceRequest($/;" f class:cuttlefish::ResourceManager typeref:typename:Json::Value
+JsonHandleIdRequest host/libs/allocd/resource_manager.cpp /^Json::Value ResourceManager::JsonHandleIdRequest() {$/;" f class:cuttlefish::ResourceManager typeref:typename:Json::Value
+JsonHandleShutdownRequest host/libs/allocd/resource_manager.cpp /^Json::Value ResourceManager::JsonHandleShutdownRequest(SharedFD client_socket) {$/;" f class:cuttlefish::ResourceManager typeref:typename:Json::Value
+JsonHandleStopSessionRequest host/libs/allocd/resource_manager.cpp /^Json::Value ResourceManager::JsonHandleStopSessionRequest($/;" f class:cuttlefish::ResourceManager typeref:typename:Json::Value
+JsonRequestReader host/libs/allocd/request.h /^class JsonRequestReader {$/;" c namespace:cuttlefish
+JsonSerializable host/commands/secure_env/json_serializable.cpp /^JsonSerializable::JsonSerializable(Json::Value& json) : json_(json) {}$/;" f class:cuttlefish::JsonSerializable
+JsonSerializable host/commands/secure_env/json_serializable.cpp /^class JsonSerializable : public keymaster::Serializable {$/;" c namespace:cuttlefish file:
+JsonServer host/libs/allocd/resource_manager.cpp /^void ResourceManager::JsonServer() {$/;" f class:cuttlefish::ResourceManager typeref:typename:void
+JsonToCvdFile host/libs/config/fetcher_config.cpp /^CvdFile JsonToCvdFile(const std::string& file_path, const Json::Value& json) {$/;" f namespace:cuttlefish::__anonf7286d770211 typeref:typename:CvdFile
+KEEPALIVE_ACTIVE guest/hals/ril/reference-libril/ril.h /^ KEEPALIVE_ACTIVE, \/* Keepalive session is active *\/$/;" e enum:__anon0bfbaecfc603
+KEEPALIVE_INACTIVE guest/hals/ril/reference-libril/ril.h /^ KEEPALIVE_INACTIVE, \/* Keepalive session is inactive *\/$/;" e enum:__anon0bfbaecfc603
+KEEPALIVE_PENDING guest/hals/ril/reference-libril/ril.h /^ KEEPALIVE_PENDING \/* Keepalive session status not available *\/$/;" e enum:__anon0bfbaecfc603
+KERNEL_BUILD host/libs/config/fetcher_config.h /^ KERNEL_BUILD,$/;" e enum:cuttlefish::FileSource
+KHRONOS_APIATTRIBUTES host/libs/graphics_detector/include/KHR/khrplatform.h /^#define KHRONOS_APIATTRIBUTES /;" d
+KHRONOS_APIATTRIBUTES host/libs/graphics_detector/include/KHR/khrplatform.h /^#define KHRONOS_APIATTRIBUTES$/;" d
+KHRONOS_APICALL host/libs/graphics_detector/include/KHR/khrplatform.h /^# define KHRONOS_APICALL /;" d
+KHRONOS_APICALL host/libs/graphics_detector/include/KHR/khrplatform.h /^# define KHRONOS_APICALL$/;" d
+KHRONOS_APIENTRY host/libs/graphics_detector/include/KHR/khrplatform.h /^# define KHRONOS_APIENTRY /;" d
+KHRONOS_APIENTRY host/libs/graphics_detector/include/KHR/khrplatform.h /^# define KHRONOS_APIENTRY$/;" d
+KHRONOS_BOOLEAN_ENUM_FORCE_SIZE host/libs/graphics_detector/include/KHR/khrplatform.h /^ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM$/;" e enum:__anon5c4f198b0103
+KHRONOS_FALSE host/libs/graphics_detector/include/KHR/khrplatform.h /^ KHRONOS_FALSE = 0,$/;" e enum:__anon5c4f198b0103
+KHRONOS_MAX_ENUM host/libs/graphics_detector/include/KHR/khrplatform.h /^#define KHRONOS_MAX_ENUM /;" d
+KHRONOS_STATIC host/libs/graphics_detector/include/KHR/khrplatform.h /^# define KHRONOS_STATIC /;" d
+KHRONOS_SUPPORT_FLOAT host/libs/graphics_detector/include/KHR/khrplatform.h /^#define KHRONOS_SUPPORT_FLOAT /;" d
+KHRONOS_SUPPORT_INT64 host/libs/graphics_detector/include/KHR/khrplatform.h /^#define KHRONOS_SUPPORT_INT64 /;" d
+KHRONOS_TRUE host/libs/graphics_detector/include/KHR/khrplatform.h /^ KHRONOS_TRUE = 1,$/;" e enum:__anon5c4f198b0103
+KLOG_FORMAT guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String KLOG_FORMAT = "<%d>%s: %s\\n";$/;" f class:EventReporter file:
+KLOG_NOTICE guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final int KLOG_NOTICE = 5;$/;" f class:EventReporter file:
+KLOG_OUTPUT guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String KLOG_OUTPUT = "\/dev\/kmsg";$/;" f class:EventReporter file:
+KernelCommandLineFromConfig host/libs/config/kernel_args.cpp /^std::vector<std::string> KernelCommandLineFromConfig($/;" f namespace:cuttlefish typeref:typename:std::vector<std::string>
+KernelConfig host/commands/assemble_cvd/flags.h /^struct KernelConfig {$/;" s namespace:cuttlefish
+KernelLoaded host/commands/kernel_log_monitor/kernel_log_server.h /^ KernelLoaded = 8, \/\/ BootStarted actually comes quite late in the boot.$/;" e enum:monitor::Event
+KernelLogEventsHandler host/frontend/webrtc/kernel_log_events_handler.cpp /^KernelLogEventsHandler::KernelLogEventsHandler($/;" f class:cuttlefish::KernelLogEventsHandler
+KernelLogEventsHandler host/frontend/webrtc/kernel_log_events_handler.h /^struct KernelLogEventsHandler {$/;" s namespace:cuttlefish
+KernelLogMonitor host/commands/run_cvd/launch.cc /^class KernelLogMonitor : public CommandSource,$/;" c namespace:cuttlefish file:
+KernelLogMonitorBinary host/libs/config/known_paths.cpp /^std::string KernelLogMonitorBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+KernelLogPipe host/commands/run_cvd/launch.cc /^ SharedFD KernelLogPipe() override {$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:SharedFD file:
+KernelLogPipeProvider host/libs/config/kernel_log_pipe_provider.h /^class KernelLogPipeProvider : public virtual Feature {$/;" c namespace:cuttlefish
+KernelLogServer host/commands/kernel_log_monitor/kernel_log_server.cc /^KernelLogServer::KernelLogServer(cuttlefish::SharedFD pipe_fd,$/;" f class:monitor::KernelLogServer
+KernelLogServer host/commands/kernel_log_monitor/kernel_log_server.h /^class KernelLogServer {$/;" c namespace:monitor
+KernelPathTag host/libs/config/data_image.cpp /^struct KernelPathTag {};$/;" s namespace:cuttlefish file:
+KeymasterChannel common/libs/security/keymaster_channel.cpp /^KeymasterChannel::KeymasterChannel(SharedFD input, SharedFD output)$/;" f class:cuttlefish::KeymasterChannel
+KeymasterChannel common/libs/security/keymaster_channel.h /^class KeymasterChannel {$/;" c namespace:cuttlefish
+KeymasterCommandDestroyer common/libs/security/keymaster_channel.h /^class KeymasterCommandDestroyer {$/;" c namespace:cuttlefish
+KeymasterResponder host/commands/secure_env/keymaster_responder.cpp /^KeymasterResponder::KeymasterResponder($/;" f class:cuttlefish::KeymasterResponder
+KeymasterResponder host/commands/secure_env/keymaster_responder.h /^class KeymasterResponder {$/;" c namespace:cuttlefish
+Keymint host/libs/config/cuttlefish_config.h /^ Keymint,$/;" e enum:cuttlefish::SecureHal
+KillSubprocess common/libs/utils/subprocess.cpp /^StopperResult KillSubprocess(Subprocess* subprocess) {$/;" f namespace:cuttlefish typeref:typename:StopperResult
+KmParamSet guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^ KmParamSet(KmParamSet&& other) noexcept$/;" f class:keymaster::V4_1::__anon49de69e60111::KmParamSet file:
+KmParamSet guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^ KmParamSet(const hidl_vec<KeyParameter>& keyParams) {$/;" f class:keymaster::V4_1::__anon49de69e60111::KmParamSet file:
+KmParamSet guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^class KmParamSet : public keymaster_key_param_set_t {$/;" c namespace:keymaster::V4_1::__anon49de69e60111 file:
+LANGUAGE_NOTIFICATION host/commands/modem_simulator/stk_service.h /^ LANGUAGE_NOTIFICATION = 0x35,$/;" e enum:cuttlefish::StkService::CommandType
+LAST_IMPRECISE_RIL_VERSION guest/hals/ril/reference-libril/ril.h /^#define LAST_IMPRECISE_RIL_VERSION /;" d
+LAUNCH_BROWSER host/commands/modem_simulator/stk_service.h /^ LAUNCH_BROWSER = 0x15,$/;" e enum:cuttlefish::StkService::CommandType
+LIB_ARGS_PROPERTY guest/hals/rild/rild_cuttlefish.c /^#define LIB_ARGS_PROPERTY /;" d file:
+LOCAL_AUDIOCONTROL_HAL_PRODUCT_PACKAGE shared/auto/device.mk /^ LOCAL_AUDIOCONTROL_HAL_PRODUCT_PACKAGE := android.hardware.automotive.audiocontrol-service.e/;" m
+LOCAL_AUDIO_DEVICE_PACKAGE_OVERLAYS shared/device.mk /^LOCAL_AUDIO_DEVICE_PACKAGE_OVERLAYS ?=$/;" m
+LOCAL_AUDIO_PRODUCT_COPY_FILES shared/auto/device.mk /^LOCAL_AUDIO_PRODUCT_COPY_FILES ?= \\$/;" m
+LOCAL_AUDIO_PRODUCT_COPY_FILES shared/device.mk /^LOCAL_AUDIO_PRODUCT_COPY_FILES ?= \\$/;" m
+LOCAL_AUDIO_PRODUCT_PACKAGE shared/device.mk /^LOCAL_AUDIO_PRODUCT_PACKAGE ?= \\$/;" m
+LOCAL_BLUETOOTH_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_BLUETOOTH_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_BLUETOOTH_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_BLUETOOTH_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_BLUETOOTH_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_BLUETOOTH_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_BT_PROPERTIES shared/device.mk /^LOCAL_BT_PROPERTIES ?= \\$/;" m
+LOCAL_CFLAGS guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_CFLAGS := $(L_CFLAGS) \\$/;" m
+LOCAL_CONFIRMATIONUI_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_CONFIRMATIONUI_PRODUCT_PACKAGE := [email protected]/;" m
+LOCAL_C_INCLUDES guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_C_INCLUDES := \\$/;" m
+LOCAL_DISABLE_OMX vsoc_arm64_only/phone/aosp_cf.mk /^LOCAL_DISABLE_OMX := true$/;" m
+LOCAL_DISABLE_OMX vsoc_x86_64_only/phone/aosp_cf.mk /^LOCAL_DISABLE_OMX := true$/;" m
+LOCAL_DUMPSTATE_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_DUMPSTATE_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_FILE host/libs/config/fetcher_config.h /^ LOCAL_FILE,$/;" e enum:cuttlefish::FileSource
+LOCAL_GATEKEEPER_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_GATEKEEPER_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_HEALTH_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_HEALTH_PRODUCT_PACKAGE := \\$/;" m
+LOCAL_KEYMINT_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_KEYMINT_PRODUCT_PACKAGE := android.hardware.security.keymint-service.remote$/;" m
+LOCAL_LICENSE_CONDITIONS guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_LICENSE_CONDITIONS := notice$/;" m
+LOCAL_LICENSE_KINDS guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0$/;" m
+LOCAL_MODULE guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_MODULE := lib_driver_cmd_simulated_cf$/;" m
+LOCAL_PATH Android.mk /^LOCAL_PATH:= $(call my-dir)$/;" m
+LOCAL_PATH guest/Android.mk /^LOCAL_PATH:= $(call my-dir)$/;" m
+LOCAL_PATH guest/libs/Android.mk /^LOCAL_PATH:= $(call my-dir)$/;" m
+LOCAL_PATH guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_PATH := $(call my-dir)$/;" m
+LOCAL_PREFER_VENDOR_APEX vsoc_x86_64/phone/aosp_cf.mk /^LOCAL_PREFER_VENDOR_APEX := true$/;" m
+LOCAL_SENSOR_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_SENSOR_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_SENSOR_PRODUCT_PACKAGE shared/device.mk /^ LOCAL_SENSOR_PRODUCT_PACKAGE := com.android.hardware.sensors$/;" m
+LOCAL_SHARED_LIBRARIES guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_SHARED_LIBRARIES := libc libcutils$/;" m
+LOCAL_SRC_FILES guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_SRC_FILES := $(WPA_SRC_FILE)$/;" m
+LOCAL_VENDOR_MODULE guest/libs/wpa_supplicant_8_lib/Android.mk /^LOCAL_VENDOR_MODULE := true$/;" m
+LOCAL_VHAL_PRODUCT_PACKAGE shared/auto/device.mk /^ LOCAL_VHAL_PRODUCT_PACKAGE := [email protected]$/;" m
+LOCAL_WPA_SUPPLICANT_OVERLAY shared/device.mk /^LOCAL_WPA_SUPPLICANT_OVERLAY ?= $(LOCAL_PATH)\/config\/wpa_supplicant_overlay.conf$/;" m
+LOCK host/commands/modem_simulator/sim_service.h /^ LOCK = 1,$/;" e enum:cuttlefish::SimService::FacilityLock::Mode
+LOG_NDEBUG guest/hals/ril/reference-ril/atchannel.c /^#define LOG_NDEBUG /;" d file:
+LOG_TAG guest/hals/bt/remote/remote_bluetooth.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/bt/remote/service.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/cached_stream_buffer.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/external-service.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/vsock_camera_device_3_4.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/vsock_camera_device_session_3_4.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/vsock_camera_provider_2_7.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/vsock_camera_server.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/camera/vsock_frame_provider.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/gatekeeper/remote/service.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/health/health.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/keymint/remote/remote_keymint_device.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/keymint/remote/remote_keymint_operation.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/keymint/remote/remote_secure_clock.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/keymint/remote/remote_shared_secret.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/keymint/remote/service.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-libril/RilSapSocket.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-libril/ril.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-libril/ril_config.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-libril/ril_event.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-libril/ril_service.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-libril/sap_service.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-ril/atchannel.c /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/ril/reference-ril/reference-ril.c /^#define LOG_TAG /;" d file:
+LOG_TAG guest/hals/rild/rild_cuttlefish.c /^#define LOG_TAG /;" d file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^ private static final String LOG_TAG = "GceBluetoothChecker";$/;" f class:BluetoothChecker file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private static final String LOG_TAG = "GceConnChecker";$/;" f class:ConnectivityChecker file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String LOG_TAG = "GceEventReporter";$/;" f class:EventReporter file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java /^ private static final String LOG_TAG = "GceBroadcastReceiver";$/;" f class:GceBroadcastReceiver file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ private static final String LOG_TAG = "GceFuture";$/;" f class:GceFuture file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private static final String LOG_TAG = "GceService";$/;" f class:GceService file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private static final String LOG_TAG = "GceWifiManager";$/;" f class:GceWifiManager file:
+LOG_TAG guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ private static final String LOG_TAG = "GceExecutor";$/;" f class:JobExecutor file:
+LOG_TAG host/frontend/webrtc/connection_observer.cpp /^#define LOG_TAG /;" d file:
+LOG_TAG host/frontend/webrtc/lib/client_handler.cpp /^#define LOG_TAG /;" d file:
+LSeek common/libs/fs/shared_fd.cpp /^off_t FileInstance::LSeek(off_t offset, int whence) {$/;" f class:cuttlefish::FileInstance typeref:typename:off_t
+LTE guest/hals/ril/reference-ril/reference-ril.c /^#define LTE /;" d file:
+LTE_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_LTE_SignalStrength LTE_SignalStrength;$/;" m struct:__anon0bfbaecf5008 typeref:typename:RIL_LTE_SignalStrength
+LTE_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_LTE_SignalStrength_v8 LTE_SignalStrength;$/;" m struct:__anon0bfbaecf5108 typeref:typename:RIL_LTE_SignalStrength_v8
+LTE_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_LTE_SignalStrength_v8 LTE_SignalStrength;$/;" m struct:__anon0bfbaecf5208 typeref:typename:RIL_LTE_SignalStrength_v8
+LTE_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_LTE_SignalStrength_v8 LTE_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_LTE_SignalStrength_v8
+LabelConfMsg host/libs/confui/host_renderer.h /^ using LabelConfMsg = teeui::LabelBody;$/;" t class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::LabelBody
+LastModifiedTime host/commands/fetcher/build_api.h /^ unsigned long LastModifiedTime() const { return last_modified_time; }$/;" f class:cuttlefish::Artifact typeref:typename:unsigned long
+LastUpdatedInputDisk host/commands/assemble_cvd/disk_flags.cc /^static std::chrono::system_clock::time_point LastUpdatedInputDisk($/;" f namespace:cuttlefish typeref:typename:std::chrono::system_clock::time_point file:
+LatestBuildId host/commands/fetcher/build_api.cc /^std::string BuildApi::LatestBuildId(const std::string& branch,$/;" f class:cuttlefish::BuildApi typeref:typename:std::string
+Launch Viewer (WebRTC) README.md /^## Launch Viewer (WebRTC)$/;" s chapter:Cuttlefish Getting Started
+LaunchAdbComponent host/libs/config/adb/launch.cpp /^LaunchAdbComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<KernelLogPipeProvider,const AdbConfig,const CuttlefishConfig::InstanceSpecific>>
+LaunchConnectionMaintainerThread host/frontend/adb_connector/main.cpp /^void LaunchConnectionMaintainerThread(const std::string& address) {$/;" f namespace:__anona4a84cd70111 typeref:typename:void
+LaunchCustomActionServers host/commands/run_cvd/launch_streamer.cpp /^std::vector<Command> LaunchCustomActionServers($/;" f namespace:cuttlefish::__anon6b0274e10111 typeref:typename:std::vector<Command>
+LauncherAction host/commands/run_cvd/runner_defs.h /^enum class LauncherAction : char {$/;" g namespace:cuttlefish typeref:typename:char
+LauncherResponse host/commands/run_cvd/runner_defs.h /^enum class LauncherResponse : char {$/;" g namespace:cuttlefish typeref:typename:char
+LibraryCloser host/libs/graphics_detector/graphics_detector.cpp /^struct LibraryCloser {$/;" s namespace:cuttlefish::__anon29a199ff0111 file:
+LinkAtCwd common/libs/fs/shared_fd.cpp /^int FileInstance::LinkAtCwd(const std::string& path) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+LinkTapToBridge host/libs/allocd/alloc_utils.cpp /^bool LinkTapToBridge(const std::string& tap_name,$/;" f namespace:cuttlefish typeref:typename:bool
+LinuxVersionAtLeast host/libs/vm_manager/host_configuration.cpp /^bool LinuxVersionAtLeast(std::vector<std::string>* config_commands,$/;" f namespace:cuttlefish::vm_manager::__anon1edaaabd0111 typeref:typename:bool
+ListDeviceIds host/frontend/webrtc_operator/device_registry.cpp /^std::vector<std::string> DeviceRegistry::ListDeviceIds() const {$/;" f class:cuttlefish::DeviceRegistry typeref:typename:std::vector<std::string>
+Listen common/libs/fs/shared_fd.cpp /^int FileInstance::Listen(int backlog) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+ListenerState guest/hals/confirmationui/TrustyConfirmationUI.h /^ using ListenerState = GuestSession::ListenerState;$/;" t class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:GuestSession::ListenerState
+ListenerState guest/hals/confirmationui/guest_session.h /^ enum class ListenerState : uint32_t {$/;" g class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:uint32_t
+LoadFragment host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::LoadFragment(ConfigFragment& fragment) const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+LoadFromFile host/commands/modem_simulator/nvram_config.cpp /^bool NvramConfig::LoadFromFile(const char* file) {$/;" f class:cuttlefish::NvramConfig typeref:typename:bool
+LoadFromFile host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::LoadFromFile(const char* file) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+LoadFromFile host/libs/config/fetcher_config.cpp /^bool FetcherConfig::LoadFromFile(const std::string& file) {$/;" f class:cuttlefish::FetcherConfig typeref:typename:bool
+LoadKey host/commands/secure_env/encrypted_serializable.cpp /^static TpmObjectSlot LoadKey($/;" f namespace:cuttlefish typeref:typename:TpmObjectSlot file:
+LoadNvramConfig host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::LoadNvramConfig() {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+LocalRecorder host/frontend/webrtc/lib/local_recorder.cpp /^LocalRecorder::LocalRecorder(std::unique_ptr<LocalRecorder::Impl> impl)$/;" f class:cuttlefish::webrtc_streaming::LocalRecorder
+LocalRecorder host/frontend/webrtc/lib/local_recorder.h /^class LocalRecorder {$/;" c namespace:cuttlefish::webrtc_streaming
+LockStatus host/commands/modem_simulator/sim_service.h /^ enum LockStatus {$/;" g struct:cuttlefish::SimService::FacilityLock
+LockType host/commands/modem_simulator/sim_service.h /^ enum LockType {$/;" g struct:cuttlefish::SimService::FacilityLock
+Log common/libs/fs/shared_fd.cpp /^void FileInstance::Log(const char* message) {$/;" f class:cuttlefish::FileInstance typeref:typename:void
+Log common/libs/fs/shared_fd.cpp /^void FileInstance::Log(const char*) {}$/;" f class:cuttlefish::FileInstance typeref:typename:void
+LogAndReplyError host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::LogAndReplyError(const std::string &error_msg) const {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+LogAndReplyError host/frontend/webrtc_operator/signal_handler.cpp /^void SignalHandler::LogAndReplyError(const std::string& error_message) {$/;" f class:cuttlefish::SignalHandler typeref:typename:void
+LogAndSetEnv host/libs/vm_manager/qemu_manager.cpp /^void LogAndSetEnv(const char* key, const std::string& value) {$/;" f namespace:cuttlefish::vm_manager::__anonb2b4da3a0111 typeref:typename:void
+LogEvent host/commands/metrics/proto/clientanalytics.proto /^message LogEvent {$/;" m
+LogFileSeverity common/libs/utils/tee_logging.cpp /^LogSeverity LogFileSeverity() {$/;" f namespace:cuttlefish typeref:typename:LogSeverity
+LogRequest host/commands/metrics/proto/clientanalytics.proto /^message LogRequest {$/;" m
+LogResponse host/commands/metrics/proto/clientanalytics.proto /^message LogResponse {$/;" m
+LogSubprocessExit host/commands/run_cvd/process_monitor.cc /^static void LogSubprocessExit(const std::string& name, pid_t pid, int wstatus) {$/;" f namespace:cuttlefish typeref:typename:void file:
+LogToFiles common/libs/utils/tee_logging.cpp /^TeeLogger LogToFiles(const std::vector<std::string>& files) {$/;" f namespace:cuttlefish typeref:typename:TeeLogger
+LogToStderrAndFiles common/libs/utils/tee_logging.cpp /^TeeLogger LogToStderrAndFiles(const std::vector<std::string>& files) {$/;" f namespace:cuttlefish typeref:typename:TeeLogger
+LogcatReceiver host/commands/run_cvd/launch.cc /^class LogcatReceiver : public CommandSource, public DiagnosticInformation {$/;" c namespace:cuttlefish file:
+LogcatReceiverBinary host/libs/config/known_paths.cpp /^std::string LogcatReceiverBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+LogicalChannel host/commands/modem_simulator/sim_service.h /^ LogicalChannel(int session_id) :$/;" f struct:cuttlefish::SimService::LogicalChannel
+LogicalChannel host/commands/modem_simulator/sim_service.h /^ struct LogicalChannel {$/;" s class:cuttlefish::SimService
+LookupInfo tools/tombstone_to_line.py /^LookupInfo = collections.namedtuple('LookupInfo',$/;" v
+Loop host/frontend/webrtc/audio_handler.cpp /^[[noreturn]] void AudioHandler::Loop() {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+Loop host/frontend/webrtc/display_handler.cpp /^[[noreturn]] void DisplayHandler::Loop() {$/;" f class:cuttlefish::DisplayHandler typeref:typename:void
+LwsCallback host/frontend/webrtc/lib/ws_connection.cpp /^int LwsCallback(struct lws* wsi, enum lws_callback_reasons reason, void* user,$/;" f typeref:typename:int
+MALFORMED host/libs/confui/cbor.h /^ MALFORMED = 2,$/;" e enum:cuttlefish::confui::Cbor::Error
+MALFORMED_UTF8 host/libs/confui/cbor.h /^ MALFORMED_UTF8 = 3,$/;" e enum:cuttlefish::confui::Cbor::Error
+MAP host/libs/confui/cbor.h /^ MAP = 5,$/;" e enum:cuttlefish::confui::Cbor::Type
+MATCH_TPM_COMMAND host/commands/secure_env/tpm_commands.cpp /^ #define MATCH_TPM_COMMAND(/;" d file:
+MAX host/libs/confui/cbor.h /^ enum class MessageSize : uint32_t { MAX = 6144u };$/;" e enum:cuttlefish::confui::Cbor::MessageSize
+MAX_AT_RESPONSE guest/hals/ril/reference-ril/atchannel.c /^#define MAX_AT_RESPONSE /;" d file:
+MAX_AT_RESPONSE guest/hals/ril/reference-ril/reference-ril.c /^#define MAX_AT_RESPONSE /;" d file:
+MAX_BANDS guest/hals/ril/reference-libril/ril.h /^#define MAX_BANDS /;" d
+MAX_BROADCAST_SMS_CONFIG_INFO guest/hals/ril/reference-libril/ril.h /^#define MAX_BROADCAST_SMS_CONFIG_INFO /;" d
+MAX_CHANNELS guest/hals/ril/reference-libril/ril.h /^#define MAX_CHANNELS /;" d
+MAX_CLIENT_ID_LENGTH guest/hals/ril/reference-libril/ril.h /^#define MAX_CLIENT_ID_LENGTH /;" d
+MAX_COMMAND_BYTES guest/hals/ril/reference-libril/ril.cpp /^#define MAX_COMMAND_BYTES /;" d file:
+MAX_DEBUG_SOCKET_NAME_LENGTH guest/hals/ril/reference-libril/ril.h /^#define MAX_DEBUG_SOCKET_NAME_LENGTH /;" d
+MAX_FD_EVENTS guest/hals/ril/reference-libril/ril_event.h /^#define MAX_FD_EVENTS /;" d
+MAX_HANDLE_ATTEMPTS host/commands/secure_env/fragile_tpm_storage.cpp /^static constexpr size_t MAX_HANDLE_ATTEMPTS = 1;$/;" v namespace:cuttlefish typeref:typename:size_t file:
+MAX_INADDR_LEN guest/hals/ril/reference-libril/ril.h /^#define MAX_INADDR_LEN /;" d
+MAX_LIB_ARGS guest/hals/rild/rild_cuttlefish.c /^#define MAX_LIB_ARGS /;" d file:
+MAX_LOGICAL_MODEM_NUM guest/hals/ril/reference-libril/ril.h /^#define MAX_LOGICAL_MODEM_NUM /;" d
+MAX_PDP guest/hals/ril/reference-ril/reference-ril.c /^#define MAX_PDP /;" d file:
+MAX_POLL_DISABLED_WIFI_COUNT tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private static final int MAX_POLL_DISABLED_WIFI_COUNT = 10;$/;" f class:RilE2eTests file:
+MAX_QEMU_PIPE_NAME_LENGTH guest/hals/ril/reference-libril/ril.h /^#define MAX_QEMU_PIPE_NAME_LENGTH /;" d
+MAX_RADIO_ACCESS_NETWORKS guest/hals/ril/reference-libril/ril.h /^#define MAX_RADIO_ACCESS_NETWORKS /;" d
+MAX_RILDS guest/hals/ril/reference-libril/ril.h /^#define MAX_RILDS /;" d
+MAX_SERVICE_NAME_LENGTH guest/hals/ril/reference-libril/ril.h /^#define MAX_SERVICE_NAME_LENGTH /;" d
+MAX_STIR_RANDOM_BUFFER_SIZE host/commands/secure_env/tpm_random_source.cpp /^static int MAX_STIR_RANDOM_BUFFER_SIZE = 128;$/;" v namespace:cuttlefish typeref:typename:int file:
+MAX_STRING_LENGTH guest/hals/ril/reference-libril/ril_service.cpp /^#define MAX_STRING_LENGTH /;" d file:
+MAX_UINT_32_CHARS host/commands/secure_env/soft_gatekeeper.h /^ static const int MAX_UINT_32_CHARS = 11;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:const int
+MAX_UUID_LENGTH guest/hals/ril/reference-libril/ril.h /^#define MAX_UUID_LENGTH /;" d
+MDM_CDMA guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_CDMA /;" d file:
+MDM_EVDO guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_EVDO /;" d file:
+MDM_GSM guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_GSM /;" d file:
+MDM_LTE guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_LTE /;" d file:
+MDM_NR guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_NR /;" d file:
+MDM_TDSCDMA guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_TDSCDMA /;" d file:
+MDM_WCDMA guest/hals/ril/reference-ril/reference-ril.c /^#define MDM_WCDMA /;" d file:
+MEMSET_FREED guest/hals/ril/reference-libril/ril.cpp /^#define MEMSET_FREED /;" d file:
+MESSAGE_SIZE host/example_custom_actions/main.cpp /^#define MESSAGE_SIZE /;" d file:
+MF_SIM host/commands/modem_simulator/sim_service.cpp /^static const std::string MF_SIM = "3F00";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+MIN guest/hals/ril/reference-libril/ril_internal.h /^#define MIN(/;" d
+MMap common/libs/fs/shared_fd.cpp /^ScopedMMap FileInstance::MMap(void* addr, size_t length, int prot, int flags,$/;" f class:cuttlefish::FileInstance typeref:typename:ScopedMMap
+MOBILE_NETWORK_CONNECTED_MESSAGE guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private static final String MOBILE_NETWORK_CONNECTED_MESSAGE =$/;" f class:ConnectivityChecker file:
+MULTILINE guest/hals/ril/reference-ril/atchannel.h /^ MULTILINE \/* multiple line intermediate response$/;" e enum:__anon512a2c1f0103
+MUTEX_ACQUIRE guest/hals/ril/reference-libril/ril_event.cpp /^#define MUTEX_ACQUIRE(/;" d file:
+MUTEX_DESTROY guest/hals/ril/reference-libril/ril_event.cpp /^#define MUTEX_DESTROY(/;" d file:
+MUTEX_INIT guest/hals/ril/reference-libril/ril_event.cpp /^#define MUTEX_INIT(/;" d file:
+MUTEX_RELEASE guest/hals/ril/reference-libril/ril_event.cpp /^#define MUTEX_RELEASE(/;" d file:
+M_MODEM_TECH_CDMA host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_CDMA = 1 << 2,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+M_MODEM_TECH_EVDO host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_EVDO = 1 << 3,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+M_MODEM_TECH_GSM host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_GSM = 1 << 0,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+M_MODEM_TECH_LTE host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_LTE = 1 << 5,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+M_MODEM_TECH_NR host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_NR = 1 << 6,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+M_MODEM_TECH_TDSCDMA host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_TDSCDMA= 1 << 4,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+M_MODEM_TECH_WCDMA host/commands/modem_simulator/network_service.h /^ M_MODEM_TECH_WCDMA = 1 << 1,$/;" e enum:cuttlefish::NetworkService::ModemTechnology
+MainLoop host/libs/confui/host_server.cc /^[[noreturn]] void HostServer::MainLoop() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+MainLoopState host/libs/confui/server_common.h /^enum class MainLoopState : std::uint32_t {$/;" g namespace:cuttlefish::confui typeref:typename:std::uint32_t
+MakeAddress common/libs/fs/shared_fd.cpp /^static void MakeAddress(const char* name, bool abstract,$/;" f namespace:cuttlefish typeref:typename:void file:
+MakeCompositeDiskSpec host/libs/image_aggregator/image_aggregator.cc /^ CompositeDisk MakeCompositeDiskSpec(const std::string& header_file,$/;" f class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:CompositeDisk file:
+MakeConnectMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string MakeConnectMessage(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+MakeDisconnectMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string MakeDisconnectMessage(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+MakeDynamicFlag host/commands/start/flag_forwarder.cc /^std::unique_ptr<SubprocessFlag> MakeDynamicFlag($/;" f namespace:__anon4552bec90111 typeref:typename:std::unique_ptr<SubprocessFlag>
+MakeFileExecutable common/libs/utils/files.cpp /^bool MakeFileExecutable(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:bool
+MakeMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string MakeMessage(const std::string& user_message) {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+MakeName guest/hals/confirmationui/guest_session.h /^ std::string MakeName(const std::uint32_t i) const {$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::string
+MakeShellUptimeMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string MakeShellUptimeMessage() {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+MakeSizeHeader common/libs/confui/packet.h /^std::vector<int> MakeSizeHeader(Args&&... args) {$/;" f namespace:cuttlefish::confui::packet::impl typeref:typename:std::vector<int>
+MakeTransportMessage host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string MakeTransportMessage(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+MakeVbParams host/commands/secure_env/tpm_attestation_record.cpp /^VerifiedBootParams MakeVbParams() {$/;" f namespace:cuttlefish::__anon03bde2800111 typeref:typename:VerifiedBootParams
+ManagedGatekeeperMessage common/libs/security/gatekeeper_channel.h /^using ManagedGatekeeperMessage =$/;" t namespace:cuttlefish typeref:typename:std::unique_ptr<GatekeeperRawMessage,GatekeeperCommandDestroyer>
+ManagedKeymasterMessage common/libs/security/keymaster_channel.h /^using ManagedKeymasterMessage =$/;" t namespace:cuttlefish typeref:typename:std::unique_ptr<keymaster_message,KeymasterCommandDestroyer>
+ManagedLibrary host/libs/graphics_detector/graphics_detector.cpp /^using ManagedLibrary = std::unique_ptr<void, LibraryCloser>;$/;" t namespace:cuttlefish::__anon29a199ff0111 typeref:typename:std::unique_ptr<void,LibraryCloser> file:
+MarkAll common/libs/fs/shared_fd.cpp /^void MarkAll(const SharedFDSet& input, fd_set* dest, int* max_index) {$/;" f namespace:cuttlefish::__anond70c3a4f0111 typeref:typename:void
+MarkReplied host/libs/audio_connector/commands.h /^ void MarkReplied(AudioStatus status) { status_ = status; }$/;" f class:cuttlefish::AudioCommand typeref:typename:void
+MarshalFn host/commands/secure_env/tpm_serialize.cpp /^int MarshalFn = 0; \/\/ Break code without an explicit specialization.$/;" v namespace:cuttlefish typeref:typename:int
+MasterBootRecord host/libs/config/mbr.h /^struct __attribute__((packed)) MasterBootRecord {$/;" s
+MatchMode host/commands/modem_simulator/modem_service.h /^ enum MatchMode {FULL_MATCH = 0, PARTIAL_MATCH = 1};$/;" g class:cuttlefish::CommandHandler
+MaxMicrophoneVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MaxMicrophoneVolume(uint32_t* maxVolume) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MaxSpeakerVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MaxSpeakerVolume(uint32_t* maxVolume) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MaybeWriteNotification host/commands/run_cvd/boot_state_machine.cc /^ bool MaybeWriteNotification() {$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:bool file:
+MbrPartitionEntry host/libs/config/mbr.h /^struct __attribute__((packed)) MbrPartitionEntry {$/;" s
+Md5 host/commands/fetcher/build_api.h /^ const std::string& Md5() const { return md5; }$/;" f class:cuttlefish::Artifact typeref:typename:const std::string &
+MediaCodecs shared/config/media_codecs.xml /^<!DOCTYPE MediaCodecs [$/;" r
+MediaSettings shared/config/media_profiles.xml /^<!DOCTYPE MediaSettings [$/;" r
+MemfdCreate common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::MemfdCreate(const std::string& name, unsigned int flags) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+Message common/libs/utils/tcp_socket.h /^using Message = std::vector<std::uint8_t>;$/;" t namespace:cuttlefish typeref:typename:std::vector<std::uint8_t>
+MessageSize host/libs/confui/cbor.h /^ enum class MessageSize : uint32_t { MAX = 6144u };$/;" g class:cuttlefish::confui::Cbor typeref:typename:uint32_t
+MetadataLevel common/libs/utils/tee_logging.h /^enum class MetadataLevel {$/;" g namespace:cuttlefish
+MethodNotAllowed host/libs/websocket/websocket_handler.h /^ MethodNotAllowed = 405,$/;" e enum:cuttlefish::HttpStatusCode
+MetricsBinary host/libs/config/known_paths.cpp /^std::string MetricsBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+MetricsEvent host/commands/metrics/proto/cf_metrics_event.proto /^message MetricsEvent {$/;" m package:cuttlefish
+MetricsExitCodes host/commands/metrics/metrics_defs.h /^enum MetricsExitCodes : int {$/;" g namespace:cuttlefish typeref:typename:int
+MetricsService host/commands/run_cvd/launch.cc /^class MetricsService : public CommandSource {$/;" c namespace:cuttlefish file:
+MicrophoneIsInitialized host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::MicrophoneIsInitialized() const { return true; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+MicrophoneMute host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MicrophoneMute(bool* enabled) const { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MicrophoneMuteIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MicrophoneMuteIsAvailable(bool* available) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MicrophoneVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MicrophoneVolume(uint32_t* volume) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MicrophoneVolumeIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MicrophoneVolumeIsAvailable(bool* available) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MinMicrophoneVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MinMicrophoneVolume(uint32_t* minVolume) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MinSpeakerVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::MinSpeakerVolume(uint32_t* minVolume) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+MiscImagePath host/libs/config/data_image.h /^class MiscImagePath {$/;" c namespace:cuttlefish
+MiscImageTag host/libs/config/data_image.cpp /^struct MiscImageTag {};$/;" s namespace:cuttlefish file:
+MiscInfo host/commands/assemble_cvd/misc_info.h /^using MiscInfo = std::map<std::string, std::string>;$/;" t namespace:cuttlefish typeref:typename:std::map<std::string,std::string>
+MiscService host/commands/modem_simulator/misc_service.cpp /^MiscService::MiscService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::MiscService
+MiscService host/commands/modem_simulator/misc_service.h /^class MiscService : public ModemService, public std::enable_shared_from_this<MiscService> {$/;" c namespace:cuttlefish
+Mkstemp common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Mkstemp(std::string* path) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+MobileGatewayName host/libs/allocd/alloc_utils.cpp /^std::string MobileGatewayName(const std::string& ipaddr, uint16_t id) {$/;" f namespace:cuttlefish typeref:typename:std::string
+MobileIface host/libs/allocd/resource.h /^ MobileIface(const std::string& name, uid_t uid, uint16_t iface_id,$/;" f class:cuttlefish::MobileIface
+MobileIface host/libs/allocd/resource.h /^ MobileIface,$/;" e enum:cuttlefish::ResourceType
+MobileIface host/libs/allocd/resource.h /^class MobileIface : public StaticResource {$/;" c namespace:cuttlefish
+MobileNetworkConnected host/commands/kernel_log_monitor/kernel_log_server.h /^ MobileNetworkConnected = 4,$/;" e enum:monitor::Event
+MobileNetworkName host/libs/allocd/alloc_utils.cpp /^std::string MobileNetworkName(const std::string& ipaddr,$/;" f namespace:cuttlefish typeref:typename:std::string
+Mode host/commands/modem_simulator/sim_service.h /^ enum Mode {$/;" g struct:cuttlefish::SimService::FacilityLock
+Mode shared/config/cgroups.json /^ "Mode": "0755",$/;" s object:Cgroups.0
+ModeEnabled host/libs/config/adb/launch.cpp /^ bool ModeEnabled(const AdbMode& mode) const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:bool file:
+ModeType host/libs/confui/host_mode_ctrl.h /^ enum class ModeType : std::uint8_t { kAndroidMode = 55, kConfUI_Mode = 77 };$/;" g class:cuttlefish::HostModeCtrl typeref:typename:std::uint8_t
+ModeType host/libs/screen_connector/screen_connector_ctrl.h /^ enum class ModeType {$/;" g class:cuttlefish::ScreenConnectorCtrl
+ModemInfo guest/hals/ril/reference-ril/reference-ril.c /^} ModemInfo;$/;" t typeref:struct:__anon70d7df6f0108 file:
+ModemService host/commands/modem_simulator/modem_service.cpp /^ModemService::ModemService(int32_t service_id,$/;" f class:cuttlefish::ModemService
+ModemService host/commands/modem_simulator/modem_service.h /^class ModemService {$/;" c namespace:cuttlefish
+ModemServiceTest host/commands/modem_simulator/unittest/service_test.cpp /^class ModemServiceTest : public ::testing::Test {$/;" c file:
+ModemServiceType host/commands/modem_simulator/modem_service.h /^enum ModemServiceType : int {$/;" g namespace:cuttlefish typeref:typename:int
+ModemSimulator host/commands/modem_simulator/modem_simulator.cpp /^ModemSimulator::ModemSimulator(int32_t modem_id)$/;" f class:cuttlefish::ModemSimulator
+ModemSimulator host/commands/modem_simulator/modem_simulator.h /^class ModemSimulator {$/;" c namespace:cuttlefish
+ModemSimulator host/commands/run_cvd/launch_modem.cpp /^class ModemSimulator : public CommandSource {$/;" c namespace:cuttlefish file:
+ModemSimulatorBinary host/libs/config/known_paths.cpp /^std::string ModemSimulatorBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+ModemSimulatorExitCodes host/commands/modem_simulator/channel_monitor.h /^enum ModemSimulatorExitCodes : int {$/;" g namespace:cuttlefish typeref:typename:int
+ModemTechnology host/commands/modem_simulator/network_service.h /^ enum ModemTechnology {$/;" g class:cuttlefish::NetworkService
+Modes host/libs/config/adb/data.cpp /^ const std::set<AdbMode>& Modes() const override { return modes_; }$/;" f class:cuttlefish::AdbConfigImpl typeref:typename:const std::set<AdbMode> & file:
+ModuleBase build/cvd-host-package.go /^ android.ModuleBase$/;" M struct:cuttlefish.cvdHostPackage typeref:typename:android.ModuleBase
+MonitorEntry host/commands/run_cvd/process_monitor.h /^struct MonitorEntry {$/;" s namespace:cuttlefish
+MonitorLoop host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::MonitorLoop() {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+MonitorRoutine host/commands/run_cvd/process_monitor.cc /^bool ProcessMonitor::MonitorRoutine() {$/;" f class:cuttlefish::ProcessMonitor typeref:typename:bool
+MonitorWifiJob guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public MonitorWifiJob() {$/;" m class:GceWifiManager.MonitorWifiJob
+MonitorWifiJob guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private class MonitorWifiJob extends JobBase {$/;" c class:GceWifiManager
+Multi host/commands/run_cvd/launch.cc /^ using Multi = Multibindings<InternalDeps>;$/;" t function:cuttlefish::launchComponent typeref:typename:Multibindings<InternalDeps> file:
+Multibindings host/libs/config/inject.h /^struct Multibindings {$/;" s namespace:cuttlefish
+MultipleImagePartition host/libs/image_aggregator/image_aggregator.h /^struct MultipleImagePartition {$/;" s namespace:cuttlefish
+Multiplexer common/libs/concurrency/multiplexer.h /^ Multiplexer() : sem_items_{0} {}$/;" f class:cuttlefish::Multiplexer
+Multiplexer common/libs/concurrency/multiplexer.h /^class Multiplexer {$/;" c namespace:cuttlefish
+Multiplexer host/libs/confui/host_server.h /^ using Multiplexer =$/;" t class:cuttlefish::confui::HostServer typeref:typename:Multiplexer<std::unique_ptr<ConfUiMessage>,ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>>
+Multiplexer host/libs/screen_connector/screen_connector_multiplexer.h /^ using Multiplexer = Multiplexer<ProcessedFrameType, Queue>;$/;" t class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:Multiplexer<ProcessedFrameType,Queue>
+MutableInstanceSpecific host/libs/config/cuttlefish_config.h /^ MutableInstanceSpecific(CuttlefishConfig* config, const std::string& id)$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific
+MutableInstanceSpecific host/libs/config/cuttlefish_config.h /^ class MutableInstanceSpecific {$/;" c class:cuttlefish::CuttlefishConfig
+N host/commands/secure_env/soft_gatekeeper.h /^ static const uint64_t N = 16384;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:const uint64_t
+NATT_IPV4 guest/hals/ril/reference-libril/ril.h /^ NATT_IPV4 = 0, \/* Keepalive specified by RFC 3948 Sec. 2.3 using IPv4 *\/$/;" e enum:__anon0bfbaecfc403
+NATT_IPV6 guest/hals/ril/reference-libril/ril.h /^ NATT_IPV6 = 1 \/* Keepalive specified by RFC 3948 Sec. 2.3 using IPv6 *\/$/;" e enum:__anon0bfbaecfc403
+NEGATIVE host/libs/confui/cbor.h /^ NEGATIVE = 1,$/;" e enum:cuttlefish::confui::Cbor::Type
+NET_REGISTRATION_DENIED host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_DENIED = 3,$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NET_REGISTRATION_EMERGENCY host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_EMERGENCY = 8$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NET_REGISTRATION_HOME host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_HOME = 1,$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NET_REGISTRATION_ROAMING host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_ROAMING = 5,$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NET_REGISTRATION_SEARCHING host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_SEARCHING = 2,$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NET_REGISTRATION_UNKNOWN host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_UNKNOWN = 4,$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NET_REGISTRATION_UNREGISTERED host/commands/modem_simulator/network_service.h /^ NET_REGISTRATION_UNREGISTERED = 0,$/;" e enum:cuttlefish::NetworkService::RegistrationState
+NGRAN guest/hals/ril/reference-libril/ril.h /^ NGRAN = 0x04, \/\/ Next-Generation Radio Access Network$/;" e enum:__anon0bfbaecfa503
+NGRAN_BAND_1 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_1 = 1,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_12 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_12 = 12,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_2 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_2 = 2,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_20 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_20 = 20,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_25 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_25 = 25,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_257 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_257 = 257,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_258 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_258 = 258,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_260 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_260 = 260,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_261 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_261 = 261,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_28 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_28 = 28,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_3 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_3 = 3,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_34 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_34 = 34,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_38 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_38 = 38,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_39 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_39 = 39,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_40 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_40 = 40,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_41 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_41 = 41,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_5 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_5 = 5,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_50 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_50 = 50,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_51 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_51 = 51,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_66 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_66 = 66,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_7 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_7 = 7,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_70 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_70 = 70,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_71 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_71 = 71,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_74 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_74 = 74,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_75 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_75 = 75,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_76 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_76 = 76,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_77 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_77 = 77,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_78 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_78 = 78,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_79 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_79 = 79,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_8 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_8 = 8,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_80 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_80 = 80,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_81 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_81 = 81,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_82 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_82 = 82,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_83 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_83 = 83,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_84 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_84 = 84,$/;" e enum:__anon0bfbaecfaa03
+NGRAN_BAND_86 guest/hals/ril/reference-libril/ril.h /^ NGRAN_BAND_86 = 86,$/;" e enum:__anon0bfbaecfaa03
+NOTIFICATION_CHANNEL_ID guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private static final String NOTIFICATION_CHANNEL_ID = "cuttlefish-service";$/;" f class:GceService file:
+NOTIFICATION_CHANNEL_NAME guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private static final String NOTIFICATION_CHANNEL_NAME = "Cuttlefish Service";$/;" f class:GceService file:
+NOTIFICATION_ID guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private static final int NOTIFICATION_ID = 1;$/;" f class:GceService file:
+NOT_SET host/libs/audio_connector/shm_layout.h /^ NOT_SET = static_cast<uint32_t>(-1),$/;" e enum:cuttlefish::AudioStatus
+NO_ACTIVE host/commands/modem_simulator/data_service.h /^ enum CidState {ACTIVE, NO_ACTIVE};$/;" e enum:cuttlefish::DataService::PDPContext::CidState
+NO_MULTISIM_POLICY guest/hals/ril/reference-libril/ril.h /^ NO_MULTISIM_POLICY = 0, \/* configuration applies to each slot independently. *\/$/;" e enum:__anon0bfbaecf2803
+NO_RESULT guest/hals/ril/reference-ril/atchannel.h /^ NO_RESULT, \/* no intermediate response expected *\/$/;" e enum:__anon512a2c1f0103
+NO_THREAD_SAFETY_ANALYSIS common/libs/concurrency/thread_annotations.h /^#define NO_THREAD_SAFETY_ANALYSIS /;" d
+NR guest/hals/ril/reference-ril/reference-ril.c /^#define NR /;" d file:
+NR_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_NR_SignalStrength NR_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_NR_SignalStrength
+NS_PER_S guest/hals/ril/reference-ril/atchannel.c /^#define NS_PER_S /;" d file:
+NUMBER host/libs/confui/cbor.h /^ NUMBER = 0,$/;" e enum:cuttlefish::confui::Cbor::Type
+NUMERIC guest/hals/ril/reference-ril/atchannel.h /^ NUMERIC, \/* a single intermediate response starting with a 0-9 *\/$/;" e enum:__anon512a2c1f0103
+NUM_CHMAPS host/frontend/webrtc/audio_handler.cpp /^constexpr uint32_t NUM_CHMAPS = sizeof(CHMAPS) \/ sizeof(CHMAPS[0]);$/;" v namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:uint32_t
+NUM_ELEMS guest/hals/ril/reference-libril/ril.cpp /^#define NUM_ELEMS(/;" d file:
+NUM_ELEMS guest/hals/ril/reference-ril/atchannel.c /^#define NUM_ELEMS(/;" d file:
+NUM_ELEMS_SOCKET guest/hals/ril/reference-libril/ril_ex.h /^#define NUM_ELEMS_SOCKET(/;" d
+NUM_JACKS host/frontend/webrtc/audio_handler.cpp /^constexpr uint32_t NUM_JACKS = sizeof(JACKS) \/ sizeof(JACKS[0]);$/;" v namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:uint32_t
+NUM_SERVICE_CLASSES guest/hals/ril/reference-libril/ril.h /^#define NUM_SERVICE_CLASSES /;" d
+NUM_STREAMS host/frontend/webrtc/audio_handler.cpp /^constexpr uint32_t NUM_STREAMS = sizeof(STREAMS) \/ sizeof(STREAMS[0]);$/;" v namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:uint32_t
+NUM_TOMBSTONES_IN_TEST tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private static final int NUM_TOMBSTONES_IN_TEST = 1000;$/;" f class:TombstoneTransmitTest file:
+NUM_TOMBSTONES_PER_LOOP tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private static final int NUM_TOMBSTONES_PER_LOOP = 500;$/;" f class:TombstoneTransmitTest file:
+Name common/libs/net/network_interface.h /^ const std::string& Name() const {$/;" f class:cuttlefish::NetworkInterface typeref:typename:const std::string &
+Name host/commands/assemble_cvd/disk_flags.cc /^ std::string Name() const override { return "BootImageRepacker"; }$/;" f class:cuttlefish::BootImageRepacker typeref:typename:std::string file:
+Name host/commands/assemble_cvd/disk_flags.cc /^ std::string Name() const override { return "InitializeAccessKregistryImage"; }$/;" f class:cuttlefish::InitializeAccessKregistryImage typeref:typename:std::string file:
+Name host/commands/assemble_cvd/disk_flags.cc /^ std::string Name() const override { return "InitializeMetadataImage"; }$/;" f class:cuttlefish::InitializeMetadataImage typeref:typename:std::string file:
+Name host/commands/assemble_cvd/flag_feature.cpp /^ std::string Name() const override { return "ParseGflags"; }$/;" f class:cuttlefish::ParseGflagsImpl typeref:typename:std::string file:
+Name host/commands/fetcher/build_api.h /^ const std::string& Name() const { return name; }$/;" f class:cuttlefish::Artifact typeref:typename:const std::string &
+Name host/commands/run_cvd/boot_state_machine.cc /^ std::string Name() const override { return "CvdBootStateMachine"; }$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:std::string file:
+Name host/commands/run_cvd/boot_state_machine.cc /^ std::string Name() const override { return "ProcessLeader"; }$/;" f class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "BluetoothConnector"; }$/;" f class:cuttlefish::BluetoothConnector typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "ConfigServer"; }$/;" f class:cuttlefish::ConfigServer typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "ConsoleForwarder"; }$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "GnssGrpcProxyServer"; }$/;" f class:cuttlefish::GnssGrpcProxyServer typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "KernelLogMonitor"; }$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "LogcatReceiver"; }$/;" f class:cuttlefish::LogcatReceiver typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "MetricsService"; }$/;" f class:cuttlefish::MetricsService typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "OpenWrt"; }$/;" f class:cuttlefish::OpenWrt typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "RootCanal"; }$/;" f class:cuttlefish::RootCanal typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "SecureEnvironment"; }$/;" f class:cuttlefish::SecureEnvironment typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "TombstoneReceiver"; }$/;" f class:cuttlefish::TombstoneReceiver typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "VehicleHalServer"; }$/;" f class:cuttlefish::VehicleHalServer typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "VirtualMachineManager"; }$/;" f class:cuttlefish::VmmCommands typeref:typename:std::string file:
+Name host/commands/run_cvd/launch.cc /^ std::string Name() const override { return "WmediumdServer"; }$/;" f class:cuttlefish::WmediumdServer typeref:typename:std::string file:
+Name host/commands/run_cvd/launch_modem.cpp /^ std::string Name() const override { return "ModemSimulator"; }$/;" f class:cuttlefish::ModemSimulator typeref:typename:std::string file:
+Name host/commands/run_cvd/launch_streamer.cpp /^ std::string Name() const override { return "StreamerSockets"; }$/;" f class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:std::string file:
+Name host/commands/run_cvd/launch_streamer.cpp /^ std::string Name() const override { return "WebRtcServer"; }$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:std::string file:
+Name host/commands/run_cvd/main.cc /^ std::string Name() const override { return "CuttlefishEnvironment"; }$/;" f class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:std::string file:
+Name host/commands/run_cvd/server_loop.cpp /^ std::string Name() const override { return "ServerLoop"; }$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:std::string file:
+Name host/commands/run_cvd/validate.cpp /^ std::string Name() const override { return "ValidateHostConfiguration"; }$/;" f class:cuttlefish::__anon8d12954e0111::ValidateHostConfigurationFeature typeref:typename:std::string file:
+Name host/commands/run_cvd/validate.cpp /^ std::string Name() const override { return "ValidateTapDevices"; }$/;" f class:cuttlefish::__anon8d12954e0111::ValidateTapDevices typeref:typename:std::string file:
+Name host/commands/start/flag_forwarder.cc /^ const std::string& Name() const { return name_; }$/;" f class:SubprocessFlag typeref:typename:const std::string & file:
+Name host/libs/config/adb/config.cpp /^ std::string Name() const override { return "AdbConfigFragmentImpl"; }$/;" f class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl typeref:typename:std::string file:
+Name host/libs/config/adb/flags.cpp /^ std::string Name() const override { return "AdbConfigFlagImpl"; }$/;" f class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:std::string file:
+Name host/libs/config/adb/launch.cpp /^ std::string Name() const override { return "AdbConnector"; }$/;" f class:cuttlefish::__anon7ea6a0320111::AdbConnector typeref:typename:std::string file:
+Name host/libs/config/adb/launch.cpp /^ std::string Name() const override { return "SocketVsockProxy"; }$/;" f class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:std::string file:
+Name host/libs/config/config_flag.cpp /^ std::string Name() const override { return "ConfigFlagImpl"; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:std::string file:
+Name host/libs/config/config_flag.cpp /^ std::string Name() const override { return "ConfigFlagPlaceholderImpl"; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagPlaceholderImpl typeref:typename:std::string file:
+Name host/libs/config/config_flag.cpp /^ std::string Name() const override { return "ConfigReader"; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:std::string file:
+Name host/libs/config/config_flag.cpp /^ std::string Name() const override { return "SystemImageDirFlagImpl"; }$/;" f class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:std::string file:
+Name host/libs/config/custom_actions.cpp /^ std::string Name() const override { return "CustomActionConfig"; }$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:std::string file:
+Name host/libs/config/data_image.cpp /^ std::string Name() const override { return "InitializeDataImageImpl"; }$/;" f class:cuttlefish::InitializeDataImageImpl typeref:typename:std::string file:
+Name host/libs/config/data_image.cpp /^ std::string Name() const override { return "InitializeEspImageImpl"; }$/;" f class:cuttlefish::InitializeEspImageImpl typeref:typename:std::string file:
+Name host/libs/config/data_image.cpp /^ std::string Name() const override { return "InitializeMiscImageImpl"; }$/;" f class:cuttlefish::InitializeMiscImageImpl typeref:typename:std::string file:
+Name shared/config/task_profiles.json /^ "Name": "MemSoftLimit",$/;" s object:Profiles.28.Actions.0.Params
+Name shared/config/task_profiles.json /^ "Name": "MemSoftLimit",$/;" s object:Profiles.29.Actions.0.Params
+Name shared/config/task_profiles.json /^ "Name": "MemSwappiness",$/;" s object:Profiles.28.Actions.1.Params
+Name shared/config/task_profiles.json /^ "Name": "MemSwappiness",$/;" s object:Profiles.29.Actions.1.Params
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.0.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.1.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.10.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.11.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.12.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.13.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.14.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.15.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.16.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.17.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.18.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.19.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.2.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.20.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.21.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.22.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.23.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.3.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.30.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.4.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.5.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.6.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.7.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.8.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "JoinCgroup",$/;" s object:Profiles.9.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "SetAttribute",$/;" s object:Profiles.28.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "SetAttribute",$/;" s object:Profiles.28.Actions.1
+Name shared/config/task_profiles.json /^ "Name": "SetAttribute",$/;" s object:Profiles.29.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "SetAttribute",$/;" s object:Profiles.29.Actions.1
+Name shared/config/task_profiles.json /^ "Name": "SetClamps",$/;" s object:Profiles.26.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "SetClamps",$/;" s object:Profiles.27.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "SetTimerSlack",$/;" s object:Profiles.24.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "SetTimerSlack",$/;" s object:Profiles.25.Actions.0
+Name shared/config/task_profiles.json /^ "Name": "CPUSET_SP_BACKGROUND",$/;" s object:AggregateProfiles.7
+Name shared/config/task_profiles.json /^ "Name": "CPUSET_SP_DEFAULT",$/;" s object:AggregateProfiles.6
+Name shared/config/task_profiles.json /^ "Name": "CPUSET_SP_FOREGROUND",$/;" s object:AggregateProfiles.8
+Name shared/config/task_profiles.json /^ "Name": "CPUSET_SP_RESTRICTED",$/;" s object:AggregateProfiles.11
+Name shared/config/task_profiles.json /^ "Name": "CPUSET_SP_SYSTEM",$/;" s object:AggregateProfiles.10
+Name shared/config/task_profiles.json /^ "Name": "CPUSET_SP_TOP_APP",$/;" s object:AggregateProfiles.9
+Name shared/config/task_profiles.json /^ "Name": "CameraServiceCapacity",$/;" s object:Profiles.19
+Name shared/config/task_profiles.json /^ "Name": "HighEnergySaving",$/;" s object:Profiles.0
+Name shared/config/task_profiles.json /^ "Name": "HighIoPriority",$/;" s object:Profiles.22
+Name shared/config/task_profiles.json /^ "Name": "HighMemoryUsage",$/;" s object:Profiles.29
+Name shared/config/task_profiles.json /^ "Name": "HighPerformance",$/;" s object:Profiles.3
+Name shared/config/task_profiles.json /^ "Name": "LowIoPriority",$/;" s object:Profiles.20
+Name shared/config/task_profiles.json /^ "Name": "LowMemoryUsage",$/;" s object:Profiles.28
+Name shared/config/task_profiles.json /^ "Name": "MaxIoPriority",$/;" s object:Profiles.23
+Name shared/config/task_profiles.json /^ "Name": "MaxPerformance",$/;" s object:Profiles.4
+Name shared/config/task_profiles.json /^ "Name": "NormalIoPriority",$/;" s object:Profiles.21
+Name shared/config/task_profiles.json /^ "Name": "NormalPerformance",$/;" s object:Profiles.1
+Name shared/config/task_profiles.json /^ "Name": "PerfBoost",$/;" s object:Profiles.26
+Name shared/config/task_profiles.json /^ "Name": "PerfClamp",$/;" s object:Profiles.27
+Name shared/config/task_profiles.json /^ "Name": "ProcessCapacityHigh",$/;" s object:Profiles.15
+Name shared/config/task_profiles.json /^ "Name": "ProcessCapacityLow",$/;" s object:Profiles.13
+Name shared/config/task_profiles.json /^ "Name": "ProcessCapacityMax",$/;" s object:Profiles.16
+Name shared/config/task_profiles.json /^ "Name": "ProcessCapacityNormal",$/;" s object:Profiles.14
+Name shared/config/task_profiles.json /^ "Name": "RealtimePerformance",$/;" s object:Profiles.5
+Name shared/config/task_profiles.json /^ "Name": "SCHED_SP_BACKGROUND",$/;" s object:AggregateProfiles.1
+Name shared/config/task_profiles.json /^ "Name": "SCHED_SP_DEFAULT",$/;" s object:AggregateProfiles.0
+Name shared/config/task_profiles.json /^ "Name": "SCHED_SP_FOREGROUND",$/;" s object:AggregateProfiles.2
+Name shared/config/task_profiles.json /^ "Name": "SCHED_SP_RT_APP",$/;" s object:AggregateProfiles.5
+Name shared/config/task_profiles.json /^ "Name": "SCHED_SP_SYSTEM",$/;" s object:AggregateProfiles.4
+Name shared/config/task_profiles.json /^ "Name": "SCHED_SP_TOP_APP",$/;" s object:AggregateProfiles.3
+Name shared/config/task_profiles.json /^ "Name": "ServiceCapacityLow",$/;" s object:Profiles.17
+Name shared/config/task_profiles.json /^ "Name": "ServiceCapacityRestricted",$/;" s object:Profiles.18
+Name shared/config/task_profiles.json /^ "Name": "ServicePerformance",$/;" s object:Profiles.2
+Name shared/config/task_profiles.json /^ "Name": "SystemMemoryProcess",$/;" s object:Profiles.30
+Name shared/config/task_profiles.json /^ "Name": "TimerSlackHigh",$/;" s object:Profiles.24
+Name shared/config/task_profiles.json /^ "Name": "TimerSlackNormal",$/;" s object:Profiles.25
+Name shared/config/task_profiles.json /^ "Name": "VrKernelCapacity",$/;" s object:Profiles.6
+Name shared/config/task_profiles.json /^ "Name": "VrProcessCapacityHigh",$/;" s object:Profiles.12
+Name shared/config/task_profiles.json /^ "Name": "VrProcessCapacityLow",$/;" s object:Profiles.10
+Name shared/config/task_profiles.json /^ "Name": "VrProcessCapacityNormal",$/;" s object:Profiles.11
+Name shared/config/task_profiles.json /^ "Name": "VrServiceCapacityHigh",$/;" s object:Profiles.9
+Name shared/config/task_profiles.json /^ "Name": "VrServiceCapacityLow",$/;" s object:Profiles.7
+Name shared/config/task_profiles.json /^ "Name": "VrServiceCapacityNormal",$/;" s object:Profiles.8
+NativeDisplayType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef EGLNativeDisplayType NativeDisplayType;$/;" t typeref:typename:EGLNativeDisplayType
+NativePixmapType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef EGLNativePixmapType NativePixmapType;$/;" t typeref:typename:EGLNativePixmapType
+NativeVsock host/libs/config/adb/adb.h /^ NativeVsock,$/;" e enum:cuttlefish::AdbMode
+NativeWindowType host/libs/graphics_detector/include/EGL/eglplatform.h /^typedef EGLNativeWindowType NativeWindowType;$/;" t typeref:typename:EGLNativeWindowType
+NetConfig common/libs/device_config/host_device_config.cpp /^class NetConfig {$/;" c namespace:cuttlefish::__anonf277137d0111 file:
+NetlinkClient common/libs/net/netlink_client.h /^ NetlinkClient() {}$/;" f class:cuttlefish::NetlinkClient
+NetlinkClient common/libs/net/netlink_client.h /^class NetlinkClient {$/;" c namespace:cuttlefish
+NetlinkClientFactory common/libs/net/netlink_client.h /^class NetlinkClientFactory {$/;" c namespace:cuttlefish
+NetlinkClientFactoryImpl common/libs/net/netlink_client.cpp /^class NetlinkClientFactoryImpl : public NetlinkClientFactory {$/;" c namespace:cuttlefish::__anon61381e100111 file:
+NetlinkClientImpl common/libs/net/netlink_client.cpp /^class NetlinkClientImpl : public NetlinkClient {$/;" c namespace:cuttlefish::__anon61381e100111 file:
+NetlinkRequest common/libs/net/netlink_request.cpp /^NetlinkRequest::NetlinkRequest(NetlinkRequest&& other) {$/;" f class:cuttlefish::NetlinkRequest
+NetlinkRequest common/libs/net/netlink_request.cpp /^NetlinkRequest::NetlinkRequest(int32_t command, int32_t flags) {$/;" f class:cuttlefish::NetlinkRequest
+NetlinkRequest common/libs/net/netlink_request.h /^class NetlinkRequest {$/;" c namespace:cuttlefish
+NetworkInterface common/libs/net/network_interface.h /^ explicit NetworkInterface(size_t if_index)$/;" f class:cuttlefish::NetworkInterface
+NetworkInterface common/libs/net/network_interface.h /^class NetworkInterface {$/;" c namespace:cuttlefish
+NetworkInterfaceManager common/libs/net/network_interface_manager.cpp /^NetworkInterfaceManager::NetworkInterfaceManager($/;" f class:cuttlefish::NetworkInterfaceManager
+NetworkInterfaceManager common/libs/net/network_interface_manager.h /^class NetworkInterfaceManager {$/;" c namespace:cuttlefish
+NetworkOperator host/commands/modem_simulator/network_service.h /^ NetworkOperator() {}$/;" f struct:cuttlefish::NetworkService::NetworkOperator
+NetworkOperator host/commands/modem_simulator/network_service.h /^ NetworkOperator(const std::string& number,$/;" f struct:cuttlefish::NetworkService::NetworkOperator
+NetworkOperator host/commands/modem_simulator/network_service.h /^ struct NetworkOperator {$/;" s class:cuttlefish::NetworkService
+NetworkRegistrationStatus host/commands/modem_simulator/network_service.h /^ NetworkRegistrationStatus() :$/;" f struct:cuttlefish::NetworkService::NetworkRegistrationStatus
+NetworkRegistrationStatus host/commands/modem_simulator/network_service.h /^ struct NetworkRegistrationStatus {$/;" s class:cuttlefish::NetworkService
+NetworkService host/commands/modem_simulator/network_service.cpp /^NetworkService::NetworkService(int32_t service_id,$/;" f class:cuttlefish::NetworkService
+NetworkService host/commands/modem_simulator/network_service.h /^class NetworkService : public ModemService, public std::enable_shared_from_this<NetworkService> /;" c namespace:cuttlefish
+NetworkTypeBitmap guest/hals/ril/reference-ril/reference-ril.c /^} NetworkTypeBitmap;$/;" t typeref:struct:__anon70d7df6f0208 file:
+New common/libs/net/netlink_client.cpp /^ std::unique_ptr<NetlinkClient> New(int type) override {$/;" f class:cuttlefish::__anon61381e100111::NetlinkClientFactoryImpl typeref:typename:std::unique_ptr<NetlinkClient> file:
+New common/libs/net/network_interface_manager.cpp /^std::unique_ptr<NetworkInterfaceManager> NetworkInterfaceManager::New($/;" f class:cuttlefish::NetworkInterfaceManager typeref:typename:std::unique_ptr<NetworkInterfaceManager>
+New host/libs/wmediumd_controller/wmediumd_controller.cpp /^std::unique_ptr<WmediumdController> WmediumdController::New($/;" f class:cuttlefish::WmediumdController typeref:typename:std::unique_ptr<WmediumdController>
+NewfsMsdos host/libs/config/data_image.cpp /^bool NewfsMsdos(const std::string& data_image, int data_image_mb,$/;" f namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:bool
+NoContent host/libs/websocket/websocket_handler.h /^ NoContent = 204,$/;" e enum:cuttlefish::HttpStatusCode
+None guest/hals/confirmationui/guest_session.h /^ None = 0,$/;" e enum:android::hardware::confirmationui::V1_0::implementation::GuestSession::ListenerState
+NotFound host/libs/websocket/websocket_handler.h /^ NotFound = 404,$/;" e enum:cuttlefish::HttpStatusCode
+NotSupported host/libs/audio_connector/buffers.h /^ NotSupported,$/;" e enum:cuttlefish::Status
+NvBufferToRecord host/commands/secure_env/tpm_gatekeeper.cpp /^static std::optional<gatekeeper::failure_record_t> NvBufferToRecord($/;" f namespace:cuttlefish typeref:typename:std::optional<gatekeeper::failure_record_t> file:
+NvramConfig host/commands/modem_simulator/nvram_config.cpp /^NvramConfig::NvramConfig(size_t num_instances, int sim_type)$/;" f class:cuttlefish::NvramConfig
+NvramConfig host/commands/modem_simulator/nvram_config.h /^class NvramConfig {$/;" c namespace:cuttlefish
+OI host/commands/modem_simulator/sim_service.h /^ OI = 2, \/\/ Barr all outgoing international calls$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+OK host/libs/confui/cbor.h /^ OK = 0,$/;" e enum:cuttlefish::confui::Cbor::Error
+ONE_VALID_SIM_MUST_BE_PRESENT guest/hals/ril/reference-libril/ril.h /^ ONE_VALID_SIM_MUST_BE_PRESENT = 1, \/* Any SIM card can be used as far as one valid card is$/;" e enum:__anon0bfbaecf2803
+ONLY_MESSAGE common/libs/utils/tee_logging.h /^ ONLY_MESSAGE,$/;" e enum:cuttlefish::MetadataLevel
+OPEN_CHANNEL host/commands/modem_simulator/stk_service.h /^ OPEN_CHANNEL = 0x40,$/;" e enum:cuttlefish::StkService::CommandType
+OPER_SELECTION_AUTOMATIC host/commands/modem_simulator/network_service.h /^ OPER_SELECTION_AUTOMATIC = 0,$/;" e enum:cuttlefish::NetworkService::OperatorSelectionMode
+OPER_SELECTION_DEREGISTRATION host/commands/modem_simulator/network_service.h /^ OPER_SELECTION_DEREGISTRATION,$/;" e enum:cuttlefish::NetworkService::OperatorSelectionMode
+OPER_SELECTION_MANUAL host/commands/modem_simulator/network_service.h /^ OPER_SELECTION_MANUAL,$/;" e enum:cuttlefish::NetworkService::OperatorSelectionMode
+OPER_SELECTION_MANUAL_AUTOMATIC host/commands/modem_simulator/network_service.h /^ OPER_SELECTION_MANUAL_AUTOMATIC$/;" e enum:cuttlefish::NetworkService::OperatorSelectionMode
+OPER_SELECTION_SET_FORMAT host/commands/modem_simulator/network_service.h /^ OPER_SELECTION_SET_FORMAT,$/;" e enum:cuttlefish::NetworkService::OperatorSelectionMode
+OPER_STATE_AVAILABLE host/commands/modem_simulator/network_service.h /^ OPER_STATE_AVAILABLE = 1,$/;" e enum:cuttlefish::NetworkService::NetworkOperator::OperatorState
+OPER_STATE_CURRENT host/commands/modem_simulator/network_service.h /^ OPER_STATE_CURRENT = 2,$/;" e enum:cuttlefish::NetworkService::NetworkOperator::OperatorState
+OPER_STATE_FORBIDDEN host/commands/modem_simulator/network_service.h /^ OPER_STATE_FORBIDDEN = 3$/;" e enum:cuttlefish::NetworkService::NetworkOperator::OperatorState
+OPER_STATE_UNKNOWN host/commands/modem_simulator/network_service.h /^ OPER_STATE_UNKNOWN = 0,$/;" e enum:cuttlefish::NetworkService::NetworkOperator::OperatorState
+OTA_TOOLS host/commands/fetcher/fetch_cvd.cc /^const std::string OTA_TOOLS = "otatools.zip";$/;" v namespace:cuttlefish::__anonccb356fd0211 typeref:typename:const std::string
+OTA_TOOLS_DIR host/commands/fetcher/fetch_cvd.cc /^const std::string OTA_TOOLS_DIR = "\/otatools\/";$/;" v namespace:cuttlefish::__anonccb356fd0211 typeref:typename:const std::string
+OUT_OF_DATA host/libs/confui/cbor.h /^ OUT_OF_DATA = 1,$/;" e enum:cuttlefish::confui::Cbor::Error
+OVERRIDE_TARGET_FLATTEN_APEX vsoc_x86_noapex/aosp_cf_noapex.mk /^OVERRIDE_TARGET_FLATTEN_APEX := true$/;" m
+OX host/commands/modem_simulator/sim_service.h /^ OX = 3, \/\/ Barr all outgoing international calls, except to Home Country$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+O_TMPFILE host/commands/assemble_cvd/assemble_cvd.cc /^# define O_TMPFILE /;" d file:
+ObjectSlot host/commands/secure_env/tpm_resource_manager.cpp /^TpmResourceManager::ObjectSlot::ObjectSlot(TpmResourceManager* resource_manager)$/;" f class:cuttlefish::TpmResourceManager::ObjectSlot
+ObjectSlot host/commands/secure_env/tpm_resource_manager.cpp /^TpmResourceManager::ObjectSlot::ObjectSlot(TpmResourceManager* resource_manager,$/;" f class:cuttlefish::TpmResourceManager::ObjectSlot
+ObjectSlot host/commands/secure_env/tpm_resource_manager.h /^ class ObjectSlot {$/;" c class:cuttlefish::TpmResourceManager
+ObtainConfig common/libs/device_config/host_device_config.cpp /^ bool ObtainConfig(const std::string& interface, const std::string& dns) {$/;" f class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:bool file:
+OemHookImpl guest/hals/ril/reference-libril/ril_service.cpp /^struct OemHookImpl : public IOemHook {$/;" s file:
+Ok host/libs/audio_connector/buffers.h /^ Ok = 0x8000,$/;" e enum:cuttlefish::Status
+Ok host/libs/websocket/websocket_handler.h /^ Ok = 200,$/;" e enum:cuttlefish::HttpStatusCode
+OnAdbChannelOpen host/frontend/webrtc/connection_observer.cpp /^ void OnAdbChannelOpen(std::function<bool(const uint8_t *, size_t)>$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnAdbMessage host/frontend/webrtc/connection_observer.cpp /^ void OnAdbMessage(const uint8_t *msg, size_t size) override {$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnBluetoothChannelOpen host/frontend/webrtc/connection_observer.cpp /^ void OnBluetoothChannelOpen(std::function<bool(const uint8_t *, size_t)>$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnBluetoothMessage host/frontend/webrtc/connection_observer.cpp /^ void OnBluetoothMessage(const uint8_t *msg, size_t size) override {$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnBootEvtReceived host/commands/run_cvd/boot_state_machine.cc /^ bool OnBootEvtReceived(SharedFD boot_events_pipe) {$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:bool file:
+OnCameraData host/frontend/webrtc/connection_observer.cpp /^ void OnCameraData(const std::vector<char> &data) override {$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnCaptureBuffer host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::OnCaptureBuffer(RxBuffer buffer) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+OnClose host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::OnClose() {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+OnClose host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::OnClose() {$/;" f class:WsConnectionImpl typeref:typename:void
+OnClose host/frontend/webrtc/main.cpp /^ virtual void OnClose() override {$/;" f class:CfOperatorObserver typeref:typename:void file:
+OnClosed host/frontend/webrtc_operator/client_handler.cpp /^void ClientWSHandler::OnClosed() {$/;" f class:cuttlefish::ClientWSHandler typeref:typename:void
+OnClosed host/frontend/webrtc_operator/device_handler.cpp /^void DeviceHandler::OnClosed() {$/;" f class:cuttlefish::DeviceHandler typeref:typename:void
+OnConnected host/frontend/webrtc/connection_observer.cpp /^ void OnConnected(std::function<void(const uint8_t *, size_t, bool)>$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnConnected host/frontend/webrtc_operator/signal_handler.cpp /^void SignalHandler::OnConnected() {}$/;" f class:cuttlefish::SignalHandler typeref:typename:void
+OnConnectionChange host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnConnectionChange($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnConsumedCb host/libs/audio_connector/buffers.h /^using OnConsumedCb = std::function<void(AudioStatus, uint32_t \/*latency*\/,$/;" t namespace:cuttlefish
+OnControlChannelOpen host/frontend/webrtc/connection_observer.cpp /^ void OnControlChannelOpen(std::function<bool(const Json::Value)>$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnControlMessage host/frontend/webrtc/connection_observer.cpp /^ void OnControlMessage(const uint8_t* msg, size_t size) override {$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnCreateSDPFailure host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnCreateSDPFailure(webrtc::RTCError error) {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnCreateSDPSuccess host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnCreateSDPSuccess($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnDataChannel host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnDataChannel($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnDataRegisterStateChanged host/commands/modem_simulator/network_service.cpp /^void NetworkService::OnDataRegisterStateChanged() {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+OnEncodedImage host/frontend/webrtc/lib/local_recorder.cpp /^webrtc::EncodedImageCallback::Result LocalRecorder::Display::OnEncodedImage($/;" f class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:webrtc::EncodedImageCallback::Result
+OnError host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::OnError(const std::string& error) {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+OnError host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::OnError(const std::string& error) {$/;" f class:WsConnectionImpl typeref:typename:void
+OnError host/frontend/webrtc/main.cpp /^ virtual void OnError() override {$/;" f class:CfOperatorObserver typeref:typename:void file:
+OnFail tools/create_base_image.go /^type OnFail int$/;" t package:main typeref:typename:int
+OnFailure host/frontend/webrtc/lib/client_handler.cpp /^ void OnFailure(webrtc::RTCError error) override {$/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdCreateSessionDescriptionObserver typeref:typename:void file:
+OnFailure host/frontend/webrtc/lib/client_handler.cpp /^ void OnFailure(webrtc::RTCError error) override {$/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdSetSessionDescriptionObserver typeref:typename:void file:
+OnFirstClientConnected host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::OnFirstClientConnected() {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+OnFrame host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::OnFrame(std::shared_ptr<AudioFrameBuffer> frame,$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+OnFrame host/frontend/webrtc/lib/audio_track_source_impl.h /^ void OnFrame(std::shared_ptr<AudioFrameBuffer> frame,$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImplSinkWrapper typeref:typename:void
+OnFrame host/frontend/webrtc/lib/camera_streamer.cpp /^void CameraStreamer::OnFrame(const webrtc::VideoFrame& client_frame) {$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:void
+OnFrame host/frontend/webrtc/lib/local_recorder.cpp /^void LocalRecorder::Display::OnFrame(const webrtc::VideoFrame& frame) {$/;" f class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:void
+OnFrame host/frontend/webrtc/lib/video_track_source_impl.cpp /^void VideoTrackSourceImpl::OnFrame(std::shared_ptr<VideoFrameBuffer> frame,$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:void
+OnFrame host/frontend/webrtc/lib/video_track_source_impl.h /^ void OnFrame(std::shared_ptr<VideoFrameBuffer> frame,$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImplSinkWrapper typeref:typename:void
+OnIceCandidate host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnIceCandidate($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnIceCandidateError host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnIceCandidateError(const std::string &address, int port,$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnIceCandidateError host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnIceCandidateError(const std::string &host_candidate,$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnIceCandidatesRemoved host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnIceCandidatesRemoved($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnIceGatheringChange host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnIceGatheringChange($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnKeyboardEvent host/frontend/webrtc/connection_observer.cpp /^ void OnKeyboardEvent(uint16_t code, bool down) override {$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnMessage host/frontend/webrtc/lib/client_handler.cpp /^void AdbChannelHandler::OnMessage(const webrtc::DataBuffer &msg) {$/;" f class:cuttlefish::webrtc_streaming::AdbChannelHandler typeref:typename:void
+OnMessage host/frontend/webrtc/lib/client_handler.cpp /^void BluetoothChannelHandler::OnMessage(const webrtc::DataBuffer &msg) {$/;" f class:cuttlefish::webrtc_streaming::BluetoothChannelHandler typeref:typename:void
+OnMessage host/frontend/webrtc/lib/client_handler.cpp /^void CameraChannelHandler::OnMessage(const webrtc::DataBuffer &msg) {$/;" f class:cuttlefish::webrtc_streaming::CameraChannelHandler typeref:typename:void
+OnMessage host/frontend/webrtc/lib/client_handler.cpp /^void ControlChannelHandler::OnMessage(const webrtc::DataBuffer &msg) {$/;" f class:cuttlefish::webrtc_streaming::ControlChannelHandler typeref:typename:void
+OnMessage host/frontend/webrtc/lib/client_handler.cpp /^void InputChannelHandler::OnMessage(const webrtc::DataBuffer &msg) {$/;" f class:cuttlefish::webrtc_streaming::InputChannelHandler typeref:typename:void
+OnMultiTouchEvent host/frontend/webrtc/connection_observer.cpp /^ void OnMultiTouchEvent(const std::string &display_label, Json::Value id,$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnNextFrame host/libs/screen_connector/screen_connector.h /^ ProcessedFrameType OnNextFrame() { return sc_frame_multiplexer_.Pop(); }$/;" f class:cuttlefish::ScreenConnector typeref:typename:ProcessedFrameType
+OnOpen host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::OnOpen() {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+OnOpen host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::OnOpen() {$/;" f class:WsConnectionImpl typeref:typename:void
+OnPlaybackBuffer host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::OnPlaybackBuffer(TxBuffer buffer) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+OnReceive host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::OnReceive(const uint8_t* msg, size_t length,$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+OnReceive host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::OnReceive(const uint8_t* data, size_t len,$/;" f class:WsConnectionImpl typeref:typename:void
+OnReceive host/frontend/webrtc_operator/signal_handler.cpp /^void SignalHandler::OnReceive(const uint8_t* msg, size_t len, bool binary) {$/;" f class:cuttlefish::SignalHandler typeref:typename:void
+OnReceive host/frontend/webrtc_operator/signal_handler.cpp /^void SignalHandler::OnReceive(const uint8_t* msg, size_t len, bool binary,$/;" f class:cuttlefish::SignalHandler typeref:typename:void
+OnReceive host/libs/websocket/websocket_handler.h /^ virtual void OnReceive(const uint8_t* msg, size_t len, bool binary,$/;" f class:cuttlefish::WebSocketHandler typeref:typename:void
+OnRegistered host/frontend/webrtc/main.cpp /^ virtual void OnRegistered() override {$/;" f class:CfOperatorObserver typeref:typename:void file:
+OnRemoveTrack host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnRemoveTrack($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnRenegotiationNeeded host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnRenegotiationNeeded() {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnRequestAck guest/hals/ril/reference-libril/ril.h /^ void (*OnRequestAck) (RIL_Token t);$/;" m struct:RIL_Env typeref:typename:void (*)(RIL_Token t)
+OnRequestComplete guest/hals/ril/reference-libril/ril.h /^ void (*OnRequestComplete)(RIL_Token t, RIL_Errno e,$/;" m struct:RIL_Env typeref:typename:void (*)(RIL_Token t,RIL_Errno e,void * response,size_t responselen)
+OnSetRemoteDescriptionComplete host/frontend/webrtc/lib/client_handler.cpp /^ void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override {$/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdOnSetRemoteDescription typeref:typename:void file:
+OnSetSDPFailure host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnSetSDPFailure(webrtc::RTCError error) {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnSignalStrengthChanged host/commands/modem_simulator/network_service.cpp /^void NetworkService::OnSignalStrengthChanged() {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+OnSignalingChange host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnSignalingChange($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnSimStatusChanged host/commands/modem_simulator/network_service.cpp /^void NetworkService::OnSimStatusChanged(SimService::SimStatus sim_status) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+OnSimStatusChanged host/commands/modem_simulator/sim_service.cpp /^void SimService::OnSimStatusChanged() {$/;" f class:cuttlefish::SimService typeref:typename:void
+OnSocketReadyCb host/commands/run_cvd/process_monitor.h /^using OnSocketReadyCb = std::function<bool(MonitorEntry*, int)>;$/;" t namespace:cuttlefish
+OnStandardizedIceConnectionChange host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnStandardizedIceConnectionChange($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnStateChange host/frontend/webrtc/lib/client_handler.cpp /^void AdbChannelHandler::OnStateChange() {$/;" f class:cuttlefish::webrtc_streaming::AdbChannelHandler typeref:typename:void
+OnStateChange host/frontend/webrtc/lib/client_handler.cpp /^void BluetoothChannelHandler::OnStateChange() {$/;" f class:cuttlefish::webrtc_streaming::BluetoothChannelHandler typeref:typename:void
+OnStateChange host/frontend/webrtc/lib/client_handler.cpp /^void CameraChannelHandler::OnStateChange() {$/;" f class:cuttlefish::webrtc_streaming::CameraChannelHandler typeref:typename:void
+OnStateChange host/frontend/webrtc/lib/client_handler.cpp /^void ControlChannelHandler::OnStateChange() {$/;" f class:cuttlefish::webrtc_streaming::ControlChannelHandler typeref:typename:void
+OnStateChange host/frontend/webrtc/lib/client_handler.cpp /^void InputChannelHandler::OnStateChange() {$/;" f class:cuttlefish::webrtc_streaming::InputChannelHandler typeref:typename:void
+OnSuccess host/frontend/webrtc/lib/client_handler.cpp /^ void OnSuccess() override {$/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdSetSessionDescriptionObserver typeref:typename:void file:
+OnSuccess host/frontend/webrtc/lib/client_handler.cpp /^ void OnSuccess(webrtc::SessionDescriptionInterface *desc) override {$/;" f class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdCreateSessionDescriptionObserver typeref:typename:void file:
+OnSwitchEvent host/frontend/webrtc/connection_observer.cpp /^ void OnSwitchEvent(uint16_t code, bool state) override {$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnTouchEvent host/frontend/webrtc/connection_observer.cpp /^ void OnTouchEvent(const std::string &display_label, int x, int y,$/;" f class:cuttlefish::ConnectionObserverImpl typeref:typename:void file:
+OnTrack host/frontend/webrtc/lib/client_handler.cpp /^void ClientHandler::OnTrack($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:void
+OnUnsolicitedCommandForTR host/commands/modem_simulator/stk_service.cpp /^void StkService::OnUnsolicitedCommandForTR(std::string& command) {$/;" f class:cuttlefish::StkService typeref:typename:void
+OnUnsolicitedResponse guest/hals/ril/reference-libril/ril.h /^ void (*OnUnsolicitedResponse)(int unsolResponse, const void *data, size_t datalen);$/;" m struct:RIL_Env typeref:typename:void (*)(int unsolResponse,const void * data,size_t datalen)
+OnUnsolicitedResponse guest/hals/ril/reference-libril/ril.h /^ void (*OnUnsolicitedResponse)(int unsolResponse, const void *data, size_t datalen, RIL_SOCKE/;" m struct:RIL_Env typeref:typename:void (*)(int unsolResponse,const void * data,size_t datalen,RIL_SOCKET_ID socket_id)
+OnVoiceRegisterStateChanged host/commands/modem_simulator/network_service.cpp /^void NetworkService::OnVoiceRegisterStateChanged() {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+OnWritable host/libs/websocket/websocket_handler.cpp /^bool WebSocketHandler::OnWritable() {$/;" f class:cuttlefish::WebSocketHandler typeref:typename:bool
+OnWritable host/libs/websocket/websocket_handler.cpp /^int DynHandler::OnWritable() {$/;" f class:cuttlefish::DynHandler typeref:typename:int
+OnWriteable host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionImpl::OnWriteable() {$/;" f class:WsConnectionImpl typeref:typename:void
+OneBase host/libs/config/inject.h /^ struct OneBase {$/;" s struct:cuttlefish::Multibindings
+OneBaseOneImpl host/libs/config/inject.h /^ static fruit::Component<Deps> OneBaseOneImpl() {$/;" f struct:cuttlefish::Multibindings typeref:typename:fruit::Component<Deps>
+OneshotHmac host/commands/secure_env/tpm_hmac.cpp /^static UniqueEsysPtr<TPM2B_DIGEST> OneshotHmac($/;" f namespace:cuttlefish typeref:typename:UniqueEsysPtr<TPM2B_DIGEST> file:
+Open common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Open(const std::string& path, int flags, mode_t mode) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+Open common/libs/net/network_interface_manager.cpp /^std::unique_ptr<NetworkInterface> NetworkInterfaceManager::Open($/;" f class:cuttlefish::NetworkInterfaceManager typeref:typename:std::unique_ptr<NetworkInterface>
+OpenNetlink common/libs/net/netlink_client.cpp /^bool NetlinkClientImpl::OpenNetlink(int type) {$/;" f class:cuttlefish::__anon61381e100111::NetlinkClientImpl typeref:typename:bool
+OpenPTY host/commands/console_forwarder/main.cpp /^ SharedFD OpenPTY() {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:SharedFD file:
+OpenSocketConnection common/frontend/socket_vsock_proxy/main.cpp /^cuttlefish::SharedFD OpenSocketConnection() {$/;" f namespace:__anon913036200111 typeref:typename:cuttlefish::SharedFD
+OpenTapInterface common/libs/utils/network.cpp /^SharedFD OpenTapInterface(const std::string& interface_name) {$/;" f namespace:cuttlefish typeref:typename:SharedFD
+OpenWrt host/commands/run_cvd/launch.cc /^class OpenWrt : public CommandSource {$/;" c namespace:cuttlefish file:
+OperatorObserver host/frontend/webrtc/lib/streamer.h /^class OperatorObserver {$/;" c namespace:cuttlefish::webrtc_streaming
+OperatorSelectionMode host/commands/modem_simulator/network_service.h /^ enum OperatorSelectionMode {$/;" g class:cuttlefish::NetworkService
+OperatorServerConfig host/frontend/webrtc/lib/streamer.cpp /^struct OperatorServerConfig {$/;" s namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 file:
+OperatorState host/commands/modem_simulator/network_service.h /^ enum OperatorState {$/;" g struct:cuttlefish::NetworkService::NetworkOperator
+OsType host/commands/metrics/proto/cf_metrics_event.proto /^ enum OsType {$/;" g message:cuttlefish.MetricsEvent
+PARTIAL guest/hals/ril/reference-libril/ril.h /^ PARTIAL = 0x01, \/\/ The result contains a part of the scan results$/;" e enum:__anon0bfbaecfb203
+PARTIAL_MATCH host/commands/modem_simulator/modem_service.h /^ enum MatchMode {FULL_MATCH = 0, PARTIAL_MATCH = 1};$/;" e enum:cuttlefish::CommandHandler::MatchMode
+PARTITION_SIZE_SHIFT common/libs/utils/size_utils.h /^constexpr int PARTITION_SIZE_SHIFT = 12;$/;" v namespace:cuttlefish typeref:typename:int
+PDPContext host/commands/modem_simulator/data_service.h /^ struct PDPContext {$/;" s class:cuttlefish::DataService
+PDPInfo guest/hals/ril/reference-ril/reference-ril.c /^struct PDPInfo {$/;" s file:
+PDPState guest/hals/ril/reference-ril/reference-ril.c /^enum PDPState {$/;" g file:
+PDP_BUSY guest/hals/ril/reference-ril/reference-ril.c /^ PDP_BUSY,$/;" e enum:PDPState file:
+PDP_FAIL_ACTIVATION_REJECT_GGSN guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ACTIVATION_REJECT_GGSN = 0x1E, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 0x1F,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_APN_TYPE_CONFLICT guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_APN_TYPE_CONFLICT = 0x70,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_AUTH_FAILURE_ON_EMERGENCY_CALL guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_AUTH_FAILURE_ON_EMERGENCY_CALL = 0x7A,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_COMPANION_IFACE_IN_USE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_COMPANION_IFACE_IN_USE = 0x76,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_CONDITIONAL_IE_ERROR guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_CONDITIONAL_IE_ERROR = 0x64,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_DATA_REGISTRATION_FAIL guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_DATA_REGISTRATION_FAIL = -2,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_EMERGENCY_IFACE_ONLY guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_EMERGENCY_IFACE_ONLY = 0x74,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_EMM_ACCESS_BARRED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_EMM_ACCESS_BARRED = 0x73,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_EMM_ACCESS_BARRED_INFINITE_RETRY guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_EMM_ACCESS_BARRED_INFINITE_RETRY = 0x79,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_ERROR_UNSPECIFIED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ERROR_UNSPECIFIED = 0xffff, \/* retry silently. Will be deprecated soon as$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_ESM_INFO_NOT_RECEIVED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ESM_INFO_NOT_RECEIVED = 0x35,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_FEATURE_NOT_SUPP guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_FEATURE_NOT_SUPP = 0x28,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_FILTER_SEMANTIC_ERROR guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_FILTER_SEMANTIC_ERROR = 0x2C,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_FILTER_SYTAX_ERROR guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_FILTER_SYTAX_ERROR = 0x2D,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_IFACE_AND_POL_FAMILY_MISMATCH guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_IFACE_AND_POL_FAMILY_MISMATCH = 0x78,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_IFACE_MISMATCH guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_IFACE_MISMATCH = 0x75,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_INSUFFICIENT_RESOURCES guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_INSUFFICIENT_RESOURCES = 0x1A,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN = 0x72,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_INVALID_MANDATORY_INFO guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_INVALID_MANDATORY_INFO = 0x60,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_INVALID_PCSCF_ADDR guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_INVALID_PCSCF_ADDR = 0x71,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_INVALID_TRANSACTION_ID guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_INVALID_TRANSACTION_ID = 0x51,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_IP_ADDRESS_MISMATCH guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_IP_ADDRESS_MISMATCH = 0x77,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_LLC_SNDCP guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_LLC_SNDCP = 0x19,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MATCH_ALL_RULE_NOT_ALLOWED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MATCH_ALL_RULE_NOT_ALLOWED = 0x8CD,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MAX_ACTIVE_PDP_CONTEXT_REACHED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MAX_ACTIVE_PDP_CONTEXT_REACHED = 0x41,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MESSAGE_INCORRECT_SEMANTIC guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MESSAGE_INCORRECT_SEMANTIC = 0x5F,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MESSAGE_TYPE_UNSUPPORTED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MESSAGE_TYPE_UNSUPPORTED = 0x61,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MISSING_UNKNOWN_APN guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MISSING_UNKNOWN_APN = 0x1B, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 0x65,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MSG_TYPE_NONCOMPATIBLE_STATE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MSG_TYPE_NONCOMPATIBLE_STATE = 0x62,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 0x37,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_NAS_SIGNALLING guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_NAS_SIGNALLING = 0x0E,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_NETWORK_FAILURE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_NETWORK_FAILURE = 0x26,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_NONE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_NONE = 0, \/* No error, connection ok *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_NSAPI_IN_USE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_NSAPI_IN_USE = 0x23, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_1 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_1 = 0x1001,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_10 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_10 = 0x100A,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_11 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_11 = 0x100B,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_12 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_12 = 0x100C,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_13 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_13 = 0x100D,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_14 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_14 = 0x100E,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_15 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_15 = 0x100F,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_2 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_2 = 0x1002,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_3 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_3 = 0x1003,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_4 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_4 = 0x1004,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_5 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_5 = 0x1005,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_6 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_6 = 0x1006,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_7 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_7 = 0x1007,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_8 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_8 = 0x1008,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OEM_DCFAILCAUSE_9 guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OEM_DCFAILCAUSE_9 = 0x1009,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_ONLY_IPV4_ALLOWED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ONLY_IPV4_ALLOWED = 0x32, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_ONLY_IPV6_ALLOWED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ONLY_IPV6_ALLOWED = 0x33, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED = 0x34,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_OPERATOR_BARRED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_OPERATOR_BARRED = 0x08, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_PDN_CONN_DOES_NOT_EXIST guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_PDN_CONN_DOES_NOT_EXIST = 0x36,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_PDP_WITHOUT_ACTIVE_TFT guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_PDP_WITHOUT_ACTIVE_TFT = 0x2E,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_PREF_RADIO_TECH_CHANGED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_PREF_RADIO_TECH_CHANGED = -4, \/* preferred technology has changed, should retry$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_PROTOCOL_ERRORS guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_PROTOCOL_ERRORS = 0x6F, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_QOS_NOT_ACCEPTED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_QOS_NOT_ACCEPTED = 0x25,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_RADIO_POWER_OFF guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_RADIO_POWER_OFF = -5, \/* data call was disconnected because radio was resetti/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_REGULAR_DEACTIVATION guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_REGULAR_DEACTIVATION = 0x24, \/* possibly restart radio,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 0x21, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 0x20, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 0x22,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_SIGNAL_LOST guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_SIGNAL_LOST = -3,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_SLICE_REJECTED guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_SLICE_REJECTED = 0x8CC,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_TETHERED_CALL_ACTIVE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_TETHERED_CALL_ACTIVE = -6, \/* data call was disconnected by modem because tethered$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_TFT_SEMANTIC_ERROR guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_TFT_SEMANTIC_ERROR = 0x29,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_TFT_SYTAX_ERROR guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_TFT_SYTAX_ERROR = 0x2A,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_UMTS_REACTIVATION_REQ guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_UMTS_REACTIVATION_REQ = 0x27,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_UNKNOWN_INFO_ELEMENT guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_UNKNOWN_INFO_ELEMENT = 0x63,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 0x1C, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_UNKNOWN_PDP_CONTEXT guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_UNKNOWN_PDP_CONTEXT = 0x2B,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_UNSUPPORTED_APN_IN_CURRENT_PLMN guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_UNSUPPORTED_APN_IN_CURRENT_PLMN = 0x42,$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_USER_AUTHENTICATION guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_USER_AUTHENTICATION = 0x1D, \/* no retry *\/$/;" e enum:__anon0bfbaecf2f03
+PDP_FAIL_VOICE_REGISTRATION_FAIL guest/hals/ril/reference-libril/ril.h /^ PDP_FAIL_VOICE_REGISTRATION_FAIL = -1,$/;" e enum:__anon0bfbaecf2f03
+PDP_IDLE guest/hals/ril/reference-ril/reference-ril.c /^ PDP_IDLE,$/;" e enum:PDPState file:
+PDUParser host/commands/modem_simulator/pdu_parser.cpp /^PDUParser::PDUParser(std::string &pdu) {$/;" f class:cuttlefish::PDUParser
+PDUParser host/commands/modem_simulator/pdu_parser.h /^class PDUParser {$/;" c namespace:cuttlefish
+PFNEGLBINDAPIPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLenum api)
+PFNEGLBINDTEXIMAGEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EG/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint buffer)
+PFNEGLBINDWAYLANDDISPLAYWL host/libs/graphics_detector/include/EGL/eglext.h /^#define PFNEGLBINDWAYLANDDISPLAYWL /;" d
+PFNEGLBINDWAYLANDDISPLAYWLPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_disp/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,struct wl_display * display)
+PFNEGLCHOOSECONFIGPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_l/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,const EGLint * attrib_list,EGLConfig * configs,EGLint config_size,EGLint * num_config)
+PFNEGLCLIENTSIGNALSYNCEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, c/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSync sync,const EGLAttrib * attrib_list)
+PFNEGLCLIENTWAITSYNCKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLi/;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags,EGLTimeKHR timeout)
+PFNEGLCLIENTWAITSYNCNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeN/;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLSyncNV sync,EGLint flags,EGLTimeNV timeout)
+PFNEGLCLIENTWAITSYNCPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint fla/;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLDisplay dpy,EGLSync sync,EGLint flags,EGLTime timeout)
+PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC) (EGLint external_win_id);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint external_win_id)
+PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC) (EGLint external_r/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint external_ref_id,const EGLint * context_attributes,EGLint num_entries)
+PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC) (const EGLint *external_/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(const EGLint * external_ref_ids,EGLint num_entries)
+PFNEGLCOMPOSITORSETSIZEEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETSIZEEXTPROC) (EGLint external_win_id, EGLint/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint external_win_id,EGLint width,EGLint height)
+PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC) (EGLint external_wi/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint external_win_id,const EGLint * window_attributes,EGLint num_entries)
+PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC) (EGLint external_ref_id, /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint external_ref_id,const EGLint * external_win_ids,EGLint num_entries)
+PFNEGLCOMPOSITORSWAPPOLICYEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSWAPPOLICYEXTPROC) (EGLint external_win_id, EGL/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint external_win_id,EGLint policy)
+PFNEGLCOPYBUFFERSPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGL/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLNativePixmapType target)
+PFNEGLCREATECONTEXTPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGL/;" t typeref:typename:EGLContext (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,EGLContext share_context,const EGLint * attrib_list)
+PFNEGLCREATEDRMIMAGEMESAPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *a/;" t typeref:typename:EGLImageKHR (EGLAPIENTRYP)(EGLDisplay dpy,const EGLint * attrib_list)
+PFNEGLCREATEFENCESYNCNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition,/;" t typeref:typename:EGLSyncNV (EGLAPIENTRYP)(EGLDisplay dpy,EGLenum condition,const EGLint * attrib_list)
+PFNEGLCREATEIMAGEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGL/;" t typeref:typename:EGLImageKHR (EGLAPIENTRYP)(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLint * attrib_list)
+PFNEGLCREATEIMAGEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum t/;" t typeref:typename:EGLImage (EGLAPIENTRYP)(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLAttrib * attrib_list)
+PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint */;" t typeref:typename:EGLClientBuffer (EGLAPIENTRYP)(const EGLint * attrib_list)
+PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLen/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLenum buftype,EGLClientBuffer buffer,EGLConfig config,const EGLint * attrib_list)
+PFNEGLCREATEPBUFFERSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig conf/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,const EGLint * attrib_list)
+PFNEGLCREATEPIXMAPSURFACEHIPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig con/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,struct EGLClientPixmapHI * pixmap)
+PFNEGLCREATEPIXMAPSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig confi/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,EGLNativePixmapType pixmap,const EGLint * attrib_list)
+PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLC/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLint * attrib_list)
+PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConf/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLAttrib * attrib_list)
+PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLC/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLint * attrib_list)
+PFNEGLCREATEPLATFORMWINDOWSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConf/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLAttrib * attrib_list)
+PFNEGLCREATESTREAMATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAt/;" t typeref:typename:EGLStreamKHR (EGLAPIENTRYP)(EGLDisplay dpy,const EGLAttrib * attrib_list)
+PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy,/;" t typeref:typename:EGLStreamKHR (EGLAPIENTRYP)(EGLDisplay dpy,EGLNativeFileDescriptorKHR file_descriptor)
+PFNEGLCREATESTREAMKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *att/;" t typeref:typename:EGLStreamKHR (EGLAPIENTRYP)(EGLDisplay dpy,const EGLint * attrib_list)
+PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLC/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,EGLStreamKHR stream,const EGLint * attrib_list)
+PFNEGLCREATESTREAMSYNCNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR str/;" t typeref:typename:EGLSyncKHR (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum type,const EGLint * attrib_list)
+PFNEGLCREATESYNC64KHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const/;" t typeref:typename:EGLSyncKHR (EGLAPIENTRYP)(EGLDisplay dpy,EGLenum type,const EGLAttribKHR * attrib_list)
+PFNEGLCREATESYNCKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const E/;" t typeref:typename:EGLSyncKHR (EGLAPIENTRYP)(EGLDisplay dpy,EGLenum type,const EGLint * attrib_list)
+PFNEGLCREATESYNCPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttr/;" t typeref:typename:EGLSync (EGLAPIENTRYP)(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list)
+PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL host/libs/graphics_detector/include/EGL/eglext.h /^#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL /;" d
+PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dp/;" t typeref:struct:wl_buffer * (EGLAPIENTRYP)(EGLDisplay dpy,EGLImageKHR image)
+PFNEGLCREATEWINDOWSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig confi/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,EGLNativeWindowType win,const EGLint * attrib_list)
+PFNEGLDEBUGMESSAGECONTROLKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLint (EGLAPIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const /;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLDEBUGPROCKHR callback,const EGLAttrib * attrib_list)
+PFNEGLDESTROYCONTEXTPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLContext ctx)
+PFNEGLDESTROYIMAGEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLImageKHR image)
+PFNEGLDESTROYIMAGEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLImage image)
+PFNEGLDESTROYSTREAMKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR strea/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLDESTROYSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface)
+PFNEGLDESTROYSYNCKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSyncKHR sync)
+PFNEGLDESTROYSYNCNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLSyncNV sync)
+PFNEGLDESTROYSYNCPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSync sync)
+PFNEGLDUPNATIVEFENCEFDANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync/;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLDisplay dpy,EGLSyncKHR sync)
+PFNEGLEXPORTDMABUFIMAGEMESAPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR i/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLImageKHR image,int * fds,EGLint * strides,EGLint * offsets)
+PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImage/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLImageKHR image,int * fourcc,int * num_planes,EGLuint64KHR * modifiers)
+PFNEGLEXPORTDRMIMAGEMESAPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR imag/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLImageKHR image,EGLint * name,EGLint * handle,EGLint * stride)
+PFNEGLFENCENVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLSyncNV sync)
+PFNEGLGETCOMPOSITORTIMINGANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC) (EGLDisplay dpy, EGLSurfa/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint numTimestamps,const EGLint * names,EGLnsecsANDROID * values)
+PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC) (EGLDisplay dpy,/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint name)
+PFNEGLGETCONFIGATTRIBPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, E/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig config,EGLint attribute,EGLint * value)
+PFNEGLGETCONFIGSPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLi/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLConfig * configs,EGLint config_size,EGLint * num_config)
+PFNEGLGETCURRENTCONTEXTPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void);$/;" t typeref:typename:EGLContext (EGLAPIENTRYP)(void)
+PFNEGLGETCURRENTDISPLAYPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void);$/;" t typeref:typename:EGLDisplay (EGLAPIENTRYP)(void)
+PFNEGLGETCURRENTSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw);$/;" t typeref:typename:EGLSurface (EGLAPIENTRYP)(EGLint readdraw)
+PFNEGLGETDISPLAYDRIVERCONFIGPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERCONFIGPROC) (EGLDisplay dpy);$/;" t typeref:typename:char * (EGLAPIENTRYP)(EGLDisplay dpy)
+PFNEGLGETDISPLAYDRIVERNAMEPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef const char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERNAMEPROC) (EGLDisplay dpy);$/;" t typeref:typename:const char * (EGLAPIENTRYP)(EGLDisplay dpy)
+PFNEGLGETDISPLAYPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id);$/;" t typeref:typename:EGLDisplay (EGLAPIENTRYP)(EGLNativeDisplayType display_id)
+PFNEGLGETERRORPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void);$/;" t typeref:typename:EGLint (EGLAPIENTRYP)(void)
+PFNEGLGETFRAMETIMESTAMPSANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC) (EGLDisplay dpy, EGLSurfac/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLuint64KHR frameId,EGLint numTimestamps,const EGLint * timestamps,EGLnsecsANDROID * values)
+PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC) (EGLDisplay dpy, E/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint timestamp)
+PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC) (const struct AHar/;" t typeref:typename:EGLClientBuffer (EGLAPIENTRYP)(const struct AHardwareBuffer * buffer)
+PFNEGLGETNEXTFRAMEIDANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC) (EGLDisplay dpy, EGLSurface su/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLuint64KHR * frameId)
+PFNEGLGETOUTPUTLAYERSEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,const EGLAttrib * attrib_list,EGLOutputLayerEXT * layers,EGLint max_layers,EGLint * num_layers)
+PFNEGLGETOUTPUTPORTSEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib */;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,const EGLAttrib * attrib_list,EGLOutputPortEXT * ports,EGLint max_ports,EGLint * num_ports)
+PFNEGLGETPLATFORMDISPLAYEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *nativ/;" t typeref:typename:EGLDisplay (EGLAPIENTRYP)(EGLenum platform,void * native_display,const EGLint * attrib_list)
+PFNEGLGETPLATFORMDISPLAYPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_d/;" t typeref:typename:EGLDisplay (EGLAPIENTRYP)(EGLenum platform,void * native_display,const EGLAttrib * attrib_list)
+PFNEGLGETPROCADDRESSPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const /;" t typeref:typename:__eglMustCastToProperFunctionPointerType (EGLAPIENTRYP)(const char * procname)
+PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDispl/;" t typeref:typename:EGLNativeFileDescriptorKHR (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLGETSYNCATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, E/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSyncKHR sync,EGLint attribute,EGLint * value)
+PFNEGLGETSYNCATTRIBNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, E/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLSyncNV sync,EGLint attribute,EGLint * value)
+PFNEGLGETSYNCATTRIBPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSync sync,EGLint attribute,EGLAttrib * value)
+PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void);$/;" t typeref:typename:EGLuint64NV (EGLAPIENTRYP)(void)
+PFNEGLGETSYSTEMTIMENVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void);$/;" t typeref:typename:EGLuint64NV (EGLAPIENTRYP)(void)
+PFNEGLINITIALIZEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *m/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint * major,EGLint * minor)
+PFNEGLLABELOBJECTKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLint (EGLAPIENTRYP PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, /;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLDisplay display,EGLenum objectType,EGLObjectKHR object,EGLLabelKHR label)
+PFNEGLLOCKSURFACEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,const EGLint * attrib_list)
+PFNEGLMAKECURRENTPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSur/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface draw,EGLSurface read,EGLContext ctx)
+PFNEGLOUTPUTLAYERATTRIBEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayer/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLOutputLayerEXT layer,EGLint attribute,EGLAttrib value)
+PFNEGLOUTPUTPORTATTRIBEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEX/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLOutputPortEXT port,EGLint attribute,EGLAttrib value)
+PFNEGLPOSTSUBBUFFERNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface,/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint x,EGLint y,EGLint width,EGLint height)
+PFNEGLPRESENTATIONTIMEANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLnsecsANDROID time)
+PFNEGLQUERYAPIPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void);$/;" t typeref:typename:EGLenum (EGLAPIENTRYP)(void)
+PFNEGLQUERYCONTEXTPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLContext ctx,EGLint attribute,EGLint * value)
+PFNEGLQUERYDEBUGKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib *value);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint attribute,EGLAttrib * value)
+PFNEGLQUERYDEVICEATTRIBEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint at/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDeviceEXT device,EGLint attribute,EGLAttrib * value)
+PFNEGLQUERYDEVICESEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *d/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint max_devices,EGLDeviceEXT * devices,EGLint * num_devices)
+PFNEGLQUERYDEVICESTRINGEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint n/;" t typeref:typename:const char * (EGLAPIENTRYP)(EGLDeviceEXT device,EGLint name)
+PFNEGLQUERYDISPLAYATTRIBEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attrib/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint attribute,EGLAttrib * value)
+PFNEGLQUERYDISPLAYATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBKHRPROC) (EGLDisplay dpy, EGLint name, /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint name,EGLAttrib * value)
+PFNEGLQUERYDISPLAYATTRIBNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribu/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint attribute,EGLAttrib * value)
+PFNEGLQUERYDMABUFFORMATSEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_fo/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint max_formats,EGLint * formats,EGLint * num_formats)
+PFNEGLQUERYDMABUFMODIFIERSEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint form/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint format,EGLint max_modifiers,EGLuint64KHR * modifiers,EGLBoolean * external_only,EGLint * num_modifiers)
+PFNEGLQUERYNATIVEDISPLAYNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDispl/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLNativeDisplayType * display_id)
+PFNEGLQUERYNATIVEPIXMAPNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surf,EGLNativePixmapType * pixmap)
+PFNEGLQUERYNATIVEWINDOWNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surf,EGLNativeWindowType * window)
+PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutput/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLOutputLayerEXT layer,EGLint attribute,EGLAttrib * value)
+PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutpu/;" t typeref:typename:const char * (EGLAPIENTRYP)(EGLDisplay dpy,EGLOutputLayerEXT layer,EGLint name)
+PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputP/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLOutputPortEXT port,EGLint attribute,EGLAttrib * value)
+PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutput/;" t typeref:typename:const char * (EGLAPIENTRYP)(EGLDisplay dpy,EGLOutputPortEXT port,EGLint name)
+PFNEGLQUERYSTREAMATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR s/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLAttrib * value)
+PFNEGLQUERYSTREAMKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream,/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLint * value)
+PFNEGLQUERYSTREAMMETADATANVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum name,EGLint n,EGLint offset,EGLint size,void * data)
+PFNEGLQUERYSTREAMTIMEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR str/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLTimeKHR * value)
+PFNEGLQUERYSTREAMU64KHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stre/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLuint64KHR * value)
+PFNEGLQUERYSTRINGPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name);$/;" t typeref:typename:const char * (EGLAPIENTRYP)(EGLDisplay dpy,EGLint name)
+PFNEGLQUERYSURFACE64KHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surfac/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLAttribKHR * value)
+PFNEGLQUERYSURFACEPOINTERANGLEPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint attribute,void ** value)
+PFNEGLQUERYSURFACEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EG/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint * value)
+PFNEGLQUERYWAYLANDBUFFERWL host/libs/graphics_detector/include/EGL/eglext.h /^#define PFNEGLQUERYWAYLANDBUFFERWL /;" d
+PFNEGLQUERYWAYLANDBUFFERWLPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC) (EGLDisplay dpy, struct wl_reso/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,struct wl_resource * buffer,EGLint attribute,EGLint * value)
+PFNEGLRELEASETEXIMAGEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface,/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint buffer)
+PFNEGLRELEASETHREADPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(void)
+PFNEGLRESETSTREAMNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLSETBLOBCACHEFUNCSANDROIDPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncAN/;" t typeref:typename:void (EGLAPIENTRYP)(EGLDisplay dpy,EGLSetBlobFuncANDROID set,EGLGetBlobFuncANDROID get)
+PFNEGLSETDAMAGEREGIONKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surfa/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint * rects,EGLint n_rects)
+PFNEGLSETSTREAMATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR str/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLAttrib value)
+PFNEGLSETSTREAMMETADATANVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR st/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLint n,EGLint offset,EGLint size,const void * data)
+PFNEGLSIGNALSYNCKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLe/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSyncKHR sync,EGLenum mode)
+PFNEGLSIGNALSYNCNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLSyncNV sync,EGLenum mode)
+PFNEGLSTREAMATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLint value)
+PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLS/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,const EGLAttrib * attrib_list)
+PFNEGLSTREAMCONSUMERACQUIREKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamK/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,const EGLAttrib * attrib_list)
+PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, /;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLSTREAMCONSUMEROUTPUTEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKH/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,EGLOutputLayerEXT layer)
+PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLS/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream,const EGLAttrib * attrib_list)
+PFNEGLSTREAMCONSUMERRELEASEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamK/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLSTREAMFLUSHNVPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMFLUSHNVPROC) (EGLDisplay dpy, EGLStreamKHR stream);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLStreamKHR stream)
+PFNEGLSURFACEATTRIBPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, E/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint value)
+PFNEGLSWAPBUFFERSPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface)
+PFNEGLSWAPBUFFERSREGION2NOKPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface su/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint numRects,const EGLint * rects)
+PFNEGLSWAPBUFFERSREGIONNOKPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface sur/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,EGLint numRects,const EGLint * rects)
+PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,const EGLint * rects,EGLint n_rects)
+PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface,const EGLint * rects,EGLint n_rects)
+PFNEGLSWAPINTERVALPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLint interval)
+PFNEGLTERMINATEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy)
+PFNEGLUNBINDWAYLANDDISPLAYWL host/libs/graphics_detector/include/EGL/eglext.h /^#define PFNEGLUNBINDWAYLANDDISPLAYWL /;" d
+PFNEGLUNBINDWAYLANDDISPLAYWLPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_di/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,struct wl_display * display)
+PFNEGLUNLOCKSURFACEKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSurface surface)
+PFNEGLUNSIGNALSYNCEXTPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSync sync,const EGLAttrib * attrib_list)
+PFNEGLWAITCLIENTPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(void)
+PFNEGLWAITGLPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(void)
+PFNEGLWAITNATIVEPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine);$/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLint engine)
+PFNEGLWAITSYNCKHRPROC host/libs/graphics_detector/include/EGL/eglext.h /^typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint fla/;" t typeref:typename:EGLint (EGLAPIENTRYP)(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags)
+PFNEGLWAITSYNCPROC host/libs/graphics_detector/include/EGL/egl.h /^typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags/;" t typeref:typename:EGLBoolean (EGLAPIENTRYP)(EGLDisplay dpy,EGLSync sync,EGLint flags)
+PHONE_PROCESS guest/hals/ril/reference-libril/ril.cpp /^#define PHONE_PROCESS /;" d file:
+PLAY_TONE host/commands/modem_simulator/stk_service.h /^ PLAY_TONE = 0x20,$/;" e enum:cuttlefish::StkService::CommandType
+PPP_TTY_PATH_ETH0 guest/hals/ril/reference-ril/reference-ril.c /^#define PPP_TTY_PATH_ETH0 /;" d file:
+PREFERRED_NETWORK guest/hals/ril/reference-ril/reference-ril.c /^#define PREFERRED_NETWORK(/;" d file:
+PREF_NET_TYPE_CDMA_EVDO_AUTO guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_CDMA_EVDO_AUTO = 4, \/* CDMA and EvDo (auto mode, according to PRL) /;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_CDMA_ONLY guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_CDMA_ONLY = 5, \/* CDMA only *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_EVDO_ONLY guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_EVDO_ONLY = 6, \/* EvDo only *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_GSM_ONLY guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_GSM_ONLY = 1, \/* GSM only *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_GSM_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_GSM_WCDMA = 0, \/* GSM\/WCDMA (WCDMA preferred) *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_GSM_WCDMA_AUTO guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_GSM_WCDMA_AUTO = 3, \/* GSM\/WCDMA (auto mode, according to PRL) *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO = 7, \/* GSM\/WCDMA, CDMA, and EvDo (auto mode, accor/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_LTE_CDMA_EVDO guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_LTE_CDMA_EVDO = 8, \/* LTE, CDMA and EvDo *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA = 10, \/* LTE, CDMA, EvDo, GSM\/WCDMA *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_LTE_GSM_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_LTE_GSM_WCDMA = 9, \/* LTE, GSM\/WCDMA *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_LTE_ONLY guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_LTE_ONLY = 11, \/* LTE only *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_LTE_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_LTE_WCDMA = 12, \/* LTE\/WCDMA *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_GSM guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_GSM = 16, \/* TD-SCDMA and GSM *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_GSM_LTE guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_GSM_LTE = 17, \/* TD-SCDMA,GSM and LTE *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA = 18, \/* TD-SCDMA, GSM\/WCDMA *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO = 21, \/* TD-SCDMA, GSM\/WCDMA, CDMA and Ev/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_LTE guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_LTE = 20, \/* TD-SCDMA, GSM\/WCDMA and LTE *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_LTE guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_LTE = 15, \/* TD-SCDMA and LTE *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA = 22 \/* TD-SCDMA, LTE, CDMA, EvDo GSM\/WC/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_ONLY guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_ONLY = 13, \/* TD-SCDMA only *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_WCDMA = 14, \/* TD-SCDMA and WCDMA *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_TD_SCDMA_WCDMA_LTE guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_TD_SCDMA_WCDMA_LTE = 19, \/* TD-SCDMA, WCDMA and LTE *\/$/;" e enum:__anon0bfbaecf0b03
+PREF_NET_TYPE_WCDMA guest/hals/ril/reference-libril/ril.h /^ PREF_NET_TYPE_WCDMA = 2, \/* WCDMA *\/$/;" e enum:__anon0bfbaecf0b03
+PRINTBUF_SIZE guest/hals/ril/reference-libril/ril.cpp /^#define PRINTBUF_SIZE /;" d file:
+PRODUCT_BRAND shared/auto/device.mk /^PRODUCT_BRAND := generic$/;" m
+PRODUCT_BUILD_RECOVERY_IMAGE shared/device.mk /^PRODUCT_BUILD_RECOVERY_IMAGE := true$/;" m
+PRODUCT_DEVICE vsoc_arm64/auto/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_arm64$/;" m
+PRODUCT_DEVICE vsoc_arm64/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_arm64$/;" m
+PRODUCT_DEVICE vsoc_arm64_only/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_arm64_only$/;" m
+PRODUCT_DEVICE vsoc_arm_only/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_arm_only$/;" m
+PRODUCT_DEVICE vsoc_x86/auto/device.mk /^PRODUCT_DEVICE := vsoc_x86$/;" m
+PRODUCT_DEVICE vsoc_x86/go_512_phone/device.mk /^PRODUCT_DEVICE := vsoc_x86$/;" m
+PRODUCT_DEVICE vsoc_x86/go_phone/device.mk /^PRODUCT_DEVICE := vsoc_x86$/;" m
+PRODUCT_DEVICE vsoc_x86/pasan/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_x86$/;" m
+PRODUCT_DEVICE vsoc_x86/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_x86$/;" m
+PRODUCT_DEVICE vsoc_x86/tv/device.mk /^PRODUCT_DEVICE := vsoc_x86$/;" m
+PRODUCT_DEVICE vsoc_x86_64/auto/device.mk /^PRODUCT_DEVICE := vsoc_x86_64$/;" m
+PRODUCT_DEVICE vsoc_x86_64/pc/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_x86_64$/;" m
+PRODUCT_DEVICE vsoc_x86_64/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_x86_64$/;" m
+PRODUCT_DEVICE vsoc_x86_64/tv/device.mk /^PRODUCT_DEVICE := vsoc_x86_64$/;" m
+PRODUCT_DEVICE vsoc_x86_64_only/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_x86_64_only$/;" m
+PRODUCT_DEVICE vsoc_x86_noapex/aosp_cf_noapex.mk /^PRODUCT_DEVICE := vsoc_x86_noapex$/;" m
+PRODUCT_DEVICE vsoc_x86_only/phone/aosp_cf.mk /^PRODUCT_DEVICE := vsoc_x86_only$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_arm64/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_arm64_only/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_arm_only/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_x86/pasan/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_x86/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_x86_64/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_x86_64_only/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS vsoc_x86_only/phone/aosp_cf.mk /^PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed$/;" m
+PRODUCT_ENFORCE_RRO_TARGETS shared/auto/device.mk /^PRODUCT_ENFORCE_RRO_TARGETS := framework-res$/;" m
+PRODUCT_ENFORCE_RRO_TARGETS shared/phone/device.mk /^PRODUCT_ENFORCE_RRO_TARGETS := framework-res$/;" m
+PRODUCT_EXTRA_VNDK_VERSIONS shared/device.mk /^PRODUCT_EXTRA_VNDK_VERSIONS := 28 29 30$/;" m
+PRODUCT_FS_COMPRESSION shared/device.mk /^PRODUCT_FS_COMPRESSION := 1$/;" m
+PRODUCT_MAKEFILES AndroidProducts.mk /^PRODUCT_MAKEFILES := \\$/;" m
+PRODUCT_MANUFACTURER vsoc_arm64/auto/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_arm64/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_arm64_only/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_arm_only/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86/auto/device.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86/go_512_phone/device.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86/go_phone/device.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86/pasan/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86/tv/device.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_64/auto/device.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_64/pc/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_64/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_64/tv/device.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_64_only/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_noapex/aosp_cf_noapex.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MANUFACTURER vsoc_x86_only/phone/aosp_cf.mk /^PRODUCT_MANUFACTURER := Google$/;" m
+PRODUCT_MODEL vsoc_arm64/auto/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish arm64 auto$/;" m
+PRODUCT_MODEL vsoc_arm64/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish arm64 phone$/;" m
+PRODUCT_MODEL vsoc_arm64_only/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish arm64 phone 64-bit only$/;" m
+PRODUCT_MODEL vsoc_arm_only/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish arm phone 32-bit only$/;" m
+PRODUCT_MODEL vsoc_x86/auto/device.mk /^PRODUCT_MODEL := Cuttlefish x86 auto$/;" m
+PRODUCT_MODEL vsoc_x86/go_512_phone/device.mk /^PRODUCT_MODEL := Cuttlefish x86 Go 512 phone$/;" m
+PRODUCT_MODEL vsoc_x86/go_phone/device.mk /^PRODUCT_MODEL := Cuttlefish x86 Go phone$/;" m
+PRODUCT_MODEL vsoc_x86/pasan/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish x86 phone$/;" m
+PRODUCT_MODEL vsoc_x86/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish x86 phone$/;" m
+PRODUCT_MODEL vsoc_x86/tv/device.mk /^PRODUCT_MODEL := Cuttlefish x86 tv$/;" m
+PRODUCT_MODEL vsoc_x86_64/auto/device.mk /^PRODUCT_MODEL := Cuttlefish x86_64 auto$/;" m
+PRODUCT_MODEL vsoc_x86_64/pc/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish x86_64 pc$/;" m
+PRODUCT_MODEL vsoc_x86_64/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish x86_64 phone$/;" m
+PRODUCT_MODEL vsoc_x86_64/phone/aosp_cf_foldable.mk /^PRODUCT_MODEL := Cuttlefish x86_64 foldable$/;" m
+PRODUCT_MODEL vsoc_x86_64/tv/device.mk /^PRODUCT_MODEL := Cuttlefish x86_64 tv$/;" m
+PRODUCT_MODEL vsoc_x86_64_only/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish x86_64 phone 64-bit only$/;" m
+PRODUCT_MODEL vsoc_x86_noapex/aosp_cf_noapex.mk /^PRODUCT_MODEL := Cuttlefish x86 phone without APEX support$/;" m
+PRODUCT_MODEL vsoc_x86_only/phone/aosp_cf.mk /^PRODUCT_MODEL := Cuttlefish x86 phone 32-bit kernel$/;" m
+PRODUCT_NAME vsoc_arm64/auto/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_arm64_auto$/;" m
+PRODUCT_NAME vsoc_arm64/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_arm64_phone$/;" m
+PRODUCT_NAME vsoc_arm64/phone/aosp_cf_hwasan.mk /^PRODUCT_NAME := aosp_cf_arm64_phone_hwasan$/;" m
+PRODUCT_NAME vsoc_arm64_only/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_arm64_only_phone$/;" m
+PRODUCT_NAME vsoc_arm64_only/phone/aosp_cf_hwasan.mk /^PRODUCT_NAME := aosp_cf_arm64_only_phone_hwasan$/;" m
+PRODUCT_NAME vsoc_arm_only/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_arm_only_phone$/;" m
+PRODUCT_NAME vsoc_x86/auto/device.mk /^PRODUCT_NAME := aosp_cf_x86_auto$/;" m
+PRODUCT_NAME vsoc_x86/go_512_phone/device.mk /^PRODUCT_NAME := aosp_cf_x86_go_512_phone$/;" m
+PRODUCT_NAME vsoc_x86/go_phone/device.mk /^PRODUCT_NAME := aosp_cf_x86_go_phone$/;" m
+PRODUCT_NAME vsoc_x86/pasan/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_x86_pasan$/;" m
+PRODUCT_NAME vsoc_x86/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_x86_phone$/;" m
+PRODUCT_NAME vsoc_x86/tv/device.mk /^PRODUCT_NAME := aosp_cf_x86_tv$/;" m
+PRODUCT_NAME vsoc_x86_64/auto/device.mk /^PRODUCT_NAME := aosp_cf_x86_64_auto$/;" m
+PRODUCT_NAME vsoc_x86_64/pc/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_x86_64_pc$/;" m
+PRODUCT_NAME vsoc_x86_64/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_x86_64_phone$/;" m
+PRODUCT_NAME vsoc_x86_64/phone/aosp_cf_foldable.mk /^PRODUCT_NAME := aosp_cf_x86_64_foldable$/;" m
+PRODUCT_NAME vsoc_x86_64/tv/device.mk /^PRODUCT_NAME := aosp_cf_x86_64_tv$/;" m
+PRODUCT_NAME vsoc_x86_64_only/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_x86_64_only_phone$/;" m
+PRODUCT_NAME vsoc_x86_noapex/aosp_cf_noapex.mk /^PRODUCT_NAME := aosp_cf_x86_phone_noapex$/;" m
+PRODUCT_NAME vsoc_x86_only/phone/aosp_cf.mk /^PRODUCT_NAME := aosp_cf_x86_only_phone$/;" m
+PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS vsoc_arm_only/phone/aosp_cf.mk /^PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS := false$/;" m
+PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS vsoc_x86_only/phone/aosp_cf.mk /^PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS := false$/;" m
+PRODUCT_PACKAGE_OVERLAYS vsoc_x86/go_512_phone/device.mk /^PRODUCT_PACKAGE_OVERLAYS := device\/google\/cuttlefish\/vsoc_x86\/phone\/overlay$/;" m
+PRODUCT_PACKAGE_OVERLAYS vsoc_x86/go_phone/device.mk /^PRODUCT_PACKAGE_OVERLAYS := device\/google\/cuttlefish\/vsoc_x86\/phone\/overlay$/;" m
+PRODUCT_REQUIRES_INSECURE_EXECMEM_FOR_SWIFTSHADER shared/device.mk /^PRODUCT_REQUIRES_INSECURE_EXECMEM_FOR_SWIFTSHADER := true$/;" m
+PRODUCT_SET_DEBUGFS_RESTRICTIONS shared/device.mk /^PRODUCT_SET_DEBUGFS_RESTRICTIONS := true$/;" m
+PRODUCT_SHIPPING_API_LEVEL shared/device.mk /^PRODUCT_SHIPPING_API_LEVEL := 33$/;" m
+PRODUCT_USE_DYNAMIC_PARTITIONS shared/device.mk /^PRODUCT_USE_DYNAMIC_PARTITIONS := true$/;" m
+PROPERTY_RIL_IMPL guest/hals/ril/reference-libril/ril.cpp /^#define PROPERTY_RIL_IMPL /;" d file:
+PROVIDE_LOCAL_INFORMATION host/commands/modem_simulator/stk_service.h /^ PROVIDE_LOCAL_INFORMATION = 0x26,$/;" e enum:cuttlefish::StkService::CommandType
+PT_GUARDED_BY common/libs/concurrency/thread_annotations.h /^#define PT_GUARDED_BY(/;" d
+PackagingBase build/cvd-host-package.go /^ android.PackagingBase$/;" M struct:cuttlefish.cvdHostPackage typeref:typename:android.PackagingBase
+PackagingItemAlwaysDepTag build/cvd-host-package.go /^ android.PackagingItemAlwaysDepTag \/\/ to force packaging of both "deps" and manually added de/;" M struct:cuttlefish.dependencyTag typeref:typename:android.PackagingItemAlwaysDepTag
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.0.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.1.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.10.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.11.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.12.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.13.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.14.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.15.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.16.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.17.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.18.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.19.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.2.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.20.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.21.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.22.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.23.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.24.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.25.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.26.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.27.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.28.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.28.Actions.1
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.29.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.29.Actions.1
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.3.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.30.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.4.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.5.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.6.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.7.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.8.Actions.0
+Params shared/config/task_profiles.json /^ "Params":$/;" o object:Profiles.9.Actions.0
+ParentKey host/commands/secure_env/primary_key_builder.cpp /^void PrimaryKeyBuilder::ParentKey() {$/;" f class:cuttlefish::PrimaryKeyBuilder typeref:typename:void
+ParentKeyCreator host/commands/secure_env/primary_key_builder.cpp /^ParentKeyCreator(const std::string& unique) {$/;" f namespace:cuttlefish typeref:typename:std::function<TpmObjectSlot (TpmResourceManager &)>
+ParentToChildMessage host/commands/run_cvd/process_monitor.cc /^struct ParentToChildMessage {$/;" s namespace:cuttlefish file:
+Parse common/libs/utils/flag_parser.cpp /^bool Flag::Parse(std::vector<std::string>& arguments) const {$/;" f class:cuttlefish::Flag typeref:typename:bool
+Parse common/libs/utils/flag_parser.cpp /^bool Flag::Parse(std::vector<std::string>&& arguments) const {$/;" f class:cuttlefish::Flag typeref:typename:bool
+ParseAddress common/libs/utils/network.cpp /^bool ParseAddress(const std::string& address, const std::string& separator,$/;" f namespace:cuttlefish::__anoncaae79910111 typeref:typename:bool
+ParseAddressList host/frontend/adb_connector/main.cpp /^std::vector<std::string> ParseAddressList(std::string ports) {$/;" f namespace:__anona4a84cd70111 typeref:typename:std::vector<std::string>
+ParseDisplayConfig host/commands/assemble_cvd/flags.cc /^std::optional<CuttlefishConfig::DisplayConfig> ParseDisplayConfig($/;" f namespace:cuttlefish::__anon145bfaab0111 typeref:typename:std::optional<CuttlefishConfig::DisplayConfig>
+ParseDnsmasqLeases common/libs/utils/network.cpp /^std::vector<DnsmasqDhcp4Lease> ParseDnsmasqLeases(SharedFD lease_file) {$/;" f namespace:cuttlefish typeref:typename:std::vector<DnsmasqDhcp4Lease>
+ParseFlags common/libs/utils/flag_parser.cpp /^bool ParseFlags(const std::vector<Flag>& flags,$/;" f namespace:cuttlefish typeref:typename:bool
+ParseGflags host/commands/assemble_cvd/flag_feature.h /^class ParseGflags : public FlagFeature {};$/;" c namespace:cuttlefish
+ParseGflagsImpl host/commands/assemble_cvd/flag_feature.cpp /^class ParseGflagsImpl : public ParseGflags {$/;" c namespace:cuttlefish file:
+ParseHttpHeaders host/frontend/webrtc/main.cpp /^static std::vector<std::pair<std::string, std::string>> ParseHttpHeaders($/;" f typeref:typename:std::vector<std::pair<std::string,std::string>> file:
+ParseInteger common/libs/utils/flag_parser.cpp /^std::optional<T> ParseInteger(const std::string& value) {$/;" f namespace:cuttlefish typeref:typename:std::optional<T>
+ParseInterfaceAttributes common/libs/device_config/host_device_config.cpp /^ bool ParseInterfaceAttributes(const std::string& interface) {$/;" f class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:bool file:
+ParseInterfaceAttributes common/libs/device_config/host_device_config.cpp /^ bool ParseInterfaceAttributes(struct ifaddrs* ifa) {$/;" f class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:bool file:
+ParseIpAddress common/libs/utils/network.cpp /^bool ParseIpAddress(const std::string& address, std::uint8_t ip[4]) {$/;" f namespace:cuttlefish::__anoncaae79910111 typeref:typename:bool
+ParseKeyBlob host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t ParseKeyBlob($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+ParseKeyBlob host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::ParseKeyBlob($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+ParseMacAddress common/libs/utils/network.cpp /^bool ParseMacAddress(const std::string& address, std::uint8_t mac[6]) {$/;" f namespace:cuttlefish::__anoncaae79910111 typeref:typename:bool
+ParseMessage host/frontend/webrtc/lib/streamer.cpp /^bool ParseMessage(const uint8_t* data, size_t length, Json::Value* msg_out) {$/;" f namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:bool
+ParseMiscInfo host/commands/assemble_cvd/misc_info.cc /^MiscInfo ParseMiscInfo(const std::string& misc_info_contents) {$/;" f namespace:cuttlefish typeref:typename:MiscInfo
+ParsePortRange host/commands/assemble_cvd/flags.cc /^std::pair<uint16_t, uint16_t> ParsePortRange(const std::string& flag) {$/;" f namespace:cuttlefish::__anon145bfaab0111 typeref:typename:std::pair<uint16_t,uint16_t>
+ParseRawData common/libs/confui/packet.cpp /^static std::optional<ParsedPacket> ParseRawData($/;" f namespace:cuttlefish::confui::packet typeref:typename:std::optional<ParsedPacket> file:
+ParseTimeZone host/commands/modem_simulator/misc_service.cpp /^void MiscService::ParseTimeZone() {$/;" f class:cuttlefish::MiscService typeref:typename:void
+ParsedPacket common/libs/confui/packet_types.h /^struct ParsedPacket {$/;" s namespace:cuttlefish::confui::packet
+PartitionInfo host/libs/image_aggregator/image_aggregator.cc /^struct PartitionInfo {$/;" s namespace:cuttlefish::__anon02806fd80111 file:
+Path host/libs/config/config_flag.cpp /^ const std::string& Path() override { return path_; }$/;" f class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:const std::string & file:
+Path host/libs/config/data_image.cpp /^ const std::string& Path() const override { return path_; }$/;" f class:cuttlefish::FixedDataImagePath typeref:typename:const std::string & file:
+Path host/libs/config/data_image.cpp /^ const std::string& Path() const override { return path_; }$/;" f class:cuttlefish::FixedMiscImagePath typeref:typename:const std::string & file:
+Path shared/config/cgroups.json /^ "Path": "\/dev\/cpuset",$/;" s object:Cgroups.0
+Path shared/config/task_profiles.json /^ "Path": ""$/;" s object:Profiles.1.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": ""$/;" s object:Profiles.14.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": ""$/;" s object:Profiles.21.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": ""$/;" s object:Profiles.22.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": ""$/;" s object:Profiles.23.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": ""$/;" s object:Profiles.6.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "application"$/;" s object:Profiles.11.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "application\/background"$/;" s object:Profiles.10.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "application\/performance"$/;" s object:Profiles.12.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "background"$/;" s object:Profiles.0.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "background"$/;" s object:Profiles.13.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "background"$/;" s object:Profiles.20.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "camera-daemon"$/;" s object:Profiles.19.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "foreground"$/;" s object:Profiles.15.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "foreground"$/;" s object:Profiles.3.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "restricted"$/;" s object:Profiles.18.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "rt"$/;" s object:Profiles.5.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "system"$/;" s object:Profiles.30.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "system"$/;" s object:Profiles.8.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "system-background"$/;" s object:Profiles.17.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "system-background"$/;" s object:Profiles.2.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "system\/background"$/;" s object:Profiles.7.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "system\/performance"$/;" s object:Profiles.9.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "top-app"$/;" s object:Profiles.16.Actions.0.Params
+Path shared/config/task_profiles.json /^ "Path": "top-app"$/;" s object:Profiles.4.Actions.0.Params
+PathsForInstance host/commands/stop/main.cc /^std::set<std::string> PathsForInstance(const CuttlefishConfig& config,$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:std::set<std::string>
+Payload common/libs/confui/packet_types.h /^using Payload = std::tuple<PayloadHeader, BufferType>;$/;" t namespace:cuttlefish::confui::packet typeref:typename:std::tuple<PayloadHeader,BufferType>
+PayloadHeader common/libs/confui/packet_types.h /^struct PayloadHeader {$/;" s namespace:cuttlefish::confui::packet
+Pending host/libs/allocd/request.h /^ Pending, \/\/ Request which has not been attempted$/;" e enum:cuttlefish::RequestStatus
+PerInstanceInternalPath host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::PerInstanceInternalPath($/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+PerInstancePath host/commands/modem_simulator/cf_device_config.cpp /^std::string DeviceConfig::PerInstancePath(const char* file_name) {$/;" f class:cuttlefish::modem::DeviceConfig typeref:typename:std::string
+PerInstancePath host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::PerInstancePath($/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+PhysicalChannelConfigV1_4 guest/hals/ril/reference-libril/ril_service.cpp /^using PhysicalChannelConfigV1_4 =$/;" t typeref:typename:android::hardware::radio::V1_4::PhysicalChannelConfig file:
+PinStatus host/commands/modem_simulator/sim_service.h /^ struct PinStatus {$/;" s class:cuttlefish::SimService
+Pipe common/libs/fs/shared_fd.cpp /^bool SharedFD::Pipe(SharedFD* fd0, SharedFD* fd1) {$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+Playing host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::Playing() const { return playing_; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+PlayoutDelay host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::PlayoutDelay(uint16_t* delayMS) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+PlayoutDeviceName host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::PlayoutDeviceName($/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+PlayoutDevices host/frontend/webrtc/lib/audio_device.cpp /^int16_t CfAudioDeviceModule::PlayoutDevices() { return 1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int16_t
+PlayoutIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::PlayoutIsAvailable(bool* available) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+PlayoutIsInitialized host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::PlayoutIsInitialized() const { return true; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+Poll host/frontend/webrtc_operator/client_handler.cpp /^HttpStatusCode ClientDynHandler::Poll($/;" f class:cuttlefish::ClientDynHandler typeref:typename:HttpStatusCode
+PollConnectionHandler host/frontend/webrtc_operator/client_handler.cpp /^class PollConnectionHandler : public ClientHandler {$/;" c namespace:cuttlefish file:
+PollConnectionStore host/frontend/webrtc_operator/client_handler.h /^class PollConnectionStore {$/;" c namespace:cuttlefish
+PollHandler host/frontend/webrtc_operator/client_handler.cpp /^PollHandler::PollHandler(struct lws* wsi, PollConnectionStore* poll_store)$/;" f class:cuttlefish::PollHandler
+PollHandler host/frontend/webrtc_operator/client_handler.h /^class PollHandler : public ClientDynHandler {$/;" c namespace:cuttlefish
+PollMessages host/frontend/webrtc_operator/client_handler.cpp /^ std::vector<Json::Value> PollMessages() {$/;" f class:cuttlefish::PollConnectionHandler typeref:typename:std::vector<Json::Value> file:
+PollingConnector host/frontend/webrtc_operator/assets/js/server_connector.js /^class PollingConnector extends Connector {$/;" c
+Pop common/libs/concurrency/multiplexer.h /^ T Pop() {$/;" f class:cuttlefish::Multiplexer typeref:typename:T
+Pop common/libs/concurrency/multiplexer.h /^ T Pop(QueueSelector selector) {$/;" f class:cuttlefish::Multiplexer typeref:typename:T
+Pop common/libs/concurrency/thread_safe_queue.h /^ T Pop() {$/;" f class:cuttlefish::ThreadSafeQueue typeref:typename:T
+Pop host/libs/screen_connector/screen_connector_multiplexer.h /^ ProcessedFrameType Pop() {$/;" f class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:ProcessedFrameType
+Pop host/libs/screen_connector/screen_connector_queue.h /^ T Pop() {$/;" f class:cuttlefish::ScreenConnectorQueue typeref:typename:T
+PopAll common/libs/concurrency/thread_safe_queue.h /^ QueueImpl PopAll() {$/;" f class:cuttlefish::ThreadSafeQueue typeref:typename:QueueImpl
+PopList common/libs/net/netlink_request.cpp /^void NetlinkRequest::PopList() {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+PopulateEglAvailability host/libs/graphics_detector/graphics_detector.cpp /^void PopulateEglAvailability(GraphicsAvailability* availability) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:void
+PopulateGlAvailability host/libs/graphics_detector/graphics_detector.cpp /^void PopulateGlAvailability(GraphicsAvailability* availability) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:void
+PopulateGles1Availability host/libs/graphics_detector/graphics_detector.cpp /^void PopulateGles1Availability(GraphicsAvailability* availability) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:void
+PopulateGles2Availability host/libs/graphics_detector/graphics_detector.cpp /^void PopulateGles2Availability(GraphicsAvailability* availability) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:void
+PopulateVulkanAvailability host/libs/graphics_detector/graphics_detector.cpp /^void PopulateVulkanAvailability(GraphicsAvailability* availability) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:void
+PortRangeSocketFactory host/frontend/webrtc/lib/port_range_socket_factory.cpp /^PortRangeSocketFactory::PortRangeSocketFactory($/;" f class:cuttlefish::webrtc_streaming::PortRangeSocketFactory
+PortRangeSocketFactory host/frontend/webrtc/lib/port_range_socket_factory.h /^class PortRangeSocketFactory : public rtc::BasicPacketSocketFactory {$/;" c namespace:cuttlefish::webrtc_streaming
+Post host/commands/modem_simulator/thread_looper.cpp /^ThreadLooper::Serial ThreadLooper::Post(Callback cb) {$/;" f class:cuttlefish::ThreadLooper typeref:typename:ThreadLooper::Serial
+PostWithDelay host/commands/modem_simulator/thread_looper.cpp /^ThreadLooper::Serial ThreadLooper::PostWithDelay($/;" f class:cuttlefish::ThreadLooper typeref:typename:ThreadLooper::Serial
+PowerwashCvdMain host/commands/powerwash_cvd/powerwash_cvd.cc /^int PowerwashCvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish::__anon7281a6ce0111 typeref:typename:int
+PowerwashFiles host/commands/run_cvd/server_loop.cpp /^ bool PowerwashFiles() {$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:bool file:
+PowerwashTest tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java /^public class PowerwashTest extends BaseHostJUnit4Test {$/;" c
+PrefixLength common/libs/net/network_interface.h /^ int PrefixLength() const {$/;" f class:cuttlefish::NetworkInterface typeref:typename:int
+PrepareStream host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::PrepareStream(StreamControlCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+PrimaryKeyBuilder host/commands/secure_env/primary_key_builder.cpp /^PrimaryKeyBuilder::PrimaryKeyBuilder() : public_area_({}) {$/;" f class:cuttlefish::PrimaryKeyBuilder
+PrimaryKeyBuilder host/commands/secure_env/primary_key_builder.h /^class PrimaryKeyBuilder {$/;" c namespace:cuttlefish
+PrintAll host/commands/run_cvd/reporting.cpp /^void DiagnosticInformation::PrintAll($/;" f class:cuttlefish::DiagnosticInformation typeref:typename:void
+Process common/libs/utils/flag_parser.cpp /^Flag::FlagProcessResult Flag::Process($/;" f class:cuttlefish::Flag typeref:typename:Flag::FlagProcessResult
+Process host/commands/assemble_cvd/flag_feature.cpp /^ bool Process(std::vector<std::string>& args) override {$/;" f class:cuttlefish::ParseGflagsImpl typeref:typename:bool file:
+Process host/libs/config/adb/flags.cpp /^ bool Process(std::vector<std::string>& args) override {$/;" f class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:bool file:
+Process host/libs/config/config_flag.cpp /^ bool Process(std::vector<std::string>& args) override {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:bool file:
+Process host/libs/config/config_flag.cpp /^ bool Process(std::vector<std::string>& args) override {$/;" f class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:bool file:
+Process host/libs/config/config_flag.cpp /^ bool Process(std::vector<std::string>&) override { return true; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagPlaceholderImpl typeref:typename:bool file:
+Process host/libs/config/config_flag.cpp /^ bool Process(std::vector<std::string>&) override {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:bool file:
+Process host/libs/config/custom_actions.cpp /^ bool Process(std::vector<std::string>& args) override {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:bool file:
+ProcessEvents guest/commands/vsoc_input_service/vsoc_input_service.cpp /^bool VSoCInputService::ProcessEvents() {$/;" f class:VSoCInputService typeref:typename:bool
+ProcessFlags host/libs/config/feature.cpp /^bool FlagFeature::ProcessFlags(const std::vector<FlagFeature*>& features,$/;" f class:cuttlefish::FlagFeature typeref:typename:bool
+ProcessLeader host/commands/run_cvd/boot_state_machine.cc /^class ProcessLeader : public Feature {$/;" c namespace:cuttlefish::__anone7ed366f0111 file:
+ProcessMessage host/commands/secure_env/gatekeeper_responder.cpp /^bool GatekeeperResponder::ProcessMessage() {$/;" f class:cuttlefish::GatekeeperResponder typeref:typename:bool
+ProcessMessage host/commands/secure_env/keymaster_responder.cpp /^bool KeymasterResponder::ProcessMessage() {$/;" f class:cuttlefish::KeymasterResponder typeref:typename:bool
+ProcessMonitor host/commands/run_cvd/process_monitor.cc /^ProcessMonitor::ProcessMonitor(bool restart_subprocesses)$/;" f class:cuttlefish::ProcessMonitor
+ProcessMonitor host/commands/run_cvd/process_monitor.h /^class ProcessMonitor {$/;" c namespace:cuttlefish
+ProcessSubscriptions host/commands/kernel_log_monitor/kernel_log_server.cc /^void ProcessSubscriptions($/;" f namespace:__anonfa7764770111 typeref:typename:void
+ProductName host/commands/fetcher/build_api.cc /^std::string BuildApi::ProductName(const DeviceBuild& build) {$/;" f class:cuttlefish::BuildApi typeref:typename:std::string
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ]$/;" a object:AggregateProfiles.1
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" /;" a object:AggregateProfiles.7
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ]$/;" a object:AggregateProfiles.2
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNorma/;" a object:AggregateProfiles.8
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" a object:AggregateProfiles.3
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" /;" a object:AggregateProfiles.9
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]$/;" a object:AggregateProfiles.5
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "ServiceCapacityLow", "TimerSlackNormal" ]$/;" a object:AggregateProfiles.10
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "ServiceCapacityRestricted", "TimerSlackNormal" ]$/;" a object:AggregateProfiles.11
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "ServicePerformance", "LowIoPriority", "TimerSlackNormal" ]$/;" a object:AggregateProfiles.4
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "TimerSlackNormal" ]$/;" a object:AggregateProfiles.0
+Profiles shared/config/task_profiles.json /^ "Profiles": [ "TimerSlackNormal" ]$/;" a object:AggregateProfiles.6
+Profiles shared/config/task_profiles.json /^ "Profiles": [$/;" a
+PromptUserConfirmation guest/hals/confirmationui/guest_session.cpp /^GuestSession::ResultTriple GuestSession::PromptUserConfirmation() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:GuestSession::ResultTriple
+ProtectiveMbr host/libs/image_aggregator/image_aggregator.cc /^MasterBootRecord ProtectiveMbr(std::uint64_t size) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:MasterBootRecord
+ProxyKeymasterContext host/commands/secure_env/proxy_keymaster_context.h /^ ProxyKeymasterContext(KeymasterContext& wrapped) : wrapped_(wrapped) {}$/;" f class:cuttlefish::ProxyKeymasterContext
+ProxyKeymasterContext host/commands/secure_env/proxy_keymaster_context.h /^class ProxyKeymasterContext : public keymaster::KeymasterContext {$/;" c namespace:cuttlefish
+PublicDeps host/commands/run_cvd/launch.cc /^using PublicDeps = fruit::Required<const CuttlefishConfig, VmManager,$/;" t namespace:cuttlefish typeref:typename:fruit::Required<const CuttlefishConfig,VmManager,const CuttlefishConfig::InstanceSpecific> file:
+Push common/libs/concurrency/multiplexer.h /^ void Push(const int idx, T&& t) {$/;" f class:cuttlefish::Multiplexer typeref:typename:void
+Push common/libs/concurrency/thread_safe_queue.h /^ bool Push(U&& u) {$/;" f class:cuttlefish::ThreadSafeQueue typeref:typename:bool
+Push guest/hals/confirmationui/guest_session.h /^ void Push(std::unique_ptr<ConfUiMessage>&& msg) { incoming_msg_queue_.Push(std::move(msg)); /;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:void
+Push host/libs/screen_connector/screen_connector_queue.h /^ void Push(T&& item) {$/;" f class:cuttlefish::ScreenConnectorQueue typeref:typename:void
+PushList common/libs/net/netlink_request.cpp /^void NetlinkRequest::PushList(uint16_t type) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void
+PushToAndroidQueue host/libs/screen_connector/screen_connector_multiplexer.h /^ void PushToAndroidQueue(ProcessedFrameType&& t) {$/;" f class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:void
+PushToConfUiQueue host/libs/screen_connector/screen_connector_multiplexer.h /^ void PushToConfUiQueue(ProcessedFrameType&& t) {$/;" f class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:void
+QCOW2_MAGIC host/libs/image_aggregator/image_aggregator.cc /^static const std::string QCOW2_MAGIC = "QFI\\xfb";$/;" v namespace:cuttlefish::__anon02806fd80111 typeref:typename:const std::string file:
+QCowHeader host/libs/image_aggregator/image_aggregator.cc /^struct __attribute__((packed)) QCowHeader {$/;" s namespace:cuttlefish::__anon02806fd80111 file:
+QUERY host/commands/modem_simulator/sim_service.h /^ QUERY = 2,$/;" e enum:cuttlefish::SimService::FacilityLock::Mode
+QemuManager host/libs/vm_manager/qemu_manager.cpp /^QemuManager::QemuManager(Arch arch) : arch_(arch) {}$/;" f class:cuttlefish::vm_manager::QemuManager
+QemuManager host/libs/vm_manager/qemu_manager.h /^class QemuManager : public VmManager {$/;" c namespace:cuttlefish::vm_manager
+QueryVideoEncoder host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^webrtc::VideoEncoderFactory::CodecInfo VP8OnlyEncoderFactory::QueryVideoEncoder($/;" f class:cuttlefish::webrtc_streaming::VP8OnlyEncoderFactory typeref:typename:webrtc::VideoEncoderFactory::CodecInfo
+Queue guest/hals/confirmationui/guest_session.h /^ using Queue = cuttlefish::ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>;$/;" t class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:cuttlefish::ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>
+Queue host/libs/screen_connector/screen_connector_multiplexer.h /^ using Queue = ScreenConnectorQueue<ProcessedFrameType>;$/;" t class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:ScreenConnectorQueue<ProcessedFrameType>
+QueueFullHandler common/libs/concurrency/thread_safe_queue.h /^ using QueueFullHandler = std::function<void(QueueImpl*)>;$/;" t class:cuttlefish::ThreadSafeQueue
+QueueFullHandler guest/hals/confirmationui/guest_session.h /^ void QueueFullHandler(QueueImpl* queue_impl) {$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:void
+QueueImpl common/libs/concurrency/thread_safe_queue.h /^ using QueueImpl = std::deque<T>;$/;" t class:cuttlefish::ThreadSafeQueue typeref:typename:std::deque<T>
+QueueImpl guest/hals/confirmationui/guest_session.h /^ using QueueImpl = Queue::QueueImpl;$/;" t class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:Queue::QueueImpl
+QueuePtr common/libs/concurrency/multiplexer.h /^ using QueuePtr = std::unique_ptr<Queue>;$/;" t class:cuttlefish::Multiplexer typeref:typename:std::unique_ptr<Queue>
+QueueSelector common/libs/concurrency/multiplexer.h /^ using QueueSelector = std::function<int(void)>;$/;" t class:cuttlefish::Multiplexer
+RADIO_ACCESS_NET_CDMA2000 guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_NET_CDMA2000 = 4, \/* CDMA 2000 network *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_ACCESS_NET_EUTRAN guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_NET_EUTRAN = 3, \/* Evolved Universal Terrestrial Radio Access Network *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_ACCESS_NET_GERAN guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_NET_GERAN = 1, \/* GSM EDGE Radio Access Network *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_ACCESS_NET_IWLAN guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_NET_IWLAN = 5, \/* Interworking Wireless LAN *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_ACCESS_NET_NGRAN guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_NET_NGRAN = 6, \/* Next-Generation Radio Access Network *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_ACCESS_NET_UTRAN guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_NET_UTRAN = 2, \/* Universal Terrestrial Radio Access Network *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_ACCESS_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RADIO_ACCESS_UNKNOWN = 0, \/* Unknown access network *\/$/;" e enum:__anon0bfbaecf5503
+RADIO_STATE_OFF guest/hals/ril/reference-libril/ril.h /^ RADIO_STATE_OFF = 0, \/* Radio explictly powered off (eg CFUN=0) *\/$/;" e enum:__anon0bfbaecf0403
+RADIO_STATE_OFF host/commands/modem_simulator/network_service.h /^ RADIO_STATE_OFF,$/;" e enum:cuttlefish::NetworkService::RadioState
+RADIO_STATE_ON guest/hals/ril/reference-libril/ril.h /^ RADIO_STATE_ON = 10 \/* Radio is on *\/$/;" e enum:__anon0bfbaecf0403
+RADIO_STATE_ON host/commands/modem_simulator/network_service.h /^ RADIO_STATE_ON,$/;" e enum:cuttlefish::NetworkService::RadioState
+RADIO_STATE_UNAVAILABLE guest/hals/ril/reference-libril/ril.h /^ RADIO_STATE_UNAVAILABLE = 1, \/* Radio unavailable (eg, resetting or not booted) */;" e enum:__anon0bfbaecf0403
+RADIO_TECH_1xRTT guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_1xRTT = 6,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_3GPP guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_3GPP = 1, \/* 3GPP Technologies - GSM, WCDMA *\/$/;" e enum:__anon0bfbaecf1703
+RADIO_TECH_3GPP2 guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_3GPP2 = 2 \/* 3GPP2 Technologies - CDMA *\/$/;" e enum:__anon0bfbaecf1703
+RADIO_TECH_EDGE guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_EDGE = 2,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_EHRPD guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_EHRPD = 13,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_EVDO_0 guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_EVDO_0 = 7,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_EVDO_A guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_EVDO_A = 8,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_EVDO_B guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_EVDO_B = 12,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_GPRS guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_GPRS = 1,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_GSM guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_GSM = 16, \/\/ Only supports voice$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_HSDPA guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_HSDPA = 9,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_HSPA guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_HSPA = 11,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_HSPAP guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_HSPAP = 15, \/\/ HSPA+$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_HSUPA guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_HSUPA = 10,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_IS95A guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_IS95A = 4,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_IS95B guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_IS95B = 5,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_IWLAN guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_IWLAN = 18,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_LTE guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_LTE = 14,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_LTE_CA guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_LTE_CA = 19,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_NR guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_NR = 20$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_TD_SCDMA guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_TD_SCDMA = 17,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_UMTS guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_UMTS = 3,$/;" e enum:__anon0bfbaecf0503
+RADIO_TECH_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RADIO_TECH_UNKNOWN = 0,$/;" e enum:__anon0bfbaecf0503
+RAF_1xRTT guest/hals/ril/reference-libril/ril.h /^ RAF_1xRTT = (1 << RADIO_TECH_1xRTT),$/;" e enum:__anon0bfbaecf0603
+RAF_EDGE guest/hals/ril/reference-libril/ril.h /^ RAF_EDGE = (1 << RADIO_TECH_EDGE),$/;" e enum:__anon0bfbaecf0603
+RAF_EHRPD guest/hals/ril/reference-libril/ril.h /^ RAF_EHRPD = (1 << RADIO_TECH_EHRPD),$/;" e enum:__anon0bfbaecf0603
+RAF_EVDO_0 guest/hals/ril/reference-libril/ril.h /^ RAF_EVDO_0 = (1 << RADIO_TECH_EVDO_0),$/;" e enum:__anon0bfbaecf0603
+RAF_EVDO_A guest/hals/ril/reference-libril/ril.h /^ RAF_EVDO_A = (1 << RADIO_TECH_EVDO_A),$/;" e enum:__anon0bfbaecf0603
+RAF_EVDO_B guest/hals/ril/reference-libril/ril.h /^ RAF_EVDO_B = (1 << RADIO_TECH_EVDO_B),$/;" e enum:__anon0bfbaecf0603
+RAF_GPRS guest/hals/ril/reference-libril/ril.h /^ RAF_GPRS = (1 << RADIO_TECH_GPRS),$/;" e enum:__anon0bfbaecf0603
+RAF_GSM guest/hals/ril/reference-libril/ril.h /^ RAF_GSM = (1 << RADIO_TECH_GSM),$/;" e enum:__anon0bfbaecf0603
+RAF_HSDPA guest/hals/ril/reference-libril/ril.h /^ RAF_HSDPA = (1 << RADIO_TECH_HSDPA),$/;" e enum:__anon0bfbaecf0603
+RAF_HSPA guest/hals/ril/reference-libril/ril.h /^ RAF_HSPA = (1 << RADIO_TECH_HSPA),$/;" e enum:__anon0bfbaecf0603
+RAF_HSPAP guest/hals/ril/reference-libril/ril.h /^ RAF_HSPAP = (1 << RADIO_TECH_HSPAP),$/;" e enum:__anon0bfbaecf0603
+RAF_HSUPA guest/hals/ril/reference-libril/ril.h /^ RAF_HSUPA = (1 << RADIO_TECH_HSUPA),$/;" e enum:__anon0bfbaecf0603
+RAF_IS95A guest/hals/ril/reference-libril/ril.h /^ RAF_IS95A = (1 << RADIO_TECH_IS95A),$/;" e enum:__anon0bfbaecf0603
+RAF_IS95B guest/hals/ril/reference-libril/ril.h /^ RAF_IS95B = (1 << RADIO_TECH_IS95B),$/;" e enum:__anon0bfbaecf0603
+RAF_LTE guest/hals/ril/reference-libril/ril.h /^ RAF_LTE = (1 << RADIO_TECH_LTE),$/;" e enum:__anon0bfbaecf0603
+RAF_LTE_CA guest/hals/ril/reference-libril/ril.h /^ RAF_LTE_CA = (1 << RADIO_TECH_LTE_CA),$/;" e enum:__anon0bfbaecf0603
+RAF_NR guest/hals/ril/reference-libril/ril.h /^ RAF_NR = (1 << RADIO_TECH_NR)$/;" e enum:__anon0bfbaecf0603
+RAF_TD_SCDMA guest/hals/ril/reference-libril/ril.h /^ RAF_TD_SCDMA = (1 << RADIO_TECH_TD_SCDMA),$/;" e enum:__anon0bfbaecf0603
+RAF_UMTS guest/hals/ril/reference-libril/ril.h /^ RAF_UMTS = (1 << RADIO_TECH_UMTS),$/;" e enum:__anon0bfbaecf0603
+RAF_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RAF_UNKNOWN = (1 << RADIO_TECH_UNKNOWN),$/;" e enum:__anon0bfbaecf0603
+RC_PHASE_APPLY guest/hals/ril/reference-libril/ril.h /^ RC_PHASE_APPLY = 2, \/\/ APPLY is sent after all LM's receive START and returned$/;" e enum:__anon0bfbaecf0803
+RC_PHASE_CONFIGURED guest/hals/ril/reference-libril/ril.h /^ RC_PHASE_CONFIGURED = 0, \/\/ LM is configured is initial value and value after FINISH comp/;" e enum:__anon0bfbaecf0803
+RC_PHASE_FINISH guest/hals/ril/reference-libril/ril.h /^ RC_PHASE_FINISH = 4 \/\/ FINISH is sent after all commands have completed. If an error$/;" e enum:__anon0bfbaecf0803
+RC_PHASE_START guest/hals/ril/reference-libril/ril.h /^ RC_PHASE_START = 1, \/\/ START is sent before Apply and indicates that an APPLY will b/;" e enum:__anon0bfbaecf0803
+RC_PHASE_UNSOL_RSP guest/hals/ril/reference-libril/ril.h /^ RC_PHASE_UNSOL_RSP = 3, \/\/ UNSOL_RSP is sent with RIL_UNSOL_RADIO_CAPABILITY$/;" e enum:__anon0bfbaecf0803
+RC_STATUS_FAIL guest/hals/ril/reference-libril/ril.h /^ RC_STATUS_FAIL = 2, \/\/ Tell modem the action transaction of set radio$/;" e enum:__anon0bfbaecf0903
+RC_STATUS_NONE guest/hals/ril/reference-libril/ril.h /^ RC_STATUS_NONE = 0, \/\/ This parameter has no meaning with RC_PHASE_START,$/;" e enum:__anon0bfbaecf0903
+RC_STATUS_SUCCESS guest/hals/ril/reference-libril/ril.h /^ RC_STATUS_SUCCESS = 1, \/\/ Tell modem the action transaction of set radio$/;" e enum:__anon0bfbaecf0903
+READ_ONLY host/libs/image_aggregator/cdisk_spec.proto /^ READ_ONLY = 0;$/;" e enum:ReadWriteCapability
+READ_WRITE host/libs/image_aggregator/cdisk_spec.proto /^ READ_WRITE = 1;$/;" e enum:ReadWriteCapability
+RECEIVE_DATA host/commands/modem_simulator/stk_service.h /^ RECEIVE_DATA = 0x42,$/;" e enum:cuttlefish::StkService::CommandType
+REFRESH host/commands/modem_simulator/stk_service.h /^ REFRESH = 0x01,$/;" e enum:cuttlefish::StkService::CommandType
+REFRESH_URL host/commands/fetcher/credential_source.cc /^std::string REFRESH_URL = "http:\/\/metadata.google.internal\/computeMetadata\/"$/;" v namespace:cuttlefish::__anone81850a20111 typeref:typename:std::string
+REFRESH_WINDOW host/commands/fetcher/credential_source.cc /^std::chrono::steady_clock::duration REFRESH_WINDOW =$/;" v namespace:cuttlefish::__anone81850a20111 typeref:typename:std::chrono::steady_clock::duration
+REGISTRATION host/commands/modem_simulator/sup_service.h /^ REGISTRATION = 3,$/;" e enum:cuttlefish::SupService::CallForwardInfo::CallForwardInfoStatus
+REGISTRATION_UNSOL_DISABLED host/commands/modem_simulator/network_service.h /^ REGISTRATION_UNSOL_DISABLED = 0,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::RegistrationUnsolMode
+REGISTRATION_UNSOL_ENABLED host/commands/modem_simulator/network_service.h /^ REGISTRATION_UNSOL_ENABLED = 1,$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::RegistrationUnsolMode
+REGISTRATION_UNSOL_ENABLED_FULL host/commands/modem_simulator/network_service.h /^ REGISTRATION_UNSOL_ENABLED_FULL = 2$/;" e enum:cuttlefish::NetworkService::NetworkRegistrationStatus::RegistrationUnsolMode
+REG_DATA_STATE_LEN guest/hals/ril/reference-ril/reference-ril.c /^#define REG_DATA_STATE_LEN /;" d file:
+REG_STATE_LEN guest/hals/ril/reference-ril/reference-ril.c /^#define REG_STATE_LEN /;" d file:
+RELEASE common/libs/concurrency/thread_annotations.h /^#define RELEASE(/;" d
+RELEASE_SHARED common/libs/concurrency/thread_annotations.h /^#define RELEASE_SHARED(/;" d
+REMOTE host/commands/modem_simulator/channel_monitor.h /^ enum ClientType { RIL, REMOTE };$/;" e enum:cuttlefish::Client::ClientType
+REMOTE_KEYMASTER_H_ guest/hals/keymaster/remote/remote_keymaster.h /^#define REMOTE_KEYMASTER_H_$/;" d
+REMOTE_KEYMASTER_H_ guest/hals/keymint/remote/remote_keymaster.h /^#define REMOTE_KEYMASTER_H_$/;" d
+REPOLL_CALLS_COUNT_MAX guest/hals/ril/reference-ril/reference-ril.c /^#define REPOLL_CALLS_COUNT_MAX /;" d file:
+REQUIRES common/libs/concurrency/thread_annotations.h /^#define REQUIRES(/;" d
+REQUIRES_SHARED common/libs/concurrency/thread_annotations.h /^#define REQUIRES_SHARED(/;" d
+RESPONSE_DATA_FILE_DES_FLAG guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_DES_FLAG /;" d file:
+RESPONSE_DATA_FILE_DES_LEN_FLAG guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_DES_LEN_FLAG /;" d file:
+RESPONSE_DATA_FILE_RECORD_LEN_1 guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_RECORD_LEN_1 /;" d file:
+RESPONSE_DATA_FILE_RECORD_LEN_2 guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_RECORD_LEN_2 /;" d file:
+RESPONSE_DATA_FILE_SIZE_1 guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_SIZE_1 /;" d file:
+RESPONSE_DATA_FILE_SIZE_2 guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_SIZE_2 /;" d file:
+RESPONSE_DATA_FILE_TYPE guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_FILE_TYPE /;" d file:
+RESPONSE_DATA_RECORD_LENGTH guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_RECORD_LENGTH /;" d file:
+RESPONSE_DATA_STRUCTURE guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_DATA_STRUCTURE /;" d file:
+RESPONSE_EF_SIZE guest/hals/ril/reference-ril/reference-ril.c /^#define RESPONSE_EF_SIZE /;" d file:
+RESPONSE_SOLICITED guest/hals/ril/reference-libril/ril_internal.h /^#define RESPONSE_SOLICITED /;" d
+RESPONSE_SOLICITED_ACK guest/hals/ril/reference-libril/ril_internal.h /^#define RESPONSE_SOLICITED_ACK /;" d
+RESPONSE_SOLICITED_ACK_EXP guest/hals/ril/reference-libril/ril_internal.h /^#define RESPONSE_SOLICITED_ACK_EXP /;" d
+RESPONSE_UNSOLICITED guest/hals/ril/reference-libril/ril_internal.h /^#define RESPONSE_UNSOLICITED /;" d
+RESPONSE_UNSOLICITED_ACK_EXP guest/hals/ril/reference-libril/ril_internal.h /^#define RESPONSE_UNSOLICITED_ACK_EXP /;" d
+RETURN_CAPABILITY common/libs/concurrency/thread_annotations.h /^#define RETURN_CAPABILITY(/;" d
+RIL host/commands/modem_simulator/channel_monitor.h /^ enum ClientType { RIL, REMOTE };$/;" e enum:cuttlefish::Client::ClientType
+RIL1_SERVICE_NAME guest/hals/ril/reference-libril/ril_internal.h /^#define RIL1_SERVICE_NAME /;" d
+RIL2_SERVICE_NAME guest/hals/ril/reference-libril/ril_internal.h /^#define RIL2_SERVICE_NAME /;" d
+RIL3_SERVICE_NAME guest/hals/ril/reference-libril/ril_internal.h /^#define RIL3_SERVICE_NAME /;" d
+RIL4_SERVICE_NAME guest/hals/ril/reference-libril/ril_internal.h /^#define RIL4_SERVICE_NAME /;" d
+RILC_LOG guest/hals/ril/reference-libril/ril_internal.h /^#define RILC_LOG /;" d
+RILConfig common/libs/device_config/device_config.proto /^ message RILConfig {$/;" m message:cuttlefish.DeviceConfig
+RIL_APN_TYPE_ALL guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_ALL = 0xFFFFFFFF \/\/ All APN types$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_CBS guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_CBS = 0x80, \/\/ APN type for CBS$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_DEFAULT guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_DEFAULT = 0x1, \/\/ APN type for default data traffic$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_DUN guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_DUN = 0x8, \/\/ APN type for DUN traffic$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_EMERGENCY guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_EMERGENCY = 0x200, \/\/ APN type for Emergency PDN. This is not an IA/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_FOTA guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_FOTA = 0x20, \/\/ APN type for FOTA$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_HIPRI guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_HIPRI = 0x10, \/\/ APN type for HiPri traffic$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_IA guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_IA = 0x100, \/\/ APN type for IA Initial Attach APN$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_IMS guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_IMS = 0x40, \/\/ APN type for IMS$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_MCX guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_MCX = 0x400, \/\/ APN type for Mission Critical Service$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_MMS guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_MMS = 0x2, \/\/ APN type for MMS traffic$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_SUPL guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_SUPL = 0x4, \/\/ APN type for SUPL assisted GPS$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_UNKNOWN = 0x0, \/\/ Unknown$/;" e enum:__anon0bfbaecfa003
+RIL_APN_TYPE_XCAP guest/hals/ril/reference-libril/ril.h /^ RIL_APN_TYPE_XCAP = 0x800, \/\/ APN type for XCAP$/;" e enum:__anon0bfbaecfa003
+RIL_APPSTATE_DETECTED guest/hals/ril/reference-libril/ril.h /^ RIL_APPSTATE_DETECTED = 1,$/;" e enum:__anon0bfbaecf3403
+RIL_APPSTATE_PIN guest/hals/ril/reference-libril/ril.h /^ RIL_APPSTATE_PIN = 2, \/* If PIN1 or UPin is required *\/$/;" e enum:__anon0bfbaecf3403
+RIL_APPSTATE_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_APPSTATE_PUK = 3, \/* If PUK1 or Puk for UPin is required *\/$/;" e enum:__anon0bfbaecf3403
+RIL_APPSTATE_READY guest/hals/ril/reference-libril/ril.h /^ RIL_APPSTATE_READY = 5$/;" e enum:__anon0bfbaecf3403
+RIL_APPSTATE_SUBSCRIPTION_PERSO guest/hals/ril/reference-libril/ril.h /^ RIL_APPSTATE_SUBSCRIPTION_PERSO = 4, \/* perso_substate should be look at$/;" e enum:__anon0bfbaecf3403
+RIL_APPSTATE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_APPSTATE_UNKNOWN = 0,$/;" e enum:__anon0bfbaecf3403
+RIL_APPTYPE_CSIM guest/hals/ril/reference-libril/ril.h /^ RIL_APPTYPE_CSIM = 4,$/;" e enum:__anon0bfbaecf3603
+RIL_APPTYPE_ISIM guest/hals/ril/reference-libril/ril.h /^ RIL_APPTYPE_ISIM = 5$/;" e enum:__anon0bfbaecf3603
+RIL_APPTYPE_RUIM guest/hals/ril/reference-libril/ril.h /^ RIL_APPTYPE_RUIM = 3,$/;" e enum:__anon0bfbaecf3603
+RIL_APPTYPE_SIM guest/hals/ril/reference-libril/ril.h /^ RIL_APPTYPE_SIM = 1,$/;" e enum:__anon0bfbaecf3603
+RIL_APPTYPE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_APPTYPE_UNKNOWN = 0,$/;" e enum:__anon0bfbaecf3603
+RIL_APPTYPE_USIM guest/hals/ril/reference-libril/ril.h /^ RIL_APPTYPE_USIM = 2,$/;" e enum:__anon0bfbaecf3603
+RIL_ActivityStatsInfo guest/hals/ril/reference-libril/ril.h /^} RIL_ActivityStatsInfo;$/;" t typeref:struct:__anon0bfbaecf9f08
+RIL_ApnTypes guest/hals/ril/reference-libril/ril.h /^} RIL_ApnTypes;$/;" t typeref:enum:__anon0bfbaecfa003
+RIL_AppState guest/hals/ril/reference-libril/ril.h /^} RIL_AppState;$/;" t typeref:enum:__anon0bfbaecf3403
+RIL_AppStatus guest/hals/ril/reference-libril/ril.h /^} RIL_AppStatus;$/;" t typeref:struct:__anon0bfbaecf3808
+RIL_AppStatusV1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_AppStatusV1_5;$/;" t typeref:struct:__anon0bfbaecf3e08
+RIL_AppType guest/hals/ril/reference-libril/ril.h /^} RIL_AppType;$/;" t typeref:enum:__anon0bfbaecf3603
+RIL_CALL_ACTIVE guest/hals/ril/reference-libril/ril.h /^ RIL_CALL_ACTIVE = 0,$/;" e enum:__anon0bfbaecf0303
+RIL_CALL_ALERTING guest/hals/ril/reference-libril/ril.h /^ RIL_CALL_ALERTING = 3, \/* MO call only *\/$/;" e enum:__anon0bfbaecf0303
+RIL_CALL_DIALING guest/hals/ril/reference-libril/ril.h /^ RIL_CALL_DIALING = 2, \/* MO call only *\/$/;" e enum:__anon0bfbaecf0303
+RIL_CALL_HOLDING guest/hals/ril/reference-libril/ril.h /^ RIL_CALL_HOLDING = 1,$/;" e enum:__anon0bfbaecf0303
+RIL_CALL_INCOMING guest/hals/ril/reference-libril/ril.h /^ RIL_CALL_INCOMING = 4, \/* MT call only *\/$/;" e enum:__anon0bfbaecf0303
+RIL_CALL_WAITING guest/hals/ril/reference-libril/ril.h /^ RIL_CALL_WAITING = 5 \/* MT call only *\/$/;" e enum:__anon0bfbaecf0303
+RIL_CARDSTATE_ABSENT guest/hals/ril/reference-libril/ril.h /^ RIL_CARDSTATE_ABSENT = 0,$/;" e enum:__anon0bfbaecf3203
+RIL_CARDSTATE_ERROR guest/hals/ril/reference-libril/ril.h /^ RIL_CARDSTATE_ERROR = 2,$/;" e enum:__anon0bfbaecf3203
+RIL_CARDSTATE_PRESENT guest/hals/ril/reference-libril/ril.h /^ RIL_CARDSTATE_PRESENT = 1,$/;" e enum:__anon0bfbaecf3203
+RIL_CARDSTATE_RESTRICTED guest/hals/ril/reference-libril/ril.h /^ RIL_CARDSTATE_RESTRICTED = 3 \/* card is present but not usable due to carrier restrictions/;" e enum:__anon0bfbaecf3203
+RIL_CARD_MAX_APPS guest/hals/ril/reference-libril/ril.h /^#define RIL_CARD_MAX_APPS /;" d
+RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_CONNECTED_NUMBER_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_CONNECTED_NUMBER_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_CallWaiting_v5 guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_CallWaiting_v5;$/;" t typeref:struct:__anon0bfbaecf4208
+RIL_CDMA_CallWaiting_v6 guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_CallWaiting_v6;$/;" t typeref:struct:__anon0bfbaecf4308
+RIL_CDMA_DISPLAY_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_DISPLAY_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_DisplayInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_DisplayInfoRecord;$/;" t typeref:struct:__anon0bfbaecf8208
+RIL_CDMA_EXTENDED_DISPLAY_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_EXTENDED_DISPLAY_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_InfoRecName guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_InfoRecName;$/;" t typeref:enum:__anon0bfbaecf8103
+RIL_CDMA_InformationRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_InformationRecord;$/;" t typeref:struct:__anon0bfbaecf8908
+RIL_CDMA_InformationRecords guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_InformationRecords;$/;" t typeref:struct:__anon0bfbaecf8b08
+RIL_CDMA_LINE_CONTROL_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_LINE_CONTROL_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_LineControlInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_LineControlInfoRecord;$/;" t typeref:struct:__anon0bfbaecf8608
+RIL_CDMA_MAX_NUMBER_OF_INFO_RECS guest/hals/ril/reference-libril/ril.h /^#define RIL_CDMA_MAX_NUMBER_OF_INFO_RECS /;" d
+RIL_CDMA_NumberInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_NumberInfoRecord;$/;" t typeref:struct:__anon0bfbaecf8308
+RIL_CDMA_OTA_ProvisionStatus guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_OTA_ProvisionStatus;$/;" t typeref:enum:__anon0bfbaecf4503
+RIL_CDMA_REDIRECTING_NUMBER_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_REDIRECTING_NUMBER_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_RedirectingNumberInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_RedirectingNumberInfoRecord;$/;" t typeref:struct:__anon0bfbaecf8508
+RIL_CDMA_RedirectingReason guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_RedirectingReason;$/;" t typeref:enum:__anon0bfbaecf8403
+RIL_CDMA_SIGNAL_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SIGNAL_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_SignalInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_SignalInfoRecord;$/;" t typeref:struct:__anon0bfbaecf1008
+RIL_CDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_SignalStrength;$/;" t typeref:struct:__anon0bfbaecf4908
+RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_T53_AudioControlInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_T53_AudioControlInfoRecord;$/;" t typeref:struct:__anon0bfbaecf8808
+RIL_CDMA_T53_CLIRInfoRecord guest/hals/ril/reference-libril/ril.h /^} RIL_CDMA_T53_CLIRInfoRecord;$/;" t typeref:struct:__anon0bfbaecf8708
+RIL_CDMA_T53_CLIR_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_T53_CLIR_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CDMA_T53_RELEASE_INFO_REC guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_T53_RELEASE_INFO_REC,$/;" e enum:__anon0bfbaecf8103
+RIL_CELL_INFO_TYPE_CDMA guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_CDMA = 2,$/;" e enum:__anon0bfbaecf6b03
+RIL_CELL_INFO_TYPE_GSM guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_GSM = 1,$/;" e enum:__anon0bfbaecf6b03
+RIL_CELL_INFO_TYPE_LTE guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_LTE = 3,$/;" e enum:__anon0bfbaecf6b03
+RIL_CELL_INFO_TYPE_NONE guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_NONE = 0, \/* indicates no cell information *\/$/;" e enum:__anon0bfbaecf6b03
+RIL_CELL_INFO_TYPE_NR guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_NR = 6$/;" e enum:__anon0bfbaecf6b03
+RIL_CELL_INFO_TYPE_TD_SCDMA guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_TD_SCDMA = 5,$/;" e enum:__anon0bfbaecf6b03
+RIL_CELL_INFO_TYPE_WCDMA guest/hals/ril/reference-libril/ril.h /^ RIL_CELL_INFO_TYPE_WCDMA = 4,$/;" e enum:__anon0bfbaecf6b03
+RIL_Call guest/hals/ril/reference-libril/ril.h /^} RIL_Call;$/;" t typeref:struct:__anon0bfbaecf1108
+RIL_CallForwardInfo guest/hals/ril/reference-libril/ril.h /^}RIL_CallForwardInfo;$/;" t typeref:struct:__anon0bfbaecf2108
+RIL_CallState guest/hals/ril/reference-libril/ril.h /^} RIL_CallState;$/;" t typeref:enum:__anon0bfbaecf0303
+RIL_Cancel guest/hals/ril/reference-libril/ril.h /^typedef void (*RIL_Cancel)(RIL_Token t);$/;" t typeref:typename:void (*)(RIL_Token t)
+RIL_CardState guest/hals/ril/reference-libril/ril.h /^} RIL_CardState;$/;" t typeref:enum:__anon0bfbaecf3203
+RIL_CardStatus_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CardStatus_v1_2;$/;" t typeref:struct:__anon0bfbaecf3b08
+RIL_CardStatus_v1_4 guest/hals/ril/reference-libril/ril.h /^} RIL_CardStatus_v1_4;$/;" t typeref:struct:__anon0bfbaecf3c08
+RIL_CardStatus_v1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_CardStatus_v1_5; \/\/ 1.5$/;" t typeref:struct:__anon0bfbaecf3f08
+RIL_CardStatus_v5 guest/hals/ril/reference-libril/ril.h /^} RIL_CardStatus_v5;$/;" t typeref:struct:__anon0bfbaecf3908
+RIL_CardStatus_v6 guest/hals/ril/reference-libril/ril.h /^} RIL_CardStatus_v6;$/;" t typeref:struct:__anon0bfbaecf3a08
+RIL_Carrier guest/hals/ril/reference-libril/ril.h /^} RIL_Carrier;$/;" t typeref:struct:__anon0bfbaecf2608
+RIL_CarrierInfoForImsiEncryption guest/hals/ril/reference-libril/ril.h /^} RIL_CarrierInfoForImsiEncryption;$/;" t typeref:struct:__anon0bfbaecf2a08
+RIL_CarrierInfoForImsiEncryption_v16 guest/hals/ril/reference-libril/ril.h /^} RIL_CarrierInfoForImsiEncryption_v16;$/;" t typeref:struct:__anon0bfbaecf2c08
+RIL_CarrierMatchType guest/hals/ril/reference-libril/ril.h /^} RIL_CarrierMatchType;$/;" t typeref:enum:__anon0bfbaecf2503
+RIL_CarrierRestrictions guest/hals/ril/reference-libril/ril.h /^} RIL_CarrierRestrictions;$/;" t typeref:struct:__anon0bfbaecf2708
+RIL_CarrierRestrictionsWithPriority guest/hals/ril/reference-libril/ril.h /^} RIL_CarrierRestrictionsWithPriority;$/;" t typeref:struct:__anon0bfbaecf2908
+RIL_CdmaSubscriptionSource guest/hals/ril/reference-libril/ril.h /^} RIL_CdmaSubscriptionSource;$/;" t typeref:enum:__anon0bfbaecf0c03
+RIL_CellConnectionStatus guest/hals/ril/reference-libril/ril.h /^} RIL_CellConnectionStatus;$/;" t typeref:enum:__anon0bfbaecf6d03
+RIL_CellIdentityCdma guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityCdma;$/;" t typeref:struct:__anon0bfbaecf5c08
+RIL_CellIdentityCdma_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityCdma_v1_2;$/;" t typeref:struct:__anon0bfbaecf7c08
+RIL_CellIdentityGsm guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityGsm;$/;" t typeref:struct:__anon0bfbaecf5808
+RIL_CellIdentityGsm_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityGsm_v12;$/;" t typeref:struct:__anon0bfbaecf5908
+RIL_CellIdentityGsm_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityGsm_v1_2;$/;" t typeref:struct:__anon0bfbaecf7808
+RIL_CellIdentityLte guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityLte;$/;" t typeref:struct:__anon0bfbaecf5d08
+RIL_CellIdentityLte_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityLte_v12;$/;" t typeref:struct:__anon0bfbaecf5e08
+RIL_CellIdentityLte_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityLte_v1_2;$/;" t typeref:struct:__anon0bfbaecf7a08
+RIL_CellIdentityNr guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityNr;$/;" t typeref:struct:__anon0bfbaecf6108
+RIL_CellIdentityOperatorNames guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityOperatorNames;$/;" t typeref:struct:__anon0bfbaecf6008
+RIL_CellIdentityTdscdma guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityTdscdma;$/;" t typeref:struct:__anon0bfbaecf5f08
+RIL_CellIdentityTdscdma_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityTdscdma_v1_2;$/;" t typeref:struct:__anon0bfbaecf7b08
+RIL_CellIdentityWcdma guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityWcdma;$/;" t typeref:struct:__anon0bfbaecf5a08
+RIL_CellIdentityWcdma_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityWcdma_v12;$/;" t typeref:struct:__anon0bfbaecf5b08
+RIL_CellIdentityWcdma_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentityWcdma_v1_2;$/;" t typeref:struct:__anon0bfbaecf7908
+RIL_CellIdentity_v16 guest/hals/ril/reference-libril/ril.h /^}RIL_CellIdentity_v16;$/;" t typeref:struct:__anon0bfbaecf7408
+RIL_CellIdentity_v1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentity_v1_2;$/;" t typeref:struct:__anon0bfbaecf7d08
+RIL_CellIdentity_v20 guest/hals/ril/reference-libril/ril.h /^} RIL_CellIdentity_v20;$/;" t typeref:struct:__anon0bfbaecf7608
+RIL_CellInfo guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfo;$/;" t typeref:struct:__anon0bfbaecf6e08
+RIL_CellInfoCdma guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoCdma;$/;" t typeref:struct:__anon0bfbaecf6608
+RIL_CellInfoGsm guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoGsm;$/;" t typeref:struct:__anon0bfbaecf6208
+RIL_CellInfoGsm_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoGsm_v12;$/;" t typeref:struct:__anon0bfbaecf6308
+RIL_CellInfoLte guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoLte;$/;" t typeref:struct:__anon0bfbaecf6708
+RIL_CellInfoLte_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoLte_v12;$/;" t typeref:struct:__anon0bfbaecf6808
+RIL_CellInfoNr guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoNr;$/;" t typeref:struct:__anon0bfbaecf6a08
+RIL_CellInfoTdscdma guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoTdscdma;$/;" t typeref:struct:__anon0bfbaecf6908
+RIL_CellInfoType guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoType;$/;" t typeref:enum:__anon0bfbaecf6b03
+RIL_CellInfoWcdma guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoWcdma;$/;" t typeref:struct:__anon0bfbaecf6408
+RIL_CellInfoWcdma_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfoWcdma_v12;$/;" t typeref:struct:__anon0bfbaecf6508
+RIL_CellInfo_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfo_v12;$/;" t typeref:struct:__anon0bfbaecf7008
+RIL_CellInfo_v16 guest/hals/ril/reference-libril/ril.h /^} RIL_CellInfo_v16;$/;" t typeref:struct:__anon0bfbaecf7208
+RIL_CfData guest/hals/ril/reference-libril/ril.h /^} RIL_CfData;$/;" t typeref:struct:__anon0bfbaecf9808
+RIL_DATA_PROFILE_CBS guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_CBS = 4,$/;" e enum:__anon0bfbaecf3003
+RIL_DATA_PROFILE_DEFAULT guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_DEFAULT = 0,$/;" e enum:__anon0bfbaecf3003
+RIL_DATA_PROFILE_FOTA guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_FOTA = 3,$/;" e enum:__anon0bfbaecf3003
+RIL_DATA_PROFILE_IMS guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_IMS = 2,$/;" e enum:__anon0bfbaecf3003
+RIL_DATA_PROFILE_INVALID guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_INVALID = 0xFFFFFFFF$/;" e enum:__anon0bfbaecf3003
+RIL_DATA_PROFILE_OEM_BASE guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_OEM_BASE = 1000, \/* Start of OEM-specific profiles *\/$/;" e enum:__anon0bfbaecf3003
+RIL_DATA_PROFILE_TETHERED guest/hals/ril/reference-libril/ril.h /^ RIL_DATA_PROFILE_TETHERED = 1,$/;" e enum:__anon0bfbaecf3003
+RIL_DC_POWER_STATE_HIGH guest/hals/ril/reference-libril/ril.h /^ RIL_DC_POWER_STATE_HIGH = 3, \/\/ High power state$/;" e enum:__anon0bfbaecf9b03
+RIL_DC_POWER_STATE_LOW guest/hals/ril/reference-libril/ril.h /^ RIL_DC_POWER_STATE_LOW = 1, \/\/ Low power state$/;" e enum:__anon0bfbaecf9b03
+RIL_DC_POWER_STATE_MEDIUM guest/hals/ril/reference-libril/ril.h /^ RIL_DC_POWER_STATE_MEDIUM = 2, \/\/ Medium power state$/;" e enum:__anon0bfbaecf9b03
+RIL_DC_POWER_STATE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_DC_POWER_STATE_UNKNOWN = INT32_MAX \/\/ Unknown state$/;" e enum:__anon0bfbaecf9b03
+RIL_DST_CHARGING_STATE guest/hals/ril/reference-libril/ril.h /^ RIL_DST_CHARGING_STATE, \/\/ Device charging state (provided by BatteryManager)$/;" e enum:__anon0bfbaecfa103
+RIL_DST_LOW_DATA_EXPECTED guest/hals/ril/reference-libril/ril.h /^ RIL_DST_LOW_DATA_EXPECTED \/\/ Low data expected mode. True indicates low data traffic$/;" e enum:__anon0bfbaecfa103
+RIL_DST_POWER_SAVE_MODE guest/hals/ril/reference-libril/ril.h /^ RIL_DST_POWER_SAVE_MODE, \/\/ Device power save mode (provided by PowerManager)$/;" e enum:__anon0bfbaecfa103
+RIL_DataCallFailCause guest/hals/ril/reference-libril/ril.h /^} RIL_DataCallFailCause;$/;" t typeref:enum:__anon0bfbaecf2f03
+RIL_DataProfile guest/hals/ril/reference-libril/ril.h /^} RIL_DataProfile;$/;" t typeref:enum:__anon0bfbaecf3003
+RIL_DataProfileInfo guest/hals/ril/reference-libril/ril.h /^} RIL_DataProfileInfo;$/;" t typeref:struct:__anon0bfbaecf9d08
+RIL_DataProfileInfo_v15 guest/hals/ril/reference-libril/ril.h /^} RIL_DataProfileInfo_v15;$/;" t typeref:struct:__anon0bfbaecf9e08
+RIL_DataRegistrationStateResponse guest/hals/ril/reference-libril/ril.h /^}RIL_DataRegistrationStateResponse;$/;" t typeref:struct:__anon0bfbaecf8008
+RIL_DataRequestReason guest/hals/ril/reference-libril/ril.h /^} RIL_DataRequestReason;$/;" t typeref:enum:__anon0bfbaecfbe03
+RIL_Data_Call_Response_v11 guest/hals/ril/reference-libril/ril.h /^} RIL_Data_Call_Response_v11;$/;" t typeref:struct:__anon0bfbaecf1508
+RIL_Data_Call_Response_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_Data_Call_Response_v12;$/;" t typeref:struct:__anon0bfbaecf1608
+RIL_Data_Call_Response_v4 guest/hals/ril/reference-libril/ril.h /^} RIL_Data_Call_Response_v4;$/;" t typeref:struct:__anon0bfbaecf1208
+RIL_Data_Call_Response_v6 guest/hals/ril/reference-libril/ril.h /^} RIL_Data_Call_Response_v6;$/;" t typeref:struct:__anon0bfbaecf1308
+RIL_Data_Call_Response_v9 guest/hals/ril/reference-libril/ril.h /^} RIL_Data_Call_Response_v9;$/;" t typeref:struct:__anon0bfbaecf1408
+RIL_DcPowerStates guest/hals/ril/reference-libril/ril.h /^} RIL_DcPowerStates;$/;" t typeref:enum:__anon0bfbaecf9b03
+RIL_DcRtInfo guest/hals/ril/reference-libril/ril.h /^} RIL_DcRtInfo;$/;" t typeref:struct:__anon0bfbaecf9c08
+RIL_DeviceStateType guest/hals/ril/reference-libril/ril.h /^} RIL_DeviceStateType;$/;" t typeref:enum:__anon0bfbaecfa103
+RIL_Dial guest/hals/ril/reference-libril/ril.h /^} RIL_Dial;$/;" t typeref:struct:__anon0bfbaecf1c08
+RIL_ERRNO_INVALID_RESPONSE guest/hals/ril/reference-libril/ril.cpp /^#define RIL_ERRNO_INVALID_RESPONSE /;" d file:
+RIL_ERRNO_NO_MEMORY guest/hals/ril/reference-libril/ril.cpp /^#define RIL_ERRNO_NO_MEMORY /;" d file:
+RIL_EVDO_SignalStrength guest/hals/ril/reference-libril/ril.h /^} RIL_EVDO_SignalStrength;$/;" t typeref:struct:__anon0bfbaecf4a08
+RIL_EX_H_INCLUDED guest/hals/ril/reference-libril/ril_ex.h /^#define RIL_EX_H_INCLUDED$/;" d
+RIL_E_ABORTED guest/hals/ril/reference-libril/ril.h /^ RIL_E_ABORTED = 65, \/* Operation aborted *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_CANCELLED guest/hals/ril/reference-libril/ril.h /^ RIL_E_CANCELLED = 7,$/;" e enum:__anon0bfbaecf0203
+RIL_E_DEVICE_IN_USE guest/hals/ril/reference-libril/ril.h /^ RIL_E_DEVICE_IN_USE = 64, \/* Operation cannot be performed because the de/;" e enum:__anon0bfbaecf0203
+RIL_E_DIAL_MODIFIED_TO_DIAL guest/hals/ril/reference-libril/ril.h /^ RIL_E_DIAL_MODIFIED_TO_DIAL = 20, \/* DIAL request modified to DIAL with different$/;" e enum:__anon0bfbaecf0203
+RIL_E_DIAL_MODIFIED_TO_SS guest/hals/ril/reference-libril/ril.h /^ RIL_E_DIAL_MODIFIED_TO_SS = 19, \/* DIAL request modified to SS *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_DIAL_MODIFIED_TO_USSD guest/hals/ril/reference-libril/ril.h /^ RIL_E_DIAL_MODIFIED_TO_USSD = 18, \/* DIAL request modified to USSD *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_EMPTY_RECORD guest/hals/ril/reference-libril/ril.h /^ RIL_E_EMPTY_RECORD = 55, \/* The request record is empty *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_ENCODING_ERR guest/hals/ril/reference-libril/ril.h /^ RIL_E_ENCODING_ERR = 57, \/* Message not encoded properly *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_FDN_CHECK_FAILURE guest/hals/ril/reference-libril/ril.h /^ RIL_E_FDN_CHECK_FAILURE = 14, \/* command failed because recipient is not on F/;" e enum:__anon0bfbaecf0203
+RIL_E_GENERIC_FAILURE guest/hals/ril/reference-libril/ril.h /^ RIL_E_GENERIC_FAILURE = 2,$/;" e enum:__anon0bfbaecf0203
+RIL_E_ILLEGAL_SIM_OR_ME guest/hals/ril/reference-libril/ril.h /^ RIL_E_ILLEGAL_SIM_OR_ME = 15, \/* network selection failed due to$/;" e enum:__anon0bfbaecf0203
+RIL_E_INTERNAL_ERR guest/hals/ril/reference-libril/ril.h /^ RIL_E_INTERNAL_ERR = 38, \/* Modem hit unexpected error scenario while ha/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_ARGUMENTS guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_ARGUMENTS = 44, \/* Received invalid arguments in request *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_CALL_ID guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_CALL_ID = 47, \/* Received invalid call id in request *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_MODEM_STATE guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_MODEM_STATE = 46, \/* Can not process the request in current Modem/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_RESPONSE guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_RESPONSE = 66, \/* Invalid response sent by vendor code *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_SIM_STATE guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_SIM_STATE = 45, \/* Can not process the request in current SIM s/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_SMSC_ADDRESS guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_SMSC_ADDRESS = 58, \/* SMSC address specified is invalid *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_SMS_FORMAT guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_SMS_FORMAT = 56, \/* Invalid sms format *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_INVALID_STATE guest/hals/ril/reference-libril/ril.h /^ RIL_E_INVALID_STATE = 41, \/* Unexpected request for the current state *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_LCE_NOT_SUPPORTED guest/hals/ril/reference-libril/ril.h /^ RIL_E_LCE_NOT_SUPPORTED = 36, \/* LCE service not supported(36 in RILConstants/;" e enum:__anon0bfbaecf0203
+RIL_E_MISSING_RESOURCE guest/hals/ril/reference-libril/ril.h /^ RIL_E_MISSING_RESOURCE = 16, \/* no logical channel available *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_MODEM_ERR guest/hals/ril/reference-libril/ril.h /^ RIL_E_MODEM_ERR = 40, \/* Vendor RIL got unexpected or incorrect respo/;" e enum:__anon0bfbaecf0203
+RIL_E_MODE_NOT_SUPPORTED guest/hals/ril/reference-libril/ril.h /^ RIL_E_MODE_NOT_SUPPORTED = 13, \/* HW does not support preferred network type */;" e enum:__anon0bfbaecf0203
+RIL_E_NETWORK_ERR guest/hals/ril/reference-libril/ril.h /^ RIL_E_NETWORK_ERR = 49, \/* Received error from network *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_NETWORK_NOT_READY guest/hals/ril/reference-libril/ril.h /^ RIL_E_NETWORK_NOT_READY = 60, \/* Network is not ready to perform the request /;" e enum:__anon0bfbaecf0203
+RIL_E_NETWORK_REJECT guest/hals/ril/reference-libril/ril.h /^ RIL_E_NETWORK_REJECT = 53, \/* Request is rejected by network *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_NOT_PROVISIONED guest/hals/ril/reference-libril/ril.h /^ RIL_E_NOT_PROVISIONED = 61, \/* Device doesnot have this value provisioned */;" e enum:__anon0bfbaecf0203
+RIL_E_NO_MEMORY guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_MEMORY = 37, \/* Not sufficient memory to process the request/;" e enum:__anon0bfbaecf0203
+RIL_E_NO_NETWORK_FOUND guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_NETWORK_FOUND = 63, \/* Network cannot be found *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_NO_RESOURCES guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_RESOURCES = 42, \/* Not sufficient resource to process the reque/;" e enum:__anon0bfbaecf0203
+RIL_E_NO_SMS_TO_ACK guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_SMS_TO_ACK = 48, \/* ACK received when there is no SMS to ack *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_NO_SUBSCRIPTION guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_SUBSCRIPTION = 62, \/* Device doesnot have subscription *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_NO_SUCH_ELEMENT guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_SUCH_ELEMENT = 17, \/* application not found on SIM *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_NO_SUCH_ENTRY guest/hals/ril/reference-libril/ril.h /^ RIL_E_NO_SUCH_ENTRY = 59, \/* No such entry present to perform the request/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_1 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_1 = 501,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_10 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_10 = 510,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_11 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_11 = 511,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_12 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_12 = 512,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_13 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_13 = 513,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_14 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_14 = 514,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_15 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_15 = 515,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_16 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_16 = 516,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_17 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_17 = 517,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_18 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_18 = 518,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_19 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_19 = 519,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_2 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_2 = 502,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_20 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_20 = 520,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_21 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_21 = 521,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_22 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_22 = 522,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_23 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_23 = 523,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_24 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_24 = 524,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_25 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_25 = 525$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_3 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_3 = 503,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_4 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_4 = 504,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_5 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_5 = 505,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_6 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_6 = 506,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_7 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_7 = 507,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_8 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_8 = 508,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OEM_ERROR_9 guest/hals/ril/reference-libril/ril.h /^ RIL_E_OEM_ERROR_9 = 509,$/;" e enum:__anon0bfbaecf0203
+RIL_E_OPERATION_NOT_ALLOWED guest/hals/ril/reference-libril/ril.h /^ RIL_E_OPERATION_NOT_ALLOWED = 54, \/* Not allowed the request now *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW guest/hals/ril/reference-libril/ril.h /^ RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9, \/* data ops are not allowed before device$/;" e enum:__anon0bfbaecf0203
+RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL guest/hals/ril/reference-libril/ril.h /^ RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL = 8, \/* data ops are not allowed during voice$/;" e enum:__anon0bfbaecf0203
+RIL_E_PASSWORD_INCORRECT guest/hals/ril/reference-libril/ril.h /^ RIL_E_PASSWORD_INCORRECT = 3, \/* for PIN\/PIN2 methods only! *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_RADIO_NOT_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ RIL_E_RADIO_NOT_AVAILABLE = 1, \/* If radio did not start or is resetting *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_REQUEST_NOT_SUPPORTED guest/hals/ril/reference-libril/ril.h /^ RIL_E_REQUEST_NOT_SUPPORTED = 6,$/;" e enum:__anon0bfbaecf0203
+RIL_E_REQUEST_RATE_LIMITED guest/hals/ril/reference-libril/ril.h /^ RIL_E_REQUEST_RATE_LIMITED = 50, \/* Operation denied due to overly-frequent requ/;" e enum:__anon0bfbaecf0203
+RIL_E_SIM_ABSENT guest/hals/ril/reference-libril/ril.h /^ RIL_E_SIM_ABSENT = 11, \/* fail to set the location where CDMA subscrip/;" e enum:__anon0bfbaecf0203
+RIL_E_SIM_BUSY guest/hals/ril/reference-libril/ril.h /^ RIL_E_SIM_BUSY = 51, \/* SIM is busy *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SIM_ERR guest/hals/ril/reference-libril/ril.h /^ RIL_E_SIM_ERR = 43, \/* Received error from SIM card *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SIM_FULL guest/hals/ril/reference-libril/ril.h /^ RIL_E_SIM_FULL = 52, \/* The target EF is full *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SIM_PIN2 guest/hals/ril/reference-libril/ril.h /^ RIL_E_SIM_PIN2 = 4, \/* Operation requires SIM PIN2 to be entered *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SIM_PUK2 guest/hals/ril/reference-libril/ril.h /^ RIL_E_SIM_PUK2 = 5, \/* Operation requires SIM PIN2 to be entered *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SMS_SEND_FAIL_RETRY guest/hals/ril/reference-libril/ril.h /^ RIL_E_SMS_SEND_FAIL_RETRY = 10, \/* fail to send sms and need retry *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SS_MODIFIED_TO_DIAL guest/hals/ril/reference-libril/ril.h /^ RIL_E_SS_MODIFIED_TO_DIAL = 24, \/* SS request modified to DIAL *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SS_MODIFIED_TO_SS guest/hals/ril/reference-libril/ril.h /^ RIL_E_SS_MODIFIED_TO_SS = 27, \/* SS request modified to different SS request /;" e enum:__anon0bfbaecf0203
+RIL_E_SS_MODIFIED_TO_USSD guest/hals/ril/reference-libril/ril.h /^ RIL_E_SS_MODIFIED_TO_USSD = 25, \/* SS request modified to USSD *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SUBSCRIPTION_NOT_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12, \/* fail to find CDMA subscription from specifie/;" e enum:__anon0bfbaecf0203
+RIL_E_SUBSCRIPTION_NOT_SUPPORTED guest/hals/ril/reference-libril/ril.h /^ RIL_E_SUBSCRIPTION_NOT_SUPPORTED = 26, \/* Subscription not supported by RIL *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_SUCCESS guest/hals/ril/reference-libril/ril.h /^ RIL_E_SUCCESS = 0,$/;" e enum:__anon0bfbaecf0203
+RIL_E_SYSTEM_ERR guest/hals/ril/reference-libril/ril.h /^ RIL_E_SYSTEM_ERR = 39, \/* Hit platform or system error *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_USSD_MODIFIED_TO_DIAL guest/hals/ril/reference-libril/ril.h /^ RIL_E_USSD_MODIFIED_TO_DIAL = 21, \/* USSD request modified to DIAL *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_USSD_MODIFIED_TO_SS guest/hals/ril/reference-libril/ril.h /^ RIL_E_USSD_MODIFIED_TO_SS = 22, \/* USSD request modified to SS *\/$/;" e enum:__anon0bfbaecf0203
+RIL_E_USSD_MODIFIED_TO_USSD guest/hals/ril/reference-libril/ril.h /^ RIL_E_USSD_MODIFIED_TO_USSD = 23, \/* USSD request modified to different USSD$/;" e enum:__anon0bfbaecf0203
+RIL_EmergencyCallRouting guest/hals/ril/reference-libril/ril.h /^} RIL_EmergencyCallRouting;$/;" t typeref:enum:__anon0bfbaecfb603
+RIL_EmergencyDial guest/hals/ril/reference-libril/ril.h /^} RIL_EmergencyDial;$/;" t typeref:struct:__anon0bfbaecfb708
+RIL_EmergencyNumberSource guest/hals/ril/reference-libril/ril.h /^} RIL_EmergencyNumberSource;$/;" t typeref:enum:__anon0bfbaecfb503
+RIL_EmergencyServiceCategory guest/hals/ril/reference-libril/ril.h /^} RIL_EmergencyServiceCategory;$/;" t typeref:enum:__anon0bfbaecfb403
+RIL_Env guest/hals/ril/reference-libril/ril.h /^struct RIL_Env {$/;" s
+RIL_Errno guest/hals/ril/reference-libril/ril.h /^} RIL_Errno;$/;" t typeref:enum:__anon0bfbaecf0203
+RIL_EutranBands guest/hals/ril/reference-libril/ril.h /^} RIL_EutranBands;$/;" t typeref:enum:__anon0bfbaecfa903
+RIL_GSM_BroadcastSmsConfigInfo guest/hals/ril/reference-libril/ril.h /^} RIL_GSM_BroadcastSmsConfigInfo;$/;" t typeref:struct:__anon0bfbaecf4408
+RIL_GSM_SignalStrength_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_GSM_SignalStrength_v12;$/;" t typeref:struct:__anon0bfbaecf4708
+RIL_GW_SignalStrength guest/hals/ril/reference-libril/ril.h /^} RIL_GW_SignalStrength;$/;" t typeref:struct:__anon0bfbaecf4608
+RIL_GeranBands guest/hals/ril/reference-libril/ril.h /^} RIL_GeranBands;$/;" t typeref:enum:__anon0bfbaecfa703
+RIL_GetVersion guest/hals/ril/reference-libril/ril.h /^typedef const char * (*RIL_GetVersion) (void);$/;" t typeref:typename:const char * (*)(void)
+RIL_HARDWARE_CONFIG_MODEM guest/hals/ril/reference-libril/ril.h /^ RIL_HARDWARE_CONFIG_MODEM = 0,$/;" e enum:__anon0bfbaecf8f03
+RIL_HARDWARE_CONFIG_SIM guest/hals/ril/reference-libril/ril.h /^ RIL_HARDWARE_CONFIG_SIM = 1,$/;" e enum:__anon0bfbaecf8f03
+RIL_HARDWARE_CONFIG_STATE_DISABLED guest/hals/ril/reference-libril/ril.h /^ RIL_HARDWARE_CONFIG_STATE_DISABLED = 2,$/;" e enum:__anon0bfbaecf9003
+RIL_HARDWARE_CONFIG_STATE_ENABLED guest/hals/ril/reference-libril/ril.h /^ RIL_HARDWARE_CONFIG_STATE_ENABLED = 0,$/;" e enum:__anon0bfbaecf9003
+RIL_HARDWARE_CONFIG_STATE_STANDBY guest/hals/ril/reference-libril/ril.h /^ RIL_HARDWARE_CONFIG_STATE_STANDBY = 1,$/;" e enum:__anon0bfbaecf9003
+RIL_HardwareConfig guest/hals/ril/reference-libril/ril.h /^} RIL_HardwareConfig;$/;" t typeref:struct:__anon0bfbaecf9308
+RIL_HardwareConfig_Modem guest/hals/ril/reference-libril/ril.h /^} RIL_HardwareConfig_Modem;$/;" t typeref:struct:__anon0bfbaecf9108
+RIL_HardwareConfig_Sim guest/hals/ril/reference-libril/ril.h /^} RIL_HardwareConfig_Sim;$/;" t typeref:struct:__anon0bfbaecf9208
+RIL_HardwareConfig_State guest/hals/ril/reference-libril/ril.h /^} RIL_HardwareConfig_State;$/;" t typeref:enum:__anon0bfbaecf9003
+RIL_HardwareConfig_Type guest/hals/ril/reference-libril/ril.h /^} RIL_HardwareConfig_Type;$/;" t typeref:enum:__anon0bfbaecf8f03
+RIL_IMS_SMS_Message guest/hals/ril/reference-libril/ril.h /^} RIL_IMS_SMS_Message;$/;" t typeref:struct:__anon0bfbaecf1808
+RIL_Init guest/hals/ril/reference-ril/reference-ril.c /^const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)$/;" f typeref:typename:const RIL_RadioFunctions *
+RIL_InitialAttachApn guest/hals/ril/reference-libril/ril.h /^} RIL_InitialAttachApn;$/;" t typeref:struct:__anon0bfbaecfc008
+RIL_InitialAttachApn_v15 guest/hals/ril/reference-libril/ril.h /^} RIL_InitialAttachApn_v15;$/;" t typeref:struct:__anon0bfbaecfc108
+RIL_KeepaliveRequest guest/hals/ril/reference-libril/ril.h /^} RIL_KeepaliveRequest;$/;" t typeref:struct:__anon0bfbaecfc508
+RIL_KeepaliveStatus guest/hals/ril/reference-libril/ril.h /^} RIL_KeepaliveStatus;$/;" t typeref:struct:__anon0bfbaecfc708
+RIL_KeepaliveStatusCode guest/hals/ril/reference-libril/ril.h /^} RIL_KeepaliveStatusCode;$/;" t typeref:enum:__anon0bfbaecfc603
+RIL_KeepaliveType guest/hals/ril/reference-libril/ril.h /^} RIL_KeepaliveType;$/;" t typeref:enum:__anon0bfbaecfc403
+RIL_LTE_SignalStrength guest/hals/ril/reference-libril/ril.h /^} RIL_LTE_SignalStrength;$/;" t typeref:struct:__anon0bfbaecf4b08
+RIL_LTE_SignalStrength_v8 guest/hals/ril/reference-libril/ril.h /^} RIL_LTE_SignalStrength_v8;$/;" t typeref:struct:__anon0bfbaecf4c08
+RIL_LastCallFailCause guest/hals/ril/reference-libril/ril.h /^} RIL_LastCallFailCause;$/;" t typeref:enum:__anon0bfbaecf2d03
+RIL_LastCallFailCauseInfo guest/hals/ril/reference-libril/ril.h /^} RIL_LastCallFailCauseInfo;$/;" t typeref:struct:__anon0bfbaecf2e08
+RIL_LceDataInfo guest/hals/ril/reference-libril/ril.h /^} RIL_LceDataInfo;$/;" t typeref:struct:__anon0bfbaecf2408
+RIL_LceStatusInfo guest/hals/ril/reference-libril/ril.h /^} RIL_LceStatusInfo;$/;" t typeref:struct:__anon0bfbaecf2308
+RIL_LinkCapacityReportingCriteria guest/hals/ril/reference-libril/ril.h /^} RIL_LinkCapacityReportingCriteria;$/;" t typeref:struct:__anon0bfbaecf5708
+RIL_MATCH_ALL guest/hals/ril/reference-libril/ril.h /^ RIL_MATCH_ALL = 0, \/* Apply to all carriers with the same mcc\/mnc *\/$/;" e enum:__anon0bfbaecf2503
+RIL_MATCH_GID1 guest/hals/ril/reference-libril/ril.h /^ RIL_MATCH_GID1 = 3, \/* Use GID1 and mcc\/mnc to identify the carrier *\/$/;" e enum:__anon0bfbaecf2503
+RIL_MATCH_GID2 guest/hals/ril/reference-libril/ril.h /^ RIL_MATCH_GID2 = 4, \/* Use GID2 and mcc\/mnc to identify the carrier *\/$/;" e enum:__anon0bfbaecf2503
+RIL_MATCH_IMSI_PREFIX guest/hals/ril/reference-libril/ril.h /^ RIL_MATCH_IMSI_PREFIX = 2, \/* Use IMSI prefix and mcc\/mnc to identify the carrier *\/$/;" e enum:__anon0bfbaecf2503
+RIL_MATCH_SPN guest/hals/ril/reference-libril/ril.h /^ RIL_MATCH_SPN = 1, \/* Use SPN and mcc\/mnc to identify the carrier *\/$/;" e enum:__anon0bfbaecf2503
+RIL_ModemConfig guest/hals/ril/reference-libril/ril.h /^} RIL_ModemConfig;$/;" t typeref:struct:__anon0bfbaecfbd08
+RIL_ModemInfo guest/hals/ril/reference-libril/ril.h /^} RIL_ModemInfo;$/;" t typeref:struct:__anon0bfbaecfbb08
+RIL_NOT_REG_AND_EMERGENCY_AVAILABLE_AND_NOT_SEARCHING guest/hals/ril/reference-libril/ril.h /^ RIL_NOT_REG_AND_EMERGENCY_AVAILABLE_AND_NOT_SEARCHING = 10, \/\/ Same as$/;" e enum:__anon0bfbaecf3703
+RIL_NOT_REG_AND_EMERGENCY_AVAILABLE_AND_SEARCHING guest/hals/ril/reference-libril/ril.h /^ RIL_NOT_REG_AND_EMERGENCY_AVAILABLE_AND_SEARCHING = 12, \/\/ Same as RIL_NOT_REG_AND_SEARCH/;" e enum:__anon0bfbaecf3703
+RIL_NOT_REG_AND_NOT_SEARCHING guest/hals/ril/reference-libril/ril.h /^ RIL_NOT_REG_AND_NOT_SEARCHING = 0, \/\/ Not registered, MT is not currently search/;" e enum:__anon0bfbaecf3703
+RIL_NOT_REG_AND_SEARCHING guest/hals/ril/reference-libril/ril.h /^ RIL_NOT_REG_AND_SEARCHING = 2, \/\/ Not registered, but MT is currently search/;" e enum:__anon0bfbaecf3703
+RIL_NR_SignalStrength guest/hals/ril/reference-libril/ril.h /^} RIL_NR_SignalStrength;$/;" t typeref:struct:__anon0bfbaecf4e08
+RIL_NUM_TX_POWER_LEVELS guest/hals/ril/reference-libril/ril.h /^#define RIL_NUM_TX_POWER_LEVELS /;" d
+RIL_NV_ReadItem guest/hals/ril/reference-libril/ril.h /^} RIL_NV_ReadItem;$/;" t typeref:struct:__anon0bfbaecf8c08
+RIL_NV_WriteItem guest/hals/ril/reference-libril/ril.h /^} RIL_NV_WriteItem;$/;" t typeref:struct:__anon0bfbaecf8d08
+RIL_NeighboringCell guest/hals/ril/reference-libril/ril.h /^} RIL_NeighboringCell;$/;" t typeref:struct:__anon0bfbaecf2208
+RIL_NetworkOperator guest/hals/ril/reference-libril/ril.h /^} RIL_NetworkOperator;$/;" t typeref:struct:__anon0bfbaecfa608
+RIL_NetworkScanRequest guest/hals/ril/reference-libril/ril.h /^} RIL_NetworkScanRequest;$/;" t typeref:struct:__anon0bfbaecfad08
+RIL_NetworkScanRequest_v1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_NetworkScanRequest_v1_5;$/;" t typeref:struct:__anon0bfbaecfb008
+RIL_NetworkScanResult guest/hals/ril/reference-libril/ril.h /^} RIL_NetworkScanResult;$/;" t typeref:struct:__anon0bfbaecfb308
+RIL_NgranBands guest/hals/ril/reference-libril/ril.h /^} RIL_NgranBands;$/;" t typeref:enum:__anon0bfbaecfaa03
+RIL_ONE_SHOT guest/hals/ril/reference-libril/ril.h /^ RIL_ONE_SHOT = 0x01, \/\/ Performs the scan only once$/;" e enum:__anon0bfbaecfa403
+RIL_OpenChannelParams guest/hals/ril/reference-libril/ril.h /^} RIL_OpenChannelParams;$/;" t typeref:struct:__anon0bfbaecfa308
+RIL_PCO_Data guest/hals/ril/reference-libril/ril.h /^} RIL_PCO_Data;$/;" t typeref:struct:__anon0bfbaecfc308
+RIL_PERIODIC guest/hals/ril/reference-libril/ril.h /^ RIL_PERIODIC = 0x02 \/\/ Performs the scan periodically until cancelled$/;" e enum:__anon0bfbaecfa403
+RIL_PERSOSUBSTATE_IN_PROGRESS guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_IN_PROGRESS = 1, \/* in between each lock transition *\/$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_IN_PROGRESS_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_IN_PROGRESS_1_5 = 1, \/* in between each lock transition *\/$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_READY guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_READY = 2, \/* when either SIM or RUIM Perso is finish/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_READY_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_READY_1_5 = 2, \/* when either SIM or RUIM Perso is fi/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_CORPORATE guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_CORPORATE = 16,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_CORPORATE_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_CORPORATE_1_5 = 16,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_CORPORATE_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_CORPORATE_PUK = 22,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_CORPORATE_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_CORPORATE_PUK_1_5 = 22,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_HRPD guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_HRPD = 15,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_HRPD_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_HRPD_1_5 = 15,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_HRPD_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_HRPD_PUK = 21,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_HRPD_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_HRPD_PUK_1_5 = 21,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_NETWORK1 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK1 = 13,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_NETWORK1_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK1_1_5 = 13,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_NETWORK1_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK1_PUK = 19, \/* The corresponding perso lock is blocke/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_NETWORK1_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK1_PUK_1_5 = 19, \/* The corresponding perso lock is bl/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_NETWORK2 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK2 = 14,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_NETWORK2_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK2_1_5 = 14,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_NETWORK2_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK2_PUK = 20,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_NETWORK2_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_NETWORK2_PUK_1_5 = 20,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_RUIM guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_RUIM = 18,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_RUIM_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_RUIM_1_5 = 18,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_RUIM_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_RUIM_PUK = 24$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_RUIM_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_RUIM_PUK_1_5 = 24,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER = 17,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_1_5 = 17,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK = 23,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_1_5 = 23,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_CORPORATE guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_CORPORATE = 5,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_CORPORATE_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_CORPORATE_1_5 = 5,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_CORPORATE_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_CORPORATE_PUK = 10,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_CORPORATE_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_CORPORATE_PUK_1_5 = 10,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_ICCID guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_ICCID,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_ICCID_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_ICCID_PUK,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_IMPI guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_IMPI,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_IMPI_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_IMPI_PUK,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_NETWORK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK = 3,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_NETWORK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_1_5 = 3,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_NETWORK_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_PUK = 8, \/* The corresponding perso lock is blocked/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_NETWORK_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_PUK_1_5 = 8, \/* The corresponding perso lock is blo/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET = 4,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_1_5 = 4,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK = 9,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_1_5 = 9,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_NS_SP guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NS_SP,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_NS_SP_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_NS_SP_PUK,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER = 6,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_1_5 = 6,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK = 11,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_1_5 = 11,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SIM guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SIM = 7,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_SIM_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SIM_1_5 = 7,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SIM_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SIM_PUK = 12,$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_SIM_SIM_PUK_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SIM_PUK_1_5 = 12,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SPN guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SPN,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SPN_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SPN_PUK,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SP_EHPLMN guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SP_EHPLMN,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_SIM_SP_EHPLMN_PUK guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_SIM_SP_EHPLMN_PUK,$/;" e enum:__anon0bfbaecf3d03
+RIL_PERSOSUBSTATE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_UNKNOWN = 0, \/* initial state *\/$/;" e enum:__anon0bfbaecf3303
+RIL_PERSOSUBSTATE_UNKNOWN_1_5 guest/hals/ril/reference-libril/ril.h /^ RIL_PERSOSUBSTATE_UNKNOWN_1_5 = 0, \/* initial state *\/$/;" e enum:__anon0bfbaecf3d03
+RIL_PINSTATE_DISABLED guest/hals/ril/reference-libril/ril.h /^ RIL_PINSTATE_DISABLED = 3,$/;" e enum:__anon0bfbaecf3503
+RIL_PINSTATE_ENABLED_BLOCKED guest/hals/ril/reference-libril/ril.h /^ RIL_PINSTATE_ENABLED_BLOCKED = 4,$/;" e enum:__anon0bfbaecf3503
+RIL_PINSTATE_ENABLED_NOT_VERIFIED guest/hals/ril/reference-libril/ril.h /^ RIL_PINSTATE_ENABLED_NOT_VERIFIED = 1,$/;" e enum:__anon0bfbaecf3503
+RIL_PINSTATE_ENABLED_PERM_BLOCKED guest/hals/ril/reference-libril/ril.h /^ RIL_PINSTATE_ENABLED_PERM_BLOCKED = 5$/;" e enum:__anon0bfbaecf3503
+RIL_PINSTATE_ENABLED_VERIFIED guest/hals/ril/reference-libril/ril.h /^ RIL_PINSTATE_ENABLED_VERIFIED = 2,$/;" e enum:__anon0bfbaecf3503
+RIL_PINSTATE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_PINSTATE_UNKNOWN = 0,$/;" e enum:__anon0bfbaecf3503
+RIL_PersoSubstate guest/hals/ril/reference-libril/ril.h /^} RIL_PersoSubstate;$/;" t typeref:enum:__anon0bfbaecf3303
+RIL_PersoSubstateV1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_PersoSubstateV1_5;$/;" t typeref:enum:__anon0bfbaecf3d03
+RIL_PhoneCapability guest/hals/ril/reference-libril/ril.h /^} RIL_PhoneCapability;$/;" t typeref:struct:__anon0bfbaecfbc08
+RIL_PinState guest/hals/ril/reference-libril/ril.h /^} RIL_PinState;$/;" t typeref:enum:__anon0bfbaecf3503
+RIL_PreferredNetworkType guest/hals/ril/reference-libril/ril.h /^} RIL_PreferredNetworkType;$/;" t typeref:enum:__anon0bfbaecf0b03
+RIL_PublicKeyType guest/hals/ril/reference-libril/ril.h /^} RIL_PublicKeyType;$/;" t typeref:enum:__anon0bfbaecf2b03
+RIL_RADIO_ACCESS_SPECIFIER_MAX_SIZE guest/hals/ril/reference-libril/ril.h /^#define RIL_RADIO_ACCESS_SPECIFIER_MAX_SIZE /;" d
+RIL_RADIO_CAPABILITY_VERSION guest/hals/ril/reference-libril/ril.h /^#define RIL_RADIO_CAPABILITY_VERSION /;" d
+RIL_REDIRECTING_REASON_CALLED_DTE_OUT_OF_ORDER guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_CALLED_DTE_OUT_OF_ORDER = 9,$/;" e enum:__anon0bfbaecf8403
+RIL_REDIRECTING_REASON_CALL_FORWARDING_BUSY guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_CALL_FORWARDING_BUSY = 1,$/;" e enum:__anon0bfbaecf8403
+RIL_REDIRECTING_REASON_CALL_FORWARDING_BY_THE_CALLED_DTE guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_CALL_FORWARDING_BY_THE_CALLED_DTE = 10,$/;" e enum:__anon0bfbaecf8403
+RIL_REDIRECTING_REASON_CALL_FORWARDING_NO_REPLY guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_CALL_FORWARDING_NO_REPLY = 2,$/;" e enum:__anon0bfbaecf8403
+RIL_REDIRECTING_REASON_CALL_FORWARDING_UNCONDITIONAL guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_CALL_FORWARDING_UNCONDITIONAL = 15,$/;" e enum:__anon0bfbaecf8403
+RIL_REDIRECTING_REASON_RESERVED guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_RESERVED$/;" e enum:__anon0bfbaecf8403
+RIL_REDIRECTING_REASON_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_REDIRECTING_REASON_UNKNOWN = 0,$/;" e enum:__anon0bfbaecf8403
+RIL_REG_DENIED guest/hals/ril/reference-libril/ril.h /^ RIL_REG_DENIED = 3, \/\/ Registration denied$/;" e enum:__anon0bfbaecf3703
+RIL_REG_DENIED_AND_EMERGENCY_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ RIL_REG_DENIED_AND_EMERGENCY_AVAILABLE = 13, \/\/ Same as REG_DENIED but indicates that$/;" e enum:__anon0bfbaecf3703
+RIL_REG_HOME guest/hals/ril/reference-libril/ril.h /^ RIL_REG_HOME = 1, \/\/ Registered, home network$/;" e enum:__anon0bfbaecf3703
+RIL_REG_ROAMING guest/hals/ril/reference-libril/ril.h /^ RIL_REG_ROAMING = 5, \/\/ Registered, roaming$/;" e enum:__anon0bfbaecf3703
+RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU /;" d
+RIL_REQUEST_ALLOCATE_PDU_SESSION_ID guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ALLOCATE_PDU_SESSION_ID /;" d
+RIL_REQUEST_ALLOW_DATA guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ALLOW_DATA /;" d
+RIL_REQUEST_ANSWER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ANSWER /;" d
+RIL_REQUEST_ARE_UICC_APPLICATIONS_ENABLED guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ARE_UICC_APPLICATIONS_ENABLED /;" d
+RIL_REQUEST_BASEBAND_VERSION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_BASEBAND_VERSION /;" d
+RIL_REQUEST_CANCEL_HANDOVER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CANCEL_HANDOVER /;" d
+RIL_REQUEST_CANCEL_USSD guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CANCEL_USSD /;" d
+RIL_REQUEST_CDMA_BURST_DTMF guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_BURST_DTMF /;" d
+RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM /;" d
+RIL_REQUEST_CDMA_FLASH guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_FLASH /;" d
+RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG /;" d
+RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE /;" d
+RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE /;" d
+RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE /;" d
+RIL_REQUEST_CDMA_SEND_SMS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SEND_SMS /;" d
+RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE /;" d
+RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG /;" d
+RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE /;" d
+RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE /;" d
+RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE /;" d
+RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE /;" d
+RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION /;" d
+RIL_REQUEST_CDMA_SUBSCRIPTION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_SUBSCRIPTION /;" d
+RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY /;" d
+RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM /;" d
+RIL_REQUEST_CHANGE_BARRING_PASSWORD guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CHANGE_BARRING_PASSWORD /;" d
+RIL_REQUEST_CHANGE_SIM_PIN guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CHANGE_SIM_PIN /;" d
+RIL_REQUEST_CHANGE_SIM_PIN2 guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CHANGE_SIM_PIN2 /;" d
+RIL_REQUEST_CONFERENCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFERENCE /;" d
+RIL_REQUEST_CONFIG_GET_HAL_DEVICE_CAPABILITIES guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_GET_HAL_DEVICE_CAPABILITIES /;" d
+RIL_REQUEST_CONFIG_GET_MODEM_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_GET_MODEM_CONFIG /;" d
+RIL_REQUEST_CONFIG_GET_PHONE_CAPABILITY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_GET_PHONE_CAPABILITY /;" d
+RIL_REQUEST_CONFIG_GET_SLOT_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_GET_SLOT_STATUS /;" d
+RIL_REQUEST_CONFIG_SET_MODEM_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_SET_MODEM_CONFIG /;" d
+RIL_REQUEST_CONFIG_SET_PREFER_DATA_MODEM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_SET_PREFER_DATA_MODEM /;" d
+RIL_REQUEST_CONFIG_SET_SLOT_MAPPING guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_CONFIG_SET_SLOT_MAPPING /;" d
+RIL_REQUEST_DATA_CALL_LIST guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DATA_CALL_LIST /;" d
+RIL_REQUEST_DATA_REGISTRATION_STATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DATA_REGISTRATION_STATE /;" d
+RIL_REQUEST_DEACTIVATE_DATA_CALL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DEACTIVATE_DATA_CALL /;" d
+RIL_REQUEST_DELETE_SMS_ON_SIM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DELETE_SMS_ON_SIM /;" d
+RIL_REQUEST_DEVICE_IDENTITY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DEVICE_IDENTITY /;" d
+RIL_REQUEST_DIAL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DIAL /;" d
+RIL_REQUEST_DTMF guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DTMF /;" d
+RIL_REQUEST_DTMF_START guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DTMF_START /;" d
+RIL_REQUEST_DTMF_STOP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_DTMF_STOP /;" d
+RIL_REQUEST_EMERGENCY_DIAL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_EMERGENCY_DIAL /;" d
+RIL_REQUEST_ENABLE_MODEM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENABLE_MODEM /;" d
+RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY /;" d
+RIL_REQUEST_ENABLE_UICC_APPLICATIONS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENABLE_UICC_APPLICATIONS /;" d
+RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION /;" d
+RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION /;" d
+RIL_REQUEST_ENTER_SIM_PIN guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENTER_SIM_PIN /;" d
+RIL_REQUEST_ENTER_SIM_PIN2 guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENTER_SIM_PIN2 /;" d
+RIL_REQUEST_ENTER_SIM_PUK guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENTER_SIM_PUK /;" d
+RIL_REQUEST_ENTER_SIM_PUK2 guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ENTER_SIM_PUK2 /;" d
+RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE /;" d
+RIL_REQUEST_EXPLICIT_CALL_TRANSFER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_EXPLICIT_CALL_TRANSFER /;" d
+RIL_REQUEST_GET_ACTIVITY_INFO guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_ACTIVITY_INFO /;" d
+RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP /;" d
+RIL_REQUEST_GET_BARRING_INFO guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_BARRING_INFO /;" d
+RIL_REQUEST_GET_CARRIER_RESTRICTIONS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_CARRIER_RESTRICTIONS /;" d
+RIL_REQUEST_GET_CELL_INFO_LIST guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_CELL_INFO_LIST /;" d
+RIL_REQUEST_GET_CLIR guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_CLIR /;" d
+RIL_REQUEST_GET_CURRENT_CALLS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_CURRENT_CALLS /;" d
+RIL_REQUEST_GET_DC_RT_INFO guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_DC_RT_INFO /;" d
+RIL_REQUEST_GET_HARDWARE_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_HARDWARE_CONFIG /;" d
+RIL_REQUEST_GET_IMEI guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_IMEI /;" d
+RIL_REQUEST_GET_IMEISV guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_IMEISV /;" d
+RIL_REQUEST_GET_IMSI guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_IMSI /;" d
+RIL_REQUEST_GET_MODEM_STACK_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_MODEM_STACK_STATUS /;" d
+RIL_REQUEST_GET_MUTE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_MUTE /;" d
+RIL_REQUEST_GET_NEIGHBORING_CELL_IDS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_NEIGHBORING_CELL_IDS /;" d
+RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE /;" d
+RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE_BITMAP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE_BITMAP /;" d
+RIL_REQUEST_GET_RADIO_CAPABILITY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_RADIO_CAPABILITY /;" d
+RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY /;" d
+RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS /;" d
+RIL_REQUEST_GET_SIM_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_SIM_STATUS /;" d
+RIL_REQUEST_GET_SLICING_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_SLICING_CONFIG /;" d
+RIL_REQUEST_GET_SMSC_ADDRESS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_SMSC_ADDRESS /;" d
+RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS /;" d
+RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG /;" d
+RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG /;" d
+RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION /;" d
+RIL_REQUEST_HANGUP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_HANGUP /;" d
+RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND /;" d
+RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND /;" d
+RIL_REQUEST_IMS_REGISTRATION_STATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_IMS_REGISTRATION_STATE /;" d
+RIL_REQUEST_IMS_SEND_SMS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_IMS_SEND_SMS /;" d
+RIL_REQUEST_ISIM_AUTHENTICATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_ISIM_AUTHENTICATION /;" d
+RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED /;" d
+RIL_REQUEST_LAST guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_LAST /;" d
+RIL_REQUEST_LAST_CALL_FAIL_CAUSE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_LAST_CALL_FAIL_CAUSE /;" d
+RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE /;" d
+RIL_REQUEST_NV_READ_ITEM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_NV_READ_ITEM /;" d
+RIL_REQUEST_NV_RESET_CONFIG guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_NV_RESET_CONFIG /;" d
+RIL_REQUEST_NV_WRITE_CDMA_PRL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_NV_WRITE_CDMA_PRL /;" d
+RIL_REQUEST_NV_WRITE_ITEM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_NV_WRITE_ITEM /;" d
+RIL_REQUEST_OEM_HOOK_RAW guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_OEM_HOOK_RAW /;" d
+RIL_REQUEST_OEM_HOOK_STRINGS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_OEM_HOOK_STRINGS /;" d
+RIL_REQUEST_OPERATOR guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_OPERATOR /;" d
+RIL_REQUEST_PULL_LCEDATA guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_PULL_LCEDATA /;" d
+RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE /;" d
+RIL_REQUEST_QUERY_AVAILABLE_NETWORKS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_AVAILABLE_NETWORKS /;" d
+RIL_REQUEST_QUERY_CALL_FORWARD_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_CALL_FORWARD_STATUS /;" d
+RIL_REQUEST_QUERY_CALL_WAITING guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_CALL_WAITING /;" d
+RIL_REQUEST_QUERY_CLIP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_CLIP /;" d
+RIL_REQUEST_QUERY_FACILITY_LOCK guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_FACILITY_LOCK /;" d
+RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE /;" d
+RIL_REQUEST_QUERY_TTY_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_QUERY_TTY_MODE /;" d
+RIL_REQUEST_RADIO_CONFIG_BASE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_RADIO_CONFIG_BASE /;" d
+RIL_REQUEST_RADIO_CONFIG_LAST guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_RADIO_CONFIG_LAST /;" d
+RIL_REQUEST_RADIO_POWER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_RADIO_POWER /;" d
+RIL_REQUEST_RELEASE_PDU_SESSION_ID guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_RELEASE_PDU_SESSION_ID /;" d
+RIL_REQUEST_REPORT_SMS_MEMORY_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_REPORT_SMS_MEMORY_STATUS /;" d
+RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING /;" d
+RIL_REQUEST_RESET_RADIO guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_RESET_RADIO /;" d
+RIL_REQUEST_SCREEN_STATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SCREEN_STATE /;" d
+RIL_REQUEST_SEND_DEVICE_STATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SEND_DEVICE_STATE /;" d
+RIL_REQUEST_SEND_SMS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SEND_SMS /;" d
+RIL_REQUEST_SEND_SMS_EXPECT_MORE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SEND_SMS_EXPECT_MORE /;" d
+RIL_REQUEST_SEND_USSD guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SEND_USSD /;" d
+RIL_REQUEST_SEPARATE_CONNECTION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SEPARATE_CONNECTION /;" d
+RIL_REQUEST_SETUP_DATA_CALL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SETUP_DATA_CALL /;" d
+RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP /;" d
+RIL_REQUEST_SET_BAND_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_BAND_MODE /;" d
+RIL_REQUEST_SET_CALL_FORWARD guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_CALL_FORWARD /;" d
+RIL_REQUEST_SET_CALL_WAITING guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_CALL_WAITING /;" d
+RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION /;" d
+RIL_REQUEST_SET_CARRIER_RESTRICTIONS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_CARRIER_RESTRICTIONS /;" d
+RIL_REQUEST_SET_CLIR guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_CLIR /;" d
+RIL_REQUEST_SET_DATA_PROFILE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_DATA_PROFILE /;" d
+RIL_REQUEST_SET_DATA_THROTTLING guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_DATA_THROTTLING /;" d
+RIL_REQUEST_SET_DC_RT_INFO_RATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_DC_RT_INFO_RATE /;" d
+RIL_REQUEST_SET_FACILITY_LOCK guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_FACILITY_LOCK /;" d
+RIL_REQUEST_SET_INITIAL_ATTACH_APN guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_INITIAL_ATTACH_APN /;" d
+RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA /;" d
+RIL_REQUEST_SET_LOCATION_UPDATES guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_LOCATION_UPDATES /;" d
+RIL_REQUEST_SET_MUTE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_MUTE /;" d
+RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC /;" d
+RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL /;" d
+RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE /;" d
+RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE_BITMAP guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE_BITMAP /;" d
+RIL_REQUEST_SET_RADIO_CAPABILITY guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_RADIO_CAPABILITY /;" d
+RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA /;" d
+RIL_REQUEST_SET_SIM_CARD_POWER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_SIM_CARD_POWER /;" d
+RIL_REQUEST_SET_SMSC_ADDRESS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_SMSC_ADDRESS /;" d
+RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION /;" d
+RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS /;" d
+RIL_REQUEST_SET_TTY_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_TTY_MODE /;" d
+RIL_REQUEST_SET_UICC_SUBSCRIPTION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_UICC_SUBSCRIPTION /;" d
+RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER /;" d
+RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE /;" d
+RIL_REQUEST_SHUTDOWN guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SHUTDOWN /;" d
+RIL_REQUEST_SIGNAL_STRENGTH guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIGNAL_STRENGTH /;" d
+RIL_REQUEST_SIM_AUTHENTICATION guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIM_AUTHENTICATION /;" d
+RIL_REQUEST_SIM_CLOSE_CHANNEL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIM_CLOSE_CHANNEL /;" d
+RIL_REQUEST_SIM_IO guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIM_IO /;" d
+RIL_REQUEST_SIM_OPEN_CHANNEL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIM_OPEN_CHANNEL /;" d
+RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC /;" d
+RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL /;" d
+RIL_REQUEST_SMS_ACKNOWLEDGE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SMS_ACKNOWLEDGE /;" d
+RIL_REQUEST_START_HANDOVER guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_START_HANDOVER /;" d
+RIL_REQUEST_START_KEEPALIVE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_START_KEEPALIVE /;" d
+RIL_REQUEST_START_LCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_START_LCE /;" d
+RIL_REQUEST_START_NETWORK_SCAN guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_START_NETWORK_SCAN /;" d
+RIL_REQUEST_STK_GET_PROFILE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STK_GET_PROFILE /;" d
+RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM /;" d
+RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND /;" d
+RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS /;" d
+RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE /;" d
+RIL_REQUEST_STK_SET_PROFILE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STK_SET_PROFILE /;" d
+RIL_REQUEST_STOP_KEEPALIVE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STOP_KEEPALIVE /;" d
+RIL_REQUEST_STOP_LCE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STOP_LCE /;" d
+RIL_REQUEST_STOP_NETWORK_SCAN guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_STOP_NETWORK_SCAN /;" d
+RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE /;" d
+RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE /;" d
+RIL_REQUEST_UDUB guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_UDUB /;" d
+RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORDS guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORDS /;" d
+RIL_REQUEST_VOICE_RADIO_TECH guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_VOICE_RADIO_TECH /;" d
+RIL_REQUEST_VOICE_REGISTRATION_STATE guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_VOICE_REGISTRATION_STATE /;" d
+RIL_REQUEST_WRITE_SMS_TO_SIM guest/hals/ril/reference-libril/ril.h /^#define RIL_REQUEST_WRITE_SMS_TO_SIM /;" d
+RIL_RESPONSE_ACKNOWLEDGEMENT guest/hals/ril/reference-libril/ril.h /^#define RIL_RESPONSE_ACKNOWLEDGEMENT /;" d
+RIL_RESTRICTED_STATE_CS_ALL guest/hals/ril/reference-libril/ril.h /^#define RIL_RESTRICTED_STATE_CS_ALL /;" d
+RIL_RESTRICTED_STATE_CS_EMERGENCY guest/hals/ril/reference-libril/ril.h /^#define RIL_RESTRICTED_STATE_CS_EMERGENCY /;" d
+RIL_RESTRICTED_STATE_CS_NORMAL guest/hals/ril/reference-libril/ril.h /^#define RIL_RESTRICTED_STATE_CS_NORMAL /;" d
+RIL_RESTRICTED_STATE_NONE guest/hals/ril/reference-libril/ril.h /^#define RIL_RESTRICTED_STATE_NONE /;" d
+RIL_RESTRICTED_STATE_PS_ALL guest/hals/ril/reference-libril/ril.h /^#define RIL_RESTRICTED_STATE_PS_ALL /;" d
+RIL_RadioAccessFamily guest/hals/ril/reference-libril/ril.h /^} RIL_RadioAccessFamily;$/;" t typeref:enum:__anon0bfbaecf0603
+RIL_RadioAccessNetworks guest/hals/ril/reference-libril/ril.h /^} RIL_RadioAccessNetworks;$/;" t typeref:enum:__anon0bfbaecfa503
+RIL_RadioAccessNetworks_v1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_RadioAccessNetworks_v1_5;$/;" t typeref:enum:__anon0bfbaecf5503
+RIL_RadioAccessSpecifier guest/hals/ril/reference-libril/ril.h /^} RIL_RadioAccessSpecifier;$/;" t typeref:struct:__anon0bfbaecfab08
+RIL_RadioAccessSpecifier_v1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_RadioAccessSpecifier_v1_5;$/;" t typeref:struct:__anon0bfbaecfae08
+RIL_RadioBandMode guest/hals/ril/reference-libril/ril.h /^} RIL_RadioBandMode;$/;" t typeref:enum:__anon0bfbaecf0703
+RIL_RadioCapability guest/hals/ril/reference-libril/ril.h /^} RIL_RadioCapability;$/;" t typeref:struct:__anon0bfbaecf0a08
+RIL_RadioFunctions guest/hals/ril/reference-libril/ril.h /^} RIL_RadioFunctions;$/;" t typeref:struct:__anon0bfbaecfbf08
+RIL_RadioState guest/hals/ril/reference-libril/ril.h /^} RIL_RadioState;$/;" t typeref:enum:__anon0bfbaecf0403
+RIL_RadioStateRequest guest/hals/ril/reference-libril/ril.h /^typedef RIL_RadioState (*RIL_RadioStateRequest)();$/;" t typeref:typename:RIL_RadioState (*)()
+RIL_RadioStateRequest guest/hals/ril/reference-libril/ril.h /^typedef RIL_RadioState (*RIL_RadioStateRequest)(RIL_SOCKET_ID socket_id);$/;" t typeref:typename:RIL_RadioState (*)(RIL_SOCKET_ID socket_id)
+RIL_RadioTechnology guest/hals/ril/reference-libril/ril.h /^} RIL_RadioTechnology;$/;" t typeref:enum:__anon0bfbaecf0503
+RIL_RadioTechnologyFamily guest/hals/ril/reference-libril/ril.h /^} RIL_RadioTechnologyFamily;$/;" t typeref:enum:__anon0bfbaecf1703
+RIL_RegState guest/hals/ril/reference-libril/ril.h /^} RIL_RegState;$/;" t typeref:enum:__anon0bfbaecf3703
+RIL_RequestFunc guest/hals/ril/reference-libril/ril.h /^typedef void (*RIL_RequestFunc) (int request, void *data,$/;" t typeref:typename:void (*)(int request,void * data,size_t datalen,RIL_Token t)
+RIL_RequestFunc guest/hals/ril/reference-libril/ril.h /^typedef void (*RIL_RequestFunc) (int request, void *data,$/;" t typeref:typename:void (*)(int request,void * data,size_t datalen,RIL_Token t,RIL_SOCKET_ID socket_id)
+RIL_SAP_SOCKET guest/hals/ril/reference-libril/ril_ex.h /^ RIL_SAP_SOCKET$/;" e enum:__anon316d80cb0103
+RIL_SERVICE_H guest/hals/ril/reference-libril/ril_service.h /^#define RIL_SERVICE_H$/;" d
+RIL_SERVICE_NAME_BASE guest/hals/ril/reference-libril/ril_internal.h /^#define RIL_SERVICE_NAME_BASE /;" d
+RIL_SHLIB guest/hals/ril/reference-libril/RilSapSocket.cpp /^#define RIL_SHLIB$/;" d file:
+RIL_SHLIB guest/hals/ril/reference-libril/RilSapSocket.h /^#define RIL_SHLIB$/;" d
+RIL_SIM_APDU guest/hals/ril/reference-libril/ril.h /^} RIL_SIM_APDU;$/;" t typeref:struct:__anon0bfbaecf1f08
+RIL_SIM_IO_Response guest/hals/ril/reference-libril/ril.h /^} RIL_SIM_IO_Response;$/;" t typeref:struct:__anon0bfbaecf2008
+RIL_SIM_IO_v5 guest/hals/ril/reference-libril/ril.h /^} RIL_SIM_IO_v5;$/;" t typeref:struct:__anon0bfbaecf1d08
+RIL_SIM_IO_v6 guest/hals/ril/reference-libril/ril.h /^} RIL_SIM_IO_v6;$/;" t typeref:struct:__anon0bfbaecf1e08
+RIL_SMS_Response guest/hals/ril/reference-libril/ril.h /^} RIL_SMS_Response;$/;" t typeref:struct:__anon0bfbaecf1a08
+RIL_SMS_WriteArgs guest/hals/ril/reference-libril/ril.h /^} RIL_SMS_WriteArgs;$/;" t typeref:struct:__anon0bfbaecf1b08
+RIL_SOCKET_1 guest/hals/ril/reference-libril/ril.h /^ RIL_SOCKET_1,$/;" e enum:__anon0bfbaecf0103
+RIL_SOCKET_2 guest/hals/ril/reference-libril/ril.h /^ RIL_SOCKET_2,$/;" e enum:__anon0bfbaecf0103
+RIL_SOCKET_3 guest/hals/ril/reference-libril/ril.h /^ RIL_SOCKET_3,$/;" e enum:__anon0bfbaecf0103
+RIL_SOCKET_4 guest/hals/ril/reference-libril/ril.h /^ RIL_SOCKET_4,$/;" e enum:__anon0bfbaecf0103
+RIL_SOCKET_H_INCLUDED guest/hals/ril/reference-libril/RilSocket.h /^#define RIL_SOCKET_H_INCLUDED$/;" d
+RIL_SOCKET_ID guest/hals/ril/reference-libril/ril.h /^} RIL_SOCKET_ID;$/;" t typeref:enum:__anon0bfbaecf0103
+RIL_SOCKET_NUM guest/hals/ril/reference-libril/ril.h /^ RIL_SOCKET_NUM$/;" e enum:__anon0bfbaecf0103
+RIL_SOCKET_TYPE guest/hals/ril/reference-libril/ril_ex.h /^} RIL_SOCKET_TYPE;$/;" t typeref:enum:__anon316d80cb0103
+RIL_ScanStatus guest/hals/ril/reference-libril/ril.h /^} RIL_ScanStatus;$/;" t typeref:enum:__anon0bfbaecfb203
+RIL_ScanType guest/hals/ril/reference-libril/ril.h /^} RIL_ScanType;$/;" t typeref:enum:__anon0bfbaecfa403
+RIL_SignalStrengthReportingCriteria_v1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrengthReportingCriteria_v1_5;$/;" t typeref:struct:__anon0bfbaecf5608
+RIL_SignalStrengthWcdma guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrengthWcdma;$/;" t typeref:struct:__anon0bfbaecf4808
+RIL_SignalStrength_v10 guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrength_v10;$/;" t typeref:struct:__anon0bfbaecf5208
+RIL_SignalStrength_v12 guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrength_v12;$/;" t typeref:struct:__anon0bfbaecf5308
+RIL_SignalStrength_v5 guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrength_v5;$/;" t typeref:struct:__anon0bfbaecf4f08
+RIL_SignalStrength_v6 guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrength_v6;$/;" t typeref:struct:__anon0bfbaecf5008
+RIL_SignalStrength_v8 guest/hals/ril/reference-libril/ril.h /^} RIL_SignalStrength_v8;$/;" t typeref:struct:__anon0bfbaecf5108
+RIL_SimAuthentication guest/hals/ril/reference-libril/ril.h /^} RIL_SimAuthentication;$/;" t typeref:struct:__anon0bfbaecfc208
+RIL_SimLockMultiSimPolicy guest/hals/ril/reference-libril/ril.h /^} RIL_SimLockMultiSimPolicy;$/;" t typeref:enum:__anon0bfbaecf2803
+RIL_SimRefreshResponse_v7 guest/hals/ril/reference-libril/ril.h /^} RIL_SimRefreshResponse_v7;$/;" t typeref:struct:__anon0bfbaecf4108
+RIL_SimRefreshResult guest/hals/ril/reference-libril/ril.h /^} RIL_SimRefreshResult;$/;" t typeref:enum:__anon0bfbaecf4003
+RIL_SimSlotStatus guest/hals/ril/reference-libril/ril.h /^} RIL_SimSlotStatus;$/;" t typeref:struct:__anon0bfbaecfb908
+RIL_SimSlotStatus_V1_2 guest/hals/ril/reference-libril/ril.h /^} RIL_SimSlotStatus_V1_2;$/;" t typeref:struct:__anon0bfbaecfba08
+RIL_SlotState guest/hals/ril/reference-libril/ril.h /^} RIL_SlotState;$/;" t typeref:enum:__anon0bfbaecfb803
+RIL_SrvccState guest/hals/ril/reference-libril/ril.h /^} RIL_SrvccState;$/;" t typeref:enum:__anon0bfbaecf8e03
+RIL_SsRequestType guest/hals/ril/reference-libril/ril.h /^} RIL_SsRequestType;$/;" t typeref:enum:__anon0bfbaecf9603
+RIL_SsServiceType guest/hals/ril/reference-libril/ril.h /^} RIL_SsServiceType;$/;" t typeref:enum:__anon0bfbaecf9503
+RIL_SsTeleserviceType guest/hals/ril/reference-libril/ril.h /^} RIL_SsTeleserviceType;$/;" t typeref:enum:__anon0bfbaecf9703
+RIL_StkCcUnsolSsResponse guest/hals/ril/reference-libril/ril.h /^} RIL_StkCcUnsolSsResponse;$/;" t typeref:struct:__anon0bfbaecf9908
+RIL_SuppSvcNotification guest/hals/ril/reference-libril/ril.h /^} RIL_SuppSvcNotification;$/;" t typeref:struct:__anon0bfbaecf3108
+RIL_Supports guest/hals/ril/reference-libril/ril.h /^typedef int (*RIL_Supports)(int requestCode);$/;" t typeref:typename:int (*)(int requestCode)
+RIL_SystemSelectionChannels_v1_5 guest/hals/ril/reference-libril/ril.h /^} RIL_SystemSelectionChannels_v1_5;$/;" t typeref:struct:__anon0bfbaecfb108
+RIL_TD_SCDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^} RIL_TD_SCDMA_SignalStrength;$/;" t typeref:struct:__anon0bfbaecf4d08
+RIL_TELEPHONY_SOCKET guest/hals/ril/reference-libril/ril_ex.h /^ RIL_TELEPHONY_SOCKET,$/;" e enum:__anon316d80cb0103
+RIL_TIMESTAMP_TYPE_ANTENNA guest/hals/ril/reference-libril/ril.h /^ RIL_TIMESTAMP_TYPE_ANTENNA = 1,$/;" e enum:__anon0bfbaecf6c03
+RIL_TIMESTAMP_TYPE_JAVA_RIL guest/hals/ril/reference-libril/ril.h /^ RIL_TIMESTAMP_TYPE_JAVA_RIL = 4,$/;" e enum:__anon0bfbaecf6c03
+RIL_TIMESTAMP_TYPE_MODEM guest/hals/ril/reference-libril/ril.h /^ RIL_TIMESTAMP_TYPE_MODEM = 2,$/;" e enum:__anon0bfbaecf6c03
+RIL_TIMESTAMP_TYPE_OEM_RIL guest/hals/ril/reference-libril/ril.h /^ RIL_TIMESTAMP_TYPE_OEM_RIL = 3,$/;" e enum:__anon0bfbaecf6c03
+RIL_TIMESTAMP_TYPE_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_TIMESTAMP_TYPE_UNKNOWN = 0,$/;" e enum:__anon0bfbaecf6c03
+RIL_TimeStampType guest/hals/ril/reference-libril/ril.h /^} RIL_TimeStampType;$/;" t typeref:enum:__anon0bfbaecf6c03
+RIL_TimedCallback guest/hals/ril/reference-libril/ril.h /^typedef void (*RIL_TimedCallback) (void *param);$/;" t typeref:typename:void (*)(void * param)
+RIL_Token guest/hals/ril/reference-libril/ril.h /^typedef void * RIL_Token;$/;" t typeref:typename:void *
+RIL_UIM_SOCKET_H_INCLUDED guest/hals/ril/reference-libril/RilSapSocket.h /^#define RIL_UIM_SOCKET_H_INCLUDED$/;" d
+RIL_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ RIL_UNKNOWN = 4, \/\/ Unknown$/;" e enum:__anon0bfbaecf3703
+RIL_UNKNOWN_AND_EMERGENCY_AVAILABLE guest/hals/ril/reference-libril/ril.h /^ RIL_UNKNOWN_AND_EMERGENCY_AVAILABLE = 14, \/\/ Same as UNKNOWN but indicates that$/;" e enum:__anon0bfbaecf3703
+RIL_UNSOL_CALL_RING guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CALL_RING /;" d
+RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION /;" d
+RIL_UNSOL_CDMA_CALL_WAITING guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CDMA_CALL_WAITING /;" d
+RIL_UNSOL_CDMA_INFO_REC guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CDMA_INFO_REC /;" d
+RIL_UNSOL_CDMA_OTA_PROVISION_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CDMA_OTA_PROVISION_STATUS /;" d
+RIL_UNSOL_CDMA_PRL_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CDMA_PRL_CHANGED /;" d
+RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL /;" d
+RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED /;" d
+RIL_UNSOL_CELL_INFO_LIST guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CELL_INFO_LIST /;" d
+RIL_UNSOL_CONFIG_ICC_SLOT_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_CONFIG_ICC_SLOT_STATUS /;" d
+RIL_UNSOL_DATA_CALL_LIST_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_DATA_CALL_LIST_CHANGED /;" d
+RIL_UNSOL_DC_RT_INFO_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_DC_RT_INFO_CHANGED /;" d
+RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE /;" d
+RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE /;" d
+RIL_UNSOL_HARDWARE_CONFIG_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_HARDWARE_CONFIG_CHANGED /;" d
+RIL_UNSOL_KEEPALIVE_STATUS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_KEEPALIVE_STATUS /;" d
+RIL_UNSOL_LCEDATA_RECV guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_LCEDATA_RECV /;" d
+RIL_UNSOL_MODEM_RESTART guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_MODEM_RESTART /;" d
+RIL_UNSOL_NETWORK_SCAN_RESULT guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_NETWORK_SCAN_RESULT /;" d
+RIL_UNSOL_NITZ_TIME_RECEIVED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_NITZ_TIME_RECEIVED /;" d
+RIL_UNSOL_OEM_HOOK_RAW guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_OEM_HOOK_RAW /;" d
+RIL_UNSOL_ON_SS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_ON_SS /;" d
+RIL_UNSOL_ON_USSD guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_ON_USSD /;" d
+RIL_UNSOL_ON_USSD_REQUEST guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_ON_USSD_REQUEST /;" d
+RIL_UNSOL_PCO_DATA guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_PCO_DATA /;" d
+RIL_UNSOL_PHYSICAL_CHANNEL_CONFIGS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_PHYSICAL_CHANNEL_CONFIGS /;" d
+RIL_UNSOL_RADIO_CAPABILITY guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RADIO_CAPABILITY /;" d
+RIL_UNSOL_RESEND_INCALL_MUTE guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESEND_INCALL_MUTE /;" d
+RIL_UNSOL_RESPONSE guest/hals/ril/reference-libril/ril.cpp /^#define RIL_UNSOL_RESPONSE(/;" d file:
+RIL_UNSOL_RESPONSE guest/hals/ril/reference-libril/ril_config.cpp /^#define RIL_UNSOL_RESPONSE(/;" d file:
+RIL_UNSOL_RESPONSE_BASE guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_BASE /;" d
+RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED /;" d
+RIL_UNSOL_RESPONSE_CDMA_NEW_SMS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_CDMA_NEW_SMS /;" d
+RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED /;" d
+RIL_UNSOL_RESPONSE_LAST guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_LAST /;" d
+RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS /;" d
+RIL_UNSOL_RESPONSE_NEW_SMS guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_NEW_SMS /;" d
+RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM /;" d
+RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT /;" d
+RIL_UNSOL_RESPONSE_RADIO_CONFIG_BASE guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_RADIO_CONFIG_BASE /;" d
+RIL_UNSOL_RESPONSE_RADIO_CONFIG_LAST guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_RADIO_CONFIG_LAST /;" d
+RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED /;" d
+RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED /;" d
+RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED /;" d
+RIL_UNSOL_RESTRICTED_STATE_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RESTRICTED_STATE_CHANGED /;" d
+RIL_UNSOL_RIL_CONNECTED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RIL_CONNECTED /;" d
+RIL_UNSOL_RINGBACK_TONE guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_RINGBACK_TONE /;" d
+RIL_UNSOL_SIGNAL_STRENGTH guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_SIGNAL_STRENGTH /;" d
+RIL_UNSOL_SIM_REFRESH guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_SIM_REFRESH /;" d
+RIL_UNSOL_SIM_SMS_STORAGE_FULL guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_SIM_SMS_STORAGE_FULL /;" d
+RIL_UNSOL_SRVCC_STATE_NOTIFY guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_SRVCC_STATE_NOTIFY /;" d
+RIL_UNSOL_STK_CALL_SETUP guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_STK_CALL_SETUP /;" d
+RIL_UNSOL_STK_CC_ALPHA_NOTIFY guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_STK_CC_ALPHA_NOTIFY /;" d
+RIL_UNSOL_STK_EVENT_NOTIFY guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_STK_EVENT_NOTIFY /;" d
+RIL_UNSOL_STK_PROACTIVE_COMMAND guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_STK_PROACTIVE_COMMAND /;" d
+RIL_UNSOL_STK_SESSION_END guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_STK_SESSION_END /;" d
+RIL_UNSOL_SUPP_SVC_NOTIFICATION guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_SUPP_SVC_NOTIFICATION /;" d
+RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED /;" d
+RIL_UNSOL_VOICE_RADIO_TECH_CHANGED guest/hals/ril/reference-libril/ril.h /^#define RIL_UNSOL_VOICE_RADIO_TECH_CHANGED /;" d
+RIL_UNUSED_PARM guest/hals/ril/reference-ril/reference-ril.c /^#define RIL_UNUSED_PARM(/;" d file:
+RIL_UR_DATA_CALL_DORMANCY_CHANGED guest/hals/ril/reference-libril/ril.h /^ RIL_UR_DATA_CALL_DORMANCY_CHANGED = 0x04 \/\/ When this bit is set, modem should send the d/;" e enum:__anon0bfbaecfa203
+RIL_UR_FULL_NETWORK_STATE guest/hals/ril/reference-libril/ril.h /^ RIL_UR_FULL_NETWORK_STATE = 0x02, \/\/ When this bit is set, modem should always sen/;" e enum:__anon0bfbaecfa203
+RIL_UR_SIGNAL_STRENGTH guest/hals/ril/reference-libril/ril.h /^ RIL_UR_SIGNAL_STRENGTH = 0x01, \/\/ When this bit is set, modem should always sen/;" e enum:__anon0bfbaecfa203
+RIL_UUS_DCS guest/hals/ril/reference-libril/ril.h /^} RIL_UUS_DCS;$/;" t typeref:enum:__anon0bfbaecf0e03
+RIL_UUS_DCS_IA5c guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_DCS_IA5c = 4 \/* IA5 characters *\/$/;" e enum:__anon0bfbaecf0e03
+RIL_UUS_DCS_OSIHLP guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_DCS_OSIHLP = 1, \/* OSI higher layer protocol *\/$/;" e enum:__anon0bfbaecf0e03
+RIL_UUS_DCS_RMCF guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_DCS_RMCF = 3, \/* Reserved for system mangement$/;" e enum:__anon0bfbaecf0e03
+RIL_UUS_DCS_USP guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_DCS_USP = 0, \/* User specified protocol *\/$/;" e enum:__anon0bfbaecf0e03
+RIL_UUS_DCS_X244 guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_DCS_X244 = 2, \/* X.244 *\/$/;" e enum:__anon0bfbaecf0e03
+RIL_UUS_Info guest/hals/ril/reference-libril/ril.h /^} RIL_UUS_Info;$/;" t typeref:struct:__anon0bfbaecf0f08
+RIL_UUS_TYPE1_IMPLICIT guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE1_IMPLICIT = 0,$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_TYPE1_NOT_REQUIRED guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE1_NOT_REQUIRED = 2,$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_TYPE1_REQUIRED guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE1_REQUIRED = 1,$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_TYPE2_NOT_REQUIRED guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE2_NOT_REQUIRED = 4,$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_TYPE2_REQUIRED guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE2_REQUIRED = 3,$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_TYPE3_NOT_REQUIRED guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE3_NOT_REQUIRED = 6$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_TYPE3_REQUIRED guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_TYPE3_REQUIRED = 5,$/;" e enum:__anon0bfbaecf0d03
+RIL_UUS_Type guest/hals/ril/reference-libril/ril.h /^} RIL_UUS_Type;$/;" t typeref:enum:__anon0bfbaecf0d03
+RIL_UnsolicitedResponseFilter guest/hals/ril/reference-libril/ril.h /^} RIL_UnsolicitedResponseFilter;$/;" t typeref:enum:__anon0bfbaecfa203
+RIL_UtranBands guest/hals/ril/reference-libril/ril.h /^} RIL_UtranBands;$/;" t typeref:enum:__anon0bfbaecfa803
+RIL_VERSION guest/hals/ril/reference-libril/ril.h /^#define RIL_VERSION /;" d
+RIL_VERSION_MIN guest/hals/ril/reference-libril/ril.h /^#define RIL_VERSION_MIN /;" d
+RIL_VoiceRegistrationStateResponse guest/hals/ril/reference-libril/ril.h /^}RIL_VoiceRegistrationStateResponse;$/;" t typeref:struct:__anon0bfbaecf7f08
+RIL_getServiceName guest/hals/ril/reference-libril/ril.cpp /^char * RIL_getServiceName() {$/;" f namespace:android typeref:typename:char *
+RIL_onRequestAck guest/hals/ril/reference-libril/ril.cpp /^RIL_onRequestAck(RIL_Token t) {$/;" f namespace:android typeref:typename:void
+RIL_onRequestComplete guest/hals/ril/reference-libril/ril.cpp /^RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {$/;" f namespace:android typeref:typename:void
+RIL_onRequestComplete guest/hals/ril/reference-ril/reference-ril.c /^#define RIL_onRequestComplete(/;" d file:
+RIL_onUnsolicitedResponse guest/hals/ril/reference-libril/ril.cpp /^void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,$/;" f namespace:android typeref:typename:void
+RIL_onUnsolicitedResponse guest/hals/ril/reference-ril/reference-ril.c /^#define RIL_onUnsolicitedResponse(/;" d file:
+RIL_register guest/hals/ril/reference-libril/ril.cpp /^RIL_register (const RIL_RadioFunctions *callbacks) {$/;" f namespace:android typeref:typename:void
+RIL_register_socket guest/hals/ril/reference-libril/ril.cpp /^RIL_register_socket (const RIL_RadioFunctions *(*Init)(const struct RIL_Env *, int, char **),$/;" f namespace:android typeref:typename:void
+RIL_requestTimedCallback guest/hals/ril/reference-libril/ril.cpp /^RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,$/;" f namespace:android typeref:typename:void
+RIL_requestTimedCallback guest/hals/ril/reference-ril/reference-ril.c /^#define RIL_requestTimedCallback(/;" d file:
+RIL_setcallbacks guest/hals/ril/reference-libril/ril.cpp /^extern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {$/;" f namespace:android typeref:typename:void
+RIL_startEventLoop guest/hals/ril/reference-libril/ril.cpp /^RIL_startEventLoop(void) {$/;" f namespace:android typeref:typename:void
+ROUTING_MERGENCY guest/hals/ril/reference-libril/ril.h /^ ROUTING_MERGENCY = 1, \/* Indicates the implementation must handle the call through emerg/;" e enum:__anon0bfbaecfb603
+ROUTING_NORMAL guest/hals/ril/reference-libril/ril.h /^ ROUTING_NORMAL = 2, \/* Indicates the implementation must handle the call through norma/;" e enum:__anon0bfbaecfb603
+ROUTING_UNKNOWN guest/hals/ril/reference-libril/ril.h /^ ROUTING_UNKNOWN = 0, \/* Indicates Android does not require how to handle$/;" e enum:__anon0bfbaecfb603
+RSCP guest/hals/ril/reference-libril/ril.h /^ RSCP = 2,$/;" e enum:__anon0bfbaecf5403
+RSRP guest/hals/ril/reference-libril/ril.h /^ RSRP = 3,$/;" e enum:__anon0bfbaecf5403
+RSRQ guest/hals/ril/reference-libril/ril.h /^ RSRQ = 4,$/;" e enum:__anon0bfbaecf5403
+RSSI guest/hals/ril/reference-libril/ril.h /^ RSSI = 1,$/;" e enum:__anon0bfbaecf5403
+RSSNR guest/hals/ril/reference-libril/ril.h /^ RSSNR = 5,$/;" e enum:__anon0bfbaecf5403
+RUIM_ABSENT guest/hals/ril/reference-ril/reference-ril.c /^ RUIM_ABSENT = 6,$/;" e enum:__anon70d7df6f0303 file:
+RUIM_NETWORK_PERSONALIZATION guest/hals/ril/reference-ril/reference-ril.c /^ RUIM_NETWORK_PERSONALIZATION = 11,$/;" e enum:__anon70d7df6f0303 file:
+RUIM_NOT_READY guest/hals/ril/reference-ril/reference-ril.c /^ RUIM_NOT_READY = 7,$/;" e enum:__anon70d7df6f0303 file:
+RUIM_PIN guest/hals/ril/reference-ril/reference-ril.c /^ RUIM_PIN = 9,$/;" e enum:__anon70d7df6f0303 file:
+RUIM_PUK guest/hals/ril/reference-ril/reference-ril.c /^ RUIM_PUK = 10,$/;" e enum:__anon70d7df6f0303 file:
+RUIM_READY guest/hals/ril/reference-ril/reference-ril.c /^ RUIM_READY = 8,$/;" e enum:__anon70d7df6f0303 file:
+RUN_AT host/commands/modem_simulator/stk_service.h /^ RUN_AT = 0x34,$/;" e enum:cuttlefish::StkService::CommandType
+RadioCapabilityPhase guest/hals/ril/reference-libril/ril.h /^} RadioCapabilityPhase;$/;" t typeref:enum:__anon0bfbaecf0803
+RadioCapabilityStatus guest/hals/ril/reference-libril/ril.h /^} RadioCapabilityStatus;$/;" t typeref:enum:__anon0bfbaecf0903
+RadioConfigImpl guest/hals/ril/reference-libril/ril_config.cpp /^struct RadioConfigImpl : public V1_3::IRadioConfig {$/;" s file:
+RadioImpl_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^struct RadioImpl_1_6 : public V1_6::IRadio {$/;" s file:
+RadioState host/commands/modem_simulator/network_service.h /^ enum RadioState : int32_t {$/;" g class:cuttlefish::NetworkService typeref:typename:int32_t
+RadioTechnologyV1_4 guest/hals/ril/reference-libril/ril_service.cpp /^using RadioTechnologyV1_4 = android::hardware::radio::V1_4::RadioTechnology;$/;" t typeref:typename:android::hardware::radio::V1_4::RadioTechnology file:
+RandomClientSecret host/frontend/webrtc_operator/client_handler.cpp /^std::string RandomClientSecret(size_t len) {$/;" f namespace:cuttlefish::__anon9f2993ef0111 typeref:typename:std::string
+RandomSerialNumber host/libs/config/cuttlefish_config.cpp /^std::string RandomSerialNumber(const std::string& prefix) {$/;" f namespace:cuttlefish typeref:typename:std::string
+Raw common/libs/utils/unix_sockets.cpp /^cmsghdr* ControlMessage::Raw() {$/;" f class:cuttlefish::ControlMessage typeref:typename:cmsghdr *
+Raw common/libs/utils/unix_sockets.cpp /^const cmsghdr* ControlMessage::Raw() const {$/;" f class:cuttlefish::ControlMessage typeref:typename:const cmsghdr *
+ReExecSelf host/commands/secure_env/secure_env.cpp /^[[noreturn]] void ReExecSelf() {$/;" f namespace:cuttlefish::__anon0a6d9b510111 typeref:typename:void
+Read common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::Read(void* buf, size_t count) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+Read common/libs/utils/vsock_connection.cpp /^bool VsockConnection::Read(std::vector<char>& data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+Read common/libs/utils/vsock_connection.cpp /^int32_t VsockConnection::Read() {$/;" f class:cuttlefish::VsockConnection typeref:typename:int32_t
+Read common/libs/utils/vsock_connection.cpp /^std::vector<char> VsockConnection::Read(size_t size) {$/;" f class:cuttlefish::VsockConnection typeref:typename:std::vector<char>
+Read host/commands/secure_env/fragile_tpm_storage.cpp /^std::unique_ptr<TPM2B_MAX_NV_BUFFER> FragileTpmStorage::Read($/;" f class:cuttlefish::FragileTpmStorage typeref:typename:std::unique_ptr<TPM2B_MAX_NV_BUFFER>
+Read host/commands/secure_env/insecure_fallback_storage.cpp /^std::unique_ptr<TPM2B_MAX_NV_BUFFER> InsecureFallbackStorage::Read($/;" f class:cuttlefish::InsecureFallbackStorage typeref:typename:std::unique_ptr<TPM2B_MAX_NV_BUFFER>
+ReadAll common/libs/fs/shared_buf.cc /^ssize_t ReadAll(SharedFD fd, std::string* buf) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+ReadAllFDData common/libs/utils/unix_sockets_test.cpp /^std::string ReadAllFDData(SharedFD fd) {$/;" f namespace:cuttlefish typeref:typename:std::string
+ReadAsync common/libs/utils/vsock_connection.cpp /^std::future<std::vector<char>> VsockConnection::ReadAsync(size_t size) {$/;" f class:cuttlefish::VsockConnection typeref:typename:std::future<std::vector<char>>
+ReadCommand host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::ReadCommand(Client& client) {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+ReadCommandResponse host/commands/modem_simulator/unittest/service_test.cpp /^ void ReadCommandResponse(std::vector<std::string>& response) {$/;" f class:ModemServiceTest typeref:typename:void file:
+ReadConfig host/libs/config/config_flag.cpp /^ std::optional<Json::Value> ReadConfig(const std::string& name) const {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:std::optional<Json::Value> file:
+ReadEvent host/commands/kernel_log_monitor/utils.cc /^std::optional<ReadEventResult> ReadEvent(cuttlefish::SharedFD fd) {$/;" f namespace:monitor typeref:typename:std::optional<ReadEventResult>
+ReadEventResult host/commands/kernel_log_monitor/utils.h /^struct ReadEventResult {$/;" s namespace:monitor
+ReadExact common/libs/fs/shared_buf.cc /^ssize_t ReadExact(SharedFD fd, char* buf, size_t size) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+ReadExact common/libs/fs/shared_buf.cc /^ssize_t ReadExact(SharedFD fd, std::string* buf) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+ReadExact common/libs/fs/shared_buf.cc /^ssize_t ReadExact(SharedFD fd, std::vector<char>* buf) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+ReadExactBinary common/libs/fs/shared_buf.h /^ssize_t ReadExactBinary(SharedFD fd, T* binary_data) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+ReadFile common/libs/utils/files.cpp /^std::string ReadFile(const std::string& file) {$/;" f namespace:cuttlefish typeref:typename:std::string
+ReadGnssRawMeasurement host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void ReadGnssRawMeasurement() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+ReadJsonMessage common/libs/utils/vsock_connection.cpp /^Json::Value VsockConnection::ReadJsonMessage() {$/;" f class:cuttlefish::VsockConnection typeref:typename:Json::Value
+ReadJsonMessageAsync common/libs/utils/vsock_connection.cpp /^std::future<Json::Value> VsockConnection::ReadJsonMessageAsync() {$/;" f class:cuttlefish::VsockConnection typeref:typename:std::future<Json::Value>
+ReadKernelConfig host/commands/assemble_cvd/flags.cc /^void ReadKernelConfig(KernelConfig* kernel_config) {$/;" f namespace:cuttlefish::__anon145bfaab0111 typeref:typename:void
+ReadLoop host/commands/console_forwarder/main.cpp /^ [[noreturn]] void ReadLoop() {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:void file:
+ReadLoop host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ [[noreturn]] void ReadLoop() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+ReadLoop host/frontend/webrtc/adb_handler.cpp /^void AdbHandler::ReadLoop() {$/;" f class:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:void
+ReadLoop host/frontend/webrtc/bluetooth_handler.cpp /^void BluetoothHandler::ReadLoop() {$/;" f class:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:void
+ReadLoop host/frontend/webrtc/kernel_log_events_handler.cpp /^void KernelLogEventsHandler::ReadLoop() {$/;" f class:cuttlefish::KernelLogEventsHandler typeref:typename:void
+ReadMessage common/libs/utils/unix_sockets.cpp /^Result<UnixSocketMessage> UnixMessageSocket::ReadMessage() {$/;" f class:cuttlefish::UnixMessageSocket typeref:typename:Result<UnixSocketMessage>
+ReadMessage common/libs/utils/vsock_connection.cpp /^bool VsockConnection::ReadMessage(std::vector<char>& data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+ReadMessage common/libs/utils/vsock_connection.cpp /^std::vector<char> VsockConnection::ReadMessage() {$/;" f class:cuttlefish::VsockConnection typeref:typename:std::vector<char>
+ReadMessageAsync common/libs/utils/vsock_connection.cpp /^std::future<std::vector<char>> VsockConnection::ReadMessageAsync() {$/;" f class:cuttlefish::VsockConnection typeref:typename:std::future<std::vector<char>>
+ReadNmeaFromLocalFile host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void ReadNmeaFromLocalFile() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+ReadPayload common/libs/confui/packet.cpp /^std::optional<ParsedPacket> ReadPayload(SharedFD s) {$/;" f namespace:cuttlefish::confui::packet typeref:typename:std::optional<ParsedPacket>
+ReadProtectedJsonFromFile host/commands/secure_env/json_serializable.cpp /^Json::Value ReadProtectedJsonFromFile($/;" f namespace:cuttlefish typeref:typename:Json::Value
+ReadRawData common/libs/confui/packet.cpp /^static std::optional<std::vector<std::uint8_t>> ReadRawData(SharedFD s) {$/;" f namespace:cuttlefish::confui::packet typeref:typename:std::optional<std::vector<std::uint8_t>> file:
+ReadVsockRequest guest/hals/camera/vsock_camera_device_session_3_4.h /^ struct ReadVsockRequest {$/;" s class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession
+ReadWriteCapability host/libs/image_aggregator/cdisk_spec.proto /^enum ReadWriteCapability {$/;" g
+Reason host/commands/modem_simulator/sup_service.h /^ enum Reason {$/;" g struct:cuttlefish::SupService::CallForwardInfo
+RebootRecoveryTest tests/recovery/src/com/android/cuttlefish/tests/RebootRecoveryTest.java /^public class RebootRecoveryTest extends BaseHostJUnit4Test {$/;" c
+RebuildSuperImage host/commands/assemble_cvd/super_image_mixer.cc /^bool RebuildSuperImage(const FetcherConfig& fetcher_config,$/;" f namespace:cuttlefish typeref:typename:bool
+Receive host/commands/secure_env/in_process_tpm.cpp /^ static TSS2_RC Receive($/;" f class:cuttlefish::InProcessTpm::Impl typeref:typename:TSS2_RC file:
+Receive host/libs/msg_queue/msg_queue.cc /^ssize_t SysVMessageQueue::Receive(void* data, size_t size, long msgtyp,$/;" f class:cuttlefish::SysVMessageQueue typeref:typename:ssize_t
+ReceiveCapture host/libs/audio_connector/server.cpp /^bool AudioClientConnection::ReceiveCapture(AudioServerExecutor& executor) {$/;" f class:cuttlefish::AudioClientConnection typeref:typename:bool
+ReceiveCommands host/libs/audio_connector/server.cpp /^bool AudioClientConnection::ReceiveCommands(AudioServerExecutor& executor) {$/;" f class:cuttlefish::AudioClientConnection typeref:typename:bool
+ReceiveMessage common/libs/security/gatekeeper_channel.cpp /^ManagedGatekeeperMessage GatekeeperChannel::ReceiveMessage() {$/;" f class:cuttlefish::GatekeeperChannel typeref:typename:ManagedGatekeeperMessage
+ReceiveMessage common/libs/security/keymaster_channel.cpp /^ManagedKeymasterMessage KeymasterChannel::ReceiveMessage() {$/;" f class:cuttlefish::KeymasterChannel typeref:typename:ManagedKeymasterMessage
+ReceiveMsg host/libs/audio_connector/server.cpp /^ssize_t AudioClientConnection::ReceiveMsg(SharedFD socket, void* buffer,$/;" f class:cuttlefish::AudioClientConnection typeref:typename:ssize_t
+ReceivePlayback host/libs/audio_connector/server.cpp /^bool AudioClientConnection::ReceivePlayback(AudioServerExecutor& executor) {$/;" f class:cuttlefish::AudioClientConnection typeref:typename:bool
+RecordDisplays host/frontend/webrtc/lib/streamer.cpp /^void Streamer::RecordDisplays(LocalRecorder& recorder) {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+RecordFlags host/libs/config/fetcher_config.cpp /^void FetcherConfig::RecordFlags() {$/;" f class:cuttlefish::FetcherConfig typeref:typename:void
+RecordToNvBuffer host/commands/secure_env/tpm_gatekeeper.cpp /^static std::unique_ptr<TPM2B_MAX_NV_BUFFER> RecordToNvBuffer($/;" f namespace:cuttlefish typeref:typename:std::unique_ptr<TPM2B_MAX_NV_BUFFER> file:
+Recording host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::Recording() const { return recording_; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+RecordingDeviceName host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::RecordingDeviceName($/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+RecordingDevices host/frontend/webrtc/lib/audio_device.cpp /^int16_t CfAudioDeviceModule::RecordingDevices() { return 1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int16_t
+RecordingIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::RecordingIsAvailable(bool* available) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+RecordingIsInitialized host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::RecordingIsInitialized() const { return true; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+RecursivelyRemoveDirectory common/libs/utils/files.cpp /^bool RecursivelyRemoveDirectory(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:bool
+Recv common/frontend/socket_vsock_proxy/main.cpp /^ ssize_t Recv(char* packet, ssize_t length) {$/;" f class:__anon913036200111::SocketReceiver typeref:typename:ssize_t file:
+Recv common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::Recv(void* buf, size_t len, int flags) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+Recv common/libs/utils/tcp_socket.cpp /^Message ClientSocket::Recv(std::size_t length) {$/;" f class:cuttlefish::ClientSocket typeref:typename:Message
+RecvAdbResponse host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string RecvAdbResponse(cuttlefish::SharedFD sock) {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+RecvAll common/libs/fs/shared_buf.cc /^std::string RecvAll(SharedFD sock, const size_t count) {$/;" f namespace:cuttlefish typeref:typename:std::string
+RecvAll host/frontend/adb_connector/adb_connection_maintainer.cpp /^std::string RecvAll(cuttlefish::SharedFD sock, const size_t count) {$/;" f namespace:__anon734383cf0111 typeref:typename:std::string
+RecvAny common/libs/utils/tcp_socket.cpp /^Message ClientSocket::RecvAny(std::size_t length) {$/;" f class:cuttlefish::ClientSocket typeref:typename:Message
+RecvConfUiMsg common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> RecvConfUiMsg(SharedFD fd) {$/;" f namespace:cuttlefish::confui typeref:typename:std::unique_ptr<ConfUiMessage>
+RecvConfUiMsg common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> RecvConfUiMsg(const std::string& session_id,$/;" f namespace:cuttlefish::confui typeref:typename:std::unique_ptr<ConfUiMessage>
+RecvJsonMsg host/libs/allocd/utils.cpp /^std::optional<Json::Value> RecvJsonMsg(SharedFD client_socket) {$/;" f namespace:cuttlefish typeref:typename:std::optional<Json::Value>
+RecvMsg common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::RecvMsg(struct msghdr* msg, int flags) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+RecvUptimeResult host/frontend/adb_connector/adb_connection_maintainer.cpp /^int RecvUptimeResult(cuttlefish::SharedFD sock) {$/;" f namespace:__anon734383cf0111 typeref:typename:int
+RedirectStdIO common/libs/utils/subprocess.cpp /^void Command::RedirectStdIO(Subprocess::StdIOChannel channel,$/;" f class:cuttlefish::Command typeref:typename:void
+RedirectStdIO common/libs/utils/subprocess.cpp /^void Command::RedirectStdIO(Subprocess::StdIOChannel subprocess_channel,$/;" f class:cuttlefish::Command typeref:typename:void
+RefreshCredential host/commands/fetcher/credential_source.cc /^void GceMetadataCredentialSource::RefreshCredential() {$/;" f class:cuttlefish::GceMetadataCredentialSource typeref:typename:void
+RegStateResultV1_5 guest/hals/ril/reference-libril/ril_service.cpp /^using RegStateResultV1_5 = android::hardware::radio::V1_5::RegStateResult;$/;" t typeref:typename:android::hardware::radio::V1_5::RegStateResult file:
+RegStateResultV1_6 guest/hals/ril/reference-libril/ril_service.cpp /^using RegStateResultV1_6 = android::hardware::radio::V1_6::RegStateResult;$/;" t typeref:typename:android::hardware::radio::V1_6::RegStateResult file:
+Region host/libs/wayland/wayland_surface.h /^ struct Region {$/;" s class:wayland::Surface
+Register host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Register(std::weak_ptr<OperatorObserver> observer) {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+RegisterAudioCallback host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::RegisterAudioCallback($/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+RegisterAudioObserver host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::RegisterAudioObserver(AudioObserver* observer) {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+RegisterClient host/frontend/webrtc_operator/device_handler.cpp /^size_t DeviceHandler::RegisterClient($/;" f class:cuttlefish::DeviceHandler typeref:typename:size_t
+RegisterDevice host/frontend/webrtc_operator/device_registry.cpp /^bool DeviceRegistry::RegisterDevice($/;" f class:cuttlefish::DeviceRegistry typeref:typename:bool
+RegisterDynHandlerFactory host/libs/websocket/websocket_server.cpp /^void WebSocketServer::RegisterDynHandlerFactory($/;" f class:cuttlefish::WebSocketServer typeref:typename:void
+RegisterHandlerFactory host/libs/websocket/websocket_server.cpp /^void WebSocketServer::RegisterHandlerFactory($/;" f class:cuttlefish::WebSocketServer typeref:typename:void
+RegisterModemService host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::RegisterModemService() {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+RegisterObserver host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::RegisterObserver($/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+RegisterQueue common/libs/concurrency/multiplexer.h /^ int RegisterQueue(QueuePtr&& queue) {$/;" f class:cuttlefish::Multiplexer typeref:typename:int
+RegistrationState host/commands/modem_simulator/network_service.h /^ enum RegistrationState {$/;" g class:cuttlefish::NetworkService
+RegistrationUnsolMode host/commands/modem_simulator/network_service.h /^ enum RegistrationUnsolMode {$/;" g struct:cuttlefish::NetworkService::NetworkRegistrationStatus
+ReleaseAllResources host/libs/allocd/resource_manager.h /^ bool ReleaseAllResources() {$/;" f class:cuttlefish::Session typeref:typename:bool
+ReleaseAllocdResources host/commands/stop/main.cc /^void ReleaseAllocdResources(SharedFD allocd_sock, uint32_t session_id) {$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:void
+ReleaseDhcp4 common/libs/utils/network.cpp /^bool ReleaseDhcp4(SharedFD tap, const std::uint8_t mac_address[6],$/;" f namespace:cuttlefish typeref:typename:bool
+ReleaseDhcpLeases common/libs/utils/network.cpp /^bool ReleaseDhcpLeases(const std::string& lease_path, SharedFD tap_fd,$/;" f namespace:cuttlefish typeref:typename:bool
+ReleaseFence guest/hals/camera/cached_stream_buffer.cpp /^ReleaseFence::ReleaseFence(int fence_fd) : handle_(nullptr) {$/;" f class:android::hardware::camera::device::V3_4::implementation::ReleaseFence
+ReleaseFence guest/hals/camera/cached_stream_buffer.h /^class ReleaseFence {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+ReleaseResource host/libs/allocd/resource.cpp /^bool EthernetIface::ReleaseResource() {$/;" f class:cuttlefish::EthernetIface typeref:typename:bool
+ReleaseResource host/libs/allocd/resource.cpp /^bool MobileIface::ReleaseResource() {$/;" f class:cuttlefish::MobileIface typeref:typename:bool
+ReleaseResource host/libs/allocd/resource_manager.h /^ bool ReleaseResource(uint32_t resource_id) {$/;" f class:cuttlefish::Session typeref:typename:bool
+ReleaseStream host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::ReleaseStream(StreamControlCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+ReloadConfig host/libs/wmediumd_controller/wmediumd_controller.cpp /^bool WmediumdController::ReloadConfig(const std::string& configPath) {$/;" f class:cuttlefish::WmediumdController typeref:typename:bool
+ReloadCurrentConfig host/libs/wmediumd_controller/wmediumd_controller.cpp /^bool WmediumdController::ReloadCurrentConfig(void) {$/;" f class:cuttlefish::WmediumdController typeref:typename:bool
+RememberConnection host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionContextImpl::RememberConnection($/;" f class:WsConnectionContextImpl typeref:typename:void
+RemoteGateKeeperDevice guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^RemoteGateKeeperDevice::RemoteGateKeeperDevice(cuttlefish::GatekeeperChannel* channel)$/;" f class:gatekeeper::RemoteGateKeeperDevice
+RemoteGateKeeperDevice guest/hals/gatekeeper/remote/remote_gatekeeper.h /^class RemoteGateKeeperDevice : public ::android::hardware::gatekeeper::V1_0::IGatekeeper {$/;" c namespace:gatekeeper
+RemoteKeyMintDevice guest/hals/keymint/remote/remote_keymint_device.cpp /^RemoteKeyMintDevice::RemoteKeyMintDevice(::keymaster::RemoteKeymaster& impl,$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice
+RemoteKeyMintDevice guest/hals/keymint/remote/remote_keymint_device.h /^class RemoteKeyMintDevice : public BnKeyMintDevice {$/;" c namespace:aidl::android::hardware::security::keymint
+RemoteKeyMintOperation guest/hals/keymint/remote/remote_keymint_operation.cpp /^RemoteKeyMintOperation::RemoteKeyMintOperation($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation
+RemoteKeyMintOperation guest/hals/keymint/remote/remote_keymint_operation.h /^class RemoteKeyMintOperation : public BnKeyMintOperation {$/;" c namespace:aidl::android::hardware::security::keymint
+RemoteKeymaster guest/hals/keymaster/remote/remote_keymaster.cpp /^RemoteKeymaster::RemoteKeymaster(cuttlefish::KeymasterChannel* channel)$/;" f class:keymaster::RemoteKeymaster
+RemoteKeymaster guest/hals/keymaster/remote/remote_keymaster.h /^class RemoteKeymaster {$/;" c namespace:keymaster
+RemoteKeymaster guest/hals/keymint/remote/remote_keymaster.cpp /^RemoteKeymaster::RemoteKeymaster(cuttlefish::KeymasterChannel* channel,$/;" f class:keymaster::RemoteKeymaster
+RemoteKeymaster guest/hals/keymint/remote/remote_keymaster.h /^class RemoteKeymaster {$/;" c namespace:keymaster
+RemoteKeymaster4Device guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^RemoteKeymaster4Device::RemoteKeymaster4Device(RemoteKeymaster* impl) : impl_(impl) {}$/;" f class:keymaster::V4_1::RemoteKeymaster4Device
+RemoteKeymaster4Device guest/hals/keymaster/remote/remote_keymaster4_device.h /^class RemoteKeymaster4Device : public IKeymasterDevice {$/;" c namespace:keymaster::V4_1
+RemoteRemotelyProvisionedComponent guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^RemoteRemotelyProvisionedComponent::RemoteRemotelyProvisionedComponent($/;" f class:aidl::android::hardware::security::keymint::RemoteRemotelyProvisionedComponent
+RemoteRemotelyProvisionedComponent guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^class RemoteRemotelyProvisionedComponent$/;" c namespace:aidl::android::hardware::security::keymint
+RemoteSecureClock guest/hals/keymint/remote/remote_secure_clock.cpp /^RemoteSecureClock::RemoteSecureClock(keymaster::RemoteKeymaster& impl)$/;" f class:aidl::android::hardware::security::secureclock::RemoteSecureClock
+RemoteSecureClock guest/hals/keymint/remote/remote_secure_clock.h /^class RemoteSecureClock : public BnSecureClock {$/;" c namespace:aidl::android::hardware::security::secureclock
+RemoteSharedSecret guest/hals/keymint/remote/remote_shared_secret.cpp /^RemoteSharedSecret::RemoteSharedSecret(::keymaster::RemoteKeymaster& keymint)$/;" f class:aidl::android::hardware::security::sharedsecret::RemoteSharedSecret
+RemoteSharedSecret guest/hals/keymint/remote/remote_shared_secret.h /^class RemoteSharedSecret : public BnSharedSecret {$/;" c namespace:aidl::android::hardware::security::sharedsecret
+RemoveEncodedSink host/frontend/webrtc/lib/video_track_source_impl.h /^ void RemoveEncodedSink($/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:void
+RemoveFile common/libs/utils/files.cpp /^bool RemoveFile(const std::string& file) {$/;" f namespace:cuttlefish typeref:typename:bool
+RemoveInterface host/libs/allocd/resource_manager.cpp /^bool ResourceManager::RemoveInterface(const std::string& iface, IfaceType ty) {$/;" f class:cuttlefish::ResourceManager typeref:typename:bool
+RemoveSink host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::RemoveSink(webrtc::AudioTrackSinkInterface* sink) {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+RenameFile common/libs/utils/files.cpp /^bool RenameFile(const std::string& old_name, const std::string& new_name) {$/;" f namespace:cuttlefish typeref:typename:bool
+RenameNetwork guest/commands/setup_wifi/main.cpp /^int RenameNetwork(const std::string& name, const std::string& new_name) {$/;" f typeref:typename:int
+RenderConfirmationUi host/libs/screen_connector/screen_connector.h /^ bool RenderConfirmationUi(std::uint32_t display_number,$/;" f class:cuttlefish::ScreenConnector typeref:typename:bool
+RenderDialog host/libs/confui/session.cc /^bool Session::RenderDialog() {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+RenderRawFrame host/libs/confui/host_renderer.cc /^std::shared_ptr<TeeUiFrameWrapper> ConfUiRenderer::RenderRawFrame() {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::shared_ptr<TeeUiFrameWrapper>
+RepackBootImage host/commands/assemble_cvd/boot_image_utils.cc /^bool RepackBootImage(const std::string& new_kernel_path,$/;" f namespace:cuttlefish typeref:typename:bool
+RepackVendorBootImage host/commands/assemble_cvd/boot_image_utils.cc /^bool RepackVendorBootImage(const std::string& new_ramdisk,$/;" f namespace:cuttlefish typeref:typename:bool
+RepackVendorBootImageWithEmptyRamdisk host/commands/assemble_cvd/boot_image_utils.cc /^bool RepackVendorBootImageWithEmptyRamdisk($/;" f namespace:cuttlefish typeref:typename:bool
+RepackVendorRamdisk host/commands/assemble_cvd/boot_image_utils.cc /^void RepackVendorRamdisk(const std::string& kernel_modules_ramdisk_path,$/;" f namespace:cuttlefish::__anonbfa95aa40111 typeref:typename:void
+RepaintRawFrame host/libs/confui/host_renderer.cc /^std::unique_ptr<TeeUiFrameWrapper> ConfUiRenderer::RepaintRawFrame($/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::unique_ptr<TeeUiFrameWrapper>
+Reply host/frontend/webrtc_operator/client_handler.cpp /^void ClientDynHandler::Reply(const Json::Value& json) {$/;" f class:cuttlefish::ClientDynHandler typeref:typename:void
+Reply host/frontend/webrtc_operator/signal_handler.cpp /^void SignalHandler::Reply(const Json::Value& json) {$/;" f class:cuttlefish::SignalHandler typeref:typename:void
+Reply host/libs/audio_connector/commands.cpp /^void ChmapInfoCommand::Reply(AudioStatus status,$/;" f class:cuttlefish::ChmapInfoCommand typeref:typename:void
+Reply host/libs/audio_connector/commands.cpp /^void JackInfoCommand::Reply(AudioStatus status,$/;" f class:cuttlefish::JackInfoCommand typeref:typename:void
+Reply host/libs/audio_connector/commands.cpp /^void StreamControlCommand::Reply(AudioStatus status) {$/;" f class:cuttlefish::StreamControlCommand typeref:typename:void
+Reply host/libs/audio_connector/commands.cpp /^void StreamInfoCommand::Reply(AudioStatus status,$/;" f class:cuttlefish::StreamInfoCommand typeref:typename:void
+ReplyError host/frontend/webrtc_operator/client_handler.cpp /^void ClientDynHandler::ReplyError(const std::string& message) {$/;" f class:cuttlefish::ClientDynHandler typeref:typename:void
+ReportErrorToHal host/libs/confui/session.cc /^bool Session::ReportErrorToHal(SharedFD hal_cli, const std::string& msg) {$/;" f class:cuttlefish::confui::Session typeref:typename:bool
+ReqStatusToStrMap host/libs/allocd/utils.cpp /^const std::map<RequestStatus, std::string> ReqStatusToStrMap = {$/;" v namespace:cuttlefish typeref:typename:const std::map<RequestStatus,std::string>
+ReqTyToStr host/libs/allocd/utils.cpp /^std::string ReqTyToStr(RequestType req_ty) {$/;" f namespace:cuttlefish typeref:typename:std::string
+RequestData common/libs/net/netlink_request.cpp /^void* NetlinkRequest::RequestData() const {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void *
+RequestHeader host/libs/allocd/request.h /^struct RequestHeader {$/;" s namespace:cuttlefish
+RequestInfo guest/hals/ril/reference-libril/ril_internal.h /^typedef struct RequestInfo {$/;" s namespace:android
+RequestInfo guest/hals/ril/reference-libril/ril_internal.h /^} RequestInfo;$/;" t namespace:android typeref:struct:android::RequestInfo
+RequestLength common/libs/net/netlink_request.cpp /^size_t NetlinkRequest::RequestLength() const {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:size_t
+RequestStatus host/libs/allocd/request.h /^enum class RequestStatus : uint16_t {$/;" g namespace:cuttlefish typeref:typename:uint16_t
+RequestTimedCallback guest/hals/ril/reference-libril/ril.h /^ void (*RequestTimedCallback) (RIL_TimedCallback callback,$/;" m struct:RIL_Env typeref:typename:void (*)(RIL_TimedCallback callback,void * param,const struct timeval * relativeTime)
+RequestTyToStrMap host/libs/allocd/utils.cpp /^const std::map<RequestType, const char*> RequestTyToStrMap = {$/;" v namespace:cuttlefish typeref:typename:const std::map<RequestType,const char * >
+RequestType host/libs/allocd/request.h /^enum class RequestType : uint16_t {$/;" g namespace:cuttlefish typeref:typename:uint16_t
+Reserve common/libs/net/netlink_request.h /^ template <typename T> T* Reserve() {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:T *
+ReserveRaw common/libs/net/netlink_request.cpp /^void* NetlinkRequest::ReserveRaw(size_t length) {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:void *
+ReserveSlot host/commands/secure_env/tpm_resource_manager.cpp /^TpmObjectSlot TpmResourceManager::ReserveSlot() {$/;" f class:cuttlefish::TpmResourceManager typeref:typename:TpmObjectSlot
+Reset host/commands/modem_simulator/network_service.h /^ void Reset() {$/;" f struct:cuttlefish::NetworkService::SignalStrength typeref:typename:void
+Reset host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::HoldingBuffer::Reset(size_t size) {$/;" f class:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:void
+ResizeImage host/libs/config/data_image.cpp /^bool ResizeImage(const CuttlefishConfig& config, const std::string& data_image,$/;" f namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:bool
+Resolution host/frontend/webrtc/lib/camera_streamer.h /^ using Resolution = struct {$/;" t class:cuttlefish::webrtc_streaming::CameraStreamer
+ResolveInstanceFiles host/commands/assemble_cvd/disk_flags.cc /^bool ResolveInstanceFiles() {$/;" f namespace:cuttlefish typeref:typename:bool
+ResourceManager host/libs/allocd/resource_manager.h /^struct ResourceManager {$/;" s namespace:cuttlefish
+ResourceType host/libs/allocd/resource.h /^enum class ResourceType {$/;" g namespace:cuttlefish
+RestartCvdMain host/commands/restart_cvd/restart_cvd.cc /^int RestartCvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish::__anon63a091d80111 typeref:typename:int
+RestartRunCvd host/commands/run_cvd/server_loop.cpp /^ void RestartRunCvd(int notification_fd) {$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:void file:
+ResultTriple guest/hals/confirmationui/guest_session.h /^ using ResultTriple =$/;" t class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::tuple<ResponseCode,teeui::MsgVector<uint8_t>,teeui::MsgVector<uint8_t>>
+RetryImpl host/commands/fetcher/curl_wrapper.cc /^ CurlResponse<T> RetryImpl(std::function<CurlResponse<T>()> attempt_fn) {$/;" f class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:CurlResponse<T> file:
+Revision host/commands/fetcher/build_api.h /^ const std::string& Revision() const { return revision; }$/;" f class:cuttlefish::Artifact typeref:typename:const std::string &
+RilE2eTests tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^public class RilE2eTests {$/;" c
+RilSapSocket guest/hals/ril/reference-libril/RilSapSocket.cpp /^RilSapSocket::RilSapSocket(const char *socketName,$/;" f class:RilSapSocket
+RilSapSocket guest/hals/ril/reference-libril/RilSapSocket.h /^class RilSapSocket : public RilSocket {$/;" c
+RilSapSocketList guest/hals/ril/reference-libril/RilSapSocket.h /^ typedef struct RilSapSocketList {$/;" s class:RilSapSocket
+RilSapSocketList guest/hals/ril/reference-libril/RilSapSocket.h /^ } RilSapSocketList;$/;" t class:RilSapSocket typeref:struct:RilSapSocket::RilSapSocketList
+RilSocket guest/hals/ril/reference-libril/RilSocket.h /^ RilSocket(const char* socketName, RIL_SOCKET_ID socketId) {$/;" f class:RilSocket
+RilSocket guest/hals/ril/reference-libril/RilSocket.h /^class RilSocket {$/;" c
+Ril_queue guest/hals/ril/reference-libril/rilSocketQueue.h /^Ril_queue<T>::Ril_queue(void) {$/;" f class:Ril_queue
+Ril_queue guest/hals/ril/reference-libril/rilSocketQueue.h /^class Ril_queue {$/;" c
+RootCanal host/commands/run_cvd/launch.cc /^class RootCanal : public CommandSource {$/;" c namespace:cuttlefish file:
+RootCanalBinary host/libs/config/known_paths.cpp /^std::string RootCanalBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+RoundUpToBlockSize host/commands/secure_env/encrypted_serializable.cpp /^static uint32_t RoundUpToBlockSize(uint32_t num) {$/;" f namespace:cuttlefish typeref:typename:uint32_t file:
+Run host/commands/run_cvd/server_loop.cpp /^ void Run(ProcessMonitor& process_monitor) override {$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:void file:
+RunConnector host/libs/config/adb/data.cpp /^ bool RunConnector() const override { return run_connector_; }$/;" f class:cuttlefish::AdbConfigImpl typeref:typename:bool file:
+RunCvdMain host/commands/run_cvd/main.cc /^int RunCvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+RunExternalCommand host/libs/allocd/alloc_utils.cpp /^int RunExternalCommand(const std::string& command) {$/;" f namespace:cuttlefish typeref:typename:int
+RunServer host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^void RunServer() {$/;" f typeref:typename:void
+RunSession guest/hals/confirmationui/TrustyConfirmationUI.cpp /^void TrustyConfirmationUI::RunSession(sp<IConfirmationResultCallback> resultCB,$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:void
+RunSetup host/libs/config/feature.cpp /^\/* static *\/ bool Feature::RunSetup(const std::vector<Feature*>& features) {$/;" f class:cuttlefish::Feature typeref:typename:bool
+RunThread host/libs/confui/host_utils.h /^ std::thread RunThread(const std::string& name, F&& f, Args&&... args) {$/;" f class:cuttlefish::confui::thread::ThreadTracer typeref:typename:std::thread
+RunThread host/libs/confui/host_utils.h /^std::thread RunThread(const std::string& name, F&& f, Args&&... args) {$/;" f namespace:cuttlefish::confui::thread typeref:typename:std::thread
+RunWithManagedStdio common/libs/utils/subprocess.cpp /^int RunWithManagedStdio(Command&& cmd_tmp, const std::string* stdin_str,$/;" f namespace:cuttlefish typeref:typename:int
+RunnerExitCodes host/commands/run_cvd/runner_defs.h /^enum RunnerExitCodes : int {$/;" g namespace:cuttlefish typeref:typename:int
+RxBuffer host/libs/audio_connector/buffers.h /^ RxBuffer(const virtio_snd_pcm_xfer& header, volatile uint8_t* buffer,$/;" f class:cuttlefish::RxBuffer
+RxBuffer host/libs/audio_connector/buffers.h /^class RxBuffer : public ShmBuffer {$/;" c namespace:cuttlefish
+RxBufferAt host/libs/audio_connector/server.cpp /^volatile uint8_t* AudioClientConnection::RxBufferAt(size_t offset,$/;" f class:cuttlefish::AudioClientConnection typeref:typename:volatile uint8_t *
+SANITIZE_TARGET vsoc_arm64/phone/aosp_cf_hwasan.mk /^ SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) hwaddress)$/;" m
+SANITIZE_TARGET vsoc_arm64_only/phone/aosp_cf_hwasan.mk /^ SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) hwaddress)$/;" m
+SAP_SERVICE_H guest/hals/ril/reference-libril/sap_service.h /^#define SAP_SERVICE_H$/;" d
+SC host/commands/modem_simulator/sim_service.h /^ SC = 9, \/\/ PIN enable\/disable$/;" e enum:cuttlefish::SimService::FacilityLock::LockType
+SCOPED_CAPABILITY common/libs/concurrency/thread_annotations.h /^#define SCOPED_CAPABILITY /;" d
+SECTOR_SIZE host/libs/config/mbr.h /^constexpr int SECTOR_SIZE = 1 << SECTOR_SIZE_SHIFT;$/;" v typeref:typename:int
+SECTOR_SIZE_SHIFT host/libs/config/mbr.h /^constexpr int SECTOR_SIZE_SHIFT = 9;$/;" v typeref:typename:int
+SELECT_ITEM host/commands/modem_simulator/stk_service.h /^ SELECT_ITEM = 0x24,$/;" e enum:cuttlefish::StkService::CommandType
+SEND_DATA host/commands/modem_simulator/stk_service.h /^ SEND_DATA = 0x43,$/;" e enum:cuttlefish::StkService::CommandType
+SEND_DTMF host/commands/modem_simulator/stk_service.h /^ SEND_DTMF = 0x14,$/;" e enum:cuttlefish::StkService::CommandType
+SEND_SMS host/commands/modem_simulator/stk_service.h /^ SEND_SMS = 0x13,$/;" e enum:cuttlefish::StkService::CommandType
+SEND_SS host/commands/modem_simulator/stk_service.h /^ SEND_SS = 0x11,$/;" e enum:cuttlefish::StkService::CommandType
+SEND_USSD host/commands/modem_simulator/stk_service.h /^ SEND_USSD = 0x12,$/;" e enum:cuttlefish::StkService::CommandType
+SESSION_ANY common/libs/confui/protocol.h /^constexpr auto SESSION_ANY = "";$/;" v namespace:cuttlefish::confui typeref:typename:auto
+SET_U16 host/frontend/webrtc_operator/utils.cpp /^void SET_U16(void *_dst, uint16_t x) {$/;" f typeref:typename:void
+SET_U32 host/frontend/webrtc_operator/utils.cpp /^void SET_U32(void *_dst, uint32_t x) {$/;" f typeref:typename:void
+SET_UP_CALL host/commands/modem_simulator/stk_service.h /^ SET_UP_CALL = 0x10,$/;" e enum:cuttlefish::StkService::CommandType
+SET_UP_EVENT_LIST host/commands/modem_simulator/stk_service.h /^ SET_UP_EVENT_LIST = 0x05,$/;" e enum:cuttlefish::StkService::CommandType
+SET_UP_IDLE_MODE_TEXT host/commands/modem_simulator/stk_service.h /^ SET_UP_IDLE_MODE_TEXT = 0x28,$/;" e enum:cuttlefish::StkService::CommandType
+SET_UP_MENU host/commands/modem_simulator/stk_service.h /^ SET_UP_MENU = 0x25,$/;" e enum:cuttlefish::StkService::CommandType
+SIGNATURE_LENGTH_BYTES host/commands/secure_env/soft_gatekeeper.h /^ static const uint32_t SIGNATURE_LENGTH_BYTES = 32;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:const uint32_t
+SIM_ABSENT guest/hals/ril/reference-ril/reference-ril.c /^ SIM_ABSENT = 0,$/;" e enum:__anon70d7df6f0303 file:
+SIM_AUTH_RESPONSE_SUCCESS guest/hals/ril/reference-ril/reference-ril.c /^#define SIM_AUTH_RESPONSE_SUCCESS /;" d file:
+SIM_AUTH_RESPONSE_SYNC_FAILURE guest/hals/ril/reference-ril/reference-ril.c /^#define SIM_AUTH_RESPONSE_SYNC_FAILURE /;" d file:
+SIM_COUNT guest/hals/ril/reference-libril/ril.h /^#define SIM_COUNT /;" d
+SIM_FILE_UPDATE guest/hals/ril/reference-libril/ril.h /^ SIM_FILE_UPDATE = 0,$/;" e enum:__anon0bfbaecf4003
+SIM_INIT guest/hals/ril/reference-libril/ril.h /^ SIM_INIT = 1,$/;" e enum:__anon0bfbaecf4003
+SIM_NETWORK_PERSONALIZATION guest/hals/ril/reference-ril/reference-ril.c /^ SIM_NETWORK_PERSONALIZATION = 5,$/;" e enum:__anon70d7df6f0303 file:
+SIM_NOT_READY guest/hals/ril/reference-ril/reference-ril.c /^ SIM_NOT_READY = 1,$/;" e enum:__anon70d7df6f0303 file:
+SIM_PIN guest/hals/ril/reference-ril/reference-ril.c /^ SIM_PIN = 3,$/;" e enum:__anon70d7df6f0303 file:
+SIM_PUK guest/hals/ril/reference-ril/reference-ril.c /^ SIM_PUK = 4,$/;" e enum:__anon70d7df6f0303 file:
+SIM_READY guest/hals/ril/reference-ril/reference-ril.c /^ SIM_READY = 2,$/;" e enum:__anon70d7df6f0303 file:
+SIM_RESET guest/hals/ril/reference-libril/ril.h /^ SIM_RESET = 2$/;" e enum:__anon0bfbaecf4003
+SIM_STATUS_ABSENT host/commands/modem_simulator/sim_service.h /^ SIM_STATUS_ABSENT = 0,$/;" e enum:cuttlefish::SimService::SimStatus
+SIM_STATUS_NOT_READY host/commands/modem_simulator/sim_service.h /^ SIM_STATUS_NOT_READY,$/;" e enum:cuttlefish::SimService::SimStatus
+SIM_STATUS_PIN host/commands/modem_simulator/sim_service.h /^ SIM_STATUS_PIN,$/;" e enum:cuttlefish::SimService::SimStatus
+SIM_STATUS_PUK host/commands/modem_simulator/sim_service.h /^ SIM_STATUS_PUK,$/;" e enum:cuttlefish::SimService::SimStatus
+SIM_STATUS_READY host/commands/modem_simulator/sim_service.h /^ SIM_STATUS_READY,$/;" e enum:cuttlefish::SimService::SimStatus
+SIM_Status guest/hals/ril/reference-ril/reference-ril.c /^} SIM_Status;$/;" t typeref:enum:__anon70d7df6f0303 file:
+SINGLELINE guest/hals/ril/reference-ril/atchannel.h /^ SINGLELINE, \/* a single intermediate response starting with a prefix *\/$/;" e enum:__anon512a2c1f0103
+SIZE_OF_VIRTIO_NET_HDR_V1 common/libs/utils/network.cpp /^static constexpr int SIZE_OF_VIRTIO_NET_HDR_V1 = 12;$/;" v namespace:cuttlefish::__anoncaae79910111 typeref:typename:int file:
+SLOT_STATE_ACTIVE guest/hals/ril/reference-libril/ril.h /^ SLOT_STATE_ACTIVE = 0x01,$/;" e enum:__anon0bfbaecfb803
+SLOT_STATE_INACTIVE guest/hals/ril/reference-libril/ril.h /^ SLOT_STATE_INACTIVE = 0x00,$/;" e enum:__anon0bfbaecfb803
+SMS host/commands/modem_simulator/sim_service.h /^ SMS = 1 << 3, \/\/ short message services$/;" e enum:cuttlefish::SimService::FacilityLock::Class
+SOCKET host/commands/secure_env/in_process_tpm.cpp /^typedef int SOCKET;$/;" t typeref:typename:int file:
+SOURCE_DEFAULT guest/hals/ril/reference-libril/ril.h /^ SOURCE_DEFAULT = 1 << 3, \/* Indicates the number is available as default.$/;" e enum:__anon0bfbaecfb503
+SOURCE_MODEM_CONFIG guest/hals/ril/reference-libril/ril.h /^ SOURCE_MODEM_CONFIG = 1 << 2, \/* Indicates the number is from the modem config. *\/$/;" e enum:__anon0bfbaecfb503
+SOURCE_NETWORK_SIGNALING guest/hals/ril/reference-libril/ril.h /^ SOURCE_NETWORK_SIGNALING = 1 << 0, \/* Indicates the number is from the network signal. /;" e enum:__anon0bfbaecfb503
+SOURCE_SIM guest/hals/ril/reference-libril/ril.h /^ SOURCE_SIM = 1 << 1, \/* Indicates the number is from the sim card. *\/$/;" e enum:__anon0bfbaecfb503
+SO_VM_SOCKETS_BUFFER_MAX_SIZE common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_BUFFER_MAX_SIZE /;" d
+SO_VM_SOCKETS_BUFFER_MIN_SIZE common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_BUFFER_MIN_SIZE /;" d
+SO_VM_SOCKETS_BUFFER_SIZE common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_BUFFER_SIZE /;" d
+SO_VM_SOCKETS_CONNECT_TIMEOUT common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_CONNECT_TIMEOUT /;" d
+SO_VM_SOCKETS_NONBLOCK_TXRX common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_NONBLOCK_TXRX /;" d
+SO_VM_SOCKETS_PEER_HOST_VM_ID common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_PEER_HOST_VM_ID /;" d
+SO_VM_SOCKETS_TRUSTED common/libs/fs/vm_sockets.h /^#define SO_VM_SOCKETS_TRUSTED /;" d
+SSH_FLAGS tools/create_base_image.go /^var SSH_FLAGS string$/;" v package:main typeref:typename:string
+SSOURCE guest/hals/ril/reference-ril/reference-ril.c /^#define SSOURCE(/;" d file:
+SSRSRP guest/hals/ril/reference-libril/ril.h /^ SSRSRP = 6,$/;" e enum:__anon0bfbaecf5403
+SSRSRQ guest/hals/ril/reference-libril/ril.h /^ SSRSRQ = 7,$/;" e enum:__anon0bfbaecf5403
+SSSINR guest/hals/ril/reference-libril/ril.h /^ SSSINR = 8,$/;" e enum:__anon0bfbaecf5403
+SS_ACTIVATION guest/hals/ril/reference-libril/ril.h /^ SS_ACTIVATION,$/;" e enum:__anon0bfbaecf9603
+SS_ALL_BARRING guest/hals/ril/reference-libril/ril.h /^ SS_ALL_BARRING,$/;" e enum:__anon0bfbaecf9503
+SS_ALL_DATA_TELESERVICES guest/hals/ril/reference-libril/ril.h /^ SS_ALL_DATA_TELESERVICES,$/;" e enum:__anon0bfbaecf9703
+SS_ALL_TELESERVICES_EXCEPT_SMS guest/hals/ril/reference-libril/ril.h /^ SS_ALL_TELESERVICES_EXCEPT_SMS$/;" e enum:__anon0bfbaecf9703
+SS_ALL_TELESEVICES guest/hals/ril/reference-libril/ril.h /^ SS_ALL_TELESEVICES,$/;" e enum:__anon0bfbaecf9703
+SS_ALL_TELE_AND_BEARER_SERVICES guest/hals/ril/reference-libril/ril.h /^ SS_ALL_TELE_AND_BEARER_SERVICES,$/;" e enum:__anon0bfbaecf9703
+SS_BAIC guest/hals/ril/reference-libril/ril.h /^ SS_BAIC,$/;" e enum:__anon0bfbaecf9503
+SS_BAIC_ROAMING guest/hals/ril/reference-libril/ril.h /^ SS_BAIC_ROAMING,$/;" e enum:__anon0bfbaecf9503
+SS_BAOC guest/hals/ril/reference-libril/ril.h /^ SS_BAOC,$/;" e enum:__anon0bfbaecf9503
+SS_BAOIC guest/hals/ril/reference-libril/ril.h /^ SS_BAOIC,$/;" e enum:__anon0bfbaecf9503
+SS_BAOIC_EXC_HOME guest/hals/ril/reference-libril/ril.h /^ SS_BAOIC_EXC_HOME,$/;" e enum:__anon0bfbaecf9503
+SS_CFU guest/hals/ril/reference-libril/ril.h /^ SS_CFU,$/;" e enum:__anon0bfbaecf9503
+SS_CF_ALL guest/hals/ril/reference-libril/ril.h /^ SS_CF_ALL,$/;" e enum:__anon0bfbaecf9503
+SS_CF_ALL_CONDITIONAL guest/hals/ril/reference-libril/ril.h /^ SS_CF_ALL_CONDITIONAL,$/;" e enum:__anon0bfbaecf9503
+SS_CF_BUSY guest/hals/ril/reference-libril/ril.h /^ SS_CF_BUSY,$/;" e enum:__anon0bfbaecf9503
+SS_CF_NOT_REACHABLE guest/hals/ril/reference-libril/ril.h /^ SS_CF_NOT_REACHABLE,$/;" e enum:__anon0bfbaecf9503
+SS_CF_NO_REPLY guest/hals/ril/reference-libril/ril.h /^ SS_CF_NO_REPLY,$/;" e enum:__anon0bfbaecf9503
+SS_CLIP guest/hals/ril/reference-libril/ril.h /^ SS_CLIP,$/;" e enum:__anon0bfbaecf9503
+SS_CLIR guest/hals/ril/reference-libril/ril.h /^ SS_CLIR,$/;" e enum:__anon0bfbaecf9503
+SS_COLP guest/hals/ril/reference-libril/ril.h /^ SS_COLP,$/;" e enum:__anon0bfbaecf9503
+SS_COLR guest/hals/ril/reference-libril/ril.h /^ SS_COLR,$/;" e enum:__anon0bfbaecf9503
+SS_DEACTIVATION guest/hals/ril/reference-libril/ril.h /^ SS_DEACTIVATION,$/;" e enum:__anon0bfbaecf9603
+SS_ERASURE guest/hals/ril/reference-libril/ril.h /^ SS_ERASURE$/;" e enum:__anon0bfbaecf9603
+SS_INCOMING_BARRING guest/hals/ril/reference-libril/ril.h /^ SS_INCOMING_BARRING$/;" e enum:__anon0bfbaecf9503
+SS_INFO_MAX guest/hals/ril/reference-libril/ril.h /^#define SS_INFO_MAX /;" d
+SS_INTERROGATION guest/hals/ril/reference-libril/ril.h /^ SS_INTERROGATION,$/;" e enum:__anon0bfbaecf9603
+SS_OUTGOING_BARRING guest/hals/ril/reference-libril/ril.h /^ SS_OUTGOING_BARRING,$/;" e enum:__anon0bfbaecf9503
+SS_REGISTRATION guest/hals/ril/reference-libril/ril.h /^ SS_REGISTRATION,$/;" e enum:__anon0bfbaecf9603
+SS_SMS_SERVICES guest/hals/ril/reference-libril/ril.h /^ SS_SMS_SERVICES,$/;" e enum:__anon0bfbaecf9703
+SS_TELEPHONY guest/hals/ril/reference-libril/ril.h /^ SS_TELEPHONY,$/;" e enum:__anon0bfbaecf9703
+SS_WAIT guest/hals/ril/reference-libril/ril.h /^ SS_WAIT,$/;" e enum:__anon0bfbaecf9503
+STAGEFRIGHT_AVCENC_CFLAGS shared/BoardConfig.mk /^STAGEFRIGHT_AVCENC_CFLAGS := -DANDROID_GCE$/;" m
+STK_CLOSE_CHANNEL guest/hals/ril/reference-ril/reference-ril.c /^ STK_CLOSE_CHANNEL = 0x41,$/;" e enum:__anon70d7df6f0503 file:
+STK_GET_CHANNEL_STATUS guest/hals/ril/reference-ril/reference-ril.c /^ STK_GET_CHANNEL_STATUS = 0x44,$/;" e enum:__anon70d7df6f0503 file:
+STK_OPEN_CHANNEL guest/hals/ril/reference-ril/reference-ril.c /^ STK_OPEN_CHANNEL = 0x40,$/;" e enum:__anon70d7df6f0503 file:
+STK_PLAY_TONE guest/hals/ril/reference-ril/reference-ril.c /^ STK_PLAY_TONE = 0x20,$/;" e enum:__anon70d7df6f0503 file:
+STK_RECEIVE_DATA guest/hals/ril/reference-ril/reference-ril.c /^ STK_RECEIVE_DATA = 0x42,$/;" e enum:__anon70d7df6f0503 file:
+STK_REFRESH guest/hals/ril/reference-ril/reference-ril.c /^ STK_REFRESH = 0x01,$/;" e enum:__anon70d7df6f0503 file:
+STK_RUN_AT guest/hals/ril/reference-ril/reference-ril.c /^ STK_RUN_AT = 0x34,$/;" e enum:__anon70d7df6f0503 file:
+STK_SEND_DATA guest/hals/ril/reference-ril/reference-ril.c /^ STK_SEND_DATA = 0x43,$/;" e enum:__anon70d7df6f0503 file:
+STK_SEND_DTMF guest/hals/ril/reference-ril/reference-ril.c /^ STK_SEND_DTMF = 0x14,$/;" e enum:__anon70d7df6f0503 file:
+STK_SEND_SMS guest/hals/ril/reference-ril/reference-ril.c /^ STK_SEND_SMS = 0x13,$/;" e enum:__anon70d7df6f0503 file:
+STK_SEND_SS guest/hals/ril/reference-ril/reference-ril.c /^ STK_SEND_SS = 0x11,$/;" e enum:__anon70d7df6f0503 file:
+STK_SEND_USSD guest/hals/ril/reference-ril/reference-ril.c /^ STK_SEND_USSD = 0x12,$/;" e enum:__anon70d7df6f0503 file:
+STK_UNSOL_EVENT_NOTIFY guest/hals/ril/reference-ril/reference-ril.c /^ STK_UNSOL_EVENT_NOTIFY,$/;" e enum:__anon70d7df6f0403 file:
+STK_UNSOL_EVENT_UNKNOWN guest/hals/ril/reference-ril/reference-ril.c /^ STK_UNSOL_EVENT_UNKNOWN,$/;" e enum:__anon70d7df6f0403 file:
+STK_UNSOL_PROACTIVE_CMD guest/hals/ril/reference-ril/reference-ril.c /^ STK_UNSOL_PROACTIVE_CMD,$/;" e enum:__anon70d7df6f0403 file:
+STREAMS host/frontend/webrtc/audio_handler.cpp /^const virtio_snd_pcm_info STREAMS[] = {{$/;" v namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:const virtio_snd_pcm_info[]
+STRIPPED_RD host/commands/assemble_cvd/boot_image_utils.cc /^const char STRIPPED_RD[] = "stripped_ramdisk";$/;" v typeref:typename:const char[]
+SYSTEM_BUILD host/libs/config/fetcher_config.h /^ SYSTEM_BUILD,$/;" e enum:cuttlefish::FileSource
+SampleRate host/frontend/webrtc/audio_handler.cpp /^int SampleRate(uint8_t virtio_rate) {$/;" f namespace:cuttlefish::__anon2a3d92f70111 typeref:typename:int
+SapImpl guest/hals/ril/reference-libril/sap_service.cpp /^struct SapImpl : public android::hardware::radio::V1_1::ISap {$/;" s file:
+SapSocketRequest guest/hals/ril/reference-libril/RilSapSocket.h /^ typedef struct SapSocketRequest {$/;" s class:RilSapSocket
+SapSocketRequest guest/hals/ril/reference-libril/RilSapSocket.h /^ } SapSocketRequest;$/;" t class:RilSapSocket typeref:struct:RilSapSocket::SapSocketRequest
+SaveConfig host/commands/assemble_cvd/assemble_cvd.cc /^bool SaveConfig(const CuttlefishConfig& tmp_config_obj) {$/;" f namespace:cuttlefish::__anon1e335d460111 typeref:typename:bool
+SaveFacilityLockToIccProfile host/commands/modem_simulator/sim_service.cpp /^void SimService::SaveFacilityLockToIccProfile() {$/;" f class:cuttlefish::SimService typeref:typename:void
+SaveFile host/commands/host_bugreport/main.cc /^void SaveFile(ZipWriter& writer, const std::string& zip_path,$/;" f namespace:cuttlefish::__anond3364bd20111 typeref:typename:void
+SaveFragment host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::SaveFragment(const ConfigFragment& fragment) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+SaveModemState host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::SaveModemState() {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+SavePinStateToIccProfile host/commands/modem_simulator/sim_service.cpp /^void SimService::SavePinStateToIccProfile() {$/;" f class:cuttlefish::SimService typeref:typename:void
+SaveToFile host/commands/modem_simulator/nvram_config.cpp /^bool NvramConfig::SaveToFile(const std::string& file) const {$/;" f class:cuttlefish::NvramConfig typeref:typename:bool
+SaveToFile host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::SaveToFile() {$/;" f class:cuttlefish::NvramConfig typeref:typename:void
+SaveToFile host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::SaveToFile(const std::string& file) const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+SaveToFile host/libs/config/fetcher_config.cpp /^bool FetcherConfig::SaveToFile(const std::string& file) const {$/;" f class:cuttlefish::FetcherConfig typeref:typename:bool
+ScheduleToTerminate host/libs/confui/session.cc /^void Session::ScheduleToTerminate() {$/;" f class:cuttlefish::confui::Session typeref:typename:void
+ScopedMMap common/libs/fs/shared_fd.cpp /^ScopedMMap::ScopedMMap() : ptr_(MAP_FAILED), len_(0) {}$/;" f class:cuttlefish::ScopedMMap
+ScopedMMap common/libs/fs/shared_fd.cpp /^ScopedMMap::ScopedMMap(ScopedMMap&& other)$/;" f class:cuttlefish::ScopedMMap
+ScopedMMap common/libs/fs/shared_fd.cpp /^ScopedMMap::ScopedMMap(void* ptr, size_t len) : ptr_(ptr), len_(len) {}$/;" f class:cuttlefish::ScopedMMap
+ScopedMMap common/libs/fs/shared_fd.h /^class ScopedMMap {$/;" c namespace:cuttlefish
+ScreenChanged host/commands/kernel_log_monitor/kernel_log_server.h /^ ScreenChanged = 6,$/;" e enum:monitor::Event
+ScreenConnector host/frontend/webrtc/display_handler.h /^ using ScreenConnector = cuttlefish::ScreenConnector<WebRtcScProcessedFrame>;$/;" t class:cuttlefish::DisplayHandler typeref:typename:cuttlefish::ScreenConnector<WebRtcScProcessedFrame>
+ScreenConnector host/libs/screen_connector/screen_connector.h /^ ScreenConnector(std::unique_ptr<WaylandScreenConnector>&& impl,$/;" f class:cuttlefish::ScreenConnector
+ScreenConnector host/libs/screen_connector/screen_connector.h /^class ScreenConnector : public ScreenConnectorInfo,$/;" c namespace:cuttlefish
+ScreenConnectorCtrl host/libs/screen_connector/screen_connector_ctrl.h /^ ScreenConnectorCtrl() : atomic_mode_(ModeType::kAndroidMode) {}$/;" f class:cuttlefish::ScreenConnectorCtrl
+ScreenConnectorCtrl host/libs/screen_connector/screen_connector_ctrl.h /^class ScreenConnectorCtrl {$/;" c namespace:cuttlefish
+ScreenConnectorFrameInfo host/libs/screen_connector/screen_connector_common.h /^struct ScreenConnectorFrameInfo {$/;" s namespace:cuttlefish
+ScreenConnectorFrameRenderer host/libs/screen_connector/screen_connector_common.h /^struct ScreenConnectorFrameRenderer {$/;" s namespace:cuttlefish
+ScreenConnectorInfo host/libs/screen_connector/screen_connector_common.h /^struct ScreenConnectorInfo {$/;" s namespace:cuttlefish
+ScreenConnectorInputMultiplexer host/libs/screen_connector/screen_connector_multiplexer.h /^ ScreenConnectorInputMultiplexer(HostModeCtrl& host_mode_ctrl)$/;" f class:cuttlefish::ScreenConnectorInputMultiplexer
+ScreenConnectorInputMultiplexer host/libs/screen_connector/screen_connector_multiplexer.h /^class ScreenConnectorInputMultiplexer {$/;" c namespace:cuttlefish
+ScreenConnectorQueue host/libs/screen_connector/screen_connector_queue.h /^ ScreenConnectorQueue(const int q_max_size = 2)$/;" f class:cuttlefish::ScreenConnectorQueue
+ScreenConnectorQueue host/libs/screen_connector/screen_connector_queue.h /^class ScreenConnectorQueue {$/;" c namespace:cuttlefish
+ScreenCount host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ScreenCount() {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+ScreenHeight host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ScreenHeight(std::uint32_t display_number) {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+ScreenSizeInBytes host/libs/confui/host_renderer.h /^ static std::uint32_t ScreenSizeInBytes(const int w, const int h) {$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:std::uint32_t
+ScreenSizeInBytes host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ScreenSizeInBytes(const std::uint32_t display_number) {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+ScreenStrideBytes host/libs/confui/host_renderer.h /^ std::uint32_t ScreenStrideBytes() const {$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:std::uint32_t
+ScreenStrideBytes host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ScreenStrideBytes(const std::uint32_t display_number) {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+ScreenWidth host/libs/screen_connector/screen_connector_common.h /^ static std::uint32_t ScreenWidth(std::uint32_t display_number) {$/;" f struct:cuttlefish::ScreenConnectorInfo typeref:typename:std::uint32_t
+SecureEnvComponent host/commands/secure_env/secure_env.cpp /^fruit::Component<Tpm> SecureEnvComponent() {$/;" f namespace:cuttlefish::__anon0a6d9b510111 typeref:typename:fruit::Component<Tpm>
+SecureEnvMain host/commands/secure_env/secure_env.cpp /^int SecureEnvMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+SecureEnvironment host/commands/run_cvd/launch.cc /^class SecureEnvironment : public CommandSource {$/;" c namespace:cuttlefish file:
+SecureHal host/libs/config/cuttlefish_config.h /^enum class SecureHal {$/;" g namespace:cuttlefish
+Security host/frontend/webrtc/lib/ws_connection.h /^ enum class Security {$/;" g class:WsConnection
+SecurityLevel host/commands/secure_env/tpm_keymaster_enforcement.cpp /^keymaster_security_level_t TpmKeymasterEnforcement::SecurityLevel() const {$/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:keymaster_security_level_t
+SegmentedHmac host/commands/secure_env/tpm_hmac.cpp /^static UniqueEsysPtr<TPM2B_DIGEST> SegmentedHmac($/;" f namespace:cuttlefish typeref:typename:UniqueEsysPtr<TPM2B_DIGEST> file:
+Select common/libs/fs/shared_fd.cpp /^int Select(SharedFDSet* read_set, SharedFDSet* write_set,$/;" f namespace:cuttlefish typeref:typename:int
+SemPost common/libs/concurrency/semaphore.h /^ void SemPost() {$/;" f class:cuttlefish::Semaphore typeref:typename:void
+SemPost host/libs/screen_connector/screen_connector_ctrl.h /^ void SemPost() { sem_.SemPost(); }$/;" f class:cuttlefish::ScreenConnectorCtrl typeref:typename:void
+SemWait common/libs/concurrency/multiplexer.h /^ void SemWait() { sem_items_.SemWait(); }$/;" f class:cuttlefish::Multiplexer typeref:typename:void
+SemWait common/libs/concurrency/semaphore.h /^ void SemWait() {$/;" f class:cuttlefish::Semaphore typeref:typename:void
+SemWait host/libs/screen_connector/screen_connector_ctrl.h /^ void SemWait() { sem_.SemWait(); }$/;" f class:cuttlefish::ScreenConnectorCtrl typeref:typename:void
+Semaphore common/libs/concurrency/semaphore.h /^ Semaphore(const unsigned int init_val = 0, const unsigned int cap = 30000)$/;" f class:cuttlefish::Semaphore
+Semaphore common/libs/concurrency/semaphore.h /^class Semaphore {$/;" c namespace:cuttlefish
+Send common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::Send(const void* buf, size_t len, int flags) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+Send common/libs/net/netlink_client.cpp /^bool NetlinkClientImpl::Send(const NetlinkRequest& message) {$/;" f class:cuttlefish::__anon61381e100111::NetlinkClientImpl typeref:typename:bool
+Send guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^gatekeeper_error_t RemoteGateKeeperDevice::Send(uint32_t command, const GateKeeperMessage& reque/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:gatekeeper_error_t
+Send guest/hals/gatekeeper/remote/remote_gatekeeper.h /^ gatekeeper_error_t Send(const EnrollRequest& request, EnrollResponse *response) {$/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:gatekeeper_error_t
+Send guest/hals/gatekeeper/remote/remote_gatekeeper.h /^ gatekeeper_error_t Send(const VerifyRequest& request, VerifyResponse *response) {$/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:gatekeeper_error_t
+Send host/frontend/webrtc/lib/client_handler.cpp /^void ControlChannelHandler::Send(const Json::Value& message) {$/;" f class:cuttlefish::webrtc_streaming::ControlChannelHandler typeref:typename:void
+Send host/frontend/webrtc/lib/client_handler.cpp /^void ControlChannelHandler::Send(const uint8_t *msg, size_t size, bool binary) {$/;" f class:cuttlefish::webrtc_streaming::ControlChannelHandler typeref:typename:void
+Send host/frontend/webrtc/lib/ws_connection.cpp /^bool WsConnectionImpl::Send(const uint8_t* data, size_t len, bool binary) {$/;" f class:WsConnectionImpl typeref:typename:bool
+Send host/libs/msg_queue/msg_queue.cc /^int SysVMessageQueue::Send(void* data, size_t size, bool block) {$/;" f class:cuttlefish::SysVMessageQueue typeref:typename:int
+SendAbortCmd common/libs/confui/protocol.cpp /^bool SendAbortCmd(SharedFD fd, const std::string& session_id) {$/;" f namespace:cuttlefish::confui typeref:typename:bool
+SendAck common/libs/confui/protocol.cpp /^bool SendAck(SharedFD fd, const std::string& session_id, const bool is_success,$/;" f namespace:cuttlefish::confui typeref:typename:bool
+SendAll common/frontend/socket_vsock_proxy/main.cpp /^ ssize_t SendAll(const char* packet, ssize_t length) {$/;" f class:__anon913036200111::SocketSender typeref:typename:ssize_t file:
+SendAll common/libs/fs/shared_buf.cc /^bool SendAll(SharedFD sock, const std::string& msg) {$/;" f namespace:cuttlefish typeref:typename:bool
+SendAll host/frontend/adb_connector/adb_connection_maintainer.cpp /^bool SendAll(cuttlefish::SharedFD sock, const std::string& msg) {$/;" f namespace:__anon734383cf0111 typeref:typename:bool
+SendCallStatusToRemote host/commands/modem_simulator/call_service.cpp /^void CallService::SendCallStatusToRemote(CallStatus& call,$/;" f class:cuttlefish::CallService typeref:typename:void
+SendClientDisconnectMessage host/frontend/webrtc_operator/device_handler.cpp /^void DeviceHandler::SendClientDisconnectMessage(size_t client_id) {$/;" f class:cuttlefish::DeviceHandler typeref:typename:void
+SendClientMessage host/frontend/webrtc_operator/device_handler.cpp /^void DeviceHandler::SendClientMessage(size_t client_id,$/;" f class:cuttlefish::DeviceHandler typeref:typename:void
+SendCommand host/commands/modem_simulator/unittest/service_test.cpp /^ void SendCommand(std::string command, std::string prefix = "") {$/;" f class:ModemServiceTest typeref:typename:void file:
+SendCommandResponse host/commands/modem_simulator/channel_monitor.cpp /^void Client::SendCommandResponse($/;" f class:cuttlefish::Client typeref:typename:void
+SendCommandResponse host/commands/modem_simulator/channel_monitor.cpp /^void Client::SendCommandResponse(std::string response) const {$/;" f class:cuttlefish::Client typeref:typename:void
+SendCommandToRemote host/commands/modem_simulator/modem_service.cpp /^void ModemService::SendCommandToRemote(cuttlefish::SharedFD remote_client, std::string response)/;" f class:cuttlefish::ModemService typeref:typename:void
+SendDeviceConfig common/libs/device_config/device_config.cpp /^bool DeviceConfigHelper::SendDeviceConfig(SharedFD fd) {$/;" f class:cuttlefish::DeviceConfigHelper typeref:typename:bool
+SendDeviceMessage host/frontend/webrtc_operator/client_handler.cpp /^ void SendDeviceMessage(const Json::Value& message) override {$/;" f class:cuttlefish::PollConnectionHandler typeref:typename:void file:
+SendDeviceMessage host/frontend/webrtc_operator/client_handler.cpp /^void ClientWSHandler::SendDeviceMessage(const Json::Value& device_message) {$/;" f class:cuttlefish::ClientWSHandler typeref:typename:void
+SendEvent host/libs/audio_connector/server.cpp /^bool AudioClientConnection::SendEvent(\/*TODO*\/) { return false; }$/;" f class:cuttlefish::AudioClientConnection typeref:typename:bool
+SendExitCode host/commands/run_cvd/boot_state_machine.cc /^ void SendExitCode(RunnerExitCodes exit_code, SharedFD fd) {$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:void file:
+SendFileDescriptors common/libs/fs/shared_fd.h /^ ssize_t SendFileDescriptors(const void* buf, size_t len, Args&&... sent_fds) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+SendJson host/frontend/webrtc/lib/streamer.cpp /^void SendJson(WsConnection* ws_conn, const Json::Value& data) {$/;" f namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:void
+SendJsonMsg host/libs/allocd/utils.cpp /^bool SendJsonMsg(SharedFD client_socket, const Json::Value& resp) {$/;" f namespace:cuttlefish typeref:typename:bool
+SendLastFrame host/frontend/webrtc/display_handler.cpp /^void DisplayHandler::SendLastFrame() {$/;" f class:cuttlefish::DisplayHandler typeref:typename:void
+SendMessage common/libs/security/gatekeeper_channel.cpp /^bool GatekeeperChannel::SendMessage($/;" f class:cuttlefish::GatekeeperChannel typeref:typename:bool
+SendMessage common/libs/security/keymaster_channel.cpp /^bool KeymasterChannel::SendMessage($/;" f class:cuttlefish::KeymasterChannel typeref:typename:bool
+SendMessage host/frontend/webrtc/lib/camera_controller.h /^ virtual void SendMessage(const Json::Value& msg) {$/;" f class:cuttlefish::CameraController typeref:typename:void
+SendMessage host/libs/wmediumd_controller/wmediumd_controller.cpp /^bool WmediumdController::SendMessage(const WmediumdMessage& message) {$/;" f class:cuttlefish::WmediumdController typeref:typename:bool
+SendMessageToClient host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::SendMessageToClient(int client_id,$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+SendMsg common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::SendMsg(const struct msghdr* msg, int flags) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+SendNmea host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ Status SendNmea(ServerContext* context, const SendNmeaRequest* request,$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:Status file:
+SendNmea host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^ rpc SendNmea (SendNmeaRequest) returns (SendNmeaReply) {}$/;" r service:gnss_grpc_proxy.GnssGrpcProxy typeref:typename:SendNmeaReply
+SendNmeaReply host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^message SendNmeaReply {$/;" m package:gnss_grpc_proxy
+SendNmeaRequest host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^message SendNmeaRequest {$/;" m package:gnss_grpc_proxy
+SendNoSignal common/libs/utils/tcp_socket.cpp /^ssize_t ClientSocket::SendNoSignal(const Message& message) {$/;" f class:cuttlefish::ClientSocket typeref:typename:ssize_t
+SendNoSignal common/libs/utils/tcp_socket.cpp /^ssize_t ClientSocket::SendNoSignal(const uint8_t* data, std::size_t size) {$/;" f class:cuttlefish::ClientSocket typeref:typename:ssize_t
+SendNoSignal common/libs/utils/tcp_socket.h /^ ssize_t SendNoSignal(const std::uint8_t (&data)[N]) {$/;" f class:cuttlefish::ClientSocket typeref:typename:ssize_t
+SendOver common/libs/confui/protocol_types.cpp /^bool ConfUiAckMessage::SendOver(SharedFD fd) {$/;" f class:cuttlefish::confui::ConfUiAckMessage typeref:typename:bool
+SendOver common/libs/confui/protocol_types.cpp /^bool ConfUiCliResponseMessage::SendOver(SharedFD fd) {$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:bool
+SendOver common/libs/confui/protocol_types.cpp /^bool ConfUiStartMessage::SendOver(SharedFD fd) {$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:bool
+SendOver common/libs/confui/protocol_types.cpp /^bool ConfUiUserSelectionMessage::SendOver(SharedFD fd) {$/;" f class:cuttlefish::confui::ConfUiUserSelectionMessage typeref:typename:bool
+SendOver common/libs/confui/protocol_types.cpp /^bool ConfUiUserTouchMessage::SendOver(SharedFD fd) {$/;" f class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:bool
+SendOver common/libs/confui/protocol_types.h /^ bool SendOver(SharedFD fd) override {$/;" f class:cuttlefish::confui::ConfUiGenericMessage typeref:typename:bool
+SendRemoteCommand host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::SendRemoteCommand(cuttlefish::SharedFD client, std::string& response) {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+SendRequest common/libs/security/gatekeeper_channel.cpp /^bool GatekeeperChannel::SendRequest($/;" f class:cuttlefish::GatekeeperChannel typeref:typename:bool
+SendRequest common/libs/security/keymaster_channel.cpp /^bool KeymasterChannel::SendRequest($/;" f class:cuttlefish::KeymasterChannel typeref:typename:bool
+SendResponse common/libs/confui/protocol.cpp /^bool SendResponse(SharedFD fd, const std::string& session_id,$/;" f namespace:cuttlefish::confui typeref:typename:bool
+SendResponse common/libs/security/gatekeeper_channel.cpp /^bool GatekeeperChannel::SendResponse($/;" f class:cuttlefish::GatekeeperChannel typeref:typename:bool
+SendResponse common/libs/security/keymaster_channel.cpp /^bool KeymasterChannel::SendResponse($/;" f class:cuttlefish::KeymasterChannel typeref:typename:bool
+SendServerConfig host/frontend/webrtc_operator/signal_handler.cpp /^void SignalHandler::SendServerConfig() {$/;" f class:cuttlefish::SignalHandler typeref:typename:void
+SendSmsToRemote host/commands/modem_simulator/sms_service.cpp /^void SmsService::SendSmsToRemote(std::string remote_port, PDUParser& sms_pdu) {$/;" f class:cuttlefish::SmsService typeref:typename:void
+SendStartCmd common/libs/confui/protocol.cpp /^bool SendStartCmd(SharedFD fd, const std::string& session_id,$/;" f namespace:cuttlefish::confui typeref:typename:bool
+SendStatus host/libs/audio_connector/buffers.cpp /^void ShmBuffer::SendStatus(AudioStatus status, uint32_t latency_bytes,$/;" f class:cuttlefish::ShmBuffer typeref:typename:void
+SendStatusCallback host/libs/audio_connector/server.cpp /^std::function<void(AudioStatus, uint32_t, uint32_t)> SendStatusCallback($/;" f namespace:cuttlefish::__anon8078843e0111 typeref:typename:std::function<void (AudioStatus,uint32_t,uint32_t)>
+SendStopCmd common/libs/confui/protocol.cpp /^bool SendStopCmd(SharedFD fd, const std::string& session_id) {$/;" f namespace:cuttlefish::confui typeref:typename:bool
+SendUnsolicitedCommand host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::SendUnsolicitedCommand(std::string& response) {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+SendUnsolicitedCommand host/commands/modem_simulator/modem_service.cpp /^void ModemService::SendUnsolicitedCommand(std::string unsol_command) {$/;" f class:cuttlefish::ModemService typeref:typename:void
+SendUserSelection common/libs/confui/protocol.cpp /^bool SendUserSelection(SharedFD fd, const std::string& session_id,$/;" f namespace:cuttlefish::confui typeref:typename:bool
+SendUserSelection host/libs/confui/host_server.cc /^void HostServer::SendUserSelection(std::unique_ptr<ConfUiMessage>& input) {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+Send_ common/libs/confui/protocol_types.h /^ static bool Send_(SharedFD fd, const ConfUiCmd cmd,$/;" f class:cuttlefish::confui::ConfUiMessage typeref:typename:bool
+SeqNo common/libs/net/netlink_request.cpp /^uint32_t NetlinkRequest::SeqNo() const {$/;" f class:cuttlefish::NetlinkRequest typeref:typename:uint32_t
+Serial host/commands/modem_simulator/thread_looper.h /^ typedef int32_t Serial;$/;" t class:cuttlefish::ThreadLooper typeref:typename:int32_t
+SerializableToKeyBlob host/commands/secure_env/tpm_key_blob_maker.cpp /^static KeymasterKeyBlob SerializableToKeyBlob($/;" f namespace:cuttlefish typeref:typename:KeymasterKeyBlob file:
+Serialize host/commands/secure_env/composite_serialization.cpp /^uint8_t* CompositeSerializable::Serialize($/;" f class:cuttlefish::CompositeSerializable typeref:typename:uint8_t *
+Serialize host/commands/secure_env/encrypted_serializable.cpp /^uint8_t* EncryptedSerializable::Serialize($/;" f class:cuttlefish::EncryptedSerializable typeref:typename:uint8_t *
+Serialize host/commands/secure_env/hmac_serializable.cpp /^uint8_t* HmacSerializable::Serialize(uint8_t* buf, const uint8_t* end) const {$/;" f class:cuttlefish::HmacSerializable typeref:typename:uint8_t *
+Serialize host/commands/secure_env/json_serializable.cpp /^uint8_t* JsonSerializable::Serialize(uint8_t* buf, const uint8_t* end) const {$/;" f class:cuttlefish::JsonSerializable typeref:typename:uint8_t *
+Serialize host/commands/secure_env/tpm_serialize.cpp /^uint8_t* TpmSerializable<T>::Serialize(uint8_t* buf, const uint8_t* end) const {$/;" f class:cuttlefish::TpmSerializable typeref:typename:uint8_t *
+Serialize host/libs/config/adb/config.cpp /^ Json::Value Serialize() const override {$/;" f class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl typeref:typename:Json::Value file:
+Serialize host/libs/config/custom_actions.cpp /^ Json::Value Serialize() const override {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:Json::Value file:
+Serialize host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^std::string WmediumdMessage::Serialize(void) const {$/;" f class:cuttlefish::WmediumdMessage typeref:typename:std::string
+SerializeBody host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^void WmediumdMessageReloadConfig::SerializeBody(std::string& buf) const {$/;" f class:cuttlefish::WmediumdMessageReloadConfig typeref:typename:void
+SerializeBody host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^void WmediumdMessageSetControl::SerializeBody(std::string& buf) const {$/;" f class:cuttlefish::WmediumdMessageSetControl typeref:typename:void
+SerializeBody host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^void WmediumdMessageSetSnr::SerializeBody(std::string& buf) const {$/;" f class:cuttlefish::WmediumdMessageSetSnr typeref:typename:void
+SerializeBody host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ virtual void SerializeBody(std::string&) const {};$/;" f class:cuttlefish::WmediumdMessage typeref:typename:void
+SerializeTpmKeyPrivate host/commands/secure_env/tpm_serialize.h /^using SerializeTpmKeyPrivate = TpmSerializable<TPM2B_PRIVATE>;$/;" t namespace:cuttlefish typeref:typename:TpmSerializable<TPM2B_PRIVATE>
+SerializeTpmKeyPublic host/commands/secure_env/tpm_serialize.h /^using SerializeTpmKeyPublic = TpmSerializable<TPM2B_PUBLIC>;$/;" t namespace:cuttlefish typeref:typename:TpmSerializable<TPM2B_PUBLIC>
+SerializedSend guest/hals/confirmationui/guest_session.h /^ bool SerializedSend(F&& f, cuttlefish::SharedFD fd, Args&&... args) {$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:bool
+SerializedSize host/commands/secure_env/composite_serialization.cpp /^size_t CompositeSerializable::SerializedSize() const {$/;" f class:cuttlefish::CompositeSerializable typeref:typename:size_t
+SerializedSize host/commands/secure_env/encrypted_serializable.cpp /^size_t EncryptedSerializable::SerializedSize() const {$/;" f class:cuttlefish::EncryptedSerializable typeref:typename:size_t
+SerializedSize host/commands/secure_env/hmac_serializable.cpp /^size_t HmacSerializable::SerializedSize() const {$/;" f class:cuttlefish::HmacSerializable typeref:typename:size_t
+SerializedSize host/commands/secure_env/json_serializable.cpp /^size_t JsonSerializable::SerializedSize() const {$/;" f class:cuttlefish::JsonSerializable typeref:typename:size_t
+SerializedSize host/commands/secure_env/tpm_serialize.cpp /^size_t TpmSerializable<T>::SerializedSize() const {$/;" f class:cuttlefish::TpmSerializable typeref:typename:size_t
+Serve host/libs/websocket/websocket_server.cpp /^void WebSocketServer::Serve() {$/;" f class:cuttlefish::WebSocketServer typeref:typename:void
+ServerCallback host/libs/websocket/websocket_server.cpp /^int WebSocketServer::ServerCallback(struct lws* wsi,$/;" f class:cuttlefish::WebSocketServer typeref:typename:int
+ServerConfig host/frontend/webrtc_operator/server_config.cpp /^ServerConfig::ServerConfig(const std::vector<std::string>& stuns)$/;" f class:cuttlefish::ServerConfig
+ServerConfig host/frontend/webrtc_operator/server_config.h /^class ServerConfig {$/;" c namespace:cuttlefish
+ServerFdsFromCmdline host/commands/modem_simulator/main.cpp /^std::vector<cuttlefish::SharedFD> ServerFdsFromCmdline() {$/;" f typeref:typename:std::vector<cuttlefish::SharedFD>
+ServerLoop host/commands/run_cvd/server_loop.h /^class ServerLoop {$/;" c namespace:cuttlefish
+ServerLoop host/libs/wayland/wayland_server.cpp /^void WaylandServer::ServerLoop(int fd) {$/;" f class:wayland::WaylandServer typeref:typename:void
+ServerLoopImpl host/commands/run_cvd/server_loop.cpp /^class ServerLoopImpl : public ServerLoop, public Feature {$/;" c namespace:cuttlefish::__anon527e8bd40111 file:
+ServerShutdown common/libs/utils/vsock_connection.cpp /^void VsockServerConnection::ServerShutdown() {$/;" f class:cuttlefish::VsockServerConnection typeref:typename:void
+ServerSocket common/libs/utils/tcp_socket.cpp /^ServerSocket::ServerSocket(int port)$/;" f class:cuttlefish::ServerSocket
+ServerSocket common/libs/utils/tcp_socket.h /^class ServerSocket {$/;" c namespace:cuttlefish
+Session host/libs/allocd/resource_manager.h /^ explicit Session(uint32_t session_id, uid_t uid)$/;" f class:cuttlefish::Session
+Session host/libs/allocd/resource_manager.h /^class Session {$/;" c namespace:cuttlefish
+Session host/libs/confui/session.cc /^Session::Session(const std::string& session_name,$/;" f class:cuttlefish::confui::Session
+Session host/libs/confui/session.h /^class Session {$/;" c namespace:cuttlefish::confui
+Set common/libs/fs/shared_fd.cpp /^void FileInstance::Set(fd_set* dest, int* max_index) const {$/;" f class:cuttlefish::FileInstance typeref:typename:void
+Set common/libs/fs/shared_select.h /^ void Set(const SharedFD& in) {$/;" f class:cuttlefish::SharedFDSet typeref:typename:void
+Set common/libs/utils/shared_fd_flag.cpp /^static bool Set(const FlagMatch& match, SharedFD& out) {$/;" f namespace:cuttlefish typeref:typename:bool file:
+Set host/libs/confui/host_utils.cc /^void Set(const std::string& name, const std::thread::id tid) {$/;" f namespace:cuttlefish::confui::thread typeref:typename:void
+Set host/libs/confui/host_utils.cc /^void ThreadTracer::Set(const std::string& name, const std::thread::id tid) {$/;" f class:cuttlefish::confui::thread::ThreadTracer typeref:typename:void
+SetAddress common/libs/net/network_interface.h /^ NetworkInterface& SetAddress(const std::string& address) {$/;" f class:cuttlefish::NetworkInterface typeref:typename:NetworkInterface &
+SetBinary host/libs/vm_manager/crosvm_builder.cpp /^void CrosvmBuilder::SetBinary(const std::string& binary) {$/;" f class:cuttlefish::CrosvmBuilder typeref:typename:void
+SetBootPatchlevel host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t SetBootPatchlevel(uint32_t boot_patchlevel) override {$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+SetBootPatchlevel host/commands/secure_env/tpm_key_blob_maker.cpp /^keymaster_error_t TpmKeyBlobMaker::SetBootPatchlevel(uint32_t boot_patchlevel) {$/;" f class:cuttlefish::TpmKeyBlobMaker typeref:typename:keymaster_error_t
+SetBootPatchlevel host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::SetBootPatchlevel($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+SetBroadcastAddress common/libs/net/network_interface.h /^ NetworkInterface& SetBroadcastAddress(const std::string& address) {$/;" f class:cuttlefish::NetworkInterface typeref:typename:NetworkInterface &
+SetCallActive host/commands/modem_simulator/call_service.h /^ bool SetCallActive() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+SetCallBackground host/commands/modem_simulator/call_service.h /^ bool SetCallBackground() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+SetCallback host/libs/screen_connector/screen_connector.h /^ void SetCallback(GenerateProcessedFrameCallback&& frame_callback) {$/;" f class:cuttlefish::ScreenConnector typeref:typename:void
+SetCameraHandler host/frontend/webrtc/connection_observer.cpp /^void CfConnectionObserverFactory::SetCameraHandler($/;" f class:cuttlefish::CfConnectionObserverFactory typeref:typename:void
+SetClientId host/frontend/webrtc_operator/client_handler.cpp /^ void SetClientId(size_t client_id) { client_id_ = client_id; }$/;" f class:cuttlefish::PollConnectionHandler typeref:typename:void file:
+SetControl host/libs/wmediumd_controller/wmediumd_controller.cpp /^bool WmediumdController::SetControl(const uint32_t flags) {$/;" f class:cuttlefish::WmediumdController typeref:typename:bool
+SetDefaultFlagsForCrosvm host/commands/assemble_cvd/flags.cc /^void SetDefaultFlagsForCrosvm() {$/;" f namespace:cuttlefish typeref:typename:void
+SetDefaultFlagsForQemu host/commands/assemble_cvd/flags.cc /^void SetDefaultFlagsForQemu(Arch target_arch) {$/;" f namespace:cuttlefish typeref:typename:void
+SetDeviceContext host/libs/confui/host_renderer.cc /^void ConfUiRenderer::SetDeviceContext(const unsigned long long w,$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:void
+SetDeviceHandler host/frontend/webrtc_operator/client_handler.cpp /^ void SetDeviceHandler(std::weak_ptr<DeviceHandler> device_handler) {$/;" f class:cuttlefish::PollConnectionHandler typeref:typename:void file:
+SetDisconnectCallback common/libs/utils/vsock_connection.cpp /^void VsockConnection::SetDisconnectCallback(std::function<void()> callback) {$/;" f class:cuttlefish::VsockConnection typeref:typename:void
+SetDisplayHandler host/frontend/webrtc/connection_observer.cpp /^void CfConnectionObserverFactory::SetDisplayHandler($/;" f class:cuttlefish::CfConnectionObserverFactory typeref:typename:void
+SetEnvironment common/libs/utils/subprocess.h /^ void SetEnvironment(const std::vector<std::string>& env) {$/;" f class:cuttlefish::Command typeref:typename:void
+SetExecutable common/libs/utils/subprocess.h /^ void SetExecutable(const std::string& executable) {$/;" f class:cuttlefish::Command typeref:typename:void
+SetFrameCallback host/libs/screen_connector/wayland_screen_connector.cpp /^void WaylandScreenConnector::SetFrameCallback($/;" f class:cuttlefish::WaylandScreenConnector typeref:typename:void
+SetFrameCallback host/libs/wayland/wayland_server.cpp /^void WaylandServer::SetFrameCallback(Surfaces::FrameCallback callback) {$/;" f class:wayland::WaylandServer typeref:typename:void
+SetFrameCallback host/libs/wayland/wayland_surfaces.cpp /^void Surfaces::SetFrameCallback(FrameCallback callback) {$/;" f class:wayland::Surfaces typeref:typename:void
+SetHardwareSpec host/frontend/webrtc/lib/streamer.cpp /^void Streamer::SetHardwareSpec(std::string key, std::string value) {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+SetHardwareSpec host/frontend/webrtc/lib/streamer.h /^ void SetHardwareSpec(std::string key, V value) {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+SetHasIpv4 host/libs/allocd/resource.h /^ void SetHasIpv4(bool ipv4) { has_ipv4_ = ipv4; }$/;" f class:cuttlefish::EthernetIface typeref:typename:void
+SetHasIpv6 host/libs/allocd/resource.h /^ void SetHasIpv6(bool ipv6) { has_ipv6_ = ipv6; }$/;" f class:cuttlefish::EthernetIface typeref:typename:void
+SetMessageSender host/frontend/webrtc/lib/camera_controller.h /^ virtual void SetMessageSender($/;" f class:cuttlefish::CameraController typeref:typename:void
+SetMicrophoneMute host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetMicrophoneMute(bool enable) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetMicrophoneVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetMicrophoneVolume(uint32_t volume) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetMode host/libs/confui/host_mode_ctrl.h /^ void SetMode(const ModeType mode) {$/;" f class:cuttlefish::HostModeCtrl typeref:typename:void
+SetMode host/libs/screen_connector/screen_connector_ctrl.h /^ void SetMode(const ModeType mode) {$/;" f class:cuttlefish::ScreenConnectorCtrl typeref:typename:void
+SetModes host/libs/config/adb/data.cpp /^ bool SetModes(const std::set<AdbMode>& modes) override {$/;" f class:cuttlefish::AdbConfigImpl typeref:typename:bool file:
+SetModes host/libs/config/adb/data.cpp /^ bool SetModes(std::set<AdbMode>&& modes) override {$/;" f class:cuttlefish::AdbConfigImpl typeref:typename:bool file:
+SetName common/libs/net/network_interface.h /^ NetworkInterface& SetName(const std::string& new_name) {$/;" f class:cuttlefish::NetworkInterface typeref:typename:NetworkInterface &
+SetOperational common/libs/net/network_interface.h /^ NetworkInterface& SetOperational(bool is_operational) {$/;" f class:cuttlefish::NetworkInterface typeref:typename:NetworkInterface &
+SetPath host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::SetPath(const std::string& key,$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+SetPeerConnection host/frontend/webrtc/lib/client_handler.cpp /^bool ClientHandler::SetPeerConnection($/;" f class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:bool
+SetPlayoutDevice host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetPlayoutDevice(WindowsDeviceType device) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetPlayoutDevice host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetPlayoutDevice(uint16_t index) { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetPrefixLength common/libs/net/network_interface.h /^ NetworkInterface& SetPrefixLength(int len) {$/;" f class:cuttlefish::NetworkInterface typeref:typename:NetworkInterface &
+SetRecordingDevice host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetRecordingDevice(WindowsDeviceType device) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetRecordingDevice host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetRecordingDevice(uint16_t index) { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetRegion host/libs/wayland/wayland_surface.cpp /^void Surface::SetRegion(const Region& region) {$/;" f class:wayland::Surface typeref:typename:void
+SetRemoteClient host/commands/modem_simulator/channel_monitor.cpp /^void ChannelMonitor::SetRemoteClient(cuttlefish::SharedFD client, bool is_accepted) {$/;" f class:cuttlefish::ChannelMonitor typeref:typename:void
+SetRemoteClient host/commands/modem_simulator/modem_simulator.h /^ void SetRemoteClient(cuttlefish::SharedFD client, bool is_accepted) {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+SetRunConnector host/libs/config/adb/data.cpp /^ bool SetRunConnector(bool run) override {$/;" f class:cuttlefish::AdbConfigImpl typeref:typename:bool file:
+SetSessionId common/libs/confui/protocol_types.h /^ void SetSessionId(const std::string session_id) { session_id_ = session_id; }$/;" f class:cuttlefish::confui::ConfUiMessage typeref:typename:void
+SetSignalStrengthValue host/commands/modem_simulator/network_service.cpp /^void NetworkService::SetSignalStrengthValue(int& value,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+SetSnr host/libs/wmediumd_controller/wmediumd_controller.cpp /^bool WmediumdController::SetSnr(const std::string& node1,$/;" f class:cuttlefish::WmediumdController typeref:typename:bool
+SetSockOpt common/libs/fs/shared_fd.cpp /^int FileInstance::SetSockOpt(int level, int optname, const void* optval,$/;" f class:cuttlefish::FileInstance typeref:typename:int
+SetSocketLocation host/libs/allocd/resource_manager.cpp /^void ResourceManager::SetSocketLocation(const std::string& sock_name) {$/;" f class:cuttlefish::ResourceManager typeref:typename:void
+SetSpeakerMute host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetSpeakerMute(bool enable) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetSpeakerVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetSpeakerVolume(uint32_t volume) { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetStereoPlayout host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetStereoPlayout(bool enable) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetStereoRecording host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SetStereoRecording(bool enable) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SetStopper common/libs/utils/subprocess.h /^ void SetStopper(SubprocessStopper stopper) { subprocess_stopper_ = stopper; }$/;" f class:cuttlefish::Command typeref:typename:void
+SetStreamParameters host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::SetStreamParameters(StreamSetParamsCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+SetSuperPartitionComponents host/commands/assemble_cvd/misc_info.cc /^bool SetSuperPartitionComponents(const std::vector<std::string>& components,$/;" f namespace:cuttlefish typeref:typename:bool
+SetSystemVersion host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t SetSystemVersion(uint32_t os_version,$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+SetSystemVersion host/commands/secure_env/tpm_key_blob_maker.cpp /^keymaster_error_t TpmKeyBlobMaker::SetSystemVersion($/;" f class:cuttlefish::TpmKeyBlobMaker typeref:typename:keymaster_error_t
+SetSystemVersion host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::SetSystemVersion($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+SetTerminalRaw common/libs/fs/shared_fd.cpp /^int FileInstance::SetTerminalRaw() {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+SetTerminalRaw guest/hals/bt/remote/remote_bluetooth.cpp /^int SetTerminalRaw(int fd) {$/;" f namespace:__anonb7fa39a50111 typeref:typename:int
+SetText host/libs/confui/host_renderer.h /^ auto SetText(const std::string& text) {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:auto
+SetTimeZone host/commands/modem_simulator/misc_service.cpp /^void MiscService::SetTimeZone(std::string timezone) {$/;" f class:cuttlefish::MiscService typeref:typename:void
+SetTimeZone host/commands/modem_simulator/modem_simulator.cpp /^void ModemSimulator::SetTimeZone(std::string timezone) {$/;" f class:cuttlefish::ModemSimulator typeref:typename:void
+SetUp guest/commands/vsoc_input_service/virtual_device_base.cpp /^bool VirtualDeviceBase::SetUp() {$/;" f class:VirtualDeviceBase typeref:typename:bool
+SetUpDevices guest/commands/vsoc_input_service/vsoc_input_service.cpp /^bool VSoCInputService::SetUpDevices() {$/;" f class:VSoCInputService typeref:typename:bool
+SetUpTestSuite host/commands/modem_simulator/unittest/service_test.cpp /^ static void SetUpTestSuite() {$/;" f class:ModemServiceTest typeref:typename:void file:
+SetUseEbtablesLegacy host/libs/allocd/resource.h /^ void SetUseEbtablesLegacy(bool use_legacy) {$/;" f class:cuttlefish::EthernetIface typeref:typename:void
+SetUseEbtablesLegacy host/libs/allocd/resource_manager.cpp /^void ResourceManager::SetUseEbtablesLegacy(bool use_legacy) {$/;" f class:cuttlefish::ResourceManager typeref:typename:void
+SetUseIpv4Bridge host/libs/allocd/resource_manager.h /^ void SetUseIpv4Bridge(bool ipv4) { use_ipv4_bridge_ = ipv4; }$/;" f struct:cuttlefish::ResourceManager typeref:typename:void
+SetUseIpv6Bridge host/libs/allocd/resource_manager.h /^ void SetUseIpv6Bridge(bool ipv6) { use_ipv6_bridge_ = ipv6; }$/;" f struct:cuttlefish::ResourceManager typeref:typename:void
+SetVendorPatchlevel host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t SetVendorPatchlevel(uint32_t vendor_patchlevel) override {$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+SetVendorPatchlevel host/commands/secure_env/tpm_key_blob_maker.cpp /^keymaster_error_t TpmKeyBlobMaker::SetVendorPatchlevel(uint32_t patchlevel) {$/;" f class:cuttlefish::TpmKeyBlobMaker typeref:typename:keymaster_error_t
+SetVendorPatchlevel host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::SetVendorPatchlevel($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+SetVideoTrack host/frontend/webrtc/lib/client_handler.cpp /^ void SetVideoTrack(webrtc::VideoTrackInterface *track) {$/;" f class:cuttlefish::webrtc_streaming::ClientVideoTrackImpl typeref:typename:void file:
+SetVirtioGpuScanoutId host/libs/wayland/wayland_surface.cpp /^void Surface::SetVirtioGpuScanoutId(uint32_t scanout_id) {$/;" f class:wayland::Surface typeref:typename:void
+SetVolume host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::SetVolume(double volume) {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+Setter common/libs/utils/flag_parser.cpp /^Flag Flag::Setter(std::function<bool(const FlagMatch&)> fn) && {$/;" f class:cuttlefish::Flag typeref:typename:Flag
+Setter common/libs/utils/flag_parser.cpp /^Flag& Flag::Setter(std::function<bool(const FlagMatch&)> fn) & {$/;" f class:cuttlefish::Flag typeref:typename:Flag &
+Settings guest/hals/camera/vsock_camera_device_3_4.h /^ using Settings = struct {$/;" t class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice
+Setup host/commands/assemble_cvd/disk_flags.cc /^ bool Setup() override {$/;" f class:cuttlefish::BootImageRepacker typeref:typename:bool file:
+Setup host/commands/assemble_cvd/disk_flags.cc /^ bool Setup() override {$/;" f class:cuttlefish::InitializeMetadataImage typeref:typename:bool file:
+Setup host/commands/assemble_cvd/disk_flags.cc /^ bool Setup() {$/;" f class:cuttlefish::InitializeAccessKregistryImage typeref:typename:bool file:
+Setup host/commands/run_cvd/boot_state_machine.cc /^ bool Setup() override {$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:bool file:
+Setup host/commands/run_cvd/boot_state_machine.cc /^ bool Setup() override {$/;" f class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override { return true; }$/;" f class:cuttlefish::MetricsService typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override { return true; }$/;" f class:cuttlefish::OpenWrt typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override { return true; }$/;" f class:cuttlefish::RootCanal typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override { return true; }$/;" f class:cuttlefish::VehicleHalServer typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override { return true; }$/;" f class:cuttlefish::VmmCommands typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::BluetoothConnector typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::ConfigServer typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::GnssGrpcProxyServer typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::KernelLogMonitor typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::LogcatReceiver typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::SecureEnvironment typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::TombstoneReceiver typeref:typename:bool file:
+Setup host/commands/run_cvd/launch.cc /^ bool Setup() override {$/;" f class:cuttlefish::WmediumdServer typeref:typename:bool file:
+Setup host/commands/run_cvd/launch_modem.cpp /^ bool Setup() override {$/;" f class:cuttlefish::ModemSimulator typeref:typename:bool file:
+Setup host/commands/run_cvd/launch_streamer.cpp /^ bool Setup() override {$/;" f class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:bool file:
+Setup host/commands/run_cvd/launch_streamer.cpp /^ bool Setup() override {$/;" f class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:bool file:
+Setup host/commands/run_cvd/main.cc /^ bool Setup() override {$/;" f class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:bool file:
+Setup host/commands/run_cvd/server_loop.cpp /^ bool Setup() {$/;" f class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:bool file:
+Setup host/commands/run_cvd/validate.cpp /^ bool Setup() override {$/;" f class:cuttlefish::__anon8d12954e0111::ValidateHostConfigurationFeature typeref:typename:bool file:
+Setup host/commands/run_cvd/validate.cpp /^ bool Setup() override {$/;" f class:cuttlefish::__anon8d12954e0111::ValidateTapDevices typeref:typename:bool file:
+Setup host/libs/config/adb/launch.cpp /^ bool Setup() override { return true; }$/;" f class:cuttlefish::__anon7ea6a0320111::AdbConnector typeref:typename:bool file:
+Setup host/libs/config/adb/launch.cpp /^ bool Setup() override {$/;" f class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:bool file:
+Setup host/libs/config/data_image.cpp /^ bool Setup() override {$/;" f class:cuttlefish::InitializeDataImageImpl typeref:typename:bool file:
+Setup host/libs/config/data_image.cpp /^ bool Setup() override {$/;" f class:cuttlefish::InitializeEspImageImpl typeref:typename:bool file:
+Setup host/libs/config/data_image.cpp /^ bool Setup() override {$/;" f class:cuttlefish::InitializeMiscImageImpl typeref:typename:bool file:
+SetupAdbSocket host/frontend/webrtc/adb_handler.cpp /^SharedFD SetupAdbSocket(const std::string &adb_host_and_port) {$/;" f namespace:cuttlefish::webrtc_streaming::__anonbb773a0c0111 typeref:typename:SharedFD
+SetupBridgeGateway host/libs/allocd/alloc_utils.cpp /^bool SetupBridgeGateway(const std::string& bridge_name,$/;" f namespace:cuttlefish typeref:typename:bool
+SetupCameraForClient host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Impl::SetupCameraForClient(int client_id) {$/;" f class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:void
+SetupDependency host/commands/modem_simulator/call_service.cpp /^void CallService::SetupDependency(SimService* sim, NetworkService* net) {$/;" f class:cuttlefish::CallService typeref:typename:void
+SetupDependency host/commands/modem_simulator/network_service.cpp /^void NetworkService::SetupDependency(MiscService* misc, SimService* sim,$/;" f class:cuttlefish::NetworkService typeref:typename:void
+SetupDependency host/commands/modem_simulator/sim_service.cpp /^void SimService::SetupDependency(NetworkService* net) {$/;" f class:cuttlefish::SimService typeref:typename:void
+SetupDependency host/commands/modem_simulator/sms_service.cpp /^void SmsService::SetupDependency(SimService* sim) { sim_service_ = sim; }$/;" f class:cuttlefish::SmsService typeref:typename:void
+SetupDependency host/commands/modem_simulator/stk_service.cpp /^void StkService::SetupDependency(SimService* sim) { sim_service_ = sim; }$/;" f class:cuttlefish::StkService typeref:typename:void
+SetupDone guest/hals/confirmationui/guest_session.h /^ SetupDone = 2,$/;" e enum:android::hardware::confirmationui::V1_0::implementation::GuestSession::ListenerState
+SeverityTarget common/libs/utils/tee_logging.h /^struct SeverityTarget {$/;" s namespace:cuttlefish
+SeverityTargetsForFiles common/libs/utils/tee_logging.cpp /^static std::vector<SeverityTarget> SeverityTargetsForFiles($/;" f namespace:cuttlefish typeref:typename:std::vector<SeverityTarget> file:
+SharedFD common/libs/fs/shared_fd.h /^ SharedFD(const std::shared_ptr<FileInstance>& in) : value_(in) {}$/;" f class:cuttlefish::SharedFD
+SharedFD common/libs/fs/shared_fd.h /^class SharedFD {$/;" c namespace:cuttlefish
+SharedFD common/libs/fs/shared_fd.h /^inline SharedFD::SharedFD() : value_(FileInstance::ClosedInstance()) {}$/;" f class:cuttlefish::SharedFD
+SharedFDFlag common/libs/utils/shared_fd_flag.cpp /^Flag SharedFDFlag(SharedFD& out) {$/;" f namespace:cuttlefish typeref:typename:Flag
+SharedFDFlag common/libs/utils/shared_fd_flag.cpp /^Flag SharedFDFlag(const std::string& name, SharedFD& out) {$/;" f namespace:cuttlefish typeref:typename:Flag
+SharedFDIstream common/libs/fs/shared_fd_stream.cpp /^SharedFDIstream::SharedFDIstream(SharedFD shared_fd)$/;" f class:cuttlefish::SharedFDIstream
+SharedFDIstream common/libs/fs/shared_fd_stream.h /^class SharedFDIstream : public std::istream {$/;" c namespace:cuttlefish
+SharedFDOstream common/libs/fs/shared_fd_stream.cpp /^SharedFDOstream::SharedFDOstream(SharedFD shared_fd)$/;" f class:cuttlefish::SharedFDOstream
+SharedFDOstream common/libs/fs/shared_fd_stream.h /^class SharedFDOstream : public std::ostream {$/;" c namespace:cuttlefish
+SharedFDSet common/libs/fs/shared_select.h /^class SharedFDSet {$/;" c namespace:cuttlefish
+SharedFDStreambuf common/libs/fs/shared_fd_stream.cpp /^SharedFDStreambuf::SharedFDStreambuf(SharedFD shared_fd)$/;" f class:cuttlefish::SharedFDStreambuf
+SharedFDStreambuf common/libs/fs/shared_fd_stream.h /^class SharedFDStreambuf : public std::streambuf {$/;" c namespace:cuttlefish
+ShmBuffer host/libs/audio_connector/buffers.cpp /^ShmBuffer::ShmBuffer(ShmBuffer&& other)$/;" f class:cuttlefish::ShmBuffer
+ShmBuffer host/libs/audio_connector/buffers.h /^ ShmBuffer(const virtio_snd_pcm_xfer& header, uint32_t len,$/;" f class:cuttlefish::ShmBuffer
+ShmBuffer host/libs/audio_connector/buffers.h /^class ShmBuffer {$/;" c namespace:cuttlefish
+ShouldCreateCompositeDisk host/commands/assemble_cvd/disk_flags.cc /^bool ShouldCreateCompositeDisk(const std::string& composite_disk_path,$/;" f namespace:cuttlefish typeref:typename:bool
+ShouldCreateOsCompositeDisk host/commands/assemble_cvd/disk_flags.cc /^bool ShouldCreateOsCompositeDisk(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish typeref:typename:bool
+ShouldEnableAcceleratedRendering host/libs/graphics_detector/graphics_detector.cpp /^bool ShouldEnableAcceleratedRendering($/;" f namespace:cuttlefish typeref:typename:bool
+ShowNewDeviceList host/frontend/webrtc_operator/assets/js/index.js /^ #ShowNewDeviceList(device_ids) {$/;" m class:DeviceListApp
+Shutdown common/libs/fs/shared_fd.cpp /^int FileInstance::Shutdown(int how) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+Shutdown host/libs/allocd/request.h /^ Shutdown, \/\/ request allocd to shutdown and clean up all resources$/;" e enum:cuttlefish::RequestType
+ShutdownIface host/libs/allocd/alloc_utils.cpp /^bool ShutdownIface(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+SignalHandler host/frontend/webrtc_operator/signal_handler.cpp /^SignalHandler::SignalHandler(struct lws* wsi, DeviceRegistry* registry,$/;" f class:cuttlefish::SignalHandler
+SignalHandler host/frontend/webrtc_operator/signal_handler.h /^class SignalHandler : public WebSocketHandler {$/;" c namespace:cuttlefish
+SignalMeasurementType guest/hals/ril/reference-libril/ril.h /^} SignalMeasurementType;$/;" t typeref:enum:__anon0bfbaecf5403
+SignalStrength host/commands/modem_simulator/network_service.h /^ SignalStrength():$/;" f struct:cuttlefish::NetworkService::SignalStrength
+SignalStrength host/commands/modem_simulator/network_service.h /^ struct SignalStrength {$/;" s class:cuttlefish::NetworkService
+SigningKey host/commands/secure_env/primary_key_builder.cpp /^void PrimaryKeyBuilder::SigningKey() {$/;" f class:cuttlefish::PrimaryKeyBuilder typeref:typename:void
+SigningKeyCreator host/commands/secure_env/primary_key_builder.cpp /^SigningKeyCreator(const std::string& unique) {$/;" f namespace:cuttlefish typeref:typename:std::function<TpmObjectSlot (TpmResourceManager &)>
+SimFileSystem host/commands/modem_simulator/sim_service.h /^ struct SimFileSystem {$/;" s class:cuttlefish::SimService
+SimService host/commands/modem_simulator/sim_service.cpp /^SimService::SimService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::SimService
+SimService host/commands/modem_simulator/sim_service.h /^class SimService : public ModemService, public std::enable_shared_from_this<SimService> {$/;" c namespace:cuttlefish
+SimStatus host/commands/modem_simulator/sim_service.h /^ enum SimStatus {$/;" g class:cuttlefish::SimService
+SimulatePendingCallsAnswered host/commands/modem_simulator/call_service.cpp /^void CallService::SimulatePendingCallsAnswered() {$/;" f class:cuttlefish::CallService typeref:typename:void
+Size host/commands/fetcher/build_api.h /^ size_t Size() const { return size; }$/;" f class:cuttlefish::Artifact typeref:typename:size_t
+Size host/libs/confui/host_renderer.h /^ auto Size() const { return teeui_frame_.size(); }$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:auto
+Size host/libs/screen_connector/screen_connector_queue.h /^ auto Size() const {$/;" f class:cuttlefish::ScreenConnectorQueue typeref:typename:auto
+SkipComma host/commands/modem_simulator/command_parser.h /^inline void CommandParser::SkipComma() {$/;" f class:cuttlefish::CommandParser typeref:typename:void
+SkipPrefix host/commands/modem_simulator/command_parser.h /^inline void CommandParser::SkipPrefix() {$/;" f class:cuttlefish::CommandParser typeref:typename:void
+SkipPrefixAT host/commands/modem_simulator/command_parser.h /^inline void CommandParser::SkipPrefixAT() {$/;" f class:cuttlefish::CommandParser typeref:typename:void
+SkipWhiteSpace host/commands/modem_simulator/command_parser.h /^inline void CommandParser::SkipWhiteSpace() {$/;" f class:cuttlefish::CommandParser typeref:typename:void
+Slack shared/config/task_profiles.json /^ "Slack": "40000000"$/;" s object:Profiles.24.Actions.0.Params
+Slack shared/config/task_profiles.json /^ "Slack": "50000"$/;" s object:Profiles.25.Actions.0.Params
+SleepForever common/frontend/socket_vsock_proxy/main.cpp /^[[noreturn]] static void SleepForever() {$/;" f namespace:__anon913036200111 typeref:typename:void file:
+SleepForever host/frontend/adb_connector/main.cpp /^[[noreturn]] void SleepForever() {$/;" f namespace:__anona4a84cd70111 typeref:typename:void
+SmsMessage host/commands/modem_simulator/sms_service.h /^ struct SmsMessage {$/;" s class:cuttlefish::SmsService
+SmsService host/commands/modem_simulator/sms_service.cpp /^SmsService::SmsService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::SmsService
+SmsService host/commands/modem_simulator/sms_service.h /^class SmsService : public ModemService , public std::enable_shared_from_this<SmsService> {$/;" c namespace:cuttlefish
+SmsServiceCenterAddress host/commands/modem_simulator/sms_service.h /^ struct SmsServiceCenterAddress {$/;" s class:cuttlefish::SmsService
+SmsStatus host/commands/modem_simulator/sms_service.h /^ enum SmsStatus { kUnread = 0, kRead = 1, kUnsent = 2, kSent = 3 };$/;" g struct:cuttlefish::SmsService::SmsMessage
+Socket common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::Socket(int domain, int socket_type, int protocol) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+SocketExists guest/hals/ril/reference-libril/RilSapSocket.cpp /^bool RilSapSocket::SocketExists(const char *socketName) {$/;" f class:RilSapSocket typeref:typename:bool
+SocketListenParam guest/hals/ril/reference-libril/ril_ex.h /^typedef struct SocketListenParam {$/;" s
+SocketListenParam guest/hals/ril/reference-libril/ril_ex.h /^} SocketListenParam;$/;" t typeref:struct:SocketListenParam
+SocketLocalClient common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::SocketLocalClient(const std::string& name, bool abstract,$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+SocketLocalClient common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::SocketLocalClient(int port, int type) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+SocketLocalServer common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::SocketLocalServer(const std::string& name, bool abstract,$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+SocketLocalServer common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::SocketLocalServer(int port, int type) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+SocketPair common/libs/fs/shared_fd.cpp /^bool SharedFD::SocketPair(int domain, int type, int protocol,$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+SocketReceiver common/frontend/socket_vsock_proxy/main.cpp /^ explicit SocketReceiver(cuttlefish::SharedFD socket) : socket_{socket} {}$/;" f class:__anon913036200111::SocketReceiver file:
+SocketReceiver common/frontend/socket_vsock_proxy/main.cpp /^class SocketReceiver {$/;" c namespace:__anon913036200111 file:
+SocketSender common/frontend/socket_vsock_proxy/main.cpp /^ explicit SocketSender(cuttlefish::SharedFD socket) : socket_{socket} {}$/;" f class:__anon913036200111::SocketSender file:
+SocketSender common/frontend/socket_vsock_proxy/main.cpp /^class SocketSender {$/;" c namespace:__anon913036200111 file:
+SocketToVsock common/frontend/socket_vsock_proxy/main.cpp /^void SocketToVsock(SocketReceiver socket_receiver,$/;" f namespace:__anon913036200111 typeref:typename:void
+SocketVsockProxy host/libs/config/adb/launch.cpp /^class SocketVsockProxy : public CommandSource {$/;" c namespace:cuttlefish::__anon7ea6a0320111 file:
+SocketVsockProxyBinary host/libs/config/known_paths.cpp /^std::string SocketVsockProxyBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+SocketWakeType guest/hals/ril/reference-libril/ril_ex.h /^enum SocketWakeType {DONT_WAKE, WAKE_PARTIAL};$/;" g
+SoftGateKeeper host/commands/secure_env/soft_gatekeeper.h /^ SoftGateKeeper() {$/;" f class:gatekeeper::SoftGateKeeper
+SoftGateKeeper host/commands/secure_env/soft_gatekeeper.h /^class SoftGateKeeper : public GateKeeper {$/;" c namespace:gatekeeper
+SourceEnumToString host/libs/config/fetcher_config.cpp /^std::string SourceEnumToString(const FileSource& source) {$/;" f namespace:cuttlefish::__anonf7286d770111 typeref:typename:std::string
+SourceStringToEnum host/libs/config/fetcher_config.cpp /^FileSource SourceStringToEnum(std::string source) {$/;" f namespace:cuttlefish::__anonf7286d770111 typeref:typename:FileSource
+SparseFileSizes common/libs/utils/files.cpp /^FileSizes SparseFileSizes(const std::string& path) {$/;" f namespace:cuttlefish typeref:typename:FileSizes
+SpeakerIsInitialized host/frontend/webrtc/lib/audio_device.cpp /^bool CfAudioDeviceModule::SpeakerIsInitialized() const { return false; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+SpeakerMute host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SpeakerMute(bool* enabled) const { return -1; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SpeakerMuteIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SpeakerMuteIsAvailable(bool* available) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SpeakerVolume host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SpeakerVolume(uint32_t* volume) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SpeakerVolumeIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::SpeakerVolumeIsAvailable(bool* available) {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+SplitByLines common/libs/utils/tee_logging.cpp /^static void SplitByLines(const char* msg, const F& log_function, Args&&... args) {$/;" f namespace:cuttlefish typeref:typename:void file:
+SplitEnforcedProperties host/commands/secure_env/tpm_key_blob_maker.cpp /^static keymaster_error_t SplitEnforcedProperties($/;" f namespace:cuttlefish typeref:typename:keymaster_error_t file:
+SplitString host/frontend/webrtc_operator/utils.cpp /^std::vector<std::string> SplitString($/;" f typeref:typename:std::vector<std::string>
+SplitString host/frontend/webrtc_operator/utils.cpp /^std::vector<std::string> SplitString(const std::string &s, char c) {$/;" f typeref:typename:std::vector<std::string>
+Start common/libs/utils/subprocess.cpp /^Subprocess Command::Start(SubprocessOptions options) const {$/;" f class:cuttlefish::Command typeref:typename:Subprocess
+Start host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::Start() {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+Start host/frontend/webrtc/lib/ws_connection.cpp /^void WsConnectionContextImpl::Start() {$/;" f class:WsConnectionContextImpl typeref:typename:void
+Start host/libs/confui/host_server.cc /^void HostServer::Start() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+StartAndMonitorProcesses host/commands/run_cvd/process_monitor.cc /^bool ProcessMonitor::StartAndMonitorProcesses() {$/;" f class:cuttlefish::ProcessMonitor typeref:typename:bool
+StartAssembler host/commands/start/main.cc /^cuttlefish::Subprocess StartAssembler(cuttlefish::SharedFD assembler_stdin,$/;" f namespace:__anon8e1e78490111 typeref:typename:cuttlefish::Subprocess
+StartCommands host/libs/vm_manager/crosvm_manager.cpp /^std::vector<Command> CrosvmManager::StartCommands($/;" f class:cuttlefish::vm_manager::CrosvmManager typeref:typename:std::vector<Command>
+StartCommands host/libs/vm_manager/qemu_manager.cpp /^std::vector<Command> QemuManager::StartCommands($/;" f class:cuttlefish::vm_manager::QemuManager typeref:typename:std::vector<Command>
+StartDnsmasq host/libs/allocd/alloc_utils.cpp /^bool StartDnsmasq(const std::string& bridge_name, const std::string& gateway,$/;" f namespace:cuttlefish typeref:typename:bool
+StartKernelEventMonitor host/commands/secure_env/secure_env.cpp /^std::thread StartKernelEventMonitor(SharedFD kernel_events_fd) {$/;" f namespace:cuttlefish::__anon0a6d9b510111 typeref:typename:std::thread
+StartPlayout host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StartPlayout() {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StartReadGnssRawMeasurementFileThread host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void StartReadGnssRawMeasurementFileThread() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+StartReadLoop host/frontend/webrtc/lib/camera_streamer.cpp /^void CameraStreamer::StartReadLoop() {$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:void
+StartReadNmeaFileThread host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void StartReadNmeaFileThread() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+StartRecording host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StartRecording() {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StartRunner host/commands/start/main.cc /^cuttlefish::Subprocess StartRunner(cuttlefish::SharedFD runner_stdin,$/;" f namespace:__anon8e1e78490111 typeref:typename:cuttlefish::Subprocess
+StartServer host/commands/console_forwarder/main.cpp /^ [[noreturn]] void StartServer() {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:void file:
+StartServer host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void StartServer() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+StartStream host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::StartStream(StreamControlCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+Started common/libs/utils/subprocess.h /^ bool Started() const { return started_; }$/;" f class:cuttlefish::Subprocess typeref:typename:bool
+Starting guest/hals/confirmationui/guest_session.h /^ Starting = 1,$/;" e enum:android::hardware::confirmationui::V1_0::implementation::GuestSession::ListenerState
+StartsWith host/frontend/webrtc_operator/utils.cpp /^bool StartsWith(const std::string &s, const std::string &prefix) {$/;" f typeref:typename:bool
+State host/frontend/webrtc/lib/client_handler.h /^ enum class State {$/;" g class:cuttlefish::webrtc_streaming::ClientHandler
+State host/libs/wayland/wayland_surface.h /^ struct State {$/;" s class:wayland::Surface
+StaticResource host/libs/allocd/resource.h /^ StaticResource(const std::string& name, uid_t uid, ResourceType ty,$/;" f class:cuttlefish::StaticResource
+StaticResource host/libs/allocd/resource.h /^class StaticResource {$/;" c namespace:cuttlefish
+Status host/libs/audio_connector/buffers.h /^enum class Status : uint32_t {$/;" g namespace:cuttlefish typeref:typename:uint32_t
+Status host/libs/config/feature.h /^ enum class Status { UNVISITED, VISITING, VISITED };$/;" g function:cuttlefish::FeatureSuperclass::TopologicalVisit
+StatusIsTerminal host/commands/fetcher/build_api.cc /^bool StatusIsTerminal(const std::string& status) {$/;" f namespace:cuttlefish::__anon948178400111 typeref:typename:bool
+StatusToStr host/libs/allocd/utils.cpp /^std::string StatusToStr(RequestStatus st) {$/;" f namespace:cuttlefish typeref:typename:std::string
+StdIOChannel common/libs/utils/subprocess.h /^ enum class StdIOChannel {$/;" g class:cuttlefish::Subprocess
+StderrOutputGenerator common/libs/utils/tee_logging.cpp /^static std::string StderrOutputGenerator(const struct tm& now, int pid, uint64_t tid,$/;" f namespace:cuttlefish typeref:typename:std::string file:
+StereoPlayout host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StereoPlayout(bool* enabled) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StereoPlayoutIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StereoPlayoutIsAvailable(bool* available) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StereoRecording host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StereoRecording(bool* enabled) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StereoRecordingIsAvailable host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StereoRecordingIsAvailable(bool* available) const {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StkCmdType guest/hals/ril/reference-ril/reference-ril.c /^} StkCmdType;$/;" t typeref:enum:__anon70d7df6f0503 file:
+StkService host/commands/modem_simulator/stk_service.cpp /^StkService::StkService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::StkService
+StkService host/commands/modem_simulator/stk_service.h /^class StkService : public ModemService, public std::enable_shared_from_this<StkService> {$/;" c namespace:cuttlefish
+StkUnsolEvent guest/hals/ril/reference-ril/reference-ril.c /^} StkUnsolEvent;$/;" t typeref:enum:__anon70d7df6f0403 file:
+Stop common/libs/utils/subprocess.h /^ StopperResult Stop() { return stopper_(this); }$/;" f class:cuttlefish::Subprocess typeref:typename:StopperResult
+Stop host/commands/modem_simulator/thread_looper.cpp /^void ThreadLooper::Stop() {$/;" f class:cuttlefish::ThreadLooper typeref:typename:void
+Stop host/frontend/webrtc/lib/local_recorder.cpp /^void LocalRecorder::Display::Stop() {$/;" f class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:void
+Stop host/frontend/webrtc/lib/local_recorder.cpp /^void LocalRecorder::Stop() {$/;" f class:cuttlefish::webrtc_streaming::LocalRecorder typeref:typename:void
+Stop host/libs/vm_manager/qemu_manager.cpp /^bool Stop() {$/;" f namespace:cuttlefish::vm_manager::__anonb2b4da3a0111 typeref:typename:bool
+StopCvdMain host/commands/stop/main.cc /^int StopCvdMain(int argc, char** argv) {$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:int
+StopDnsmasq host/libs/allocd/alloc_utils.cpp /^bool StopDnsmasq(const std::string& name) {$/;" f namespace:cuttlefish typeref:typename:bool
+StopInstance host/commands/stop/main.cc /^int StopInstance(const CuttlefishConfig& config,$/;" f namespace:cuttlefish::__anon65a808010111 typeref:typename:int
+StopModemSimulator host/commands/run_cvd/launch_modem.cpp /^static bool StopModemSimulator(int id) {$/;" f namespace:cuttlefish typeref:typename:bool file:
+StopMonitoredProcesses host/commands/run_cvd/process_monitor.cc /^bool ProcessMonitor::StopMonitoredProcesses() {$/;" f class:cuttlefish::ProcessMonitor typeref:typename:bool
+StopPlayout host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StopPlayout() {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StopRecording host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::StopRecording() {$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+StopSession host/libs/allocd/request.h /^ StopSession, \/\/ Request all resources within a session be released$/;" e enum:cuttlefish::RequestType
+StopStream host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::StopStream(StreamControlCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+StopperResult common/libs/utils/subprocess.h /^enum class StopperResult {$/;" g namespace:cuttlefish
+Storage guest/hals/health/storage/Storage.h /^class Storage : public BnStorage {$/;" c namespace:aidl::android::hardware::health::storage
+StrError common/libs/fs/shared_fd.cpp /^std::string FileInstance::StrError() const {$/;" f class:cuttlefish::FileInstance typeref:typename:std::string
+StrForInstance host/commands/assemble_cvd/alloc.cc /^static std::string StrForInstance(const std::string& prefix, int num) {$/;" f namespace:cuttlefish typeref:typename:std::string file:
+StrForInstance host/commands/assemble_cvd/flags.cc /^std::string StrForInstance(const std::string& prefix, int num) {$/;" f namespace:cuttlefish::__anon145bfaab0111 typeref:typename:std::string
+StrToIfaceTy host/libs/allocd/utils.cpp /^IfaceType StrToIfaceTy(const std::string& iface) {$/;" f namespace:cuttlefish typeref:typename:IfaceType
+StrToIfaceTyMap host/libs/allocd/utils.cpp /^const std::map<std::string, IfaceType> StrToIfaceTyMap = {$/;" v namespace:cuttlefish typeref:typename:const std::map<std::string,IfaceType>
+StrToReqStatusMap host/libs/allocd/utils.cpp /^const std::map<std::string, RequestStatus> StrToReqStatusMap = {$/;" v namespace:cuttlefish typeref:typename:const std::map<std::string,RequestStatus>
+StrToReqTy host/libs/allocd/utils.cpp /^RequestType StrToReqTy(const std::string& req) {$/;" f namespace:cuttlefish typeref:typename:RequestType
+StrToRequestTyMap host/libs/allocd/utils.cpp /^const std::map<std::string, RequestType> StrToRequestTyMap = {$/;" v namespace:cuttlefish typeref:typename:const std::map<std::string,RequestType>
+StrToStatus host/libs/allocd/utils.cpp /^RequestStatus StrToStatus(const std::string& st) {$/;" f namespace:cuttlefish typeref:typename:RequestStatus
+StreamBufferCache guest/hals/camera/stream_buffer_cache.h /^class StreamBufferCache {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+StreamControlCommand host/libs/audio_connector/commands.cpp /^StreamControlCommand::StreamControlCommand(AudioCommandType type,$/;" f class:cuttlefish::StreamControlCommand
+StreamControlCommand host/libs/audio_connector/commands.h /^struct StreamControlCommand : public AudioCommand {$/;" s namespace:cuttlefish
+StreamDesc host/frontend/webrtc/audio_handler.h /^ struct StreamDesc {$/;" s class:cuttlefish::AudioHandler
+StreamInfoCommand host/libs/audio_connector/commands.cpp /^StreamInfoCommand::StreamInfoCommand(uint32_t start_id, size_t count,$/;" f class:cuttlefish::StreamInfoCommand
+StreamInfoCommand host/libs/audio_connector/commands.h /^class StreamInfoCommand : public InfoCommand<virtio_snd_pcm_info> {$/;" c namespace:cuttlefish
+StreamSetParamsCommand host/libs/audio_connector/commands.cpp /^StreamSetParamsCommand::StreamSetParamsCommand($/;" f class:cuttlefish::StreamSetParamsCommand
+StreamSetParamsCommand host/libs/audio_connector/commands.h /^struct StreamSetParamsCommand : public StreamControlCommand {$/;" s namespace:cuttlefish
+Streamer host/frontend/webrtc/lib/streamer.cpp /^Streamer::Streamer(std::unique_ptr<Streamer::Impl> impl)$/;" f class:cuttlefish::webrtc_streaming::Streamer
+Streamer host/frontend/webrtc/lib/streamer.h /^class Streamer {$/;" c namespace:cuttlefish::webrtc_streaming
+StreamerConfig host/frontend/webrtc/lib/streamer.h /^struct StreamerConfig {$/;" s namespace:cuttlefish::webrtc_streaming
+StreamerSockets host/commands/run_cvd/launch_streamer.cpp /^class StreamerSockets : public virtual Feature {$/;" c namespace:cuttlefish::__anon6b0274e10111 file:
+StreamsInfo host/frontend/webrtc/audio_handler.cpp /^void AudioHandler::StreamsInfo(StreamInfoCommand& cmd) {$/;" f class:cuttlefish::AudioHandler typeref:typename:void
+StrideU host/frontend/webrtc/cvd_video_frame_buffer.cpp /^int CvdVideoFrameBuffer::StrideU() const {$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:int
+StrideU host/frontend/webrtc/lib/video_track_source_impl.cpp /^ int StrideU() const override { return frame_buffer_->StrideU(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:int file:
+StrideV host/frontend/webrtc/cvd_video_frame_buffer.cpp /^int CvdVideoFrameBuffer::StrideV() const {$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:int
+StrideV host/frontend/webrtc/lib/video_track_source_impl.cpp /^ int StrideV() const override { return frame_buffer_->StrideV(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:int file:
+StrideY host/frontend/webrtc/cvd_video_frame_buffer.cpp /^int CvdVideoFrameBuffer::StrideY() const { return AlignStride(width_); }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:int
+StrideY host/frontend/webrtc/lib/video_track_source_impl.cpp /^ int StrideY() const override { return frame_buffer_->StrideY(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:int file:
+StringFromEnv common/libs/utils/environment.cpp /^std::string StringFromEnv(const std::string& varname,$/;" f namespace:cuttlefish typeref:typename:std::string
+StringPrintf host/frontend/webrtc_operator/utils.cpp /^std::string StringPrintf(const char *format, ...) {$/;" f typeref:typename:std::string
+StringToAdbMode host/libs/config/adb/strings.cpp /^AdbMode StringToAdbMode(const std::string& mode_cased) {$/;" f namespace:cuttlefish typeref:typename:AdbMode
+StringToSecureHal host/libs/config/cuttlefish_config.cpp /^static SecureHal StringToSecureHal(std::string mode) {$/;" f namespace:cuttlefish typeref:typename:SecureHal file:
+StripColorCodes common/libs/utils/tee_logging.cpp /^static std::string StripColorCodes(const std::string& str) {$/;" f namespace:cuttlefish typeref:typename:std::string file:
+Subprocess common/libs/utils/subprocess.cpp /^Subprocess::Subprocess(Subprocess&& subprocess)$/;" f class:cuttlefish::Subprocess
+Subprocess common/libs/utils/subprocess.h /^ Subprocess(pid_t pid, SubprocessStopper stopper = KillSubprocess)$/;" f class:cuttlefish::Subprocess
+Subprocess common/libs/utils/subprocess.h /^class Subprocess {$/;" c namespace:cuttlefish
+Subprocess host/commands/start/flag_forwarder.cc /^ const std::string& Subprocess() const { return subprocess_; }$/;" f class:SubprocessFlag typeref:typename:const std::string & file:
+SubprocessFlag host/commands/start/flag_forwarder.cc /^ SubprocessFlag(const std::string& subprocess, const std::string& name)$/;" f class:SubprocessFlag file:
+SubprocessFlag host/commands/start/flag_forwarder.cc /^class SubprocessFlag {$/;" c file:
+SubprocessOptions common/libs/utils/subprocess.h /^ SubprocessOptions() : verbose_(true), exit_with_parent_(true) {}$/;" f class:cuttlefish::SubprocessOptions
+SubprocessOptions common/libs/utils/subprocess.h /^class SubprocessOptions {$/;" c namespace:cuttlefish
+SubprocessStopper common/libs/utils/subprocess.h /^using SubprocessStopper = std::function<StopperResult(Subprocess*)>;$/;" t namespace:cuttlefish
+SubscribeToEvents host/commands/kernel_log_monitor/kernel_log_server.cc /^void KernelLogServer::SubscribeToEvents(monitor::EventCallback callback) {$/;" f class:monitor::KernelLogServer typeref:typename:void
+SubscribersFromCmdline host/commands/kernel_log_monitor/main.cc /^std::vector<cuttlefish::SharedFD> SubscribersFromCmdline() {$/;" f typeref:typename:std::vector<cuttlefish::SharedFD>
+SubscriptionAction host/commands/kernel_log_monitor/kernel_log_server.h /^enum class SubscriptionAction {$/;" g namespace:monitor
+Success host/libs/allocd/request.h /^ Success, \/\/ Request was satisfied$/;" e enum:cuttlefish::RequestStatus
+SupService host/commands/modem_simulator/sup_service.cpp /^SupService::SupService(int32_t service_id, ChannelMonitor* channel_monitor,$/;" f class:cuttlefish::SupService
+SupService host/commands/modem_simulator/sup_service.h /^class SupService : public ModemService, public std::enable_shared_from_this<SupService> {$/;" c namespace:cuttlefish
+SuperImageNeedsRebuilding host/commands/assemble_cvd/super_image_mixer.cc /^bool SuperImageNeedsRebuilding(const FetcherConfig& fetcher_config,$/;" f namespace:cuttlefish typeref:typename:bool
+SuperPartitionComponents host/commands/assemble_cvd/misc_info.cc /^std::vector<std::string> SuperPartitionComponents(const MiscInfo& info) {$/;" f namespace:cuttlefish typeref:typename:std::vector<std::string>
+SupportedAlgorithms guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedAlgorithms(const SupportedAlgorithmsRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedAlgorithms guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedAlgorithms($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedBlockModes guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedBlockModes(const SupportedBlockModesRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedBlockModes guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedBlockModes($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedDigests guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedDigests(const SupportedDigestsRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedDigests guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedDigests(const SupportedDigestsRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedExportFormats guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedExportFormats(const SupportedExportFormatsRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedExportFormats guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedExportFormats($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedImportFormats guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedImportFormats(const SupportedImportFormatsRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedImportFormats guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedImportFormats($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedPaddingModes guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedPaddingModes(const SupportedPaddingModesRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportedPaddingModes guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::SupportedPaddingModes($/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+SupportsEncodedOutput host/frontend/webrtc/lib/video_track_source_impl.cpp /^bool VideoTrackSourceImpl::SupportsEncodedOutput() const { return false; }$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:bool
+Surface host/libs/wayland/wayland_surface.cpp /^Surface::Surface(Surfaces& surfaces) : surfaces_(surfaces) {}$/;" f class:wayland::Surface
+Surface host/libs/wayland/wayland_surface.h /^class Surface {$/;" c namespace:wayland
+Surfaces host/libs/wayland/wayland_surfaces.h /^class Surfaces {$/;" c namespace:wayland
+SysVMessageQueue host/libs/msg_queue/msg_queue.cc /^SysVMessageQueue::SysVMessageQueue(int id) { msgid = id; }$/;" f class:cuttlefish::SysVMessageQueue
+SysVMessageQueue host/libs/msg_queue/msg_queue.h /^class SysVMessageQueue {$/;" c namespace:cuttlefish
+SystemImageDirFlag host/libs/config/config_flag.h /^class SystemImageDirFlag : public FlagFeature {$/;" c namespace:cuttlefish
+SystemImageDirFlagImpl host/libs/config/config_flag.cpp /^class SystemImageDirFlagImpl : public SystemImageDirFlag {$/;" c namespace:cuttlefish::__anon2e549bd00111 file:
+TAG host/libs/confui/cbor.h /^ TAG = 6,$/;" e enum:cuttlefish::confui::Cbor::Type
+TAG tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private static final String TAG = "RilE2eTests";$/;" f class:RilE2eTests file:
+TAG tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private static final String TAG = "WifiE2eTests";$/;" f class:WifiE2eTests file:
+TARGET_2ND_ARCH vsoc_arm64/BoardConfig.mk /^TARGET_2ND_ARCH := arm$/;" m
+TARGET_2ND_ARCH vsoc_x86_64/BoardConfig.mk /^TARGET_2ND_ARCH := x86$/;" m
+TARGET_2ND_ARCH_VARIANT vsoc_arm64/BoardConfig.mk /^TARGET_2ND_ARCH_VARIANT := armv8-a$/;" m
+TARGET_2ND_ARCH_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_2ND_ARCH_VARIANT := silvermont$/;" m
+TARGET_2ND_CPU_ABI vsoc_arm64/BoardConfig.mk /^TARGET_2ND_CPU_ABI := armeabi-v7a$/;" m
+TARGET_2ND_CPU_ABI vsoc_x86_64/BoardConfig.mk /^TARGET_2ND_CPU_ABI := x86$/;" m
+TARGET_2ND_CPU_ABI2 vsoc_arm64/BoardConfig.mk /^TARGET_2ND_CPU_ABI2 := armeabi$/;" m
+TARGET_2ND_CPU_VARIANT vsoc_arm64/BoardConfig.mk /^TARGET_2ND_CPU_VARIANT := cortex-a53$/;" m
+TARGET_2ND_CPU_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_2ND_CPU_VARIANT := silvermont$/;" m
+TARGET_ARCH vsoc_arm64/BoardConfig.mk /^TARGET_ARCH := arm64$/;" m
+TARGET_ARCH vsoc_arm64_only/BoardConfig.mk /^TARGET_ARCH := arm64$/;" m
+TARGET_ARCH vsoc_arm_only/BoardConfig.mk /^TARGET_ARCH := arm$/;" m
+TARGET_ARCH vsoc_x86/BoardConfig.mk /^TARGET_ARCH := x86$/;" m
+TARGET_ARCH vsoc_x86_64/BoardConfig.mk /^TARGET_ARCH := x86_64$/;" m
+TARGET_ARCH vsoc_x86_64_only/BoardConfig.mk /^TARGET_ARCH := x86_64$/;" m
+TARGET_ARCH vsoc_x86_only/BoardConfig.mk /^TARGET_ARCH := x86$/;" m
+TARGET_ARCH_VARIANT vsoc_arm64/BoardConfig.mk /^TARGET_ARCH_VARIANT := armv8-a$/;" m
+TARGET_ARCH_VARIANT vsoc_arm64_only/BoardConfig.mk /^TARGET_ARCH_VARIANT := armv8-a$/;" m
+TARGET_ARCH_VARIANT vsoc_arm_only/BoardConfig.mk /^TARGET_ARCH_VARIANT := armv7-a-neon$/;" m
+TARGET_ARCH_VARIANT vsoc_x86/BoardConfig.mk /^TARGET_ARCH_VARIANT := x86$/;" m
+TARGET_ARCH_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_ARCH_VARIANT := silvermont$/;" m
+TARGET_ARCH_VARIANT vsoc_x86_64_only/BoardConfig.mk /^TARGET_ARCH_VARIANT := silvermont$/;" m
+TARGET_ARCH_VARIANT vsoc_x86_only/BoardConfig.mk /^TARGET_ARCH_VARIANT := x86$/;" m
+TARGET_AVB_PRODUCT_HASHTREE_ALGORITHM shared/BoardConfig.mk /^TARGET_AVB_PRODUCT_HASHTREE_ALGORITHM ?= sha256$/;" m
+TARGET_AVB_SYSTEM_EXT_HASHTREE_ALGORITHM shared/BoardConfig.mk /^TARGET_AVB_SYSTEM_EXT_HASHTREE_ALGORITHM ?= blake2b-256$/;" m
+TARGET_AVB_SYSTEM_HASHTREE_ALGORITHM shared/BoardConfig.mk /^TARGET_AVB_SYSTEM_HASHTREE_ALGORITHM ?= sha256$/;" m
+TARGET_AVB_SYSTEM_OTHER_HASHTREE_ALGORITHM shared/BoardConfig.mk /^TARGET_AVB_SYSTEM_OTHER_HASHTREE_ALGORITHM ?= sha256$/;" m
+TARGET_BOARD_INFO_FILE shared/auto/device.mk /^TARGET_BOARD_INFO_FILE ?= device\/google\/cuttlefish\/shared\/auto\/android-info.txt$/;" m
+TARGET_BOARD_INFO_FILE shared/phone/device_vendor.mk /^TARGET_BOARD_INFO_FILE ?= device\/google\/cuttlefish\/shared\/phone\/android-info.txt$/;" m
+TARGET_BOARD_INFO_FILE shared/tv/device.mk /^TARGET_BOARD_INFO_FILE ?= device\/google\/cuttlefish\/shared\/tv\/android-info.txt$/;" m
+TARGET_BOARD_INFO_FILE vsoc_x86_64/phone/aosp_cf_foldable.mk /^TARGET_BOARD_INFO_FILE := device\/google\/cuttlefish\/shared\/foldable\/android-info.txt$/;" m
+TARGET_BOARD_PLATFORM vsoc_arm64/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_arm64$/;" m
+TARGET_BOARD_PLATFORM vsoc_arm64_only/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_arm64$/;" m
+TARGET_BOARD_PLATFORM vsoc_arm_only/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_arm$/;" m
+TARGET_BOARD_PLATFORM vsoc_x86/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_x86$/;" m
+TARGET_BOARD_PLATFORM vsoc_x86_64/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_x86_64$/;" m
+TARGET_BOARD_PLATFORM vsoc_x86_64_only/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_x86_64$/;" m
+TARGET_BOARD_PLATFORM vsoc_x86_only/BoardConfig.mk /^TARGET_BOARD_PLATFORM := vsoc_x86$/;" m
+TARGET_BOOTLOADER_BOARD_NAME shared/BoardConfig.mk /^TARGET_BOOTLOADER_BOARD_NAME := cutf$/;" m
+TARGET_COPY_OUT_ODM shared/BoardConfig.mk /^TARGET_COPY_OUT_ODM := odm$/;" m
+TARGET_COPY_OUT_ODM_DLKM shared/BoardConfig.mk /^TARGET_COPY_OUT_ODM_DLKM := odm_dlkm$/;" m
+TARGET_COPY_OUT_SYSTEM_EXT shared/BoardConfig.mk /^TARGET_COPY_OUT_SYSTEM_EXT := system_ext$/;" m
+TARGET_COPY_OUT_VENDOR_DLKM shared/BoardConfig.mk /^TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm$/;" m
+TARGET_CPU_ABI vsoc_arm64/BoardConfig.mk /^TARGET_CPU_ABI := arm64-v8a$/;" m
+TARGET_CPU_ABI vsoc_arm64_only/BoardConfig.mk /^TARGET_CPU_ABI := arm64-v8a$/;" m
+TARGET_CPU_ABI vsoc_arm_only/BoardConfig.mk /^TARGET_CPU_ABI := armeabi-v7a$/;" m
+TARGET_CPU_ABI vsoc_x86/BoardConfig.mk /^TARGET_CPU_ABI := x86$/;" m
+TARGET_CPU_ABI vsoc_x86_64/BoardConfig.mk /^TARGET_CPU_ABI := x86_64$/;" m
+TARGET_CPU_ABI vsoc_x86_64_only/BoardConfig.mk /^TARGET_CPU_ABI := x86_64$/;" m
+TARGET_CPU_ABI vsoc_x86_only/BoardConfig.mk /^TARGET_CPU_ABI := x86$/;" m
+TARGET_CPU_ABI2 vsoc_arm_only/BoardConfig.mk /^TARGET_CPU_ABI2 := armeabi$/;" m
+TARGET_CPU_VARIANT vsoc_arm64/BoardConfig.mk /^TARGET_CPU_VARIANT := cortex-a53$/;" m
+TARGET_CPU_VARIANT vsoc_arm64_only/BoardConfig.mk /^TARGET_CPU_VARIANT := cortex-a53$/;" m
+TARGET_CPU_VARIANT vsoc_arm_only/BoardConfig.mk /^TARGET_CPU_VARIANT := cortex-a15$/;" m
+TARGET_ENABLE_HOST_BLUETOOTH_EMULATION shared/device.mk /^TARGET_ENABLE_HOST_BLUETOOTH_EMULATION ?= true$/;" m
+TARGET_FLATTEN_APEX vsoc_x86_noapex/BoardConfig.mk /^TARGET_FLATTEN_APEX := true$/;" m
+TARGET_KERNEL_USE vsoc_arm64/kernel.mk /^TARGET_KERNEL_USE ?= 5.10$/;" m
+TARGET_KERNEL_USE vsoc_arm_only/kernel.mk /^TARGET_KERNEL_USE ?= mainline$/;" m
+TARGET_KERNEL_USE vsoc_x86_64/kernel.mk /^TARGET_KERNEL_USE ?= 5.10$/;" m
+TARGET_KERNEL_USE vsoc_x86_only/kernel.mk /^TARGET_KERNEL_USE ?= 5.10$/;" m
+TARGET_NATIVE_BRIDGE_2ND_ABI vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_2ND_ABI := armeabi-v7a armeabi$/;" m
+TARGET_NATIVE_BRIDGE_2ND_ARCH vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_2ND_ARCH := arm$/;" m
+TARGET_NATIVE_BRIDGE_2ND_ARCH_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_2ND_ARCH_VARIANT := armv7-a-neon$/;" m
+TARGET_NATIVE_BRIDGE_2ND_CPU_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_2ND_CPU_VARIANT := generic$/;" m
+TARGET_NATIVE_BRIDGE_ABI vsoc_x86/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ABI := armeabi-v7a armeabi$/;" m
+TARGET_NATIVE_BRIDGE_ABI vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ABI := arm64-v8a$/;" m
+TARGET_NATIVE_BRIDGE_ABI vsoc_x86_64_only/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ABI := arm64-v8a$/;" m
+TARGET_NATIVE_BRIDGE_ARCH vsoc_x86/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ARCH := arm$/;" m
+TARGET_NATIVE_BRIDGE_ARCH vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ARCH := arm64$/;" m
+TARGET_NATIVE_BRIDGE_ARCH vsoc_x86_64_only/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ARCH := arm64$/;" m
+TARGET_NATIVE_BRIDGE_ARCH_VARIANT vsoc_x86/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ARCH_VARIANT := armv7-a-neon$/;" m
+TARGET_NATIVE_BRIDGE_ARCH_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ARCH_VARIANT := armv8-a$/;" m
+TARGET_NATIVE_BRIDGE_ARCH_VARIANT vsoc_x86_64_only/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_ARCH_VARIANT := armv8-a$/;" m
+TARGET_NATIVE_BRIDGE_CPU_VARIANT vsoc_x86/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_CPU_VARIANT := generic$/;" m
+TARGET_NATIVE_BRIDGE_CPU_VARIANT vsoc_x86_64/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_CPU_VARIANT := generic$/;" m
+TARGET_NATIVE_BRIDGE_CPU_VARIANT vsoc_x86_64_only/BoardConfig.mk /^TARGET_NATIVE_BRIDGE_CPU_VARIANT := generic$/;" m
+TARGET_NO_BOOTLOADER shared/BoardConfig.mk /^TARGET_NO_BOOTLOADER := $(__TARGET_NO_BOOTLOADER)$/;" m
+TARGET_NO_BOOTLOADER vsoc_arm64/bootloader.mk /^TARGET_NO_BOOTLOADER := false$/;" m
+TARGET_NO_BOOTLOADER vsoc_arm_only/bootloader.mk /^TARGET_NO_BOOTLOADER := false$/;" m
+TARGET_NO_BOOTLOADER vsoc_x86_64/bootloader.mk /^TARGET_NO_BOOTLOADER := false$/;" m
+TARGET_NO_TELEPHONY shared/auto/device.mk /^TARGET_NO_TELEPHONY := true$/;" m
+TARGET_RECOVERY_FSTAB shared/BoardConfig.mk /^TARGET_RECOVERY_FSTAB ?= device\/google\/cuttlefish\/shared\/config\/fstab.f2fs$/;" m
+TARGET_RECOVERY_PIXEL_FORMAT shared/BoardConfig.mk /^TARGET_RECOVERY_PIXEL_FORMAT := ABGR_8888$/;" m
+TARGET_RECOVERY_UI_LIB shared/BoardConfig.mk /^TARGET_RECOVERY_UI_LIB := librecovery_ui_cuttlefish$/;" m
+TARGET_RELEASETOOLS_EXTENSIONS shared/BoardConfig.mk /^TARGET_RELEASETOOLS_EXTENSIONS := device\/google\/cuttlefish\/shared$/;" m
+TARGET_RO_FILE_SYSTEM_TYPE shared/device.mk /^TARGET_RO_FILE_SYSTEM_TYPE ?= ext4$/;" m
+TARGET_TRANSLATE_2ND_ARCH vsoc_arm64/BoardConfig.mk /^TARGET_TRANSLATE_2ND_ARCH := false$/;" m
+TARGET_USERDATAIMAGE_FILE_SYSTEM_TYPE shared/device.mk /^TARGET_USERDATAIMAGE_FILE_SYSTEM_TYPE ?= f2fs$/;" m
+TARGET_USERDATAIMAGE_PARTITION_SIZE shared/device.mk /^TARGET_USERDATAIMAGE_PARTITION_SIZE ?= 6442450944$/;" m
+TARGET_USERIMAGES_SPARSE_EROFS_DISABLED shared/BoardConfig.mk /^TARGET_USERIMAGES_SPARSE_EROFS_DISABLED := true$/;" m
+TARGET_USERIMAGES_SPARSE_EXT_DISABLED shared/BoardConfig.mk /^TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true$/;" m
+TARGET_USERIMAGES_SPARSE_F2FS_DISABLED shared/BoardConfig.mk /^TARGET_USERIMAGES_SPARSE_F2FS_DISABLED := true$/;" m
+TARGET_USERIMAGES_USE_F2FS shared/BoardConfig.mk /^TARGET_USERIMAGES_USE_F2FS := true$/;" m
+TARGET_USES_CF_RILD shared/auto/device.mk /^TARGET_USES_CF_RILD ?= true$/;" m
+TARGET_USES_CF_RILD shared/phone/device.mk /^TARGET_USES_CF_RILD ?= true$/;" m
+TARGET_USES_CF_RILD shared/phone/device_vendor.mk /^TARGET_USES_CF_RILD ?= true$/;" m
+TARGET_USES_HWC2 shared/BoardConfig.mk /^TARGET_USES_HWC2 := true$/;" m
+TARGET_USE_BTLINUX_HAL_IMPL shared/device.mk /^TARGET_USE_BTLINUX_HAL_IMPL ?= true$/;" m
+TARGET_VULKAN_SUPPORT shared/device.mk /^TARGET_VULKAN_SUPPORT ?= true$/;" m
+TD_SCDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_TD_SCDMA_SignalStrength TD_SCDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5208 typeref:typename:RIL_TD_SCDMA_SignalStrength
+TD_SCDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_TD_SCDMA_SignalStrength TD_SCDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_TD_SCDMA_SignalStrength
+TECH guest/hals/ril/reference-ril/reference-ril.c /^#define TECH(/;" d file:
+TECH_BIT guest/hals/ril/reference-ril/reference-ril.c /^#define TECH_BIT(/;" d file:
+TECH_SUPPORTED guest/hals/ril/reference-ril/reference-ril.c /^#define TECH_SUPPORTED(/;" d file:
+TEST common/libs/fs/shared_fd_test.cpp /^TEST(SendFD, Basic) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, AllIntegerTypes) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, BasicIntNode) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, BasicStringNode) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, ComplexList) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, ListSequence) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, NestedList) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, SimpleNetlinkCreateHeader) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, SimpleNetlinkUpdateHeader) {$/;" f namespace:cuttlefish
+TEST common/libs/net/netlink_request_test.cpp /^TEST(NetlinkClientTest, SingleList) {$/;" f namespace:cuttlefish
+TEST common/libs/security/keymaster_channel_test.cpp /^TEST(KeymasterChannel, SendAndReceiveRequest) {$/;" f namespace:cuttlefish
+TEST common/libs/security/keymaster_channel_test.cpp /^TEST(KeymasterChannel, SendAndReceiveResponse) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, BoolFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, BoolFlagXml) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, ConflictingAlias) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, DuplicateAlias) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, FlagRemoval) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, GflagsIncompatibleFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, IntFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, IntFlagXml) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, InvalidFlagGuard) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, InvalidIntFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, InvalidStringFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, RepeatedListFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, RepeatedStringFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, StringFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, StringFlagXml) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, StringIntFlag) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/flag_parser_test.cpp /^TEST(FlagParser, UnexpectedArgumentGuard) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixMessageSocket, AutoCredentials) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixMessageSocket, BadCredentialsBlocked) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixMessageSocket, SendCredentials) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixMessageSocket, SendFileDescriptor) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixMessageSocket, SendPlainMessage) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixMessageSocket, SendTwoFileDescriptors) {$/;" f namespace:cuttlefish
+TEST common/libs/utils/unix_sockets_test.cpp /^TEST(UnixSocketMessage, ExtractFileDescriptors) {$/;" f namespace:cuttlefish
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, GetNextHexInt) { \/\/ Hexadecimal string to decimal value$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, GetNextInt) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, GetNextStrDeciToHex) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, GetNextStr_default) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, GetNextStr_withparam) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, SkipComma) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, SkipPrefix) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, SkipPrefixAT) {$/;" f
+TEST host/commands/modem_simulator/unittest/command_parser_test.cpp /^TEST(CommandParserUnitTest, SkipWhiteSpace) {$/;" f
+TEST host/commands/modem_simulator/unittest/pdu_parser_test.cpp /^TEST(PDUParserTest, BCDToString) {$/;" f
+TEST host/commands/modem_simulator/unittest/pdu_parser_test.cpp /^TEST(PDUParserTest, CreatePDU) {$/;" f
+TEST host/commands/modem_simulator/unittest/pdu_parser_test.cpp /^TEST(PDUParserTest, GetPhoneNumberFromAddress) {$/;" f
+TEST host/commands/modem_simulator/unittest/pdu_parser_test.cpp /^TEST(PDUParserTest, IsValidPDU_false) {$/;" f
+TEST host/commands/modem_simulator/unittest/pdu_parser_test.cpp /^TEST(PDUParserTest, IsValidPDU_true) {$/;" f
+TEST host/commands/secure_env/encrypted_serializable_test.cpp /^TEST(TpmEncryptedSerializable, BinaryData) {$/;" f namespace:cuttlefish
+TEST host/libs/config/adb/test.cpp /^TEST(AdbConfigTest, SerializeDeserialize) {$/;" f namespace:cuttlefish
+TEST host/libs/config/adb/test.cpp /^TEST(AdbConfigTest, SetFromFlags) {$/;" f namespace:cuttlefish
+TEST tests/hal/hal_implementation_test.cpp /^TEST(Hal, AidlInterfacesImplemented) {$/;" f
+TEST tests/hal/hal_implementation_test.cpp /^TEST(Hal, AllAidlInterfacesAreInAosp) {$/;" f
+TEST tests/hal/hal_implementation_test.cpp /^TEST(Hal, AllHidlInterfacesAreInAosp) {$/;" f
+TEST tests/hal/hal_implementation_test.cpp /^TEST(Hal, HidlInterfacesImplemented) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, ActivateDataCall) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, ChangeOrEnterPIN) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, CloseLogicalChannel) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, DeleteSmsOnSimFalse) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, DeleteSmsOnSimTure) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, EnterDataState) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, FacilityLock) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetBroadcastConfig) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetIMEI) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetIMSI) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetIccCardStatus) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetIccId) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetSendTerminalResponseToSim) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, GetSmscAddress) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, OpenLogicalChannel) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, QueryDataCallList) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, QueryPDPContextList) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, ReadDynamicParamFalse) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, ReadDynamicParamTrue) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, ReportStkServiceIsRunning) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SIM_IO) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SMSAcknowledge) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SendEnvelope) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SendSMS) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SetBroadcastConfig) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SetPDPContext) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, SetSmscAddress) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, TransmitLogicalChannel) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, WriteSMSToSim) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testCLIP) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testCLIR) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testCallForward) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testCallWaiting) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testCurrentCalls) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testDataNetworkRegistration) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testDataNetworkRegistrationWithLte2) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testExitEmergencyMode) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testGetPreferredNetworkType) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testHangup) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testMute) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testQueryCLIR) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testQueryNetworkSelectionMode) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testQuerySupportedTechs) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testRadioPowerReq) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testRequestOperator) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testSendDtmf) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testSetPreferredNetworkType) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testSetRadioPower) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testSignalStrength) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testUSSD) {$/;" f
+TEST_F host/commands/modem_simulator/unittest/service_test.cpp /^TEST_F(ModemServiceTest, testVoiceNetworkRegistration) {$/;" f
+TEXT_STRING host/libs/confui/cbor.h /^ TEXT_STRING = 3,$/;" e enum:cuttlefish::confui::Cbor::Type
+THREAD_ANNOTATION_ATTRIBUTE__ common/libs/concurrency/thread_annotations.h /^#define THREAD_ANNOTATION_ATTRIBUTE__(/;" d
+THREAD_POOL_SIZE guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ private static final int THREAD_POOL_SIZE = 8;$/;" f class:JobExecutor file:
+TIMEVAL_0 guest/hals/ril/reference-ril/reference-ril.c /^static const struct timeval TIMEVAL_0 = {0,0};$/;" v typeref:typename:const struct timeval file:
+TIMEVAL_CALLSTATEPOLL guest/hals/ril/reference-ril/reference-ril.c /^static const struct timeval TIMEVAL_CALLSTATEPOLL = {0,500000};$/;" v typeref:typename:const struct timeval file:
+TIMEVAL_SIMPOLL guest/hals/ril/reference-ril/reference-ril.c /^static const struct timeval TIMEVAL_SIMPOLL = {1,0};$/;" v typeref:typename:const struct timeval file:
+TIMEVAL_WAKE_TIMEOUT guest/hals/ril/reference-libril/ril.cpp /^static const struct timeval TIMEVAL_WAKE_TIMEOUT = {ANDROID_WAKE_LOCK_SECS,ANDROID_WAKE_LOCK_USE/;" v namespace:android typeref:typename:const struct timeval file:
+TMP_EXTENSION host/commands/assemble_cvd/boot_image_utils.cc /^const char TMP_EXTENSION[] = ".tmp";$/;" v typeref:typename:const char[]
+TMP_RD_DIR host/commands/assemble_cvd/boot_image_utils.cc /^const char TMP_RD_DIR[] = "stripped_ramdisk_dir";$/;" v typeref:typename:const char[]
+TOMBSTONE_BUFFER_SIZE guest/monitoring/tombstone_transmit/tombstone_transmit.cpp /^#define TOMBSTONE_BUFFER_SIZE /;" d file:
+TOMBSTONE_DIR guest/monitoring/tombstone_transmit/tombstone_transmit.cpp /^static const char TOMBSTONE_DIR[] = "\/data\/tombstones\/";$/;" v typeref:typename:const char[] file:
+TOMBSTONE_PATH tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private static final String TOMBSTONE_PATH = "\/data\/tombstones\/";$/;" f class:TombstoneTransmitTest file:
+TOMBSTONE_PRODUCER tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private static final String TOMBSTONE_PRODUCER = "tombstone_producer";$/;" f class:TombstoneTransmitTest file:
+TRUSTY_GATEKEEPER_H guest/hals/gatekeeper/remote/remote_gatekeeper.h /^#define TRUSTY_GATEKEEPER_H$/;" d
+TRY_ACQUIRE common/libs/concurrency/thread_annotations.h /^#define TRY_ACQUIRE(/;" d
+TRY_ACQUIRE_SHARED common/libs/concurrency/thread_annotations.h /^#define TRY_ACQUIRE_SHARED(/;" d
+TYPE_EF guest/hals/ril/reference-ril/reference-ril.c /^#define TYPE_EF /;" d file:
+TYPE_FILE_DES_LEN guest/hals/ril/reference-ril/reference-ril.c /^#define TYPE_FILE_DES_LEN /;" d file:
+Tag3 guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^typedef ::android::hardware::keymaster::V3_0::Tag Tag3;$/;" t typeref:typename:::android::hardware::keymaster::V3_0::Tag file:
+TapInterfacesInUse common/libs/utils/network.cpp /^std::set<std::string> TapInterfacesInUse() {$/;" f namespace:cuttlefish typeref:typename:std::set<std::string>
+TargetBuildZipFromArtifacts host/commands/fetcher/fetch_cvd.cc /^std::string TargetBuildZipFromArtifacts($/;" f namespace:cuttlefish::__anonccb356fd0211 typeref:typename:std::string
+TargetFilesZip host/commands/assemble_cvd/super_image_mixer.cc /^std::string TargetFilesZip(const FetcherConfig& fetcher_config,$/;" f namespace:cuttlefish::__anonae6530d30111 typeref:typename:std::string
+TcpConnectorEnabled host/libs/config/adb/launch.cpp /^ bool TcpConnectorEnabled() const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:bool file:
+TcpServer common/frontend/socket_vsock_proxy/main.cpp /^[[noreturn]] void TcpServer() {$/;" f namespace:__anon913036200111 typeref:typename:void
+TctiContext host/commands/secure_env/device_tpm.cpp /^TSS2_TCTI_CONTEXT* DeviceTpm::TctiContext() {$/;" f class:cuttlefish::DeviceTpm typeref:typename:TSS2_TCTI_CONTEXT *
+TctiContext host/commands/secure_env/in_process_tpm.cpp /^ TSS2_TCTI_CONTEXT* TctiContext() {$/;" f class:cuttlefish::InProcessTpm::Impl typeref:typename:TSS2_TCTI_CONTEXT * file:
+TctiContext host/commands/secure_env/in_process_tpm.cpp /^TSS2_TCTI_CONTEXT* InProcessTpm::TctiContext() { return impl_->TctiContext(); }$/;" f class:cuttlefish::InProcessTpm typeref:typename:TSS2_TCTI_CONTEXT *
+TearDownTestSuite host/commands/modem_simulator/unittest/service_test.cpp /^ static void TearDownTestSuite() {$/;" f class:ModemServiceTest typeref:typename:void file:
+TeeLogger common/libs/utils/tee_logging.cpp /^TeeLogger::TeeLogger(const std::vector<SeverityTarget>& destinations)$/;" f class:cuttlefish::TeeLogger
+TeeLogger common/libs/utils/tee_logging.h /^class TeeLogger {$/;" c namespace:cuttlefish
+TeeUiFrame host/libs/confui/server_common.h /^using TeeUiFrame = std::vector<std::uint32_t>;$/;" t namespace:cuttlefish::confui typeref:typename:std::vector<std::uint32_t>
+TeeUiFrameWrapper host/libs/confui/host_renderer.h /^ TeeUiFrameWrapper(const int w, const int h, const teeui::Color color)$/;" f class:cuttlefish::confui::TeeUiFrameWrapper
+TeeUiFrameWrapper host/libs/confui/host_renderer.h /^class TeeUiFrameWrapper {$/;" c namespace:cuttlefish::confui
+TeeuiRc guest/hals/confirmationui/TrustyConfirmationUI.cpp /^using TeeuiRc = ::teeui::ResponseCode;$/;" t namespace:android::hardware::confirmationui::V1_0::implementation typeref:typename:::teeui::ResponseCode file:
+TeeuiRc guest/hals/confirmationui/guest_session.cpp /^using TeeuiRc = teeui::ResponseCode;$/;" t namespace:android::hardware::confirmationui::V1_0::implementation typeref:typename:teeui::ResponseCode file:
+Terminate host/frontend/webrtc/lib/audio_device.cpp /^int32_t CfAudioDeviceModule::Terminate() { return 0; }$/;" f class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:int32_t
+Terminating guest/hals/confirmationui/guest_session.h /^ Terminating = 4,$/;" e enum:android::hardware::confirmationui::V1_0::implementation::GuestSession::ListenerState
+TestComponent host/libs/config/adb/test.cpp /^fruit::Component<TestData> TestComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<TestData>
+TestData host/libs/config/adb/test.cpp /^struct TestData {$/;" s namespace:cuttlefish file:
+TestKeyBits host/libs/confui/sign.cc /^enum class TestKeyBits : uint8_t {$/;" g namespace:cuttlefish::confui typeref:typename:uint8_t file:
+TestTpm host/commands/secure_env/test_tpm.cpp /^TestTpm::TestTpm() {$/;" f class:cuttlefish::TestTpm
+TestTpm host/commands/secure_env/test_tpm.h /^class TestTpm {$/;" c namespace:cuttlefish
+ThreadJoiner common/libs/utils/subprocess.cpp /^ ThreadJoiner(const std::vector<std::thread*> threads) : threads_(threads) {}$/;" f class:cuttlefish::ThreadJoiner file:
+ThreadJoiner common/libs/utils/subprocess.cpp /^class ThreadJoiner {$/;" c namespace:cuttlefish file:
+ThreadLoop host/commands/modem_simulator/thread_looper.cpp /^void ThreadLooper::ThreadLoop() {$/;" f class:cuttlefish::ThreadLooper typeref:typename:void
+ThreadLoop host/commands/run_cvd/boot_state_machine.cc /^ void ThreadLoop(SharedFD boot_events_pipe) {$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:void file:
+ThreadLooper host/commands/modem_simulator/thread_looper.cpp /^ThreadLooper::ThreadLooper()$/;" f class:cuttlefish::ThreadLooper
+ThreadLooper host/commands/modem_simulator/thread_looper.h /^class ThreadLooper {$/;" c namespace:cuttlefish
+ThreadSafeQueue common/libs/concurrency/thread_safe_queue.h /^ explicit ThreadSafeQueue(std::size_t max_elements,$/;" f class:cuttlefish::ThreadSafeQueue
+ThreadSafeQueue common/libs/concurrency/thread_safe_queue.h /^class ThreadSafeQueue {$/;" c namespace:cuttlefish
+ThreadTracer host/libs/confui/host_utils.h /^class ThreadTracer {$/;" c namespace:cuttlefish::confui::thread
+TimePoint host/libs/confui/session.h /^ using TimePoint = std::chrono::time_point<Clock>;$/;" t class:cuttlefish::confui::Session typeref:typename:std::chrono::time_point<Clock>
+TimeUpdate host/commands/modem_simulator/misc_service.cpp /^void MiscService::TimeUpdate() {$/;" f class:cuttlefish::MiscService typeref:typename:void
+TimeZoneOffset host/commands/modem_simulator/misc_service.cpp /^long MiscService::TimeZoneOffset(time_t* utctime)$/;" f class:cuttlefish::MiscService typeref:typename:long
+TimerWaitingRemoteCallResponse host/commands/modem_simulator/call_service.cpp /^void CallService::TimerWaitingRemoteCallResponse(CallToken call_token) {$/;" f class:cuttlefish::CallService typeref:typename:void
+Timestamp host/commands/metrics/proto/common.proto /^message Timestamp {$/;" m
+ToCharPointers common/libs/utils/subprocess.cpp /^std::vector<const char*> ToCharPointers(const std::vector<std::string>& vect) {$/;" f namespace:cuttlefish::__anon39e8abf00111 typeref:typename:std::vector<const char * >
+ToCmd common/libs/confui/protocol_types.cpp /^ConfUiCmd ToCmd(const std::string& cmd_str) {$/;" f namespace:cuttlefish::confui typeref:typename:ConfUiCmd
+ToCmd common/libs/confui/protocol_types.cpp /^ConfUiCmd ToCmd(std::uint32_t i) {$/;" f namespace:cuttlefish::confui typeref:typename:ConfUiCmd
+ToConfUiMessage common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> ToConfUiMessage($/;" f namespace:cuttlefish::confui::__anon7b80148c0111 typeref:typename:std::unique_ptr<ConfUiMessage>
+ToConfUiMessage common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kCliAck>($/;" f namespace:cuttlefish::confui::__anon7b80148c0211 typeref:typename:std::unique_ptr<ConfUiMessage>
+ToConfUiMessage common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kCliRespond>($/;" f namespace:cuttlefish::confui::__anon7b80148c0211 typeref:typename:std::unique_ptr<ConfUiMessage>
+ToConfUiMessage common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kStart>($/;" f namespace:cuttlefish::confui::__anon7b80148c0211 typeref:typename:std::unique_ptr<ConfUiMessage>
+ToConfUiMessage common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kUserInputEvent>($/;" f namespace:cuttlefish::confui::__anon7b80148c0211 typeref:typename:std::unique_ptr<ConfUiMessage>
+ToConfUiMessage common/libs/confui/protocol.cpp /^std::unique_ptr<ConfUiMessage> ToConfUiMessage<ConfUiCmd::kUserTouchEvent>($/;" f namespace:cuttlefish::confui::__anon7b80148c0211 typeref:typename:std::unique_ptr<ConfUiMessage>
+ToDebugString common/libs/confui/protocol_types.cpp /^std::string ToDebugString(const ConfUiCmd& cmd, const bool is_verbose) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ToFsmInput host/libs/confui/server_common.cc /^FsmInput ToFsmInput(const ConfUiMessage& msg) {$/;" f namespace:cuttlefish::confui typeref:typename:FsmInput
+ToJson host/frontend/webrtc_operator/server_config.cpp /^Json::Value ServerConfig::ToJson() const {$/;" f class:cuttlefish::ServerConfig typeref:typename:Json::Value
+ToJson host/libs/config/custom_actions.cpp /^Json::Value ToJson(const CustomActionConfig& custom_action) {$/;" f namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:Json::Value
+ToLower host/libs/graphics_detector/graphics_detector.cpp /^std::string ToLower(const std::string& v) {$/;" f namespace:cuttlefish::__anon29a199ff0111 typeref:typename:std::string
+ToMultipleImagePartition host/libs/image_aggregator/image_aggregator.cc /^MultipleImagePartition ToMultipleImagePartition(ImagePartition source) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:MultipleImagePartition
+ToPayload common/libs/confui/packet.h /^Payload ToPayload(const std::string& cmd_str, const std::string& session_id,$/;" f namespace:cuttlefish::confui::packet::impl typeref:typename:Payload
+ToString common/libs/confui/packet_types.cpp /^std::string ToString(const ParsedPacket& packet) {$/;" f namespace:cuttlefish::confui::packet typeref:typename:std::string
+ToString common/libs/confui/protocol.cpp /^std::string ToString(const ConfUiMessage& msg) { return msg.ToString(); }$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ConfUiAckMessage::ToString() const {$/;" f class:cuttlefish::confui::ConfUiAckMessage typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ConfUiCliResponseMessage::ToString() const {$/;" f class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ConfUiStartMessage::ToString() const {$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ConfUiUserSelectionMessage::ToString() const {$/;" f class:cuttlefish::confui::ConfUiUserSelectionMessage typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ConfUiUserTouchMessage::ToString() const {$/;" f class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ToString(const ConfUiCmd& cmd) { return ToDebugString(cmd, false); }$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ToString common/libs/confui/protocol_types.cpp /^std::string ToString(const teeui::UIOption ui_opt) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ToString common/libs/confui/protocol_types.h /^ std::string ToString() const override {$/;" f class:cuttlefish::confui::ConfUiGenericMessage typeref:typename:std::string
+ToString host/libs/confui/server_common.cc /^std::string ToString(FsmInput input) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ToString host/libs/confui/server_common.cc /^std::string ToString(const MainLoopState& state) {$/;" f namespace:cuttlefish::confui typeref:typename:std::string
+ToUiOption common/libs/confui/protocol_types.cpp /^std::optional<teeui::UIOption> ToUiOption(const std::string& src) {$/;" f namespace:cuttlefish::confui typeref:typename:std::optional<teeui::UIOption>
+TombstoneReceiver host/commands/run_cvd/launch.cc /^class TombstoneReceiver : public CommandSource {$/;" c namespace:cuttlefish file:
+TombstoneReceiverBinary host/libs/config/known_paths.cpp /^std::string TombstoneReceiverBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+TombstoneReceiverMain host/commands/tombstone_receiver/main.cpp /^int TombstoneReceiverMain(int argc, char** argv) {$/;" f namespace:cuttlefish typeref:typename:int
+TombstoneTransmitTest tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^public class TombstoneTransmitTest extends BaseHostJUnit4Test {$/;" c
+TopologicalVisit host/libs/config/feature.h /^bool FeatureSuperclass<Subclass>::TopologicalVisit($/;" f class:cuttlefish::FeatureSuperclass typeref:typename:bool
+TouchEvent host/libs/confui/host_server.cc /^void HostServer::TouchEvent(const int x, const int y, const bool is_down) {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+Tpm host/commands/secure_env/tpm.h /^class Tpm {$/;" c namespace:cuttlefish
+TpmAttestationRecordContext host/commands/secure_env/tpm_attestation_record.cpp /^TpmAttestationRecordContext::TpmAttestationRecordContext()$/;" f class:cuttlefish::TpmAttestationRecordContext
+TpmAttestationRecordContext host/commands/secure_env/tpm_attestation_record.h /^class TpmAttestationRecordContext : public keymaster::AttestationContext {$/;" c namespace:cuttlefish
+TpmAuth host/commands/secure_env/tpm_auth.cpp /^TpmAuth::TpmAuth(ESYS_TR auth): TpmAuth(auth, ESYS_TR_NONE, ESYS_TR_NONE) {}$/;" f class:cuttlefish::TpmAuth
+TpmAuth host/commands/secure_env/tpm_auth.cpp /^TpmAuth::TpmAuth(ESYS_TR auth1, ESYS_TR auth2)$/;" f class:cuttlefish::TpmAuth
+TpmAuth host/commands/secure_env/tpm_auth.cpp /^TpmAuth::TpmAuth(ESYS_TR auth1, ESYS_TR auth2, ESYS_TR auth3) {$/;" f class:cuttlefish::TpmAuth
+TpmAuth host/commands/secure_env/tpm_auth.h /^class TpmAuth {$/;" c namespace:cuttlefish
+TpmCommandName host/commands/secure_env/tpm_commands.cpp /^std::string TpmCommandName(std::uint32_t command_num) {$/;" f namespace:cuttlefish typeref:typename:std::string
+TpmDecrypt host/commands/secure_env/tpm_encrypt_decrypt.cpp /^bool TpmDecrypt(ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth,$/;" f namespace:cuttlefish typeref:typename:bool
+TpmEncrypt host/commands/secure_env/tpm_encrypt_decrypt.cpp /^bool TpmEncrypt(ESYS_CONTEXT* esys, ESYS_TR key_handle, TpmAuth auth,$/;" f namespace:cuttlefish typeref:typename:bool
+TpmEncryptDecrypt host/commands/secure_env/tpm_encrypt_decrypt.cpp /^static bool TpmEncryptDecrypt( \/\/$/;" f namespace:cuttlefish typeref:typename:bool file:
+TpmGatekeeper host/commands/secure_env/tpm_gatekeeper.cpp /^TpmGatekeeper::TpmGatekeeper($/;" f class:cuttlefish::TpmGatekeeper
+TpmGatekeeper host/commands/secure_env/tpm_gatekeeper.h /^class TpmGatekeeper : public gatekeeper::GateKeeper {$/;" c namespace:cuttlefish
+TpmHmac host/commands/secure_env/tpm_hmac.cpp /^UniqueEsysPtr<TPM2B_DIGEST> TpmHmac($/;" f namespace:cuttlefish typeref:typename:UniqueEsysPtr<TPM2B_DIGEST>
+TpmKeyBlobMaker host/commands/secure_env/tpm_key_blob_maker.cpp /^TpmKeyBlobMaker::TpmKeyBlobMaker(TpmResourceManager& resource_manager)$/;" f class:cuttlefish::TpmKeyBlobMaker
+TpmKeyBlobMaker host/commands/secure_env/tpm_key_blob_maker.h /^class TpmKeyBlobMaker : public keymaster::SoftwareKeyBlobMaker {$/;" c namespace:cuttlefish
+TpmKeymasterContext host/commands/secure_env/tpm_keymaster_context.cpp /^TpmKeymasterContext::TpmKeymasterContext($/;" f class:cuttlefish::TpmKeymasterContext
+TpmKeymasterContext host/commands/secure_env/tpm_keymaster_context.h /^class TpmKeymasterContext : public keymaster::KeymasterContext {$/;" c namespace:cuttlefish
+TpmKeymasterEnforcement host/commands/secure_env/tpm_keymaster_enforcement.cpp /^TpmKeymasterEnforcement::TpmKeymasterEnforcement($/;" f class:cuttlefish::TpmKeymasterEnforcement
+TpmKeymasterEnforcement host/commands/secure_env/tpm_keymaster_enforcement.h /^class TpmKeymasterEnforcement : public keymaster::KeymasterEnforcement {$/;" c namespace:cuttlefish
+TpmObjectSlot host/commands/secure_env/tpm_resource_manager.h /^using TpmObjectSlot = std::shared_ptr<TpmResourceManager::ObjectSlot>;$/;" t namespace:cuttlefish typeref:typename:std::shared_ptr<TpmResourceManager::ObjectSlot>
+TpmRandomSource host/commands/secure_env/tpm_random_source.cpp /^TpmRandomSource::TpmRandomSource(ESYS_CONTEXT* esys) : esys_(esys) {$/;" f class:cuttlefish::TpmRandomSource
+TpmRandomSource host/commands/secure_env/tpm_random_source.h /^class TpmRandomSource : public keymaster::RandomSource {$/;" c namespace:cuttlefish
+TpmRemoteProvisioningContext host/commands/secure_env/tpm_remote_provisioning_context.cpp /^TpmRemoteProvisioningContext::TpmRemoteProvisioningContext($/;" f class:cuttlefish::TpmRemoteProvisioningContext
+TpmRemoteProvisioningContext host/commands/secure_env/tpm_remote_provisioning_context.h /^class TpmRemoteProvisioningContext$/;" c namespace:cuttlefish
+TpmResourceManager host/commands/secure_env/tpm_resource_manager.cpp /^TpmResourceManager::TpmResourceManager(ESYS_CONTEXT* esys)$/;" f class:cuttlefish::TpmResourceManager
+TpmResourceManager host/commands/secure_env/tpm_resource_manager.h /^class TpmResourceManager {$/;" c namespace:cuttlefish
+TpmSerializable host/commands/secure_env/tpm_serialize.cpp /^TpmSerializable<T>::TpmSerializable(T* instance) : instance_(instance) {}$/;" f class:cuttlefish::TpmSerializable
+TpmSerializable host/commands/secure_env/tpm_serialize.cpp /^template class TpmSerializable<TPM2B_PRIVATE>;$/;" v namespace:cuttlefish typeref:meta:class
+TpmSerializable host/commands/secure_env/tpm_serialize.cpp /^template class TpmSerializable<TPM2B_PUBLIC>;$/;" v namespace:cuttlefish typeref:meta:class
+TpmSerializable host/commands/secure_env/tpm_serialize.h /^class TpmSerializable : public keymaster::Serializable {$/;" c namespace:cuttlefish
+Transition host/libs/confui/host_server.cc /^void HostServer::Transition(std::unique_ptr<ConfUiMessage>& input_ptr) {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+Transition host/libs/confui/session.cc /^MainLoopState Session::Transition(SharedFD& hal_cli, const FsmInput fsm_input,$/;" f class:cuttlefish::confui::Session typeref:typename:MainLoopState
+Transmit host/commands/secure_env/in_process_tpm.cpp /^ static TSS2_RC Transmit($/;" f class:cuttlefish::InProcessTpm::Impl typeref:typename:TSS2_RC file:
+Truncate common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::Truncate(off_t length) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+TrustyConfirmationUI guest/hals/confirmationui/TrustyConfirmationUI.cpp /^TrustyConfirmationUI::TrustyConfirmationUI()$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI
+TrustyConfirmationUI guest/hals/confirmationui/TrustyConfirmationUI.h /^class TrustyConfirmationUI : public IConfirmationUI {$/;" c namespace:android::hardware::confirmationui::V1_0::implementation
+Try Cuttlefish README.md /^## Try Cuttlefish$/;" s chapter:Cuttlefish Getting Started
+TxBuffer host/libs/audio_connector/buffers.h /^ TxBuffer(const virtio_snd_pcm_xfer& header, const volatile uint8_t* buffer,$/;" f class:cuttlefish::TxBuffer
+TxBuffer host/libs/audio_connector/buffers.h /^class TxBuffer : public ShmBuffer {$/;" c namespace:cuttlefish
+TxBufferAt host/libs/audio_connector/server.cpp /^const volatile uint8_t* AudioClientConnection::TxBufferAt(size_t offset,$/;" f class:cuttlefish::AudioClientConnection typeref:typename:const volatile uint8_t *
+Type host/libs/confui/cbor.h /^ enum class Type : uint8_t {$/;" g class:cuttlefish::confui::Cbor typeref:typename:uint8_t
+Type host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ WmediumdMessageType Type() const override {$/;" f class:cuttlefish::WmediumdMessageReloadConfig typeref:typename:WmediumdMessageType
+Type host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ WmediumdMessageType Type() const override {$/;" f class:cuttlefish::WmediumdMessageReloadCurrentConfig typeref:typename:WmediumdMessageType
+Type host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ WmediumdMessageType Type() const override {$/;" f class:cuttlefish::WmediumdMessageSetControl typeref:typename:WmediumdMessageType
+Type host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ WmediumdMessageType Type() const override {$/;" f class:cuttlefish::WmediumdMessageSetSnr typeref:typename:WmediumdMessageType
+UID shared/config/cgroups.json /^ "UID": "system",$/;" s object:Cgroups.0
+UNKNOWN guest/hals/ril/reference-libril/ril.h /^ UNKNOWN = 0x00, \/\/ Unknown Radio Access Network$/;" e enum:__anon0bfbaecfa503
+UNKNOWN host/commands/modem_simulator/sup_service.h /^ UNKNOWN = 2,$/;" e enum:cuttlefish::SupService::ClirStatusInfo::ClirStatus
+UNKNOWN_PURPOSE host/libs/config/fetcher_config.h /^ UNKNOWN_PURPOSE = 0,$/;" e enum:cuttlefish::FileSource
+UNLOCK host/commands/modem_simulator/sim_service.h /^ UNLOCK = 0,$/;" e enum:cuttlefish::SimService::FacilityLock::Mode
+UNMANAGED_Dup common/libs/fs/shared_fd.cpp /^int FileInstance::UNMANAGED_Dup() {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+UNMANAGED_Dup2 common/libs/fs/shared_fd.cpp /^int FileInstance::UNMANAGED_Dup2(int newfd) {$/;" f class:cuttlefish::FileInstance typeref:typename:int
+UNVISITED host/libs/config/feature.h /^ enum class Status { UNVISITED, VISITING, VISITED };$/;" e enum:cuttlefish::FeatureSuperclass::TopologicalVisit::Status
+USAGE_MESSAGE host/commands/fetcher/fetch_cvd.cc /^std::string USAGE_MESSAGE =$/;" v namespace:cuttlefish::__anonccb356fd0211 typeref:typename:std::string
+USAGE_MESSAGE host/commands/health/health.cpp /^std::string USAGE_MESSAGE =$/;" v typeref:typename:std::string
+USERIMAGE_PARTITIONS shared/releasetools.py /^USERIMAGE_PARTITIONS = [$/;" v
+USE_CAMERA_STUB shared/BoardConfig.mk /^USE_CAMERA_STUB := true$/;" m
+USE_OPENGL_RENDERER shared/BoardConfig.mk /^USE_OPENGL_RENDERER := true$/;" m
+USIM_DATA_OFFSET_2 guest/hals/ril/reference-ril/reference-ril.c /^#define USIM_DATA_OFFSET_2 /;" d file:
+USIM_DATA_OFFSET_3 guest/hals/ril/reference-ril/reference-ril.c /^#define USIM_DATA_OFFSET_3 /;" d file:
+USIM_FILE_DES_TAG guest/hals/ril/reference-ril/reference-ril.c /^#define USIM_FILE_DES_TAG /;" d file:
+USIM_FILE_SIZE_TAG guest/hals/ril/reference-ril/reference-ril.c /^#define USIM_FILE_SIZE_TAG /;" d file:
+UTRAN guest/hals/ril/reference-libril/ril.h /^ UTRAN = 0x02, \/\/ Universal Terrestrial Radio Access Network$/;" e enum:__anon0bfbaecfa503
+UTRAN_BAND_1 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_1 = 1,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_10 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_10 = 10,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_11 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_11 = 11,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_12 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_12 = 12,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_13 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_13 = 13,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_14 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_14 = 14,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_19 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_19 = 19,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_2 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_2 = 2,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_20 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_20 = 20,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_21 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_21 = 21,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_22 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_22 = 22,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_25 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_25 = 25,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_26 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_26 = 26,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_3 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_3 = 3,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_4 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_4 = 4,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_5 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_5 = 5,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_6 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_6 = 6,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_7 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_7 = 7,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_8 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_8 = 8,$/;" e enum:__anon0bfbaecfa803
+UTRAN_BAND_9 guest/hals/ril/reference-libril/ril.h /^ UTRAN_BAND_9 = 9,$/;" e enum:__anon0bfbaecfa803
+UiOptsToString common/libs/confui/protocol_types.cpp /^std::string ConfUiStartMessage::UiOptsToString() const {$/;" f class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::string
+UnRegisterDevice host/frontend/webrtc_operator/device_registry.cpp /^void DeviceRegistry::UnRegisterDevice(const std::string& device_id) {$/;" f class:cuttlefish::DeviceRegistry typeref:typename:void
+Unauthorized host/libs/websocket/websocket_handler.h /^ Unauthorized = 401,$/;" e enum:cuttlefish::HttpStatusCode
+UnexpectedArgumentGuard common/libs/utils/flag_parser.cpp /^Flag UnexpectedArgumentGuard() {$/;" f namespace:cuttlefish typeref:typename:Flag
+UniqueData host/commands/secure_env/primary_key_builder.cpp /^void PrimaryKeyBuilder::UniqueData(const std::string& data) {$/;" f class:cuttlefish::PrimaryKeyBuilder typeref:typename:void
+UniqueDir host/commands/fetcher/build_api.cc /^using UniqueDir = std::unique_ptr<DIR, CloseDir>;$/;" t namespace:cuttlefish typeref:typename:std::unique_ptr<DIR,CloseDir> file:
+UniqueEsysPtr host/commands/secure_env/tpm_hmac.h /^using UniqueEsysPtr = std::unique_ptr<T, EsysDeleter>;$/;" t namespace:cuttlefish typeref:typename:std::unique_ptr<T,EsysDeleter>
+UnixMessageSocket common/libs/utils/unix_sockets.cpp /^UnixMessageSocket::UnixMessageSocket(SharedFD socket) : socket_(socket) {$/;" f class:cuttlefish::UnixMessageSocket
+UnixMessageSocket common/libs/utils/unix_sockets.h /^class UnixMessageSocket {$/;" c namespace:cuttlefish
+UnixMessageSocketPair common/libs/utils/unix_sockets_test.cpp /^std::pair<UnixMessageSocket, UnixMessageSocket> UnixMessageSocketPair() {$/;" f namespace:cuttlefish typeref:typename:std::pair<UnixMessageSocket,UnixMessageSocket>
+UnixSocketMessage common/libs/utils/unix_sockets.h /^struct UnixSocketMessage {$/;" s namespace:cuttlefish
+Unknown host/libs/config/adb/adb.h /^ Unknown,$/;" e enum:cuttlefish::AdbMode
+Unknown host/libs/config/cuttlefish_config.h /^ Unknown,$/;" e enum:cuttlefish::SecureHal
+UnmarshalFn host/commands/secure_env/tpm_serialize.cpp /^int UnmarshalFn = 0; \/\/ Break code without an explicit specialization.$/;" v namespace:cuttlefish typeref:typename:int
+UnpackBootImage host/commands/assemble_cvd/boot_image_utils.cc /^bool UnpackBootImage(const std::string& boot_image_path,$/;" f namespace:cuttlefish::__anonbfa95aa40111 typeref:typename:bool
+UnpackVendorBootImageIfNotUnpacked host/commands/assemble_cvd/boot_image_utils.cc /^bool UnpackVendorBootImageIfNotUnpacked($/;" f namespace:cuttlefish::__anonbfa95aa40111 typeref:typename:bool
+Unregister host/frontend/webrtc/lib/streamer.cpp /^void Streamer::Unregister() {$/;" f class:cuttlefish::webrtc_streaming::Streamer typeref:typename:void
+UnregisterAudioObserver host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::UnregisterAudioObserver(AudioObserver* observer) {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+UnregisterObserver host/frontend/webrtc/lib/audio_track_source_impl.cpp /^void AudioTrackSourceImpl::UnregisterObserver($/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:void
+UnsetEnvironment common/libs/utils/subprocess.cpp /^void UnsetEnvironment(const std::unordered_set<std::string>& unenv) {$/;" f namespace:cuttlefish::__anon39e8abf00111 typeref:typename:void
+UnsetFromEnvironment common/libs/utils/subprocess.h /^ void UnsetFromEnvironment(const std::vector<std::string>& env) {$/;" f class:cuttlefish::Command typeref:typename:void
+UnsetVideoTrack host/frontend/webrtc/lib/client_handler.cpp /^ void UnsetVideoTrack(webrtc::VideoTrackInterface *track) {$/;" f class:cuttlefish::webrtc_streaming::ClientVideoTrackImpl typeref:typename:void file:
+UnsolResponseInfo guest/hals/ril/reference-libril/ril.cpp /^} UnsolResponseInfo;$/;" t namespace:android typeref:struct:android::__anonf9a2982a0108 file:
+Unsubscribe host/frontend/webrtc/kernel_log_events_handler.cpp /^void KernelLogEventsHandler::Unsubscribe(int subscriber_id) {$/;" f class:cuttlefish::KernelLogEventsHandler typeref:typename:void
+UnvalidatedAlias common/libs/utils/flag_parser.cpp /^Flag Flag::UnvalidatedAlias(const FlagAlias& alias) && {$/;" f class:cuttlefish::Flag typeref:typename:Flag
+UnvalidatedAlias common/libs/utils/flag_parser.cpp /^Flag& Flag::UnvalidatedAlias(const FlagAlias& alias) & {$/;" f class:cuttlefish::Flag typeref:typename:Flag &
+UnvalidatedCreateKeyBlob host/commands/secure_env/tpm_key_blob_maker.cpp /^keymaster_error_t TpmKeyBlobMaker::UnvalidatedCreateKeyBlob($/;" f class:cuttlefish::TpmKeyBlobMaker typeref:typename:keymaster_error_t
+UnwrapKey host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t UnwrapKey($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+UnwrapKey host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::UnwrapKey($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+UnwrapKeyBlob host/commands/secure_env/tpm_key_blob_maker.cpp /^keymaster_error_t TpmKeyBlobMaker::UnwrapKeyBlob($/;" f class:cuttlefish::TpmKeyBlobMaker typeref:typename:keymaster_error_t
+UpdateColorScheme host/libs/confui/host_renderer.cc /^void ConfUiRenderer::UpdateColorScheme(const bool is_inverted) {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:void
+UpdateDeviceList host/frontend/webrtc_operator/assets/js/index.js /^ async #UpdateDeviceList() {$/;" m class:DeviceListApp
+UpdateFlagDefaults host/commands/start/flag_forwarder.cc /^void FlagForwarder::UpdateFlagDefaults() const {$/;" f class:FlagForwarder typeref:typename:void
+UpdateHealthInfo guest/hals/health/health.cpp /^void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) {$/;" f class:android::hardware::health::V2_1::implementation::HealthImpl typeref:typename:void
+UpdateLocale host/libs/confui/host_renderer.cc /^teeui::Error ConfUiRenderer::UpdateLocale() {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Error
+UpdateOperation guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::UpdateOperation(const UpdateOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+UpdateOperation guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::UpdateOperation(const UpdateOperationRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+UpdatePixels host/libs/confui/host_renderer.cc /^teeui::Error ConfUiRenderer::UpdatePixels(TeeUiFrameWrapper& raw_frame,$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Error
+UpdateRegisterState host/commands/modem_simulator/network_service.cpp /^void NetworkService::UpdateRegisterState(RegistrationState state ) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+UpdateString host/libs/confui/host_renderer.cc /^teeui::Error ConfUiRenderer::UpdateString() {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Error
+UpdateTranslations host/libs/confui/host_renderer.cc /^teeui::Error ConfUiRenderer::UpdateTranslations() {$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Error
+UpgradeIntegerTag host/commands/secure_env/tpm_keymaster_context.cpp /^static bool UpgradeIntegerTag($/;" f namespace:cuttlefish typeref:typename:bool file:
+UpgradeKey guest/hals/keymaster/remote/remote_keymaster.cpp /^void RemoteKeymaster::UpgradeKey(const UpgradeKeyRequest& request, UpgradeKeyResponse* response)/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+UpgradeKey guest/hals/keymint/remote/remote_keymaster.cpp /^void RemoteKeymaster::UpgradeKey(const UpgradeKeyRequest& request,$/;" f class:keymaster::RemoteKeymaster typeref:typename:void
+UpgradeKeyBlob host/commands/secure_env/proxy_keymaster_context.h /^ keymaster_error_t UpgradeKeyBlob($/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster_error_t
+UpgradeKeyBlob host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster_error_t TpmKeymasterContext::UpgradeKeyBlob($/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster_error_t
+UserAbort host/libs/confui/session.cc /^void Session::UserAbort(SharedFD hal_cli) {$/;" f class:cuttlefish::confui::Session typeref:typename:void
+UserAbortEvent host/libs/confui/host_server.cc /^void HostServer::UserAbortEvent() {$/;" f class:cuttlefish::confui::HostServer typeref:typename:void
+UserCallbackInfo guest/hals/ril/reference-libril/ril.cpp /^typedef struct UserCallbackInfo {$/;" s namespace:android file:
+UserCallbackInfo guest/hals/ril/reference-libril/ril.cpp /^} UserCallbackInfo;$/;" t namespace:android typeref:struct:android::UserCallbackInfo file:
+UserInGroup host/libs/vm_manager/host_configuration.cpp /^bool UserInGroup(const std::string& group,$/;" f namespace:cuttlefish::vm_manager::__anon1edaaabd0111 typeref:typename:bool
+UserResponse common/libs/confui/protocol_types.h /^struct UserResponse {$/;" s namespace:cuttlefish::confui
+UserType host/commands/metrics/proto/common.proto /^enum UserType {$/;" g
+V1_0 guest/hals/confirmationui/TrustyConfirmationUI.cpp /^namespace V1_0 {$/;" n namespace:android::hardware::confirmationui file:
+V1_0 guest/hals/confirmationui/TrustyConfirmationUI.h /^namespace V1_0 {$/;" n namespace:android::hardware::confirmationui
+V1_0 guest/hals/confirmationui/guest_session.cpp /^namespace V1_0 {$/;" n namespace:android::hardware::confirmationui file:
+V1_0 guest/hals/confirmationui/guest_session.h /^namespace V1_0 {$/;" n namespace:android::hardware::confirmationui
+V1_0 guest/hals/confirmationui/include/TrustyConfirmationuiHal.h /^namespace V1_0 {$/;" n namespace:android::hardware::confirmationui
+V1_1 guest/hals/bt/remote/remote_bluetooth.cpp /^namespace V1_1 {$/;" n namespace:android::hardware::bluetooth file:
+V1_1 guest/hals/bt/remote/remote_bluetooth.h /^namespace V1_1 {$/;" n namespace:android::hardware::bluetooth
+V2_1 guest/hals/health/health.cpp /^namespace V2_1 {$/;" n namespace:android::hardware::health file:
+V2_7 guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider file:
+V2_7 guest/hals/camera/vsock_camera_provider_2_7.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider
+V2_7 guest/hals/camera/vsock_camera_server.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider file:
+V2_7 guest/hals/camera/vsock_camera_server.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider
+V3_4 guest/hals/camera/cached_stream_buffer.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device file:
+V3_4 guest/hals/camera/cached_stream_buffer.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device
+V3_4 guest/hals/camera/stream_buffer_cache.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device file:
+V3_4 guest/hals/camera/stream_buffer_cache.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device
+V3_4 guest/hals/camera/vsock_camera_device_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device file:
+V3_4 guest/hals/camera/vsock_camera_device_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device
+V3_4 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device file:
+V3_4 guest/hals/camera/vsock_camera_device_session_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device
+V3_4 guest/hals/camera/vsock_camera_metadata.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device file:
+V3_4 guest/hals/camera/vsock_camera_metadata.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device
+V4_1 guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^namespace V4_1 {$/;" n namespace:keymaster file:
+V4_1 guest/hals/keymaster/remote/remote_keymaster4_device.h /^namespace V4_1 {$/;" n namespace:keymaster
+VBMETA_MAX_SIZE host/commands/assemble_cvd/disk_flags.cc /^#define VBMETA_MAX_SIZE /;" d file:
+VDBG guest/hals/ril/reference-libril/ril_internal.h /^#define VDBG /;" d
+VENDOR_SECURITY_PATCH shared/device.mk /^VENDOR_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)$/;" m
+VIOS_VERSION host/libs/audio_connector/shm_layout.h /^const uint32_t VIOS_VERSION = 2;$/;" v namespace:cuttlefish typeref:typename:const uint32_t
+VIRTIO_SND_CHMAP_BC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_BC, \/* bottom center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_BLC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_BLC, \/* bottom left center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_BRC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_BRC \/* bottom right center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FC, \/* front center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FCH host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FCH, \/* front center high *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FL host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FL, \/* front left *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FLC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FLC, \/* front left center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FLH host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FLH, \/* front left high *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FLW host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FLW, \/* front left wide *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FR, \/* front right *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FRC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FRC, \/* front right center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FRH host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FRH, \/* front right high *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_FRW host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_FRW, \/* front right wide *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_LFE host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_LFE, \/* low frequency (LFE) *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_LLFE host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_LLFE, \/* left LFE *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_MAX_SIZE host/libs/audio_connector/shm_layout.h /^constexpr uint8_t VIRTIO_SND_CHMAP_MAX_SIZE = 18;$/;" v namespace:cuttlefish typeref:typename:uint8_t
+VIRTIO_SND_CHMAP_MONO host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_MONO, \/* mono stream *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_NA host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_NA, \/* silent *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_NONE host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_NONE = 0, \/* undefined *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_RC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_RC, \/* rear center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_RL host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_RL, \/* rear left *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_RLC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_RLC, \/* rear left center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_RLFE host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_RLFE, \/* right LFE *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_RR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_RR, \/* rear right *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_RRC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_RRC, \/* rear right center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_SL host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_SL, \/* side left *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_SR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_SR, \/* side right *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TC, \/* top center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TFC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TFC, \/* top front center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TFL host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TFL, \/* top front left *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TFLC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TFLC, \/* top front left center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TFR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TFR, \/* top front right *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TFRC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TFRC, \/* top front right center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TRC host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TRC, \/* top rear center *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TRL host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TRL, \/* top rear left *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TRR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TRR, \/* top rear right *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TSL host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TSL, \/* top side left *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_CHMAP_TSR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_CHMAP_TSR, \/* top side right *\/$/;" e enum:cuttlefish::AudioChannelMap
+VIRTIO_SND_D_INPUT host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_D_INPUT$/;" e enum:cuttlefish::AudioStreamDirection
+VIRTIO_SND_D_OUTPUT host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_D_OUTPUT = 0,$/;" e enum:cuttlefish::AudioStreamDirection
+VIRTIO_SND_JACK_F_REMAP host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_JACK_F_REMAP = 0$/;" e enum:cuttlefish::AudioJackFeatures
+VIRTIO_SND_PCM_FMT_A_LAW host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_A_LAW, \/* 8 \/ 8 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_DSD_U16 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_DSD_U16, \/* 16 \/ 16 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_DSD_U32 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_DSD_U32, \/* 32 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_DSD_U8 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_DSD_U8, \/* 8 \/ 8 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_FLOAT host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_FLOAT, \/* 32 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_FLOAT64 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_FLOAT64, \/* 64 \/ 64 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME \/* 32 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_IMA_ADPCM host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0, \/* 4 \/ 4 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_MU_LAW host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_MU_LAW, \/* 8 \/ 8 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S16 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S16, \/* 16 \/ 16 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S18_3 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S18_3, \/* 18 \/ 24 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S20 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S20, \/* 20 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S20_3 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S20_3, \/* 20 \/ 24 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S24 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S24, \/* 24 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S24_3 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S24_3, \/* 24 \/ 24 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S32 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S32, \/* 32 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_S8 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_S8, \/* 8 \/ 8 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U16 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U16, \/* 16 \/ 16 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U18_3 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U18_3, \/* 18 \/ 24 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U20 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U20, \/* 20 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U20_3 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U20_3, \/* 20 \/ 24 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U24 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U24, \/* 24 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U24_3 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U24_3, \/* 24 \/ 24 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U32 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U32, \/* 32 \/ 32 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_FMT_U8 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_FMT_U8, \/* 8 \/ 8 bits *\/$/;" e enum:cuttlefish::AudioStreamFormat
+VIRTIO_SND_PCM_RATE_11025 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_11025,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_16000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_16000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_176400 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_176400,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_192000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_192000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_22050 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_22050,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_32000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_32000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_384000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_384000$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_44100 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_44100,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_48000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_48000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_5512 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_5512 = 0,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_64000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_64000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_8000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_8000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_88200 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_88200,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_PCM_RATE_96000 host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_PCM_RATE_96000,$/;" e enum:cuttlefish::AudioStreamRate
+VIRTIO_SND_R_CHMAP_INFO host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_CHMAP_INFO = 0x0200,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_JACK_INFO host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_JACK_INFO = 1,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_JACK_REMAP host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_JACK_REMAP,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_PCM_INFO host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_PCM_INFO = 0x0100,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_PCM_PREPARE host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_PCM_PREPARE,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_PCM_RELEASE host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_PCM_RELEASE,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_PCM_SET_PARAMS host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_PCM_SET_PARAMS,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_PCM_START host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_PCM_START,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_R_PCM_STOP host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_R_PCM_STOP,$/;" e enum:cuttlefish::AudioCommandType
+VIRTIO_SND_S_BAD_MSG host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_S_BAD_MSG,$/;" e enum:cuttlefish::AudioStatus
+VIRTIO_SND_S_IO_ERR host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_S_IO_ERR,$/;" e enum:cuttlefish::AudioStatus
+VIRTIO_SND_S_NOT_SUPP host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_S_NOT_SUPP,$/;" e enum:cuttlefish::AudioStatus
+VIRTIO_SND_S_OK host/libs/audio_connector/shm_layout.h /^ VIRTIO_SND_S_OK = 0x8000,$/;" e enum:cuttlefish::AudioStatus
+VIRTUAL_DEVICE_BOOT_COMPLETED guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String VIRTUAL_DEVICE_BOOT_COMPLETED = "VIRTUAL_DEVICE_BOOT_COMPLETED";$/;" f class:EventReporter file:
+VIRTUAL_DEVICE_BOOT_FAILED guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String VIRTUAL_DEVICE_BOOT_FAILED = "VIRTUAL_DEVICE_BOOT_FAILED";$/;" f class:EventReporter file:
+VIRTUAL_DEVICE_BOOT_PENDING guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String VIRTUAL_DEVICE_BOOT_PENDING = "VIRTUAL_DEVICE_BOOT_PENDING";$/;" f class:EventReporter file:
+VIRTUAL_DEVICE_BOOT_STARTED guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String VIRTUAL_DEVICE_BOOT_STARTED = "VIRTUAL_DEVICE_BOOT_STARTED";$/;" f class:EventReporter file:
+VIRTUAL_DEVICE_SCREEN_CHANGED guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private static final String VIRTUAL_DEVICE_SCREEN_CHANGED = "VIRTUAL_DEVICE_SCREEN_CHANGED";$/;" f class:EventReporter file:
+VISITED host/libs/config/feature.h /^ enum class Status { UNVISITED, VISITING, VISITED };$/;" e enum:cuttlefish::FeatureSuperclass::TopologicalVisit::Status
+VISITING host/libs/config/feature.h /^ enum class Status { UNVISITED, VISITING, VISITED };$/;" e enum:cuttlefish::FeatureSuperclass::TopologicalVisit::Status
+VMADDR_CID_ANY common/libs/fs/vm_sockets.h /^#define VMADDR_CID_ANY /;" d
+VMADDR_CID_HOST common/libs/fs/vm_sockets.h /^#define VMADDR_CID_HOST /;" d
+VMADDR_CID_HYPERVISOR common/libs/fs/vm_sockets.h /^#define VMADDR_CID_HYPERVISOR /;" d
+VMADDR_CID_RESERVED common/libs/fs/vm_sockets.h /^#define VMADDR_CID_RESERVED /;" d
+VMADDR_PORT_ANY common/libs/fs/vm_sockets.h /^#define VMADDR_PORT_ANY /;" d
+VM_SOCKETS_INVALID_VERSION common/libs/fs/vm_sockets.h /^#define VM_SOCKETS_INVALID_VERSION /;" d
+VM_SOCKETS_VERSION_EPOCH common/libs/fs/vm_sockets.h /^#define VM_SOCKETS_VERSION_EPOCH(/;" d
+VM_SOCKETS_VERSION_MAJOR common/libs/fs/vm_sockets.h /^#define VM_SOCKETS_VERSION_MAJOR(/;" d
+VM_SOCKETS_VERSION_MINOR common/libs/fs/vm_sockets.h /^#define VM_SOCKETS_VERSION_MINOR(/;" d
+VOICE host/commands/modem_simulator/sim_service.h /^ VOICE = 1 << 0, \/\/ telephony$/;" e enum:cuttlefish::SimService::FacilityLock::Class
+VP8OnlyEncoderFactory host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^VP8OnlyEncoderFactory::VP8OnlyEncoderFactory($/;" f class:cuttlefish::webrtc_streaming::VP8OnlyEncoderFactory
+VP8OnlyEncoderFactory host/frontend/webrtc/lib/vp8only_encoder_factory.h /^class VP8OnlyEncoderFactory : public webrtc::VideoEncoderFactory {$/;" c namespace:cuttlefish::webrtc_streaming
+VSOC_WPA_SUPPLICANT_DEBUG guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^#define VSOC_WPA_SUPPLICANT_DEBUG /;" d
+VSoCInputService guest/commands/vsoc_input_service/vsoc_input_service.h /^class VSoCInputService {$/;" c namespace:cuttlefish_input_service
+ValidMacAddr host/commands/wmediumd_control/main.cpp /^bool ValidMacAddr(const std::string& macAddr) {$/;" f typeref:typename:bool
+ValidateAlias common/libs/utils/flag_parser.cpp /^void Flag::ValidateAlias(const FlagAlias& alias) {$/;" f class:cuttlefish::Flag typeref:typename:void
+ValidateConfigRequest host/libs/allocd/resource_manager.cpp /^bool ResourceManager::ValidateConfigRequest(const Json::Value& config) {$/;" f class:cuttlefish::ResourceManager typeref:typename:bool
+ValidateField host/frontend/webrtc/lib/utils.cpp /^std::string ValidateField(const Json::Value &obj, const std::string &type,$/;" f namespace:cuttlefish::webrtc_streaming::__anon2c505fdf0111 typeref:typename:std::string
+ValidateHostConfiguration host/libs/vm_manager/host_configuration.cpp /^bool ValidateHostConfiguration(std::vector<std::string>* config_commands) {$/;" f namespace:cuttlefish::vm_manager typeref:typename:bool
+ValidateHostConfigurationFeature host/commands/run_cvd/validate.cpp /^class ValidateHostConfigurationFeature : public Feature {$/;" c namespace:cuttlefish::__anon8d12954e0111 file:
+ValidateJsonObject host/frontend/webrtc/lib/utils.cpp /^ValidationResult ValidationResult::ValidateJsonObject($/;" f class:cuttlefish::webrtc_streaming::ValidationResult typeref:typename:ValidationResult
+ValidateMetricsConfirmation host/commands/start/main.cc /^std::string ValidateMetricsConfirmation(std::string use_metrics) {$/;" f namespace:__anon8e1e78490111 typeref:typename:std::string
+ValidateRequest host/libs/allocd/resource_manager.cpp /^bool ResourceManager::ValidateRequest(const Json::Value& request) {$/;" f class:cuttlefish::ResourceManager typeref:typename:bool
+ValidateRequestList host/libs/allocd/resource_manager.cpp /^bool ResourceManager::ValidateRequestList(const Json::Value& config) {$/;" f class:cuttlefish::ResourceManager typeref:typename:bool
+ValidateTapDevices host/commands/run_cvd/validate.cpp /^class ValidateTapDevices : public Feature {$/;" c namespace:cuttlefish::__anon8d12954e0111 file:
+ValidateTokenSignature host/commands/secure_env/tpm_keymaster_enforcement.cpp /^bool TpmKeymasterEnforcement::ValidateTokenSignature($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:bool
+ValidationResult host/frontend/webrtc/lib/utils.h /^ ValidationResult(const std::string &error) : error_(error) {}$/;" f class:cuttlefish::webrtc_streaming::ValidationResult
+ValidationResult host/frontend/webrtc/lib/utils.h /^class ValidationResult {$/;" c namespace:cuttlefish::webrtc_streaming
+Value shared/config/task_profiles.json /^ "Value": "100"$/;" s object:Profiles.29.Actions.1.Params
+Value shared/config/task_profiles.json /^ "Value": "150"$/;" s object:Profiles.28.Actions.1.Params
+Value shared/config/task_profiles.json /^ "Value": "16MB"$/;" s object:Profiles.28.Actions.0.Params
+Value shared/config/task_profiles.json /^ "Value": "512MB"$/;" s object:Profiles.29.Actions.0.Params
+VehicleHalGrpcServerBinary host/libs/config/known_paths.cpp /^std::string VehicleHalGrpcServerBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+VehicleHalServer host/commands/run_cvd/launch.cc /^class VehicleHalServer : public CommandSource {$/;" c namespace:cuttlefish file:
+Verbose common/libs/utils/subprocess.h /^ bool Verbose() const { return verbose_; }$/;" f class:cuttlefish::SubprocessOptions typeref:typename:bool
+Verbose common/libs/utils/subprocess.h /^ void Verbose(bool verbose) {$/;" f class:cuttlefish::SubprocessOptions typeref:typename:void
+VerificationData host/commands/secure_env/tpm_keymaster_enforcement.cpp /^ struct VerificationData {$/;" s function:cuttlefish::TpmKeymasterEnforcement::VerifyAuthorization file:
+VerifiedBootParams host/commands/secure_env/tpm_attestation_record.cpp /^using VerifiedBootParams = keymaster::AttestationContext::VerifiedBootParams;$/;" t namespace:cuttlefish::__anon03bde2800111 typeref:typename:keymaster::AttestationContext::VerifiedBootParams file:
+VerifyAndCopyDeviceIds host/commands/secure_env/tpm_attestation_record.cpp /^keymaster_error_t TpmAttestationRecordContext::VerifyAndCopyDeviceIds($/;" f class:cuttlefish::TpmAttestationRecordContext typeref:typename:keymaster_error_t
+VerifyAuthorization guest/hals/keymaster/remote/remote_keymaster.cpp /^VerifyAuthorizationResponse RemoteKeymaster::VerifyAuthorization($/;" f class:keymaster::RemoteKeymaster typeref:typename:VerifyAuthorizationResponse
+VerifyAuthorization guest/hals/keymint/remote/remote_keymaster.cpp /^VerifyAuthorizationResponse RemoteKeymaster::VerifyAuthorization($/;" f class:keymaster::RemoteKeymaster typeref:typename:VerifyAuthorizationResponse
+VerifyAuthorization host/commands/secure_env/tpm_keymaster_enforcement.cpp /^VerifyAuthorizationResponse TpmKeymasterEnforcement::VerifyAuthorization($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:VerifyAuthorizationResponse
+VerifyFast host/commands/secure_env/soft_gatekeeper.h /^ bool VerifyFast(const fast_hash_t& fast_hash, const SizedBuffer& password) {$/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+VerifyPIN host/commands/modem_simulator/sim_service.cpp /^bool SimService::PinStatus::VerifyPIN(const std::string_view pin) {$/;" f class:cuttlefish::SimService::PinStatus typeref:typename:bool
+VerifyPUK host/commands/modem_simulator/sim_service.cpp /^bool SimService::PinStatus::VerifyPUK(const std::string_view puk) {$/;" f class:cuttlefish::SimService::PinStatus typeref:typename:bool
+VersionedAidlPackage tests/hal/hal_implementation_test.cpp /^struct VersionedAidlPackage {$/;" s file:
+VideoFrameBuffer host/frontend/webrtc/lib/video_frame_buffer.h /^class VideoFrameBuffer {$/;" c namespace:cuttlefish::webrtc_streaming
+VideoFrameWrapper host/frontend/webrtc/lib/video_track_source_impl.cpp /^ VideoFrameWrapper($/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper file:
+VideoFrameWrapper host/frontend/webrtc/lib/video_track_source_impl.cpp /^class VideoFrameWrapper : public webrtc::I420BufferInterface {$/;" c namespace:cuttlefish::webrtc_streaming::__anone9f9f83a0111 file:
+VideoSink host/frontend/webrtc/lib/video_sink.h /^class VideoSink {$/;" c namespace:cuttlefish::webrtc_streaming
+VideoTrackSourceImpl host/frontend/webrtc/lib/video_track_source_impl.cpp /^VideoTrackSourceImpl::VideoTrackSourceImpl(int width, int height)$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl
+VideoTrackSourceImpl host/frontend/webrtc/lib/video_track_source_impl.h /^class VideoTrackSourceImpl : public webrtc::VideoTrackSource {$/;" c namespace:cuttlefish::webrtc_streaming
+VideoTrackSourceImplSinkWrapper host/frontend/webrtc/lib/video_track_source_impl.h /^ VideoTrackSourceImplSinkWrapper(rtc::scoped_refptr<VideoTrackSourceImpl> obj)$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImplSinkWrapper
+VideoTrackSourceImplSinkWrapper host/frontend/webrtc/lib/video_track_source_impl.h /^class VideoTrackSourceImplSinkWrapper : public VideoSink {$/;" c namespace:cuttlefish::webrtc_streaming
+VioSConfig host/libs/audio_connector/shm_layout.h /^struct VioSConfig {$/;" s namespace:cuttlefish
+VirtioGpuMetadata host/libs/wayland/wayland_surface.h /^ struct VirtioGpuMetadata {$/;" s class:wayland::Surface
+VirtualDeviceBase guest/commands/vsoc_input_service/virtual_device_base.cpp /^VirtualDeviceBase::VirtualDeviceBase(const char* device_name,$/;" f class:VirtualDeviceBase
+VirtualDeviceBase guest/commands/vsoc_input_service/virtual_device_base.h /^class VirtualDeviceBase {$/;" c namespace:cuttlefish_input_service
+VirtualKeyboard guest/commands/vsoc_input_service/virtual_keyboard.cpp /^VirtualKeyboard::VirtualKeyboard()$/;" f class:cuttlefish_input_service::VirtualKeyboard
+VirtualKeyboard guest/commands/vsoc_input_service/virtual_keyboard.h /^class VirtualKeyboard : public VirtualDeviceBase {$/;" c namespace:cuttlefish_input_service
+VirtualPowerButton guest/commands/vsoc_input_service/virtual_power_button.cpp /^VirtualPowerButton::VirtualPowerButton()$/;" f class:cuttlefish_input_service::VirtualPowerButton
+VirtualPowerButton guest/commands/vsoc_input_service/virtual_power_button.h /^class VirtualPowerButton : public VirtualDeviceBase {$/;" c namespace:cuttlefish_input_service
+VirtualTouchScreen guest/commands/vsoc_input_service/virtual_touchscreen.cpp /^VirtualTouchScreen::VirtualTouchScreen(uint32_t width, uint32_t height)$/;" f class:cuttlefish_input_service::VirtualTouchScreen
+VirtualTouchScreen guest/commands/vsoc_input_service/virtual_touchscreen.h /^class VirtualTouchScreen : public VirtualDeviceBase {$/;" c namespace:cuttlefish_input_service
+VmManager host/libs/vm_manager/vm_manager.h /^class VmManager {$/;" c namespace:cuttlefish::vm_manager
+VmManagerBootconfig host/libs/config/bootconfig_args.cpp /^std::vector<std::string> VmManagerBootconfig(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish::__anond90bdb570111 typeref:typename:std::vector<std::string>
+VmManagerComponent host/libs/vm_manager/vm_manager.cpp /^VmManagerComponent() {$/;" f namespace:cuttlefish::vm_manager typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig>,VmManager>
+VmManagerKernelCmdline host/libs/config/kernel_args.cpp /^std::vector<std::string> VmManagerKernelCmdline(const CuttlefishConfig& config) {$/;" f namespace:cuttlefish::__anonfb53392e0111 typeref:typename:std::vector<std::string>
+VmmCommands host/commands/run_cvd/launch.cc /^class VmmCommands : public CommandSource {$/;" c namespace:cuttlefish file:
+VmmType host/commands/metrics/proto/cf_metrics_event.proto /^ enum VmmType {$/;" g message:cuttlefish.MetricsEvent
+VsockCameraDevice guest/hals/camera/vsock_camera_device_3_4.cpp /^VsockCameraDevice::VsockCameraDevice($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice
+VsockCameraDevice guest/hals/camera/vsock_camera_device_3_4.h /^class VsockCameraDevice : public ICameraDevice {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+VsockCameraDeviceSession guest/hals/camera/vsock_camera_device_session_3_4.cpp /^VsockCameraDeviceSession::VsockCameraDeviceSession($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession
+VsockCameraDeviceSession guest/hals/camera/vsock_camera_device_session_3_4.h /^class VsockCameraDeviceSession : public ICameraDeviceSession {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+VsockCameraMetadata guest/hals/camera/vsock_camera_metadata.cpp /^VsockCameraMetadata::VsockCameraMetadata(int32_t width, int32_t height,$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata
+VsockCameraMetadata guest/hals/camera/vsock_camera_metadata.h /^class VsockCameraMetadata : public CameraMetadata {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+VsockCameraProvider guest/hals/camera/vsock_camera_provider_2_7.cpp /^VsockCameraProvider::VsockCameraProvider(VsockCameraServer* server) {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider
+VsockCameraProvider guest/hals/camera/vsock_camera_provider_2_7.h /^class VsockCameraProvider : public ICameraProvider {$/;" c namespace:android::hardware::camera::provider::V2_7::implementation
+VsockCameraRequestMetadata guest/hals/camera/vsock_camera_metadata.cpp /^VsockCameraRequestMetadata::VsockCameraRequestMetadata(int32_t fps,$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraRequestMetadata
+VsockCameraRequestMetadata guest/hals/camera/vsock_camera_metadata.h /^class VsockCameraRequestMetadata : public CameraMetadata {$/;" c namespace:android::hardware::camera::device::V3_4::implementation
+VsockCameraServer guest/hals/camera/vsock_camera_server.cpp /^VsockCameraServer::VsockCameraServer() {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer
+VsockCameraServer guest/hals/camera/vsock_camera_server.h /^class VsockCameraServer {$/;" c namespace:android::hardware::camera::provider::V2_7::implementation
+VsockClient common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::VsockClient(unsigned int cid, unsigned int port, int type) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+VsockClientConnection common/libs/utils/vsock_connection.h /^class VsockClientConnection : public VsockConnection {$/;" c namespace:cuttlefish
+VsockConnection common/libs/utils/vsock_connection.h /^class VsockConnection {$/;" c namespace:cuttlefish
+VsockConnectorEnabled host/libs/config/adb/launch.cpp /^ bool VsockConnectorEnabled() const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:bool file:
+VsockFrameProvider guest/hals/camera/vsock_frame_provider.h /^class VsockFrameProvider {$/;" c namespace:cuttlefish
+VsockHalfTunnel host/libs/config/adb/adb.h /^ VsockHalfTunnel,$/;" e enum:cuttlefish::AdbMode
+VsockHalfTunnelEnabled host/libs/config/adb/launch.cpp /^ bool VsockHalfTunnelEnabled() const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:bool file:
+VsockReadLoop guest/hals/camera/vsock_frame_provider.cpp /^void VsockFrameProvider::VsockReadLoop(uint32_t width, uint32_t height) {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:void
+VsockRequestComparator guest/hals/camera/vsock_camera_device_session_3_4.h /^ struct VsockRequestComparator {$/;" s class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession
+VsockSendYUVFrame host/frontend/webrtc/lib/camera_streamer.cpp /^bool CameraStreamer::VsockSendYUVFrame($/;" f class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:bool
+VsockServer common/frontend/socket_vsock_proxy/main.cpp /^[[noreturn]] void VsockServer() {$/;" f namespace:__anon913036200111 typeref:typename:void
+VsockServer common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::VsockServer(int type) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+VsockServer common/libs/fs/shared_fd.cpp /^SharedFD SharedFD::VsockServer(unsigned int port, int type, unsigned int cid) {$/;" f class:cuttlefish::SharedFD typeref:typename:SharedFD
+VsockServerConnection common/libs/utils/vsock_connection.h /^class VsockServerConnection : public VsockConnection {$/;" c namespace:cuttlefish
+VsockServerPort common/libs/fs/shared_fd.cpp /^unsigned int FileInstance::VsockServerPort() {$/;" f class:cuttlefish::FileInstance typeref:typename:unsigned int
+VsockToSocket common/frontend/socket_vsock_proxy/main.cpp /^void VsockToSocket(SocketSender socket_sender,$/;" f namespace:__anon913036200111 typeref:typename:void
+VsockTunnel host/libs/config/adb/adb.h /^ VsockTunnel,$/;" e enum:cuttlefish::AdbMode
+VsockTunnelEnabled host/libs/config/adb/launch.cpp /^ bool VsockTunnelEnabled() const {$/;" f class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:bool file:
+WAKE_PARTIAL guest/hals/ril/reference-libril/ril.cpp /^enum WakeType {DONT_WAKE, WAKE_PARTIAL};$/;" e enum:android::WakeType file:
+WAKE_PARTIAL guest/hals/ril/reference-libril/ril_ex.h /^enum SocketWakeType {DONT_WAKE, WAKE_PARTIAL};$/;" e enum:SocketWakeType
+WCDMA guest/hals/ril/reference-ril/reference-ril.c /^#define WCDMA /;" d file:
+WCDMA_SignalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_SignalStrengthWcdma WCDMA_SignalStrength;$/;" m struct:__anon0bfbaecf5308 typeref:typename:RIL_SignalStrengthWcdma
+WIFI_CONNECTED_MESSAGE guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private static final String WIFI_CONNECTED_MESSAGE =$/;" f class:GceWifiManager file:
+WIFI_DRIVER_FW_PATH_AP shared/BoardConfig.mk /^WIFI_DRIVER_FW_PATH_AP := "\/dev\/null"$/;" m
+WIFI_DRIVER_FW_PATH_PARAM shared/BoardConfig.mk /^WIFI_DRIVER_FW_PATH_PARAM := "\/dev\/null"$/;" m
+WIFI_DRIVER_FW_PATH_STA shared/BoardConfig.mk /^WIFI_DRIVER_FW_PATH_STA := "\/dev\/null"$/;" m
+WIFI_HIDL_FEATURE_DUAL_INTERFACE shared/BoardConfig.mk /^WIFI_HIDL_FEATURE_DUAL_INTERFACE := true$/;" m
+WIFI_RECONNECTION_TIMEOUT_S guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private static final int WIFI_RECONNECTION_TIMEOUT_S = 5;$/;" f class:GceWifiManager file:
+WIN32_LEAN_AND_MEAN host/libs/graphics_detector/include/EGL/eglplatform.h /^#define WIN32_LEAN_AND_MEAN /;" d
+WITH_PIN host/commands/modem_simulator/sim_service.h /^ enum ChangeMode {WITH_PIN, WITH_PUK};$/;" e enum:cuttlefish::SimService::PinStatus::ChangeMode
+WITH_PUK host/commands/modem_simulator/sim_service.h /^ enum ChangeMode {WITH_PIN, WITH_PUK};$/;" e enum:cuttlefish::SimService::PinStatus::ChangeMode
+WLAN guest/hals/ril/reference-libril/ril.h /^ WLAN = 2, \/* Key type to be used for WLAN *\/$/;" e enum:__anon0bfbaecf2b03
+WORKAROUND_ERRONEOUS_ANSWER guest/hals/ril/reference-ril/reference-ril.c /^#define WORKAROUND_ERRONEOUS_ANSWER /;" d file:
+WORKAROUND_FAKE_CGEV guest/hals/ril/reference-ril/reference-ril.c /^#define WORKAROUND_FAKE_CGEV /;" d file:
+WPA_SRC_FILE guest/libs/wpa_supplicant_8_lib/Android.mk /^WPA_SRC_FILE :=$/;" m
+WPA_SUPPLICANT_VERSION shared/BoardConfig.mk /^WPA_SUPPLICANT_VERSION := VER_0_8_X$/;" m
+WPA_SUPPL_DIR guest/libs/wpa_supplicant_8_lib/Android.mk /^WPA_SUPPL_DIR = external\/wpa_supplicant_8$/;" m
+WPA_SUPPL_DIR_INCLUDE guest/libs/wpa_supplicant_8_lib/Android.mk /^WPA_SUPPL_DIR_INCLUDE = $(WPA_SUPPL_DIR)\/src \\$/;" m
+Wait common/libs/utils/subprocess.cpp /^int Subprocess::Wait() {$/;" f class:cuttlefish::Subprocess typeref:typename:int
+Wait common/libs/utils/subprocess.cpp /^pid_t Subprocess::Wait(int* wstatus, int options) {$/;" f class:cuttlefish::Subprocess typeref:typename:pid_t
+WaitAndroidMode host/libs/confui/host_mode_ctrl.h /^ void WaitAndroidMode() {$/;" f class:cuttlefish::HostModeCtrl typeref:typename:void
+WaitAndroidMode host/libs/screen_connector/screen_connector_ctrl.h /^ void WaitAndroidMode() {$/;" f class:cuttlefish::ScreenConnectorCtrl typeref:typename:void
+WaitEmpty host/libs/screen_connector/screen_connector_queue.h /^ void WaitEmpty() {$/;" f class:cuttlefish::ScreenConnectorQueue typeref:typename:void
+WaitForAdbDisconnection host/frontend/adb_connector/adb_connection_maintainer.cpp /^void WaitForAdbDisconnection(const std::string& address) {$/;" f namespace:__anon734383cf0111 typeref:typename:void
+WaitForAdbdToBeStarted common/frontend/socket_vsock_proxy/main.cpp /^void WaitForAdbdToBeStarted(int events_fd) {$/;" f namespace:__anon913036200111 typeref:typename:void
+WakeType guest/hals/ril/reference-libril/ril.cpp /^enum WakeType {DONT_WAKE, WAKE_PARTIAL};$/;" g namespace:android file:
+WakeupFromSleep host/commands/modem_simulator/network_service.cpp /^bool NetworkService::WakeupFromSleep() {$/;" f class:cuttlefish::NetworkService typeref:typename:bool
+WarnOnFail tools/create_base_image.go /^ WarnOnFail$/;" c package:main
+WaylandScreenConnector host/libs/screen_connector/wayland_screen_connector.cpp /^WaylandScreenConnector::WaylandScreenConnector(int frames_fd) {$/;" f class:cuttlefish::WaylandScreenConnector
+WaylandScreenConnector host/libs/screen_connector/wayland_screen_connector.h /^class WaylandScreenConnector {$/;" c namespace:cuttlefish
+WaylandServer host/libs/wayland/wayland_server.cpp /^WaylandServer::WaylandServer(int wayland_socket_fd) {$/;" f class:wayland::WaylandServer
+WaylandServer host/libs/wayland/wayland_server.h /^class WaylandServer {$/;" c namespace:wayland
+WaylandServerState host/libs/wayland/wayland_server.cpp /^struct WaylandServerState {$/;" s namespace:wayland::internal file:
+WeakFD common/libs/fs/shared_fd.h /^ WeakFD(SharedFD shared_fd) : value_(shared_fd.value_) {}$/;" f class:cuttlefish::WeakFD
+WeakFD common/libs/fs/shared_fd.h /^class WeakFD {$/;" c namespace:cuttlefish
+WebRtcBinary host/libs/config/known_paths.cpp /^std::string WebRtcBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+WebRtcComponent host/frontend/webrtc/main.cpp /^fruit::Component<cuttlefish::CustomActionConfigProvider> WebRtcComponent() {$/;" f typeref:typename:fruit::Component<cuttlefish::CustomActionConfigProvider>
+WebRtcScProcessedFrame host/frontend/webrtc/display_handler.h /^struct WebRtcScProcessedFrame : public ScreenConnectorFrameInfo {$/;" s namespace:cuttlefish
+WebRtcServer host/commands/run_cvd/launch_streamer.cpp /^class WebRtcServer : public virtual CommandSource,$/;" c namespace:cuttlefish::__anon6b0274e10111 file:
+WebRtcSigServerBinary host/libs/config/known_paths.cpp /^std::string WebRtcSigServerBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+WebSocketHandler host/libs/websocket/websocket_handler.cpp /^WebSocketHandler::WebSocketHandler(struct lws* wsi) : wsi_(wsi) {}$/;" f class:cuttlefish::WebSocketHandler
+WebSocketHandler host/libs/websocket/websocket_handler.h /^class WebSocketHandler {$/;" c namespace:cuttlefish
+WebSocketHandlerFactory host/libs/websocket/websocket_handler.h /^class WebSocketHandlerFactory {$/;" c namespace:cuttlefish
+WebSocketServer host/libs/websocket/websocket_server.cpp /^WebSocketServer::WebSocketServer(const char* protocol_name,$/;" f class:cuttlefish::WebSocketServer
+WebSocketServer host/libs/websocket/websocket_server.h /^class WebSocketServer {$/;" c namespace:cuttlefish
+WebsocketCallback host/libs/websocket/websocket_server.cpp /^int WebSocketServer::WebsocketCallback(struct lws* wsi,$/;" f class:cuttlefish::WebSocketServer typeref:typename:int
+WebsocketConnector host/frontend/webrtc_operator/assets/js/server_connector.js /^class WebsocketConnector extends Connector {$/;" c
+Width host/libs/confui/host_renderer.h /^ int Width() const { return w_; }$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:int
+WifiE2eTests tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^public class WifiE2eTests {$/;" c
+WifiNetworkConnected host/commands/kernel_log_monitor/kernel_log_server.h /^ WifiNetworkConnected = 3,$/;" e enum:monitor::Event
+WithServerErrorRetry host/commands/fetcher/curl_wrapper.cc /^\/* static *\/ std::unique_ptr<CurlWrapper> CurlWrapper::WithServerErrorRetry($/;" f class:cuttlefish::CurlWrapper typeref:typename:std::unique_ptr<CurlWrapper>
+WmediumdBinary host/libs/config/known_paths.cpp /^std::string WmediumdBinary() { return HostBinaryPath("wmediumd"); }$/;" f namespace:cuttlefish typeref:typename:std::string
+WmediumdController host/libs/wmediumd_controller/wmediumd_controller.h /^ WmediumdController() {}$/;" f class:cuttlefish::WmediumdController
+WmediumdController host/libs/wmediumd_controller/wmediumd_controller.h /^class WmediumdController {$/;" c namespace:cuttlefish
+WmediumdGenConfigBinary host/libs/config/known_paths.cpp /^std::string WmediumdGenConfigBinary() {$/;" f namespace:cuttlefish typeref:typename:std::string
+WmediumdMessage host/libs/wmediumd_controller/wmediumd_api_protocol.h /^class WmediumdMessage {$/;" c namespace:cuttlefish
+WmediumdMessageReloadConfig host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ WmediumdMessageReloadConfig(const std::string& configPath)$/;" f class:cuttlefish::WmediumdMessageReloadConfig
+WmediumdMessageReloadConfig host/libs/wmediumd_controller/wmediumd_api_protocol.h /^class WmediumdMessageReloadConfig : public WmediumdMessage {$/;" c namespace:cuttlefish
+WmediumdMessageReloadCurrentConfig host/libs/wmediumd_controller/wmediumd_api_protocol.h /^class WmediumdMessageReloadCurrentConfig : public WmediumdMessage {$/;" c namespace:cuttlefish
+WmediumdMessageSetControl host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ WmediumdMessageSetControl(uint32_t flags) : flags_(flags) {}$/;" f class:cuttlefish::WmediumdMessageSetControl
+WmediumdMessageSetControl host/libs/wmediumd_controller/wmediumd_api_protocol.h /^class WmediumdMessageSetControl : public WmediumdMessage {$/;" c namespace:cuttlefish
+WmediumdMessageSetSnr host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^WmediumdMessageSetSnr::WmediumdMessageSetSnr(const std::string& node1,$/;" f class:cuttlefish::WmediumdMessageSetSnr
+WmediumdMessageSetSnr host/libs/wmediumd_controller/wmediumd_api_protocol.h /^class WmediumdMessageSetSnr : public WmediumdMessage {$/;" c namespace:cuttlefish
+WmediumdMessageType host/libs/wmediumd_controller/wmediumd_api_protocol.h /^enum class WmediumdMessageType : uint32_t {$/;" g namespace:cuttlefish typeref:typename:uint32_t
+WmediumdServer host/commands/run_cvd/launch.cc /^class WmediumdServer : public CommandSource {$/;" c namespace:cuttlefish file:
+Write common/libs/fs/shared_fd.cpp /^ssize_t FileInstance::Write(const void* buf, size_t count) {$/;" f class:cuttlefish::FileInstance typeref:typename:ssize_t
+Write common/libs/utils/vsock_connection.cpp /^bool VsockConnection::Write(const char* data, unsigned int size) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+Write common/libs/utils/vsock_connection.cpp /^bool VsockConnection::Write(const std::vector<char>& data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+Write common/libs/utils/vsock_connection.cpp /^bool VsockConnection::Write(int32_t data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+Write host/commands/secure_env/fragile_tpm_storage.cpp /^bool FragileTpmStorage::Write($/;" f class:cuttlefish::FragileTpmStorage typeref:typename:bool
+Write host/commands/secure_env/insecure_fallback_storage.cpp /^bool InsecureFallbackStorage::Write($/;" f class:cuttlefish::InsecureFallbackStorage typeref:typename:bool
+WriteAll common/libs/fs/shared_buf.cc /^ssize_t WriteAll(SharedFD fd, const char* buf, size_t size) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+WriteAll common/libs/fs/shared_buf.cc /^ssize_t WriteAll(SharedFD fd, const std::string& buf) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+WriteAll common/libs/fs/shared_buf.cc /^ssize_t WriteAll(SharedFD fd, const std::vector<char>& buf) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+WriteAllBinary common/libs/fs/shared_buf.h /^ssize_t WriteAllBinary(SharedFD fd, const T* binary_data) {$/;" f namespace:cuttlefish typeref:typename:ssize_t
+WriteBeginning host/libs/image_aggregator/image_aggregator.cc /^bool WriteBeginning(SharedFD out, const GptBeginning& beginning) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:bool
+WriteBytes host/libs/confui/cbor.cc /^bool Cbor::WriteBytes(uint64_t value, uint8_t size) {$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+WriteBytesToBuffer host/libs/confui/cbor.cc /^bool Cbor::WriteBytesToBuffer(const std::vector<std::uint8_t>& bytes) {$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+WriteCommonHttpHeaders host/libs/websocket/websocket_server.cpp /^bool WriteCommonHttpHeaders(int status, const char* mime_type,$/;" f namespace:cuttlefish::__anon8185be2f0111 typeref:typename:bool
+WriteEnd host/libs/image_aggregator/image_aggregator.cc /^bool WriteEnd(SharedFD out, const GptEnd& end) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:bool
+WriteEnvironment host/commands/assemble_cvd/boot_config.cc /^size_t WriteEnvironment(const CuttlefishConfig& config,$/;" f namespace:cuttlefish::__anon0f90c2e70111 typeref:typename:size_t
+WriteEvent host/commands/kernel_log_monitor/utils.cc /^bool WriteEvent(cuttlefish::SharedFD fd, const Json::Value& event_message) {$/;" f namespace:monitor typeref:typename:bool
+WriteFailureRecord host/commands/secure_env/soft_gatekeeper.h /^ virtual bool WriteFailureRecord(uint32_t uid, failure_record_t* record, bool \/* secure *\/)/;" f class:gatekeeper::SoftGateKeeper typeref:typename:bool
+WriteFailureRecord host/commands/secure_env/tpm_gatekeeper.cpp /^bool TpmGatekeeper::WriteFailureRecord($/;" f class:cuttlefish::TpmGatekeeper typeref:typename:bool
+WriteFailureRecordImpl host/commands/secure_env/tpm_gatekeeper.cpp /^static bool WriteFailureRecordImpl($/;" f namespace:cuttlefish typeref:typename:bool file:
+WriteFiles host/commands/start/main.cc /^void WriteFiles(cuttlefish::FetcherConfig fetcher_config, cuttlefish::SharedFD out) {$/;" f namespace:__anon8e1e78490111 typeref:typename:void
+WriteGflagsCompatHelpXml host/commands/assemble_cvd/flag_feature.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {$/;" f class:cuttlefish::ParseGflagsImpl typeref:typename:bool file:
+WriteGflagsCompatHelpXml host/libs/config/adb/flags.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {$/;" f class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:bool file:
+WriteGflagsCompatHelpXml host/libs/config/config_flag.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:bool file:
+WriteGflagsCompatHelpXml host/libs/config/config_flag.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream&) const override { return true; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigFlagPlaceholderImpl typeref:typename:bool file:
+WriteGflagsCompatHelpXml host/libs/config/config_flag.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream&) const override { return true; }$/;" f class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:bool file:
+WriteGflagsCompatHelpXml host/libs/config/config_flag.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream&) const override {$/;" f class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:bool file:
+WriteGflagsCompatHelpXml host/libs/config/custom_actions.cpp /^ bool WriteGflagsCompatHelpXml(std::ostream& out) const override {$/;" f class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:bool file:
+WriteGflagsCompatXml common/libs/utils/flag_parser.cpp /^bool Flag::WriteGflagsCompatXml(std::ostream& out) const {$/;" f class:cuttlefish::Flag typeref:typename:bool
+WriteGflagsCompatXml common/libs/utils/flag_parser.cpp /^bool WriteGflagsCompatXml(const std::vector<Flag>& flags, std::ostream& out) {$/;" f namespace:cuttlefish typeref:typename:bool
+WriteGflagsHelpXml host/libs/config/feature.cpp /^bool FlagFeature::WriteGflagsHelpXml(const std::vector<FlagFeature*>& features,$/;" f class:cuttlefish::FlagFeature typeref:typename:bool
+WriteHeader host/libs/confui/cbor.cc /^bool Cbor::WriteHeader(const Cbor::Type type, const std::uint64_t value) {$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+WriteLoop host/commands/console_forwarder/main.cpp /^ [[noreturn]] void WriteLoop() {$/;" f class:cuttlefish::ConsoleForwarder typeref:typename:void file:
+WriteMessage common/libs/utils/unix_sockets.cpp /^Result<void> UnixMessageSocket::WriteMessage(const UnixSocketMessage& message) {$/;" f class:cuttlefish::UnixMessageSocket typeref:typename:Result<void>
+WriteMessage common/libs/utils/vsock_connection.cpp /^bool VsockConnection::WriteMessage(const Json::Value& data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+WriteMessage common/libs/utils/vsock_connection.cpp /^bool VsockConnection::WriteMessage(const std::string& data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+WriteMessage common/libs/utils/vsock_connection.cpp /^bool VsockConnection::WriteMessage(const std::vector<char>& data) {$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+WriteMiscInfo host/commands/assemble_cvd/misc_info.cc /^std::string WriteMiscInfo(const MiscInfo& misc_info) {$/;" f namespace:cuttlefish typeref:typename:std::string
+WritePayload common/libs/confui/packet.h /^bool WritePayload(SharedFD d, const std::string& cmd_str,$/;" f namespace:cuttlefish::confui::packet typeref:typename:bool
+WriteProtectedJsonToFile host/commands/secure_env/json_serializable.cpp /^bool WriteProtectedJsonToFile($/;" f namespace:cuttlefish typeref:typename:bool
+WriteStrides common/libs/utils/vsock_connection.cpp /^bool VsockConnection::WriteStrides(const char* data, unsigned int size,$/;" f class:cuttlefish::VsockConnection typeref:typename:bool
+WriteTextToBuffer host/libs/confui/cbor.cc /^bool Cbor::WriteTextToBuffer(const std::string& text) {$/;" f class:cuttlefish::confui::Cbor typeref:typename:bool
+WriteWsBuffer host/libs/websocket/websocket_handler.cpp /^void WebSocketHandler::WriteWsBuffer(WebSocketHandler::WsBuffer& ws_buffer) {$/;" f class:cuttlefish::WebSocketHandler typeref:typename:void
+WsBuffer host/frontend/webrtc/lib/ws_connection.cpp /^ WsBuffer(const uint8_t* data, size_t len, bool binary)$/;" f struct:WsConnectionImpl::WsBuffer file:
+WsBuffer host/frontend/webrtc/lib/ws_connection.cpp /^ struct WsBuffer {$/;" s class:WsConnectionImpl file:
+WsBuffer host/libs/websocket/websocket_handler.h /^ WsBuffer(std::vector<uint8_t> data, bool binary)$/;" f struct:cuttlefish::WebSocketHandler::WsBuffer
+WsBuffer host/libs/websocket/websocket_handler.h /^ struct WsBuffer {$/;" s class:cuttlefish::WebSocketHandler
+WsConnection host/frontend/webrtc/lib/ws_connection.h /^class WsConnection {$/;" c
+WsConnectionContext host/frontend/webrtc/lib/ws_connection.h /^class WsConnectionContext {$/;" c
+WsConnectionContextImpl host/frontend/webrtc/lib/ws_connection.cpp /^WsConnectionContextImpl::WsConnectionContextImpl(struct lws_context* lws_ctx)$/;" f class:WsConnectionContextImpl
+WsConnectionContextImpl host/frontend/webrtc/lib/ws_connection.cpp /^class WsConnectionContextImpl$/;" c file:
+WsConnectionImpl host/frontend/webrtc/lib/ws_connection.cpp /^WsConnectionImpl::WsConnectionImpl($/;" f class:WsConnectionImpl
+WsConnectionImpl host/frontend/webrtc/lib/ws_connection.cpp /^class WsConnectionImpl : public WsConnection,$/;" c file:
+WsConnectionObserver host/frontend/webrtc/lib/ws_connection.h /^class WsConnectionObserver {$/;" c
+X86 common/libs/utils/environment.h /^ X86,$/;" e enum:cuttlefish::Arch
+X86_64 common/libs/utils/environment.h /^ X86_64,$/;" e enum:cuttlefish::Arch
+XmlEscape common/libs/utils/flag_parser.cpp /^static std::string XmlEscape(const std::string& s) {$/;" f namespace:cuttlefish typeref:typename:std::string file:
+XmlEscape host/commands/assemble_cvd/flag_feature.cpp /^static std::string XmlEscape(const std::string& s) {$/;" f namespace:cuttlefish typeref:typename:std::string file:
+Zero common/libs/fs/shared_select.h /^ void Zero() {$/;" f class:cuttlefish::SharedFDSet typeref:typename:void
+_UAPI_VM_SOCKETS_H common/libs/fs/vm_sockets.h /^#define _UAPI_VM_SOCKETS_H$/;" d
+__NR_memfd_create common/libs/fs/shared_fd.cpp /^# define __NR_memfd_create /;" d file:
+__STDC_LIMIT_MACROS guest/hals/ril/reference-libril/RilSapSocket.cpp /^#define __STDC_LIMIT_MACROS$/;" d file:
+__TARGET_NO_BOOTLOADER shared/BoardConfig.mk /^__TARGET_NO_BOOTLOADER := $(TARGET_NO_BOOTLOADER)$/;" m
+__anon027348120111 host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^namespace {$/;" n namespace:wayland file:
+__anon02806fd80111 host/libs/image_aggregator/image_aggregator.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon0281e17c0111 host/commands/secure_env/tpm_keymaster_enforcement.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon0281e17c0211 host/commands/secure_env/tpm_keymaster_enforcement.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon03bde2800111 host/commands/secure_env/tpm_attestation_record.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon050238300102 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300202 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client) { this->HandleAcceptCall(client); }),$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300302 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client) { this->HandleRejectCall(client); }),$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300402 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client) { this->HandleCurrentCalls(client); }),$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300502 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300602 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300702 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300802 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300902 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300a02 host/commands/modem_simulator/call_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::CallService::InitializeCommandHandlers file:
+__anon050238300b02 host/commands/modem_simulator/call_service.cpp /^ makeSafeCallback<CallService>(this, [call_token](CallService* me) {$/;" f function:cuttlefish::CallService::HandleDial file:
+__anon068c5ffd0102 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client) { this->HandleSIMStatusReq(client); }),$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0202 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0302 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0402 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0502 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client) { this->HandleGetIMSI(client); }),$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0602 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client) { this->HandleGetIccId(client); }),$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0702 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0802 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0902 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0a02 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0b02 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0c02 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0d02 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0e02 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon068c5ffd0f02 host/commands/modem_simulator/sim_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SimService::InitializeCommandHandlers file:
+__anon087586ca0111 guest/hals/keymint/remote/remote_keymint_device.cpp /^namespace {$/;" n namespace:aidl::android::hardware::security::keymint file:
+__anon08fbc66c0102 guest/commands/bt_vhci_forwarder/main.cpp /^ [](const std::vector<uint8_t>& \/* raw_command *\/) {$/;" f function:main file:
+__anon08fbc66c0202 guest/commands/bt_vhci_forwarder/main.cpp /^ [vhci_fd](const std::vector<uint8_t>& raw_event) {$/;" f function:main file:
+__anon08fbc66c0302 guest/commands/bt_vhci_forwarder/main.cpp /^ [vhci_fd](const std::vector<uint8_t>& raw_acl) {$/;" f function:main file:
+__anon08fbc66c0402 guest/commands/bt_vhci_forwarder/main.cpp /^ [vhci_fd](const std::vector<uint8_t>& raw_sco) {$/;" f function:main file:
+__anon08fbc66c0502 guest/commands/bt_vhci_forwarder/main.cpp /^ [vhci_fd](const std::vector<uint8_t>& raw_iso) {$/;" f function:main file:
+__anon08fbc66c0602 guest/commands/bt_vhci_forwarder/main.cpp /^ []() { LOG(INFO) << "HCI socket device disconnected"; });$/;" f function:main file:
+__anon0a6d9b510111 host/commands/secure_env/secure_env.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon0a6d9b510202 host/commands/secure_env/secure_env.cpp /^ return std::thread([kernel_events_fd]() {$/;" f function:cuttlefish::__anon0a6d9b510111::StartKernelEventMonitor file:
+__anon0a6d9b510302 host/commands/secure_env/secure_env.cpp /^ []() -> Tpm* { \/\/ fruit will take ownership$/;" f function:cuttlefish::__anon0a6d9b510111::SecureEnvComponent typeref:typename:Tpm * file:
+__anon0a6d9b510402 host/commands/secure_env/secure_env.cpp /^ nullptr, [](ESYS_CONTEXT* esys) { Esys_Finalize(&esys); });$/;" f function:cuttlefish::SecureEnvMain file:
+__anon0a6d9b510502 host/commands/secure_env/secure_env.cpp /^ threads.emplace_back([keymaster_in, keymaster_out, &keymaster]() {$/;" f function:cuttlefish::SecureEnvMain file:
+__anon0a6d9b510602 host/commands/secure_env/secure_env.cpp /^ threads.emplace_back([gatekeeper_in, gatekeeper_out, &gatekeeper]() {$/;" f function:cuttlefish::SecureEnvMain file:
+__anon0bfbaecf0103 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0203 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0303 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0603 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0703 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0803 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0903 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf0b03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0c03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0d03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0e03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf0f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1408 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1508 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1703 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf1808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf190a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf1808
+__anon0bfbaecf1a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1b08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1d08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf1f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2408 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf2608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2803 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf2908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2b03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf2c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2d03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf2e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf2f03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3003 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf3203 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3303 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3603 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3703 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3808 guest/hals/ril/reference-libril/ril.h /^{$/;" s
+__anon0bfbaecf3908 guest/hals/ril/reference-libril/ril.h /^{$/;" s
+__anon0bfbaecf3a08 guest/hals/ril/reference-libril/ril.h /^{$/;" s
+__anon0bfbaecf3b08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf3c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf3d03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf3e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf3f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4003 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf4108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4408 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf4608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4b08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4d08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf4f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf5503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf5608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5b08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5d08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf5f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6408 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6508 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6b03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf6c03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf6d03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf6e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf6f0a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf6e08
+__anon0bfbaecf7008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf710a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf7008
+__anon0bfbaecf7208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf730a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf7208
+__anon0bfbaecf7408 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf750a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf7408
+__anon0bfbaecf7608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf770a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf7608
+__anon0bfbaecf7808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf7908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf7a08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf7b08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf7c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf7d08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf7e0a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf7d08
+__anon0bfbaecf7f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8103 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf8208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf8508 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8a0a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf8908
+__anon0bfbaecf8b08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8d08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf8e03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf8f03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf9003 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf9108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf940a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf9308
+__anon0bfbaecf9503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf9603 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf9703 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf9808 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9a0a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecf9908
+__anon0bfbaecf9b03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecf9c08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9d08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9e08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecf9f08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfa003 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa103 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa203 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfa403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa608 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfa703 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa803 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfa903 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfaa03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfab08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfac0a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecfab08
+__anon0bfbaecfad08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfae08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfaf0a guest/hals/ril/reference-libril/ril.h /^ union {$/;" u struct:__anon0bfbaecfae08
+__anon0bfbaecfb008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfb108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfb203 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfb308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfb403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfb503 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfb603 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfb708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfb803 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfb908 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfba08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfbb08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfbc08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfbd08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfbe03 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfbf08 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfc008 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfc108 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfc208 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfc308 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfc403 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfc508 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0bfbaecfc603 guest/hals/ril/reference-libril/ril.h /^typedef enum {$/;" g
+__anon0bfbaecfc708 guest/hals/ril/reference-libril/ril.h /^typedef struct {$/;" s
+__anon0f90c2e70111 host/commands/assemble_cvd/boot_config.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon1055ca380111 guest/hals/camera/cached_stream_buffer.cpp /^namespace {$/;" n namespace:android::hardware::camera::device::V3_4::implementation file:
+__anon12e4c76c0111 host/libs/config/custom_actions.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon12e4c76c0202 host/libs/config/custom_actions.cpp /^ [this]() { return custom_action_config_; });$/;" f function:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl::INJECT file:
+__anon12e4c76c0302 host/libs/config/custom_actions.cpp /^ custom_action_config_flag_.Setter([this](const FlagMatch& match) {$/;" f function:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl::INJECT file:
+__anon12e4c76c0402 host/libs/config/custom_actions.cpp /^ custom_actions_flag_.Setter([this](const FlagMatch& match) {$/;" f function:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl::INJECT file:
+__anon145bfaab0111 host/commands/assemble_cvd/flags.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon145bfaab0202 host/commands/assemble_cvd/flags.cc /^ auto calc_vsock_port = [vsock_guest_cid](const int base_port) {$/;" f function:cuttlefish::InitializeCuttlefishConfiguration file:
+__anon14ee93270111 host/frontend/webrtc/lib/ws_connection.cpp /^namespace {$/;" n file:
+__anon14ee93270202 host/frontend/webrtc/lib/ws_connection.cpp /^ message_loop_ = std::thread([this]() {$/;" f function:WsConnectionContextImpl::Start file:
+__anon14ee93270302 host/frontend/webrtc/lib/ws_connection.cpp /^ [wsi, user](std::function<void(std::shared_ptr<WsConnectionImpl>)> cb) {$/;" f function:LwsCallback file:
+__anon14ee93270402 host/frontend/webrtc/lib/ws_connection.cpp /^ [in](std::shared_ptr<WsConnectionImpl> connection) {$/;" f function:LwsCallback file:
+__anon14ee93270502 host/frontend/webrtc/lib/ws_connection.cpp /^ [in, len, wsi](std::shared_ptr<WsConnectionImpl> connection) {$/;" f function:LwsCallback file:
+__anon14ee93270602 host/frontend/webrtc/lib/ws_connection.cpp /^ return with_connection([](std::shared_ptr<WsConnectionImpl> connection) {$/;" f function:LwsCallback file:
+__anon14ee93270702 host/frontend/webrtc/lib/ws_connection.cpp /^ return with_connection([](std::shared_ptr<WsConnectionImpl> connection) {$/;" f function:LwsCallback file:
+__anon14ee93270802 host/frontend/webrtc/lib/ws_connection.cpp /^ return with_connection([](std::shared_ptr<WsConnectionImpl> connection) {$/;" f function:LwsCallback file:
+__anon14ee93270902 host/frontend/webrtc/lib/ws_connection.cpp /^ [in, len](std::shared_ptr<WsConnectionImpl> connection) {$/;" f function:LwsCallback file:
+__anon177786ea0102 common/libs/concurrency/semaphore.h /^ resoure_cv_.wait(lock, [this]() -> bool { return count_ > 0; });$/;" f function:cuttlefish::Semaphore::SemWait typeref:typename:bool file:
+__anon177786ea0202 common/libs/concurrency/semaphore.h /^ room_cv_.wait(lock, [this]() -> bool { return count_ <= capacity_; });$/;" f function:cuttlefish::Semaphore::SemPost typeref:typename:bool file:
+__anon1a1358000102 common/libs/utils/shared_fd_flag.cpp /^ return Flag().Setter([&](const FlagMatch& mat) { return Set(mat, out); });$/;" f function:cuttlefish::SharedFDFlag file:
+__anon1a1358000202 common/libs/utils/shared_fd_flag.cpp /^ [&out](const FlagMatch& mat) { return Set(mat, out); });$/;" f function:cuttlefish::SharedFDFlag file:
+__anon1e335d460111 host/commands/assemble_cvd/assemble_cvd.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon1edaaabd0111 host/libs/vm_manager/host_configuration.cpp /^namespace {$/;" n namespace:cuttlefish::vm_manager file:
+__anon1ff2f3d90111 common/libs/net/netlink_request_test.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon1ff2f3d90208 common/libs/net/netlink_request_test.cpp /^ struct {$/;" s function:cuttlefish::TEST file:
+__anon1ff2f3d90308 common/libs/net/netlink_request_test.cpp /^ struct {$/;" s function:cuttlefish::TEST file:
+__anon1ff2f3d90408 common/libs/net/netlink_request_test.cpp /^ constexpr struct __attribute__((__packed__)) {$/;" s function:cuttlefish::TEST file:
+__anon1ff2f3d90508 common/libs/net/netlink_request_test.cpp /^ struct {$/;" s function:cuttlefish::TEST file:
+__anon1ff2f3d90608 common/libs/net/netlink_request_test.cpp /^ struct {$/;" s function:cuttlefish::TEST file:
+__anon1ff2f3d90708 common/libs/net/netlink_request_test.cpp /^ struct {$/;" s function:cuttlefish::TEST file:
+__anon1ff2f3d90808 common/libs/net/netlink_request_test.cpp /^ struct {$/;" s function:cuttlefish::TEST file:
+__anon20b0d9c80102 host/libs/vm_manager/crosvm_builder.cpp /^ command_.SetStopper([crosvm, control_socket](Subprocess* proc) {$/;" f function:cuttlefish::CrosvmBuilder::AddControlSocket file:
+__anon2184467c0111 guest/hals/confirmationui/TrustyConfirmationUI.cpp /^namespace {$/;" n namespace:android::hardware::confirmationui::V1_0::implementation file:
+__anon2184467c0202 guest/hals/confirmationui/TrustyConfirmationUI.cpp /^ auto fetching_cmd = [this]() { HostMessageFetcherLoop(); };$/;" f function:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI::TrustyConfirmationUI file:
+__anon2184467c0302 guest/hals/confirmationui/TrustyConfirmationUI.cpp /^ const hidl_string& locale, const hidl_vec<UIOption>& uiOptions) {$/;" f function:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI::promptUserConfirmation file:
+__anon2184467c0402 guest/hals/confirmationui/TrustyConfirmationUI.cpp /^ listener_state_condv_.wait(stateLock, [this] {$/;" f function:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI::promptUserConfirmation file:
+__anon227079aa0102 guest/hals/confirmationui/guest_session.h /^ 20, [this](GuestSession::QueueImpl* impl) { return QueueFullHandler(impl); }) {}$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession file:
+__anon2390a3680102 host/libs/screen_connector/screen_connector_queue.h /^ auto is_empty = [this](void) { return buffer_.empty(); };$/;" f function:cuttlefish::ScreenConnectorQueue::WaitEmpty file:
+__anon2390a3680202 host/libs/screen_connector/screen_connector_queue.h /^ [this](void){ return buffer_.empty(); };$/;" f function:cuttlefish::ScreenConnectorQueue::Push file:
+__anon2426deb60111 guest/hals/camera/vsock_frame_provider.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon2426deb60202 guest/hals/camera/vsock_frame_provider.cpp /^ std::thread([this, width, height] { VsockReadLoop(width, height); });$/;" f function:cuttlefish::VsockFrameProvider::start file:
+__anon2426deb60302 guest/hals/camera/vsock_frame_provider.cpp /^ lock, timeout, [this, now] { return timestamp_.load() > now; });$/;" f function:cuttlefish::VsockFrameProvider::waitYUVFrame file:
+__anon27bf4bcd0102 common/libs/utils/flag_parser.cpp /^ auto setter = [&](FlagMatch) {$/;" f function:cuttlefish::HelpFlag file:
+__anon27bf4bcd0202 common/libs/utils/flag_parser.cpp /^ .Setter([](const FlagMatch& match) {$/;" f function:cuttlefish::InvalidFlagGuard file:
+__anon27bf4bcd0302 common/libs/utils/flag_parser.cpp /^ .Setter([](const FlagMatch& match) {$/;" f function:cuttlefish::UnexpectedArgumentGuard file:
+__anon27bf4bcd0402 common/libs/utils/flag_parser.cpp /^ .Getter([&value]() { return value; })$/;" f function:cuttlefish::GflagsCompatFlag file:
+__anon27bf4bcd0502 common/libs/utils/flag_parser.cpp /^ .Setter([&value](const FlagMatch& match) {$/;" f function:cuttlefish::GflagsCompatFlag file:
+__anon27bf4bcd0602 common/libs/utils/flag_parser.cpp /^ .Getter([&value]() { return std::to_string(value); })$/;" f function:cuttlefish::GflagsCompatNumericFlagGeneric file:
+__anon27bf4bcd0702 common/libs/utils/flag_parser.cpp /^ .Setter([&value](const FlagMatch& match) {$/;" f function:cuttlefish::GflagsCompatNumericFlagGeneric file:
+__anon27bf4bcd0802 common/libs/utils/flag_parser.cpp /^ .Getter([&value]() { return value ? "true" : "false"; })$/;" f function:cuttlefish::GflagsCompatFlag file:
+__anon27bf4bcd0902 common/libs/utils/flag_parser.cpp /^ .Setter([name, &value](const FlagMatch& match) {$/;" f function:cuttlefish::GflagsCompatFlag file:
+__anon29a199ff0111 host/libs/graphics_detector/graphics_detector.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon29a199ff0202 host/libs/graphics_detector/graphics_detector.cpp /^ auto EglLoadFunction = [&](const char* name) {$/;" f function:cuttlefish::__anon29a199ff0111::PopulateEglAvailability file:
+__anon29a199ff0302 host/libs/graphics_detector/graphics_detector.cpp /^ Closer context_closer([&]() { eglDestroyContext(display, context); });$/;" f function:cuttlefish::__anon29a199ff0111::PopulateEglAvailability file:
+__anon29a199ff0402 host/libs/graphics_detector/graphics_detector.cpp /^ Closer instancecloser([&]() {vkDestroyInstance(instance, nullptr); });$/;" f function:cuttlefish::__anon29a199ff0111::PopulateVulkanAvailability file:
+__anon29a199ff0502 host/libs/graphics_detector/graphics_detector.cpp /^ [](unsigned char c) { return std::tolower(c); });$/;" f function:cuttlefish::__anon29a199ff0111::ToLower file:
+__anon29cd72800111 guest/hals/camera/vsock_camera_server.cpp /^namespace {$/;" n namespace:android::hardware::camera::provider::V2_7::implementation file:
+__anon29cd72800202 guest/hals/camera/vsock_camera_server.cpp /^ server_thread_ = std::thread([this, port, cid] { serverLoop(port, cid); });$/;" f function:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer::start file:
+__anon2a3d92f70111 host/frontend/webrtc/audio_handler.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon2a3d92f70202 host/frontend/webrtc/audio_handler.cpp /^ server_thread_ = std::thread([this]() { Loop(); });$/;" f function:cuttlefish::AudioHandler::Start file:
+__anon2a3d92f70302 host/frontend/webrtc/audio_handler.cpp /^ std::thread playback_thread([this, &audio_client]() {$/;" f function:cuttlefish::AudioHandler::Loop file:
+__anon2a3d92f70402 host/frontend/webrtc/audio_handler.cpp /^ std::thread capture_thread([this, &audio_client]() {$/;" f function:cuttlefish::AudioHandler::Loop file:
+__anon2afb66ee0102 host/frontend/webrtc/lib/local_recorder.cpp /^ display->encoder_thread_ = std::thread([](Display* display) {$/;" f function:cuttlefish::webrtc_streaming::LocalRecorder::AddDisplay file:
+__anon2c505fdf0111 host/frontend/webrtc/lib/utils.cpp /^namespace {$/;" n namespace:cuttlefish::webrtc_streaming file:
+__anon2cec80f10111 host/libs/config/cuttlefish_config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon2d61e9d10111 host/libs/config/adb/data.cpp /^namespace {}$/;" n namespace:cuttlefish file:
+__anon2e549bd00111 host/libs/config/config_flag.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon2e549bd00202 host/libs/config/config_flag.cpp /^ auto getter = [this]() { return config_; };$/;" f function:cuttlefish::__anon2e549bd00111::ConfigFlagImpl::INJECT file:
+__anon2e549bd00302 host/libs/config/config_flag.cpp /^ auto setter = [this](const FlagMatch& m) { return ChooseConfig(m.value); };$/;" f function:cuttlefish::__anon2e549bd00111::ConfigFlagImpl::INJECT file:
+__anon316d80cb0103 guest/hals/ril/reference-libril/ril_ex.h /^typedef enum {$/;" g
+__anon3442b2250111 host/libs/config/cuttlefish_config_instance.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon39e8abf00111 common/libs/utils/subprocess.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon39e8abf00202 common/libs/utils/subprocess.cpp /^ stdin_thread = std::thread([pipe_write, stdin_str, &io_error]() {$/;" f function:cuttlefish::RunWithManagedStdio file:
+__anon39e8abf00302 common/libs/utils/subprocess.cpp /^ stdout_thread = std::thread([pipe_read, stdout_str, &io_error]() {$/;" f function:cuttlefish::RunWithManagedStdio file:
+__anon39e8abf00402 common/libs/utils/subprocess.cpp /^ stderr_thread = std::thread([pipe_read, stderr_str, &io_error]() {$/;" f function:cuttlefish::RunWithManagedStdio file:
+__anon3ad7623b0102 host/frontend/webrtc/kernel_log_events_handler.cpp /^ read_thread_([this]() { ReadLoop(); }) {}$/;" f namespace:cuttlefish file:
+__anon3daf7c700102 common/libs/confui/utils.h /^ ([&ss, &delim](auto& arg) { ss << arg << delim; }(args), ...);$/;" f function:cuttlefish::confui::ArgsToStringWithDelim file:
+__anon3daf7c700202 common/libs/confui/utils.h /^ [](int c) -> bool { return std::isdigit(c); });$/;" f function:cuttlefish::confui::IsOnlyDigits typeref:typename:bool file:
+__anon3fa4410d0102 host/commands/run_cvd/process_monitor.cc /^ std::thread parent_comms_thread([&running, this]() {$/;" f function:cuttlefish::ProcessMonitor::MonitorRoutine file:
+__anon3fa4410d0202 host/commands/run_cvd/process_monitor.cc /^ auto matches = [pid](const auto& it) { return it.proc->pid() == pid; };$/;" f function:cuttlefish::ProcessMonitor::MonitorRoutine file:
+__anon3fa4410d0302 host/commands/run_cvd/process_monitor.cc /^ auto stop = [](const auto& it) {$/;" f function:cuttlefish::ProcessMonitor::MonitorRoutine file:
+__anon40cdc2c70111 guest/commands/vsoc_input_service/virtual_device_base.cpp /^namespace {$/;" n file:
+__anon4361040d0102 host/libs/config/feature.cpp /^ auto add_feature = [&ordered_features](Feature* feature) -> bool {$/;" f function:cuttlefish::Feature::RunSetup typeref:typename:bool file:
+__anon4361040d0202 host/libs/config/feature.cpp /^ auto handle = [&flags](FlagFeature* feature) -> bool {$/;" f function:cuttlefish::FlagFeature::ProcessFlags typeref:typename:bool file:
+__anon4552bec90111 host/commands/start/flag_forwarder.cc /^namespace {$/;" n file:
+__anon459bf0e40111 host/libs/config/adb/flags.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon459bf0e40202 host/libs/config/adb/flags.cpp /^ mode_flag_.Getter([this]() {$/;" f function:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl::INJECT file:
+__anon459bf0e40302 host/libs/config/adb/flags.cpp /^ mode_flag_.Setter([this](const FlagMatch& match) {$/;" f function:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl::INJECT file:
+__anon473d11590111 host/libs/wayland/wayland_compositor.cpp /^namespace {$/;" n namespace:wayland file:
+__anon477f946a0111 host/frontend/webrtc_operator/server.cpp /^namespace {$/;" n file:
+__anon477f946a0202 host/frontend/webrtc_operator/server.cpp /^ kListDevicesUriPath, [&device_registry](struct lws* wsi) {$/;" f function:main file:
+__anon477f946a0302 host/frontend/webrtc_operator/server.cpp /^ kInfraConfigPath, [&server_config](struct lws* wsi) {$/;" f function:main file:
+__anon477f946a0402 host/frontend/webrtc_operator/server.cpp /^ kConnectPath, [&device_registry, &poll_store](struct lws* wsi) {$/;" f function:main file:
+__anon477f946a0502 host/frontend/webrtc_operator/server.cpp /^ kForwardPath, [&poll_store](struct lws* wsi) {$/;" f function:main file:
+__anon477f946a0602 host/frontend/webrtc_operator/server.cpp /^ kPollPath, [&poll_store](struct lws* wsi) {$/;" f function:main file:
+__anon483fb9980111 host/commands/cvd/main.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon49de69e60111 guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^namespace {$/;" n namespace:keymaster::V4_1 file:
+__anon4b86e7460102 host/libs/confui/host_server.cc /^ [](ThreadSafeQueue<std::unique_ptr<ConfUiMessage>>::QueueImpl*) {$/;" f function:cuttlefish::confui::HostServer::HostServer file:
+__anon4b86e7460202 host/libs/confui/host_server.cc /^ auto hal_cmd_fetching = [this]() { this->HalCmdFetcherLoop(); };$/;" f function:cuttlefish::confui::HostServer::Start file:
+__anon4b86e7460302 host/libs/confui/host_server.cc /^ auto main = [this]() { this->MainLoop(); };$/;" f function:cuttlefish::confui::HostServer::Start file:
+__anon4be913be0102 guest/commands/sensor_injection/main.cpp /^ sensors->getSensorsList_2_1([&](const auto& list) {$/;" f function:getSensorHandle file:
+__anon4e57c5f20102 host/libs/config/feature.h /^ visit = [&callback, &features_status, &visit](Subclass* feature) -> bool {$/;" f function:cuttlefish::FeatureSuperclass::TopologicalVisit typeref:typename:bool file:
+__anon4ec25d870111 common/libs/device_config/guest_device_config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon512a2c1f0103 guest/hals/ril/reference-ril/atchannel.h /^typedef enum {$/;" g
+__anon512a2c1f0208 guest/hals/ril/reference-ril/atchannel.h /^typedef struct {$/;" s
+__anon512a2c1f0303 guest/hals/ril/reference-ril/atchannel.h /^typedef enum {$/;" g
+__anon521370420102 host/commands/fetcher/build_api.h /^ return std::visit([this](auto&& arg) { return Artifacts(arg); }, build);$/;" f function:cuttlefish::BuildApi::Artifacts file:
+__anon521370420202 host/commands/fetcher/build_api.h /^ return std::visit([this, &artifact, &path](auto&& arg) {$/;" f function:cuttlefish::BuildApi::ArtifactToFile file:
+__anon527e8bd40111 host/commands/run_cvd/server_loop.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon550da8bf0102 host/frontend/webrtc/connection_observer.cpp /^ std::thread th([this]() {$/;" f function:cuttlefish::ConnectionObserverImpl::OnConnected file:
+__anon560e372a0102 host/libs/confui/host_mode_ctrl.h /^ auto check = [this]() -> bool {$/;" f function:cuttlefish::HostModeCtrl::WaitAndroidMode typeref:typename:bool file:
+__anon5714be600111 guest/hals/keymint/remote/service.cpp /^namespace {$/;" n file:
+__anon587bcda10111 host/commands/assemble_cvd/clean.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon58d626b40102 guest/hals/camera/stream_buffer_cache.cpp /^ [buffer_id](const std::shared_ptr<CachedStreamBuffer>& buffer) {$/;" f function:android::hardware::camera::device::V3_4::implementation::StreamBufferCache::get file:
+__anon58d626b40202 guest/hals/camera/stream_buffer_cache.cpp /^ [&buffer_id](const std::shared_ptr<CachedStreamBuffer>& buffer) {$/;" f function:android::hardware::camera::device::V3_4::implementation::StreamBufferCache::remove file:
+__anon58d626b40302 guest/hals/camera/stream_buffer_cache.cpp /^ auto id_match = [id](const std::shared_ptr<CachedStreamBuffer>& buffer) {$/;" f function:android::hardware::camera::device::V3_4::implementation::StreamBufferCache::update file:
+__anon58d908c60102 host/libs/confui/host_renderer.cc /^ teeui::Color color) -> teeui::Error {$/;" f function:cuttlefish::confui::ConfUiRenderer::RepaintRawFrame typeref:typename:teeui::Error file:
+__anon5c4f198b0103 host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef enum {$/;" g
+__anon5ef0e91e0102 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) { this->HandleRadioPowerReq(client); }),$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0202 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0302 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0402 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) { this->HandleSignalStrength(client); }),$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0502 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0602 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0702 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0802 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0902 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0a02 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0b02 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0c02 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0d02 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0e02 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e0f02 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e1002 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon5ef0e91e1102 host/commands/modem_simulator/network_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::NetworkService::InitializeCommandHandlers file:
+__anon61381e100111 common/libs/net/netlink_client.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon63a091d80111 host/commands/restart_cvd/restart_cvd.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon64f55d8c0102 common/libs/utils/flag_parser_test.cpp /^ flag.Setter([&elems](const FlagMatch& match) {$/;" f function:cuttlefish::TEST file:
+__anon65a808010111 host/commands/stop/main.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon6b0274e10111 host/commands/run_cvd/launch_streamer.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon6b0274e10202 host/commands/run_cvd/launch_streamer.cpp /^ auto stopper = [host_socket = std::move(host_socket_)](Subprocess* proc) {$/;" f function:cuttlefish::__anon6b0274e10111::WebRtcServer::Commands file:
+__anon6dbb5ee00102 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00202 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00302 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00402 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00502 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00602 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00702 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00802 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6dbb5ee00902 host/commands/modem_simulator/misc_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::MiscService::InitializeCommandHandlers file:
+__anon6f6aae500102 host/commands/run_cvd/launch_modem.cpp /^ Command cmd(ModemSimulatorBinary(), [this](Subprocess* proc) {$/;" f function:cuttlefish::ModemSimulator::Commands file:
+__anon70d7df6f0108 guest/hals/ril/reference-ril/reference-ril.c /^typedef struct {$/;" s file:
+__anon70d7df6f0208 guest/hals/ril/reference-ril/reference-ril.c /^typedef struct {$/;" s file:
+__anon70d7df6f0303 guest/hals/ril/reference-ril/reference-ril.c /^typedef enum {$/;" g file:
+__anon70d7df6f0403 guest/hals/ril/reference-ril/reference-ril.c /^typedef enum {$/;" g file:
+__anon70d7df6f0503 guest/hals/ril/reference-ril/reference-ril.c /^typedef enum {$/;" g file:
+__anon710b399e0102 host/libs/screen_connector/screen_connector_multiplexer.h /^ auto selector = [this, &is_discard_frame]() -> int {$/;" f function:cuttlefish::ScreenConnectorInputMultiplexer::Pop typeref:typename:int file:
+__anon7281a6ce0111 host/commands/powerwash_cvd/powerwash_cvd.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon72e4bdb10111 common/libs/net/network_interface_manager.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon734383cf0111 host/frontend/adb_connector/adb_connection_maintainer.cpp /^namespace {$/;" n file:
+__anon734383cf0202 host/frontend/adb_connector/adb_connection_maintainer.cpp /^ [](char c) { return std::isdigit(c); });$/;" f function:__anon734383cf0111::IsInteger file:
+__anon79ba8e560111 host/libs/websocket/websocket_handler.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon7b80148c0111 common/libs/confui/protocol.cpp /^namespace {$/;" n namespace:cuttlefish::confui file:
+__anon7b80148c0211 common/libs/confui/protocol.cpp /^namespace {$/;" n namespace:cuttlefish::confui file:
+__anon7cf2d7d50102 host/libs/confui/sign_utils.h /^auto bytes_cast(const T& v) -> const uint8_t (&)[sizeof(T)] {$/;" f namespace:cuttlefish::confui::support file:
+__anon7cf2d7d50202 host/libs/confui/sign_utils.h /^auto bytes_cast(T& v) -> uint8_t (&)[sizeof(T)] {$/;" f namespace:cuttlefish::confui::support file:
+__anon7d4eee310111 guest/commands/vsoc_input_service/vsoc_input_service.cpp /^namespace {$/;" n file:
+__anon7d4eee310202 guest/commands/vsoc_input_service/vsoc_input_service.cpp /^ std::thread screen_thread([this, touch_fd]() {$/;" f function:VSoCInputService::ProcessEvents file:
+__anon7d4eee310302 guest/commands/vsoc_input_service/vsoc_input_service.cpp /^ EventLoop(virtual_touchscreen_, [touch_fd]() {$/;" f function:VSoCInputService::ProcessEvents::__anon7d4eee310202 file:
+__anon7d4eee310402 guest/commands/vsoc_input_service/vsoc_input_service.cpp /^ std::thread keyboard_thread([this, keyboard_fd]() {$/;" f function:VSoCInputService::ProcessEvents file:
+__anon7d4eee310502 guest/commands/vsoc_input_service/vsoc_input_service.cpp /^ EventLoop(virtual_keyboard_, [keyboard_fd]() {$/;" f function:VSoCInputService::ProcessEvents::__anon7d4eee310402 file:
+__anon7d63e7dc0102 common/libs/utils/vsock_connection.cpp /^ [this, port, cid]() { return Connect(port, cid); });$/;" f function:cuttlefish::VsockConnection::ConnectAsync file:
+__anon7d63e7dc0202 common/libs/utils/vsock_connection.cpp /^ return std::async(std::launch::async, [this, size]() { return Read(size); });$/;" f function:cuttlefish::VsockConnection::ReadAsync file:
+__anon7d63e7dc0302 common/libs/utils/vsock_connection.cpp /^ return std::async(std::launch::async, [this]() { return ReadMessage(); });$/;" f function:cuttlefish::VsockConnection::ReadMessageAsync file:
+__anon7d63e7dc0402 common/libs/utils/vsock_connection.cpp /^ return std::async(std::launch::async, [this]() { return ReadJsonMessage(); });$/;" f function:cuttlefish::VsockConnection::ReadJsonMessageAsync file:
+__anon7d839c5b0102 host/frontend/webrtc/display_handler.cpp /^ WebRtcScProcessedFrame& processed_frame) {$/;" f function:cuttlefish::DisplayHandler::GetScreenConnectorCallback file:
+__anon7ea6a0320111 host/libs/config/adb/launch.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon80582ec40102 host/commands/kernel_log_monitor/main.cc /^ klog.SubscribeToEvents([subscriber_fd](Json::Value message) {$/;" f function:main file:
+__anon807585c50102 guest/hals/confirmationui/guest_session.cpp /^ auto clean_up_and_get_first = [&]() -> std::unique_ptr<ConfUiMessage> {$/;" f function:android::hardware::confirmationui::V1_0::implementation::GuestSession::PromptUserConfirmation typeref:typename:std::unique_ptr<ConfUiMessage> file:
+__anon807585c50202 guest/hals/confirmationui/guest_session.cpp /^ auto wait_input_and_signal = [&]() -> std::unique_ptr<ConfUiMessage> {$/;" f function:android::hardware::confirmationui::V1_0::implementation::GuestSession::PromptUserConfirmation typeref:typename:std::unique_ptr<ConfUiMessage> file:
+__anon807585c50302 guest/hals/confirmationui/guest_session.cpp /^ input_ready_cv_.wait(input_ready_lock, [&]() { return input_ready; });$/;" f function:android::hardware::confirmationui::V1_0::implementation::GuestSession::PromptUserConfirmation file:
+__anon807585c50402 guest/hals/confirmationui/guest_session.cpp /^ [this] { return listener_state_ != ListenerState::SetupDone; /;" f function:android::hardware::confirmationui::V1_0::implementation::GuestSession::DeliverSecureInputEvent file:
+__anon8078843e0111 host/libs/audio_connector/server.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon8078843e0202 host/libs/audio_connector/server.cpp /^ uint32_t consumed_length) {$/;" f function:cuttlefish::__anon8078843e0111::SendStatusCallback file:
+__anon8185be2f0111 host/libs/websocket/websocket_server.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon8223c28e0102 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0202 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0302 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0402 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0502 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0602 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0702 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0802 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0902 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon8223c28e0a02 host/commands/modem_simulator/data_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::DataService::InitializeCommandHandlers file:
+__anon883919040102 host/commands/modem_simulator/channel_monitor.cpp /^ monitor_thread_ = std::thread([this]() { MonitorLoop(); });$/;" f function:cuttlefish::ChannelMonitor::ChannelMonitor file:
+__anon883919040202 host/commands/modem_simulator/channel_monitor.cpp /^ [&](std::unique_ptr<Client>& other) { return *other == client; });$/;" f function:cuttlefish::ChannelMonitor::ReadCommand file:
+__anon8c3f0f5d0102 host/commands/modem_simulator/nvram_config.cpp /^ std::call_once(once_flag, [num_instances, sim_type]() {$/;" f function:cuttlefish::NvramConfig::InitNvramConfigService file:
+__anon8d12954e0111 host/commands/run_cvd/validate.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon8e1e78490111 host/commands/start/main.cc /^namespace {$/;" n file:
+__anon8f5be4990111 host/libs/wayland/wayland_dmabuf.cpp /^namespace {$/;" n namespace:wayland file:
+__anon913036200111 common/frontend/socket_vsock_proxy/main.cpp /^namespace {$/;" n file:
+__anon9162129c0111 host/libs/vm_manager/crosvm_manager.cpp /^namespace {$/;" n namespace:cuttlefish::vm_manager file:
+__anon948178400111 host/commands/fetcher/build_api.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anon948178400202 host/commands/fetcher/build_api.cc /^ std::visit([&out](auto&& arg) { out << arg; }, build);$/;" f function:cuttlefish::operator << file:
+__anon94f9180b0102 common/libs/utils/tee_logging.cpp /^ auto concat_lines = [&](const char* message, int size) {$/;" f function:cuttlefish::StderrOutputGenerator file:
+__anon9bac88d60102 host/libs/confui/session.cc /^ auto invalid_input_handler = [&, this]() {$/;" f function:cuttlefish::confui::Session::HandleInSession file:
+__anon9f2993ef0111 host/frontend/webrtc_operator/client_handler.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anon9f2993ef0202 host/frontend/webrtc_operator/client_handler.cpp /^ std::generate_n(ret.begin(), len, [&]() { return chars[random(e)]; });$/;" f function:cuttlefish::__anon9f2993ef0111::RandomClientSecret file:
+__anona05e27140102 host/commands/secure_env/primary_key_builder.cpp /^ return [unique](TpmResourceManager& resource_manager) {$/;" f function:cuttlefish::SigningKeyCreator file:
+__anona05e27140202 host/commands/secure_env/primary_key_builder.cpp /^ return [unique](TpmResourceManager& resource_manager) {$/;" f function:cuttlefish::ParentKeyCreator file:
+__anona2d2fad50102 tests/hal/hal_implementation_test.cpp /^ auto setInserter = [&](const vintf::ManifestInstance& i) -> bool {$/;" f function:allHidlManifestInterfaces typeref:typename:bool file:
+__anona2d2fad50202 tests/hal/hal_implementation_test.cpp /^ auto setInserter = [&](const vintf::ManifestInstance& i) -> bool {$/;" f function:allAidlManifestInterfaces typeref:typename:bool file:
+__anona4a84cd70111 host/frontend/adb_connector/main.cpp /^namespace {$/;" n file:
+__anona6e38b1b0111 guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace {$/;" n namespace:android::hardware::camera::provider::V2_7::implementation file:
+__anona6e38b1b0202 guest/hals/camera/vsock_camera_provider_2_7.cpp /^ VsockCameraDevice::Settings settings) {$/;" f function:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider::setCallback file:
+__anona6e38b1b0302 guest/hals/camera/vsock_camera_provider_2_7.cpp /^ [this] { deviceRemoved(kDeviceName); });$/;" f function:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider::setCallback::__anona6e38b1b0202 file:
+__anona9f16c970111 host/libs/wayland/wayland_seat.cpp /^namespace {$/;" n namespace:wayland file:
+__anonab9390d10111 host/frontend/webrtc/lib/streamer.cpp /^namespace {$/;" n namespace:cuttlefish::webrtc_streaming file:
+__anonab9390d10202 host/frontend/webrtc/lib/streamer.cpp /^ touch_enabled]() -> std::shared_ptr<VideoSink> {$/;" f function:cuttlefish::webrtc_streaming::Streamer::AddDisplay typeref:typename:std::shared_ptr<VideoSink> file:
+__anonab9390d10302 host/frontend/webrtc/lib/streamer.cpp /^ RTC_FROM_HERE, [this, &label]() -> std::shared_ptr<AudioSink> {$/;" f function:cuttlefish::webrtc_streaming::Streamer::AddAudioStream typeref:typename:std::shared_ptr<AudioSink> file:
+__anonab9390d10402 host/frontend/webrtc/lib/streamer.cpp /^ impl_->signal_thread_->PostTask(RTC_FROM_HERE, [this, observer]() {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Register file:
+__anonab9390d10502 host/frontend/webrtc/lib/streamer.cpp /^ RTC_FROM_HERE, [this]() { impl_->server_connection_.reset(); });$/;" f function:cuttlefish::webrtc_streaming::Streamer::Unregister file:
+__anonab9390d10602 host/frontend/webrtc/lib/streamer.cpp /^ auto deleter = [](webrtc::VideoTrackSourceInterface* source) {$/;" f function:cuttlefish::webrtc_streaming::Streamer::RecordDisplays file:
+__anonab9390d10702 host/frontend/webrtc/lib/streamer.cpp /^ signal_thread_->PostTask(RTC_FROM_HERE, [this]() {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::OnOpen file:
+__anonab9390d10802 host/frontend/webrtc/lib/streamer.cpp /^ signal_thread_->PostTask(RTC_FROM_HERE, [this]() {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::OnClose file:
+__anonab9390d10902 host/frontend/webrtc/lib/streamer.cpp /^ RTC_FROM_HERE, [this]() { server_connection_->Connect(); },$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::OnError file:
+__anonab9390d10a02 host/frontend/webrtc/lib/streamer.cpp /^ signal_thread_->PostTask(RTC_FROM_HERE, [this]() {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::OnError file:
+__anonab9390d10b02 host/frontend/webrtc/lib/streamer.cpp /^ signal_thread_->PostTask(RTC_FROM_HERE, [this, server_message]() {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::OnReceive file:
+__anonab9390d10c02 host/frontend/webrtc/lib/streamer.cpp /^ [this, client_id](const Json::Value& msg) {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::CreateClientHandler file:
+__anonab9390d10d02 host/frontend/webrtc/lib/streamer.cpp /^ [this, client_id](bool isOpen) {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::CreateClientHandler file:
+__anonab9390d10e02 host/frontend/webrtc/lib/streamer.cpp /^ signal_thread_->PostTask(RTC_FROM_HERE, [this, client_id]() {$/;" f function:cuttlefish::webrtc_streaming::Streamer::Impl::DestroyClientHandler file:
+__anonadab6e0c0111 host/commands/run_cvd/main.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anonae6530d30111 host/commands/assemble_cvd/super_image_mixer.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anonb05ec4f60102 host/commands/console_forwarder/main.cpp /^ writer_thread_ = std::thread([this]() { WriteLoop(); });$/;" f function:cuttlefish::ConsoleForwarder::StartServer file:
+__anonb1d4e5780102 host/libs/screen_connector/screen_connector_ctrl.h /^ auto check = [this]() -> bool { return atomic_mode_ == ModeType::kAndroidMode; };$/;" f function:cuttlefish::ScreenConnectorCtrl::WaitAndroidMode typeref:typename:bool file:
+__anonb2b4da3a0111 host/libs/vm_manager/qemu_manager.cpp /^namespace {$/;" n namespace:cuttlefish::vm_manager file:
+__anonb2b4da3a0202 host/libs/vm_manager/qemu_manager.cpp /^ auto stop = [](Subprocess* proc) {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb2b4da3a0302 host/libs/vm_manager/qemu_manager.cpp /^ auto add_hvc_sink = [&qemu_cmd, &hvc_num]() {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb2b4da3a0402 host/libs/vm_manager/qemu_manager.cpp /^ auto add_serial_sink = [&qemu_cmd, &serial_num]() {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb2b4da3a0502 host/libs/vm_manager/qemu_manager.cpp /^ &serial_num](const std::string& output) {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb2b4da3a0602 host/libs/vm_manager/qemu_manager.cpp /^ &serial_num](const std::string& prefix) {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb2b4da3a0702 host/libs/vm_manager/qemu_manager.cpp /^ auto add_hvc_ro = [&qemu_cmd, &hvc_num](const std::string& output) {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb2b4da3a0802 host/libs/vm_manager/qemu_manager.cpp /^ auto add_hvc = [&qemu_cmd, &hvc_num](const std::string& prefix) {$/;" f function:cuttlefish::vm_manager::QemuManager::StartCommands file:
+__anonb50860fb0102 host/frontend/webrtc/bluetooth_handler.cpp /^ std::thread loop([this]() { ReadLoop(); });$/;" f function:cuttlefish::webrtc_streaming::BluetoothHandler::BluetoothHandler file:
+__anonb7895b810102 host/libs/wayland/wayland_server.cpp /^ [this, wayland_socket_fd]() {$/;" f function:wayland::WaylandServer::WaylandServer file:
+__anonb7895b810202 host/libs/wayland/wayland_server.cpp /^ server_ready_cv_.wait(lock, [&]{return server_ready_; });$/;" f function:wayland::WaylandServer::WaylandServer file:
+__anonb7fa39a50111 guest/hals/bt/remote/remote_bluetooth.cpp /^namespace {$/;" n file:
+__anonb7fa39a50202 guest/hals/bt/remote/remote_bluetooth.cpp /^ unlink_cb_ = [this, cb](sp<BluetoothDeathRecipient>& death_recipient) {$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50302 guest/hals/bt/remote/remote_bluetooth.cpp /^ [](const std::vector<uint8_t>& \/* raw_command *\/) {$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50402 guest/hals/bt/remote/remote_bluetooth.cpp /^ [this](const std::vector<uint8_t>& raw_event) {$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50502 guest/hals/bt/remote/remote_bluetooth.cpp /^ [this](const std::vector<uint8_t>& raw_acl) {$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50602 guest/hals/bt/remote/remote_bluetooth.cpp /^ [this](const std::vector<uint8_t>& raw_sco) {$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50702 guest/hals/bt/remote/remote_bluetooth.cpp /^ [this](const std::vector<uint8_t>& raw_iso) {$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50802 guest/hals/bt/remote/remote_bluetooth.cpp /^ []() { LOG(INFO) << "HCI socket device disconnected"; });$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonb7fa39a50902 guest/hals/bt/remote/remote_bluetooth.cpp /^ fd_, [this](int fd) { h4_.OnDataReady(fd); });$/;" f function:android::hardware::bluetooth::V1_1::remote::BluetoothHci::initialize_impl file:
+__anonbb773a0c0111 host/frontend/webrtc/adb_handler.cpp /^namespace {$/;" n namespace:cuttlefish::webrtc_streaming file:
+__anonbb773a0c0202 host/frontend/webrtc/adb_handler.cpp /^ std::thread loop([this]() { ReadLoop(); });$/;" f function:cuttlefish::webrtc_streaming::AdbHandler::AdbHandler file:
+__anonbbac300c0102 host/commands/modem_simulator/sup_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SupService::InitializeCommandHandlers file:
+__anonbbac300c0202 host/commands/modem_simulator/sup_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SupService::InitializeCommandHandlers file:
+__anonbbac300c0302 host/commands/modem_simulator/sup_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SupService::InitializeCommandHandlers file:
+__anonbbac300c0402 host/commands/modem_simulator/sup_service.cpp /^ "+CLIP?", [this](const Client& client) { this->HandleCLIP(client); }),$/;" f function:cuttlefish::SupService::InitializeCommandHandlers file:
+__anonbbac300c0502 host/commands/modem_simulator/sup_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SupService::InitializeCommandHandlers file:
+__anonbbac300c0602 host/commands/modem_simulator/sup_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SupService::InitializeCommandHandlers file:
+__anonbc3851b60108 host/frontend/webrtc/lib/streamer.h /^ struct {$/;" s struct:cuttlefish::webrtc_streaming::StreamerConfig
+__anonbd7a135a0102 common/libs/utils/files.cpp /^ struct FTW*) -> int {$/;" f function:cuttlefish::RecursivelyRemoveDirectory typeref:typename:int file:
+__anonbf7022000102 host/commands/secure_env/fragile_tpm_storage.cpp /^ auto close_tr = [this](ESYS_TR* handle) {$/;" f function:cuttlefish::FragileTpmStorage::Read file:
+__anonbfa95aa40111 host/commands/assemble_cvd/boot_image_utils.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anonbfba73ec0102 host/commands/modem_simulator/thread_looper.cpp /^ looper_thread_ = std::thread([this]() { ThreadLoop(); });$/;" f function:cuttlefish::ThreadLooper::ThreadLooper file:
+__anonc140734a0111 guest/hals/camera/vsock_camera_metadata.cpp /^namespace {$/;" n namespace:android::hardware::camera::device::V3_4::implementation file:
+__anonc24c37010102 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^ std::thread([this, timeout_ms] { processRequestLoop(timeout_ms); });$/;" f function:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::VsockCameraDeviceSession file:
+__anonc24c37010202 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^ auto is_empty = [this] { return pending_requests_.empty(); };$/;" f function:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::flush file:
+__anonc24c37010302 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^ auto not_empty = [this] { return !pending_requests_.empty(); };$/;" f function:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::getRequestFromQueue file:
+__anonc6b6781f0111 host/frontend/webrtc_operator/server_config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonc785b2110102 host/commands/modem_simulator/thread_looper.h /^ return [f, me] {$/;" f function:cuttlefish::makeSafeCallback file:
+__anonc785b2110202 host/commands/modem_simulator/thread_looper.h /^ [f, params...](T *me) { (me->*f)(params...); });$/;" f function:cuttlefish::makeSafeCallback file:
+__anonc785b2110302 host/commands/modem_simulator/thread_looper.h /^ [f, params...](T *me) { (me->*f)(params...); });$/;" f function:cuttlefish::makeSafeCallback file:
+__anoncaae79910111 common/libs/utils/network.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonccb356fd0111 host/commands/fetcher/fetch_cvd.cc /^namespace {$/;" n file:
+__anonccb356fd0211 host/commands/fetcher/fetch_cvd.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anonccb356fd0302 host/commands/fetcher/fetch_cvd.cc /^ std::string product = std::visit([](auto&& arg) { return arg.product; }, build);$/;" f function:cuttlefish::__anonccb356fd0211::TargetBuildZipFromArtifacts file:
+__anonccb356fd0402 host/commands/fetcher/fetch_cvd.cc /^ auto id = std::visit([](auto&& arg) { return arg.id; }, build);$/;" f function:cuttlefish::__anonccb356fd0211::TargetBuildZipFromArtifacts file:
+__anonccb356fd0502 host/commands/fetcher/fetch_cvd.cc /^ auto id = std::visit([](auto&& arg) { return arg.id; }, build);$/;" f function:cuttlefish::__anonccb356fd0211::AddFilesToConfig file:
+__anonccb356fd0602 host/commands/fetcher/fetch_cvd.cc /^ auto target = std::visit([](auto&& arg) { return arg.target; }, build);$/;" f function:cuttlefish::__anonccb356fd0211::AddFilesToConfig file:
+__anoncdd3d0380102 host/commands/bt_connector/main.cpp /^ auto guest_to_host = std::thread([&]() {$/;" f function:main file:
+__anoncdd3d0380202 host/commands/bt_connector/main.cpp /^ auto host_to_guest = std::thread([&]() {$/;" f function:main file:
+__anonced26a190111 common/libs/utils/users.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anoncf090a650111 common/libs/fs/shared_buf.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anoncfc77f870102 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870202 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870302 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870402 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870502 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870602 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client) { this->HandleGetSmscAddress(client); }),$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870702 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870802 host/commands/modem_simulator/sms_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::SmsService::InitializeCommandHandlers file:
+__anoncfc77f870902 host/commands/modem_simulator/sms_service.cpp /^ makeSafeCallback<SmsService>(this, [&sms_pdu](SmsService* me) {$/;" f function:cuttlefish::SmsService::HandleSendSMSPDU file:
+__anoncfc77f870a02 host/commands/modem_simulator/sms_service.cpp /^ makeSafeCallback<SmsService>(this, [sms_pdu](SmsService* me) {$/;" f function:cuttlefish::SmsService::HandleSendSMSPDU file:
+__anoncfc77f870b02 host/commands/modem_simulator/sms_service.cpp /^ makeSafeCallback<SmsService>(this, [sms_pdu, ref](SmsService* me) {$/;" f function:cuttlefish::SmsService::HandleSendSMSPDU file:
+__anond073544d0102 host/frontend/webrtc/main.cpp /^ touch_accepters.emplace_back([label, &input_sockets]() {$/;" f function:main file:
+__anond073544d0202 host/frontend/webrtc/main.cpp /^ std::thread keyboard_accepter([&input_sockets]() {$/;" f function:main file:
+__anond073544d0302 host/frontend/webrtc/main.cpp /^ std::thread switches_accepter([&input_sockets]() {$/;" f function:main file:
+__anond073544d0402 host/frontend/webrtc/main.cpp /^ std::thread control_thread([control_socket, &local_recorder]() {$/;" f function:main file:
+__anond0fc42ea0111 host/frontend/webrtc/lib/client_handler.cpp /^namespace {$/;" n namespace:cuttlefish::webrtc_streaming file:
+__anond0fc42ea0202 host/frontend/webrtc/lib/client_handler.cpp /^ observer_->OnAdbChannelOpen([this](const uint8_t *msg, size_t size) {$/;" f function:cuttlefish::webrtc_streaming::AdbChannelHandler::OnMessage file:
+__anond0fc42ea0302 host/frontend/webrtc/lib/client_handler.cpp /^ observer_->OnControlChannelOpen([this](const Json::Value& message) {$/;" f function:cuttlefish::webrtc_streaming::ControlChannelHandler::ControlChannelHandler file:
+__anond0fc42ea0402 host/frontend/webrtc/lib/client_handler.cpp /^ observer_->OnBluetoothChannelOpen([this](const uint8_t *msg, size_t size) {$/;" f function:cuttlefish::webrtc_streaming::BluetoothChannelHandler::OnMessage file:
+__anond0fc42ea0502 host/frontend/webrtc/lib/client_handler.cpp /^ [this](webrtc::RTCError error) {$/;" f function:cuttlefish::webrtc_streaming::ClientHandler::AddPendingIceCandidates file:
+__anond0fc42ea0602 host/frontend/webrtc/lib/client_handler.cpp /^ CvdOnSetRemoteDescription>([this](webrtc::RTCError error) {$/;" f function:cuttlefish::webrtc_streaming::ClientHandler::HandleMessage file:
+__anond0fc42ea0702 host/frontend/webrtc/lib/client_handler.cpp /^ [this](webrtc::RTCError error) {$/;" f function:cuttlefish::webrtc_streaming::ClientHandler::HandleMessage file:
+__anond0fc42ea0802 host/frontend/webrtc/lib/client_handler.cpp /^ [this](webrtc::RTCError error) {$/;" f function:cuttlefish::webrtc_streaming::ClientHandler::HandleMessage file:
+__anond0fc42ea0902 host/frontend/webrtc/lib/client_handler.cpp /^ [this](const uint8_t *msg, size_t size, bool binary) {$/;" f function:cuttlefish::webrtc_streaming::ClientHandler::OnConnectionChange file:
+__anond268d4620111 host/libs/wayland/wayland_shell.cpp /^namespace {$/;" n namespace:wayland file:
+__anond3364bd20111 host/commands/host_bugreport/main.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anond3364bd20202 host/commands/host_bugreport/main.cc /^ auto save = [&writer, config](const std::string& path) {$/;" f function:cuttlefish::__anond3364bd20111::CvdHostBugreportMain file:
+__anond3364bd20302 host/commands/host_bugreport/main.cc /^ auto save = [&writer, instance](const std::string& path) {$/;" f function:cuttlefish::__anond3364bd20111::CvdHostBugreportMain file:
+__anond4ab38d90102 host/frontend/webrtc/lib/camera_streamer.cpp /^ reader_thread_ = std::thread([this] {$/;" f function:cuttlefish::webrtc_streaming::CameraStreamer::StartReadLoop file:
+__anond70c3a4f0111 common/libs/fs/shared_fd.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anond80b65c40102 host/libs/screen_connector/screen_connector.h /^ std::uint8_t* frame_bytes) {$/;" f function:cuttlefish::ScreenConnector::SetCallback file:
+__anond90bdb570111 host/libs/config/bootconfig_args.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anondfffca8d0111 host/commands/fetcher/curl_wrapper.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anondfffca8d0202 host/commands/fetcher/curl_wrapper.cc /^ [&, this]() { return inner_curl_.DownloadToFile(url, path, headers); });$/;" f function:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper::DownloadToFile file:
+__anondfffca8d0302 host/commands/fetcher/curl_wrapper.cc /^ [&, this]() { return inner_curl_.DownloadToString(url, headers); });$/;" f function:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper::DownloadToString file:
+__anondfffca8d0402 host/commands/fetcher/curl_wrapper.cc /^ [&, this]() { return inner_curl_.DownloadToJson(url, headers); });$/;" f function:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper::DownloadToJson file:
+__anone2ec5ace0111 guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^namespace {$/;" n namespace:aidl::android::hardware::security::keymint file:
+__anone7ed366f0111 host/commands/run_cvd/boot_state_machine.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anone7ed366f0202 host/commands/run_cvd/boot_state_machine.cc /^ [this, boot_events_pipe]() { ThreadLoop(boot_events_pipe); });$/;" f function:cuttlefish::__anone7ed366f0111::CvdBootStateMachine::Setup file:
+__anone81850a20111 host/commands/fetcher/credential_source.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anone862986b0111 host/commands/secure_env/tpm_keymaster_context.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anone963d72d0111 host/libs/config/adb/config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anone9f9f83a0111 host/frontend/webrtc/lib/video_track_source_impl.cpp /^namespace {$/;" n namespace:cuttlefish::webrtc_streaming file:
+__anonebd60ce30111 host/libs/wayland/wayland_subcompositor.cpp /^namespace {$/;" n namespace:wayland file:
+__anoned36ed9d0111 host/libs/config/data_image.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonedfd971c0102 common/libs/utils/environment.cpp /^ [](FILE* fp, size_t len) {$/;" f function:cuttlefish::HostArchStr file:
+__anonf13e85620111 host/commands/run_cvd/launch.cc /^namespace {$/;" n namespace:cuttlefish file:
+__anonf2157dfa0111 common/libs/net/netlink_request.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonf277137d0111 common/libs/device_config/host_device_config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonf279fac10102 host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ read_thread_ = std::thread([this]() { ReadLoop(); });$/;" f function:GnssGrpcProxyServiceImpl::StartServer file:
+__anonf279fac10202 host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::thread([this]() { ReadNmeaFromLocalFile(); });$/;" f function:GnssGrpcProxyServiceImpl::StartReadNmeaFileThread file:
+__anonf279fac10302 host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::thread([this]() { ReadGnssRawMeasurement(); });$/;" f function:GnssGrpcProxyServiceImpl::StartReadGnssRawMeasurementFileThread file:
+__anonf3320da50102 host/libs/vm_manager/vm_manager.cpp /^ [](const CuttlefishConfig& config) {$/;" f function:cuttlefish::vm_manager::VmManagerComponent file:
+__anonf390c6e60102 host/commands/modem_simulator/stk_service.cpp /^ [this](const Client& client) {$/;" f function:cuttlefish::StkService::InitializeCommandHandlers file:
+__anonf390c6e60202 host/commands/modem_simulator/stk_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::StkService::InitializeCommandHandlers file:
+__anonf390c6e60302 host/commands/modem_simulator/stk_service.cpp /^ [this](const Client& client, std::string& cmd) {$/;" f function:cuttlefish::StkService::InitializeCommandHandlers file:
+__anonf7286d770111 host/libs/config/fetcher_config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonf7286d770211 host/libs/config/fetcher_config.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonf9a2982a0108 guest/hals/ril/reference-libril/ril.cpp /^typedef struct {$/;" s namespace:android file:
+__anonfa7764770111 host/commands/kernel_log_monitor/kernel_log_server.cc /^namespace {$/;" n file:
+__anonfa7764770208 host/commands/kernel_log_monitor/kernel_log_server.cc /^constexpr struct {$/;" s namespace:__anonfa7764770111 file:
+__anonfa7764770308 host/commands/kernel_log_monitor/kernel_log_server.cc /^constexpr struct {$/;" s namespace:__anonfa7764770111 file:
+__anonfb30483e0111 host/frontend/webrtc/cvd_video_frame_buffer.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonfb53392e0111 host/libs/config/kernel_args.cpp /^namespace {$/;" n namespace:cuttlefish file:
+__anonfcb88b810102 common/libs/concurrency/multiplexer.h /^ auto default_selector = [this]() -> int {$/;" f function:cuttlefish::Multiplexer::Pop typeref:typename:int file:
+__anonff3d797e0111 host/frontend/webrtc/lib/port_range_socket_factory.cpp /^namespace {$/;" n namespace:cuttlefish::webrtc_streaming file:
+__anonff76b58a0102 guest/hals/bt/remote/remote_bluetooth.h /^ [](const std::vector<uint8_t>&) {},$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci file:
+__anonff76b58a0202 guest/hals/bt/remote/remote_bluetooth.h /^ [](const std::vector<uint8_t>&) {},$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci file:
+__anonff76b58a0302 guest/hals/bt/remote/remote_bluetooth.h /^ [](const std::vector<uint8_t>&) {},$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci file:
+__anonff76b58a0402 guest/hals/bt/remote/remote_bluetooth.h /^ [](const std::vector<uint8_t>&) {},$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci file:
+__anonff76b58a0502 guest/hals/bt/remote/remote_bluetooth.h /^ [](const std::vector<uint8_t>&) {},$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci file:
+__anonff76b58a0602 guest/hals/bt/remote/remote_bluetooth.h /^ [] {}};$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci file:
+__eglMustCastToProperFunctionPointerType host/libs/graphics_detector/include/EGL/egl.h /^typedef void (*__eglMustCastToProperFunctionPointerType)(void);$/;" t typeref:typename:void (*)(void)
+__egl_h_ host/libs/graphics_detector/include/EGL/egl.h /^#define __egl_h_ /;" d
+__eglext_h_ host/libs/graphics_detector/include/EGL/eglext.h /^#define __eglext_h_ /;" d
+__eglplatform_h_ host/libs/graphics_detector/include/EGL/eglplatform.h /^#define __eglplatform_h_$/;" d
+__get_default_hostdir tools/upload_to_gce_and_run.py /^def __get_default_hostdir():$/;" f
+__khrplatform_h_ host/libs/graphics_detector/include/KHR/khrplatform.h /^#define __khrplatform_h_$/;" d
+aad_ host/commands/secure_env/hmac_serializable.h /^ const Serializable* aad_;$/;" m class:cuttlefish::HmacSerializable typeref:typename:const Serializable *
+abort guest/hals/confirmationui/TrustyConfirmationUI.cpp /^Return<void> TrustyConfirmationUI::abort() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:Return<void>
+abort guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCode> RemoteKeymaster4Device::abort(uint64_t operationHandle) {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCode>
+abort guest/hals/keymint/remote/remote_keymint_operation.cpp /^ScopedAStatus RemoteKeyMintOperation::abort() {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation typeref:typename:ScopedAStatus
+acceptCall guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::acceptCall(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+acceptCallResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::acceptCallResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+accessNetwork guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessNetworks_v1_5 accessNetwork;$/;" m struct:__anon0bfbaecf5608 typeref:typename:RIL_RadioAccessNetworks_v1_5
+accessNetwork guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessNetworks_v1_5 accessNetwork;$/;" m struct:__anon0bfbaecf5708 typeref:typename:RIL_RadioAccessNetworks_v1_5
+access_kregistry_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::access_kregistry_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+ackPDU guest/hals/ril/reference-libril/ril.h /^ char *ackPDU; \/* or NULL if n\/a *\/$/;" m struct:__anon0bfbaecf1a08 typeref:typename:char *
+acknowledgeIncomingGsmSmsWithPdu guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+acknowledgeIncomingGsmSmsWithPduResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+acknowledgeLastIncomingCdmaSms guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& sms/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+acknowledgeLastIncomingCdmaSmsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::acknowledgeLastIncomingCdmaSmsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+acknowledgeLastIncomingGsmSms guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::acknowledgeLastIncomingGsmSms(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+acknowledgeLastIncomingGsmSmsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::acknowledgeLastIncomingGsmSmsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+acknowledgeRequest guest/hals/ril/reference-libril/ril_service.cpp /^void radio_1_6::acknowledgeRequest(int slotId, int serial) {$/;" f class:radio_1_6 typeref:typename:void
+aconline host/commands/health/health.cpp /^int aconline() {$/;" f typeref:typename:int
+acquireAsBlob guest/hals/camera/cached_stream_buffer.cpp /^void* CachedStreamBuffer::acquireAsBlob(int32_t size, int timeout_ms) {$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:void *
+acquireAsYUV guest/hals/camera/cached_stream_buffer.cpp /^YCbCrLayout CachedStreamBuffer::acquireAsYUV(int32_t width, int32_t height,$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:YCbCrLayout
+acquireFence guest/hals/camera/cached_stream_buffer.h /^ int acquireFence() const { return acquire_fence_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:int
+acquire_fence_ guest/hals/camera/cached_stream_buffer.h /^ int acquire_fence_;$/;" m class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:int
+act guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessNetworks act;$/;" m struct:__anon0bfbaecfa608 typeref:typename:RIL_RadioAccessNetworks
+act_data common/libs/net/netlink_request_test.cpp /^ const uint8_t* act_data = static_cast<const uint8_t*>(arg.RequestData());$/;" v namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:const uint8_t *
+activation_date_valid host/commands/secure_env/tpm_keymaster_enforcement.cpp /^bool TpmKeymasterEnforcement::activation_date_valid($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:bool
+active guest/hals/ril/reference-libril/ril.h /^ int active; \/* 0=inactive, 1=active\/physical link down, 2=active\/physical/;" m struct:__anon0bfbaecf1208 typeref:typename:int
+active guest/hals/ril/reference-libril/ril.h /^ int active; \/* 0=inactive, 1=active\/physical link down, 2=active\/physical/;" m struct:__anon0bfbaecf1308 typeref:typename:int
+active guest/hals/ril/reference-libril/ril.h /^ int active; \/* 0=inactive, 1=active\/physical link down, 2=active\/physical/;" m struct:__anon0bfbaecf1408 typeref:typename:int
+active guest/hals/ril/reference-libril/ril.h /^ int active; \/* 0=inactive, 1=active\/physical link down, 2=active\/physical/;" m struct:__anon0bfbaecf1508 typeref:typename:int
+active guest/hals/ril/reference-libril/ril.h /^ int active; \/* 0=inactive, 1=active\/physical link down,$/;" m struct:__anon0bfbaecf1608 typeref:typename:int
+active host/frontend/webrtc/audio_handler.h /^ bool active = false;$/;" m struct:cuttlefish::AudioHandler::StreamDesc typeref:typename:bool
+active_calls_ host/commands/modem_simulator/call_service.h /^ std::map<int, CallStatus> active_calls_;$/;" m class:cuttlefish::CallService typeref:typename:std::map<int,CallStatus>
+active_interfaces_ host/libs/allocd/resource_manager.h /^ std::set<std::string> active_interfaces_;$/;" m class:cuttlefish::Session typeref:typename:std::set<std::string>
+active_interfaces_ host/libs/allocd/resource_manager.h /^ std::set<std::string> active_interfaces_;$/;" m struct:cuttlefish::ResourceManager typeref:typename:std::set<std::string>
+active_touch_slots_ host/frontend/webrtc/connection_observer.cpp /^ std::set<int32_t> active_touch_slots_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:std::set<int32_t> file:
+actual_interval_ms guest/hals/ril/reference-libril/ril.h /^ unsigned int actual_interval_ms; \/* actual LCE reporting interval,$/;" m struct:__anon0bfbaecf2308 typeref:typename:unsigned int
+adbChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #adbChannel;$/;" M class:DeviceConnection
+adbOnMessage host/frontend/webrtc_operator/assets/js/adb.js /^function adbOnMessage(arrayBuffer) {$/;" f
+adbOpenConnection host/frontend/webrtc_operator/assets/js/adb.js /^function adbOpenConnection() {$/;" f
+adbSendOkay host/frontend/webrtc_operator/assets/js/adb.js /^function adbSendOkay(remoteId) {$/;" f
+adbShell host/frontend/webrtc_operator/assets/js/adb.js /^function adbShell(command) {$/;" f
+adb_channel_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::scoped_refptr<webrtc::DataChannelInterface> adb_channel_;$/;" m class:cuttlefish::webrtc_streaming::AdbChannelHandler typeref:typename:rtc::scoped_refptr<webrtc::DataChannelInterface> file:
+adb_device_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::adb_device_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+adb_handler_ host/frontend/webrtc/connection_observer.cpp /^ std::shared_ptr<cuttlefish::webrtc_streaming::AdbHandler> adb_handler_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:std::shared_ptr<cuttlefish::webrtc_streaming::AdbHandler> file:
+adb_handler_ host/frontend/webrtc/lib/client_handler.h /^ std::unique_ptr<AdbChannelHandler> adb_handler_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::unique_ptr<AdbChannelHandler>
+adb_host_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::adb_host_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+adb_ip_and_port host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::adb_ip_and_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+adb_socket_ host/frontend/webrtc/adb_handler.h /^ SharedFD adb_socket_;$/;" m struct:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:SharedFD
+adb_ws host/frontend/webrtc_operator/assets/js/adb.js /^ adb_ws = {$/;" c class:init_adb
+adb_ws host/frontend/webrtc_operator/assets/js/adb.js /^let adb_ws;$/;" v
+addClientAndAppData guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^void addClientAndAppData(const hidl_vec<uint8_t>& clientId, const hidl_vec<uint8_t>& appData,$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:void
+addCommandListener host/frontend/webrtc_operator/assets/js/controls.js /^ let addCommandListener =$/;" f function:cmdConsole
+addIntermediate guest/hals/ril/reference-ril/atchannel.c /^static void addIntermediate(const char *line)$/;" f typeref:typename:void file:
+addKVToManifest tools/make_manifest.sh /^addKVToManifest() {$/;" f
+addLine host/frontend/webrtc_operator/assets/js/controls.js /^ let addLine =$/;" f function:cmdConsole
+addPathToManifest tools/make_manifest.sh /^addPathToManifest() {$/;" f
+addPayloadAndDispatchRequest guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::addPayloadAndDispatchRequest(MsgHeader *msg, uint16_t reqLen,$/;" f class:SapImpl typeref:typename:Return<void>
+addRequestToList guest/hals/ril/reference-libril/ril.cpp /^addRequestToList(int serial, int slotId, int request) {$/;" f namespace:android typeref:typename:RequestInfo *
+addRngEntropy guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCode> RemoteKeymaster4Device::addRngEntropy(const hidl_vec<uint8_t>& data) {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCode>
+addRngEntropy guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::addRngEntropy(const vector<uint8_t>& data) {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+addService guest/hals/keymint/remote/service.cpp /^std::shared_ptr<T> addService(Args&&... args) {$/;" f namespace:__anon5714be600111 typeref:typename:std::shared_ptr<T>
+addShaToManifest tools/make_manifest.sh /^addShaToManifest() {$/;" f
+addSocketToList guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::addSocketToList(const char *socketName, RIL_SOCKET_ID socketid,$/;" f class:RilSapSocket typeref:typename:void
+addString host/frontend/webrtc_operator/assets/js/controls.js /^ let addString =$/;" f function:cmdConsole
+addToList guest/hals/ril/reference-libril/ril_event.cpp /^static void addToList(struct ril_event * ev, struct ril_event * list)$/;" f typeref:typename:void file:
+add_cvd_file host/libs/config/fetcher_config.cpp /^bool FetcherConfig::add_cvd_file(const CvdFile& file, bool override_entry) {$/;" f class:cuttlefish::FetcherConfig typeref:typename:bool
+additional_info_ common/libs/confui/packet_types.h /^ ConfUiPacketInfo additional_info_;$/;" m struct:cuttlefish::confui::packet::ParsedPacket typeref:typename:ConfUiPacketInfo
+addr host/frontend/webrtc/lib/streamer.h /^ std::string addr;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig::__anonbc3851b60108 typeref:typename:std::string
+addr_ host/frontend/webrtc/lib/ws_connection.cpp /^ const std::string addr_;$/;" m class:WsConnectionImpl typeref:typename:const std::string file:
+address guest/hals/ril/reference-libril/ril.h /^ char * address; \/* An address, e.g., "192.0.1.3" or "2001:db8::1". *\/$/;" m struct:__anon0bfbaecf1208 typeref:typename:char *
+address guest/hals/ril/reference-libril/ril.h /^ char * address;$/;" m struct:__anon0bfbaecf1c08 typeref:typename:char *
+address_ common/libs/net/netlink_client.cpp /^ sockaddr_nl address_;$/;" m class:cuttlefish::__anon61381e100111::NetlinkClientImpl typeref:typename:sockaddr_nl file:
+addresses guest/hals/ril/reference-libril/ril.h /^ char * addresses; \/* A space-delimited list of addresses with optional "\/" prefi/;" m struct:__anon0bfbaecf1308 typeref:typename:char *
+addresses guest/hals/ril/reference-libril/ril.h /^ char * addresses; \/* A space-delimited list of addresses with optional "\/" prefi/;" m struct:__anon0bfbaecf1408 typeref:typename:char *
+addresses guest/hals/ril/reference-libril/ril.h /^ char * addresses; \/* A space-delimited list of addresses with optional "\/" prefi/;" m struct:__anon0bfbaecf1508 typeref:typename:char *
+addresses guest/hals/ril/reference-libril/ril.h /^ char * addresses; \/* A space-delimited list of addresses with optional "\/" prefi/;" m struct:__anon0bfbaecf1608 typeref:typename:char *
+addresses host/commands/modem_simulator/data_service.h /^ std::string addresses;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:std::string
+aid guest/hals/ril/reference-libril/ril.h /^ char * aid; \/* is AID(application ID) of the card application *\/$/;" m struct:__anon0bfbaecf4108 typeref:typename:char *
+aid guest/hals/ril/reference-libril/ril.h /^ char *aid; \/* AID value, See ETSI 102.221 8.1 and 101.220 4,$/;" m struct:__anon0bfbaecfc208 typeref:typename:char *
+aidPtr guest/hals/ril/reference-libril/ril.h /^ char * aidPtr; \/* AID value, See ETSI 102.221 and 101.220*\/$/;" m struct:__anon0bfbaecfa308 typeref:typename:char *
+aidPtr guest/hals/ril/reference-libril/ril.h /^ char *aidPtr; \/* AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. *\/$/;" m struct:__anon0bfbaecf1e08 typeref:typename:char *
+aid_ptr guest/hals/ril/reference-libril/ril.h /^ char *aid_ptr; \/* null terminated string, e.g., from 0xA0, 0x00 -> 0x41,$/;" m struct:__anon0bfbaecf3808 typeref:typename:char *
+aidl guest/hals/health/storage/Storage.cpp /^namespace aidl::android::hardware::health::storage {$/;" n file:
+aidl guest/hals/health/storage/Storage.h /^namespace aidl::android::hardware::health::storage {$/;" n
+aidl guest/hals/keymint/remote/remote_keymint_device.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n file:
+aidl guest/hals/keymint/remote/remote_keymint_device.h /^namespace aidl::android::hardware::security::keymint {$/;" n
+aidl guest/hals/keymint/remote/remote_keymint_operation.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n file:
+aidl guest/hals/keymint/remote/remote_keymint_operation.h /^namespace aidl::android::hardware::security::keymint {$/;" n
+aidl guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n file:
+aidl guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^namespace aidl::android::hardware::security::keymint {$/;" n
+aidl guest/hals/keymint/remote/remote_secure_clock.cpp /^namespace aidl::android::hardware::security::secureclock {$/;" n file:
+aidl guest/hals/keymint/remote/remote_secure_clock.h /^namespace aidl::android::hardware::security::secureclock {$/;" n
+aidl guest/hals/keymint/remote/remote_shared_secret.cpp /^namespace aidl::android::hardware::security::sharedsecret {$/;" n file:
+aidl guest/hals/keymint/remote/remote_shared_secret.h /^namespace aidl::android::hardware::security::sharedsecret {$/;" n
+ajaxPostJson host/frontend/webrtc_operator/assets/js/server_connector.js /^async function ajaxPostJson(url, data) {$/;" f
+alertPitch guest/hals/ril/reference-libril/ril.h /^ char alertPitch; \/* as defined 3.7.5.5-2 *\/$/;" m struct:__anon0bfbaecf1008 typeref:typename:char
+alfaCombineChannel host/libs/confui/host_renderer.cc /^static teeui::Color alfaCombineChannel(std::uint32_t shift, double alfa,$/;" f namespace:cuttlefish::confui typeref:typename:teeui::Color file:
+aliases_ common/libs/utils/flag_parser.h /^ std::vector<FlagAlias> aliases_;$/;" m class:cuttlefish::Flag typeref:typename:std::vector<FlagAlias>
+align_size host/commands/append_squashfs_overlay/src/main.rs /^fn align_size(size: u64, alignment: u64) -> u64 {$/;" f
+allAidlManifestInterfaces tests/hal/hal_implementation_test.cpp /^static std::set<VersionedAidlPackage> allAidlManifestInterfaces() {$/;" f typeref:typename:std::set<VersionedAidlPackage> file:
+allHidlManifestInterfaces tests/hal/hal_implementation_test.cpp /^static std::set<FQName> allHidlManifestInterfaces() {$/;" f typeref:typename:std::set<FQName> file:
+allTreeHidlInterfaces tests/hal/hal_implementation_test.cpp /^static std::set<FQName> allTreeHidlInterfaces() {$/;" f typeref:typename:std::set<FQName> file:
+allocatePduSessionId guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::allocatePduSessionId(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+allocatePduSessionIdResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::allocatePduSessionIdResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+allowedCarriersPrioritized guest/hals/ril/reference-libril/ril.h /^ int allowedCarriersPrioritized; \/* allowed list prioritized *\/$/;" m struct:__anon0bfbaecf2908 typeref:typename:int
+allowed_carriers guest/hals/ril/reference-libril/ril.h /^ RIL_Carrier * allowed_carriers; \/* allowed carriers *\/$/;" m struct:__anon0bfbaecf2708 typeref:typename:RIL_Carrier *
+allowed_carriers guest/hals/ril/reference-libril/ril.h /^ RIL_Carrier * allowed_carriers; \/* allowed carriers *\/$/;" m struct:__anon0bfbaecf2908 typeref:typename:RIL_Carrier *
+allowed_config_presets_ host/libs/config/config_flag.cpp /^ std::set<std::string> allowed_config_presets_;$/;" m class:cuttlefish::__anon2e549bd00111::ConfigReader typeref:typename:std::set<std::string> file:
+alphaLong guest/hals/ril/reference-libril/ril.h /^ char alphaLong[32]; \/* Long alpha Operator Name String or Enhanced Operator Name String.*/;" m struct:__anon0bfbaecf6008 typeref:typename:char[32]
+alphaShort guest/hals/ril/reference-libril/ril.h /^ char alphaShort[32]; \/* Short alpha Operator Name String or Enhanced Operator Name String /;" m struct:__anon0bfbaecf6008 typeref:typename:char[32]
+alpha_buf guest/hals/ril/reference-libril/ril.h /^ char alpha_buf[CDMA_ALPHA_INFO_BUFFER_LENGTH];$/;" m struct:__anon0bfbaecf8208 typeref:typename:char[]
+alpha_len guest/hals/ril/reference-libril/ril.h /^ char alpha_len;$/;" m struct:__anon0bfbaecf8208 typeref:typename:char
+als guest/hals/ril/reference-libril/ril.h /^ char als; \/* ALS line indicator if available$/;" m struct:__anon0bfbaecf1108 typeref:typename:char
+and_mode_cv_ host/libs/confui/host_mode_ctrl.h /^ std::condition_variable and_mode_cv_;$/;" m class:cuttlefish::HostModeCtrl typeref:typename:std::condition_variable
+and_mode_cv_ host/libs/screen_connector/screen_connector_ctrl.h /^ std::condition_variable and_mode_cv_;$/;" m class:cuttlefish::ScreenConnectorCtrl typeref:typename:std::condition_variable
+android guest/hals/bt/remote/remote_bluetooth.cpp /^namespace android {$/;" n file:
+android guest/hals/bt/remote/remote_bluetooth.h /^namespace android {$/;" n
+android guest/hals/camera/cached_stream_buffer.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n file:
+android guest/hals/camera/cached_stream_buffer.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n
+android guest/hals/camera/stream_buffer_cache.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n file:
+android guest/hals/camera/stream_buffer_cache.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n
+android guest/hals/camera/vsock_camera_device_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n file:
+android guest/hals/camera/vsock_camera_device_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n
+android guest/hals/camera/vsock_camera_device_session_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n file:
+android guest/hals/camera/vsock_camera_device_session_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n
+android guest/hals/camera/vsock_camera_metadata.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n file:
+android guest/hals/camera/vsock_camera_metadata.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n
+android guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n file:
+android guest/hals/camera/vsock_camera_provider_2_7.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n
+android guest/hals/camera/vsock_camera_server.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n file:
+android guest/hals/camera/vsock_camera_server.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n
+android guest/hals/confirmationui/TrustyConfirmationUI.cpp /^namespace android {$/;" n file:
+android guest/hals/confirmationui/TrustyConfirmationUI.h /^namespace android {$/;" n
+android guest/hals/confirmationui/guest_session.cpp /^namespace android {$/;" n file:
+android guest/hals/confirmationui/guest_session.h /^namespace android {$/;" n
+android guest/hals/confirmationui/include/TrustyConfirmationuiHal.h /^namespace android {$/;" n
+android guest/hals/health/health.cpp /^namespace android {$/;" n file:
+android guest/hals/health/storage/Storage.cpp /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl file:
+android guest/hals/health/storage/Storage.h /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl
+android guest/hals/keymint/remote/remote_keymint_device.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl file:
+android guest/hals/keymint/remote/remote_keymint_device.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl
+android guest/hals/keymint/remote/remote_keymint_operation.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl file:
+android guest/hals/keymint/remote/remote_keymint_operation.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl
+android guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl file:
+android guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl
+android guest/hals/keymint/remote/remote_secure_clock.cpp /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl file:
+android guest/hals/keymint/remote/remote_secure_clock.h /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl
+android guest/hals/keymint/remote/remote_shared_secret.cpp /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl file:
+android guest/hals/keymint/remote/remote_shared_secret.h /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl
+android guest/hals/ril/reference-libril/ril.cpp /^namespace android {$/;" n file:
+android guest/hals/ril/reference-libril/ril_internal.h /^namespace android {$/;" n
+android guest/monitoring/cuttlefish_service/AndroidManifest.xml /^ package="com.android.google.gce.gceservice">$/;" n uri:http://schemas.android.com/apk/res/android
+android shared/overlays/SettingsProvider/AndroidManifest.xml /^ package="com.android.providers.settings.cuttlefish.overlay">$/;" n uri:http://schemas.android.com/apk/res/android
+android shared/overlays/core/AndroidManifest.xml /^ package="android.cuttlefish.overlay">$/;" n uri:http://schemas.android.com/apk/res/android
+android shared/phone/overlays/core/AndroidManifest.xml /^ package="android.cuttlefish.phone.overlay">$/;" n uri:http://schemas.android.com/apk/res/android
+android tests/ril/AndroidManifest.xml /^ android:sharedUserId="android.uid.system">$/;" n uri:http://schemas.android.com/apk/res/android
+android tests/wifi/AndroidManifest.xml /^ android:sharedUserId="android.uid.system">$/;" n uri:http://schemas.android.com/apk/res/android
+android_last_signal_time_ host/commands/modem_simulator/network_service.h /^ time_t android_last_signal_time_;$/;" m class:cuttlefish::NetworkService typeref:typename:time_t
+android_wifi_priv_cmd guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^typedef struct android_wifi_priv_cmd {$/;" s
+android_wifi_priv_cmd guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^} android_wifi_priv_cmd;$/;" t typeref:struct:android_wifi_priv_cmd
+ap_kernel_image host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::ap_kernel_image() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+ap_rootfs_image host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::ap_rootfs_image() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+apduReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::apduReq(int32_t token, SapApduType type, const hidl_vec<uint8_t>& command)/;" f class:SapImpl typeref:typename:Return<void>
+api_level host/commands/metrics/proto/cf_metrics_event.proto /^ optional int32 api_level = 7;$/;" f message:cuttlefish.MetricsEvent typeref:typename:int32
+apn guest/hals/ril/reference-libril/ril.h /^ char * apn; \/* ignored *\/$/;" m struct:__anon0bfbaecf1208 typeref:typename:char *
+apn guest/hals/ril/reference-libril/ril.h /^ char *apn; \/* the APN to connect to *\/$/;" m struct:__anon0bfbaecfc008 typeref:typename:char *
+apn guest/hals/ril/reference-libril/ril.h /^ char *apn; \/* the APN to connect to *\/$/;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+apn guest/hals/ril/reference-libril/ril.h /^ char* apn;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:char *
+apn guest/hals/ril/reference-libril/ril.h /^ char* apn;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+apn host/commands/modem_simulator/data_service.h /^ std::string apn;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:std::string
+app-controls host/frontend/webrtc_operator/assets/client.html /^ <div id='app-controls'>$/;" I
+app_label_ptr guest/hals/ril/reference-libril/ril.h /^ char *app_label_ptr; \/* null terminated string *\/$/;" m struct:__anon0bfbaecf3808 typeref:typename:char *
+app_state guest/hals/ril/reference-libril/ril.h /^ RIL_AppState app_state;$/;" m struct:__anon0bfbaecf3808 typeref:typename:RIL_AppState
+app_type guest/hals/ril/reference-libril/ril.h /^ RIL_AppType app_type;$/;" m struct:__anon0bfbaecf3808 typeref:typename:RIL_AppType
+appendPrintBuf guest/hals/ril/reference-libril/ril_internal.h /^ #define appendPrintBuf(/;" d
+applications guest/hals/ril/reference-libril/ril.h /^ RIL_AppStatusV1_5 applications[RIL_CARD_MAX_APPS];$/;" m struct:__anon0bfbaecf3f08 typeref:typename:RIL_AppStatusV1_5[]
+applications guest/hals/ril/reference-libril/ril.h /^ RIL_AppStatus applications[RIL_CARD_MAX_APPS];$/;" m struct:__anon0bfbaecf3908 typeref:typename:RIL_AppStatus[]
+applications guest/hals/ril/reference-libril/ril.h /^ RIL_AppStatus applications[RIL_CARD_MAX_APPS];$/;" m struct:__anon0bfbaecf3a08 typeref:typename:RIL_AppStatus[]
+applySignalPercentage host/commands/modem_simulator/network_service.cpp /^void NetworkService::applySignalPercentage(double percentd) {$/;" f class:cuttlefish::NetworkService typeref:typename:void
+arch_ host/libs/vm_manager/qemu_manager.h /^ Arch arch_;$/;" m class:cuttlefish::vm_manager::QemuManager typeref:typename:Arch
+areUiccApplicationsEnabled guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::areUiccApplicationsEnabled(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+areUiccApplicationsEnabled guest/hals/ril/reference-ril/reference-ril.c /^bool areUiccApplicationsEnabled = true;$/;" v typeref:typename:bool
+areUiccApplicationsEnabledResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::areUiccApplicationsEnabledResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+arfcn guest/hals/ril/reference-libril/ril.h /^ int arfcn; \/* 16-bit GSM Absolute RF channel number, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7808 typeref:typename:int
+arfcn guest/hals/ril/reference-libril/ril.h /^ int arfcn; \/* 16-bit GSM Absolute RF channel number; this value must be reported *\/$/;" m struct:__anon0bfbaecf5908 typeref:typename:int
+array host/frontend/webrtc_operator/assets/js/adb.js /^let array = new Uint8Array();$/;" v
+assembly_dir host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::assembly_dir() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+assets_dir_ host/libs/websocket/websocket_server.h /^ std::string assets_dir_;$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::string
+assigned_ip common/libs/utils/network.cpp /^ std::uint8_t assigned_ip[4];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[4] file:
+at_close guest/hals/ril/reference-ril/atchannel.c /^void at_close()$/;" f typeref:typename:void
+at_get_cme_error guest/hals/ril/reference-ril/atchannel.c /^AT_CME_Error at_get_cme_error(const ATResponse *p_response)$/;" f typeref:typename:AT_CME_Error
+at_handshake guest/hals/ril/reference-ril/atchannel.c /^int at_handshake()$/;" f typeref:typename:int
+at_open guest/hals/ril/reference-ril/atchannel.c /^int at_open(int fd, ATUnsolHandler h)$/;" f typeref:typename:int
+at_response_free guest/hals/ril/reference-ril/atchannel.c /^void at_response_free(ATResponse *p_response)$/;" f typeref:typename:void
+at_response_new guest/hals/ril/reference-ril/atchannel.c /^static ATResponse * at_response_new()$/;" f typeref:typename:ATResponse * file:
+at_send_command guest/hals/ril/reference-ril/atchannel.c /^int at_send_command (const char *command, ATResponse **pp_outResponse)$/;" f typeref:typename:int
+at_send_command_full guest/hals/ril/reference-ril/atchannel.c /^static int at_send_command_full (const char *command, ATCommandType type,$/;" f typeref:typename:int file:
+at_send_command_full_nolock guest/hals/ril/reference-ril/atchannel.c /^static int at_send_command_full_nolock (const char *command, ATCommandType type,$/;" f typeref:typename:int file:
+at_send_command_multiline guest/hals/ril/reference-ril/atchannel.c /^int at_send_command_multiline (const char *command,$/;" f typeref:typename:int
+at_send_command_numeric guest/hals/ril/reference-ril/atchannel.c /^int at_send_command_numeric (const char *command,$/;" f typeref:typename:int
+at_send_command_singleline guest/hals/ril/reference-ril/atchannel.c /^int at_send_command_singleline (const char *command,$/;" f typeref:typename:int
+at_send_command_sms guest/hals/ril/reference-ril/atchannel.c /^int at_send_command_sms (const char *command,$/;" f typeref:typename:int
+at_set_on_reader_closed guest/hals/ril/reference-ril/atchannel.c /^void at_set_on_reader_closed(void (*onClose)(void))$/;" f typeref:typename:void
+at_set_on_timeout guest/hals/ril/reference-ril/atchannel.c /^void at_set_on_timeout(void (*onTimeout)(void))$/;" f typeref:typename:void
+at_tok_hasmore guest/hals/ril/reference-ril/at_tok.c /^int at_tok_hasmore(char **p_cur)$/;" f typeref:typename:int
+at_tok_nextbool guest/hals/ril/reference-ril/at_tok.c /^int at_tok_nextbool(char **p_cur, char *p_out)$/;" f typeref:typename:int
+at_tok_nexthexint guest/hals/ril/reference-ril/at_tok.c /^int at_tok_nexthexint(char **p_cur, int *p_out)$/;" f typeref:typename:int
+at_tok_nextint guest/hals/ril/reference-ril/at_tok.c /^int at_tok_nextint(char **p_cur, int *p_out)$/;" f typeref:typename:int
+at_tok_nextint_base guest/hals/ril/reference-ril/at_tok.c /^static int at_tok_nextint_base(char **p_cur, int *p_out, int base, int uns)$/;" f typeref:typename:int file:
+at_tok_nextstr guest/hals/ril/reference-ril/at_tok.c /^int at_tok_nextstr(char **p_cur, char **p_out)$/;" f typeref:typename:int
+at_tok_start guest/hals/ril/reference-ril/at_tok.c /^int at_tok_start(char **p_cur)$/;" f typeref:typename:int
+atomic_mode_ host/libs/confui/host_mode_ctrl.h /^ std::atomic<ModeType> atomic_mode_;$/;" m class:cuttlefish::HostModeCtrl typeref:typename:std::atomic<ModeType>
+atomic_mode_ host/libs/screen_connector/screen_connector_ctrl.h /^ std::atomic<ModeType> atomic_mode_;$/;" m class:cuttlefish::ScreenConnectorCtrl typeref:typename:std::atomic<ModeType>
+atr guest/hals/ril/reference-libril/ril.h /^ char *atr;$/;" m struct:__anon0bfbaecf3b08 typeref:typename:char *
+atr guest/hals/ril/reference-libril/ril.h /^ char* atr;$/;" m struct:__anon0bfbaecfb908 typeref:typename:char *
+attestKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::attestKey(const hidl_vec<uint8_t>& keyToAttest,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+attestation_context_ host/commands/secure_env/tpm_keymaster_context.h /^ std::unique_ptr<TpmAttestationRecordContext> attestation_context_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::unique_ptr<TpmAttestationRecordContext>
+attr guest/hals/ril/reference-libril/rilSocketQueue.h /^ pthread_mutexattr_t attr;$/;" m class:Ril_queue typeref:typename:pthread_mutexattr_t
+attr1_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr1_length = 0x8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+attr1_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr1_length = 0x8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+attr1_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr1_type = kDummy1Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+attr1_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr1_type = kDummy1Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+attr1_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr1_value = kValue1;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint32_t file:
+attr1_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr1_value = kValue1;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint32_t file:
+attr2_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr2_length = 0x8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+attr2_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr2_length = 0x8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+attr2_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr2_type = kDummy2Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+attr2_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr2_type = kDummy2Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+attr2_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr2_value = kValue2;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint32_t file:
+attr2_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr2_value = kValue2;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint32_t file:
+attr_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_length = 0x10;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90208 typeref:typename:const uint16_t file:
+attr_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_length = 0x8; \/\/ 4 bytes of value + 4 bytes of header.$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90308 typeref:typename:const uint16_t file:
+attr_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_length = 0x8; \/\/ 4 bytes of value + 4 bytes of header.$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90508 typeref:typename:const uint16_t file:
+attr_length common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_length = 0x8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint16_t file:
+attr_length_i16 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_i16 = 6;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_i32 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_i32 = 8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_i64 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_i64 = 12;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_i8 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_i8 = 5;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_u16 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_u16 = 6;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_u32 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_u32 = 8;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_u64 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_u64 = 12;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_length_u8 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_length_u8 = 5;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_padding_i16 common/libs/net/netlink_request_test.cpp /^ uint8_t attr_padding_i16[2] = {0, 0};$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint8_t[2] file:
+attr_padding_i8 common/libs/net/netlink_request_test.cpp /^ uint8_t attr_padding_i8[3] = {0, 0, 0};$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint8_t[3] file:
+attr_padding_u16 common/libs/net/netlink_request_test.cpp /^ uint8_t attr_padding_u16[2] = {0, 0};$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint8_t[2] file:
+attr_padding_u8 common/libs/net/netlink_request_test.cpp /^ uint8_t attr_padding_u8[3] = {0, 0, 0};$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint8_t[3] file:
+attr_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_type = kDummyTag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90208 typeref:typename:const uint16_t file:
+attr_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_type = kDummyTag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90308 typeref:typename:const uint16_t file:
+attr_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_type = kDummyTag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90508 typeref:typename:const uint16_t file:
+attr_type common/libs/net/netlink_request_test.cpp /^ const uint16_t attr_type = kDummyTag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint16_t file:
+attr_type_i16 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_i16 = kDummyTag + 2;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_i32 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_i32 = kDummyTag + 1;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_i64 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_i64 = kDummyTag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_i8 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_i8 = kDummyTag + 3;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_u16 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_u16 = kDummyTag + 6;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_u32 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_u32 = kDummyTag + 5;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_u64 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_u64 = kDummyTag + 4;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_type_u8 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_type_u8 = kDummyTag + 7;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr_value = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90308 typeref:typename:const uint32_t file:
+attr_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr_value = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90508 typeref:typename:const uint32_t file:
+attr_value common/libs/net/netlink_request_test.cpp /^ const uint32_t attr_value = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint32_t file:
+attr_value_i16 common/libs/net/netlink_request_test.cpp /^ int16_t attr_value_i16 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:int16_t file:
+attr_value_i32 common/libs/net/netlink_request_test.cpp /^ int32_t attr_value_i32 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:int32_t file:
+attr_value_i64 common/libs/net/netlink_request_test.cpp /^ int64_t attr_value_i64 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:int64_t file:
+attr_value_i8 common/libs/net/netlink_request_test.cpp /^ int8_t attr_value_i8 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:int8_t file:
+attr_value_u16 common/libs/net/netlink_request_test.cpp /^ uint16_t attr_value_u16 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint16_t file:
+attr_value_u32 common/libs/net/netlink_request_test.cpp /^ uint32_t attr_value_u32 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint32_t file:
+attr_value_u64 common/libs/net/netlink_request_test.cpp /^ uint64_t attr_value_u64 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint64_t file:
+attr_value_u8 common/libs/net/netlink_request_test.cpp /^ uint8_t attr_value_u8 = kValue;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90408 typeref:typename:uint8_t file:
+attributes host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t attributes;$/;" m struct:cuttlefish::__anon02806fd80111::GptPartitionEntry typeref:typename:std::uint64_t file:
+audioCtrl guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_T53_AudioControlInfoRecord audioCtrl;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_T53_AudioControlInfoRecord
+audio_callback_ host/frontend/webrtc/lib/audio_device.h /^ webrtc::AudioTransport* audio_callback_ = nullptr;$/;" m class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:webrtc::AudioTransport *
+audio_device_module_ host/frontend/webrtc/lib/streamer.cpp /^ std::shared_ptr<AudioDeviceModuleWrapper> audio_device_module_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::shared_ptr<AudioDeviceModuleWrapper> file:
+audio_observers_ host/frontend/webrtc/lib/audio_track_source_impl.h /^ std::set<AudioObserver*> audio_observers_;$/;" m class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:std::set<AudioObserver * >
+audio_server_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD audio_server_;$/;" m class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:SharedFD file:
+audio_server_ host/frontend/webrtc/audio_handler.h /^ std::unique_ptr<AudioServer> audio_server_;$/;" m class:cuttlefish::AudioHandler typeref:typename:std::unique_ptr<AudioServer>
+audio_server_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::audio_server_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+audio_sink_ host/frontend/webrtc/audio_handler.h /^ std::shared_ptr<webrtc_streaming::AudioSink> audio_sink_;$/;" m class:cuttlefish::AudioHandler typeref:typename:std::shared_ptr<webrtc_streaming::AudioSink>
+audio_source_ host/frontend/webrtc/audio_handler.h /^ std::shared_ptr<webrtc_streaming::AudioSource> audio_source_;$/;" m class:cuttlefish::AudioHandler typeref:typename:std::shared_ptr<webrtc_streaming::AudioSource>
+audio_sources_ host/frontend/webrtc/lib/streamer.cpp /^ audio_sources_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::map<std::string,rtc::scoped_refptr<AudioTrackSourceImpl>> file:
+audiocontrol_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::audiocontrol_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+auth1 host/commands/secure_env/tpm_auth.cpp /^ESYS_TR TpmAuth::auth1() const {$/;" f class:cuttlefish::TpmAuth typeref:typename:ESYS_TR
+auth1_ host/commands/secure_env/tpm_auth.h /^ ESYS_TR auth1_;$/;" m class:cuttlefish::TpmAuth typeref:typename:ESYS_TR
+auth2 host/commands/secure_env/tpm_auth.cpp /^ESYS_TR TpmAuth::auth2() const {$/;" f class:cuttlefish::TpmAuth typeref:typename:ESYS_TR
+auth2_ host/commands/secure_env/tpm_auth.h /^ ESYS_TR auth2_;$/;" m class:cuttlefish::TpmAuth typeref:typename:ESYS_TR
+auth3 host/commands/secure_env/tpm_auth.cpp /^ESYS_TR TpmAuth::auth3() const {$/;" f class:cuttlefish::TpmAuth typeref:typename:ESYS_TR
+auth3_ host/commands/secure_env/tpm_auth.h /^ ESYS_TR auth3_;$/;" m class:cuttlefish::TpmAuth typeref:typename:ESYS_TR
+authContext guest/hals/ril/reference-libril/ril.h /^ int authContext; \/* P2 value of authentication command, see P2 parameter in$/;" m struct:__anon0bfbaecfc208 typeref:typename:int
+authData guest/hals/ril/reference-libril/ril.h /^ char *authData; \/* the challenge string in Base64 format, see 3GPP$/;" m struct:__anon0bfbaecfc208 typeref:typename:char *
+authType guest/hals/ril/reference-libril/ril.h /^ int authType;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+authType guest/hals/ril/reference-libril/ril.h /^ int authType;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+auth_token_key_t host/libs/confui/sign_utils.h /^using auth_token_key_t = std::array<std::uint8_t, 32>;$/;" t namespace:cuttlefish::confui::support typeref:typename:std::array<std::uint8_t,32>
+auth_token_timed_out host/commands/secure_env/tpm_keymaster_enforcement.cpp /^bool TpmKeymasterEnforcement::auth_token_timed_out($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:bool
+authtype guest/hals/ril/reference-libril/ril.h /^ int authtype; \/* authentication protocol used for this PDP context$/;" m struct:__anon0bfbaecfc008 typeref:typename:int
+authtype guest/hals/ril/reference-libril/ril.h /^ int authtype; \/* authentication protocol used for this PDP context$/;" m struct:__anon0bfbaecfc108 typeref:typename:int
+awaitConnection host/frontend/webrtc_operator/assets/js/adb.js /^function awaitConnection() {$/;" f
+awaitDataChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^function awaitDataChannel(pc, label, onMessage) {$/;" f
+backing_file_offset host/libs/image_aggregator/image_aggregator.cc /^ Be64 backing_file_offset;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be64 file:
+backing_file_size host/libs/image_aggregator/image_aggregator.cc /^ Be32 backing_file_size;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+backoff_ms host/frontend/webrtc/lib/ws_connection.cpp /^const uint32_t backoff_ms[] = {1000, 2000, 3000, 4000, 5000};$/;" v namespace:__anon14ee93270111 typeref:typename:const uint32_t[]
+backup_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t backup_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint64_t file:
+bands guest/hals/ril/reference-libril/ril.h /^ } bands;$/;" m struct:__anon0bfbaecfab08 typeref:union:__anon0bfbaecfab08::__anon0bfbaecfac0a
+bands guest/hals/ril/reference-libril/ril.h /^ } bands;$/;" m struct:__anon0bfbaecfae08 typeref:union:__anon0bfbaecfae08::__anon0bfbaecfaf0a
+bands_length guest/hals/ril/reference-libril/ril.h /^ uint32_t bands_length; \/\/ Length of bands$/;" m struct:__anon0bfbaecfab08 typeref:typename:uint32_t
+bands_length guest/hals/ril/reference-libril/ril.h /^ uint32_t bands_length; \/\/ Length of bands$/;" m struct:__anon0bfbaecfae08 typeref:typename:uint32_t
+bandwidth guest/hals/ril/reference-libril/ril.h /^ int32_t bandwidth; \/* Cell bandwidth, in kHz. *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int32_t
+base guest/hals/ril/reference-libril/ril.h /^ RIL_AppStatus base;$/;" m struct:__anon0bfbaecf3e08 typeref:typename:RIL_AppStatus
+base guest/hals/ril/reference-libril/ril.h /^ RIL_CardStatus_v1_2 base;$/;" m struct:__anon0bfbaecf3c08 typeref:typename:RIL_CardStatus_v1_2
+base guest/hals/ril/reference-libril/ril.h /^ RIL_CardStatus_v1_4 base;$/;" m struct:__anon0bfbaecf3f08 typeref:typename:RIL_CardStatus_v1_4
+base guest/hals/ril/reference-libril/ril.h /^ RIL_CardStatus_v6 base;$/;" m struct:__anon0bfbaecf3b08 typeref:typename:RIL_CardStatus_v6
+base guest/hals/ril/reference-libril/ril.h /^ RIL_SimSlotStatus base;$/;" m struct:__anon0bfbaecfba08 typeref:typename:RIL_SimSlotStatus
+base64_decode guest/hals/ril/reference-ril/base64util.cpp /^int base64_decode(const char *base64input, unsigned char *bindata) {$/;" f typeref:typename:int
+base64_encode guest/hals/ril/reference-ril/base64util.cpp /^char *base64_encode(const unsigned char *bindata, char *base64output,$/;" f typeref:typename:char *
+basestationId guest/hals/ril/reference-libril/ril.h /^ int basestationId; \/* Base Station Id 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5c08 typeref:typename:int
+basestationId guest/hals/ril/reference-libril/ril.h /^ int basestationId; \/* Base Station Id 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7c08 typeref:typename:int
+bc_address_ common/libs/net/network_interface.h /^ std::string bc_address_;$/;" m class:cuttlefish::NetworkInterface typeref:typename:std::string
+bcc_ host/commands/secure_env/tpm_remote_provisioning_context.h /^ cppbor::Array bcc_;$/;" m class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:cppbor::Array
+bearerBitmask guest/hals/ril/reference-libril/ril.h /^ int bearerBitmask; \/* the bearer bitmask. See RIL_RadioAccessFamily for the value /;" m struct:__anon0bfbaecfc108 typeref:typename:int
+bearerBitmask guest/hals/ril/reference-libril/ril.h /^ int bearerBitmask;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+bearer_proto guest/hals/ril/reference-libril/ril.h /^ char *bearer_proto; \/* One of the PDP_type values in TS 27.007 section 10.1.1.$/;" m struct:__anon0bfbaecfc308 typeref:typename:char *
+begin common/libs/fs/shared_select.h /^ const_iterator begin() const { return value_.begin(); }$/;" f class:cuttlefish::SharedFDSet typeref:typename:const_iterator
+begin common/libs/fs/shared_select.h /^ iterator begin() { return value_.begin(); }$/;" f class:cuttlefish::SharedFDSet typeref:typename:iterator
+begin guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+begin guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::begin($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+begin host/libs/confui/sign_utils.h /^ const uint8_t* begin() const { return data_; }$/;" f class:cuttlefish::confui::support::ByteBufferProxy typeref:typename:const uint8_t *
+begin_chs host/libs/config/mbr.h /^ std::uint8_t begin_chs[3];$/;" m struct:MbrPartitionEntry typeref:typename:std::uint8_t[3]
+bin_path fetcher.mk /^bin_path := $(notdir $(HOST_OUT_EXECUTABLES))$/;" m
+binary host/libs/websocket/websocket_handler.h /^ bool binary;$/;" m struct:cuttlefish::WebSocketHandler::WsBuffer typeref:typename:bool
+bind_compositor host/libs/wayland/wayland_compositor.cpp /^void bind_compositor(wl_client* client,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+bind_linux_dmabuf host/libs/wayland/wayland_dmabuf.cpp /^void bind_linux_dmabuf(wl_client* client,$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+bind_seat host/libs/wayland/wayland_seat.cpp /^void bind_seat(wl_client* client, void* data, uint32_t version, uint32_t id) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+bind_shell host/libs/wayland/wayland_shell.cpp /^void bind_shell(wl_client* client, void* data, uint32_t version, uint32_t id) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+bind_subcompositor host/libs/wayland/wayland_subcompositor.cpp /^void bind_subcompositor(wl_client* client,$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+bind_virtio_gpu_metadata host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^void bind_virtio_gpu_metadata(wl_client* client, void* data,$/;" f namespace:wayland::__anon027348120111 typeref:typename:void
+bitErrorRate guest/hals/ril/reference-libril/ril.h /^ int bitErrorRate; \/* bit error rate (0-7, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4608 typeref:typename:int
+bitErrorRate guest/hals/ril/reference-libril/ril.h /^ int bitErrorRate; \/* bit error rate (0-7, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4708 typeref:typename:int
+bitErrorRate guest/hals/ril/reference-libril/ril.h /^ int bitErrorRate; \/* bit error rate (0-7, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4808 typeref:typename:int
+bitmap guest/hals/ril/reference-ril/reference-ril.c /^ int bitmap;$/;" m struct:__anon70d7df6f0208 typeref:typename:int file:
+bits_per_sample host/frontend/webrtc/audio_handler.cpp /^ int bits_per_sample() const override { return bits_per_sample_; }$/;" f class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+bits_per_sample host/frontend/webrtc/audio_handler.h /^ int bits_per_sample = -1;$/;" m struct:cuttlefish::AudioHandler::StreamDesc typeref:typename:int
+bits_per_sample_ host/frontend/webrtc/audio_handler.cpp /^ int bits_per_sample_;$/;" m class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+blank_data_image_mb host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::blank_data_image_mb() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+bluetooth guest/hals/bt/remote/remote_bluetooth.cpp /^namespace bluetooth {$/;" n namespace:android::hardware file:
+bluetooth guest/hals/bt/remote/remote_bluetooth.h /^namespace bluetooth {$/;" n namespace:android::hardware
+bluetooth-console-button host/frontend/webrtc_operator/assets/client.html /^ <button id='bluetooth-console-button' title='Bluetooth console' class='material-icon/;" I
+bluetooth-console-close host/frontend/webrtc_operator/assets/client.html /^ <button id='bluetooth-console-close' title='Close' class='material-icons modal-close'>/;" I
+bluetooth-console-cmd-label host/frontend/webrtc_operator/assets/client.html /^ <tr><td width='1'><p id='bluetooth-console-cmd-label'>Command:<\/p><\/td><td width='/;" I
+bluetooth-console-input host/frontend/webrtc_operator/assets/client.html /^ <tr><td width='1'><p id='bluetooth-console-cmd-label'>Command:<\/p><\/td><td width='/;" I
+bluetooth-console-modal host/frontend/webrtc_operator/assets/client.html /^ <div id='bluetooth-console-modal' class='modal'>$/;" I
+bluetooth-console-modal-header host/frontend/webrtc_operator/assets/client.html /^ <div id='bluetooth-console-modal-header' class='modal-header'>$/;" I
+bluetooth-console-view host/frontend/webrtc_operator/assets/client.html /^ <tr><td colspan='2'><textarea id='bluetooth-console-view' readonly rows='10' cols='6/;" I
+bluetoothChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #bluetoothChannel;$/;" M class:DeviceConnection
+bluetooth_channel_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::scoped_refptr<webrtc::DataChannelInterface> bluetooth_channel_;$/;" m class:cuttlefish::webrtc_streaming::BluetoothChannelHandler typeref:typename:rtc::scoped_refptr<webrtc::DataChannelInterface> file:
+bluetooth_handler_ host/frontend/webrtc/connection_observer.cpp /^ bluetooth_handler_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:std::shared_ptr<cuttlefish::webrtc_streaming::BluetoothHandler> file:
+bluetooth_handler_ host/frontend/webrtc/lib/client_handler.h /^ std::unique_ptr<BluetoothChannelHandler> bluetooth_handler_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::unique_ptr<BluetoothChannelHandler>
+body host/frontend/webrtc_operator/assets/index.css /^body {$/;" s
+body host/frontend/webrtc_operator/assets/style.css /^body {$/;" s
+bootStateMachineComponent host/commands/run_cvd/boot_state_machine.cc /^bootStateMachineComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig,KernelLogPipeProvider>>
+boot_event_handler_ host/commands/run_cvd/boot_state_machine.cc /^ std::thread boot_event_handler_;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:std::thread file:
+boot_filename common/libs/utils/network.cpp /^ std::uint8_t boot_filename[128];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[128] file:
+boot_patchlevel_ host/commands/secure_env/tpm_key_blob_maker.h /^ std::optional<uint32_t> boot_patchlevel_;$/;" m class:cuttlefish::TpmKeyBlobMaker typeref:typename:std::optional<uint32_t>
+boot_patchlevel_ host/commands/secure_env/tpm_keymaster_context.h /^ std::optional<uint32_t> boot_patchlevel_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::optional<uint32_t>
+boot_signature host/libs/config/mbr.h /^ std::uint8_t boot_signature[2];$/;" m struct:MasterBootRecord typeref:typename:std::uint8_t[2]
+boot_slot host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::boot_slot() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+bootconfig_supported host/commands/assemble_cvd/flags.h /^ bool bootconfig_supported;$/;" m struct:cuttlefish::KernelConfig typeref:typename:bool
+bootconfig_supported host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::bootconfig_supported() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+bootloader host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::bootloader() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+bootstrap_code host/libs/config/mbr.h /^ std::uint8_t bootstrap_code[446];$/;" m struct:MasterBootRecord typeref:typename:std::uint8_t[446]
+bridge_name_ host/libs/allocd/resource.h /^ std::string bridge_name_;$/;" m class:cuttlefish::EthernetIface typeref:typename:std::string
+broadcast common/libs/device_config/device_config.proto /^ string broadcast = 4;$/;" f message:cuttlefish.DeviceConfig.RILConfig typeref:typename:string
+broadcast_config_ host/commands/modem_simulator/sms_service.h /^ BroadcastConfig broadcast_config_;$/;" m class:cuttlefish::SmsService typeref:typename:BroadcastConfig
+broadcaster_ host/frontend/webrtc/lib/video_track_source_impl.h /^ rtc::VideoBroadcaster broadcaster_;$/;" m class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:rtc::VideoBroadcaster
+bsic guest/hals/ril/reference-libril/ril.h /^ uint8_t bsic; \/* 6-bit Base Station Identity Code; 0xFF if unknown *\/$/;" m struct:__anon0bfbaecf5908 typeref:typename:uint8_t
+bsic guest/hals/ril/reference-libril/ril.h /^ uint8_t bsic;\/* 6-bit Base Station Identity Code, 0xFF if unknown *\/$/;" m struct:__anon0bfbaecf7808 typeref:typename:uint8_t
+buf guest/hals/ril/reference-libril/ril.h /^ char buf[CDMA_NUMBER_INFO_BUFFER_LENGTH];$/;" m struct:__anon0bfbaecf8308 typeref:typename:char[]
+buf guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^ char* buf;$/;" m struct:android_wifi_priv_cmd typeref:typename:char *
+buf_ common/libs/fs/shared_fd_stream.h /^ SharedFDStreambuf buf_;$/;" m class:cuttlefish::SharedFDIstream typeref:typename:SharedFDStreambuf
+buf_ common/libs/fs/shared_fd_stream.h /^ SharedFDStreambuf buf_;$/;" m class:cuttlefish::SharedFDOstream typeref:typename:SharedFDStreambuf
+buf_ host/frontend/webrtc/display_handler.h /^ std::unique_ptr<CvdVideoFrameBuffer> buf_;$/;" m struct:cuttlefish::WebRtcScProcessedFrame typeref:typename:std::unique_ptr<CvdVideoFrameBuffer>
+buffer host/frontend/webrtc/audio_handler.h /^ HoldingBuffer buffer;$/;" m struct:cuttlefish::AudioHandler::StreamDesc typeref:typename:HoldingBuffer
+buffer host/frontend/webrtc/audio_handler.h /^ std::vector<uint8_t> buffer;$/;" m struct:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:std::vector<uint8_t>
+bufferId guest/hals/camera/cached_stream_buffer.h /^ uint64_t bufferId() const { return buffer_id_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:uint64_t
+buffer_ guest/hals/camera/cached_stream_buffer.h /^ buffer_handle_t buffer_;$/;" m class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:buffer_handle_t
+buffer_ host/frontend/webrtc/audio_handler.cpp /^ const uint8_t* buffer_;$/;" m class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:const uint8_t * file:
+buffer_ host/frontend/webrtc/connection_observer.cpp /^ std::vector<T> buffer_;$/;" m struct:cuttlefish::InputEventBufferImpl typeref:typename:std::vector<T> file:
+buffer_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::vector<uint8_t> buffer_;$/;" m struct:WsConnectionImpl::WsBuffer typeref:typename:std::vector<uint8_t> file:
+buffer_ host/libs/audio_connector/buffers.h /^ const volatile uint8_t* const buffer_;$/;" m class:cuttlefish::TxBuffer typeref:typename:const volatile uint8_t * const
+buffer_ host/libs/audio_connector/buffers.h /^ volatile uint8_t* const buffer_;$/;" m class:cuttlefish::RxBuffer typeref:typename:volatile uint8_t * const
+buffer_ host/libs/screen_connector/screen_connector_queue.h /^ std::deque<T> buffer_;$/;" m class:cuttlefish::ScreenConnectorQueue typeref:typename:std::deque<T>
+buffer_bytes host/libs/audio_connector/commands.h /^ uint32_t buffer_bytes() const { return buffer_bytes_; }$/;" f struct:cuttlefish::StreamSetParamsCommand typeref:typename:uint32_t
+buffer_bytes host/libs/audio_connector/shm_layout.h /^ Le32 buffer_bytes;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:Le32
+buffer_bytes_ host/libs/audio_connector/commands.h /^ const uint32_t buffer_bytes_;$/;" m struct:cuttlefish::StreamSetParamsCommand typeref:typename:const uint32_t
+buffer_cache_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ StreamBufferCache buffer_cache_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:StreamBufferCache
+buffer_count guest/hals/camera/vsock_camera_device_session_3_4.h /^ uint32_t buffer_count;$/;" m struct:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::ReadVsockRequest typeref:typename:uint32_t
+buffer_destroy host/libs/wayland/wayland_dmabuf.cpp /^void buffer_destroy(wl_client*, wl_resource* buffer) {$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+buffer_id_ guest/hals/camera/cached_stream_buffer.h /^ uint64_t buffer_id_;$/;" m class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:uint64_t
+buffer_ids guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::vector<uint64_t> buffer_ids;$/;" m struct:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::ReadVsockRequest typeref:typename:std::vector<uint64_t>
+buffer_implementation host/libs/wayland/wayland_dmabuf.cpp /^const struct wl_buffer_interface buffer_implementation = {$/;" v namespace:wayland::__anon8f5be4990111 typeref:typename:const struct wl_buffer_interface
+buffer_len host/libs/audio_connector/shm_layout.h /^ uint32_t buffer_len;$/;" m struct:cuttlefish::IoTransferMsg typeref:typename:uint32_t
+buffer_offset host/libs/audio_connector/shm_layout.h /^ uint32_t buffer_offset;$/;" m struct:cuttlefish::IoStatusMsg typeref:typename:uint32_t
+buffer_offset host/libs/audio_connector/shm_layout.h /^ uint32_t buffer_offset;$/;" m struct:cuttlefish::IoTransferMsg typeref:typename:uint32_t
+buffer_queue_ host/libs/websocket/websocket_handler.h /^ std::deque<WsBuffer> buffer_queue_;$/;" m class:cuttlefish::WebSocketHandler typeref:typename:std::deque<WsBuffer>
+buffer_status_ host/libs/confui/cbor.h /^ Error buffer_status_;$/;" m class:cuttlefish::confui::Cbor typeref:typename:Error
+build_id host/libs/config/fetcher_config.h /^ std::string build_id;$/;" m struct:cuttlefish::CvdFile typeref:typename:std::string
+build_instance tools/create_base_image.go /^var build_instance string$/;" v package:main typeref:typename:string
+build_project tools/create_base_image.go /^var build_project string$/;" v package:main typeref:typename:string
+build_slist host/commands/fetcher/curl_wrapper.cc /^curl_slist* build_slist(const std::vector<std::string>& strings) {$/;" f namespace:cuttlefish::__anondfffca8d0111 typeref:typename:curl_slist *
+build_target host/libs/config/fetcher_config.h /^ std::string build_target;$/;" m struct:cuttlefish::CvdFile typeref:typename:std::string
+build_zone tools/create_base_image.go /^var build_zone string$/;" v package:main typeref:typename:string
+bus_type_ guest/commands/vsoc_input_service/virtual_device_base.h /^ const uint16_t bus_type_;$/;" m class:cuttlefish_input_service::VirtualDeviceBase typeref:typename:const uint16_t
+button host/example_custom_actions/custom_action_config.json /^ "button":{$/;" o object:0
+button shared/config/config_foldable.json /^ "button":{$/;" o object:custom_actions.0
+button shared/config/config_foldable.json /^ "button":{$/;" o object:custom_actions.1
+buttons host/example_custom_actions/custom_action_config.json /^ "buttons":[$/;" a object:1
+buttons host/frontend/webrtc_operator/assets/js/app.js /^ #buttons = {};$/;" M class:DeviceControlApp
+buttons host/libs/config/custom_actions.h /^ std::vector<ControlPanelButton> buttons;$/;" m struct:cuttlefish::CustomActionConfig typeref:typename:std::vector<ControlPanelButton>
+cache_ guest/hals/camera/stream_buffer_cache.h /^ std::vector<std::shared_ptr<CachedStreamBuffer>> cache_;$/;" m class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:std::vector<std::shared_ptr<CachedStreamBuffer>>
+cached_gnss_raw host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::string cached_gnss_raw;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::string file:
+cached_gnss_raw_mutex host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::mutex cached_gnss_raw_mutex;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::mutex file:
+cached_jpeg_ guest/hals/camera/vsock_frame_provider.h /^ std::vector<char> cached_jpeg_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::vector<char>
+cached_nmea host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::string cached_nmea;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::string file:
+cached_nmea_mutex host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::mutex cached_nmea_mutex;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::mutex file:
+calcNextTimeout guest/hals/ril/reference-libril/ril_event.cpp /^static int calcNextTimeout(struct timeval * tv)$/;" f typeref:typename:int file:
+callFromCLCCLine guest/hals/ril/reference-ril/reference-ril.c /^static int callFromCLCCLine(char *line, RIL_Call *p_call)$/;" f typeref:typename:int file:
+callRingInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::callRingInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+callStateChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::callStateChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+callStateToString guest/hals/ril/reference-libril/ril.cpp /^callStateToString(RIL_CallState s) {$/;" f namespace:android typeref:typename:const char *
+call_forward_infos_ host/commands/modem_simulator/sup_service.h /^ std::vector<CallForwardInfo> call_forward_infos_;$/;" m class:cuttlefish::SupService typeref:typename:std::vector<CallForwardInfo>
+call_state host/commands/modem_simulator/call_service.h /^ CallState call_state;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:CallState
+call_waiting_info_ host/commands/modem_simulator/sup_service.h /^ CallWaitingInfo call_waiting_info_;$/;" m class:cuttlefish::SupService typeref:typename:CallWaitingInfo
+callback_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ const sp<ICameraDeviceCallback> callback_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:const sp<ICameraDeviceCallback>
+callback_ host/libs/wayland/wayland_surfaces.h /^ std::optional<FrameCallback> callback_;$/;" m class:wayland::Surfaces typeref:typename:std::optional<FrameCallback>
+callback_from_streamer_ host/libs/screen_connector/screen_connector.h /^ GenerateProcessedFrameCallback callback_from_streamer_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:GenerateProcessedFrameCallback
+callback_mutex_ host/libs/wayland/wayland_surfaces.h /^ std::mutex callback_mutex_;$/;" m class:wayland::Surfaces typeref:typename:std::mutex
+callback_t guest/hals/camera/vsock_camera_server.h /^ using callback_t =$/;" t class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer
+callback_thread_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::thread callback_thread_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::thread
+callbacks_ guest/hals/camera/vsock_camera_provider_2_7.h /^ sp<ICameraProviderCallback> callbacks_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:sp<ICameraProviderCallback>
+camera guest/hals/camera/cached_stream_buffer.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/cached_stream_buffer.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware
+camera guest/hals/camera/stream_buffer_cache.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/stream_buffer_cache.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware
+camera guest/hals/camera/vsock_camera_device_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/vsock_camera_device_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware
+camera guest/hals/camera/vsock_camera_device_session_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/vsock_camera_device_session_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware
+camera guest/hals/camera/vsock_camera_metadata.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/vsock_camera_metadata.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware
+camera guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/vsock_camera_provider_2_7.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware
+camera guest/hals/camera/vsock_camera_server.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware file:
+camera guest/hals/camera/vsock_camera_server.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware
+camera-control host/frontend/webrtc_operator/assets/client.html /^ <div id="camera-control" title="Capture Camera"><\/div>$/;" I
+cameraDataChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #cameraDataChannel;$/;" M class:DeviceConnection
+cameraEnabled host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ get cameraEnabled() {$/;" G class:DeviceConnection
+cameraHeight host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ get cameraHeight() {$/;" G class:DeviceConnection
+cameraInputQueue host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #cameraInputQueue;$/;" M class:DeviceConnection
+cameraSenders host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #cameraSenders = [];$/;" M class:DeviceConnection
+cameraWidth host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ get cameraWidth() {$/;" G class:DeviceConnection
+camera_channel_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::scoped_refptr<webrtc::DataChannelInterface> camera_channel_;$/;" m class:cuttlefish::webrtc_streaming::CameraChannelHandler typeref:typename:rtc::scoped_refptr<webrtc::DataChannelInterface> file:
+camera_characteristics_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ VsockCameraMetadata camera_characteristics_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:VsockCameraMetadata
+camera_controller_ host/frontend/webrtc/connection_observer.cpp /^ cuttlefish::CameraController *camera_controller_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:cuttlefish::CameraController * file:
+camera_controller_ host/frontend/webrtc/connection_observer.h /^ cuttlefish::CameraController* camera_controller_ = nullptr;$/;" m class:cuttlefish::CfConnectionObserverFactory typeref:typename:cuttlefish::CameraController *
+camera_data_handler_ host/frontend/webrtc/lib/client_handler.h /^ std::unique_ptr<CameraChannelHandler> camera_data_handler_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::unique_ptr<CameraChannelHandler>
+camera_res_x host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #camera_res_x;$/;" M class:DeviceConnection
+camera_res_y host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #camera_res_y;$/;" M class:DeviceConnection
+camera_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::camera_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+camera_session_active_ host/frontend/webrtc/lib/camera_streamer.h /^ std::atomic<bool> camera_session_active_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::atomic<bool>
+camera_streamer_ host/frontend/webrtc/lib/streamer.cpp /^ std::unique_ptr<CameraStreamer> camera_streamer_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::unique_ptr<CameraStreamer> file:
+camera_track_ host/frontend/webrtc/lib/client_handler.h /^ std::unique_ptr<ClientVideoTrackImpl> camera_track_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::unique_ptr<ClientVideoTrackImpl>
+can_init_gles2_on_egl_surfaceless host/libs/graphics_detector/graphics_detector.h /^ bool can_init_gles2_on_egl_surfaceless = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+can_present_number host/commands/modem_simulator/call_service.h /^ bool can_present_number;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+cancel guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public boolean cancel(boolean canInterrupt) {$/;" m class:GceFuture
+cancel guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public synchronized void cancel() {$/;" m class:GceWifiManager.MonitorWifiJob
+cancelHandover guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::cancelHandover(int32_t serial, int32_t callId) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+cancelHandoverResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cancelHandoverResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+cancelJpegRequest guest/hals/camera/vsock_frame_provider.cpp /^void VsockFrameProvider::cancelJpegRequest() { jpeg_pending_ = false; }$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:void
+cancelPendingUssd guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::cancelPendingUssd(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+cancelPendingUssdResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cancelPendingUssdResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cancelled guest/hals/ril/reference-libril/ril_internal.h /^ char cancelled;$/;" m struct:android::RequestInfo typeref:typename:char
+capacity host/commands/health/health.cpp /^int capacity() {$/;" f typeref:typename:int
+capacity_ common/libs/concurrency/semaphore.h /^ const unsigned int capacity_; \/\/ inclusive upper limit$/;" m class:cuttlefish::Semaphore typeref:typename:const unsigned int
+cardState guest/hals/ril/reference-libril/ril.h /^ RIL_CardState cardState;$/;" m struct:__anon0bfbaecfb908 typeref:typename:RIL_CardState
+card_state guest/hals/ril/reference-libril/ril.h /^ RIL_CardState card_state;$/;" m struct:__anon0bfbaecf3908 typeref:typename:RIL_CardState
+card_state guest/hals/ril/reference-libril/ril.h /^ RIL_CardState card_state;$/;" m struct:__anon0bfbaecf3a08 typeref:typename:RIL_CardState
+carrierInfoForImsiEncryption guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::carrierInfoForImsiEncryption(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+carrierKey guest/hals/ril/reference-libril/ril.h /^ uint8_t* carrierKey; \/* Public Key from the Carrier used to encrypt the$/;" m struct:__anon0bfbaecf2c08 typeref:typename:uint8_t *
+carrierKey guest/hals/ril/reference-libril/ril.h /^ uint8_t * carrierKey; \/* Public Key from the Carrier used to encrypt the$/;" m struct:__anon0bfbaecf2a08 typeref:typename:uint8_t *
+carrierKeyLength guest/hals/ril/reference-libril/ril.h /^ int32_t carrierKeyLength; \/* Length of the Public Key. *\/$/;" m struct:__anon0bfbaecf2c08 typeref:typename:int32_t
+carrierKeyLength guest/hals/ril/reference-libril/ril.h /^ int32_t carrierKeyLength; \/* Length of the Public Key. *\/$/;" m struct:__anon0bfbaecf2a08 typeref:typename:int32_t
+categories guest/hals/ril/reference-libril/ril.h /^ RIL_EmergencyServiceCategory categories; \/* The bitfield of @1.4::EmergencyServiceCategory(/;" m struct:__anon0bfbaecfb708 typeref:typename:RIL_EmergencyServiceCategory
+cause guest/hals/ril/reference-libril/ril.h /^ char cause;$/;" m struct:__anon0bfbaecf8708 typeref:typename:char
+cause_code guest/hals/ril/reference-libril/ril.h /^ RIL_LastCallFailCause cause_code;$/;" m struct:__anon0bfbaecf2e08 typeref:typename:RIL_LastCallFailCause
+cb host/commands/modem_simulator/thread_looper.h /^ Callback cb;$/;" m struct:cuttlefish::ThreadLooper::Event typeref:typename:Callback
+cbor_ host/libs/confui/session.h /^ std::unique_ptr<Cbor> cbor_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::unique_ptr<Cbor>
+cdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoCdma cdma;$/;" m union:__anon0bfbaecf7008::__anon0bfbaecf710a typeref:typename:RIL_CellInfoCdma
+cdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoCdma cdma;$/;" m union:__anon0bfbaecf7208::__anon0bfbaecf730a typeref:typename:RIL_CellInfoCdma
+cdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoCdma cdma;$/;" m union:__anon0bfbaecf6e08::__anon0bfbaecf6f0a typeref:typename:RIL_CellInfoCdma
+cdmaCallWaitingInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaCallWaitingInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cdmaInfoRecInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaInfoRecInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cdmaMessage guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SMS_Message* cdmaMessage;$/;" m union:__anon0bfbaecf1808::__anon0bfbaecf190a typeref:typename:RIL_CDMA_SMS_Message *
+cdmaNewSmsInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaNewSmsInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+cdmaOtaProvisionStatusInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaOtaProvisionStatusInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cdmaPrlChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaPrlChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cdmaRuimSmsStorageFullInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaRuimSmsStorageFullInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cdmaSms guest/hals/ril/reference-libril/ril_service.cpp /^ RIL_CDMA_SMS_Message cdmaSms;$/;" m struct:ImsCdmaSms typeref:typename:RIL_CDMA_SMS_Message file:
+cdmaSubscriptionSourceChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cdmaSubscriptionSourceChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cdma_dbm host/commands/modem_simulator/network_service.h /^ int cdma_dbm; \/* Valid values are positive integers. This value is the actual RSSI value$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+cdma_ecio host/commands/modem_simulator/network_service.h /^ int cdma_ecio; \/* Valid values are positive integers. This value is the actual Ec\/Io mul/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+cdma_roaming_preference_ host/commands/modem_simulator/sim_service.h /^ int cdma_roaming_preference_;$/;" m class:cuttlefish::SimService typeref:typename:int
+cdma_subscription_app_index guest/hals/ril/reference-libril/ril.h /^ int cdma_subscription_app_index; \/* value < RIL_CARD_MAX_APPS, -1 if none *\/$/;" m struct:__anon0bfbaecf3908 typeref:typename:int
+cdma_subscription_app_index guest/hals/ril/reference-libril/ril.h /^ int cdma_subscription_app_index; \/* value < RIL_CARD_MAX_APPS, -1 if none *\/$/;" m struct:__anon0bfbaecf3a08 typeref:typename:int
+cdma_subscription_source_ host/commands/modem_simulator/sim_service.h /^ int cdma_subscription_source_;$/;" m class:cuttlefish::SimService typeref:typename:int
+cellIdentity guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentity_v16 cellIdentity; \/\/ Current cell information$/;" m struct:__anon0bfbaecf8008 typeref:typename:RIL_CellIdentity_v16
+cellIdentity guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentity_v16 cellIdentity; \/\/ current cell information$/;" m struct:__anon0bfbaecf7f08 typeref:typename:RIL_CellIdentity_v16
+cellIdentityCdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityCdma_v1_2 cellIdentityCdma;$/;" m union:__anon0bfbaecf7d08::__anon0bfbaecf7e0a typeref:typename:RIL_CellIdentityCdma_v1_2
+cellIdentityCdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityCdma cellIdentityCdma;$/;" m union:__anon0bfbaecf7408::__anon0bfbaecf750a typeref:typename:RIL_CellIdentityCdma
+cellIdentityCdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityCdma cellIdentityCdma;$/;" m union:__anon0bfbaecf7608::__anon0bfbaecf770a typeref:typename:RIL_CellIdentityCdma
+cellIdentityCdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityCdma cellIdentityCdma;$/;" m struct:__anon0bfbaecf6608 typeref:typename:RIL_CellIdentityCdma
+cellIdentityGsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityGsm_v1_2 cellIdentityGsm;$/;" m union:__anon0bfbaecf7d08::__anon0bfbaecf7e0a typeref:typename:RIL_CellIdentityGsm_v1_2
+cellIdentityGsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityGsm_v12 cellIdentityGsm;$/;" m union:__anon0bfbaecf7408::__anon0bfbaecf750a typeref:typename:RIL_CellIdentityGsm_v12
+cellIdentityGsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityGsm_v12 cellIdentityGsm;$/;" m union:__anon0bfbaecf7608::__anon0bfbaecf770a typeref:typename:RIL_CellIdentityGsm_v12
+cellIdentityGsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityGsm cellIdentityGsm;$/;" m struct:__anon0bfbaecf6208 typeref:typename:RIL_CellIdentityGsm
+cellIdentityGsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityGsm_v12 cellIdentityGsm;$/;" m struct:__anon0bfbaecf6308 typeref:typename:RIL_CellIdentityGsm_v12
+cellIdentityLte guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityLte_v1_2 cellIdentityLte;$/;" m union:__anon0bfbaecf7d08::__anon0bfbaecf7e0a typeref:typename:RIL_CellIdentityLte_v1_2
+cellIdentityLte guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityLte_v12 cellIdentityLte;$/;" m union:__anon0bfbaecf7408::__anon0bfbaecf750a typeref:typename:RIL_CellIdentityLte_v12
+cellIdentityLte guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityLte_v12 cellIdentityLte;$/;" m union:__anon0bfbaecf7608::__anon0bfbaecf770a typeref:typename:RIL_CellIdentityLte_v12
+cellIdentityLte guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityLte cellIdentityLte;$/;" m struct:__anon0bfbaecf6708 typeref:typename:RIL_CellIdentityLte
+cellIdentityLte guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityLte_v12 cellIdentityLte;$/;" m struct:__anon0bfbaecf6808 typeref:typename:RIL_CellIdentityLte_v12
+cellIdentityNr guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityNr cellIdentityNr;$/;" m union:__anon0bfbaecf7608::__anon0bfbaecf770a typeref:typename:RIL_CellIdentityNr
+cellIdentityTdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityTdscdma_v1_2 cellIdentityTdscdma;$/;" m union:__anon0bfbaecf7d08::__anon0bfbaecf7e0a typeref:typename:RIL_CellIdentityTdscdma_v1_2
+cellIdentityTdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityTdscdma cellIdentityTdscdma;$/;" m union:__anon0bfbaecf7408::__anon0bfbaecf750a typeref:typename:RIL_CellIdentityTdscdma
+cellIdentityTdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityTdscdma cellIdentityTdscdma;$/;" m union:__anon0bfbaecf7608::__anon0bfbaecf770a typeref:typename:RIL_CellIdentityTdscdma
+cellIdentityTdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityTdscdma cellIdentityTdscdma;$/;" m struct:__anon0bfbaecf6908 typeref:typename:RIL_CellIdentityTdscdma
+cellIdentityWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityWcdma_v1_2 cellIdentityWcdma;$/;" m union:__anon0bfbaecf7d08::__anon0bfbaecf7e0a typeref:typename:RIL_CellIdentityWcdma_v1_2
+cellIdentityWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityWcdma_v12 cellIdentityWcdma;$/;" m union:__anon0bfbaecf7408::__anon0bfbaecf750a typeref:typename:RIL_CellIdentityWcdma_v12
+cellIdentityWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityWcdma_v12 cellIdentityWcdma;$/;" m union:__anon0bfbaecf7608::__anon0bfbaecf770a typeref:typename:RIL_CellIdentityWcdma_v12
+cellIdentityWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityWcdma cellIdentityWcdma;$/;" m struct:__anon0bfbaecf6408 typeref:typename:RIL_CellIdentityWcdma
+cellIdentityWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityWcdma_v12 cellIdentityWcdma;$/;" m struct:__anon0bfbaecf6508 typeref:typename:RIL_CellIdentityWcdma_v12
+cellInfoListInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::cellInfoListInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+cellInfoType guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoType cellInfoType;$/;" m struct:__anon0bfbaecf7d08 typeref:typename:RIL_CellInfoType
+cellInfoType guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoType cellInfoType; \/* cell type for selecting from union CellInfo *\/$/;" m struct:__anon0bfbaecf7208 typeref:typename:RIL_CellInfoType
+cellInfoType guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoType cellInfoType; \/* cell type for selecting from union CellInfo *\/$/;" m struct:__anon0bfbaecf6e08 typeref:typename:RIL_CellInfoType
+cellInfoType guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoType cellInfoType; \/* cell type for selecting from union CellInfo *\/$/;" m struct:__anon0bfbaecf7008 typeref:typename:RIL_CellInfoType
+cellInfoType guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoType cellInfoType; \/* cell type for selecting from union CellInfo *\/$/;" m struct:__anon0bfbaecf7408 typeref:typename:RIL_CellInfoType
+cellInfoType guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoType cellInfoType; \/* cell type for selecting from union CellInfo *\/$/;" m struct:__anon0bfbaecf7608 typeref:typename:RIL_CellInfoType
+cellidentity guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityNr cellidentity;$/;" m struct:__anon0bfbaecf6a08 typeref:typename:RIL_CellIdentityNr
+certs_dir_ host/libs/websocket/websocket_server.h /^ std::string certs_dir_;$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::string
+cfData guest/hals/ril/reference-libril/ril.h /^ RIL_CfData cfData;$/;" m union:__anon0bfbaecf9908::__anon0bfbaecf9a0a typeref:typename:RIL_CfData
+cfInfo guest/hals/ril/reference-libril/ril.h /^ RIL_CallForwardInfo cfInfo[NUM_SERVICE_CLASSES]; \/* This is the response data$/;" m struct:__anon0bfbaecf9808 typeref:typename:RIL_CallForwardInfo[]
+cfg guest/hals/ril/reference-libril/ril.h /^ } cfg;$/;" m struct:__anon0bfbaecf9308 typeref:union:__anon0bfbaecf9308::__anon0bfbaecf940a
+challenge host/commands/secure_env/tpm_keymaster_enforcement.cpp /^ uint64_t challenge;$/;" m struct:cuttlefish::TpmKeymasterEnforcement::VerifyAuthorization::VerificationData typeref:typename:uint64_t file:
+changeIccPin2ForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+changeIccPin2ForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::changeIccPin2ForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+changeIccPinForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+changeIccPinForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::changeIccPinForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+channel_ guest/hals/keymaster/remote/remote_keymaster.h /^ cuttlefish::KeymasterChannel* channel_;$/;" m class:keymaster::RemoteKeymaster typeref:typename:cuttlefish::KeymasterChannel *
+channel_ guest/hals/keymint/remote/remote_keymaster.h /^ cuttlefish::KeymasterChannel* channel_;$/;" m class:keymaster::RemoteKeymaster typeref:typename:cuttlefish::KeymasterChannel *
+channel_ host/commands/secure_env/gatekeeper_responder.h /^ cuttlefish::GatekeeperChannel& channel_;$/;" m class:cuttlefish::GatekeeperResponder typeref:typename:cuttlefish::GatekeeperChannel &
+channel_ host/commands/secure_env/keymaster_responder.h /^ cuttlefish::KeymasterChannel& channel_;$/;" m class:cuttlefish::KeymasterResponder typeref:typename:cuttlefish::KeymasterChannel &
+channel_monitor_ host/commands/modem_simulator/modem_service.h /^ ChannelMonitor* channel_monitor_;$/;" m class:cuttlefish::ModemService typeref:typename:ChannelMonitor *
+channel_monitor_ host/commands/modem_simulator/modem_simulator.h /^ std::unique_ptr<ChannelMonitor> channel_monitor_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:std::unique_ptr<ChannelMonitor>
+channel_open_reported_ host/frontend/webrtc/lib/client_handler.cpp /^ bool channel_open_reported_ = false;$/;" m class:cuttlefish::webrtc_streaming::AdbChannelHandler typeref:typename:bool file:
+channel_open_reported_ host/frontend/webrtc/lib/client_handler.cpp /^ bool channel_open_reported_ = false;$/;" m class:cuttlefish::webrtc_streaming::BluetoothChannelHandler typeref:typename:bool file:
+channels guest/hals/ril/reference-libril/ril.h /^ uint32_t channels[MAX_CHANNELS]; \/\/ Frequency channels to scan$/;" m struct:__anon0bfbaecfab08 typeref:typename:uint32_t[]
+channels guest/hals/ril/reference-libril/ril.h /^ uint32_t channels[MAX_CHANNELS]; \/\/ Frequency channels to scan$/;" m struct:__anon0bfbaecfae08 typeref:typename:uint32_t[]
+channels host/frontend/webrtc/audio_handler.cpp /^ int channels() const override { return channels_; }$/;" f class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+channels host/frontend/webrtc/audio_handler.h /^ int channels = -1;$/;" m struct:cuttlefish::AudioHandler::StreamDesc typeref:typename:int
+channels host/libs/audio_connector/commands.h /^ uint8_t channels() const { return channels_; }$/;" f struct:cuttlefish::StreamSetParamsCommand typeref:typename:uint8_t
+channels host/libs/audio_connector/shm_layout.h /^ uint8_t channels;$/;" m struct:cuttlefish::virtio_snd_chmap_info typeref:typename:uint8_t
+channels host/libs/audio_connector/shm_layout.h /^ uint8_t channels;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:uint8_t
+channels_ host/frontend/webrtc/audio_handler.cpp /^ int channels_;$/;" m class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+channels_ host/libs/audio_connector/commands.h /^ const uint8_t channels_;$/;" m struct:cuttlefish::StreamSetParamsCommand typeref:typename:const uint8_t
+channels_length guest/hals/ril/reference-libril/ril.h /^ uint32_t channels_length; \/\/ Length of channels$/;" m struct:__anon0bfbaecfab08 typeref:typename:uint32_t
+channels_length guest/hals/ril/reference-libril/ril.h /^ uint32_t channels_length; \/\/ Length of channels$/;" m struct:__anon0bfbaecfae08 typeref:typename:uint32_t
+channels_max host/libs/audio_connector/shm_layout.h /^ uint8_t channels_max;$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:uint8_t
+channels_min host/libs/audio_connector/shm_layout.h /^ uint8_t channels_min;$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:uint8_t
+checkAndDequeue guest/hals/ril/reference-libril/rilSocketQueue.h /^int Ril_queue<T>::checkAndDequeue(MsgId id, int token) {$/;" f class:Ril_queue typeref:typename:int
+checkAndDequeueRequestInfoIfAck guest/hals/ril/reference-libril/ril.cpp /^checkAndDequeueRequestInfoIfAck(struct RequestInfo *pRI, bool isAck) {$/;" f namespace:android typeref:typename:int file:
+checkPin1AndAdjustSimStatus host/commands/modem_simulator/sim_service.cpp /^bool SimService::checkPin1AndAdjustSimStatus(std::string_view pin) {$/;" f class:cuttlefish::SimService typeref:typename:bool
+checkReturnStatus guest/hals/ril/reference-libril/ril_config.cpp /^void checkReturnStatus(Return<void>& ret) {$/;" f typeref:typename:void
+checkReturnStatus guest/hals/ril/reference-libril/ril_service.cpp /^void RadioImpl_1_6::checkReturnStatus(Return<void>& ret) {$/;" f class:RadioImpl_1_6 typeref:typename:void
+checkReturnStatus guest/hals/ril/reference-libril/ril_service.cpp /^void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {$/;" f typeref:typename:void
+checkReturnStatus guest/hals/ril/reference-libril/sap_service.cpp /^void SapImpl::checkReturnStatus(Return<void>& ret) {$/;" f class:SapImpl typeref:typename:void
+checkReturnStatus_config guest/hals/ril/reference-libril/ril_config.cpp /^void RadioConfigImpl::checkReturnStatus_config(Return<void>& ret) {$/;" f class:RadioConfigImpl typeref:typename:void
+chmaps host/libs/audio_connector/shm_layout.h /^ uint32_t chmaps;$/;" m struct:cuttlefish::VioSConfig typeref:typename:uint32_t
+choose_hton host/libs/confui/sign_utils.h /^struct choose_hton;$/;" v namespace:cuttlefish::confui::support typeref:typename:const struct
+choose_hton host/libs/confui/sign_utils.h /^struct choose_hton<IntType, __ORDER_BIG_ENDIAN__> {$/;" s namespace:cuttlefish::confui::support
+choose_hton host/libs/confui/sign_utils.h /^struct choose_hton<IntType, __ORDER_LITTLE_ENDIAN__> {$/;" s namespace:cuttlefish::confui::support
+ci guest/hals/ril/reference-libril/ril.h /^ int ci; \/* 28-bit Cell Identity described in TS ???, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5d08 typeref:typename:int
+ci guest/hals/ril/reference-libril/ril.h /^ int ci; \/* 28-bit Cell Identity described in TS ???, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5e08 typeref:typename:int
+ci guest/hals/ril/reference-libril/ril.h /^ int ci; \/* 28-bit Cell Identity described in TS ???, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecf1208 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecf1308 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecf1408 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecf1508 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecf1608 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecfc508 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* Context ID, uniquely identifies this call *\/$/;" m struct:__anon0bfbaecfc308 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 16-bit GSM Cell Identity described in TS 27.007, 0..65535, INT_MAX if unknow/;" m struct:__anon0bfbaecf5808 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 16-bit GSM Cell Identity described in TS 27.007, 0..65535, INT_MAX if unknow/;" m struct:__anon0bfbaecf5908 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 16-bit GSM Cell Identity described in TS 27.007, 0..65535, INT_MAX if unknow/;" m struct:__anon0bfbaecf7808 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if u/;" m struct:__anon0bfbaecf5a08 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if u/;" m struct:__anon0bfbaecf5b08 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if u/;" m struct:__anon0bfbaecf5f08 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if u/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ int cid; \/* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if u/;" m struct:__anon0bfbaecf7b08 typeref:typename:int
+cid guest/hals/ril/reference-libril/ril.h /^ char * cid; \/* Combination of LAC and Cell Id in 32 bits in GSM.$/;" m struct:__anon0bfbaecf2208 typeref:typename:char *
+cid guest/hals/ril/reference-ril/reference-ril.c /^ int cid;$/;" m struct:PDPInfo typeref:typename:int file:
+cid host/commands/modem_simulator/data_service.h /^ int cid;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:int
+cid_ host/frontend/webrtc/lib/camera_streamer.h /^ unsigned int cid_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:unsigned int
+cla guest/hals/ril/reference-libril/ril.h /^ int cla;$/;" m struct:__anon0bfbaecf1f08 typeref:typename:int
+classx host/commands/modem_simulator/sup_service.h /^ int classx; \/\/ a sum of integers each representing a class of information$/;" m struct:cuttlefish::SupService::CallWaitingInfo typeref:typename:int
+clccStateToRILState guest/hals/ril/reference-ril/reference-ril.c /^static int clccStateToRILState(int state, RIL_CallState *p_state)$/;" f typeref:typename:int file:
+cleanup tools/network-setup.sh /^cleanup() {$/;" f
+clear guest/hals/camera/stream_buffer_cache.cpp /^void StreamBufferCache::clear() {$/;" f class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:void
+clearPendingCommand guest/hals/ril/reference-ril/atchannel.c /^static void clearPendingCommand()$/;" f typeref:typename:void file:
+clearPrintBuf guest/hals/ril/reference-libril/ril_internal.h /^ #define clearPrintBuf /;" d
+clearTombstonesFromCuttlefish tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ public void clearTombstonesFromCuttlefish() throws DeviceNotAvailableException {$/;" m class:TombstoneTransmitTest
+client_fd host/commands/modem_simulator/channel_monitor.h /^ cuttlefish::SharedFD client_fd;$/;" m class:cuttlefish::Client typeref:typename:cuttlefish::SharedFD
+client_handler_ host/frontend/webrtc/lib/client_handler.cpp /^ std::weak_ptr<ClientHandler> client_handler_;$/;" m class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdCreateSessionDescriptionObserver typeref:typename:std::weak_ptr<ClientHandler> file:
+client_handler_ host/frontend/webrtc/lib/client_handler.cpp /^ std::weak_ptr<ClientHandler> client_handler_;$/;" m class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdSetSessionDescriptionObserver typeref:typename:std::weak_ptr<ClientHandler> file:
+client_harware_address common/libs/utils/network.cpp /^ std::uint8_t client_harware_address[16];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[16] file:
+client_id common/libs/utils/network.h /^ std::string client_id;$/;" m struct:cuttlefish::DnsmasqDhcp4Lease typeref:typename:std::string
+client_id host/frontend/webrtc_operator/client_handler.cpp /^ size_t client_id() const { return client_id_; }$/;" f class:cuttlefish::PollConnectionHandler typeref:typename:size_t file:
+client_id_ host/frontend/webrtc/lib/client_handler.h /^ int client_id_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:int
+client_id_ host/frontend/webrtc_operator/client_handler.cpp /^ size_t client_id_ = 0;$/;" m class:cuttlefish::PollConnectionHandler typeref:typename:size_t file:
+client_id_ host/frontend/webrtc_operator/client_handler.h /^ size_t client_id_;$/;" m class:cuttlefish::ClientWSHandler typeref:typename:size_t
+client_info host/commands/metrics/proto/clientanalytics.proto /^ optional ClientInfo client_info = 1;$/;" f message:LogRequest typeref:typename:ClientInfo
+client_ip common/libs/utils/network.cpp /^ std::uint8_t client_ip[4];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[4] file:
+client_socket_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD client_socket_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:SharedFD file:
+client_type host/commands/metrics/proto/clientanalytics.proto /^ optional int32 client_type = 1;$/;" f message:ClientInfo typeref:typename:int32
+clients_ host/commands/modem_simulator/channel_monitor.h /^ std::vector<std::unique_ptr<Client>> clients_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:std::vector<std::unique_ptr<Client>>
+clients_ host/frontend/webrtc/lib/streamer.cpp /^ std::map<int, std::shared_ptr<ClientHandler>> clients_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::map<int,std::shared_ptr<ClientHandler>> file:
+clients_ host/frontend/webrtc_operator/device_handler.h /^ std::vector<std::weak_ptr<ClientHandler>> clients_;$/;" m class:cuttlefish::DeviceHandler typeref:typename:std::vector<std::weak_ptr<ClientHandler>>
+clir guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_T53_CLIRInfoRecord clir;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_T53_CLIRInfoRecord
+clir guest/hals/ril/reference-libril/ril.h /^ int clir;$/;" m struct:__anon0bfbaecf1c08 typeref:typename:int
+clir_status_ host/commands/modem_simulator/sup_service.h /^ ClirStatusInfo clir_status_;$/;" m class:cuttlefish::SupService typeref:typename:ClirStatusInfo
+close guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::close() {$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+close guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::close() {$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+closeLogicalChannel host/commands/modem_simulator/unittest/service_test.cpp /^ bool closeLogicalChannel(int channel) {$/;" f class:ModemServiceTest typeref:typename:bool file:
+closeRequest guest/hals/ril/reference-libril/ril_internal.h /^ #define closeRequest /;" d
+closeResponse guest/hals/ril/reference-libril/ril_internal.h /^ #define closeResponse /;" d
+close_ host/libs/websocket/websocket_handler.h /^ bool close_ = false;$/;" m class:cuttlefish::WebSocketHandler typeref:typename:bool
+closed common/libs/utils/tcp_socket.cpp /^bool ClientSocket::closed() const {$/;" f class:cuttlefish::ClientSocket typeref:typename:bool
+closed_lock_ common/libs/utils/tcp_socket.h /^ mutable std::mutex closed_lock_;$/;" m class:cuttlefish::ClientSocket typeref:typename:std::mutex
+cluster_bits host/libs/image_aggregator/image_aggregator.cc /^ Be32 cluster_bits;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+cmd common/libs/security/gatekeeper_channel.h /^ uint32_t cmd : 31;$/;" m struct:gatekeeper::GatekeeperRawMessage typeref:typename:uint32_t:31
+cmd common/libs/security/keymaster_channel.h /^ AndroidKeymasterCommand cmd : 31;$/;" m struct:keymaster::keymaster_message typeref:typename:AndroidKeymasterCommand:31
+cmd guest/hals/confirmationui/include/TrustyIpc.h /^ uint32_t cmd;$/;" m struct:confirmationui_hdr typeref:typename:uint32_t
+cmd host/commands/run_cvd/process_monitor.h /^ std::unique_ptr<Command> cmd;$/;" m struct:cuttlefish::MonitorEntry typeref:typename:std::unique_ptr<Command>
+cmdConsole host/frontend/webrtc_operator/assets/js/controls.js /^function cmdConsole(consoleViewName, consoleInputName) {$/;" f
+code common/libs/utils/network.cpp /^ std::uint8_t code;$/;" m struct:cuttlefish::Dhcp4MessageTypeOption typeref:typename:std::uint8_t file:
+code common/libs/utils/network.cpp /^ std::uint8_t code;$/;" m struct:cuttlefish::Dhcp4ServerIdentifier typeref:typename:std::uint8_t file:
+code guest/commands/vsoc_input_service/vsoc_input_service.h /^ uint16_t code;$/;" m struct:cuttlefish::input_events::InputEvent typeref:typename:uint16_t
+code guest/hals/ril/reference-libril/ril.h /^ RIL_KeepaliveStatusCode code;$/;" m struct:__anon0bfbaecfc708 typeref:typename:RIL_KeepaliveStatusCode
+code guest/hals/ril/reference-libril/ril.h /^ int code; \/* See 27.007 7.17$/;" m struct:__anon0bfbaecf3108 typeref:typename:int
+code host/frontend/webrtc/connection_observer.cpp /^ uint16_t code;$/;" m struct:cuttlefish::virtio_input_event typeref:typename:uint16_t file:
+code host/libs/audio_connector/shm_layout.h /^ Le32 code;$/;" m struct:cuttlefish::virtio_snd_hdr typeref:typename:Le32
+color_bg_ host/libs/confui/host_renderer.h /^ teeui::Color color_bg_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Color
+color_text_ host/libs/confui/host_renderer.h /^ teeui::Color color_text_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Color
+com.android.cuttlefish.ril.tests tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^package com.android.cuttlefish.ril.tests;$/;" p
+com.android.cuttlefish.tests tests/graphics/src/com/android/cuttlefish/tests/GfxstreamEnabledTest.java /^package com.android.cuttlefish.tests;$/;" p
+com.android.cuttlefish.tests tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java /^package com.android.cuttlefish.tests;$/;" p
+com.android.cuttlefish.tests tests/recovery/src/com/android/cuttlefish/tests/RebootRecoveryTest.java /^package com.android.cuttlefish.tests;$/;" p
+com.android.cuttlefish.wifi.tests tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^package com.android.cuttlefish.wifi.tests;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.google.gce.gceservice guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^package com.android.google.gce.gceservice;$/;" p
+com.android.tests.tombstoneTransmit tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^package com.android.tests.tombstoneTransmit;$/;" p
+command guest/hals/ril/reference-libril/ril.h /^ int command; \/* one of the commands listed for TS 27.007 +CRSM*\/$/;" m struct:__anon0bfbaecf1d08 typeref:typename:int
+command guest/hals/ril/reference-libril/ril.h /^ int command; \/* one of the commands listed for TS 27.007 +CRSM*\/$/;" m struct:__anon0bfbaecf1e08 typeref:typename:int
+command host/example_custom_actions/custom_action_config.json /^ "command":"alert",$/;" s object:1.buttons.1
+command host/example_custom_actions/custom_action_config.json /^ "command":"settings",$/;" s object:1.buttons.0
+command host/example_custom_actions/custom_action_config.json /^ "command":"web",$/;" s object:0.button
+command host/frontend/webrtc/lib/streamer.cpp /^ std::string command;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::ControlPanelButtonDescriptor typeref:typename:std::string file:
+command host/frontend/webrtc_operator/assets/js/app.js /^ command: 'device_state',$/;" p class:DeviceControlApp.getCustomDeviceStateButtonCb.message
+command host/libs/config/custom_actions.h /^ std::string command;$/;" m struct:cuttlefish::ControlPanelButton typeref:typename:std::string
+command shared/config/config_foldable.json /^ "command":"device_state_closed",$/;" s object:custom_actions.0.button
+command shared/config/config_foldable.json /^ "command":"device_state_opened",$/;" s object:custom_actions.1.button
+command_ common/libs/utils/subprocess.h /^ std::vector<std::string> command_;$/;" m class:cuttlefish::Command typeref:typename:std::vector<std::string>
+command_ host/commands/modem_simulator/command_parser.h /^ std::string_view command_;$/;" m class:cuttlefish::CommandParser typeref:typename:std::string_view
+command_ host/libs/vm_manager/crosvm_builder.h /^ Command command_;$/;" m class:cuttlefish::CrosvmBuilder typeref:typename:Command
+command_handlers_ host/commands/modem_simulator/modem_service.h /^ const std::vector<CommandHandler> command_handlers_;$/;" m class:cuttlefish::ModemService typeref:typename:const std::vector<CommandHandler>
+command_prefix host/commands/modem_simulator/modem_service.h /^ std::string command_prefix;$/;" m class:cuttlefish::CommandHandler typeref:typename:std::string
+command_prefix_ host/commands/modem_simulator/unittest/service_test.cpp /^ std::string command_prefix_;$/;" m class:ModemServiceTest typeref:typename:std::string file:
+command_queue_ host/commands/secure_env/in_process_tpm.cpp /^ std::list<std::vector<uint8_t>> command_queue_;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:std::list<std::vector<uint8_t>> file:
+commands_event guest/hals/ril/reference-libril/ril_ex.h /^ struct ril_event* commands_event;$/;" m struct:SocketListenParam typeref:struct:ril_event *
+commands_to_custom_action_servers_ host/frontend/webrtc/connection_observer.cpp /^ std::map<std::string, cuttlefish::SharedFD> commands_to_custom_action_servers_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:std::map<std::string,cuttlefish::SharedFD> file:
+commands_to_custom_action_servers_ host/frontend/webrtc/connection_observer.h /^ commands_to_custom_action_servers_;$/;" m class:cuttlefish::CfConnectionObserverFactory typeref:typename:std::map<std::string,SharedFD>
+common_arg_parser tools/tombstone_to_line.py /^def common_arg_parser():$/;" f
+company host/commands/metrics/proto/cf_metrics_event.proto /^ optional string company = 10;$/;" f message:cuttlefish.MetricsEvent typeref:typename:string
+component_disks host/libs/image_aggregator/cdisk_spec.proto /^ repeated ComponentDisk component_disks = 2;$/;" f message:CompositeDisk typeref:typename:ComponentDisk
+compositor_create_region host/libs/wayland/wayland_compositor.cpp /^void compositor_create_region(wl_client* client,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+compositor_create_surface host/libs/wayland/wayland_compositor.cpp /^void compositor_create_surface(wl_client* client,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+compositor_destroy_resource_callback host/libs/wayland/wayland_compositor.cpp /^void compositor_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+compositor_implementation host/libs/wayland/wayland_compositor.cpp /^const struct wl_compositor_interface compositor_implementation = {$/;" v namespace:wayland::__anon473d11590111 typeref:typename:const struct wl_compositor_interface
+computeChecksum host/frontend/webrtc_operator/assets/js/adb.js /^function computeChecksum(array) {$/;" f
+computeCrc32 host/frontend/webrtc_operator/utils.cpp /^uint32_t computeCrc32(const void *_data, size_t size) {$/;" f typeref:typename:uint32_t
+computeSharedHmac guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::computeSharedHmac($/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+computeSharedSecret guest/hals/keymint/remote/remote_shared_secret.cpp /^ScopedAStatus RemoteSharedSecret::computeSharedSecret($/;" f class:aidl::android::hardware::security::sharedsecret::RemoteSharedSecret typeref:typename:ScopedAStatus
+concat host/libs/config/bootconfig_args.cpp /^std::string concat(const S& s, const T& t) {$/;" f namespace:cuttlefish::__anond90bdb570111 typeref:typename:std::string
+cond guest/hals/ril/reference-libril/rilSocketQueue.h /^ pthread_cond_t cond;$/;" m class:Ril_queue typeref:typename:pthread_cond_t
+cond_ host/commands/modem_simulator/thread_looper.h /^ std::condition_variable cond_;$/;" m class:cuttlefish::ThreadLooper typeref:typename:std::condition_variable
+condvar_ host/commands/console_forwarder/main.cpp /^ std::condition_variable condvar_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:std::condition_variable file:
+conference guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::conference(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+conferenceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::conferenceResponse(int slotId, int responseType,$/;" f class:radio_1_6 typeref:typename:int
+confidence_level guest/hals/ril/reference-libril/ril.h /^ unsigned char confidence_level; \/* capacity estimate confidence: 0-100 *\/$/;" m struct:__anon0bfbaecf2408 typeref:typename:unsigned char
+config host/frontend/webrtc_operator/assets/js/server_connector.js /^ #config = undefined;$/;" M class:PollingConnector
+config host/libs/config/adb/test.cpp /^ AdbConfig& config;$/;" m struct:cuttlefish::TestData typeref:typename:AdbConfig & file:
+config_ host/commands/assemble_cvd/disk_flags.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::BootImageRepacker typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/assemble_cvd/disk_flags.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::InitializeAccessKregistryImage typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/assemble_cvd/flag_feature.cpp /^ ConfigFlag& config_;$/;" m class:cuttlefish::ParseGflagsImpl typeref:typename:ConfigFlag & file:
+config_ host/commands/modem_simulator/nvram_config.h /^ const NvramConfig* config_;$/;" m class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:const NvramConfig *
+config_ host/commands/run_cvd/boot_state_machine.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::BluetoothConnector typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::GnssGrpcProxyServer typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::MetricsService typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::OpenWrt typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::RootCanal typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::SecureEnvironment typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::VehicleHalServer typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::VmmCommands typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::WmediumdServer typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch_modem.cpp /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch_streamer.cpp /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/launch_streamer.cpp /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/main.cc /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:const CuttlefishConfig & file:
+config_ host/commands/run_cvd/server_loop.cpp /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:const CuttlefishConfig & file:
+config_ host/frontend/webrtc/lib/streamer.cpp /^ StreamerConfig config_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:StreamerConfig file:
+config_ host/libs/config/adb/config.cpp /^ AdbConfig& config_;$/;" m class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl typeref:typename:AdbConfig & file:
+config_ host/libs/config/adb/flags.cpp /^ AdbConfig& config_;$/;" m class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:AdbConfig & file:
+config_ host/libs/config/adb/launch.cpp /^ const AdbConfig& config_;$/;" m class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:const AdbConfig & file:
+config_ host/libs/config/config_flag.cpp /^ std::string config_;$/;" m class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:std::string file:
+config_ host/libs/config/custom_actions.cpp /^ ConfigFlag& config_;$/;" m class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:ConfigFlag & file:
+config_ host/libs/config/cuttlefish_config.h /^ CuttlefishConfig* config_;$/;" m class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:CuttlefishConfig *
+config_ host/libs/config/cuttlefish_config.h /^ const CuttlefishConfig* config_;$/;" m class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:const CuttlefishConfig *
+config_ host/libs/config/data_image.cpp /^ const CuttlefishConfig& config_;$/;" m class:cuttlefish::InitializeDataImageImpl typeref:typename:const CuttlefishConfig & file:
+config_flag_ host/libs/config/adb/flags.cpp /^ ConfigFlag& config_flag_;$/;" m class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:ConfigFlag & file:
+config_path_ host/commands/run_cvd/launch.cc /^ std::string config_path_;$/;" m class:cuttlefish::WmediumdServer typeref:typename:std::string file:
+config_path_ host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ std::string config_path_;$/;" m class:cuttlefish::WmediumdMessageReloadConfig typeref:typename:std::string
+config_reader_ host/libs/config/config_flag.cpp /^ ConfigReader& config_reader_;$/;" m class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:ConfigReader & file:
+config_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::config_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+configureStreams guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::configureStreams($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+configureStreams guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Status VsockCameraDeviceSession::configureStreams($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Status
+configureStreams_3_3 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::configureStreams_3_3($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+configureStreams_3_4 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::configureStreams_3_4($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+confirm tools/make_manifest.sh /^confirm() {$/;" f
+confirmationui guest/hals/confirmationui/TrustyConfirmationUI.cpp /^namespace confirmationui {$/;" n namespace:android::hardware file:
+confirmationui guest/hals/confirmationui/TrustyConfirmationUI.h /^namespace confirmationui {$/;" n namespace:android::hardware
+confirmationui guest/hals/confirmationui/guest_session.cpp /^namespace confirmationui {$/;" n namespace:android::hardware file:
+confirmationui guest/hals/confirmationui/guest_session.h /^namespace confirmationui {$/;" n namespace:android::hardware
+confirmationui guest/hals/confirmationui/include/TrustyConfirmationuiHal.h /^namespace confirmationui {$/;" n namespace:android::hardware
+confirmationui_cmd guest/hals/confirmationui/include/TrustyIpc.h /^enum confirmationui_cmd : uint32_t {$/;" g typeref:typename:uint32_t
+confirmationui_hdr guest/hals/confirmationui/include/TrustyIpc.h /^struct confirmationui_hdr {$/;" s
+confirmationui_init_req guest/hals/confirmationui/include/TrustyIpc.h /^struct confirmationui_init_req {$/;" s
+confirmationui_msg_args guest/hals/confirmationui/include/TrustyIpc.h /^struct confirmationui_msg_args {$/;" s
+confui common/libs/confui/packet.cpp /^namespace confui {$/;" n namespace:cuttlefish file:
+confui common/libs/confui/packet.h /^namespace confui {$/;" n namespace:cuttlefish
+confui common/libs/confui/packet_types.cpp /^namespace confui {$/;" n namespace:cuttlefish file:
+confui common/libs/confui/packet_types.h /^namespace confui {$/;" n namespace:cuttlefish
+confui common/libs/confui/protocol.cpp /^namespace confui {$/;" n namespace:cuttlefish file:
+confui common/libs/confui/protocol.h /^namespace confui {$/;" n namespace:cuttlefish
+confui common/libs/confui/protocol_types.cpp /^namespace confui {$/;" n namespace:cuttlefish file:
+confui common/libs/confui/protocol_types.h /^namespace confui {$/;" n namespace:cuttlefish
+confui common/libs/confui/utils.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/cbor.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/cbor.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/host_renderer.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/host_renderer.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/host_server.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/host_server.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/host_utils.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/host_utils.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/host_virtual_input.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/server_common.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/server_common.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/session.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/session.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/sign.cc /^namespace confui {$/;" n namespace:cuttlefish file:
+confui host/libs/confui/sign.h /^namespace confui {$/;" n namespace:cuttlefish
+confui host/libs/confui/sign_utils.h /^namespace confui {$/;" n namespace:cuttlefish
+confui_host_vsock_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::confui_host_vsock_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+confui_input_ host/frontend/webrtc/connection_observer.cpp /^ cuttlefish::confui::HostVirtualInput &confui_input_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:cuttlefish::confui::HostVirtualInput & file:
+confui_input_ host/frontend/webrtc/connection_observer.h /^ cuttlefish::confui::HostVirtualInput& confui_input_;$/;" m class:cuttlefish::CfConnectionObserverFactory typeref:typename:cuttlefish::confui::HostVirtualInput &
+confui_mode_cv_ host/libs/confui/host_mode_ctrl.h /^ std::condition_variable confui_mode_cv_;$/;" m class:cuttlefish::HostModeCtrl typeref:typename:std::condition_variable
+connId host/frontend/webrtc_operator/assets/js/server_connector.js /^ #connId = undefined;$/;" M class:PollingConnector
+conn_types host/commands/modem_simulator/data_service.h /^ std::string conn_types;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:std::string
+connectReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::connectReq(int32_t token, int32_t maxMsgSize) {$/;" f class:SapImpl typeref:typename:Return<void>
+connectWs host/frontend/webrtc_operator/assets/js/server_connector.js /^async function connectWs() {$/;" f
+connected host/frontend/webrtc_operator/assets/js/adb.js /^function connected() {$/;" f
+connected host/libs/audio_connector/shm_layout.h /^ uint8_t connected;$/;" m struct:cuttlefish::virtio_snd_jack_info typeref:typename:uint8_t
+connectedCb host/frontend/webrtc_operator/assets/js/adb.js /^let connectedCb;$/;" v
+connected_callback_ guest/hals/camera/vsock_camera_server.h /^ callback_t connected_callback_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:callback_t
+connectionStatus guest/hals/ril/reference-libril/ril.h /^ RIL_CellConnectionStatus connectionStatus; \/* Connection status for the cell. *\/$/;" m struct:__anon0bfbaecf7208 typeref:typename:RIL_CellConnectionStatus
+connection_ guest/hals/camera/vsock_camera_device_3_4.h /^ std::shared_ptr<cuttlefish::VsockConnection> connection_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:std::shared_ptr<cuttlefish::VsockConnection>
+connection_ guest/hals/camera/vsock_camera_provider_2_7.h /^ std::shared_ptr<cuttlefish::VsockConnection> connection_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:std::shared_ptr<cuttlefish::VsockConnection>
+connection_ guest/hals/camera/vsock_camera_server.h /^ std::shared_ptr<cuttlefish::VsockServerConnection> connection_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:std::shared_ptr<cuttlefish::VsockServerConnection>
+connection_ guest/hals/camera/vsock_frame_provider.h /^ std::shared_ptr<cuttlefish::VsockConnection> connection_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::shared_ptr<cuttlefish::VsockConnection>
+connection_observer_factory_ host/frontend/webrtc/lib/streamer.cpp /^ std::shared_ptr<ConnectionObserverFactory> connection_observer_factory_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::shared_ptr<ConnectionObserverFactory> file:
+console host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::console() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+console_dev host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::console_dev() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+console_forwarder_in_wr_ host/commands/run_cvd/launch.cc /^ SharedFD console_forwarder_in_wr_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:SharedFD file:
+console_forwarder_out_rd_ host/commands/run_cvd/launch.cc /^ SharedFD console_forwarder_out_rd_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:SharedFD file:
+console_in_ host/commands/console_forwarder/main.cpp /^ SharedFD console_in_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:SharedFD file:
+console_in_pipe_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::console_in_pipe_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+console_log_ host/commands/console_forwarder/main.cpp /^ SharedFD console_log_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:SharedFD file:
+console_out_ host/commands/console_forwarder/main.cpp /^ SharedFD console_out_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:SharedFD file:
+console_out_pipe_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::console_out_pipe_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+console_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::console_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+console_path_ host/commands/console_forwarder/main.cpp /^ std::string console_path_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:std::string file:
+console_pipe_prefix host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::console_pipe_prefix() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+const_iterator common/libs/fs/shared_select.h /^ typedef std::set<SharedFD>::const_iterator const_iterator;$/;" t class:cuttlefish::SharedFDSet typeref:typename:std::set<SharedFD>::const_iterator
+constructCdmaSms guest/hals/ril/reference-libril/ril_service.cpp /^void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {$/;" f typeref:typename:void
+constructDefaultRequestSettings guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::constructDefaultRequestSettings($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+constructor host/frontend/webrtc_operator/assets/js/app.js /^ constructor() {$/;" m class:DeviceDetailsUpdater
+constructor host/frontend/webrtc_operator/assets/js/app.js /^ constructor(deviceConnection) {$/;" m class:DeviceControlApp
+constructor host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ constructor(pc, control) {$/;" m class:DeviceConnection
+constructor host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ constructor(serverConnector) {$/;" m class:Controller
+constructor host/frontend/webrtc_operator/assets/js/index.js /^ constructor({url, selectDeviceCb}) {$/;" m class:DeviceListApp
+constructor host/frontend/webrtc_operator/assets/js/server_connector.js /^ constructor() {$/;" m class:Connector
+constructor host/frontend/webrtc_operator/assets/js/server_connector.js /^ constructor() {$/;" m class:PollingConnector
+constructor host/frontend/webrtc_operator/assets/js/server_connector.js /^ constructor(ws) {$/;" m class:WebsocketConnector
+consumed_length host/libs/audio_connector/shm_layout.h /^ uint32_t consumed_length;$/;" m struct:cuttlefish::IoStatusMsg typeref:typename:uint32_t
+containsValidSettings guest/hals/camera/vsock_camera_server.cpp /^bool containsValidSettings(const VsockCameraDevice::Settings& settings) {$/;" f namespace:android::hardware::camera::provider::V2_7::implementation::__anon29cd72800111 typeref:typename:bool
+content_len host/libs/websocket/websocket_handler.cpp /^size_t DynHandler::content_len() const { return out_buffer_.size() - LWS_PRE; }$/;" f class:cuttlefish::DynHandler typeref:typename:size_t
+content_type host/commands/fetcher/build_api.h /^ std::string content_type;$/;" m class:cuttlefish::Artifact typeref:typename:std::string
+contents guest/hals/ril/reference-libril/ril.h /^ char *contents; \/* Carrier-defined content. It is binary, opaque and$/;" m struct:__anon0bfbaecfc308 typeref:typename:char *
+contents_length guest/hals/ril/reference-libril/ril.h /^ int contents_length; \/* The number of octets in the contents. *\/$/;" m struct:__anon0bfbaecfc308 typeref:typename:int
+context_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::shared_ptr<WsConnectionContextImpl> context_;$/;" m class:WsConnectionImpl typeref:typename:std::shared_ptr<WsConnectionContextImpl> file:
+context_ host/libs/websocket/websocket_server.h /^ struct lws_context* context_;$/;" m class:cuttlefish::WebSocketServer typeref:struct:lws_context *
+control common/libs/utils/unix_sockets.h /^ std::vector<ControlMessage> control;$/;" m struct:cuttlefish::UnixSocketMessage typeref:typename:std::vector<ControlMessage>
+control host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #control;$/;" M class:DeviceConnection
+control-panel-custom-buttons host/frontend/webrtc_operator/assets/client.html /^ <div id='control-panel-custom-buttons' class='control-panel-column'><\/div>$/;" I
+control-panel-default-buttons host/frontend/webrtc_operator/assets/client.html /^ <div id='control-panel-default-buttons' class='control-panel-column'>$/;" I
+controlChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #controlChannel;$/;" M class:DeviceConnection
+control_channel_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::scoped_refptr<webrtc::DataChannelInterface> control_channel_;$/;" m class:cuttlefish::webrtc_streaming::ControlChannelHandler typeref:typename:rtc::scoped_refptr<webrtc::DataChannelInterface> file:
+control_handler_ host/frontend/webrtc/lib/client_handler.h /^ std::unique_ptr<ControlChannelHandler> control_handler_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::unique_ptr<ControlChannelHandler>
+control_socket_ host/libs/audio_connector/server.h /^ SharedFD control_socket_;$/;" m class:cuttlefish::AudioClientConnection typeref:typename:SharedFD
+controls-and-displays host/frontend/webrtc_operator/assets/client.html /^ <div id='controls-and-displays'>$/;" I
+convertApduResponseProtoToHal guest/hals/ril/reference-libril/sap_service.cpp /^SapResultCode convertApduResponseProtoToHal(RIL_SIM_SAP_APDU_RSP_Response responseProto) {$/;" f typeref:typename:SapResultCode
+convertBytesToHex guest/hals/ril/reference-ril/reference-ril.c /^void convertBytesToHex(uint8_t *bytes, int length, uint8_t *hex_str) {$/;" f typeref:typename:void
+convertBytesToHexString guest/hals/ril/reference-ril/reference-ril.c /^void convertBytesToHexString(char *bin_ptr, int length, unsigned char *hex_ptr) {$/;" f typeref:typename:void
+convertCertificate guest/hals/keymint/remote/remote_keymint_device.cpp /^Certificate convertCertificate(const keymaster_blob_t& cert) {$/;" f namespace:aidl::android::hardware::security::keymint::__anon087586ca0111 typeref:typename:Certificate
+convertCertificateChain guest/hals/keymint/remote/remote_keymint_device.cpp /^vector<Certificate> convertCertificateChain(const CertificateChain& chain) {$/;" f namespace:aidl::android::hardware::security::keymint::__anon087586ca0111 typeref:typename:vector<Certificate>
+convertCharPtrToHidlString guest/hals/ril/reference-libril/ril_service.cpp /^hidl_string convertCharPtrToHidlString(const char *ptr) {$/;" f typeref:typename:hidl_string
+convertFileContentsToString tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private String convertFileContentsToString(File f) throws IOException {$/;" m class:TombstoneTransmitTest file:
+convertFileListToStringList tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private List<String> convertFileListToStringList(List<File> inputList) throws IOException {$/;" m class:TombstoneTransmitTest file:
+convertHexStringToBytes guest/hals/ril/reference-libril/ril_service.cpp /^extern "C" uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {$/;" f typeref:typename:uint8_t *
+convertIntToRadioIndicationType guest/hals/ril/reference-libril/ril_service.cpp /^RadioIndicationType convertIntToRadioIndicationType(int indicationType) {$/;" f typeref:typename:RadioIndicationType
+convertKeyCharacteristics guest/hals/keymint/remote/remote_keymint_device.cpp /^vector<KeyCharacteristics> convertKeyCharacteristics($/;" f namespace:aidl::android::hardware::security::keymint::__anon087586ca0111 typeref:typename:vector<KeyCharacteristics>
+convertMvnoTypeToString guest/hals/ril/reference-libril/ril_service.cpp /^static bool convertMvnoTypeToString(MvnoType type, char *&str) {$/;" f typeref:typename:bool file:
+convertOperatorStatusToInt guest/hals/ril/reference-libril/ril_service.cpp /^int convertOperatorStatusToInt(const char *str) {$/;" f typeref:typename:int
+convertPowerResponseProtoToHal guest/hals/ril/reference-libril/sap_service.cpp /^SapResultCode convertPowerResponseProtoToHal(RIL_SIM_SAP_POWER_RSP_Response responseProto) {$/;" f typeref:typename:SapResultCode
+convertResetSimResponseProtoToHal guest/hals/ril/reference-libril/sap_service.cpp /^SapResultCode convertResetSimResponseProtoToHal(RIL_SIM_SAP_RESET_SIM_RSP_Response responseProto/;" f typeref:typename:SapResultCode
+convertResponseHexStringEntryToInt guest/hals/ril/reference-libril/ril_service.cpp /^int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {$/;" f typeref:typename:int
+convertResponseStringEntryToInt guest/hals/ril/reference-libril/ril_service.cpp /^int convertResponseStringEntryToInt(char **response, int index, int numStrings) {$/;" f typeref:typename:int
+convertRilCdmaSignalInfoRecordToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,$/;" f typeref:typename:void
+convertRilCellInfoListToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records/;" f typeref:typename:void
+convertRilCellInfoListToHal_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilCellInfoListToHal_1_2(void *response, size_t responseLen, hidl_vec<V1_2::CellInfo/;" f typeref:typename:void
+convertRilCellInfoListToHal_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilCellInfoListToHal_1_4(void *response, size_t responseLen, hidl_vec<V1_4::CellInfo/;" f typeref:typename:void
+convertRilDataCallListToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilDataCallListToHal(void *response, size_t responseLen,$/;" f typeref:typename:void
+convertRilDataCallToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,$/;" f typeref:typename:void
+convertRilDataCallToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilDataCallToHal(RIL_Data_Call_Response_v12 *dcResponse,$/;" f typeref:typename:void
+convertRilHardwareConfigListToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilHardwareConfigListToHal(void *response, size_t responseLen,$/;" f typeref:typename:void
+convertRilKeepaliveStatusToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,$/;" f typeref:typename:void
+convertRilLceDataInfoToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {$/;" f typeref:typename:void
+convertRilRadioCapabilityToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {$/;" f typeref:typename:void
+convertRilSignalStrengthToHal guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilSignalStrengthToHal(void *response, size_t responseLen,$/;" f typeref:typename:void
+convertRilSignalStrengthToHal_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^void convertRilSignalStrengthToHal_1_4(void *response, size_t responseLen,$/;" f typeref:typename:void
+convertStorageKeyToEphemeral guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::convertStorageKeyToEphemeral($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+convertToPdpProtocolType guest/hals/ril/reference-libril/ril_service.cpp /^::android::hardware::radio::V1_4::PdpProtocolType convertToPdpProtocolType(hidl_string str) {$/;" f typeref:typename:::android::hardware::radio::V1_4::PdpProtocolType
+convertTransferAtrResponseProtoToHal guest/hals/ril/reference-libril/sap_service.cpp /^SapResultCode convertTransferAtrResponseProtoToHal($/;" f typeref:typename:SapResultCode
+convertTransferCardReaderStatusResponseProtoToHal guest/hals/ril/reference-libril/sap_service.cpp /^SapResultCode convertTransferCardReaderStatusResponseProtoToHal($/;" f typeref:typename:SapResultCode
+convertUIOption guest/hals/confirmationui/TrustyConfirmationUI.cpp /^teeui::UIOption convertUIOption(UIOption uio) {$/;" f namespace:android::hardware::confirmationui::V1_0::implementation::__anon2184467c0111 typeref:typename:teeui::UIOption
+convertUsimToSim guest/hals/ril/reference-ril/reference-ril.c /^bool convertUsimToSim(uint8_t *byteUSIM, int len, uint8_t *hexSIM) {$/;" f typeref:typename:bool
+copyHidlStringToRil guest/hals/ril/reference-libril/ril_service.cpp /^bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {$/;" f typeref:typename:bool
+copyHidlStringToRil guest/hals/ril/reference-libril/ril_service.cpp /^bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty)/;" f typeref:typename:bool
+copyJpegData guest/hals/camera/vsock_frame_provider.cpp /^bool VsockFrameProvider::copyJpegData(uint32_t size, void* dst) {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+copyYUVFrame guest/hals/camera/vsock_frame_provider.cpp /^bool VsockFrameProvider::copyYUVFrame(uint32_t w, uint32_t h, YCbCrLayout dst) {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+copy_command_ host/commands/modem_simulator/command_parser.h /^ std::string copy_command_;$/;" m class:cuttlefish::CommandParser typeref:typename:std::string
+count host/frontend/webrtc/audio_handler.h /^ size_t count;$/;" m struct:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:size_t
+count host/libs/audio_connector/commands.h /^ uint32_t count() const { return count_; }$/;" f class:cuttlefish::InfoCommand typeref:typename:uint32_t
+count host/libs/audio_connector/shm_layout.h /^ Le32 count;$/;" m struct:cuttlefish::virtio_snd_query_info typeref:typename:Le32
+count_ common/libs/concurrency/semaphore.h /^ unsigned int count_;$/;" m class:cuttlefish::Semaphore typeref:typename:unsigned int
+count_ host/libs/audio_connector/commands.h /^ const size_t count_;$/;" m class:cuttlefish::InfoCommand typeref:typename:const size_t
+cpid guest/hals/ril/reference-libril/ril.h /^ int cpid; \/* 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown/;" m struct:__anon0bfbaecf5f08 typeref:typename:int
+cpid guest/hals/ril/reference-libril/ril.h /^ int cpid; \/* 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown/;" m struct:__anon0bfbaecf7b08 typeref:typename:int
+cpp_basename common/libs/utils/files.cpp /^std::string cpp_basename(const std::string& str) {$/;" f namespace:cuttlefish typeref:typename:std::string
+cpp_dirname common/libs/utils/files.cpp /^std::string cpp_dirname(const std::string& str) {$/;" f namespace:cuttlefish typeref:typename:std::string
+cpus host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::cpus() const { return (*dictionary_)[kCpus].asInt(); }$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+cqi guest/hals/ril/reference-libril/ril.h /^ int cqi; \/* The current Channel Quality Indicator.$/;" m struct:__anon0bfbaecf4b08 typeref:typename:int
+cqi guest/hals/ril/reference-libril/ril.h /^ int cqi; \/* The current Channel Quality Indicator.$/;" m struct:__anon0bfbaecf4c08 typeref:typename:int
+crc32 host/commands/fetcher/build_api.h /^ unsigned int crc32;$/;" m class:cuttlefish::Artifact typeref:typename:unsigned int
+crc32_tab host/frontend/webrtc_operator/utils.cpp /^static const uint32_t crc32_tab[] = {$/;" v typeref:typename:const uint32_t[] file:
+createAdbMessage host/frontend/webrtc_operator/assets/js/adb.js /^function createAdbMessage(command, arg0, arg1, payload) {$/;" f
+createConnector host/frontend/webrtc_operator/assets/js/server_connector.js /^export async function createConnector() {$/;" f
+createControlPanelButton host/frontend/webrtc_operator/assets/js/controls.js /^function createControlPanelButton($/;" f
+createDataChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^function createDataChannel(pc, label, onMessage) {$/;" f
+createDeviceDisplays host/frontend/webrtc_operator/assets/js/app.js /^ #createDeviceDisplays() {$/;" m class:DeviceControlApp
+createDeviceEntry host/frontend/webrtc_operator/assets/js/index.js /^ #createDeviceEntry(devId, buttonId) {$/;" m class:DeviceListApp
+createInstance tools/create_base_image.go /^func createInstance(instance string, arg string) {$/;" f package:main
+createManifest tools/make_manifest.sh /^createManifest() {$/;" f
+createModalButton host/frontend/webrtc_operator/assets/js/controls.js /^function createModalButton(button_id, modal_id, close_id) {$/;" f
+createMsgHeader guest/hals/ril/reference-libril/sap_service.cpp /^MsgHeader* SapImpl::createMsgHeader(MsgId msgId, int32_t token) {$/;" f class:SapImpl typeref:typename:MsgHeader *
+createPeerConnection host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^function createPeerConnection(infra_config) {$/;" f
+createRootcanalMessage host/frontend/webrtc_operator/assets/js/rootcanal.js /^function createRootcanalMessage(command, args) {$/;" f
+createToggleControl host/frontend/webrtc_operator/assets/js/controls.js /^function createToggleControl(elm, iconName, onChangeCb) {$/;" f
+createTrustyConfirmationUI guest/hals/confirmationui/TrustyConfirmationUI.cpp /^android::sp<IConfirmationUI> createTrustyConfirmationUI() {$/;" f namespace:android::hardware::confirmationui::V1_0::implementation typeref:typename:android::sp<IConfirmationUI>
+create_interface tools/vlan_prototype_up.sh /^create_interface() {$/;" f
+creation_time host/commands/fetcher/build_api.h /^ unsigned long creation_time;$/;" m class:cuttlefish::Artifact typeref:typename:unsigned long
+credential host/commands/fetcher/credential_source.h /^ std::string credential;$/;" m class:cuttlefish::FixedCredentialSource typeref:typename:std::string
+credential_source host/commands/fetcher/build_api.h /^ CredentialSource* credential_source;$/;" m class:cuttlefish::BuildApi typeref:typename:CredentialSource *
+crosvm_binary host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::crosvm_binary() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+crosvm_socket host/libs/vm_manager/crosvm_manager.cpp /^constexpr auto crosvm_socket = "crosvm_control.sock";$/;" v namespace:cuttlefish::vm_manager typeref:typename:auto
+crypt_method host/libs/image_aggregator/image_aggregator.cc /^ Be32 crypt_method;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+csiRsrp guest/hals/ril/reference-libril/ril.h /^ int32_t csiRsrp; \/* CSI reference signal received power, multiplied by -1.$/;" m struct:__anon0bfbaecf4e08 typeref:typename:int32_t
+csiRsrq guest/hals/ril/reference-libril/ril.h /^ int32_t csiRsrq; \/* CSI reference signal received quality, multiplied by -1.$/;" m struct:__anon0bfbaecf4e08 typeref:typename:int32_t
+csiSinr guest/hals/ril/reference-libril/ril.h /^ int32_t csiSinr; \/* CSI signal-to-noise and interference ratio.$/;" m struct:__anon0bfbaecf4e08 typeref:typename:int32_t
+cssSupported guest/hals/ril/reference-libril/ril.h /^ int32_t cssSupported; \/\/ concurrent services support indicator. if$/;" m struct:__anon0bfbaecf7f08 typeref:typename:int32_t
+ctx_ host/libs/confui/host_renderer.h /^ teeui::context<teeui::ConfUIParameters> ctx_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::context<teeui::ConfUIParameters>
+curl host/commands/fetcher/build_api.h /^ CurlWrapper& curl;$/;" m class:cuttlefish::BuildApi typeref:typename:CurlWrapper &
+curl host/commands/fetcher/credential_source.h /^ CurlWrapper& curl;$/;" m class:cuttlefish::GceMetadataCredentialSource typeref:typename:CurlWrapper &
+curl_ host/commands/fetcher/curl_wrapper.cc /^ CURL* curl_;$/;" m class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl typeref:typename:CURL * file:
+curr guest/hals/ril/reference-libril/RilSapSocket.h /^ MsgHeader* curr;$/;" m struct:RilSapSocket::SapSocketRequest typeref:typename:MsgHeader *
+curr_session_ host/libs/confui/host_server.h /^ std::shared_ptr<Session> curr_session_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:std::shared_ptr<Session>
+currentRotation host/frontend/webrtc_operator/assets/js/app.js /^ #currentRotation = 0;$/;" M class:DeviceControlApp
+currentSignalStrengthInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::currentSignalStrengthInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+currentState guest/hals/ril/reference-ril/reference-ril.c /^currentState()$/;" f typeref:typename:RIL_RadioState file:
+currentTech guest/hals/ril/reference-ril/reference-ril.c /^ int currentTech; \/\/ Technology the modem is currently using (in the format used by mode/;" m struct:__anon70d7df6f0108 typeref:typename:int file:
+current_buffer host/libs/wayland/wayland_surface.h /^ struct wl_resource* current_buffer = nullptr;$/;" m struct:wayland::Surface::State typeref:struct:wl_resource *
+current_frame_number host/libs/wayland/wayland_surface.h /^ uint32_t current_frame_number = 0;$/;" m struct:wayland::Surface::State typeref:typename:uint32_t
+current_height_ host/libs/confui/host_renderer.h /^ std::uint32_t current_height_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::uint32_t
+current_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t current_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint64_t file:
+current_network_mode_ host/commands/modem_simulator/network_service.h /^ ModemTechnology current_network_mode_;$/;" m class:cuttlefish::NetworkService typeref:typename:ModemTechnology
+current_operator_numeric_ host/commands/modem_simulator/network_service.h /^ std::string current_operator_numeric_ = "";$/;" m class:cuttlefish::NetworkService typeref:typename:std::string
+current_select_item_menu_ids_ host/commands/modem_simulator/stk_service.h /^ std::vector<std::string> current_select_item_menu_ids_;$/;" m class:cuttlefish::StkService typeref:typename:std::vector<std::string>
+current_session_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::unique_ptr<GuestSession> current_session_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::unique_ptr<GuestSession>
+current_session_id_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::atomic<std::uint32_t> current_session_id_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::atomic<std::uint32_t>
+current_session_lock_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::mutex current_session_lock_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::mutex
+current_storage_ host/commands/start/flag_forwarder.cc /^ T current_storage_;$/;" m class:DynamicFlag typeref:typename:T file:
+current_width_ host/libs/confui/host_renderer.h /^ std::uint32_t current_width_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::uint32_t
+custom_action_config_ host/commands/run_cvd/launch_streamer.cpp /^ const CustomActionConfigProvider& custom_action_config_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:const CustomActionConfigProvider & file:
+custom_action_config_ host/libs/config/custom_actions.cpp /^ std::string custom_action_config_;$/;" m class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:std::string file:
+custom_action_config_flag_ host/libs/config/custom_actions.cpp /^ Flag custom_action_config_flag_;$/;" m class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:Flag file:
+custom_actions shared/config/config_foldable.json /^ "custom_actions" : [$/;" a
+custom_actions_ host/libs/config/custom_actions.cpp /^ std::vector<CustomActionConfig> custom_actions_;$/;" m class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:std::vector<CustomActionConfig> file:
+custom_actions_flag_ host/libs/config/custom_actions.cpp /^ Flag custom_actions_flag_;$/;" m class:cuttlefish::__anon12e4c76c0111::CustomActionConfigImpl typeref:typename:Flag file:
+custom_control_panel_buttons_ host/frontend/webrtc/lib/streamer.cpp /^ std::vector<ControlPanelButtonDescriptor> custom_control_panel_buttons_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::vector<ControlPanelButtonDescriptor> file:
+cuttlefish build/cvd-host-package.go /^package cuttlefish$/;" p
+cuttlefish common/libs/concurrency/multiplexer.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/concurrency/semaphore.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/concurrency/thread_safe_queue.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/confui/packet.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/confui/packet.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/confui/packet_types.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/confui/packet_types.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/confui/protocol.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/confui/protocol.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/confui/protocol_types.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/confui/protocol_types.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/confui/utils.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/device_config/device_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/device_config/device_config.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/device_config/device_config.proto /^package cuttlefish;$/;" p
+cuttlefish common/libs/device_config/device_config_shared.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/device_config/device_config_shared.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/device_config/guest_device_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/device_config/host_device_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/fs/shared_buf.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/fs/shared_buf.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/fs/shared_fd.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/fs/shared_fd.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/fs/shared_fd_stream.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/fs/shared_fd_stream.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/fs/shared_fd_test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/fs/shared_select.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/net/netlink_client.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/net/netlink_client.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/net/netlink_request.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/net/netlink_request.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/net/netlink_request_test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/net/network_interface.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/net/network_interface_manager.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/net/network_interface_manager.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/security/gatekeeper_channel.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/security/gatekeeper_channel.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/security/keymaster_channel.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/security/keymaster_channel.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/security/keymaster_channel_test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/archive.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/archive.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/base64.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/base64.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/cf_endian.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/environment.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/environment.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/files.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/files.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/flag_parser.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/flag_parser.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/flag_parser_test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/network.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/network.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/shared_fd_flag.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/shared_fd_flag.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/size_utils.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/subprocess.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/subprocess.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/tcp_socket.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/tcp_socket.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/tee_logging.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/tee_logging.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/unix_sockets.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/unix_sockets.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/unix_sockets_test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/users.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/users.h /^namespace cuttlefish {$/;" n
+cuttlefish common/libs/utils/vsock_connection.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish common/libs/utils/vsock_connection.h /^namespace cuttlefish {$/;" n
+cuttlefish guest/commands/vsoc_input_service/vsoc_input_service.h /^namespace cuttlefish {$/;" n
+cuttlefish guest/hals/camera/vsock_frame_provider.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish guest/hals/camera/vsock_frame_provider.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/alloc.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/alloc.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/assemble_cvd.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/boot_config.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/boot_config.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/boot_image_utils.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/boot_image_utils.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/clean.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/clean.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/disk_flags.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/disk_flags.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/flag_feature.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/flag_feature.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/flags.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/flags.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/misc_info.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/misc_info.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/assemble_cvd/super_image_mixer.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/assemble_cvd/super_image_mixer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/console_forwarder/main.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/cvd/main.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/fetcher/build_api.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/fetcher/build_api.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/fetcher/credential_source.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/fetcher/credential_source.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/fetcher/curl_wrapper.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/fetcher/curl_wrapper.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/fetcher/fetch_cvd.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/host_bugreport/main.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/metrics/metrics_defs.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/metrics/proto/cf_log.proto /^package cuttlefish;$/;" p
+cuttlefish host/commands/metrics/proto/cf_metrics_event.proto /^package cuttlefish;$/;" p
+cuttlefish host/commands/modem_simulator/call_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/call_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/cf_device_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/channel_monitor.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/channel_monitor.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/command_parser.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/command_parser.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/data_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/data_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/device_config.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/misc_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/misc_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/modem_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/modem_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/modem_simulator.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/modem_simulator.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/network_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/network_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/nvram_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/nvram_config.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/pdu_parser.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/pdu_parser.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/sim_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/sim_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/sms_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/sms_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/stk_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/stk_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/sup_service.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/sup_service.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/modem_simulator/thread_looper.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/modem_simulator/thread_looper.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/powerwash_cvd/powerwash_cvd.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/restart_cvd/restart_cvd.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/boot_state_machine.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/boot_state_machine.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/run_cvd/launch.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/launch.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/run_cvd/launch_modem.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/launch_streamer.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/main.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/process_monitor.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/process_monitor.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/run_cvd/reporting.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/reporting.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/run_cvd/runner_defs.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/run_cvd/server_loop.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/server_loop.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/run_cvd/validate.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/run_cvd/validate.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/composite_serialization.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/composite_serialization.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/device_tpm.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/device_tpm.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/encrypted_serializable.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/encrypted_serializable.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/encrypted_serializable_test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/fragile_tpm_storage.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/fragile_tpm_storage.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/gatekeeper_responder.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/gatekeeper_responder.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/gatekeeper_storage.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/hmac_serializable.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/hmac_serializable.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/in_process_tpm.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/in_process_tpm.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/insecure_fallback_storage.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/insecure_fallback_storage.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/json_serializable.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/json_serializable.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/keymaster_responder.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/keymaster_responder.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/primary_key_builder.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/primary_key_builder.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/proxy_keymaster_context.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/secure_env.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/test_tpm.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/test_tpm.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_attestation_record.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_attestation_record.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_auth.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_auth.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_commands.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_commands.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_encrypt_decrypt.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_encrypt_decrypt.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_gatekeeper.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_gatekeeper.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_hmac.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_hmac.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_key_blob_maker.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_key_blob_maker.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_keymaster_context.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_keymaster_context.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_keymaster_enforcement.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_keymaster_enforcement.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_random_source.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_random_source.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_remote_provisioning_context.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_remote_provisioning_context.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_resource_manager.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_resource_manager.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/secure_env/tpm_serialize.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/secure_env/tpm_serialize.h /^namespace cuttlefish {$/;" n
+cuttlefish host/commands/status/main.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/stop/main.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/commands/tombstone_receiver/main.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/adb_connector/adb_connection_maintainer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/adb_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/adb_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/audio_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/audio_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/bluetooth_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/bluetooth_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/connection_observer.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/connection_observer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/cvd_video_frame_buffer.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/cvd_video_frame_buffer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/display_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/display_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/kernel_log_events_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/kernel_log_events_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/audio_device.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/audio_device.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/audio_frame_buffer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/audio_sink.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/audio_source.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/audio_track_source_impl.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/audio_track_source_impl.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/camera_controller.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/camera_streamer.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/camera_streamer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/client_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/client_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/connection_observer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/local_recorder.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/local_recorder.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/port_range_socket_factory.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/port_range_socket_factory.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/streamer.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/streamer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/utils.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/utils.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/video_frame_buffer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/video_sink.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/video_track_source_impl.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/video_track_source_impl.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc/lib/vp8only_encoder_factory.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/client_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc_operator/client_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/constants/signaling_constants.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/device_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc_operator/device_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/device_list_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc_operator/device_list_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/device_registry.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc_operator/device_registry.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/server_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc_operator/server_config.h /^namespace cuttlefish {$/;" n
+cuttlefish host/frontend/webrtc_operator/signal_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/frontend/webrtc_operator/signal_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/allocd/alloc_utils.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/allocd/alloc_utils.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/allocd/request.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/allocd/resource.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/allocd/resource.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/allocd/resource_manager.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/allocd/resource_manager.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/allocd/utils.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/allocd/utils.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/audio_connector/buffers.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/audio_connector/buffers.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/audio_connector/commands.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/audio_connector/commands.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/audio_connector/server.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/audio_connector/server.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/audio_connector/shm_layout.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/adb/adb.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/adb/config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/adb/data.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/adb/flags.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/adb/launch.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/adb/strings.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/adb/test.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/bootconfig_args.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/bootconfig_args.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/command_source.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/config_flag.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/config_flag.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/config_fragment.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/custom_actions.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/custom_actions.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/cuttlefish_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/cuttlefish_config.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/cuttlefish_config_instance.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/data_image.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/data_image.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/feature.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/feature.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/fetcher_config.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/fetcher_config.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/host_tools_version.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/host_tools_version.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/inject.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/kernel_args.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/kernel_args.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/kernel_log_pipe_provider.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/known_paths.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/known_paths.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/config/logging.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/config/logging.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/cbor.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/cbor.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/host_mode_ctrl.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/host_renderer.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/host_renderer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/host_server.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/host_server.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/host_utils.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/host_utils.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/host_virtual_input.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/server_common.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/server_common.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/session.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/session.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/sign.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/confui/sign.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/confui/sign_utils.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/graphics_detector/graphics_detector.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/graphics_detector/graphics_detector.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/image_aggregator/image_aggregator.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/image_aggregator/image_aggregator.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/msg_queue/msg_queue.cc /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/msg_queue/msg_queue.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/screen_connector/screen_connector.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/screen_connector/screen_connector_common.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/screen_connector/screen_connector_ctrl.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/screen_connector/screen_connector_multiplexer.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/screen_connector/screen_connector_queue.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/screen_connector/wayland_screen_connector.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/screen_connector/wayland_screen_connector.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/vm_manager/crosvm_builder.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/vm_manager/crosvm_builder.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/vm_manager/crosvm_manager.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/vm_manager/crosvm_manager.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/vm_manager/host_configuration.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/vm_manager/host_configuration.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/vm_manager/qemu_manager.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/vm_manager/qemu_manager.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/vm_manager/vm_manager.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/vm_manager/vm_manager.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/websocket/websocket_handler.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/websocket/websocket_handler.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/websocket/websocket_server.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/websocket/websocket_server.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/wmediumd_controller/wmediumd_api_protocol.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/wmediumd_controller/wmediumd_api_protocol.h /^namespace cuttlefish {$/;" n
+cuttlefish host/libs/wmediumd_controller/wmediumd_controller.cpp /^namespace cuttlefish {$/;" n file:
+cuttlefish host/libs/wmediumd_controller/wmediumd_controller.h /^namespace cuttlefish {$/;" n
+cuttlefish_env_path host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::cuttlefish_env_path() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_device_base.h /^namespace cuttlefish_input_service {$/;" n
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_keyboard.cpp /^namespace cuttlefish_input_service {$/;" n file:
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_keyboard.h /^namespace cuttlefish_input_service {$/;" n
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_power_button.cpp /^namespace cuttlefish_input_service {$/;" n file:
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_power_button.h /^namespace cuttlefish_input_service {$/;" n
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_touchscreen.cpp /^namespace cuttlefish_input_service {$/;" n file:
+cuttlefish_input_service guest/commands/vsoc_input_service/virtual_touchscreen.h /^namespace cuttlefish_input_service {$/;" n
+cuttlefish_input_service guest/commands/vsoc_input_service/vsoc_input_service.h /^namespace cuttlefish_input_service {$/;" n
+cuttlefish_version host/commands/metrics/proto/cf_log.proto /^ optional string cuttlefish_version = 4;$/;" f message:cuttlefish.CuttlefishLogEvent typeref:typename:string
+cvdHostPackage build/cvd-host-package.go /^type cvdHostPackage struct {$/;" s package:cuttlefish
+cvdHostPackageDependencyTag build/cvd-host-package.go /^var cvdHostPackageDependencyTag = dependencyTag{}$/;" v package:cuttlefish
+cvdHostPackageFactory build/cvd-host-package.go /^func cvdHostPackageFactory() android.Module {$/;" f package:cuttlefish typeref:typename:android.Module
+cvd_connection_ host/frontend/webrtc/lib/camera_streamer.h /^ VsockClientConnection cvd_connection_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:VsockClientConnection
+cvd_host_packages host_package.mk /^cvd_host_packages := $(SOONG_HOST_OUT)\/cvd-host_package.tar.gz$/;" m
+cvd_host_packages host_package.mk /^cvd_host_packages :=$/;" m
+data common/libs/utils/unix_sockets.h /^ std::vector<char> data;$/;" m struct:cuttlefish::UnixSocketMessage typeref:typename:std::vector<char>
+data guest/hals/ril/reference-libril/ril.h /^ char *data; \/* May be NULL*\/$/;" m struct:__anon0bfbaecf1d08 typeref:typename:char *
+data guest/hals/ril/reference-libril/ril.h /^ char *data; \/* May be NULL*\/$/;" m struct:__anon0bfbaecf1e08 typeref:typename:char *
+data guest/hals/ril/reference-libril/ril.h /^ char *data; \/* May be NULL. In hex string format. *\/$/;" m struct:__anon0bfbaecf1f08 typeref:typename:char *
+data host/commands/fetcher/curl_wrapper.h /^ T data;$/;" m struct:cuttlefish::CurlResponse typeref:typename:T
+data host/frontend/webrtc/audio_handler.cpp /^ const uint8_t* data() const override { return buffer_; }$/;" f class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:const uint8_t * file:
+data host/frontend/webrtc/audio_handler.cpp /^uint8_t* AudioHandler::HoldingBuffer::data() { return buffer.data(); }$/;" f class:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:uint8_t *
+data host/frontend/webrtc/connection_observer.cpp /^ T *data() { return buffer_.data(); }$/;" f struct:cuttlefish::InputEventBufferImpl typeref:typename:T * file:
+data host/frontend/webrtc/connection_observer.cpp /^ const void *data() const override { return buffer_.data(); }$/;" f struct:cuttlefish::InputEventBufferImpl typeref:typename:const void * file:
+data host/frontend/webrtc/lib/ws_connection.cpp /^ uint8_t* data() { return &buffer_[LWS_PRE]; }$/;" f struct:WsConnectionImpl::WsBuffer typeref:typename:uint8_t * file:
+data host/libs/confui/host_renderer.h /^ auto data() { return teeui_frame_.data(); }$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:auto
+data host/libs/confui/sign_utils.h /^ const uint8_t* data() const { return data_; }$/;" f class:cuttlefish::confui::support::ByteBufferProxy typeref:typename:const uint8_t *
+data host/libs/websocket/websocket_handler.h /^ std::vector<uint8_t> data;$/;" m struct:cuttlefish::WebSocketHandler::WsBuffer typeref:typename:std::vector<uint8_t>
+dataCallListChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::dataCallListChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+data_ common/libs/utils/unix_sockets.h /^ std::vector<char> data_;$/;" m struct:cuttlefish::ControlMessage typeref:typename:std::vector<char>
+data_ host/libs/confui/sign_utils.h /^ const uint8_t* data_;$/;" m class:cuttlefish::confui::support::ByteBufferProxy typeref:typename:const uint8_t *
+data_channels_ host/frontend/webrtc/lib/client_handler.h /^ std::vector<rtc::scoped_refptr<webrtc::DataChannelInterface>> data_channels_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::vector<rtc::scoped_refptr<webrtc::DataChannelInterface>>
+data_code_scheme_ host/commands/modem_simulator/pdu_parser.h /^ std::string data_code_scheme_;$/;" m class:cuttlefish::PDUParser typeref:typename:std::string
+data_path_ host/libs/config/data_image.cpp /^ DataImagePath& data_path_;$/;" m class:cuttlefish::InitializeDataImageImpl typeref:typename:DataImagePath & file:
+data_policy host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::data_policy() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+data_registration_status_ host/commands/modem_simulator/network_service.h /^ NetworkRegistrationStatus data_registration_status_;$/;" m class:cuttlefish::NetworkService typeref:typename:NetworkRegistrationStatus
+data_service_ host/commands/modem_simulator/network_service.h /^ DataService* data_service_ = nullptr;$/;" m class:cuttlefish::NetworkService typeref:typename:DataService *
+dbm guest/hals/ril/reference-libril/ril.h /^ int dbm; \/* Valid values are positive integers. This value is the actual RSSI value$/;" m struct:__anon0bfbaecf4908 typeref:typename:int
+dbm guest/hals/ril/reference-libril/ril.h /^ int dbm; \/* Valid values are positive integers. This value is the actual RSSI value$/;" m struct:__anon0bfbaecf4a08 typeref:typename:int
+dcss host/commands/modem_simulator/sms_service.h /^ std::string dcss;$/;" m struct:cuttlefish::SmsService::BroadcastConfig typeref:typename:std::string
+deactivateDataCall guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::deactivateDataCall(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+deactivateDataCallResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::deactivateDataCallResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+deactivateDataCall_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::deactivateDataCall_1_2(int32_t serial, int32_t cid,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+death_recipient_ guest/hals/bt/remote/remote_bluetooth.h /^ sp<BluetoothDeathRecipient> death_recipient_;$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:sp<BluetoothDeathRecipient>
+decodeRootcanalMessage host/frontend/webrtc_operator/assets/js/rootcanal.js /^function decodeRootcanalMessage(array) {$/;" f
+defaultRoamingIndicator guest/hals/ril/reference-libril/ril.h /^ int32_t defaultRoamingIndicator; \/\/ default Roaming Indicator from the PRL,$/;" m struct:__anon0bfbaecf7f08 typeref:typename:int32_t
+defvalue_storage_ host/commands/start/flag_forwarder.cc /^ T defvalue_storage_;$/;" m class:DynamicFlag typeref:typename:T file:
+delete host/commands/secure_env/in_process_tpm.cpp /^#define delete /;" d file:
+deleteAllKeys guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCode> RemoteKeymaster4Device::deleteAllKeys() {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCode>
+deleteAllKeys guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::deleteAllKeys() {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+deleteAllUsers guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^Return<void> RemoteGateKeeperDevice::deleteAllUsers(deleteAllUsers_cb _hidl_cb) {$/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:Return<void>
+deleteKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCode> RemoteKeymaster4Device::deleteKey(const hidl_vec<uint8_t>& keyBlob) {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCode>
+deleteKey guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::deleteKey(const vector<uint8_t>& keyBlob) {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+deleteSmsOnRuim guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::deleteSmsOnRuim(int32_t serial, int32_t index) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+deleteSmsOnRuimResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::deleteSmsOnRuimResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+deleteSmsOnSim guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::deleteSmsOnSim(int32_t serial, int32_t index) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+deleteSmsOnSimResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::deleteSmsOnSimResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+deleteUser guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^Return<void> RemoteGateKeeperDevice::deleteUser(uint32_t \/*uid*\/, deleteUser_cb _hidl_cb) {$/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:Return<void>
+delete_interface tools/vlan_prototype_down.sh /^delete_interface() {$/;" f
+deliverSecureInputEvent guest/hals/confirmationui/TrustyConfirmationUI.cpp /^TrustyConfirmationUI::deliverSecureInputEvent(const HardwareAuthToken& auth_token) {$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:Return<ResponseCode>
+dependencyTag build/cvd-host-package.go /^type dependencyTag struct {$/;" s package:cuttlefish
+deprecated_boot_completed host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::deprecated_boot_completed() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+deprecated_boot_completed_ host/commands/kernel_log_monitor/kernel_log_server.h /^ bool deprecated_boot_completed_;$/;" m class:monitor::KernelLogServer typeref:typename:bool
+dequeue guest/hals/ril/reference-libril/rilSocketQueue.h /^T* Ril_queue<T>::dequeue(void) {$/;" f class:Ril_queue typeref:typename:T *
+description host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #description;$/;" M class:DeviceConnection
+description host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ get description() {$/;" G class:DeviceConnection
+description host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ set description(desc) {$/;" S class:DeviceConnection
+dest_family tools/create_base_image.go /^var dest_family string$/;" v package:main typeref:typename:string
+dest_family_flag= tools/create_base_image_hostlib.sh /^ dest_family_flag=()$/;" f
+dest_image tools/create_base_image.go /^var dest_image string$/;" v package:main typeref:typename:string
+dest_project tools/create_base_image.go /^var dest_project string$/;" v package:main typeref:typename:string
+destinationAddress guest/hals/ril/reference-libril/ril.h /^ char destinationAddress[MAX_INADDR_LEN]; \/* Destination address in network-byte order *\/$/;" m struct:__anon0bfbaecfc508 typeref:typename:char[]
+destinationPort guest/hals/ril/reference-libril/ril.h /^ int destinationPort; \/* Destination port if applicable or 0x7FFFFFFF;$/;" m struct:__anon0bfbaecfc508 typeref:typename:int
+destinations_ common/libs/utils/tee_logging.h /^ std::vector<SeverityTarget> destinations_;$/;" m class:cuttlefish::TeeLogger typeref:typename:std::vector<SeverityTarget>
+destroyAttestationIds guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCode> RemoteKeymaster4Device::destroyAttestationIds() {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCode>
+destroyAttestationIds guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::destroyAttestationIds() {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+destroy_virtio_gpu_metadata_resource_callback host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^void destroy_virtio_gpu_metadata_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anon027348120111 typeref:typename:void
+destroy_virtio_gpu_surface_metadata_resource_callback host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^void destroy_virtio_gpu_surface_metadata_resource_callback($/;" f namespace:wayland::__anon027348120111 typeref:typename:void
+dev_ guest/commands/vsoc_input_service/virtual_device_base.h /^ struct uinput_user_dev dev_ {};$/;" s class:cuttlefish_input_service::VirtualDeviceBase
+dev_path_ guest/hals/bt/remote/remote_bluetooth.h /^ const std::string dev_path_;$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:const std::string
+device guest/hals/camera/cached_stream_buffer.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera file:
+device guest/hals/camera/cached_stream_buffer.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera
+device guest/hals/camera/stream_buffer_cache.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera file:
+device guest/hals/camera/stream_buffer_cache.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera
+device guest/hals/camera/vsock_camera_device_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera file:
+device guest/hals/camera/vsock_camera_device_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera
+device guest/hals/camera/vsock_camera_device_session_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera file:
+device guest/hals/camera/vsock_camera_device_session_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera
+device guest/hals/camera/vsock_camera_metadata.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera file:
+device guest/hals/camera/vsock_camera_metadata.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera
+device guest/hals/gatekeeper/remote/service.cpp /^const char device[] = "\/dev\/hvc4";$/;" v typeref:typename:const char[]
+device guest/hals/keymaster/remote/service4.cpp /^const char device[] = "\/dev\/hvc3";$/;" v typeref:typename:const char[]
+device guest/hals/keymint/remote/service.cpp /^const char device[] = "\/dev\/hvc3";$/;" v namespace:__anon5714be600111 typeref:typename:const char[]
+device-audio host/frontend/webrtc_operator/assets/client.html /^ <audio controls id="device-audio"><\/audio>$/;" I
+device-connection host/frontend/webrtc_operator/assets/client.html /^ <section id="device-connection">$/;" I
+device-details-button host/frontend/webrtc_operator/assets/client.html /^ <button id='device-details-button' title='Device Details' class='material-icons'>$/;" I
+device-details-close host/frontend/webrtc_operator/assets/client.html /^ <button id='device-details-close' title='Close' class='material-icons modal-close'>clo/;" I
+device-details-hardware host/frontend/webrtc_operator/assets/client.html /^ <span id='device-details-hardware'>unknown<\/span>$/;" I
+device-details-modal host/frontend/webrtc_operator/assets/client.html /^ <div id='device-details-modal' class='modal'>$/;" I
+device-details-modal-header host/frontend/webrtc_operator/assets/client.html /^ <div id='device-details-modal-header' class='modal-header'>$/;" I
+device-displays host/frontend/webrtc_operator/assets/client.html /^ <div id='device-displays'>$/;" I
+device-list host/frontend/webrtc_operator/assets/index.html /^ <ul id="device-list"><\/ul>$/;" I
+device-selector host/frontend/webrtc_operator/assets/index.html /^ <section id='device-selector'>$/;" I
+deviceAdded guest/hals/camera/vsock_camera_provider_2_7.cpp /^void VsockCameraProvider::deviceAdded(const char* name) {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:void
+deviceConnection host/frontend/webrtc_operator/assets/js/app.js /^ #deviceConnection = {};$/;" M class:DeviceControlApp
+deviceId host/frontend/webrtc_operator/assets/js/server_connector.js /^export function deviceId() {$/;" f
+deviceLocked guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCodeV41> RemoteKeymaster4Device::deviceLocked($/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCodeV41>
+deviceLocked guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::deviceLocked($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+devicePrivKey_ host/commands/secure_env/tpm_remote_provisioning_context.h /^ std::vector<uint8_t> devicePrivKey_;$/;" m class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:std::vector<uint8_t>
+deviceRemoved guest/hals/camera/vsock_camera_provider_2_7.cpp /^void VsockCameraProvider::deviceRemoved(const char* name) {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:void
+device_config_ common/libs/device_config/device_config.h /^ DeviceConfig device_config_;$/;" m class:cuttlefish::DeviceConfigHelper typeref:typename:DeviceConfig
+device_handler host/frontend/webrtc_operator/client_handler.cpp /^ std::shared_ptr<DeviceHandler> device_handler() const {$/;" f class:cuttlefish::PollConnectionHandler typeref:typename:std::shared_ptr<DeviceHandler> file:
+device_handler_ host/frontend/webrtc_operator/client_handler.cpp /^ std::weak_ptr<DeviceHandler> device_handler_;$/;" m class:cuttlefish::PollConnectionHandler typeref:typename:std::weak_ptr<DeviceHandler> file:
+device_handler_ host/frontend/webrtc_operator/client_handler.h /^ std::weak_ptr<DeviceHandler> device_handler_;$/;" m class:cuttlefish::ClientWSHandler typeref:typename:std::weak_ptr<DeviceHandler>
+device_id host/commands/metrics/proto/cf_log.proto /^ optional string device_id = 3;$/;" f message:cuttlefish.CuttlefishLogEvent typeref:typename:string
+device_id host/frontend/webrtc/lib/streamer.h /^ std::string device_id;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig typeref:typename:std::string
+device_id_ host/frontend/webrtc_operator/device_handler.h /^ std::string device_id_;$/;" m class:cuttlefish::DeviceHandler typeref:typename:std::string
+device_info host/frontend/webrtc_operator/device_handler.h /^ Json::Value device_info() const { return device_info_; }$/;" f class:cuttlefish::DeviceHandler typeref:typename:Json::Value
+device_info_ host/frontend/webrtc_operator/device_handler.h /^ Json::Value device_info_;$/;" m class:cuttlefish::DeviceHandler typeref:typename:Json::Value
+device_module host/frontend/webrtc/lib/streamer.cpp /^ rtc::scoped_refptr<CfAudioDeviceModule> device_module() {$/;" f class:cuttlefish::webrtc_streaming::__anonab9390d10111::AudioDeviceModuleWrapper typeref:typename:rtc::scoped_refptr<CfAudioDeviceModule> file:
+device_module_ host/frontend/webrtc/lib/streamer.cpp /^ rtc::scoped_refptr<CfAudioDeviceModule> device_module_;$/;" m class:cuttlefish::webrtc_streaming::__anonab9390d10111::AudioDeviceModuleWrapper typeref:typename:rtc::scoped_refptr<CfAudioDeviceModule> file:
+device_name_ guest/commands/vsoc_input_service/virtual_device_base.h /^ const char* const device_name_;$/;" m class:cuttlefish_input_service::VirtualDeviceBase typeref:typename:const char * const
+device_states host/frontend/webrtc/lib/streamer.cpp /^ std::vector<DeviceState> device_states;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::ControlPanelButtonDescriptor typeref:typename:std::vector<DeviceState> file:
+device_states host/libs/config/custom_actions.h /^ std::vector<DeviceState> device_states;$/;" m struct:cuttlefish::CustomActionConfig typeref:typename:std::vector<DeviceState>
+device_states shared/config/config_foldable.json /^ "device_states": [$/;" a object:custom_actions.0
+device_states shared/config/config_foldable.json /^ "device_states": [$/;" a object:custom_actions.1
+device_type host/commands/metrics/proto/cf_log.proto /^ optional DeviceType device_type = 2;$/;" f message:cuttlefish.CuttlefishLogEvent typeref:typename:DeviceType
+devices_ host/frontend/webrtc_operator/device_registry.h /^ std::map<std::string, std::weak_ptr<DeviceHandler>> devices_;$/;" m class:cuttlefish::DeviceRegistry typeref:typename:std::map<std::string,std::weak_ptr<DeviceHandler>>
+df_name host/commands/modem_simulator/sim_service.h /^ std::string df_name;$/;" m struct:cuttlefish::SimService::LogicalChannel typeref:typename:std::string
+dhcp common/libs/utils/network.cpp /^ Dhcp4ReleaseMessage dhcp;$/;" m struct:cuttlefish::CompleteReleaseFrame typeref:typename:Dhcp4ReleaseMessage file:
+dial guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::dial(int32_t serial, const Dial& dialInfo) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+dialInfo guest/hals/ril/reference-libril/ril.h /^ RIL_Dial dialInfo;$/;" m struct:__anon0bfbaecfb708 typeref:typename:RIL_Dial
+dialResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::dialResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+dictionary_ host/commands/modem_simulator/nvram_config.h /^ std::unique_ptr<Json::Value> dictionary_;$/;" m class:cuttlefish::NvramConfig typeref:typename:std::unique_ptr<Json::Value>
+dictionary_ host/libs/config/cuttlefish_config.h /^ std::unique_ptr<Json::Value> dictionary_;$/;" m class:cuttlefish::CuttlefishConfig typeref:typename:std::unique_ptr<Json::Value>
+dictionary_ host/libs/config/fetcher_config.h /^ std::unique_ptr<Json::Value> dictionary_;$/;" m class:cuttlefish::FetcherConfig typeref:typename:std::unique_ptr<Json::Value>
+digest host/commands/secure_env/soft_gatekeeper.h /^ uint8_t digest[SHA256_DIGEST_LENGTH];$/;" m struct:gatekeeper::fast_hash_t typeref:typename:uint8_t[]
+digest_size_ host/commands/secure_env/hmac_serializable.h /^ uint32_t digest_size_;$/;" m class:cuttlefish::HmacSerializable typeref:typename:uint32_t
+direction host/libs/audio_connector/shm_layout.h /^ uint8_t direction;$/;" m struct:cuttlefish::virtio_snd_chmap_info typeref:typename:uint8_t
+direction host/libs/audio_connector/shm_layout.h /^ uint8_t direction;$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:uint8_t
+disableWifi tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private void disableWifi() throws Exception {$/;" m class:RilE2eTests file:
+disableWifi tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private void disableWifi() {$/;" m class:WifiE2eTests file:
+disable_scan_offload shared/config/wpa_supplicant_overlay.conf /^disable_scan_offload=1$/;" k
+disconnect host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ disconnect() {$/;" m class:DeviceConnection
+disconnectReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::disconnectReq(int32_t token) {$/;" f class:SapImpl typeref:typename:Return<void>
+disconnect_callback_ common/libs/utils/vsock_connection.h /^ std::function<void()> disconnect_callback_;$/;" m class:cuttlefish::VsockConnection typeref:typename:std::function<void ()>
+disconnectedCb host/frontend/webrtc_operator/assets/js/adb.js /^let disconnectedCb;$/;" v
+disconnectedTimeout host/frontend/webrtc_operator/assets/js/adb.js /^let disconnectedTimeout;$/;" v
+discrete_gpu_device_extensions host/libs/graphics_detector/graphics_detector.h /^ std::string discrete_gpu_device_extensions;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+discrete_gpu_device_name host/libs/graphics_detector/graphics_detector.h /^ std::string discrete_gpu_device_name;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+disk_guid host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t disk_guid[16];$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint8_t[16] file:
+disk_size common/libs/utils/files.h /^ off_t disk_size;$/;" m struct:cuttlefish::FileSizes typeref:typename:off_t
+dispatchCallForwardStatus guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchCallForwardStatus(int serial, int slotId, int request,$/;" f typeref:typename:bool
+dispatchIccApdu guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {$/;" f typeref:typename:bool
+dispatchImsCdmaSms guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {$/;" f typeref:typename:bool
+dispatchImsGsmSms guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {$/;" f typeref:typename:bool
+dispatchInts guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {$/;" f typeref:typename:bool
+dispatchQueue guest/hals/ril/reference-libril/RilSapSocket.h /^ Ril_queue<SapSocketRequest> dispatchQueue;$/;" m class:RilSapSocket typeref:typename:Ril_queue<SapSocketRequest>
+dispatchRaw guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {$/;" f typeref:typename:bool
+dispatchRequest guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::dispatchRequest(MsgHeader *req) {$/;" f class:RilSapSocket typeref:typename:void
+dispatchString guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchString(int serial, int slotId, int request, const char * str) {$/;" f typeref:typename:bool
+dispatchStrings guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, .../;" f typeref:typename:bool
+dispatchStrings guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {$/;" f typeref:typename:bool
+dispatchVoid guest/hals/ril/reference-libril/ril_service.cpp /^bool dispatchVoid(int serial, int slotId, int request) {$/;" f typeref:typename:bool
+display guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_DisplayInfoRecord display;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_DisplayInfoRecord
+display0 shared/config/config_auto.json /^ "display0": "width=1080,height=600,dpi=120",$/;" s
+display1 shared/config/config_auto.json /^ "display1": "width=400,height=600,dpi=120",$/;" s
+displayDescriptions host/frontend/webrtc_operator/assets/js/app.js /^ #displayDescriptions = [];$/;" M class:DeviceControlApp
+display_ host/libs/wayland/wayland_server.cpp /^ struct wl_display* display_ = nullptr;$/;" m struct:wayland::internal::WaylandServerState typeref:struct:wl_display * file:
+display_config common/libs/device_config/device_config.proto /^ repeated DisplayConfig display_config = 2;$/;" f message:cuttlefish.DeviceConfig typeref:typename:DisplayConfig
+display_configs host/libs/config/cuttlefish_config.cpp /^std::vector<CuttlefishConfig::DisplayConfig> CuttlefishConfig::display_configs()$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::vector<CuttlefishConfig::DisplayConfig>
+display_num_ host/libs/confui/host_renderer.h /^ std::uint32_t display_num_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::uint32_t
+display_num_ host/libs/confui/host_server.h /^ const std::uint32_t display_num_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:const std::uint32_t
+display_num_ host/libs/confui/session.h /^ const std::uint32_t display_num_;$/;" m class:cuttlefish::confui::Session typeref:typename:const std::uint32_t
+display_number_ host/libs/screen_connector/screen_connector_common.h /^ std::uint32_t display_number_;$/;" m struct:cuttlefish::ScreenConnectorFrameInfo typeref:typename:std::uint32_t
+display_sinks_ host/frontend/webrtc/display_handler.h /^ std::vector<std::shared_ptr<webrtc_streaming::VideoSink>> display_sinks_;$/;" m class:cuttlefish::DisplayHandler typeref:typename:std::vector<std::shared_ptr<webrtc_streaming::VideoSink>>
+displays_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::vector<std::unique_ptr<Display>> displays_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Impl typeref:typename:std::vector<std::unique_ptr<Display>> file:
+displays_ host/frontend/webrtc/lib/streamer.cpp /^ std::map<std::string, DisplayDescriptor> displays_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::map<std::string,DisplayDescriptor> file:
+dlog guest/hals/ril/reference-libril/ril_event.cpp /^#define dlog(/;" d file:
+dns common/libs/device_config/device_config.proto /^ string dns = 3;$/;" f message:cuttlefish.DeviceConfig.RILConfig typeref:typename:string
+dnses guest/hals/ril/reference-libril/ril.h /^ char * dnses; \/* A space-delimited list of DNS server addresses,$/;" m struct:__anon0bfbaecf1308 typeref:typename:char *
+dnses guest/hals/ril/reference-libril/ril.h /^ char * dnses; \/* A space-delimited list of DNS server addresses,$/;" m struct:__anon0bfbaecf1408 typeref:typename:char *
+dnses guest/hals/ril/reference-libril/ril.h /^ char * dnses; \/* A space-delimited list of DNS server addresses,$/;" m struct:__anon0bfbaecf1508 typeref:typename:char *
+dnses guest/hals/ril/reference-libril/ril.h /^ char * dnses; \/* A space-delimited list of DNS server addresses,$/;" m struct:__anon0bfbaecf1608 typeref:typename:char *
+dnses host/commands/modem_simulator/data_service.h /^ std::string dnses;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:std::string
+do_redirects common/libs/utils/subprocess.cpp /^void do_redirects(const std::map<Subprocess::StdIOChannel, int>& redirects) {$/;" f namespace:cuttlefish::__anon39e8abf00111 typeref:typename:void
+doc host/commands/modem_simulator/sim_service.h /^ XMLDocument doc;$/;" m struct:cuttlefish::SimService::SimFileSystem typeref:typename:XMLDocument
+down host/frontend/webrtc_operator/assets/js/app.js /^ down: false,$/;" p class:DeviceControlApp.startMouseTracking.mouseCtx
+downLink guest/hals/ril/reference-libril/ril.h /^ char downLink;$/;" m struct:__anon0bfbaecf8808 typeref:typename:char
+download_host_package host/commands/fetcher/fetch_cvd.cc /^std::vector<std::string> download_host_package(BuildApi* build_api,$/;" f namespace:cuttlefish::__anonccb356fd0211 typeref:typename:std::vector<std::string>
+download_images host/commands/fetcher/fetch_cvd.cc /^std::vector<std::string> download_images(BuildApi* build_api,$/;" f namespace:cuttlefish::__anonccb356fd0211 typeref:typename:std::vector<std::string>
+download_ota_tools host/commands/fetcher/fetch_cvd.cc /^std::vector<std::string> download_ota_tools(BuildApi* build_api,$/;" f namespace:cuttlefish::__anonccb356fd0211 typeref:typename:std::vector<std::string>
+download_target_files host/commands/fetcher/fetch_cvd.cc /^std::vector<std::string> download_target_files(BuildApi* build_api,$/;" f namespace:cuttlefish::__anonccb356fd0211 typeref:typename:std::vector<std::string>
+dpi common/libs/device_config/device_config.proto /^ int32 dpi = 3;$/;" f message:cuttlefish.DeviceConfig.DisplayConfig typeref:typename:int32
+dpi host/frontend/webrtc/lib/streamer.cpp /^ int dpi;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::DisplayDescriptor typeref:typename:int file:
+dpi host/libs/config/cuttlefish_config.h /^ int dpi;$/;" m struct:cuttlefish::CuttlefishConfig::DisplayConfig typeref:typename:int
+dpi shared/config/config_foldable.json /^ "dpi" : 386,$/;" n
+dpi shared/config/config_phone.json /^ "dpi" : 320,$/;" n
+dpi shared/config/config_tablet.json /^ "dpi" : 320,$/;" n
+dpi shared/config/config_tv.json /^ "dpi" : 213,$/;" n
+drawElements host/libs/confui/host_renderer.h /^ static teeui::Error drawElements(std::tuple<Elements...>& layout,$/;" f class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Error
+droidcore fetcher.mk /^droidcore: $(fetcher_bin)$/;" t
+droidcore host_package.mk /^droidcore: $(cvd_host_packages)$/;" t
+dump guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {$/;" m class:GceService
+dumpState guest/hals/camera/vsock_camera_device_3_4.cpp /^Return<void> VsockCameraDevice::dumpState($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:Return<void>
+dump_event guest/hals/ril/reference-libril/ril_event.cpp /^#define dump_event(/;" d file:
+dump_event guest/hals/ril/reference-libril/ril_event.cpp /^static void dump_event(struct ril_event * ev)$/;" f typeref:typename:void file:
+dyn_handler_factories_ host/libs/websocket/websocket_server.h /^ std::unordered_map<std::string, DynHandlerFactory> dyn_handler_factories_ =$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::unordered_map<std::string,DynHandlerFactory>
+dyn_handlers_ host/libs/websocket/websocket_server.h /^ std::unordered_map<struct lws*, std::unique_ptr<DynHandler>> dyn_handlers_ =$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::unordered_map<struct lws *,std::unique_ptr<DynHandler>>
+dyn_mounts_ host/libs/websocket/websocket_server.h /^ std::vector<struct lws_http_mount> dyn_mounts_ = {};$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::vector<struct lws_http_mount>
+earfcn guest/hals/ril/reference-libril/ril.h /^ int earfcn; \/* 18-bit LTE Absolute RF Channel Number; this value must be reported *\/$/;" m struct:__anon0bfbaecf5e08 typeref:typename:int
+earfcn guest/hals/ril/reference-libril/ril.h /^ int earfcn; \/* 18-bit LTE Absolute RF Channel Number; this value must be reported *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+earlyBootEnded guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<ErrorCodeV41> RemoteKeymaster4Device::earlyBootEnded() {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<ErrorCodeV41>
+earlyBootEnded guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::earlyBootEnded() {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+ebr host/libs/allocd/request.h /^ ebr \/\/ ethernet bridge$/;" e enum:cuttlefish::IfaceType
+ecio guest/hals/ril/reference-libril/ril.h /^ int ecio; \/* Valid values are positive integers. This value is the actual Ec\/Io multiplie/;" m struct:__anon0bfbaecf4908 typeref:typename:int
+ecio guest/hals/ril/reference-libril/ril.h /^ int ecio; \/* Valid values are positive integers. This value is the actual Ec\/Io multiplie/;" m struct:__anon0bfbaecf4a08 typeref:typename:int
+ef_id guest/hals/ril/reference-libril/ril.h /^ int ef_id; \/* is the EFID of the updated file if the result is *\/$/;" m struct:__anon0bfbaecf4108 typeref:typename:int
+egl_client_extensions host/libs/graphics_detector/graphics_detector.h /^ std::string egl_client_extensions;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+egl_extensions host/libs/graphics_detector/graphics_detector.h /^ std::string egl_extensions;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+egl_vendor host/libs/graphics_detector/graphics_detector.h /^ std::string egl_vendor;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+egl_version host/libs/graphics_detector/graphics_detector.h /^ std::string egl_version;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+eid guest/hals/ril/reference-libril/ril.h /^ char * eid; \/* The EID is the eUICC identifier. The EID shall be stored wit/;" m struct:__anon0bfbaecf3c08 typeref:typename:char *
+eid guest/hals/ril/reference-libril/ril.h /^ char* eid;$/;" m struct:__anon0bfbaecfba08 typeref:typename:char *
+elapsed_time_ms host/commands/metrics/proto/cf_metrics_event.proto /^ optional Duration elapsed_time_ms = 4;$/;" f message:cuttlefish.MetricsEvent typeref:typename:Duration
+element host/frontend/webrtc_operator/assets/js/app.js /^ #element;$/;" M class:DeviceDetailsUpdater
+emergencyDial guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::emergencyDial(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+emergencyDialResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::emergencyDialResponse(int slotId, int responseType, int serial, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+emergencyDial_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::emergencyDial_1_6(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+emergency_mode host/commands/modem_simulator/nvram_config.cpp /^bool NvramConfig::InstanceSpecific::emergency_mode() const {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:bool
+empty guest/hals/ril/reference-libril/rilSocketQueue.h /^int Ril_queue<T>::empty(void) {$/;" f class:Ril_queue typeref:typename:int
+empty host/frontend/webrtc/audio_handler.cpp /^bool AudioHandler::HoldingBuffer::empty() const { return count == 0; }$/;" f class:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:bool
+enableModem guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::enableModem(int32_t serial, bool \/* on *\/) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+enableModemResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::enableModemResponse(int slotId, int responseType, int serial, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+enableNetwork tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private void enableNetwork(String SSID) {$/;" m class:WifiE2eTests file:
+enableUiccApplications guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::enableUiccApplications(int32_t serial, bool enable) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+enableUiccApplicationsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::enableUiccApplicationsResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+enableWifi tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private void enableWifi() {$/;" m class:WifiE2eTests file:
+enable_audio host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_audio() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_gnss_grpc_proxy host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_gnss_grpc_proxy() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_host_bluetooth host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_host_bluetooth() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_metrics host/libs/config/cuttlefish_config.cpp /^CuttlefishConfig::Answer CuttlefishConfig::enable_metrics() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:CuttlefishConfig::Answer
+enable_minimal_mode host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_minimal_mode() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_modem_simulator host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_modem_simulator() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_sandbox host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_sandbox() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_vehicle_hal_grpc_server host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_vehicle_hal_grpc_server() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enable_webrtc host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::enable_webrtc() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+enabled guest/hals/ril/reference-libril/ril.h /^ int enabled;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+enabled guest/hals/ril/reference-libril/ril.h /^ int enabled;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+encode_queue_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::list<webrtc::VideoFrame> encode_queue_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::list<webrtc::VideoFrame> file:
+encode_queue_mutex_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::mutex encode_queue_mutex_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::mutex file:
+encoder_factory_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Impl typeref:typename:std::unique_ptr<webrtc::VideoEncoderFactory> file:
+encoder_queue_signal_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::condition_variable encoder_queue_signal_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::condition_variable file:
+encoder_running_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::atomic_bool encoder_running_ = true;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::atomic_bool file:
+encoder_thread_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::thread encoder_thread_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::thread file:
+end common/libs/fs/shared_select.h /^ const_iterator end() const { return value_.end(); }$/;" f class:cuttlefish::SharedFDSet typeref:typename:const_iterator
+end common/libs/fs/shared_select.h /^ iterator end() { return value_.end(); }$/;" f class:cuttlefish::SharedFDSet typeref:typename:iterator
+end host/libs/confui/sign_utils.h /^ const uint8_t* end() const { return data_ + size_; }$/;" f class:cuttlefish::confui::support::ByteBufferProxy typeref:typename:const uint8_t *
+endSensorInjection guest/commands/sensor_injection/main.cpp /^void endSensorInjection(const sp<ISensors> sensors) {$/;" f typeref:typename:void
+end_chs host/libs/config/mbr.h /^ std::uint8_t end_chs[3];$/;" m struct:MbrPartitionEntry typeref:typename:std::uint8_t[3]
+end_code common/libs/utils/network.cpp /^ std::uint8_t end_code;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t file:
+enforcement_ host/commands/secure_env/tpm_keymaster_context.h /^ keymaster::KeymasterEnforcement& enforcement_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster::KeymasterEnforcement &
+enforcement_policy host/commands/secure_env/proxy_keymaster_context.h /^ keymaster::KeymasterEnforcement* enforcement_policy() override {$/;" f class:cuttlefish::ProxyKeymasterContext typeref:typename:keymaster::KeymasterEnforcement *
+enforcement_policy host/commands/secure_env/tpm_keymaster_context.cpp /^keymaster::KeymasterEnforcement* TpmKeymasterContext::enforcement_policy() {$/;" f class:cuttlefish::TpmKeymasterContext typeref:typename:keymaster::KeymasterEnforcement *
+enqueue guest/hals/ril/reference-libril/rilSocketQueue.h /^void Ril_queue<T>::enqueue(T* request) {$/;" f class:Ril_queue typeref:typename:void
+enroll guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^Return<void> RemoteGateKeeperDevice::enroll(uint32_t uid,$/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:Return<void>
+enterEmergencyCallbackModeInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::enterEmergencyCallbackModeInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+entries host/libs/image_aggregator/image_aggregator.cc /^ GptPartitionEntry entries[GPT_NUM_PARTITIONS];$/;" m struct:cuttlefish::__anon02806fd80111::GptBeginning typeref:typename:GptPartitionEntry[] file:
+entries host/libs/image_aggregator/image_aggregator.cc /^ GptPartitionEntry entries[GPT_NUM_PARTITIONS];$/;" m struct:cuttlefish::__anon02806fd80111::GptEnd typeref:typename:GptPartitionEntry[] file:
+env_ common/libs/utils/subprocess.h /^ std::vector<std::string> env_{};$/;" m class:cuttlefish::Command typeref:typename:std::vector<std::string>
+errno_ common/libs/fs/shared_fd.h /^ int errno_;$/;" m class:cuttlefish::FileInstance typeref:typename:int
+error guest/hals/ril/reference-libril/ril.h /^ RIL_Errno error;$/;" m struct:__anon0bfbaecfb308 typeref:typename:RIL_Errno
+error host/frontend/webrtc/lib/utils.h /^ std::string error() const { return error_.value_or(""); }$/;" f class:cuttlefish::webrtc_streaming::ValidationResult typeref:typename:std::string
+error-message host/frontend/webrtc_operator/assets/client.html /^ <div id="error-message-div"><h3 id="error-message" class="error"><\/h3><\/div>$/;" I
+error-message-div host/frontend/webrtc_operator/assets/client.html /^ <div id="error-message-div"><h3 id="error-message" class="error"><\/h3><\/div>$/;" I
+errorCode guest/hals/ril/reference-libril/ril.h /^ int errorCode; \/* See 3GPP 27.005, 3.2.5 for GSM\/UMTS,$/;" m struct:__anon0bfbaecf1a08 typeref:typename:int
+error_ guest/hals/gatekeeper/remote/remote_gatekeeper.h /^ int error_;$/;" m class:gatekeeper::RemoteGateKeeperDevice typeref:typename:int
+error_ host/frontend/webrtc/lib/utils.h /^ std::optional<std::string> error_;$/;" m class:cuttlefish::webrtc_streaming::ValidationResult typeref:typename:std::optional<std::string>
+error_type host/commands/metrics/proto/cf_metrics_event.proto /^ optional ErrorType error_type = 2;$/;" f message:cuttlefish.MetricsEvent typeref:typename:ErrorType
+esp_image_ host/libs/config/data_image.cpp /^ std::string esp_image_;$/;" m class:cuttlefish::InitializeEspImageImpl typeref:typename:std::string file:
+esys_ host/commands/secure_env/test_tpm.h /^ ESYS_CONTEXT* esys_;$/;" m class:cuttlefish::TestTpm typeref:typename:ESYS_CONTEXT *
+esys_ host/commands/secure_env/tpm_random_source.h /^ ESYS_CONTEXT* esys_;$/;" m class:cuttlefish::TpmRandomSource typeref:typename:ESYS_CONTEXT *
+esys_ host/commands/secure_env/tpm_resource_manager.h /^ ESYS_CONTEXT* esys_;$/;" m class:cuttlefish::TpmResourceManager typeref:typename:ESYS_CONTEXT *
+etap host/libs/allocd/request.h /^ etap, \/\/ ethernet tap$/;" e enum:cuttlefish::IfaceType
+eth common/libs/utils/network.cpp /^ ether_header eth;$/;" m struct:cuttlefish::CompleteReleaseFrame typeref:typename:ether_header file:
+ethernet_tap host/commands/assemble_cvd/alloc.h /^ IfaceData ethernet_tap;$/;" m struct:cuttlefish::IfaceConfig typeref:typename:IfaceData
+ethernet_tap_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::ethernet_tap_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+ethhdr common/libs/utils/network.cpp /^#define ethhdr /;" d file:
+eutran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_EutranBands eutran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfab08::__anon0bfbaecfac0a typeref:typename:RIL_EutranBands[]
+eutran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_EutranBands eutran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfae08::__anon0bfbaecfaf0a typeref:typename:RIL_EutranBands[]
+evdo_dbm host/commands/modem_simulator/network_service.h /^ int evdo_dbm; \/* Refer cdma_dbm *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+evdo_ecio host/commands/modem_simulator/network_service.h /^ int evdo_ecio; \/* Refer cdma_ecio *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+evdo_snr host/commands/modem_simulator/network_service.h /^ int evdo_snr; \/* Valid values are 0-8. 8 is the highest signal to noise ratio. *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+event guest/commands/vsoc_input_service/virtual_device_base.cpp /^ struct input_event event {};$/;" s function:VirtualDeviceBase::EmitEvent file:
+event guest/hals/ril/reference-libril/ril.cpp /^ struct ril_event event;$/;" m struct:android::UserCallbackInfo typeref:struct:ril_event file:
+event host/commands/kernel_log_monitor/kernel_log_server.cc /^ Event event; \/\/ emitted when the stage is encountered$/;" m struct:__anonfa7764770111::__anonfa7764770308 typeref:typename:Event file:
+event host/commands/kernel_log_monitor/utils.h /^ Event event;$/;" m struct:monitor::ReadEventResult typeref:typename:Event
+eventLoop guest/hals/ril/reference-libril/ril.cpp /^eventLoop(void *param) {$/;" f namespace:android typeref:typename:void * file:
+event_pipe_read_ends_ host/commands/run_cvd/launch.cc /^ std::vector<SharedFD> event_pipe_read_ends_;$/;" m class:cuttlefish::KernelLogMonitor typeref:typename:std::vector<SharedFD> file:
+event_pipe_write_ends_ host/commands/run_cvd/launch.cc /^ std::vector<SharedFD> event_pipe_write_ends_;$/;" m class:cuttlefish::KernelLogMonitor typeref:typename:std::vector<SharedFD> file:
+event_socket_ host/libs/audio_connector/server.h /^ SharedFD event_socket_;$/;" m class:cuttlefish::AudioClientConnection typeref:typename:SharedFD
+event_time_ms host/commands/metrics/proto/cf_metrics_event.proto /^ optional Timestamp event_time_ms = 3;$/;" f message:cuttlefish.MetricsEvent typeref:typename:Timestamp
+event_time_ms host/commands/metrics/proto/clientanalytics.proto /^ optional int64 event_time_ms = 1;$/;" f message:LogEvent typeref:typename:int64
+event_type host/commands/metrics/proto/cf_metrics_event.proto /^ optional EventType event_type = 1;$/;" f message:cuttlefish.MetricsEvent typeref:typename:EventType
+eventfd_ host/frontend/webrtc/kernel_log_events_handler.h /^ SharedFD eventfd_;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:SharedFD
+excluded_carriers guest/hals/ril/reference-libril/ril.h /^ RIL_Carrier * excluded_carriers; \/* excluded carriers$/;" m struct:__anon0bfbaecf2708 typeref:typename:RIL_Carrier *
+excluded_carriers guest/hals/ril/reference-libril/ril.h /^ RIL_Carrier * excluded_carriers; \/* explicitly excluded carriers$/;" m struct:__anon0bfbaecf2908 typeref:typename:RIL_Carrier *
+execute common/libs/utils/subprocess.cpp /^int execute(const std::vector<std::string>& command) {$/;" f namespace:cuttlefish typeref:typename:int
+execute common/libs/utils/subprocess.cpp /^int execute(const std::vector<std::string>& command,$/;" f namespace:cuttlefish typeref:typename:int
+execute guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^ public int execute() {$/;" m class:BluetoothChecker
+execute guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ public int execute() {$/;" m class:ConnectivityChecker
+execute guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public int execute() {$/;" m class:EventReporter
+execute guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public synchronized int execute() {$/;" m class:GceWifiManager.MonitorWifiJob
+execute guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public synchronized int execute() {$/;" m class:GceWifiManager
+execute guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^ public abstract int execute();$/;" m class:JobBase
+exists_boot_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_boot_image_spec = 13;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_bootloader_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_bootloader_spec = 14;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_composite_disk_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_composite_disk_spec = 15;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_data_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_data_image_spec = 16;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_metadata_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_metadata_image_spec = 17;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_misc_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_misc_image_spec = 18;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_qemu_binary_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_qemu_binary_spec = 19;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_super_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_super_image_spec = 20;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_system_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_system_image_spec = 12;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exists_vendor_boot_image_spec host/commands/metrics/proto/cf_metrics_event.proto /^ optional bool exists_vendor_boot_image_spec = 21;$/;" f message:cuttlefish.MetricsEvent typeref:typename:bool
+exitEmergencyCallbackMode guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::exitEmergencyCallbackMode(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+exitEmergencyCallbackModeInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::exitEmergencyCallbackModeInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+exitEmergencyCallbackModeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::exitEmergencyCallbackModeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+exit_with_parent_ common/libs/utils/subprocess.h /^ bool exit_with_parent_;$/;" m class:cuttlefish::SubprocessOptions typeref:typename:bool
+exp_data common/libs/net/netlink_request_test.cpp /^ const uint8_t* exp_data = static_cast<const uint8_t*>($/;" v namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:const uint8_t *
+expiration host/commands/fetcher/credential_source.h /^ std::chrono::steady_clock::time_point expiration;$/;" m class:cuttlefish::GceMetadataCredentialSource typeref:typename:std::chrono::steady_clock::time_point
+expirationTime guest/hals/ril/reference-libril/ril.h /^ int64_t expirationTime; \/* Date-Time (in UTC) when the key will expire. *\/$/;" m struct:__anon0bfbaecf2c08 typeref:typename:int64_t
+expirationTime guest/hals/ril/reference-libril/ril.h /^ int64_t expirationTime; \/* Date-Time (in UTC) when the key will expire. *\/$/;" m struct:__anon0bfbaecf2a08 typeref:typename:int64_t
+expiration_date_passed host/commands/secure_env/tpm_keymaster_enforcement.cpp /^bool TpmKeymasterEnforcement::expiration_date_passed($/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:bool
+expiry common/libs/utils/network.h /^ std::uint64_t expiry;$/;" m struct:cuttlefish::DnsmasqDhcp4Lease typeref:typename:std::uint64_t
+explicitCallTransfer guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::explicitCallTransfer(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+explicitCallTransferResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::explicitCallTransferResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+exportKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::exportKey(KeyFormat exportFormat,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+extended_sul_ host/frontend/webrtc/lib/ws_connection.cpp /^ CreateConnectionSul extended_sul_;$/;" m class:WsConnectionImpl typeref:typename:CreateConnectionSul file:
+extra_bootconfig_args host/libs/config/cuttlefish_config.cpp /^std::vector<std::string> CuttlefishConfig::extra_bootconfig_args() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::vector<std::string>
+extra_data_ common/libs/confui/protocol_types.h /^ std::vector<std::uint8_t> extra_data_;$/;" m class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::vector<std::uint8_t>
+extra_data_ guest/hals/confirmationui/guest_session.h /^ std::vector<std::uint8_t> extra_data_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::vector<std::uint8_t>
+extra_data_ host/libs/confui/cbor.h /^ std::vector<std::uint8_t> extra_data_;$/;" m class:cuttlefish::confui::Cbor typeref:typename:std::vector<std::uint8_t>
+extra_data_ host/libs/confui/session.h /^ std::vector<std::uint8_t> extra_data_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::vector<std::uint8_t>
+extra_kernel_cmdline host/libs/config/cuttlefish_config.cpp /^std::vector<std::string> CuttlefishConfig::extra_kernel_cmdline() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::vector<std::string>
+f host/libs/confui/sign_utils.h /^ static int f(const U*, const void*) {$/;" f struct:cuttlefish::confui::support::ByteBufferProxy::has_data typeref:typename:int
+f_command_handler host/commands/modem_simulator/modem_service.h /^ std::optional<f_func> f_command_handler;$/;" m class:cuttlefish::CommandHandler typeref:typename:std::optional<f_func>
+f_func host/commands/modem_simulator/modem_service.h /^using f_func = std::function<void(const Client&)>; \/\/ Full match$/;" t namespace:cuttlefish
+facility_lock_ host/commands/modem_simulator/sim_service.h /^ std::map<std::string, FacilityLock> facility_lock_;$/;" m class:cuttlefish::SimService typeref:typename:std::map<std::string,FacilityLock>
+factory_reset_protected_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::factory_reset_protected_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+failCauseToString guest/hals/ril/reference-libril/ril.cpp /^failCauseToString(RIL_Errno e) {$/;" f namespace:android typeref:typename:const char *
+failure_map_ host/commands/secure_env/soft_gatekeeper.h /^ FailureRecordMap failure_map_;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:FailureRecordMap
+fast_hash_map_ host/commands/secure_env/soft_gatekeeper.h /^ FastHashMap fast_hash_map_;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:FastHashMap
+fast_hash_t host/commands/secure_env/soft_gatekeeper.h /^struct fast_hash_t {$/;" s namespace:gatekeeper
+fatal_echo tools/create_base_image_hostlib.sh /^fatal_echo() {$/;" f
+fd guest/hals/ril/reference-libril/ril_event.h /^ int fd;$/;" m struct:ril_event typeref:typename:int
+fdCommand guest/hals/ril/reference-libril/ril_ex.h /^ int fdCommand;$/;" m struct:SocketListenParam typeref:typename:int
+fdListen guest/hals/ril/reference-libril/ril_ex.h /^ int fdListen;$/;" m struct:SocketListenParam typeref:typename:int
+fd_ common/libs/fs/shared_fd.h /^ int fd_;$/;" m class:cuttlefish::FileInstance typeref:typename:int
+fd_ common/libs/utils/tcp_socket.h /^ SharedFD fd_;$/;" m class:cuttlefish::ClientSocket typeref:typename:SharedFD
+fd_ common/libs/utils/tcp_socket.h /^ SharedFD fd_;$/;" m class:cuttlefish::ServerSocket typeref:typename:SharedFD
+fd_ common/libs/utils/vsock_connection.h /^ SharedFD fd_;$/;" m class:cuttlefish::VsockConnection typeref:typename:SharedFD
+fd_ guest/commands/vsoc_input_service/virtual_device_base.h /^ int fd_ = -1;$/;" m class:cuttlefish_input_service::VirtualDeviceBase typeref:typename:int
+fd_ guest/hals/bt/remote/remote_bluetooth.h /^ int fd_{-1};$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:int
+fds_ common/libs/utils/unix_sockets.h /^ std::vector<int> fds_;$/;" m struct:cuttlefish::ControlMessage typeref:typename:std::vector<int>
+features host/libs/audio_connector/commands.h /^ uint32_t features() const { return features_; }$/;" f struct:cuttlefish::StreamSetParamsCommand typeref:typename:uint32_t
+features host/libs/audio_connector/shm_layout.h /^ Le32 features; \/* 1 << VIRTIO_SND_JACK_F_XXX *\/$/;" m struct:cuttlefish::virtio_snd_jack_info typeref:typename:Le32
+features host/libs/audio_connector/shm_layout.h /^ Le32 features; \/* 1 << VIRTIO_SND_PCM_F_XXX *\/$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:Le32
+features host/libs/audio_connector/shm_layout.h /^ Le32 features; \/* 1 << VIRTIO_SND_PCM_F_XXX *\/$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:Le32
+features_ host/libs/audio_connector/commands.h /^ const uint32_t features_;$/;" m struct:cuttlefish::StreamSetParamsCommand typeref:typename:const uint32_t
+fetcher_bin fetcher.mk /^fetcher_bin := $(HOST_OUT)\/$(bin_path)\/fetch_cvd$/;" m
+fg_launcher_pipe_ host/commands/run_cvd/boot_state_machine.cc /^ SharedFD fg_launcher_pipe_;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:SharedFD file:
+fifo_ host/commands/run_cvd/launch.cc /^ SharedFD fifo_;$/;" m class:cuttlefish::KernelLogMonitor typeref:typename:SharedFD file:
+fifos_ host/commands/run_cvd/launch.cc /^ std::vector<SharedFD> fifos_;$/;" m class:cuttlefish::BluetoothConnector typeref:typename:std::vector<SharedFD> file:
+fifos_ host/commands/run_cvd/launch.cc /^ std::vector<SharedFD> fifos_;$/;" m class:cuttlefish::SecureEnvironment typeref:typename:std::vector<SharedFD> file:
+file common/libs/utils/archive.h /^ std::string file;$/;" m class:cuttlefish::Archive typeref:typename:std::string
+file_path host/commands/modem_simulator/sim_service.h /^ std::string file_path;$/;" m struct:cuttlefish::SimService::SimFileSystem typeref:typename:std::string
+file_path host/libs/config/fetcher_config.h /^ std::string file_path;$/;" m struct:cuttlefish::CvdFile typeref:typename:std::string
+file_path host/libs/image_aggregator/cdisk_spec.proto /^ string file_path = 1;$/;" f message:ComponentDisk typeref:typename:string
+file_write_callback host/commands/fetcher/curl_wrapper.cc /^size_t file_write_callback(char *ptr, size_t, size_t nmemb, void *userdata) {$/;" f namespace:cuttlefish::__anondfffca8d0111 typeref:typename:size_t
+file_writer_ host/frontend/webrtc/lib/local_recorder.cpp /^ mkvmuxer::MkvWriter file_writer_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Impl typeref:typename:mkvmuxer::MkvWriter file:
+fileid guest/hals/ril/reference-libril/ril.h /^ int fileid; \/* EF id *\/$/;" m struct:__anon0bfbaecf1d08 typeref:typename:int
+fileid guest/hals/ril/reference-libril/ril.h /^ int fileid; \/* EF id *\/$/;" m struct:__anon0bfbaecf1e08 typeref:typename:int
+filename_ host/commands/start/flag_forwarder.cc /^ std::string filename_;$/;" m class:DynamicFlag typeref:typename:std::string file:
+fillCaptureResult guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::fillCaptureResult($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+fillCellIdentityFromDataRegStateResponseString guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,$/;" f typeref:typename:void
+fillCellIdentityFromDataRegStateResponseString_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityFromDataRegStateResponseString_1_2(V1_2::CellIdentity &cellIdentity,$/;" f typeref:typename:void
+fillCellIdentityFromDataRegStateResponseString_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityFromDataRegStateResponseString_1_5(V1_5::CellIdentity &cellIdentity,$/;" f typeref:typename:void
+fillCellIdentityFromVoiceRegStateResponseString guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityFromVoiceRegStateResponseString(V1_5::CellIdentity &cellIdentity,$/;" f typeref:typename:void
+fillCellIdentityFromVoiceRegStateResponseString_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityFromVoiceRegStateResponseString_1_2(V1_2::CellIdentity &cellIdentity,$/;" f typeref:typename:void
+fillCellIdentityResponse guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity)/;" f typeref:typename:void
+fillCellIdentityResponse_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityResponse_1_2(V1_2::CellIdentity &cellIdentity,$/;" f typeref:typename:void
+fillCellIdentityResponse_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^void fillCellIdentityResponse_1_5(V1_5::CellIdentity &cellIdentity,$/;" f typeref:typename:void
+finalResponse guest/hals/ril/reference-ril/atchannel.h /^ char *finalResponse; \/* eg OK, ERROR *\/$/;" m struct:__anon512a2c1f0208 typeref:typename:char *
+findNextEOL guest/hals/ril/reference-ril/atchannel.c /^static char * findNextEOL(char *cur)$/;" f typeref:typename:char * file:
+finish guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::finish(uint64_t operationHandle,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+finish guest/hals/keymint/remote/remote_keymint_operation.cpp /^ScopedAStatus RemoteKeyMintOperation::finish($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation typeref:typename:ScopedAStatus
+firePending guest/hals/ril/reference-libril/ril_event.cpp /^static void firePending()$/;" f typeref:typename:void file:
+first_lba host/libs/config/mbr.h /^ std::uint32_t first_lba;$/;" m struct:MbrPartitionEntry typeref:typename:std::uint32_t
+first_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t first_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptPartitionEntry typeref:typename:std::uint64_t file:
+first_read_command_ host/commands/modem_simulator/channel_monitor.h /^ bool first_read_command_; \/\/ Only used when ClientType::REMOTE$/;" m class:cuttlefish::Client typeref:typename:bool
+first_signal_strength_request_ host/commands/modem_simulator/network_service.h /^ bool first_signal_strength_request_; \/\/ For time update$/;" m class:cuttlefish::NetworkService typeref:typename:bool
+first_usable_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t first_usable_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint64_t file:
+flagXml common/libs/utils/flag_parser_test.cpp /^std::optional<std::map<std::string, std::string>> flagXml(const Flag& f) {$/;" f namespace:cuttlefish typeref:typename:std::optional<std::map<std::string,std::string>>
+flag_ host/libs/config/config_flag.cpp /^ Flag flag_;$/;" m class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:Flag file:
+flag_ host/libs/config/config_flag.cpp /^ Flag flag_;$/;" m class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:Flag file:
+flags common/libs/utils/network.cpp /^ __be16 flags;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:__be16 file:
+flags_ host/commands/start/flag_forwarder.h /^ std::set<std::unique_ptr<SubprocessFlag>> flags_;$/;" m class:FlagForwarder typeref:typename:std::set<std::unique_ptr<SubprocessFlag>>
+flags_ host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ uint32_t flags_;$/;" m class:cuttlefish::WmediumdMessageSetControl typeref:typename:uint32_t
+flush guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<Status> VsockCameraDeviceSession::flush() {$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<Status>
+flushing_requests_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::atomic<bool> flushing_requests_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::atomic<bool>
+footer host/libs/image_aggregator/image_aggregator.cc /^ GptHeader footer;$/;" m struct:cuttlefish::__anon02806fd80111::GptEnd typeref:typename:GptHeader file:
+footer_padding host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t footer_padding[SECTOR_SIZE - sizeof(GptHeader)];$/;" m struct:cuttlefish::__anon02806fd80111::GptEnd typeref:typename:std::uint8_t[] file:
+foreground_launcher_pipe_ host/commands/run_cvd/boot_state_machine.cc /^ SharedFD foreground_launcher_pipe_;$/;" m class:cuttlefish::__anone7ed366f0111::ProcessLeader typeref:typename:SharedFD file:
+format host/commands/kernel_log_monitor/kernel_log_server.cc /^ EventFormat format; \/\/ how the log message is formatted$/;" m struct:__anonfa7764770111::__anonfa7764770308 typeref:typename:EventFormat file:
+format host/libs/audio_connector/commands.h /^ uint8_t format() const { return format_; }$/;" f struct:cuttlefish::StreamSetParamsCommand typeref:typename:uint8_t
+format host/libs/audio_connector/shm_layout.h /^ uint8_t format;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:uint8_t
+format_ host/libs/audio_connector/commands.h /^ const uint8_t format_;$/;" m struct:cuttlefish::StreamSetParamsCommand typeref:typename:const uint8_t
+formats host/libs/audio_connector/shm_layout.h /^ Le64 formats; \/* 1 << VIRTIO_SND_PCM_FMT_XXX *\/$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:Le64
+formatted_message_buffer_ host/libs/confui/cbor.h /^ std::vector<std::uint8_t> formatted_message_buffer_;$/;" m class:cuttlefish::confui::Cbor typeref:typename:std::vector<std::uint8_t>
+forward guest/commands/bt_vhci_forwarder/main.cpp /^ssize_t forward(int from, int to, std::optional<unsigned char> filter_out,$/;" f typeref:typename:ssize_t
+forward guest/commands/bt_vhci_forwarder/main.cpp /^ssize_t forward(int from, int to, unsigned char* buf) {$/;" f typeref:typename:ssize_t
+forward host/frontend/webrtc_operator/assets/js/server_connector.js /^ async #forward(msg) {$/;" m class:PollingConnector
+forwardFromCCFCULine guest/hals/ril/reference-ril/reference-ril.c /^static int forwardFromCCFCULine(char *line, RIL_CallForwardInfo *p_forward) {$/;" f typeref:typename:int file:
+fps_ guest/hals/camera/vsock_camera_metadata.h /^ int32_t fps_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata typeref:typename:int32_t
+fragment host/libs/config/adb/test.cpp /^ AdbConfigFragment& fragment;$/;" m struct:cuttlefish::TestData typeref:typename:AdbConfigFragment & file:
+frame_ guest/hals/camera/vsock_frame_provider.h /^ std::vector<char> frame_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::vector<char>
+frame_buffer_ host/frontend/webrtc/lib/video_track_source_impl.cpp /^ frame_buffer_;$/;" m class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:std::shared_ptr<::cuttlefish::webrtc_streaming::VideoFrameBuffer> file:
+frame_mutex_ guest/hals/camera/vsock_frame_provider.h /^ std::mutex frame_mutex_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::mutex
+frame_mutex_ host/frontend/webrtc/lib/camera_streamer.h /^ std::mutex frame_mutex_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::mutex
+frame_number guest/hals/camera/vsock_camera_device_session_3_4.h /^ uint32_t frame_number;$/;" m struct:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::ReadVsockRequest typeref:typename:uint32_t
+frame_provider_ guest/hals/camera/vsock_camera_device_3_4.h /^ std::shared_ptr<cuttlefish::VsockFrameProvider> frame_provider_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:std::shared_ptr<cuttlefish::VsockFrameProvider>
+frame_provider_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::shared_ptr<cuttlefish::VsockFrameProvider> frame_provider_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::shared_ptr<cuttlefish::VsockFrameProvider>
+frames host/frontend/webrtc/audio_handler.cpp /^ int frames() const override { return frames_; }$/;" f class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+frames_ host/frontend/webrtc/audio_handler.cpp /^ int frames_;$/;" m class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+frames_server_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD frames_server_;$/;" m class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:SharedFD file:
+frames_socket_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::frames_socket_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+framesizeMatches guest/hals/camera/vsock_frame_provider.cpp /^bool VsockFrameProvider::framesizeMatches(uint32_t width, uint32_t height,$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+freeCardStatus guest/hals/ril/reference-ril/reference-ril.c /^static void freeCardStatus(RIL_CardStatus_v1_5 *p_card_status) {$/;" f typeref:typename:void file:
+freeCarrierRestrictions guest/hals/ril/reference-libril/ril_service.cpp /^void freeCarrierRestrictions(RIL_CarrierRestrictions &request) {$/;" f typeref:typename:void
+freeSetDataProfileData guest/hals/ril/reference-libril/ril_service.cpp /^void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,$/;" f typeref:typename:void
+fromCodeScheme guest/hals/ril/reference-libril/ril.h /^ int fromCodeScheme;$/;" m struct:__anon0bfbaecf4408 typeref:typename:int
+fromEmergencyDialer guest/hals/ril/reference-libril/ril.h /^ bool fromEmergencyDialer;$/;" m struct:__anon0bfbaecfb708 typeref:typename:bool
+fromServiceId guest/hals/ril/reference-libril/ril.h /^ int fromServiceId;$/;" m struct:__anon0bfbaecf4408 typeref:typename:int
+front guest/hals/ril/reference-libril/rilSocketQueue.h /^ T *front;$/;" m class:Ril_queue typeref:typename:T *
+full host/frontend/webrtc/audio_handler.cpp /^bool AudioHandler::HoldingBuffer::full() const {$/;" f class:cuttlefish::AudioHandler::HoldingBuffer typeref:typename:bool
+func guest/hals/ril/reference-libril/ril_event.h /^ ril_event_cb func;$/;" m struct:ril_event typeref:typename:ril_event_cb
+futures host/frontend/webrtc_operator/assets/js/server_connector.js /^ #futures = {};$/;" M class:WebsocketConnector
+gCameraServer guest/hals/camera/vsock_camera_provider_2_7.cpp /^VsockCameraServer gCameraServer;$/;" v namespace:android::hardware::camera::provider::V2_7::implementation::__anona6e38b1b0111 typeref:typename:VsockCameraServer
+gSimStatusResponse host/commands/modem_simulator/sim_service.cpp /^const std::map<SimService::SimStatus, std::string> gSimStatusResponse = {$/;" v namespace:cuttlefish typeref:typename:const std::map<SimService::SimStatus,std::string>
+g_importer guest/hals/camera/cached_stream_buffer.cpp /^HandleImporter g_importer;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anon1055ca380111 typeref:typename:HandleImporter
+garbageCollect guest/hals/health/storage/Storage.cpp /^Storage::garbageCollect(int64_t \/*timeout_seconds*\/,$/;" f class:aidl::android::hardware::health::storage::Storage typeref:typename:ndk::ScopedAStatus
+gatekeeper common/libs/security/gatekeeper_channel.h /^namespace gatekeeper {$/;" n
+gatekeeper guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^namespace gatekeeper {$/;" n file:
+gatekeeper guest/hals/gatekeeper/remote/remote_gatekeeper.h /^namespace gatekeeper {$/;" n
+gatekeeper host/commands/secure_env/soft_gatekeeper.h /^namespace gatekeeper {$/;" n
+gatekeeper_ host/commands/secure_env/gatekeeper_responder.h /^ gatekeeper::GateKeeper& gatekeeper_;$/;" m class:cuttlefish::GatekeeperResponder typeref:typename:gatekeeper::GateKeeper &
+gatekeeper_ host/commands/secure_env/tpm_keymaster_enforcement.h /^ TpmGatekeeper& gatekeeper_;$/;" m class:cuttlefish::TpmKeymasterEnforcement typeref:typename:TpmGatekeeper &
+gatekeeper_channel_ guest/hals/gatekeeper/remote/remote_gatekeeper.h /^ cuttlefish::GatekeeperChannel* gatekeeper_channel_;$/;" m class:gatekeeper::RemoteGateKeeperDevice typeref:typename:cuttlefish::GatekeeperChannel *
+gateway common/libs/device_config/device_config.proto /^ string gateway = 2;$/;" f message:cuttlefish.DeviceConfig.RILConfig typeref:typename:string
+gateway_ip common/libs/utils/network.cpp /^ std::uint8_t gateway_ip[4];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[4] file:
+gateways guest/hals/ril/reference-libril/ril.h /^ char * gateways; \/* A space-delimited list of default gateway addresses,$/;" m struct:__anon0bfbaecf1308 typeref:typename:char *
+gateways guest/hals/ril/reference-libril/ril.h /^ char * gateways; \/* A space-delimited list of default gateway addresses,$/;" m struct:__anon0bfbaecf1408 typeref:typename:char *
+gateways guest/hals/ril/reference-libril/ril.h /^ char * gateways; \/* A space-delimited list of default gateway addresses,$/;" m struct:__anon0bfbaecf1508 typeref:typename:char *
+gateways guest/hals/ril/reference-libril/ril.h /^ char * gateways; \/* A space-delimited list of default gateway addresses,$/;" m struct:__anon0bfbaecf1608 typeref:typename:char *
+gateways host/commands/modem_simulator/data_service.h /^ std::string gateways;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:std::string
+gce tools/create_base_image.go /^func gce(action OnFail, gceArg string, errorStr ...string) (string, error) {$/;" f package:main typeref:typename:(string, error)
+gcloud_ssh tools/upload_to_gce_and_run.py /^def gcloud_ssh(args):$/;" f
+gdb_port host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::gdb_port() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+generateCertificateRequest guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^ScopedAStatus RemoteRemotelyProvisionedComponent::generateCertificateRequest($/;" f class:aidl::android::hardware::security::keymint::RemoteRemotelyProvisionedComponent typeref:typename:ScopedAStatus
+generateEcdsaP256KeyPair guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^ScopedAStatus RemoteRemotelyProvisionedComponent::generateEcdsaP256KeyPair($/;" f class:aidl::android::hardware::security::keymint::RemoteRemotelyProvisionedComponent typeref:typename:ScopedAStatus
+generateKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::generateKey(const hidl_vec<KeyParameter>& keyParams,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+generateKey guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::generateKey($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+generateTimeStamp guest/hals/keymint/remote/remote_secure_clock.cpp /^ScopedAStatus RemoteSecureClock::generateTimeStamp(int64_t challenge,$/;" f class:aidl::android::hardware::security::secureclock::RemoteSecureClock typeref:typename:ScopedAStatus
+generateTombstoneOfLengthInKb tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private void generateTombstoneOfLengthInKb(int requestedLengthInKb) throws DeviceNotAvailabl/;" m class:TombstoneTransmitTest file:
+geran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_GeranBands geran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfab08::__anon0bfbaecfac0a typeref:typename:RIL_GeranBands[]
+geran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_GeranBands geran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfae08::__anon0bfbaecfaf0a typeref:typename:RIL_GeranBands[]
+get common/libs/fs/shared_fd.h /^ const void* get() const { return ptr_; }$/;" f class:cuttlefish::ScopedMMap typeref:typename:const void *
+get common/libs/fs/shared_fd.h /^ void* get() { return ptr_; }$/;" f class:cuttlefish::ScopedMMap typeref:typename:void *
+get guest/hals/camera/stream_buffer_cache.cpp /^std::shared_ptr<CachedStreamBuffer> StreamBufferCache::get(uint64_t buffer_id) {$/;" f class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:std::shared_ptr<CachedStreamBuffer>
+get host/commands/secure_env/tpm_resource_manager.cpp /^ESYS_TR TpmResourceManager::ObjectSlot::get() {$/;" f class:cuttlefish::TpmResourceManager::ObjectSlot typeref:typename:ESYS_TR
+get host/libs/audio_connector/buffers.h /^ const volatile uint8_t* get() const { return buffer_; }$/;" f class:cuttlefish::TxBuffer typeref:typename:const volatile uint8_t *
+get host/libs/audio_connector/buffers.h /^ volatile uint8_t* get() const { return buffer_; }$/;" f class:cuttlefish::RxBuffer typeref:typename:volatile uint8_t *
+getAidlPackage tests/hal/hal_implementation_test.cpp /^std::string getAidlPackage(const std::string& aidlType) {$/;" f typeref:typename:std::string
+getAllowedCarriers guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getAllowedCarriers(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getAllowedCarriersResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getAllowedCarriersResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getAllowedCarriers_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getAllowedCarriers_1_4(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getAllowedNetworkTypesBitmap guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getAllowedNetworkTypesBitmap(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getAllowedNetworkTypesBitmapResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getAllowedNetworkTypesBitmapResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getAvailableBandModes guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getAvailableBandModes(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getAvailableBandModesResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getAvailableBandModesResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getAvailableNetworks guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getAvailableNetworks(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getAvailableNetworksResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getAvailableNetworksResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getBarringInfo guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getBarringInfo(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getBarringInfoResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getBarringInfoResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getBasebandVersion guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getBasebandVersion(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getBasebandVersionResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getBasebandVersionResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getBitmapFromPreferred guest/hals/ril/reference-ril/reference-ril.c /^unsigned getBitmapFromPreferred(int value) {$/;" f typeref:typename:unsigned
+getBlobSize guest/hals/camera/vsock_camera_device_session_3_4.cpp /^unsigned int VsockCameraDeviceSession::getBlobSize($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:unsigned int
+getByte host/libs/confui/cbor.h /^ inline uint8_t getByte(const uint64_t& v, const uint8_t index) {$/;" f class:cuttlefish::confui::Cbor typeref:typename:uint8_t
+getCDMASubscription guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCDMASubscription(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCDMASubscriptionResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCDMASubscriptionResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCallForwardStatus guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCallForwardStatusResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCallForwardStatusResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCallWaiting guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCallWaiting(int32_t serial, int32_t serviceClass) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCallWaitingResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCallWaitingResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCameraCharacteristics guest/hals/camera/vsock_camera_device_3_4.cpp /^Return<void> VsockCameraDevice::getCameraCharacteristics($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:Return<void>
+getCameraDeviceInterface_V1_x guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::getCameraDeviceInterface_V1_x($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+getCameraDeviceInterface_V3_x guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::getCameraDeviceInterface_V3_x($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+getCameraIdList guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::getCameraIdList($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+getCapacity guest/hals/health/health.cpp /^Return<void> HealthImpl::getCapacity(getCapacity_cb _hidl_cb) {$/;" f class:android::hardware::health::V2_1::implementation::HealthImpl typeref:typename:Return<void>
+getCaptureRequestMetadataQueue guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::getCaptureRequestMetadataQueue($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+getCaptureResultMetadataQueue guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::getCaptureResultMetadataQueue($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+getCardStatus guest/hals/ril/reference-ril/reference-ril.c /^static int getCardStatus(RIL_CardStatus_v1_5 **pp_card_status) {$/;" f typeref:typename:int file:
+getCdmaBroadcastConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCdmaBroadcastConfig(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCdmaBroadcastConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCdmaBroadcastConfigResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCdmaRoamingPreference guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCdmaRoamingPreference(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCdmaRoamingPreferenceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCdmaRoamingPreferenceResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCdmaSubscriptionSource guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCdmaSubscriptionSource(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCdmaSubscriptionSourceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCdmaSubscriptionSourceResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCellInfoList guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCellInfoList(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCellInfoListResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCellInfoListResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCellInfoList_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCellInfoList_1_6(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCellInfoTypeRadioTechnology guest/hals/ril/reference-libril/ril_service.cpp /^RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {$/;" f typeref:typename:RIL_CellInfoType
+getChargeCounter guest/hals/health/health.cpp /^Return<void> HealthImpl::getChargeCounter(getChargeCounter_cb _hidl_cb) {$/;" f class:android::hardware::health::V2_1::implementation::HealthImpl typeref:typename:Return<void>
+getChargeStatus guest/hals/health/health.cpp /^Return<void> HealthImpl::getChargeStatus(getChargeStatus_cb _hidl_cb) {$/;" f class:android::hardware::health::V2_1::implementation::HealthImpl typeref:typename:Return<void>
+getClip guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getClip(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getClipResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getClipResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getClir guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getClir(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getClirResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getClirResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getConcurrentStreamingCameraIds guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::getConcurrentStreamingCameraIds($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+getConfig host/frontend/webrtc_operator/assets/js/server_connector.js /^ async #getConfig() {$/;" m class:PollingConnector
+getConfigSlotStatus guest/hals/ril/reference-ril/reference-ril.c /^void getConfigSlotStatus(RIL_SimSlotStatus_V1_2 *pSimSlotStatus) {$/;" f typeref:typename:void
+getConnected guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ public GceFuture<Boolean> getConnected() {$/;" m class:ConnectivityChecker
+getCurrentCalls guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCurrentCalls(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCurrentCallsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getCurrentCallsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getCurrentCalls_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getCurrentCalls_1_6(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getCurrentNow guest/hals/health/health.cpp /^Return<void> HealthImpl::getCurrentNow(getCurrentNow_cb _hidl_cb) {$/;" f class:android::hardware::health::V2_1::implementation::HealthImpl typeref:typename:Return<void>
+getCustomDeviceStateButtonCb host/frontend/webrtc_operator/assets/js/app.js /^ #getCustomDeviceStateButtonCb(device_states) {$/;" m class:DeviceControlApp
+getDataCallList guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getDataCallList(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getDataCallListResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getDataCallListResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getDataCallList_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getDataCallList_1_6(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getDataRegistrationState guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getDataRegistrationState(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getDataRegistrationStateResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getDataRegistrationStateResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getDataRegistrationState_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getDataRegistrationState_1_5(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getDataRegistrationState_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getDataRegistrationState_1_6(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getDeviceIdentity guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getDeviceIdentity(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getDeviceIdentityResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getDeviceIdentityResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getEnabled guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^ public GceFuture<Boolean> getEnabled() {$/;" m class:BluetoothChecker
+getFacilityLockForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getFacilityLockForApp(int32_t serial, const hidl_string& facility,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getFacilityLockForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getFacilityLockForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getGsmBroadcastConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getGsmBroadcastConfig(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getGsmBroadcastConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getGsmBroadcastConfigResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getHalDeviceCapabilities guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::getHalDeviceCapabilities(int32_t serial) {$/;" f class:RadioConfigImpl typeref:typename:Return<void>
+getHalDeviceCapabilitiesResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::getHalDeviceCapabilitiesResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getHardwareConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getHardwareConfig(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getHardwareConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getHardwareConfigResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getHardwareInfo guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::getHardwareInfo(getHardwareInfo_cb _hidl_cb) {$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+getHardwareInfo guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::getHardwareInfo(KeyMintHardwareInfo* info) {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+getHardwareInfo guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^ScopedAStatus RemoteRemotelyProvisionedComponent::getHardwareInfo($/;" f class:aidl::android::hardware::security::keymint::RemoteRemotelyProvisionedComponent typeref:typename:ScopedAStatus
+getHasDied guest/hals/bt/remote/remote_bluetooth.cpp /^ bool getHasDied() const { return has_died_; }$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothDeathRecipient typeref:typename:bool file:
+getHmacSharingParameters guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::getHmacSharingParameters($/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+getIMSIForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getIMSIForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getIccCardStatus guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getIccCardStatus(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getIccCardStatusResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getIccCardStatusResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getIccId guest/hals/ril/reference-ril/reference-ril.c /^static void getIccId(char *iccid, int size) {$/;" f typeref:typename:void file:
+getImsRegistrationState guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getImsRegistrationState(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getImsRegistrationStateResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getImsRegistrationStateResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getImsiForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getImsiForApp(int32_t serial, const hidl_string& aid) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getKeyCharacteristics guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::getKeyCharacteristics(const hidl_vec<uint8_t>& keyBlob,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+getKeyCharacteristics guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::getKeyCharacteristics($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+getLastCallFailCause guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getLastCallFailCause(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getLastCallFailCauseResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getLastCallFailCauseResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getMessageList guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public List<String> getMessageList() {$/;" m class:EventReporter
+getModemActivityInfo guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getModemActivityInfo(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getModemActivityInfoResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getModemActivityInfoResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getModemStackStatus guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getModemStackStatus(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getModemStackStatusResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getModemStackStatusResponse(int slotId, int responseType, int serial, RIL_Errno e/;" f class:radio_1_6 typeref:typename:int
+getModemTechFromPrefer host/commands/modem_simulator/network_service.cpp /^int NetworkService::getModemTechFromPrefer(int preferred_mask) {$/;" f class:cuttlefish::NetworkService typeref:typename:int
+getModemsConfig guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::getModemsConfig(int32_t serial) {$/;" f class:RadioConfigImpl typeref:typename:Return<void>
+getModemsConfigResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::getModemsConfigResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getMute guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getMute(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getMuteResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getMuteResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getName guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public String getName() {$/;" m class:GceFuture
+getNeighboringCids guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getNeighboringCids(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getNeighboringCidsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getNeighboringCidsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getNetworkSelectionMode guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getNetworkSelectionMode(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getNetworkSelectionModeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getNetworkSelectionModeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getNetworkTypeFromTech host/commands/modem_simulator/network_service.cpp /^NetworkService::getNetworkTypeFromTech(ModemTechnology modemTech) {$/;" f class:cuttlefish::NetworkService typeref:typename:NetworkService::NetworkRegistrationStatus::AccessTechnoloy
+getNow guest/hals/ril/reference-libril/ril_event.cpp /^static void getNow(struct timeval * tv)$/;" f typeref:typename:void file:
+getOperator guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getOperator(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getOperatorResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getOperatorResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getPDP guest/hals/ril/reference-ril/reference-ril.c /^static int getPDP() {$/;" f typeref:typename:int file:
+getPhoneCapability guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::getPhoneCapability(int32_t serial) {$/;" f class:RadioConfigImpl typeref:typename:Return<void>
+getPhoneCapabilityResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::getPhoneCapabilityResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getPreferredFps guest/hals/camera/vsock_camera_metadata.h /^ int32_t getPreferredFps() const { return fps_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata typeref:typename:int32_t
+getPreferredFromBitmap guest/hals/ril/reference-ril/reference-ril.c /^int getPreferredFromBitmap(int value, int *index) {$/;" f typeref:typename:int
+getPreferredHeight guest/hals/camera/vsock_camera_metadata.h /^ int32_t getPreferredHeight() const { return height_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata typeref:typename:int32_t
+getPreferredNetworkType guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getPreferredNetworkType(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getPreferredNetworkTypeBitmap guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getPreferredNetworkTypeBitmap(int32_t serial ) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getPreferredNetworkTypeBitmapResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getPreferredNetworkTypeBitmapResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getPreferredNetworkTypeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getPreferredNetworkTypeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getPreferredVoicePrivacy guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getPreferredVoicePrivacy(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getPreferredVoicePrivacyResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getPreferredVoicePrivacyResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getPreferredWidth guest/hals/camera/vsock_camera_metadata.h /^ int32_t getPreferredWidth() const { return width_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata typeref:typename:int32_t
+getProtocolString guest/hals/ril/reference-libril/ril_service.cpp /^const char * getProtocolString(const ::android::hardware::radio::V1_4::PdpProtocolType protocolV/;" f typeref:typename:const char *
+getRUIMStatus guest/hals/ril/reference-ril/reference-ril.c /^getRUIMStatus()$/;" f typeref:typename:SIM_Status file:
+getRadioCapability guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getRadioCapability(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getRadioCapabilityResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getRadioCapabilityResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getRadioInterfaceName guest/hals/ril/reference-ril/reference-ril.c /^static const char* getRadioInterfaceName()$/;" f typeref:typename:const char * file:
+getRadioServiceRwlock guest/hals/ril/reference-libril/ril_service.cpp /^pthread_rwlock_t * radio_1_6::getRadioServiceRwlock(int slotId) {$/;" f class:radio_1_6 typeref:typename:pthread_rwlock_t *
+getRequestFromQueue guest/hals/camera/vsock_camera_device_session_3_4.cpp /^bool VsockCameraDeviceSession::getRequestFromQueue(ReadVsockRequest& req,$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:bool
+getRequestSettingsFmq guest/hals/camera/vsock_camera_device_session_3_4.cpp /^bool VsockCameraDeviceSession::getRequestSettingsFmq($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:bool
+getResourceCost guest/hals/camera/vsock_camera_device_3_4.cpp /^Return<void> VsockCameraDevice::getResourceCost($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:Return<void>
+getRotation guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private int getRotation() {$/;" m class:GceService file:
+getSIMStatus guest/hals/ril/reference-ril/reference-ril.c /^getSIMStatus()$/;" f typeref:typename:SIM_Status file:
+getSapImpl guest/hals/ril/reference-libril/sap_service.cpp /^sp<SapImpl> getSapImpl(RilSapSocket *sapSocket) {$/;" f typeref:typename:sp<SapImpl>
+getScreenBounds guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private Point getScreenBounds() {$/;" m class:GceService file:
+getSecurityLevel guest/hals/keymint/remote/service.cpp /^SecurityLevel getSecurityLevel(::keymaster::RemoteKeymaster& remote_keymaster) {$/;" f namespace:__anon5714be600111 typeref:typename:SecurityLevel
+getSensorHandle guest/commands/sensor_injection/main.cpp /^int getSensorHandle(SensorType type, const sp<ISensors> sensors) {$/;" f typeref:typename:int
+getSharedSecretParameters guest/hals/keymint/remote/remote_shared_secret.cpp /^ScopedAStatus RemoteSharedSecret::getSharedSecretParameters($/;" f class:aidl::android::hardware::security::sharedsecret::RemoteSharedSecret typeref:typename:ScopedAStatus
+getSignalStrength guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSignalStrength(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSignalStrengthResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getSignalStrengthResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getSignalStrength_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSignalStrength_1_4(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSignalStrength_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSignalStrength_1_6(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSimPhonebookCapacity guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSimPhonebookCapacity(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSimPhonebookCapacityResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getSimPhonebookCapacityResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getSimPhonebookRecords guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSimPhonebookRecords(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSimPhonebookRecordsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getSimPhonebookRecordsResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getSimSlotsStatus guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::getSimSlotsStatus(int32_t serial) {$/;" f class:RadioConfigImpl typeref:typename:Return<void>
+getSimSlotsStatusResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::getSimSlotsStatusResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getSimlockRemainTimes guest/hals/ril/reference-ril/reference-ril.c /^static int getSimlockRemainTimes(const char* type) {$/;" f typeref:typename:int file:
+getSlicingConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSlicingConfig(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSlicingConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getSlicingConfigResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getSmscAddress guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSmscAddress(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSmscAddressResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getSmscAddressResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getSocketById guest/hals/ril/reference-libril/RilSapSocket.cpp /^RilSapSocket *RilSapSocket::getSocketById(RIL_SOCKET_ID socketId) {$/;" f class:RilSapSocket typeref:typename:RilSapSocket *
+getSocketId guest/hals/ril/reference-libril/RilSocket.h /^ RIL_SOCKET_ID getSocketId(void) {$/;" f class:RilSocket typeref:typename:RIL_SOCKET_ID
+getStream host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ getStream(stream_id) {$/;" m class:DeviceConnection
+getSystemSelectionChannels guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getSystemSelectionChannels(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getSystemSelectionChannelsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getSystemSelectionChannelsResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+getTTYMode guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getTTYMode(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getTTYModeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getTTYModeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getTechFromNetworkType host/commands/modem_simulator/network_service.cpp /^NetworkService::ModemTechnology NetworkService::getTechFromNetworkType($/;" f class:cuttlefish::NetworkService typeref:typename:NetworkService::ModemTechnology
+getTimeNanosFromLine host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::string getTimeNanosFromLine(const std::string& line) {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:std::string file:
+getTimestampString host/frontend/webrtc_operator/assets/js/app.js /^ #getTimestampString() {$/;" m class:DeviceControlApp
+getTombstonesViaAdb tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ private List<File> getTombstonesViaAdb() throws DeviceNotAvailableException {$/;" m class:TombstoneTransmitTest file:
+getTransformRotation host/frontend/webrtc_operator/assets/js/app.js /^ #getTransformRotation(element) {$/;" m class:DeviceControlApp
+getU32LE host/frontend/webrtc_operator/assets/js/adb.js /^function getU32LE(array, offset) {$/;" f
+getVendorTags guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::getVendorTags($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+getVersion guest/hals/ril/reference-libril/ril.h /^ RIL_GetVersion getVersion;$/;" m struct:__anon0bfbaecfbf08 typeref:typename:RIL_GetVersion
+getVersion guest/hals/ril/reference-ril/reference-ril.c /^static const char * getVersion(void)$/;" f typeref:typename:const char * file:
+getVoiceRadioTechnology guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getVoiceRadioTechnology(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getVoiceRadioTechnologyResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getVoiceRadioTechnologyResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getVoiceRegistrationState guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getVoiceRegistrationState(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getVoiceRegistrationStateResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::getVoiceRegistrationStateResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+getVoiceRegistrationState_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getVoiceRegistrationState_1_5(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getVoiceRegistrationState_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::getVoiceRegistrationState_1_6(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+getWifiReady guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public GceFuture<Boolean> getWifiReady() {$/;" m class:GceWifiManager.MonitorWifiJob
+getWifiReady guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public GceFuture<Boolean> getWifiReady() {$/;" m class:GceWifiManager
+getZeroPaddedString host/frontend/webrtc_operator/assets/js/app.js /^ #getZeroPaddedString(value, desiredLength) {$/;" m class:DeviceControlApp
+get_current_time_ms host/commands/secure_env/tpm_keymaster_enforcement.cpp /^uint64_t TpmKeymasterEnforcement::get_current_time_ms() const {$/;" f class:cuttlefish::TpmKeymasterEnforcement typeref:typename:uint64_t
+get_cvd_files host/libs/config/fetcher_config.cpp /^std::map<std::string, CvdFile> FetcherConfig::get_cvd_files() const {$/;" f class:cuttlefish::FetcherConfig typeref:typename:std::map<std::string,CvdFile>
+get_next_tombstone_path_blocking guest/monitoring/tombstone_transmit/tombstone_transmit.cpp /^static std::string get_next_tombstone_path_blocking(int fd) {$/;" f typeref:typename:std::string file:
+get_wall_clock_time_ms host/commands/secure_env/tpm_keymaster_enforcement.cpp /^uint64_t get_wall_clock_time_ms() {$/;" f namespace:cuttlefish::__anon0281e17c0211 typeref:typename:uint64_t
+getter_ common/libs/utils/flag_parser.h /^ std::optional<std::function<std::string()>> getter_;$/;" m class:cuttlefish::Flag typeref:typename:std::optional<std::function<std::string ()>>
+gles2_extensions host/libs/graphics_detector/graphics_detector.h /^ std::string gles2_extensions;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+gles2_renderer host/libs/graphics_detector/graphics_detector.h /^ std::string gles2_renderer;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+gles2_vendor host/libs/graphics_detector/graphics_detector.h /^ std::string gles2_vendor;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+gles2_version host/libs/graphics_detector/graphics_detector.h /^ std::string gles2_version;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:std::string
+global_id_ host/libs/allocd/resource.h /^ uint32_t global_id_{};$/;" m class:cuttlefish::StaticResource typeref:typename:uint32_t
+global_instance host/commands/secure_env/in_process_tpm.cpp /^ static Impl* global_instance;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:Impl * file:
+global_instance host/commands/secure_env/in_process_tpm.cpp /^InProcessTpm::Impl* InProcessTpm::Impl::global_instance;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:InProcessTpm::Impl *
+global_mutex host/commands/secure_env/in_process_tpm.cpp /^ static std::mutex global_mutex;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:std::mutex file:
+global_mutex host/commands/secure_env/in_process_tpm.cpp /^std::mutex InProcessTpm::Impl::global_mutex;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:std::mutex
+global_resource_id_ host/libs/allocd/resource_manager.h /^ std::atomic_uint32_t global_resource_id_ = 0;$/;" m struct:cuttlefish::ResourceManager typeref:typename:std::atomic_uint32_t
+gnss_file_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::gnss_file_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+gnss_grpc_proxy host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^package gnss_grpc_proxy;$/;" p
+gnss_grpc_proxy_in_wr_ host/commands/run_cvd/launch.cc /^ SharedFD gnss_grpc_proxy_in_wr_;$/;" m class:cuttlefish::GnssGrpcProxyServer typeref:typename:SharedFD file:
+gnss_grpc_proxy_out_rd_ host/commands/run_cvd/launch.cc /^ SharedFD gnss_grpc_proxy_out_rd_;$/;" m class:cuttlefish::GnssGrpcProxyServer typeref:typename:SharedFD file:
+gnss_grpc_proxy_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::gnss_grpc_proxy_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+gnss_in_ host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ cuttlefish::SharedFD gnss_in_;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:cuttlefish::SharedFD file:
+gnss_in_pipe_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::gnss_in_pipe_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+gnss_out_ host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ cuttlefish::SharedFD gnss_out_;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:cuttlefish::SharedFD file:
+gnss_out_pipe_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::gnss_out_pipe_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+gnss_pipe_prefix host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::gnss_pipe_prefix() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+gpu_capture_binary host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::gpu_capture_binary() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+gpu_mode host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::gpu_mode() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+grabPartialWakeLock guest/hals/ril/reference-libril/ril.cpp /^grabPartialWakeLock() {$/;" f namespace:android typeref:typename:void file:
+grp common/libs/utils/users.cpp /^ struct group grp{};$/;" s function:cuttlefish::__anonced26a190111::GroupIdFromName file:
+grp_p common/libs/utils/users.cpp /^ struct group* grp_p{};$/;" s function:cuttlefish::__anonced26a190111::GroupIdFromName file:
+grpc host/commands/gnss_grpc_proxy/grpcpp.h /^namespace grpc {$/;" n
+gsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoGsm gsm;$/;" m union:__anon0bfbaecf6e08::__anon0bfbaecf6f0a typeref:typename:RIL_CellInfoGsm
+gsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoGsm_v12 gsm;$/;" m union:__anon0bfbaecf7008::__anon0bfbaecf710a typeref:typename:RIL_CellInfoGsm_v12
+gsm guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoGsm_v12 gsm;$/;" m union:__anon0bfbaecf7208::__anon0bfbaecf730a typeref:typename:RIL_CellInfoGsm_v12
+gsmMessage guest/hals/ril/reference-libril/ril.h /^ char** gsmMessage; \/* This is an array of pointers where pointers$/;" m union:__anon0bfbaecf1808::__anon0bfbaecf190a typeref:typename:char **
+gsm_ber host/commands/modem_simulator/network_service.h /^ int gsm_ber; \/* bit error rate (0-7, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+gsm_rssi host/commands/modem_simulator/network_service.h /^ int gsm_rssi; \/* Valid values are (0-31, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+gsm_umts_subscription_app_index guest/hals/ril/reference-libril/ril.h /^ int gsm_umts_subscription_app_index; \/* value < RIL_CARD_MAX_APPS, -1 if none *\/$/;" m struct:__anon0bfbaecf3908 typeref:typename:int
+gsm_umts_subscription_app_index guest/hals/ril/reference-libril/ril.h /^ int gsm_umts_subscription_app_index; \/* value < RIL_CARD_MAX_APPS, -1 if none *\/$/;" m struct:__anon0bfbaecf3a08 typeref:typename:int
+guest_audit_security host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::guest_audit_security() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+guest_enforce_security host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::guest_enforce_security() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+guest_hal_socket_ host/libs/confui/host_server.h /^ SharedFD guest_hal_socket_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:SharedFD
+h host/libs/confui/host_renderer.h /^ std::uint32_t x, y, w, h; \/\/ (x, y) is the top left$/;" m struct:cuttlefish::confui::ConfUiRenderer::Boundary typeref:typename:std::uint32_t
+h host/libs/wayland/wayland_surface.h /^ int32_t h;$/;" m struct:wayland::Surface::Region typeref:typename:int32_t
+h4_ guest/hals/bt/remote/remote_bluetooth.h /^ test_vendor_lib::H4Packetizer h4_{fd_,$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:test_vendor_lib::H4Packetizer
+h_ host/libs/confui/host_renderer.h /^ int h_;$/;" m class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:int
+hal_cli_socket_ host/libs/confui/host_server.h /^ SharedFD hal_cli_socket_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:SharedFD
+hal_cmd_q_id_ host/libs/confui/host_server.h /^ int hal_cmd_q_id_; \/\/ Q id in input_multiplexer_$/;" m class:cuttlefish::confui::HostServer typeref:typename:int
+hal_input_fetcher_thread_ host/libs/confui/host_server.h /^ std::thread hal_input_fetcher_thread_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:std::thread
+hal_vsock_port_ host/libs/confui/host_server.h /^ int hal_vsock_port_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:int
+handle guest/hals/camera/cached_stream_buffer.h /^ native_handle_t* handle() const { return handle_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::ReleaseFence typeref:typename:native_handle_t *
+handleConnectionRequest host/frontend/webrtc_operator/client_handler.cpp /^void ClientWSHandler::handleConnectionRequest(const Json::Value& message) {$/;" f class:cuttlefish::ClientWSHandler typeref:typename:void
+handleFinalResponse guest/hals/ril/reference-ril/atchannel.c /^static void handleFinalResponse(const char *line)$/;" f typeref:typename:void file:
+handleForward host/frontend/webrtc_operator/client_handler.cpp /^void ClientWSHandler::handleForward(const Json::Value& message) {$/;" f class:cuttlefish::ClientWSHandler typeref:typename:void
+handleMessage host/frontend/webrtc/adb_handler.cpp /^void AdbHandler::handleMessage(const uint8_t *msg, size_t len) {$/;" f class:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:void
+handleMessage host/frontend/webrtc/bluetooth_handler.cpp /^void BluetoothHandler::handleMessage(const uint8_t *msg, size_t len) {$/;" f class:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:void
+handleMessage host/frontend/webrtc_operator/client_handler.cpp /^void ClientWSHandler::handleMessage(const std::string& type,$/;" f class:cuttlefish::ClientWSHandler typeref:typename:void
+handleMessage host/frontend/webrtc_operator/device_handler.cpp /^void DeviceHandler::handleMessage(const std::string& type,$/;" f class:cuttlefish::DeviceHandler typeref:typename:void
+handleStkCallSetupRequestFromSim guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+handleStkCallSetupRequestFromSimResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::handleStkCallSetupRequestFromSimResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+handleUnsolicited guest/hals/ril/reference-ril/atchannel.c /^static void handleUnsolicited(const char *line)$/;" f typeref:typename:void file:
+handle_ guest/hals/camera/cached_stream_buffer.h /^ native_handle_t* handle_;$/;" m class:android::hardware::camera::device::V3_4::implementation::ReleaseFence typeref:typename:native_handle_t *
+handler_factories_ host/libs/websocket/websocket_server.h /^ handler_factories_ = {};$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::unordered_map<std::string,std::unique_ptr<WebSocketHandlerFactory>>
+handlers_ host/frontend/webrtc_operator/client_handler.h /^ handlers_;$/;" m class:cuttlefish::PollConnectionStore typeref:typename:std::map<std::string,std::shared_ptr<PollConnectionHandler>>
+handlers_ host/libs/websocket/websocket_server.h /^ std::unordered_map<struct lws*, std::shared_ptr<WebSocketHandler>> handlers_ =$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::unordered_map<struct lws *,std::shared_ptr<WebSocketHandler>>
+hangup guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::hangup(int32_t serial, int32_t gsmIndex) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+hangupConnectionResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::hangupConnectionResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+hangupForegroundResumeBackground guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::hangupForegroundResumeBackground(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+hangupForegroundResumeBackgroundResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial/;" f class:radio_1_6 typeref:typename:int
+hangupWaitingOrBackground guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::hangupWaitingOrBackground(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+hangupWaitingOrBackgroundResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::hangupWaitingOrBackgroundResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+hardware guest/hals/bt/remote/remote_bluetooth.cpp /^namespace hardware {$/;" n namespace:android file:
+hardware guest/hals/bt/remote/remote_bluetooth.h /^namespace hardware {$/;" n namespace:android
+hardware guest/hals/camera/cached_stream_buffer.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/cached_stream_buffer.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android
+hardware guest/hals/camera/stream_buffer_cache.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/stream_buffer_cache.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android
+hardware guest/hals/camera/vsock_camera_device_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/vsock_camera_device_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android
+hardware guest/hals/camera/vsock_camera_device_session_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/vsock_camera_device_session_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android
+hardware guest/hals/camera/vsock_camera_metadata.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/vsock_camera_metadata.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android
+hardware guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/vsock_camera_provider_2_7.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android
+hardware guest/hals/camera/vsock_camera_server.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android file:
+hardware guest/hals/camera/vsock_camera_server.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android
+hardware guest/hals/confirmationui/TrustyConfirmationUI.cpp /^namespace hardware {$/;" n namespace:android file:
+hardware guest/hals/confirmationui/TrustyConfirmationUI.h /^namespace hardware {$/;" n namespace:android
+hardware guest/hals/confirmationui/guest_session.cpp /^namespace hardware {$/;" n namespace:android file:
+hardware guest/hals/confirmationui/guest_session.h /^namespace hardware {$/;" n namespace:android
+hardware guest/hals/confirmationui/include/TrustyConfirmationuiHal.h /^namespace hardware {$/;" n namespace:android
+hardware guest/hals/health/health.cpp /^namespace hardware {$/;" n namespace:android file:
+hardware guest/hals/health/storage/Storage.cpp /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl::android file:
+hardware guest/hals/health/storage/Storage.h /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl::android
+hardware guest/hals/keymint/remote/remote_keymint_device.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android file:
+hardware guest/hals/keymint/remote/remote_keymint_device.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android
+hardware guest/hals/keymint/remote/remote_keymint_operation.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android file:
+hardware guest/hals/keymint/remote/remote_keymint_operation.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android
+hardware guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android file:
+hardware guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android
+hardware guest/hals/keymint/remote/remote_secure_clock.cpp /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl::android file:
+hardware guest/hals/keymint/remote/remote_secure_clock.h /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl::android
+hardware guest/hals/keymint/remote/remote_shared_secret.cpp /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl::android file:
+hardware guest/hals/keymint/remote/remote_shared_secret.h /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl::android
+hardwareConfigChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::hardwareConfigChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+hardware_ host/frontend/webrtc/lib/streamer.cpp /^ std::map<std::string, std::string> hardware_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::map<std::string,std::string> file:
+hasRegistration tests/hal/hal_implementation_test.cpp /^ bool hasRegistration;$/;" m struct:AidlPackageCheck typeref:typename:bool file:
+has_broute_ipv4 host/libs/allocd/alloc_utils.h /^ bool has_broute_ipv4 = false;$/;" m struct:cuttlefish::EthernetNetworkConfig typeref:typename:bool
+has_broute_ipv6 host/libs/allocd/alloc_utils.h /^ bool has_broute_ipv6 = false;$/;" m struct:cuttlefish::EthernetNetworkConfig typeref:typename:bool
+has_data host/libs/confui/sign_utils.h /^ struct has_data {$/;" s class:cuttlefish::confui::support::ByteBufferProxy
+has_died_ guest/hals/bt/remote/remote_bluetooth.cpp /^ bool has_died_;$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothDeathRecipient typeref:typename:bool file:
+has_discrete_gpu host/libs/graphics_detector/graphics_detector.h /^ bool has_discrete_gpu = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+has_dnsmasq host/libs/allocd/alloc_utils.h /^ bool has_dnsmasq = false;$/;" m struct:cuttlefish::GatewayConfig typeref:typename:bool
+has_egl host/libs/graphics_detector/graphics_detector.h /^ bool has_egl = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+has_gateway host/libs/allocd/alloc_utils.h /^ bool has_gateway = false;$/;" m struct:cuttlefish::GatewayConfig typeref:typename:bool
+has_gl host/libs/graphics_detector/graphics_detector.h /^ bool has_gl = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+has_gles1 host/libs/graphics_detector/graphics_detector.h /^ bool has_gles1 = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+has_gles2 host/libs/graphics_detector/graphics_detector.h /^ bool has_gles2 = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+has_iptable host/libs/allocd/alloc_utils.h /^ bool has_iptable = false;$/;" m struct:cuttlefish::GatewayConfig typeref:typename:bool
+has_ipv4_ host/libs/allocd/resource.h /^ bool has_ipv4_ = true;$/;" m class:cuttlefish::EthernetIface typeref:typename:bool
+has_ipv6_ host/libs/allocd/resource.h /^ bool has_ipv6_ = true;$/;" m class:cuttlefish::EthernetIface typeref:typename:bool
+has_tap host/libs/allocd/alloc_utils.h /^ bool has_tap = false;$/;" m struct:cuttlefish::EthernetNetworkConfig typeref:typename:bool
+has_vulkan host/libs/graphics_detector/graphics_detector.h /^ bool has_vulkan = false;$/;" m struct:cuttlefish::GraphicsAvailability typeref:typename:bool
+have_saved_params_ host/commands/secure_env/tpm_keymaster_enforcement.h /^ bool have_saved_params_ = false;$/;" m class:cuttlefish::TpmKeymasterEnforcement typeref:typename:bool
+hda_fn_nid host/libs/audio_connector/shm_layout.h /^ Le32 hda_fn_nid;$/;" m struct:cuttlefish::virtio_snd_info typeref:typename:Le32
+hda_reg_caps host/libs/audio_connector/shm_layout.h /^ Le32 hda_reg_caps;$/;" m struct:cuttlefish::virtio_snd_jack_info typeref:typename:Le32
+hda_reg_defconf host/libs/audio_connector/shm_layout.h /^ Le32 hda_reg_defconf;$/;" m struct:cuttlefish::virtio_snd_jack_info typeref:typename:Le32
+hdr host/libs/audio_connector/shm_layout.h /^ struct virtio_snd_hdr hdr;$/;" m struct:cuttlefish::virtio_snd_pcm_hdr typeref:struct:virtio_snd_hdr
+hdr host/libs/audio_connector/shm_layout.h /^ struct virtio_snd_hdr hdr;$/;" m struct:cuttlefish::virtio_snd_query_info typeref:struct:virtio_snd_hdr
+hdr host/libs/audio_connector/shm_layout.h /^ struct virtio_snd_info hdr;$/;" m struct:cuttlefish::virtio_snd_chmap_info typeref:struct:virtio_snd_info
+hdr host/libs/audio_connector/shm_layout.h /^ struct virtio_snd_info hdr;$/;" m struct:cuttlefish::virtio_snd_jack_info typeref:struct:virtio_snd_info
+hdr host/libs/audio_connector/shm_layout.h /^ struct virtio_snd_info hdr;$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:struct:virtio_snd_info
+hdr host/libs/audio_connector/shm_layout.h /^ struct virtio_snd_pcm_hdr hdr;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:struct:virtio_snd_pcm_hdr
+head guest/hals/ril/reference-libril/RilSapSocket.cpp /^static RilSapSocket::RilSapSocketList *head = NULL;$/;" v typeref:typename:RilSapSocket::RilSapSocketList * file:
+header common/libs/net/netlink_request_test.cpp /^ nlmsghdr* header = static_cast<nlmsghdr*>(arg.RequestData());$/;" v namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:nlmsghdr *
+header host/frontend/webrtc_operator/assets/client.html /^ <div id='header'>$/;" I
+header host/libs/image_aggregator/image_aggregator.cc /^ GptHeader header;$/;" m struct:cuttlefish::__anon02806fd80111::GptBeginning typeref:typename:GptHeader file:
+header_ common/libs/net/netlink_request.h /^ nlmsghdr* header_;$/;" m class:cuttlefish::NetlinkRequest typeref:typename:nlmsghdr *
+header_ host/libs/audio_connector/buffers.h /^ const virtio_snd_pcm_xfer header_;$/;" m class:cuttlefish::ShmBuffer typeref:typename:const virtio_snd_pcm_xfer
+header_crc32 host/libs/image_aggregator/image_aggregator.cc /^ std::uint32_t header_crc32;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint32_t file:
+header_padding host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t header_padding[SECTOR_SIZE - sizeof(GptHeader)];$/;" m struct:cuttlefish::__anon02806fd80111::GptBeginning typeref:typename:std::uint8_t[] file:
+header_size host/libs/image_aggregator/image_aggregator.cc /^ std::uint32_t header_size;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint32_t file:
+headers_ host/frontend/webrtc/lib/ws_connection.cpp /^ const std::vector<std::pair<std::string, std::string>> headers_;$/;" m class:WsConnectionImpl typeref:typename:const std::vector<std::pair<std::string,std::string>> file:
+headers_ host/libs/websocket/websocket_server.h /^ struct lws_protocol_vhost_options headers_;$/;" m class:cuttlefish::WebSocketServer typeref:struct:lws_protocol_vhost_options
+health guest/hals/health/health.cpp /^namespace health {$/;" n namespace:android::hardware file:
+health guest/hals/health/storage/Storage.cpp /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl::android::hardware file:
+health guest/hals/health/storage/Storage.h /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl::android::hardware
+health host/commands/health/health.cpp /^int health() {$/;" f typeref:typename:int
+height common/libs/device_config/device_config.proto /^ int32 height = 2;$/;" f message:cuttlefish.DeviceConfig.DisplayConfig typeref:typename:int32
+height host/frontend/webrtc/cvd_video_frame_buffer.cpp /^int CvdVideoFrameBuffer::height() const { return height_; }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:int
+height host/frontend/webrtc/lib/streamer.cpp /^ int height;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::DisplayDescriptor typeref:typename:int file:
+height host/frontend/webrtc/lib/video_track_source_impl.cpp /^ int height() const override { return frame_buffer_->height(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:int file:
+height host/libs/config/cuttlefish_config.h /^ int height;$/;" m struct:cuttlefish::CuttlefishConfig::DisplayConfig typeref:typename:int
+height_ guest/hals/camera/vsock_camera_metadata.h /^ int32_t height_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata typeref:typename:int32_t
+height_ host/frontend/webrtc/cvd_video_frame_buffer.h /^ const int height_;$/;" m class:cuttlefish::CvdVideoFrameBuffer typeref:typename:const int
+height_ host/frontend/webrtc/lib/video_track_source_impl.h /^ int height_;$/;" m class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:int
+help_ common/libs/utils/flag_parser.h /^ std::optional<std::string> help_;$/;" m class:cuttlefish::Flag typeref:typename:std::optional<std::string>
+help_ host/commands/start/flag_forwarder.cc /^ std::string help_;$/;" m class:DynamicFlag typeref:typename:std::string file:
+helper_ host/libs/config/adb/launch.cpp /^ const AdbHelper& helper_;$/;" m class:cuttlefish::__anon7ea6a0320111::AdbConnector typeref:typename:const AdbHelper & file:
+helper_ host/libs/config/adb/launch.cpp /^ const AdbHelper& helper_;$/;" m class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:const AdbHelper & file:
+hexCharToInt guest/hals/ril/reference-libril/ril_service.cpp /^extern "C" uint8_t hexCharToInt(uint8_t c) {$/;" f typeref:typename:uint8_t
+hidl2MsgString guest/hals/confirmationui/TrustyConfirmationUI.cpp /^inline MsgString hidl2MsgString(const hidl_string& s) {$/;" f namespace:android::hardware::confirmationui::V1_0::implementation::__anon2184467c0111 typeref:typename:MsgString
+hidl2MsgVector guest/hals/confirmationui/TrustyConfirmationUI.cpp /^inline MsgVector<teeui::UIOption> hidl2MsgVector(const hidl_vec<UIOption>& v) {$/;" f namespace:android::hardware::confirmationui::V1_0::implementation::__anon2184467c0111 typeref:typename:MsgVector<teeui::UIOption>
+hidl2MsgVector guest/hals/confirmationui/TrustyConfirmationUI.cpp /^template <typename T> inline MsgVector<T> hidl2MsgVector(const hidl_vec<T>& v) {$/;" f namespace:android::hardware::confirmationui::V1_0::implementation::__anon2184467c0111 typeref:typename:MsgVector<T>
+hidl_vec2sized_buffer guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^SizedBuffer hidl_vec2sized_buffer(const hidl_vec<uint8_t>& vec) {$/;" f namespace:gatekeeper typeref:typename:SizedBuffer
+hinge_angle_value host/libs/config/custom_actions.h /^ std::optional<int> hinge_angle_value;$/;" m struct:cuttlefish::DeviceState typeref:typename:std::optional<int>
+hinge_angle_value shared/config/config_foldable.json /^ "hinge_angle_value": 0$/;" n object:custom_actions.0.device_states.0
+hinge_angle_value shared/config/config_foldable.json /^ "hinge_angle_value": 180$/;" n object:custom_actions.1.device_states.0
+hlen common/libs/utils/network.cpp /^ std::uint8_t hlen;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t file:
+hmac256 host/libs/confui/sign.cc /^std::optional<support::hmac_t> HMacImplementation::hmac256($/;" f class:cuttlefish::confui::HMacImplementation typeref:typename:std::optional<support::hmac_t>
+hmac_t host/libs/confui/sign_utils.h /^using hmac_t = auth_token_key_t;$/;" t namespace:cuttlefish::confui::support typeref:typename:auth_token_key_t
+hops common/libs/utils/network.cpp /^ std::uint8_t hops;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t file:
+host_cmd_fetcher_thread_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::thread host_cmd_fetcher_thread_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::thread
+host_fd_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ cuttlefish::SharedFD host_fd_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:cuttlefish::SharedFD
+host_fd_ guest/hals/confirmationui/guest_session.h /^ cuttlefish::SharedFD host_fd_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:cuttlefish::SharedFD
+host_fetcher fetcher.mk /^host_fetcher: $(fetcher_bin)$/;" t
+host_id host/commands/modem_simulator/cf_device_config.cpp /^int DeviceConfig::host_id() {$/;" f class:cuttlefish::modem::DeviceConfig typeref:typename:int
+host_mode_ctrl_ host/libs/confui/host_server.h /^ HostModeCtrl& host_mode_ctrl_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:HostModeCtrl &
+host_mode_ctrl_ host/libs/confui/session.h /^ HostModeCtrl& host_mode_ctrl_;$/;" m class:cuttlefish::confui::Session typeref:typename:HostModeCtrl &
+host_mode_ctrl_ host/libs/screen_connector/screen_connector.h /^ HostModeCtrl& host_mode_ctrl_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:HostModeCtrl &
+host_mode_ctrl_ host/libs/screen_connector/screen_connector_multiplexer.h /^ HostModeCtrl& host_mode_ctrl_;$/;" m class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:HostModeCtrl &
+host_socket_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD host_socket_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:SharedFD file:
+host_tools_version host/libs/config/cuttlefish_config.cpp /^std::map<std::string, uint32_t> CuttlefishConfig::host_tools_version() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::map<std::string,uint32_t>
+host_vsock_port_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ int host_vsock_port_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:int
+hostname common/libs/utils/network.h /^ std::string hostname;$/;" m struct:cuttlefish::DnsmasqDhcp4Lease typeref:typename:std::string
+hosttar host_package.mk /^hosttar: $(cvd_host_packages)$/;" t
+hton host/libs/confui/sign_utils.h /^ inline static IntType hton(const IntType& value) { return value; }$/;" f struct:cuttlefish::confui::support::choose_hton typeref:typename:IntType
+hton host/libs/confui/sign_utils.h /^ inline static IntType hton(const IntType& value) {$/;" f struct:cuttlefish::confui::support::choose_hton typeref:typename:IntType
+hton host/libs/confui/sign_utils.h /^inline IntType hton(const IntType& value) {$/;" f namespace:cuttlefish::confui::support typeref:typename:IntType
+httpUrl host/frontend/webrtc_operator/assets/js/server_connector.js /^function httpUrl(path) {$/;" f
+http_code host/commands/fetcher/curl_wrapper.h /^ long http_code;$/;" m struct:cuttlefish::CurlResponse typeref:typename:long
+http_headers host/frontend/webrtc/lib/streamer.h /^ std::vector<std::pair<std::string, std::string>> http_headers;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig::__anonbc3851b60108 typeref:typename:std::vector<std::pair<std::string,std::string>>
+htype common/libs/utils/network.cpp /^ std::uint8_t htype;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t file:
+hvc_num_ host/libs/vm_manager/crosvm_builder.h /^ int hvc_num_;$/;" m class:cuttlefish::CrosvmBuilder typeref:typename:int
+hysteresisDb guest/hals/ril/reference-libril/ril.h /^ int32_t hysteresisDb;$/;" m struct:__anon0bfbaecf5608 typeref:typename:int32_t
+hysteresisDlKbps guest/hals/ril/reference-libril/ril.h /^ int32_t hysteresisDlKbps;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t
+hysteresisMs guest/hals/ril/reference-libril/ril.h /^ int32_t hysteresisMs;$/;" m struct:__anon0bfbaecf5608 typeref:typename:int32_t
+hysteresisMs guest/hals/ril/reference-libril/ril.h /^ int32_t hysteresisMs;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t
+hysteresisUlKbps guest/hals/ril/reference-libril/ril.h /^ int32_t hysteresisUlKbps;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t
+iHeight host/libs/graphics_detector/include/EGL/eglext.h /^ EGLint iHeight;$/;" m struct:EGLClientPixmapHI typeref:typename:EGLint
+iStride host/libs/graphics_detector/include/EGL/eglext.h /^ EGLint iStride;$/;" m struct:EGLClientPixmapHI typeref:typename:EGLint
+iWidth host/libs/graphics_detector/include/EGL/eglext.h /^ EGLint iWidth;$/;" m struct:EGLClientPixmapHI typeref:typename:EGLint
+iccCloseLogicalChannel guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+iccCloseLogicalChannelResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::iccCloseLogicalChannelResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+iccIOForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::iccIOForApp(int32_t serial, const IccIo& iccIo) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+iccIOForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::iccIOForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+iccOpenLogicalChannel guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+iccOpenLogicalChannelResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::iccOpenLogicalChannelResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+iccTransmitApduBasicChannel guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) /;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+iccTransmitApduBasicChannelResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::iccTransmitApduBasicChannelResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+iccTransmitApduLogicalChannel guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+iccTransmitApduLogicalChannelResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::iccTransmitApduLogicalChannelResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+iccid guest/hals/ril/reference-libril/ril.h /^ char *iccid;$/;" m struct:__anon0bfbaecf3b08 typeref:typename:char *
+iccid guest/hals/ril/reference-libril/ril.h /^ char* iccid;$/;" m struct:__anon0bfbaecfb908 typeref:typename:char *
+iceServers host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ let pc_config = {iceServers: []};$/;" p class:Connect.pc_config
+iceServers host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ let pc_config = {iceServers: []};$/;" p class:createPeerConnection.pc_config
+icon_name host/example_custom_actions/custom_action_config.json /^ "icon_name":"notifications_paused"$/;" s object:1.buttons.1
+icon_name host/example_custom_actions/custom_action_config.json /^ "icon_name":"settings"$/;" s object:1.buttons.0
+icon_name host/example_custom_actions/custom_action_config.json /^ "icon_name":"language"$/;" s object:0.button
+icon_name host/frontend/webrtc/lib/streamer.cpp /^ std::string icon_name;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::ControlPanelButtonDescriptor typeref:typename:std::string file:
+icon_name host/libs/config/custom_actions.h /^ std::string icon_name;$/;" m struct:cuttlefish::ControlPanelButton typeref:typename:std::string
+icon_name shared/config/config_foldable.json /^ "icon_name":"smartphone"$/;" s object:custom_actions.0.button
+icon_name shared/config/config_foldable.json /^ "icon_name":"tablet"$/;" s object:custom_actions.1.button
+id guest/hals/ril/reference-libril/RilSocket.h /^ RIL_SOCKET_ID id;$/;" m class:RilSocket typeref:typename:RIL_SOCKET_ID
+id host/commands/fetcher/build_api.h /^ std::string id;$/;" m struct:cuttlefish::DeviceBuild typeref:typename:std::string
+id host/commands/fetcher/build_api.h /^ std::string id;$/;" m struct:cuttlefish::DirectoryBuild typeref:typename:std::string
+id host/frontend/webrtc/connection_observer.cpp /^ int32_t id;$/;" m struct:cuttlefish::multitouch_slot typeref:typename:int32_t file:
+id2name_ host/libs/confui/host_utils.h /^ std::map<std::thread::id, std::string> id2name_;$/;" m class:cuttlefish::confui::thread::ThreadTracer typeref:typename:std::map<std::thread::id,std::string>
+id_ guest/hals/camera/vsock_camera_device_3_4.h /^ std::string id_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:std::string
+id_ host/commands/modem_simulator/nvram_config.h /^ std::string id_;$/;" m class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:std::string
+id_ host/libs/config/cuttlefish_config.h /^ std::string id_;$/;" m class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+id_ host/libs/config/cuttlefish_config.h /^ std::string id_;$/;" m class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:std::string
+identity_ common/libs/fs/shared_fd.h /^ std::string identity_;$/;" m class:cuttlefish::FileInstance typeref:typename:std::string
+idle_mode_time_ms guest/hals/ril/reference-libril/ril.h /^ uint32_t idle_mode_time_ms;$/;" m struct:__anon0bfbaecf9f08 typeref:typename:uint32_t
+if_index_ common/libs/net/network_interface.h /^ size_t if_index_ = 0;$/;" m class:cuttlefish::NetworkInterface typeref:typename:size_t
+ifa_list common/libs/device_config/host_device_config.cpp /^ struct ifaddrs *ifa_list{}, *ifa{};$/;" s function:cuttlefish::__anonf277137d0111::NetConfig::ParseInterfaceAttributes file:
+iface_id_ host/libs/allocd/resource.h /^ uint16_t iface_id_;$/;" m class:cuttlefish::EthernetIface typeref:typename:uint16_t
+iface_id_ host/libs/allocd/resource.h /^ uint16_t iface_id_;$/;" m class:cuttlefish::MobileIface typeref:typename:uint16_t
+ifname guest/hals/ril/reference-libril/ril.h /^ char * ifname; \/* The network interface name *\/$/;" m struct:__anon0bfbaecf1308 typeref:typename:char *
+ifname guest/hals/ril/reference-libril/ril.h /^ char * ifname; \/* The network interface name *\/$/;" m struct:__anon0bfbaecf1408 typeref:typename:char *
+ifname guest/hals/ril/reference-libril/ril.h /^ char * ifname; \/* The network interface name *\/$/;" m struct:__anon0bfbaecf1508 typeref:typename:char *
+ifname guest/hals/ril/reference-libril/ril.h /^ char * ifname; \/* The network interface name *\/$/;" m struct:__anon0bfbaecf1608 typeref:typename:char *
+imageCapture host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ get imageCapture() {$/;" G class:DeviceConnection
+imageHeight host/frontend/webrtc_operator/assets/js/app.js /^ imageHeight: this.#deviceConnection.cameraHeight$/;" p class:DeviceControlApp.takePhoto.photoSettings
+imageWidth host/frontend/webrtc_operator/assets/js/app.js /^ imageWidth: this.#deviceConnection.cameraWidth,$/;" p class:DeviceControlApp.takePhoto.photoSettings
+image_file_path host/libs/image_aggregator/image_aggregator.h /^ std::string image_file_path;$/;" m struct:cuttlefish::ImagePartition typeref:typename:std::string
+image_file_paths host/libs/image_aggregator/image_aggregator.h /^ std::vector<std::string> image_file_paths;$/;" m struct:cuttlefish::MultipleImagePartition typeref:typename:std::vector<std::string>
+impl common/libs/confui/packet.h /^namespace impl {$/;" n namespace:cuttlefish::confui::packet
+impl_ guest/hals/keymaster/remote/remote_keymaster4_device.h /^ std::unique_ptr<::keymaster::RemoteKeymaster> impl_;$/;" m class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:std::unique_ptr<::keymaster::RemoteKeymaster>
+impl_ guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^ keymaster::RemoteKeymaster& impl_;$/;" m class:aidl::android::hardware::security::keymint::RemoteRemotelyProvisionedComponent typeref:typename:keymaster::RemoteKeymaster &
+impl_ host/commands/secure_env/in_process_tpm.h /^ std::unique_ptr<Impl> impl_;$/;" m class:cuttlefish::InProcessTpm typeref:typename:std::unique_ptr<Impl>
+impl_ host/frontend/webrtc/lib/local_recorder.cpp /^ LocalRecorder::Impl& impl_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:LocalRecorder::Impl & file:
+impl_ host/frontend/webrtc/lib/local_recorder.h /^ std::unique_ptr<Impl> impl_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder typeref:typename:std::unique_ptr<Impl>
+impl_ host/frontend/webrtc/lib/streamer.h /^ std::shared_ptr<Impl> impl_;$/;" m class:cuttlefish::webrtc_streaming::Streamer typeref:typename:std::shared_ptr<Impl>
+implementation guest/hals/camera/cached_stream_buffer.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4 file:
+implementation guest/hals/camera/cached_stream_buffer.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4
+implementation guest/hals/camera/stream_buffer_cache.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4 file:
+implementation guest/hals/camera/stream_buffer_cache.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4
+implementation guest/hals/camera/vsock_camera_device_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4 file:
+implementation guest/hals/camera/vsock_camera_device_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4
+implementation guest/hals/camera/vsock_camera_device_session_3_4.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4 file:
+implementation guest/hals/camera/vsock_camera_device_session_3_4.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4
+implementation guest/hals/camera/vsock_camera_metadata.cpp /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4 file:
+implementation guest/hals/camera/vsock_camera_metadata.h /^namespace android::hardware::camera::device::V3_4::implementation {$/;" n namespace:android::hardware::camera::device::V3_4
+implementation guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider::V2_7 file:
+implementation guest/hals/camera/vsock_camera_provider_2_7.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider::V2_7
+implementation guest/hals/camera/vsock_camera_server.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider::V2_7 file:
+implementation guest/hals/camera/vsock_camera_server.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera::provider::V2_7
+implementation guest/hals/confirmationui/TrustyConfirmationUI.cpp /^namespace implementation {$/;" n namespace:android::hardware::confirmationui::V1_0 file:
+implementation guest/hals/confirmationui/TrustyConfirmationUI.h /^namespace implementation {$/;" n namespace:android::hardware::confirmationui::V1_0
+implementation guest/hals/confirmationui/guest_session.cpp /^namespace implementation {$/;" n namespace:android::hardware::confirmationui::V1_0 file:
+implementation guest/hals/confirmationui/guest_session.h /^namespace implementation {$/;" n namespace:android::hardware::confirmationui::V1_0
+implementation guest/hals/confirmationui/include/TrustyConfirmationuiHal.h /^namespace implementation {$/;" n namespace:android::hardware::confirmationui::V1_0
+implementation guest/hals/health/health.cpp /^namespace implementation {$/;" n namespace:android::hardware::health::V2_1 file:
+importFence guest/hals/camera/cached_stream_buffer.cpp /^void CachedStreamBuffer::importFence(const native_handle_t* fence_handle) {$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:void
+importKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::importKey(const hidl_vec<KeyParameter>& params,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+importKey guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::importKey($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+importWrappedKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::importWrappedKey($/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+importWrappedKey guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::importWrappedKey($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+imsNetworkStateChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::imsNetworkStateChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+imsSms guest/hals/ril/reference-libril/ril_service.cpp /^ RIL_IMS_SMS_Message imsSms;$/;" m struct:ImsCdmaSms typeref:typename:RIL_IMS_SMS_Message file:
+ims_subscription_app_index guest/hals/ril/reference-libril/ril.h /^ int ims_subscription_app_index; \/* value < RIL_CARD_MAX_APPS, -1 if none *\/$/;" m struct:__anon0bfbaecf3a08 typeref:typename:int
+in_buffer_ host/libs/websocket/websocket_handler.h /^ std::string in_buffer_ = {};$/;" m class:cuttlefish::DynHandler typeref:typename:std::string
+in_emergency_mode_ host/commands/modem_simulator/call_service.h /^ bool in_emergency_mode_;$/;" m class:cuttlefish::CallService typeref:typename:bool
+in_group_ common/libs/utils/subprocess.h /^ bool in_group_;$/;" m class:cuttlefish::SubprocessOptions typeref:typename:bool
+incoming_msg_queue_ guest/hals/confirmationui/guest_session.h /^ Queue incoming_msg_queue_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:Queue
+incomplete_command host/commands/modem_simulator/channel_monitor.h /^ std::string incomplete_command;$/;" m class:cuttlefish::Client typeref:typename:std::string
+incrementalResults guest/hals/ril/reference-libril/ril.h /^ int32_t incrementalResults;$/;" m struct:__anon0bfbaecfb008 typeref:typename:int32_t
+incrementalResultsPeriodicity guest/hals/ril/reference-libril/ril.h /^ int32_t incrementalResultsPeriodicity;$/;" m struct:__anon0bfbaecfb008 typeref:typename:int32_t
+index guest/hals/ril/reference-libril/ril.h /^ int index; \/* Connection Index for use with, eg, AT+CHLD *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:int
+index guest/hals/ril/reference-libril/ril.h /^ int index; \/* CUG index. See 27.007 7.17. *\/$/;" m struct:__anon0bfbaecf3108 typeref:typename:int
+index guest/hals/ril/reference-libril/ril_event.h /^ int index;$/;" m struct:ril_event typeref:typename:int
+index_ host/commands/secure_env/fragile_tpm_storage.h /^ Json::Value index_;$/;" m class:cuttlefish::FragileTpmStorage typeref:typename:Json::Value
+index_ host/commands/secure_env/insecure_fallback_storage.h /^ Json::Value index_;$/;" m class:cuttlefish::InsecureFallbackStorage typeref:typename:Json::Value
+index_file_ host/commands/secure_env/fragile_tpm_storage.h /^ std::string index_file_;$/;" m class:cuttlefish::FragileTpmStorage typeref:typename:std::string
+index_file_ host/commands/secure_env/insecure_fallback_storage.h /^ std::string index_file_;$/;" m class:cuttlefish::InsecureFallbackStorage typeref:typename:std::string
+indicateRingbackToneInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::indicateRingbackToneInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+infoRec guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_InformationRecord infoRec[RIL_CDMA_MAX_NUMBER_OF_INFO_RECS];$/;" m struct:__anon0bfbaecf8b08 typeref:typename:RIL_CDMA_InformationRecord[]
+info_reply host/libs/audio_connector/commands.h /^ R* info_reply() { return info_reply_; }$/;" f class:cuttlefish::InfoCommand typeref:typename:R *
+info_reply_ host/libs/audio_connector/commands.h /^ R* info_reply_;$/;" m class:cuttlefish::InfoCommand typeref:typename:R *
+inherited_fds_ common/libs/utils/subprocess.h /^ std::map<SharedFD, int> inherited_fds_{};$/;" m class:cuttlefish::Command typeref:typename:std::map<SharedFD,int>
+init build/cvd-host-package.go /^func init() {$/;" f package:cuttlefish
+init tools/create_base_image.go /^func init() {$/;" f package:main
+initSapSocket guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::initSapSocket(const char *socketName,$/;" f class:RilSapSocket typeref:typename:void
+init_adb host/frontend/webrtc_operator/assets/js/adb.js /^function init_adb(devConn, ccb = connectedCb, dcb = disconnectedCb) {$/;" f
+init_list guest/hals/ril/reference-libril/ril_event.cpp /^static void init_list(struct ril_event * list)$/;" f typeref:typename:void file:
+initialize guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::initialize($/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+initializeAdb host/frontend/webrtc_operator/assets/js/app.js /^ #initializeAdb() {$/;" m class:DeviceControlApp
+initializeCallback guest/hals/ril/reference-ril/reference-ril.c /^static void initializeCallback(void *param __unused)$/;" f typeref:typename:void file:
+initialize_1_1 guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::initialize_1_1($/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+initialize_impl guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::initialize_impl($/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+initramfs_path_ host/libs/config/data_image.cpp /^ std::string initramfs_path_;$/;" m class:cuttlefish::InitializeEspImageImpl typeref:typename:std::string file:
+injectAuthToken guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline hidl_vec<KeyParameter> injectAuthToken(const hidl_vec<KeyParameter>& keyParamsBase,$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hidl_vec<KeyParameter>
+inner_ host/frontend/webrtc/lib/vp8only_encoder_factory.h /^ std::unique_ptr<webrtc::VideoEncoderFactory> inner_;$/;" m class:cuttlefish::webrtc_streaming::VP8OnlyEncoderFactory typeref:typename:std::unique_ptr<webrtc::VideoEncoderFactory>
+inner_curl_ host/commands/fetcher/curl_wrapper.cc /^ CurlWrapper& inner_curl_;$/;" m class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:CurlWrapper & file:
+inputChannel host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #inputChannel;$/;" M class:DeviceConnection
+input_ common/libs/security/gatekeeper_channel.h /^ SharedFD input_;$/;" m class:cuttlefish::GatekeeperChannel typeref:typename:SharedFD
+input_ common/libs/security/keymaster_channel.h /^ SharedFD input_;$/;" m class:cuttlefish::KeymasterChannel typeref:typename:SharedFD
+input_channel_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::scoped_refptr<webrtc::DataChannelInterface> input_channel_;$/;" m class:cuttlefish::webrtc_streaming::InputChannelHandler typeref:typename:rtc::scoped_refptr<webrtc::DataChannelInterface> file:
+input_events guest/commands/vsoc_input_service/vsoc_input_service.h /^namespace input_events {$/;" n namespace:cuttlefish
+input_handler_ host/frontend/webrtc/lib/client_handler.h /^ std::unique_ptr<InputChannelHandler> input_handler_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::unique_ptr<InputChannelHandler>
+input_multiplexer_ host/libs/confui/host_server.h /^ Multiplexer input_multiplexer_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:Multiplexer
+input_socket_path_ host/libs/confui/host_server.h /^ std::string input_socket_path_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:std::string
+input_sockets_ host/frontend/webrtc/connection_observer.cpp /^ cuttlefish::InputSockets& input_sockets_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:cuttlefish::InputSockets & file:
+input_sockets_ host/frontend/webrtc/connection_observer.h /^ InputSockets& input_sockets_;$/;" m class:cuttlefish::CfConnectionObserverFactory typeref:typename:InputSockets &
+insecure_storage_ host/commands/secure_env/tpm_gatekeeper.h /^ GatekeeperStorage& insecure_storage_;$/;" m class:cuttlefish::TpmGatekeeper typeref:typename:GatekeeperStorage &
+instance_ host/commands/assemble_cvd/disk_flags.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::InitializeAccessKregistryImage typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::BluetoothConnector typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::ConfigServer typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::GnssGrpcProxyServer typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::KernelLogMonitor typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::LogcatReceiver typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::OpenWrt typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::RootCanal typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::SecureEnvironment typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::TombstoneReceiver typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::VehicleHalServer typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::WmediumdServer typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch_modem.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch_streamer.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/launch_streamer.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/main.cc /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anonadab6e0c0111::CuttlefishEnvironment typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/server_loop.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/run_cvd/validate.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anon8d12954e0111::ValidateTapDevices typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/commands/secure_env/tpm_serialize.h /^ Type* instance_;$/;" m class:cuttlefish::TpmSerializable typeref:typename:Type *
+instance_ host/libs/config/adb/launch.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anon7ea6a0320111::AdbHelper typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_ host/libs/config/adb/launch.cpp /^ const CuttlefishConfig::InstanceSpecific& instance_;$/;" m class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:const CuttlefishConfig::InstanceSpecific & file:
+instance_dir host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::instance_dir() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+instance_dirs host/libs/config/cuttlefish_config.cpp /^std::vector<std::string> CuttlefishConfig::instance_dirs() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::vector<std::string>
+instance_internal_dir host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::instance_internal_dir() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+instance_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::instance_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+instruction guest/hals/ril/reference-libril/ril.h /^ int instruction;$/;" m struct:__anon0bfbaecf1f08 typeref:typename:int
+internal host/libs/wayland/wayland_server.cpp /^namespace internal {$/;" n namespace:wayland file:
+internal host/libs/wayland/wayland_server.h /^namespace internal {$/;" n namespace:wayland
+internalRequestTimedCallback guest/hals/ril/reference-libril/ril.cpp /^internalRequestTimedCallback (RIL_TimedCallback callback, void *param,$/;" f namespace:android typeref:typename:UserCallbackInfo * file:
+interval guest/hals/ril/reference-libril/ril.h /^ int32_t interval; \/\/ Time interval in second/;" m struct:__anon0bfbaecfad08 typeref:typename:int32_t
+interval guest/hals/ril/reference-libril/ril.h /^ int32_t interval;$/;" m struct:__anon0bfbaecfb008 typeref:typename:int32_t
+invalid_linux_version host/libs/vm_manager/host_configuration.cpp /^constexpr std::pair<int,int> invalid_linux_version = std::pair<int,int>();$/;" v namespace:cuttlefish::vm_manager::__anon1edaaabd0111 typeref:typename:std::pair<int,int>
+io_xfer host/libs/audio_connector/shm_layout.h /^ virtio_snd_pcm_xfer io_xfer;$/;" m struct:cuttlefish::IoTransferMsg typeref:typename:virtio_snd_pcm_xfer
+ip common/libs/utils/network.cpp /^ iphdr ip;$/;" m struct:cuttlefish::CompleteReleaseFrame typeref:typename:iphdr file:
+ip_address common/libs/utils/network.h /^ std::uint8_t ip_address[4];$/;" m struct:cuttlefish::DnsmasqDhcp4Lease typeref:typename:std::uint8_t[4]
+ip_address_ common/libs/net/network_interface.h /^ std::string ip_address_;$/;" m class:cuttlefish::NetworkInterface typeref:typename:std::string
+ip_checksum common/libs/utils/network.cpp /^static std::uint16_t ip_checksum(std::uint16_t *buf, std::size_t size) {$/;" f namespace:cuttlefish typeref:typename:std::uint16_t file:
+ipaddr common/libs/device_config/device_config.proto /^ string ipaddr = 1;$/;" f message:cuttlefish.DeviceConfig.RILConfig typeref:typename:string
+ipaddr_ host/libs/allocd/resource.h /^ std::string ipaddr_;$/;" m class:cuttlefish::EthernetIface typeref:typename:std::string
+ipaddr_ host/libs/allocd/resource.h /^ std::string ipaddr_;$/;" m class:cuttlefish::MobileIface typeref:typename:std::string
+is3gpp2 guest/hals/ril/reference-ril/reference-ril.c /^static int is3gpp2(int radioTech) {$/;" f typeref:typename:int file:
+isAospAidlInterface tests/hal/hal_implementation_test.cpp /^static bool isAospAidlInterface(const std::string& name) {$/;" f typeref:typename:bool file:
+isAospHidlInterface tests/hal/hal_implementation_test.cpp /^static bool isAospHidlInterface(const FQName& name) {$/;" f typeref:typename:bool file:
+isBlob guest/hals/camera/vsock_frame_provider.cpp /^bool VsockFrameProvider::isBlob(const std::vector<char>& blob) {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+isCallActive host/commands/modem_simulator/call_service.h /^ bool isCallActive() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+isCallAlerting host/commands/modem_simulator/call_service.h /^ bool isCallAlerting() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+isCallBackground host/commands/modem_simulator/call_service.h /^ bool isCallBackground() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+isCallDialing host/commands/modem_simulator/call_service.h /^ bool isCallDialing() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+isCallIncoming host/commands/modem_simulator/call_service.h /^ bool isCallIncoming() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+isCallWaiting host/commands/modem_simulator/call_service.h /^ bool isCallWaiting() {$/;" f struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+isCancelled guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public boolean isCancelled() {$/;" m class:GceFuture
+isConcurrentStreamCombinationSupported guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::isConcurrentStreamCombinationSupported($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+isConcurrentStreamCombinationSupported_2_7 guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::isConcurrentStreamCombinationSupported_2_7($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+isEnabled guest/hals/ril/reference-libril/ril.h /^ bool isEnabled;$/;" m struct:__anon0bfbaecf5608 typeref:typename:bool
+isFinalResponse guest/hals/ril/reference-ril/atchannel.c /^static int isFinalResponse(const char *line)$/;" f typeref:typename:int file:
+isFinalResponseError guest/hals/ril/reference-ril/atchannel.c /^static int isFinalResponseError(const char *line)$/;" f typeref:typename:int file:
+isFinalResponseSuccess guest/hals/ril/reference-ril/atchannel.c /^static int isFinalResponseSuccess(const char *line)$/;" f typeref:typename:int file:
+isGnssRawMeasurement host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ bool isGnssRawMeasurement(const std::string& inputStr) {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:bool file:
+isHidlPackageConsidered tests/hal/hal_implementation_test.cpp /^static bool isHidlPackageConsidered(const FQName& name) {$/;" f typeref:typename:bool file:
+isInEmulator guest/hals/ril/reference-ril/misc.c /^bool isInEmulator(void) {$/;" f typeref:typename:bool
+isInternetLingeringSupported guest/hals/ril/reference-libril/ril.h /^ int isInternetLingeringSupported;$/;" m struct:__anon0bfbaecfbc08 typeref:typename:int
+isMT guest/hals/ril/reference-libril/ril.h /^ char isMT; \/* nonzero if call is mobile terminated *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:char
+isMpty guest/hals/ril/reference-libril/ril.h /^ char isMpty; \/* nonzero if is mpty call *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:char
+isMultimode guest/hals/ril/reference-ril/reference-ril.c /^ int isMultimode;$/;" m struct:__anon70d7df6f0108 typeref:typename:int file:
+isNMEA host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ bool isNMEA(const std::string& inputStr) {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:bool file:
+isNrDualConnectivityEnabled guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::isNrDualConnectivityEnabled(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+isNrDualConnectivityEnabled guest/hals/ril/reference-ril/reference-ril.c /^static bool isNrDualConnectivityEnabled = true;$/;" v typeref:typename:bool file:
+isNrDualConnectivityEnabledResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::isNrDualConnectivityEnabledResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+isPresent guest/hals/ril/reference-libril/ril.h /^ char isPresent; \/* non-zero if signal information record is present *\/$/;" m struct:__anon0bfbaecf1008 typeref:typename:char
+isRadioOff host/commands/modem_simulator/network_service.h /^ bool isRadioOff() const { return radio_state_ == RADIO_STATE_OFF; }$/;" f class:cuttlefish::NetworkService typeref:typename:bool
+isRadioOn guest/hals/ril/reference-ril/reference-ril.c /^static int isRadioOn()$/;" f typeref:typename:int file:
+isRunning guest/hals/camera/vsock_camera_server.h /^ bool isRunning() const { return is_running_.load(); }$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:bool
+isRunning guest/hals/camera/vsock_frame_provider.h /^ bool isRunning() const { return running_.load(); }$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+isSMSUnsolicited guest/hals/ril/reference-ril/atchannel.c /^static int isSMSUnsolicited(const char *line)$/;" f typeref:typename:int file:
+isServiceTypeCfQuery guest/hals/ril/reference-libril/ril_service.cpp /^bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {$/;" f typeref:typename:bool
+isSetTorchModeSupported guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::isSetTorchModeSupported($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+isStreamConfigurationSupported guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Status VsockCameraDeviceSession::isStreamConfigurationSupported($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Status
+isValid guest/hals/camera/vsock_camera_metadata.h /^ bool isValid() const { return is_valid_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraRequestMetadata typeref:typename:bool
+isVoice guest/hals/ril/reference-libril/ril.h /^ char isVoice; \/* nonzero if this is is a voice call *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:char
+isVoicePrivacy guest/hals/ril/reference-libril/ril.h /^ char isVoicePrivacy; \/* nonzero if CDMA voice privacy mode is active *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:char
+is_binary host/frontend/webrtc/lib/ws_connection.cpp /^ bool is_binary() const { return is_binary_; }$/;" f struct:WsConnectionImpl::WsBuffer typeref:typename:bool file:
+is_binary_ host/frontend/webrtc/lib/ws_connection.cpp /^ bool is_binary_;$/;" m struct:WsConnectionImpl::WsBuffer typeref:typename:bool file:
+is_default_ host/libs/config/config_flag.cpp /^ bool is_default_;$/;" m class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:bool file:
+is_international host/commands/modem_simulator/call_service.h /^ bool is_international;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+is_inverted_ host/libs/confui/host_renderer.h /^ bool is_inverted_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+is_magnified_ host/libs/confui/host_renderer.h /^ bool is_magnified_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+is_mobile_terminated host/commands/modem_simulator/call_service.h /^ bool is_mobile_terminated;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+is_movable host/libs/screen_connector/screen_connector_common.h /^struct is_movable {$/;" s namespace:cuttlefish
+is_multi_party host/commands/modem_simulator/call_service.h /^ bool is_multi_party;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+is_multimode_modem guest/hals/ril/reference-ril/reference-ril.c /^int is_multimode_modem(ModemInfo *mdm)$/;" f typeref:typename:int
+is_open host/commands/modem_simulator/sim_service.h /^ bool is_open;$/;" m struct:cuttlefish::SimService::LogicalChannel typeref:typename:bool
+is_open_ guest/hals/camera/vsock_camera_device_3_4.h /^ std::atomic<bool> is_open_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:std::atomic<bool>
+is_operational_ common/libs/net/network_interface.h /^ bool is_operational_ = false;$/;" m class:cuttlefish::NetworkInterface typeref:typename:bool
+is_regular_file_ common/libs/fs/shared_fd.h /^ bool is_regular_file_;$/;" m class:cuttlefish::FileInstance typeref:typename:bool
+is_remote_call host/commands/modem_simulator/call_service.h /^ bool is_remote_call;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+is_response common/libs/security/gatekeeper_channel.h /^ bool is_response : 1;$/;" m struct:gatekeeper::GatekeeperRawMessage typeref:typename:bool:1
+is_response common/libs/security/keymaster_channel.h /^ bool is_response : 1;$/;" m struct:keymaster::keymaster_message typeref:typename:bool:1
+is_running_ guest/hals/camera/vsock_camera_server.h /^ std::atomic<bool> is_running_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:std::atomic<bool>
+is_setup_well_ host/libs/confui/host_renderer.h /^ bool is_setup_well_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:bool
+is_socket_ok_ host/libs/confui/host_server.h /^ bool is_socket_ok_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:bool
+is_success_ common/libs/confui/protocol_types.h /^ bool is_success_;$/;" m class:cuttlefish::confui::ConfUiAckMessage typeref:typename:bool
+is_success_ host/libs/screen_connector/screen_connector_common.h /^ bool is_success_;$/;" m struct:cuttlefish::ScreenConnectorFrameInfo typeref:typename:bool
+is_valid host/commands/modem_simulator/channel_monitor.h /^ bool is_valid = true;$/;" m class:cuttlefish::Client typeref:typename:bool
+is_valid_ guest/hals/camera/vsock_camera_metadata.h /^ bool is_valid_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraRequestMetadata typeref:typename:bool
+is_valid_pdu_ host/commands/modem_simulator/pdu_parser.h /^ bool is_valid_pdu_;$/;" m class:cuttlefish::PDUParser typeref:typename:bool
+is_voice_mode host/commands/modem_simulator/call_service.h /^ bool is_voice_mode;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:bool
+is_waiting_sms_pdu_ host/commands/modem_simulator/sms_service.h /^ bool is_waiting_sms_pdu_;$/;" m class:cuttlefish::SmsService typeref:typename:bool
+is_waiting_sms_to_sim_ host/commands/modem_simulator/sms_service.h /^ bool is_waiting_sms_to_sim_;$/;" m class:cuttlefish::SmsService typeref:typename:bool
+itemID guest/hals/ril/reference-libril/ril.h /^ RIL_NV_Item itemID;$/;" m struct:__anon0bfbaecf8d08 typeref:typename:RIL_NV_Item
+itemID guest/hals/ril/reference-libril/ril.h /^ RIL_NV_Item itemID;$/;" m struct:__anon0bfbaecf8c08 typeref:typename:RIL_NV_Item
+items_ common/libs/concurrency/thread_safe_queue.h /^ QueueImpl items_;$/;" m class:cuttlefish::ThreadSafeQueue typeref:typename:QueueImpl
+iterator common/libs/fs/shared_select.h /^ typedef std::set<SharedFD>::iterator iterator;$/;" t class:cuttlefish::SharedFDSet typeref:typename:std::set<SharedFD>::iterator
+jacks host/libs/audio_connector/shm_layout.h /^ uint32_t jacks;$/;" m struct:cuttlefish::VioSConfig typeref:typename:uint32_t
+jpegPending guest/hals/camera/vsock_frame_provider.h /^ bool jpegPending() const { return jpeg_pending_.load(); }$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+jpeg_mutex_ guest/hals/camera/vsock_frame_provider.h /^ std::mutex jpeg_mutex_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::mutex
+jpeg_pending_ guest/hals/camera/vsock_frame_provider.h /^ std::atomic<bool> jpeg_pending_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::atomic<bool>
+json_ host/commands/secure_env/json_serializable.cpp /^ Json::Value& json_;$/;" m class:cuttlefish::JsonSerializable typeref:typename:Json::Value & file:
+k0x100 host/libs/confui/cbor.cc /^ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };$/;" e enum:cuttlefish::confui::Cbor::WriteHeader::Condition file:
+k0x10000 host/libs/confui/cbor.cc /^ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };$/;" e enum:cuttlefish::confui::Cbor::WriteHeader::Condition file:
+k0x100000000 host/libs/confui/cbor.cc /^ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };$/;" e enum:cuttlefish::confui::Cbor::WriteHeader::Condition file:
+k24 host/libs/confui/cbor.cc /^ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };$/;" e enum:cuttlefish::confui::Cbor::WriteHeader::Condition file:
+kAberrationMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAbort common/libs/confui/protocol_types.h /^ kAbort = 115, \/\/ to abort the current session$/;" e enum:cuttlefish::confui::ConfUiCmd
+kAck host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kAck = 1,$/;" e enum:cuttlefish::WmediumdMessageType
+kAdbChannelLabel host/frontend/webrtc/lib/client_handler.cpp /^static constexpr auto kAdbChannelLabel = "adb-channel";$/;" v namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 typeref:typename:auto file:
+kAdbCommandGapTime host/frontend/adb_connector/adb_connection_maintainer.cpp /^static constexpr int kAdbCommandGapTime = 5;$/;" v namespace:__anon734383cf0111 typeref:typename:int file:
+kAdbDaemonPort host/frontend/adb_connector/adb_connection_maintainer.cpp /^constexpr int kAdbDaemonPort = 5037;$/;" v namespace:__anon734383cf0111 typeref:typename:int
+kAdbIPAndPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kAdbIPAndPort[] = "adb_ip_and_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kAdbMessageLengthLength host/frontend/adb_connector/adb_connection_maintainer.cpp /^constexpr std::size_t kAdbMessageLengthLength = 4;$/;" v namespace:__anon734383cf0111 typeref:typename:std::size_t
+kAdbOkayStatusResponse host/frontend/adb_connector/adb_connection_maintainer.cpp /^constexpr char kAdbOkayStatusResponse[] = "OKAY";$/;" v namespace:__anon734383cf0111 typeref:typename:char[]
+kAdbStatusResponseLength host/frontend/adb_connector/adb_connection_maintainer.cpp /^constexpr std::size_t kAdbStatusResponseLength =$/;" v namespace:__anon734383cf0111 typeref:typename:std::size_t
+kAeAvailableMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAeAvailableMode = ANDROID_CONTROL_AE_MODE_ON;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAeLockAvailable guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAePrecaptureTrigger guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAfAvailableModes guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAfAvailableModes[] = {ANDROID_CONTROL_AF_MODE_OFF};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t[]
+kAfMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAfMode = ANDROID_CONTROL_AF_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAfTrigger guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAfTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAllowSelfSigned host/frontend/webrtc/lib/ws_connection.h /^ kAllowSelfSigned,$/;" e enum:WsConnection::Security
+kAndroidMode host/libs/confui/host_mode_ctrl.h /^ enum class ModeType : std::uint8_t { kAndroidMode = 55, kConfUI_Mode = 77 };$/;" e enum:cuttlefish::HostModeCtrl::ModeType
+kAndroidMode host/libs/screen_connector/screen_connector_ctrl.h /^ kAndroidMode,$/;" e enum:cuttlefish::ScreenConnectorCtrl::ModeType
+kAntibandingMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAntibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kApKernelImage host/libs/config/cuttlefish_config.cpp /^static constexpr char kApKernelImage[] = "ap_kernel_image";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kApRootfsImage host/libs/config/cuttlefish_config.cpp /^static constexpr char kApRootfsImage[] = "ap_rootfs_image";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kAreaCode host/commands/modem_simulator/network_service.cpp /^static const std::string kAreaCode = "2142";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kArgumentParsingError host/commands/run_cvd/runner_defs.h /^ kArgumentParsingError = 1,$/;" e enum:cuttlefish::RunnerExitCodes
+kAssemblerBin host/commands/start/main.cc /^std::string kAssemblerBin = cuttlefish::HostBinaryPath("assemble_cvd");$/;" v namespace:__anon8e1e78490111 typeref:typename:std::string
+kAssemblyDir host/libs/config/cuttlefish_config.cpp /^static constexpr char kAssemblyDir[] = "assembly_dir";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kAudioControlServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kAudioControlServerPort[] = "audiocontrol_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kAudioStreamsField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kAudioStreamsField = "audio_streams";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kAvailableAberrationModes guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAvailableAberrationModes[] = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t[]
+kAvailableCapabilities guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAvailableCapabilities[] = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t[]
+kAvailableCharacteristicsKeys guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kAvailableCharacteristicsKeys[] = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kAvailableFffect guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAvailableFffect = ANDROID_CONTROL_EFFECT_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAvailableHotpixelMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAvailableHotpixelMode =$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAvailableRequestKeys guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kAvailableRequestKeys[] = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kAvailableResultKeys guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kAvailableResultKeys[] = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kAvailableSceneMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAvailableSceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAvailableShadingMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAvailableShadingMode = ANDROID_SHADING_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAwaitCleanup host/libs/confui/server_common.h /^ kAwaitCleanup = 5,$/;" e enum:cuttlefish::confui::MainLoopState
+kAwaitingAnswer host/frontend/webrtc/lib/client_handler.h /^ kAwaitingAnswer,$/;" e enum:cuttlefish::webrtc_streaming::ClientHandler::State
+kAwbAvailableMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAwbAvailableMode = ANDROID_CONTROL_AWB_MODE_AUTO;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kAwbLockAvailable guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kAwbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kBare host/commands/kernel_log_monitor/kernel_log_server.cc /^ kBare, \/\/ Just an event, no extra data$/;" e enum:__anonfa7764770111::EventFormat file:
+kBeyond host/libs/confui/cbor.cc /^ enum class Condition { k24, k0x100, k0x10000, k0x100000000, kBeyond };$/;" e enum:cuttlefish::confui::Cbor::WriteHeader::Condition file:
+kBlankDataImageMb host/libs/config/cuttlefish_config.cpp /^static constexpr char kBlankDataImageMb[] = "blank_data_image_mb";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kBluetoothChannelLabel host/frontend/webrtc/lib/client_handler.cpp /^static constexpr auto kBluetoothChannelLabel = "bluetooth-channel";$/;" v namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 typeref:typename:auto file:
+kBootCompletedMessage host/libs/config/cuttlefish_config.h /^constexpr char kBootCompletedMessage[] = "VIRTUAL_DEVICE_BOOT_COMPLETED";$/;" v namespace:cuttlefish typeref:typename:char[]
+kBootFailedMessage host/libs/config/cuttlefish_config.h /^constexpr char kBootFailedMessage[] = "VIRTUAL_DEVICE_BOOT_FAILED";$/;" v namespace:cuttlefish typeref:typename:char[]
+kBootImageUnpackError host/commands/run_cvd/runner_defs.h /^ kBootImageUnpackError = 6,$/;" e enum:cuttlefish::RunnerExitCodes
+kBootPathAA64 host/libs/config/data_image.cpp /^const std::string kBootPathAA64 = "EFI\/BOOT\/BOOTAA64.EFI";$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::string
+kBootPathIA32 host/libs/config/data_image.cpp /^const std::string kBootPathIA32 = "EFI\/BOOT\/BOOTIA32.EFI";$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::string
+kBootSlot host/libs/config/cuttlefish_config.cpp /^static constexpr char kBootSlot[] = "boot_slot";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kBootStarted host/commands/run_cvd/boot_state_machine.cc /^ static const int kBootStarted = 0;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:const int file:
+kBootStartedMessage host/libs/config/cuttlefish_config.h /^constexpr char kBootStartedMessage[] = "VIRTUAL_DEVICE_BOOT_STARTED";$/;" v namespace:cuttlefish typeref:typename:char[]
+kBootconfigSupported host/libs/config/cuttlefish_config.cpp /^static constexpr char kBootconfigSupported[] = "bootconfig_supported";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kBootloader host/libs/config/cuttlefish_config.cpp /^static constexpr char kBootloader[] = "bootloader";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kBufferSize common/libs/fs/shared_fd_stream.h /^ static constexpr const ptrdiff_t kBufferSize = 4096 + kUngetSize;$/;" m class:cuttlefish::SharedFDStreambuf typeref:typename:const ptrdiff_t
+kBufferSize guest/commands/bt_vhci_forwarder/main.cpp /^constexpr const size_t kBufferSize = (HCI_MAX_FRAME_SIZE + 1) * 2;$/;" v typeref:typename:const size_t
+kBufferSize host/commands/bt_connector/main.cpp /^constexpr const size_t kBufferSize = (HCI_MAX_FRAME_SIZE + 1) * 2;$/;" v typeref:typename:const size_t
+kBufferSize host/frontend/webrtc/lib/ws_connection.cpp /^constexpr int kBufferSize = 65536;$/;" v namespace:__anon14ee93270111 typeref:typename:int
+kCDMASignalStrength host/commands/modem_simulator/network_service.cpp /^const std::pair<int, int> kCDMASignalStrength = std::make_pair(4, 120);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kCORSHeaders host/libs/websocket/websocket_server.cpp /^const std::vector<std::pair<std::string, std::string>> kCORSHeaders = {$/;" v namespace:cuttlefish::__anon8185be2f0111 typeref:typename:const std::vector<std::pair<std::string,std::string>>
+kCallService host/commands/modem_simulator/modem_service.h /^ kCallService = 3,$/;" e enum:cuttlefish::ModemServiceType
+kCameraDataChannelLabel host/frontend/webrtc/lib/client_handler.cpp /^static constexpr auto kCameraDataChannelLabel = "camera-data-channel";$/;" v namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 typeref:typename:auto file:
+kCameraDataEof host/frontend/webrtc/lib/client_handler.cpp /^static constexpr auto kCameraDataEof = "EOF";$/;" v namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 typeref:typename:auto file:
+kCameraServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kCameraServerPort[] = "camera_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kCancel common/libs/confui/protocol_types.h /^ constexpr static const auto kCancel = "user_cancel";$/;" m struct:cuttlefish::confui::UserResponse typeref:typename:const auto
+kCellId host/commands/modem_simulator/network_service.cpp /^static const std::string kCellId = "0000B804";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kCliAck common/libs/confui/protocol_types.h /^ kCliAck = 113, \/\/ client acknowledged. "error:err_msg" or "success:command"$/;" e enum:cuttlefish::confui::ConfUiCmd
+kCliRespond common/libs/confui/protocol_types.h /^ kCliRespond = 114, \/\/ with "confirm" or "cancel" or "abort"$/;" e enum:cuttlefish::confui::ConfUiCmd
+kClientDisconnectType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kClientDisconnectType = "client_disconnected";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kClientIdField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kClientIdField = "client_id";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kClientMessageType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kClientMessageType = "client_msg";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kClientSecretField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kClientSecretField = "connection_id";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kCmeErrorFixedDialNumberOnlyAllowed host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorFixedDialNumberOnlyAllowed = "+CME ERROR: 56";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorFixedDialNumberOnlyAllowed host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorFixedDialNumberOnlyAllowed;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorInCorrectParameters host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorInCorrectParameters = "+CME ERROR: 50";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorInCorrectParameters host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorInCorrectParameters;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorIncorrectPassword host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorIncorrectPassword = "+CME ERROR: 16";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorIncorrectPassword host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorIncorrectPassword;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorInvalidCharactersInTextString host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorInvalidCharactersInTextString = "+CME ERROR: 27";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorInvalidCharactersInTextString host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorInvalidCharactersInTextString;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorInvalidIndex host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorInvalidIndex = "+CME ERROR: 21";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorInvalidIndex host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorInvalidIndex;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorMemoryFull host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorMemoryFull = "+CME ERROR: 20";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorMemoryFull host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorMemoryFull;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNetworkNotAllowedEmergencyCallsOnly host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorNetworkNotAllowedEmergencyCallsOnly = "+CME ERROR: 32";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNetworkNotAllowedEmergencyCallsOnly host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorNetworkNotAllowedEmergencyCallsOnly;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNetworkNotAttachedDueToMTFunctionalRestrictions host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorNetworkNotAttachedDueToMTFunctionalRestrictions = "+CME/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNetworkNotAttachedDueToMTFunctionalRestrictions host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorNetworkNotAttachedDueToMTFunctionalRestrictions;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNoNetworkService host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorNoNetworkService = "+CME ERROR: 30";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNoNetworkService host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorNoNetworkService;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNotFound host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorNotFound = "+CME ERROR: 22";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorNotFound host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorNotFound;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorOperationNotAllowed host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorOperationNotAllowed = "+CME ERROR: 3";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorOperationNotAllowed host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorOperationNotAllowed;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorOperationNotSupported host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorOperationNotSupported = "+CME ERROR: 4";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorOperationNotSupported host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorOperationNotSupported;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimBusy host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorSimBusy = "+CME ERROR: 14";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimBusy host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorSimBusy;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimNotInserted host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorSimNotInserted = "+CME ERROR: 10";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimNotInserted host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorSimNotInserted;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimPinRequired host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorSimPinRequired = "+CME ERROR: 11";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimPinRequired host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorSimPinRequired;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimPukRequired host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmeErrorSimPukRequired = "+CME ERROR: 12";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmeErrorSimPukRequired host/commands/modem_simulator/modem_service.h /^ static const std::string kCmeErrorSimPukRequired;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorInvalidPDUModeParam host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmsErrorInvalidPDUModeParam = "+CMS ERROR: 304";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorInvalidPDUModeParam host/commands/modem_simulator/modem_service.h /^ static const std::string kCmsErrorInvalidPDUModeParam;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorOperationNotAllowed host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmsErrorOperationNotAllowed = "+CMS ERROR: 302";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorOperationNotAllowed host/commands/modem_simulator/modem_service.h /^ static const std::string kCmsErrorOperationNotAllowed;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorOperationNotSupported host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmsErrorOperationNotSupported = "+CMS ERROR: 303";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorOperationNotSupported host/commands/modem_simulator/modem_service.h /^ static const std::string kCmsErrorOperationNotSupported;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorSCAddressUnknown host/commands/modem_simulator/modem_service.cpp /^const std::string ModemService::kCmsErrorSCAddressUnknown = "+CMS ERROR: 304";$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kCmsErrorSCAddressUnknown host/commands/modem_simulator/modem_service.h /^ static const std::string kCmsErrorSCAddressUnknown;$/;" m class:cuttlefish::ModemService typeref:typename:const std::string
+kColorBackground host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorBackground = 0xffffffff;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorBackgroundInv host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorBackgroundInv = 0xff212121;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorDisabled host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorDisabled = 0xffbdbdbd;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorDisabledInv host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorDisabledInv = 0xff424242;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorEnabled host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorEnabled = 0xff212121;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorEnabledInv host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorEnabledInv = 0xffdedede;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorShield host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorShield = 0xff778500;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorShieldInv host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorShieldInv = 0xffc4cb80;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorText host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorText = 0xff212121;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kColorTextInv host/libs/confui/host_renderer.h /^ static constexpr const teeui::Color kColorTextInv = 0xffdedede;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:const teeui::Color
+kComingSoonAidl tests/hal/hal_implementation_test.cpp /^static const std::set<VersionedAidlPackage> kComingSoonAidl = {$/;" v typeref:typename:const std::set<VersionedAidlPackage> file:
+kCompositorVersion host/libs/wayland/wayland_compositor.cpp /^constexpr const uint32_t kCompositorVersion = 3;$/;" v namespace:wayland::__anon473d11590111 typeref:typename:const uint32_t
+kConfUI_Mode host/libs/confui/host_mode_ctrl.h /^ enum class ModeType : std::uint8_t { kAndroidMode = 55, kConfUI_Mode = 77 };$/;" e enum:cuttlefish::HostModeCtrl::ModeType
+kConfUI_Mode host/libs/screen_connector/screen_connector_ctrl.h /^ kConfUI_Mode$/;" e enum:cuttlefish::ScreenConnectorCtrl::ModeType
+kConfUiHostPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kConfUiHostPort[] = "confirmation_ui_host_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kConfigServerError host/commands/run_cvd/runner_defs.h /^ kConfigServerError = 19,$/;" e enum:cuttlefish::RunnerExitCodes
+kConfigServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kConfigServerPort[] = "config_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kConfigType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kConfigType = "config";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kConfirm common/libs/confui/protocol_types.h /^ constexpr static const auto kConfirm = "user_confirm";$/;" m struct:cuttlefish::confui::UserResponse typeref:typename:const auto
+kConnectClientUriPath host/frontend/webrtc_operator/server.cpp /^constexpr auto kConnectClientUriPath = "\/connect_client";$/;" v namespace:__anon477f946a0111 typeref:typename:auto
+kConnectPath host/frontend/webrtc_operator/server.cpp /^const constexpr auto kConnectPath = "\/connect";$/;" v namespace:__anon477f946a0111 typeref:typename:const auto
+kConnectType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kConnectType = "connect";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kConnected host/frontend/webrtc/lib/client_handler.h /^ kConnected,$/;" e enum:cuttlefish::webrtc_streaming::ClientHandler::State
+kConnecting host/frontend/webrtc/lib/client_handler.h /^ kConnecting,$/;" e enum:cuttlefish::webrtc_streaming::ClientHandler::State
+kConnectorEnabled host/libs/config/adb/config.cpp /^ static constexpr char kConnectorEnabled[] = "connector_enabled";$/;" m class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl typeref:typename:char[] file:
+kConsole host/libs/config/cuttlefish_config.cpp /^static constexpr char kConsole[] = "console";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kControlAeCompensationRange guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kControlAeCompensationRange[] = {0, 0};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kControlAeCompensationStep guest/hals/camera/vsock_camera_metadata.cpp /^const camera_metadata_rational_t kControlAeCompensationStep[] = {{0, 1}};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const camera_metadata_rational_t[]
+kControlAvailableModes guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kControlAvailableModes[] = {ANDROID_CONTROL_MODE_OFF,$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t[]
+kControlMaxRegions guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kControlMaxRegions[] = {\/*AE*\/ 0, \/*AWB*\/ 0, \/*AF*\/ 0};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kControlMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kControlMode = ANDROID_CONTROL_MODE_AUTO;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kControlPanelButtonCommand host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonCommand = "command";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kControlPanelButtonDeviceStates host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonDeviceStates = "device_states";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kControlPanelButtonHingeAngleValue host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonHingeAngleValue = "hinge_angle_value";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kControlPanelButtonIconName host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonIconName = "icon_name";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kControlPanelButtonLidSwitchOpen host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonLidSwitchOpen = "lid_switch_open";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kControlPanelButtonShellCommand host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonShellCommand = "shell_command";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kControlPanelButtonTitle host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kControlPanelButtonTitle = "title";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kCpus host/libs/config/cuttlefish_config.cpp /^static constexpr char kCpus[] = "cpus";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kCreateImage host/libs/config/data_image.cpp /^ enum class DataImageAction { kNoAction, kCreateImage, kResizeImage };$/;" e enum:cuttlefish::InitializeDataImageImpl::DataImageAction file:
+kCreatingOffer host/frontend/webrtc/lib/client_handler.h /^ kCreatingOffer,$/;" e enum:cuttlefish::webrtc_streaming::ClientHandler::State
+kCredentialField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kCredentialField = "credential";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kCredentialTypeField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kCredentialTypeField = "credentialType";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kCroppingType guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kCroppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kCrosvmBinary host/libs/config/cuttlefish_config.cpp /^static constexpr char kCrosvmBinary[] = "crosvm_binary";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kCrosvmVarEmptyDir host/libs/config/cuttlefish_config.h /^constexpr char kCrosvmVarEmptyDir[] = "\/var\/empty";$/;" v namespace:cuttlefish typeref:typename:char[]
+kCurHeaderVersion host/libs/allocd/utils.cpp /^constexpr uint16_t kCurHeaderVersion = 1;$/;" v namespace:cuttlefish typeref:typename:uint16_t
+kCustomActionButton host/libs/config/custom_actions.cpp /^const char* kCustomActionButton = "button";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionButtonCommand host/libs/config/custom_actions.cpp /^const char* kCustomActionButtonCommand = "command";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionButtonIconName host/libs/config/custom_actions.cpp /^const char* kCustomActionButtonIconName = "icon_name";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionButtonTitle host/libs/config/custom_actions.cpp /^const char* kCustomActionButtonTitle = "title";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionButtons host/libs/config/custom_actions.cpp /^const char* kCustomActionButtons = "buttons";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionDeviceStateHingeAngleValue host/libs/config/custom_actions.cpp /^const char* kCustomActionDeviceStateHingeAngleValue = "hinge_angle_value";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionDeviceStateLidSwitchOpen host/libs/config/custom_actions.cpp /^const char* kCustomActionDeviceStateLidSwitchOpen = "lid_switch_open";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionDeviceStates host/libs/config/custom_actions.cpp /^const char* kCustomActionDeviceStates = "device_states";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionServer host/libs/config/custom_actions.cpp /^const char* kCustomActionServer = "server";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomActionShellCommand host/libs/config/custom_actions.cpp /^const char* kCustomActionShellCommand = "shell_command";$/;" v namespace:cuttlefish::__anon12e4c76c0111 typeref:typename:const char *
+kCustomControlPanelButtonsField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kCustomControlPanelButtonsField = "custom_control_panel_buttons";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kCuttlefishConfigEnvVarName host/libs/config/cuttlefish_config.h /^constexpr char kCuttlefishConfigEnvVarName[] = "CUTTLEFISH_CONFIG_FILE";$/;" v namespace:cuttlefish typeref:typename:char[]
+kCuttlefishConfigurationInitError host/commands/run_cvd/runner_defs.h /^ kCuttlefishConfigurationInitError = 3,$/;" e enum:cuttlefish::RunnerExitCodes
+kCuttlefishConfigurationSaveError host/commands/run_cvd/runner_defs.h /^ kCuttlefishConfigurationSaveError = 7,$/;" e enum:cuttlefish::RunnerExitCodes
+kCuttlefishEnvPath host/libs/config/cuttlefish_config.cpp /^static constexpr char kCuttlefishEnvPath[] = "cuttlefish_env_path";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kCvdFileBuildId host/libs/config/fetcher_config.cpp /^const char* kCvdFileBuildId = "build_id";$/;" v namespace:cuttlefish::__anonf7286d770111 typeref:typename:const char *
+kCvdFileBuildTarget host/libs/config/fetcher_config.cpp /^const char* kCvdFileBuildTarget = "build_target";$/;" v namespace:cuttlefish::__anonf7286d770111 typeref:typename:const char *
+kCvdFileSource host/libs/config/fetcher_config.cpp /^const char* kCvdFileSource = "source";$/;" v namespace:cuttlefish::__anonf7286d770111 typeref:typename:const char *
+kCvdFiles host/libs/config/fetcher_config.cpp /^const char* kCvdFiles = "cvd_files";$/;" v namespace:cuttlefish::__anonf7286d770111 typeref:typename:const char *
+kDaemonizationError host/commands/run_cvd/runner_defs.h /^ kDaemonizationError = 8,$/;" e enum:cuttlefish::RunnerExitCodes
+kDataPolicy host/libs/config/cuttlefish_config.cpp /^static constexpr char kDataPolicy[] = "data_policy";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kDataPolicyAlwaysCreate host/libs/config/data_image.cpp /^const std::string kDataPolicyAlwaysCreate = "always_create";$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::string
+kDataPolicyCreateIfMissing host/libs/config/data_image.cpp /^const std::string kDataPolicyCreateIfMissing = "create_if_missing";$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::string
+kDataPolicyResizeUpTo host/libs/config/data_image.cpp /^const std::string kDataPolicyResizeUpTo= "resize_up_to";$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::string
+kDataPolicyUseExisting host/libs/config/data_image.cpp /^const std::string kDataPolicyUseExisting = "use_existing";$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::string
+kDataService host/commands/modem_simulator/modem_service.h /^ kDataService = 2,$/;" e enum:cuttlefish::ModemServiceType
+kDefaultEmergencyMode host/commands/modem_simulator/nvram_config.cpp /^const bool kDefaultEmergencyMode = false;$/;" v namespace:cuttlefish typeref:typename:const bool
+kDefaultLocation host/libs/allocd/utils.h /^constexpr char kDefaultLocation[] =$/;" v namespace:cuttlefish typeref:typename:char[]
+kDefaultModemTechnoloy host/commands/modem_simulator/nvram_config.cpp /^const int kDefaultModemTechnoloy = 0x10; \/\/ LTE$/;" v namespace:cuttlefish typeref:typename:const int
+kDefaultNetworkSelectionMode host/commands/modem_simulator/nvram_config.cpp /^const int kDefaultNetworkSelectionMode = 0; \/\/ AUTOMATIC$/;" v namespace:cuttlefish typeref:typename:const int
+kDefaultNumBootDevices host/libs/vm_manager/vm_manager.h /^ static const int kDefaultNumBootDevices = 2;$/;" m class:cuttlefish::vm_manager::VmManager typeref:typename:const int
+kDefaultNumHvcs host/libs/vm_manager/vm_manager.h /^ static const int kDefaultNumHvcs = 7;$/;" m class:cuttlefish::vm_manager::VmManager typeref:typename:const int
+kDefaultOperatorNumeric host/commands/modem_simulator/nvram_config.cpp /^const std::string kDefaultOperatorNumeric = "";$/;" v namespace:cuttlefish typeref:typename:const std::string
+kDefaultPinCode host/commands/modem_simulator/sim_service.cpp /^static const std::string kDefaultPinCode = "1234";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kDefaultPreferredNetworkMode host/commands/modem_simulator/nvram_config.cpp /^const int kDefaultPreferredNetworkMode = 0x13; \/\/ LTE | WCDMA | GSM$/;" v namespace:cuttlefish typeref:typename:const int
+kDefaultPukCode host/commands/modem_simulator/sim_service.cpp /^static const std::string kDefaultPukCode = "12345678";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kDefaultTargetBuildProp host/commands/assemble_cvd/super_image_mixer.cc /^const std::set<std::string> kDefaultTargetBuildProp = {$/;" v namespace:cuttlefish::__anonae6530d30111 typeref:typename:const std::set<std::string>
+kDefaultTargetImages host/commands/assemble_cvd/super_image_mixer.cc /^const std::set<std::string> kDefaultTargetImages = {$/;" v namespace:cuttlefish::__anonae6530d30111 typeref:typename:const std::set<std::string>
+kDefaultUuidPrefix host/libs/config/cuttlefish_config.h /^constexpr char kDefaultUuidPrefix[] = "699acfc4-c8c4-11e7-882b-5065f31dc1";$/;" v namespace:cuttlefish typeref:typename:char[]
+kDeprecatedBootCompleted host/libs/config/cuttlefish_config.cpp /^static constexpr char kDeprecatedBootCompleted[] = "deprecated_boot_completed";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kDeviceIdField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kDeviceIdField = "device_id";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kDeviceInfoField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kDeviceInfoField = "device_info";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kDeviceInfoType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kDeviceInfoType = "device_info";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kDeviceMessageType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kDeviceMessageType = "device_msg";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kDeviceName guest/hals/camera/vsock_camera_provider_2_7.cpp /^constexpr auto kDeviceName = "[email protected]\/external\/0";$/;" v namespace:android::hardware::camera::provider::V2_7::implementation::__anona6e38b1b0111 typeref:typename:auto
+kDisplayConfigs host/libs/config/cuttlefish_config.cpp /^static constexpr char kDisplayConfigs[] = "display_configs";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kDisplayHelp host/commands/assemble_cvd/flags.cc /^constexpr const char kDisplayHelp[] =$/;" v typeref:typename:const char[]
+kDisplayPowerModeChangedMessage host/libs/config/cuttlefish_config.h /^constexpr char kDisplayPowerModeChangedMessage[] =$/;" v namespace:cuttlefish typeref:typename:char[]
+kDisplaysField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kDisplaysField = "displays";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kDomToLinuxMapping host/frontend/webrtc/lib/keyboard.cpp /^static const std::map<std::string, uint16_t> kDomToLinuxMapping = {$/;" v typeref:typename:const std::map<std::string,uint16_t> file:
+kDpi host/libs/config/cuttlefish_config.cpp /^static constexpr char kDpi[] = "dpi";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kDpiField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kDpiField = "dpi";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kDynamicPartitions host/commands/assemble_cvd/misc_info.cc /^static const std::string kDynamicPartitions = "dynamic_partition_list";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kE2eTestFailed host/commands/run_cvd/runner_defs.h /^ kE2eTestFailed = 16,$/;" e enum:cuttlefish::RunnerExitCodes
+kEVDOSignalStrength host/commands/modem_simulator/network_service.cpp /^const std::pair<int, int> kEVDOSignalStrength = std::make_pair(4, 120);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kEbtablesLegacyName host/libs/allocd/alloc_utils.h /^constexpr char kEbtablesLegacyName[] = "ebtables-legacy";$/;" v namespace:cuttlefish typeref:typename:char[]
+kEbtablesName host/libs/allocd/alloc_utils.h /^constexpr char kEbtablesName[] = "ebtables";$/;" v namespace:cuttlefish typeref:typename:char[]
+kEdgeMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kEdgeMode = ANDROID_EDGE_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kEfiSystemPartition host/libs/image_aggregator/image_aggregator.h /^ kEfiSystemPartition,$/;" e enum:cuttlefish::ImagePartitionType
+kEglLib host/libs/graphics_detector/graphics_detector.cpp /^constexpr const char kEglLib[] = "libEGL.so.1";$/;" v namespace:cuttlefish::__anon29a199ff0111 typeref:typename:const char[]
+kEmergencyMode host/commands/modem_simulator/nvram_config.cpp /^const char* kEmergencyMode = "emergency_mode";$/;" v namespace:cuttlefish typeref:typename:const char *
+kEnableAudio host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableAudio[] = "enable_audio";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEnableGnssGrpcProxy host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableGnssGrpcProxy[] = "enable_gnss_grpc_proxy";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEnableMetrics host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableMetrics[] = "enable_metrics";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEnableMinimalMode host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableMinimalMode[] = "enable_minimal_mode";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEnableSandbox host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableSandbox[] = "enable_sandbox";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEnableVehicleHalServer host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableVehicleHalServer[] = "enable_vehicle_hal_server";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEnableWebRTC host/libs/config/cuttlefish_config.cpp /^static constexpr char kEnableWebRTC[] = "enable_webrtc";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEntries host/commands/secure_env/fragile_tpm_storage.cpp /^static constexpr char kEntries[] = "entries";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kEntries host/commands/secure_env/insecure_fallback_storage.cpp /^static constexpr char kEntries[] = "entries";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kError host/commands/run_cvd/runner_defs.h /^ kError = 'E',$/;" e enum:cuttlefish::LauncherResponse
+kEthernetConnectedMessage host/libs/config/cuttlefish_config.h /^constexpr char kEthernetConnectedMessage[] =$/;" v namespace:cuttlefish typeref:typename:char[]
+kEthernetIp host/libs/allocd/alloc_utils.h /^constexpr char kEthernetIp[] = "192.168.98";$/;" v namespace:cuttlefish typeref:typename:char[]
+kEthernetTapName host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kEthernetTapName[] = "ethernet_tap_name";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kExposureCompensation guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kExposureCompensation = 0;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kExtraBootconfigArgs host/libs/config/cuttlefish_config.cpp /^static constexpr char kExtraBootconfigArgs[] = "extra_bootconfig_args";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kExtraKernelCmdline host/libs/config/cuttlefish_config.cpp /^static constexpr char kExtraKernelCmdline[] = "extra_kernel_cmdline";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kFaceDetectMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kFaceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kFacing guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kFacing = ANDROID_LENS_FACING_EXTERNAL;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kFailed host/frontend/webrtc/lib/client_handler.h /^ kFailed,$/;" e enum:cuttlefish::webrtc_streaming::ClientHandler::State
+kFetcherConfigFile host/commands/assemble_cvd/assemble_cvd.cc /^std::string kFetcherConfigFile = "fetcher_config.json";$/;" v namespace:cuttlefish::__anon1e335d460111 typeref:typename:std::string
+kFinalResponseError host/commands/modem_simulator/unittest/service_test.cpp /^ const std::vector<std::string> kFinalResponseError = {$/;" m class:ModemServiceTest typeref:typename:const std::vector<std::string> file:
+kFinalResponseSuccess host/commands/modem_simulator/unittest/service_test.cpp /^ const std::vector<std::string> kFinalResponseSuccess = {"OK", "CONNECT", "> "};$/;" m class:ModemServiceTest typeref:typename:const std::vector<std::string> file:
+kFlagConsumed common/libs/utils/flag_parser.h /^ kFlagConsumed, \/* Flag processed; consume one argument. *\/$/;" e enum:cuttlefish::Flag::FlagProcessResult
+kFlagConsumedWithFollowing common/libs/utils/flag_parser.h /^ kFlagConsumedWithFollowing, \/* Flag processed; consume 2 arguments. *\/$/;" e enum:cuttlefish::Flag::FlagProcessResult
+kFlagConsumesFollowing common/libs/utils/flag_parser.h /^ kFlagConsumesFollowing,$/;" e enum:cuttlefish::FlagAliasMode
+kFlagError common/libs/utils/flag_parser.h /^ kFlagError,$/;" e enum:cuttlefish::Flag::FlagProcessResult
+kFlagExact common/libs/utils/flag_parser.h /^ kFlagExact,$/;" e enum:cuttlefish::FlagAliasMode
+kFlagPrefix common/libs/utils/flag_parser.h /^ kFlagPrefix,$/;" e enum:cuttlefish::FlagAliasMode
+kFlagSkip common/libs/utils/flag_parser.h /^ kFlagSkip, \/* Flag skipped; consume no arguments. *\/$/;" e enum:cuttlefish::Flag::FlagProcessResult
+kFlags host/libs/config/fetcher_config.cpp /^const char* kFlags = "flags";$/;" v namespace:cuttlefish::__anonf7286d770111 typeref:typename:const char *
+kFlashInfo guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kFlashInfo = ANDROID_FLASH_INFO_AVAILABLE_FALSE;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kFlashMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kFlashMode = ANDROID_FLASH_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kFocusDistanceCalibration guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kFocusDistanceCalibration =$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kFooterSizeBytes host/commands/modem_simulator/sim_service.cpp /^constexpr int kFooterSizeBytes = 14;$/;" v namespace:cuttlefish typeref:typename:int
+kForwardPath host/frontend/webrtc_operator/server.cpp /^const constexpr auto kForwardPath = "\/forward";$/;" v namespace:__anon477f946a0111 typeref:typename:const auto
+kForwardType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kForwardType = "forward";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kFragments host/libs/config/cuttlefish_config.cpp /^static constexpr char kFragments[] = "fragments";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGSMSignalStrength host/commands/modem_simulator/network_service.cpp /^const std::pair<int, int> kGSMSignalStrength = std::make_pair(4, 30);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kGdbPort host/libs/config/cuttlefish_config.cpp /^static constexpr char kGdbPort[] = "gdb_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGetNodes host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kGetNodes = 7,$/;" e enum:cuttlefish::WmediumdMessageType
+kGlLib host/libs/graphics_detector/graphics_detector.cpp /^constexpr const char kGlLib[] = "libOpenGL.so.0";$/;" v namespace:cuttlefish::__anon29a199ff0111 typeref:typename:const char[]
+kGles1Lib host/libs/graphics_detector/graphics_detector.cpp /^constexpr const char kGles1Lib[] = "libGLESv1_CM.so.1";$/;" v namespace:cuttlefish::__anon29a199ff0111 typeref:typename:const char[]
+kGles2Lib host/libs/graphics_detector/graphics_detector.cpp /^constexpr const char kGles2Lib[] = "libGLESv2.so.2";$/;" v namespace:cuttlefish::__anon29a199ff0111 typeref:typename:const char[]
+kGnssFilePath host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kGnssFilePath[] = "gnss_file_path";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGnssGrpcProxyServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kGnssGrpcProxyServerPort[] =$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGoogleDynamicPartitions host/commands/assemble_cvd/misc_info.cc /^static constexpr const char* kGoogleDynamicPartitions =$/;" v namespace:cuttlefish typeref:typename:const char * file:
+kGpuCaptureBinary host/libs/config/cuttlefish_config.cpp /^static constexpr char kGpuCaptureBinary[] = "gpu_capture_binary";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGpuMode host/libs/config/cuttlefish_config.cpp /^static constexpr char kGpuMode[] = "gpu_mode";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGpuModeAuto host/libs/config/cuttlefish_config.cpp /^const char* const kGpuModeAuto = "auto";$/;" v namespace:cuttlefish typeref:typename:const char * const
+kGpuModeDrmVirgl host/libs/config/cuttlefish_config.cpp /^const char* const kGpuModeDrmVirgl = "drm_virgl";$/;" v namespace:cuttlefish typeref:typename:const char * const
+kGpuModeGfxStream host/libs/config/cuttlefish_config.cpp /^const char* const kGpuModeGfxStream = "gfxstream";$/;" v namespace:cuttlefish typeref:typename:const char * const
+kGpuModeGuestSwiftshader host/libs/config/cuttlefish_config.cpp /^const char* const kGpuModeGuestSwiftshader = "guest_swiftshader";$/;" v namespace:cuttlefish typeref:typename:const char * const
+kGreenColor host/commands/run_cvd/reporting.cpp /^static constexpr char kGreenColor[] = "\\033[1;32m";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kGrubBlobTable host/libs/config/data_image.cpp /^const std::pair<std::string, std::string> kGrubBlobTable[] = {$/;" v namespace:cuttlefish::__anoned36ed9d0111 typeref:typename:const std::pair<std::string,std::string>[]
+kGuestAuditSecurity host/libs/config/cuttlefish_config.cpp /^const char* kGuestAuditSecurity = "guest_audit_security";$/;" v namespace:cuttlefish typeref:typename:const char *
+kGuestBootCompleted host/commands/run_cvd/boot_state_machine.cc /^ static const int kGuestBootCompleted = 1 << 0;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:const int file:
+kGuestBootFailed host/commands/run_cvd/boot_state_machine.cc /^ static const int kGuestBootFailed = 1 << 1;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:const int file:
+kGuestEnforceSecurity host/libs/config/cuttlefish_config.cpp /^static constexpr char kGuestEnforceSecurity[] = "guest_enforce_security";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kHalAbort host/libs/confui/server_common.h /^ kHalAbort,$/;" e enum:cuttlefish::confui::FsmInput
+kHalFormats guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kHalFormats[] = {HAL_PIXEL_FORMAT_BLOB,$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kHalStart host/libs/confui/server_common.h /^ kHalStart,$/;" e enum:cuttlefish::confui::FsmInput
+kHalStop host/libs/confui/server_common.h /^ kHalStop,$/;" e enum:cuttlefish::confui::FsmInput
+kHalUnknown host/libs/confui/server_common.h /^ kHalUnknown$/;" e enum:cuttlefish::confui::FsmInput
+kHandle host/commands/secure_env/fragile_tpm_storage.cpp /^static constexpr char kHandle[] = "handle";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kHardwareField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kHardwareField = "hardware";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kHardwarelevel guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kHardwarelevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kHelpBin host/commands/cvd/main.cc /^constexpr char kHelpBin[] = "help_placeholder"; \/\/ Unused, prints kHelpMessage.$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:char[]
+kHelpMessage host/commands/cvd/main.cc /^constexpr char kHelpMessage[] = R"(Cuttlefish Virtual Device (CVD) CLI.$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:char[]
+kHostBugreportBin host/commands/cvd/main.cc /^constexpr char kHostBugreportBin[] = "cvd_internal_host_bugreport";$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:char[]
+kHostPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kHostPort[] = "adb_host_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kHostToolsVersion host/libs/config/cuttlefish_config.cpp /^static constexpr char kHostToolsVersion[] = "host_tools_version";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kHotPixelMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kHotPixelMode = ANDROID_HOT_PIXEL_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kInSession host/libs/confui/server_common.h /^ kInSession = 2,$/;" e enum:cuttlefish::confui::MainLoopState
+kIncorrectUTF8 common/libs/confui/protocol_types.h /^ static constexpr char kIncorrectUTF8[] = "msg_incorrect_utf8";$/;" m struct:cuttlefish::confui::HostError typeref:typename:char[]
+kInformationalPatterns host/commands/kernel_log_monitor/kernel_log_server.cc /^} kInformationalPatterns[] = {$/;" v namespace:__anonfa7764770111 typeref:struct:__anonfa7764770111::__anonfa7764770208[]
+kInfraConfigPath host/frontend/webrtc_operator/server.cpp /^const constexpr auto kInfraConfigPath = "\/infra_config";$/;" v namespace:__anon477f946a0111 typeref:typename:const auto
+kInit host/libs/confui/server_common.h /^ kInit = 1,$/;" e enum:cuttlefish::confui::MainLoopState
+kInitRamFsConcatError host/commands/run_cvd/runner_defs.h /^ kInitRamFsConcatError = 22,$/;" e enum:cuttlefish::RunnerExitCodes
+kInitramfsImg host/commands/assemble_cvd/assemble_cvd.cc /^const std::string kInitramfsImg = "initramfs.img";$/;" v namespace:cuttlefish::__anon1e335d460111 typeref:typename:const std::string
+kInputChannelLabel host/frontend/webrtc/lib/client_handler.cpp /^static constexpr auto kInputChannelLabel = "input-channel";$/;" v namespace:cuttlefish::webrtc_streaming::__anond0fc42ea0111 typeref:typename:auto file:
+kInsecure host/frontend/webrtc/lib/ws_connection.h /^ kInsecure,$/;" e enum:WsConnection::Security
+kInstanceDir host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kInstanceDir[] = "instance_dir";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kInstanceDirCreationError host/commands/run_cvd/runner_defs.h /^ kInstanceDirCreationError = 4,$/;" e enum:cuttlefish::RunnerExitCodes
+kInstances host/commands/modem_simulator/nvram_config.cpp /^const char* kInstances = "instances";$/;" v namespace:cuttlefish typeref:typename:const char *
+kInstances host/libs/config/cuttlefish_config.cpp /^const char* kInstances = "instances";$/;" v namespace:cuttlefish::__anon2cec80f10111 typeref:typename:const char *
+kInstances host/libs/config/cuttlefish_config_instance.cpp /^const char* kInstances = "instances";$/;" v namespace:cuttlefish::__anon3442b2250111 typeref:typename:const char *
+kInterfaceDown guest/hals/ril/reference-ril/reference-ril.c /^ kInterfaceDown,$/;" e enum:InterfaceState file:
+kInterfaceUp guest/hals/ril/reference-ril/reference-ril.c /^ kInterfaceUp,$/;" e enum:InterfaceState file:
+kInternalDirName host/libs/config/cuttlefish_config.h /^constexpr char kInternalDirName[] = "internal";$/;" v namespace:cuttlefish typeref:typename:char[]
+kInvalid host/libs/confui/server_common.h /^ kInvalid = 9$/;" e enum:cuttlefish::confui::MainLoopState
+kInvalid host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kInvalid = 0,$/;" e enum:cuttlefish::WmediumdMessageType
+kInvalidHostConfiguration host/commands/metrics/metrics_defs.h /^ kInvalidHostConfiguration=2,$/;" e enum:cuttlefish::MetricsExitCodes
+kInvalidHostConfiguration host/commands/run_cvd/runner_defs.h /^ kInvalidHostConfiguration = 2,$/;" e enum:cuttlefish::RunnerExitCodes
+kIsTouchField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kIsTouchField = "is_touch";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kJpegAvailableThumbnailSizes guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kJpegAvailableThumbnailSizes[] = {0, 0, 240, 180};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kJpegOrientation guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kJpegOrientation = 0;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kJpegQuality guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kJpegQuality = 90;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kKernelDecompressError host/commands/run_cvd/runner_defs.h /^ kKernelDecompressError = 17,$/;" e enum:cuttlefish::RunnerExitCodes
+kKernelDefaultPath host/commands/assemble_cvd/assemble_cvd.cc /^const std::string kKernelDefaultPath = "kernel";$/;" v namespace:cuttlefish::__anon1e335d460111 typeref:typename:const std::string
+kKernelLoadedMessage host/libs/config/cuttlefish_config.h /^constexpr char kKernelLoadedMessage[] = "] Linux version";$/;" v namespace:cuttlefish typeref:typename:char[]
+kKey host/commands/secure_env/fragile_tpm_storage.cpp /^static constexpr char kKey[] = "key";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kKey host/commands/secure_env/insecure_fallback_storage.cpp /^static constexpr char kKey[] = "key";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kKeyValuePair host/commands/kernel_log_monitor/kernel_log_server.cc /^ kKeyValuePair, \/\/ <stage> <key>=<value>$/;" e enum:__anonfa7764770111::EventFormat file:
+kKeyboardServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kKeyboardServerPort[] = "keyboard_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kKgdb host/libs/config/cuttlefish_config.cpp /^static constexpr char kKgdb[] = "kgdb";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kKnownMissingAidl tests/hal/hal_implementation_test.cpp /^static const std::set<VersionedAidlPackage> kKnownMissingAidl = {$/;" v typeref:typename:const std::set<VersionedAidlPackage> file:
+kKnownMissingHidl tests/hal/hal_implementation_test.cpp /^static const std::set<std::string> kKnownMissingHidl = {$/;" v typeref:typename:const std::set<std::string> file:
+kLTESignalStrength host/commands/modem_simulator/network_service.cpp /^const std::pair<int, int> kLTESignalStrength = std::make_pair(4, 30);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kLensMinFocusDistance guest/hals/camera/vsock_camera_metadata.cpp /^const float kLensMinFocusDistance = 0.0f;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const float
+kLensShadingMapMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kLensShadingMapMode =$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kLinuxDmabufVersion host/libs/wayland/wayland_dmabuf.cpp /^constexpr uint32_t kLinuxDmabufVersion = 2;$/;" v namespace:wayland::__anon8f5be4990111 typeref:typename:uint32_t
+kLinuxFilesystem host/libs/image_aggregator/image_aggregator.h /^ kLinuxFilesystem = 0,$/;" e enum:cuttlefish::ImagePartitionType
+kListDevicesUriPath host/frontend/webrtc_operator/server.cpp /^constexpr auto kListDevicesUriPath = "\/devices";$/;" v namespace:__anon477f946a0111 typeref:typename:auto
+kLocalChannelId host/frontend/webrtc_operator/assets/js/adb.js /^const kLocalChannelId = 666;$/;" C
+kLogAlignment host/frontend/webrtc/cvd_video_frame_buffer.cpp /^constexpr int kLogAlignment = 6; \/\/ multiple of 2^6$/;" v namespace:cuttlefish::__anonfb30483e0111 typeref:typename:int
+kLogcatSerialMode host/libs/config/cuttlefish_config.h /^constexpr char kLogcatSerialMode[] = "serial";$/;" v namespace:cuttlefish typeref:typename:char[]
+kLogcatServerError host/commands/run_cvd/runner_defs.h /^ kLogcatServerError = 18,$/;" e enum:cuttlefish::RunnerExitCodes
+kLogcatVsockMode host/libs/config/cuttlefish_config.h /^constexpr char kLogcatVsockMode[] = "vsock";$/;" v namespace:cuttlefish typeref:typename:char[]
+kMacAddrStringSize host/commands/wmediumd_control/main.cpp /^const int kMacAddrStringSize = 17;$/;" v typeref:typename:const int
+kMax host/libs/confui/cbor.h /^ const std::uint32_t kMax = static_cast<std::uint32_t>(MessageSize::MAX);$/;" m class:cuttlefish::confui::Cbor typeref:typename:const std::uint32_t
+kMaxCommandLength host/commands/modem_simulator/channel_monitor.cpp /^constexpr int32_t kMaxCommandLength = 4096;$/;" v namespace:cuttlefish typeref:typename:int32_t
+kMaxDisks host/libs/vm_manager/vm_manager.h /^ static const int kMaxDisks = 3;$/;" m class:cuttlefish::vm_manager::VmManager typeref:typename:const int
+kMaxFaceCount guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kMaxFaceCount = 0;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kMaxIfaceNameId host/libs/allocd/alloc_utils.h /^constexpr uint32_t kMaxIfaceNameId = 63;$/;" v namespace:cuttlefish typeref:typename:uint32_t
+kMaxLatency guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kMaxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kMaxLogicalChannels host/commands/modem_simulator/sim_service.cpp /^constexpr int kMaxLogicalChannels = 3;$/;" v namespace:cuttlefish typeref:typename:int
+kMaxMessageLength common/libs/confui/protocol_types.h /^constexpr const ssize_t kMaxMessageLength = packet::kMaxPayloadLength;$/;" v namespace:cuttlefish::confui typeref:typename:const ssize_t
+kMaxNumberSizeBytes host/commands/modem_simulator/sim_service.cpp /^constexpr int kMaxNumberSizeBytes = 11;$/;" v namespace:cuttlefish typeref:typename:int
+kMaxPacketSize common/frontend/socket_vsock_proxy/main.cpp /^constexpr std::size_t kMaxPacketSize = 8192;$/;" v typeref:typename:std::size_t
+kMaxPayloadLength common/libs/confui/packet_types.h /^constexpr const ssize_t kMaxPayloadLength = 10000;$/;" v namespace:cuttlefish::confui::packet typeref:typename:const ssize_t
+kMemoryMb host/libs/config/cuttlefish_config.cpp /^static constexpr char kMemoryMb[] = "memory_mb";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kMessageTooLongError common/libs/confui/protocol_types.h /^ static constexpr char kMessageTooLongError[] = "msg_too_long_error";$/;" m struct:cuttlefish::confui::HostError typeref:typename:char[]
+kMetricsBinary host/libs/config/cuttlefish_config.cpp /^static constexpr char kMetricsBinary[] = "metrics_binary";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kMetricsError host/commands/metrics/metrics_defs.h /^ kMetricsError=1,$/;" e enum:cuttlefish::MetricsExitCodes
+kMinHeaderVersion host/libs/allocd/utils.cpp /^constexpr uint16_t kMinHeaderVersion = 1;$/;" v namespace:cuttlefish typeref:typename:uint16_t
+kMiscInfoPath host/commands/assemble_cvd/super_image_mixer.cc /^const std::string kMiscInfoPath = "META\/misc_info.txt";$/;" v namespace:cuttlefish::__anonae6530d30111 typeref:typename:const std::string
+kMiscService host/commands/modem_simulator/modem_service.h /^ kMiscService = 7,$/;" e enum:cuttlefish::ModemServiceType
+kMobileBridgeName host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kMobileBridgeName[] = "mobile_bridge_name";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kMobileIp host/libs/allocd/alloc_utils.h /^constexpr char kMobileIp[] = "192.168.97";$/;" v namespace:cuttlefish typeref:typename:char[]
+kMobileNetworkConnectedMessage host/libs/config/cuttlefish_config.h /^constexpr char kMobileNetworkConnectedMessage[] =$/;" v namespace:cuttlefish typeref:typename:char[]
+kMobileTapName host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kMobileTapName[] = "mobile_tap_name";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kMode host/libs/config/adb/config.cpp /^ static constexpr char kMode[] = "mode";$/;" m class:cuttlefish::__anone963d72d0111::AdbConfigFragmentImpl typeref:typename:char[] file:
+kModemSimulatorId host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kModemSimulatorId[] = "modem_simulator_host_id";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kModemSimulatorInstanceNumber host/libs/config/cuttlefish_config.cpp /^static constexpr char kModemSimulatorInstanceNumber[] =$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kModemSimulatorPorts host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kModemSimulatorPorts[] = "modem_simulator_ports";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kModemSimulatorServerError host/commands/run_cvd/runner_defs.h /^ kModemSimulatorServerError = 25,$/;" e enum:cuttlefish::RunnerExitCodes
+kModemSimulatorSimType host/libs/config/cuttlefish_config.cpp /^static constexpr char kModemSimulatorSimType[] = "modem_simulator_sim_type";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kModemTechnoloy host/commands/modem_simulator/nvram_config.cpp /^const char* kModemTechnoloy = "modem_technoloy";$/;" v namespace:cuttlefish typeref:typename:const char *
+kMonitorCreationFailed host/commands/run_cvd/runner_defs.h /^ kMonitorCreationFailed = 13,$/;" e enum:cuttlefish::RunnerExitCodes
+kNRSignalStrength host/commands/modem_simulator/network_service.cpp /^const std::pair<int, int> kNRSignalStrength = std::make_pair(45, 135);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kNetlink host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kNetlink = 4,$/;" e enum:cuttlefish::WmediumdMessageType
+kNetmask host/libs/allocd/resource.h /^ static constexpr char kNetmask[] = "\/24";$/;" m class:cuttlefish::EthernetIface typeref:typename:char[]
+kNetmask host/libs/allocd/resource.h /^ static constexpr char kNetmask[] = "\/30";$/;" m class:cuttlefish::MobileIface typeref:typename:char[]
+kNetworkSelectionMode host/commands/modem_simulator/nvram_config.cpp /^const char* kNetworkSelectionMode = "network_selection_mode";$/;" v namespace:cuttlefish typeref:typename:const char *
+kNetworkService host/commands/modem_simulator/modem_service.h /^ kNetworkService = 1,$/;" e enum:cuttlefish::ModemServiceType
+kNew host/frontend/webrtc/lib/client_handler.h /^ kNew,$/;" e enum:cuttlefish::webrtc_streaming::ClientHandler::State
+kNo host/libs/config/cuttlefish_config.h /^ kNo,$/;" e enum:cuttlefish::CuttlefishConfig::Answer
+kNoAction host/libs/config/data_image.cpp /^ enum class DataImageAction { kNoAction, kCreateImage, kResizeImage };$/;" e enum:cuttlefish::InitializeDataImageImpl::DataImageAction file:
+kNoiseReductionMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kNoiseReductionMode = ANDROID_NOISE_REDUCTION_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kOemHookEnabled guest/hals/ril/reference-libril/ril_service.cpp /^constexpr bool kOemHookEnabled = false;$/;" v typeref:typename:bool
+kOemHookEnabled guest/hals/ril/reference-libril/ril_service.cpp /^constexpr bool kOemHookEnabled = true;$/;" v typeref:typename:bool
+kOperationTableSize host/commands/secure_env/secure_env.cpp /^constexpr size_t kOperationTableSize = 16;$/;" v namespace:cuttlefish::__anon0a6d9b510111 typeref:typename:size_t
+kOperatorNumeric host/commands/modem_simulator/nvram_config.cpp /^const char* kOperatorNumeric = "operator_numeric";$/;" v namespace:cuttlefish typeref:typename:const char *
+kOpticalStabilizationMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kOpticalStabilizationMode =$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kOrientation guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kOrientation = 0;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kPartialResultCount guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kPartialResultCount = 1;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kPayloadField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kPayloadField = "payload";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kPipeIOError host/commands/run_cvd/runner_defs.h /^ kPipeIOError = 10,$/;" e enum:cuttlefish::RunnerExitCodes
+kPlanePadding host/frontend/webrtc/cvd_video_frame_buffer.cpp /^constexpr int kPlanePadding = 1024;$/;" v namespace:cuttlefish::__anonfb30483e0111 typeref:typename:int
+kPollPath host/frontend/webrtc_operator/server.cpp /^const constexpr auto kPollPath = "\/poll_messages";$/;" v namespace:__anon477f946a0111 typeref:typename:const auto
+kPollType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kPollType = "client_poll";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kPowerwash host/commands/run_cvd/runner_defs.h /^ kPowerwash = 'P',$/;" e enum:cuttlefish::LauncherAction
+kPreferredNetworkMode host/commands/modem_simulator/nvram_config.cpp /^const char* kPreferredNetworkMode = "preferred_network_mode";$/;" v namespace:cuttlefish typeref:typename:const char *
+kPrioFilesCleanupError host/commands/run_cvd/runner_defs.h /^ kPrioFilesCleanupError = 5,$/;" e enum:cuttlefish::RunnerExitCodes
+kProcessGroupError host/commands/run_cvd/runner_defs.h /^ kProcessGroupError = 12,$/;" e enum:cuttlefish::RunnerExitCodes
+kProtectedVm host/libs/config/cuttlefish_config.cpp /^static constexpr char kProtectedVm[] = "protected_vm";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kProtocolName host/frontend/webrtc/lib/ws_connection.cpp /^constexpr char kProtocolName[] = "cf-webrtc-device";$/;" v namespace:__anon14ee93270111 typeref:typename:char[]
+kProtocols host/frontend/webrtc/lib/ws_connection.cpp /^const struct lws_protocols kProtocols[2] = {$/;" v namespace:__anon14ee93270111 typeref:typename:const struct lws_protocols[2]
+kQemuBinaryDir host/libs/config/cuttlefish_config.cpp /^static constexpr char kQemuBinaryDir[] = "qemu_binary_dir";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kQemuVncServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kQemuVncServerPort[] = "qemu_vnc_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRead host/commands/modem_simulator/sms_service.h /^ enum SmsStatus { kUnread = 0, kRead = 1, kUnsent = 2, kSent = 3 };$/;" e enum:cuttlefish::SmsService::SmsMessage::SmsStatus
+kRecordScreen host/libs/config/cuttlefish_config.cpp /^static constexpr char kRecordScreen[] = "record_screen";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRecvFlags host/libs/allocd/utils.h /^static constexpr int kRecvFlags = 0;$/;" v namespace:cuttlefish typeref:typename:int
+kRefreshRateHz host/libs/config/cuttlefish_config.cpp /^static constexpr char kRefreshRateHz[] = "refresh_rate_hz";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRegister host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kRegister = 2,$/;" e enum:cuttlefish::WmediumdMessageType
+kRegisterDeviceUriPath host/frontend/webrtc_operator/server.cpp /^constexpr auto kRegisterDeviceUriPath = "\/register_device";$/;" v namespace:__anon477f946a0111 typeref:typename:auto
+kRegisterType host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kRegisterType = "register";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kRegistrationRetries host/frontend/webrtc/lib/streamer.cpp /^constexpr int kRegistrationRetries = 3;$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:int
+kReloadConfig host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kReloadConfig = 9,$/;" e enum:cuttlefish::WmediumdMessageType
+kReloadCurrentConfig host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kReloadCurrentConfig = 10,$/;" e enum:cuttlefish::WmediumdMessageType
+kRemotePortRange host/commands/modem_simulator/modem_service.cpp /^const std::pair<int, int> ModemService::kRemotePortRange =$/;" m class:cuttlefish::ModemService typeref:typename:const std::pair<int,int>
+kRemotePortRange host/commands/modem_simulator/modem_service.h /^ static const std::pair<int, int> kRemotePortRange;$/;" m class:cuttlefish::ModemService typeref:typename:const std::pair<int,int>
+kRequestMaxNumInputStreams guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kRequestMaxNumInputStreams = 0;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kRequestMaxNumOutputStreams guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kRequestMaxNumOutputStreams[] = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kRequestPipelineMaxDepth guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kRequestPipelineMaxDepth = 4;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kRequestSequenceNumber common/libs/net/netlink_request.cpp /^uint32_t kRequestSequenceNumber = 0;$/;" v namespace:cuttlefish::__anonf2157dfa0111 typeref:typename:uint32_t
+kResetColor host/commands/run_cvd/reporting.cpp /^static constexpr char kResetColor[] = "\\033[0m";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kResizeImage host/libs/config/data_image.cpp /^ enum class DataImageAction { kNoAction, kCreateImage, kResizeImage };$/;" e enum:cuttlefish::InitializeDataImageImpl::DataImageAction file:
+kRestart host/commands/run_cvd/runner_defs.h /^ kRestart = 'R',$/;" e enum:cuttlefish::LauncherAction
+kRestartSubprocesses host/libs/config/cuttlefish_config.cpp /^static constexpr char kRestartSubprocesses[] = "restart_subprocesses";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRetries common/libs/device_config/guest_device_config.cpp /^static constexpr int kRetries = 5;$/;" v namespace:cuttlefish::__anon4ec25d870111 typeref:typename:int file:
+kRetry host/frontend/webrtc/lib/ws_connection.cpp /^const lws_retry_bo_t kRetry = {$/;" v namespace:__anon14ee93270111 typeref:typename:const lws_retry_bo_t
+kRetryDelaySeconds common/libs/device_config/guest_device_config.cpp /^static constexpr int kRetryDelaySeconds = 5;$/;" v namespace:cuttlefish::__anon4ec25d870111 typeref:typename:int file:
+kRetryFirstIntervalMs host/frontend/webrtc/lib/streamer.cpp /^constexpr int kRetryFirstIntervalMs = 1000;$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:int
+kRilDns host/libs/config/cuttlefish_config.cpp /^static constexpr char kRilDns[] = "ril_dns";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRootcanalConfigFile host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kRootcanalConfigFile[] = "rootcanal_config_file";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRootcanalDefaultCommandsFile host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kRootcanalDefaultCommandsFile[] =$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRootcanalHciPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kRootcanalHciPort[] = "rootcanal_hci_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRootcanalLinkPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kRootcanalLinkPort[] = "rootcanal_link_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRootcanalTestPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kRootcanalTestPort[] = "rootcanal_test_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRtpTicksPerMs host/frontend/webrtc/lib/local_recorder.cpp /^constexpr double kRtpTicksPerMs = kRtpTicksPerSecond \/ 1000.;$/;" v namespace:cuttlefish::webrtc_streaming typeref:typename:double
+kRtpTicksPerNs host/frontend/webrtc/lib/local_recorder.cpp /^constexpr double kRtpTicksPerNs = kRtpTicksPerUs \/ 1000.;$/;" v namespace:cuttlefish::webrtc_streaming typeref:typename:double
+kRtpTicksPerSecond host/frontend/webrtc/lib/local_recorder.cpp /^constexpr double kRtpTicksPerSecond = 90000.;$/;" v namespace:cuttlefish::webrtc_streaming typeref:typename:double
+kRtpTicksPerUs host/frontend/webrtc/lib/local_recorder.cpp /^constexpr double kRtpTicksPerUs = kRtpTicksPerMs \/ 1000.;$/;" v namespace:cuttlefish::webrtc_streaming typeref:typename:double
+kRunAsDaemon host/libs/config/cuttlefish_config.cpp /^static constexpr char kRunAsDaemon[] = "run_as_daemon";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRunModemSimulator host/libs/config/cuttlefish_config.cpp /^static constexpr char kRunModemSimulator[] = "enable_modem_simulator";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kRunnerBin host/commands/start/main.cc /^std::string kRunnerBin = cuttlefish::HostBinaryPath("run_cvd");$/;" v namespace:__anon8e1e78490111 typeref:typename:std::string
+kSRIAndMMSIndicator host/commands/modem_simulator/pdu_parser.cpp /^static const std::string kSRIAndMMSIndicator = "24"; \/* SRI is 1 && MMS is 1*\/$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kScalerAvailableMaxDigitalZoom guest/hals/camera/vsock_camera_metadata.cpp /^const float kScalerAvailableMaxDigitalZoom[] = {1};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const float[]
+kScreenChangedMessage host/libs/config/cuttlefish_config.h /^constexpr char kScreenChangedMessage[] = "VIRTUAL_DEVICE_SCREEN_CHANGED";$/;" v namespace:cuttlefish typeref:typename:char[]
+kSeatVersion host/libs/wayland/wayland_seat.cpp /^constexpr const uint32_t kSeatVersion = 6;$/;" v namespace:wayland::__anona9f16c970111 typeref:typename:const uint32_t
+kSeccompDir host/commands/assemble_cvd/flags.cc /^static const std::string kSeccompDir = std::string("usr\/share\/crosvm\/") +$/;" v typeref:typename:const std::string file:
+kSeccompPolicyDir host/libs/config/cuttlefish_config.cpp /^static constexpr char kSeccompPolicyDir[] = "seccomp_policy_dir";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSecureHals host/libs/config/cuttlefish_config.cpp /^static constexpr char kSecureHals[] = "secure_hals";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSelectError host/commands/modem_simulator/channel_monitor.h /^ kSelectError = 1,$/;" e enum:cuttlefish::ModemSimulatorExitCodes
+kSendFlags host/libs/allocd/utils.h /^static constexpr int kSendFlags = 0;$/;" v namespace:cuttlefish typeref:typename:int
+kSent host/commands/modem_simulator/sms_service.h /^ enum SmsStatus { kUnread = 0, kRead = 1, kUnsent = 2, kSent = 3 };$/;" e enum:cuttlefish::SmsService::SmsMessage::SmsStatus
+kSerialNumber host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kSerialNumber[] = "serial_number";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kServerError host/commands/modem_simulator/channel_monitor.h /^ kServerError = 2,$/;" e enum:cuttlefish::ModemSimulatorExitCodes
+kServerError host/commands/run_cvd/runner_defs.h /^ kServerError = 14,$/;" e enum:cuttlefish::RunnerExitCodes
+kServersField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kServersField = "ice_servers";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kSessionId host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kSessionId[] = "session_id";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSetControl host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kSetControl = 5,$/;" e enum:cuttlefish::WmediumdMessageType
+kSetSnr host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kSetSnr = 8,$/;" e enum:cuttlefish::WmediumdMessageType
+kSetupWizardMode host/libs/config/cuttlefish_config.cpp /^static constexpr char kSetupWizardMode[] = "setupwizard_mode";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSharedDirName host/libs/config/cuttlefish_config.h /^constexpr char kSharedDirName[] = "shared";$/;" v namespace:cuttlefish typeref:typename:char[]
+kSigServerAddress host/libs/config/cuttlefish_config.cpp /^static constexpr char kSigServerAddress[] = "webrtc_sig_server_addr";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSigServerHeadersPath host/libs/config/cuttlefish_config.cpp /^static constexpr char kSigServerHeadersPath[] =$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSigServerPath host/libs/config/cuttlefish_config.cpp /^static constexpr char kSigServerPath[] = "webrtc_sig_server_path";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSigServerPort host/libs/config/cuttlefish_config.cpp /^static constexpr char kSigServerPort[] = "webrtc_sig_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSigServerSecure host/libs/config/cuttlefish_config.cpp /^static constexpr char kSigServerSecure[] = "webrtc_sig_server_secure";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSigServerStrict host/libs/config/cuttlefish_config.cpp /^static constexpr char kSigServerStrict[] = "webrtc_sig_server_strict";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSimPinMaxRetryTimes host/commands/modem_simulator/sim_service.cpp /^constexpr int kSimPinMaxRetryTimes = 3;$/;" v namespace:cuttlefish typeref:typename:int
+kSimPinSizeRange host/commands/modem_simulator/sim_service.cpp /^const std::pair<int, int> kSimPinSizeRange(4, 8);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kSimPukMaxRetryTimes host/commands/modem_simulator/sim_service.cpp /^constexpr int kSimPukMaxRetryTimes = 10;$/;" v namespace:cuttlefish typeref:typename:int
+kSimPukSize host/commands/modem_simulator/sim_service.cpp /^constexpr int kSimPukSize = 8;$/;" v namespace:cuttlefish typeref:typename:int
+kSimService host/commands/modem_simulator/modem_service.h /^ kSimService = 0,$/;" e enum:cuttlefish::ModemServiceType
+kSimType host/commands/modem_simulator/nvram_config.cpp /^const char* kSimType = "sim_type";$/;" v namespace:cuttlefish typeref:typename:const char *
+kSize guest/hals/ril/reference-ril/reference-ril.c /^#define kSize /;" d file:
+kSmsService host/commands/modem_simulator/modem_service.h /^ kSmsService = 4,$/;" e enum:cuttlefish::ModemServiceType
+kSmt host/libs/config/cuttlefish_config.cpp /^static constexpr char kSmt[] = "smt";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kSocketMode host/libs/allocd/alloc_utils.h /^constexpr int kSocketMode = 0666;$/;" v namespace:cuttlefish typeref:typename:int
+kSocketProxyServerError host/commands/run_cvd/runner_defs.h /^ kSocketProxyServerError = 26,$/;" e enum:cuttlefish::RunnerExitCodes
+kStageTable host/commands/kernel_log_monitor/kernel_log_server.cc /^} kStageTable[] = {$/;" v namespace:__anonfa7764770111 typeref:struct:__anonfa7764770111::__anonfa7764770308[]
+kStart common/libs/confui/protocol_types.h /^ kStart = 111, \/\/ start rendering, send confirmation msg, & wait respond$/;" e enum:cuttlefish::confui::ConfUiCmd
+kStartAp host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kStartAp[] = "start_ap";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kStartBin host/commands/cvd/main.cc /^constexpr char kStartBin[] = "cvd_internal_start";$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:char[]
+kStartSigServer host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kStartSigServer[] = "webrtc_start_sig_server";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kStartWmediumd host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kStartWmediumd[] = "start_wmediumd";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kStatus host/commands/run_cvd/runner_defs.h /^ kStatus = 'I',$/;" e enum:cuttlefish::LauncherAction
+kStatusBin host/commands/cvd/main.cc /^constexpr char kStatusBin[] = "cvd_internal_status";$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:char[]
+kStatusReportIndicator host/commands/modem_simulator/pdu_parser.cpp /^static const std::string kStatusReportIndicator = "06";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kStdErr common/libs/utils/subprocess.h /^ kStdErr = 2,$/;" e enum:cuttlefish::Subprocess::StdIOChannel
+kStdIn common/libs/utils/subprocess.h /^ kStdIn = 0,$/;" e enum:cuttlefish::Subprocess::StdIOChannel
+kStdOut common/libs/utils/subprocess.h /^ kStdOut = 1,$/;" e enum:cuttlefish::Subprocess::StdIOChannel
+kStkService host/commands/modem_simulator/modem_service.h /^ kStkService = 6,$/;" e enum:cuttlefish::ModemServiceType
+kStop common/libs/confui/protocol_types.h /^ kStop = 112, \/\/ start rendering, send confirmation msg, & wait respond$/;" e enum:cuttlefish::confui::ConfUiCmd
+kStop host/commands/run_cvd/runner_defs.h /^ kStop = 'X',$/;" e enum:cuttlefish::LauncherAction
+kStopBin host/commands/cvd/main.cc /^constexpr char kStopBin[] = "cvd_internal_stop";$/;" v namespace:cuttlefish::__anon483fb9980111 typeref:typename:char[]
+kStopCrash common/libs/utils/subprocess.h /^ kStopCrash, \/* Attempted to stop the subprocess cleanly, but that failed. *\/$/;" e enum:cuttlefish::StopperResult
+kStopFailure common/libs/utils/subprocess.h /^ kStopFailure, \/* Failed to stop the subprocess. *\/$/;" e enum:cuttlefish::StopperResult
+kStopSuccess common/libs/utils/subprocess.h /^ kStopSuccess, \/* The subprocess exited in the expected way. *\/$/;" e enum:cuttlefish::StopperResult
+kStreamIdField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kStreamIdField = "stream_id";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kStrict host/frontend/webrtc/lib/ws_connection.h /^ kStrict,$/;" e enum:WsConnection::Security
+kStunPrefix host/frontend/webrtc_operator/server_config.cpp /^ constexpr auto kStunPrefix = "stun:";$/;" v namespace:cuttlefish::__anonc6b6781f0111 typeref:typename:auto
+kSuccess host/commands/metrics/metrics_defs.h /^ kSuccess=0,$/;" e enum:cuttlefish::MetricsExitCodes
+kSuccess host/commands/modem_simulator/channel_monitor.h /^ kSuccess = 0,$/;" e enum:cuttlefish::ModemSimulatorExitCodes
+kSuccess host/commands/run_cvd/runner_defs.h /^ kSuccess = 'S',$/;" e enum:cuttlefish::LauncherResponse
+kSuccess host/commands/run_cvd/runner_defs.h /^ kSuccess = 0,$/;" e enum:cuttlefish::RunnerExitCodes
+kSupService host/commands/modem_simulator/modem_service.h /^ kSupService = 5,$/;" e enum:cuttlefish::ModemServiceType
+kSuperPartitionGroups host/commands/assemble_cvd/misc_info.cc /^static constexpr const char* kSuperPartitionGroups = "super_partition_groups";$/;" v namespace:cuttlefish typeref:typename:const char * file:
+kSurfacelessContextExt host/libs/graphics_detector/graphics_detector.cpp /^constexpr const char kSurfacelessContextExt[] = "EGL_KHR_surfaceless_context";$/;" v namespace:cuttlefish::__anon29a199ff0111 typeref:typename:const char[]
+kSystemError common/libs/confui/protocol_types.h /^ static constexpr char kSystemError[] = "system_error";$/;" m struct:cuttlefish::confui::HostError typeref:typename:char[]
+kTapDeviceInUse host/commands/run_cvd/runner_defs.h /^ kTapDeviceInUse = 23,$/;" e enum:cuttlefish::RunnerExitCodes
+kTargetArch host/libs/config/cuttlefish_config.cpp /^static constexpr char kTargetArch[] = "target_arch";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kTemplateToIntent guest/hals/camera/vsock_camera_metadata.cpp /^const std::map<RequestTemplate, uint8_t> kTemplateToIntent = {$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const std::map<RequestTemplate,uint8_t>
+kTerminated host/libs/confui/server_common.h /^ kTerminated = 8,$/;" e enum:cuttlefish::confui::MainLoopState
+kTestPatternMode guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kTestPatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t
+kTestPatternModes guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kTestPatternModes[] = {ANDROID_SENSOR_TEST_PATTERN_MODE_OFF};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kThumbnailSize guest/hals/camera/vsock_camera_metadata.cpp /^const int32_t kThumbnailSize[] = {240, 180};$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const int32_t[]
+kTimestampSource guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kTimestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kTombstoneDirCreationError host/commands/run_cvd/runner_defs.h /^ kTombstoneDirCreationError = 21,$/;" e enum:cuttlefish::RunnerExitCodes
+kTombstoneReceiverPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kTombstoneReceiverPort[] = "tombstone_receiver_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kTombstoneServerError host/commands/run_cvd/runner_defs.h /^ kTombstoneServerError = 20,$/;" e enum:cuttlefish::RunnerExitCodes
+kTouchEvent common/libs/confui/protocol_types.h /^ constexpr static const auto kTouchEvent = "user_touch";$/;" m struct:cuttlefish::confui::UserResponse typeref:typename:const auto
+kTouchServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kTouchServerPort[] = "touch_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kTpmDevice host/libs/config/cuttlefish_config.cpp /^static constexpr char kTpmDevice[] = "tpm_device";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kTpmPassthroughError host/commands/run_cvd/runner_defs.h /^ kTpmPassthroughError = 24,$/;" e enum:cuttlefish::RunnerExitCodes
+kTxStart host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kTxStart = 6,$/;" e enum:cuttlefish::WmediumdMessageType
+kTypeField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kTypeField = "message_type";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kUDHIAndSRIAndMMSIndicator host/commands/modem_simulator/pdu_parser.cpp /^static const std::string kUDHIAndSRIAndMMSIndicator = "64"; \/* UDHI is 1 && SRI is 1 && /;" v namespace:cuttlefish typeref:typename:const std::string file:
+kUIError common/libs/confui/protocol_types.h /^ static constexpr char kUIError[] = "ui_error";$/;" m struct:cuttlefish::confui::HostError typeref:typename:char[]
+kUngetSize common/libs/fs/shared_fd_stream.h /^ static constexpr const ptrdiff_t kUngetSize = 128;$/;" m class:cuttlefish::SharedFDStreambuf typeref:typename:const ptrdiff_t
+kUniqueKey host/commands/secure_env/json_serializable.cpp /^static constexpr char kUniqueKey[] = "JsonSerializable";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kUniqueKey host/commands/secure_env/tpm_key_blob_maker.cpp /^static constexpr char kUniqueKey[] = "TpmKeyBlobMaker";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kUnknown common/libs/confui/protocol_types.h /^ constexpr static const auto kUnknown = "user_unknown";$/;" m struct:cuttlefish::confui::UserResponse typeref:typename:const auto
+kUnknown common/libs/confui/protocol_types.h /^ kUnknown = 100,$/;" e enum:cuttlefish::confui::ConfUiCmd
+kUnknown host/libs/config/cuttlefish_config.h /^ kUnknown = 0,$/;" e enum:cuttlefish::CuttlefishConfig::Answer
+kUnknownAction host/commands/run_cvd/runner_defs.h /^ kUnknownAction = 'U',$/;" e enum:cuttlefish::LauncherResponse
+kUnread host/commands/modem_simulator/sms_service.h /^ enum SmsStatus { kUnread = 0, kRead = 1, kUnsent = 2, kSent = 3 };$/;" e enum:cuttlefish::SmsService::SmsMessage::SmsStatus
+kUnregister host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ kUnregister = 3,$/;" e enum:cuttlefish::WmediumdMessageType
+kUnsent host/commands/modem_simulator/sms_service.h /^ enum SmsStatus { kUnread = 0, kRead = 1, kUnsent = 2, kSent = 3 };$/;" e enum:cuttlefish::SmsService::SmsMessage::SmsStatus
+kUrlsField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kUrlsField = "urls";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kUsbV1SocketError host/commands/run_cvd/runner_defs.h /^ kUsbV1SocketError = 15,$/;" e enum:cuttlefish::RunnerExitCodes
+kUseAllocd host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kUseAllocd[] = "use_allocd";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kUserAbort common/libs/confui/protocol_types.h /^ constexpr static const auto kUserAbort = "user_abort";$/;" m struct:cuttlefish::confui::UserResponse typeref:typename:const auto
+kUserEvent host/libs/confui/server_common.h /^ kUserEvent = 1,$/;" e enum:cuttlefish::confui::FsmInput
+kUserInputEvent common/libs/confui/protocol_types.h /^ kUserInputEvent = 200,$/;" e enum:cuttlefish::confui::ConfUiCmd
+kUserTouchEvent common/libs/confui/protocol_types.h /^ kUserTouchEvent = 201$/;" e enum:cuttlefish::confui::ConfUiCmd
+kUserdataFormat host/libs/config/cuttlefish_config.cpp /^static constexpr char kUserdataFormat[] = "userdata_format";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kUsernameField host/frontend/webrtc_operator/constants/signaling_constants.h /^constexpr auto kUsernameField = "username";$/;" v namespace:cuttlefish::webrtc_signaling typeref:typename:auto
+kUuid host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kUuid[] = "uuid";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVMCreationError host/commands/run_cvd/runner_defs.h /^ kVMCreationError = 9,$/;" e enum:cuttlefish::RunnerExitCodes
+kValue host/commands/secure_env/insecure_fallback_storage.cpp /^static constexpr char kValue[] = "value";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVehicleHalServerPort host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kVehicleHalServerPort[] = "vehicle_hal_server_port";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVhciDev guest/commands/bt_vhci_forwarder/main.cpp /^constexpr const char* kVhciDev = "\/dev\/vhci";$/;" v typeref:typename:const char *
+kVhostNet host/libs/config/cuttlefish_config.cpp /^static constexpr char kVhostNet[] = "vhost_net";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVhostUserMac80211Hwsim host/libs/config/cuttlefish_config.cpp /^static constexpr char kVhostUserMac80211Hwsim[] = "vhost_user_mac80211_hwsim";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVideoStabilizationMode guest/hals/camera/vsock_camera_metadata.cpp /^const uint8_t kVideoStabilizationMode =$/;" v namespace:android::hardware::camera::device::V3_4::implementation::__anonc140734a0111 typeref:typename:const uint8_t
+kVirtualDeviceBootFailed host/commands/run_cvd/runner_defs.h /^ kVirtualDeviceBootFailed = 11,$/;" e enum:cuttlefish::RunnerExitCodes
+kVirtualDiskPaths host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kVirtualDiskPaths[] = "virtual_disk_paths";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVmManager host/libs/config/cuttlefish_config.cpp /^static constexpr char kVmManager[] = "vm_manager";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVsocUserPrefix host/libs/config/cuttlefish_config.h /^constexpr char kVsocUserPrefix[] = "vsoc-";$/;" v namespace:cuttlefish typeref:typename:char[]
+kVsockGuestCid host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kVsockGuestCid[] = "vsock_guest_cid";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kVulkanLib host/libs/graphics_detector/graphics_detector.cpp /^constexpr const char kVulkanLib[] = "libvulkan.so.1";$/;" v namespace:cuttlefish::__anon29a199ff0111 typeref:typename:const char[]
+kWCDMASignalStrength host/commands/modem_simulator/network_service.cpp /^const std::pair<int, int> kWCDMASignalStrength = std::make_pair(4, 30);$/;" v namespace:cuttlefish typeref:typename:const std::pair<int,int>
+kWaitStop host/libs/confui/server_common.h /^ kWaitStop = 3, \/\/ wait ack after sending confirm\/cancel$/;" e enum:cuttlefish::confui::MainLoopState
+kWebRTCAssetsDir host/libs/config/cuttlefish_config.cpp /^static constexpr char kWebRTCAssetsDir[] = "webrtc_assets_dir";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWebRTCCertsDir host/libs/config/cuttlefish_config.cpp /^static constexpr char kWebRTCCertsDir[] = "webrtc_certs_dir";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWebRTCEnableADBWebSocket host/libs/config/cuttlefish_config.cpp /^static constexpr char kWebRTCEnableADBWebSocket[] =$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWebrtcDeviceId host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kWebrtcDeviceId[] = "webrtc_device_id";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWebrtcTcpPortRange host/libs/config/cuttlefish_config.cpp /^static constexpr char kWebrtcTcpPortRange[] = "webrtc_tcp_port_range";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWebrtcUdpPortRange host/libs/config/cuttlefish_config.cpp /^static constexpr char kWebrtcUdpPortRange[] = "webrtc_udp_port_range";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWifiConnectedMessage host/libs/config/cuttlefish_config.h /^constexpr char kWifiConnectedMessage[] =$/;" v namespace:cuttlefish typeref:typename:char[]
+kWifiMacPrefix host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kWifiMacPrefix[] = "wifi_mac_prefix";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWifiTapName host/libs/config/cuttlefish_config_instance.cpp /^static constexpr char kWifiTapName[] = "wifi_tap_name";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWirelessIp host/libs/allocd/alloc_utils.h /^constexpr char kWirelessIp[] = "192.168.96";$/;" v namespace:cuttlefish typeref:typename:char[]
+kWithoutServiceCenterAddress host/commands/modem_simulator/pdu_parser.cpp /^static const std::string kWithoutServiceCenterAddress = "00";$/;" v namespace:cuttlefish typeref:typename:const std::string file:
+kWmediumdApiServerSocket host/libs/config/cuttlefish_config.cpp /^static constexpr char kWmediumdApiServerSocket[] = "wmediumd_api_server_socket";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kWmediumdConfig host/libs/config/cuttlefish_config.cpp /^static constexpr char kWmediumdConfig[] = "wmediumd_config";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kXRes host/libs/config/cuttlefish_config.cpp /^static constexpr char kXRes[] = "x_res";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kXResField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kXResField = "x_res";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kYRes host/libs/config/cuttlefish_config.cpp /^static constexpr char kYRes[] = "y_res";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kYResField host/frontend/webrtc/lib/streamer.cpp /^constexpr auto kYResField = "y_res";$/;" v namespace:cuttlefish::webrtc_streaming::__anonab9390d10111 typeref:typename:auto
+kYes host/libs/config/cuttlefish_config.h /^ kYes,$/;" e enum:cuttlefish::CuttlefishConfig::Answer
+keepaliveStatusInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::keepaliveStatusInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+kenableHostBluetooth host/libs/config/cuttlefish_config.cpp /^static constexpr char kenableHostBluetooth[] = "enable_host_bluetooth";$/;" v namespace:cuttlefish typeref:typename:char[] file:
+kernel_log_events_handler_ host/frontend/webrtc/connection_observer.cpp /^ cuttlefish::KernelLogEventsHandler* kernel_log_events_handler_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:cuttlefish::KernelLogEventsHandler * file:
+kernel_log_events_handler_ host/frontend/webrtc/connection_observer.h /^ KernelLogEventsHandler* kernel_log_events_handler_;$/;" m class:cuttlefish::CfConnectionObserverFactory typeref:typename:KernelLogEventsHandler *
+kernel_log_events_pipe_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD kernel_log_events_pipe_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:SharedFD file:
+kernel_log_fd_ host/frontend/webrtc/kernel_log_events_handler.h /^ SharedFD kernel_log_fd_;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:SharedFD
+kernel_log_pipe_ host/commands/run_cvd/launch.cc /^ SharedFD kernel_log_pipe_;$/;" m class:cuttlefish::SecureEnvironment typeref:typename:SharedFD file:
+kernel_log_pipe_ host/libs/config/adb/launch.cpp /^ SharedFD kernel_log_pipe_;$/;" m class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:SharedFD file:
+kernel_log_pipe_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::kernel_log_pipe_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+kernel_log_pipe_provider_ host/commands/run_cvd/boot_state_machine.cc /^ KernelLogPipeProvider& kernel_log_pipe_provider_;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:KernelLogPipeProvider & file:
+kernel_log_pipe_provider_ host/commands/run_cvd/launch.cc /^ KernelLogPipeProvider& kernel_log_pipe_provider_;$/;" m class:cuttlefish::SecureEnvironment typeref:typename:KernelLogPipeProvider & file:
+kernel_log_subscription_id_ host/frontend/webrtc/connection_observer.cpp /^ int kernel_log_subscription_id_ = -1;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:int file:
+kernel_path_ host/libs/config/data_image.cpp /^ std::string kernel_path_;$/;" m class:cuttlefish::InitializeEspImageImpl typeref:typename:std::string file:
+key common/libs/utils/flag_parser.h /^ std::string key;$/;" m struct:cuttlefish::FlagMatch typeref:typename:std::string
+keyIdentifier guest/hals/ril/reference-libril/ril.h /^ char* keyIdentifier; \/* The keyIdentifier Attribute value pair that helps$/;" m struct:__anon0bfbaecf2c08 typeref:typename:char *
+keyIdentifier guest/hals/ril/reference-libril/ril.h /^ char * keyIdentifier; \/* The keyIdentifier Attribute value pair that helps$/;" m struct:__anon0bfbaecf2a08 typeref:typename:char *
+keyType guest/hals/ril/reference-libril/ril.h /^ RIL_PublicKeyType keyType; \/* Public key type *\/$/;" m struct:__anon0bfbaecf2c08 typeref:typename:RIL_PublicKeyType
+key_ host/commands/secure_env/soft_gatekeeper.h /^ std::unique_ptr<uint8_t[]> key_;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:std::unique_ptr<uint8_t[]>
+key_blob_maker_ host/commands/secure_env/tpm_keymaster_context.h /^ std::unique_ptr<TpmKeyBlobMaker> key_blob_maker_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::unique_ptr<TpmKeyBlobMaker>
+key_factories_ host/commands/secure_env/tpm_keymaster_context.h /^ std::map<keymaster_algorithm_t, std::unique_ptr<keymaster::KeyFactory>> key_factories_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::map<keymaster_algorithm_t,std::unique_ptr<keymaster::KeyFactory>>
+keyboard-capture-control host/frontend/webrtc_operator/assets/client.html /^ <div id="keyboard-capture-control" title="Capture Keyboard"><\/div>$/;" I
+keyboard_client host/frontend/webrtc/connection_observer.h /^ SharedFD keyboard_client;$/;" m struct:cuttlefish::InputSockets typeref:typename:SharedFD
+keyboard_destroy_resource_callback host/libs/wayland/wayland_seat.cpp /^void keyboard_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+keyboard_implementation host/libs/wayland/wayland_seat.cpp /^const struct wl_keyboard_interface keyboard_implementation = {$/;" v namespace:wayland::__anona9f16c970111 typeref:typename:const struct wl_keyboard_interface
+keyboard_release host/libs/wayland/wayland_seat.cpp /^void keyboard_release(wl_client*, wl_resource* keyboard) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+keyboard_server host/frontend/webrtc/connection_observer.h /^ SharedFD keyboard_server;$/;" m struct:cuttlefish::InputSockets typeref:typename:SharedFD
+keyboard_server_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD keyboard_server_;$/;" m class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:SharedFD file:
+keyboard_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::keyboard_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+keyboard_socket_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::keyboard_socket_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+keymaster common/libs/security/keymaster_channel.h /^namespace keymaster {$/;" n
+keymaster guest/hals/keymaster/remote/remote_keymaster.cpp /^namespace keymaster {$/;" n file:
+keymaster guest/hals/keymaster/remote/remote_keymaster.h /^namespace keymaster {$/;" n
+keymaster guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^namespace keymaster {$/;" n file:
+keymaster guest/hals/keymaster/remote/remote_keymaster4_device.h /^namespace keymaster {$/;" n
+keymaster guest/hals/keymint/remote/remote_keymaster.cpp /^namespace keymaster {$/;" n file:
+keymaster guest/hals/keymint/remote/remote_keymaster.h /^namespace keymaster {$/;" n
+keymaster guest/hals/keymint/remote/remote_keymint_operation.h /^namespace keymaster {$/;" n
+keymaster guest/hals/keymint/remote/remote_secure_clock.h /^namespace keymaster {$/;" n
+keymaster guest/hals/keymint/remote/remote_shared_secret.h /^namespace keymaster {$/;" n
+keymaster_ host/commands/secure_env/keymaster_responder.h /^ keymaster::AndroidKeymaster& keymaster_;$/;" m class:cuttlefish::KeymasterResponder typeref:typename:keymaster::AndroidKeymaster &
+keymaster_message common/libs/security/keymaster_channel.h /^struct keymaster_message {$/;" s namespace:keymaster
+keymint guest/hals/keymint/remote/remote_keymint_device.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware::security file:
+keymint guest/hals/keymint/remote/remote_keymint_device.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware::security
+keymint guest/hals/keymint/remote/remote_keymint_operation.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware::security file:
+keymint guest/hals/keymint/remote/remote_keymint_operation.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware::security
+keymint guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware::security file:
+keymint guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware::security
+kgdb host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::kgdb() const { return (*dictionary_)[kKgdb].asBool(); }$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+khronos_boolean_enum_t host/libs/graphics_detector/include/KHR/khrplatform.h /^} khronos_boolean_enum_t;$/;" t typeref:enum:__anon5c4f198b0103
+khronos_float_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef float khronos_float_t;$/;" t typeref:typename:float
+khronos_int16_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef signed short int khronos_int16_t;$/;" t typeref:typename:signed short int
+khronos_int32_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef __int32 khronos_int32_t;$/;" t typeref:typename:__int32
+khronos_int32_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef int khronos_int32_t;$/;" t typeref:typename:int
+khronos_int32_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef int32_t khronos_int32_t;$/;" t typeref:typename:int32_t
+khronos_int64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef __int64 khronos_int64_t;$/;" t typeref:typename:__int64
+khronos_int64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef int64_t khronos_int64_t;$/;" t typeref:typename:int64_t
+khronos_int64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef long int khronos_int64_t;$/;" t typeref:typename:long int
+khronos_int64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef long long int khronos_int64_t;$/;" t typeref:typename:long long int
+khronos_int8_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef signed char khronos_int8_t;$/;" t typeref:typename:signed char
+khronos_intptr_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef signed long int khronos_intptr_t;$/;" t typeref:typename:signed long int
+khronos_intptr_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef signed long long int khronos_intptr_t;$/;" t typeref:typename:signed long long int
+khronos_ssize_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef signed long int khronos_ssize_t;$/;" t typeref:typename:signed long int
+khronos_ssize_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef signed long long int khronos_ssize_t;$/;" t typeref:typename:signed long long int
+khronos_stime_nanoseconds_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef khronos_int64_t khronos_stime_nanoseconds_t;$/;" t typeref:typename:khronos_int64_t
+khronos_uint16_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned short int khronos_uint16_t;$/;" t typeref:typename:unsigned short int
+khronos_uint32_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef uint32_t khronos_uint32_t;$/;" t typeref:typename:uint32_t
+khronos_uint32_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned __int32 khronos_uint32_t;$/;" t typeref:typename:unsigned __int32
+khronos_uint32_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned int khronos_uint32_t;$/;" t typeref:typename:unsigned int
+khronos_uint64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef uint64_t khronos_uint64_t;$/;" t typeref:typename:uint64_t
+khronos_uint64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned __int64 khronos_uint64_t;$/;" t typeref:typename:unsigned __int64
+khronos_uint64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned long int khronos_uint64_t;$/;" t typeref:typename:unsigned long int
+khronos_uint64_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned long long int khronos_uint64_t;$/;" t typeref:typename:unsigned long long int
+khronos_uint8_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned char khronos_uint8_t;$/;" t typeref:typename:unsigned char
+khronos_uintptr_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned long int khronos_uintptr_t;$/;" t typeref:typename:unsigned long int
+khronos_uintptr_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned long long int khronos_uintptr_t;$/;" t typeref:typename:unsigned long long int
+khronos_usize_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned long int khronos_usize_t;$/;" t typeref:typename:unsigned long int
+khronos_usize_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef unsigned long long int khronos_usize_t;$/;" t typeref:typename:unsigned long long int
+khronos_utime_nanoseconds_t host/libs/graphics_detector/include/KHR/khrplatform.h /^typedef khronos_uint64_t khronos_utime_nanoseconds_t;$/;" t typeref:typename:khronos_uint64_t
+klog_write common/libs/net/netlink_request_test.cpp /^extern "C" void klog_write(int \/* level *\/, const char* \/* format *\/, ...) {}$/;" f namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:void
+kmBlob2hidlVec guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_blob_t& blob) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hidl_vec<uint8_t>
+kmBlob2hidlVec guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_key_blob_t& blob) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hidl_vec<uint8_t>
+kmBuffer2hidlVec guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline hidl_vec<uint8_t> kmBuffer2hidlVec(const ::keymaster::Buffer& buf) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hidl_vec<uint8_t>
+kmCertChain2Hidl guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline static hidl_vec<hidl_vec<uint8_t>> kmCertChain2Hidl($/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hidl_vec<hidl_vec<uint8_t>> file:
+kmParamSet2Hidl guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^static inline hidl_vec<KeyParameter> kmParamSet2Hidl(const keymaster_key_param_set_t& set) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hidl_vec<KeyParameter> file:
+knownMissing tests/hal/hal_implementation_test.cpp /^ bool knownMissing;$/;" m struct:AidlPackageCheck typeref:typename:bool file:
+l1_size host/libs/image_aggregator/image_aggregator.cc /^ Be32 l1_size;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+l1_table_offset host/libs/image_aggregator/image_aggregator.cc /^ Be64 l1_table_offset;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be64 file:
+label host/libs/image_aggregator/image_aggregator.h /^ std::string label;$/;" m struct:cuttlefish::ImagePartition typeref:typename:std::string
+label host/libs/image_aggregator/image_aggregator.h /^ std::string label;$/;" m struct:cuttlefish::MultipleImagePartition typeref:typename:std::string
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5808 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5908 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5a08 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5b08 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5f08 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7808 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+lac guest/hals/ril/reference-libril/ril.h /^ int lac; \/* 16-bit Location Area Code, 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7b08 typeref:typename:int
+lang_id_ host/libs/confui/host_renderer.h /^ std::string lang_id_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::string
+last_active_call_index_ host/commands/modem_simulator/call_service.h /^ int32_t last_active_call_index_;$/;" m class:cuttlefish::CallService typeref:typename:int32_t
+last_buffer_ host/frontend/webrtc/display_handler.h /^ std::shared_ptr<webrtc_streaming::VideoFrameBuffer> last_buffer_;$/;" m class:cuttlefish::DisplayHandler typeref:typename:std::shared_ptr<webrtc_streaming::VideoFrameBuffer>
+last_buffer_display_ host/frontend/webrtc/display_handler.h /^ std::uint32_t last_buffer_display_ = 0;$/;" m class:cuttlefish::DisplayHandler typeref:typename:std::uint32_t
+last_buffer_mutex_ host/frontend/webrtc/display_handler.h /^ std::mutex last_buffer_mutex_;$/;" m class:cuttlefish::DisplayHandler typeref:typename:std::mutex
+last_file_id_ host/commands/modem_simulator/sim_service.h /^ std::string last_file_id_;$/;" m class:cuttlefish::SimService typeref:typename:std::string
+last_hop_capacity_kbps guest/hals/ril/reference-libril/ril.h /^ unsigned int last_hop_capacity_kbps; \/* last-hop cellular capacity: kilobits\/second. *\/$/;" m struct:__anon0bfbaecf2408 typeref:typename:unsigned int
+last_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t last_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptPartitionEntry typeref:typename:std::uint64_t file:
+last_modified_time host/commands/fetcher/build_api.h /^ unsigned long last_modified_time;$/;" m class:cuttlefish::Artifact typeref:typename:unsigned long
+last_subscriber_id_ host/frontend/webrtc/kernel_log_events_handler.h /^ int last_subscriber_id_ = 0;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:int
+last_tombstone_name host/commands/tombstone_receiver/main.cpp /^static std::string last_tombstone_name = "";$/;" v namespace:cuttlefish typeref:typename:std::string file:
+last_usable_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t last_usable_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint64_t file:
+latency_bytes host/libs/audio_connector/shm_layout.h /^ Le32 latency_bytes;$/;" m struct:cuttlefish::virtio_snd_pcm_status typeref:typename:Le32
+latest_credential host/commands/fetcher/credential_source.h /^ std::string latest_credential;$/;" m class:cuttlefish::GceMetadataCredentialSource typeref:typename:std::string
+latest_request_settings_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ common::V1_0::helper::CameraMetadata latest_request_settings_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:common::V1_0::helper::CameraMetadata
+latitude guest/hals/ril/reference-libril/ril.h /^ int latitude; \/* Latitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.$/;" m struct:__anon0bfbaecf5c08 typeref:typename:int
+latitude guest/hals/ril/reference-libril/ril.h /^ int latitude; \/* Latitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.$/;" m struct:__anon0bfbaecf7c08 typeref:typename:int
+launchComponent host/commands/run_cvd/launch.cc /^fruit::Component<PublicDeps, KernelLogPipeProvider> launchComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<PublicDeps,KernelLogPipeProvider>
+launchModemComponent host/commands/run_cvd/launch_modem.cpp /^launchModemComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig,const CuttlefishConfig::InstanceSpecific>>
+launchStreamerComponent host/commands/run_cvd/launch_streamer.cpp /^launchStreamerComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig,KernelLogPipeProvider,const CuttlefishConfig::InstanceSpecific,const CustomActionConfigProvider>>
+launch_cvd tools/upload_to_gce_and_run.py /^def launch_cvd(args):$/;" f
+launch_cvd tools/upload_via_ssh.py /^def launch_cvd(args):$/;" f
+launch_cvd_flags host/commands/metrics/proto/cf_metrics_event.proto /^ repeated string launch_cvd_flags = 11;$/;" f message:cuttlefish.MetricsEvent typeref:typename:string
+launch_instance tools/create_base_image.go /^var launch_instance string$/;" v package:main typeref:typename:string
+launcher_log_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::launcher_log_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+launcher_monitor_socket_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::launcher_monitor_socket_path()$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+layout_ host/libs/confui/host_renderer.h /^ teeui::layout_t<teeui::ConfUILayout> layout_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::layout_t<teeui::ConfUILayout>
+lceDataInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::lceDataInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+lce_status guest/hals/ril/reference-libril/ril.h /^ char lce_status; \/* LCE service status:$/;" m struct:__anon0bfbaecf2308 typeref:typename:char
+lce_suspended guest/hals/ril/reference-libril/ril.h /^ unsigned char lce_suspended; \/* LCE report going to be suspended? (e.g., radio$/;" m struct:__anon0bfbaecf2408 typeref:typename:unsigned char
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline ErrorCode legacy_enum_conversion(const keymaster_error_t value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:ErrorCode
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline SecurityLevel legacy_enum_conversion(const keymaster_security_level_t value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:SecurityLevel
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline Tag legacy_enum_conversion(const keymaster_tag_t value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:Tag
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline hw_authenticator_type_t legacy_enum_conversion(const HardwareAuthenticatorType value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:hw_authenticator_type_t
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline keymaster_key_format_t legacy_enum_conversion(const KeyFormat value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:keymaster_key_format_t
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline keymaster_purpose_t legacy_enum_conversion(const KeyPurpose value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:keymaster_purpose_t
+legacy_enum_conversion guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline keymaster_tag_t legacy_enum_conversion(const Tag value) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:keymaster_tag_t
+len common/libs/fs/shared_fd.h /^ size_t len() const { return len_; }$/;" f class:cuttlefish::ScopedMMap typeref:typename:size_t
+len common/libs/utils/network.cpp /^ std::uint8_t len;$/;" m struct:cuttlefish::Dhcp4MessageTypeOption typeref:typename:std::uint8_t file:
+len common/libs/utils/network.cpp /^ std::uint8_t len;$/;" m struct:cuttlefish::Dhcp4ServerIdentifier typeref:typename:std::uint8_t file:
+len guest/hals/ril/reference-libril/ril.h /^ char len;$/;" m struct:__anon0bfbaecf8308 typeref:typename:char
+len host/libs/allocd/request.h /^ uint16_t len; \/\/\/ length in bytes of the message payload$/;" m struct:cuttlefish::RequestHeader typeref:typename:uint16_t
+len host/libs/audio_connector/buffers.h /^ uint32_t len() const { return len_; }$/;" f class:cuttlefish::ShmBuffer typeref:typename:uint32_t
+len_ common/libs/fs/shared_fd.h /^ size_t len_;$/;" m class:cuttlefish::ScopedMMap typeref:typename:size_t
+len_ host/libs/audio_connector/buffers.h /^ const uint32_t len_;$/;" m class:cuttlefish::ShmBuffer typeref:typename:const uint32_t
+len_allowed_carriers guest/hals/ril/reference-libril/ril.h /^ int32_t len_allowed_carriers; \/* length of array allowed_carriers *\/$/;" m struct:__anon0bfbaecf2708 typeref:typename:int32_t
+len_allowed_carriers guest/hals/ril/reference-libril/ril.h /^ int32_t len_allowed_carriers; \/* length of array allowed_carriers *\/$/;" m struct:__anon0bfbaecf2908 typeref:typename:int32_t
+len_excluded_carriers guest/hals/ril/reference-libril/ril.h /^ int32_t len_excluded_carriers; \/* length of array excluded_carriers *\/$/;" m struct:__anon0bfbaecf2708 typeref:typename:int32_t
+len_excluded_carriers guest/hals/ril/reference-libril/ril.h /^ int32_t len_excluded_carriers; \/* length of array excluded_carriers *\/$/;" m struct:__anon0bfbaecf2908 typeref:typename:int32_t
+length host/commands/secure_env/in_process_tpm.cpp /^ uint32_t length;$/;" m struct:cuttlefish::tpm_message_header typeref:typename:uint32_t file:
+length host/libs/image_aggregator/cdisk_spec.proto /^ uint64 length = 3;$/;" f message:CompositeDisk typeref:typename:uint64
+lid_switch_open host/libs/config/custom_actions.h /^ std::optional<bool> lid_switch_open;$/;" m struct:cuttlefish::DeviceState typeref:typename:std::optional<bool>
+lid_switch_open shared/config/config_foldable.json /^ "lid_switch_open": false,$/;" b object:custom_actions.0.device_states.0
+lid_switch_open shared/config/config_foldable.json /^ "lid_switch_open": true,$/;" b object:custom_actions.1.device_states.0
+line guest/hals/ril/reference-ril/atchannel.h /^ char *line;$/;" m struct:ATLine typeref:typename:char *
+lineCtrl guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_LineControlInfoRecord lineCtrl;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_LineControlInfoRecord
+lineCtrlPolarityIncluded guest/hals/ril/reference-libril/ril.h /^ char lineCtrlPolarityIncluded;$/;" m struct:__anon0bfbaecf8608 typeref:typename:char
+lineCtrlPowerDenial guest/hals/ril/reference-libril/ril.h /^ char lineCtrlPowerDenial;$/;" m struct:__anon0bfbaecf8608 typeref:typename:char
+lineCtrlReverse guest/hals/ril/reference-libril/ril.h /^ char lineCtrlReverse;$/;" m struct:__anon0bfbaecf8608 typeref:typename:char
+lineCtrlToggle guest/hals/ril/reference-libril/ril.h /^ char lineCtrlToggle;$/;" m struct:__anon0bfbaecf8608 typeref:typename:char
+line_ host/commands/kernel_log_monitor/kernel_log_server.h /^ std::string line_;$/;" m class:monitor::KernelLogServer typeref:typename:std::string
+linux_buffer_params_add host/libs/wayland/wayland_dmabuf.cpp /^void linux_buffer_params_add(wl_client*,$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+linux_buffer_params_create host/libs/wayland/wayland_dmabuf.cpp /^void linux_buffer_params_create(wl_client* client,$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+linux_buffer_params_create_immed host/libs/wayland/wayland_dmabuf.cpp /^void linux_buffer_params_create_immed(wl_client* client,$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+linux_buffer_params_destroy host/libs/wayland/wayland_dmabuf.cpp /^void linux_buffer_params_destroy(wl_client*, wl_resource* params) {$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+linux_dmabuf_create_params host/libs/wayland/wayland_dmabuf.cpp /^void linux_dmabuf_create_params(wl_client* client,$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+linux_dmabuf_destroy host/libs/wayland/wayland_dmabuf.cpp /^void linux_dmabuf_destroy(wl_client*, wl_resource* dmabuf) {$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+list1_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list1_length = 0x10;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint16_t file:
+list1_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list1_length = 0x18;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+list1_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list1_length = 0xc;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+list1_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list1_type = kList1Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint16_t file:
+list1_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list1_type = kList1Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+list1_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list1_type = kList1Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+list2_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list2_length = 0xc; \/\/ Note, this only covers until kValue1.$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+list2_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list2_length = 0xc;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint16_t file:
+list2_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list2_length = 0xc;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+list2_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list2_type = kList2Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90608 typeref:typename:const uint16_t file:
+list2_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list2_type = kList2Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90708 typeref:typename:const uint16_t file:
+list2_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list2_type = kList2Tag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90808 typeref:typename:const uint16_t file:
+listMutex guest/hals/ril/reference-libril/ril_event.cpp /^static pthread_mutex_t listMutex;$/;" v typeref:typename:pthread_mutex_t file:
+list_length common/libs/net/netlink_request_test.cpp /^ const uint16_t list_length = 0xc;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90508 typeref:typename:const uint16_t file:
+list_type common/libs/net/netlink_request_test.cpp /^ const uint16_t list_type = kListTag;$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90508 typeref:typename:const uint16_t file:
+listen_event guest/hals/ril/reference-libril/ril_ex.h /^ struct ril_event* listen_event;$/;" m struct:SocketListenParam typeref:struct:ril_event *
+listener_state_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ ListenerState listener_state_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:ListenerState
+listener_state_ guest/hals/confirmationui/guest_session.h /^ ListenerState& listener_state_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:ListenerState &
+listener_state_condv_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::condition_variable listener_state_condv_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::condition_variable
+listener_state_condv_ guest/hals/confirmationui/guest_session.h /^ std::condition_variable& listener_state_condv_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::condition_variable &
+listener_state_lock_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ std::mutex listener_state_lock_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:std::mutex
+listener_state_lock_ guest/hals/confirmationui/guest_session.h /^ std::mutex& listener_state_lock_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::mutex &
+lists_ common/libs/net/netlink_request.h /^ std::vector<std::pair<nlattr*, int32_t>> lists_;$/;" m class:cuttlefish::NetlinkRequest typeref:typename:std::vector<std::pair<nlattr *,int32_t>>
+loader host/frontend/webrtc_operator/assets/client.html /^ <div id="loader"><\/div>$/;" I
+local guest/hals/ril/reference-libril/ril_internal.h /^ char local; \/\/ responses to local commands do not go back to command process$/;" m struct:android::RequestInfo typeref:typename:char
+locale_ common/libs/confui/protocol_types.h /^ std::string locale_;$/;" m class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::string
+locale_ guest/hals/confirmationui/guest_session.h /^ std::string locale_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::string
+locale_ host/libs/confui/session.h /^ std::string locale_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::string
+location host/libs/allocd/resource_manager.h /^ std::string location = kDefaultLocation;$/;" m struct:cuttlefish::ResourceManager typeref:typename:std::string
+lock common/libs/fs/shared_fd.cpp /^SharedFD WeakFD::lock() const {$/;" f class:cuttlefish::WeakFD typeref:typename:SharedFD
+lock_ host/commands/modem_simulator/thread_looper.h /^ std::mutex lock_;$/;" m class:cuttlefish::ThreadLooper typeref:typename:std::mutex
+lock_status host/commands/modem_simulator/sim_service.h /^ LockStatus lock_status; \/\/ Ignore class$/;" m struct:cuttlefish::SimService::FacilityLock typeref:typename:LockStatus
+log_event host/commands/metrics/proto/clientanalytics.proto /^ repeated LogEvent log_event = 3;$/;" f message:LogRequest typeref:typename:LogEvent
+log_fd_ host/commands/kernel_log_monitor/kernel_log_server.h /^ cuttlefish::SharedFD log_fd_;$/;" m class:monitor::KernelLogServer typeref:typename:cuttlefish::SharedFD
+log_pipe_provider_ host/commands/run_cvd/launch_streamer.cpp /^ KernelLogPipeProvider& log_pipe_provider_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:KernelLogPipeProvider & file:
+log_pipe_provider_ host/libs/config/adb/launch.cpp /^ KernelLogPipeProvider& log_pipe_provider_;$/;" m class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:KernelLogPipeProvider & file:
+log_source host/commands/metrics/proto/clientanalytics.proto /^ optional int32 log_source = 2;$/;" f message:LogRequest typeref:typename:int32
+logcat_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::logcat_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+logcat_pipe_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::logcat_pipe_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+logicalModemList guest/hals/ril/reference-libril/ril.h /^ RIL_ModemInfo logicalModemList[MAX_LOGICAL_MODEM_NUM];$/;" m struct:__anon0bfbaecfbc08 typeref:typename:RIL_ModemInfo[]
+logicalModemUuid guest/hals/ril/reference-libril/ril.h /^ char logicalModemUuid[MAX_UUID_LENGTH]; \/\/ A UUID typically "com.xxxx.lmX where X is the l/;" m struct:__anon0bfbaecf0a08 typeref:typename:char[]
+logicalSlotId guest/hals/ril/reference-libril/ril.h /^ int logicalSlotId;$/;" m struct:__anon0bfbaecfb908 typeref:typename:int
+logical_channels_ host/commands/modem_simulator/sim_service.h /^ std::vector<LogicalChannel> logical_channels_;$/;" m class:cuttlefish::SimService typeref:typename:std::vector<LogicalChannel>
+long_name host/commands/modem_simulator/network_service.h /^ std::string long_name;$/;" m struct:cuttlefish::NetworkService::NetworkOperator typeref:typename:std::string
+longitude guest/hals/ril/reference-libril/ril.h /^ int longitude; \/* Longitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.$/;" m struct:__anon0bfbaecf5c08 typeref:typename:int
+longitude guest/hals/ril/reference-libril/ril.h /^ int longitude; \/* Longitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.$/;" m struct:__anon0bfbaecf7c08 typeref:typename:int
+lookup_addr tools/tombstone_to_line.py /^def lookup_addr(args, object_path, address):$/;" f
+looper_thread_ host/commands/modem_simulator/thread_looper.h /^ std::thread looper_thread_;$/;" m class:cuttlefish::ThreadLooper typeref:typename:std::thread
+lte guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoLte lte;$/;" m union:__anon0bfbaecf6e08::__anon0bfbaecf6f0a typeref:typename:RIL_CellInfoLte
+lte guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoLte_v12 lte;$/;" m union:__anon0bfbaecf7008::__anon0bfbaecf710a typeref:typename:RIL_CellInfoLte_v12
+lte guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoLte_v12 lte;$/;" m union:__anon0bfbaecf7208::__anon0bfbaecf730a typeref:typename:RIL_CellInfoLte_v12
+lte_cqi host/commands/modem_simulator/network_service.h /^ int lte_cqi; \/* The current Channel Quality Indicator.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+lte_rsrp host/commands/modem_simulator/network_service.h /^ int lte_rsrp; \/* The current Reference Signal Receive Power in dBm multiplied by -1.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+lte_rsrq host/commands/modem_simulator/network_service.h /^ int lte_rsrq; \/* The current Reference Signal Receive Quality in dB multiplied by -1.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+lte_rssi host/commands/modem_simulator/network_service.h /^ int lte_rssi; \/* Refer gsm_rssi *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+lte_rssnr host/commands/modem_simulator/network_service.h /^ int lte_rssnr; \/* The current reference signal signal-to-noise ratio in 0.1 dB units.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+lte_ta host/commands/modem_simulator/network_service.h /^ int lte_ta; \/* timing advance in micro seconds for a one way trip from cell to device.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+lws_context host/frontend/webrtc/lib/ws_connection.cpp /^ struct lws_context* lws_context() {$/;" f class:WsConnectionContextImpl typeref:struct:lws_context * file:
+lws_context_ host/frontend/webrtc/lib/ws_connection.cpp /^ struct lws_context* lws_context_;$/;" m class:WsConnectionContextImpl typeref:struct:lws_context * file:
+mBluetoothChecker guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private BluetoothChecker mBluetoothChecker = null;$/;" f class:GceService file:
+mBroadcastReceiver guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private final GceBroadcastReceiver mBroadcastReceiver = new GceBroadcastReceiver();$/;" f class:GceService file:
+mConnChecker guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private ConnectivityChecker mConnChecker;$/;" f class:GceService file:
+mConnManager guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final ConnectivityManager mConnManager;$/;" f class:GceWifiManager file:
+mConnManager tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private ConnectivityManager mConnManager;$/;" f class:RilE2eTests file:
+mConnManager tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private ConnectivityManager mConnManager;$/;" f class:WifiE2eTests file:
+mConnected guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private final GceFuture<Boolean> mConnected = new GceFuture<Boolean>("Connectivity");$/;" f class:ConnectivityChecker file:
+mContext guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private final Context mContext;$/;" f class:ConnectivityChecker file:
+mContext guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final Context mContext;$/;" f class:GceWifiManager file:
+mContext tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private Context mContext;$/;" f class:RilE2eTests file:
+mContext tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private Context mContext;$/;" f class:WifiE2eTests file:
+mCounterOemHook guest/hals/ril/reference-libril/ril_service.cpp /^volatile int32_t mCounterOemHook[1];$/;" v typeref:typename:volatile int32_t[1]
+mCounterOemHook guest/hals/ril/reference-libril/ril_service.cpp /^volatile int32_t mCounterOemHook[SIM_COUNT];$/;" v typeref:typename:volatile int32_t[]
+mCounterRadio guest/hals/ril/reference-libril/ril_service.cpp /^volatile int32_t mCounterRadio[1];$/;" v typeref:typename:volatile int32_t[1]
+mCounterRadio guest/hals/ril/reference-libril/ril_service.cpp /^volatile int32_t mCounterRadio[SIM_COUNT];$/;" v typeref:typename:volatile int32_t[]
+mCounterRadioConfig guest/hals/ril/reference-libril/ril_config.cpp /^volatile int32_t mCounterRadioConfig;$/;" v typeref:typename:volatile int32_t
+mEnabled guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^ private final GceFuture<Boolean> mEnabled = new GceFuture<Boolean>("Bluetooth");$/;" f class:BluetoothChecker file:
+mEventReporter guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private final EventReporter mEventReporter;$/;" f class:ConnectivityChecker file:
+mEventReporter guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private final EventReporter mEventReporter = new EventReporter();$/;" f class:GceService file:
+mEventReporter guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final EventReporter mEventReporter;$/;" f class:GceWifiManager file:
+mExecutor guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private final JobExecutor mExecutor = new JobExecutor();$/;" f class:GceService file:
+mExecutor guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ private final ScheduledExecutorService mExecutor;$/;" f class:JobExecutor file:
+mHci guest/hals/bt/remote/remote_bluetooth.cpp /^ sp<IBluetoothHci> mHci;$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothDeathRecipient typeref:typename:sp<IBluetoothHci> file:
+mJobExecutor guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final JobExecutor mJobExecutor;$/;" f class:GceWifiManager file:
+mKmsgStream guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private FileOutputStream mKmsgStream = null;$/;" f class:EventReporter file:
+mKmsgWriter guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private PrintWriter mKmsgWriter = null;$/;" f class:EventReporter file:
+mMessageList guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ private List<String> mMessageList = new ArrayList<String>();$/;" f class:EventReporter file:
+mMonitorWifiJob guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final MonitorWifiJob mMonitorWifiJob;$/;" f class:GceWifiManager file:
+mMostRecentAction guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private String mMostRecentAction = null;$/;" f class:GceService file:
+mName guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ private final String mName;$/;" f class:GceFuture file:
+mOemHookIndication guest/hals/ril/reference-libril/ril_service.cpp /^ sp<IOemHookIndication> mOemHookIndication;$/;" m struct:OemHookImpl typeref:typename:sp<IOemHookIndication> file:
+mOemHookResponse guest/hals/ril/reference-libril/ril_service.cpp /^ sp<IOemHookResponse> mOemHookResponse;$/;" m struct:OemHookImpl typeref:typename:sp<IOemHookResponse> file:
+mPreviousDpi guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private int mPreviousDpi;$/;" f class:GceService file:
+mPreviousRotation guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private int mPreviousRotation;$/;" f class:GceService file:
+mPreviousScreenBounds guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private Point mPreviousScreenBounds;$/;" f class:GceService file:
+mRadioConfigIndication guest/hals/ril/reference-libril/ril_config.cpp /^ sp<V1_0::IRadioConfigIndication> mRadioConfigIndication;$/;" m struct:RadioConfigImpl typeref:typename:sp<V1_0::IRadioConfigIndication> file:
+mRadioConfigIndicationV1_2 guest/hals/ril/reference-libril/ril_config.cpp /^ sp<V1_2::IRadioConfigIndication> mRadioConfigIndicationV1_2;$/;" m struct:RadioConfigImpl typeref:typename:sp<V1_2::IRadioConfigIndication> file:
+mRadioConfigResponse guest/hals/ril/reference-libril/ril_config.cpp /^ sp<V1_0::IRadioConfigResponse> mRadioConfigResponse;$/;" m struct:RadioConfigImpl typeref:typename:sp<V1_0::IRadioConfigResponse> file:
+mRadioConfigResponseV1_1 guest/hals/ril/reference-libril/ril_config.cpp /^ sp<V1_1::IRadioConfigResponse> mRadioConfigResponseV1_1;$/;" m struct:RadioConfigImpl typeref:typename:sp<V1_1::IRadioConfigResponse> file:
+mRadioConfigResponseV1_2 guest/hals/ril/reference-libril/ril_config.cpp /^ sp<V1_2::IRadioConfigResponse> mRadioConfigResponseV1_2;$/;" m struct:RadioConfigImpl typeref:typename:sp<V1_2::IRadioConfigResponse> file:
+mRadioConfigResponseV1_3 guest/hals/ril/reference-libril/ril_config.cpp /^ sp<V1_3::IRadioConfigResponse> mRadioConfigResponseV1_3;$/;" m struct:RadioConfigImpl typeref:typename:sp<V1_3::IRadioConfigResponse> file:
+mRadioIndication guest/hals/ril/reference-libril/ril_service.cpp /^ sp<IRadioIndication> mRadioIndication;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<IRadioIndication> file:
+mRadioIndicationV1_1 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_1::IRadioIndication> mRadioIndicationV1_1;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_1::IRadioIndication> file:
+mRadioIndicationV1_2 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_2::IRadioIndication> mRadioIndicationV1_2;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_2::IRadioIndication> file:
+mRadioIndicationV1_3 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_3::IRadioIndication> mRadioIndicationV1_3;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_3::IRadioIndication> file:
+mRadioIndicationV1_4 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_4::IRadioIndication> mRadioIndicationV1_4;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_4::IRadioIndication> file:
+mRadioIndicationV1_5 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_5::IRadioIndication> mRadioIndicationV1_5;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_5::IRadioIndication> file:
+mRadioIndicationV1_6 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_6::IRadioIndication> mRadioIndicationV1_6;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_6::IRadioIndication> file:
+mRadioResponse guest/hals/ril/reference-libril/ril_service.cpp /^ sp<IRadioResponse> mRadioResponse;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<IRadioResponse> file:
+mRadioResponseV1_1 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_1::IRadioResponse> mRadioResponseV1_1;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_1::IRadioResponse> file:
+mRadioResponseV1_2 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_2::IRadioResponse> mRadioResponseV1_2;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_2::IRadioResponse> file:
+mRadioResponseV1_3 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_3::IRadioResponse> mRadioResponseV1_3;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_3::IRadioResponse> file:
+mRadioResponseV1_4 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_4::IRadioResponse> mRadioResponseV1_4;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_4::IRadioResponse> file:
+mRadioResponseV1_5 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_5::IRadioResponse> mRadioResponseV1_5;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_5::IRadioResponse> file:
+mRadioResponseV1_6 guest/hals/ril/reference-libril/ril_service.cpp /^ sp<V1_6::IRadioResponse> mRadioResponseV1_6;$/;" m struct:RadioImpl_1_6 typeref:typename:sp<V1_6::IRadioResponse> file:
+mReportedWifiNotConnected guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private boolean mReportedWifiNotConnected = false;$/;" f class:GceWifiManager.MonitorWifiJob file:
+mSimCardPowerState guest/hals/ril/reference-libril/ril_service.cpp /^ V1_1::CardPowerState mSimCardPowerState;$/;" m struct:RadioImpl_1_6 typeref:typename:V1_1::CardPowerState file:
+mSlotId guest/hals/ril/reference-libril/ril_config.cpp /^ int32_t mSlotId;$/;" m struct:RadioConfigImpl typeref:typename:int32_t file:
+mSlotId guest/hals/ril/reference-libril/ril_service.cpp /^ int32_t mSlotId;$/;" m struct:OemHookImpl typeref:typename:int32_t file:
+mSlotId guest/hals/ril/reference-libril/ril_service.cpp /^ int32_t mSlotId;$/;" m struct:RadioImpl_1_6 typeref:typename:int32_t file:
+mStartedJobs guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ private final Set<String> mStartedJobs;$/;" f class:JobExecutor file:
+mTag guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^ private final String mTag;$/;" f class:JobBase file:
+mTeleManager tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private TelephonyManager mTeleManager;$/;" f class:RilE2eTests file:
+mWifiManager guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private GceWifiManager mWifiManager = null;$/;" f class:GceService file:
+mWifiManager guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final WifiManager mWifiManager;$/;" f class:GceWifiManager file:
+mWifiManager tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ private WifiManager mWifiManager;$/;" f class:RilE2eTests file:
+mWifiManager tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private WifiManager mWifiManager;$/;" f class:WifiE2eTests file:
+mWifiReady guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ private final GceFuture<Boolean> mWifiReady =$/;" f class:GceWifiManager.MonitorWifiJob file:
+mWindowManager guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private WindowManager mWindowManager;$/;" f class:GceService file:
+m_ common/libs/concurrency/thread_safe_queue.h /^ std::mutex m_;$/;" m class:cuttlefish::ThreadSafeQueue typeref:typename:std::mutex
+mac_address common/libs/utils/network.h /^ std::uint8_t mac_address[6];$/;" m struct:cuttlefish::DnsmasqDhcp4Lease typeref:typename:std::uint8_t[6]
+magic host/libs/image_aggregator/image_aggregator.cc /^ Be32 magic;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+magic_cookie common/libs/utils/network.cpp /^ std::uint8_t magic_cookie[4];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[4] file:
+main common/frontend/socket_vsock_proxy/main.cpp /^int main(int argc, char* argv[]) {$/;" f typeref:typename:int
+main guest/commands/bt_vhci_forwarder/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main guest/commands/dlkm_loader/dlkm_loader.cpp /^int main(void) {$/;" f typeref:typename:int
+main guest/commands/rename_netiface/main.cpp /^int main(int argc, char *argv[]) {$/;" f typeref:typename:int
+main guest/commands/sensor_injection/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main guest/commands/setup_wifi/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main guest/commands/vsoc_input_service/main.cpp /^int main(int argc, char* argv[]) {$/;" f typeref:typename:int
+main guest/hals/bt/remote/service.cpp /^int main(int \/* argc *\/, char** \/* argv *\/) {$/;" f typeref:typename:int
+main guest/hals/camera/external-service.cpp /^int main() {$/;" f typeref:typename:int
+main guest/hals/confirmationui/service.cpp /^int main() {$/;" f typeref:typename:int
+main guest/hals/gatekeeper/remote/service.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main guest/hals/health/storage/service.cpp /^int main() {$/;" f typeref:typename:int
+main guest/hals/keymaster/remote/service4.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main guest/hals/keymint/remote/service.cpp /^int main(int, char** argv) {$/;" f typeref:typename:int
+main guest/hals/ril/reference-ril/reference-ril.c /^int main (int argc, char **argv)$/;" f typeref:typename:int
+main guest/hals/rild/rild_cuttlefish.c /^int main(int argc, char **argv) {$/;" f typeref:typename:int
+main guest/monitoring/tombstone_transmit/tombstone_producer.cpp /^int __attribute__((noreturn)) main() {$/;" f typeref:typename:int
+main guest/monitoring/tombstone_transmit/tombstone_transmit.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main guest/services/suspend_blocker/suspend_blocker.cpp /^int main() {$/;" f typeref:typename:int
+main host/commands/append_squashfs_overlay/src/main.rs /^fn main() -> Result<()> {$/;" f
+main host/commands/assemble_cvd/assemble_cvd.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/bt_connector/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/config_server/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/console_forwarder/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/cvd/main.cc /^int main(int argc, char** argv) { return cuttlefish::CvdMain(argc, argv); }$/;" f typeref:typename:int
+main host/commands/fetcher/fetch_cvd.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/health/health.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/host_bugreport/main.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/kernel_log_monitor/main.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/log_tee/log_tee.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/logcat_receiver/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/metrics/metrics.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/modem_simulator/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/modem_simulator/unittest/main_test.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/powerwash_cvd/powerwash_cvd.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/restart_cvd/restart_cvd.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/run_cvd/main.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/secure_env/secure_env.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/start/main.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/status/main.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/stop/main.cc /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/tombstone_receiver/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/commands/wmediumd_control/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/example_custom_actions/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/frontend/adb_connector/main.cpp /^int main(int argc, char* argv[]) {$/;" f typeref:typename:int
+main host/frontend/webrtc/main.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/frontend/webrtc_operator/server.cpp /^int main(int argc, char** argv) {$/;" f typeref:typename:int
+main host/libs/allocd/allocd.cpp /^int main(int argc, char* argv[]) {$/;" f typeref:typename:int
+main host/libs/allocd/test/client.cpp /^int main(int argc, char* argv[]) {$/;" f typeref:typename:int
+main host/libs/graphics_detector/detect_graphics.cpp /^int main(int argc, char* argv[]) {$/;" f typeref:typename:int
+main tools/create_base_image.go /^func main() {$/;" f package:main
+main tools/create_base_image.go /^package main$/;" p
+main tools/create_base_image_hostlib.sh /^main() {$/;" f
+main tools/flash-blk-dev.sh /^main()$/;" f
+main tools/upload_to_gce_and_run.py /^def main():$/;" f
+main tools/upload_via_ssh.py /^def main():$/;" f
+mainLoop guest/hals/ril/reference-ril/reference-ril.c /^mainLoop(void *param __unused)$/;" f typeref:typename:void * file:
+main_loop_thread_ host/libs/confui/host_server.h /^ std::thread main_loop_thread_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:std::thread
+make host/commands/fetcher/credential_source.cc /^std::unique_ptr<CredentialSource> FixedCredentialSource::make($/;" f class:cuttlefish::FixedCredentialSource typeref:typename:std::unique_ptr<CredentialSource>
+make host/commands/fetcher/credential_source.cc /^std::unique_ptr<CredentialSource> GceMetadataCredentialSource::make($/;" f class:cuttlefish::GceMetadataCredentialSource typeref:typename:std::unique_ptr<CredentialSource>
+makeSafeCallback host/commands/modem_simulator/thread_looper.h /^std::function<void()> makeSafeCallback($/;" f namespace:cuttlefish typeref:typename:std::function<void ()>
+makeSafeCallback host/commands/modem_simulator/thread_looper.h /^std::function<void()> makeSafeCallback(T *me, std::function<void(T *)> f) {$/;" f namespace:cuttlefish typeref:typename:std::function<void ()>
+makeSendSmsResult guest/hals/ril/reference-libril/ril_service.cpp /^SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,$/;" f typeref:typename:SendSmsResult
+makeSendSmsResult_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^SendSmsResult makeSendSmsResult_1_6($/;" f typeref:typename:SendSmsResult
+make_argv guest/hals/rild/rild_cuttlefish.c /^static int make_argv(char * args, char ** argv) {$/;" f typeref:typename:int file:
+make_device recovery/recovery_ui.cpp /^Device* make_device() {$/;" f typeref:typename:Device *
+managed_resources_ host/libs/allocd/resource_manager.h /^ std::map<uint32_t, std::shared_ptr<StaticResource>> managed_resources_;$/;" m class:cuttlefish::Session typeref:typename:std::map<uint32_t,std::shared_ptr<StaticResource>>
+managed_sessions_ host/libs/allocd/resource_manager.h /^ std::map<uint32_t, std::shared_ptr<Session>> managed_sessions_;$/;" m struct:cuttlefish::ResourceManager typeref:typename:std::map<uint32_t,std::shared_ptr<Session>>
+mapNetworkRegistrationResponse guest/hals/ril/reference-ril/reference-ril.c /^static int mapNetworkRegistrationResponse(int in_response) {$/;" f typeref:typename:int file:
+mapRadioAccessNetworkToTech guest/hals/ril/reference-ril/reference-ril.c /^int mapRadioAccessNetworkToTech(RIL_RadioAccessNetworks network) {$/;" f typeref:typename:int
+map_mutex_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::mutex map_mutex_;$/;" m class:WsConnectionContextImpl typeref:typename:std::mutex file:
+match host/commands/kernel_log_monitor/kernel_log_server.cc /^ std::string_view match; \/\/ Substring to match in the kernel logs$/;" m struct:__anonfa7764770111::__anonfa7764770208 typeref:typename:std::string_view file:
+match_data guest/hals/ril/reference-libril/ril.h /^ const char * match_data;$/;" m struct:__anon0bfbaecf2608 typeref:typename:const char *
+match_mode host/commands/modem_simulator/modem_service.h /^ MatchMode match_mode;$/;" m class:cuttlefish::CommandHandler typeref:typename:MatchMode
+match_type guest/hals/ril/reference-libril/ril.h /^ RIL_CarrierMatchType match_type; \/* Specify match type for the carrier.$/;" m struct:__anon0bfbaecf2608 typeref:typename:RIL_CarrierMatchType
+maxActiveData guest/hals/ril/reference-libril/ril.h /^ int maxActiveData;$/;" m struct:__anon0bfbaecfbc08 typeref:typename:int
+maxActiveInternetData guest/hals/ril/reference-libril/ril.h /^ int maxActiveInternetData;$/;" m struct:__anon0bfbaecfbc08 typeref:typename:int
+maxConns guest/hals/ril/reference-libril/ril.h /^ int maxConns;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+maxConns guest/hals/ril/reference-libril/ril.h /^ int maxConns;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+maxConnsTime guest/hals/ril/reference-libril/ril.h /^ int maxConnsTime;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+maxConnsTime guest/hals/ril/reference-libril/ril.h /^ int maxConnsTime;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+maxData guest/hals/ril/reference-libril/ril.h /^ int maxData;$/;" m struct:__anon0bfbaecf9108 typeref:typename:int
+maxDataCalls guest/hals/ril/reference-libril/ril.h /^ int32_t maxDataCalls; \/\/ The maximum number of simultaneous Data Calls tha/;" m struct:__anon0bfbaecf8008 typeref:typename:int32_t
+maxKeepaliveIntervalMillis guest/hals/ril/reference-libril/ril.h /^ int maxKeepaliveIntervalMillis; \/* Maximum milliseconds between two packets *\/$/;" m struct:__anon0bfbaecfc508 typeref:typename:int
+maxSearchTime guest/hals/ril/reference-libril/ril.h /^ int32_t maxSearchTime;$/;" m struct:__anon0bfbaecfb008 typeref:typename:int32_t
+maxStandby guest/hals/ril/reference-libril/ril.h /^ int maxStandby;$/;" m struct:__anon0bfbaecf9108 typeref:typename:int
+maxVoice guest/hals/ril/reference-libril/ril.h /^ int maxVoice;$/;" m struct:__anon0bfbaecf9108 typeref:typename:int
+max_blob_size_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ unsigned int max_blob_size_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:unsigned int
+max_elements_ common/libs/concurrency/thread_safe_queue.h /^ std::size_t max_elements_{};$/;" m class:cuttlefish::ThreadSafeQueue typeref:typename:std::size_t
+max_elements_handler_ common/libs/concurrency/thread_safe_queue.h /^ QueueFullHandler max_elements_handler_{};$/;" m class:cuttlefish::ThreadSafeQueue typeref:typename:QueueFullHandler
+max_message_size_ common/libs/utils/unix_sockets.h /^ std::uint32_t max_message_size_;$/;" m class:cuttlefish::UnixMessageSocket typeref:typename:std::uint32_t
+maximum_object_slots_ host/commands/secure_env/tpm_resource_manager.h /^ const std::uint32_t maximum_object_slots_;$/;" m class:cuttlefish::TpmResourceManager typeref:typename:const std::uint32_t
+mcc guest/hals/ril/reference-libril/ril.h /^ char* mcc; \/* MCC of the Carrier. *\/$/;" m struct:__anon0bfbaecf2c08 typeref:typename:char *
+mcc guest/hals/ril/reference-libril/ril.h /^ const char * mcc;$/;" m struct:__anon0bfbaecf2608 typeref:typename:const char *
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, in range[0, 999]; This value must$/;" m struct:__anon0bfbaecf6108 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5a08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5b08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5d08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5e08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5f08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7b08 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5808 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5908 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ int mcc; \/* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7808 typeref:typename:int
+mcc guest/hals/ril/reference-libril/ril.h /^ char * mcc; \/* MCC of the Carrier. *\/$/;" m struct:__anon0bfbaecf2a08 typeref:typename:char *
+mccMncs guest/hals/ril/reference-libril/ril.h /^ char **mccMncs;$/;" m struct:__anon0bfbaecfb008 typeref:typename:char **
+mccMncsNumbers guest/hals/ril/reference-libril/ril.h /^ uint32_t mccMncsNumbers;$/;" m struct:__anon0bfbaecfb008 typeref:typename:uint32_t
+md5 host/commands/fetcher/build_api.h /^ std::string md5;$/;" m class:cuttlefish::Artifact typeref:typename:std::string
+measurement_file_read_thread_ host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::thread measurement_file_read_thread_;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::thread file:
+members_ host/commands/secure_env/composite_serialization.h /^ std::vector<keymaster::Serializable*> members_;$/;" m class:cuttlefish::CompositeSerializable typeref:typename:std::vector<keymaster::Serializable * >
+memfd_create_wrapper common/libs/fs/shared_fd.cpp /^int memfd_create_wrapper(const char* name, unsigned int flags) {$/;" f namespace:cuttlefish::__anond70c3a4f0111 typeref:typename:int
+memory_mb host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::memory_mb() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+memory_mb shared/config/config_auto.json /^ "memory_mb" : 4096$/;" n
+memory_mb shared/config/config_foldable.json /^ "memory_mb" : 4096,$/;" n
+memory_mb shared/config/config_phone.json /^ "memory_mb" : 2048$/;" n
+memory_mb shared/config/config_tablet.json /^ "memory_mb" : 4096$/;" n
+memory_mb shared/config/config_tv.json /^ "memory_mb" : 2048$/;" n
+memsetAndFreeStrings guest/hals/ril/reference-libril/ril_service.cpp /^void memsetAndFreeStrings(int numPointers, ...) {$/;" f typeref:typename:void
+merge_fs host/commands/append_squashfs_overlay/src/main.rs /^fn merge_fs(src: &Path, overlay: &Path, dest: &Path, overwrite: bool) -> Result<()> {$/;" f
+message guest/hals/ril/reference-libril/ril.h /^ } message;$/;" m struct:__anon0bfbaecf1808 typeref:union:__anon0bfbaecf1808::__anon0bfbaecf190a
+message host/commands/modem_simulator/sms_service.h /^ std::string message;$/;" m struct:cuttlefish::SmsService::SmsMessage typeref:typename:std::string
+message host/frontend/webrtc_operator/assets/js/app.js /^ let message = {$/;" c class:DeviceControlApp.getCustomDeviceStateButtonCb
+messageRef guest/hals/ril/reference-libril/ril.h /^ int messageRef; \/* Valid field if retry is set to nonzero.$/;" m struct:__anon0bfbaecf1808 typeref:typename:int
+messageRef guest/hals/ril/reference-libril/ril.h /^ int messageRef; \/* TP-Message-Reference for GSM,$/;" m struct:__anon0bfbaecf1a08 typeref:typename:int
+message_ common/libs/confui/protocol_types.h /^ std::vector<std::uint8_t> message_;$/;" m class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:std::vector<std::uint8_t>
+message_ host/libs/confui/session.h /^ std::vector<std::uint8_t> message_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::vector<std::uint8_t>
+message_id_ host/commands/modem_simulator/sms_service.h /^ int message_id_;$/;" m class:cuttlefish::SmsService typeref:typename:int
+message_loop_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::thread message_loop_;$/;" m class:WsConnectionContextImpl typeref:typename:std::thread file:
+message_reference_ host/commands/modem_simulator/pdu_parser.h /^ std::string message_reference_;$/;" m class:cuttlefish::PDUParser typeref:typename:std::string
+message_reference_ host/commands/modem_simulator/sms_service.h /^ int message_reference_;$/;" m class:cuttlefish::SmsService typeref:typename:int
+message_sender_ host/frontend/webrtc/lib/camera_controller.h /^ std::function<bool(const Json::Value& msg)> message_sender_;$/;" m class:cuttlefish::CameraController typeref:typename:std::function<bool (const Json::Value & msg)>
+message_type common/libs/utils/network.cpp /^ Dhcp4MessageTypeOption message_type;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:Dhcp4MessageTypeOption file:
+message_type common/libs/utils/network.cpp /^ std::uint8_t message_type;$/;" m struct:cuttlefish::Dhcp4MessageTypeOption typeref:typename:std::uint8_t file:
+message_version guest/hals/keymaster/remote/remote_keymaster.h /^ uint32_t message_version() { return kDefaultMessageVersion; }$/;" f class:keymaster::RemoteKeymaster typeref:typename:uint32_t
+message_version guest/hals/keymint/remote/remote_keymaster.h /^ uint32_t message_version() { return message_version_; }$/;" f class:keymaster::RemoteKeymaster typeref:typename:uint32_t
+message_version_ guest/hals/keymint/remote/remote_keymaster.h /^ const uint32_t message_version_;$/;" m class:keymaster::RemoteKeymaster typeref:typename:const uint32_t
+messages_ host/frontend/webrtc_operator/client_handler.cpp /^ std::vector<Json::Value> messages_;$/;" m class:cuttlefish::PollConnectionHandler typeref:typename:std::vector<Json::Value> file:
+messages_on_sim_card_ host/commands/modem_simulator/sms_service.h /^ std::map<int, SmsMessage> messages_on_sim_card_;$/;" m class:cuttlefish::SmsService typeref:typename:std::map<int,SmsMessage>
+metadata host/commands/kernel_log_monitor/utils.h /^ Json::Value metadata;$/;" m struct:monitor::ReadEventResult typeref:typename:Json::Value
+metadata_ guest/hals/camera/vsock_camera_device_3_4.h /^ VsockCameraMetadata metadata_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:VsockCameraMetadata
+metadata_level common/libs/utils/tee_logging.h /^ MetadataLevel metadata_level;$/;" m struct:cuttlefish::SeverityTarget typeref:typename:MetadataLevel
+metrics_binary host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::metrics_binary() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+metrics_event host/commands/metrics/proto/cf_log.proto /^ optional MetricsEvent metrics_event = 5;$/;" f message:cuttlefish.CuttlefishLogEvent typeref:typename:MetricsEvent
+mic-capture-control host/frontend/webrtc_operator/assets/client.html /^ <div id="mic-capture-control" title="Capture Microphone"><\/div>$/;" I
+micSenders host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #micSenders = [];$/;" M class:DeviceConnection
+midDrag host/frontend/webrtc_operator/assets/js/controls.js /^ midDrag: false,$/;" p class:createModalButton.modalOffsets
+mids host/commands/modem_simulator/sms_service.h /^ std::string mids;$/;" m struct:cuttlefish::SmsService::BroadcastConfig typeref:typename:std::string
+misc_path_ host/libs/config/data_image.cpp /^ MiscImagePath& misc_path_;$/;" m class:cuttlefish::InitializeMiscImageImpl typeref:typename:MiscImagePath & file:
+misc_service_ host/commands/modem_simulator/modem_simulator.h /^ MiscService* misc_service_{nullptr};$/;" m class:cuttlefish::ModemSimulator typeref:typename:MiscService *
+misc_service_ host/commands/modem_simulator/network_service.h /^ MiscService* misc_service_ = nullptr;$/;" m class:cuttlefish::NetworkService typeref:typename:MiscService *
+mkv_mutex_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::mutex mkv_mutex_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Impl typeref:typename:std::mutex file:
+mnc guest/hals/ril/reference-libril/ril.h /^ char* mnc; \/* MNC of the Carrier. *\/$/;" m struct:__anon0bfbaecf2c08 typeref:typename:char *
+mnc guest/hals/ril/reference-libril/ril.h /^ const char * mnc;$/;" m struct:__anon0bfbaecf2608 typeref:typename:const char *
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, in range [0, 999], This value must /;" m struct:__anon0bfbaecf6108 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7b08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7808 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5808 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5908 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5a08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5b08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5d08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5e08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ int mnc; \/* 2 or 3-digit Mobile Network Code, 0..999;$/;" m struct:__anon0bfbaecf5f08 typeref:typename:int
+mnc guest/hals/ril/reference-libril/ril.h /^ char * mnc ; \/* MNC of the Carrier. *\/$/;" m struct:__anon0bfbaecf2a08 typeref:typename:char *
+mnc_digit guest/hals/ril/reference-libril/ril.h /^ int mnc_digit;\/*2 or 3-digit*\/$/;" m struct:__anon0bfbaecf7808 typeref:typename:int
+mnc_digit guest/hals/ril/reference-libril/ril.h /^ int mnc_digit;\/*2 or 3-digit*\/$/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+mnc_digit guest/hals/ril/reference-libril/ril.h /^ int mnc_digit;\/*2 or 3-digit*\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+mnc_digit guest/hals/ril/reference-libril/ril.h /^ int mnc_digit;\/*2 or 3-digit*\/$/;" m struct:__anon0bfbaecf7b08 typeref:typename:int
+mobile_bridge_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::mobile_bridge_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+mobile_tap host/commands/assemble_cvd/alloc.h /^ IfaceData mobile_tap;$/;" m struct:cuttlefish::IfaceConfig typeref:typename:IfaceData
+mobile_tap_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::mobile_tap_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+modalOffsets host/frontend/webrtc_operator/assets/js/controls.js /^ let modalOffsets = {$/;" c class:createModalButton
+mode common/libs/utils/flag_parser.h /^ FlagAliasMode mode;$/;" m struct:cuttlefish::FlagAlias typeref:typename:FlagAliasMode
+mode host/commands/modem_simulator/sms_service.h /^ int mode;$/;" m struct:cuttlefish::SmsService::BroadcastConfig typeref:typename:int
+mode host/commands/modem_simulator/sup_service.h /^ int mode; \/\/ 0: disable; 1: enable; 2: query status$/;" m struct:cuttlefish::SupService::CallWaitingInfo typeref:typename:int
+mode_flag_ host/libs/config/adb/flags.cpp /^ Flag mode_flag_;$/;" m class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:Flag file:
+mode_help host/libs/config/adb/flags.cpp /^ static constexpr char mode_help[] =$/;" m class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:char[] file:
+mode_mtx_ host/libs/confui/host_mode_ctrl.h /^ std::mutex mode_mtx_;$/;" m class:cuttlefish::HostModeCtrl typeref:typename:std::mutex
+mode_mtx_ host/libs/screen_connector/screen_connector_ctrl.h /^ std::mutex mode_mtx_;$/;" m class:cuttlefish::ScreenConnectorCtrl typeref:typename:std::mutex
+modem guest/hals/ril/reference-libril/ril.h /^ RIL_HardwareConfig_Modem modem;$/;" m union:__anon0bfbaecf9308::__anon0bfbaecf940a typeref:typename:RIL_HardwareConfig_Modem
+modem host/commands/modem_simulator/cf_device_config.cpp /^namespace modem {$/;" n namespace:cuttlefish file:
+modem host/commands/modem_simulator/device_config.h /^namespace modem {$/;" n namespace:cuttlefish
+modemCognitive guest/hals/ril/reference-libril/ril.h /^ int modemCognitive; \/* indicating the APN setting was sent to the modem through$/;" m struct:__anon0bfbaecfc108 typeref:typename:int
+modemId guest/hals/ril/reference-libril/ril.h /^ int modemId;$/;" m struct:__anon0bfbaecfbb08 typeref:typename:int
+modemResetInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::modemResetInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+modemUuid guest/hals/ril/reference-libril/ril.h /^ char modemUuid[MAX_UUID_LENGTH];$/;" m struct:__anon0bfbaecf9208 typeref:typename:char[]
+modem_ host/commands/modem_simulator/channel_monitor.h /^ ModemSimulator* modem_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:ModemSimulator *
+modem_id_ host/commands/modem_simulator/modem_simulator.h /^ int32_t modem_id_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:int32_t
+modem_radio_capability_ host/commands/modem_simulator/network_service.h /^ int modem_radio_capability_;$/;" m class:cuttlefish::NetworkService typeref:typename:int
+modem_services_ host/commands/modem_simulator/modem_simulator.h /^ std::map<ModemServiceType, std::unique_ptr<ModemService>> modem_services_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:std::map<ModemServiceType,std::unique_ptr<ModemService>>
+modem_side_ host/commands/modem_simulator/unittest/service_test.cpp /^ static Client* modem_side_;$/;" m class:ModemServiceTest typeref:typename:Client * file:
+modem_side_ host/commands/modem_simulator/unittest/service_test.cpp /^Client* ModemServiceTest::modem_side_ = nullptr;$/;" m class:ModemServiceTest typeref:typename:Client *
+modem_simulator_ host/commands/modem_simulator/unittest/service_test.cpp /^ static ModemSimulator* modem_simulator_;$/;" m class:ModemServiceTest typeref:typename:ModemSimulator * file:
+modem_simulator_ host/commands/modem_simulator/unittest/service_test.cpp /^ModemSimulator* ModemServiceTest::modem_simulator_ = nullptr;$/;" m class:ModemServiceTest typeref:typename:ModemSimulator *
+modem_simulator_host_id host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::modem_simulator_host_id() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+modem_simulator_instance_number host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::modem_simulator_instance_number() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+modem_simulator_ports host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::modem_simulator_ports() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+modem_simulator_sim_type host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::modem_simulator_sim_type() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+modem_technoloy host/commands/modem_simulator/nvram_config.cpp /^int NvramConfig::InstanceSpecific::modem_technoloy() const {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:int
+modes_ host/libs/config/adb/data.cpp /^ std::set<AdbMode> modes_;$/;" m class:cuttlefish::AdbConfigImpl typeref:typename:std::set<AdbMode> file:
+monitor host/commands/kernel_log_monitor/kernel_log_server.cc /^namespace monitor {$/;" n file:
+monitor host/commands/kernel_log_monitor/kernel_log_server.h /^namespace monitor {$/;" n
+monitor host/commands/kernel_log_monitor/utils.cc /^namespace monitor {$/;" n file:
+monitor host/commands/kernel_log_monitor/utils.h /^namespace monitor {$/;" n
+monitor_ host/commands/run_cvd/process_monitor.h /^ pid_t monitor_;$/;" m class:cuttlefish::ProcessMonitor typeref:typename:pid_t
+monitor_socket_ host/commands/run_cvd/process_monitor.h /^ SharedFD monitor_socket_;$/;" m class:cuttlefish::ProcessMonitor typeref:typename:SharedFD
+monitor_thread_ host/commands/modem_simulator/channel_monitor.h /^ std::thread monitor_thread_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:std::thread
+monitored_processes_ host/commands/run_cvd/process_monitor.h /^ std::vector<MonitorEntry> monitored_processes_;$/;" m class:cuttlefish::ProcessMonitor typeref:typename:std::vector<MonitorEntry>
+mouseCtx host/frontend/webrtc_operator/assets/js/app.js /^ let mouseCtx = {$/;" c class:DeviceControlApp.startMouseTracking
+mouseDownOffsetX host/frontend/webrtc_operator/assets/js/controls.js /^ mouseDownOffsetX: null,$/;" p class:createModalButton.modalOffsets
+mouseDownOffsetY host/frontend/webrtc_operator/assets/js/controls.js /^ mouseDownOffsetY: null,$/;" p class:createModalButton.modalOffsets
+msg common/libs/net/netlink_client.cpp /^ struct msghdr msg {};$/;" s function:cuttlefish::__anon61381e100111::NetlinkClientImpl::CheckResponse file:
+msg_len guest/hals/confirmationui/include/TrustyIpc.h /^ uint32_t msg_len;$/;" m struct:confirmationui_msg_args typeref:typename:uint32_t
+msg_queue host/libs/msg_queue/README.md /^# msg_queue$/;" c
+msgid host/libs/msg_queue/msg_queue.h /^ int msgid;$/;" m class:cuttlefish::SysVMessageQueue typeref:typename:int
+mtap host/libs/allocd/request.h /^ mtap, \/\/ mobile tap$/;" e enum:cuttlefish::IfaceType
+mtu guest/hals/ril/reference-libril/ril.h /^ int mtu; \/* MTU received from network$/;" m struct:__anon0bfbaecf1508 typeref:typename:int
+mtu guest/hals/ril/reference-libril/ril.h /^ int mtu; \/* maximum transmission unit (MTU) size in bytes *\/$/;" m struct:__anon0bfbaecfc108 typeref:typename:int
+mtu guest/hals/ril/reference-libril/ril.h /^ int mtu;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+mtuV4 guest/hals/ril/reference-libril/ril.h /^ int mtuV4; \/* MTU received from network for IPv4.$/;" m struct:__anon0bfbaecf1608 typeref:typename:int
+mtuV6 guest/hals/ril/reference-libril/ril.h /^ int mtuV6; \/* MTU received from network for IPv6.$/;" m struct:__anon0bfbaecf1608 typeref:typename:int
+mtx host/frontend/webrtc/audio_handler.h /^ std::mutex mtx;$/;" m struct:cuttlefish::AudioHandler::StreamDesc typeref:typename:std::mutex
+mtx_ common/libs/concurrency/semaphore.h /^ std::mutex mtx_;$/;" m class:cuttlefish::Semaphore typeref:typename:std::mutex
+mtx_ host/libs/confui/host_utils.h /^ std::mutex mtx_;$/;" m class:cuttlefish::confui::thread::ThreadTracer typeref:typename:std::mutex
+multiSimPolicy guest/hals/ril/reference-libril/ril.h /^ RIL_SimLockMultiSimPolicy multiSimPolicy; \/* multisim policy *\/$/;" m struct:__anon0bfbaecf2908 typeref:typename:RIL_SimLockMultiSimPolicy
+multiplexer_ host/libs/screen_connector/screen_connector_multiplexer.h /^ Multiplexer multiplexer_;$/;" m class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:Multiplexer
+multitouch_slot host/frontend/webrtc/connection_observer.cpp /^struct multitouch_slot {$/;" s namespace:cuttlefish file:
+mustShell tools/create_base_image.go /^func mustShell(cmd string) string {$/;" f package:main typeref:typename:string
+mute_on_ host/commands/modem_simulator/call_service.h /^ bool mute_on_;$/;" m class:cuttlefish::CallService typeref:typename:bool
+mutex_ guest/hals/camera/stream_buffer_cache.h /^ std::mutex mutex_;$/;" m class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:std::mutex
+mutex_ guest/hals/camera/vsock_camera_provider_2_7.h /^ std::mutex mutex_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:std::mutex
+mutex_ host/commands/fetcher/curl_wrapper.cc /^ std::mutex mutex_;$/;" m class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl typeref:typename:std::mutex file:
+mutex_instance guest/hals/ril/reference-libril/rilSocketQueue.h /^ pthread_mutex_t mutex_instance;$/;" m class:Ril_queue typeref:typename:pthread_mutex_t
+mvnoMatchData guest/hals/ril/reference-libril/ril.h /^ char *mvnoMatchData; \/* MVNO match data. Can be anything defined by the carrier.$/;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+mvnoMatchData guest/hals/ril/reference-libril/ril.h /^ char *mvnoMatchData;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+mvnoType guest/hals/ril/reference-libril/ril.h /^ char *mvnoType; \/* the MVNO type: possible values are "imsi", "gid", "spn" *\/$/;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+mvnoType guest/hals/ril/reference-libril/ril.h /^ char *mvnoType;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+myiccfile host/commands/modem_simulator/unittest/service_test.cpp /^static const char *myiccfile =$/;" v typeref:typename:const char * file:
+name apex/com.google.aosp_cf_x86_64_phone.rros/apex_manifest.json /^ "name": "com.google.aosp_cf_x86_64_phone.rros",$/;" s
+name apex/com.google.cf.bt/manifest.json /^ "name": "com.google.cf.bt",$/;" s
+name apex/com.google.cf.input.config/apex_manifest.json /^ "name": "com.android.input.config",$/;" s
+name apex/com.google.cf.rild/apex_manifest.json /^ "name": "com.google.cf.rild",$/;" s
+name apex/com.google.cf.wifi/apex_manifest.json /^ "name": "com.android.wifi.hal",$/;" s
+name common/libs/utils/flag_parser.h /^ std::string name;$/;" m struct:cuttlefish::FlagAlias typeref:typename:std::string
+name guest/hals/ril/reference-libril/RilSocket.h /^ const char* name;$/;" m class:RilSocket typeref:typename:const char *
+name guest/hals/ril/reference-libril/ril.h /^ char * name; \/* Remote party name *\/$/;" m struct:__anon0bfbaecf4208 typeref:typename:char *
+name guest/hals/ril/reference-libril/ril.h /^ char * name; \/* Remote party name *\/$/;" m struct:__anon0bfbaecf4308 typeref:typename:char *
+name guest/hals/ril/reference-libril/ril.h /^ char * name; \/* Remote party name *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:char *
+name guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_InfoRecName name;$/;" m struct:__anon0bfbaecf8908 typeref:typename:RIL_CDMA_InfoRecName
+name host/commands/assemble_cvd/alloc.h /^ std::string name;$/;" m struct:cuttlefish::IfaceData typeref:typename:std::string
+name host/commands/fetcher/build_api.h /^ std::string name;$/;" m class:cuttlefish::Artifact typeref:typename:std::string
+name host/libs/vm_manager/crosvm_manager.h /^ static std::string name() { return "crosvm"; }$/;" f class:cuttlefish::vm_manager::CrosvmManager typeref:typename:std::string
+name host/libs/vm_manager/qemu_manager.h /^ static std::string name() { return "qemu_cli"; }$/;" f class:cuttlefish::vm_manager::QemuManager typeref:typename:std::string
+name tests/hal/hal_implementation_test.cpp /^ std::string name;$/;" m struct:VersionedAidlPackage typeref:typename:std::string file:
+name2id_ host/libs/confui/host_utils.h /^ std::map<std::string, std::thread::id> name2id_;$/;" m class:cuttlefish::confui::thread::ThreadTracer typeref:typename:std::map<std::string,std::thread::id>
+namePresentation guest/hals/ril/reference-libril/ril.h /^ int namePresentation; \/* 0=Allowed, 1=Restricted, 2=Not Specified\/Unknown 3=Pa/;" m struct:__anon0bfbaecf1108 typeref:typename:int
+name_ common/libs/net/network_interface.h /^ std::string name_;$/;" m class:cuttlefish::NetworkInterface typeref:typename:std::string
+name_ host/commands/start/flag_forwarder.cc /^ std::string name_;$/;" m class:SubprocessFlag typeref:typename:std::string file:
+name_ host/libs/allocd/resource.h /^ std::string name_{};$/;" m class:cuttlefish::StaticResource typeref:typename:std::string
+nanos host/commands/metrics/proto/common.proto /^ required int32 nanos = 2;$/;" f message:Duration typeref:typename:int32
+nanos host/commands/metrics/proto/common.proto /^ required int32 nanos = 2;$/;" f message:Timestamp typeref:typename:int32
+nb_snapshots host/libs/image_aggregator/image_aggregator.cc /^ Be32 nb_snapshots;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+nci guest/hals/ril/reference-libril/ril.h /^ uint64_t nci; \/* NR Cell Identity in range [0, 68719476735] (36 bits) described in 3GP/;" m struct:__anon0bfbaecf6108 typeref:typename:uint64_t
+net2modem guest/hals/ril/reference-ril/reference-ril.c /^static int net2modem[] = {$/;" v typeref:typename:int[] file:
+net2pmask guest/hals/ril/reference-ril/reference-ril.c /^static int32_t net2pmask[] = {$/;" v typeref:typename:int32_t[] file:
+netlink_fd_ common/libs/net/netlink_client.cpp /^ SharedFD netlink_fd_;$/;" m class:cuttlefish::__anon61381e100111::NetlinkClientImpl typeref:typename:SharedFD file:
+networkId guest/hals/ril/reference-libril/ril.h /^ int networkId; \/* Network Id 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5c08 typeref:typename:int
+networkId guest/hals/ril/reference-libril/ril.h /^ int networkId; \/* Network Id 0..65535, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7c08 typeref:typename:int
+networkModePossible guest/hals/ril/reference-ril/reference-ril.c /^static int networkModePossible(ModemInfo *mdm, int nm)$/;" f typeref:typename:int file:
+networkScanResultInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::networkScanResultInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+networkStateChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::networkStateChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+network_infos guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfo_v12* network_infos; \/\/ List of network information$/;" m struct:__anon0bfbaecfb308 typeref:typename:RIL_CellInfo_v12 *
+network_infos_length guest/hals/ril/reference-libril/ril.h /^ uint32_t network_infos_length; \/\/ Total length of RIL_CellInfo$/;" m struct:__anon0bfbaecfb308 typeref:typename:uint32_t
+network_selection_mode host/commands/modem_simulator/nvram_config.cpp /^int NvramConfig::InstanceSpecific::network_selection_mode() const {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:int
+network_service_ host/commands/modem_simulator/call_service.h /^ NetworkService* network_service_;$/;" m class:cuttlefish::CallService typeref:typename:NetworkService *
+network_service_ host/commands/modem_simulator/modem_simulator.h /^ NetworkService* network_service_{nullptr};$/;" m class:cuttlefish::ModemSimulator typeref:typename:NetworkService *
+network_service_ host/commands/modem_simulator/sim_service.h /^ NetworkService* network_service_;$/;" m class:cuttlefish::SimService typeref:typename:NetworkService *
+network_thread_ host/frontend/webrtc/lib/streamer.cpp /^ std::unique_ptr<rtc::Thread> network_thread_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::unique_ptr<rtc::Thread> file:
+network_type host/commands/modem_simulator/network_service.h /^ AccessTechnoloy network_type;$/;" m struct:cuttlefish::NetworkService::NetworkRegistrationStatus typeref:typename:AccessTechnoloy
+newBroadcastSmsInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::newBroadcastSmsInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+newSmsInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::newSmsInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+newSmsOnSimInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::newSmsOnSimInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+newSmsStatusReportInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::newSmsStatusReportInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+new_action host/commands/kernel_log_monitor/main.cc /^ struct sigaction new_action {$/;" s function:main file:
+new_action host/commands/logcat_receiver/main.cpp /^ struct sigaction new_action {$/;" s function:main file:
+new_item_ common/libs/concurrency/thread_safe_queue.h /^ std::condition_variable new_item_;$/;" m class:cuttlefish::ThreadSafeQueue typeref:typename:std::condition_variable
+new_tombstone_create_notifier guest/monitoring/tombstone_transmit/tombstone_transmit.cpp /^static int new_tombstone_create_notifier(void) {$/;" f typeref:typename:int file:
+next guest/hals/ril/reference-libril/RilSapSocket.h /^ RilSapSocketList *next;$/;" m struct:RilSapSocket::RilSapSocketList typeref:typename:RilSapSocketList *
+next guest/hals/ril/reference-libril/ril_event.h /^ struct ril_event *next;$/;" m struct:ril_event typeref:struct:ril_event *
+nextTok guest/hals/ril/reference-ril/at_tok.c /^static char * nextTok(char **p_cur)$/;" f typeref:typename:char * file:
+next_disk_offset_ host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t next_disk_offset_;$/;" m class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:std::uint64_t file:
+next_frame_ guest/hals/camera/vsock_frame_provider.h /^ std::vector<char> next_frame_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::vector<char>
+next_frame_mutex_ host/frontend/webrtc/display_handler.h /^ std::mutex next_frame_mutex_;$/;" m class:cuttlefish::DisplayHandler typeref:typename:std::mutex
+next_request_wait_millis host/commands/metrics/proto/clientanalytics.proto /^ optional int64 next_request_wait_millis = 1;$/;" f message:LogResponse typeref:typename:int64
+next_serial_ host/commands/modem_simulator/thread_looper.h /^ std::atomic<Serial> next_serial_;$/;" m class:cuttlefish::ThreadLooper typeref:typename:std::atomic<Serial>
+next_tombstone_path host/commands/tombstone_receiver/main.cpp /^static std::string next_tombstone_path(const std::string& tombstone_dir) {$/;" f namespace:cuttlefish typeref:typename:std::string file:
+nfds guest/hals/ril/reference-libril/ril_event.cpp /^static int nfds = 0;$/;" v typeref:typename:int file:
+ngran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_NgranBands ngran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfab08::__anon0bfbaecfac0a typeref:typename:RIL_NgranBands[]
+ngran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_NgranBands ngran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfae08::__anon0bfbaecfaf0a typeref:typename:RIL_NgranBands[]
+nitzTimeReceived guest/hals/ril/reference-libril/ril_service.cpp /^int64_t nitzTimeReceived[1];$/;" v typeref:typename:int64_t[1]
+nitzTimeReceived guest/hals/ril/reference-libril/ril_service.cpp /^int64_t nitzTimeReceived[SIM_COUNT];$/;" v typeref:typename:int64_t[]
+nitzTimeReceivedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::nitzTimeReceivedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+nl_client_ common/libs/net/network_interface_manager.h /^ std::unique_ptr<NetlinkClient> nl_client_;$/;" m class:cuttlefish::NetworkInterfaceManager typeref:typename:std::unique_ptr<NetlinkClient>
+nmea host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^ string nmea = 1;$/;" f message:gnss_grpc_proxy.SendNmeaRequest typeref:typename:string
+nmea_file_read_thread_ host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::thread nmea_file_read_thread_;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::thread file:
+node1_mac_ host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ uint8_t node1_mac_[6];$/;" m class:cuttlefish::WmediumdMessageSetSnr typeref:typename:uint8_t[6]
+node2_mac_ host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ uint8_t node2_mac_[6];$/;" m class:cuttlefish::WmediumdMessageSetSnr typeref:typename:uint8_t[6]
+noopRemoveWarning guest/hals/ril/reference-ril/reference-ril.c /^static void *noopRemoveWarning( void *a ) { return a; }$/;" f typeref:typename:void * file:
+notificationType guest/hals/ril/reference-libril/ril.h /^ int notificationType; \/*$/;" m struct:__anon0bfbaecf3108 typeref:typename:int
+notifyDeviceStateChange guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<void> VsockCameraProvider::notifyDeviceStateChange($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<void>
+notifyError guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::notifyError(uint32_t frame_number,$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+notifyShutter guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::notifyShutter(uint32_t frame_number,$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+nr guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoNr nr;$/;" m union:__anon0bfbaecf7208::__anon0bfbaecf730a typeref:typename:RIL_CellInfoNr
+nr_csi_rsrp host/commands/modem_simulator/network_service.h /^ int32_t nr_csi_rsrp; \/* CSI reference signal received power, multiplied by -1.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int32_t
+nr_csi_rsrq host/commands/modem_simulator/network_service.h /^ int32_t nr_csi_rsrq; \/* CSI reference signal received quality, multiplied by -1.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int32_t
+nr_csi_sinr host/commands/modem_simulator/network_service.h /^ int32_t nr_csi_sinr; \/* CSI signal-to-noise and interference ratio.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int32_t
+nr_ss_rsrp host/commands/modem_simulator/network_service.h /^ int32_t nr_ss_rsrp; \/* SS reference signal received power, multiplied by -1.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int32_t
+nr_ss_rsrq host/commands/modem_simulator/network_service.h /^ int32_t nr_ss_rsrq; \/* SS reference signal received quality, multiplied by -1.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int32_t
+nr_ss_sinr host/commands/modem_simulator/network_service.h /^ int32_t nr_ss_sinr; \/* SS signal-to-noise and interference ratio.$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int32_t
+nrarfcn guest/hals/ril/reference-libril/ril.h /^ int32_t nrarfcn; \/* NR Absolute Radio Frequency Channel Number, in range [0, 3279165].$/;" m struct:__anon0bfbaecf6108 typeref:typename:int32_t
+null_ptr_ common/libs/concurrency/multiplexer.h /^ QueuePtr null_ptr_;$/;" m class:cuttlefish::Multiplexer typeref:typename:QueuePtr
+numOfLiveModems guest/hals/ril/reference-libril/ril.h /^ int numOfLiveModems;$/;" m struct:__anon0bfbaecfbd08 typeref:typename:int
+numValidIndexes guest/hals/ril/reference-libril/ril.h /^ int numValidIndexes; \/* This gives the number of valid values in cfInfo.$/;" m struct:__anon0bfbaecf9808 typeref:typename:int
+num_applications guest/hals/ril/reference-libril/ril.h /^ int num_applications; \/* value <= RIL_CARD_MAX_APPS *\/$/;" m struct:__anon0bfbaecf3908 typeref:typename:int
+num_applications guest/hals/ril/reference-libril/ril.h /^ int num_applications; \/* value <= RIL_CARD_MAX_APPS *\/$/;" m struct:__anon0bfbaecf3a08 typeref:typename:int
+num_partition_entries host/libs/image_aggregator/image_aggregator.cc /^ std::uint32_t num_partition_entries;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint32_t file:
+num_sectors host/libs/config/mbr.h /^ std::uint32_t num_sectors;$/;" m struct:MbrPartitionEntry typeref:typename:std::uint32_t
+num_tombstones_in_last_second host/commands/tombstone_receiver/main.cpp /^static uint num_tombstones_in_last_second = 0;$/;" v namespace:cuttlefish typeref:typename:uint file:
+number guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_NumberInfoRecord number;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_NumberInfoRecord
+number guest/hals/ril/reference-libril/ril.h /^ char * number; \/* Remote party number *\/$/;" m struct:__anon0bfbaecf4208 typeref:typename:char *
+number guest/hals/ril/reference-libril/ril.h /^ char * number; \/* Remote party number *\/$/;" m struct:__anon0bfbaecf4308 typeref:typename:char *
+number guest/hals/ril/reference-libril/ril.h /^ char * number; \/* "number" from TS 27.007 7.11. May be NULL *\/$/;" m struct:__anon0bfbaecf2108 typeref:typename:char *
+number guest/hals/ril/reference-libril/ril.h /^ char * number; \/* Remote party number *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:char *
+number guest/hals/ril/reference-libril/ril.h /^ char * number; \/* "number" from 27.007 7.17$/;" m struct:__anon0bfbaecf3108 typeref:typename:char *
+number host/commands/modem_simulator/call_service.h /^ std::string number;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:std::string
+number host/commands/modem_simulator/sup_service.h /^ std::string number; \/\/ "number" from TS 27.007 7.11. May be NULL$/;" m struct:cuttlefish::SupService::CallForwardInfo typeref:typename:std::string
+numberOfInfoRecs guest/hals/ril/reference-libril/ril.h /^ char numberOfInfoRecs;$/;" m struct:__anon0bfbaecf8b08 typeref:typename:char
+numberPresentation guest/hals/ril/reference-libril/ril.h /^ int numberPresentation; \/* 0=Allowed, 1=Restricted, 2=Not Specified\/Unknown *\/$/;" m struct:__anon0bfbaecf4208 typeref:typename:int
+numberPresentation guest/hals/ril/reference-libril/ril.h /^ int numberPresentation; \/* 0=Allowed, 1=Restricted, 2=Not Specified\/Unknown *\/$/;" m struct:__anon0bfbaecf4308 typeref:typename:int
+numberPresentation guest/hals/ril/reference-libril/ril.h /^ int numberPresentation; \/* 0=Allowed, 1=Restricted, 2=Not Specified\/Unknown 3=/;" m struct:__anon0bfbaecf1108 typeref:typename:int
+number_of_ones common/libs/device_config/host_device_config.cpp /^uint8_t number_of_ones(unsigned long val) {$/;" f namespace:cuttlefish::__anonf277137d0111 typeref:typename:uint8_t
+number_plan guest/hals/ril/reference-libril/ril.h /^ int number_plan; \/* 0=Unknown, 1=ISDN, 3=Data, 4=Telex, 8=Nat'l, 9=Priva/;" m struct:__anon0bfbaecf4308 typeref:typename:int
+number_plan guest/hals/ril/reference-libril/ril.h /^ char number_plan;$/;" m struct:__anon0bfbaecf8308 typeref:typename:char
+number_type guest/hals/ril/reference-libril/ril.h /^ int number_type; \/* 0=Unknown, 1=International, 2=National,$/;" m struct:__anon0bfbaecf4308 typeref:typename:int
+number_type guest/hals/ril/reference-libril/ril.h /^ char number_type;$/;" m struct:__anon0bfbaecf8308 typeref:typename:char
+number_type host/commands/modem_simulator/sup_service.h /^ int number_type; \/\/ From 27.007 +CCFC\/+CLCK "class"$/;" m struct:cuttlefish::SupService::CallForwardInfo typeref:typename:int
+numeric host/commands/modem_simulator/network_service.h /^ std::string numeric;$/;" m struct:cuttlefish::NetworkService::NetworkOperator typeref:typename:std::string
+nvReadItem guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::nvReadItem(int32_t serial, NvItem itemId) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+nvReadItemResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::nvReadItemResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+nvResetConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::nvResetConfig(int32_t serial, ResetNvType resetType) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+nvResetConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::nvResetConfigResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+nvWriteCdmaPrl guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+nvWriteCdmaPrlResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::nvWriteCdmaPrlResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+nvWriteItem guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::nvWriteItem(int32_t serial, const NvWriteItem& item) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+nvWriteItemResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::nvWriteItemResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+observer_ host/frontend/webrtc/lib/client_handler.cpp /^ std::shared_ptr<ConnectionObserver> observer_;$/;" m class:cuttlefish::webrtc_streaming::AdbChannelHandler typeref:typename:std::shared_ptr<ConnectionObserver> file:
+observer_ host/frontend/webrtc/lib/client_handler.cpp /^ std::shared_ptr<ConnectionObserver> observer_;$/;" m class:cuttlefish::webrtc_streaming::BluetoothChannelHandler typeref:typename:std::shared_ptr<ConnectionObserver> file:
+observer_ host/frontend/webrtc/lib/client_handler.cpp /^ std::shared_ptr<ConnectionObserver> observer_;$/;" m class:cuttlefish::webrtc_streaming::CameraChannelHandler typeref:typename:std::shared_ptr<ConnectionObserver> file:
+observer_ host/frontend/webrtc/lib/client_handler.cpp /^ std::shared_ptr<ConnectionObserver> observer_;$/;" m class:cuttlefish::webrtc_streaming::ControlChannelHandler typeref:typename:std::shared_ptr<ConnectionObserver> file:
+observer_ host/frontend/webrtc/lib/client_handler.cpp /^ std::shared_ptr<ConnectionObserver> observer_;$/;" m class:cuttlefish::webrtc_streaming::InputChannelHandler typeref:typename:std::shared_ptr<ConnectionObserver> file:
+observer_ host/frontend/webrtc/lib/client_handler.h /^ std::shared_ptr<ConnectionObserver> observer_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::shared_ptr<ConnectionObserver>
+observer_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::weak_ptr<WsConnectionObserver> observer_;$/;" m class:WsConnectionImpl typeref:typename:std::weak_ptr<WsConnectionObserver> file:
+observers_mutex_ host/frontend/webrtc/lib/audio_track_source_impl.h /^ std::mutex observers_mutex_;$/;" m class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:std::mutex
+oemHookRawInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::oemHookRawInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+oemHookService guest/hals/ril/reference-libril/ril_service.cpp /^sp<OemHookImpl> oemHookService[1];$/;" v typeref:typename:sp<OemHookImpl>[1]
+oemHookService guest/hals/ril/reference-libril/ril_service.cpp /^sp<OemHookImpl> oemHookService[SIM_COUNT];$/;" v typeref:typename:sp<OemHookImpl>[]
+offset common/libs/net/netlink_request_test.cpp /^ size_t offset = sizeof(nlmsghdr);$/;" v namespace:cuttlefish::__anon1ff2f3d90111 typeref:typename:size_t
+offset host/libs/image_aggregator/cdisk_spec.proto /^ uint64 offset = 2;$/;" f message:ComponentDisk typeref:typename:uint64
+offset host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t offset;$/;" m struct:cuttlefish::__anon02806fd80111::PartitionInfo typeref:typename:std::uint64_t file:
+ok host/frontend/webrtc/lib/utils.h /^ bool ok() const { return !error_.has_value(); }$/;" f class:cuttlefish::webrtc_streaming::ValidationResult typeref:typename:bool
+onATReaderClosed guest/hals/ril/reference-ril/reference-ril.c /^static void onATReaderClosed()$/;" f typeref:typename:void file:
+onATTimeout guest/hals/ril/reference-ril/reference-ril.c /^static void onATTimeout()$/;" f typeref:typename:void file:
+onAdbMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #onAdbMessage;$/;" M class:DeviceConnection
+onAdbMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ onAdbMessage(cb) {$/;" m class:DeviceConnection
+onAnswer host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async #onAnswer(answer) {$/;" m class:Controller
+onBind guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public IBinder onBind(Intent intent) {$/;" m class:GceService
+onBluetoothMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #onBluetoothMessage;$/;" M class:DeviceConnection
+onBluetoothMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ onBluetoothMessage(cb) {$/;" m class:DeviceConnection
+onCameraCaptureToggle host/frontend/webrtc_operator/assets/js/app.js /^ #onCameraCaptureToggle(enabled) {$/;" m class:DeviceControlApp
+onCancel guest/hals/ril/reference-libril/ril.h /^ RIL_Cancel onCancel;$/;" m struct:__anon0bfbaecfbf08 typeref:typename:RIL_Cancel
+onCancel guest/hals/ril/reference-ril/reference-ril.c /^static void onCancel (RIL_Token t __unused)$/;" f typeref:typename:void file:
+onCommand host/frontend/webrtc_operator/assets/js/controls.js /^ let onCommand =$/;" f function:cmdConsole
+onConfigurationChanged guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public void onConfigurationChanged(Configuration config) {$/;" m class:GceService
+onConnectionStateChange host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ onConnectionStateChange(cb) {$/;" m class:DeviceConnection
+onContinueDrag host/frontend/webrtc_operator/assets/js/app.js /^ function onContinueDrag(e) {$/;" f function:DeviceControlApp.startMouseTracking
+onControlMessage host/frontend/webrtc_operator/assets/js/app.js /^ #onControlMessage(message) {$/;" m class:DeviceControlApp
+onControlMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #onControlMessage;$/;" M class:DeviceConnection
+onControlMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ onControlMessage(cb) {$/;" m class:DeviceConnection
+onControlPanelButton host/frontend/webrtc_operator/assets/js/app.js /^ #onControlPanelButton(e) {$/;" m class:DeviceControlApp
+onCreate guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public void onCreate() {$/;" m class:GceService
+onCustomShellButton host/frontend/webrtc_operator/assets/js/app.js /^ #onCustomShellButton(shell_command, e) {$/;" m class:DeviceControlApp
+onDataCallListChanged guest/hals/ril/reference-ril/reference-ril.c /^static void onDataCallListChanged(void *param __unused)$/;" f typeref:typename:void file:
+onDependencyFailed guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/BluetoothChecker.java /^ public void onDependencyFailed(Exception e) {$/;" m class:BluetoothChecker
+onDependencyFailed guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ public void onDependencyFailed(Exception e) {$/;" m class:ConnectivityChecker
+onDependencyFailed guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public void onDependencyFailed(Exception e) {$/;" m class:EventReporter
+onDependencyFailed guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public void onDependencyFailed(Exception e) {$/;" m class:GceWifiManager.MonitorWifiJob
+onDependencyFailed guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceWifiManager.java /^ public void onDependencyFailed(Exception e) {$/;" m class:GceWifiManager
+onDependencyFailed guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^ public abstract void onDependencyFailed(Exception exception);$/;" m class:JobBase
+onDependencyStraggling guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public void onDependencyStraggling(ArrayList<GceFuture<?>> deps) {$/;" m class:EventReporter
+onDependencyStraggling guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobBase.java /^ public void onDependencyStraggling(ArrayList<GceFuture<?>> stragglingDependencies) {$/;" m class:JobBase
+onDestroy guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public void onDestroy() {$/;" m class:GceService
+onDeviceDisplayLoaded host/frontend/webrtc_operator/assets/js/app.js /^ #onDeviceDisplayLoaded() {$/;" m class:DeviceControlApp
+onDeviceMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #onDeviceMessage(message) {$/;" m class:Controller
+onDeviceMsg host/frontend/webrtc_operator/assets/js/server_connector.js /^ onDeviceMsg(cb) {$/;" m class:PollingConnector
+onDeviceMsg host/frontend/webrtc_operator/assets/js/server_connector.js /^ onDeviceMsg(cb) {$/;" m class:WebsocketConnector
+onDeviceMsgCb host/frontend/webrtc_operator/assets/js/server_connector.js /^ #onDeviceMsgCb = msg =>$/;" M class:PollingConnector
+onDeviceMsgCb host/frontend/webrtc_operator/assets/js/server_connector.js /^ #onDeviceMsgCb = msg =>$/;" M class:WebsocketConnector
+onEndDrag host/frontend/webrtc_operator/assets/js/app.js /^ function onEndDrag(e) {$/;" f function:DeviceControlApp.startMouseTracking
+onIccSlotStatus guest/hals/ril/reference-ril/reference-ril.c /^void onIccSlotStatus(RIL_Token t) {$/;" f typeref:typename:void
+onIceCandidate host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #onIceCandidate(iceCandidate) {$/;" m class:Controller
+onKeyEvent host/frontend/webrtc_operator/assets/js/app.js /^ #onKeyEvent(e) {$/;" m class:DeviceControlApp
+onKeyboardCaptureToggle host/frontend/webrtc_operator/assets/js/app.js /^ #onKeyboardCaptureToggle(enabled) {$/;" m class:DeviceControlApp
+onMicCaptureToggle host/frontend/webrtc_operator/assets/js/app.js /^ #onMicCaptureToggle(enabled) {$/;" m class:DeviceControlApp
+onNewCommandConnect guest/hals/ril/reference-libril/ril.cpp /^void onNewCommandConnect(RIL_SOCKET_ID socket_id) {$/;" f namespace:android typeref:typename:void
+onOffer host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async #onOffer(desc) {$/;" m class:Controller
+onRadioPowerOn guest/hals/ril/reference-ril/reference-ril.c /^static void onRadioPowerOn()$/;" f typeref:typename:void file:
+onReaderClosed guest/hals/ril/reference-ril/atchannel.c /^static void onReaderClosed()$/;" f typeref:typename:void file:
+onReceive guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java /^ public void onReceive(Context context, Intent intent) {$/;" m class:GceBroadcastReceiver
+onRequest guest/hals/ril/reference-libril/ril.h /^ RIL_RequestFunc onRequest;$/;" m struct:__anon0bfbaecfbf08 typeref:typename:RIL_RequestFunc
+onRequest guest/hals/ril/reference-ril/reference-ril.c /^onRequest (int request, void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+onRequestComplete guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::onRequestComplete(RIL_Token t, RIL_Errno e, void *response,$/;" f class:RilSapSocket typeref:typename:void
+onRotateButton host/frontend/webrtc_operator/assets/js/app.js /^ #onRotateButton(e) {$/;" m class:DeviceControlApp
+onSIMReady guest/hals/ril/reference-ril/reference-ril.c /^static void onSIMReady()$/;" f typeref:typename:void file:
+onStartCommand guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ public int onStartCommand(Intent intent, int flags, int startId) {$/;" m class:GceService
+onStartDrag host/frontend/webrtc_operator/assets/js/app.js /^ function onStartDrag(e) {$/;" f function:DeviceControlApp.startMouseTracking
+onStateRequest guest/hals/ril/reference-libril/ril.h /^ RIL_RadioStateRequest onStateRequest;$/;" m struct:__anon0bfbaecfbf08 typeref:typename:RIL_RadioStateRequest
+onSupplementaryServiceIndicationInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::onSupplementaryServiceIndicationInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+onSupports guest/hals/ril/reference-ril/reference-ril.c /^onSupports (int requestCode __unused)$/;" f typeref:typename:int file:
+onUnsolicited guest/hals/ril/reference-ril/reference-ril.c /^static void onUnsolicited (const char *s, const char *sms_pdu)$/;" f typeref:typename:void file:
+onUnsolicitedResponse guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::onUnsolicitedResponse(int unsolResponse, void *data, size_t datalen) {$/;" f class:RilSapSocket typeref:typename:void
+onUpdatePhysicalChannelconfigs host/commands/modem_simulator/data_service.cpp /^void DataService::onUpdatePhysicalChannelconfigs(int modem_tech, int freq,$/;" f class:cuttlefish::DataService typeref:typename:void
+onUssdInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::onUssdInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+onVideoCaptureToggle host/frontend/webrtc_operator/assets/js/app.js /^ #onVideoCaptureToggle(enabled) {$/;" m class:DeviceControlApp
+onWebsocketMessage host/frontend/webrtc_operator/assets/js/server_connector.js /^ #onWebsocketMessage(message) {$/;" m class:WebsocketConnector
+on_close_ host/libs/graphics_detector/graphics_detector.cpp /^ std::function<void()> on_close_;$/;" m class:cuttlefish::__anon29a199ff0111::Closer typeref:typename:std::function<void ()> file:
+on_connection_changed_cb_ host/frontend/webrtc/lib/client_handler.h /^ std::function<void(bool)> on_connection_changed_cb_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::function<void (bool)>
+on_consumed_ host/libs/audio_connector/buffers.h /^ OnConsumedCb on_consumed_;$/;" m class:cuttlefish::ShmBuffer typeref:typename:OnConsumedCb
+on_error_ host/frontend/webrtc/lib/client_handler.cpp /^ std::function<void(webrtc::RTCError error)> on_error_;$/;" m class:cuttlefish::webrtc_streaming::__anond0fc42ea0111::CvdOnSetRemoteDescription typeref:typename:std::function<void (webrtc::RTCError error)> file:
+on_next_frame_cnt_ host/libs/screen_connector/screen_connector.h /^ unsigned long long int on_next_frame_cnt_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:unsigned long long int
+on_next_frame_cnt_ host/libs/screen_connector/screen_connector_multiplexer.h /^ unsigned long long int on_next_frame_cnt_;$/;" m class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:unsigned long long int
+onframe_mutex_ host/frontend/webrtc/lib/camera_streamer.h /^ std::mutex onframe_mutex_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::mutex
+op common/libs/utils/network.cpp /^ std::uint8_t op;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t file:
+opHandle_ guest/hals/keymint/remote/remote_keymint_operation.h /^ keymaster_operation_handle_t opHandle_;$/;" m class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation typeref:typename:keymaster_operation_handle_t
+open guest/hals/camera/vsock_camera_device_3_4.cpp /^Return<void> VsockCameraDevice::open(const sp<ICameraDeviceCallback>& callback,$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:Return<void>
+openLogicalChannel host/commands/modem_simulator/unittest/service_test.cpp /^ int openLogicalChannel(std::string& name) {$/;" f class:ModemServiceTest typeref:typename:int file:
+openSocket host/commands/bt_connector/main.cpp /^void openSocket(cuttlefish::SharedFD* fd, int port) {$/;" f typeref:typename:void
+oper_selection_mode_ host/commands/modem_simulator/network_service.h /^ OperatorSelectionMode oper_selection_mode_;$/;" m class:cuttlefish::NetworkService typeref:typename:OperatorSelectionMode
+operator != common/libs/fs/shared_fd.h /^ bool operator!=(const SharedFD& rhs) const { return value_ != rhs.value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+operator () common/libs/security/gatekeeper_channel.cpp /^void GatekeeperCommandDestroyer::operator()(GatekeeperRawMessage* ptr) {$/;" f class:cuttlefish::GatekeeperCommandDestroyer typeref:typename:void
+operator () common/libs/security/keymaster_channel.cpp /^void KeymasterCommandDestroyer::operator()(keymaster_message* ptr) {$/;" f class:cuttlefish::KeymasterCommandDestroyer typeref:typename:void
+operator () common/libs/utils/tee_logging.cpp /^void TeeLogger::operator()($/;" f class:cuttlefish::TeeLogger typeref:typename:void
+operator () guest/hals/camera/vsock_camera_device_session_3_4.h /^ bool operator()(const ReadVsockRequest& lhs, const ReadVsockRequest& rhs) {$/;" f struct:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::VsockRequestComparator typeref:typename:bool
+operator () host/commands/fetcher/build_api.cc /^ void operator()(DIR* dir) {$/;" f struct:cuttlefish::CloseDir typeref:typename:void file:
+operator () host/commands/secure_env/tpm_hmac.h /^ void operator()(void* data) { Esys_Free(data); }$/;" f struct:cuttlefish::EsysDeleter typeref:typename:void
+operator () host/commands/secure_env/tpm_keymaster_enforcement.cpp /^ bool operator()($/;" f class:cuttlefish::CompareHmacSharingParams typeref:typename:bool file:
+operator () host/libs/graphics_detector/graphics_detector.cpp /^ void operator()(void* library) { dlclose(library); }$/;" f struct:cuttlefish::__anon29a199ff0111::LibraryCloser typeref:typename:void file:
+operator * common/libs/fs/shared_fd.h /^ FileInstance& operator*() { return *value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:FileInstance &
+operator * common/libs/fs/shared_fd.h /^ const FileInstance& operator*() const { return *value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:const FileInstance &
+operator * host/commands/modem_simulator/command_parser.h /^ const std::string_view& operator*() const { return command_; }$/;" f class:cuttlefish::CommandParser typeref:typename:const std::string_view &
+operator -> common/libs/fs/shared_fd.h /^ std::shared_ptr<FileInstance> operator->() const { return value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:std::shared_ptr<FileInstance>
+operator -> host/commands/modem_simulator/command_parser.h /^ const std::string_view* operator->() const { return &command_; }$/;" f class:cuttlefish::CommandParser typeref:typename:const std::string_view *
+operator < common/libs/fs/shared_fd.h /^ bool operator<(const SharedFD& rhs) const { return value_ < rhs.value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+operator < tests/hal/hal_implementation_test.cpp /^ bool operator<(const VersionedAidlPackage& rhs) const {$/;" f struct:VersionedAidlPackage typeref:typename:bool file:
+operator << common/libs/utils/flag_parser.cpp /^std::ostream& operator<<(std::ostream& out, const Flag& flag) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << common/libs/utils/flag_parser.cpp /^std::ostream& operator<<(std::ostream& out, const FlagAlias& alias) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << common/libs/utils/network.cpp /^std::ostream& operator<<(std::ostream& out, const DnsmasqDhcp4Lease& lease) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << host/commands/fetcher/build_api.cc /^std::ostream& operator<<(std::ostream& out, const Build& build) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << host/commands/fetcher/build_api.cc /^std::ostream& operator<<(std::ostream& out, const DeviceBuild& build) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << host/commands/fetcher/build_api.cc /^std::ostream& operator<<(std::ostream& out, const DirectoryBuild& build) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << host/libs/config/fetcher_config.cpp /^std::ostream& operator<<(std::ostream& os, const CvdFile& cvd_file) {$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator << host/libs/graphics_detector/graphics_detector.cpp /^std::ostream& operator<<(std::ostream& stream,$/;" f namespace:cuttlefish typeref:typename:std::ostream &
+operator <= common/libs/fs/shared_fd.h /^ bool operator<=(const SharedFD& rhs) const { return value_ <= rhs.value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+operator <= host/commands/modem_simulator/thread_looper.cpp /^bool ThreadLooper::Event::operator<=(const Event &other) const {$/;" f class:cuttlefish::ThreadLooper::Event typeref:typename:bool
+operator = common/libs/utils/subprocess.cpp /^Subprocess& Subprocess::operator=(Subprocess&& other) {$/;" f class:cuttlefish::Subprocess typeref:typename:Subprocess &
+operator = common/libs/utils/tcp_socket.h /^ ClientSocket& operator=(ClientSocket&& other) {$/;" f class:cuttlefish::ClientSocket typeref:typename:ClientSocket &
+operator = common/libs/utils/unix_sockets.cpp /^ControlMessage& ControlMessage::operator=(ControlMessage&& existing) {$/;" f class:cuttlefish::ControlMessage typeref:typename:ControlMessage &
+operator = guest/hals/camera/cached_stream_buffer.cpp /^CachedStreamBuffer& CachedStreamBuffer::operator=($/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:CachedStreamBuffer &
+operator == common/libs/fs/shared_fd.h /^ bool operator==(const SharedFD& rhs) const { return value_ == rhs.value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+operator == host/commands/modem_simulator/channel_monitor.cpp /^bool Client::operator==(const Client& other) const {$/;" f class:cuttlefish::Client typeref:typename:bool
+operator == host/commands/modem_simulator/command_parser.h /^ bool operator==(const std::string &rhs) const { return command_ == rhs; }$/;" f class:cuttlefish::CommandParser typeref:typename:bool
+operator == host/commands/secure_env/tpm_keymaster_enforcement.cpp /^bool operator==(const HmacSharingParameters& a,$/;" f namespace:cuttlefish::__anon0281e17c0111 typeref:typename:bool
+operator == host/commands/secure_env/tpm_keymaster_enforcement.cpp /^inline bool operator==(const keymaster_blob_t& a, const keymaster_blob_t& b) {$/;" f namespace:cuttlefish::__anon0281e17c0111 typeref:typename:bool
+operator > common/libs/fs/shared_fd.h /^ bool operator>(const SharedFD& rhs) const { return value_ > rhs.value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+operator >= common/libs/fs/shared_fd.h /^ bool operator>=(const SharedFD& rhs) const { return value_ >= rhs.value_; }$/;" f class:cuttlefish::SharedFD typeref:typename:bool
+operator [] host/commands/modem_simulator/command_parser.h /^ std::string_view::const_reference& operator[](int index) const { return command_[index]; }$/;" f class:cuttlefish::CommandParser typeref:typename:std::string_view::const_reference &
+operator [] host/libs/confui/host_renderer.h /^ auto& operator[](const int idx) { return teeui_frame_[idx]; }$/;" f class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:auto &
+operator bool common/libs/fs/shared_fd.h /^ operator bool() const { return ptr_ != MAP_FAILED; }$/;" f class:cuttlefish::ScopedMMap
+operatorNames guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityOperatorNames operatorNames;$/;" m struct:__anon0bfbaecf6108 typeref:typename:RIL_CellIdentityOperatorNames
+operatorNames guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityOperatorNames operatorNames;$/;" m struct:__anon0bfbaecf7808 typeref:typename:RIL_CellIdentityOperatorNames
+operatorNames guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityOperatorNames operatorNames;$/;" m struct:__anon0bfbaecf7908 typeref:typename:RIL_CellIdentityOperatorNames
+operatorNames guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityOperatorNames operatorNames;$/;" m struct:__anon0bfbaecf7a08 typeref:typename:RIL_CellIdentityOperatorNames
+operatorNames guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityOperatorNames operatorNames;$/;" m struct:__anon0bfbaecf7b08 typeref:typename:RIL_CellIdentityOperatorNames
+operatorNames guest/hals/ril/reference-libril/ril.h /^ RIL_CellIdentityOperatorNames operatorNames;$/;" m struct:__anon0bfbaecf7c08 typeref:typename:RIL_CellIdentityOperatorNames
+operatorNumeric guest/hals/ril/reference-libril/ril.h /^ char *operatorNumeric;$/;" m struct:__anon0bfbaecfa608 typeref:typename:char *
+operator_config_ host/frontend/webrtc/lib/streamer.cpp /^ OperatorServerConfig operator_config_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:OperatorServerConfig file:
+operator_list_ host/commands/modem_simulator/network_service.h /^ std::vector<NetworkOperator> operator_list_;$/;" m class:cuttlefish::NetworkService typeref:typename:std::vector<NetworkOperator>
+operator_numeric host/commands/modem_simulator/nvram_config.cpp /^std::string NvramConfig::InstanceSpecific::operator_numeric() const {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:std::string
+operator_observer_ host/frontend/webrtc/lib/streamer.cpp /^ std::weak_ptr<OperatorObserver> operator_observer_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::weak_ptr<OperatorObserver> file:
+operator_server host/frontend/webrtc/lib/streamer.h /^ } operator_server;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig typeref:struct:cuttlefish::webrtc_streaming::StreamerConfig::__anonbc3851b60108
+operator_state host/commands/modem_simulator/network_service.h /^ OperatorState operator_state;$/;" m struct:cuttlefish::NetworkService::NetworkOperator typeref:typename:OperatorState
+options host/frontend/webrtc/lib/audio_track_source_impl.cpp /^const cricket::AudioOptions AudioTrackSourceImpl::options() const {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:const cricket::AudioOptions
+ordinal host/commands/secure_env/in_process_tpm.cpp /^ uint32_t ordinal;$/;" m struct:cuttlefish::tpm_message_header typeref:typename:uint32_t file:
+originator_address_ host/commands/modem_simulator/pdu_parser.h /^ std::string originator_address_;$/;" m class:cuttlefish::PDUParser typeref:typename:std::string
+os_composite_disk_config host/commands/assemble_cvd/disk_flags.cc /^std::vector<ImagePartition> os_composite_disk_config() {$/;" f namespace:cuttlefish typeref:typename:std::vector<ImagePartition>
+os_composite_disk_path host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::os_composite_disk_path() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+os_patchlevel_ host/commands/secure_env/tpm_key_blob_maker.h /^ uint32_t os_patchlevel_;$/;" m class:cuttlefish::TpmKeyBlobMaker typeref:typename:uint32_t
+os_patchlevel_ host/commands/secure_env/tpm_keymaster_context.h /^ uint32_t os_patchlevel_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:uint32_t
+os_type host/commands/metrics/proto/cf_metrics_event.proto /^ optional OsType os_type = 5;$/;" f message:cuttlefish.MetricsEvent typeref:typename:OsType
+os_version host/commands/metrics/proto/cf_metrics_event.proto /^ optional string os_version = 6;$/;" f message:cuttlefish.MetricsEvent typeref:typename:string
+os_version_ host/commands/secure_env/tpm_key_blob_maker.h /^ uint32_t os_version_;$/;" m class:cuttlefish::TpmKeyBlobMaker typeref:typename:uint32_t
+os_version_ host/commands/secure_env/tpm_keymaster_context.h /^ uint32_t os_version_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:uint32_t
+other_side_closed_ common/libs/utils/tcp_socket.h /^ bool other_side_closed_{};$/;" m class:cuttlefish::ClientSocket typeref:typename:bool
+out_buffer_ host/libs/websocket/websocket_handler.h /^ std::string out_buffer_ = {};$/;" m class:cuttlefish::DynHandler typeref:typename:std::string
+output_ common/libs/security/gatekeeper_channel.h /^ SharedFD output_;$/;" m class:cuttlefish::GatekeeperChannel typeref:typename:SharedFD
+output_ common/libs/security/keymaster_channel.h /^ SharedFD output_;$/;" m class:cuttlefish::KeymasterChannel typeref:typename:SharedFD
+overflow common/libs/fs/shared_fd_stream.cpp /^int SharedFDStreambuf::overflow(int c) {$/;" f class:cuttlefish::SharedFDStreambuf typeref:typename:int
+p host/commands/secure_env/soft_gatekeeper.h /^ static const uint32_t p = 1;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:const uint32_t
+p1 guest/hals/ril/reference-libril/ril.h /^ int p1;$/;" m struct:__anon0bfbaecf1d08 typeref:typename:int
+p1 guest/hals/ril/reference-libril/ril.h /^ int p1;$/;" m struct:__anon0bfbaecf1e08 typeref:typename:int
+p1 guest/hals/ril/reference-libril/ril.h /^ int p1;$/;" m struct:__anon0bfbaecf1f08 typeref:typename:int
+p2 guest/hals/ril/reference-libril/ril.h /^ int p2; \/* P2 parameter (described in ISO 7816-4)$/;" m struct:__anon0bfbaecfa308 typeref:typename:int
+p2 guest/hals/ril/reference-libril/ril.h /^ int p2;$/;" m struct:__anon0bfbaecf1d08 typeref:typename:int
+p2 guest/hals/ril/reference-libril/ril.h /^ int p2;$/;" m struct:__anon0bfbaecf1e08 typeref:typename:int
+p2 guest/hals/ril/reference-libril/ril.h /^ int p2;$/;" m struct:__anon0bfbaecf1f08 typeref:typename:int
+p2p_disabled shared/config/wpa_supplicant_overlay.conf /^p2p_disabled=1$/;" k
+p3 guest/hals/ril/reference-libril/ril.h /^ int p3; \/* A negative P3 implies a 4 byte APDU. *\/$/;" m struct:__anon0bfbaecf1f08 typeref:typename:int
+p3 guest/hals/ril/reference-libril/ril.h /^ int p3;$/;" m struct:__anon0bfbaecf1d08 typeref:typename:int
+p3 guest/hals/ril/reference-libril/ril.h /^ int p3;$/;" m struct:__anon0bfbaecf1e08 typeref:typename:int
+pCI guest/hals/ril/reference-libril/ril_internal.h /^ CommandInfo *pCI;$/;" m struct:android::RequestInfo typeref:typename:CommandInfo *
+pData host/libs/graphics_detector/include/EGL/eglext.h /^ void *pData;$/;" m struct:EGLClientPixmapHI typeref:typename:void *
+p_callback guest/hals/ril/reference-libril/ril.cpp /^ RIL_TimedCallback p_callback;$/;" m struct:android::UserCallbackInfo typeref:typename:RIL_TimedCallback file:
+p_command_handler host/commands/modem_simulator/modem_service.h /^ std::optional<p_func> p_command_handler;$/;" m class:cuttlefish::CommandHandler typeref:typename:std::optional<p_func>
+p_func host/commands/modem_simulator/modem_service.h /^using p_func = std::function<void(const Client&, std::string&)>; \/\/ Partial match$/;" t namespace:cuttlefish
+p_intermediates guest/hals/ril/reference-ril/atchannel.h /^ ATLine *p_intermediates; \/* any intermediate responses *\/$/;" m struct:__anon512a2c1f0208 typeref:typename:ATLine *
+p_next guest/hals/ril/reference-libril/RilSapSocket.h /^ struct SapSocketRequest* p_next;$/;" m struct:RilSapSocket::SapSocketRequest typeref:struct:SapSocketRequest *
+p_next guest/hals/ril/reference-libril/ril.cpp /^ struct UserCallbackInfo *p_next;$/;" m struct:android::UserCallbackInfo typeref:struct:UserCallbackInfo * file:
+p_next guest/hals/ril/reference-libril/ril_internal.h /^ struct RequestInfo *p_next;$/;" m struct:android::RequestInfo typeref:struct:RequestInfo *
+p_next guest/hals/ril/reference-ril/atchannel.h /^ struct ATLine *p_next;$/;" m struct:ATLine typeref:struct:ATLine *
+p_rs guest/hals/ril/reference-libril/ril_ex.h /^ RecordStream *p_rs;$/;" m struct:SocketListenParam typeref:typename:RecordStream *
+packageSource tools/create_base_image.go /^func packageSource(url string, branch string, version string, subdir string) {$/;" f package:main
+package_source tools/create_base_image_hostlib.sh /^package_source() {$/;" f
+packet common/libs/confui/packet.cpp /^namespace packet {$/;" n namespace:cuttlefish::confui file:
+packet common/libs/confui/packet.h /^namespace packet {$/;" n namespace:cuttlefish::confui
+packet common/libs/confui/packet_types.cpp /^namespace packet {$/;" n namespace:cuttlefish::confui file:
+packet common/libs/confui/packet_types.h /^namespace packet {$/;" n namespace:cuttlefish::confui
+padding host/libs/audio_connector/shm_layout.h /^ uint8_t padding;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:uint8_t
+padding host/libs/audio_connector/shm_layout.h /^ uint8_t padding[5];$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:uint8_t[5]
+padding host/libs/audio_connector/shm_layout.h /^ uint8_t padding[7];$/;" m struct:cuttlefish::virtio_snd_jack_info typeref:typename:uint8_t[7]
+param guest/hals/ril/reference-libril/ril_event.h /^ void *param;$/;" m struct:ril_event typeref:typename:void *
+params_destroy_resource_callback host/libs/wayland/wayland_dmabuf.cpp /^void params_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anon8f5be4990111 typeref:typename:void
+parent_key_fn_ host/commands/secure_env/encrypted_serializable.h /^ std::function<TpmObjectSlot(TpmResourceManager&)> parent_key_fn_;$/;" m class:cuttlefish::EncryptedSerializable typeref:typename:std::function<TpmObjectSlot (TpmResourceManager &)>
+parse host/libs/allocd/request.h /^ std::optional<Json::Value> parse(std::string msg) {$/;" f class:cuttlefish::JsonRequestReader typeref:typename:std::optional<Json::Value>
+parseProactiveCmdInd guest/hals/ril/reference-ril/reference-ril.c /^static int parseProactiveCmdInd(char *response) {$/;" f typeref:typename:int file:
+parseRegistrationState guest/hals/ril/reference-ril/reference-ril.c /^static int parseRegistrationState(char *str, int *type, int *items, int **response)$/;" f typeref:typename:int file:
+parseSimResponseLine guest/hals/ril/reference-ril/reference-ril.c /^static int parseSimResponseLine(char* line, RIL_SIM_IO_Response* response) {$/;" f typeref:typename:int file:
+parse_int host/commands/modem_simulator/command_parser.cpp /^static int parse_int(const std::string& snumber, int base) {$/;" f namespace:cuttlefish typeref:typename:int file:
+parse_technology_response guest/hals/ril/reference-ril/reference-ril.c /^int parse_technology_response( const char *response, int *current, int32_t *preferred )$/;" f typeref:typename:int
+parser tools/tombstone_to_line.py /^ parser = common_arg_parser()$/;" v
+partition_alignment host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t partition_alignment[3072];$/;" m struct:cuttlefish::__anon02806fd80111::GptBeginning typeref:typename:std::uint8_t[3072] file:
+partition_entries_crc32 host/libs/image_aggregator/image_aggregator.cc /^ std::uint32_t partition_entries_crc32;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint32_t file:
+partition_entries_lba host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t partition_entries_lba;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint64_t file:
+partition_entry_size host/libs/image_aggregator/image_aggregator.cc /^ std::uint32_t partition_entry_size;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint32_t file:
+partition_name host/libs/image_aggregator/image_aggregator.cc /^ std::uint16_t partition_name[36]; \/\/ UTF-16LE$/;" m struct:cuttlefish::__anon02806fd80111::GptPartitionEntry typeref:typename:std::uint16_t[36] file:
+partition_type host/libs/config/mbr.h /^ std::uint8_t partition_type;$/;" m struct:MbrPartitionEntry typeref:typename:std::uint8_t
+partition_type_guid host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t partition_type_guid[16];$/;" m struct:cuttlefish::__anon02806fd80111::GptPartitionEntry typeref:typename:std::uint8_t[16] file:
+partitions host/libs/config/mbr.h /^ MbrPartitionEntry partitions[4];$/;" m struct:MasterBootRecord typeref:typename:MbrPartitionEntry[4]
+partitions_ host/libs/image_aggregator/image_aggregator.cc /^ std::vector<PartitionInfo> partitions_;$/;" m class:cuttlefish::__anon02806fd80111::CompositeDiskBuilder typeref:typename:std::vector<PartitionInfo> file:
+password guest/hals/ril/reference-libril/ril.h /^ char *password; \/* the password for APN, or NULL *\/$/;" m struct:__anon0bfbaecfc008 typeref:typename:char *
+password guest/hals/ril/reference-libril/ril.h /^ char *password; \/* the password for APN, or NULL *\/$/;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+password guest/hals/ril/reference-libril/ril.h /^ char* password;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:char *
+password guest/hals/ril/reference-libril/ril.h /^ char* password;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+path guest/hals/ril/reference-libril/ril.h /^ char *path; \/* "pathid" from TS 27.007 +CRSM command.$/;" m struct:__anon0bfbaecf1d08 typeref:typename:char *
+path guest/hals/ril/reference-libril/ril.h /^ char *path; \/* "pathid" from TS 27.007 +CRSM command.$/;" m struct:__anon0bfbaecf1e08 typeref:typename:char *
+path host/frontend/webrtc/lib/streamer.h /^ std::string path;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig::__anonbc3851b60108 typeref:typename:std::string
+path_ host/frontend/webrtc/lib/ws_connection.cpp /^ const std::string path_;$/;" m class:WsConnectionImpl typeref:typename:const std::string file:
+path_ host/libs/config/config_flag.cpp /^ std::string path_;$/;" m class:cuttlefish::__anon2e549bd00111::SystemImageDirFlagImpl typeref:typename:std::string file:
+path_ host/libs/config/data_image.cpp /^ std::string path_;$/;" m class:cuttlefish::FixedDataImagePath typeref:typename:std::string file:
+path_ host/libs/config/data_image.cpp /^ std::string path_;$/;" m class:cuttlefish::FixedMiscImagePath typeref:typename:std::string file:
+paths host/commands/fetcher/build_api.h /^ std::vector<std::string> paths;$/;" m struct:cuttlefish::DirectoryBuild typeref:typename:std::vector<std::string>
+patterns tools/tombstone_to_line.py /^patterns = [$/;" v
+payload common/libs/security/gatekeeper_channel.h /^ uint8_t payload[0];$/;" m struct:gatekeeper::GatekeeperRawMessage typeref:typename:uint8_t[0]
+payload common/libs/security/keymaster_channel.h /^ uint8_t payload[0];$/;" m struct:keymaster::keymaster_message typeref:typename:uint8_t[0]
+payload_length_ common/libs/confui/packet_types.h /^ std::uint32_t payload_length_;$/;" m struct:cuttlefish::confui::packet::PayloadHeader typeref:typename:std::uint32_t
+payload_size common/libs/security/gatekeeper_channel.h /^ uint32_t payload_size;$/;" m struct:gatekeeper::GatekeeperRawMessage typeref:typename:uint32_t
+payload_size common/libs/security/keymaster_channel.h /^ uint32_t payload_size;$/;" m struct:keymaster::keymaster_message typeref:typename:uint32_t
+pbackfail common/libs/fs/shared_fd_stream.cpp /^int SharedFDStreambuf::pbackfail(int c) {$/;" f class:cuttlefish::SharedFDStreambuf typeref:typename:int
+pc host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #pc;$/;" M class:Controller
+pc host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #pc;$/;" M class:DeviceConnection
+pc_config host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ let pc_config = {iceServers: []};$/;" c class:Connect
+pc_config host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ let pc_config = {iceServers: []};$/;" c class:createPeerConnection
+pci guest/hals/ril/reference-libril/ril.h /^ int pci; \/* physical cell id 0..503, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5d08 typeref:typename:int
+pci guest/hals/ril/reference-libril/ril.h /^ int pci; \/* physical cell id 0..503; this value must be reported *\/$/;" m struct:__anon0bfbaecf5e08 typeref:typename:int
+pci guest/hals/ril/reference-libril/ril.h /^ int pci; \/* physical cell id 0..503; this value must be reported *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+pci guest/hals/ril/reference-libril/ril.h /^ uint32_t pci; \/* Physical cell id in range [0, 1007] described in 3GPP TS 38.331. This/;" m struct:__anon0bfbaecf6108 typeref:typename:uint32_t
+pcoDataInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::pcoDataInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+pco_id guest/hals/ril/reference-libril/ril.h /^ int pco_id; \/* The protocol ID for this box. Note that only IDs from$/;" m struct:__anon0bfbaecfc308 typeref:typename:int
+pcscf guest/hals/ril/reference-libril/ril.h /^ char * pcscf; \/* the Proxy Call State Control Function address$/;" m struct:__anon0bfbaecf1608 typeref:typename:char *
+pcscf guest/hals/ril/reference-libril/ril.h /^ char * pcscf; \/* the Proxy Call State Control Function address$/;" m struct:__anon0bfbaecf1408 typeref:typename:char *
+pcscf guest/hals/ril/reference-libril/ril.h /^ char * pcscf; \/* the Proxy Call State Control Function address$/;" m struct:__anon0bfbaecf1508 typeref:typename:char *
+pctx build/cvd-host-package.go /^var pctx = android.NewPackageContext("android\/soong\/cuttlefish")$/;" v package:cuttlefish
+pdp_context_ host/commands/modem_simulator/data_service.h /^ std::vector<PDPContext> pdp_context_;$/;" m class:cuttlefish::DataService typeref:typename:std::vector<PDPContext>
+pdu guest/hals/ril/reference-libril/ril.h /^ char * pdu; \/* PDU of message to write, as an ASCII hex string less the SMSC address,$/;" m struct:__anon0bfbaecf1b08 typeref:typename:char *
+pdu_type_ host/commands/modem_simulator/pdu_parser.h /^ std::string pdu_type_;$/;" m class:cuttlefish::PDUParser typeref:typename:std::string
+peer_connection_ host/frontend/webrtc/lib/client_handler.h /^ rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:rtc::scoped_refptr<webrtc::PeerConnectionInterface>
+peer_connection_factory_ host/frontend/webrtc/lib/streamer.cpp /^ peer_connection_factory_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> file:
+pendingResponseQueue guest/hals/ril/reference-libril/RilSapSocket.h /^ Ril_queue<SapSocketRequest> pendingResponseQueue;$/;" m class:RilSapSocket typeref:typename:Ril_queue<SapSocketRequest>
+pending_add_ host/libs/allocd/resource_manager.h /^ std::map<uint32_t, std::shared_ptr<StaticResource>> pending_add_;$/;" m struct:cuttlefish::ResourceManager typeref:typename:std::map<uint32_t,std::shared_ptr<StaticResource>>
+pending_buffer host/libs/wayland/wayland_surface.h /^ struct wl_resource* pending_buffer = nullptr;$/;" m struct:wayland::Surface::State typeref:struct:wl_resource *
+pending_connection_ host/frontend/webrtc/lib/camera_streamer.h /^ std::future<bool> pending_connection_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::future<bool>
+pending_ice_candidates_ host/frontend/webrtc/lib/client_handler.h /^ pending_ice_candidates_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::vector<std::unique_ptr<webrtc::IceCandidateInterface>>
+pending_list guest/hals/ril/reference-libril/ril_event.cpp /^static struct ril_event pending_list;$/;" v typeref:struct:ril_event file:
+pending_requests_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ pending_requests_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::priority_queue<ReadVsockRequest,std::vector<ReadVsockRequest>,VsockRequestComparator>
+percentd_ host/commands/modem_simulator/network_service.h /^ double percentd_{0.8};$/;" m class:cuttlefish::NetworkService typeref:typename:double
+period_bytes host/libs/audio_connector/commands.h /^ uint32_t period_bytes() const { return period_bytes_; }$/;" f struct:cuttlefish::StreamSetParamsCommand typeref:typename:uint32_t
+period_bytes host/libs/audio_connector/shm_layout.h /^ Le32 period_bytes;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:Le32
+period_bytes_ host/libs/audio_connector/commands.h /^ const uint32_t period_bytes_;$/;" m struct:cuttlefish::StreamSetParamsCommand typeref:typename:const uint32_t
+persist guest/hals/ril/reference-libril/ril_event.h /^ bool persist;$/;" m struct:ril_event typeref:typename:bool
+persistent_bootconfig_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::persistent_bootconfig_path()$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+persistent_composite_disk_config host/commands/assemble_cvd/disk_flags.cc /^std::vector<ImagePartition> persistent_composite_disk_config($/;" f namespace:cuttlefish typeref:typename:std::vector<ImagePartition>
+persistent_composite_disk_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::persistent_composite_disk_path()$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+persoSubstate guest/hals/ril/reference-libril/ril.h /^ RIL_PersoSubstateV1_5 persoSubstate;$/;" m struct:__anon0bfbaecf3e08 typeref:typename:RIL_PersoSubstateV1_5
+perso_substate guest/hals/ril/reference-libril/ril.h /^ RIL_PersoSubstate perso_substate; \/* applicable only if app_state ==$/;" m struct:__anon0bfbaecf3808 typeref:typename:RIL_PersoSubstate
+phase guest/hals/ril/reference-libril/ril.h /^ int phase; \/\/ CONFIGURED, START, APPLY, FINISH$/;" m struct:__anon0bfbaecf0a08 typeref:typename:int
+photoSettings host/frontend/webrtc_operator/assets/js/app.js /^ const photoSettings = {$/;" c class:DeviceControlApp.takePhoto
+physicalSlotId guest/hals/ril/reference-libril/ril.h /^ uint32_t physicalSlotId;$/;" m struct:__anon0bfbaecf3b08 typeref:typename:uint32_t
+pi guest/hals/ril/reference-libril/ril.h /^ char pi;$/;" m struct:__anon0bfbaecf8308 typeref:typename:char
+pid common/libs/utils/subprocess.h /^ pid_t pid() const { return pid_; }$/;" f class:cuttlefish::Subprocess typeref:typename:pid_t
+pid_ common/libs/utils/subprocess.h /^ pid_t pid_ = -1;$/;" m class:cuttlefish::Subprocess typeref:typename:pid_t
+pin1 guest/hals/ril/reference-libril/ril.h /^ RIL_PinState pin1;$/;" m struct:__anon0bfbaecf3808 typeref:typename:RIL_PinState
+pin1_replaced guest/hals/ril/reference-libril/ril.h /^ int pin1_replaced; \/* applicable to USIM, CSIM & ISIM *\/$/;" m struct:__anon0bfbaecf3808 typeref:typename:int
+pin1_status_ host/commands/modem_simulator/sim_service.h /^ PinStatus pin1_status_;$/;" m class:cuttlefish::SimService typeref:typename:PinStatus
+pin2 guest/hals/ril/reference-libril/ril.h /^ char *pin2; \/* May be NULL*\/$/;" m struct:__anon0bfbaecf1d08 typeref:typename:char *
+pin2 guest/hals/ril/reference-libril/ril.h /^ char *pin2; \/* May be NULL*\/$/;" m struct:__anon0bfbaecf1e08 typeref:typename:char *
+pin2 guest/hals/ril/reference-libril/ril.h /^ RIL_PinState pin2;$/;" m struct:__anon0bfbaecf3808 typeref:typename:RIL_PinState
+pin2_status_ host/commands/modem_simulator/sim_service.h /^ PinStatus pin2_status_;$/;" m class:cuttlefish::SimService typeref:typename:PinStatus
+pin_ host/commands/modem_simulator/sim_service.h /^ std::string pin_;$/;" m struct:cuttlefish::SimService::PinStatus typeref:typename:std::string
+pin_remaining_times_ host/commands/modem_simulator/sim_service.h /^ int pin_remaining_times_;$/;" m struct:cuttlefish::SimService::PinStatus typeref:typename:int
+pipe_ host/commands/run_cvd/launch.cc /^ SharedFD pipe_;$/;" m class:cuttlefish::LogcatReceiver typeref:typename:SharedFD file:
+pipe_fd_ host/commands/kernel_log_monitor/kernel_log_server.h /^ cuttlefish::SharedFD pipe_fd_;$/;" m class:monitor::KernelLogServer typeref:typename:cuttlefish::SharedFD
+pipe_message common/libs/fs/shared_fd_test.cpp /^char pipe_message[] = "Testing the pipe";$/;" v namespace:cuttlefish typeref:typename:char[]
+playing_ host/frontend/webrtc/lib/audio_device.h /^ std::atomic<bool> playing_ = false;$/;" m class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:std::atomic<bool>
+pointer_destroy_resource_callback host/libs/wayland/wayland_seat.cpp /^void pointer_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+pointer_implementation host/libs/wayland/wayland_seat.cpp /^const struct wl_pointer_interface pointer_implementation = {$/;" v namespace:wayland::__anona9f16c970111 typeref:typename:const struct wl_pointer_interface
+pointer_release host/libs/wayland/wayland_seat.cpp /^void pointer_release(wl_client*, wl_resource* pointer) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+pointer_set_cursor host/libs/wayland/wayland_seat.cpp /^void pointer_set_cursor(wl_client*,$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+pollMessages host/frontend/webrtc_operator/assets/js/server_connector.js /^ async #pollMessages() {$/;" m class:PollingConnector
+pollSIMState guest/hals/ril/reference-ril/reference-ril.c /^static void pollSIMState (void *param __unused)$/;" f typeref:typename:void file:
+poll_store_ host/frontend/webrtc_operator/client_handler.h /^ PollConnectionStore* poll_store_;$/;" m class:cuttlefish::ClientDynHandler typeref:typename:PollConnectionStore *
+pollerSchedule host/frontend/webrtc_operator/assets/js/server_connector.js /^ #pollerSchedule;$/;" M class:PollingConnector
+pool host/frontend/webrtc/cvd_video_frame_buffer.cpp /^std::multimap<int, std::vector<uint8_t>> pool;$/;" v namespace:cuttlefish::__anonfb30483e0111 typeref:typename:std::multimap<int,std::vector<uint8_t>>
+pool_mutex host/frontend/webrtc/cvd_video_frame_buffer.cpp /^std::mutex pool_mutex;$/;" v namespace:cuttlefish::__anonfb30483e0111 typeref:typename:std::mutex
+populateResponseInfo guest/hals/ril/reference-libril/ril_service.cpp /^void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,$/;" f typeref:typename:void
+populateResponseInfo_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^void populateResponseInfo_1_6($/;" f typeref:typename:void
+popup_destroy_resource_callback host/libs/wayland/wayland_shell.cpp /^void popup_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+port host/frontend/webrtc/lib/streamer.h /^ int port;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig::__anonbc3851b60108 typeref:typename:int
+port_ host/frontend/webrtc/lib/camera_streamer.h /^ unsigned int port_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:unsigned int
+port_ host/frontend/webrtc/lib/ws_connection.cpp /^ const int port_;$/;" m class:WsConnectionImpl typeref:typename:const int file:
+positioner_destroy_resource_callback host/libs/wayland/wayland_shell.cpp /^void positioner_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+positions host/libs/audio_connector/shm_layout.h /^ uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE];$/;" m struct:cuttlefish::virtio_snd_chmap_info typeref:typename:uint8_t[]
+powerReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::powerReq(int32_t token, bool state) {$/;" f class:SapImpl typeref:typename:Return<void>
+powerState guest/hals/ril/reference-libril/ril.h /^ RIL_DcPowerStates powerState; \/\/ Current power state$/;" m struct:__anon0bfbaecf9c08 typeref:typename:RIL_DcPowerStates
+preferredNetworkMode guest/hals/ril/reference-ril/reference-ril.c /^ int32_t preferredNetworkMode;$/;" m struct:__anon70d7df6f0108 typeref:typename:int32_t file:
+preferred_network_mode host/commands/modem_simulator/nvram_config.cpp /^int NvramConfig::InstanceSpecific::preferred_network_mode() const {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:int
+preferred_network_mode_ host/commands/modem_simulator/network_service.h /^ int preferred_network_mode_;$/;" m class:cuttlefish::NetworkService typeref:typename:int
+prefix host/commands/kernel_log_monitor/kernel_log_server.cc /^ std::string_view prefix; \/\/ Prefix value to output, describing the entry$/;" m struct:__anonfa7764770111::__anonfa7764770208 typeref:typename:std::string_view file:
+prefix_len_ common/libs/net/network_interface.h /^ int prefix_len_ = 24;$/;" m class:cuttlefish::NetworkInterface typeref:typename:int
+prefix_to_mac guest/commands/setup_wifi/main.cpp /^static std::array<unsigned char, 6> prefix_to_mac($/;" f typeref:typename:std::array<unsigned char,6> file:
+prefixlen common/libs/device_config/device_config.proto /^ int32 prefixlen = 5;$/;" f message:cuttlefish.DeviceConfig.RILConfig typeref:typename:int32
+prepareCarrierRestrictions guest/hals/ril/reference-libril/ril_service.cpp /^int prepareCarrierRestrictions(RIL_CarrierRestrictions &request, bool allAllowed,$/;" f typeref:typename:int
+prepareCarrierRestrictionsResponse guest/hals/ril/reference-libril/ril_service.cpp /^void prepareCarrierRestrictionsResponse(hidl_vec<Carrier>& allowedCarriers,$/;" f typeref:typename:void
+prepareNetworkScanRequest_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^int prepareNetworkScanRequest_1_2(RIL_NetworkScanRequest &scan_request,$/;" f typeref:typename:int
+prepareNetworkScanRequest_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^int prepareNetworkScanRequest_1_5(RIL_NetworkScanRequest_v1_5 &scan_request,$/;" f typeref:typename:int
+present host/commands/health/health.cpp /^int present() {$/;" f typeref:typename:int
+presentation_status host/commands/modem_simulator/sup_service.h /^ int presentation_status; \/\/ sets \/ shows the result code presentation status to the TE,$/;" m struct:cuttlefish::SupService::CallWaitingInfo typeref:typename:int
+prev guest/hals/ril/reference-libril/ril_event.h /^ struct ril_event *prev;$/;" m struct:ril_event typeref:struct:ril_event *
+previous_cached_gnss_raw host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::string previous_cached_gnss_raw;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::string file:
+printBuf guest/hals/ril/reference-libril/ril.cpp /^ static char printBuf[PRINTBUF_SIZE];$/;" v namespace:android typeref:typename:char[] file:
+printList guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::printList() {$/;" f class:RilSapSocket typeref:typename:void
+printReadies guest/hals/ril/reference-libril/ril_event.cpp /^#define printReadies(/;" d file:
+printReadies guest/hals/ril/reference-libril/ril_event.cpp /^static void printReadies(fd_set * rfds)$/;" f typeref:typename:void file:
+printRequest guest/hals/ril/reference-libril/ril_internal.h /^ #define printRequest(/;" d
+printResponse guest/hals/ril/reference-libril/ril_internal.h /^ #define printResponse /;" d
+printTombstoneListStats tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ public static void printTombstoneListStats(List<String> tList) {$/;" m class:TombstoneTransmitTest
+probeForModemMode guest/hals/ril/reference-ril/reference-ril.c /^static void probeForModemMode(ModemInfo *info)$/;" f typeref:typename:void file:
+proc host/commands/run_cvd/process_monitor.h /^ std::unique_ptr<Subprocess> proc;$/;" m struct:cuttlefish::MonitorEntry typeref:typename:std::unique_ptr<Subprocess>
+process tools/tombstone_to_line.py /^def process(in_file, out_file, args):$/;" f
+processCaptureRequest guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::processCaptureRequest($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+processCaptureRequest_3_4 guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Return<void> VsockCameraDeviceSession::processCaptureRequest_3_4($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Return<void>
+processCommandsCallback guest/hals/ril/reference-libril/ril_ex.h /^ void (*processCommandsCallback)(int fd, short flags, void *param);$/;" m struct:SocketListenParam typeref:typename:void (*)(int fd,short flags,void * param)
+processLine guest/hals/ril/reference-ril/atchannel.c /^static void processLine(const char *line)$/;" f typeref:typename:void file:
+processName guest/hals/ril/reference-libril/ril_ex.h /^ const char* processName;$/;" m struct:SocketListenParam typeref:typename:const char *
+processOneCaptureRequest guest/hals/camera/vsock_camera_device_session_3_4.cpp /^Status VsockCameraDeviceSession::processOneCaptureRequest($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:Status
+processReadReadies guest/hals/ril/reference-libril/ril_event.cpp /^static void processReadReadies(fd_set * rfds, int n)$/;" f typeref:typename:void file:
+processRequestLoop guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::processRequestLoop($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+processResponse guest/hals/ril/reference-libril/sap_service.cpp /^void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) {$/;" f typeref:typename:void
+processResponse guest/hals/ril/reference-libril/sap_service.cpp /^void sap::processResponse(MsgHeader *rsp, RilSapSocket *sapSocket) {$/;" f class:sap typeref:typename:void
+processTimeouts guest/hals/ril/reference-libril/ril_event.cpp /^static void processTimeouts()$/;" f typeref:typename:void file:
+processUnsolResponse guest/hals/ril/reference-libril/sap_service.cpp /^void sap::processUnsolResponse(MsgHeader *rsp, RilSapSocket *sapSocket) {$/;" f class:sap typeref:typename:void
+processWakeupCallback guest/hals/ril/reference-libril/ril.cpp /^static void processWakeupCallback(int fd, short flags, void *param) {$/;" f namespace:android typeref:typename:void file:
+process_all tools/tombstone_to_line.py /^def process_all(args):$/;" f
+process_file tools/tombstone_to_line.py /^def process_file(path, args):$/;" f
+process_leader_ host/commands/run_cvd/boot_state_machine.cc /^ ProcessLeader& process_leader_;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:ProcessLeader & file:
+process_requests_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::atomic<bool> process_requests_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::atomic<bool>
+product host/commands/fetcher/build_api.h /^ std::string product;$/;" m struct:cuttlefish::DeviceBuild typeref:typename:std::string
+product host/commands/fetcher/build_api.h /^ std::string product;$/;" m struct:cuttlefish::DirectoryBuild typeref:typename:std::string
+product_id_ guest/commands/vsoc_input_service/virtual_device_base.h /^ const uint16_t product_id_;$/;" m class:cuttlefish_input_service::VirtualDeviceBase typeref:typename:const uint16_t
+profileId guest/hals/ril/reference-libril/ril.h /^ int profileId;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+profileId guest/hals/ril/reference-libril/ril.h /^ int profileId;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+promptUserConfirmation guest/hals/confirmationui/TrustyConfirmationUI.cpp /^Return<ResponseCode> TrustyConfirmationUI::promptUserConfirmation($/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:Return<ResponseCode>
+prompt_result_ guest/hals/confirmationui/TrustyConfirmationUI.h /^ ResponseCode prompt_result_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI typeref:typename:ResponseCode
+prompt_text_ common/libs/confui/protocol_types.h /^ std::string prompt_text_;$/;" m class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::string
+prompt_text_ guest/hals/confirmationui/guest_session.h /^ std::string prompt_text_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::string
+prompt_text_ host/libs/confui/cbor.h /^ std::string prompt_text_;$/;" m class:cuttlefish::confui::Cbor typeref:typename:std::string
+prompt_text_ host/libs/confui/host_renderer.h /^ std::string prompt_text_; \/\/ confirmation ui message$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::string
+prompt_text_ host/libs/confui/session.h /^ std::string prompt_text_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::string
+protected_vm host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::protected_vm() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+protective_mbr host/libs/image_aggregator/image_aggregator.cc /^ MasterBootRecord protective_mbr;$/;" m struct:cuttlefish::__anon02806fd80111::GptBeginning typeref:typename:MasterBootRecord file:
+protocol guest/hals/ril/reference-libril/ril.h /^ char *protocol; \/* one of the PDP_type values in TS 27.007 section 10.1.1 used /;" m struct:__anon0bfbaecfc008 typeref:typename:char *
+protocol guest/hals/ril/reference-libril/ril.h /^ char *protocol; \/* one of the PDP_type values in TS 27.007 section 10.1.1 used /;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+protocol guest/hals/ril/reference-libril/ril.h /^ char* protocol;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:char *
+protocol guest/hals/ril/reference-libril/ril.h /^ char* protocol;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+protocol_id_ host/commands/modem_simulator/pdu_parser.h /^ std::string protocol_id_;$/;" m class:cuttlefish::PDUParser typeref:typename:std::string
+protocol_name_ host/libs/websocket/websocket_server.h /^ std::string protocol_name_;$/;" m class:cuttlefish::WebSocketServer typeref:typename:std::string
+provider guest/hals/camera/vsock_camera_provider_2_7.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera file:
+provider guest/hals/camera/vsock_camera_provider_2_7.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera
+provider guest/hals/camera/vsock_camera_server.cpp /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera file:
+provider guest/hals/camera/vsock_camera_server.h /^namespace android::hardware::camera::provider::V2_7::implementation {$/;" n namespace:android::hardware::camera
+psc guest/hals/ril/reference-libril/ril.h /^ int psc; \/* 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511, INT_MAX i/;" m struct:__anon0bfbaecf5a08 typeref:typename:int
+psc guest/hals/ril/reference-libril/ril.h /^ int psc; \/* 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511, INT_MAX i/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+psc guest/hals/ril/reference-libril/ril.h /^ int psc; \/* 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511; this valu/;" m struct:__anon0bfbaecf5b08 typeref:typename:int
+pstore_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::pstore_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+ptr_ common/libs/fs/shared_fd.h /^ void* ptr_ = MAP_FAILED;$/;" m class:cuttlefish::ScopedMMap typeref:typename:void *
+public_area_ host/commands/secure_env/primary_key_builder.h /^ TPMT_PUBLIC public_area_;$/;" m class:cuttlefish::PrimaryKeyBuilder typeref:typename:TPMT_PUBLIC
+puk_ host/commands/modem_simulator/sim_service.h /^ std::string puk_;$/;" m struct:cuttlefish::SimService::PinStatus typeref:typename:std::string
+puk_remaining_times_ host/commands/modem_simulator/sim_service.h /^ int puk_remaining_times_;$/;" m struct:cuttlefish::SimService::PinStatus typeref:typename:int
+pullLceData guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::pullLceData(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+pullLceDataResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::pullLceDataResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+putPDP guest/hals/ril/reference-ril/reference-ril.c /^static void putPDP(int cid) {$/;" f typeref:typename:void file:
+putRequestToQueue guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::putRequestToQueue($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+q_empty_ host/libs/screen_connector/screen_connector_queue.h /^ std::condition_variable q_empty_;$/;" m class:cuttlefish::ScreenConnectorQueue typeref:typename:std::condition_variable
+q_max_size_ host/libs/screen_connector/screen_connector_queue.h /^ const int q_max_size_;$/;" m class:cuttlefish::ScreenConnectorQueue typeref:typename:const int
+q_mutex_ host/libs/screen_connector/screen_connector_queue.h /^ std::unique_ptr<std::mutex> q_mutex_;$/;" m class:cuttlefish::ScreenConnectorQueue typeref:typename:std::unique_ptr<std::mutex>
+qemu_binary_dir host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::qemu_binary_dir() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+qemu_open_modem_port guest/hals/ril/reference-ril/misc.c /^int qemu_open_modem_port() {$/;" f typeref:typename:int
+qemu_vnc_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::qemu_vnc_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+query_ctec guest/hals/ril/reference-ril/reference-ril.c /^int query_ctec(ModemInfo *mdm __unused, int *current, int32_t *preferred)$/;" f typeref:typename:int
+query_nvidia tools/create_base_image_gce.sh /^query_nvidia() {$/;" f
+query_supported_techs guest/hals/ril/reference-ril/reference-ril.c /^int query_supported_techs( ModemInfo *mdm __unused, int *supported )$/;" f typeref:typename:int
+queue_ host/commands/modem_simulator/thread_looper.h /^ std::deque<Event> queue_;$/;" m class:cuttlefish::ThreadLooper typeref:typename:std::deque<Event>
+queue_empty_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::condition_variable queue_empty_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::condition_variable
+queue_mutex_ host/commands/secure_env/in_process_tpm.cpp /^ std::mutex queue_mutex_;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:std::mutex file:
+queues_ common/libs/concurrency/multiplexer.h /^ std::vector<QueuePtr> queues_;$/;" m class:cuttlefish::Multiplexer typeref:typename:std::vector<QueuePtr>
+r host/commands/secure_env/soft_gatekeeper.h /^ static const uint32_t r = 8;$/;" m class:gatekeeper::SoftGateKeeper typeref:typename:const uint32_t
+radioCapabilityIndicationInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::radioCapabilityIndicationInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+radioConfigService guest/hals/ril/reference-libril/ril_config.cpp /^sp<RadioConfigImpl> radioConfigService;$/;" v typeref:typename:sp<RadioConfigImpl>
+radioService guest/hals/ril/reference-libril/ril_service.cpp /^sp<RadioImpl_1_6> radioService[1];$/;" v typeref:typename:sp<RadioImpl_1_6>[1]
+radioService guest/hals/ril/reference-libril/ril_service.cpp /^sp<RadioImpl_1_6> radioService[SIM_COUNT];$/;" v typeref:typename:sp<RadioImpl_1_6>[]
+radioServiceRwlock guest/hals/ril/reference-libril/ril_service.cpp /^static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;$/;" v typeref:typename:pthread_rwlock_t file:
+radioServiceRwlock2 guest/hals/ril/reference-libril/ril_service.cpp /^static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;$/;" v typeref:typename:pthread_rwlock_t file:
+radioServiceRwlock3 guest/hals/ril/reference-libril/ril_service.cpp /^static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;$/;" v typeref:typename:pthread_rwlock_t file:
+radioServiceRwlock4 guest/hals/ril/reference-libril/ril_service.cpp /^static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;$/;" v typeref:typename:pthread_rwlock_t file:
+radioStateChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::radioStateChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+radioStateToString guest/hals/ril/reference-libril/ril.cpp /^radioStateToString(RIL_RadioState s) {$/;" f namespace:android typeref:typename:const char *
+radio_1_6 guest/hals/ril/reference-libril/ril_service.h /^namespace radio_1_6 {$/;" n
+radio_access_network guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessNetworks radio_access_network; \/\/ The type of network to scan.$/;" m struct:__anon0bfbaecfab08 typeref:typename:RIL_RadioAccessNetworks
+radio_access_network guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessNetworks_v1_5 radio_access_network; \/\/ The type of network to scan.$/;" m struct:__anon0bfbaecfae08 typeref:typename:RIL_RadioAccessNetworks_v1_5
+radio_state_ host/commands/modem_simulator/network_service.h /^ RadioState radio_state_;$/;" m class:cuttlefish::NetworkService typeref:typename:RadioState
+random_source_ host/commands/secure_env/tpm_keymaster_context.h /^ std::unique_ptr<TpmRandomSource> random_source_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::unique_ptr<TpmRandomSource>
+rat guest/hals/ril/reference-libril/ril.h /^ RIL_RadioTechnology rat; \/\/ indicates the available data radio technology,$/;" m struct:__anon0bfbaecf8008 typeref:typename:RIL_RadioTechnology
+rat guest/hals/ril/reference-libril/ril.h /^ RIL_RadioTechnology rat; \/\/ indicates the available voice radio technology,$/;" m struct:__anon0bfbaecf7f08 typeref:typename:RIL_RadioTechnology
+rat guest/hals/ril/reference-libril/ril.h /^ int rat; \/\/ RIL_RadioAccessFamily for the radio$/;" m struct:__anon0bfbaecf0a08 typeref:typename:int
+rat guest/hals/ril/reference-libril/ril.h /^ uint32_t rat; \/* bitset - ref. RIL_RadioTechnology. *\/$/;" m struct:__anon0bfbaecf9108 typeref:typename:uint32_t
+rate host/libs/audio_connector/commands.h /^ uint8_t rate() const { return rate_; }$/;" f struct:cuttlefish::StreamSetParamsCommand typeref:typename:uint8_t
+rate host/libs/audio_connector/shm_layout.h /^ uint8_t rate;$/;" m struct:cuttlefish::virtio_snd_pcm_set_params typeref:typename:uint8_t
+rate_ host/libs/audio_connector/commands.h /^ const uint8_t rate_;$/;" m struct:cuttlefish::StreamSetParamsCommand typeref:typename:const uint8_t
+rates host/libs/audio_connector/shm_layout.h /^ Le64 rates; \/* 1 << VIRTIO_SND_PCM_RATE_XXX *\/$/;" m struct:cuttlefish::virtio_snd_pcm_info typeref:typename:Le64
+raw_frame_ host/libs/confui/host_renderer.h /^ std::shared_ptr<TeeUiFrameWrapper> raw_frame_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:std::shared_ptr<TeeUiFrameWrapper>
+readFds guest/hals/ril/reference-libril/ril_event.cpp /^static fd_set readFds;$/;" v typeref:typename:fd_set file:
+readSettingsFromJson guest/hals/camera/vsock_camera_server.cpp /^bool readSettingsFromJson(VsockCameraDevice::Settings& settings,$/;" f namespace:android::hardware::camera::provider::V2_7::implementation::__anon29cd72800111 typeref:typename:bool
+read_buffer_ common/libs/fs/shared_fd_stream.h /^ std::unique_ptr<char[]> read_buffer_ = nullptr;$/;" m class:cuttlefish::SharedFDStreambuf typeref:typename:std::unique_ptr<char[]>
+read_mutex_ common/libs/utils/vsock_connection.h /^ std::recursive_mutex read_mutex_;$/;" m class:cuttlefish::VsockConnection typeref:typename:std::recursive_mutex
+read_only host/libs/image_aggregator/image_aggregator.h /^ bool read_only;$/;" m struct:cuttlefish::ImagePartition typeref:typename:bool
+read_only host/libs/image_aggregator/image_aggregator.h /^ bool read_only;$/;" m struct:cuttlefish::MultipleImagePartition typeref:typename:bool
+read_pipe_ host/commands/modem_simulator/channel_monitor.h /^ cuttlefish::SharedFD read_pipe_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:cuttlefish::SharedFD
+read_set_ host/frontend/webrtc/adb_handler.h /^ SharedFDSet read_set_;$/;" m struct:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:SharedFDSet
+read_set_ host/frontend/webrtc/bluetooth_handler.h /^ SharedFDSet read_set_;$/;" m struct:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:SharedFDSet
+read_thread_ host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ std::thread read_thread_;$/;" m class:GnssGrpcProxyServiceImpl typeref:typename:std::thread file:
+read_thread_ host/frontend/webrtc/adb_handler.h /^ std::thread read_thread_;$/;" m struct:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:std::thread
+read_thread_ host/frontend/webrtc/bluetooth_handler.h /^ std::thread read_thread_;$/;" m struct:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:std::thread
+read_thread_ host/frontend/webrtc/kernel_log_events_handler.h /^ std::thread read_thread_;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:std::thread
+read_write_capability host/libs/image_aggregator/cdisk_spec.proto /^ ReadWriteCapability read_write_capability = 3;$/;" f message:ComponentDisk typeref:typename:ReadWriteCapability
+readerLoop guest/hals/ril/reference-ril/atchannel.c /^static void *readerLoop(void *arg __unused)$/;" f typeref:typename:void * file:
+reader_builder host/libs/allocd/request.h /^ Json::CharReaderBuilder reader_builder;$/;" m class:cuttlefish::JsonRequestReader typeref:typename:Json::CharReaderBuilder
+reader_thread_ guest/hals/camera/vsock_frame_provider.h /^ std::thread reader_thread_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::thread
+reader_thread_ host/frontend/webrtc/lib/camera_streamer.h /^ std::thread reader_thread_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::thread
+readline guest/hals/ril/reference-ril/atchannel.c /^static const char *readline()$/;" f typeref:typename:const char * file:
+reason guest/hals/ril/reference-libril/ril.h /^ int reason; \/* from TS 27.007 7.11 "reason" *\/$/;" m struct:__anon0bfbaecf2108 typeref:typename:int
+reason host/commands/modem_simulator/sup_service.h /^ Reason reason;$/;" m struct:cuttlefish::SupService::CallForwardInfo typeref:typename:Reason
+reasonDataDenied guest/hals/ril/reference-libril/ril.h /^ int32_t reasonDataDenied; \/\/ if registration state is 3 (Registration$/;" m struct:__anon0bfbaecf8008 typeref:typename:int32_t
+reasonForDenial guest/hals/ril/reference-libril/ril.h /^ int32_t reasonForDenial; \/\/ reasonForDenial if registration state is 3$/;" m struct:__anon0bfbaecf7f08 typeref:typename:int32_t
+reboot_notification_ host/commands/run_cvd/boot_state_machine.cc /^ SharedFD reboot_notification_;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:SharedFD file:
+rec guest/hals/ril/reference-libril/ril.h /^ } rec;$/;" m struct:__anon0bfbaecf8908 typeref:union:__anon0bfbaecf8908::__anon0bfbaecf8a0a
+receive_buffer_ host/frontend/webrtc/lib/client_handler.cpp /^ std::vector<char> receive_buffer_;$/;" m class:cuttlefish::webrtc_streaming::CameraChannelHandler typeref:typename:std::vector<char> file:
+receive_buffer_ host/frontend/webrtc_operator/signal_handler.h /^ std::vector<uint8_t> receive_buffer_;$/;" m class:cuttlefish::SignalHandler typeref:typename:std::vector<uint8_t>
+record-video-control host/frontend/webrtc_operator/assets/client.html /^ <div id="record-video-control" title="Capture Display as Webm"><\/div>$/;" I
+record_screen host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::record_screen() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+recording host/frontend/webrtc_operator/assets/js/app.js /^ #recording = {};$/;" M class:DeviceControlApp
+recording_ host/frontend/webrtc/lib/audio_device.h /^ std::atomic<bool> recording_ = false;$/;" m class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:std::atomic<bool>
+redir guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_RedirectingNumberInfoRecord redir;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_RedirectingNumberInfoRecord
+redirectingNumber guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_NumberInfoRecord redirectingNumber;$/;" m struct:__anon0bfbaecf8508 typeref:typename:RIL_CDMA_NumberInfoRecord
+redirectingReason guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_RedirectingReason redirectingReason;$/;" m struct:__anon0bfbaecf8508 typeref:typename:RIL_CDMA_RedirectingReason
+redirects_ common/libs/utils/subprocess.h /^ std::map<Subprocess::StdIOChannel, int> redirects_{};$/;" m class:cuttlefish::Command typeref:typename:std::map<Subprocess::StdIOChannel,int>
+refcount_table_clusters host/libs/image_aggregator/image_aggregator.cc /^ Be32 refcount_table_clusters;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+refcount_table_offset host/libs/image_aggregator/image_aggregator.cc /^ Be64 refcount_table_offset;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be64 file:
+refresh-list host/frontend/webrtc_operator/assets/index.html /^ <h1>Available devices <span id='refresh-list'>↻<\/span><\/h1>$/;" I
+refresh_rate_hz common/libs/device_config/device_config.proto /^ int32 refresh_rate_hz = 4;$/;" f message:cuttlefish.DeviceConfig.DisplayConfig typeref:typename:int32
+refresh_rate_hz host/libs/config/cuttlefish_config.h /^ int refresh_rate_hz;$/;" m struct:cuttlefish::CuttlefishConfig::DisplayConfig typeref:typename:int
+regState guest/hals/ril/reference-libril/ril.h /^ RIL_RegState regState; \/\/ Valid reg states are RIL_NOT_REG_AND_NOT_SEARCHIN/;" m struct:__anon0bfbaecf7f08 typeref:typename:RIL_RegState
+regState guest/hals/ril/reference-libril/ril.h /^ RIL_RegState regState; \/\/ Valid reg states are RIL_NOT_REG_AND_NOT_SEARCHIN/;" m struct:__anon0bfbaecf8008 typeref:typename:RIL_RegState
+region host/libs/wayland/wayland_surface.h /^ Region region;$/;" m struct:wayland::Surface::State typeref:typename:Region
+region_add host/libs/wayland/wayland_compositor.cpp /^void region_add(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+region_destroy host/libs/wayland/wayland_compositor.cpp /^void region_destroy(wl_client*, wl_resource* region_resource) {$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+region_implementation host/libs/wayland/wayland_compositor.cpp /^const struct wl_region_interface region_implementation = {$/;" v namespace:wayland::__anon473d11590111 typeref:typename:const struct wl_region_interface
+region_subtract host/libs/wayland/wayland_compositor.cpp /^void region_subtract(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+registerBroadcastReceivers guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java /^ private void registerBroadcastReceivers() {$/;" m class:GceService file:
+registerConfigService guest/hals/ril/reference-libril/ril_config.cpp /^void radio_1_6::registerConfigService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {$/;" f class:radio_1_6 typeref:typename:void
+registerService guest/hals/ril/reference-libril/ril_service.cpp /^void radio_1_6::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {$/;" f class:radio_1_6 typeref:typename:void
+registerService guest/hals/ril/reference-libril/sap_service.cpp /^void sap::registerService(const RIL_RadioFunctions *callbacks) {$/;" f class:sap typeref:typename:void
+registered guest/hals/ril/reference-libril/ril.h /^ int registered; \/* !0 if this cell is registered 0 if not registere/;" m struct:__anon0bfbaecf7208 typeref:typename:int
+registered guest/hals/ril/reference-libril/ril.h /^ int registered; \/* !0 if this cell is registered 0 if not registered *\/$/;" m struct:__anon0bfbaecf6e08 typeref:typename:int
+registered guest/hals/ril/reference-libril/ril.h /^ int registered; \/* !0 if this cell is registered 0 if not registered *\/$/;" m struct:__anon0bfbaecf7008 typeref:typename:int
+registerer_ host/commands/start/flag_forwarder.cc /^ gflags::FlagRegisterer registerer_;$/;" m class:DynamicFlag typeref:typename:gflags::FlagRegisterer file:
+registration_retries_left_ host/frontend/webrtc/lib/streamer.cpp /^ int registration_retries_left_ = kRegistrationRetries;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:int file:
+registration_state host/commands/modem_simulator/network_service.h /^ RegistrationState registration_state;$/;" m struct:cuttlefish::NetworkService::NetworkRegistrationStatus typeref:typename:RegistrationState
+registry_ host/frontend/webrtc_operator/client_handler.h /^ DeviceRegistry* registry_;$/;" m class:cuttlefish::ClientWSHandlerFactory typeref:typename:DeviceRegistry *
+registry_ host/frontend/webrtc_operator/client_handler.h /^ DeviceRegistry* registry_;$/;" m class:cuttlefish::ConnectHandler typeref:typename:DeviceRegistry *
+registry_ host/frontend/webrtc_operator/device_handler.h /^ DeviceRegistry* registry_;$/;" m class:cuttlefish::DeviceHandlerFactory typeref:typename:DeviceRegistry *
+registry_ host/frontend/webrtc_operator/device_list_handler.h /^ DeviceRegistry& registry_;$/;" m class:cuttlefish::DeviceListHandler typeref:typename:DeviceRegistry &
+registry_ host/frontend/webrtc_operator/signal_handler.h /^ DeviceRegistry* registry_;$/;" m class:cuttlefish::SignalHandler typeref:typename:DeviceRegistry *
+rejectCall guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::rejectCall(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+rejectCallResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::rejectCallResponse(int slotId, int responseType,$/;" f class:radio_1_6 typeref:typename:int
+release guest/hals/camera/cached_stream_buffer.cpp /^int CachedStreamBuffer::release() { return g_importer.unlock(buffer_); }$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:int
+releasePduSessionId guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::releasePduSessionId(int32_t serial, int32_t id) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+releasePduSessionIdResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::releasePduSessionIdResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+releaseWakeLock guest/hals/ril/reference-libril/ril.cpp /^releaseWakeLock() {$/;" f namespace:android typeref:typename:void
+remote guest/hals/bt/remote/remote_bluetooth.cpp /^namespace remote {$/;" n namespace:android::hardware::bluetooth::V1_1 file:
+remote guest/hals/bt/remote/remote_bluetooth.h /^namespace remote {$/;" n namespace:android::hardware::bluetooth::V1_1
+remote host/frontend/webrtc/lib/audio_track_source_impl.cpp /^bool AudioTrackSourceImpl::remote() const { return false; }$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:bool
+remote_client host/commands/modem_simulator/call_service.h /^ std::optional<cuttlefish::SharedFD> remote_client;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:std::optional<cuttlefish::SharedFD>
+remote_clients_ host/commands/modem_simulator/channel_monitor.h /^ std::vector<std::unique_ptr<Client>> remote_clients_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:std::vector<std::unique_ptr<Client>>
+remote_description_added_ host/frontend/webrtc/lib/client_handler.h /^ bool remote_description_added_ = false;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:bool
+remote_provisioning_context_ host/commands/secure_env/tpm_keymaster_context.h /^ std::unique_ptr<TpmRemoteProvisioningContext> remote_provisioning_context_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::unique_ptr<TpmRemoteProvisioningContext>
+remove guest/hals/camera/stream_buffer_cache.cpp /^void StreamBufferCache::remove(uint64_t buffer_id) {$/;" f class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:void
+removeFromList guest/hals/ril/reference-libril/ril_event.cpp /^static void removeFromList(struct ril_event * ev)$/;" f typeref:typename:void file:
+removeInvalidClients host/commands/modem_simulator/channel_monitor.cpp /^static void removeInvalidClients(std::vector<std::unique_ptr<Client>>& clients) {$/;" f namespace:cuttlefish typeref:typename:void file:
+removeLastChar guest/hals/ril/reference-libril/ril_internal.h /^ #define removeLastChar /;" d
+removeStreamsExcept guest/hals/camera/stream_buffer_cache.cpp /^void StreamBufferCache::removeStreamsExcept(std::set<int32_t> streams_to_keep) {$/;" f class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:void
+removeWatch guest/hals/ril/reference-libril/ril_event.cpp /^static void removeWatch(struct ril_event * ev, int index)$/;" f typeref:typename:void file:
+render_confui_cnt_ host/libs/screen_connector/screen_connector.h /^ unsigned long long int render_confui_cnt_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:unsigned long long int
+renderer_ host/libs/confui/session.h /^ std::unique_ptr<ConfUiRenderer> renderer_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::unique_ptr<ConfUiRenderer>
+renegotiateConnection host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async renegotiateConnection() {$/;" m class:Controller
+reply host/commands/gnss_grpc_proxy/gnss_grpc_proxy.proto /^ string reply = 1;$/;" f message:gnss_grpc_proxy.SendNmeaReply typeref:typename:string
+reportBootStarted guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public void reportBootStarted() {$/;" m class:EventReporter
+reportIntent guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java /^ private void reportIntent(Context context, String intentType) {$/;" m class:GceBroadcastReceiver file:
+reportMessage guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public void reportMessage(String message) {$/;" m class:EventReporter
+reportPhysicalChannelConfigs guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::reportPhysicalChannelConfigs(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+reportScreenChanged guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/EventReporter.java /^ public void reportScreenChanged(int width, int height, int dpi, int rotation) {$/;" m class:EventReporter
+reportSmsMemoryStatus guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::reportSmsMemoryStatus(int32_t serial, bool available) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+reportSmsMemoryStatusResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::reportSmsMemoryStatusResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+reportStkServiceIsRunning guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::reportStkServiceIsRunning(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+reportStkServiceIsRunningResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::reportStkServiceIsRunningResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+reportedEthernetConnectivity guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private static boolean reportedEthernetConnectivity = false;$/;" f class:ConnectivityChecker file:
+reportedMobileConnectivity guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java /^ private static boolean reportedMobileConnectivity = false;$/;" f class:ConnectivityChecker file:
+repository_branch tools/create_base_image.go /^var repository_branch string$/;" v package:main typeref:typename:string
+repository_url tools/create_base_image.go /^var repository_url string$/;" v package:main typeref:typename:string
+requestCallSelection guest/hals/ril/reference-ril/reference-ril.c /^static void requestCallSelection($/;" f typeref:typename:void file:
+requestCdmaBaseBandVersion guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaBaseBandVersion(int request __unused, void *data __unused,$/;" f typeref:typename:void file:
+requestCdmaGetRoamingPreference guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaGetRoamingPreference(int request __unused, void *data __unused,$/;" f typeref:typename:void file:
+requestCdmaGetSubscriptionSource guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaGetSubscriptionSource(int request __unused, void *data,$/;" f typeref:typename:void file:
+requestCdmaPrlVersion guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaPrlVersion(int request __unused, void *data __unused,$/;" f typeref:typename:void file:
+requestCdmaSendSMS guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaSendSMS(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestCdmaSetRoamingPreference guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaSetRoamingPreference(int request __unused, void *data,$/;" f typeref:typename:void file:
+requestCdmaSetSubscriptionSource guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaSetSubscriptionSource(int request __unused, void *data,$/;" f typeref:typename:void file:
+requestCdmaSubscription guest/hals/ril/reference-ril/reference-ril.c /^static void requestCdmaSubscription(int request __unused, void *data __unused,$/;" f typeref:typename:void file:
+requestChangeBarringPassword guest/hals/ril/reference-ril/reference-ril.c /^static void requestChangeBarringPassword(char **data, size_t datalen, RIL_Token t) {$/;" f typeref:typename:void file:
+requestChangeSimPin guest/hals/ril/reference-ril/reference-ril.c /^static void requestChangeSimPin(int request, void* data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestChangeSimPin2 guest/hals/ril/reference-ril/reference-ril.c /^static void requestChangeSimPin2(void *data, size_t datalen, RIL_Token t) {$/;" f typeref:typename:void file:
+requestDataCallList guest/hals/ril/reference-ril/reference-ril.c /^static void requestDataCallList(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestDeactivateDataCall guest/hals/ril/reference-ril/reference-ril.c /^static void requestDeactivateDataCall(void *data, RIL_Token t)$/;" f typeref:typename:void file:
+requestDevice host/frontend/webrtc_operator/assets/js/server_connector.js /^ async requestDevice(deviceId) {$/;" m class:Connector
+requestDevice host/frontend/webrtc_operator/assets/js/server_connector.js /^ async requestDevice(deviceId) {$/;" m class:PollingConnector
+requestDevice host/frontend/webrtc_operator/assets/js/server_connector.js /^ async requestDevice(deviceId) {$/;" m class:WebsocketConnector
+requestDeviceIdentity guest/hals/ril/reference-ril/reference-ril.c /^static void requestDeviceIdentity(int request __unused, void *data __unused,$/;" f typeref:typename:void file:
+requestDial guest/hals/ril/reference-ril/reference-ril.c /^static void requestDial(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestEccDial guest/hals/ril/reference-ril/reference-ril.c /^static void requestEccDial(void *data, RIL_Token t) {$/;" f typeref:typename:void file:
+requestEnterSimPin guest/hals/ril/reference-ril/reference-ril.c /^static void requestEnterSimPin(int request, void* data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestExitEmergencyMode guest/hals/ril/reference-ril/reference-ril.c /^static void requestExitEmergencyMode(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestFacilityLock guest/hals/ril/reference-ril/reference-ril.c /^static void requestFacilityLock(int request, char **data,$/;" f typeref:typename:void file:
+requestGetActivityInfo guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetActivityInfo(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetCellInfoList guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetCellInfoList(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetCurrentCalls guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetCurrentCalls(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetHardwareConfig guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetHardwareConfig(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetMute guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetMute(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetPreferredNetworkType guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetPreferredNetworkType(int request __unused, void *data __unused,$/;" f typeref:typename:void file:
+requestGetRadioCapability guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetRadioCapability(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetSmsBroadcastConfig guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetSmsBroadcastConfig(void *data, size_t datalen,$/;" f typeref:typename:void file:
+requestGetSmscAddress guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetSmscAddress(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestGetTtyMode guest/hals/ril/reference-ril/reference-ril.c /^static void requestGetTtyMode(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestHangup guest/hals/ril/reference-ril/reference-ril.c /^static void requestHangup(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestIccSimAuthentication guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::requestIccSimAuthentication(int32_t serial, int32_t authContext,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+requestIccSimAuthenticationResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::requestIccSimAuthenticationResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+requestImsSendSMS guest/hals/ril/reference-ril/reference-ril.c /^static void requestImsSendSMS(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestIsimAuthentication guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::requestIsimAuthentication(int32_t serial, const hidl_string& challen/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+requestIsimAuthenticationResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::requestIsimAuthenticationResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+requestJpeg guest/hals/camera/vsock_frame_provider.cpp /^void VsockFrameProvider::requestJpeg() {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:void
+requestNumber guest/hals/ril/reference-libril/ril.cpp /^ int requestNumber;$/;" m struct:android::__anonf9a2982a0108 typeref:typename:int file:
+requestNumber guest/hals/ril/reference-libril/ril_internal.h /^ int requestNumber;$/;" m struct:android::CommandInfo typeref:typename:int
+requestOperator guest/hals/ril/reference-ril/reference-ril.c /^static void requestOperator(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestOrSendDataCallList guest/hals/ril/reference-ril/reference-ril.c /^static void requestOrSendDataCallList(int cid, RIL_Token *t)$/;" f typeref:typename:void file:
+requestQueryCallForward guest/hals/ril/reference-ril/reference-ril.c /^static void requestQueryCallForward(RIL_CallForwardInfo *data,$/;" f typeref:typename:void file:
+requestQueryCallWaiting guest/hals/ril/reference-ril/reference-ril.c /^static void requestQueryCallWaiting(void *data, size_t datalen, RIL_Token t) {$/;" f typeref:typename:void file:
+requestQueryClip guest/hals/ril/reference-ril/reference-ril.c /^static void requestQueryClip(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestQueryClir guest/hals/ril/reference-ril/reference-ril.c /^static void requestQueryClir(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestQueryNetworkSelectionMode guest/hals/ril/reference-ril/reference-ril.c /^static void requestQueryNetworkSelectionMode($/;" f typeref:typename:void file:
+requestRadioPower guest/hals/ril/reference-ril/reference-ril.c /^static void requestRadioPower(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestRegistrationState guest/hals/ril/reference-ril/reference-ril.c /^static void requestRegistrationState(int request, void *data __unused,$/;" f typeref:typename:void file:
+requestSIM_IO guest/hals/ril/reference-ril/reference-ril.c /^static void requestSIM_IO(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestSMSAcknowledge guest/hals/ril/reference-ril/reference-ril.c /^static void requestSMSAcknowledge(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestScreenState guest/hals/ril/reference-ril/reference-ril.c /^static void requestScreenState(void *data, RIL_Token t)$/;" f typeref:typename:void file:
+requestSendSMS guest/hals/ril/reference-ril/reference-ril.c /^static void requestSendSMS(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSendUSSD guest/hals/ril/reference-ril/reference-ril.c /^static void requestSendUSSD(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSetCallForward guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetCallForward(RIL_CallForwardInfo *data,$/;" f typeref:typename:void file:
+requestSetCallWaiting guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetCallWaiting(void *data, size_t datalen, RIL_Token t) {$/;" f typeref:typename:void file:
+requestSetCellInfoListRate guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetCellInfoListRate(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestSetClir guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetClir(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSetMute guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetMute(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSetNetworlSelectionManual guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetNetworlSelectionManual(void *data, RIL_Token t) {$/;" f typeref:typename:void file:
+requestSetPreferredNetworkType guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetPreferredNetworkType(int request, void *data,$/;" f typeref:typename:void file:
+requestSetRadioCapability guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetRadioCapability(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSetSmsBroadcastConfig guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetSmsBroadcastConfig(void *data, size_t datalen,$/;" f typeref:typename:void file:
+requestSetSmscAddress guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetSmscAddress(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSetSuppServiceNotifications guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetSuppServiceNotifications(void *data, size_t datalen,$/;" f typeref:typename:void file:
+requestSetupDataCall guest/hals/ril/reference-ril/reference-ril.c /^static void requestSetupDataCall(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestShutdown guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::requestShutdown(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+requestShutdown guest/hals/ril/reference-ril/reference-ril.c /^static void requestShutdown(RIL_Token t)$/;" f typeref:typename:void file:
+requestShutdownResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::requestShutdownResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+requestSignalStrength guest/hals/ril/reference-ril/reference-ril.c /^static void requestSignalStrength(void *data __unused, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+requestSimAuthentication guest/hals/ril/reference-ril/reference-ril.c /^static void requestSimAuthentication(int authContext, char* authData, RIL_Token t) {$/;" f typeref:typename:void file:
+requestSimCloseChannel guest/hals/ril/reference-ril/reference-ril.c /^static void requestSimCloseChannel(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSimOpenChannel guest/hals/ril/reference-ril/reference-ril.c /^static void requestSimOpenChannel(void *data, size_t datalen, RIL_Token t)$/;" f typeref:typename:void file:
+requestSimTransmitApduChannel guest/hals/ril/reference-ril/reference-ril.c /^static void requestSimTransmitApduChannel(void *data,$/;" f typeref:typename:void file:
+requestStkSendEnvelope guest/hals/ril/reference-ril/reference-ril.c /^static void requestStkSendEnvelope(void *data, RIL_Token t)$/;" f typeref:typename:void file:
+requestStkServiceIsRunning guest/hals/ril/reference-ril/reference-ril.c /^static void requestStkServiceIsRunning(RIL_Token t)$/;" f typeref:typename:void file:
+requestStksendTerminalResponse guest/hals/ril/reference-ril/reference-ril.c /^static void requestStksendTerminalResponse(void *data, RIL_Token t)$/;" f typeref:typename:void file:
+requestToString guest/hals/ril/reference-libril/ril.cpp /^requestToString(int request) {$/;" f namespace:android typeref:typename:const char *
+requestTransmitApduBasic guest/hals/ril/reference-ril/reference-ril.c /^static void requestTransmitApduBasic( void *data, size_t datalen,$/;" f typeref:typename:void file:
+requestType guest/hals/ril/reference-libril/ril.h /^ RIL_SsRequestType requestType;$/;" m struct:__anon0bfbaecf9908 typeref:typename:RIL_SsRequestType
+requestWriteSmsToSim guest/hals/ril/reference-ril/reference-ril.c /^static void requestWriteSmsToSim(void *data, size_t datalen __unused, RIL_Token t)$/;" f typeref:typename:void file:
+request_ common/libs/net/netlink_request.h /^ std::vector<char> request_;$/;" m class:cuttlefish::NetlinkRequest typeref:typename:std::vector<char>
+request_available_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::condition_variable request_available_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::condition_variable
+request_mutex_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::mutex request_mutex_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::mutex
+request_processor_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::thread request_processor_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::thread
+request_queue_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::unique_ptr<MessageQueue<uint8_t, kSynchronizedReadWrite>> request_queue_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::unique_ptr<MessageQueue<uint8_t,kSynchronizedReadWrite>>
+request_time_ms host/commands/metrics/proto/clientanalytics.proto /^ optional int64 request_time_ms = 4;$/;" f message:LogRequest typeref:typename:int64
+resendIncallMuteInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::resendIncallMuteInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+resendLastNITZTimeData guest/hals/ril/reference-libril/ril.cpp /^static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) {$/;" f namespace:android typeref:typename:void file:
+reserved host/libs/image_aggregator/image_aggregator.cc /^ std::uint32_t reserved;$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint32_t file:
+resetSimReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::resetSimReq(int32_t token) {$/;" f class:SapImpl typeref:typename:Return<void>
+resizeDeviceDisplays host/frontend/webrtc_operator/assets/js/app.js /^ #resizeDeviceDisplays() {$/;" m class:DeviceControlApp
+resolution_ host/frontend/webrtc/lib/camera_streamer.h /^ std::atomic<Resolution> resolution_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::atomic<Resolution>
+resource_ host/commands/secure_env/tpm_resource_manager.h /^ ESYS_TR resource_;$/;" m class:cuttlefish::TpmResourceManager::ObjectSlot typeref:typename:ESYS_TR
+resource_id host/commands/assemble_cvd/alloc.h /^ uint32_t resource_id;$/;" m struct:cuttlefish::IfaceData typeref:typename:uint32_t
+resource_manager_ host/commands/secure_env/encrypted_serializable.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::EncryptedSerializable typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/fragile_tpm_storage.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::FragileTpmStorage typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/hmac_serializable.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::HmacSerializable typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/insecure_fallback_storage.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::InsecureFallbackStorage typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/tpm_gatekeeper.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::TpmGatekeeper typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/tpm_key_blob_maker.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::TpmKeyBlobMaker typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/tpm_keymaster_context.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/tpm_keymaster_enforcement.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::TpmKeymasterEnforcement typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/tpm_remote_provisioning_context.h /^ TpmResourceManager& resource_manager_;$/;" m class:cuttlefish::TpmRemoteProvisioningContext typeref:typename:TpmResourceManager &
+resource_manager_ host/commands/secure_env/tpm_resource_manager.h /^ TpmResourceManager* resource_manager_;$/;" m class:cuttlefish::TpmResourceManager::ObjectSlot typeref:typename:TpmResourceManager *
+resoure_cv_ common/libs/concurrency/semaphore.h /^ std::condition_variable resoure_cv_;$/;" m class:cuttlefish::Semaphore typeref:typename:std::condition_variable
+responseAcknowledgement guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::responseAcknowledgement() {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+responseFunction guest/hals/ril/reference-libril/ril.cpp /^ int (*responseFunction) (int slotId, int responseType, int token,$/;" m struct:android::__anonf9a2982a0108 typeref:typename:int (*)(int slotId,int responseType,int token,RIL_Errno e,void * response,size_t responselen) file:
+responseFunction guest/hals/ril/reference-libril/ril_internal.h /^ int(*responseFunction) (int slotId, int responseType, int token,$/;" m struct:android::CommandInfo typeref:typename:int (*)(int slotId,int responseType,int token,RIL_Errno e,void * response,size_t responselen)
+responseIccIo guest/hals/ril/reference-libril/ril_service.cpp /^IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,$/;" f typeref:typename:IccIoResult
+responseInt guest/hals/ril/reference-libril/ril_service.cpp /^int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,$/;" f typeref:typename:int
+responseIntOrEmpty guest/hals/ril/reference-libril/ril_service.cpp /^int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno /;" f typeref:typename:int
+responseInt_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^int responseInt_1_6(::android::hardware::radio::V1_6::RadioResponseInfo &responseInfo, int seria/;" f typeref:typename:int
+responseLceStatusInfo guest/hals/ril/reference-libril/ril_service.cpp /^LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseTyp/;" f typeref:typename:LceStatusInfo
+responseRadioCapability guest/hals/ril/reference-libril/ril_service.cpp /^void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,$/;" f typeref:typename:void
+response_ common/libs/confui/protocol_types.h /^ UserResponse::type response_; \/\/ plain format$/;" m class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:UserResponse::type
+response_ common/libs/confui/protocol_types.h /^ UserResponse::type response_;$/;" m class:cuttlefish::confui::ConfUiUserSelectionMessage typeref:typename:UserResponse::type
+response_ common/libs/confui/protocol_types.h /^ UserResponse::type response_;$/;" m class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:UserResponse::type
+restart_subprocesses host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::restart_subprocesses() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+restart_subprocesses_ host/commands/run_cvd/process_monitor.h /^ bool restart_subprocesses_;$/;" m class:cuttlefish::ProcessMonitor typeref:typename:bool
+restrictedStateChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::restrictedStateChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+result guest/hals/ril/reference-libril/ril.h /^ RIL_SimRefreshResult result;$/;" m struct:__anon0bfbaecf4108 typeref:typename:RIL_SimRefreshResult
+result guest/hals/ril/reference-libril/ril.h /^ RIL_Errno result;$/;" m struct:__anon0bfbaecf9908 typeref:typename:RIL_Errno
+result_queue_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::shared_ptr<MessageQueue<uint8_t, kSynchronizedReadWrite>> result_queue_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::shared_ptr<MessageQueue<uint8_t,kSynchronizedReadWrite>>
+retry guest/hals/ril/reference-libril/ril.h /^ unsigned char retry; \/* 0 == not retry, nonzero == retry *\/$/;" m struct:__anon0bfbaecf1808 typeref:typename:unsigned char
+retry_ host/libs/websocket/websocket_server.h /^ lws_retry_bo_t retry_;$/;" m class:cuttlefish::WebSocketServer typeref:typename:lws_retry_bo_t
+retry_attempts_ host/commands/fetcher/curl_wrapper.cc /^ int retry_attempts_;$/;" m class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:int file:
+retry_delay_ host/commands/fetcher/curl_wrapper.cc /^ std::chrono::milliseconds retry_delay_;$/;" m class:cuttlefish::__anondfffca8d0111::CurlServerErrorRetryingWrapper typeref:typename:std::chrono::milliseconds file:
+retry_interval_ms_ host/frontend/webrtc/lib/streamer.cpp /^ int retry_interval_ms_ = kRetryFirstIntervalMs;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:int file:
+reverseIntermediates guest/hals/ril/reference-ril/atchannel.c /^static void reverseIntermediates(ATResponse *p_response)$/;" f typeref:typename:void file:
+revision host/commands/fetcher/build_api.h /^ std::string revision;$/;" m class:cuttlefish::Artifact typeref:typename:std::string
+revision host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t revision[4];$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint8_t[4] file:
+rilConnectedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::rilConnectedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+rilEventAddWakeup guest/hals/ril/reference-libril/ril.cpp /^static void rilEventAddWakeup(struct ril_event *ev) {$/;" f namespace:android typeref:typename:void file:
+rilModel guest/hals/ril/reference-libril/ril.h /^ int rilModel;$/;" m struct:__anon0bfbaecf9108 typeref:typename:int
+rilSocketId guest/hals/ril/reference-libril/sap_service.cpp /^ RIL_SOCKET_ID rilSocketId;$/;" m struct:SapImpl typeref:typename:RIL_SOCKET_ID file:
+rilSocketIdToString guest/hals/ril/reference-libril/ril.cpp /^rilSocketIdToString(RIL_SOCKET_ID socket_id)$/;" f namespace:android typeref:typename:const char *
+ril_address_and_prefix host/commands/modem_simulator/cf_device_config.cpp /^std::string DeviceConfig::ril_address_and_prefix() {$/;" f class:cuttlefish::modem::DeviceConfig typeref:typename:std::string
+ril_broadcast common/libs/device_config/host_device_config.cpp /^ std::string ril_broadcast;$/;" m class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:std::string file:
+ril_config common/libs/device_config/device_config.proto /^ RILConfig ril_config = 1;$/;" f message:cuttlefish.DeviceConfig typeref:typename:RILConfig
+ril_dns common/libs/device_config/host_device_config.cpp /^ std::string ril_dns;$/;" m class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:std::string file:
+ril_dns host/commands/modem_simulator/cf_device_config.cpp /^std::string DeviceConfig::ril_dns() {$/;" f class:cuttlefish::modem::DeviceConfig typeref:typename:std::string
+ril_dns host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::ril_dns() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+ril_event guest/hals/ril/reference-libril/ril_event.h /^struct ril_event {$/;" s
+ril_event_add guest/hals/ril/reference-libril/ril_event.cpp /^void ril_event_add(struct ril_event * ev)$/;" f typeref:typename:void
+ril_event_cb guest/hals/ril/reference-libril/ril_event.h /^typedef void (*ril_event_cb)(int fd, short events, void *userdata);$/;" t typeref:typename:void (*)(int fd,short events,void * userdata)
+ril_event_del guest/hals/ril/reference-libril/ril_event.cpp /^void ril_event_del(struct ril_event * ev)$/;" f typeref:typename:void
+ril_event_init guest/hals/ril/reference-libril/ril_event.cpp /^void ril_event_init()$/;" f typeref:typename:void
+ril_event_loop guest/hals/ril/reference-libril/ril_event.cpp /^void ril_event_loop()$/;" f typeref:typename:void
+ril_event_set guest/hals/ril/reference-libril/ril_event.cpp /^void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param)$/;" f typeref:typename:void
+ril_gateway common/libs/device_config/host_device_config.cpp /^ std::string ril_gateway;$/;" m class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:std::string file:
+ril_gateway host/commands/modem_simulator/cf_device_config.cpp /^std::string DeviceConfig::ril_gateway() {$/;" f class:cuttlefish::modem::DeviceConfig typeref:typename:std::string
+ril_ipaddr common/libs/device_config/host_device_config.cpp /^ std::string ril_ipaddr;$/;" m class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:std::string file:
+ril_prefixlen common/libs/device_config/host_device_config.cpp /^ uint8_t ril_prefixlen = -1;$/;" m class:cuttlefish::__anonf277137d0111::NetConfig typeref:typename:uint8_t file:
+ril_side_ host/commands/modem_simulator/unittest/service_test.cpp /^ static Client* ril_side_;$/;" m class:ModemServiceTest typeref:typename:Client * file:
+ril_side_ host/commands/modem_simulator/unittest/service_test.cpp /^Client* ModemServiceTest::ril_side_ = nullptr;$/;" m class:ModemServiceTest typeref:typename:Client *
+ril_timer_add guest/hals/ril/reference-libril/ril_event.cpp /^void ril_timer_add(struct ril_event * ev, struct timeval * tv)$/;" f typeref:typename:void
+rilc_thread_pool guest/hals/ril/reference-libril/ril_service.cpp /^void rilc_thread_pool() {$/;" f typeref:typename:void
+roamingIndicator guest/hals/ril/reference-libril/ril.h /^ int32_t roamingIndicator; \/\/ TSB-58 Roaming Indicator if registered$/;" m struct:__anon0bfbaecf7f08 typeref:typename:int32_t
+roamingProtocol guest/hals/ril/reference-libril/ril.h /^ char *roamingProtocol; \/* one of the PDP_type values in TS 27.007 section 10.1.1 used /;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+roamingProtocol guest/hals/ril/reference-libril/ril.h /^ char *roamingProtocol;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+room_cv_ common/libs/concurrency/semaphore.h /^ std::condition_variable room_cv_;$/;" m class:cuttlefish::Semaphore typeref:typename:std::condition_variable
+rootCanalAddPayload host/frontend/webrtc_operator/assets/js/rootcanal.js /^function rootCanalAddPayload(array, pos, payload) {$/;" f
+rootCanalAddString host/frontend/webrtc_operator/assets/js/rootcanal.js /^function rootCanalAddString(array, pos, val) {$/;" f
+rootCanalAddU8 host/frontend/webrtc_operator/assets/js/rootcanal.js /^function rootCanalAddU8(array, pos, val) {$/;" f
+rootCanalCalculateMessageSize host/frontend/webrtc_operator/assets/js/rootcanal.js /^function rootCanalCalculateMessageSize(name, args) {$/;" f
+rootcanal_config_file host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::rootcanal_config_file() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+rootcanal_default_commands_file host/libs/config/cuttlefish_config_instance.cpp /^CuttlefishConfig::InstanceSpecific::rootcanal_default_commands_file() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+rootcanal_hci_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::rootcanal_hci_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+rootcanal_link_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::rootcanal_link_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+rootcanal_socket_ host/frontend/webrtc/bluetooth_handler.h /^ SharedFD rootcanal_socket_;$/;" m struct:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:SharedFD
+rootcanal_test_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::rootcanal_test_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+routing guest/hals/ril/reference-libril/ril.h /^ RIL_EmergencyCallRouting routing;$/;" m struct:__anon0bfbaecfb708 typeref:typename:RIL_EmergencyCallRouting
+rscp guest/hals/ril/reference-libril/ril.h /^ int rscp; \/* The Received Signal Code Power in dBm multipled by -1.$/;" m struct:__anon0bfbaecf4d08 typeref:typename:int
+rsrp guest/hals/ril/reference-libril/ril.h /^ int rsrp; \/* The current Reference Signal Receive Power in dBm multipled by -1.$/;" m struct:__anon0bfbaecf4b08 typeref:typename:int
+rsrp guest/hals/ril/reference-libril/ril.h /^ int rsrp; \/* The current Reference Signal Receive Power in dBm multipled by -1.$/;" m struct:__anon0bfbaecf4c08 typeref:typename:int
+rsrq guest/hals/ril/reference-libril/ril.h /^ int rsrq; \/* The current Reference Signal Receive Quality in dB multiplied by -1/;" m struct:__anon0bfbaecf4b08 typeref:typename:int
+rsrq guest/hals/ril/reference-libril/ril.h /^ int rsrq; \/* The current Reference Signal Receive Quality in dB multiplied by -1/;" m struct:__anon0bfbaecf4c08 typeref:typename:int
+rssi guest/hals/ril/reference-libril/ril.h /^ int rssi; \/* Received RSSI in GSM,$/;" m struct:__anon0bfbaecf2208 typeref:typename:int
+rssnr guest/hals/ril/reference-libril/ril.h /^ int rssnr; \/* The current reference signal signal-to-noise ratio in 0.1 dB units.$/;" m struct:__anon0bfbaecf4b08 typeref:typename:int
+rssnr guest/hals/ril/reference-libril/ril.h /^ int rssnr; \/* The current reference signal signal-to-noise ratio in 0.1 dB units.$/;" m struct:__anon0bfbaecf4c08 typeref:typename:int
+runCvdComponent host/commands/run_cvd/main.cc /^fruit::Component<ServerLoop> runCvdComponent($/;" f namespace:cuttlefish::__anonadab6e0c0111 typeref:typename:fruit::Component<ServerLoop>
+run_as_daemon host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::run_as_daemon() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+run_connector_ host/libs/config/adb/data.cpp /^ bool run_connector_;$/;" m class:cuttlefish::AdbConfigImpl typeref:typename:bool file:
+run_help host/libs/config/adb/flags.cpp /^ static constexpr char run_help[] =$/;" m class:cuttlefish::__anon459bf0e40111::AdbConfigFlagImpl typeref:typename:char[] file:
+running_ guest/hals/camera/vsock_frame_provider.h /^ std::atomic<bool> running_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::atomic<bool>
+running_ host/frontend/webrtc/kernel_log_events_handler.h /^ std::atomic<bool> running_;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:std::atomic<bool>
+rx_mode_time_ms guest/hals/ril/reference-libril/ril.h /^ uint32_t rx_mode_time_ms;$/;" m struct:__anon0bfbaecf9f08 typeref:typename:uint32_t
+rx_shm_ host/libs/audio_connector/server.h /^ ScopedMMap rx_shm_;$/;" m class:cuttlefish::AudioClientConnection typeref:typename:ScopedMMap
+rx_socket_ host/libs/audio_connector/server.h /^ SharedFD rx_socket_;$/;" m class:cuttlefish::AudioClientConnection typeref:typename:SharedFD
+sATBuffer guest/hals/ril/reference-ril/reference-ril.c /^static char sATBuffer[MAX_AT_RESPONSE+1];$/;" v typeref:typename:char[] file:
+sATBufferCur guest/hals/ril/reference-ril/reference-ril.c /^static char *sATBufferCur = NULL;$/;" v typeref:typename:char * file:
+sFD guest/hals/ril/reference-ril/reference-ril.c /^static int sFD; \/* file desc of AT channel *\/$/;" v typeref:typename:int file:
+sMdmInfo guest/hals/ril/reference-ril/reference-ril.c /^static ModemInfo *sMdmInfo;$/;" v typeref:typename:ModemInfo * file:
+sOnRequestComplete guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::sOnRequestComplete (RIL_Token t,$/;" f class:RilSapSocket typeref:typename:void
+sOnUnsolicitedResponse guest/hals/ril/reference-libril/RilSapSocket.cpp /^void RilSapSocket::sOnUnsolicitedResponse(int unsolResponse,$/;" f class:RilSapSocket typeref:typename:void
+sState guest/hals/ril/reference-ril/reference-ril.c /^static RIL_RadioState sState = RADIO_STATE_UNAVAILABLE;$/;" v typeref:typename:RIL_RadioState file:
+s_ATBuffer guest/hals/ril/reference-ril/atchannel.c /^static char s_ATBuffer[MAX_AT_RESPONSE+1];$/;" v typeref:typename:char[] file:
+s_ATBufferCur guest/hals/ril/reference-ril/atchannel.c /^static char *s_ATBufferCur = s_ATBuffer;$/;" v typeref:typename:char * file:
+s_PDP guest/hals/ril/reference-ril/reference-ril.c /^struct PDPInfo s_PDP[] = {$/;" v typeref:struct:PDPInfo[]
+s_callbacks guest/hals/ril/reference-libril/ril.cpp /^RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};$/;" v namespace:android typeref:typename:RIL_RadioFunctions
+s_callbacks guest/hals/ril/reference-ril/reference-ril.c /^static const RIL_RadioFunctions s_callbacks = {$/;" v typeref:typename:const RIL_RadioFunctions file:
+s_cell_info_rate_ms guest/hals/ril/reference-ril/reference-ril.c /^static int s_cell_info_rate_ms = INT_MAX;$/;" v typeref:typename:int file:
+s_cid guest/hals/ril/reference-ril/reference-ril.c /^static int s_cid = 0;$/;" v typeref:typename:int file:
+s_closed guest/hals/ril/reference-ril/reference-ril.c /^static int s_closed = 0;$/;" v typeref:typename:int file:
+s_commandcond guest/hals/ril/reference-ril/atchannel.c /^static pthread_cond_t s_commandcond = PTHREAD_COND_INITIALIZER;$/;" v typeref:typename:pthread_cond_t file:
+s_commandmutex guest/hals/ril/reference-ril/atchannel.c /^static pthread_mutex_t s_commandmutex = PTHREAD_MUTEX_INITIALIZER;$/;" v typeref:typename:pthread_mutex_t file:
+s_commands guest/hals/ril/reference-libril/ril.cpp /^static CommandInfo s_commands[] = {$/;" v namespace:android typeref:typename:CommandInfo[] file:
+s_commands guest/hals/ril/reference-libril/ril_service.cpp /^static CommandInfo *s_commands;$/;" v typeref:typename:CommandInfo * file:
+s_configCommands guest/hals/ril/reference-libril/ril.cpp /^static CommandInfo s_configCommands[] = {$/;" v namespace:android typeref:typename:CommandInfo[] file:
+s_configCommands guest/hals/ril/reference-libril/ril_config.cpp /^static CommandInfo *s_configCommands;$/;" v typeref:typename:CommandInfo * file:
+s_configUnsolResponses guest/hals/ril/reference-libril/ril.cpp /^static UnsolResponseInfo s_configUnsolResponses[] = {$/;" v namespace:android typeref:typename:UnsolResponseInfo[] file:
+s_device_path guest/hals/ril/reference-ril/reference-ril.c /^static const char * s_device_path = NULL;$/;" v typeref:typename:const char * file:
+s_device_socket guest/hals/ril/reference-ril/reference-ril.c /^static int s_device_socket = 0;$/;" v typeref:typename:int file:
+s_expectAnswer guest/hals/ril/reference-ril/reference-ril.c /^static int s_expectAnswer = 0;$/;" v typeref:typename:int file:
+s_fd guest/hals/ril/reference-ril/atchannel.c /^static int s_fd = -1; \/* fd of the AT channel *\/$/;" v typeref:typename:int file:
+s_fdWakeupRead guest/hals/ril/reference-libril/ril.cpp /^static int s_fdWakeupRead;$/;" v namespace:android typeref:typename:int file:
+s_fdWakeupWrite guest/hals/ril/reference-libril/ril.cpp /^static int s_fdWakeupWrite;$/;" v namespace:android typeref:typename:int file:
+s_finalResponsesError guest/hals/ril/reference-ril/atchannel.c /^static const char * s_finalResponsesError[] = {$/;" v typeref:typename:const char * [] file:
+s_finalResponsesSuccess guest/hals/ril/reference-ril/atchannel.c /^static const char * s_finalResponsesSuccess[] = {$/;" v typeref:typename:const char * [] file:
+s_ims_cause_perm_failure guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_cause_perm_failure = 0; \/\/ 1==causes sms over ims to permanent fail$/;" v typeref:typename:int file:
+s_ims_cause_retry guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_cause_retry = 0; \/\/ 1==causes sms over ims to temp fail$/;" v typeref:typename:int file:
+s_ims_format guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_format = 1; \/\/ FORMAT_3GPP(1) vs FORMAT_3GPP2(2);$/;" v typeref:typename:int file:
+s_ims_gsm_fail guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_gsm_fail = 0; \/\/ 1==causes sms over gsm to permanent fail$/;" v typeref:typename:int file:
+s_ims_gsm_retry guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_gsm_retry = 0; \/\/ 1==causes sms over gsm to temp fail$/;" v typeref:typename:int file:
+s_ims_registered guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_registered = 0; \/\/ 0==unregistered$/;" v typeref:typename:int file:
+s_ims_services guest/hals/ril/reference-ril/reference-ril.c /^static int s_ims_services = 1; \/\/ & 0x1 == sms over ims supported$/;" v typeref:typename:int file:
+s_incomingOrWaitingLine guest/hals/ril/reference-ril/reference-ril.c /^static int s_incomingOrWaitingLine = -1;$/;" v typeref:typename:int file:
+s_lac guest/hals/ril/reference-ril/reference-ril.c /^static int s_lac = 0;$/;" v typeref:typename:int file:
+s_lastNITZTimeData guest/hals/ril/reference-libril/ril.cpp /^static void *s_lastNITZTimeData = NULL;$/;" v namespace:android typeref:typename:void * file:
+s_lastNITZTimeDataSize guest/hals/ril/reference-libril/ril.cpp /^static size_t s_lastNITZTimeDataSize;$/;" v namespace:android typeref:typename:size_t file:
+s_last_activity_info_query guest/hals/ril/reference-ril/reference-ril.c /^static uint64_t s_last_activity_info_query = 0;$/;" v typeref:typename:uint64_t file:
+s_last_wake_timeout_info guest/hals/ril/reference-libril/ril.cpp /^static UserCallbackInfo *s_last_wake_timeout_info = NULL;$/;" v namespace:android typeref:typename:UserCallbackInfo * file:
+s_mcc guest/hals/ril/reference-ril/reference-ril.c /^static int s_mcc = 0;$/;" v typeref:typename:int file:
+s_mnc guest/hals/ril/reference-ril/reference-ril.c /^static int s_mnc = 0;$/;" v typeref:typename:int file:
+s_mncLength guest/hals/ril/reference-ril/reference-ril.c /^static int s_mncLength = 2;$/;" v typeref:typename:int file:
+s_modem_simulator_port guest/hals/ril/reference-ril/reference-ril.c /^static uint32_t s_modem_simulator_port = -1;$/;" v typeref:typename:uint32_t file:
+s_networkMask guest/hals/ril/reference-ril/reference-ril.c /^static NetworkTypeBitmap s_networkMask[] = {$/;" v typeref:typename:NetworkTypeBitmap[] file:
+s_nvram_config host/commands/modem_simulator/nvram_config.cpp /^std::unique_ptr<NvramConfig> NvramConfig::s_nvram_config;$/;" m class:cuttlefish::NvramConfig typeref:typename:std::unique_ptr<NvramConfig>
+s_nvram_config host/commands/modem_simulator/nvram_config.h /^ static std::unique_ptr<NvramConfig> s_nvram_config;$/;" m class:cuttlefish::NvramConfig typeref:typename:std::unique_ptr<NvramConfig>
+s_onReaderClosed guest/hals/ril/reference-ril/atchannel.c /^static void (*s_onReaderClosed)(void) = NULL;$/;" v typeref:typename:void (*)(void) file:
+s_onTimeout guest/hals/ril/reference-ril/atchannel.c /^static void (*s_onTimeout)(void) = NULL;$/;" v typeref:typename:void (*)(void) file:
+s_pendingRequests guest/hals/ril/reference-libril/ril.cpp /^static RequestInfo *s_pendingRequests = NULL;$/;" v namespace:android typeref:typename:RequestInfo * file:
+s_pendingRequestsMutex guest/hals/ril/reference-libril/ril.cpp /^static pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_mutex_t file:
+s_pendingRequestsMutex_socket2 guest/hals/ril/reference-libril/ril.cpp /^static pthread_mutex_t s_pendingRequestsMutex_socket2 = PTHREAD_MUTEX_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_mutex_t file:
+s_pendingRequestsMutex_socket3 guest/hals/ril/reference-libril/ril.cpp /^static pthread_mutex_t s_pendingRequestsMutex_socket3 = PTHREAD_MUTEX_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_mutex_t file:
+s_pendingRequestsMutex_socket4 guest/hals/ril/reference-libril/ril.cpp /^static pthread_mutex_t s_pendingRequestsMutex_socket4 = PTHREAD_MUTEX_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_mutex_t file:
+s_pendingRequests_socket2 guest/hals/ril/reference-libril/ril.cpp /^static RequestInfo *s_pendingRequests_socket2 = NULL;$/;" v namespace:android typeref:typename:RequestInfo * file:
+s_pendingRequests_socket3 guest/hals/ril/reference-libril/ril.cpp /^static RequestInfo *s_pendingRequests_socket3 = NULL;$/;" v namespace:android typeref:typename:RequestInfo * file:
+s_pendingRequests_socket4 guest/hals/ril/reference-libril/ril.cpp /^static RequestInfo *s_pendingRequests_socket4 = NULL;$/;" v namespace:android typeref:typename:RequestInfo * file:
+s_port guest/hals/ril/reference-ril/reference-ril.c /^static int s_port = -1;$/;" v typeref:typename:int file:
+s_readerClosed guest/hals/ril/reference-ril/atchannel.c /^static int s_readerClosed;$/;" v typeref:typename:int file:
+s_registerCalled guest/hals/ril/reference-libril/ril.cpp /^static int s_registerCalled = 0;$/;" v namespace:android typeref:typename:int file:
+s_repollCallsCount guest/hals/ril/reference-ril/reference-ril.c /^static int s_repollCallsCount = 0;$/;" v typeref:typename:int file:
+s_responsePrefix guest/hals/ril/reference-ril/atchannel.c /^static const char *s_responsePrefix = NULL;$/;" v typeref:typename:const char * file:
+s_rilEnv guest/hals/rild/rild_cuttlefish.c /^static struct RIL_Env s_rilEnv = {$/;" v typeref:struct:RIL_Env file:
+s_rilenv guest/hals/ril/reference-ril/reference-ril.c /^static const struct RIL_Env *s_rilenv;$/;" v typeref:typename:const struct RIL_Env * file:
+s_smsPDU guest/hals/ril/reference-ril/atchannel.c /^static const char *s_smsPDU = NULL;$/;" v typeref:typename:const char * file:
+s_smsUnsoliciteds guest/hals/ril/reference-ril/atchannel.c /^static const char * s_smsUnsoliciteds[] = {$/;" v typeref:typename:const char * [] file:
+s_started guest/hals/ril/reference-libril/ril.cpp /^static int s_started = 0;$/;" v namespace:android typeref:typename:int file:
+s_startupCond guest/hals/ril/reference-libril/ril.cpp /^static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_cond_t file:
+s_startupMutex guest/hals/ril/reference-libril/ril.cpp /^static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_mutex_t file:
+s_state_cond guest/hals/ril/reference-ril/reference-ril.c /^static pthread_cond_t s_state_cond = PTHREAD_COND_INITIALIZER;$/;" v typeref:typename:pthread_cond_t file:
+s_state_mutex guest/hals/ril/reference-ril/reference-ril.c /^static pthread_mutex_t s_state_mutex = PTHREAD_MUTEX_INITIALIZER;$/;" v typeref:typename:pthread_mutex_t file:
+s_stkServiceRunning guest/hals/ril/reference-ril/reference-ril.c /^static bool s_stkServiceRunning = false;$/;" v typeref:typename:bool file:
+s_stkUnsolResponse guest/hals/ril/reference-ril/reference-ril.c /^static char *s_stkUnsolResponse = NULL;$/;" v typeref:typename:char * file:
+s_tid_dispatch guest/hals/ril/reference-libril/ril.cpp /^static pthread_t s_tid_dispatch;$/;" v namespace:android typeref:typename:pthread_t file:
+s_tid_mainloop guest/hals/ril/reference-ril/reference-ril.c /^pthread_t s_tid_mainloop;$/;" v typeref:typename:pthread_t
+s_tid_reader guest/hals/ril/reference-ril/atchannel.c /^static pthread_t s_tid_reader;$/;" v typeref:typename:pthread_t file:
+s_type guest/hals/ril/reference-ril/atchannel.c /^static ATCommandType s_type;$/;" v typeref:typename:ATCommandType file:
+s_unsolHandler guest/hals/ril/reference-ril/atchannel.c /^static ATUnsolHandler s_unsolHandler;$/;" v typeref:typename:ATUnsolHandler file:
+s_unsolResponses guest/hals/ril/reference-libril/ril.cpp /^static UnsolResponseInfo s_unsolResponses[] = {$/;" v namespace:android typeref:typename:UnsolResponseInfo[] file:
+s_vendorFunctions guest/hals/ril/reference-libril/ril_service.cpp /^RIL_RadioFunctions *s_vendorFunctions = NULL;$/;" v typeref:typename:RIL_RadioFunctions *
+s_vendorFunctions_config guest/hals/ril/reference-libril/ril_config.cpp /^RIL_RadioFunctions *s_vendorFunctions_config = NULL;$/;" v typeref:typename:RIL_RadioFunctions *
+s_wakeLockCountMutex guest/hals/ril/reference-libril/ril.cpp /^static pthread_mutex_t s_wakeLockCountMutex = PTHREAD_MUTEX_INITIALIZER;$/;" v namespace:android typeref:typename:pthread_mutex_t file:
+s_wakelock_count guest/hals/ril/reference-libril/ril.cpp /^int s_wakelock_count = 0;$/;" v namespace:android typeref:typename:int
+s_wakeupfd_event guest/hals/ril/reference-libril/ril.cpp /^static struct ril_event s_wakeupfd_event;$/;" v namespace:android typeref:struct:ril_event file:
+s_writeMutex guest/hals/ril/reference-ril/atchannel.c /^static pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;$/;" v typeref:typename:pthread_mutex_t file:
+salt host/commands/secure_env/soft_gatekeeper.h /^ uint64_t salt;$/;" m struct:gatekeeper::fast_hash_t typeref:typename:uint64_t
+sample_rate host/frontend/webrtc/audio_handler.cpp /^ int sample_rate() const override { return sample_rate_; }$/;" f class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+sample_rate host/frontend/webrtc/audio_handler.h /^ int sample_rate = -1;$/;" m struct:cuttlefish::AudioHandler::StreamDesc typeref:typename:int
+sample_rate_ host/frontend/webrtc/audio_handler.cpp /^ int sample_rate_;$/;" m class:cuttlefish::__anon2a3d92f70111::CvdAudioFrameBuffer typeref:typename:int file:
+sap guest/hals/ril/reference-libril/sap_service.h /^namespace sap {$/;" n
+sapCallback guest/hals/ril/reference-libril/sap_service.cpp /^ sp<ISapCallback> sapCallback;$/;" m struct:SapImpl typeref:typename:sp<ISapCallback> file:
+sapDecodeMessage guest/hals/ril/reference-libril/sap_service.cpp /^void *sapDecodeMessage(MsgId msgId, MsgType msgType, uint8_t *payloadPtr, size_t payloadLen) {$/;" f typeref:typename:void *
+sapService guest/hals/ril/reference-libril/sap_service.cpp /^sp<SapImpl> sapService[1];$/;" v typeref:typename:sp<SapImpl>[1]
+sapService guest/hals/ril/reference-libril/sap_service.cpp /^sp<SapImpl> sapService[SIM_COUNT];$/;" v typeref:typename:sp<SapImpl>[]
+saved_params_ host/commands/secure_env/tpm_keymaster_enforcement.h /^ keymaster::HmacSharingParameters saved_params_;$/;" m class:cuttlefish::TpmKeymasterEnforcement typeref:typename:keymaster::HmacSharingParameters
+saved_state_ host/libs/confui/session.h /^ MainLoopState saved_state_; \/\/ for restore\/suspend$/;" m class:cuttlefish::confui::Session typeref:typename:MainLoopState
+sc_android_queue_id_ host/libs/screen_connector/screen_connector_multiplexer.h /^ int sc_android_queue_id_;$/;" m class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:int
+sc_android_src_ host/libs/screen_connector/screen_connector.h /^ std::unique_ptr<WaylandScreenConnector> sc_android_src_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:std::unique_ptr<WaylandScreenConnector>
+sc_confui_queue_id_ host/libs/screen_connector/screen_connector_multiplexer.h /^ int sc_confui_queue_id_;$/;" m class:cuttlefish::ScreenConnectorInputMultiplexer typeref:typename:int
+sc_frame_multiplexer_ host/libs/screen_connector/screen_connector.h /^ FrameMultiplexer sc_frame_multiplexer_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:FrameMultiplexer
+sca host/commands/modem_simulator/sms_service.h /^ std::string sca;$/;" m struct:cuttlefish::SmsService::SmsServiceCenterAddress typeref:typename:std::string
+scaled_frame_ host/frontend/webrtc/lib/camera_streamer.h /^ rtc::scoped_refptr<webrtc::I420Buffer> scaled_frame_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:rtc::scoped_refptr<webrtc::I420Buffer>
+scanout_id host/libs/wayland/wayland_surface.h /^ std::optional<uint32_t> scanout_id;$/;" m struct:wayland::Surface::VirtioGpuMetadata typeref:typename:std::optional<uint32_t>
+schedule guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/JobExecutor.java /^ public void schedule(final JobBase job, final GceFuture<?>... futures) {$/;" m class:JobExecutor
+screen_connector_ host/frontend/webrtc/display_handler.h /^ ScreenConnector& screen_connector_;$/;" m class:cuttlefish::DisplayHandler typeref:typename:ScreenConnector &
+screen_connector_ host/libs/confui/host_server.h /^ ScreenConnectorFrameRenderer& screen_connector_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:ScreenConnectorFrameRenderer &
+screen_connector_ host/libs/confui/session.h /^ ScreenConnectorFrameRenderer& screen_connector_;$/;" m class:cuttlefish::confui::Session typeref:typename:ScreenConnectorFrameRenderer &
+sdcard_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::sdcard_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+seat_get_keyboard host/libs/wayland/wayland_seat.cpp /^void seat_get_keyboard(wl_client* client, wl_resource* seat, uint32_t id) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+seat_get_pointer host/libs/wayland/wayland_seat.cpp /^void seat_get_pointer(wl_client* client, wl_resource* seat, uint32_t id) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+seat_get_touch host/libs/wayland/wayland_seat.cpp /^void seat_get_touch(wl_client* client, wl_resource* seat, uint32_t id) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+seat_implementation host/libs/wayland/wayland_seat.cpp /^const struct wl_seat_interface seat_implementation = {$/;" v namespace:wayland::__anona9f16c970111 typeref:typename:const struct wl_seat_interface
+seat_release host/libs/wayland/wayland_seat.cpp /^void seat_release(wl_client*, wl_resource* resource) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+seccomp_policy_dir host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::seccomp_policy_dir() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+seconds host/commands/metrics/proto/common.proto /^ required int64 seconds = 1;$/;" f message:Duration typeref:typename:int64
+seconds host/commands/metrics/proto/common.proto /^ required int64 seconds = 1;$/;" f message:Timestamp typeref:typename:int64
+secs common/libs/utils/network.cpp /^ __be16 secs;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:__be16 file:
+secure_hals host/libs/config/cuttlefish_config.cpp /^std::set<SecureHal> CuttlefishConfig::secure_hals() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::set<SecureHal>
+secure_storage_ host/commands/secure_env/tpm_gatekeeper.h /^ GatekeeperStorage& secure_storage_;$/;" m class:cuttlefish::TpmGatekeeper typeref:typename:GatekeeperStorage &
+secureclock guest/hals/keymint/remote/remote_secure_clock.cpp /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl::android::hardware::security file:
+secureclock guest/hals/keymint/remote/remote_secure_clock.h /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl::android::hardware::security
+security guest/hals/keymint/remote/remote_keymint_device.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware file:
+security guest/hals/keymint/remote/remote_keymint_device.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware
+security guest/hals/keymint/remote/remote_keymint_operation.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware file:
+security guest/hals/keymint/remote/remote_keymint_operation.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware
+security guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware file:
+security guest/hals/keymint/remote/remote_remotely_provisioned_component.h /^namespace aidl::android::hardware::security::keymint {$/;" n namespace:aidl::android::hardware
+security guest/hals/keymint/remote/remote_secure_clock.cpp /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl::android::hardware file:
+security guest/hals/keymint/remote/remote_secure_clock.h /^namespace aidl::android::hardware::security::secureclock {$/;" n namespace:aidl::android::hardware
+security guest/hals/keymint/remote/remote_shared_secret.cpp /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl::android::hardware file:
+security guest/hals/keymint/remote/remote_shared_secret.h /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl::android::hardware
+security host/frontend/webrtc/lib/streamer.h /^ WsConnection::Security security;$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig::__anonbc3851b60108 typeref:typename:WsConnection::Security
+securityLevel_ guest/hals/keymint/remote/remote_keymint_device.h /^ SecurityLevel securityLevel_;$/;" m class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:SecurityLevel
+security_ host/frontend/webrtc/lib/ws_connection.cpp /^ const Security security_;$/;" m class:WsConnectionImpl typeref:typename:const Security file:
+security_level host/commands/secure_env/tpm_keymaster_enforcement.cpp /^ keymaster_security_level_t security_level;$/;" m struct:cuttlefish::TpmKeymasterEnforcement::VerifyAuthorization::VerificationData typeref:typename:keymaster_security_level_t file:
+segment_ host/frontend/webrtc/lib/local_recorder.cpp /^ mkvmuxer::Segment segment_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Impl typeref:typename:mkvmuxer::Segment file:
+selectDeviceCb host/frontend/webrtc_operator/assets/js/index.js /^ #selectDeviceCb;$/;" M class:DeviceListApp
+selected guest/hals/ril/reference-libril/ril.h /^ unsigned char selected;$/;" m struct:__anon0bfbaecf4408 typeref:typename:unsigned char
+sem_ host/libs/screen_connector/screen_connector_ctrl.h /^ Semaphore sem_;$/;" m class:cuttlefish::ScreenConnectorCtrl typeref:typename:Semaphore
+sem_items_ common/libs/concurrency/multiplexer.h /^ Semaphore sem_items_;$/;" m class:cuttlefish::Multiplexer typeref:typename:Semaphore
+send guest/commands/bt_vhci_forwarder/main.cpp /^ssize_t send(int fd_, uint8_t type, const uint8_t* data, size_t length) {$/;" f typeref:typename:ssize_t
+send guest/hals/bt/remote/remote_bluetooth.cpp /^void BluetoothHci::send(test_vendor_lib::PacketType type,$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:void
+send host/frontend/webrtc_operator/assets/js/adb.js /^ send: function(buffer) {$/;" m class:init_adb.adb_ws
+sendAclData guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::sendAclData(const hidl_vec<uint8_t>& packet) {$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+sendAdbMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendAdbMessage(msg) {$/;" m class:DeviceConnection
+sendBluetoothMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendBluetoothMessage(msg) {$/;" m class:DeviceConnection
+sendBurstDtmf guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendBurstDtmfResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendBurstDtmfResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendCDMAFeatureCode guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) /;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendCDMAFeatureCodeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendCDMAFeatureCodeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendCallStateChanged guest/hals/ril/reference-ril/reference-ril.c /^static void sendCallStateChanged(void *param __unused)$/;" f typeref:typename:void file:
+sendCameraData host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendCameraData(data) {$/;" m class:DeviceConnection
+sendCameraResolution host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendCameraResolution(stream) {$/;" m class:DeviceConnection
+sendCdmaSms guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendCdmaSmsExpectMore guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendCdmaSmsExpectMore(int32_t serial, const CdmaSmsMessage& sms) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendCdmaSmsExpectMoreResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendCdmaSmsExpectMoreResponse(int slotId, int responseType, int serial, RIL_Errno/;" f class:radio_1_6 typeref:typename:int
+sendCdmaSmsExpectMore_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendCdmaSmsExpectMore_1_6(int32_t serial, const CdmaSmsMessage& sms)/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendCdmaSmsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendCdmaSmsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendCdmaSms_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendCdmaSms_1_6(int32_t serial, const CdmaSmsMessage& sms) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendClientDescription host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async #sendClientDescription(desc) {$/;" m class:Controller
+sendCmdAgainForOpenChannelWithP2 guest/hals/ril/reference-ril/reference-ril.c /^static int sendCmdAgainForOpenChannelWithP2( char *data,$/;" f typeref:typename:int file:
+sendControlMessage host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendControlMessage(msg) {$/;" m class:DeviceConnection
+sendDeviceState guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendDeviceStateResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendDeviceStateResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendDtmf guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendDtmf(int32_t serial, const hidl_string& s) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendDtmfResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendDtmfResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendEnvelope guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendEnvelope(int32_t serial, const hidl_string& command) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendEnvelopeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendEnvelopeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendEnvelopeWithStatus guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) /;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendEnvelopeWithStatusResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendEnvelopeWithStatusResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendErrorResponse guest/hals/ril/reference-libril/ril_service.cpp /^void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {$/;" f typeref:typename:void
+sendEventUpdate host/frontend/webrtc_operator/assets/js/app.js /^ #sendEventUpdate(ctx, e) {$/;" m class:DeviceControlApp
+sendFailedResponse guest/hals/ril/reference-libril/sap_service.cpp /^void SapImpl::sendFailedResponse(MsgId msgId, int32_t token, int numPointers, ...) {$/;" f class:SapImpl typeref:typename:void
+sendGnssRawToSerial host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void sendGnssRawToSerial() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+sendHciCommand guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::sendHciCommand(const hidl_vec<uint8_t>& packet) {$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+sendIceCandidate host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async #sendIceCandidate(candidate) {$/;" m class:Controller
+sendImsSms guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendImsSms(int32_t serial, const ImsSmsMessage& message) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendImsSmsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendImsSmsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendIsoData guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::sendIsoData(const hidl_vec<uint8_t>& packet) {$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+sendJsonInput host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #sendJsonInput(evt) {$/;" m class:DeviceConnection
+sendKeyEvent host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendKeyEvent(code, type) {$/;" m class:DeviceConnection
+sendMousePosition host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendMousePosition({x, y, down, display_label}) {$/;" m class:DeviceConnection
+sendMultiTouch host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendMultiTouch({idArr, xArr, yArr, down, slotArr, display_label}) {$/;" m class:DeviceConnection
+sendOnePhysChanCfgUpdate host/commands/modem_simulator/data_service.cpp /^void DataService::sendOnePhysChanCfgUpdate(int status, int bandwidth, int rat,$/;" f class:cuttlefish::DataService typeref:typename:void
+sendOrQueueCameraData host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ sendOrQueueCameraData(data) {$/;" m class:DeviceConnection
+sendRequestRaw guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {$/;" f class:OemHookImpl typeref:typename:Return<void>
+sendRequestRawResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendRequestRawResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendRequestStrings guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> OemHookImpl::sendRequestStrings(int32_t serial,$/;" f class:OemHookImpl typeref:typename:Return<void>
+sendRequestStringsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendRequestStringsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendSMSExpectMore guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendScoData guest/hals/bt/remote/remote_bluetooth.cpp /^Return<void> BluetoothHci::sendScoData(const hidl_vec<uint8_t>& packet) {$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:Return<void>
+sendSms guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendSms(int32_t serial, const GsmSmsMessage& message) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendSmsExpectMoreResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendSmsExpectMoreResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendSmsExpectMore_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendSmsExpectMore_1_6(int32_t serial, const GsmSmsMessage& message) /;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendSmsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendSmsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendSms_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendSms_1_6(int32_t serial, const GsmSmsMessage& message) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendTerminalResponseToSim guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendTerminalResponseToSim(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendTerminalResponseToSimResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendTerminalResponseToSimResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sendToDevice host/frontend/webrtc_operator/assets/js/server_connector.js /^ async sendToDevice(msg) {$/;" m class:Connector
+sendToDevice host/frontend/webrtc_operator/assets/js/server_connector.js /^ async sendToDevice(msg) {$/;" m class:PollingConnector
+sendToDevice host/frontend/webrtc_operator/assets/js/server_connector.js /^ async sendToDevice(msg) {$/;" m class:WebsocketConnector
+sendToSerial host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ void sendToSerial() {$/;" f class:GnssGrpcProxyServiceImpl typeref:typename:void file:
+sendUnsolImsNetworkStateChanged guest/hals/ril/reference-ril/reference-ril.c /^static void sendUnsolImsNetworkStateChanged()$/;" f typeref:typename:void file:
+sendUnsolNetworkScanResult guest/hals/ril/reference-ril/reference-ril.c /^void sendUnsolNetworkScanResult() {$/;" f typeref:typename:void
+sendUssd guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::sendUssd(int32_t serial, const hidl_string& ussd) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+sendUssdResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::sendUssdResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+send_lock_ common/libs/utils/tcp_socket.h /^ std::mutex send_lock_;$/;" m class:cuttlefish::ClientSocket typeref:typename:std::mutex
+send_serializer_mtx_ guest/hals/confirmationui/guest_session.h /^ std::mutex send_serializer_mtx_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::mutex
+send_to_client_ host/frontend/webrtc/adb_handler.h /^ std::function<void(const uint8_t *, size_t)> send_to_client_;$/;" m struct:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:std::function<void (const uint8_t *,size_t)>
+send_to_client_ host/frontend/webrtc/bluetooth_handler.h /^ std::function<void(const uint8_t *, size_t)> send_to_client_;$/;" m struct:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:std::function<void (const uint8_t *,size_t)>
+send_to_client_ host/frontend/webrtc/lib/client_handler.h /^ std::function<void(const Json::Value&)> send_to_client_;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:std::function<void (const Json::Value &)>
+separateConnection guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::separateConnection(int32_t serial, int32_t gsmIndex) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+separateConnectionResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::separateConnectionResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+serial host/commands/modem_simulator/thread_looper.h /^ Serial serial;$/;" m struct:cuttlefish::ThreadLooper::Event typeref:typename:Serial
+serial_num_ host/libs/vm_manager/crosvm_builder.h /^ int serial_num_;$/;" m class:cuttlefish::CrosvmBuilder typeref:typename:int
+serial_number host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::serial_number() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+server host/example_custom_actions/custom_action_config.json /^ "server":"cuttlefish_example_action_server",$/;" s object:1
+server host/libs/config/custom_actions.h /^ std::optional<std::string> server;$/;" m struct:cuttlefish::CustomActionConfig typeref:typename:std::optional<std::string>
+serverConnector host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #serverConnector;$/;" M class:Controller
+serverLoop guest/hals/camera/vsock_camera_server.cpp /^void VsockCameraServer::serverLoop(unsigned int port, unsigned int cid) {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:void
+serverLoopComponent host/commands/run_cvd/server_loop.cpp /^serverLoopComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig,const CuttlefishConfig::InstanceSpecific>,ServerLoop>
+server_ guest/hals/camera/vsock_camera_provider_2_7.h /^ VsockCameraServer* server_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:VsockCameraServer *
+server_ host/commands/modem_simulator/channel_monitor.h /^ cuttlefish::SharedFD server_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:cuttlefish::SharedFD
+server_ host/commands/run_cvd/server_loop.cpp /^ SharedFD server_;$/;" m class:cuttlefish::__anon527e8bd40111::ServerLoopImpl typeref:typename:SharedFD file:
+server_ host/libs/screen_connector/wayland_screen_connector.h /^ std::unique_ptr<wayland::WaylandServer> server_;$/;" m class:cuttlefish::WaylandScreenConnector typeref:typename:std::unique_ptr<wayland::WaylandServer>
+server_config_ host/frontend/webrtc_operator/client_handler.h /^ const ServerConfig& server_config_;$/;" m class:cuttlefish::ClientWSHandlerFactory typeref:typename:const ServerConfig &
+server_config_ host/frontend/webrtc_operator/client_handler.h /^ const ServerConfig& server_config_;$/;" m class:cuttlefish::ConfigHandler typeref:typename:const ServerConfig &
+server_config_ host/frontend/webrtc_operator/device_handler.h /^ const ServerConfig& server_config_;$/;" m class:cuttlefish::DeviceHandlerFactory typeref:typename:const ServerConfig &
+server_config_ host/frontend/webrtc_operator/signal_handler.h /^ const ServerConfig& server_config_;$/;" m class:cuttlefish::SignalHandler typeref:typename:const ServerConfig &
+server_connection_ host/frontend/webrtc/lib/streamer.cpp /^ std::shared_ptr<WsConnection> server_connection_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::shared_ptr<WsConnection> file:
+server_fd_ common/libs/utils/vsock_connection.h /^ SharedFD server_fd_;$/;" m class:cuttlefish::VsockServerConnection typeref:typename:SharedFD
+server_identifier common/libs/utils/network.cpp /^ Dhcp4ServerIdentifier server_identifier;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:Dhcp4ServerIdentifier file:
+server_ip common/libs/utils/network.cpp /^ std::uint8_t server_ip[4];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[4] file:
+server_ip common/libs/utils/network.cpp /^ std::uint8_t server_ip[4];$/;" m struct:cuttlefish::Dhcp4ServerIdentifier typeref:typename:std::uint8_t[4] file:
+server_name common/libs/utils/network.cpp /^ std::uint8_t server_name[64];$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:std::uint8_t[64] file:
+server_port_ host/libs/websocket/websocket_server.h /^ int server_port_;$/;" m class:cuttlefish::WebSocketServer typeref:typename:int
+server_ready_ host/libs/wayland/wayland_server.h /^ bool server_ready_ = false;$/;" m class:wayland::WaylandServer typeref:typename:bool
+server_ready_cv_ host/libs/wayland/wayland_server.h /^ std::condition_variable server_ready_cv_;$/;" m class:wayland::WaylandServer typeref:typename:std::condition_variable
+server_ready_mutex_ host/libs/wayland/wayland_server.h /^ std::mutex server_ready_mutex_;$/;" m class:wayland::WaylandServer typeref:typename:std::mutex
+server_socket_ host/libs/audio_connector/server.h /^ SharedFD server_socket_;$/;" m class:cuttlefish::AudioServer typeref:typename:SharedFD
+server_state_ host/libs/wayland/wayland_server.h /^ std::unique_ptr<internal::WaylandServerState> server_state_;$/;" m class:wayland::WaylandServer typeref:typename:std::unique_ptr<internal::WaylandServerState>
+server_thread_ guest/hals/camera/vsock_camera_server.h /^ std::thread server_thread_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:std::thread
+server_thread_ host/frontend/webrtc/audio_handler.h /^ std::thread server_thread_;$/;" m class:cuttlefish::AudioHandler typeref:typename:std::thread
+server_thread_ host/libs/wayland/wayland_server.h /^ std::thread server_thread_;$/;" m class:wayland::WaylandServer typeref:typename:std::thread
+servers host/frontend/webrtc/lib/streamer.cpp /^ std::vector<webrtc::PeerConnectionInterface::IceServer> servers;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::OperatorServerConfig typeref:typename:std::vector<webrtc::PeerConnectionInterface::IceServer> file:
+serviceClass guest/hals/ril/reference-libril/ril.h /^ int serviceClass;\/* From 27.007 +CCFC\/+CLCK "class"$/;" m struct:__anon0bfbaecf2108 typeref:typename:int
+serviceClass guest/hals/ril/reference-libril/ril.h /^ int serviceClass;$/;" m struct:__anon0bfbaecf9908 typeref:typename:int
+serviceDied guest/hals/bt/remote/remote_bluetooth.cpp /^ void serviceDied($/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothDeathRecipient typeref:typename:void file:
+serviceType guest/hals/ril/reference-libril/ril.h /^ RIL_SsServiceType serviceType;$/;" m struct:__anon0bfbaecf9908 typeref:typename:RIL_SsServiceType
+service_id_ host/commands/modem_simulator/modem_service.h /^ int32_t service_id_;$/;" m class:cuttlefish::ModemService typeref:typename:int32_t
+session guest/hals/ril/reference-libril/ril.h /^ int session; \/\/ Unique session value defined by framework returned in all "resp/;" m struct:__anon0bfbaecf0a08 typeref:typename:int
+sessionHandle guest/hals/ril/reference-libril/ril.h /^ uint32_t sessionHandle;$/;" m struct:__anon0bfbaecfc708 typeref:typename:uint32_t
+session_ guest/hals/camera/vsock_camera_device_3_4.h /^ sp<VsockCameraDeviceSession> session_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:sp<VsockCameraDeviceSession>
+session_id host/commands/assemble_cvd/alloc.h /^ uint32_t session_id;$/;" m struct:cuttlefish::IfaceData typeref:typename:uint32_t
+session_id host/commands/metrics/proto/cf_log.proto /^ optional string session_id = 6;$/;" f message:cuttlefish.CuttlefishLogEvent typeref:typename:string
+session_id host/commands/modem_simulator/sim_service.h /^ int session_id;$/;" m struct:cuttlefish::SimService::LogicalChannel typeref:typename:int
+session_id host/libs/config/cuttlefish_config_instance.cpp /^uint32_t CuttlefishConfig::InstanceSpecific::session_id() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:uint32_t
+session_id_ common/libs/confui/packet_types.h /^ std::string session_id_;$/;" m struct:cuttlefish::confui::packet::ParsedPacket typeref:typename:std::string
+session_id_ common/libs/confui/protocol_types.h /^ std::string session_id_;$/;" m class:cuttlefish::confui::ConfUiMessage typeref:typename:std::string
+session_id_ host/libs/allocd/resource_manager.h /^ std::atomic_uint32_t session_id_ = 0;$/;" m struct:cuttlefish::ResourceManager typeref:typename:std::atomic_uint32_t
+session_id_ host/libs/allocd/resource_manager.h /^ uint32_t session_id_{};$/;" m class:cuttlefish::Session typeref:typename:uint32_t
+session_id_ host/libs/confui/session.h /^ const std::string session_id_;$/;" m class:cuttlefish::confui::Session typeref:typename:const std::string
+session_name_ guest/hals/confirmationui/guest_session.h /^ const std::string session_name_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:const std::string
+sessionid guest/hals/ril/reference-libril/ril.h /^ int sessionid; \/* "sessionid" from TS 27.007 +CGLA command. Should be$/;" m struct:__anon0bfbaecf1f08 typeref:typename:int
+set guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public boolean set(T value) {$/;" m class:GceFuture
+set guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public void set(Exception e) {$/;" m class:GceFuture
+set host/commands/secure_env/tpm_resource_manager.cpp /^void TpmResourceManager::ObjectSlot::set(ESYS_TR resource) {$/;" f class:cuttlefish::TpmResourceManager::ObjectSlot typeref:typename:void
+setAllowedCarriers guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setAllowedCarriers(int32_t serial, bool allAllowed,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setAllowedCarriersResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setAllowedCarriersResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setAllowedCarriers_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setAllowedCarriers_1_4(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setAllowedNetworkTypesBitmap guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setAllowedNetworkTypesBitmap($/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setAllowedNetworkTypesBitmapResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setAllowedNetworkTypesBitmapResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setBandMode guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setBandMode(int32_t serial, RadioBandMode mode) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setBandModeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setBandModeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setBarringPassword guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setBarringPassword(int32_t serial, const hidl_string& facility,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setBarringPasswordResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setBarringPasswordResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCallForward guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCallForwardResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCallForwardResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCallWaiting guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCallWaitingResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCallWaitingResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCallback guest/hals/camera/vsock_camera_provider_2_7.cpp /^Return<Status> VsockCameraProvider::setCallback($/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:Return<Status>
+setCallback guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::setCallback(const ::android::sp<ISapCallback>& sapCallbackParam) {$/;" f class:SapImpl typeref:typename:Return<void>
+setCarrierInfoForImsiEncryption guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCarrierInfoForImsiEncryption(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCarrierInfoForImsiEncryptionResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCarrierInfoForImsiEncryptionResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCarrierInfoForImsiEncryption_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCarrierInfoForImsiEncryption_1_6($/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCdmaBroadcastActivation guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCdmaBroadcastActivation(int32_t serial, bool activate) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCdmaBroadcastActivationResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCdmaBroadcastActivationResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCdmaBroadcastConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCdmaBroadcastConfig(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCdmaBroadcastConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCdmaBroadcastConfigResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCdmaRoamingPreference guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCdmaRoamingPreferenceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCdmaRoamingPreferenceResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCdmaSubscriptionSource guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdm/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCdmaSubscriptionSourceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCdmaSubscriptionSourceResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setCellInfoListRate guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setCellInfoListRate(int32_t serial, int32_t rate) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setCellInfoListRateResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setCellInfoListRateResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setClir guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setClir(int32_t serial, int32_t status) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setClirResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setClirResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setConnectedCallback guest/hals/camera/vsock_camera_server.cpp /^void VsockCameraServer::setConnectedCallback(callback_t callback) {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:void
+setDataAllowed guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setDataAllowed(int32_t serial, bool allow) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setDataAllowedResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setDataAllowedResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setDataProfile guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& prof/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setDataProfileResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setDataProfileResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setDataProfile_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setDataProfile_1_4(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setDataProfile_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setDataProfile_1_5(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setDataThrottling guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setDataThrottling(int32_t serial, V1_6::DataThrottlingAction dataThr/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setDataThrottlingResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setDataThrottlingResponse(int slotId, int responseType,$/;" f class:radio_1_6 typeref:typename:int
+setDeviceStateDetailsText host/frontend/webrtc_operator/assets/js/app.js /^ setDeviceStateDetailsText(text) {$/;" m class:DeviceDetailsUpdater
+setFacilityLockForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setFacilityLockForApp(int32_t serial, const hidl_string& facility,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setFacilityLockForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setFacilityLockForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setGsmBroadcastActivation guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setGsmBroadcastActivation(int32_t serial, bool activate) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setGsmBroadcastActivationResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setGsmBroadcastActivationResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setGsmBroadcastConfig guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setGsmBroadcastConfig(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setGsmBroadcastConfigData guest/hals/ril/reference-ril/reference-ril.c /^static void setGsmBroadcastConfigData(int from, int to, int id, int outStrSize, char *outStr) {$/;" f typeref:typename:void file:
+setGsmBroadcastConfigResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setGsmBroadcastConfigResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setHardwareConfiguration guest/hals/ril/reference-ril/reference-ril.c /^static void setHardwareConfiguration(int num, RIL_HardwareConfig *cfg)$/;" f typeref:typename:void file:
+setHardwareDetailsText host/frontend/webrtc_operator/assets/js/app.js /^ setHardwareDetailsText(text) {$/;" m class:DeviceDetailsUpdater
+setHasDied guest/hals/bt/remote/remote_bluetooth.cpp /^ void setHasDied(bool has_died) { has_died_ = has_died; }$/;" f class:android::hardware::bluetooth::V1_1::remote::BluetoothDeathRecipient typeref:typename:void file:
+setIndicationFilter guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setIndicationFilter(int32_t serial, int32_t indicationFilter) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setIndicationFilterResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setIndicationFilterResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setIndicationFilter_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setIndicationFilter_1_2(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setIndicationFilter_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setIndicationFilter_1_5(int32_t \/* serial *\/,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setInitialAttachApn guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfi/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setInitialAttachApnResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setInitialAttachApnResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setInitialAttachApn_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setInitialAttachApn_1_4(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setInitialAttachApn_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setInitialAttachApn_1_5(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setInterfaceState guest/hals/ril/reference-ril/reference-ril.c /^static RIL_Errno setInterfaceState(const char* interfaceName,$/;" f typeref:typename:RIL_Errno file:
+setLinkCapacityReportingCriteria guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setLinkCapacityReportingCriteria(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setLinkCapacityReportingCriteriaResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setLinkCapacityReportingCriteriaResponse(int slotId, int responseType, int serial/;" f class:radio_1_6 typeref:typename:int
+setLinkCapacityReportingCriteria_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setLinkCapacityReportingCriteria_1_5(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setLocationUpdates guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setLocationUpdates(int32_t serial, bool enable) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setLocationUpdatesResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setLocationUpdatesResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setModemsConfig guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::setModemsConfig(int32_t serial, const V1_1::ModemsConfig& modemsCo/;" f class:RadioConfigImpl typeref:typename:Return<void>
+setModemsConfigResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::setModemsConfigResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+setMute guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setMute(int32_t serial, bool enable) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setMuteResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setMuteResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setNetworkSelectionModeAutomatic guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setNetworkSelectionModeAutomatic(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setNetworkSelectionModeAutomaticResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial/;" f class:radio_1_6 typeref:typename:int
+setNetworkSelectionModeManual guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setNetworkSelectionModeManual(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setNetworkSelectionModeManualResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setNetworkSelectionModeManualResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setNetworkSelectionModeManual_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setNetworkSelectionModeManual_1_5(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setNitzTimeReceived guest/hals/ril/reference-libril/ril_service.cpp /^void radio_1_6::setNitzTimeReceived(int slotId, long timeReceived) {$/;" f class:radio_1_6 typeref:typename:void
+setNrDualConnectivityState guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setNrDualConnectivityState(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setNrDualConnectivityStateResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setNrDualConnectivityStateResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+setPreferredDataModem guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::setPreferredDataModem(int32_t serial, uint8_t modemId) {$/;" f class:RadioConfigImpl typeref:typename:Return<void>
+setPreferredDataModemResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::setPreferredDataModemResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+setPreferredNetworkType guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType)/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setPreferredNetworkTypeBitmap guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setPreferredNetworkTypeBitmap($/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setPreferredNetworkTypeBitmapResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setPreferredNetworkTypeBitmapResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setPreferredNetworkTypeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setPreferredNetworkTypeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setPreferredVoicePrivacy guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setPreferredVoicePrivacy(int32_t serial, bool enable) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setPreferredVoicePrivacyResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setPreferredVoicePrivacyResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setRadioCapability guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setRadioCapability(int32_t serial, const RadioCapability& rc) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setRadioCapabilityResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setRadioCapabilityResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setRadioPower guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setRadioPower(int32_t serial, bool on) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setRadioPowerResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setRadioPowerResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setRadioPower_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setRadioPower_1_5(int32_t serial, bool powerOn, bool forEmergencyCal/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setRadioPower_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setRadioPower_1_6(int32_t serial, bool powerOn, bool forEmergencyCal/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setRadioState guest/hals/ril/reference-ril/reference-ril.c /^setRadioState(RIL_RadioState newState)$/;" f typeref:typename:void file:
+setRadioTechnology guest/hals/ril/reference-ril/reference-ril.c /^setRadioTechnology(ModemInfo *mdm, int newtech)$/;" f typeref:typename:void file:
+setResponseFunctions guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::setResponseFunctions($/;" f class:RadioConfigImpl typeref:typename:Return<void>
+setResponseFunctions guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> OemHookImpl::setResponseFunctions($/;" f class:OemHookImpl typeref:typename:Return<void>
+setResponseFunctions guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setResponseFunctions($/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSignalStrengthReportingCriteria guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSignalStrengthReportingCriteria(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSignalStrengthReportingCriteriaResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setSignalStrengthReportingCriteriaResponse(int slotId, int responseType, int seri/;" f class:radio_1_6 typeref:typename:int
+setSignalStrengthReportingCriteria_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSignalStrengthReportingCriteria_1_5(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSimCardPower guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSimCardPower(int32_t serial, bool powerUp) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSimCardPowerResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setSimCardPowerResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setSimCardPower_1_1 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSimCardPower_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSimCardPower_1_6(int32_t serial, const V1_1::CardPowerState state/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSimSlotsMapping guest/hals/ril/reference-libril/ril_config.cpp /^Return<void> RadioConfigImpl::setSimSlotsMapping(int32_t serial, const hidl_vec<uint32_t>& slotM/;" f class:RadioConfigImpl typeref:typename:Return<void>
+setSimSlotsMappingResponse guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::setSimSlotsMappingResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+setSmscAddress guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSmscAddress(int32_t serial, const hidl_string& smsc) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSmscAddressResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setSmscAddressResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setSuppServiceNotifications guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSuppServiceNotifications(int32_t serial, bool enable) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSuppServiceNotificationsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setSuppServiceNotificationsResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setSystemSelectionChannels guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSystemSelectionChannels(int32_t serial, bool \/* specifyChannels /;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setSystemSelectionChannelsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setSystemSelectionChannelsResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+setSystemSelectionChannels_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setSystemSelectionChannels_1_5(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setTTYMode guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setTTYMode(int32_t serial, TtyMode mode) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setTTYModeResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setTTYModeResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setTerminalRaw guest/commands/bt_vhci_forwarder/main.cpp /^int setTerminalRaw(int fd_) {$/;" f typeref:typename:int
+setTimespecRelative guest/hals/ril/reference-ril/atchannel.c /^static void setTimespecRelative(struct timespec *p_ts, long long msec)$/;" f typeref:typename:void file:
+setTorchMode guest/hals/camera/vsock_camera_device_3_4.cpp /^Return<Status> VsockCameraDevice::setTorchMode(TorchMode) {$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice typeref:typename:Return<Status>
+setTransferProtocolReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::setTransferProtocolReq(int32_t token, SapTransferProtocol transferProtocol/;" f class:SapImpl typeref:typename:Return<void>
+setU32LE host/frontend/webrtc_operator/assets/js/adb.js /^function setU32LE(array, offset, x) {$/;" f
+setUiccSubscription guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setUiccSubscriptionResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setUiccSubscriptionResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setUp tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ public void setUp() throws Exception {$/;" m class:RilE2eTests
+setUp tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ public void setUp() throws Exception {$/;" m class:WifiE2eTests
+set_Ip_Addr guest/hals/ril/reference-ril/reference-ril.c /^static void set_Ip_Addr(const char *addr, const char* radioInterfaceName) {$/;" f typeref:typename:void file:
+set_adb_host_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_adb_host_port(int port) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_adb_ip_and_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_adb_ip_and_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_ap_kernel_image host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_ap_kernel_image(const std::string& ap_kernel_image) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_ap_rootfs_image host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_ap_rootfs_image(const std::string& ap_rootfs_image) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_assembly_dir host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_assembly_dir(const std::string& assembly_dir) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_audiocontrol_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_audiocontrol_server_port(int audiocontrol_se/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_blank_data_image_mb host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_blank_data_image_mb(int blank_data_image_mb) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_boot_slot host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_boot_slot(const std::string& boot_slot) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_bootconfig_supported host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_bootconfig_supported(bool bootconfig_supported) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_bootloader host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_bootloader(const std::string& bootloader) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_camera_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_camera_server_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_config_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_config_server_port(int config_server_port) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_confui_host_vsock_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_confui_host_vsock_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_console host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_console(bool console) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_cpus host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_cpus(int cpus) { (*dictionary_)[kCpus] = cpus; }$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_crosvm_binary host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_crosvm_binary(const std::string& crosvm_binary) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_cuttlefish_env_path host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_cuttlefish_env_path(const std::string& path) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_data_policy host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_data_policy(const std::string& data_policy) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_deprecated_boot_completed host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_deprecated_boot_completed($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_display_configs host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_display_configs($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_emergency_mode host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InstanceSpecific::set_emergency_mode(bool mode) {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:void
+set_enable_audio host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_audio(bool enable) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_gnss_grpc_proxy host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_gnss_grpc_proxy($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_host_bluetooth host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_host_bluetooth(bool enable_host_bluetooth) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_metrics host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_metrics(std::string enable_metrics) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_minimal_mode host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_minimal_mode(bool enable_minimal_mode) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_modem_simulator host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_modem_simulator(bool enable_modem_simulator) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_sandbox host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_sandbox(const bool enable_sandbox) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_vehicle_hal_grpc_server host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_vehicle_hal_grpc_server($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_enable_webrtc host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_enable_webrtc(bool enable_webrtc) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_ethernet_tap_name host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_ethernet_tap_name($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_extra_bootconfig_args host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_extra_bootconfig_args($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_extra_kernel_cmdline host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_extra_kernel_cmdline($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_gdb_port host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_gdb_port(int port) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_gnss_file_path host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_gnss_file_path($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_gnss_grpc_proxy_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_gnss_grpc_proxy_server_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_gpu_capture_binary host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_gpu_capture_binary(const std::string& name) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_gpu_mode host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_gpu_mode(const std::string& name) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_guest_audit_security host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_guest_audit_security(bool guest_audit_security) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_guest_enforce_security host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_guest_enforce_security(bool guest_enforce_security) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_host_tools_version host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_host_tools_version($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_instance_dir host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_instance_dir($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_keyboard_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_keyboard_server_port(int keyboard_server_por/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_kgdb host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_kgdb(bool kgdb) { (*dictionary_)[kKgdb] = kgdb; }$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_memory_mb host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_memory_mb(int memory_mb) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_metrics_binary host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_metrics_binary(const std::string& metrics_binary) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_mobile_bridge_name host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_mobile_bridge_name($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_mobile_tap_name host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_mobile_tap_name($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_modem_simulator_host_id host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_modem_simulator_host_id($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_modem_simulator_instance_number host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_modem_simulator_instance_number($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_modem_simulator_ports host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_modem_simulator_ports($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_modem_simulator_sim_type host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_modem_simulator_sim_type(int sim_type) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_modem_technoloy host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InstanceSpecific::set_modem_technoloy(int technoloy) {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:void
+set_network_selection_mode host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InstanceSpecific::set_network_selection_mode(int mode) {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:void
+set_operator_numeric host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InstanceSpecific::set_operator_numeric(std::string& operator_numeric) {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:void
+set_preferred_network_mode host/commands/modem_simulator/nvram_config.cpp /^void NvramConfig::InstanceSpecific::set_preferred_network_mode(int mode) {$/;" f class:cuttlefish::NvramConfig::InstanceSpecific typeref:typename:void
+set_protected_vm host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_protected_vm(bool protected_vm) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_qemu_binary_dir host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_qemu_binary_dir(const std::string& qemu_binary_dir) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_qemu_vnc_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_qemu_vnc_server_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_record_screen host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_record_screen(bool record_screen) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_restart_subprocesses host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_restart_subprocesses(bool restart_subprocesses) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_ril_dns host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_ril_dns(const std::string& ril_dns) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_rootcanal_config_file host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_rootcanal_config_file($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_rootcanal_default_commands_file host/libs/config/cuttlefish_config_instance.cpp /^ set_rootcanal_default_commands_file($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_rootcanal_hci_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_rootcanal_hci_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_rootcanal_link_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_rootcanal_link_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_rootcanal_test_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_rootcanal_test_port($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_run_as_daemon host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_run_as_daemon(bool run_as_daemon) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_seccomp_policy_dir host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_seccomp_policy_dir($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_secure_hals host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_secure_hals(const std::set<std::string>& hals) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_serial_number host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_serial_number($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_session_id host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_session_id($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_setupwizard_mode host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_setupwizard_mode(const std::string& mode) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_sig_server_address host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_sig_server_address(const std::string& addr) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_sig_server_headers_path host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_sig_server_headers_path(const std::string& path) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_sig_server_path host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_sig_server_path(const std::string& path) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_sig_server_port host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_sig_server_port(int port) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_sig_server_secure host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_sig_server_secure(bool secure) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_sig_server_strict host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_sig_server_strict(bool strict) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_smt host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_smt(bool smt) { (*dictionary_)[kSmt] = smt; }$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_start_ap host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_start_ap(bool start) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_start_webrtc_signaling_server host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_start_webrtc_signaling_server(bool start) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_start_wmediumd host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_start_wmediumd(bool start) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_target_arch host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_target_arch(Arch target_arch) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_tombstone_receiver_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_tombstone_receiver_port(int tombstone_receiv/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_touch_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_touch_server_port(int touch_server_port) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_tpm_device host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_tpm_device(const std::string& tpm_device) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_use_allocd host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_use_allocd($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_userdata_format host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_userdata_format(const std::string& userdata_format) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_uuid host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_uuid(const std::string& uuid) {$/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_vehicle_hal_server_port host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_vehicle_hal_server_port(int vehicle_hal_serv/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_vhost_net host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_vhost_net(bool vhost_net) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_vhost_user_mac80211_hwsim host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_vhost_user_mac80211_hwsim(const std::string& path) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_virtual_disk_paths host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_virtual_disk_paths($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_vm_manager host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_vm_manager(const std::string& name) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_vsock_guest_cid host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_vsock_guest_cid($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_webrtc_assets_dir host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_webrtc_assets_dir($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_webrtc_certs_dir host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_webrtc_certs_dir(const std::string& certs_dir) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_webrtc_device_id host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_webrtc_device_id($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_webrtc_enable_adb_websocket host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_webrtc_enable_adb_websocket(bool enable) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_webrtc_tcp_port_range host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_webrtc_tcp_port_range($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_webrtc_udp_port_range host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_webrtc_udp_port_range($/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_wifi_mac_prefix host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_wifi_mac_prefix($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_wifi_tap_name host/libs/config/cuttlefish_config_instance.cpp /^void CuttlefishConfig::MutableInstanceSpecific::set_wifi_tap_name($/;" f class:cuttlefish::CuttlefishConfig::MutableInstanceSpecific typeref:typename:void
+set_wmediumd_api_server_socket host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_wmediumd_api_server_socket(const std::string& path) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+set_wmediumd_config host/libs/config/cuttlefish_config.cpp /^void CuttlefishConfig::set_wmediumd_config(const std::string& config) {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:void
+setter_ common/libs/utils/flag_parser.h /^ std::optional<std::function<bool(const FlagMatch&)>> setter_;$/;" m class:cuttlefish::Flag typeref:typename:std::optional<std::function<bool (const FlagMatch &)>>
+settings guest/hals/camera/vsock_camera_device_session_3_4.h /^ common::V1_0::helper::CameraMetadata settings;$/;" m struct:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::ReadVsockRequest typeref:typename:common::V1_0::helper::CameraMetadata
+settings_ guest/hals/camera/vsock_camera_provider_2_7.h /^ VsockCameraDevice::Settings settings_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider typeref:typename:VsockCameraDevice::Settings
+settings_ guest/hals/camera/vsock_camera_server.h /^ VsockCameraDevice::Settings settings_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:VsockCameraDevice::Settings
+settings_buffer_ host/frontend/webrtc/lib/camera_streamer.h /^ std::string settings_buffer_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::string
+settings_mutex_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::mutex settings_mutex_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::mutex
+settings_mutex_ guest/hals/camera/vsock_camera_server.h /^ std::mutex settings_mutex_;$/;" m class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:std::mutex
+settings_mutex_ host/frontend/webrtc/lib/camera_streamer.h /^ std::mutex settings_mutex_;$/;" m class:cuttlefish::webrtc_streaming::CameraStreamer typeref:typename:std::mutex
+setupDataCall guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setupDataCall(int32_t serial, RadioTechnology radioTechnology,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setupDataCallResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::setupDataCallResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+setupDataCall_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setupDataCall_1_2(int32_t serial, V1_2::AccessNetwork accessNetwork,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setupDataCall_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setupDataCall_1_4(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setupDataCall_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setupDataCall_1_5(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setupDataCall_1_6 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::setupDataCall_1_6(int32_t serial ,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+setupwizard_mode host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::setupwizard_mode() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+severity common/libs/utils/tee_logging.h /^ android::base::LogSeverity severity;$/;" m struct:cuttlefish::SeverityTarget typeref:typename:android::base::LogSeverity
+shared_fd_ common/libs/fs/shared_fd_stream.h /^ SharedFD shared_fd_;$/;" m class:cuttlefish::SharedFDStreambuf typeref:typename:SharedFD
+sharedsecret guest/hals/keymint/remote/remote_shared_secret.cpp /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl::android::hardware::security file:
+sharedsecret guest/hals/keymint/remote/remote_shared_secret.h /^namespace aidl::android::hardware::security::sharedsecret {$/;" n namespace:aidl::android::hardware::security
+shell tools/create_base_image.go /^func shell(cmd string) (string, error) {$/;" f package:main typeref:typename:(string, error)
+shell_command host/example_custom_actions/custom_action_config.json /^ "shell_command":"am start -a android.intent.action.VIEW -d https:\/\/www.android.com\/",$/;" s object:0
+shell_command host/frontend/webrtc/lib/streamer.cpp /^ std::optional<std::string> shell_command;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::ControlPanelButtonDescriptor typeref:typename:std::optional<std::string> file:
+shell_command host/libs/config/custom_actions.h /^ std::optional<std::string> shell_command;$/;" m struct:cuttlefish::CustomActionConfig typeref:typename:std::optional<std::string>
+shield_color_ host/libs/confui/host_renderer.h /^ teeui::Color shield_color_;$/;" m class:cuttlefish::confui::ConfUiRenderer typeref:typename:teeui::Color
+shm_len guest/hals/confirmationui/include/TrustyIpc.h /^ uint32_t shm_len;$/;" m struct:confirmationui_init_req typeref:typename:uint32_t
+short_name host/commands/modem_simulator/network_service.h /^ std::string short_name;$/;" m struct:cuttlefish::NetworkService::NetworkOperator typeref:typename:std::string
+showAdbConnected host/frontend/webrtc_operator/assets/js/app.js /^ #showAdbConnected() {$/;" m class:DeviceControlApp
+showAdbError host/frontend/webrtc_operator/assets/js/app.js /^ #showAdbError() {$/;" m class:DeviceControlApp
+showDeviceUI host/frontend/webrtc_operator/assets/js/app.js /^ #showDeviceUI() {$/;" m class:DeviceControlApp
+showError host/frontend/webrtc_operator/assets/js/app.js /^function showError(msg) {$/;" f
+showHideModal host/frontend/webrtc_operator/assets/js/controls.js /^ function showHideModal(show) {$/;" f function:createModalButton
+showWarning host/frontend/webrtc_operator/assets/js/app.js /^function showWarning(msg) {$/;" f
+showWebrtcError host/frontend/webrtc_operator/assets/js/app.js /^ #showWebrtcError() {$/;" m class:DeviceControlApp
+shutdown_ host/frontend/webrtc/adb_handler.h /^ SharedFD shutdown_;$/;" m struct:cuttlefish::webrtc_streaming::AdbHandler typeref:typename:SharedFD
+shutdown_ host/frontend/webrtc/bluetooth_handler.h /^ SharedFD shutdown_;$/;" m struct:cuttlefish::webrtc_streaming::BluetoothHandler typeref:typename:SharedFD
+shutdown_socket_ host/libs/allocd/resource_manager.h /^ cuttlefish::SharedFD shutdown_socket_;$/;" m struct:cuttlefish::ResourceManager typeref:typename:cuttlefish::SharedFD
+si guest/hals/ril/reference-libril/ril.h /^ char si;$/;" m struct:__anon0bfbaecf8308 typeref:typename:char
+sig_server_address host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::sig_server_address() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+sig_server_headers_path host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::sig_server_headers_path() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+sig_server_path host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::sig_server_path() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+sig_server_port host/libs/config/cuttlefish_config.cpp /^int CuttlefishConfig::sig_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:int
+sig_server_secure host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::sig_server_secure() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+sig_server_strict host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::sig_server_strict() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+sign host/libs/confui/sign.cc /^std::optional<std::vector<std::uint8_t>> sign($/;" f namespace:cuttlefish::confui typeref:typename:std::optional<std::vector<std::uint8_t>>
+sign_ common/libs/confui/protocol_types.h /^ std::vector<std::uint8_t> sign_; \/\/ signed format$/;" m class:cuttlefish::confui::ConfUiCliResponseMessage typeref:typename:std::vector<std::uint8_t>
+signal guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalInfoRecord signal;$/;" m union:__anon0bfbaecf8908::__anon0bfbaecf8a0a typeref:typename:RIL_CDMA_SignalInfoRecord
+signal guest/hals/ril/reference-libril/ril.h /^ char signal; \/* as defined 3.7.5.5-3, 3.7.5.5-4 or 3.7.5.5-5 *\/$/;" m struct:__anon0bfbaecf1008 typeref:typename:char
+signalInfoRecord guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalInfoRecord signalInfoRecord;$/;" m struct:__anon0bfbaecf4208 typeref:typename:RIL_CDMA_SignalInfoRecord
+signalInfoRecord guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalInfoRecord signalInfoRecord;$/;" m struct:__anon0bfbaecf4308 typeref:typename:RIL_CDMA_SignalInfoRecord
+signalMeasurement guest/hals/ril/reference-libril/ril.h /^ SignalMeasurementType signalMeasurement;$/;" m struct:__anon0bfbaecf5608 typeref:typename:SignalMeasurementType
+signalNoiseRatio guest/hals/ril/reference-libril/ril.h /^ int signalNoiseRatio; \/* Valid values are 0-8. 8 is the highest signal to noise ratio. *\/$/;" m struct:__anon0bfbaecf4a08 typeref:typename:int
+signalStrength guest/hals/ril/reference-libril/ril.h /^ int signalStrength; \/* Valid values are (0-31, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4608 typeref:typename:int
+signalStrength guest/hals/ril/reference-libril/ril.h /^ int signalStrength; \/* Valid values are (0-31, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4708 typeref:typename:int
+signalStrength guest/hals/ril/reference-libril/ril.h /^ int signalStrength; \/* Valid values are (0-31, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4808 typeref:typename:int
+signalStrength guest/hals/ril/reference-libril/ril.h /^ int signalStrength; \/* Valid values are (0-31, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4b08 typeref:typename:int
+signalStrength guest/hals/ril/reference-libril/ril.h /^ int signalStrength; \/* Valid values are (0-31, 99) as defined in TS 27.007 8.5 *\/$/;" m struct:__anon0bfbaecf4c08 typeref:typename:int
+signalStrength guest/hals/ril/reference-libril/ril.h /^ RIL_NR_SignalStrength signalStrength;$/;" m struct:__anon0bfbaecf6a08 typeref:typename:RIL_NR_SignalStrength
+signalStrengthCdma guest/hals/ril/reference-libril/ril.h /^ RIL_CDMA_SignalStrength signalStrengthCdma;$/;" m struct:__anon0bfbaecf6608 typeref:typename:RIL_CDMA_SignalStrength
+signalStrengthEvdo guest/hals/ril/reference-libril/ril.h /^ RIL_EVDO_SignalStrength signalStrengthEvdo;$/;" m struct:__anon0bfbaecf6608 typeref:typename:RIL_EVDO_SignalStrength
+signalStrengthGsm guest/hals/ril/reference-libril/ril.h /^ RIL_GSM_SignalStrength_v12 signalStrengthGsm;$/;" m struct:__anon0bfbaecf6308 typeref:typename:RIL_GSM_SignalStrength_v12
+signalStrengthGsm guest/hals/ril/reference-libril/ril.h /^ RIL_GW_SignalStrength signalStrengthGsm;$/;" m struct:__anon0bfbaecf6208 typeref:typename:RIL_GW_SignalStrength
+signalStrengthLte guest/hals/ril/reference-libril/ril.h /^ RIL_LTE_SignalStrength_v8 signalStrengthLte;$/;" m struct:__anon0bfbaecf6708 typeref:typename:RIL_LTE_SignalStrength_v8
+signalStrengthLte guest/hals/ril/reference-libril/ril.h /^ RIL_LTE_SignalStrength_v8 signalStrengthLte;$/;" m struct:__anon0bfbaecf6808 typeref:typename:RIL_LTE_SignalStrength_v8
+signalStrengthTdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_TD_SCDMA_SignalStrength signalStrengthTdscdma;$/;" m struct:__anon0bfbaecf6908 typeref:typename:RIL_TD_SCDMA_SignalStrength
+signalStrengthWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_SignalStrengthWcdma signalStrengthWcdma;$/;" m struct:__anon0bfbaecf6408 typeref:typename:RIL_SignalStrengthWcdma
+signalStrengthWcdma guest/hals/ril/reference-libril/ril.h /^ RIL_SignalStrengthWcdma signalStrengthWcdma;$/;" m struct:__anon0bfbaecf6508 typeref:typename:RIL_SignalStrengthWcdma
+signalType guest/hals/ril/reference-libril/ril.h /^ char signalType; \/* as defined 3.7.5.5-1 *\/$/;" m struct:__anon0bfbaecf1008 typeref:typename:char
+signal_strength_ host/commands/modem_simulator/network_service.h /^ SignalStrength signal_strength_;$/;" m class:cuttlefish::NetworkService typeref:typename:SignalStrength
+signal_thread_ host/frontend/webrtc/lib/streamer.cpp /^ std::unique_ptr<rtc::Thread> signal_thread_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::unique_ptr<rtc::Thread> file:
+signature host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t signature[8];$/;" m struct:cuttlefish::__anon02806fd80111::GptHeader typeref:typename:std::uint8_t[8] file:
+signed_confirmation_ host/libs/confui/session.h /^ std::vector<std::uint8_t> signed_confirmation_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::vector<std::uint8_t>
+signing_key_fn_ host/commands/secure_env/hmac_serializable.h /^ std::function<TpmObjectSlot(TpmResourceManager&)> signing_key_fn_;$/;" m class:cuttlefish::HmacSerializable typeref:typename:std::function<TpmObjectSlot (TpmResourceManager &)>
+sim guest/hals/ril/reference-libril/ril.h /^ RIL_HardwareConfig_Sim sim;$/;" m union:__anon0bfbaecf9308::__anon0bfbaecf940a typeref:typename:RIL_HardwareConfig_Sim
+simRefreshInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::simRefreshInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+simResponse guest/hals/ril/reference-libril/ril.h /^ char *simResponse; \/* In hex string format ([a-fA-F0-9]*), except for SIM_AUTHENTICATION$/;" m struct:__anon0bfbaecf2008 typeref:typename:char *
+simSlotsStatusChanged guest/hals/ril/reference-libril/ril_config.cpp /^int radio_1_6::simSlotsStatusChanged(int slotId, int indicationType, int token, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+simSmsStorageFullInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::simSmsStorageFullInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+simStatusChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::simStatusChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+sim_file_system_ host/commands/modem_simulator/sim_service.h /^ SimFileSystem sim_file_system_;$/;" m class:cuttlefish::SimService typeref:typename:SimFileSystem
+sim_service_ host/commands/modem_simulator/call_service.h /^ SimService* sim_service_;$/;" m class:cuttlefish::CallService typeref:typename:SimService *
+sim_service_ host/commands/modem_simulator/modem_simulator.h /^ SimService* sim_service_{nullptr};$/;" m class:cuttlefish::ModemSimulator typeref:typename:SimService *
+sim_service_ host/commands/modem_simulator/network_service.h /^ SimService* sim_service_ = nullptr;$/;" m class:cuttlefish::NetworkService typeref:typename:SimService *
+sim_service_ host/commands/modem_simulator/sms_service.h /^ SimService* sim_service_;$/;" m class:cuttlefish::SmsService typeref:typename:SimService *
+sim_service_ host/commands/modem_simulator/stk_service.h /^ SimService* sim_service_;$/;" m class:cuttlefish::StkService typeref:typename:SimService *
+sim_status_ host/commands/modem_simulator/sim_service.h /^ SimStatus sim_status_;$/;" m class:cuttlefish::SimService typeref:typename:SimStatus
+sim_type host/commands/modem_simulator/nvram_config.cpp /^int NvramConfig::sim_type() const {$/;" f class:cuttlefish::NvramConfig typeref:typename:int
+sim_type_ host/commands/modem_simulator/nvram_config.h /^ int sim_type_;$/;" m class:cuttlefish::NvramConfig typeref:typename:int
+simple_match tools/tombstone_to_line.py /^def simple_match(line, info, indent, out_file):$/;" f
+single_element_emplace host/commands/run_cvd/launch.cc /^std::vector<T> single_element_emplace(T&& element) {$/;" f namespace:cuttlefish::__anonf13e85620111 typeref:typename:std::vector<T>
+sink_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::VideoSinkInterface<webrtc::VideoFrame> *sink_ = nullptr;$/;" m class:cuttlefish::webrtc_streaming::ClientVideoTrackImpl typeref:typename:rtc::VideoSinkInterface<webrtc::VideoFrame> * file:
+sinks_ host/frontend/webrtc/lib/audio_track_source_impl.h /^ std::set<webrtc::AudioTrackSinkInterface*> sinks_;$/;" m class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:std::set<webrtc::AudioTrackSinkInterface * >
+sinks_mutex_ host/frontend/webrtc/lib/audio_track_source_impl.h /^ std::mutex sinks_mutex_;$/;" m class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:std::mutex
+size host/commands/fetcher/build_api.h /^ size_t size;$/;" m class:cuttlefish::Artifact typeref:typename:size_t
+size host/frontend/webrtc/connection_observer.cpp /^ std::size_t size() const override { return buffer_.size() * sizeof(T); }$/;" f struct:cuttlefish::InputEventBufferImpl typeref:typename:std::size_t file:
+size host/frontend/webrtc/lib/ws_connection.cpp /^ size_t size() const { return buffer_.size() - LWS_PRE; }$/;" f struct:WsConnectionImpl::WsBuffer typeref:typename:size_t file:
+size host/libs/audio_connector/shm_layout.h /^ Le32 size; \/\/ unused$/;" m struct:cuttlefish::virtio_snd_query_info typeref:typename:Le32
+size host/libs/confui/sign_utils.h /^ size_t size() const { return size_; }$/;" f class:cuttlefish::confui::support::ByteBufferProxy typeref:typename:size_t
+size host/libs/image_aggregator/image_aggregator.cc /^ Be64 size;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be64 file:
+size host/libs/image_aggregator/image_aggregator.cc /^ std::uint64_t size;$/;" m struct:cuttlefish::__anon02806fd80111::PartitionInfo typeref:typename:std::uint64_t file:
+size_ host/libs/confui/sign_utils.h /^ size_t size_;$/;" m class:cuttlefish::confui::support::ByteBufferProxy typeref:typename:size_t
+skipNextComma guest/hals/ril/reference-ril/at_tok.c /^void skipNextComma(char **p_cur)$/;" f typeref:typename:void
+skipWhiteSpace guest/hals/ril/reference-ril/at_tok.c /^static void skipWhiteSpace(char **p_cur)$/;" f typeref:typename:void file:
+sleepMsec guest/hals/ril/reference-ril/atchannel.c /^static void sleepMsec(long long msec)$/;" f typeref:typename:void file:
+sleep_mode_time_ms guest/hals/ril/reference-libril/ril.h /^ uint32_t sleep_mode_time_ms;$/;" m struct:__anon0bfbaecf9f08 typeref:typename:uint32_t
+slot host/frontend/webrtc/connection_observer.cpp /^ int32_t slot;$/;" m struct:cuttlefish::multitouch_slot typeref:typename:int32_t file:
+slotId guest/hals/ril/reference-libril/sap_service.cpp /^ int32_t slotId;$/;" m struct:SapImpl typeref:typename:int32_t file:
+slotState guest/hals/ril/reference-libril/ril.h /^ RIL_SlotState slotState;$/;" m struct:__anon0bfbaecfb908 typeref:typename:RIL_SlotState
+sms_service_ host/commands/modem_simulator/modem_simulator.h /^ SmsService* sms_service_{nullptr};$/;" m class:cuttlefish::ModemSimulator typeref:typename:SmsService *
+sms_service_center_address_ host/commands/modem_simulator/sms_service.h /^ SmsServiceCenterAddress sms_service_center_address_;$/;" m class:cuttlefish::SmsService typeref:typename:SmsServiceCenterAddress
+sms_status_on_sim_ host/commands/modem_simulator/sms_service.h /^ SmsMessage::SmsStatus sms_status_on_sim_;$/;" m class:cuttlefish::SmsService typeref:typename:SmsMessage::SmsStatus
+smsc guest/hals/ril/reference-libril/ril.h /^ char * smsc; \/* SMSC address in GSM BCD format prefixed by a length byte$/;" m struct:__anon0bfbaecf1b08 typeref:typename:char *
+smt host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::smt() const { return (*dictionary_)[kSmt].asBool(); }$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+snapshots_offset host/libs/image_aggregator/image_aggregator.cc /^ Be64 snapshots_offset;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be64 file:
+snr_ host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ uint8_t snr_;$/;" m class:cuttlefish::WmediumdMessageSetSnr typeref:typename:uint8_t
+sockaddr_vm common/libs/fs/vm_sockets.h /^struct sockaddr_vm {$/;" s
+socket guest/hals/ril/reference-libril/RilSapSocket.h /^ RilSapSocket* socket;$/;" m struct:RilSapSocket::RilSapSocketList typeref:typename:RilSapSocket *
+socketErrorIsRecoverable common/frontend/socket_vsock_proxy/main.cpp /^bool socketErrorIsRecoverable(int error) {$/;" f namespace:__anon913036200111 typeref:typename:bool
+socketId guest/hals/ril/reference-libril/RilSapSocket.h /^ RIL_SOCKET_ID socketId;$/;" m struct:RilSapSocket::SapSocketRequest typeref:typename:RIL_SOCKET_ID
+socket_ common/frontend/socket_vsock_proxy/main.cpp /^ cuttlefish::SharedFD socket_;$/;" m class:__anon913036200111::SocketReceiver typeref:typename:cuttlefish::SharedFD file:
+socket_ common/frontend/socket_vsock_proxy/main.cpp /^ cuttlefish::SharedFD socket_;$/;" m class:__anon913036200111::SocketSender typeref:typename:cuttlefish::SharedFD file:
+socket_ common/libs/utils/unix_sockets.h /^ SharedFD socket_;$/;" m class:cuttlefish::UnixMessageSocket typeref:typename:SharedFD
+socket_ host/commands/run_cvd/launch.cc /^ SharedFD socket_;$/;" m class:cuttlefish::ConfigServer typeref:typename:SharedFD file:
+socket_ host/commands/run_cvd/launch.cc /^ SharedFD socket_;$/;" m class:cuttlefish::TombstoneReceiver typeref:typename:SharedFD file:
+socket_flag_cv_ host/libs/confui/host_server.h /^ std::condition_variable socket_flag_cv_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:std::condition_variable
+socket_flag_mtx_ host/libs/confui/host_server.h /^ std::mutex socket_flag_mtx_;$/;" m class:cuttlefish::confui::HostServer typeref:typename:std::mutex
+socket_id guest/hals/ril/reference-libril/ril_ex.h /^ RIL_SOCKET_ID socket_id;$/;" m struct:SocketListenParam typeref:typename:RIL_SOCKET_ID
+socket_id guest/hals/ril/reference-libril/ril_internal.h /^ RIL_SOCKET_ID socket_id;$/;" m struct:android::RequestInfo typeref:typename:RIL_SOCKET_ID
+sockets_ host/commands/run_cvd/launch_modem.cpp /^ std::vector<SharedFD> sockets_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:std::vector<SharedFD> file:
+sockets_ host/commands/run_cvd/launch_streamer.cpp /^ StreamerSockets& sockets_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:StreamerSockets & file:
+source host/frontend/webrtc/lib/streamer.cpp /^ rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::DisplayDescriptor typeref:typename:rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> file:
+source host/frontend/webrtc/lib/video_track_source_impl.cpp /^rtc::VideoSourceInterface<webrtc::VideoFrame> *VideoTrackSourceImpl::source() {$/;" f class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:rtc::VideoSourceInterface<webrtc::VideoFrame> *
+source host/libs/config/fetcher_config.h /^ FileSource source;$/;" m struct:cuttlefish::CvdFile typeref:typename:FileSource
+source host/libs/image_aggregator/image_aggregator.cc /^ MultipleImagePartition source;$/;" m struct:cuttlefish::__anon02806fd80111::PartitionInfo typeref:typename:MultipleImagePartition file:
+sourceAddress guest/hals/ril/reference-libril/ril.h /^ char sourceAddress[MAX_INADDR_LEN]; \/* Source address in network-byte order *\/$/;" m struct:__anon0bfbaecfc508 typeref:typename:char[]
+sourcePort guest/hals/ril/reference-libril/ril.h /^ int sourcePort; \/* Source port if applicable, or 0x7FFFFFFF;$/;" m struct:__anon0bfbaecfc508 typeref:typename:int
+source_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::shared_ptr<webrtc::VideoTrackSourceInterface> source_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::shared_ptr<webrtc::VideoTrackSourceInterface> file:
+source_extension host/commands/metrics/proto/clientanalytics.proto /^ optional bytes source_extension = 6;$/;" f message:LogEvent typeref:typename:bytes
+source_image_family tools/create_base_image.go /^var source_image_family string$/;" v package:main typeref:typename:string
+source_image_project tools/create_base_image.go /^var source_image_project string$/;" v package:main typeref:typename:string
+source_match tools/tombstone_to_line.py /^def source_match(line, info, indent, out_file):$/;" f
+sources guest/hals/ril/reference-libril/ril.h /^ RIL_EmergencyNumberSource sources; \/* The bitfield of @1.4::EmergencyNumberSource(s).$/;" m struct:__anon0bfbaecfb708 typeref:typename:RIL_EmergencyNumberSource
+sp_response guest/hals/ril/reference-ril/atchannel.c /^static ATResponse *sp_response = NULL;$/;" v typeref:typename:ATResponse * file:
+sparse_size common/libs/utils/files.h /^ off_t sparse_size;$/;" m struct:cuttlefish::FileSizes typeref:typename:off_t
+specifiers guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessSpecifier specifiers[MAX_RADIO_ACCESS_NETWORKS]; \/\/ Radio access networks$/;" m struct:__anon0bfbaecfad08 typeref:typename:RIL_RadioAccessSpecifier[]
+specifiers guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessSpecifier_v1_5 specifiers[RIL_RADIO_ACCESS_SPECIFIER_MAX_SIZE]; \/\/ Radi/;" m struct:__anon0bfbaecfb108 typeref:typename:RIL_RadioAccessSpecifier_v1_5[]
+specifiers guest/hals/ril/reference-libril/ril.h /^ RIL_RadioAccessSpecifier_v1_5 specifiers[RIL_RADIO_ACCESS_SPECIFIER_MAX_SIZE];$/;" m struct:__anon0bfbaecfb008 typeref:typename:RIL_RadioAccessSpecifier_v1_5[]
+specifiers_length guest/hals/ril/reference-libril/ril.h /^ uint32_t specifiers_length; \/\/ Length of specifiers$/;" m struct:__anon0bfbaecfb108 typeref:typename:uint32_t
+specifiers_length guest/hals/ril/reference-libril/ril.h /^ uint32_t specifiers_length; \/\/ Length of specifiers$/;" m struct:__anon0bfbaecfad08 typeref:typename:uint32_t
+specifiers_length guest/hals/ril/reference-libril/ril.h /^ uint32_t specifiers_length; \/\/ Length of specifiers$/;" m struct:__anon0bfbaecfb008 typeref:typename:uint32_t
+specifyChannels guest/hals/ril/reference-libril/ril.h /^ int specifyChannels;$/;" m struct:__anon0bfbaecfb108 typeref:typename:int
+split guest/hals/ril/reference-libril/ril_service.cpp /^hidl_vec<hidl_string> split(hidl_string str) {$/;" f typeref:typename:hidl_vec<hidl_string>
+srvccStateNotifyInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::srvccStateNotifyInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+ssInfo guest/hals/ril/reference-libril/ril.h /^ int ssInfo[SS_INFO_MAX]; \/* This is the response data for most of the SS GET\/SET$/;" m union:__anon0bfbaecf9908::__anon0bfbaecf9a0a typeref:typename:int[]
+ssRsrp guest/hals/ril/reference-libril/ril.h /^ int32_t ssRsrp; \/* SS reference signal received power, multiplied by -1.$/;" m struct:__anon0bfbaecf4e08 typeref:typename:int32_t
+ssRsrq guest/hals/ril/reference-libril/ril.h /^ int32_t ssRsrq; \/* SS reference signal received quality, multiplied by -1.$/;" m struct:__anon0bfbaecf4e08 typeref:typename:int32_t
+ssSinr guest/hals/ril/reference-libril/ril.h /^ int32_t ssSinr; \/* SS signal-to-noise and interference ratio.$/;" m struct:__anon0bfbaecf4e08 typeref:typename:int32_t
+stage host/commands/kernel_log_monitor/kernel_log_server.cc /^ std::string_view stage; \/\/ substring in the log identifying the stage$/;" m struct:__anonfa7764770111::__anonfa7764770308 typeref:typename:std::string_view file:
+start guest/hals/camera/vsock_camera_server.cpp /^void VsockCameraServer::start(unsigned int port, unsigned int cid) {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:void
+start guest/hals/camera/vsock_frame_provider.cpp /^void VsockFrameProvider::start($/;" f class:cuttlefish::VsockFrameProvider typeref:typename:void
+start host/frontend/webrtc_operator/assets/js/app.js /^ start() {$/;" m class:DeviceControlApp
+start host/frontend/webrtc_operator/assets/js/index.js /^ start() {$/;" m class:DeviceListApp
+startDtmf guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startDtmf(int32_t serial, const hidl_string& s) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startDtmfResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::startDtmfResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+startHandover guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startHandover(int32_t serial, int32_t callId) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startHandoverResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::startHandoverResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+startKeepalive guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepali/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startKeepaliveResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+startLceService guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startLceService(int32_t serial, int32_t reportInterval, bool pullMod/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startLceServiceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::startLceServiceResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+startMouseTracking host/frontend/webrtc_operator/assets/js/app.js /^ #startMouseTracking() {$/;" m class:DeviceControlApp
+startNetworkScan guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& req/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startNetworkScanResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+startNetworkScan_1_2 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startNetworkScan_1_2(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startNetworkScan_1_4 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startNetworkScan_1_4(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startNetworkScan_1_5 guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::startNetworkScan_1_5(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+startPolling host/frontend/webrtc_operator/assets/js/server_connector.js /^ #startPolling() {$/;" m class:PollingConnector
+startRequest guest/hals/ril/reference-libril/ril_internal.h /^ #define startRequest /;" d
+startResponse guest/hals/ril/reference-libril/ril_internal.h /^ #define startResponse /;" d
+startSensorInjection guest/commands/sensor_injection/main.cpp /^sp<ISensors> startSensorInjection() {$/;" f typeref:typename:sp<ISensors>
+start_ap host/libs/config/cuttlefish_config_instance.cpp /^bool CuttlefishConfig::InstanceSpecific::start_ap() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:bool
+start_id host/libs/audio_connector/commands.h /^ uint32_t start_id() const { return start_id_; }$/;" f class:cuttlefish::InfoCommand typeref:typename:uint32_t
+start_id host/libs/audio_connector/shm_layout.h /^ Le32 start_id;$/;" m struct:cuttlefish::virtio_snd_query_info typeref:typename:Le32
+start_id_ host/libs/audio_connector/commands.h /^ const uint32_t start_id_;$/;" m class:cuttlefish::InfoCommand typeref:typename:const uint32_t
+start_time_ host/libs/confui/session.h /^ std::unique_ptr<TimePoint> start_time_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::unique_ptr<TimePoint>
+start_webrtc_sig_server host/libs/config/cuttlefish_config_instance.cpp /^bool CuttlefishConfig::InstanceSpecific::start_webrtc_sig_server() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:bool
+start_wmediumd host/libs/config/cuttlefish_config_instance.cpp /^bool CuttlefishConfig::InstanceSpecific::start_wmediumd() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:bool
+started_ common/libs/utils/subprocess.h /^ bool started_ = false;$/;" m class:cuttlefish::Subprocess typeref:typename:bool
+state guest/hals/ril/reference-libril/ril.h /^ RIL_CallState state;$/;" m struct:__anon0bfbaecf1108 typeref:typename:RIL_CallState
+state guest/hals/ril/reference-libril/ril.h /^ RIL_HardwareConfig_State state;$/;" m struct:__anon0bfbaecf9308 typeref:typename:RIL_HardwareConfig_State
+state guest/hals/ril/reference-ril/reference-ril.c /^ enum PDPState state;$/;" m struct:PDPInfo typeref:enum:PDPState file:
+state host/commands/modem_simulator/data_service.h /^ CidState state;$/;" m struct:cuttlefish::DataService::PDPContext typeref:typename:CidState
+state host/frontend/webrtc/lib/audio_track_source_impl.cpp /^AudioTrackSourceImpl::SourceState AudioTrackSourceImpl::state() const {$/;" f class:cuttlefish::webrtc_streaming::AudioTrackSourceImpl typeref:typename:AudioTrackSourceImpl::SourceState
+state_ host/commands/run_cvd/boot_state_machine.cc /^ int state_;$/;" m class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine typeref:typename:int file:
+state_ host/frontend/webrtc/lib/client_handler.h /^ State state_ = State::kNew;$/;" m class:cuttlefish::webrtc_streaming::ClientHandler typeref:typename:State
+state_ host/libs/confui/session.h /^ std::atomic<MainLoopState> state_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::atomic<MainLoopState>
+state_ host/libs/wayland/wayland_surface.h /^ State state_;$/;" m class:wayland::Surface typeref:typename:State
+state_mutex_ host/libs/wayland/wayland_surface.h /^ std::mutex state_mutex_;$/;" m class:wayland::Surface typeref:typename:std::mutex
+static_mount_ host/libs/websocket/websocket_server.h /^ struct lws_http_mount static_mount_;$/;" m class:cuttlefish::WebSocketServer typeref:struct:lws_http_mount
+status guest/hals/ril/reference-libril/ril.h /^ RIL_ScanStatus status; \/\/ The status of the scan$/;" m struct:__anon0bfbaecfb308 typeref:typename:RIL_ScanStatus
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no erro/;" m struct:__anon0bfbaecf1308 typeref:typename:int
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no erro/;" m struct:__anon0bfbaecf1408 typeref:typename:int
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no erro/;" m struct:__anon0bfbaecf1508 typeref:typename:int
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no erro/;" m struct:__anon0bfbaecf1608 typeref:typename:int
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/*$/;" m struct:__anon0bfbaecf2108 typeref:typename:int
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/\/ Return status and an input parameter for RC_PHASE_FINISH$/;" m struct:__anon0bfbaecf0a08 typeref:typename:int
+status guest/hals/ril/reference-libril/ril.h /^ int status; \/* Status of message. See TS 27.005 3.1, "<stat>": *\/$/;" m struct:__anon0bfbaecf1b08 typeref:typename:int
+status host/commands/health/health.cpp /^int status() {$/;" f typeref:typename:int
+status host/commands/modem_simulator/sms_service.h /^ SmsStatus status;$/;" m struct:cuttlefish::SmsService::SmsMessage typeref:typename:SmsStatus
+status host/commands/modem_simulator/sup_service.h /^ CallForwardInfoStatus status;$/;" m struct:cuttlefish::SupService::CallForwardInfo typeref:typename:CallForwardInfoStatus
+status host/commands/modem_simulator/sup_service.h /^ ClirStatus status;$/;" m struct:cuttlefish::SupService::ClirStatusInfo typeref:typename:ClirStatus
+status host/libs/audio_connector/commands.h /^ AudioStatus status() const { return status_; }$/;" f class:cuttlefish::AudioCommand typeref:typename:AudioStatus
+status host/libs/audio_connector/shm_layout.h /^ Le32 status;$/;" m struct:cuttlefish::virtio_snd_pcm_status typeref:typename:Le32
+status host/libs/audio_connector/shm_layout.h /^ virtio_snd_pcm_status status;$/;" m struct:cuttlefish::IoStatusMsg typeref:typename:virtio_snd_pcm_status
+status host/libs/config/mbr.h /^ std::uint8_t status;$/;" m struct:MbrPartitionEntry typeref:typename:std::uint8_t
+status-div host/frontend/webrtc_operator/assets/client.html /^ <div id='status-div'>$/;" I
+status-message host/frontend/webrtc_operator/assets/client.html /^ <h3 id='status-message' class='connecting'>Connecting to device<\/h3>$/;" I
+status_ host/libs/audio_connector/commands.h /^ AudioStatus status_ = AudioStatus::NOT_SET;$/;" m class:cuttlefish::AudioCommand typeref:typename:AudioStatus
+status_message_ common/libs/confui/protocol_types.h /^ std::string status_message_;$/;" m class:cuttlefish::confui::ConfUiAckMessage typeref:typename:std::string
+status_sent_ host/libs/audio_connector/buffers.h /^ bool status_sent_ = false;$/;" m class:cuttlefish::ShmBuffer typeref:typename:bool
+stereo_playout_enabled_ host/frontend/webrtc/lib/audio_device.h /^ bool stereo_playout_enabled_ = true;$/;" m class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+stereo_recording_enabled_ host/frontend/webrtc/lib/audio_device.h /^ bool stereo_recording_enabled_ = true;$/;" m class:cuttlefish::webrtc_streaming::CfAudioDeviceModule typeref:typename:bool
+stkCallControlAlphaNotifyInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stkCallControlAlphaNotifyInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+stkCallSetupInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stkCallSetupInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+stkEventNotifyInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stkEventNotifyInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+stkProactiveCommandInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stkProactiveCommandInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+stkSessionEndInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stkSessionEndInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+stop guest/hals/camera/vsock_camera_server.cpp /^void VsockCameraServer::stop() {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer typeref:typename:void
+stop guest/hals/camera/vsock_frame_provider.cpp /^void VsockFrameProvider::stop() {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:void
+stop host/commands/run_cvd/process_monitor.cc /^ bool stop;$/;" m struct:cuttlefish::ParentToChildMessage typeref:typename:bool file:
+stopDtmf guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::stopDtmf(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+stopDtmfResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stopDtmfResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+stopKeepalive guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::stopKeepalive(int32_t serial, int32_t sessionHandle) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+stopKeepaliveResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+stopLceService guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::stopLceService(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+stopLceServiceResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stopLceServiceResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+stopNetworkScan guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::stopNetworkScan(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+stopNetworkScanResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,$/;" f class:radio_1_6 typeref:typename:int
+stop_cvd tools/upload_to_gce_and_run.py /^def stop_cvd(args):$/;" f
+stop_cvd tools/upload_via_ssh.py /^def stop_cvd(args):$/;" f
+stopped_ host/commands/modem_simulator/thread_looper.h /^ bool stopped_;$/;" m class:cuttlefish::ThreadLooper typeref:typename:bool
+stopper_ common/libs/utils/subprocess.h /^ SubprocessStopper stopper_;$/;" m class:cuttlefish::Subprocess typeref:typename:SubprocessStopper
+storage guest/hals/health/storage/Storage.cpp /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl::android::hardware::health file:
+storage guest/hals/health/storage/Storage.h /^namespace aidl::android::hardware::health::storage {$/;" n namespace:aidl::android::hardware::health
+strStartsWith guest/hals/ril/reference-ril/misc.c /^int strStartsWith(const char *line, const char *prefix)$/;" f typeref:typename:int
+streamId guest/hals/camera/cached_stream_buffer.h /^ int32_t streamId() const { return stream_id_; }$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:int32_t
+streamPromiseResolvers host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #streamPromiseResolvers;$/;" M class:DeviceConnection
+stream_cache_ guest/hals/camera/vsock_camera_device_session_3_4.h /^ std::map<int32_t, Stream> stream_cache_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:std::map<int32_t,Stream>
+stream_descs_ host/frontend/webrtc/audio_handler.h /^ std::vector<StreamDesc> stream_descs_ = {};$/;" m class:cuttlefish::AudioHandler typeref:typename:std::vector<StreamDesc>
+stream_id host/libs/audio_connector/buffers.cpp /^uint32_t ShmBuffer::stream_id() const { return header_.stream_id.as_uint32_t(); }$/;" f class:cuttlefish::ShmBuffer typeref:typename:uint32_t
+stream_id host/libs/audio_connector/commands.h /^ uint32_t stream_id() const { return stream_id_; }$/;" f struct:cuttlefish::StreamControlCommand typeref:typename:uint32_t
+stream_id host/libs/audio_connector/shm_layout.h /^ Le32 stream_id;$/;" m struct:cuttlefish::virtio_snd_pcm_hdr typeref:typename:Le32
+stream_id host/libs/audio_connector/shm_layout.h /^ Le32 stream_id;$/;" m struct:cuttlefish::virtio_snd_pcm_xfer typeref:typename:Le32
+stream_id_ guest/hals/camera/cached_stream_buffer.h /^ int32_t stream_id_;$/;" m class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:int32_t
+stream_id_ host/libs/audio_connector/commands.h /^ const uint32_t stream_id_;$/;" m struct:cuttlefish::StreamControlCommand typeref:typename:const uint32_t
+streamer_callback_mutex_ host/libs/screen_connector/screen_connector.h /^ std::mutex streamer_callback_mutex_; \/\/ mutex to set & read callback_from_streamer_$/;" m class:cuttlefish::ScreenConnector typeref:typename:std::mutex
+streamer_callback_set_cv_ host/libs/screen_connector/screen_connector.h /^ std::condition_variable streamer_callback_set_cv_;$/;" m class:cuttlefish::ScreenConnector typeref:typename:std::condition_variable
+streams host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ #streams;$/;" M class:DeviceConnection
+streams host/libs/audio_connector/shm_layout.h /^ uint32_t streams;$/;" m struct:cuttlefish::VioSConfig typeref:typename:uint32_t
+stun_servers_ host/frontend/webrtc_operator/server_config.h /^ std::vector<std::string> stun_servers_;$/;" m class:cuttlefish::ServerConfig typeref:typename:std::vector<std::string>
+subcompositor_destroy host/libs/wayland/wayland_subcompositor.cpp /^void subcompositor_destroy(wl_client*, wl_resource* subcompositor) {$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subcompositor_destroy_resource_callback host/libs/wayland/wayland_subcompositor.cpp /^void subcompositor_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subcompositor_get_subsurface host/libs/wayland/wayland_subcompositor.cpp /^void subcompositor_get_subsurface(wl_client* client,$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subcompositor_implementation host/libs/wayland/wayland_subcompositor.cpp /^const struct wl_subcompositor_interface subcompositor_implementation = {$/;" v namespace:wayland::__anonebd60ce30111 typeref:typename:const struct wl_subcompositor_interface
+subprocess_ host/commands/start/flag_forwarder.cc /^ std::string subprocess_;$/;" m class:SubprocessFlag typeref:typename:std::string file:
+subprocess_stopper_ common/libs/utils/subprocess.h /^ SubprocessStopper subprocess_stopper_;$/;" m class:cuttlefish::Command typeref:typename:SubprocessStopper
+subprocesses_ host/commands/start/flag_forwarder.h /^ std::set<std::string> subprocesses_;$/;" m class:FlagForwarder typeref:typename:std::set<std::string>
+subscribers_ host/commands/kernel_log_monitor/kernel_log_server.h /^ std::vector<EventCallback> subscribers_;$/;" m class:monitor::KernelLogServer typeref:typename:std::vector<EventCallback>
+subscribers_ host/frontend/webrtc/kernel_log_events_handler.h /^ std::map<int, std::function<void(const Json::Value&)>> subscribers_;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:std::map<int,std::function<void (const Json::Value &)>>
+subscribers_mtx_ host/frontend/webrtc/kernel_log_events_handler.h /^ std::mutex subscribers_mtx_;$/;" m struct:cuttlefish::KernelLogEventsHandler typeref:typename:std::mutex
+subscriptionStatusChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::subscriptionStatusChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+subscription_source guest/hals/ril/reference-ril/reference-ril.c /^ int subscription_source;$/;" m struct:__anon70d7df6f0108 typeref:typename:int file:
+subsurface_destroy host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_destroy(wl_client*, wl_resource* subsurface) {$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subsurface_destroy_resource_callback host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subsurface_implementation host/libs/wayland/wayland_subcompositor.cpp /^const struct wl_subsurface_interface subsurface_implementation = {$/;" v namespace:wayland::__anonebd60ce30111 typeref:typename:const struct wl_subsurface_interface
+subsurface_place_above host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_place_above(wl_client*,$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subsurface_place_below host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_place_below(wl_client*,$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subsurface_set_desync host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_set_desync(wl_client*, wl_resource* subsurface) {$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subsurface_set_position host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_set_position(wl_client*,$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+subsurface_set_sync host/libs/wayland/wayland_subcompositor.cpp /^void subsurface_set_sync(wl_client*, wl_resource* subsurface) {$/;" f namespace:wayland::__anonebd60ce30111 typeref:typename:void
+success guest/hals/ril/reference-ril/atchannel.h /^ int success; \/* true if final response indicates$/;" m struct:__anon512a2c1f0208 typeref:typename:int
+suggestedRetryTime guest/hals/ril/reference-libril/ril.h /^ int suggestedRetryTime; \/* If status != 0, this fields indicates the suggested /;" m struct:__anon0bfbaecf1308 typeref:typename:int
+suggestedRetryTime guest/hals/ril/reference-libril/ril.h /^ int suggestedRetryTime; \/* If status != 0, this fields indicates the suggested /;" m struct:__anon0bfbaecf1408 typeref:typename:int
+suggestedRetryTime guest/hals/ril/reference-libril/ril.h /^ int suggestedRetryTime; \/* If status != 0, this fields indicates the suggested /;" m struct:__anon0bfbaecf1508 typeref:typename:int
+suggestedRetryTime guest/hals/ril/reference-libril/ril.h /^ int suggestedRetryTime; \/* If status != 0, this fields indicates the suggested /;" m struct:__anon0bfbaecf1608 typeref:typename:int
+sul host/frontend/webrtc/lib/ws_connection.cpp /^ lws_sorted_usec_list_t sul = {};$/;" m struct:WsConnectionImpl::CreateConnectionSul typeref:typename:lws_sorted_usec_list_t file:
+suppSvcNotifyInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::suppSvcNotifyInd(int slotId, int indicationType,$/;" f class:radio_1_6 typeref:typename:int
+supplyIccPin2ForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+supplyIccPin2ForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::supplyIccPin2ForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+supplyIccPinForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::supplyIccPinForApp(int32_t serial, const hidl_string& pin,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+supplyIccPinForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::supplyIccPinForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+supplyIccPuk2ForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+supplyIccPuk2ForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::supplyIccPuk2ForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+supplyIccPukForApp guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::supplyIccPukForApp(int32_t serial, const hidl_string& puk,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+supplyIccPukForAppResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::supplyIccPukForAppResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+supplyNetworkDepersonalization guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::supplyNetworkDepersonalization(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+supplyNetworkDepersonalizationResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::supplyNetworkDepersonalizationResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+supplySimDepersonalization guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::supplySimDepersonalization(int32_t serial,$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+supplySimDepersonalizationResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::supplySimDepersonalizationResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+support host/libs/confui/sign_utils.h /^namespace support {$/;" n namespace:cuttlefish::confui
+supportedTechs guest/hals/ril/reference-ril/reference-ril.c /^ int supportedTechs; \/\/ Bitmask of supported Modem Technology bits$/;" m struct:__anon70d7df6f0108 typeref:typename:int file:
+supportedTypesBitmask guest/hals/ril/reference-libril/ril.h /^ int supportedTypesBitmask; \/* supported APN types bitmask. See RIL_ApnTypes for the value /;" m struct:__anon0bfbaecfc108 typeref:typename:int
+supportedTypesBitmask guest/hals/ril/reference-libril/ril.h /^ int supportedTypesBitmask;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+supported_algorithms_ host/commands/secure_env/tpm_keymaster_context.h /^ std::vector<keymaster_algorithm_t> supported_algorithms_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::vector<keymaster_algorithm_t>
+supports guest/hals/ril/reference-libril/ril.h /^ RIL_Supports supports;$/;" m struct:__anon0bfbaecfbf08 typeref:typename:RIL_Supports
+surface_attach host/libs/wayland/wayland_compositor.cpp /^void surface_attach(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_commit host/libs/wayland/wayland_compositor.cpp /^void surface_commit(wl_client*, wl_resource* surface_resource) {$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_damage host/libs/wayland/wayland_compositor.cpp /^void surface_damage(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_damage_buffer host/libs/wayland/wayland_compositor.cpp /^void surface_damage_buffer(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_destroy host/libs/wayland/wayland_compositor.cpp /^void surface_destroy(wl_client*, wl_resource* surface) {$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_destroy_resource_callback host/libs/wayland/wayland_compositor.cpp /^void surface_destroy_resource_callback(struct wl_resource* surface_resource) {$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_destroy_resource_callback host/libs/wayland/wayland_shell.cpp /^void surface_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+surface_frame host/libs/wayland/wayland_compositor.cpp /^void surface_frame(wl_client*, wl_resource* surface, uint32_t) {$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_implementation host/libs/wayland/wayland_compositor.cpp /^const struct wl_surface_interface surface_implementation = {$/;" v namespace:wayland::__anon473d11590111 typeref:typename:const struct wl_surface_interface
+surface_set_buffer_scale host/libs/wayland/wayland_compositor.cpp /^void surface_set_buffer_scale(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_set_buffer_transform host/libs/wayland/wayland_compositor.cpp /^void surface_set_buffer_transform(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_set_input_region host/libs/wayland/wayland_compositor.cpp /^void surface_set_input_region(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surface_set_opaque_region host/libs/wayland/wayland_compositor.cpp /^void surface_set_opaque_region(wl_client*,$/;" f namespace:wayland::__anon473d11590111 typeref:typename:void
+surfaces_ host/libs/wayland/wayland_server.cpp /^ Surfaces surfaces_;$/;" m struct:wayland::internal::WaylandServerState typeref:typename:Surfaces file:
+surfaces_ host/libs/wayland/wayland_surface.h /^ Surfaces& surfaces_;$/;" m class:wayland::Surface typeref:typename:Surfaces &
+svm_cid common/libs/fs/vm_sockets.h /^ unsigned int svm_cid;$/;" m struct:sockaddr_vm typeref:typename:unsigned int
+svm_family common/libs/fs/vm_sockets.h /^ __kernel_sa_family_t svm_family;$/;" m struct:sockaddr_vm typeref:typename:__kernel_sa_family_t
+svm_port common/libs/fs/vm_sockets.h /^ unsigned int svm_port;$/;" m struct:sockaddr_vm typeref:typename:unsigned int
+svm_reserved1 common/libs/fs/vm_sockets.h /^ unsigned short svm_reserved1;$/;" m struct:sockaddr_vm typeref:typename:unsigned short
+svm_zero common/libs/fs/vm_sockets.h /^ unsigned char svm_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - sizeof(unsigned short) /;" m struct:sockaddr_vm typeref:typename:unsigned char[]
+sw1 guest/hals/ril/reference-libril/ril.h /^ int sw1;$/;" m struct:__anon0bfbaecf2008 typeref:typename:int
+sw2 guest/hals/ril/reference-libril/ril.h /^ int sw2;$/;" m struct:__anon0bfbaecf2008 typeref:typename:int
+swap common/libs/fs/shared_select.h /^ void swap(SharedFDSet* rhs) {$/;" f class:cuttlefish::SharedFDSet typeref:typename:void
+switchWaitingOrHoldingAndActive guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::switchWaitingOrHoldingAndActive(int32_t serial) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+switchWaitingOrHoldingAndActiveResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+switches_client host/frontend/webrtc/connection_observer.h /^ SharedFD switches_client;$/;" m struct:cuttlefish::InputSockets typeref:typename:SharedFD
+switches_server host/frontend/webrtc/connection_observer.h /^ SharedFD switches_server;$/;" m struct:cuttlefish::InputSockets typeref:typename:SharedFD
+switches_server_ host/commands/run_cvd/launch_streamer.cpp /^ SharedFD switches_server_;$/;" m class:cuttlefish::__anon6b0274e10111::WebRtcServer typeref:typename:SharedFD file:
+switches_socket_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::switches_socket_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+systemId guest/hals/ril/reference-libril/ril.h /^ int systemId; \/* CDMA System Id 0..32767, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5c08 typeref:typename:int
+systemId guest/hals/ril/reference-libril/ril.h /^ int systemId; \/* CDMA System Id 0..32767, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7c08 typeref:typename:int
+systemIsInPrl guest/hals/ril/reference-libril/ril.h /^ int32_t systemIsInPrl; \/\/ indicates whether the current system is in the$/;" m struct:__anon0bfbaecf7f08 typeref:typename:int32_t
+system_image_dir_flag_ host/libs/config/config_flag.cpp /^ SystemImageDirFlag& system_image_dir_flag_;$/;" m class:cuttlefish::__anon2e549bd00111::ConfigFlagImpl typeref:typename:SystemImageDirFlag & file:
+tac guest/hals/ril/reference-libril/ril.h /^ int tac; \/* 16-bit tracking area code, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5d08 typeref:typename:int
+tac guest/hals/ril/reference-libril/ril.h /^ int tac; \/* 16-bit tracking area code, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf5e08 typeref:typename:int
+tac guest/hals/ril/reference-libril/ril.h /^ int tac; \/* 16-bit tracking area code, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7a08 typeref:typename:int
+tac guest/hals/ril/reference-libril/ril.h /^ int32_t tac; \/* 16-bit tracking area code, INT_MAX means invalid\/unreported. *\/$/;" m struct:__anon0bfbaecf6108 typeref:typename:int32_t
+tag host/commands/secure_env/in_process_tpm.cpp /^ uint16_t tag;$/;" m struct:cuttlefish::tpm_message_header typeref:typename:uint16_t file:
+takePhoto host/frontend/webrtc_operator/assets/js/app.js /^ #takePhoto() {$/;" m class:DeviceControlApp
+target common/libs/utils/tee_logging.h /^ SharedFD target;$/;" m struct:cuttlefish::SeverityTarget typeref:typename:SharedFD
+target host/commands/fetcher/build_api.h /^ std::string target;$/;" m struct:cuttlefish::DeviceBuild typeref:typename:std::string
+target host/commands/fetcher/build_api.h /^ std::string target;$/;" m struct:cuttlefish::DirectoryBuild typeref:typename:std::string
+target_arch host/commands/assemble_cvd/flags.h /^ Arch target_arch;$/;" m struct:cuttlefish::KernelConfig typeref:typename:Arch
+target_arch host/libs/config/cuttlefish_config.cpp /^Arch CuttlefishConfig::target_arch() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:Arch
+tcp_port_range host/frontend/webrtc/lib/streamer.h /^ std::pair<uint16_t, uint16_t> tcp_port_range = {15550, 15558};$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig typeref:typename:std::pair<uint16_t,uint16_t>
+tcp_port_range_ host/frontend/webrtc/lib/port_range_socket_factory.h /^ std::pair<uint16_t, uint16_t> tcp_port_range_;$/;" m class:cuttlefish::webrtc_streaming::PortRangeSocketFactory typeref:typename:std::pair<uint16_t,uint16_t>
+tcp_server_ host/libs/config/adb/launch.cpp /^ SharedFD tcp_server_;$/;" m class:cuttlefish::__anon7ea6a0320111::SocketVsockProxy typeref:typename:SharedFD file:
+tcti_context_ host/commands/secure_env/in_process_tpm.cpp /^ TSS2_TCTI_CONTEXT_COMMON_CURRENT tcti_context_;$/;" m class:cuttlefish::InProcessTpm::Impl typeref:typename:TSS2_TCTI_CONTEXT_COMMON_CURRENT file:
+tdls_external_control shared/config/wpa_supplicant_overlay.conf /^tdls_external_control=1$/;" k
+tdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoTdscdma tdscdma;$/;" m union:__anon0bfbaecf7008::__anon0bfbaecf710a typeref:typename:RIL_CellInfoTdscdma
+tdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoTdscdma tdscdma;$/;" m union:__anon0bfbaecf7208::__anon0bfbaecf730a typeref:typename:RIL_CellInfoTdscdma
+tdscdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoTdscdma tdscdma;$/;" m union:__anon0bfbaecf6e08::__anon0bfbaecf6f0a typeref:typename:RIL_CellInfoTdscdma
+tdscdma_rscp host/commands/modem_simulator/network_service.h /^ int tdscdma_rscp; \/* P-CCPCH RSCP as defined in TS 25.225 5.1.1$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+tearDown tests/recovery/src/com/android/cuttlefish/tests/RebootRecoveryTest.java /^ public void tearDown() throws Exception {$/;" m class:RebootRecoveryTest
+tech guest/hals/ril/reference-libril/ril.h /^ RIL_RadioTechnologyFamily tech;$/;" m struct:__anon0bfbaecf1808 typeref:typename:RIL_RadioTechnologyFamily
+techFromModemType guest/hals/ril/reference-ril/reference-ril.c /^static int techFromModemType(int mdmtype)$/;" f typeref:typename:int file:
+teeui host/libs/confui/layouts/layout.h /^namespace teeui {$/;" n
+teeui_frame_ host/libs/confui/host_renderer.h /^ TeeUiFrame teeui_frame_;$/;" m class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:TeeUiFrame
+teleserviceType guest/hals/ril/reference-libril/ril.h /^ RIL_SsTeleserviceType teleserviceType;$/;" m struct:__anon0bfbaecf9908 typeref:typename:RIL_SsTeleserviceType
+testBasicPhoneAttributes tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ public void testBasicPhoneAttributes() throws Exception {$/;" m class:RilE2eTests
+testGfxstreamEnabled tests/graphics/src/com/android/cuttlefish/tests/GfxstreamEnabledTest.java /^ public void testGfxstreamEnabled() throws Exception {$/;" m class:GfxstreamEnabledTest
+testPowerwash tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java /^ public void testPowerwash() throws Exception {$/;" m class:PowerwashTest
+testRebootRecovery tests/recovery/src/com/android/cuttlefish/tests/RebootRecoveryTest.java /^ public void testRebootRecovery() throws Exception {$/;" m class:RebootRecoveryTest
+testRilConnects tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ public void testRilConnects() throws Exception {$/;" m class:RilE2eTests
+testSignalLevels tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java /^ public void testSignalLevels() throws Exception {$/;" m class:RilE2eTests
+testTombstoneTransmitIntegrity tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ public void testTombstoneTransmitIntegrity() throws Exception {$/;" m class:TombstoneTransmitTest
+testTombstonesOfVaryingLengths tests/src/com/android/tests/tombstoneTransmit/TombstoneTransmitTest.java /^ public void testTombstonesOfVaryingLengths() throws Exception {$/;" m class:TombstoneTransmitTest
+testWifiConnects tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ public void testWifiConnects() throws Exception {$/;" m class:WifiE2eTests
+testWifiInitialization tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ public void testWifiInitialization() {$/;" m class:WifiE2eTests
+text common/libs/net/netlink_request_test.cpp /^ char text[sizeof(kLongString)]; \/\/ sizeof includes padding 0.$/;" m struct:cuttlefish::TEST::__anon1ff2f3d90208 typeref:typename:char[] file:
+thread host/libs/confui/host_utils.cc /^namespace thread {$/;" n namespace:cuttlefish::confui file:
+thread host/libs/confui/host_utils.h /^namespace thread {$/;" n namespace:cuttlefish::confui
+thread_looper_ host/commands/modem_simulator/modem_service.h /^ ThreadLooper* thread_looper_;$/;" m class:cuttlefish::ModemService typeref:typename:ThreadLooper *
+thread_looper_ host/commands/modem_simulator/modem_simulator.h /^ std::unique_ptr<ThreadLooper> thread_looper_;$/;" m class:cuttlefish::ModemSimulator typeref:typename:std::unique_ptr<ThreadLooper>
+threads_ common/libs/utils/subprocess.cpp /^std::vector<std::thread*> threads_;$/;" m class:cuttlefish::ThreadJoiner typeref:typename:std::vector<std::thread * > file:
+thresholdsDbm guest/hals/ril/reference-libril/ril.h /^ int32_t *thresholdsDbm;$/;" m struct:__anon0bfbaecf5608 typeref:typename:int32_t *
+thresholdsDbmNumber guest/hals/ril/reference-libril/ril.h /^ int32_t thresholdsDbmNumber;$/;" m struct:__anon0bfbaecf5608 typeref:typename:int32_t
+thresholdsDownlinkKbps guest/hals/ril/reference-libril/ril.h /^ int32_t *thresholdsDownlinkKbps;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t *
+thresholdsDownlinkKbpsLength guest/hals/ril/reference-libril/ril.h /^ int32_t thresholdsDownlinkKbpsLength;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t
+thresholdsUplinkKbps guest/hals/ril/reference-libril/ril.h /^ int32_t *thresholdsUplinkKbps;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t *
+thresholdsUplinkKbpsLength guest/hals/ril/reference-libril/ril.h /^ int32_t thresholdsUplinkKbpsLength;$/;" m struct:__anon0bfbaecf5708 typeref:typename:int32_t
+time guest/hals/ril/reference-libril/ril.h /^ uint64_t time; \/\/ Time in nanos as returned by ril_nano_time$/;" m struct:__anon0bfbaecf9c08 typeref:typename:uint64_t
+timeSeconds guest/hals/ril/reference-libril/ril.h /^ int timeSeconds; \/* for CF no reply only *\/$/;" m struct:__anon0bfbaecf2108 typeref:typename:int
+timeSeconds host/commands/modem_simulator/sup_service.h /^ int timeSeconds; \/\/ for CF no reply only$/;" m struct:cuttlefish::SupService::CallForwardInfo typeref:typename:int
+timeStamp guest/hals/ril/reference-libril/ril.h /^ uint64_t timeStamp; \/* Time in nanos as returned by ril_nano_time *\/$/;" m struct:__anon0bfbaecf6e08 typeref:typename:uint64_t
+timeStamp guest/hals/ril/reference-libril/ril.h /^ uint64_t timeStamp; \/* Time in nanos as returned by ril_nano_time *\/$/;" m struct:__anon0bfbaecf7008 typeref:typename:uint64_t
+timeStampType guest/hals/ril/reference-libril/ril.h /^ RIL_TimeStampType timeStampType; \/* type of time stamp represented by timeStamp *\/$/;" m struct:__anon0bfbaecf6e08 typeref:typename:RIL_TimeStampType
+timeStampType guest/hals/ril/reference-libril/ril.h /^ RIL_TimeStampType timeStampType; \/* type of time stamp represented by timeStamp *\/$/;" m struct:__anon0bfbaecf7008 typeref:typename:RIL_TimeStampType
+timeout guest/hals/ril/reference-libril/ril_event.h /^ struct timeval timeout;$/;" m struct:ril_event typeref:struct:timeval
+timeoutMs host/frontend/webrtc_operator/assets/js/adb.js /^const timeoutMs = 3000;$/;" C
+timeout_serial host/commands/modem_simulator/call_service.h /^ std::optional<int32_t> timeout_serial;$/;" m struct:cuttlefish::CallService::CallStatus typeref:typename:std::optional<int32_t>
+timer_list guest/hals/ril/reference-libril/ril_event.cpp /^static struct ril_event timer_list;$/;" v typeref:struct:ril_event file:
+timeradd guest/hals/ril/reference-libril/ril_event.cpp /^#define timeradd(/;" d file:
+timercmp guest/hals/ril/reference-libril/ril_event.cpp /^#define timercmp(/;" d file:
+timersub guest/hals/ril/reference-libril/ril_event.cpp /^#define timersub(/;" d file:
+timespec_to_ms host/commands/secure_env/tpm_keymaster_enforcement.cpp /^uint64_t timespec_to_ms(const struct timespec& tp) {$/;" f namespace:cuttlefish::__anon0281e17c0211 typeref:typename:uint64_t
+timestamp guest/hals/camera/vsock_camera_device_session_3_4.h /^ nsecs_t timestamp;$/;" m struct:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession::ReadVsockRequest typeref:typename:nsecs_t
+timestamp host/commands/secure_env/tpm_keymaster_enforcement.cpp /^ uint64_t timestamp;$/;" m struct:cuttlefish::TpmKeymasterEnforcement::VerifyAuthorization::VerificationData typeref:typename:uint64_t file:
+timestamp_ guest/hals/camera/vsock_frame_provider.h /^ std::atomic<nsecs_t> timestamp_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::atomic<nsecs_t>
+timestamp_ms host/commands/metrics/proto/cf_log.proto /^ optional Timestamp timestamp_ms = 1;$/;" f message:cuttlefish.CuttlefishLogEvent typeref:typename:Timestamp
+timezone_ host/commands/modem_simulator/misc_service.h /^ std::string timezone_;$/;" m class:cuttlefish::MiscService typeref:typename:std::string
+timingAdvance guest/hals/ril/reference-libril/ril.h /^ int timingAdvance; \/* Timing Advance in bit periods. 1 bit period = 48\/13 us.$/;" m struct:__anon0bfbaecf4708 typeref:typename:int
+timingAdvance guest/hals/ril/reference-libril/ril.h /^ int timingAdvance; \/* timing advance in micro seconds for a one way trip from cell to dev/;" m struct:__anon0bfbaecf4c08 typeref:typename:int
+title host/example_custom_actions/custom_action_config.json /^ "title":"Do Not Disturb",$/;" s object:1.buttons.1
+title host/example_custom_actions/custom_action_config.json /^ "title":"Quick Settings",$/;" s object:1.buttons.0
+title host/example_custom_actions/custom_action_config.json /^ "title":"Web Page",$/;" s object:0.button
+title host/frontend/webrtc/lib/streamer.cpp /^ std::string title;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::ControlPanelButtonDescriptor typeref:typename:std::string file:
+title host/libs/config/custom_actions.h /^ std::string title;$/;" m struct:cuttlefish::ControlPanelButton typeref:typename:std::string
+title shared/config/config_foldable.json /^ "title":"Device State Closed",$/;" s object:custom_actions.0.button
+title shared/config/config_foldable.json /^ "title":"Device State Opened",$/;" s object:custom_actions.1.button
+tmp_debs= tools/create_base_image_gce.sh /^tmp_debs=()$/;" f
+tmp_test_dir host/commands/modem_simulator/unittest/service_test.cpp /^static const std::string tmp_test_dir = std::string(fs::temp_directory_path()) +$/;" v typeref:typename:const std::string file:
+toCodeScheme guest/hals/ril/reference-libril/ril.h /^ int toCodeScheme;$/;" m struct:__anon0bfbaecf4408 typeref:typename:int
+toKeymasterError guest/hals/keymint/remote/remote_remotely_provisioned_component.cpp /^ndk::ScopedAStatus toKeymasterError(const KeymasterResponse& response) {$/;" f namespace:aidl::android::hardware::security::keymint::__anone2ec5ace0111 typeref:typename:ndk::ScopedAStatus
+toServiceId guest/hals/ril/reference-libril/ril.h /^ int toServiceId;$/;" m struct:__anon0bfbaecf4408 typeref:typename:int
+toString guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceFuture.java /^ public static String toString(ArrayList<GceFuture<?>> futures) {$/;" m class:GceFuture
+toa guest/hals/ril/reference-libril/ril.h /^ int toa; \/* "type" from TS 27.007 7.11 *\/$/;" m struct:__anon0bfbaecf2108 typeref:typename:int
+toa guest/hals/ril/reference-libril/ril.h /^ int toa; \/* type of address, eg 145 = intl *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:int
+token guest/hals/ril/reference-libril/RilSapSocket.h /^ int token;$/;" m struct:RilSapSocket::SapSocketRequest typeref:typename:int
+token guest/hals/ril/reference-libril/ril_internal.h /^ int32_t token; \/\/this is not RIL_Token$/;" m struct:android::RequestInfo typeref:typename:int32_t
+tombstone_dir_ host/commands/run_cvd/launch.cc /^ std::string tombstone_dir_;$/;" m class:cuttlefish::TombstoneReceiver typeref:typename:std::string file:
+tombstone_receiver_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::tombstone_receiver_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+ton host/commands/modem_simulator/sup_service.h /^ int ton; \/\/ "type" from TS 27.007 7.11$/;" m struct:cuttlefish::SupService::CallForwardInfo typeref:typename:int
+toplevel_destroy_resource_callback host/libs/wayland/wayland_shell.cpp /^void toplevel_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+tosca host/commands/modem_simulator/sms_service.h /^ int tosca;$/;" m struct:cuttlefish::SmsService::SmsServiceCenterAddress typeref:typename:int
+total_instances_ host/commands/modem_simulator/nvram_config.h /^ size_t total_instances_;$/;" m class:cuttlefish::NvramConfig typeref:typename:size_t
+total_len guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^ int total_len;$/;" m struct:android_wifi_priv_cmd typeref:typename:int
+touchIdSlotMap host/frontend/webrtc_operator/assets/js/app.js /^ touchIdSlotMap: new Map(),$/;" p class:DeviceControlApp.startMouseTracking.mouseCtx
+touchSlots host/frontend/webrtc_operator/assets/js/app.js /^ touchSlots: [],$/;" p class:DeviceControlApp.startMouseTracking.mouseCtx
+touch_clients host/frontend/webrtc/connection_observer.h /^ std::map<std::string, SharedFD> touch_clients;$/;" m struct:cuttlefish::InputSockets typeref:typename:std::map<std::string,SharedFD>
+touch_destroy_resource_callback host/libs/wayland/wayland_seat.cpp /^void touch_destroy_resource_callback(struct wl_resource*) {}$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+touch_enabled host/frontend/webrtc/lib/streamer.cpp /^ bool touch_enabled;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::DisplayDescriptor typeref:typename:bool file:
+touch_implementation host/libs/wayland/wayland_seat.cpp /^const struct wl_touch_interface touch_implementation = {$/;" v namespace:wayland::__anona9f16c970111 typeref:typename:const struct wl_touch_interface
+touch_release host/libs/wayland/wayland_seat.cpp /^void touch_release(wl_client*, wl_resource* touch) {$/;" f namespace:wayland::__anona9f16c970111 typeref:typename:void
+touch_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::touch_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+touch_servers host/frontend/webrtc/connection_observer.h /^ std::map<std::string, SharedFD> touch_servers;$/;" m struct:cuttlefish::InputSockets typeref:typename:std::map<std::string,SharedFD>
+touch_servers_ host/commands/run_cvd/launch_streamer.cpp /^ std::vector<SharedFD> touch_servers_;$/;" m class:cuttlefish::__anon6b0274e10111::StreamerSockets typeref:typename:std::vector<SharedFD> file:
+touch_socket_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::touch_socket_path($/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+tpm_ host/commands/secure_env/device_tpm.h /^ std::unique_ptr<TSS2_TCTI_CONTEXT, void(*)(TSS2_TCTI_CONTEXT*)> tpm_;$/;" m class:cuttlefish::DeviceTpm typeref:typename:std::unique_ptr<TSS2_TCTI_CONTEXT,void (*)(TSS2_TCTI_CONTEXT *)>
+tpm_ host/commands/secure_env/test_tpm.h /^ InProcessTpm tpm_;$/;" m class:cuttlefish::TestTpm typeref:typename:InProcessTpm
+tpm_device host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::tpm_device() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+tpm_message_header host/commands/secure_env/in_process_tpm.cpp /^struct __attribute__((__packed__)) tpm_message_header {$/;" s namespace:cuttlefish file:
+track_source_impl_ host/frontend/webrtc/lib/audio_track_source_impl.h /^ rtc::scoped_refptr<AudioTrackSourceImpl> track_source_impl_;$/;" m class:cuttlefish::webrtc_streaming::AudioTrackSourceImplSinkWrapper typeref:typename:rtc::scoped_refptr<AudioTrackSourceImpl>
+track_source_impl_ host/frontend/webrtc/lib/video_track_source_impl.h /^ rtc::scoped_refptr<VideoTrackSourceImpl> track_source_impl_;$/;" m class:cuttlefish::webrtc_streaming::VideoTrackSourceImplSinkWrapper typeref:typename:rtc::scoped_refptr<VideoTrackSourceImpl>
+transferAtrReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::transferAtrReq(int32_t token) {$/;" f class:SapImpl typeref:typename:Return<void>
+transferCardReaderStatusReq guest/hals/ril/reference-libril/sap_service.cpp /^Return<void> SapImpl::transferCardReaderStatusReq(int32_t token) {$/;" f class:SapImpl typeref:typename:Return<void>
+triggerEvLoop guest/hals/ril/reference-libril/ril.cpp /^static void triggerEvLoop() {$/;" f namespace:android typeref:typename:void file:
+tryWriteFmqResult guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::tryWriteFmqResult(V3_2::CaptureResult& result) {$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+tx_mode_time_ms guest/hals/ril/reference-libril/ril.h /^ uint32_t tx_mode_time_ms[RIL_NUM_TX_POWER_LEVELS];$/;" m struct:__anon0bfbaecf9f08 typeref:typename:uint32_t[]
+tx_shm_ host/libs/audio_connector/server.h /^ const ScopedMMap tx_shm_;$/;" m class:cuttlefish::AudioClientConnection typeref:typename:const ScopedMMap
+tx_socket_ host/libs/audio_connector/server.h /^ SharedFD tx_socket_;$/;" m class:cuttlefish::AudioClientConnection typeref:typename:SharedFD
+ty_ host/libs/allocd/resource.h /^ ResourceType ty_ = ResourceType::Invalid;$/;" m class:cuttlefish::StaticResource typeref:typename:ResourceType
+type common/libs/confui/protocol_types.h /^ using type = std::string;$/;" t struct:cuttlefish::confui::UserResponse typeref:typename:std::string
+type guest/commands/vsoc_input_service/vsoc_input_service.h /^ uint16_t type;$/;" m struct:cuttlefish::input_events::InputEvent typeref:typename:uint16_t
+type guest/hals/ril/reference-libril/ril.h /^ RIL_KeepaliveType type; \/* Type of keepalive packet *\/$/;" m struct:__anon0bfbaecfc508 typeref:typename:RIL_KeepaliveType
+type guest/hals/ril/reference-libril/ril.h /^ RIL_ScanType type; \/\/ Type of the scan$/;" m struct:__anon0bfbaecfad08 typeref:typename:RIL_ScanType
+type guest/hals/ril/reference-libril/ril.h /^ RIL_ScanType type;$/;" m struct:__anon0bfbaecfb008 typeref:typename:RIL_ScanType
+type guest/hals/ril/reference-libril/ril.h /^ char * type; \/* One of the PDP_type values in TS 27.007 section 10.1.1.$/;" m struct:__anon0bfbaecf1208 typeref:typename:char *
+type guest/hals/ril/reference-libril/ril.h /^ char * type; \/* One of the PDP_type values in TS 27.007 section 10.1.1.$/;" m struct:__anon0bfbaecf1308 typeref:typename:char *
+type guest/hals/ril/reference-libril/ril.h /^ char * type; \/* One of the PDP_type values in TS 27.007 section 10.1.1.$/;" m struct:__anon0bfbaecf1408 typeref:typename:char *
+type guest/hals/ril/reference-libril/ril.h /^ char * type; \/* One of the PDP_type values in TS 27.007 section 10.1.1.$/;" m struct:__anon0bfbaecf1508 typeref:typename:char *
+type guest/hals/ril/reference-libril/ril.h /^ char * type; \/* One of the PDP_type values in TS 27.007 section 10.1.1.$/;" m struct:__anon0bfbaecf1608 typeref:typename:char *
+type guest/hals/ril/reference-libril/ril.h /^ int type; \/* "type" from 27.007 7.17 (MT only). *\/$/;" m struct:__anon0bfbaecf3108 typeref:typename:int
+type guest/hals/ril/reference-libril/ril.h /^ int type;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+type guest/hals/ril/reference-libril/ril.h /^ int type;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+type guest/hals/ril/reference-libril/ril.h /^ RIL_HardwareConfig_Type type;$/;" m struct:__anon0bfbaecf9308 typeref:typename:RIL_HardwareConfig_Type
+type guest/hals/ril/reference-libril/ril_ex.h /^ RIL_SOCKET_TYPE type;$/;" m struct:SocketListenParam typeref:typename:RIL_SOCKET_TYPE
+type guest/hals/ril/reference-ril/reference-ril.c /^ int type;$/;" m struct:__anon70d7df6f0208 typeref:typename:int file:
+type host/commands/modem_simulator/channel_monitor.h /^ ClientType type = RIL;$/;" m class:cuttlefish::Client typeref:typename:ClientType
+type host/commands/modem_simulator/sup_service.h /^ ClirType type;$/;" m struct:cuttlefish::SupService::ClirStatusInfo typeref:typename:ClirType
+type host/frontend/webrtc/connection_observer.cpp /^ uint16_t type;$/;" m struct:cuttlefish::virtio_input_event typeref:typename:uint16_t file:
+type host/libs/audio_connector/commands.h /^ AudioCommandType type() const { return type_; }$/;" f class:cuttlefish::AudioCommand typeref:typename:AudioCommandType
+type host/libs/image_aggregator/image_aggregator.h /^ ImagePartitionType type;$/;" m struct:cuttlefish::ImagePartition typeref:typename:ImagePartitionType
+type host/libs/image_aggregator/image_aggregator.h /^ ImagePartitionType type;$/;" m struct:cuttlefish::MultipleImagePartition typeref:typename:ImagePartitionType
+typeFromTag guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^inline keymaster_tag_type_t typeFromTag(const keymaster_tag_t tag) {$/;" f namespace:keymaster::V4_1::__anon49de69e60111 typeref:typename:keymaster_tag_type_t
+type_ common/libs/confui/packet_types.h /^ std::string type_;$/;" m struct:cuttlefish::confui::packet::ParsedPacket typeref:typename:std::string
+type_ host/libs/audio_connector/commands.h /^ const AudioCommandType type_;$/;" m class:cuttlefish::AudioCommand typeref:typename:const AudioCommandType
+u16cpy host/libs/image_aggregator/image_aggregator.cc /^void u16cpy(std::uint16_t* dest, std::uint16_t* src, std::size_t size) {$/;" f namespace:cuttlefish::__anon02806fd80111 typeref:typename:void
+u_ host/frontend/webrtc/cvd_video_frame_buffer.h /^ std::vector<std::uint8_t> u_;$/;" m class:cuttlefish::CvdVideoFrameBuffer typeref:typename:std::vector<std::uint8_t>
+uarfcn guest/hals/ril/reference-libril/ril.h /^ int uarfcn; \/* 16-bit UMTS Absolute RF Channel Number, INT_MAX if unknown *\/$/;" m struct:__anon0bfbaecf7908 typeref:typename:int
+uarfcn guest/hals/ril/reference-libril/ril.h /^ int uarfcn; \/* 16-bit UMTS Absolute RF Channel Number; this value must be reported *\/$/;" m struct:__anon0bfbaecf5b08 typeref:typename:int
+uarfcn guest/hals/ril/reference-libril/ril.h /^ int32_t uarfcn; \/* 16-bit UMTS Absolute RF Channel Number defined in TS 25.102 5.4.4; this/;" m struct:__anon0bfbaecf7b08 typeref:typename:int32_t
+uboot_env_image_path host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::uboot_env_image_path() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+ucred host/libs/allocd/resource_manager.cpp /^ struct ucred ucred {};$/;" s function:cuttlefish::GetUserIDFromSock file:
+udp common/libs/utils/network.cpp /^ udphdr udp;$/;" m struct:cuttlefish::CompleteReleaseFrame typeref:typename:udphdr file:
+udp_port_range host/frontend/webrtc/lib/streamer.h /^ std::pair<uint16_t, uint16_t> udp_port_range = {15550, 15558};$/;" m struct:cuttlefish::webrtc_streaming::StreamerConfig typeref:typename:std::pair<uint16_t,uint16_t>
+udp_port_range_ host/frontend/webrtc/lib/port_range_socket_factory.h /^ std::pair<uint16_t, uint16_t> udp_port_range_;$/;" m class:cuttlefish::webrtc_streaming::PortRangeSocketFactory typeref:typename:std::pair<uint16_t,uint16_t>
+ui_options_ guest/hals/confirmationui/guest_session.h /^ std::vector<teeui::UIOption> ui_options_;$/;" m class:android::hardware::confirmationui::V1_0::implementation::GuestSession typeref:typename:std::vector<teeui::UIOption>
+ui_options_ host/libs/confui/session.h /^ std::vector<teeui::UIOption> ui_options_;$/;" m class:cuttlefish::confui::Session typeref:typename:std::vector<teeui::UIOption>
+ui_opts_ common/libs/confui/protocol_types.h /^ std::vector<teeui::UIOption> ui_opts_;$/;" m class:cuttlefish::confui::ConfUiStartMessage typeref:typename:std::vector<teeui::UIOption>
+uid_ host/libs/allocd/resource.h /^ uid_t uid_{};$/;" m class:cuttlefish::StaticResource typeref:typename:uid_t
+uid_ host/libs/allocd/resource_manager.h /^ uid_t uid_{};$/;" m class:cuttlefish::Session typeref:typename:uid_t
+uimFuncs guest/hals/ril/reference-libril/RilSapSocket.h /^ const RIL_RadioFunctions* uimFuncs;$/;" m class:RilSapSocket typeref:typename:const RIL_RadioFunctions *
+uimRilEnv guest/hals/ril/reference-libril/RilSapSocket.cpp /^struct RIL_Env RilSapSocket::uimRilEnv = {$/;" m class:RilSapSocket typeref:struct:RIL_Env
+uimRilEnv guest/hals/ril/reference-libril/RilSapSocket.h /^ static struct RIL_Env uimRilEnv;$/;" m class:RilSapSocket typeref:struct:RIL_Env
+underflow common/libs/fs/shared_fd_stream.cpp /^int SharedFDStreambuf::underflow() {$/;" f class:cuttlefish::SharedFDStreambuf typeref:typename:int
+unenv_ common/libs/utils/subprocess.h /^ std::unordered_set<std::string> unenv_{};$/;" m class:cuttlefish::Command typeref:typename:std::unordered_set<std::string>
+unique_id_hbk_ host/commands/secure_env/tpm_attestation_record.h /^ std::vector<uint8_t> unique_id_hbk_;$/;" m class:cuttlefish::TpmAttestationRecordContext typeref:typename:std::vector<uint8_t>
+unique_partition_guid host/libs/image_aggregator/image_aggregator.cc /^ std::uint8_t unique_partition_guid[16];$/;" m struct:cuttlefish::__anon02806fd80111::GptPartitionEntry typeref:typename:std::uint8_t[16] file:
+universal_pin_state guest/hals/ril/reference-libril/ril.h /^ RIL_PinState universal_pin_state; \/* applicable to USIM and CSIM: RIL_PINSTATE_x/;" m struct:__anon0bfbaecf3908 typeref:typename:RIL_PinState
+universal_pin_state guest/hals/ril/reference-libril/ril.h /^ RIL_PinState universal_pin_state; \/* applicable to USIM and CSIM: RIL_PINSTATE_x/;" m struct:__anon0bfbaecf3a08 typeref:typename:RIL_PinState
+unlink_cb_ guest/hals/bt/remote/remote_bluetooth.h /^ std::function<void(sp<BluetoothDeathRecipient>&)> unlink_cb_;$/;" m class:android::hardware::bluetooth::V1_1::remote::BluetoothHci typeref:typename:std::function<void (sp<BluetoothDeathRecipient> &)>
+unsol_mode host/commands/modem_simulator/network_service.h /^ RegistrationUnsolMode unsol_mode;$/;" m struct:cuttlefish::NetworkService::NetworkRegistrationStatus typeref:typename:RegistrationUnsolMode
+upLink guest/hals/ril/reference-libril/ril.h /^ char upLink;$/;" m struct:__anon0bfbaecf8808 typeref:typename:char
+update guest/hals/camera/stream_buffer_cache.cpp /^void StreamBufferCache::update(const StreamBuffer& buffer) {$/;" f class:android::hardware::camera::device::V3_4::implementation::StreamBufferCache typeref:typename:void
+update guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::update(uint64_t operationHandle,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+update guest/hals/keymint/remote/remote_keymint_operation.cpp /^ScopedAStatus RemoteKeyMintOperation::update($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation typeref:typename:ScopedAStatus
+update host/frontend/webrtc_operator/assets/js/app.js /^ update() {$/;" m class:DeviceDetailsUpdater
+updateAad guest/hals/keymint/remote/remote_keymint_operation.cpp /^ScopedAStatus RemoteKeyMintOperation::updateAad($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation typeref:typename:ScopedAStatus
+updateBufferCaches guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::updateBufferCaches($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+updateDeviceHardwareDetails host/frontend/webrtc_operator/assets/js/app.js /^ #updateDeviceHardwareDetails(hardware) {$/;" m class:DeviceControlApp
+updateDeviceStateDetails host/frontend/webrtc_operator/assets/js/app.js /^ #updateDeviceStateDetails(lidSwitchOpen, hingeAngle) {$/;" m class:DeviceControlApp
+updateDisplayVisibility host/frontend/webrtc_operator/assets/js/app.js /^ #updateDisplayVisibility(displayId, powerMode) {$/;" m class:DeviceControlApp
+updatePhysicalChannelconfigs host/commands/modem_simulator/data_service.cpp /^void DataService::updatePhysicalChannelconfigs(int modem_tech, int freq,$/;" f class:cuttlefish::DataService typeref:typename:void
+updateSimPhonebookRecords guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::updateSimPhonebookRecords($/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+updateSimPhonebookRecordsResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::updateSimPhonebookRecordsResponse(int slotId, int responseType, int serial,$/;" f class:radio_1_6 typeref:typename:int
+updateStreamInfo guest/hals/camera/vsock_camera_device_session_3_4.cpp /^void VsockCameraDeviceSession::updateStreamInfo($/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession typeref:typename:void
+upgradeKey guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::upgradeKey(const hidl_vec<uint8_t>& keyBlobToUpgrade,$/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+upgradeKey guest/hals/keymint/remote/remote_keymint_device.cpp /^ScopedAStatus RemoteKeyMintDevice::upgradeKey($/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice typeref:typename:ScopedAStatus
+upload_artifacts tools/upload_to_gce_and_run.py /^def upload_artifacts(args):$/;" f
+upload_artifacts tools/upload_via_ssh.py /^def upload_artifacts(args):$/;" f
+url host/frontend/webrtc_operator/assets/js/index.js /^ #url;$/;" M class:DeviceListApp
+urns guest/hals/ril/reference-libril/ril.h /^ char ** urns; \/* The list of emergency Uniform Resource Names (U/;" m struct:__anon0bfbaecfb708 typeref:typename:char **
+urnsNumber guest/hals/ril/reference-libril/ril.h /^ uint32_t urnsNumber;$/;" m struct:__anon0bfbaecfb708 typeref:typename:uint32_t
+usage guest/hals/ril/reference-ril/reference-ril.c /^static void usage(char *s __unused)$/;" f typeref:typename:void file:
+usage guest/hals/rild/rild_cuttlefish.c /^static void usage(const char *argv0) {$/;" f typeref:typename:void file:
+usage host/commands/health/health.cpp /^int usage() {$/;" f typeref:typename:int
+usage tools/flash-blk-dev.sh /^usage() {$/;" f
+usageMessage host/commands/wmediumd_control/main.cpp /^const std::string usageMessage =$/;" v typeref:typename:const std::string
+useCamera host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async useCamera(in_use) {$/;" m class:DeviceConnection
+useDevice host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async #useDevice(in_use, senders_arr, device_opt) {$/;" m class:DeviceConnection
+useMic host/frontend/webrtc_operator/assets/js/cf_webrtc.js /^ async useMic(in_use) {$/;" m class:DeviceConnection
+use_allocd host/libs/config/cuttlefish_config_instance.cpp /^bool CuttlefishConfig::InstanceSpecific::use_allocd() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:bool
+use_bootloader host/libs/config/cuttlefish_config.h /^ bool use_bootloader() const { return true; };$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+use_ebtables_legacy host/libs/allocd/alloc_utils.h /^ bool use_ebtables_legacy = false;$/;" m struct:cuttlefish::EthernetNetworkConfig typeref:typename:bool
+use_ebtables_legacy_ host/libs/allocd/resource.h /^ bool use_ebtables_legacy_ = false;$/;" m class:cuttlefish::EthernetIface typeref:typename:bool
+use_ebtables_legacy_ host/libs/allocd/resource_manager.h /^ bool use_ebtables_legacy_ = false;$/;" m struct:cuttlefish::ResourceManager typeref:typename:bool
+use_ipv4_bridge_ host/libs/allocd/resource_manager.h /^ bool use_ipv4_bridge_ = true;$/;" m struct:cuttlefish::ResourceManager typeref:typename:bool
+use_ipv6_bridge_ host/libs/allocd/resource_manager.h /^ bool use_ipv6_bridge_ = true;$/;" m struct:cuttlefish::ResourceManager typeref:typename:bool
+use_parent_env_ common/libs/utils/subprocess.h /^ bool use_parent_env_ = true;$/;" m class:cuttlefish::Command typeref:typename:bool
+used_len guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.h /^ int used_len;$/;" m struct:android_wifi_priv_cmd typeref:typename:int
+used_slots_ host/commands/secure_env/tpm_resource_manager.h /^ std::atomic<std::uint32_t> used_slots_;$/;" m class:cuttlefish::TpmResourceManager typeref:typename:std::atomic<std::uint32_t>
+user guest/hals/ril/reference-libril/ril.h /^ char* user;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:char *
+user guest/hals/ril/reference-libril/ril.h /^ char* user;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:char *
+userParam guest/hals/ril/reference-libril/ril.cpp /^ void *userParam;$/;" m struct:android::UserCallbackInfo typeref:typename:void * file:
+userTimerCallback guest/hals/ril/reference-libril/ril.cpp /^static void userTimerCallback (int fd, short flags, void *param) {$/;" f namespace:android typeref:typename:void file:
+user_data_ host/commands/modem_simulator/pdu_parser.h /^ std::string user_data_;$/;" m class:cuttlefish::PDUParser typeref:typename:std::string
+user_input_evt_q_id_ host/libs/confui/host_server.h /^ int user_input_evt_q_id_; \/\/ Q id in input_multiplexer_$/;" m class:cuttlefish::confui::HostServer typeref:typename:int
+userdata_format host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::userdata_format() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+username guest/hals/ril/reference-libril/ril.h /^ char *username; \/* the username for APN, or NULL *\/$/;" m struct:__anon0bfbaecfc008 typeref:typename:char *
+username guest/hals/ril/reference-libril/ril.h /^ char *username; \/* the username for APN, or NULL *\/$/;" m struct:__anon0bfbaecfc108 typeref:typename:char *
+username tools/create_base_image.go /^var username string$/;" v package:main typeref:typename:string
+utf8Decoder host/frontend/webrtc_operator/assets/js/adb.js /^let utf8Decoder = new TextDecoder();$/;" v
+utf8Encoder host/frontend/webrtc_operator/assets/js/adb.js /^let utf8Encoder = new TextEncoder();$/;" v
+utran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_UtranBands utran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfab08::__anon0bfbaecfac0a typeref:typename:RIL_UtranBands[]
+utran_bands guest/hals/ril/reference-libril/ril.h /^ RIL_UtranBands utran_bands[MAX_BANDS];$/;" m union:__anon0bfbaecfae08::__anon0bfbaecfaf0a typeref:typename:RIL_UtranBands[]
+uuid guest/hals/ril/reference-libril/ril.h /^ char uuid[MAX_UUID_LENGTH];$/;" m struct:__anon0bfbaecf9308 typeref:typename:char[]
+uuid host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::uuid() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+uusData guest/hals/ril/reference-libril/ril.h /^ char * uusData; \/* UUS Data *\/$/;" m struct:__anon0bfbaecf0f08 typeref:typename:char *
+uusDcs guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_DCS uusDcs; \/* UUS Data Coding Scheme *\/$/;" m struct:__anon0bfbaecf0f08 typeref:typename:RIL_UUS_DCS
+uusInfo guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_Info * uusInfo; \/* NULL or Pointer to User-User Signaling Information *\/$/;" m struct:__anon0bfbaecf1108 typeref:typename:RIL_UUS_Info *
+uusInfo guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_Info * uusInfo; \/* NULL or Pointer to User-User Signaling Information *\/$/;" m struct:__anon0bfbaecf1c08 typeref:typename:RIL_UUS_Info *
+uusLength guest/hals/ril/reference-libril/ril.h /^ int uusLength; \/* Length of UUS Data *\/$/;" m struct:__anon0bfbaecf0f08 typeref:typename:int
+uusType guest/hals/ril/reference-libril/ril.h /^ RIL_UUS_Type uusType; \/* UUS Type *\/$/;" m struct:__anon0bfbaecf0f08 typeref:typename:RIL_UUS_Type
+v_ host/frontend/webrtc/cvd_video_frame_buffer.h /^ std::vector<std::uint8_t> v_;$/;" m class:cuttlefish::CvdVideoFrameBuffer typeref:typename:std::vector<std::uint8_t>
+valid guest/hals/camera/cached_stream_buffer.h /^ bool valid() const { return buffer_ != nullptr; }$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer typeref:typename:bool
+validate_redirects common/libs/utils/subprocess.cpp /^bool validate_redirects($/;" f namespace:cuttlefish::__anon39e8abf00111 typeref:typename:bool
+validationComponent host/commands/run_cvd/validate.cpp /^validationComponent() {$/;" f namespace:cuttlefish typeref:typename:fruit::Component<fruit::Required<const CuttlefishConfig::InstanceSpecific>>
+value common/libs/utils/flag_parser.h /^ std::string value;$/;" m struct:cuttlefish::FlagMatch typeref:typename:std::string
+value guest/commands/vsoc_input_service/vsoc_input_service.h /^ uint32_t value;$/;" m struct:cuttlefish::input_events::InputEvent typeref:typename:uint32_t
+value guest/hals/ril/reference-libril/ril.h /^ char * value;$/;" m struct:__anon0bfbaecf8d08 typeref:typename:char *
+value host/frontend/webrtc/connection_observer.cpp /^ int32_t value;$/;" m struct:cuttlefish::virtio_input_event typeref:typename:int32_t file:
+value host/libs/confui/sign_utils.h /^ static constexpr bool value =$/;" m struct:cuttlefish::confui::support::ByteBufferProxy::has_data typeref:typename:bool
+value host/libs/screen_connector/screen_connector_common.h /^ static constexpr const bool value =$/;" m struct:cuttlefish::is_movable typeref:typename:const bool
+value_ common/libs/fs/shared_fd.h /^ std::shared_ptr<FileInstance> value_;$/;" m class:cuttlefish::SharedFD typeref:typename:std::shared_ptr<FileInstance>
+value_ common/libs/fs/shared_fd.h /^ std::weak_ptr<FileInstance> value_;$/;" m class:cuttlefish::WeakFD typeref:typename:std::weak_ptr<FileInstance>
+value_ common/libs/fs/shared_select.h /^ std::set<SharedFD> value_;$/;" m class:cuttlefish::SharedFDSet typeref:typename:std::set<SharedFD>
+vb_params_ host/commands/secure_env/tpm_attestation_record.h /^ VerifiedBootParams vb_params_;$/;" m class:cuttlefish::TpmAttestationRecordContext typeref:typename:VerifiedBootParams
+vehicle_hal_server_port host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::vehicle_hal_server_port() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+vendor_cause guest/hals/ril/reference-libril/ril.h /^ char * vendor_cause;$/;" m struct:__anon0bfbaecf2e08 typeref:typename:char *
+vendor_id_ guest/commands/vsoc_input_service/virtual_device_base.h /^ const uint16_t vendor_id_;$/;" m class:cuttlefish_input_service::VirtualDeviceBase typeref:typename:const uint16_t
+vendor_patchlevel_ host/commands/secure_env/tpm_key_blob_maker.h /^ std::optional<uint32_t> vendor_patchlevel_;$/;" m class:cuttlefish::TpmKeyBlobMaker typeref:typename:std::optional<uint32_t>
+vendor_patchlevel_ host/commands/secure_env/tpm_keymaster_context.h /^ std::optional<uint32_t> vendor_patchlevel_;$/;" m class:cuttlefish::TpmKeymasterContext typeref:typename:std::optional<uint32_t>
+verbose tools/create_base_image.go /^var verbose bool$/;" v package:main typeref:typename:bool
+verbose_ common/libs/utils/subprocess.h /^ bool verbose_;$/;" m class:cuttlefish::SubprocessOptions typeref:typename:bool
+verify guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^Return<void> RemoteGateKeeperDevice::verify($/;" f class:gatekeeper::RemoteGateKeeperDevice typeref:typename:Return<void>
+verifyAuthorization guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^Return<void> RemoteKeymaster4Device::verifyAuthorization($/;" f class:keymaster::V4_1::RemoteKeymaster4Device typeref:typename:Return<void>
+version apex/com.google.aosp_cf_x86_64_phone.rros/apex_manifest.json /^ "version": 1$/;" n
+version apex/com.google.cf.bt/manifest.json /^ "version": 1$/;" n
+version apex/com.google.cf.input.config/apex_manifest.json /^ "version": 1$/;" n
+version apex/com.google.cf.rild/apex_manifest.json /^ "version": 1$/;" n
+version apex/com.google.cf.wifi/apex_manifest.json /^ "version": 1$/;" n
+version guest/hals/ril/reference-libril/ril.h /^ int version; \/\/ Version of structure, RIL_RADIO_CAPABILITY_VERSION$/;" m struct:__anon0bfbaecf0a08 typeref:typename:int
+version guest/hals/ril/reference-libril/ril.h /^ int version; \/* set to RIL_VERSION *\/$/;" m struct:__anon0bfbaecfbf08 typeref:typename:int
+version host/libs/allocd/request.h /^ uint16_t version; \/\/\/ used to differentiate between allocd feature sets$/;" m struct:cuttlefish::RequestHeader typeref:typename:uint16_t
+version host/libs/audio_connector/shm_layout.h /^ uint32_t version;$/;" m struct:cuttlefish::VioSConfig typeref:typename:uint32_t
+version host/libs/image_aggregator/cdisk_spec.proto /^ uint64 version = 1;$/;" f message:CompositeDisk typeref:typename:uint64
+version host/libs/image_aggregator/image_aggregator.cc /^ Be32 version;$/;" m struct:cuttlefish::__anon02806fd80111::QCowHeader typeref:typename:Be32 file:
+version tests/hal/hal_implementation_test.cpp /^ size_t version;$/;" m struct:VersionedAidlPackage typeref:typename:size_t file:
+version tools/create_base_image.go /^var version string$/;" v package:main typeref:typename:string
+version_ guest/commands/vsoc_input_service/virtual_device_base.h /^ const uint16_t version_;$/;" m class:cuttlefish_input_service::VirtualDeviceBase typeref:typename:const uint16_t
+vhost_net host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::vhost_net() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+vhost_user_mac80211_hwsim host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::vhost_user_mac80211_hwsim() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+video_encoder_ host/frontend/webrtc/lib/local_recorder.cpp /^ std::unique_ptr<webrtc::VideoEncoder> video_encoder_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:std::unique_ptr<webrtc::VideoEncoder> file:
+video_track_ host/frontend/webrtc/lib/client_handler.cpp /^ webrtc::VideoTrackInterface* video_track_;$/;" m class:cuttlefish::webrtc_streaming::ClientVideoTrackImpl typeref:typename:webrtc::VideoTrackInterface * file:
+video_track_number_ host/frontend/webrtc/lib/local_recorder.cpp /^ uint64_t video_track_number_;$/;" m class:cuttlefish::webrtc_streaming::LocalRecorder::Display typeref:typename:uint64_t file:
+virtio_gpu_metadata_ host/libs/wayland/wayland_surface.h /^ VirtioGpuMetadata virtio_gpu_metadata_;$/;" m struct:wayland::Surface::State typeref:typename:VirtioGpuMetadata
+virtio_gpu_metadata_get_surface_metadata host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^void virtio_gpu_metadata_get_surface_metadata($/;" f namespace:wayland::__anon027348120111 typeref:typename:void
+virtio_gpu_metadata_implementation host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^ virtio_gpu_metadata_implementation = {$/;" v namespace:wayland::__anon027348120111 typeref:typename:const struct wp_virtio_gpu_metadata_v1_interface
+virtio_gpu_surface_metadata_implementation host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^ virtio_gpu_surface_metadata_implementation = {$/;" v namespace:wayland::__anon027348120111 typeref:typename:const struct wp_virtio_gpu_surface_metadata_v1_interface
+virtio_gpu_surface_metadata_set_scanout_id host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^void virtio_gpu_surface_metadata_set_scanout_id($/;" f namespace:wayland::__anon027348120111 typeref:typename:void
+virtio_input_event host/frontend/webrtc/connection_observer.cpp /^struct virtio_input_event {$/;" s namespace:cuttlefish file:
+virtio_snd_chmap_info host/libs/audio_connector/shm_layout.h /^struct virtio_snd_chmap_info {$/;" s namespace:cuttlefish
+virtio_snd_hdr host/libs/audio_connector/shm_layout.h /^struct virtio_snd_hdr {$/;" s namespace:cuttlefish
+virtio_snd_info host/libs/audio_connector/shm_layout.h /^struct virtio_snd_info {$/;" s namespace:cuttlefish
+virtio_snd_jack_info host/libs/audio_connector/shm_layout.h /^struct virtio_snd_jack_info {$/;" s namespace:cuttlefish
+virtio_snd_pcm_hdr host/libs/audio_connector/shm_layout.h /^struct virtio_snd_pcm_hdr {$/;" s namespace:cuttlefish
+virtio_snd_pcm_info host/libs/audio_connector/shm_layout.h /^struct virtio_snd_pcm_info {$/;" s namespace:cuttlefish
+virtio_snd_pcm_set_params host/libs/audio_connector/shm_layout.h /^struct virtio_snd_pcm_set_params {$/;" s namespace:cuttlefish
+virtio_snd_pcm_status host/libs/audio_connector/shm_layout.h /^struct virtio_snd_pcm_status {$/;" s namespace:cuttlefish
+virtio_snd_pcm_xfer host/libs/audio_connector/shm_layout.h /^struct virtio_snd_pcm_xfer {$/;" s namespace:cuttlefish
+virtio_snd_query_info host/libs/audio_connector/shm_layout.h /^struct virtio_snd_query_info {$/;" s namespace:cuttlefish
+virtual_disk_paths host/libs/config/cuttlefish_config_instance.cpp /^std::vector<std::string> CuttlefishConfig::InstanceSpecific::virtual_disk_paths() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::vector<std::string>
+virtual_keyboard_ guest/commands/vsoc_input_service/vsoc_input_service.h /^ std::shared_ptr<VirtualKeyboard> virtual_keyboard_;$/;" m class:cuttlefish_input_service::VSoCInputService typeref:typename:std::shared_ptr<VirtualKeyboard>
+virtual_power_button_ guest/commands/vsoc_input_service/vsoc_input_service.h /^ std::shared_ptr<VirtualPowerButton> virtual_power_button_;$/;" m class:cuttlefish_input_service::VSoCInputService typeref:typename:std::shared_ptr<VirtualPowerButton>
+virtual_touchscreen_ guest/commands/vsoc_input_service/vsoc_input_service.h /^ std::shared_ptr<VirtualTouchScreen> virtual_touchscreen_;$/;" m class:cuttlefish_input_service::VSoCInputService typeref:typename:std::shared_ptr<VirtualTouchScreen>
+vm_manager host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::vm_manager() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+vm_manager host/libs/vm_manager/crosvm_manager.cpp /^namespace vm_manager {$/;" n namespace:cuttlefish file:
+vm_manager host/libs/vm_manager/crosvm_manager.h /^namespace vm_manager {$/;" n namespace:cuttlefish
+vm_manager host/libs/vm_manager/host_configuration.cpp /^namespace vm_manager {$/;" n namespace:cuttlefish file:
+vm_manager host/libs/vm_manager/host_configuration.h /^namespace vm_manager {$/;" n namespace:cuttlefish
+vm_manager host/libs/vm_manager/qemu_manager.cpp /^namespace vm_manager {$/;" n namespace:cuttlefish file:
+vm_manager host/libs/vm_manager/qemu_manager.h /^namespace vm_manager {$/;" n namespace:cuttlefish
+vm_manager host/libs/vm_manager/vm_manager.cpp /^namespace vm_manager {$/;" n namespace:cuttlefish file:
+vm_manager host/libs/vm_manager/vm_manager.h /^namespace vm_manager {$/;" n namespace:cuttlefish
+vmm_ host/commands/run_cvd/launch.cc /^ VmManager& vmm_;$/;" m class:cuttlefish::VmmCommands typeref:typename:VmManager & file:
+vmm_type host/commands/metrics/proto/cf_metrics_event.proto /^ optional VmmType vmm_type = 8;$/;" f message:cuttlefish.MetricsEvent typeref:typename:VmmType
+vmm_version host/commands/metrics/proto/cf_metrics_event.proto /^ optional string vmm_version = 9;$/;" f message:cuttlefish.MetricsEvent typeref:typename:string
+vnet common/libs/utils/network.cpp /^ std::uint8_t vnet[SIZE_OF_VIRTIO_NET_HDR_V1];$/;" m struct:cuttlefish::CompleteReleaseFrame typeref:typename:std::uint8_t[] file:
+voiceRadioTechChangedInd guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::voiceRadioTechChangedInd(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+voice_registration_status_ host/commands/modem_simulator/network_service.h /^ NetworkRegistrationStatus voice_registration_status_;$/;" m class:cuttlefish::NetworkService typeref:typename:NetworkRegistrationStatus
+vsock_guest_cid host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::vsock_guest_cid() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+w host/libs/confui/host_renderer.h /^ std::uint32_t x, y, w, h; \/\/ (x, y) is the top left$/;" m struct:cuttlefish::confui::ConfUiRenderer::Boundary typeref:typename:std::uint32_t
+w host/libs/wayland/wayland_surface.h /^ int32_t w;$/;" m struct:wayland::Surface::Region typeref:typename:int32_t
+w_ host/libs/confui/host_renderer.h /^ int w_;$/;" m class:cuttlefish::confui::TeeUiFrameWrapper typeref:typename:int
+waitForClose guest/hals/ril/reference-ril/reference-ril.c /^static void waitForClose()$/;" f typeref:typename:void file:
+waitForInstance tools/create_base_image.go /^func waitForInstance(PZ string) {$/;" f package:main
+waitForSupplicantState tests/wifi/src/com/android/cuttlefish/wifi/tests/WifiE2eTests.java /^ private void waitForSupplicantState(SupplicantState... expectedStates) {$/;" m class:WifiE2eTests file:
+waitTime guest/hals/ril/reference-libril/ril.h /^ int waitTime;$/;" m struct:__anon0bfbaecf9d08 typeref:typename:int
+waitTime guest/hals/ril/reference-libril/ril.h /^ int waitTime;$/;" m struct:__anon0bfbaecf9e08 typeref:typename:int
+waitYUVFrame guest/hals/camera/vsock_frame_provider.cpp /^bool VsockFrameProvider::waitYUVFrame(unsigned int max_wait_ms) {$/;" f class:cuttlefish::VsockFrameProvider typeref:typename:bool
+wait_for_instance tools/create_base_image_hostlib.sh /^wait_for_instance() {$/;" f
+wakeTimeoutCallback guest/hals/ril/reference-libril/ril.cpp /^wakeTimeoutCallback (void *param) {$/;" f namespace:android typeref:typename:void file:
+wakeType guest/hals/ril/reference-libril/ril.cpp /^ WakeType wakeType;$/;" m struct:android::__anonf9a2982a0108 typeref:typename:WakeType file:
+wants_ host/frontend/webrtc/lib/client_handler.cpp /^ rtc::VideoSinkWants wants_ = {};$/;" m class:cuttlefish::webrtc_streaming::ClientVideoTrackImpl typeref:typename:rtc::VideoSinkWants file:
+wasAckSent guest/hals/ril/reference-libril/ril_internal.h /^ int wasAckSent; \/\/ Indicates whether an ack was sent earlier$/;" m struct:android::RequestInfo typeref:typename:int
+watch_table guest/hals/ril/reference-libril/ril_event.cpp /^static struct ril_event * watch_table[MAX_FD_EVENTS];$/;" v typeref:struct:ril_event * [] file:
+wayland host/libs/wayland/wayland_compositor.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_compositor.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_dmabuf.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_dmabuf.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_seat.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_seat.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_server.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_server.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_shell.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_shell.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_subcompositor.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_subcompositor.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_surface.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_surface.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_surfaces.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_surfaces.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_utils.h /^namespace wayland {$/;" n
+wayland host/libs/wayland/wayland_virtio_gpu_metadata.cpp /^namespace wayland {$/;" n file:
+wayland host/libs/wayland/wayland_virtio_gpu_metadata.h /^namespace wayland {$/;" n
+wbr host/libs/allocd/request.h /^ wbr, \/\/ wireless bridge$/;" e enum:cuttlefish::IfaceType
+wcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoWcdma wcdma;$/;" m union:__anon0bfbaecf6e08::__anon0bfbaecf6f0a typeref:typename:RIL_CellInfoWcdma
+wcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoWcdma_v12 wcdma;$/;" m union:__anon0bfbaecf7008::__anon0bfbaecf710a typeref:typename:RIL_CellInfoWcdma_v12
+wcdma guest/hals/ril/reference-libril/ril.h /^ RIL_CellInfoWcdma_v12 wcdma;$/;" m union:__anon0bfbaecf7208::__anon0bfbaecf730a typeref:typename:RIL_CellInfoWcdma_v12
+wcdma_ber host/commands/modem_simulator/network_service.h /^ int wcdma_ber; \/* Refer gsm_ber *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+wcdma_rssi host/commands/modem_simulator/network_service.h /^ int wcdma_rssi; \/* Refer gsm_rssi *\/$/;" m struct:cuttlefish::NetworkService::SignalStrength typeref:typename:int
+weak_by_ptr_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::map<void*, std::weak_ptr<WsConnectionImpl>> weak_by_ptr_;$/;" m class:WsConnectionContextImpl typeref:typename:std::map<void *,std::weak_ptr<WsConnectionImpl>> file:
+weak_display_handler_ host/frontend/webrtc/connection_observer.cpp /^ std::weak_ptr<DisplayHandler> weak_display_handler_;$/;" m class:cuttlefish::ConnectionObserverImpl typeref:typename:std::weak_ptr<DisplayHandler> file:
+weak_display_handler_ host/frontend/webrtc/connection_observer.h /^ std::weak_ptr<DisplayHandler> weak_display_handler_;$/;" m class:cuttlefish::CfConnectionObserverFactory typeref:typename:std::weak_ptr<DisplayHandler>
+weak_this host/frontend/webrtc/lib/ws_connection.cpp /^ std::weak_ptr<WsConnectionImpl> weak_this;$/;" m struct:WsConnectionImpl::CreateConnectionSul typeref:typename:std::weak_ptr<WsConnectionImpl> file:
+webrtc host/frontend/webrtc/lib/local_recorder.h /^namespace webrtc {$/;" n
+webrtc_assets_dir host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::webrtc_assets_dir() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+webrtc_certs_dir host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::webrtc_certs_dir() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+webrtc_device_id host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::webrtc_device_id() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+webrtc_enable_adb_websocket host/libs/config/cuttlefish_config.cpp /^bool CuttlefishConfig::webrtc_enable_adb_websocket() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:bool
+webrtc_signaling host/frontend/webrtc_operator/constants/signaling_constants.h /^namespace webrtc_signaling {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/adb_handler.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/adb_handler.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/bluetooth_handler.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/bluetooth_handler.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/audio_device.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/audio_device.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/audio_frame_buffer.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/audio_sink.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/audio_source.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/audio_track_source_impl.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/audio_track_source_impl.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/camera_streamer.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/camera_streamer.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/client_handler.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/client_handler.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/connection_observer.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/local_recorder.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/local_recorder.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/port_range_socket_factory.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/port_range_socket_factory.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/streamer.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/streamer.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/utils.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/utils.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/video_frame_buffer.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/video_sink.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/video_track_source_impl.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/video_track_source_impl.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_streaming host/frontend/webrtc/lib/vp8only_encoder_factory.cpp /^namespace webrtc_streaming {$/;" n namespace:cuttlefish file:
+webrtc_streaming host/frontend/webrtc/lib/vp8only_encoder_factory.h /^namespace webrtc_streaming {$/;" n namespace:cuttlefish
+webrtc_tcp_port_range host/libs/config/cuttlefish_config.cpp /^std::pair<uint16_t, uint16_t> CuttlefishConfig::webrtc_tcp_port_range() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::pair<uint16_t,uint16_t>
+webrtc_udp_port_range host/libs/config/cuttlefish_config.cpp /^std::pair<uint16_t, uint16_t> CuttlefishConfig::webrtc_udp_port_range() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::pair<uint16_t,uint16_t>
+websocket host/frontend/webrtc_operator/assets/js/server_connector.js /^ #websocket;$/;" M class:WebsocketConnector
+websocketUrl host/frontend/webrtc_operator/assets/js/server_connector.js /^function websocketUrl(path) {$/;" f
+when host/commands/modem_simulator/thread_looper.h /^ std::chrono::steady_clock::time_point when;$/;" m struct:cuttlefish::ThreadLooper::Event typeref:typename:std::chrono::steady_clock::time_point
+width common/libs/device_config/device_config.proto /^ int32 width = 1;$/;" f message:cuttlefish.DeviceConfig.DisplayConfig typeref:typename:int32
+width host/frontend/webrtc/cvd_video_frame_buffer.cpp /^int CvdVideoFrameBuffer::width() const { return width_; }$/;" f class:cuttlefish::CvdVideoFrameBuffer typeref:typename:int
+width host/frontend/webrtc/lib/streamer.cpp /^ int width;$/;" m struct:cuttlefish::webrtc_streaming::__anonab9390d10111::DisplayDescriptor typeref:typename:int file:
+width host/frontend/webrtc/lib/video_track_source_impl.cpp /^ int width() const override { return frame_buffer_->width(); }$/;" f class:cuttlefish::webrtc_streaming::__anone9f9f83a0111::VideoFrameWrapper typeref:typename:int file:
+width host/libs/config/cuttlefish_config.h /^ int width;$/;" m struct:cuttlefish::CuttlefishConfig::DisplayConfig typeref:typename:int
+width_ guest/hals/camera/vsock_camera_metadata.h /^ int32_t width_;$/;" m class:android::hardware::camera::device::V3_4::implementation::VsockCameraMetadata typeref:typename:int32_t
+width_ host/frontend/webrtc/cvd_video_frame_buffer.h /^ const int width_;$/;" m class:cuttlefish::CvdVideoFrameBuffer typeref:typename:const int
+width_ host/frontend/webrtc/lib/video_track_source_impl.h /^ int width_;$/;" m class:cuttlefish::webrtc_streaming::VideoTrackSourceImpl typeref:typename:int
+wifi_mac_prefix host/libs/config/cuttlefish_config_instance.cpp /^int CuttlefishConfig::InstanceSpecific::wifi_mac_prefix() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:int
+wifi_tap_name host/libs/config/cuttlefish_config_instance.cpp /^std::string CuttlefishConfig::InstanceSpecific::wifi_tap_name() const {$/;" f class:cuttlefish::CuttlefishConfig::InstanceSpecific typeref:typename:std::string
+wireless_tap host/commands/assemble_cvd/alloc.h /^ IfaceData wireless_tap;$/;" m struct:cuttlefish::IfaceConfig typeref:typename:IfaceData
+wmediumd_api_server_socket host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::wmediumd_api_server_socket() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+wmediumd_config host/libs/config/cuttlefish_config.cpp /^std::string CuttlefishConfig::wmediumd_config() const {$/;" f class:cuttlefish::CuttlefishConfig typeref:typename:std::string
+wmediumd_socket_ host/libs/wmediumd_controller/wmediumd_controller.h /^ SharedFD wmediumd_socket_;$/;" m class:cuttlefish::WmediumdController typeref:typename:SharedFD
+worker_thread_ host/frontend/webrtc/lib/streamer.cpp /^ std::unique_ptr<rtc::Thread> worker_thread_;$/;" m class:cuttlefish::webrtc_streaming::Streamer::Impl typeref:typename:std::unique_ptr<rtc::Thread> file:
+wpa_driver_get_p2p_noa guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.c /^int wpa_driver_get_p2p_noa(void* priv, u8* buf, size_t len) {$/;" f typeref:typename:int
+wpa_driver_nl80211_driver_cmd guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.c /^int wpa_driver_nl80211_driver_cmd(void* priv, char* cmd, char* buf,$/;" f typeref:typename:int
+wpa_driver_set_ap_wps_p2p_ie guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.c /^int wpa_driver_set_ap_wps_p2p_ie(void* priv, const struct wpabuf* beacon,$/;" f typeref:typename:int
+wpa_driver_set_p2p_noa guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.c /^int wpa_driver_set_p2p_noa(void* priv, u8 count, int start, int duration) {$/;" f typeref:typename:int
+wpa_driver_set_p2p_ps guest/libs/wpa_supplicant_8_lib/driver_cmd_nl80211.c /^int wpa_driver_set_p2p_ps(void* priv, int legacy_ps, int opp_ps, int ctwindow) {$/;" f typeref:typename:int
+wrapped_ host/commands/secure_env/encrypted_serializable.h /^ keymaster::Serializable& wrapped_;$/;" m class:cuttlefish::EncryptedSerializable typeref:typename:keymaster::Serializable &
+wrapped_ host/commands/secure_env/hmac_serializable.h /^ Serializable* wrapped_;$/;" m class:cuttlefish::HmacSerializable typeref:typename:Serializable *
+wrapped_ host/commands/secure_env/proxy_keymaster_context.h /^ KeymasterContext& wrapped_;$/;" m class:cuttlefish::ProxyKeymasterContext typeref:typename:KeymasterContext &
+writeCtrlZ guest/hals/ril/reference-ril/atchannel.c /^static int writeCtrlZ (const char *s)$/;" f typeref:typename:int file:
+writeJsonEventMessage guest/hals/camera/vsock_frame_provider.cpp /^bool writeJsonEventMessage($/;" f namespace:cuttlefish::__anon2426deb60111 typeref:typename:bool
+writeSmsToRuim guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+writeSmsToRuimResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::writeSmsToRuimResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+writeSmsToSim guest/hals/ril/reference-libril/ril_service.cpp /^Return<void> RadioImpl_1_6::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {$/;" f class:RadioImpl_1_6 typeref:typename:Return<void>
+writeSmsToSimResponse guest/hals/ril/reference-libril/ril_service.cpp /^int radio_1_6::writeSmsToSimResponse(int slotId,$/;" f class:radio_1_6 typeref:typename:int
+write_mutex host/commands/modem_simulator/channel_monitor.h /^ std::mutex write_mutex;$/;" m class:cuttlefish::Client typeref:typename:std::mutex
+write_mutex_ common/libs/utils/vsock_connection.h /^ std::recursive_mutex write_mutex_;$/;" m class:cuttlefish::VsockConnection typeref:typename:std::recursive_mutex
+write_pipe_ host/commands/modem_simulator/channel_monitor.h /^ cuttlefish::SharedFD write_pipe_;$/;" m class:cuttlefish::ChannelMonitor typeref:typename:cuttlefish::SharedFD
+write_queue_ host/commands/console_forwarder/main.cpp /^ write_queue_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:std::deque<std::pair<SharedFD,std::shared_ptr<std::vector<char>>>> file:
+write_queue_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::deque<WsBuffer> write_queue_;$/;" m class:WsConnectionImpl typeref:typename:std::deque<WsBuffer> file:
+write_queue_mutex_ host/commands/console_forwarder/main.cpp /^ std::mutex write_queue_mutex_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:std::mutex file:
+write_queue_mutex_ host/frontend/webrtc/lib/ws_connection.cpp /^ std::mutex write_queue_mutex_;$/;" m class:WsConnectionImpl typeref:typename:std::mutex file:
+writeline guest/hals/ril/reference-ril/atchannel.c /^static int writeline (const char *s)$/;" f typeref:typename:int file:
+writer_thread_ host/commands/console_forwarder/main.cpp /^ std::thread writer_thread_;$/;" m class:cuttlefish::ConsoleForwarder typeref:typename:std::thread file:
+wsSendJson host/frontend/webrtc_operator/assets/js/server_connector.js /^ async #wsSendJson(obj) {$/;" m class:WebsocketConnector
+wsi_ host/frontend/webrtc/lib/ws_connection.cpp /^ struct lws* wsi_;$/;" m class:WsConnectionImpl typeref:struct:lws * file:
+wsi_ host/libs/websocket/websocket_handler.h /^ struct lws* wsi_;$/;" m class:cuttlefish::DynHandler typeref:struct:lws *
+wsi_ host/libs/websocket/websocket_handler.h /^ struct lws* wsi_;$/;" m class:cuttlefish::WebSocketHandler typeref:struct:lws *
+wtap host/libs/allocd/request.h /^ wtap, \/\/ wireless tap$/;" e enum:cuttlefish::IfaceType
+x host/frontend/webrtc/connection_observer.cpp /^ int32_t x;$/;" m struct:cuttlefish::multitouch_slot typeref:typename:int32_t file:
+x host/libs/confui/host_renderer.h /^ std::uint32_t x, y, w, h; \/\/ (x, y) is the top left$/;" m struct:cuttlefish::confui::ConfUiRenderer::Boundary typeref:typename:std::uint32_t
+x host/libs/wayland/wayland_surface.h /^ int32_t x;$/;" m struct:wayland::Surface::Region typeref:typename:int32_t
+x_ common/libs/confui/protocol_types.h /^ int x_;$/;" m class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:int
+x_res shared/config/config_foldable.json /^ "x_res" : 1768,$/;" n
+x_res shared/config/config_phone.json /^ "x_res" : 720,$/;" n
+x_res shared/config/config_tablet.json /^ "x_res" : 2560,$/;" n
+x_res shared/config/config_tv.json /^ "x_res" : 1920,$/;" n
+xdg_popup_destroy host/libs/wayland/wayland_shell.cpp /^void xdg_popup_destroy(wl_client*, wl_resource* popup) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_popup_grab host/libs/wayland/wayland_shell.cpp /^void xdg_popup_grab(wl_client*, wl_resource* popup, wl_resource* seat,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_popup_implementation host/libs/wayland/wayland_shell.cpp /^const struct xdg_popup_interface xdg_popup_implementation = {$/;" v namespace:wayland::__anond268d4620111 typeref:typename:const struct xdg_popup_interface
+xdg_positioner_destroy host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_destroy(wl_client*, wl_resource* positioner) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_positioner_implementation host/libs/wayland/wayland_shell.cpp /^const struct xdg_positioner_interface xdg_positioner_implementation = {$/;" v namespace:wayland::__anond268d4620111 typeref:typename:const struct xdg_positioner_interface
+xdg_positioner_set_anchor host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_set_anchor(wl_client*, wl_resource* positioner,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_positioner_set_anchor_rect host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_set_anchor_rect(wl_client*, wl_resource* positioner,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_positioner_set_constraint_adjustment host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_set_constraint_adjustment(wl_client*,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_positioner_set_gravity host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_set_gravity(wl_client*, wl_resource* positioner,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_positioner_set_offset host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_set_offset(wl_client*, wl_resource* positioner, int32_t x,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_positioner_set_size host/libs/wayland/wayland_shell.cpp /^void xdg_positioner_set_size(wl_client*, wl_resource* positioner, int32_t w,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_shell_create_positioner host/libs/wayland/wayland_shell.cpp /^void xdg_shell_create_positioner(wl_client* client, wl_resource* shell,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_shell_destroy host/libs/wayland/wayland_shell.cpp /^void xdg_shell_destroy(wl_client*, wl_resource* shell) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_shell_get_xdg_surface host/libs/wayland/wayland_shell.cpp /^void xdg_shell_get_xdg_surface(wl_client* client, wl_resource* shell,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_shell_implementation host/libs/wayland/wayland_shell.cpp /^const struct xdg_wm_base_interface xdg_shell_implementation = {$/;" v namespace:wayland::__anond268d4620111 typeref:typename:const struct xdg_wm_base_interface
+xdg_shell_pong host/libs/wayland/wayland_shell.cpp /^void xdg_shell_pong(wl_client*, wl_resource* shell, uint32_t serial) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_surface_ack_configure host/libs/wayland/wayland_shell.cpp /^void xdg_surface_ack_configure(wl_client*, wl_resource* surface,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_surface_destroy host/libs/wayland/wayland_shell.cpp /^void xdg_surface_destroy(wl_client*, wl_resource* surface) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_surface_get_popup host/libs/wayland/wayland_shell.cpp /^void xdg_surface_get_popup(wl_client* client, wl_resource* surface, uint32_t id,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_surface_get_toplevel host/libs/wayland/wayland_shell.cpp /^void xdg_surface_get_toplevel(wl_client* client, wl_resource* surface,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_surface_implementation host/libs/wayland/wayland_shell.cpp /^const struct xdg_surface_interface xdg_surface_implementation = {$/;" v namespace:wayland::__anond268d4620111 typeref:typename:const struct xdg_surface_interface
+xdg_surface_set_window_geometry host/libs/wayland/wayland_shell.cpp /^void xdg_surface_set_window_geometry(wl_client*, wl_resource* surface,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_destroy host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_destroy(wl_client*, wl_resource* toplevel) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_implementation host/libs/wayland/wayland_shell.cpp /^const struct xdg_toplevel_interface xdg_toplevel_implementation = {$/;" v namespace:wayland::__anond268d4620111 typeref:typename:const struct xdg_toplevel_interface
+xdg_toplevel_move host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_move(wl_client*, wl_resource* toplevel, wl_resource* seat,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_resize host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_resize(wl_client*, wl_resource* toplevel, wl_resource* seat,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_app_id host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_app_id(wl_client*, wl_resource* toplevel,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_fullscreen host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_fullscreen(wl_client*, wl_resource* toplevel,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_max_size host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_max_size(wl_client*, wl_resource* toplevel, int32_t w,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_maximized host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_maximized(wl_client*, wl_resource* toplevel) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_min_size host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_min_size(wl_client*, wl_resource* toplevel, int32_t w,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_minimized host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_minimized(wl_client*, wl_resource* toplevel) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_parent host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_parent(wl_client*, wl_resource* toplevel,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_set_title host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_set_title(wl_client*, wl_resource* toplevel,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_show_window_menu host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_show_window_menu(wl_client*, wl_resource* toplevel,$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_unset_fullscreen host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_unset_fullscreen(wl_client*, wl_resource* toplevel) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xdg_toplevel_unset_maximized host/libs/wayland/wayland_shell.cpp /^void xdg_toplevel_unset_maximized(wl_client*, wl_resource* toplevel) {$/;" f namespace:wayland::__anond268d4620111 typeref:typename:void
+xi shared/auto/audio_policy_configuration.xml /^<audioPolicyConfiguration version="1.0" xmlns:xi="http:\/\/www.w3.org\/2001\/XInclude">$/;" n uri:http://www.w3.org/2001/XInclude
+xid common/libs/utils/network.cpp /^ __be32 xid;$/;" m struct:cuttlefish::Dhcp4ReleaseMessage typeref:typename:__be32 file:
+xliff host/commands/modem_simulator/files/numeric_operator.xml /^<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">$/;" n uri:urn:oasis:names:tc:xliff:document:1.2
+xliff shared/auto/overlay/frameworks/base/core/res/res/values/config.xml /^<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">$/;" n uri:urn:oasis:names:tc:xliff:document:1.2
+xliff shared/foldable/overlay/frameworks/base/core/res/res/values/config.xml /^<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">$/;" n uri:urn:oasis:names:tc:xliff:document:1.2
+xliff shared/pc/overlay/frameworks/base/core/res/res/values/config.xml /^<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">$/;" n uri:urn:oasis:names:tc:xliff:document:1.2
+xliff shared/phone/overlays/core/res/values/config.xml /^<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">$/;" n uri:urn:oasis:names:tc:xliff:document:1.2
+xmlChildWithName host/commands/start/flag_forwarder.cc /^xmlNodePtr xmlChildWithName(xmlNodePtr node, const std::string& name) {$/;" f namespace:__anon4552bec90111 typeref:typename:xmlNodePtr
+xmlContent host/commands/start/flag_forwarder.cc /^std::string xmlContent(xmlNodePtr node) {$/;" f namespace:__anon4552bec90111 typeref:typename:std::string
+xsgetn common/libs/fs/shared_fd_stream.cpp /^std::streamsize SharedFDStreambuf::xsgetn(char* dst, std::streamsize count) {$/;" f class:cuttlefish::SharedFDStreambuf typeref:typename:std::streamsize
+xsputn common/libs/fs/shared_fd_stream.cpp /^std::streamsize SharedFDStreambuf::xsputn(const char* src,$/;" f class:cuttlefish::SharedFDStreambuf typeref:typename:std::streamsize
+y host/frontend/webrtc/connection_observer.cpp /^ int32_t y;$/;" m struct:cuttlefish::multitouch_slot typeref:typename:int32_t file:
+y host/libs/confui/host_renderer.h /^ std::uint32_t x, y, w, h; \/\/ (x, y) is the top left$/;" m struct:cuttlefish::confui::ConfUiRenderer::Boundary typeref:typename:std::uint32_t
+y host/libs/wayland/wayland_surface.h /^ int32_t y;$/;" m struct:wayland::Surface::Region typeref:typename:int32_t
+y_ common/libs/confui/protocol_types.h /^ int y_;$/;" m class:cuttlefish::confui::ConfUiUserTouchMessage typeref:typename:int
+y_ host/frontend/webrtc/cvd_video_frame_buffer.h /^ std::vector<std::uint8_t> y_;$/;" m class:cuttlefish::CvdVideoFrameBuffer typeref:typename:std::vector<std::uint8_t>
+y_res shared/config/config_foldable.json /^ "y_res" : 2208,$/;" n
+y_res shared/config/config_phone.json /^ "y_res" : 1280,$/;" n
+y_res shared/config/config_tablet.json /^ "y_res" : 1800,$/;" n
+y_res shared/config/config_tv.json /^ "y_res" : 1080,$/;" n
+yuv_frame_updated_ guest/hals/camera/vsock_frame_provider.h /^ std::condition_variable yuv_frame_updated_;$/;" m class:cuttlefish::VsockFrameProvider typeref:typename:std::condition_variable
+zwp_linux_buffer_params_implementation host/libs/wayland/wayland_dmabuf.cpp /^ zwp_linux_buffer_params_implementation = {$/;" v namespace:wayland::__anon8f5be4990111 typeref:typename:const struct zwp_linux_buffer_params_v1_interface
+zwp_linux_dmabuf_v1_implementation host/libs/wayland/wayland_dmabuf.cpp /^ zwp_linux_dmabuf_v1_implementation = {$/;" v namespace:wayland::__anon8f5be4990111 typeref:typename:const struct zwp_linux_dmabuf_v1_interface
+~AdbChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^AdbChannelHandler::~AdbChannelHandler() { adb_channel_->UnregisterObserver(); }$/;" f class:cuttlefish::webrtc_streaming::AdbChannelHandler
+~AdbHandler host/frontend/webrtc/adb_handler.cpp /^AdbHandler::~AdbHandler() {$/;" f class:cuttlefish::webrtc_streaming::AdbHandler
+~Archive common/libs/utils/archive.cpp /^Archive::~Archive() {$/;" f class:cuttlefish::Archive
+~AudioCommand host/libs/audio_connector/commands.cpp /^AudioCommand::~AudioCommand() {$/;" f class:cuttlefish::AudioCommand
+~BluetoothChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^BluetoothChannelHandler::~BluetoothChannelHandler() {$/;" f class:cuttlefish::webrtc_streaming::BluetoothChannelHandler
+~BluetoothHandler host/frontend/webrtc/bluetooth_handler.cpp /^BluetoothHandler::~BluetoothHandler() {$/;" f class:cuttlefish::webrtc_streaming::BluetoothHandler
+~CachedStreamBuffer guest/hals/camera/cached_stream_buffer.cpp /^CachedStreamBuffer::~CachedStreamBuffer() {$/;" f class:android::hardware::camera::device::V3_4::implementation::CachedStreamBuffer
+~CameraChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^CameraChannelHandler::~CameraChannelHandler() {$/;" f class:cuttlefish::webrtc_streaming::CameraChannelHandler
+~CameraStreamer host/frontend/webrtc/lib/camera_streamer.cpp /^CameraStreamer::~CameraStreamer() { Disconnect(); }$/;" f class:cuttlefish::webrtc_streaming::CameraStreamer
+~ChannelMonitor host/commands/modem_simulator/channel_monitor.cpp /^ChannelMonitor::~ChannelMonitor() {$/;" f class:cuttlefish::ChannelMonitor
+~ClientHandler host/frontend/webrtc/lib/client_handler.cpp /^ClientHandler::~ClientHandler() {$/;" f class:cuttlefish::webrtc_streaming::ClientHandler
+~Closer host/libs/graphics_detector/graphics_detector.cpp /^ ~Closer() { on_close_(); }$/;" f class:cuttlefish::__anon29a199ff0111::Closer file:
+~Command common/libs/utils/subprocess.cpp /^Command::~Command() {$/;" f class:cuttlefish::Command
+~ConnectionObserverImpl host/frontend/webrtc/connection_observer.cpp /^ virtual ~ConnectionObserverImpl() {$/;" f class:cuttlefish::ConnectionObserverImpl file:
+~ControlChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^ControlChannelHandler::~ControlChannelHandler() {$/;" f class:cuttlefish::webrtc_streaming::ControlChannelHandler
+~ControlMessage common/libs/utils/unix_sockets.cpp /^ControlMessage::~ControlMessage() {$/;" f class:cuttlefish::ControlMessage
+~CurlWrapperImpl host/commands/fetcher/curl_wrapper.cc /^ ~CurlWrapperImpl() { curl_easy_cleanup(curl_); }$/;" f class:cuttlefish::__anondfffca8d0111::CurlWrapperImpl file:
+~CvdBootStateMachine host/commands/run_cvd/boot_state_machine.cc /^ ~CvdBootStateMachine() { boot_event_handler_.join(); }$/;" f class:cuttlefish::__anone7ed366f0111::CvdBootStateMachine file:
+~CvdVideoFrameBuffer host/frontend/webrtc/cvd_video_frame_buffer.cpp /^CvdVideoFrameBuffer::~CvdVideoFrameBuffer() {$/;" f class:cuttlefish::CvdVideoFrameBuffer
+~Feature host/libs/config/feature.cpp /^Feature::~Feature() {}$/;" f class:cuttlefish::Feature
+~FetcherConfig host/libs/config/fetcher_config.cpp /^FetcherConfig::~FetcherConfig() {$/;" f class:cuttlefish::FetcherConfig
+~FileInstance common/libs/fs/shared_fd.h /^ virtual ~FileInstance() { Close(); }$/;" f class:cuttlefish::FileInstance
+~GnssGrpcProxyServiceImpl host/commands/gnss_grpc_proxy/gnss_grpc_proxy.cpp /^ ~GnssGrpcProxyServiceImpl() {$/;" f class:GnssGrpcProxyServiceImpl file:
+~GuestSession guest/hals/confirmationui/guest_session.h /^ ~GuestSession() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::GuestSession
+~HostServer host/libs/confui/host_server.h /^ virtual ~HostServer() {}$/;" f class:cuttlefish::confui::HostServer
+~Impl host/commands/secure_env/in_process_tpm.cpp /^ ~Impl() {$/;" f class:cuttlefish::InProcessTpm::Impl file:
+~InputChannelHandler host/frontend/webrtc/lib/client_handler.cpp /^InputChannelHandler::~InputChannelHandler() {$/;" f class:cuttlefish::webrtc_streaming::InputChannelHandler
+~KernelLogEventsHandler host/frontend/webrtc/kernel_log_events_handler.cpp /^KernelLogEventsHandler::~KernelLogEventsHandler() {$/;" f class:cuttlefish::KernelLogEventsHandler
+~KmParamSet guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^ ~KmParamSet() { delete[] params; }$/;" f class:keymaster::V4_1::__anon49de69e60111::KmParamSet file:
+~ModemSimulator host/commands/modem_simulator/modem_simulator.cpp /^ModemSimulator::~ModemSimulator() {$/;" f class:cuttlefish::ModemSimulator
+~NetlinkClient common/libs/net/netlink_client.h /^ virtual ~NetlinkClient() {}$/;" f class:cuttlefish::NetlinkClient
+~ObjectSlot host/commands/secure_env/tpm_resource_manager.cpp /^TpmResourceManager::ObjectSlot::~ObjectSlot() {$/;" f class:cuttlefish::TpmResourceManager::ObjectSlot
+~ReleaseFence guest/hals/camera/cached_stream_buffer.cpp /^ReleaseFence::~ReleaseFence() {$/;" f class:android::hardware::camera::device::V3_4::implementation::ReleaseFence
+~RemoteGateKeeperDevice guest/hals/gatekeeper/remote/remote_gatekeeper.cpp /^RemoteGateKeeperDevice::~RemoteGateKeeperDevice() {$/;" f class:gatekeeper::RemoteGateKeeperDevice
+~RemoteKeyMintDevice guest/hals/keymint/remote/remote_keymint_device.cpp /^RemoteKeyMintDevice::~RemoteKeyMintDevice() {}$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintDevice
+~RemoteKeyMintOperation guest/hals/keymint/remote/remote_keymint_operation.cpp /^RemoteKeyMintOperation::~RemoteKeyMintOperation() {$/;" f class:aidl::android::hardware::security::keymint::RemoteKeyMintOperation
+~RemoteKeymaster guest/hals/keymaster/remote/remote_keymaster.cpp /^RemoteKeymaster::~RemoteKeymaster() {$/;" f class:keymaster::RemoteKeymaster
+~RemoteKeymaster guest/hals/keymint/remote/remote_keymaster.cpp /^RemoteKeymaster::~RemoteKeymaster() {}$/;" f class:keymaster::RemoteKeymaster
+~RemoteKeymaster4Device guest/hals/keymaster/remote/remote_keymaster4_device.cpp /^RemoteKeymaster4Device::~RemoteKeymaster4Device() {}$/;" f class:keymaster::V4_1::RemoteKeymaster4Device
+~RemoteSecureClock guest/hals/keymint/remote/remote_secure_clock.cpp /^RemoteSecureClock::~RemoteSecureClock() {}$/;" f class:aidl::android::hardware::security::secureclock::RemoteSecureClock
+~RemoteSharedSecret guest/hals/keymint/remote/remote_shared_secret.cpp /^RemoteSharedSecret::~RemoteSharedSecret() {}$/;" f class:aidl::android::hardware::security::sharedsecret::RemoteSharedSecret
+~ResourceManager host/libs/allocd/resource_manager.cpp /^ResourceManager::~ResourceManager() {$/;" f class:cuttlefish::ResourceManager
+~RilSocket guest/hals/ril/reference-libril/RilSocket.h /^ virtual ~RilSocket(){}$/;" f class:RilSocket
+~ScopedMMap common/libs/fs/shared_fd.cpp /^ScopedMMap::~ScopedMMap() {$/;" f class:cuttlefish::ScopedMMap
+~Session host/libs/allocd/resource_manager.h /^ ~Session() { ReleaseAllResources(); }$/;" f class:cuttlefish::Session
+~ShmBuffer host/libs/audio_connector/buffers.cpp /^ShmBuffer::~ShmBuffer() {$/;" f class:cuttlefish::ShmBuffer
+~SocketSender common/frontend/socket_vsock_proxy/main.cpp /^ ~SocketSender() {$/;" f class:__anon913036200111::SocketSender file:
+~SoftGateKeeper host/commands/secure_env/soft_gatekeeper.h /^ virtual ~SoftGateKeeper() {}$/;" f class:gatekeeper::SoftGateKeeper
+~SysVMessageQueue host/libs/msg_queue/msg_queue.cc /^SysVMessageQueue::~SysVMessageQueue(void) {$/;" f class:cuttlefish::SysVMessageQueue
+~TestTpm host/commands/secure_env/test_tpm.cpp /^TestTpm::~TestTpm() { Esys_Finalize(&esys_); }$/;" f class:cuttlefish::TestTpm
+~ThreadJoiner common/libs/utils/subprocess.cpp /^ ~ThreadJoiner() {$/;" f class:cuttlefish::ThreadJoiner file:
+~ThreadLooper host/commands/modem_simulator/thread_looper.cpp /^ThreadLooper::~ThreadLooper() { Stop(); }$/;" f class:cuttlefish::ThreadLooper
+~TpmKeymasterEnforcement host/commands/secure_env/tpm_keymaster_enforcement.cpp /^TpmKeymasterEnforcement::~TpmKeymasterEnforcement() {$/;" f class:cuttlefish::TpmKeymasterEnforcement
+~TpmResourceManager host/commands/secure_env/tpm_resource_manager.cpp /^TpmResourceManager::~TpmResourceManager() {$/;" f class:cuttlefish::TpmResourceManager
+~TrustyConfirmationUI guest/hals/confirmationui/TrustyConfirmationUI.cpp /^TrustyConfirmationUI::~TrustyConfirmationUI() {$/;" f class:android::hardware::confirmationui::V1_0::implementation::TrustyConfirmationUI
+~VirtualDeviceBase guest/commands/vsoc_input_service/virtual_device_base.cpp /^VirtualDeviceBase::~VirtualDeviceBase() {$/;" f class:VirtualDeviceBase
+~VsockCameraDevice guest/hals/camera/vsock_camera_device_3_4.cpp /^VsockCameraDevice::~VsockCameraDevice() { ALOGI("%s", __FUNCTION__); }$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDevice
+~VsockCameraDeviceSession guest/hals/camera/vsock_camera_device_session_3_4.cpp /^VsockCameraDeviceSession::~VsockCameraDeviceSession() { close(); }$/;" f class:android::hardware::camera::device::V3_4::implementation::VsockCameraDeviceSession
+~VsockCameraProvider guest/hals/camera/vsock_camera_provider_2_7.cpp /^VsockCameraProvider::~VsockCameraProvider() {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraProvider
+~VsockCameraServer guest/hals/camera/vsock_camera_server.cpp /^VsockCameraServer::~VsockCameraServer() {$/;" f class:android::hardware::camera::provider::V2_7::implementation::VsockCameraServer
+~VsockConnection common/libs/utils/vsock_connection.cpp /^VsockConnection::~VsockConnection() { Disconnect(); }$/;" f class:cuttlefish::VsockConnection
+~VsockFrameProvider guest/hals/camera/vsock_frame_provider.cpp /^VsockFrameProvider::~VsockFrameProvider() { stop(); }$/;" f class:cuttlefish::VsockFrameProvider
+~VsockServerConnection common/libs/utils/vsock_connection.cpp /^VsockServerConnection::~VsockServerConnection() { ServerShutdown(); }$/;" f class:cuttlefish::VsockServerConnection
+~WaylandServer host/libs/wayland/wayland_server.cpp /^WaylandServer::~WaylandServer() {$/;" f class:wayland::WaylandServer
+~WmediumdController host/libs/wmediumd_controller/wmediumd_controller.h /^ virtual ~WmediumdController() {}$/;" f class:cuttlefish::WmediumdController
+~WmediumdMessage host/libs/wmediumd_controller/wmediumd_api_protocol.h /^ virtual ~WmediumdMessage() {}$/;" f class:cuttlefish::WmediumdMessage
+~WsConnectionContextImpl host/frontend/webrtc/lib/ws_connection.cpp /^WsConnectionContextImpl::~WsConnectionContextImpl() {$/;" f class:WsConnectionContextImpl
+~WsConnectionImpl host/frontend/webrtc/lib/ws_connection.cpp /^WsConnectionImpl::~WsConnectionImpl() {$/;" f class:WsConnectionImpl
diff --git a/tests/hal/hal_implementation_test.cpp b/tests/hal/hal_implementation_test.cpp
index d05f077..66b8225 100644
--- a/tests/hal/hal_implementation_test.cpp
+++ b/tests/hal/hal_implementation_test.cpp
@@ -17,15 +17,16 @@
#include <android-base/logging.h>
#include <android-base/strings.h>
#include <gtest/gtest.h>
-#include <hidl/metadata.h>
#include <hidl-util/FQName.h>
+#include <hidl/metadata.h>
#include <vintf/VintfObject.h>
using namespace android;
+// clang-format off
static const std::set<std::string> kKnownMissingHidl = {
- "[email protected]",
"[email protected]",
+ "[email protected]", // deprecated, see b/141930622
"[email protected]", // deprecated, see b/37226359
"[email protected]",
"[email protected]",
@@ -47,12 +48,13 @@
"[email protected]",
"[email protected]",
"[email protected]",
+ "[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
- "[email protected]",
"[email protected]", // deprecated, see b/149050985, b/149050733
"[email protected]",
+ "[email protected]", // deprecated, see b/205760700
"[email protected]", // is sub-interface of gnss
"[email protected]",
"[email protected]",
@@ -62,7 +64,8 @@
"[email protected]",
"[email protected]",
"[email protected]", // converted to AIDL, see b/177470478
- "[email protected]",
+ "[email protected]", // converted to AIDL, see b/177269435
+ "[email protected]", // converted to AIDL, see b/205000342
"[email protected]",
"[email protected]", // Replaced by KeyMint
"[email protected]",
@@ -89,219 +92,314 @@
"[email protected]",
"[email protected]",
"[email protected]",
- "[email protected]",
- "[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
+ "[email protected]", // Converted to AIDL (see b/170260236)
+};
+// clang-format on
+
+struct VersionedAidlPackage {
+ std::string name;
+ size_t version;
+ bool operator<(const VersionedAidlPackage& rhs) const {
+ return (name < rhs.name || (name == rhs.name && version < rhs.version));
+ }
};
-static const std::set<std::string> kKnownMissingAidl = {
+static const std::set<VersionedAidlPackage> kKnownMissingAidl = {
// types-only packages, which never expect a default implementation
- "android.hardware.biometrics.common.",
- "android.hardware.common.",
- "android.hardware.common.fmq.",
- "android.hardware.graphics.common.",
+ {"android.hardware.audio.common.", 1},
+ {"android.hardware.biometrics.common.", 1},
+ {"android.hardware.common.", 1},
+ {"android.hardware.common.", 2},
+ {"android.hardware.common.fmq.", 1},
+ {"android.hardware.graphics.common.", 1},
+ {"android.hardware.graphics.common.", 2},
+
+ // No implementations on cuttlefish for wifi aidl hal
+ {"android.hardware.wifi.hostapd.", 1},
+
+ // No implementations on cuttlefish for omapi aidl hal
+ {"android.se.omapi.", 1},
+
+ // Temporarily treat the dice hal default implementation as missing until it
+ // and its dependencies have landed. b/198197213
+ {"android.hardware.security.dice.", 1},
// These KeyMaster types are in an AIDL types-only HAL because they're used
// by the Identity Credential AIDL HAL. Remove this when fully porting
// KeyMaster to AIDL.
- "android.hardware.keymaster.",
+ {"android.hardware.keymaster.", 1},
+ {"android.hardware.keymaster.", 2},
+ {"android.hardware.keymaster.", 3},
+
+ {"android.media.audio.common.", 1},
// These types are only used in Automotive.
- "android.automotive.computepipe.registry.",
- "android.automotive.computepipe.runner.",
- "android.automotive.watchdog.",
- "android.frameworks.automotive.powerpolicy.",
- "android.frameworks.automotive.telemetry.",
- "android.hardware.automotive.audiocontrol.",
- "android.hardware.automotive.occupant_awareness.",
+ {"android.automotive.computepipe.registry.", 1},
+ {"android.automotive.computepipe.runner.", 1},
+ {"android.automotive.watchdog.", 2},
+ {"android.automotive.watchdog.", 3},
+ {"android.frameworks.automotive.powerpolicy.", 1},
+ {"android.frameworks.automotive.telemetry.", 1},
+ {"android.hardware.automotive.audiocontrol.", 1},
+ {"android.hardware.automotive.occupant_awareness.", 1},
+
+ // No implementation in AOSP for supplicant aidl hal (b/210166896)
+ {"android.hardware.wifi.supplicant.", 1},
+
+ // These versions need to be implemented (b/198331776)
+ {"android.hardware.radio.", 1},
+ {"android.hardware.radio.data.", 1},
+ {"android.hardware.radio.messaging.", 1},
+ {"android.hardware.radio.modem.", 1},
+ {"android.hardware.radio.network.", 1},
+ {"android.hardware.radio.sim.", 1},
+ {"android.hardware.radio.voice.", 1},
+
+ // This version needs to be implemented (b/198331886)
+ {"android.hardware.radio.config.", 1},
+
+ // These versions need to be implemented (b/203490261)
+ {"android.hardware.bluetooth.audio.", 1},
+};
+
+static const std::set<VersionedAidlPackage> kComingSoonAidl = {
+ {"android.hardware.wifi.hostapd.", 1},
};
// AOSP packages which are never considered
static bool isHidlPackageConsidered(const FQName& name) {
- static std::vector<std::string> gAospExclude = {
- // packages not implemented now that we never expect to be implemented
- "android.hardware.tests",
- // packages not registered with hwservicemanager, usually sub-interfaces
- "android.hardware.camera.device",
- };
- for (const std::string& package : gAospExclude) {
- if (name.inPackage(package)) {
- return false;
- }
+ static std::vector<std::string> gAospExclude = {
+ // packages not implemented now that we never expect to be implemented
+ "android.hardware.tests",
+ // packages not registered with hwservicemanager, usually sub-interfaces
+ "android.hardware.camera.device",
+ };
+ for (const std::string& package : gAospExclude) {
+ if (name.inPackage(package)) {
+ return false;
}
- return true;
+ }
+ return true;
}
static bool isAospHidlInterface(const FQName& name) {
- static const std::vector<std::string> kAospPackages = {
- "android.hidl",
- "android.hardware",
- "android.frameworks",
- "android.system",
- };
- for (const std::string& package : kAospPackages) {
- if (name.inPackage(package)) {
- return true;
- }
+ static const std::vector<std::string> kAospPackages = {
+ "android.hidl",
+ "android.hardware",
+ "android.frameworks",
+ "android.system",
+ };
+ for (const std::string& package : kAospPackages) {
+ if (name.inPackage(package)) {
+ return true;
}
- return false;
+ }
+ return false;
}
static std::set<FQName> allTreeHidlInterfaces() {
- std::set<FQName> ret;
- for (const auto& iface : HidlInterfaceMetadata::all()) {
- FQName f;
- CHECK(f.setTo(iface.name)) << iface.name;
- ret.insert(f);
- }
- return ret;
+ std::set<FQName> ret;
+ for (const auto& iface : HidlInterfaceMetadata::all()) {
+ FQName f;
+ CHECK(f.setTo(iface.name)) << iface.name;
+ ret.insert(f);
+ }
+ return ret;
}
static std::set<FQName> allHidlManifestInterfaces() {
- std::set<FQName> ret;
- auto setInserter = [&] (const vintf::ManifestInstance& i) -> bool {
- if (i.format() != vintf::HalFormat::HIDL) {
- return true; // continue
- }
- ret.insert(i.getFqInstance().getFqName());
- return true; // continue
- };
- vintf::VintfObject::GetDeviceHalManifest()->forEachInstance(setInserter);
- vintf::VintfObject::GetFrameworkHalManifest()->forEachInstance(setInserter);
- return ret;
+ std::set<FQName> ret;
+ auto setInserter = [&](const vintf::ManifestInstance& i) -> bool {
+ if (i.format() != vintf::HalFormat::HIDL) {
+ return true; // continue
+ }
+ ret.insert(i.getFqInstance().getFqName());
+ return true; // continue
+ };
+ vintf::VintfObject::GetDeviceHalManifest()->forEachInstance(setInserter);
+ vintf::VintfObject::GetFrameworkHalManifest()->forEachInstance(setInserter);
+ return ret;
}
static bool isAospAidlInterface(const std::string& name) {
- return base::StartsWith(name, "android.") &&
- !base::StartsWith(name, "android.hardware.tests.") &&
- !base::StartsWith(name, "android.aidl.tests");
+ return base::StartsWith(name, "android.") &&
+ !base::StartsWith(name, "android.hardware.tests.") &&
+ !base::StartsWith(name, "android.aidl.tests");
}
-static std::set<std::string> allAidlManifestInterfaces() {
- std::set<std::string> ret;
- auto setInserter = [&] (const vintf::ManifestInstance& i) -> bool {
- if (i.format() != vintf::HalFormat::AIDL) {
- return true; // continue
- }
- ret.insert(i.package() + "." + i.interface());
- return true; // continue
- };
- vintf::VintfObject::GetDeviceHalManifest()->forEachInstance(setInserter);
- vintf::VintfObject::GetFrameworkHalManifest()->forEachInstance(setInserter);
- return ret;
+static std::set<VersionedAidlPackage> allAidlManifestInterfaces() {
+ std::set<VersionedAidlPackage> ret;
+ auto setInserter = [&](const vintf::ManifestInstance& i) -> bool {
+ if (i.format() != vintf::HalFormat::AIDL) {
+ return true; // continue
+ }
+ ret.insert({i.package() + "." + i.interface(), i.version().minorVer});
+ return true; // continue
+ };
+ vintf::VintfObject::GetDeviceHalManifest()->forEachInstance(setInserter);
+ vintf::VintfObject::GetFrameworkHalManifest()->forEachInstance(setInserter);
+ return ret;
}
TEST(Hal, AllHidlInterfacesAreInAosp) {
- for (const FQName& name : allHidlManifestInterfaces()) {
- EXPECT_TRUE(isAospHidlInterface(name))
- << "This device should only have AOSP interfaces, not: "
- << name.string();
- }
+ for (const FQName& name : allHidlManifestInterfaces()) {
+ EXPECT_TRUE(isAospHidlInterface(name))
+ << "This device should only have AOSP interfaces, not: "
+ << name.string();
+ }
}
TEST(Hal, HidlInterfacesImplemented) {
- // instances -> major version -> minor versions
- std::map<std::string, std::map<size_t, std::set<size_t>>> unimplemented;
+ // instances -> major version -> minor versions
+ std::map<std::string, std::map<size_t, std::set<size_t>>> unimplemented;
- for (const FQName& f : allTreeHidlInterfaces()) {
- if (!isAospHidlInterface(f)) continue;
- if (!isHidlPackageConsidered(f)) continue;
+ for (const FQName& f : allTreeHidlInterfaces()) {
+ if (!isAospHidlInterface(f)) continue;
+ if (!isHidlPackageConsidered(f)) continue;
- unimplemented[f.package()][f.getPackageMajorVersion()].insert(f.getPackageMinorVersion());
+ unimplemented[f.package()][f.getPackageMajorVersion()].insert(
+ f.getPackageMinorVersion());
+ }
+
+ // we'll be removing items from this which we know are missing
+ // in order to be left with those elements which we thought we
+ // knew were missing but are actually present
+ std::set<std::string> thoughtMissing = kKnownMissingHidl;
+
+ for (const FQName& f : allHidlManifestInterfaces()) {
+ if (thoughtMissing.erase(f.getPackageAndVersion().string()) > 0) {
+ ADD_FAILURE() << "Instance in missing list, but available: "
+ << f.string();
}
- // we'll be removing items from this which we know are missing
- // in order to be left with those elements which we thought we
- // knew were missing but are actually present
- std::set<std::string> thoughtMissing = kKnownMissingHidl;
+ std::set<size_t>& minors =
+ unimplemented[f.package()][f.getPackageMajorVersion()];
+ size_t minor = f.getPackageMinorVersion();
- for (const FQName& f : allHidlManifestInterfaces()) {
- if (thoughtMissing.erase(f.getPackageAndVersion().string()) > 0) {
- ADD_FAILURE() << "Instance in missing list, but available: " << f.string();
- }
+ auto it = minors.find(minor);
+ if (it == minors.end()) continue;
- std::set<size_t>& minors = unimplemented[f.package()][f.getPackageMajorVersion()];
- size_t minor = f.getPackageMinorVersion();
+ // if 1.2 is implemented, also considere 1.0, 1.1 implemented
+ minors.erase(minors.begin(), std::next(it));
+ }
- auto it = minors.find(minor);
- if (it == minors.end()) continue;
+ for (const auto& [package, minorsPerMajor] : unimplemented) {
+ for (const auto& [major, minors] : minorsPerMajor) {
+ if (minors.empty()) continue;
- // if 1.2 is implemented, also considere 1.0, 1.1 implemented
- minors.erase(minors.begin(), std::next(it));
+ size_t maxMinor = *minors.rbegin();
+
+ FQName missing;
+ ASSERT_TRUE(missing.setTo(package, major, maxMinor));
+
+ if (thoughtMissing.erase(missing.string()) > 0) continue;
+
+ ADD_FAILURE() << "Missing implementation from " << missing.string();
}
+ }
- for (const auto& [package, minorsPerMajor] : unimplemented) {
- for (const auto& [major, minors] : minorsPerMajor) {
- if (minors.empty()) continue;
-
- size_t maxMinor = *minors.rbegin();
-
- FQName missing;
- ASSERT_TRUE(missing.setTo(package, major, maxMinor));
-
- if (thoughtMissing.erase(missing.string()) > 0) continue;
-
- ADD_FAILURE() << "Missing implementation from " << missing.string();
- }
- }
-
- for (const std::string& missing : thoughtMissing) {
- ADD_FAILURE() << "Instance in missing list and cannot find it anywhere: " << missing
- << " (multiple versions in missing list?)";
- }
+ for (const std::string& missing : thoughtMissing) {
+ ADD_FAILURE() << "Instance in missing list and cannot find it anywhere: "
+ << missing << " (multiple versions in missing list?)";
+ }
}
TEST(Hal, AllAidlInterfacesAreInAosp) {
- for (const std::string& name : allAidlManifestInterfaces()) {
- EXPECT_TRUE(isAospAidlInterface(name))
- << "This device should only have AOSP interfaces, not: " << name;
- }
+ for (const auto& package : allAidlManifestInterfaces()) {
+ EXPECT_TRUE(isAospAidlInterface(package.name))
+ << "This device should only have AOSP interfaces, not: "
+ << package.name;
+ }
}
// android.hardware.foo.IFoo -> android.hardware.foo.
std::string getAidlPackage(const std::string& aidlType) {
- size_t lastDot = aidlType.rfind('.');
- CHECK(lastDot != std::string::npos);
- return aidlType.substr(0, lastDot + 1);
+ size_t lastDot = aidlType.rfind('.');
+ CHECK(lastDot != std::string::npos);
+ return aidlType.substr(0, lastDot + 1);
}
+struct AidlPackageCheck {
+ bool hasRegistration;
+ bool knownMissing;
+};
+
TEST(Hal, AidlInterfacesImplemented) {
- std::set<std::string> manifest = allAidlManifestInterfaces();
- std::set<std::string> thoughtMissing = kKnownMissingAidl;
+ std::set<VersionedAidlPackage> manifest = allAidlManifestInterfaces();
+ std::set<VersionedAidlPackage> thoughtMissing = kKnownMissingAidl;
- for (const auto& iface : AidlInterfaceMetadata::all()) {
- ASSERT_FALSE(iface.types.empty()) << iface.name; // sanity
- if (std::none_of(iface.types.begin(), iface.types.end(), isAospAidlInterface)) continue;
- if (iface.stability != "vintf") continue;
+ for (const auto& treePackage : AidlInterfaceMetadata::all()) {
+ ASSERT_FALSE(treePackage.types.empty()) << treePackage.name;
+ if (std::none_of(treePackage.types.begin(), treePackage.types.end(),
+ isAospAidlInterface))
+ continue;
+ if (treePackage.stability != "vintf") continue;
- bool hasRegistration = false;
- bool knownMissing = false;
- for (const std::string& type : iface.types) {
- if (manifest.erase(type) > 0) hasRegistration = true;
- if (thoughtMissing.erase(getAidlPackage(type)) > 0) knownMissing = true;
+ // expect versions from 1 to latest version. If the package has development
+ // the latest version is the latest known version + 1. Each of these need
+ // to be checked for registration and knownMissing.
+ std::map<size_t, AidlPackageCheck> expectedVersions;
+ for (const auto version : treePackage.versions) {
+ expectedVersions[version] = {false, false};
+ }
+ if (treePackage.has_development) {
+ size_t version =
+ treePackage.versions.empty() ? 1 : *treePackage.versions.rbegin() + 1;
+ expectedVersions[version] = {false, false};
+ }
+
+ // Check all types and versions defined by the package for registration.
+ // The package version is considered registered if any of those types are
+ // present in the manifest with the same version.
+ // The package version is considered known missing if it is found in
+ // thoughtMissing.
+ bool latestRegistered = false;
+ for (const std::string& type : treePackage.types) {
+ for (auto& [version, check] : expectedVersions) {
+ if (manifest.erase({type, version}) > 0) {
+ if (version == expectedVersions.rbegin()->first) {
+ latestRegistered = true;
+ }
+ check.hasRegistration = true;
+ }
+ if (thoughtMissing.erase({getAidlPackage(type), version}) > 0)
+ check.knownMissing = true;
+ }
+ }
+
+ if (!latestRegistered && !expectedVersions.rbegin()->second.knownMissing) {
+ ADD_FAILURE() << "The latest version ("
+ << expectedVersions.rbegin()->first
+ << ") of the package is not implemented: "
+ << treePackage.name
+ << " which declares the following types:\n "
+ << base::Join(treePackage.types, "\n ");
+ }
+
+ for (const auto& [version, check] : expectedVersions) {
+ if (check.knownMissing) {
+ if (check.hasRegistration) {
+ ADD_FAILURE() << "Package in missing list, but available: "
+ << treePackage.name << " V" << version
+ << " which declares the following types:\n "
+ << base::Join(treePackage.types, "\n ");
}
- if (knownMissing) {
- if (hasRegistration) {
- ADD_FAILURE() << "Interface in missing list, but available: " << iface.name
- << " which declares the following types:\n "
- << base::Join(iface.types, "\n ");
- }
-
- continue;
- }
-
- EXPECT_TRUE(hasRegistration) << iface.name << " which declares the following types:\n "
- << base::Join(iface.types, "\n ");
+ continue;
+ }
}
+ }
- for (const std::string& iface : thoughtMissing) {
- ADD_FAILURE() << "Interface in manifest list and cannot find it anywhere: " << iface;
- }
+ for (const auto& package : thoughtMissing) {
+ ADD_FAILURE() << "Interface in missing list and cannot find it anywhere: "
+ << package.name << " V" << package.version;
+ }
- for (const std::string& iface : manifest) {
- ADD_FAILURE() << "Can't find manifest entry in tree: " << iface;
- }
+ for (const auto& package : manifest) {
+ ADD_FAILURE() << "Can't find manifest entry in tree: " << package.name
+ << " version: " << package.version;
+ }
}
diff --git a/tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java b/tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java
index 84fa852..42d9dda 100644
--- a/tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java
+++ b/tests/powerwash/src/com/android/cuttlefish/tests/PowerwashTest.java
@@ -15,15 +15,19 @@
*/
package com.android.cuttlefish.tests;
+import static org.junit.Assert.assertTrue;
+
import com.android.tradefed.device.cloud.RemoteAndroidVirtualDevice;
+import com.android.tradefed.device.internal.DeviceResetHandler;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
-import java.io.File;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.File;
+
/**
* Test powerwash function.
*
@@ -48,14 +52,18 @@
if (file == null) {
Assert.fail("Setup failed: tmp file failed to persist after device reboot.");
}
-
+ boolean success = false;
if (getDevice() instanceof RemoteAndroidVirtualDevice) {
- ((RemoteAndroidVirtualDevice) getDevice()).powerwashGce();
+ success = ((RemoteAndroidVirtualDevice) getDevice()).powerwashGce();
} else {
- Assert.fail("This test only supports running in test lab setup.");
+ // We don't usually expect tests to use our feature server, but in this case we are
+ // validating the feature itself so it's fine
+ DeviceResetHandler handler = new DeviceResetHandler(getInvocationContext());
+ success = handler.resetDevice(getDevice());
}
+ assertTrue("Powerwash reset failed", success);
- // Verify that the device is back online and pre-xisting file is gone.
+ // Verify that the device is back online and pre-existing file is gone.
file = getDevice().pullFile(tmpFile);
if (file != null) {
Assert.fail("Powerwash failed: pre-existing file still exists.");
diff --git a/tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java b/tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java
index 3c5db3f..534f676 100644
--- a/tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java
+++ b/tests/ril/src/com/android/cuttlefish/ril/tests/RilE2eTests.java
@@ -35,7 +35,6 @@
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -141,8 +140,6 @@
Assert.assertSame(TelephonyManager.DATA_CONNECTED, mTeleManager.getDataState());
}
- // See b/74256305
- @Ignore
@Test
public void testSignalLevels() throws Exception {
CellInfoGsm cellinfogsm = (CellInfoGsm)mTeleManager.getAllCellInfo().get(0);
diff --git a/tools/Android.bp b/tools/Android.bp
new file mode 100644
index 0000000..fe771af
--- /dev/null
+++ b/tools/Android.bp
@@ -0,0 +1,8 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+blueprint_go_binary {
+ name: "create_base_image",
+ srcs: ["create_base_image.go"],
+}
diff --git a/tools/create_base_image.go b/tools/create_base_image.go
new file mode 100644
index 0000000..f784801
--- /dev/null
+++ b/tools/create_base_image.go
@@ -0,0 +1,247 @@
+package main
+
+import (
+ "os"
+ "os/exec"
+ "os/user"
+ "flag"
+ "fmt"
+ "strings"
+ "io/ioutil"
+ "log"
+ "time"
+)
+
+type OnFail int
+
+const (
+ IgnoreOnFail OnFail = iota
+ WarnOnFail
+ ExitOnFail
+)
+
+var build_instance string
+var build_project string
+var build_zone string
+var dest_image string
+var dest_family string
+var dest_project string
+var launch_instance string
+var source_image_family string
+var source_image_project string
+var repository_url string
+var repository_branch string
+var version string
+var SSH_FLAGS string
+var INTERNAL_extra_source string
+var verbose bool
+var username string
+
+func init() {
+ user, err := user.Current()
+ if err != nil {
+ panic(err)
+ }
+ username = user.Username
+
+ flag.StringVar(&build_instance, "build_instance",
+ username+"-build", "Instance name to create for the build")
+ flag.StringVar(&build_project, "build_project",
+ mustShell("gcloud config get-value project"), "Project to use for scratch")
+ flag.StringVar(&build_zone, "build_zone",
+ mustShell("gcloud config get-value compute/zone"),
+ "Zone to use for scratch resources")
+ flag.StringVar(&dest_image, "dest_image",
+ "vsoc-host-scratch-"+username, "Image to create")
+ flag.StringVar(&dest_family, "dest_family", "",
+ "Image family to add the image to")
+ flag.StringVar(&dest_project, "dest_project",
+ mustShell("gcloud config get-value project"), "Project to use for the new image")
+ flag.StringVar(&launch_instance, "launch_instance", "",
+ "Name of the instance to launch with the new image")
+ flag.StringVar(&source_image_family, "source_image_family", "debian-11",
+ "Image familty to use as the base")
+ flag.StringVar(&source_image_project, "source_image_project", "debian-cloud",
+ "Project holding the base image")
+ flag.StringVar(&repository_url, "repository_url",
+ "https://github.com/google/android-cuttlefish.git",
+ "URL to the repository with host changes")
+ flag.StringVar(&repository_branch, "repository_branch",
+ "main", "Branch to check out")
+ flag.StringVar(&version, "version", "", "cuttlefish-common version")
+ flag.StringVar(&SSH_FLAGS, "INTERNAL_IP", "",
+ "INTERNAL_IP can be set to --internal-ip run on a GCE instance."+
+ "The instance will need --scope compute-rw.")
+ flag.StringVar(&INTERNAL_extra_source, "INTERNAL_extra_source", "",
+ "INTERNAL_extra_source may be set to a directory containing the source for extra packages to build.")
+ flag.BoolVar(&verbose, "verbose", true, "print commands and output (default: true)")
+ flag.Parse()
+}
+
+func shell(cmd string) (string, error) {
+ if verbose {
+ fmt.Println(cmd)
+ }
+ b, err := exec.Command("/bin/sh", "-c", cmd).CombinedOutput()
+ if verbose {
+ fmt.Println(string(b))
+ }
+ if err != nil {
+ return "", err
+ }
+ return strings.TrimSpace(string(b)), nil
+}
+
+func mustShell(cmd string) string {
+ if verbose {
+ fmt.Println(cmd)
+ }
+ out, err := shell(cmd)
+ if err != nil {
+ panic(err)
+ }
+ if verbose {
+ fmt.Println(out)
+ }
+ return strings.TrimSpace(out)
+}
+
+func gce(action OnFail, gceArg string, errorStr ...string) (string, error) {
+ cmd := "gcloud " + gceArg
+ out, err := shell(cmd)
+ if out != "" {
+ fmt.Println(out)
+ }
+ if err != nil && action != IgnoreOnFail {
+ var buf string
+ fmt.Sprintf(buf, "gcloud error occurred: %s", err)
+ if (len(errorStr) > 0) {
+ buf += " [" + errorStr[0] + "]"
+ }
+ if action == ExitOnFail {
+ panic(buf)
+ }
+ if action == WarnOnFail {
+ fmt.Println(buf)
+ }
+ }
+ return out, err
+}
+
+func waitForInstance(PZ string) {
+ for {
+ time.Sleep(5 * time.Second)
+ _, err := gce(WarnOnFail, `compute ssh `+SSH_FLAGS+` `+PZ+` `+
+ build_instance+` -- uptime`)
+ if err == nil {
+ break
+ }
+ }
+}
+
+func packageSource(url string, branch string, version string, subdir string) {
+ repository_dir := url[strings.LastIndex(url, "/")+1:]
+ debian_dir := mustShell(`basename "`+repository_dir+`" .git`)
+ if subdir != "" {
+ debian_dir = repository_dir + "/" + subdir
+ }
+ mustShell("git clone " + url + " -b "+branch)
+ mustShell("dpkg-source -b " + debian_dir)
+ mustShell("rm -rf " + debian_dir)
+ mustShell("ls -l")
+ mustShell("pwd")
+}
+
+func createInstance(instance string, arg string) {
+ _, err := gce(WarnOnFail, `compute instances describe "`+instance+`"`)
+ if err != nil {
+ gce(ExitOnFail, `compute instances create `+arg+` "`+instance+`"`)
+ }
+}
+
+func main() {
+ gpu_type := "nvidia-tesla-p100-vws"
+ PZ := "--project=" + build_project + " --zone=" + build_zone
+
+ dest_family_flag := ""
+ if dest_family != "" {
+ dest_family_flag = "--family=" + dest_family
+ }
+
+ scratch_dir, err := ioutil.TempDir("", "")
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ oldDir, err := os.Getwd()
+ if err != nil {
+ log.Fatal(err)
+ }
+ os.Chdir(scratch_dir)
+ packageSource(repository_url, repository_branch, "cuttlefish-common_" + version, "")
+ os.Chdir(oldDir)
+
+ abt := os.Getenv("ANDROID_BUILD_TOP")
+ source_files := `"` + abt + `/device/google/cuttlefish/tools/create_base_image_gce.sh"`
+ source_files += " " + scratch_dir + "/*"
+ if INTERNAL_extra_source != "" {
+ source_files += " " + INTERNAL_extra_source + "/*"
+ }
+
+ delete_instances := build_instance + " " + dest_image
+ if launch_instance != "" {
+ delete_instances += " " + launch_instance
+ }
+
+ gce(WarnOnFail, `compute instances delete -q `+PZ+` `+delete_instances,
+ `Not running`)
+ gce(WarnOnFail, `compute disks delete -q `+PZ+` "`+dest_image+
+ `"`, `No scratch disk`)
+ gce(WarnOnFail, `compute images delete -q --project="`+build_project+
+ `" "`+dest_image+`"`, `Not respinning`)
+ gce(WarnOnFail, `compute disks create `+PZ+` --image-family="`+source_image_family+
+ `" --image-project="`+source_image_project+`" "`+dest_image+`"`)
+ gce(ExitOnFail, `compute accelerator-types describe "`+gpu_type+`" `+PZ,
+ `Please use a zone with `+gpu_type+` GPUs available.`)
+ createInstance(build_instance, PZ+
+ ` --machine-type=n1-standard-16 --image-family="`+source_image_family+
+ `" --image-project="`+source_image_project+
+ `" --boot-disk-size=200GiB --accelerator="type=`+gpu_type+
+ `,count=1" --maintenance-policy=TERMINATE --boot-disk-size=200GiB`)
+
+ waitForInstance(PZ)
+
+ // Ubuntu tends to mount the wrong disk as root, so help it by waiting until
+ // it has booted before giving it access to the clean image disk
+ gce(WarnOnFail, `compute instances attach-disk `+PZ+` "`+build_instance+
+ `" --disk="`+dest_image+`"`)
+
+ // beta for the --internal-ip flag that may be passed via SSH_FLAGS
+ gce(ExitOnFail, `beta compute scp `+SSH_FLAGS+` `+PZ+` `+source_files+
+ ` "`+build_instance+`:"`)
+ gce(ExitOnFail, `compute ssh `+SSH_FLAGS+` `+PZ+` "`+build_instance+
+ `" -- ./create_base_image_gce.sh`)
+ gce(ExitOnFail, `compute instances delete -q `+PZ+` "`+build_instance+`"`)
+ gce(ExitOnFail, `compute images create --project="`+build_project+
+ `" --source-disk="`+dest_image+`" --source-disk-zone="`+build_zone+
+ `" --licenses=https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx `+
+ dest_family_flag+` "`+dest_image+`"`)
+ gce(ExitOnFail, `compute disks delete -q `+PZ+` "`+dest_image+`"`)
+
+ if launch_instance != "" {
+ createInstance(launch_instance, PZ+
+ ` --image-project="`+build_project+`" --image="`+dest_image+
+ `" --machine-type=n1-standard-4 --scopes storage-ro --accelerator="type=`+
+ gpu_type+`,count=1" --maintenance-policy=TERMINATE`)
+ }
+
+ fmt.Printf("Test and if this looks good, consider releasing it via:\n"+
+ "\n"+
+ "gcloud compute images create \\\n"+
+ " --project=\"%s\" \\\n"+
+ " --source-image=\"%s\" \\\n"+
+ " --source-image-project=\"%s\" \\\n"+
+ " \"%s\" \\\n"+
+ " \"%s\"\n",
+ dest_project, dest_image, build_project, dest_family_flag, dest_image)
+}
diff --git a/tools/create_base_image.sh b/tools/create_base_image.sh
deleted file mode 100755
index bd85f0b..0000000
--- a/tools/create_base_image.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-# Creates a base image suitable for booting cuttlefish on GCE
-
-source "${ANDROID_BUILD_TOP}/device/google/cuttlefish/tools/create_base_image_hostlib.sh"
-
-FLAGS "$@" || exit 1
-main "${FLAGS_ARGV[@]}"
diff --git a/tools/create_base_image_arm.sh b/tools/create_base_image_arm.sh
index 644d909..5258636 100755
--- a/tools/create_base_image_arm.sh
+++ b/tools/create_base_image_arm.sh
@@ -14,8 +14,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+set -e
+set -u
+
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+if [ -z $ANDROID_BUILD_TOP ]; then
+ echo "error: run script after 'lunch'"
+ exit 1
+fi
+
source "${ANDROID_BUILD_TOP}/external/shflags/shflags"
DEFINE_boolean p1 \
@@ -29,7 +37,11 @@
DEFINE_boolean p5 \
false "Only generate/write the 5th partition (rootfs)" "5"
-FLAGS_HELP="USAGE: $0 <KERNEL_DIR> [IMAGE] [flags]"
+UBOOT_REPO=
+KERNEL_REPO=
+IMAGE=
+
+FLAGS_HELP="USAGE: $0 <UBOOT_REPO> <KERNEL_REPO> [IMAGE] [flags]"
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
@@ -47,8 +59,10 @@
fi
for arg in "$@" ; do
- if [ -z $KERNEL_DIR ]; then
- KERNEL_DIR=$arg
+ if [ -z $UBOOT_REPO ]; then
+ UBOOT_REPO=$arg
+ elif [ -z $KERNEL_REPO ]; then
+ KERNEL_REPO=$arg
elif [ -z $IMAGE ]; then
IMAGE=$arg
else
@@ -59,25 +73,18 @@
USE_IMAGE=`[ -z "${IMAGE}" ] && echo "0" || echo "1"`
OVERWRITE=`[ -e "${IMAGE}" ] && echo "1" || echo "0"`
-if [ -z $KERNEL_DIR ]; then
+if [ -z $KERNEL_REPO -o -z $UBOOT_REPO ]; then
flags_help
exit 1
fi
-if [ ! -e "${KERNEL_DIR}" ]; then
- echo "error: can't find '${KERNEL_DIR}'. aborting..."
+if [ ! -e "${UBOOT_REPO}" ]; then
+ echo "error: can't find '${UBOOT_REPO}'. aborting..."
exit 1
fi
-
-# escalate to superuser
-if [ $UID -ne 0 ]; then
- cd ${ANDROID_BUILD_TOP}
- . ./build/envsetup.sh
- lunch ${TARGET_PRODUCT}-${TARGET_BUILD_VARIANT}
- mmma external/u-boot
- cd -
- exec sudo -E "${0}" ${@}
+if [ ! -e "${KERNEL_REPO}" ]; then
+ echo "error: can't find '${KERNEL_REPO}'. aborting..."
+ exit 1
fi
-
if [ $OVERWRITE -eq 1 ]; then
OVERWRITE_IMAGE=${IMAGE}
IMAGE=`mktemp`
@@ -118,15 +125,6 @@
echo "Detected device at /dev/${mmc_dev}"
fi
-if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
- cd ${ANDROID_BUILD_TOP}/external/arm-trusted-firmware
- CROSS_COMPILE=aarch64-linux-gnu- make PLAT=rk3399 DEBUG=0 ERROR_DEPRECATED=1 bl31
- export BL31="${ANDROID_BUILD_TOP}/external/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf"
- cd -
-fi
-
-cd ${ANDROID_BUILD_TOP}/external/u-boot
-
if [ ${FLAGS_p2} -eq ${FLAGS_TRUE} ]; then
tmpfile=`mktemp`
bootenv=`mktemp`
@@ -144,474 +142,62 @@
find_script=if test -e mmc ${devnum}:${distro_bootpart} /boot/boot.scr; then echo Found U-Boot script /boot/boot.scr; run run_scr; fi
run_scr=load mmc ${devnum}:${distro_bootpart} ${scriptaddr} /boot/boot.scr; source ${scriptaddr}
EOF
- echo "Sha=`${script_dir}/gen_sha.sh --kernel ${KERNEL_DIR}`" >> ${tmpfile}
- ${ANDROID_HOST_OUT}/bin/mkenvimage -s 32768 -o ${bootenv} - < ${tmpfile}
+ echo "Sha=`${script_dir}/gen_sha.sh --uboot ${UBOOT_REPO} --kernel ${KERNEL_REPO}`" >> ${tmpfile}
+ ${ANDROID_BUILD_TOP}/device/google/cuttlefish_prebuilts/uboot_tools/mkenvimage -s 32768 -o ${bootenv} - < ${tmpfile}
fi
if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ] || [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then
- make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- rock-pi-4-rk3399_defconfig
- if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
- make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`
- fi
- if [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then
- make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb
- fi
- if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
- idbloader=`mktemp`
- ${ANDROID_HOST_OUT}/bin/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin ${idbloader}
- cat spl/u-boot-spl.bin >> ${idbloader}
- fi
+ cd ${UBOOT_REPO}
+ BUILD_CONFIG=u-boot/build.config.rockpi4 build/build.sh -j1
+ cd -
fi
-cd -
if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
- ${ANDROID_BUILD_TOP}/kernel/tests/net/test/build_rootfs.sh -a arm64 -s buster -n ${IMAGE}
+ cd ${KERNEL_REPO}
+ rm -rf out
+ BUILD_CONFIG=common/build.config.rockpi4 build/build.sh -j`nproc`
+ cd -
+
+ dist_dir=$(echo ${KERNEL_REPO}/out/android*/dist)
+ ${ANDROID_BUILD_TOP}/kernel/tests/net/test/build_rootfs.sh \
+ -a arm64 -s bullseye-rockpi -n ${IMAGE} -r ${IMAGE}.initrd -e \
+ -k ${dist_dir}/Image -i ${dist_dir}/initramfs.img \
+ -d ${dist_dir}/rk3399-rock-pi-4b.dtb:rockchip
if [ $? -ne 0 ]; then
echo "error: failed to build rootfs. exiting..."
exit 1
fi
+ rm -f ${IMAGE}.initrd
truncate -s +3G ${IMAGE}
e2fsck -f ${IMAGE}
resize2fs ${IMAGE}
- mntdir=`mktemp -d`
- mount ${IMAGE} ${mntdir}
- if [ $? != 0 ]; then
- echo "error: unable to mount ${IMAGE} ${mntdir}"
- exit 1
- fi
-
- cat > ${mntdir}/boot/boot.cmd << "EOF"
-setenv start_poe 'gpio set 150; gpio clear 146'
-run start_poe
-setenv bootcmd_dhcp '
-mw.b ${scriptaddr} 0 0x8000
-mmc dev 0 0
-mmc read ${scriptaddr} 0x1fc0 0x40
-env import -b ${scriptaddr} 0x8000
-mw.b ${scriptaddr} 0 0x8000
-if dhcp ${scriptaddr} manifest.txt; then
- setenv OldSha ${Sha}
- setenv Sha
- env import -t ${scriptaddr} 0x8000 ManifestVersion
- echo "Manifest version $ManifestVersion";
- if test "$ManifestVersion" = "1"; then
- run manifest1
- elif test "$ManifestVersion" = "2"; then
- run manifest2
- else
- run manifestX
- fi
-fi'
-setenv manifestX 'echo "***** ERROR: Unknown manifest version! *****";'
-setenv manifest1 '
-env import -t ${scriptaddr} 0x8000
-if test "$Sha" != "$OldSha"; then
- setenv serverip ${TftpServer}
- setenv loadaddr 0x00200000
- mmc dev 0 0;
- setenv file $TplSplImg; offset=0x40; size=0x1f80; run tftpget1; setenv TplSplImg
- setenv file $UbootItb; offset=0x4000; size=0x2000; run tftpget1; setenv UbootItb
- setenv file $TrustImg; offset=0x6000; size=0x2000; run tftpget1; setenv TrustImg
- setenv file $RootfsImg; offset=0x8000; size=0; run tftpget1; setenv RootfsImg
- setenv file $UbootEnv; offset=0x1fc0; size=0x40; run tftpget1; setenv UbootEnv
- mw.b ${scriptaddr} 0 0x8000
- env export -b ${scriptaddr} 0x8000
- mmc write ${scriptaddr} 0x1fc0 0x40
-else
- echo "Already have ${Sha}. Booting..."
-fi'
-setenv manifest2 '
-env import -t ${scriptaddr} 0x8000
-if test "$DFUethaddr" = "$ethaddr" || test "$DFUethaddr" = ""; then
- if test "$Sha" != "$OldSha"; then
- setenv serverip ${TftpServer}
- setenv loadaddr 0x00200000
- mmc dev 0 0;
- setenv file $TplSplImg; offset=0x40; size=0x1f80; run tftpget1; setenv TplSplImg
- setenv file $UbootItb; offset=0x4000; size=0x2000; run tftpget1; setenv UbootItb
- setenv file $TrustImg; offset=0x6000; size=0x2000; run tftpget1; setenv TrustImg
- setenv file $RootfsImg; offset=0x8000; size=0; run tftpget1; setenv RootfsImg
- setenv file $UbootEnv; offset=0x1fc0; size=0x40; run tftpget1; setenv UbootEnv
- mw.b ${scriptaddr} 0 0x8000
- env export -b ${scriptaddr} 0x8000
- mmc write ${scriptaddr} 0x1fc0 0x40
- else
- echo "Already have ${Sha}. Booting..."
- fi
-else
- echo "Update ${Sha} is not for me. Booting..."
-fi'
-setenv tftpget1 '
-if test "$file" != ""; then
- mw.b ${loadaddr} 0 0x400000
- tftp ${file}
- if test $? = 0; then
- setenv isGz 0 && setexpr isGz sub .*\\.gz\$ 1 ${file}
- if test $isGz = 1; then
- if test ${file} = ${UbootEnv}; then
- echo "** gzipped env unsupported **"
- else
- setexpr boffset ${offset} * 0x200
- gzwrite mmc 0 ${loadaddr} 0x${filesize} 100000 ${boffset} && echo Updated: ${file}
- fi
- elif test ${file} = ${UbootEnv}; then
- env import -b ${loadaddr} && echo Updated: ${file}
- else
- if test $size = 0; then
- setexpr x $filesize - 1
- setexpr x $x / 0x1000
- setexpr x $x + 1
- setexpr x $x * 0x1000
- setexpr x $x / 0x200
- size=0x${x}
- fi
- mmc write ${loadaddr} ${offset} ${size} && echo Updated: ${file}
- fi
- fi
- if test $? != 0; then
- echo ** UPDATE FAILED: ${file} **
- fi
-fi'
-if mmc dev 1 0; then; else
- run bootcmd_dhcp;
-fi
-load mmc ${devnum}:${distro_bootpart} 0x02080000 /boot/Image
-load mmc ${devnum}:${distro_bootpart} 0x04000000 /boot/uInitrd
-load mmc ${devnum}:${distro_bootpart} 0x01f00000 /boot/dtb/rockchip/rk3399-rock-pi-4.dtb
-setenv finduuid "part uuid mmc ${devnum}:${distro_bootpart} uuid"
-run finduuid
-setenv bootargs "earlycon=uart8250,mmio32,0xff1a0000 console=ttyS2,1500000n8 loglevel=7 root=PARTUUID=${uuid} rootwait rootfstype=ext4 sdhci.debug_quirks=0x20000000 of_devlink=0"
-booti 0x02080000 0x04000000 0x01f00000
-EOF
- ${ANDROID_HOST_OUT}/bin/mkimage \
- -C none -A arm -T script -d ${mntdir}/boot/boot.cmd ${mntdir}/boot/boot.scr
-
- cd ${KERNEL_DIR}
- export PATH=${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-r353983c/bin:$PATH
- export PATH=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
- make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \
- CLANG_TRIPLE=aarch64-linux-gnu- rockpi4_defconfig
- make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \
- CLANG_TRIPLE=aarch64-linux-gnu- -j`nproc`
-
- cp ${KERNEL_DIR}/arch/arm64/boot/Image ${mntdir}/boot/
- mkdir -p ${mntdir}/boot/dtb/rockchip/
- cp ${KERNEL_DIR}/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtb ${mntdir}/boot/dtb/rockchip/
- cd -
-
- mount -o bind /proc ${mntdir}/proc
- mount -o bind /sys ${mntdir}/sys
- mount -o bind /dev ${mntdir}/dev
-
- echo "Installing required packages..."
- chroot ${mntdir} /bin/bash <<EOF
-apt-get update
-apt-get install -y -f initramfs-tools u-boot-tools network-manager openssh-server sudo man-db vim git dpkg-dev cdbs debhelper config-package-dev gdisk eject lzop binfmt-support ntpdate lsof
-EOF
-
- echo "Turning on DHCP client..."
- cat >${mntdir}/etc/systemd/network/dhcp.network <<EOF
-[Match]
-Name=en*
-
-[Network]
-DHCP=yes
-EOF
-
- chroot ${mntdir} /bin/bash << "EOT"
-echo "Adding user vsoc-01 and groups..."
-useradd -m -G kvm,sudo -d /home/vsoc-01 --shell /bin/bash vsoc-01
-echo -e "cuttlefish\ncuttlefish" | passwd
-echo -e "cuttlefish\ncuttlefish" | passwd vsoc-01
-EOT
-
- echo "Cloning android-cuttlefish..."
- cd ${mntdir}/home/vsoc-01
- git clone https://github.com/google/android-cuttlefish.git
- cd -
-
- echo "Creating PoE script..."
- cat > ${mntdir}/usr/local/bin/poe << "EOF"
-#!/bin/bash
-
-if [ "$1" == "--start" ]; then
- echo 146 > /sys/class/gpio/export
- echo out > /sys/class/gpio/gpio146/direction
- echo 0 > /sys/class/gpio/gpio146/value
- echo 150 > /sys/class/gpio/export
- echo out > /sys/class/gpio/gpio150/direction
- echo 1 > /sys/class/gpio/gpio150/value
- exit 0
-fi
-
-if [ "$1" == "--stop" ]; then
- echo 0 > /sys/class/gpio/gpio146/value
- echo 146 > /sys/class/gpio/unexport
- echo 0 > /sys/class/gpio/gpio150/value
- echo 150 > /sys/class/gpio/unexport
- exit 0
-fi
-
-if [ ! -e /sys/class/gpio/gpio146/value ] || [ ! -e /sys/class/gpio/gpio150/value ]; then
- echo "error: PoE service not initialized"
- exit 1
-fi
-
-if [ "$1" == "0" ] || [ "$1" == "off" ] || [ "$1" == "OFF" ]; then
- echo 0 > /sys/class/gpio/gpio150/value
- exit 0
-fi
-
-if [ "$1" == "1" ] || [ "$1" == "on" ] || [ "$1" == "ON" ]; then
- echo 1 > /sys/class/gpio/gpio150/value
- exit 0
-fi
-
-echo "usage: poe <0|1>"
-exit 1
-EOF
- chown root:root ${mntdir}/usr/local/bin/poe
- chmod 755 ${mntdir}/usr/local/bin/poe
-
- echo "Creating PoE service..."
- cat > ${mntdir}/etc/systemd/system/poe.service << EOF
-[Unit]
- Description=PoE service
- ConditionPathExists=/usr/local/bin/poe
-
-[Service]
- Type=oneshot
- ExecStart=/usr/local/bin/poe --start
- ExecStop=/usr/local/bin/poe --stop
- RemainAfterExit=true
- StandardOutput=journal
-
-[Install]
- WantedBy=multi-user.target
-EOF
-
- echo "Creating led script..."
- cat > ${mntdir}/usr/local/bin/led << "EOF"
-#!/bin/bash
-
-if [ "$1" == "--start" ]; then
- echo 125 > /sys/class/gpio/export
- echo out > /sys/class/gpio/gpio125/direction
- chmod 666 /sys/class/gpio/gpio125/value
- echo 0 > /sys/class/gpio/gpio125/value
- exit 0
-fi
-
-if [ "$1" == "--stop" ]; then
- echo 0 > /sys/class/gpio/gpio125/value
- echo 125 > /sys/class/gpio/unexport
- exit 0
-fi
-
-if [ ! -e /sys/class/gpio/gpio125/value ]; then
- echo "error: led service not initialized"
- exit 1
-fi
-
-if [ "$1" == "0" ] || [ "$1" == "off" ] || [ "$1" == "OFF" ]; then
- echo 0 > /sys/class/gpio/gpio125/value
- exit 0
-fi
-
-if [ "$1" == "1" ] || [ "$1" == "on" ] || [ "$1" == "ON" ]; then
- echo 1 > /sys/class/gpio/gpio125/value
- exit 0
-fi
-
-echo "usage: led <0|1>"
-exit 1
-EOF
- chown root:root ${mntdir}/usr/local/bin/led
- chmod 755 ${mntdir}/usr/local/bin/led
-
- echo "Creating led service..."
- cat > ${mntdir}/etc/systemd/system/led.service << EOF
-[Unit]
- Description=led service
- ConditionPathExists=/usr/local/bin/led
-
-[Service]
- Type=oneshot
- ExecStart=/usr/local/bin/led --start
- ExecStop=/usr/local/bin/led --stop
- RemainAfterExit=true
- StandardOutput=journal
-
-[Install]
- WantedBy=multi-user.target
-EOF
-
- echo "Creating SD duplicator script..."
- cat > ${mntdir}/usr/local/bin/sd-dupe << "EOF"
-#!/bin/bash
-led 0
-
-src_dev=mmcblk0
-dest_dev=mmcblk1
-part_num=p5
-
-if [ -e /dev/mmcblk0p5 ] && [ -e /dev/mmcblk1p5 ]; then
- led 1
-
- sgdisk -Z -a1 /dev/${dest_dev}
- sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 /dev/${dest_dev}
- sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env /dev/${dest_dev}
- sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 /dev/${dest_dev}
- sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust /dev/${dest_dev}
- sgdisk -a1 -n:5:32768:- -A:5:set:2 -t:5:8305 -c:5:rootfs /dev/${dest_dev}
-
- src_block_count=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block count:" | sed 's/.*: *//'`
- src_block_size=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block size:" | sed 's/.*: *//'`
- src_fs_size=$(( src_block_count*src_block_size ))
- src_fs_size_m=$(( src_fs_size / 1024 / 1024 + 1 ))
-
- dd if=/dev/${src_dev}p1 of=/dev/${dest_dev}p1 conv=sync,noerror status=progress
- dd if=/dev/${src_dev}p2 of=/dev/${dest_dev}p2 conv=sync,noerror status=progress
- dd if=/dev/${src_dev}p3 of=/dev/${dest_dev}p3 conv=sync,noerror status=progress
- dd if=/dev/${src_dev}p4 of=/dev/${dest_dev}p4 conv=sync,noerror status=progress
-
- echo "Writing ${src_fs_size_m} MB: /dev/${src_dev} -> /dev/${dest_dev}..."
- dd if=/dev/${src_dev}${part_num} of=/dev/${dest_dev}${part_num} bs=1M conv=sync,noerror status=progress
-
- echo "Expanding /dev/${dest_dev}${part_num} filesystem..."
- e2fsck -fy /dev/${dest_dev}${part_num}
- resize2fs /dev/${dest_dev}${part_num}
- tune2fs -O has_journal /dev/${dest_dev}${part_num}
- e2fsck -fy /dev/${dest_dev}${part_num}
- sync /dev/${dest_dev}
-
- echo "Cleaning up..."
- mount /dev/${dest_dev}${part_num} /media
- chroot /media /usr/local/bin/install-cleanup
-
- if [ $? == 0 ]; then
- echo "Successfully copied Rock Pi image!"
- while true; do
- led 1; sleep 0.5
- led 0; sleep 0.5
- done
- else
- echo "Error while copying Rock Pi image"
- while true; do
- led 1; sleep 0.1
- led 0; sleep 0.1
- done
- fi
-else
- echo "Expanding /dev/${dest_dev}${part_num} filesystem..."
- e2fsck -fy /dev/${dest_dev}${part_num}
- resize2fs /dev/${dest_dev}${part_num}
- tune2fs -O has_journal /dev/${dest_dev}${part_num}
- e2fsck -fy /dev/${dest_dev}${part_num}
- sync /dev/${dest_dev}
-
- echo "Cleaning up..."
- /usr/local/bin/install-cleanup
-fi
-EOF
- chmod +x ${mntdir}/usr/local/bin/sd-dupe
-
- echo "Creating SD duplicator service..."
- cat > ${mntdir}/etc/systemd/system/sd-dupe.service << EOF
-[Unit]
- Description=Duplicate SD card rootfs to eMMC on Rock Pi
- ConditionPathExists=/usr/local/bin/sd-dupe
- After=led.service
-
-[Service]
- Type=simple
- ExecStart=/usr/local/bin/sd-dupe
- TimeoutSec=0
- StandardOutput=tty
-
-[Install]
- WantedBy=multi-user.target
-EOF
-
- umount ${mntdir}/sys
- umount ${mntdir}/dev
- umount ${mntdir}/proc
-
- chroot ${mntdir} /bin/bash << "EOT"
-echo "Installing cuttlefish-common package..."
-dpkg --add-architecture amd64
-apt-get update
-apt-get install -y -f libc6:amd64 qemu-user-static
-cd /home/vsoc-01/android-cuttlefish
-dpkg-buildpackage -d -uc -us
-apt-get install -y -f ../cuttlefish-common_*_arm64.deb
-apt-get clean
-
-usermod -aG cvdnetwork vsoc-01
-chmod 660 /dev/vhost-vsock
-chown root:cvdnetwork /dev/vhost-vsock
-rm -rf /home/vsoc-01/*
-EOT
-
- echo "Creating cleanup script..."
- cat > ${mntdir}/usr/local/bin/install-cleanup << "EOF"
-#!/bin/bash
-echo "nameserver 8.8.8.8" > /etc/resolv.conf
-MAC=`ip link | grep eth0 -A1 | grep ether | sed 's/.*\(..:..:..:..:..:..\) .*/\1/' | tr -d :`
-sed -i " 1 s/.*/& rockpi-${MAC}/" /etc/hosts
-sudo hostnamectl set-hostname "rockpi-${MAC}"
-
-rm /etc/machine-id
-rm /var/lib/dbus/machine-id
-dbus-uuidgen --ensure
-systemd-machine-id-setup
-
-systemctl disable sd-dupe
-rm /etc/systemd/system/sd-dupe.service
-rm /usr/local/bin/sd-dupe
-rm /usr/local/bin/install-cleanup
-EOF
- chmod +x ${mntdir}/usr/local/bin/install-cleanup
-
- chroot ${mntdir} /bin/bash << "EOT"
-echo "Enabling services..."
-systemctl enable poe
-systemctl enable led
-systemctl enable sd-dupe
-
-echo "Creating Initial Ramdisk..."
-update-initramfs -c -t -k "5.2.0"
-mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd -d /boot/initrd.img-5.2.0 /boot/uInitrd-5.2.0
-ln -s /boot/uInitrd-5.2.0 /boot/uInitrd
-EOT
-
- umount ${mntdir}
-
# Turn on journaling
tune2fs -O ^has_journal ${IMAGE}
e2fsck -fy ${IMAGE} >/dev/null 2>&1
fi
if [ ${USE_IMAGE} -eq 0 ]; then
- # 32GB eMMC size
- end_sector=61071326
device=/dev/${mmc_dev}
devicep=${device}
- sgdisk -Z -a1 ${device}
- sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 ${device}
- sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env ${device}
- sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 ${device}
- sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust ${device}
- sgdisk -a1 -n:5:32768:${end_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${device}
+ # 32GB eMMC size
+ end_sector=61071326
+
+ sudo sgdisk --zap-all --set-alignment=1 ${device}
+ sudo sgdisk --set-alignment=1 --new=1:64:8127 --typecode=1:8301 --change-name=1:loader1 ${device}
+ sudo sgdisk --set-alignment=1 --new=2:8128:8191 --typecode=2:8301 --change-name=2:env ${device}
+ sudo sgdisk --set-alignment=1 --new=3:16384:24575 --typecode=3:8301 --change-name=3:loader2 ${device}
+ sudo sgdisk --set-alignment=1 --new=4:24576:32767 --typecode=4:8301 --change-name=4:trust ${device}
+ sudo sgdisk --set-alignment=1 --new=5:32768:${end_sector} --typecode=5:8305 --change-name=5:rootfs --attributes=5:set:2 ${device}
if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
- dd if=${IMAGE} of=${devicep}5 bs=1M
- resize2fs ${devicep}5 >/dev/null 2>&1
+ sudo dd if=${IMAGE} of=${devicep}5 bs=1M conv=fsync
+ sudo resize2fs ${devicep}5 >/dev/null 2>&1
fi
else
- device=$(losetup -f)
+ device=$(sudo losetup -f)
devicep=${device}p
+
if [ ${FLAGS_p5} -eq ${FLAGS_FALSE} ]; then
fs_end=3G
end_sector=-
@@ -649,34 +235,37 @@
truncate -s ${fs_end} ${tmpimg}
# Create GPT
- sgdisk -Z -a1 ${tmpimg}
- sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 ${tmpimg}
- sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env ${tmpimg}
- sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 ${tmpimg}
- sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust ${tmpimg}
- sgdisk -a1 -n:5:32768:${end_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${tmpimg}
+ sgdisk --zap-all --set-alignment=1 ${tmpimg}
+ sgdisk --set-alignment=1 --new=1:64:8127 --typecode=1:8301 --change-name=1:loader1 ${tmpimg}
+ sgdisk --set-alignment=1 --new=2:8128:8191 --typecode=2:8301 --change-name=2:env ${tmpimg}
+ sgdisk --set-alignment=1 --new=3:16384:24575 --typecode=3:8301 --change-name=3:loader2 ${tmpimg}
+ sgdisk --set-alignment=1 --new=4:24576:32767 --typecode=4:8301 --change-name=4:trust ${tmpimg}
+ sgdisk --set-alignment=1 --new=5:32768:${end_sector} --typecode=5:8305 --change-name=5:rootfs --attributes=5:set:2 ${tmpimg}
- losetup ${device} ${tmpimg}
- partx -v --add ${device}
+ sudo losetup ${device} ${tmpimg}
+ sudo partx -v --add ${device}
if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
- dd if=${IMAGE} of=${devicep}5 bs=1M
+ sudo dd if=${IMAGE} of=${devicep}5 bs=1M conv=fsync
fi
fi
if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
- dd if=${idbloader} of=${devicep}1
+ # sudo dd if=${UBOOT_REPO}/out/u-boot-mainline/dist/idbloader.img of=${devicep}1 conv=fsync
+ # loader1
+ sudo dd if=${ANDROID_BUILD_TOP}/device/google/cuttlefish_prebuilts/uboot_bin/idbloader.img of=${devicep}1 conv=fsync
fi
if [ ${FLAGS_p2} -eq ${FLAGS_TRUE} ]; then
- dd if=${bootenv} of=${devicep}2
+ sudo dd if=${bootenv} of=${devicep}2 conv=fsync
fi
if [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then
- dd if=${ANDROID_BUILD_TOP}/external/u-boot/u-boot.itb of=${devicep}3
+ # sudo dd if=${UBOOT_REPO}/out/u-boot-mainline/dist/u-boot.itb of=${devicep}3 conv=fsync
+ # loader2
+ sudo dd if=${ANDROID_BUILD_TOP}/device/google/cuttlefish_prebuilts/uboot_bin/u-boot.itb of=${devicep}3 conv=fsync
fi
if [ ${USE_IMAGE} -eq 1 ]; then
- chown $SUDO_USER:`id -ng $SUDO_USER` ${tmpimg}
+ sudo partx -v --delete ${device}
+ sudo losetup -d ${device}
if [ $OVERWRITE -eq 0 ]; then
mv ${tmpimg} ${IMAGE}
fi
- partx -v --delete ${device}
- losetup -d ${device}
fi
diff --git a/tools/create_base_image_gce.sh b/tools/create_base_image_gce.sh
index 02797db..c875340 100755
--- a/tools/create_base_image_gce.sh
+++ b/tools/create_base_image_gce.sh
@@ -39,7 +39,7 @@
done
# Now install the packages on the disk
-sudo mkdir /mnt/image
+sudo mkdir -p /mnt/image
sudo mount /dev/sdb1 /mnt/image
cp "${debs[@]}" /mnt/image/tmp
sudo mount -t sysfs none /mnt/image/sys
@@ -60,30 +60,22 @@
sudo chroot /mnt/image /usr/bin/find /home -ls
+# update QEMU version to most recent backport
+sudo chroot /mnt/image /usr/bin/apt install -y --only-upgrade qemu-system-x86 -t bullseye-backports
+sudo chroot /mnt/image /usr/bin/apt install -y --only-upgrade qemu-system-arm -t bullseye-backports
# Install GPU driver dependencies
sudo chroot /mnt/image /usr/bin/apt install -y gcc
sudo chroot /mnt/image /usr/bin/apt install -y linux-source
sudo chroot /mnt/image /usr/bin/apt install -y linux-headers-`uname -r`
sudo chroot /mnt/image /usr/bin/apt install -y make
-
-# Download the latest GPU driver installer
-gsutil cp \
- $(gsutil ls gs://nvidia-drivers-us-public/GRID/GRID*/*-Linux-x86_64-*.run \
- | sort \
- | tail -n 1) \
- /mnt/image/tmp/nvidia-driver-installer.run
-
-# Make GPU driver installer executable
-chmod +x /mnt/image/tmp/nvidia-driver-installer.run
-
-# Install the latest GPU driver with default options and the dispatch libs
-sudo chroot /mnt/image /tmp/nvidia-driver-installer.run \
- --silent \
- --install-libglvnd
-
-# Cleanup after install
-rm /mnt/image/tmp/nvidia-driver-installer.run
+sudo chroot /mnt/image /usr/bin/apt install -y software-properties-common
+sudo chroot /mnt/image /usr/bin/add-apt-repository non-free
+sudo chroot /mnt/image /usr/bin/add-apt-repository contrib
+sudo chroot /mnt/image /usr/bin/apt update
+sudo chroot /mnt/image /bin/bash -c 'DEBIAN_FRONTEND=noninteractive /usr/bin/apt install -y nvidia-driver'
+sudo chroot /mnt/image /usr/bin/apt install -y firmware-misc-nonfree
+sudo chroot /mnt/image /usr/bin/apt install -y libglvnd-dev
# Verify
query_nvidia() {
diff --git a/tools/create_base_image_hostlib.sh b/tools/create_base_image_hostlib.sh
index dafefbd..cc7227f 100755
--- a/tools/create_base_image_hostlib.sh
+++ b/tools/create_base_image_hostlib.sh
@@ -2,9 +2,6 @@
# Common code to build a host image on GCE
-# INTERNAL_extra_source may be set to a directory containing the source for
-# extra package to build.
-
# INTERNAL_IP can be set to --internal-ip run on a GCE instance
# The instance will need --scope compute-rw
@@ -22,7 +19,7 @@
"Project to use for the new image" "p"
DEFINE_string launch_instance "" \
"Name of the instance to launch with the new image" "l"
-DEFINE_string source_image_family "debian-10" \
+DEFINE_string source_image_family "debian-11" \
"Image familty to use as the base" "s"
DEFINE_string source_image_project debian-cloud \
"Project holding the base image" "m"
@@ -79,9 +76,6 @@
"${ANDROID_BUILD_TOP}/device/google/cuttlefish/tools/create_base_image_gce.sh"
${scratch_dir}/*
)
- if [[ -n "${INTERNAL_extra_source}" ]]; then
- source_files+=("${INTERNAL_extra_source}"/*)
- fi
delete_instances=("${FLAGS_build_instance}" "${FLAGS_dest_image}")
if [[ -n "${FLAGS_launch_instance}" ]]; then
@@ -143,6 +137,7 @@
--scopes storage-ro \
--accelerator="type=${gpu_type},count=1" \
--maintenance-policy=TERMINATE \
+ --boot-disk-size=200GiB \
"${FLAGS_launch_instance}"
fi
cat <<EOF
@@ -156,3 +151,11 @@
"${FLAGS_dest_image}"
EOF
}
+
+FLAGS "$@" || exit 1
+if [[ "${FLAGS_help}" -eq 0 ]]; then
+ echo ${FLAGS_help}
+ exit 1
+fi
+
+main "${FLAGS_ARGV[@]}"
diff --git a/tools/gen_sha.sh b/tools/gen_sha.sh
index 51dc76c..d3da1c4 100755
--- a/tools/gen_sha.sh
+++ b/tools/gen_sha.sh
@@ -14,17 +14,22 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-source "${ANDROID_BUILD_TOP}/external/shflags/src/shflags"
+set -e
+set -u
+
+source "${ANDROID_BUILD_TOP}/external/shflags/shflags"
DEFINE_string kernel \
- "" "Path to kernel build dir" "k"
+ "" "Path to kernel repo checkout" "k"
+DEFINE_string uboot \
+ "" "Path to u-boot repo checkout" "u"
FLAGS_HELP="USAGE: $0 [flags]"
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
-if [ -z ${FLAGS_kernel} ]; then
+if [ -z ${FLAGS_kernel} -o -z ${FLAGS_uboot} ]; then
flags_help
exit 1
fi
@@ -32,13 +37,14 @@
cd "${ANDROID_BUILD_TOP}/device/google/cuttlefish"
Sha=`git rev-parse HEAD`
cd - >/dev/null
-cd "${ANDROID_BUILD_TOP}/external/u-boot"
+# cd "${FLAGS_uboot}/u-boot"
+cd "${ANDROID_BUILD_TOP}/device/google/cuttlefish_prebuilts"
Sha="$Sha,`git rev-parse HEAD`"
cd - >/dev/null
-cd "${ANDROID_BUILD_TOP}/external/arm-trusted-firmware"
+cd "${FLAGS_uboot}/external/arm-trusted-firmware"
Sha="$Sha,`git rev-parse HEAD`"
cd - >/dev/null
-cd "${FLAGS_kernel}"
+cd "${FLAGS_kernel}/common"
Sha="$Sha,`git rev-parse HEAD`"
cd - >/dev/null
echo $Sha
diff --git a/tools/go.mod b/tools/go.mod
new file mode 100644
index 0000000..00809b9
--- /dev/null
+++ b/tools/go.mod
@@ -0,0 +1,3 @@
+module tools
+
+go 1.17
diff --git a/tools/latest_fetch_cvd.sh b/tools/latest_fetch_cvd.sh
new file mode 100755
index 0000000..d853786
--- /dev/null
+++ b/tools/latest_fetch_cvd.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+LATEST_BUILD_ID=`curl "https://www.googleapis.com/android/internal/build/v3/builds?branch=aosp-master&buildAttemptStatus=complete&buildType=submitted&maxResults=1&successful=true&target=aosp_cf_x86_64_phone-userdebug" 2>/dev/null | \
+ python3 -c "import sys, json; print(json.load(sys.stdin)['builds'][0]['buildId'])"`
+LATEST_BUILD_URL=`curl "https://www.googleapis.com/android/internal/build/v3/builds/$LATEST_BUILD_ID/aosp_cf_x86_64_phone-userdebug/attempts/latest/artifacts/fetch_cvd/url" 2>/dev/null | \
+ python3 -c "import sys, json; print(json.load(sys.stdin)['signedUrl'])"`
+
+DOWNLOAD_TARGET=`mktemp`
+
+curl "${LATEST_BUILD_URL}" -o $DOWNLOAD_TARGET
+
+chmod +x $DOWNLOAD_TARGET
+
+exec $DOWNLOAD_TARGET $@
diff --git a/tools/upload_to_gce_and_run.py b/tools/upload_to_gce_and_run.py
index f4dc4b8..db78340 100755
--- a/tools/upload_to_gce_and_run.py
+++ b/tools/upload_to_gce_and_run.py
@@ -59,9 +59,6 @@
def __get_default_hostdir():
- soong_host_dir = os.environ.get('ANDROID_SOONG_HOST_OUT')
- if soong_host_dir:
- return soong_host_dir
return os.environ.get('ANDROID_HOST_OUT', '.')
diff --git a/tools/upload_via_ssh.py b/tools/upload_via_ssh.py
index 5359473..2b5cfd1 100755
--- a/tools/upload_via_ssh.py
+++ b/tools/upload_via_ssh.py
@@ -58,7 +58,7 @@
parser.add_argument(
'-host_dir',
type=str,
- default=os.environ.get('ANDROID_SOONG_HOST_OUT', '.'),
+ default=os.environ.get('ANDROID_HOST_OUT', '.'),
help='path to soong host out directory')
parser.add_argument(
'-image_dir',
diff --git a/vsoc_arm64/auto/aosp_cf.mk b/vsoc_arm64/auto/aosp_cf.mk
index 51ae7a3..0f8c417 100644
--- a/vsoc_arm64/auto/aosp_cf.mk
+++ b/vsoc_arm64/auto/aosp_cf.mk
@@ -26,3 +26,6 @@
PRODUCT_VENDOR_PROPERTIES += \
ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
ro.soc.model=$(PRODUCT_DEVICE)
+
+# TODO(b/205788876) remove this when openwrt has an image for arm.
+PRODUCT_ENFORCE_MAC80211_HWSIM := false
\ No newline at end of file
diff --git a/vsoc_arm64/bootloader.mk b/vsoc_arm64/bootloader.mk
index a5aea94..ce29443 100644
--- a/vsoc_arm64/bootloader.mk
+++ b/vsoc_arm64/bootloader.mk
@@ -18,5 +18,3 @@
# FIXME: Copying the QEMU bootloader for now, but this should be updated..
BOARD_PREBUILT_BOOTLOADER := \
device/google/cuttlefish_prebuilts/bootloader/crosvm_aarch64/u-boot.bin
-PRODUCT_COPY_FILES += \
- device/google/cuttlefish_prebuilts/bootloader/qemu_aarch64/u-boot.bin:bootloader.qemu
diff --git a/vsoc_arm64/phone/aosp_cf.mk b/vsoc_arm64/phone/aosp_cf.mk
index b33e523..86fe29e 100644
--- a/vsoc_arm64/phone/aosp_cf.mk
+++ b/vsoc_arm64/phone/aosp_cf.mk
@@ -37,6 +37,8 @@
# All components inherited here go to vendor image
#
$(call inherit-product, device/google/cuttlefish/shared/phone/device_vendor.mk)
+# TODO(b/205788876) remove this when openwrt has an image for arm.
+PRODUCT_ENFORCE_MAC80211_HWSIM := false
# Nested virtualization support
$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
diff --git a/vsoc_arm64/phone/aosp_cf_hwasan.mk b/vsoc_arm64/phone/aosp_cf_hwasan.mk
new file mode 100644
index 0000000..8e19670
--- /dev/null
+++ b/vsoc_arm64/phone/aosp_cf_hwasan.mk
@@ -0,0 +1,24 @@
+#
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+$(call inherit-product, device/google/cuttlefish/vsoc_arm64/phone/aosp_cf.mk)
+
+PRODUCT_NAME := aosp_cf_arm64_phone_hwasan
+
+# Add "hwaddress" as a global sanitizer if it's missing.
+ifeq ($(filter hwaddress,$(SANITIZE_TARGET)),)
+ SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) hwaddress)
+endif
diff --git a/vsoc_arm64_only/phone/aosp_cf.mk b/vsoc_arm64_only/phone/aosp_cf.mk
index 5bcfc7b..0da151f 100644
--- a/vsoc_arm64_only/phone/aosp_cf.mk
+++ b/vsoc_arm64_only/phone/aosp_cf.mk
@@ -39,6 +39,9 @@
LOCAL_DISABLE_OMX := true
$(call inherit-product, device/google/cuttlefish/shared/phone/device_vendor.mk)
+# TODO(b/205788876) remove this when openwrt has an image for arm.
+PRODUCT_ENFORCE_MAC80211_HWSIM := false
+
# Nested virtualization support
$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
diff --git a/vsoc_arm64_only/phone/aosp_cf_hwasan.mk b/vsoc_arm64_only/phone/aosp_cf_hwasan.mk
new file mode 100644
index 0000000..c261662
--- /dev/null
+++ b/vsoc_arm64_only/phone/aosp_cf_hwasan.mk
@@ -0,0 +1,24 @@
+#
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+$(call inherit-product, device/google/cuttlefish/vsoc_arm64_only/phone/aosp_cf.mk)
+
+PRODUCT_NAME := aosp_cf_arm64_only_phone_hwasan
+
+# Add "hwaddress" as a global sanitizer if it's missing.
+ifeq ($(filter hwaddress,$(SANITIZE_TARGET)),)
+ SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) hwaddress)
+endif
diff --git a/vsoc_arm_only/BoardConfig.mk b/vsoc_arm_only/BoardConfig.mk
index e0cb5ce..54c656c 100644
--- a/vsoc_arm_only/BoardConfig.mk
+++ b/vsoc_arm_only/BoardConfig.mk
@@ -27,7 +27,7 @@
TARGET_CPU_ABI2 := armeabi
TARGET_CPU_VARIANT := cortex-a15
-BOARD_VENDOR_RAMDISK_KERNEL_MODULES += $(wildcard device/google/cuttlefish_prebuilts/kernel/5.4-arm/*.ko)
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES += $(wildcard device/google/cuttlefish_prebuilts/kernel/$(TARGET_KERNEL_USE)-arm/*.ko)
HOST_CROSS_OS := linux_bionic
HOST_CROSS_ARCH := arm64
diff --git a/vsoc_arm_only/bootloader.mk b/vsoc_arm_only/bootloader.mk
index 93de14e..959cd61 100644
--- a/vsoc_arm_only/bootloader.mk
+++ b/vsoc_arm_only/bootloader.mk
@@ -18,5 +18,3 @@
# FIXME: Copying the QEMU bootloader for now, but this should be updated..
BOARD_PREBUILT_BOOTLOADER := \
device/google/cuttlefish_prebuilts/bootloader/qemu_arm/u-boot.bin
-PRODUCT_COPY_FILES += \
- device/google/cuttlefish_prebuilts/bootloader/qemu_arm/u-boot.bin:bootloader.qemu
diff --git a/vsoc_arm_only/kernel.mk b/vsoc_arm_only/kernel.mk
index f7472e7..a216444 100644
--- a/vsoc_arm_only/kernel.mk
+++ b/vsoc_arm_only/kernel.mk
@@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-TARGET_KERNEL_PATH ?= device/google/cuttlefish_prebuilts/kernel/5.4-arm/kernel-5.4
+TARGET_KERNEL_USE ?= mainline
+TARGET_KERNEL_PATH ?= device/google/cuttlefish_prebuilts/kernel/$(TARGET_KERNEL_USE)-arm/kernel-$(TARGET_KERNEL_USE)
PRODUCT_COPY_FILES += $(TARGET_KERNEL_PATH):kernel
diff --git a/vsoc_arm_only/phone/aosp_cf.mk b/vsoc_arm_only/phone/aosp_cf.mk
index 2643c90..3ba708a 100644
--- a/vsoc_arm_only/phone/aosp_cf.mk
+++ b/vsoc_arm_only/phone/aosp_cf.mk
@@ -51,6 +51,9 @@
#
$(call inherit-product, device/google/cuttlefish/shared/phone/device_vendor.mk)
+# TODO(b/205788876) remove this when openwrt has an image for arm.
+PRODUCT_ENFORCE_MAC80211_HWSIM := false
+
#
# Special settings for the target
#
@@ -67,5 +70,10 @@
PRODUCT_MODEL := Cuttlefish arm phone 32-bit only
PRODUCT_VENDOR_PROPERTIES += \
+ ro.config.low_ram=true \
ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
ro.soc.model=$(PRODUCT_DEVICE)
+
+TARGET_SYSTEM_PROP += \
+ build/make/target/board/go_defaults_512.prop \
+ build/make/target/board/go_defaults_common.prop
diff --git a/vsoc_x86/BoardConfig.mk b/vsoc_x86/BoardConfig.mk
index 70db8c2..59c999e 100644
--- a/vsoc_x86/BoardConfig.mk
+++ b/vsoc_x86/BoardConfig.mk
@@ -30,8 +30,6 @@
TARGET_NATIVE_BRIDGE_CPU_VARIANT := generic
TARGET_NATIVE_BRIDGE_ABI := armeabi-v7a armeabi
-BUILD_BROKEN_DUP_RULES := true
-
ifeq ($(BOARD_VENDOR_RAMDISK_KERNEL_MODULES),)
BOARD_VENDOR_RAMDISK_KERNEL_MODULES += $(wildcard kernel/prebuilts/common-modules/virtual-device/5.10/x86-64/*.ko)
endif
diff --git a/vsoc_x86/go_512_phone/device.mk b/vsoc_x86/go_512_phone/device.mk
index 2df9023..1a34001 100644
--- a/vsoc_x86/go_512_phone/device.mk
+++ b/vsoc_x86/go_512_phone/device.mk
@@ -16,6 +16,7 @@
$(call inherit-product, device/google/cuttlefish/shared/go_512/device.mk)
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/kernel.mk)
+$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/bootloader.mk)
PRODUCT_NAME := aosp_cf_x86_go_512_phone
PRODUCT_DEVICE := vsoc_x86
diff --git a/vsoc_x86/go_phone/OWNERS b/vsoc_x86/go_phone/OWNERS
new file mode 100644
index 0000000..0c77d0e
--- /dev/null
+++ b/vsoc_x86/go_phone/OWNERS
@@ -0,0 +1,2 @@
[email protected]
[email protected]
diff --git a/vsoc_x86/go_phone/device.mk b/vsoc_x86/go_phone/device.mk
index 8b2a8f3..394e359 100644
--- a/vsoc_x86/go_phone/device.mk
+++ b/vsoc_x86/go_phone/device.mk
@@ -16,12 +16,13 @@
$(call inherit-product, device/google/cuttlefish/shared/go/device.mk)
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/kernel.mk)
+$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/bootloader.mk)
PRODUCT_NAME := aosp_cf_x86_go_phone
PRODUCT_DEVICE := vsoc_x86
PRODUCT_MANUFACTURER := Google
PRODUCT_MODEL := Cuttlefish x86 Go phone
-PRODUCT_PACKAGE_OVERLAYS := device/google/cuttlefish/vsoc_x86/phone/overlay
+PRODUCT_PACKAGE_OVERLAYS := device/google/cuttlefish/vsoc_x86/go_phone/overlay
PRODUCT_VENDOR_PROPERTIES += \
ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
diff --git a/vsoc_x86/go_phone/overlay/frameworks/base/core/res/res/values/config.xml b/vsoc_x86/go_phone/overlay/frameworks/base/core/res/res/values/config.xml
new file mode 100644
index 0000000..da1dca2
--- /dev/null
+++ b/vsoc_x86/go_phone/overlay/frameworks/base/core/res/res/values/config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2022, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- True if the device requires AppWidgetService even if it does not have
+ the PackageManager.FEATURE_APP_WIDGETS feature -->
+ <bool name="config_enableAppWidgetService">true</bool>
+
+ <!-- circle shape icon mask to be used for {@link AdaptiveIconDrawable} -->
+ <string name="config_icon_mask" translatable="false">"M50 0C77.6 0 100 22.4 100 50C100 77.6 77.6 100 50 100C22.4 100 0 77.6 0 50C0 22.4 22.4 0 50 0Z"</string>
+</resources>
diff --git a/vsoc_x86_64/BoardConfig.mk b/vsoc_x86_64/BoardConfig.mk
index 52dde5c..39f5967 100644
--- a/vsoc_x86_64/BoardConfig.mk
+++ b/vsoc_x86_64/BoardConfig.mk
@@ -40,8 +40,6 @@
TARGET_NATIVE_BRIDGE_2ND_CPU_VARIANT := generic
TARGET_NATIVE_BRIDGE_2ND_ABI := armeabi-v7a armeabi
-BUILD_BROKEN_DUP_RULES := true
-
ifeq ($(BOARD_VENDOR_RAMDISK_KERNEL_MODULES),)
BOARD_VENDOR_RAMDISK_KERNEL_MODULES += $(wildcard kernel/prebuilts/common-modules/virtual-device/$(TARGET_KERNEL_USE)/x86-64/*.ko)
endif
diff --git a/vsoc_x86_64/bootloader.mk b/vsoc_x86_64/bootloader.mk
index b0d8c5d..6294ca7 100644
--- a/vsoc_x86_64/bootloader.mk
+++ b/vsoc_x86_64/bootloader.mk
@@ -17,5 +17,3 @@
TARGET_NO_BOOTLOADER := false
BOARD_PREBUILT_BOOTLOADER := \
device/google/cuttlefish_prebuilts/bootloader/crosvm_x86_64/u-boot.rom
-PRODUCT_COPY_FILES += \
- device/google/cuttlefish_prebuilts/bootloader/qemu_x86_64/u-boot.rom:bootloader.qemu
diff --git a/vsoc_x86_64/phone/aosp_cf.mk b/vsoc_x86_64/phone/aosp_cf.mk
index 478452f..69f1f9a 100644
--- a/vsoc_x86_64/phone/aosp_cf.mk
+++ b/vsoc_x86_64/phone/aosp_cf.mk
@@ -36,6 +36,7 @@
#
# All components inherited here go to vendor image
#
+LOCAL_PREFER_VENDOR_APEX := true
$(call inherit-product, device/google/cuttlefish/shared/phone/device_vendor.mk)
# Nested virtualization support
@@ -48,8 +49,12 @@
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/bootloader.mk)
# Exclude features that are not available on AOSP devices.
+ifeq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_PACKAGES += com.google.aosp_cf_x86_64_phone.hardware.core_permissions
+else
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/aosp_excluded_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/aosp_excluded_hardware.xml
+endif
PRODUCT_NAME := aosp_cf_x86_64_phone
PRODUCT_DEVICE := vsoc_x86_64
diff --git a/vsoc_x86_64/phone/aosp_cf_foldable.mk b/vsoc_x86_64/phone/aosp_cf_foldable.mk
index c0872d8..f5901fc 100644
--- a/vsoc_x86_64/phone/aosp_cf_foldable.mk
+++ b/vsoc_x86_64/phone/aosp_cf_foldable.mk
@@ -33,6 +33,6 @@
# Include RRO settings that specify the fold states and screen information.
DEVICE_PACKAGE_OVERLAYS += device/google/cuttlefish/shared/foldable/overlay
# Include the foldable `launch_cvd --config foldable` option.
-SOONG_CONFIG_cvd_launch_configs += cvd_config_foldable.json
+$(call soong_config_append,cvd, launch_configs, cvd_config_foldable.json)
# Include the android-info.txt that specifies the foldable --config by default.
TARGET_BOARD_INFO_FILE := device/google/cuttlefish/shared/foldable/android-info.txt
diff --git a/vsoc_x86_64/tv/OWNERS b/vsoc_x86_64/tv/OWNERS
new file mode 100644
index 0000000..4df9f27
--- /dev/null
+++ b/vsoc_x86_64/tv/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 760438
+include device/google/atv:/OWNERS
diff --git a/vsoc_x86_64/tv/device.mk b/vsoc_x86_64/tv/device.mk
index d25210d..7ab18cd 100644
--- a/vsoc_x86_64/tv/device.mk
+++ b/vsoc_x86_64/tv/device.mk
@@ -15,10 +15,12 @@
#
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
+$(call inherit-product, device/google/atv/products/atv_base.mk)
$(call inherit-product, device/google/cuttlefish/shared/tv/device.mk)
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/kernel.mk)
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/bootloader.mk)
+PRODUCT_BRAND := generic
PRODUCT_NAME := aosp_cf_x86_64_tv
PRODUCT_DEVICE := vsoc_x86_64
PRODUCT_MANUFACTURER := Google
diff --git a/vsoc_x86_64_only/BoardConfig.mk b/vsoc_x86_64_only/BoardConfig.mk
index d702533..4a3da4c 100644
--- a/vsoc_x86_64_only/BoardConfig.mk
+++ b/vsoc_x86_64_only/BoardConfig.mk
@@ -31,5 +31,4 @@
TARGET_NATIVE_BRIDGE_ABI := arm64-v8a
AUDIOSERVER_MULTILIB := first
-BUILD_BROKEN_DUP_RULES := true
BOARD_VENDOR_RAMDISK_KERNEL_MODULES += $(wildcard kernel/prebuilts/common-modules/virtual-device/5.10/x86-64/*.ko)
diff --git a/vsoc_x86_noapex/aosp_cf_noapex.mk b/vsoc_x86_noapex/aosp_cf_noapex.mk
index aa5d3b2..dd5d642 100644
--- a/vsoc_x86_noapex/aosp_cf_noapex.mk
+++ b/vsoc_x86_noapex/aosp_cf_noapex.mk
@@ -25,7 +25,3 @@
PRODUCT_DEVICE := vsoc_x86_noapex
PRODUCT_MANUFACTURER := Google
PRODUCT_MODEL := Cuttlefish x86 phone without APEX support
-
-PRODUCT_VENDOR_PROPERTIES += \
- ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
- ro.soc.model=$(PRODUCT_DEVICE)