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