# PotrPeerContext_

    struct PotrPeerContext_ {
        PotrPeerId peer_id;
        int active;
        uint32_t session_id;
        uint32_t _pad_session;
        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;
        PotrWindow send_window;
        PotrMutex send_window_mutex;
        PotrWindow recv_window;
        uint8_t *frag_buf;
        size_t frag_buf_len;
        int frag_compressed;
        volatile int health_alive;
        int64_t last_recv_tv_sec;
        int32_t last_recv_tv_nsec;
        uint32_t _pad_nack_dedup;
        PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;
        uint8_t nack_dedup_next;
        uint8_t[3] _pad_reorder;
        int reorder_pending;
        uint32_t reorder_nack_num;
        uint32_t _pad_reorder_dl;
        int64_t reorder_deadline_sec;
        int32_t reorder_deadline_nsec;
        struct sockaddr_in[POTR_MAX_PATH] dest_addr;
        int n_paths;
        int64_t[POTR_MAX_PATH] path_last_recv_sec;
        int32_t[POTR_MAX_PATH] path_last_recv_nsec;
    }

N:1 モードにおける個別ピアのコンテキスト。

is_multi_peer == 1 のとき有効。ピアごとに独立した送受信状態を保持する。
ピアテーブル (PotrContext_::peers[]) に配置される。

# 1 属性

## 1.1 peer_id

    PotrPeerId peer_id;

外部公開用ピア識別子 (単調増加カウンタから付与)。

## 1.2 active

    int active;

1: 有効スロット, 0: 空き。

## 1.3 session_id

    uint32_t session_id;

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

## 1.4 _pad_session

    uint32_t _pad_session;

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

## 1.5 session_tv_sec

    int64_t session_tv_sec;

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

## 1.6 session_tv_nsec

    int32_t session_tv_nsec;

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

## 1.7 peer_session_id

    uint32_t peer_session_id;

追跡中のピアセッション識別子。

## 1.8 peer_session_tv_sec

    int64_t peer_session_tv_sec;

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

## 1.9 peer_session_tv_nsec

    int32_t peer_session_tv_nsec;

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

## 1.10 peer_session_known

    int peer_session_known;

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

## 1.11 send_window

    PotrWindow send_window;

送信ウィンドウ (NACK 再送用)。

## 1.12 send_window_mutex

    PotrMutex send_window_mutex;

send_window 保護 (送信・受信・ヘルスチェックスレッド競合)。

## 1.13 recv_window

    PotrWindow recv_window;

受信ウィンドウ (順序整列)。

## 1.14 frag_buf

    uint8_t *frag_buf;

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

## 1.15 frag_buf_len

    size_t frag_buf_len;

現在のデータ長。

## 1.16 frag_compressed

    int frag_compressed;

圧縮フラグ (非 0: 圧縮あり)。

## 1.17 health_alive

    volatile int health_alive;

疎通状態 (1: alive, 0: dead/未接続)。

## 1.18 last_recv_tv_sec

    int64_t last_recv_tv_sec;

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

## 1.19 last_recv_tv_nsec

    int32_t last_recv_tv_nsec;

最終受信時刻 ナノ秒部。

## 1.20 _pad_nack_dedup

    uint32_t _pad_nack_dedup;

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

## 1.21 nack_dedup_buf

    PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;

NACK 重複抑制バッファ。

## 1.22 nack_dedup_next

    uint8_t nack_dedup_next;

次に書き込むスロット。

## 1.23 _pad_reorder

    uint8_t[3] _pad_reorder;

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

## 1.24 reorder_pending

    int reorder_pending;

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

## 1.25 reorder_nack_num

    uint32_t reorder_nack_num;

待機中の欠番通番。

## 1.26 _pad_reorder_dl

    uint32_t _pad_reorder_dl;

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

## 1.27 reorder_deadline_sec

    int64_t reorder_deadline_sec;

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

## 1.28 reorder_deadline_nsec

    int32_t reorder_deadline_nsec;

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

## 1.29 dest_addr

    struct sockaddr_in[POTR_MAX_PATH] dest_addr;

送信先ソケットアドレス (インデックス = ctx->sock[] の添字)。未使用スロットは sin_family == 0。

## 1.30 n_paths

    int n_paths;

アクティブパス数。ループ境界には使わず管理カウンタとして使用する。

## 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;

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