porter/libsrc/porter/potrContext.h

1 ファイル

1.1 porter/libsrc/porter/potrContext.h

セッションコンテキスト内部定義ヘッダー。

PotrHandle の実体定義。ライブラリ外部には公開しない。

1.1.1 作者

c-modernization-kit sample team

1.1.2 バージョン

1.0.0

1.1.3 日付

2026/03/04

1.1.4 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

2 関数

2.1 potr_is_tcp_type

static inline int potr_is_tcp_type ( PotrType t )

TCP 通信種別 (POTR_TYPE_TCP / POTR_TYPE_TCP_BIDIR) か判定する。

2.2 potr_is_raw_type

static inline int potr_is_raw_type ( PotrType t )

RAW 系通信種別 (POTR_TYPE_*_RAW) か判定する。

2.3 potr_raw_base_type

static inline PotrType potr_raw_base_type ( PotrType t )

RAW 系通信種別をベース通信種別に変換する (非 RAW 型はそのまま返す)。

3 定数、マクロ

3.1 POTR_INVALID_SOCKET

#define POTR_INVALID_SOCKET (-1)

3.2 POTR_NACK_DEDUP_SLOTS

#define POTR_NACK_DEDUP_SLOTS 8U

NACK 重複抑制リングバッファのスロット数 (POTR_MAX_PATH × 2)。

4

4.1 PotrSocket

typedef int PotrSocket;

4.2 PotrThread

typedef pthread_t PotrThread;

4.3 PotrPeerContext

typedef struct PotrPeerContext_ PotrPeerContext;

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

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

5 クラス/構造体

5.1 PotrNackDedupEntry

struct PotrNackDedupEntry {
    uint32_t ack_num;
    uint32_t _pad;
    uint64_t time_ms;
}

NACK 重複抑制バッファの 1 エントリ。

5.1.1 属性

5.1.1.1 ack_num

uint32_t ack_num;

再送または REJECT した ack_num。

5.1.1.2 _pad

uint32_t _pad;

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

5.1.1.3 time_ms

uint64_t time_ms;

処理時刻 (ms、単調増加)。0 = 未使用スロット。

5.2 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[]) に配置される。

5.2.1 属性

5.2.1.1 peer_id

PotrPeerId peer_id;

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

5.2.1.2 active

int active;

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

5.2.1.3 session_id

uint32_t session_id;

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

5.2.1.4 _pad_session

uint32_t _pad_session;

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

5.2.1.5 session_tv_sec

int64_t session_tv_sec;

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

5.2.1.6 session_tv_nsec

int32_t session_tv_nsec;

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

5.2.1.7 peer_session_id

uint32_t peer_session_id;

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

5.2.1.8 peer_session_tv_sec

int64_t peer_session_tv_sec;

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

5.2.1.9 peer_session_tv_nsec

int32_t peer_session_tv_nsec;

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

5.2.1.10 peer_session_known

int peer_session_known;

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

5.2.1.11 send_window

PotrWindow send_window;

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

5.2.1.12 send_window_mutex

PotrMutex send_window_mutex;

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

5.2.1.13 recv_window

PotrWindow recv_window;

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

5.2.1.14 frag_buf

uint8_t *frag_buf;

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

5.2.1.15 frag_buf_len

size_t frag_buf_len;

現在のデータ長。

5.2.1.16 frag_compressed

int frag_compressed;

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

5.2.1.17 health_alive

volatile int health_alive;

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

5.2.1.18 last_recv_tv_sec

int64_t last_recv_tv_sec;

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

5.2.1.19 last_recv_tv_nsec

int32_t last_recv_tv_nsec;

最終受信時刻 ナノ秒部。

5.2.1.20 _pad_nack_dedup

uint32_t _pad_nack_dedup;

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

5.2.1.21 nack_dedup_buf

PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;

NACK 重複抑制バッファ。

5.2.1.22 nack_dedup_next

uint8_t nack_dedup_next;

次に書き込むスロット。

5.2.1.23 _pad_reorder

uint8_t[3] _pad_reorder;

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

