Loading...
Searching...
No Matches
soft, unpacked and packed bits

Osmocom bit level support code. More...

## Files

file | bits.h
| Osmocom bit level support code.
file | bits.c

## Macros

#define | OSMO_BIN_SPEC "%d%d%d%d%d%d%d%d"
#define | OSMO_BIN_PRINT(byte)
#define | OSMO_BIT_SPEC "%c%c%c%c%c%c%c%c"
#define | OSMO_BIT_PRINT_EX(byte, ch)
#define | OSMO_BIT_PRINT(byte) OSMO_BIT_PRINT_EX(byte, '1')

## Typedefs

typedef int8_t | sbit_t
| soft bit with value (-127...127), as commonly used in communications receivers such as [viterbi] decoders
typedef uint8_t | ubit_t
| unpacked bit (0 or 1): 1 bit per byte
typedef uint8_t | pbit_t
| packed bits (8 bits in a byte).

## Enumerations

enum | osmo_br_mode { OSMO_BR_BITS_IN_DWORD = 31 , OSMO_BR_BYTES_IN_DWORD = 24 , OSMO_BR_BITS_IN_BYTE = 7 , OSMO_BR_WORD_SWAP = 16 }
| bit-reversal mode for osmo_bit_reversal() More...

## Functions

static unsigned int | osmo_pbit_bytesize (unsigned int num_bits)
| determine how many bytes we would need for num_bits packed bits
int | osmo_ubit2pbit (pbit_t *out, const ubit_t *in, unsigned int num_bits)
| convert unpacked bits to packed bits, return length in bytes
int | osmo_pbit2ubit (ubit_t *out, const pbit_t *in, unsigned int num_bits)
| convert packed bits to unpacked bits, return length in bytes
void | osmo_nibble_shift_right (uint8_t *out, const uint8_t *in, unsigned int num_nibbles)
| Shift unaligned input to octet-aligned output.
void | osmo_nibble_shift_left_unal (uint8_t *out, const uint8_t *in, unsigned int num_nibbles)
| Shift unaligned input to octet-aligned output.
void | osmo_ubit2sbit (sbit_t *out, const ubit_t *in, unsigned int num_bits)
| convert unpacked bits to soft bits
void | osmo_sbit2ubit (ubit_t *out, const sbit_t *in, unsigned int num_bits)
| convert soft bits to unpacked bits
int | osmo_ubit2pbit_ext (pbit_t *out, unsigned int out_ofs, const ubit_t *in, unsigned int in_ofs, unsigned int num_bits, int lsb_mode)
| convert unpacked bits to packed bits (extended options)
int | osmo_pbit2ubit_ext (ubit_t *out, unsigned int out_ofs, const pbit_t *in, unsigned int in_ofs, unsigned int num_bits, int lsb_mode)
| convert packed bits to unpacked bits (extended options)
uint32_t | osmo_bit_reversal (uint32_t x, enum osmo_br_mode k)
| generalized bit reversal function
uint32_t | osmo_revbytebits_32 (uint32_t x)
| reverse the bit-order in each byte of a dword
uint32_t | osmo_revbytebits_8 (uint8_t x)
| reverse the bit order in a byte
void | osmo_revbytebits_buf (uint8_t *buf, int len)
| reverse bit-order of each byte in a buffer
static uint16_t | osmo_rol16 (uint16_t in, unsigned shift)
| left circular shift

## Variables

static const uint8_t | flip_table [256]

## Detailed Description

Osmocom bit level support code.

This module implements the notion of different bit-fields, such as

- unpacked bits (ubit_t), i.e. 1 bit per byte
- packed bits (pbit_t), i.e. 8 bits per byte
- soft bits (sbit_t), 1 bit per byte from -127 to 127

## Macro Definition Documentation

## OSMO_BIN_PRINT

#define OSMO_BIN_PRINT | ( |  | byte | ) |

Value:
(byte & 0x80 ? 1 : 0), \
(byte & 0x40 ? 1 : 0), \
(byte & 0x20 ? 1 : 0), \
(byte & 0x10 ? 1 : 0), \
(byte & 0x08 ? 1 : 0), \
(byte & 0x04 ? 1 : 0), \
(byte & 0x02 ? 1 : 0), \
(byte & 0x01 ? 1 : 0)
subsys
char subsys[16]
logging sub-system
Definition gsmtap.h:9

