セッションコンテキスト内部定義ヘッダー。
PotrHandle の実体定義。ライブラリ外部には公開しない。
c-modernization-kit sample team
1.0.0
2026/03/04
Copyright (C) CompanyName, Ltd. 2026. All rights reserved.
static inline int potr_is_tcp_type ( PotrType t )TCP 通信種別 (POTR_TYPE_TCP / POTR_TYPE_TCP_BIDIR) か判定する。
static inline int potr_is_raw_type ( PotrType t )RAW 系通信種別 (POTR_TYPE_*_RAW) か判定する。
static inline PotrType potr_raw_base_type ( PotrType t )RAW 系通信種別をベース通信種別に変換する (非 RAW 型はそのまま返す)。
#define POTR_INVALID_SOCKET (-1)#define POTR_NACK_DEDUP_SLOTS 8UNACK 重複抑制リングバッファのスロット数 (POTR_MAX_PATH × 2)。
typedef int PotrSocket;typedef pthread_t PotrThread;typedef struct PotrPeerContext_ PotrPeerContext;N:1 モードにおける個別ピアのコンテキスト。
is_multi_peer == 1 のとき有効。ピアごとに独立した送受信状態を保持する。
ピアテーブル (PotrContext_::peers[]) に配置される。
struct PotrNackDedupEntry {
uint32_t ack_num;
uint32_t _pad;
uint64_t time_ms;
}NACK 重複抑制バッファの 1 エントリ。
uint32_t ack_num;再送または REJECT した ack_num。
uint32_t _pad;パディング (time_ms を 8 バイト境界に揃える)。
uint64_t time_ms;処理時刻 (ms、単調増加)。0 = 未使用スロット。
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[]) に配置される。
PotrPeerId peer_id;外部公開用ピア識別子 (単調増加カウンタから付与)。
int active;1: 有効スロット, 0: 空き。
uint32_t session_id;自セッション識別子 (乱数)。
uint32_t _pad_session;パディング (session_tv_sec を 8 バイト境界に揃える)。
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;ピアセッションが初期化済みか (0: 未初期化)。
PotrWindow send_window;送信ウィンドウ (NACK 再送用)。
PotrMutex send_window_mutex;send_window 保護 (送信・受信・ヘルスチェックスレッド競合)。
PotrWindow recv_window;受信ウィンドウ (順序整列)。
uint8_t *frag_buf;フラグメント結合バッファ (動的確保)。
size_t frag_buf_len;現在のデータ長。
int frag_compressed;圧縮フラグ (非 0: 圧縮あり)。
volatile int health_alive;疎通状態 (1: alive, 0: dead/未接続)。
int64_t last_recv_tv_sec;最終受信時刻 秒部 (CLOCK_MONOTONIC)。0 = 未受信。
int32_t last_recv_tv_nsec;最終受信時刻 ナノ秒部。
uint32_t _pad_nack_dedup;パディング (nack_dedup_buf を 8 バイト境界に揃える)。
PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;NACK 重複抑制バッファ。
uint8_t nack_dedup_next;次に書き込むスロット。
uint8_t[3] _pad_reorder;パディング (reorder_pending を 4 バイト境界に揃える)。
int reorder_pending;リオーダー待機中 (1: 待機中, 0: 待機なし)。
uint32_t reorder_nack_num;待機中の欠番通番。
uint32_t _pad_reorder_dl;パディング (reorder_deadline_sec を 8 バイト境界に揃える)。
int64_t reorder_deadline_sec;タイムアウト期限 秒部 (CLOCK_MONOTONIC)。
int32_t reorder_deadline_nsec;タイムアウト期限 ナノ秒部。
struct sockaddr_in[POTR_MAX_PATH] dest_addr;送信先ソケットアドレス (インデックス = ctx->sock[] の添字)。未使用スロットは sin_family == 0。
int n_paths;アクティブパス数。ループ境界には使わず管理カウンタとして使用する。
int64_t[POTR_MAX_PATH] path_last_recv_sec;パスごとの最終受信時刻 秒部。未使用スロットは 0。
int32_t[POTR_MAX_PATH] path_last_recv_nsec;パスごとの最終受信時刻 ナノ秒部。
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 の実体。
PotrRecvCallback callback;受信コールバック。
PotrThread[POTR_MAX_PATH] recv_thread;受信スレッドハンドル (path ごと)。
PotrThread[POTR_MAX_PATH] health_thread;ヘルスチェックスレッドハンドル (path ごと、送信者のみ)。
PotrMutex[POTR_MAX_PATH] health_mutex;ヘルスチェックスレッド停止用ミューテックス (path ごと)。
PotrCondVar[POTR_MAX_PATH] health_wakeup;ヘルスチェックスレッドを即時起床させる条件変数 (path ごと)。
PotrServiceDef service;サービス定義。
PotrGlobalConfig global;グローバル設定。
PotrWindow send_window;送信バッファ (過去 N パケット保持。NACK 再送・REJECT 判定に使用)。
PotrMutex send_window_mutex;send_window 保護用ミューテックス (送信スレッド・ヘルスチェックスレッド・受信スレッドが競合するため)。
PotrWindow recv_window;受信ウィンドウ (順序整列・欠番検出)。
PotrSocket[POTR_MAX_PATH] sock;各パスの UDP ソケット。
int n_path;有効パス数。
volatile int[POTR_MAX_PATH] running;受信スレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。
volatile int[POTR_MAX_PATH] health_running;ヘルスチェックスレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。
volatile int health_alive;疎通状態 (1: alive, 0: dead/未接続)。UDP 用。受信者が管理。
PotrRole role;役割 (POTR_ROLE_SENDER / POTR_ROLE_RECEIVER)。
struct in_addr[POTR_MAX_PATH] src_addr_resolved;解決済み送信元 IPv4 アドレス。
struct in_addr[POTR_MAX_PATH] dst_addr_resolved;解決済み宛先 IPv4 アドレス (unicast のみ)。
struct sockaddr_in[POTR_MAX_PATH] dest_addr;送信先ソケットアドレス (送信者が sendto に使用)。
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;相手セッションが初期化済みか (0: 未初期化)。
uint16_t[POTR_MAX_PATH] peer_port;各パスで観測した送信者ポート (NBO)。0 = 未観測。
int32_t last_recv_tv_nsec;最終受信時刻 ナノ秒部。
uint32_t _pad_lastrecv;パディング (last_recv_tv_sec を 8 バイト境界に揃える)。
int64_t last_recv_tv_sec;最終受信時刻 秒部。0 = 未受信。
int64_t[POTR_MAX_PATH] path_last_recv_sec;パスごとの最終受信時刻 秒部。0 = 未受信。
int32_t[POTR_MAX_PATH] path_last_recv_nsec;パスごとの最終受信時刻 ナノ秒部。
size_t frag_buf_len;フラグメント結合バッファの現在のデータ長 (バイト)。
int frag_compressed;フラグメント受信中の圧縮フラグ (非 0: 圧縮あり)。
uint32_t _pad_frag;パディング (frag_buf を 8 バイト境界に揃える)。
uint8_t *frag_buf;フラグメント結合バッファ (動的確保。max_message_size バイト)。
uint8_t *compress_buf;圧縮・解凍用一時バッファ (動的確保)。
size_t compress_buf_size;compress_buf のサイズ (バイト)。
uint8_t *crypto_buf;暗号化・復号用一時バッファ (動的確保)。
size_t crypto_buf_size;crypto_buf のサイズ (バイト)。
uint8_t *recv_buf;受信バッファ / 再送 wire 組立バッファ (動的確保。PACKET_HEADER_SIZE + max_payload バイト)。
uint8_t *send_wire_buf;送信 wire 組立バッファ (動的確保。PACKET_HEADER_SIZE + max_payload バイト)。送信スレッドのみ使用。
PotrThread send_thread;送信スレッドハンドル。
volatile int send_thread_running;送信スレッド実行フラグ (1: 実行中, 0: 停止)。
uint32_t _pad_send_thread;パディング (last_send_ms を 8 バイト境界に揃える)。
volatile uint64_t last_send_ms;最終パケット送信時刻 (データ or PING、ms、単調増加)。0 = 未送信。
PotrNackDedupEntry[POTR_NACK_DEDUP_SLOTS] nack_dedup_buf;NACK 重複抑制エントリ配列。
uint8_t nack_dedup_next;次に書き込むスロットインデックス。
uint8_t[7] _pad_nack_dedup;パディング (reorder フィールドを 4 バイト境界に揃える)。
int reorder_pending;リオーダー待機中か (1: 待機中、0: 待機なし)。
uint32_t reorder_nack_num;待機中の欠番通番。
int64_t reorder_deadline_sec;タイムアウト期限 秒部 (CLOCK_MONOTONIC)。
int32_t reorder_deadline_nsec;タイムアウト期限 ナノ秒部。
uint32_t _pad_reorder;パディング (send_queue を 8 バイト境界に揃える)。
PotrSendQueue send_queue;非同期送信キュー。
int is_multi_peer;1: N:1 モード (src_addr/src_port 省略), 0: 1:1 モード。
uint32_t _pad_multi_peer;パディング (peers を 8 バイト境界に揃える)。
PotrPeerContext *peers;ピアテーブル (動的確保。max_peers エントリ)。
int max_peers;ピアテーブルサイズ (service.max_peers から取得)。
int n_peers;現在の接続ピア数。
PotrMutex peers_mutex;ピアテーブル保護用ミューテックス。
uint32_t next_peer_id;次に発行するピア ID (単調増加、初期値 1)。
PotrSocket[POTR_MAX_PATH] tcp_listen_sock;RECEIVER: listen ソケット (path ごと)。
PotrSocket[POTR_MAX_PATH] tcp_conn_fd;アクティブ TCP 接続 fd (path ごと)。
volatile int tcp_active_paths;アクティブ TCP path 数 (0 = 全切断)。
uint32_t[2] _pad_tcp_connected;パディング (tcp_send_mutex を 8 バイト境界に揃える。8 バイト確保)。
PotrMutex[POTR_MAX_PATH] tcp_send_mutex;TCP send() 排他制御 (path ごと)。送信スレッド・ヘルスチェックスレッド・recv スレッド競合防止。
PotrMutex recv_window_mutex;recv_window 保護用ミューテックス。
PotrThread[POTR_MAX_PATH] connect_thread;SENDER: connect スレッド。RECEIVER: accept スレッド。path ごと。
volatile int[POTR_MAX_PATH] connect_thread_running;connect スレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。
PotrMutex tcp_state_mutex;tcp_state_cv 保護用ミューテックス。tcp_active_paths のカウンタ更新も保護。
PotrCondVar tcp_state_cv;切断通知・reconnect sleep の中断用条件変数。
volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_recv_ms;TCP PING 応答最終受信時刻 (ms, CLOCK_MONOTONIC 基準)。path ごと。接続確立時に現在時刻で初期化。
volatile uint64_t[POTR_MAX_PATH] tcp_last_ping_req_recv_ms;TCP PING 要求最終受信時刻 (ms, CLOCK_MONOTONIC 基準)。path ごと。接続確立時に現在時刻で初期化。
int[POTR_MAX_PATH] buf_full_suppress_cnt;path ごとの送信バッファ満杯ログ抑制カウンタ (0: 抑制なし、1-10: 抑制中)。
PotrMutex session_establish_mutex;uint8_t *[POTR_MAX_PATH] tcp_first_pkt_buf;先読みパケットバッファ (動的確保、PACKET_HEADER_SIZE + max_payload バイト)。
size_t[POTR_MAX_PATH] tcp_first_pkt_len;先読みパケットのバイト数 (0: 先読みなし)。