diff --git a/llarp/ev.cpp b/llarp/ev.cpp index 1d7d23b13..4778b384f 100644 --- a/llarp/ev.cpp +++ b/llarp/ev.cpp @@ -117,10 +117,20 @@ llarp_ev_add_tun(struct llarp_ev_loop *loop, struct llarp_tun_io *tun) } bool -llarp_ev_tun_async_write(struct llarp_tun_io *tun, const void *pkt, size_t sz) +llarp_tcp_conn_async_write(struct llarp_tcp_conn *conn, const void *pkt, + size_t sz) { - return static_cast< llarp::ev_io * >(tun->impl)->queue_write( - (const byte_t *)pkt, sz); + constexpr size_t buffsz = llarp::ev_io::WriteBuffer::BufferSize; + const byte_t *ptr = (const byte_t *)pkt; + llarp::ev_io *impl = static_cast< llarp::ev_io * >(conn->impl); + while(sz > buffsz) + { + if(!impl->queue_write((const byte_t *)ptr, buffsz)) + return false; + ptr += buffsz; + sz -= buffsz; + } + return impl->queue_write(ptr, sz); } bool @@ -149,11 +159,12 @@ llarp_tcp_acceptor_close(struct llarp_tcp_acceptor *tcp) } bool -llarp_tcp_conn_async_write(struct llarp_tcp_conn *conn, const void *buf, - size_t sz) +llarp_ev_tun_async_write(struct llarp_tun_io *tun, const void *buf, size_t sz) { - return static_cast< llarp::ev_io * >(conn->impl) - ->queue_write((const byte_t *)buf, sz); + if(sz > llarp::ev_io::WriteBuffer::BufferSize) + return false; + return static_cast< llarp::ev_io * >(tun->impl)->queue_write( + (const byte_t *)buf, sz); } void diff --git a/llarp/ev.hpp b/llarp/ev.hpp index 9af1ef15d..94cd51a53 100644 --- a/llarp/ev.hpp +++ b/llarp/ev.hpp @@ -29,13 +29,14 @@ namespace llarp { struct WriteBuffer { - llarp_time_t timestamp = 0; + static constexpr size_t BufferSize = 2048; + llarp_time_t timestamp = 0; size_t bufsz; - byte_t buf[1500]; + byte_t buf[BufferSize]; WriteBuffer() = default; - WriteBuffer(const void* ptr, size_t sz) + WriteBuffer(const byte_t* ptr, size_t sz) { if(sz <= sizeof(buf)) {