18 #include <arpa/inet.h>
43 uint16_t window_size, uint16_t max_payload)
57 memset(win->
valid, 0, window_size);
73 win->
valid = (uint8_t *)malloc((
size_t)window_size);
74 win->
payload_pool = (uint8_t *)malloc((
size_t)window_size * (
size_t)max_payload);
87 memset(win->
valid, 0, (
size_t)window_size);
90 for (i = 0; i < window_size; i++)
145 if (win == NULL || packet == NULL)
206 if (win == NULL || packet_out == NULL)
219 if (!win->
valid[idx])
224 *packet_out = win->
packets[idx];
246 if (win == NULL || packet == NULL)
257 if (!win->
valid[idx])
283 if (win == NULL || packet == NULL)
289 if (!win->
valid[idx])
317 if (win == NULL || win->
next_seq != seq_num)
341 if (win == NULL || nack_num == NULL)
356 if (win->
valid[look_idx])
380 if (win == NULL || win->
valid == NULL)
#define POTR_SUCCESS
成功の戻り値を表す定数。
#define POTR_ERROR
失敗の戻り値を表す定数。
int seqnum_in_window(uint32_t seq, uint32_t base, uint16_t window_size)
通番 seq がウィンドウ [base, base + window_size) に含まれるか判定します。
const uint8_t * payload
ペイロードデータへのポインタ (読み取り専用)。ウィンドウプールまたは受信バッファ内を指す。
uint32_t seq_num
通番。送信側が付与する連番 (NBO)。
uint16_t payload_len
ペイロード長 (バイト) (NBO)。
uint32_t base_seq
ウィンドウ先頭の通番。
uint16_t max_payload
エントリごとのペイロード最大長 (バイト)。
uint32_t next_seq
送信側: 次に割り当てる通番。受信側: 次に期待する通番。
uint8_t * payload_pool
ペイロードプール (動的確保。window_size × max_payload バイト)。
uint8_t * valid
バッファ有効フラグ配列 (動的確保。window_size バイト)。
PotrPacket * packets
パケットバッファ (動的確保。window_size 要素)。
uint16_t window_size
ウィンドウサイズ (パケット数)。
void window_recv_skip(PotrWindow *win, uint32_t seq_num)
受信ウィンドウで指定通番をスキップして次の通番へ前進させます。
int window_send_push(PotrWindow *win, const PotrPacket *packet)
送信ウィンドウにパケットを積みます。
int window_init(PotrWindow *win, uint32_t initial_seq, uint16_t window_size, uint16_t max_payload)
ウィンドウを初期化します。
void window_destroy(PotrWindow *win)
ウィンドウが保持する動的確保バッファを解放します。
int window_recv_needs_nack(const PotrWindow *win, uint32_t *nack_num)
受信ウィンドウで欠番が発生しているか確認し、NACK 番号を返します。
void window_recv_reset(PotrWindow *win, uint32_t new_base_seq)
受信ウィンドウを新しい基点通番でリセットします。
int window_send_get(const PotrWindow *win, uint32_t seq_num, PotrPacket *packet_out)
送信ウィンドウから指定通番のパケットを取得します (再送用)。
int window_recv_pop(PotrWindow *win, PotrPacket *packet)
受信ウィンドウから順序整列済みパケットを取り出します。
int window_send_full(const PotrWindow *win)
送信ウィンドウが満杯かどうかを返します。
int window_recv_push(PotrWindow *win, const PotrPacket *packet)
受信ウィンドウにパケットを格納します。
static uint16_t win_index(const PotrWindow *win, uint32_t seq)
スライディングウィンドウ管理モジュールの内部ヘッダー。