// 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.

// Note that if you add/remove methods in this file you must update
// the metrics sql as well ./android/scripts/gen-grpc-sql.py
//
// Please group deleted methods in a block including the date (MM/DD/YY)
// it was removed. This enables us to easily keep metrics around after removal
//
// List of deleted methods
// rpc iWasDeleted (03/12/12)
// ...
syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.android.emulation.bluetooth";
option csharp_namespace = "Android.Emulation.Bluetooth";
option objc_class_prefix = "AEB";
option cc_enable_arenas = true;

import "emulated_bluetooth_packets.proto";
package android.emulation.bluetooth;

// This is a service which allows you to directly intercept the VHCI packets
// that are coming and going to the device before they are delivered to
// the rootcanal service described below.
//
// This service is usually not available on the emulator, and must be explictly
// requested from the commandline.
service VhciForwardingService {
    // This attach directly to /dev/vhci inside the android guest if available
    //
    // - This will disable root canal.
    // - You will have to provide your own virtual bluetooth chip.
    //
    // Some things to be aware of:
    //  - Only one client can be active.
    //  - Registering when bluetooth is active in android can result in
    //  undefined behavior.
    //  - If a client disconnects, rootcanal will be activated again
    //
    // Status codes:
    //   -  FAILED_PRECONDITION (code 9) If another client is controlling /dev/vhci.
    //
    // This is an internal testing only interface, and is NOT publicly
    // supported.
    rpc attachVhci(stream HCIPacket) returns (stream HCIPacket);
};
