19 #include <arpa/inet.h>
20 #include <netinet/in.h>
21 #include <sys/socket.h>
70 memcpy(nonce + 4, &fin_pkt.
flags, 2);
71 memset(nonce + 6, 0, 4);
72 memset(nonce + 10, 0, 2);
85 for (i = 0; i < ctx->
n_path; i++)
89 sendto(ctx->
sock[i], wire_buf, wire_len, 0,
90 (
const struct sockaddr *)&ctx->
dest_addr[i],
93 sendto(ctx->
sock[i], (
const char *)wire_buf, (
int)wire_len, 0,
94 (
const struct sockaddr *)&ctx->
dest_addr[i],
103 for (i = 0; i < ctx->
n_path; i++)
107 sendto(ctx->
sock[i], &fin_pkt, wire_len, 0,
108 (
const struct sockaddr *)&ctx->
dest_addr[i],
111 sendto(ctx->
sock[i], (
const char *)&fin_pkt, (
int)wire_len, 0,
112 (
const struct sockaddr *)&ctx->
dest_addr[i],
131 "potrCloseService: service_id=%" PRId64
" closing",
138 "potrCloseService: service_id=%" PRId64
" stopping connect thread (TCP)",
191 "potrCloseService: service closed (TCP)");
200 "potrCloseService: service_id=%" PRId64
" stopping health thread",
209 "potrCloseService: service_id=%" PRId64
" flushing send queue and sending FIN",
230 "potrCloseService: service_id=%" PRId64
" stopping recv thread",
241 for (i = 0; i < ctx->
n_path; i++)
248 memset(&mreq, 0,
sizeof(mreq));
253 setsockopt(ctx->
sock[i], IPPROTO_IP, IP_DROP_MEMBERSHIP,
254 &mreq,
sizeof(mreq));
262 memset(&mreq, 0,
sizeof(mreq));
267 setsockopt(ctx->
sock[i], IPPROTO_IP, IP_DROP_MEMBERSHIP,
268 (
const char *)&mreq,
sizeof(mreq));
271 closesocket(ctx->
sock[i]);
288 else if (ctx->
peers != NULL)
301 "potrCloseService: service closed");
int potr_encrypt(uint8_t *dst, size_t *dst_len, const uint8_t *src, size_t src_len, const uint8_t *key, const uint8_t *nonce, const uint8_t *aad, size_t aad_len)
AES-256-GCM でデータを暗号化します。
#define POTR_CRYPTO_NONCE_SIZE
AES-256-GCM ノンスサイズ (バイト)。session_id (4B NBO) + flags (2B NBO) + seq_or_ack_num (4B NBO) + padding (2B...
#define POTR_CRYPTO_TAG_SIZE
AES-256-GCM 認証タグサイズ (バイト)。暗号文の直後に付加する。
#define POTR_MAX_PATH
マルチパスの最大パス数。
#define POTR_FLAG_ENCRYPTED
AES-256-GCM 認証タグが付与されていることを示す外側パケットフラグ。 POTR_FLAG_DATA と組み合わせる場合: [ヘッダー 32B][暗号文: packed_len B][GCM ...
#define POTR_SUCCESS
成功の戻り値を表す定数。
#define POTR_ERROR
失敗の戻り値を表す定数。
int packet_build_fin(PotrPacket *packet, const PotrPacketSessionHdr *shdr)
正常終了通知 (FIN) パケットを構築します。
size_t packet_wire_size(const PotrPacket *packet)
パケットのヘッダー + ペイロードの合計バイト数を返します。
#define PACKET_HEADER_SIZE
パケットヘッダーの固定長 (バイト)。payload フィールドの開始オフセット。
通信ライブラリ (動的リンク用) のヘッダーファイル。
#define POTR_API
呼び出し規約マクロ。
#define POTR_EXPORT
DLL エクスポート/インポート制御マクロ。
@ POTR_TRACE_ERROR
エラー。操作の失敗を記録。TRACE_LV_ERROR (1) と同値。
@ POTR_TRACE_INFO
情報。TRACE_LV_INFO (3) と同値。
@ POTR_TRACE_VERBOSE
詳細情報 (デバッグ)。TRACE_LV_VERBOSE (4) と同値。
@ POTR_TYPE_TCP_BIDIR
TCP 双方向通信 (両端が potrSend 可)。
@ POTR_TYPE_MULTICAST
1:N 通信 (UDP マルチキャスト)。
struct PotrContext_ * PotrHandle
セッションハンドル。
static void send_fin(struct PotrContext_ *ctx)
POTR_EXPORT int POTR_API potrCloseService(PotrHandle handle)
サービスを閉じます。
void potr_connect_thread_stop(struct PotrContext_ *ctx)
TCP 接続管理スレッドを停止します。
#define POTR_INVALID_SOCKET
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) か判定する。
int potr_health_thread_stop(struct PotrContext_ *ctx)
非 TCP ヘルスチェックスレッドを停止します。
int parse_ipv4_addr(const char *ip_str, struct in_addr *out_addr)
IPv4 アドレス変換ユーティリティ (内部用)。
#define POTR_LOG(level,...)
porter 内部ログ出力マクロ。
void peer_table_destroy(struct PotrContext_ *ctx)
ピアテーブルを破棄する。
N:1 モード用ピアテーブル管理モジュールの内部ヘッダー。
int comm_recv_thread_stop(struct PotrContext_ *ctx)
非 TCP 受信スレッドを停止します。
void potr_send_queue_destroy(PotrSendQueue *q)
void potr_send_queue_wait_drained(PotrSendQueue *q)
void potr_send_thread_stop(struct PotrContext_ *ctx)
セッションコンテキスト構造体。PotrHandle の実体。
uint32_t session_id
自セッション識別子 (乱数)。
uint8_t * frag_buf
フラグメント結合バッファ (動的確保。max_message_size バイト)。
PotrCondVar health_wakeup[POTR_MAX_PATH]
ヘルスチェックスレッドを即時起床させる条件変数 (path ごと)。
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 ごと。
PotrMutex tcp_send_mutex[POTR_MAX_PATH]
TCP send() 排他制御 (path ごと)。送信スレッド・ヘルスチェックスレッド・recv スレッド競合防止。
PotrMutex tcp_state_mutex
tcp_state_cv 保護用ミューテックス。tcp_active_paths のカウンタ更新も保護。
int is_multi_peer
1: N:1 モード (src_addr/src_port 省略), 0: 1:1 モード。
PotrServiceDef service
サービス定義。
PotrMutex health_mutex[POTR_MAX_PATH]
ヘルスチェックスレッド停止用ミューテックス (path ごと)。
PotrSocket sock[POTR_MAX_PATH]
各パスの UDP ソケット。
volatile int health_running[POTR_MAX_PATH]
ヘルスチェックスレッド実行フラグ (1: 実行中, 0: 停止)。path ごと。
PotrWindow send_window
送信バッファ (過去 N パケット保持。NACK 再送・REJECT 判定に使用)。
volatile int send_thread_running
送信スレッド実行フラグ (1: 実行中, 0: 停止)。
PotrCondVar tcp_state_cv
切断通知・reconnect sleep の中断用条件変数。
PotrMutex recv_window_mutex
recv_window 保護用ミューテックス。
struct sockaddr_in dest_addr[POTR_MAX_PATH]
送信先ソケットアドレス (送信者が sendto に使用)。
PotrWindow recv_window
受信ウィンドウ (順序整列・欠番検出)。
int64_t session_tv_sec
自セッション開始時刻 秒部。
PotrPeerContext * peers
ピアテーブル (動的確保。max_peers エントリ)。
int32_t session_tv_nsec
セッション開始時刻 ナノ秒部。
int64_t service_id
サービス識別子。
uint32_t session_id
セッション識別子 (乱数)。
int64_t session_tv_sec
セッション開始時刻 秒部。
uint32_t session_id
セッション識別子 (NBO)。potrOpenService 時に決定する乱数。
uint16_t flags
パケット種別フラグ (POTR_FLAG_*) (NBO)。
uint16_t payload_len
ペイロード長 (バイト) (NBO)。
int encrypt_enabled
非 0 のとき暗号化有効。設定ファイルに有効な encrypt_key が存在するときに 1 に設定される。
char multicast_group[POTR_MAX_ADDR_LEN]
マルチキャストグループアドレス。(multicast のみ)
int64_t service_id
サービス ID。
uint8_t encrypt_key[POTR_CRYPTO_KEY_SIZE]
AES-256-GCM 事前共有鍵 (32 バイト)。encrypt_enabled が 0 の場合は未使用。
void window_destroy(PotrWindow *win)
ウィンドウが保持する動的確保バッファを解放します。
スライディングウィンドウ管理モジュールの内部ヘッダー。