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;
91#if defined(USE_API_NOISE) && defined(USE_API_PLAINTEXT)
109 const char *
get_peername_to(std::span<char, socket::SOCKADDR_STR_LEN> buf)
const;
126 int err = this->
socket_->close();
132 int err = this->
socket_->shutdown(how);
135 if (how == SHUT_RDWR) {
159 if (!is_log_message) {
191#if defined(USE_API_NOISE) && defined(USE_API_PLAINTEXT)
195#elif defined(USE_API_NOISE)
208#if defined(USE_API_NOISE) && defined(USE_API_PLAINTEXT)
240 return (iovcnt == 1) ? this->
socket_->write(iov[0].iov_base, iov[0].iov_len) : this->
socket_->writev(iov, iovcnt);
249 if (sent ==
static_cast<ssize_t>(
len)) [[likely]] {
250#ifdef HELPER_LOG_PACKETS
265#ifdef HELPER_LOG_PACKETS
328 int val = enable ? 1 : 0;
329 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
std::unique_ptr< socket::Socket > release_socket_for_switch()
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
void release_overflow_buffer()
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_header_size(uint16_t payload_size, uint16_t message_type) const
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)
APIError ESPHOME_ALWAYS_INLINE check_data_state_() const
void set_nodelay_for_message(bool is_log_message)
bool can_write_without_blocking()
virtual APIError write_protobuf_packet(uint16_t type, ProtoWriteBuffer buffer)=0
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)
TCP send backlog, only used when the socket send buffer is full.
void release()
Free the retained storage, now if empty, otherwise once it has drained.
bool empty() const
True when no backlogged data is waiting.
static constexpr uint8_t ESPHOME_ALWAYS_INLINE varint16(uint16_t value)
const LogString * api_error_to_logstr(APIError err)
@ HANDSHAKESTATE_READ_FAILED
@ PROTOCOL_SWITCH_TO_NOISE
@ 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(uint16_t type, uint16_t off, uint16_t size, uint8_t hdr)