# PotrContext_

    struct PotrContext_ {
        PotrRecvCallback callback;
        PotrThread[POTR_MAX_PATH] recv_thread;
        PotrThread[POTR_MAX_PATH] health_thread;
        PotrMutex[POTR_MAX_PATH] health_mutex;
        PotrCondVar[POTR_MAX_PATH] health_wakeup;
        PotrServiceDef service;
        PotrGlobalConfig global;
        PotrWindow send_window;
        PotrMutex send_window_mutex;
        PotrWindow recv_window;
        PotrSocket[POTR_MAX_PATH] sock;
        int n_path;
        volatile int[POTR_MAX_PATH] running;
        volatile int[POTR_MAX_PATH] health_running;
        volatile int health_alive;
        PotrRole role;
        struct in_addr[POTR_MAX_PATH] src_addr_resolved;
        struct in_addr[POTR_MAX_PATH] dst_addr_resolved;
        struct sockaddr_in[POTR_MAX_PATH] dest_addr;
        uint32_t session_id;
        int64_t session_tv_sec;
        int32_t session_tv_nsec;
        uint32_t peer_session_id;
        int64_t peer_session_tv_sec;
        int32_t peer_session_tv_nsec;
        int peer_session_known;
        uint16_t[POTR_MAX_PATH] peer_port;
        int32_t last_recv_tv_nsec;
        uint32_t _pad_lastrecv;
        int64_t last_recv_tv_sec;
        int64_t[POTR_MAX_PATH] path_last_recv_sec;
        int32_t[POTR_MAX_PATH] path_last_recv_nsec;
        size_t frag_buf_len;
        int frag_compressed;
        uint32_t _pad_frag;
        uint8_t *frag_buf;
        uint8_t *compress_buf;
        size_t compress_buf_size;
        uint8_t *crypto_buf;
        size_t crypto_buf_size;
        uint8_t *recv_buf;
        uint8_t *send_wire_buf;
        PotrThread send_thread;
        volatile int send_thread_running;
        uint32_t _pad_send_thread;
        volatile uint64_t last_send_ms;
        PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;
        uint8_t nack_dedup_next;
        uint8_t[7] _pad_nack_dedup;
        int reorder_pending;
        uint32_t reorder_nack_num;
        int64_t reorder_deadline_sec;
        int32_t reorder_deadline_nsec;
        uint32_t _pad_reorder;
        PotrSendQueue send_queue;
        int is_multi_peer;
        uint32_t _pad_multi_peer;
        PotrPeerContext *peers;
        int max_peers;
        int n_peers;
        PotrMutex peers_mutex;
        uint32_t next_peer_id;
        PotrSocket[POTR_MAX_PATH] tcp_listen_sock;
        PotrSocket[POTR_MAX_PATH] tcp_conn_fd;
        volatile int tcp_active_paths;
        uint32_t[2] _pad_tcp_connected;
        PotrMutex[POTR_MAX_PATH] tcp_send_mutex;
        PotrMutex recv_window_mutex;
        PotrThread[POTR_MAX_PATH] connect_thread;
        volatile int[POTR_MAX_PATH] connect_thread_running;
        PotrMutex tcp_state_mutex;
        PotrCondVar tcp_state_cv;
        volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_recv_ms;
        volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_req_recv_ms;
        int[POTR_MAX_PATH] buf_full_suppress_cnt;
        PotrMutex session_establish_mutex;
        uint8_t *[POTR_MAX_PATH] tcp_first_pkt_buf;
        size_t[POTR_MAX_PATH] tcp_first_pkt_len;
    }

セッションコンテキスト構造体。PotrHandle の実体。

# 1 属性

## 1.1 callback

    PotrRecvCallback callback;

受信コールバック。

## 1.2 recv_thread

    PotrThread[POTR_MAX_PATH] recv_thread;

受信スレッドハンドル (path ごと)。

## 1.3 health_thread

    PotrThread[POTR_MAX_PATH] health_thread;

ヘルスチェックスレッドハンドル (path ごと、送信者のみ)。

## 1.4 health_mutex

    PotrMutex[POTR_MAX_PATH] health_mutex;

ヘルスチェックスレッド停止用ミューテックス (path ごと)。

## 1.5 health_wakeup

    PotrCondVar[POTR_MAX_PATH] health_wakeup;

ヘルスチェックスレッドを即時起床させる条件変数 (path ごと)。

## 1.6 service

    PotrServiceDef service;

サービス定義。

## 1.7 global

    PotrGlobalConfig global;

グローバル設定。

## 1.8 send_window

    PotrWindow send_window;

送信バッファ (過去 N パケット保持。NACK 再送・REJECT 判定に使用)。

## 1.9 send_window_mutex

    PotrMutex send_window_mutex;

send_window 保護用ミューテックス (送信スレッド・ヘルスチェックスレッド・受信スレッドが競合するため)。

## 1.10 recv_window

    PotrWindow recv_window;

