blob: 85cb51e6f53def58459ca8eff90bb367071ca8d5 [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@available(added=HEAD)
library fuchsia.ffx.usb;
/// Maximum string length for error responses that contain strings.
const MAX_ERROR_STRING uint16 = 1024;
/// Maximum string length for the log path.
const MAX_LOG_PATH_STRING uint16 = 1024;
/// Identifies a VSOCK connection. We omit the local CID since it is always
/// assumed to be 2 (the USB driver is always the host).
type ConnectionId = struct {
remote_cid uint32;
remote_port uint32;
local_port uint32;
};
/// Information that is returned about a device when it is discovered.
type DeviceInfo = struct {
cid uint32;
meta DeviceMeta;
};
/// Optional information that is returned about a newly-discovered device.
type DeviceMeta = table {
1: serial string:MAX_ERROR_STRING;
};
/// Error indicating an operation failed because a needed port was already in
/// use.
type PortInUse = struct {
port uint32;
};
/// Errors occurring during the `Listen` operation.
type ListenError = flexible union {
1: port_in_use PortInUse;
};
/// Errors occurring during the `StopListen` operation.
type StopListenError = flexible union {
1: not_listening struct {
port uint32;
};
};
/// Errors occurring during the `Reject` operation.
type RejectError = flexible union {
1: no_such_connection ConnectionId;
};
/// Errors occurring during the `InitializeAccept` operation.
type AcceptError = flexible union {
1: no_such_connection ConnectionId;
};
/// Errors occurring during the `InitializeConnectTo` operation.
type ConnectionError = flexible union {
1: cid_not_found struct {
cid uint32;
};
2: failed struct {
message string:MAX_ERROR_STRING;
};
3: port_out_of_range struct {
port uint32;
};
4: cid_invalid struct {
cid uint32;
};
5: port_in_use PortInUse;
};
/// The initial protocol which is being spoken when we first connect to the
/// driver. All methods on this protocol indicate a protocol switch, and the
/// stream is then used to service a different protocol or provide data from a
/// connection.
@no_resource
open protocol FfxUsb {
/// Start using this stream as a control channel for the driver. After the
/// response to this method, the stream is now serving the `Control`
/// protocol below.
flexible InitializeControl() -> (struct {
current uint32;
minimum uint32;
session_id uint64;
log_path string:MAX_LOG_PATH_STRING;
});
/// Connect to the given CID and port. After a successful response from this
/// method, the stream is no longer used for FIDL communication and is now
/// transferring data for the connection.
flexible InitializeConnectTo(struct {
cid uint32;
port uint32;
}) -> () error ConnectionError;
/// Accept the given incoming connection. After a successful response from
/// this method, the stream is no longer used for FIDL communication and is
/// now transferring data for the connection.
flexible InitializeAccept(struct {
conn ConnectionId;
session_id uint64;
}) -> () error AcceptError;
/// Start using this stream as a channel for device discovery. After the
/// response to this method, the stream is now serving the `ListDevices`
/// protocol below.
flexible InitializeListDevices() -> ();
};
/// Control protocol. This contains methods for initiating listening and
/// handling incoming connection requests.
@no_resource
open protocol Control {
flexible Listen(struct {
port uint32;
}) -> () error ListenError;
flexible StopListen(struct {
port uint32;
}) -> () error StopListenError;
flexible Reject(ConnectionId) -> () error RejectError;
strict -> OnIncoming(ConnectionId);
};
/// This protocol provides events for device discovery.
@no_resource
open protocol ListDevices {
strict -> OnDeviceAppeared(DeviceInfo);
strict -> OnDeviceDisappeared(struct {
cid uint32;
});
};