# porter/libsrc/porter/protocol/window.c

# 1 ファイル

## 1.1 porter/libsrc/porter/protocol/window.c

スライディングウィンドウ管理モジュール。

### 1.1.1 作者

c-modernization-kit sample team

### 1.1.2 バージョン

1.0.0

### 1.1.3 日付

2026/03/04

### 1.1.4 著作権

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

# 2 関数

## 2.1 window_init

    int window_init ( PotrWindow *win, uint32_t initial_seq, uint16_t window_size, uint16_t max_payload )

ウィンドウを初期化します。

サイズが既存と同一の場合は状態をリセットするのみで再確保は行いません。
異なるサイズの場合は既存バッファを解放して再確保します。

### 2.1.1 引数

- win [in,out] 初期化するウィンドウ構造体へのポインタ。
- initial_seq [in] 初期通番。
- window_size [in] ウィンドウサイズ (パケット数)。
- max_payload [in] エントリごとのペイロード最大長 (バイト)。

### 2.1.2 戻り値

成功時は POTR_SUCCESS、malloc 失敗時は POTR_ERROR を返します。

## 2.2 window_destroy

    void window_destroy ( PotrWindow *win )

ウィンドウが保持する動的確保バッファを解放します。

### 2.2.1 引数

- win [in,out] 解放するウィンドウ構造体へのポインタ。

## 2.3 win_index

    static uint16_t win_index ( const PotrWindow *win, uint32_t seq )

## 2.4 window_send_push

    int window_send_push ( PotrWindow *win, const PotrPacket *packet )

送信ウィンドウにパケットを積みます。

### 2.4.1 引数

- win [in,out] 送信ウィンドウ構造体へのポインタ。
- packet [in] 積むパケットへのポインタ。

### 2.4.2 戻り値

成功時は POTR_SUCCESS、ウィンドウ満杯の場合は POTR_ERROR を返します。

## 2.5 window_send_full

    int window_send_full ( const PotrWindow *win )

送信ウィンドウが満杯かどうかを返します。

### 2.5.1 引数

- win [in] 送信ウィンドウ構造体へのポインタ。

### 2.5.2 戻り値

満杯の場合は 1、空きがある場合は 0 を返します。

## 2.6 window_send_get

    int window_send_get ( const PotrWindow *win, uint32_t seq_num, PotrPacket *packet_out )

送信ウィンドウから指定通番のパケットを取得します (再送用)。

### 2.6.1 引数

- win [in] 送信ウィンドウ構造体へのポインタ。
- seq_num [in] 取得する通番。
- packet_out [out] 取得したパケットを格納する構造体へのポインタ。

### 2.6.2 戻り値

成功時は POTR_SUCCESS、エントリが存在しない場合は POTR_ERROR を返します。

## 2.7 window_recv_push

    int window_recv_push ( PotrWindow *win, const PotrPacket *packet )

受信ウィンドウにパケットを格納します。

通番が受信ウィンドウ内であればバッファリングします。
追い越し (順序外到着) にも対応します。

### 2.7.1 引数

- win [in,out] 受信ウィンドウ構造体へのポインタ。
- packet [in] 格納するパケットへのポインタ。

### 2.7.2 戻り値

成功時は POTR_SUCCESS、ウィンドウ外の場合は POTR_ERROR を返します。

## 2.8 window_recv_pop

    int window_recv_pop ( PotrWindow *win, PotrPacket *packet )

受信ウィンドウから順序整列済みパケットを取り出します。

### 2.8.1 引数

- win [in,out] 受信ウィンドウ構造体へのポインタ。
- packet [out] 取り出したパケットを格納する構造体へのポインタ。

### 2.8.2 戻り値

取り出せた場合は POTR_SUCCESS、次のパケットが未着の場合は POTR_ERROR を返します。

## 2.9 window_recv_skip

    void window_recv_skip ( PotrWindow *win, uint32_t seq_num )

受信ウィンドウで指定通番をスキップして次の通番へ前進させます。

REJECT 受信時に欠落パケットを「配信済み」として扱い、後続パケットの配信を 継続するために使用します。seq_num が next_seq と一致しない場合は何もしません。

### 2.9.1 引数

- win [in,out] 受信ウィンドウ構造体へのポインタ。
- seq_num [in] スキップする通番。next_seq と一致する場合のみ動作します。

## 2.10 window_recv_needs_nack

    int window_recv_needs_nack ( const PotrWindow *win, uint32_t *nack_num )

受信ウィンドウで欠番が発生しているか確認し、NACK 番号を返します。

### 2.10.1 引数

- win [in] 受信ウィンドウ構造体へのポインタ。
- nack_num [out] 欠番の通番を格納するポインタ。

### 2.10.2 戻り値

欠番がある場合は 1、ない場合は 0 を返します。

## 2.11 window_recv_reset

    void window_recv_reset ( PotrWindow *win, uint32_t new_base_seq )

受信ウィンドウを新しい基点通番でリセットします。

全スロットを無効化し、base_seq / next_seq を new_base_seq に設定します。
バッファの再確保は行いません。
RAW モードでギャップを検出してセッションをリセットする際に使用します。

### 2.11.1 引数

- win [in,out] 受信ウィンドウ構造体へのポインタ。
- new_base_seq [in] リセット後の基点通番 (次に期待する通番)。