# PotrPacket

    struct PotrPacket {
        int64_t service_id;
        int64_t session_tv_sec;
        uint32_t session_id;
        int32_t session_tv_nsec;
        uint32_t seq_num;
        uint32_t ack_num;
        uint16_t flags;
        uint16_t payload_len;
        uint32_t _reserved;
        const uint8_t *payload;
    }

ネットワーク送受信用パケット構造体。

UDP で送受信される物理パケットのレイアウトです。
各フィールドはネットワークバイトオーダー (ビッグエンディアン) で格納します。
ヘッダー固定長: offsetof(PotrPacket, payload) = 40 バイト (64 ビット環境)。
payload フィールドはポインタであり、wire データとして直接 sendto に渡せません。
送信時は PotrContext_ の send_wire_buf / recv_buf に wire データを組み立ててください。

ワイヤーフォーマット (バイトオフセット):

     0: service_id      (int64_t,  8 bytes)
     8: session_tv_sec  (int64_t,  8 bytes)
    16: session_id      (uint32_t, 4 bytes)
    20: session_tv_nsec (int32_t,  4 bytes)
    24: seq_num         (uint32_t, 4 bytes)
    28: ack_num         (uint32_t, 4 bytes)
    32: flags           (uint16_t, 2 bytes)
    34: payload_len     (uint16_t, 2 bytes)
    36: _reserved       (uint32_t, 4 bytes, padding)
    40: payload         (pointer)

# 1 属性

## 1.1 service_id

    int64_t service_id;

サービス識別子 (NBO)。受信時に照合する。

## 1.2 session_tv_sec

    int64_t session_tv_sec;

セッション開始時刻 秒部 (NBO)。struct timespec の tv_sec 相当。

## 1.3 session_id

    uint32_t session_id;

セッション識別子 (NBO)。potrOpenService 時に決定する乱数。

## 1.4 session_tv_nsec

    int32_t session_tv_nsec;

セッション開始時刻 ナノ秒部 (NBO)。struct timespec の tv_nsec 相当。

## 1.5 seq_num

    uint32_t seq_num;

通番。送信側が付与する連番 (NBO)。

## 1.6 ack_num

    uint32_t ack_num;

再送要求番号 / 再送不能通番 (NBO)。NACK では要求通番、REJECT では再送不能通番を格納する。

## 1.7 flags

    uint16_t flags;

パケット種別フラグ (POTR_FLAG_*) (NBO)。

## 1.8 payload_len

    uint16_t payload_len;

ペイロード長 (バイト) (NBO)。

## 1.9 _reserved

    uint32_t _reserved;

パディング (payload ポインタを 8 バイト境界に揃える)。

## 1.10 payload

    const uint8_t *payload;

ペイロードデータへのポインタ (読み取り専用)。ウィンドウプールまたは受信バッファ内を指す。