lokinet/llarp/iwp/xmit.cpp
2018-07-24 17:06:42 +10:00

75 lines
1.2 KiB
C++

#include "llarp/iwp/xmit.hpp"
#include "llarp/endian.h"
xmit::xmit(byte_t *ptr)
{
memcpy(buffer, ptr, sizeof(buffer));
}
xmit::xmit(const xmit &other)
{
memcpy(buffer, other.buffer, sizeof(buffer));
}
void
xmit::set_info(const byte_t *hash, uint64_t id, uint16_t fragsz,
uint16_t lastsz, uint8_t numfrags, uint8_t flags)
{
memcpy(buffer, hash, 32);
// memcpy(buffer + 32, &id, 8);
htobe64buf(buffer + 32, id);
// memcpy(buffer + 40, &fragsz, 2);
htobe16buf(buffer + 40, fragsz);
// memcpy(buffer + 42, &lastsz, 2);
htobe16buf(buffer + 42, lastsz);
buffer[44] = 0;
buffer[45] = 0;
buffer[46] = numfrags;
buffer[47] = flags;
}
const byte_t *
xmit::hash() const
{
return &buffer[0];
}
uint64_t
xmit::msgid() const
{
return bufbe64toh(buffer + 32);
}
// size of each full fragment
uint16_t
xmit::fragsize() const
{
return bufbe16toh(buffer + 40);
}
// number of full fragments
uint8_t
xmit::numfrags() const
{
return buffer[46];
}
// size of the entire message
size_t
xmit::totalsize() const
{
return (fragsize() * numfrags()) + lastfrag();
}
// size of the last fragment
uint16_t
xmit::lastfrag() const
{
return bufbe16toh(buffer + 42);
}
uint8_t
xmit::flags()
{
return buffer[47];
}