25static constexpr uint16_t MAX_HANDSHAKE_SIZE = 128;
29static constexpr uint16_t MAX_MESSAGE_SIZE = 8192;
31static constexpr uint16_t MAX_MESSAGE_SIZE = 32768;
36static constexpr uint16_t RX_BUF_NULL_TERMINATOR = 1;
40static constexpr size_t MAX_MESSAGES_PER_BATCH = 34;
43static constexpr size_t CLIENT_INFO_NAME_MAX_LEN = 32;
104 const char *
get_peername_to(std::span<char, socket::SOCKADDR_STR_LEN> buf)
const;
121 int err = this->
socket_->close();
127 int err = this->
socket_->shutdown(how);
130 if (how == SHUT_RDWR) {
154 if (!is_log_message) {
186#if defined(USE_API_NOISE) && defined(USE_API_PLAINTEXT)
190#elif defined(USE_API_NOISE)
226 return (iovcnt == 1) ? this->
socket_->write(iov[0].iov_base, iov[0].iov_len) : this->
socket_->writev(iov, iovcnt);
235 if (sent ==
static_cast<ssize_t>(
len)) [[likely]] {
236#ifdef HELPER_LOG_PACKETS
251#ifdef HELPER_LOG_PACKETS
314 int val = enable ? 1 : 0;
315 this->socket_->setsockopt(IPPROTO_TCP, TCP_NODELAY, &
val,
sizeof(
int));
Byte buffer that skips zero-initialization on resize().
void release()
Release all memory (equivalent to std::vector swap trick).
const char * get_client_name() const
APIError handle_socket_read_result_(ssize_t received)
APIError ESPHOME_ALWAYS_INLINE write_raw_fast_buf_(const void *data, uint16_t len)
void log_packet_sending_(const void *data, uint16_t len)
virtual APIError read_packet(ReadPacketBuffer *buffer)=0
bool is_socket_ready() const
uint8_t frame_header_padding() const
int getpeername(struct sockaddr *addr, socklen_t *addrlen)
virtual APIError loop()=0
virtual APIError write_protobuf_messages(ProtoWriteBuffer buffer, std::span< const MessageInfo > messages)=0
APIError shutdown(int how)
uint8_t frame_header_padding_
virtual APIError init()=0
APIError write_raw_buf_(const void *data, uint16_t len, ssize_t sent=WRITE_NOT_ATTEMPTED)
static constexpr ssize_t WRITE_FAILED
uint8_t frame_header_size(uint16_t payload_size, uint8_t message_type) const
APIError write_raw_iov_(const struct iovec *iov, int iovcnt, uint16_t total_write_len, ssize_t sent=WRITE_NOT_ATTEMPTED)
APIFrameHelper(std::unique_ptr< socket::Socket > socket)
static constexpr ssize_t WRITE_NOT_ATTEMPTED
const char * get_peername_to(std::span< char, socket::SOCKADDR_STR_LEN > buf) const
APIOverflowBuffer overflow_buf_
std::unique_ptr< socket::Socket > socket_
uint8_t frame_footer_size() const
char client_name_[CLIENT_INFO_NAME_MAX_LEN]
static constexpr uint8_t LOG_NAGLE_COUNT
uint8_t frame_footer_size_
void set_client_name(const char *name, size_t len)
virtual APIError write_protobuf_packet(uint8_t type, ProtoWriteBuffer buffer)=0
APIError ESPHOME_ALWAYS_INLINE check_data_state_() const
void set_nodelay_for_message(bool is_log_message)
bool can_write_without_blocking()
void set_nodelay_raw_(bool enable)
virtual ~APIFrameHelper()=default
APIError drain_overflow_and_handle_errors_()
ssize_t ESPHOME_ALWAYS_INLINE write_iov_to_socket_(const struct iovec *iov, int iovcnt)
Circular queue of heap-allocated byte buffers used as a TCP send backlog.
bool empty() const
True when no backlogged data is waiting.
static constexpr uint8_t ESPHOME_ALWAYS_INLINE varint8(uint8_t value)
static constexpr uint8_t ESPHOME_ALWAYS_INLINE varint16(uint16_t value)
const LogString * api_error_to_logstr(APIError err)
@ HANDSHAKESTATE_READ_FAILED
@ HANDSHAKESTATE_BAD_STATE
@ HANDSHAKESTATE_SPLIT_FAILED
@ BAD_HANDSHAKE_PACKET_LEN
@ BAD_HANDSHAKE_ERROR_BYTE
@ HANDSHAKESTATE_SETUP_FAILED
@ CIPHERSTATE_ENCRYPT_FAILED
@ CIPHERSTATE_DECRYPT_FAILED
@ HANDSHAKESTATE_WRITE_FAILED
MessageInfo(uint8_t type, uint16_t off, uint16_t size, uint8_t hdr)