受信ウィンドウ (順序整列・欠番検出)。

## 1.11 sock

    PotrSocket[POTR_MAX_PATH] sock;

各パスの UDP ソケット。

## 1.12 n_path

    int n_path;

有効パス数。

## 1.13 running

    volatile int[POTR_MAX_PATH] running;

受信スレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。

## 1.14 health_running

    volatile int[POTR_MAX_PATH] health_running;

ヘルスチェックスレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。

## 1.15 health_alive

    volatile int health_alive;

疎通状態 (1: alive, 0: dead/未接続)。UDP 用。受信者が管理。

## 1.16 role

    PotrRole role;

役割 (POTR_ROLE_SENDER / POTR_ROLE_RECEIVER)。

## 1.17 src_addr_resolved

    struct in_addr[POTR_MAX_PATH] src_addr_resolved;

解決済み送信元 IPv4 アドレス。

## 1.18 dst_addr_resolved

    struct in_addr[POTR_MAX_PATH] dst_addr_resolved;

解決済み宛先 IPv4 アドレス (unicast のみ)。

## 1.19 dest_addr

    struct sockaddr_in[POTR_MAX_PATH] dest_addr;

送信先ソケットアドレス (送信者が sendto に使用)。

## 1.20 session_id

    uint32_t session_id;

自セッション識別子 (乱数)。

## 1.21 session_tv_sec

    int64_t session_tv_sec;

自セッション開始時刻 秒部。

## 1.22 session_tv_nsec

    int32_t session_tv_nsec;

自セッション開始時刻 ナノ秒部。

## 1.23 peer_session_id

    uint32_t peer_session_id;

追跡中の相手セッション識別子。

## 1.24 peer_session_tv_sec

    int64_t peer_session_tv_sec;

追跡中の相手セッション開始時刻 秒部。

## 1.25 peer_session_tv_nsec

    int32_t peer_session_tv_nsec;

追跡中の相手セッション開始時刻 ナノ秒部。

## 1.26 peer_session_known

    int peer_session_known;

相手セッションが初期化済みか (0: 未初期化)。

## 1.27 peer_port

    uint16_t[POTR_MAX_PATH] peer_port;

各パスで観測した送信者ポート (NBO)。0 = 未観測。

## 1.28 last_recv_tv_nsec

    int32_t last_recv_tv_nsec;

最終受信時刻 ナノ秒部。

## 1.29 _pad_lastrecv

    uint32_t _pad_lastrecv;

パディング (last_recv_tv_sec を 8 バイト境界に揃える)。

## 1.30 last_recv_tv_sec

    int64_t last_recv_tv_sec;

最終受信時刻 秒部。0 = 未受信。

## 1.31 path_last_recv_sec

    int64_t[POTR_MAX_PATH] path_last_recv_sec;

パスごとの最終受信時刻 秒部。0 = 未受信。

## 1.32 path_last_recv_nsec

    int32_t[POTR_MAX_PATH] path_last_recv_nsec;

パスごとの最終受信時刻 ナノ秒部。

## 1.33 frag_buf_len

    size_t frag_buf_len;

フラグメント結合バッファの現在のデータ長 (バイト)。

## 1.34 frag_compressed

    int frag_compressed;

フラグメント受信中の圧縮フラグ (非 0: 圧縮あり)。

## 1.35 _pad_frag

    uint32_t _pad_frag;

パディング (frag_buf を 8 バイト境界に揃える)。

## 1.36 frag_buf

    uint8_t *frag_buf;

フラグメント結合バッファ (動的確保。max_message_size バイト)。

## 1.37 compress_buf

    uint8_t *compress_buf;

圧縮・解凍用一時バッファ (動的確保)。

## 1.38 compress_buf_size

    size_t compress_buf_size;

compress_buf のサイズ (バイト)。

## 1.39 crypto_buf

    uint8_t *crypto_buf;

暗号化・復号用一時バッファ (動的確保)。

## 1.40 crypto_buf_size

    size_t crypto_buf_size;

crypto_buf のサイズ (バイト)。

## 1.41 recv_buf

    uint8_t *recv_buf;

受信バッファ / 再送 wire 組立バッファ (動的確保。PACKET_HEADER_SIZE + max_payload バイト)。

## 1.42 send_wire_buf

    uint8_t *send_wire_buf;

送信 wire 組立バッファ (動的確保。PACKET_HEADER_SIZE + max_payload バイト)。送信スレッドのみ使用。

## 1.43 send_thread

    PotrThread send_thread;

送信スレッドハンドル。

## 1.44 send_thread_running

    volatile int send_thread_running;

送信スレッド実行フラグ (1: 実行中, 0: 停止)。

## 1.45 _pad_send_thread

    uint32_t _pad_send_thread;

パディング (last_send_ms を 8 バイト境界に揃える)。

## 1.46 last_send_ms

    volatile uint64_t last_send_ms;

