blob: df7bed83d1af6736406e291740fb3748e1b3afc1 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_L2CAP_TX_ENGINE_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_L2CAP_TX_ENGINE_H_
#include <lib/fit/function.h>
#include <zircon/assert.h>
#include "src/connectivity/bluetooth/core/bt-host/common/byte_buffer.h"
#include "src/connectivity/bluetooth/core/bt-host/l2cap/l2cap.h"
namespace bt {
namespace l2cap {
namespace internal {
// The interface between a Channel, and the module implementing the
// mode-specific transmit logic. The primary purposes of an TxEngine are a) to
// transform SDUs into PDUs, and b) to transmit/retransmit the PDUs at the
// appropriate time. See Bluetooth Core Spec v5.0, Volume 3, Part A, Sec 2.4,
// "Modes of Operation" for more information about the possible modes.
class TxEngine {
public:
// Type defining the callback that a TxEngine uses to deliver a PDU to lower
// layers. The callee may assume that the ByteBufferPtr owns an instance of a
// DynamicByteBuffer or SlabBuffer.
using SendBasicFrameCallback = fit::function<void(ByteBufferPtr pdu)>;
// Creates a transmit engine, which will invoke |send_basic_frame_callback|
// when a PDU is ready for transmission. This callback may be invoked
// synchronously from QueueSdu(), as well as asynchronously (e.g. when a
// retransmission timer expires).
//
// NOTE: The user of this class must ensure that a synchronous invocation of
// |send_basic_frame_callback| does not deadlock. E.g., the callback must not
// attempt to lock the same mutex as the caller of QueueSdu().
TxEngine(ChannelId channel_id, uint16_t tx_mtu,
SendBasicFrameCallback send_basic_frame_callback)
: channel_id_(channel_id),
tx_mtu_(tx_mtu),
send_basic_frame_callback_(std::move(send_basic_frame_callback)) {
ZX_ASSERT(tx_mtu_);
}
virtual ~TxEngine() = default;
// Queues an SDU for transmission, returning true on success.
//
// * As noted in the ctor documentation, this _may_ result in a synchronous
// invocation of |send_basic_frame_callback_|.
// * It is presumed that the ByteBufferPtr owns an instance of a
// DynamicByteBuffer or SlabBuffer.
virtual bool QueueSdu(ByteBufferPtr) = 0;
protected:
const ChannelId channel_id_;
const uint16_t tx_mtu_;
// Invoked when a PDU is ready for transmission.
const SendBasicFrameCallback send_basic_frame_callback_;
private:
DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(TxEngine);
};
} // namespace internal
} // namespace l2cap
} // namespace bt
#endif // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_L2CAP_TX_ENGINE_H_