blob: 7eecc23b11cfcc7251603cad51f4f2ef2871b730 [file] [log] [blame] [edit]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.bluetooth.gatt2;
using fuchsia.bluetooth as bt;
using zx;
/// Parameters for the LocalService.WriteValue method
type WriteValueParameters = table {
/// The PeerId of the GATT client making the write request.
/// Always present.
1: peer_id bt.PeerId;
/// The handle of the requested descriptor/characteristic.
/// Always present.
2: handle Handle;
/// The offset at which to start writing the requested value. If the offset is 0, any existing
/// value should be overwritten by the new value. Otherwise, the existing value between
/// offset:(offset + len(value)) should be changed to `value`.
/// Always present.
3: offset uint32;
/// The new value for the descriptor/characteristic.
/// Always present. May be the empty string.
4: value bytes:MAX_VALUE_LENGTH;
};
/// The parameters used to signal a characteristic value change from a LocalService to a peer.
type ValueChangedParameters = table {
/// The PeerIds of the peers to signal. The LocalService should respect the Characteristic
/// Configuration associated with a peer+handle when deciding whether to signal it.
/// If empty/not present, all peers are signalled.
1: peer_ids vector<bt.PeerId>:MAX;
/// The handle of the characteristic value being signalled.
/// Mandatory.
2: handle Handle;
/// The updated value of the characteristic.
/// Mandatory.
3: value bytes:MAX_VALUE_LENGTH;
};
/// Interface for serving a local GATT service.
protocol LocalService {
/// This notifies the current configuration of a particular characteristic/descriptor for a
/// particular peer. It will be called when the peer GATT client changes the configuration.
///
/// The Bluetooth stack maintains the state of each peer's configuration across reconnections.
/// As such, this method will also be called when a peer connects for each characteristic with
/// the initial, persisted state of the newly-connected peer's configuration. However, clients
/// should not rely on this state being persisted indefinitely by the Bluetooth stack.
///
/// + request `peer_id` The PeerId of the GATT client associated with this particular CCC.
/// + request `handle` The handle of the characteristic associated with the `notify` and
/// `indicate` parameters.
/// + request `notify` True if the client has enabled notifications, false otherwise.
/// + request `indicate` True if the client has enabled indications, false otherwise.
/// - response empty Returns nothing to acknowledge the characteristic configuration.
CharacteristicConfiguration(struct {
peer_id bt.PeerId;
handle Handle;
notify bool;
indicate bool;
}) -> ();
/// Called when a peer requests to read the value of a characteristic or descriptor. It is
/// guaranteed that the peer satisfies the permssions associated with this attribute.
///
/// + request `peer_id` The PeerId of the GATT client making the read request.
/// + request `handle` The handle of the requested descriptor/characteristic.
/// + request `offset` The offset at which to start reading the requested value.
/// - response `value` The value of the characteristic.
/// * error See `gatt2.Error` documentation for possible errors.
ReadValue(struct {
peer_id bt.PeerId;
handle Handle;
offset int32;
}) -> (struct {
value bytes:MAX_VALUE_LENGTH;
}) error Error;
/// Called when a peer issues a request to write the value of a characteristic or descriptor. It
/// is guaranteed that the peer satisfies the permissions associated with this attribute.
///
/// + request `params` The parameters of the write.
/// - response The implementation must send an empty response once the value has been updated
/// as confirmation.
/// * error See `gatt2.Error` documentation for possible errors.
// TODO(fxbug.dev/92757): Once table payloads are available, consider whether we could use an
// anonymous table here instead of a table within a struct.
WriteValue(struct {
params WriteValueParameters;
}) -> (struct {}) error Error;
/// After this event, new peers will no longer be able to discover the service, although open
/// connections to existing peer GATT clients will not be closed. This should be sent once per
/// service lifetime; sending more than once will close the protocol.
-> OnSupressDiscovery();
/// This event is used to send a notification to a peer. Notifications should be used instead of
/// indications when the service does *not* require peer confirmation of the update.
///
/// Notifications should not be sent to peers which have not enabled notifications on a
/// particular characteristic - if they are sent, they will not be propagated. The Bluetooth
/// stack will track this configuration for the lifetime of the service.
///
/// LocalServices must keep track of available credit provided by the `ValueChangedCredit`
/// method and send at most that many `OnNotifyValue` and `OnIndicateValue` events. If more
/// events are sent than available credits, the protocol will be closed.
// TODO(fxbug.dev/92757): Once named payload layouts and table payloads are available, consider
// whether this can be simply -> OnNotifyValue(ValueChangedParameters)
-> OnNotifyValue(struct {
update ValueChangedParameters;
});
/// This event is used to send an indication to a peer. Indications should be used instead of
/// notifications when the service *does* require peer confirmation of the update.
///
/// Indications should not be sent to peers which have not enabled indications on a particular
/// characteristic - if they are sent, they will not be propagated. The Bluetooth stack will
/// track this configuration for the lifetime of the service.
///
/// LocalServices must keep track of available credit provided by the `ValueChangedCredit`
/// method and send at most that many `OnNotifyValue` and `OnIndicateValue` events. If more
/// events are sent than available credits, the protocol will be closed.
///
/// If any of the peers in `update.peer_ids` fails to confirm the indication within the ATT
/// transaction timeout (30 seconds per Bluetooth 5.2 Vol. 4 Part G 3.3.3), the link between
/// the peer and the local adapter will be closed.
///
/// + request `update` The parameters associated with the changed characteristic.
/// + request `confirmation` When all the peers listed in `update.peer_ids` have confirmed
/// the indication, `confirmation` is signalled with ZX_USER_SIGNAL_0. If the implementation
/// wishes to receive indication confirmations on a per-peer basis, they should send this
/// event with a single PeerId in `update.peer_ids`.
// `confirmation` is an EventPair instead of an Event because the language bindings for Events
// treat them as resources/move-only, but the LocalService will need to retain a handle to the
// `confirmation` kernel object in order to wait on the signal from the other side.
-> OnIndicateValue(resource struct {
update ValueChangedParameters;
confirmation zx.handle:EVENTPAIR;
});
/// Add credit for sending indications and notifications. Implementors must keep track of the
/// available credit they have. For each credit the implementor can send exactly one
/// OnNotifyValue or OnIndicateValue event.
ValueChangedCredit(struct {
additional_credit uint8;
});
};
@discoverable
protocol Server {
/// Publishes the given `service` so that it is available to all remote peers.
///
/// The caller must assign distinct handles to the characteristics and descriptors listed in
/// `info`. These identifiers will be used in requests sent to `service`.
///
/// + request `info` Defines the structure of the GATT service, including characteristics and
/// descriptors that will be made available to peers.
/// + request `service` Provides the implementation of the service per the documented behavior
/// of a `LocalService`.
/// - response empty Returns nothing upon successful service publication.
/// * error See `gatt2.PublishServiceError` for possible failure modes.
PublishService(resource struct {
info ServiceInfo;
service client_end:LocalService;
}) -> (struct {}) error PublishServiceError;
};