Document of c-modernization-kit (porter) 1.0.0
Loading...
Searching...
No Matches
potrContext.h
Go to the documentation of this file.
1
16
17#ifndef POTR_CONTEXT_H
18#define POTR_CONTEXT_H
19
20#include <stdint.h>
21
22#include <porter_type.h>
23
24#include "protocol/window.h"
26#include "infra/crypto/crypto.h"
27#include "infra/potrSendQueue.h"
28
29#ifndef _WIN32
30 #include <pthread.h>
31 #include <netinet/in.h>
32 typedef int PotrSocket;
33 typedef pthread_t PotrThread;
34 typedef pthread_mutex_t PotrMutex;
35 typedef pthread_cond_t PotrCondVar;
36 #define POTR_INVALID_SOCKET (-1)
37#else /* _WIN32 */
38 #include <winsock2.h>
39 #include <ws2tcpip.h>
40 typedef SOCKET PotrSocket;
41 typedef HANDLE PotrThread;
42 typedef CRITICAL_SECTION PotrMutex;
43 typedef CONDITION_VARIABLE PotrCondVar;
44 #define POTR_INVALID_SOCKET INVALID_SOCKET
45#endif /* _WIN32 */
46
48static inline int potr_is_tcp_type(PotrType t)
49{
50 return t == POTR_TYPE_TCP || t == POTR_TYPE_TCP_BIDIR;
51}
52
54static inline int potr_is_raw_type(PotrType t)
55{
56 return t == POTR_TYPE_UNICAST_RAW ||
59}
60
63{
64 switch (t)
65 {
74 case POTR_TYPE_TCP:
76 default: return t;
77 }
78}
79
81#define POTR_NACK_DEDUP_SLOTS 8U
82
84typedef struct
85{
86 uint32_t ack_num;
87 uint32_t _pad;
88 uint64_t time_ms;
90
98typedef struct PotrPeerContext_
99{
101 int active;
102
103 /* 自セッション (このピア宛の送信に使用) */
104 uint32_t session_id;
105 uint32_t _pad_session;
108
109 /* ピアセッション追跡 */
114
115 /* 送受信ウィンドウ (ピアごと独立) */
119
120 /* フラグメント結合 (ピアごと独立) */
121 uint8_t *frag_buf;
124
125 /* ヘルスチェック */
126 volatile int health_alive;
130
131 /* NACK 重複抑制 */
134 uint8_t _pad_reorder[3];
135
136 /* リオーダーバッファタイムアウト管理 */
142
143 /* マルチパス: ピアごとの送信先 (recvfrom で学習)
144 * インデックスは ctx->sock[] / src_addr[] と直接対応する。
145 * 未使用スロットは dest_addr[k].sin_family == 0 (AF_UNSPEC) で判定する。 */
146 struct sockaddr_in dest_addr[POTR_MAX_PATH];
151
156{
167
168 /* マルチパス: ソケット配列 */
170 int n_path;
171
172 volatile int running[POTR_MAX_PATH];
174 volatile int health_alive;
176
177 /* 解決済みアドレス (各パス分) */
180 struct sockaddr_in dest_addr[POTR_MAX_PATH];
181
182 /* 自セッション識別子 (potrOpenService 時に決定) */
183 uint32_t session_id;
186
187 /* 相手セッション追跡 (受信者が使用) */
192
193 /* 受信者: パスごとの送信者ポートキャッシュ (src_port=0 対応) */
195
196 /* ヘルスチェック: 最終受信時刻 (受信者が使用。CLOCK_MONOTONIC 基準)。 */
198 uint32_t _pad_lastrecv;
200
201 /* 受信者: パスごとの最終受信時刻 (パス単位の peer_port クリア用。CLOCK_MONOTONIC 基準)。 */
204
207 uint32_t _pad_frag;
208 uint8_t *frag_buf;
209 uint8_t *compress_buf;
211 uint8_t *crypto_buf;
213 uint8_t *recv_buf;
214 uint8_t *send_wire_buf;
215
216 /* 非同期送信 (POTR_ROLE_SENDER のみ使用) */
218 volatile int send_thread_running;
220 volatile uint64_t last_send_ms;
221
222 /* 送信者: NACK 重複抑制リングバッファ */
225 uint8_t _pad_nack_dedup[7];
226
227 /* 受信者: リオーダーバッファタイムアウト管理 (reorder_timeout_ms > 0 のときのみ使用) */
232 uint32_t _pad_reorder;
233
235
236 /* N:1 マルチピアモード専用フィールド (is_multi_peer == 1 のときのみ有効) */
243 uint32_t next_peer_id;
244
245 /* --- TCP 接続管理 (POTR_TYPE_TCP / POTR_TYPE_TCP_BIDIR のみ有効) --- */
248 volatile int tcp_active_paths;
249 uint32_t _pad_tcp_connected[2];
251
252 /* recv_window 保護 (TCP v2: 複数 recv スレッドが同一 recv_window にアクセスするため) */
254
255 /* connect/accept スレッド */
258
259 /* 切断通知 (recv/health スレッド → connect スレッドへの通知) */
262
263 /* PING 応答追跡 (SENDER health スレッドが参照、TCP recv スレッドが更新) */
265
266 /* PING 要求到着追跡 (RECEIVER recv スレッドが参照・更新。RECEIVER 側 PING 到着タイムアウト監視に使用) */
268
269 /* 送信バッファ満杯ログ抑制 (TCP v2 送信スレッド用) */
271
272 /* TCP セッション確立排他制御 (RECEIVER TCP のみ使用)。
273 * 複数 path の accept スレッドが並行して session_id 判定を行う際の競合を防ぐ。
274 * potr_connect_thread_start で初期化、potr_connect_thread_stop で破棄する。 */
276
277 /* TCP 先読みバッファ (path ごと)。
278 * accept スレッドが session 判定のために読み取った最初の 1 パケット分のバイト列を
279 * recv スレッドに引き渡す。accept スレッドが書き込み後に recv スレッドを起動するため
280 * 書き込み→起動→読み出しの順序が保証され、mutex は不要。
281 * recv スレッドは起動直後に先読みパケットを処理し tcp_first_pkt_len[i] を 0 に戻す。 */
284};
285
286#endif /* POTR_CONTEXT_H */
データ圧縮・解凍モジュールの内部ヘッダー。
データ暗号化・復号モジュールの内部ヘッダー。
#define POTR_MAX_PATH
マルチパスの最大パス数。
通信ライブラリの型定義ファイル。
void(* PotrRecvCallback)(int64_t service_id, PotrPeerId peer_id, PotrEvent event, const void *data, size_t len)
受信コールバック関数型 (全通信種別共通)。
PotrType
通信種別。
Definition porter_type.h:85
@ POTR_TYPE_BROADCAST_RAW
1:N 通信 RAW モード (UDP ブロードキャスト)。
Definition porter_type.h:88
@ POTR_TYPE_BROADCAST
1:N 通信 (UDP ブロードキャスト)。
Definition porter_type.h:92
@ POTR_TYPE_UNICAST_BIDIR_N1
N:1 双方向通信 (UDP ユニキャスト)。
Definition porter_type.h:96
@ POTR_TYPE_UNICAST
1:1 通信 (UDP ユニキャスト)。
Definition porter_type.h:90
@ POTR_TYPE_MULTICAST_RAW
1:N 通信 RAW モード (UDP マルチキャスト)。
Definition porter_type.h:87
@ POTR_TYPE_TCP_BIDIR
TCP 双方向通信 (両端が potrSend 可)。
@ POTR_TYPE_TCP
TCP ユニキャスト通信 (単方向: SENDER のみ potrSend 可)。
Definition porter_type.h:98
@ POTR_TYPE_UNICAST_RAW
1:1 通信 RAW モード (UDP ユニキャスト)。
Definition porter_type.h:86
@ POTR_TYPE_UNICAST_BIDIR
双方向 1:1 通信 (UDP ユニキャスト)。
Definition porter_type.h:94
@ POTR_TYPE_MULTICAST
1:N 通信 (UDP マルチキャスト)。
Definition porter_type.h:91
PotrRole
役割種別。
uint32_t PotrPeerId
ピア識別子。
Definition porter_type.h:32
struct PotrPeerContext_ PotrPeerContext
N:1 モードにおける個別ピアのコンテキスト。
static int potr_is_raw_type(PotrType t)
RAW 系通信種別 (POTR_TYPE_*_RAW) か判定する。
Definition potrContext.h:54
#define POTR_NACK_DEDUP_SLOTS
NACK 重複抑制リングバッファのスロット数 (POTR_MAX_PATH × 2)。
Definition potrContext.h:81
int PotrSocket
Definition potrContext.h:32
static PotrType potr_raw_base_type(PotrType t)
RAW 系通信種別をベース通信種別に変換する (非 RAW 型はそのまま返す)。
Definition potrContext.h:62
pthread_t PotrThread
Definition potrContext.h:33
static int potr_is_tcp_type(PotrType t)
TCP 通信種別 (POTR_TYPE_TCP / POTR_TYPE_TCP_BIDIR) か判定する。
Definition potrContext.h:48
非同期送信キューの型定義と操作関数。
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 モード。
int n_peers
現在の接続ピア数。
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
自セッション開始時刻 秒部。
int n_path
有効パス数。
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 = 未受信。
グローバル設定。
NACK 重複抑制バッファの 1 エントリ。
Definition potrContext.h:85
uint64_t time_ms
処理時刻 (ms、単調増加)。0 = 未使用スロット。
Definition potrContext.h:88
uint32_t _pad
パディング (time_ms を 8 バイト境界に揃える)。
Definition potrContext.h:87
uint32_t ack_num
再送または REJECT した ack_num。
Definition potrContext.h:86
N:1 モードにおける個別ピアのコンテキスト。
Definition potrContext.h:99
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]
パスごとの最終受信時刻 ナノ秒部。
非同期送信キュー。
サービス定義。
スライディングウィンドウ管理構造体。
Definition window.h:30
スライディングウィンドウ管理モジュールの内部ヘッダー。