5.2.1.24 reorder_pending

int reorder_pending;

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

5.2.1.25 reorder_nack_num

uint32_t reorder_nack_num;

待機中の欠番通番。

5.2.1.26 _pad_reorder_dl

uint32_t _pad_reorder_dl;

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

5.2.1.27 reorder_deadline_sec

int64_t reorder_deadline_sec;

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

5.2.1.28 reorder_deadline_nsec

int32_t reorder_deadline_nsec;

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

5.2.1.29 dest_addr

struct sockaddr_in[POTR_MAX_PATH] dest_addr;

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

5.2.1.30 n_paths

int n_paths;

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

5.2.1.31 path_last_recv_sec

int64_t[POTR_MAX_PATH] path_last_recv_sec;

パスごとの最終受信時刻 秒部。未使用スロットは 0。

5.2.1.32 path_last_recv_nsec

int32_t[POTR_MAX_PATH] path_last_recv_nsec;

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

5.3 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 の実体。

5.3.1 属性

5.3.1.1 callback

PotrRecvCallback callback;

受信コールバック。

5.3.1.2 recv_thread

PotrThread[POTR_MAX_PATH] recv_thread;

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

5.3.1.3 health_thread

PotrThread[POTR_MAX_PATH] health_thread;

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

5.3.1.4 health_mutex

PotrMutex[POTR_MAX_PATH] health_mutex;

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

5.3.1.5 health_wakeup

PotrCondVar[POTR_MAX_PATH] health_wakeup;

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

5.3.1.6 service

PotrServiceDef service;

サービス定義。

5.3.1.7 global

PotrGlobalConfig global;

グローバル設定。

5.3.1.8 send_window

PotrWindow send_window;

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

5.3.1.9 send_window_mutex

PotrMutex send_window_mutex;

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

5.3.1.10 recv_window

PotrWindow recv_window;

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

5.3.1.11 sock

PotrSocket[POTR_MAX_PATH] sock;

各パスの UDP ソケット。

5.3.1.12 n_path

int n_path;

有効パス数。

5.3.1.13 running

volatile int[POTR_MAX_PATH] running;

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

5.3.1.14 health_running

volatile int[POTR_MAX_PATH] health_running;

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

5.3.1.15 health_alive

volatile int health_alive;

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

5.3.1.16 role

PotrRole role;

役割 (POTR_ROLE_SENDER / POTR_ROLE_RECEIVER)。

5.3.1.17 src_addr_resolved

struct in_addr[POTR_MAX_PATH] src_addr_resolved;

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

5.3.1.18 dst_addr_resolved

struct in_addr[POTR_MAX_PATH] dst_addr_resolved;

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

5.3.1.19 dest_addr

struct sockaddr_in[POTR_MAX_PATH] dest_addr;

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

5.3.1.20 session_id

uint32_t session_id;

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

5.3.1.21 session_tv_sec

int64_t session_tv_sec;

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

5.3.1.22 session_tv_nsec

int32_t session_tv_nsec;

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

5.3.1.23 peer_session_id

uint32_t peer_session_id;

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

5.3.1.24 peer_session_tv_sec

int64_t peer_session_tv_sec;

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

5.3.1.25 peer_session_tv_nsec

int32_t peer_session_tv_nsec;

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

5.3.1.26 peer_session_known

int peer_session_known;

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

5.3.1.27 peer_port

uint16_t[POTR_MAX_PATH] peer_port;

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

5.3.1.28 last_recv_tv_nsec

int32_t last_recv_tv_nsec;

最終受信時刻 ナノ秒部。

5.3.1.29 _pad_lastrecv

uint32_t _pad_lastrecv;

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

5.3.1.30 last_recv_tv_sec

int64_t last_recv_tv_sec;

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

5.3.1.31 path_last_recv_sec

int64_t[POTR_MAX_PATH] path_last_recv_sec;

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

5.3.1.32 path_last_recv_nsec

int32_t[POTR_MAX_PATH] path_last_recv_nsec;

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

5.3.1.33 frag_buf_len

size_t frag_buf_len;

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

