|
|
|
/**
|
|
|
|
*
|
|
|
|
* \section COPYRIGHT
|
|
|
|
*
|
|
|
|
* Copyright 2014 Ben Wojtowicz
|
|
|
|
*
|
|
|
|
* By using this file, you agree to the terms and conditions set
|
|
|
|
* forth in the LICENSE file which can be found at the top level of
|
|
|
|
* the distribution.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
INCLUDES
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
#include "srsran/asn1/liblte_common.h"
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
DEFINES
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
TYPEDEFS
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
GLOBAL VARIABLES
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
FUNCTIONS
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_value_2_bits
|
|
|
|
|
|
|
|
Description: Converts a value to a bit string
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_value_2_bits(uint32 value, uint8** bits, uint32 N_bits)
|
|
|
|
{
|
|
|
|
uint32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < N_bits; i++) {
|
|
|
|
(*bits)[i] = (value >> (N_bits - i - 1)) & 0x1;
|
|
|
|
}
|
|
|
|
*bits += N_bits;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_bits_2_value
|
|
|
|
|
|
|
|
Description: Converts a bit string to a value
|
|
|
|
*********************************************************************/
|
|
|
|
uint32 liblte_bits_2_value(uint8** bits, uint32 N_bits)
|
|
|
|
{
|
|
|
|
uint32 value = 0;
|
|
|
|
uint32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < N_bits; i++) {
|
|
|
|
value |= (*bits)[i] << (N_bits - i - 1);
|
|
|
|
}
|
|
|
|
*bits += N_bits;
|
|
|
|
|
|
|
|
return (value);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_pack
|
|
|
|
|
|
|
|
Description: Pack a bit array into a byte array
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_pack(LIBLTE_BIT_MSG_STRUCT* bits, LIBLTE_BYTE_MSG_STRUCT* bytes)
|
|
|
|
{
|
|
|
|
uint8_t* bit_ptr = bits->msg;
|
|
|
|
uint32_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < bits->N_bits / 8; i++) {
|
|
|
|
bytes->msg[i] = liblte_bits_2_value(&bit_ptr, 8);
|
|
|
|
}
|
|
|
|
bytes->N_bytes = bits->N_bits / 8;
|
|
|
|
if (bits->N_bits % 8 > 0) {
|
|
|
|
bytes->msg[bytes->N_bytes] = liblte_bits_2_value(&bit_ptr, bits->N_bits % 8);
|
|
|
|
bytes->N_bytes++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_unpack
|
|
|
|
|
|
|
|
Description: Unpack a byte array into a bit array
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_unpack(LIBLTE_BYTE_MSG_STRUCT* bytes, LIBLTE_BIT_MSG_STRUCT* bits)
|
|
|
|
{
|
|
|
|
uint8_t* bit_ptr = bits->msg;
|
|
|
|
uint32_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < bytes->N_bytes; i++) {
|
|
|
|
liblte_value_2_bits(bytes->msg[i], &bit_ptr, 8);
|
|
|
|
}
|
|
|
|
bits->N_bits = bytes->N_bytes * 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_pack
|
|
|
|
|
|
|
|
Description: Pack a bit array into a byte array
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_pack(uint8_t* bits, uint32_t n_bits, uint8_t* bytes)
|
|
|
|
{
|
|
|
|
uint8_t* bit_ptr = bits;
|
|
|
|
uint32_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < n_bits / 8; i++) {
|
|
|
|
bytes[i] = liblte_bits_2_value(&bit_ptr, 8);
|
|
|
|
}
|
|
|
|
if (n_bits % 8 > 0) {
|
|
|
|
bytes[n_bits / 8] = liblte_bits_2_value(&bit_ptr, n_bits % 8);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_unpack
|
|
|
|
|
|
|
|
Description: Unpack a byte array into a bit array
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_unpack(uint8_t* bytes, uint32_t n_bytes, uint8_t* bits)
|
|
|
|
{
|
|
|
|
uint8_t* bit_ptr = bits;
|
|
|
|
uint32_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < n_bytes; i++) {
|
|
|
|
liblte_value_2_bits(bytes[i], &bit_ptr, 8);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_align_up
|
|
|
|
|
|
|
|
Description: Aligns a pointer to a multibyte boundary
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_align_up(uint8_t** ptr, uint32_t align)
|
|
|
|
{
|
|
|
|
while ((uint64_t)(*ptr) % align > 0) {
|
|
|
|
(*ptr)++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Name: liblte_align_up_zero
|
|
|
|
|
|
|
|
Description: Aligns a pointer to a multibyte boundary and zeros
|
|
|
|
bytes skipped
|
|
|
|
*********************************************************************/
|
|
|
|
void liblte_align_up_zero(uint8_t** ptr, uint32_t align)
|
|
|
|
{
|
|
|
|
while ((uint64_t)(*ptr) % align > 0) {
|
|
|
|
**ptr = 0;
|
|
|
|
(*ptr)++;
|
|
|
|
}
|
|
|
|
}
|