## OSMO_BIN_SPEC

#define OSMO_BIN_SPEC "%d%d%d%d%d%d%d%d"

## OSMO_BIT_PRINT

#define OSMO_BIT_PRINT | ( |  | byte | ) | OSMO_BIT_PRINT_EX(byte, '1')

## OSMO_BIT_PRINT_EX

#define OSMO_BIT_PRINT_EX | ( |  | byte,
|  |  | ch
| ) |  |

Value:
(byte & 0x80 ? ch : '.'), \
(byte & 0x40 ? ch : '.'), \
(byte & 0x20 ? ch : '.'), \
(byte & 0x10 ? ch : '.'), \
(byte & 0x08 ? ch : '.'), \
(byte & 0x04 ? ch : '.'), \
(byte & 0x02 ? ch : '.'), \
(byte & 0x01 ? ch : '.')

## OSMO_BIT_SPEC

#define OSMO_BIT_SPEC "%c%c%c%c%c%c%c%c"

## Typedef Documentation

## pbit_t

typedef uint8_t pbit_t

packed bits (8 bits in a byte).

NOTE on the endian-ness of pbit_t:

- Bits in a pbit_t are ordered MSB first, i.e. 0x80 is the first bit.
- Bit i in a pbit_t array is array[i/8] & (1<<(7-i%8))

## sbit_t

typedef int8_t sbit_t

soft bit with value (-127...127), as commonly used in communications receivers such as [viterbi] decoders

## ubit_t

typedef uint8_t ubit_t

unpacked bit (0 or 1): 1 bit per byte

## Enumeration Type Documentation

## osmo_br_mode

enum osmo_br_mode

bit-reversal mode for osmo_bit_reversal()

Enumerator
OSMO_BR_BITS_IN_DWORD | reverse all bits in a 32bit dword
OSMO_BR_BYTES_IN_DWORD | reverse byte order in a 32bit dword
OSMO_BR_BITS_IN_BYTE | reverse bits of each byte in a 32bit dword
OSMO_BR_WORD_SWAP | swap the two 16bit words in a 32bit dword

## Function Documentation

## osmo_bit_reversal()

uint32_t osmo_bit_reversal | ( | uint32_t | x,
|  | enum osmo_br_mode | k
| ) |  |

generalized bit reversal function

Parameters

  [in] | x | the 32bit value to be reversed
  [in] | k | the type of reversal requested

Returns
  the reversed 32bit dword

This function reverses the bit order within a 32bit word. Depending on "k", it either reverses all bits in a 32bit dword, or the bytes in the dword, or the bits in each byte of a dword, or simply swaps the two 16bit words in a dword. See Chapter 7 "Hackers Delight"

References x.

## osmo_nibble_shift_left_unal()

void osmo_nibble_shift_left_unal | ( | uint8_t * | out,
|  | const uint8_t * | in,
|  | unsigned int | num_nibbles
| ) |  |

Shift unaligned input to octet-aligned output.

Parameters

  [out] | out | output buffer, octet-aligned
  [in] | in | input buffer, unaligned
  [in] | num_nibbles | number of nibbles

## osmo_nibble_shift_right()

void osmo_nibble_shift_right | ( | uint8_t * | out,
|  | const uint8_t * | in,
|  | unsigned int | num_nibbles
| ) |  |

Shift unaligned input to octet-aligned output.

Parameters

  [out] | out | output buffer, unaligned
  [in] | in | input buffer, octet-aligned
  [in] | num_nibbles | number of nibbles

## osmo_pbit2ubit()

int osmo_pbit2ubit | ( | ubit_t * | out,
|  | const pbit_t * | in,
|  | unsigned int | num_bits
| ) |  |

convert packed bits to unpacked bits, return length in bytes

Parameters

  [out] | out | output buffer of unpacked bits
  [in] | in | input buffer of packed bits
  [in] | num_bits | number of bits

Returns
  number of bytes used in out

## osmo_pbit2ubit_ext()

int osmo_pbit2ubit_ext | ( | ubit_t * | out,
|  | unsigned int | out_ofs,
|  | const pbit_t * | in,
|  | unsigned int | in_ofs,
|  | unsigned int | num_bits,
|  | int | lsb_mode
| ) |  |

