#include "global.h"
static inline uint8_t *
rpack_next_boundary(uint8_t * __restrict buf, uint8_t * __restrict p, size_t align)
{
size_t misa = (size_t) (p - buf) % align;
if (!misa)
return p;
return p + (align - misa);
}
/*
* rpack_create() - Allocate & init raw packet structure
*
* @buf = buffer
* @buflen = length of buffer
* return: NULL error or !=NULL raw packet, should be freed by rpack_destroy()
*/
rpack_t *
rpack_create(void * __restrict buf, size_t buflen)
{
rpack_t *rp = NULL;
rp = e_malloc(sizeof(rpack_t));
if (!rp) {
LOGERR;
return NULL;
}
RPACK_INIT(rp, buf, buflen);
return rp;
}
/*
* rpack_destroy() - Release & free raw packet structure
*
* @rp = raw packet
* return: none
*/
void
rpack_destroy(rpack_t ** __restrict rp)
{
if (!rp)
return;
if (*rp) {
RPACK_FREE(*rp);
e_free(*rp);
*rp = NULL;
}
}
/*
* rpack_align_and_reserve() - Align & reserve space
*
* @rp = raw buffer
* @siz = need size
* return: NULL error or not enough space, !=NULL next position
*/
uint8_t *
rpack_align_and_reserve(rpack_t * __restrict rp, size_t siz)
{
uint8_t *n;
if (!RPACK_SANITY(rp))
return NULL;
n = rpack_next_boundary(rp->r_buf, rp->r_next, siz);
/* too little space for siz */
if (n - rp->r_buf + siz > rp->r_len)
return NULL;
return n;
}
/*
* rpack_uint8() - Pack/Unpack 8bit value
*
* @rp = raw buffer
* @n = set value if !=NULL
* return: -1 error or get value
*/
uint8_t
rpack_uint8(rpack_t * __restrict rp, uint8_t * __restrict n)
{
uint8_t u;
if (!RPACK_SANITY(rp))
return (uint8_t) -1;
/* No space left */
if ((size_t) (rp->r_next - rp->r_buf) >= rp->r_len)
return (uint8_t) -1;
u = *rp->r_next;
if (n)
*rp->r_next = *n;
rp->r_next++;
return u;
}
/*
* rpack_uint16() - Pack/Unpack 16bit value
*
* @rp = raw buffer
* @n = set value if !=NULL
* return: -1 error or get value
*/
uint16_t
rpack_uint16(rpack_t * __restrict rp, uint16_t * __restrict n)
{
uint16_t u;
uint8_t *next;
if (!RPACK_SANITY(rp))
return (uint16_t) -1;
/* No space left */
if (!(next = rpack_align_and_reserve(rp, sizeof(uint16_t))))
return (uint16_t) -1;
u = EXTRACT_LE_16(next);
if (n)
RPACK_SET_16(next, n);
rp->r_next = next + sizeof(uint16_t);
return u;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>