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 インクルード元

window.c のインクルード元

1.1.5 著作権

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.1.3 呼び出し元

window_init の呼び出し元

2.2 window_destroy

void window_destroy ( PotrWindow *win )

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

2.2.1 引数

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

2.2.2 呼び出し元

window_destroy の呼び出し元

2.3 win_index

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

2.3.1 呼び出し元

win_index の呼び出し元

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.4.3 呼び出し元

window_send_push の呼び出し元

2.4.4 呼び出し先

window_send_push の呼び出し先

2.5 window_send_full

int window_send_full ( const PotrWindow *win )

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

2.5.1 引数

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

2.5.2 戻り値

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

2.5.3 呼び出し元

window_send_full の呼び出し元

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.6.3 呼び出し元

window_send_get の呼び出し元

2.6.4 呼び出し先

window_send_get の呼び出し先

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.7.3 呼び出し元

window_recv_push の呼び出し元

2.7.4 呼び出し先

window_recv_push の呼び出し先

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.8.3 呼び出し元

window_recv_pop の呼び出し元

2.8.4 呼び出し先

window_recv_pop の呼び出し先

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.9.2 呼び出し元

window_recv_skip の呼び出し元

2.9.3 呼び出し先

window_recv_skip の呼び出し先

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.10.3 呼び出し元

window_recv_needs_nack の呼び出し元

2.10.4 呼び出し先

window_recv_needs_nack の呼び出し先

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] リセット後の基点通番 (次に期待する通番)。

2.11.2 呼び出し元

window_recv_reset の呼び出し元