porter/libsrc/porter/potrPeerTable.h

1 ファイル

1.1 porter/libsrc/porter/potrPeerTable.h

N:1 モード用ピアテーブル管理モジュールの内部ヘッダー。

POTR_TYPE_UNICAST_BIDIR の N:1 モード (src 情報省略) において、 複数クライアントピアの状態を管理するユーティリティです。
is_multi_peer == 1 のときのみ有効。

1.1.1 作者

c-modernization-kit sample team

1.1.2 バージョン

1.0.0

1.1.3 日付

2026/03/23

1.1.4 著作権

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

2 関数

2.1 peer_send_fin

void peer_send_fin ( struct PotrContext_ *ctx, PotrPeerContext *peer )

ピアの全パスへ FIN パケットを送信する。

ピアの dest_addr[] に対して FIN パケットを直接 sendto する。呼び出し元は peers_mutex を取得してから呼び出すこと。

2.1.1 引数

  • ctx [in,out] セッションコンテキスト。
  • peer [in] FIN を送信するピアコンテキスト。

2.2 peer_table_init

int peer_table_init ( struct PotrContext_ *ctx )

ピアテーブルを初期化する。

ctx->peers を max_peers 分確保し、peers_mutex を初期化する。
ctx->max_peers, ctx->n_peers, ctx->next_peer_id を設定する。

2.2.1 引数

  • ctx [in,out] セッションコンテキスト。

2.2.2 戻り値

成功時は POTR_SUCCESS、失敗時は POTR_ERROR。

2.3 peer_table_destroy

void peer_table_destroy ( struct PotrContext_ *ctx )

ピアテーブルを破棄する。

全アクティブピアに FIN を送信し、リソースを解放する。
peers_mutex を解放する。

2.3.1 引数

  • ctx [in,out] セッションコンテキスト。

2.4 peer_find_by_session

PotrPeerContext *peer_find_by_session ( struct PotrContext_ *ctx, uint32_t session_id, int64_t session_tv_sec, int32_t session_tv_nsec )

session_triplet でピアを検索する。

ピアテーブルを線形探索し、session_id / session_tv_sec / session_tv_nsec が 一致するアクティブなエントリを返す。
呼び出し元は peers_mutex を取得してから呼び出すこと。

2.4.1 引数

  • ctx [in] セッションコンテキスト。
  • session_id [in] ピアのセッション識別子。
  • session_tv_sec [in] ピアのセッション開始時刻 秒部。
  • session_tv_nsec [in] ピアのセッション開始時刻 ナノ秒部。

2.4.2 戻り値

見つかった場合はピアコンテキストへのポインタ、見つからない場合は NULL。

2.5 peer_find_by_id

PotrPeerContext *peer_find_by_id ( struct PotrContext_ *ctx, PotrPeerId peer_id )

peer_id でピアを検索する。

呼び出し元は peers_mutex を取得してから呼び出すこと。

2.5.1 引数

  • ctx [in] セッションコンテキスト。
  • peer_id [in] 検索するピア ID。

2.5.2 戻り値

見つかった場合はピアコンテキストへのポインタ、見つからない場合は NULL。

2.6 peer_create

PotrPeerContext *peer_create ( struct PotrContext_ *ctx, const struct sockaddr_in *sender_addr, int path_idx )

新規ピアを作成する。

空きスロットを確保し、session_id/session_tv を生成してウィンドウを初期化する。
送信元アドレスを dest_addr[path_idx] に記録し、n_paths を 1 に設定する。
dest_addr[] のインデックスは ctx->sock[] / src_addr[] と直接対応する。
path_last_recv_sec[path_idx] は後続の n1_update_path_recv() 呼び出しで設定される。
max_peers 超過時はログエラー後 NULL を返す。
呼び出し元は peers_mutex を取得してから呼び出すこと。

2.6.1 引数

  • ctx [in,out] セッションコンテキスト。
  • sender_addr [in] ピアの送信元アドレス (recvfrom で取得したアドレス)。
  • path_idx [in] パケットを受信したサーバソケットのインデックス (ctx->sock[] の添字)。

2.6.2 戻り値

成功時はピアコンテキストへのポインタ、失敗時は NULL。

2.7 peer_path_clear

void peer_path_clear ( struct PotrContext_ *ctx, PotrPeerContext *peer, int path_idx )

ピアの特定パスをクリアしてスロットを未使用に戻す。

dest_addr[path_idx] をゼロクリアし、path_last_recv_sec/nsec をリセット後 n_paths を減算する。
タイムアウト・TCP FIN/RST などパス断の発生源によらず共通して呼び出す。
呼び出し元は peers_mutex を取得してから呼び出すこと。

2.7.1 引数

  • ctx [in,out] セッションコンテキスト。
  • peer [in,out] 対象ピアコンテキスト。
  • path_idx [in] クリアするパスのインデックス (ctx->sock[] の添字)。

2.8 peer_free

void peer_free ( struct PotrContext_ *ctx, PotrPeerContext *peer )

ピアリソースを解放してスロットをクリアする。

ウィンドウ破棄・frag_buf 解放・send_window_mutex 解放・スロットクリアを行う。
呼び出し元は peers_mutex を取得してから呼び出すこと。
FIN の送信は呼び出し元が行うこと (本関数は送信しない)。

2.8.1 引数

  • ctx [in,out] セッションコンテキスト。
  • peer [in,out] 解放するピアコンテキスト。