最終パケット送信時刻 (データ or PING、ms、単調増加)。0 = 未送信。

## 1.47 nack_dedup_buf

    PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;

NACK 重複抑制エントリ配列。

## 1.48 nack_dedup_next

    uint8_t nack_dedup_next;

次に書き込むスロットインデックス。

## 1.49 _pad_nack_dedup

    uint8_t[7] _pad_nack_dedup;

パディング (reorder フィールドを 4 バイト境界に揃える)。

## 1.50 reorder_pending

    int reorder_pending;

リオーダー待機中か (1: 待機中、0: 待機なし)。

## 1.51 reorder_nack_num

    uint32_t reorder_nack_num;

待機中の欠番通番。

## 1.52 reorder_deadline_sec

    int64_t reorder_deadline_sec;

タイムアウト期限 秒部 (CLOCK_MONOTONIC)。

## 1.53 reorder_deadline_nsec

    int32_t reorder_deadline_nsec;

タイムアウト期限 ナノ秒部。

## 1.54 _pad_reorder

    uint32_t _pad_reorder;

パディング (send_queue を 8 バイト境界に揃える)。

## 1.55 send_queue

    PotrSendQueue send_queue;

非同期送信キュー。

## 1.56 is_multi_peer

    int is_multi_peer;

1: N:1 モード (src_addr/src_port 省略), 0: 1:1 モード。

## 1.57 _pad_multi_peer

    uint32_t _pad_multi_peer;

パディング (peers を 8 バイト境界に揃える)。

## 1.58 peers

    PotrPeerContext *peers;

ピアテーブル (動的確保。max_peers エントリ)。

## 1.59 max_peers

    int max_peers;

ピアテーブルサイズ (service.max_peers から取得)。

## 1.60 n_peers

    int n_peers;

現在の接続ピア数。

## 1.61 peers_mutex

    PotrMutex peers_mutex;

ピアテーブル保護用ミューテックス。

## 1.62 next_peer_id

    uint32_t next_peer_id;

次に発行するピア ID (単調増加、初期値 1)。

## 1.63 tcp_listen_sock

    PotrSocket[POTR_MAX_PATH] tcp_listen_sock;

RECEIVER: listen ソケット (path ごと)。

## 1.64 tcp_conn_fd

    PotrSocket[POTR_MAX_PATH] tcp_conn_fd;

アクティブ TCP 接続 fd (path ごと)。

## 1.65 tcp_active_paths

    volatile int tcp_active_paths;

アクティブ TCP path 数 (0 = 全切断)。

## 1.66 _pad_tcp_connected

    uint32_t[2] _pad_tcp_connected;

パディング (tcp_send_mutex を 8 バイト境界に揃える。8 バイト確保)。

## 1.67 tcp_send_mutex

    PotrMutex[POTR_MAX_PATH] tcp_send_mutex;

TCP send() 排他制御 (path ごと)。送信スレッド・ヘルスチェックスレッド・recv スレッド競合防止。

## 1.68 recv_window_mutex

    PotrMutex recv_window_mutex;

recv_window 保護用ミューテックス。

## 1.69 connect_thread

    PotrThread[POTR_MAX_PATH] connect_thread;

SENDER: connect スレッド。RECEIVER: accept スレッド。path ごと。

## 1.70 connect_thread_running

    volatile int[POTR_MAX_PATH] connect_thread_running;

connect スレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。

## 1.71 tcp_state_mutex

    PotrMutex tcp_state_mutex;

tcp_state_cv 保護用ミューテックス。tcp_active_paths のカウンタ更新も保護。

## 1.72 tcp_state_cv

    PotrCondVar tcp_state_cv;

切断通知・reconnect sleep の中断用条件変数。

## 1.73 tcp_last_ping_recv_ms

    volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_recv_ms;

TCP PING 応答最終受信時刻 (ms, CLOCK_MONOTONIC 基準)。path ごと。接続確立時に現在時刻で初期化。

## 1.74 tcp_last_ping_req_recv_ms

    volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_req_recv_ms;

TCP PING 要求最終受信時刻 (ms, CLOCK_MONOTONIC 基準)。path ごと。接続確立時に現在時刻で初期化。

## 1.75 buf_full_suppress_cnt

    int[POTR_MAX_PATH] buf_full_suppress_cnt;

path ごとの送信バッファ満杯ログ抑制カウンタ (0: 抑制なし、1-10: 抑制中)。

## 1.76 session_establish_mutex

    PotrMutex session_establish_mutex;

## 1.77 tcp_first_pkt_buf

    uint8_t *[POTR_MAX_PATH] tcp_first_pkt_buf;

先読みパケットバッファ (動的確保、PACKET_HEADER_SIZE + max_payload バイト)。

## 1.78 tcp_first_pkt_len

    size_t[POTR_MAX_PATH] tcp_first_pkt_len;

先読みパケットのバイト数 (0: 先読みなし)。