convert packed bits to unpacked bits (extended options)

Parameters

  [out] | out | output buffer of unpacked bits
  [in] | out_ofs | offset into output buffer
  [in] | in | input buffer of packed bits
  [in] | in_ofs | offset into input buffer
  [in] | num_bits | number of bits
  [in] | lsb_mode | Encode bits in LSB order instead of MSB

Returns
  length in bytes (max written offset of output buffer + 1)

## osmo_pbit_bytesize()

static unsigned int osmo_pbit_bytesize | ( | unsigned int | num_bits | ) |

inline static

determine how many bytes we would need for num_bits packed bits

Parameters

  [in] | num_bits | Number of packed bits

Returns
  number of bytes needed for num_bits packed bits

## osmo_revbytebits_32()

uint32_t osmo_revbytebits_32 | ( | uint32_t | x | ) |

reverse the bit-order in each byte of a dword

Parameters

  [in] | x | 32bit input value

Returns
  32bit value where bits of each byte have been reversed

See Chapter 7 "Hackers Delight"

References x.

## osmo_revbytebits_8()

uint32_t osmo_revbytebits_8 | ( | uint8_t | x | ) |

reverse the bit order in a byte

Parameters

  [in] | x | 8bit input value

Returns
  8bit value where bits order has been reversed

References flip_table, and x.

Referenced by osmo_isdnhdlc_decode(), and osmo_isdnhdlc_encode().

## osmo_revbytebits_buf()

void osmo_revbytebits_buf | ( | uint8_t * | buf,
|  | int | len
| ) |  |

reverse bit-order of each byte in a buffer

Parameters

  [in] | buf | buffer containing bytes to be bit-reversed
  [in] | len | length of buffer in bytes

This function reverses the bits in each byte of the buffer

References flip_table, and len.

## osmo_rol16()

static uint16_t osmo_rol16 | ( | uint16_t | in,
|  | unsigned | shift
| ) |  |

inline static

left circular shift

Parameters

  [in] | in | The 16 bit unsigned integer to be rotated
  [in] | shift | Number of bits to shift in to, [0;16] bits

Returns
  shifted value

## osmo_sbit2ubit()

void osmo_sbit2ubit | ( | ubit_t * | out,
|  | const sbit_t * | in,
|  | unsigned int | num_bits
| ) |  |

convert soft bits to unpacked bits

Parameters

  [out] | out | output buffer of unpacked bits
  [in] | in | input buffer of soft bits
  [in] | num_bits | number of bits

## osmo_ubit2pbit()

int osmo_ubit2pbit | ( | pbit_t * | out,
|  | const ubit_t * | in,
|  | unsigned int | num_bits
| ) |  |

convert unpacked bits to packed bits, return length in bytes

Parameters

  [out] | out | output buffer of packed bits
  [in] | in | input buffer of unpacked bits
  [in] | num_bits | number of bits

## osmo_ubit2pbit_ext()

int osmo_ubit2pbit_ext | ( | pbit_t * | out,
|  | unsigned int | out_ofs,
|  | const ubit_t * | in,
|  | unsigned int | in_ofs,
|  | unsigned int | num_bits,
|  | int | lsb_mode
| ) |  |

convert unpacked bits to packed bits (extended options)

Parameters

  [out] | out | output buffer of packed bits
  [in] | out_ofs | offset into output buffer
  [in] | in | input buffer of unpacked bits
  [in] | in_ofs | offset into input buffer
  [in] | num_bits | number of bits
  [in] | lsb_mode | Encode bits in LSB order instead of MSB

Returns
  length in bytes (max written offset of output buffer + 1)

## osmo_ubit2sbit()

void osmo_ubit2sbit | ( | sbit_t * | out,
|  | const ubit_t * | in,
|  | unsigned int | num_bits
| ) |  |

convert unpacked bits to soft bits

Parameters

  [out] | out | output buffer of soft bits
  [in] | in | input buffer of unpacked bits
  [in] | num_bits | number of bits

## Variable Documentation

## flip_table

const uint8_t flip_table[256]

static

Initial value:
= {
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
}

Referenced by osmo_revbytebits_8(), and osmo_revbytebits_buf().