5.3.1.34 frag_compressed

int frag_compressed;

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

5.3.1.35 _pad_frag

uint32_t _pad_frag;

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

5.3.1.36 frag_buf

uint8_t *frag_buf;

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

5.3.1.37 compress_buf

uint8_t *compress_buf;

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

5.3.1.38 compress_buf_size

size_t compress_buf_size;

compress_buf のサイズ (バイト)。

5.3.1.39 crypto_buf

uint8_t *crypto_buf;

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

5.3.1.40 crypto_buf_size

size_t crypto_buf_size;

crypto_buf のサイズ (バイト)。

5.3.1.41 recv_buf

uint8_t *recv_buf;

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

5.3.1.42 send_wire_buf

uint8_t *send_wire_buf;

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

5.3.1.43 send_thread

PotrThread send_thread;

送信スレッドハンドル。

5.3.1.44 send_thread_running

volatile int send_thread_running;

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

5.3.1.45 _pad_send_thread

uint32_t _pad_send_thread;

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

5.3.1.46 last_send_ms

volatile uint64_t last_send_ms;

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

5.3.1.47 nack_dedup_buf

PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;

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

5.3.1.48 nack_dedup_next

uint8_t nack_dedup_next;

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

5.3.1.49 _pad_nack_dedup

uint8_t[7] _pad_nack_dedup;

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

5.3.1.50 reorder_pending

int reorder_pending;

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

5.3.1.51 reorder_nack_num

uint32_t reorder_nack_num;

待機中の欠番通番。

5.3.1.52 reorder_deadline_sec

int64_t reorder_deadline_sec;

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

5.3.1.53 reorder_deadline_nsec

int32_t reorder_deadline_nsec;

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

5.3.1.54 _pad_reorder

uint32_t _pad_reorder;

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

5.3.1.55 send_queue

PotrSendQueue send_queue;

非同期送信キュー。

5.3.1.56 is_multi_peer

int is_multi_peer;

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

5.3.1.57 _pad_multi_peer

uint32_t _pad_multi_peer;

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

5.3.1.58 peers

PotrPeerContext *peers;

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

5.3.1.59 max_peers

int max_peers;

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

5.3.1.60 n_peers

int n_peers;

現在の接続ピア数。

5.3.1.61 peers_mutex

PotrMutex peers_mutex;

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

5.3.1.62 next_peer_id

uint32_t next_peer_id;

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

5.3.1.63 tcp_listen_sock

PotrSocket[POTR_MAX_PATH] tcp_listen_sock;

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

5.3.1.64 tcp_conn_fd

PotrSocket[POTR_MAX_PATH] tcp_conn_fd;

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

5.3.1.65 tcp_active_paths

volatile int tcp_active_paths;

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

5.3.1.66 _pad_tcp_connected

uint32_t[2] _pad_tcp_connected;

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

5.3.1.67 tcp_send_mutex

PotrMutex[POTR_MAX_PATH] tcp_send_mutex;

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

5.3.1.68 recv_window_mutex

PotrMutex recv_window_mutex;

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

5.3.1.69 connect_thread

PotrThread[POTR_MAX_PATH] connect_thread;

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

5.3.1.70 connect_thread_running

volatile int[POTR_MAX_PATH] connect_thread_running;

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

5.3.1.71 tcp_state_mutex

PotrMutex tcp_state_mutex;

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

5.3.1.72 tcp_state_cv

PotrCondVar tcp_state_cv;

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

5.3.1.73 tcp_last_ping_recv_ms

volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_recv_ms;

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

5.3.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 ごと。接続確立時に現在時刻で初期化。

5.3.1.75 buf_full_suppress_cnt

int[POTR_MAX_PATH] buf_full_suppress_cnt;

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

5.3.1.76 session_establish_mutex

PotrMutex session_establish_mutex;

5.3.1.77 tcp_first_pkt_buf

uint8_t *[POTR_MAX_PATH] tcp_first_pkt_buf;

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

5.3.1.78 tcp_first_pkt_len

size_t[POTR_MAX_PATH] tcp_first_pkt_len;

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