# porter/libsrc/porter/potrPeerTable.c

# 1 ファイル

## 1.1 porter/libsrc/porter/potrPeerTable.c

N: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_generate_session

    static void peer_generate_session ( PotrPeerContext *peer )

## 2.2 allocate_peer_id

    static PotrPeerId allocate_peer_id ( struct PotrContext_ *ctx )

## 2.3 peer_send_fin

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

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

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

### 2.3.1 引数

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

## 2.4 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.4.1 引数

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

### 2.4.2 戻り値

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

## 2.5 peer_table_destroy

    void peer_table_destroy ( struct PotrContext_ *ctx )

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

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

### 2.5.1 引数

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

## 2.6 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.6.1 引数

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

### 2.6.2 戻り値

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

## 2.7 peer_find_by_id

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

peer_id でピアを検索する。

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

### 2.7.1 引数

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

### 2.7.2 戻り値

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

## 2.8 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.8.1 引数

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

### 2.8.2 戻り値

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

## 2.9 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.9.1 引数

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

## 2.10 peer_free

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

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

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

### 2.10.1 引数

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

# 3 定数、マクロ

## 3.1 POTR_MUTEX_INIT

    #define POTR_MUTEX_INIT ( m )
        pthread_mutex_init((m), NULL)

## 3.2 POTR_MUTEX_DESTROY

    #define POTR_MUTEX_DESTROY ( m )
        pthread_mutex_destroy(m)