int pack_item(tlv_t * item, void * outbuf, uint32_t * outsize) { int ret = 0; if ((NULL == item) || (NULL == outbuf) || (NULL == outsize)) { return -1; } switch (item->type) { case TLV_TYPE_INT8: case TLV_TYPE_UINT8: ret = pack_int8((uint8_t *)(item->value), outbuf, outsize); break; case TLV_TYPE_INT16: case TLV_TYPE_UINT16: ret = pack_int16((uint16_t *)(item->value), outbuf, outsize); break; case TLV_TYPE_INT32: case TLV_TYPE_UINT32: ret = pack_int32((uint32_t *)(item->value), outbuf, outsize); break; case TLV_TYPE_BYTES: ret = pack_bytes(item->value, item->length, outbuf, outsize); break; case TLV_TYPE_MSG: ret = msg_pack((message_t *)(item->value), outbuf, outsize); break; default: ret = -1; break; } return ret; }
int unpack_item(uint16_t type, uint16_t id, void * inbuf, uint16_t length, tlv_t * outtlv) { uint32_t outsize = 0; int ret = 0; void * value = NULL; message_t * newmsg = NULL; value = malloc(length); if (NULL == value) { return -1; } switch (id) { case TLV_TYPE_INT8: case TLV_TYPE_UINT8: outsize = length; ret = pack_int8((uint8_t *)inbuf, (uint8_t *)value, &outsize); break; case TLV_TYPE_INT16: case TLV_TYPE_UINT16: outsize = length; ret = unpack_int16((uint16_t *)inbuf, (uint16_t *)value, &outsize); break; case TLV_TYPE_INT32: case TLV_TYPE_UINT32: outsize = length; ret = unpack_int32((uint32_t *)inbuf, (uint32_t *)value, &outsize); break; case TLV_TYPE_BYTES: outsize = length; ret = pack_bytes(inbuf, length, value, &outsize); break; case TLV_TYPE_MSG: newmsg = msg_unpack((uint8_t *)inbuf, length); if (NULL == newmsg) { free(value); return -1; } memcpy(value, newmsg, MSG_SIZE(newmsg)); free(newmsg); break; default: free(value); return -1; } if (0 != ret) { free(value); } outtlv->id = id; outtlv->type = type; outtlv->length = length; outtlv->value = value; return ret; }
int unpack_value(tlv_type_t type, uint16_t id, void *inbuf, uint16_t length, tlv_t *out_tlv) { int b = 0; uint32_t out_sz = 0; void *value = NULL; if (NULL == inbuf || NULL == out_tlv) { return -1; } value = malloc(length); if (NULL == value) { return -1; } switch(type) { case TLV_TYPE_INT8: case TLV_TYPE_UINT8: b = pack_int8((uint8_t*)inbuf, (uint8_t*)value, &out_sz); break; case TLV_TYPE_INT16: case TLV_TYPE_UINT16: b = unpack_int16((uint16_t*)inbuf, (uint16_t*)value, &out_sz); break; case TLV_TYPE_INT32: case TLV_TYPE_UINT32: b = unpack_int32((uint32_t*)inbuf, (uint32_t*)value, &out_sz); break; case TLV_TYPE_BYTES: out_sz = length; b = pack_bytes(inbuf, length, value, &out_sz); break; default: b = -1; break; } if (b != 0) { free(value); return -1; } out_tlv->id = id; out_tlv->type = type; out_tlv->length = length; out_tlv->value = value; return b; }
int pack_value (tlv_t *tlv, void *outbuf, uint32_t *out_sz) { if (NULL == tlv || NULL == outbuf || NULL == out_sz) { return -1; } int b = 0; switch (tlv->type) { case TLV_TYPE_INT8: case TLV_TYPE_UINT8: b = pack_int8((uint8_t*)(tlv->value), outbuf, out_sz); break; case TLV_TYPE_INT16: case TLV_TYPE_UINT16: b = pack_int16((uint16_t*)(tlv->value), outbuf, out_sz); break; case TLV_TYPE_INT32: case TLV_TYPE_UINT32: b = pack_int32((uint32_t*)(tlv->value), outbuf, out_sz); break; case TLV_TYPE_BYTES: b = pack_bytes(tlv->value, tlv->length, outbuf, out_sz); break; default: b = -1; break; } return b; }
int unpack_item(tlv_type_t type, uint16_t id, void * inbuf, uint16_t length, tlv_t * outtlv) { uint32_t outsize = 0; int ret = 0; void * value = NULL; message_t * newmsg = NULL; if ((NULL == inbuf) || (NULL == outtlv)) { return -1; } value = malloc(length); if (NULL == value) { return -1; } switch (type) { case TLV_TYPE_INT8: case TLV_TYPE_UINT8: outsize = length; ret = pack_int8((uint8_t *)inbuf, (uint8_t *)value, &outsize); break; case TLV_TYPE_INT16: case TLV_TYPE_UINT16: outsize = length; ret = unpack_int16((uint16_t *)inbuf, (uint16_t *)value, &outsize); break; case TLV_TYPE_INT32: case TLV_TYPE_UINT32: outsize = length; ret = unpack_int32((uint32_t *)inbuf, (uint32_t *)value, &outsize); break; case TLV_TYPE_BYTES: outsize = length; ret = pack_bytes(inbuf, length, value, &outsize); break; case TLV_TYPE_MSG: newmsg = msg_unpack((uint8_t *)inbuf, length); if (NULL == newmsg) { ret = -1; break; } free(value); value = (void *)newmsg; ret = 0; break; default: ret = -1; } if (0 != ret) { free(value); goto exit; } outtlv->id = id; outtlv->type = type; outtlv->length = length; outtlv->value = value; exit: return ret; }