porter/libsrc/porter/protocol/window.h

1 ファイル

1.1 porter/libsrc/porter/protocol/window.h

スライディングウィンドウ管理モジュールの内部ヘッダー。

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 window_send_push

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

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

2.3.1 引数

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

2.3.2 戻り値

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

2.4 window_send_full

int window_send_full ( const PotrWindow *win )

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

2.4.1 引数

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

2.4.2 戻り値

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

2.5 window_send_get

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

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

2.5.1 引数

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

2.5.2 戻り値

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

2.6 window_recv_push

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

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

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

2.6.1 引数

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

2.6.2 戻り値

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

2.7 window_recv_pop

int window_recv_pop ( PotrWindow *win, PotrPacket *packet )

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

2.7.1 引数

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

2.7.2 戻り値

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

2.8 window_recv_needs_nack

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

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

2.8.1 引数

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

2.8.2 戻り値

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

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_reset

void window_recv_reset ( PotrWindow *win, uint32_t new_base_seq )

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

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

2.10.1 引数

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

3 クラス/構造体

3.1 PotrWindow

struct PotrWindow {
    PotrPacket *packets;
    uint8_t *valid;
    uint8_t *payload_pool;
    uint32_t base_seq;
    uint32_t next_seq;
    uint16_t window_size;
    uint16_t max_payload;
    uint32_t _pad;
}

スライディングウィンドウ管理構造体。

パケットバッファ・有効フラグ・ペイロードプールは動的確保する。
window_init() で確保し、window_destroy() で解放すること。

3.1.1 属性

3.1.1.1 packets

PotrPacket *packets;

パケットバッファ (動的確保。window_size 要素)。

3.1.1.2 valid

uint8_t *valid;

バッファ有効フラグ配列 (動的確保。window_size バイト)。

3.1.1.3 payload_pool

uint8_t *payload_pool;

ペイロードプール (動的確保。window_size × max_payload バイト)。

3.1.1.4 base_seq

uint32_t base_seq;

ウィンドウ先頭の通番。

3.1.1.5 next_seq

uint32_t next_seq;

送信側: 次に割り当てる通番。受信側: 次に期待する通番。

3.1.1.6 window_size

uint16_t window_size;

ウィンドウサイズ (パケット数)。

3.1.1.7 max_payload

uint16_t max_payload;

エントリごとのペイロード最大長 (バイト)。

3.1.1.8 _pad

uint32_t _pad;

パディング (構造体サイズを 8 バイト境界に揃える)。