18 #include <arpa/inet.h>
33 uint32_t hi = htonl((uint32_t)(v >> 32));
34 uint32_t lo = htonl((uint32_t)(v & 0xFFFFFFFFUL));
35 return ((uint64_t)lo << 32) | (uint64_t)hi;
65 if (packet == NULL || shdr == NULL)
74 packet->
ack_num = htonl(nack_num);
100 uint32_t seq_num, uint32_t ack_num)
102 if (packet == NULL || shdr == NULL)
110 packet->
seq_num = htonl(seq_num);
111 packet->
ack_num = htonl(ack_num);
135 if (packet == NULL || shdr == NULL)
144 packet->
ack_num = htonl(seq_num);
165 if (packet == NULL || shdr == NULL)
202 const void *packed_payload,
size_t payload_len)
204 if (out == NULL || shdr == NULL || packed_payload == NULL
217 out->
payload = (
const uint8_t *)packed_payload;
244 uint32_t payload_len;
246 if (container == NULL || offset == NULL || elem_out == NULL)
257 p = container->
payload + *offset;
259 memcpy(&flags_nbo, p, 2);
260 memcpy(&plen_nbo, p + 2, 4);
262 payload_len = ntohl(plen_nbo);
277 elem_out->
flags = ntohs(flags_nbo);
301 const uint8_t *b = (
const uint8_t *)buf;
313 memcpy(&tmp32, b + 16, 4); packet->
session_id = ntohl(tmp32);
314 memcpy(&tmp32, b + 20, 4); packet->
session_tv_nsec = (int32_t)ntohl(tmp32);
315 memcpy(&tmp32, b + 24, 4); packet->
seq_num = ntohl(tmp32);
316 memcpy(&tmp32, b + 28, 4); packet->
ack_num = ntohl(tmp32);
317 memcpy(&tmp16, b + 32, 2); packet->
flags = ntohs(tmp16);
318 memcpy(&tmp16, b + 34, 2); packet->
payload_len = ntohs(tmp16);
#define POTR_MAX_PAYLOAD
ペイロードの最大長 (バイト)。UDP 最大ペイロード (65535 - IP20 - UDP8)。max_payload 設定値のバリデーション上限として使用する。
#define POTR_PAYLOAD_ELEM_HDR_SIZE
パックコンテナ内ペイロードエレメントのヘッダーサイズ (バイト)。flags (2): POTR_FLAG_MORE_FRAG / POTR_FLAG_COMPRESSED を格納 + payload_...
#define POTR_FLAG_REJECT
再送不能通知パケットであることを示すフラグ。ack_num に再送不能な通番を格納する。
#define POTR_FLAG_PING
ヘルスチェック要求パケットであることを示すフラグ。ペイロードなし。
#define POTR_FLAG_DATA
データパケット (パックコンテナ) であることを示すフラグ。常に設定される。
#define POTR_FLAG_FIN
正常終了通知パケットであることを示すフラグ。送信者が potrCloseService 時に送出し、受信者は即座に DISCONNECTED へ遷移する。ペイロードなし。
#define POTR_FLAG_NACK
再送要求パケットであることを示すフラグ。ack_num に要求通番を格納する。
#define POTR_SUCCESS
成功の戻り値を表す定数。
#define POTR_ERROR
失敗の戻り値を表す定数。
int packet_build_fin(PotrPacket *packet, const PotrPacketSessionHdr *shdr)
正常終了通知 (FIN) パケットを構築します。
int packet_build_packed(PotrPacket *out, const PotrPacketSessionHdr *shdr, uint32_t seq_num, const void *packed_payload, size_t payload_len)
データパケット (パックコンテナ) を構築します。
int packet_build_ping(PotrPacket *packet, const PotrPacketSessionHdr *shdr, uint32_t seq_num, uint32_t ack_num)
PING パケットを構築します。
int packet_parse(PotrPacket *packet, const void *buf, size_t buf_len)
受信バイト列をパケット構造体に解析します。
static uint64_t ntoh64(uint64_t v)
int packet_build_nack(PotrPacket *packet, const PotrPacketSessionHdr *shdr, uint32_t nack_num)
NACK パケットを構築します。
int packet_build_reject(PotrPacket *packet, const PotrPacketSessionHdr *shdr, uint32_t seq_num)
再送不能通知 (REJECT) パケットを構築します。
static void fill_session_hdr(PotrPacket *packet, const PotrPacketSessionHdr *shdr)
static uint64_t hton64(uint64_t v)
int packet_unpack_next(const PotrPacket *container, size_t *offset, PotrPacket *elem_out)
データパケットから次のペイロードエレメントを取り出します。
size_t packet_wire_size(const PotrPacket *packet)
パケットのヘッダー + ペイロードの合計バイト数を返します。
#define PACKET_HEADER_SIZE
パケットヘッダーの固定長 (バイト)。payload フィールドの開始オフセット。
int32_t session_tv_nsec
セッション開始時刻 ナノ秒部。
int64_t service_id
サービス識別子。
uint32_t session_id
セッション識別子 (乱数)。
int64_t session_tv_sec
セッション開始時刻 秒部。
uint32_t ack_num
再送要求番号 / 再送不能通番 (NBO)。NACK では要求通番、REJECT では再送不能通番を格納する。
int64_t session_tv_sec
セッション開始時刻 秒部 (NBO)。struct timespec の tv_sec 相当。
uint32_t session_id
セッション識別子 (NBO)。potrOpenService 時に決定する乱数。
uint16_t flags
パケット種別フラグ (POTR_FLAG_*) (NBO)。
const uint8_t * payload
ペイロードデータへのポインタ (読み取り専用)。ウィンドウプールまたは受信バッファ内を指す。
int32_t session_tv_nsec
セッション開始時刻 ナノ秒部 (NBO)。struct timespec の tv_nsec 相当。
uint32_t seq_num
通番。送信側が付与する連番 (NBO)。
int64_t service_id
サービス識別子 (NBO)。受信時に照合する。
uint16_t payload_len
ペイロード長 (バイト) (NBO)。