__                 _ _                _
  / _| ___   ___   __| | |__   __ _ _ __| | __
 | |_ / _ \ / _ \ / _` | '_ \ / _` | '__| |/ /
 |  _| (_) | (_) | (_| | |_) | (_| | |  |   <
 |_|  \___/ \___/ \__,_|_.__/ \__,_|_|  |_|\_\

A personal BBS  ·  Missoula, Montana  ·  formerly NaClCON BBS

Connect from your terminal: telnet naclconbbs.net 23  |  ssh naclconbbs.net -p 2222

  • src/ssh/TODO.md ssh-conn.c ssh-trans.c ssh-trans.h

    From Deucе@VERT to Git commit to main/sbbs/master on Sat Mar 28 12:55:04 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/f7a7973a535c5b77c9a129b4
    Modified Files:
    src/ssh/TODO.md ssh-conn.c ssh-trans.c ssh-trans.h
    Log Message:
    Close item 76: non-blocking demux sends via tx queue

    send_packet() held tx_mtx for its entire duration including the blocking gconf.tx() I/O callback. On a congested link, the demux thread blocked
    on tx_mtx for fire-and-forget protocol responses, stalling all incoming
    packet processing.

    The naive split (prepare under lock, I/O outside) doesn't work: SSH MACs
    use implicit sequence numbers, so wire order must match assignment order.
    Any split requires a second ordering mechanism that re-serializes I/O.

    Instead, add a send queue: the demux thread uses mtx_trylock on tx_mtx --
    fast path sends immediately, slow path enqueues the payload (linked list
    under independent tx_queue_mtx). send_packet() drains the queue before
    each send, preserving sequence-number ordering.

    Extracted send_packet_inner() for the core build/MAC/encrypt/I/O logic.
    Three demux call sites changed to send_or_queue(): CHANNEL_FAILURE, OPEN_FAILURE, and GLOBAL_REQUEST reply.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---
    ■ Synchronet ■ Vertrauen ■ Home of Synchronet ■ [vert/cvs/bbs].synchro.net