We don't use OpenBTS bit vectors in PCU anymore. All OpenBTS bit vectors are replaced by Osmocom bit vectors.

This commit is contained in:
Ivan Kluchnikov 2012-04-30 18:00:36 +04:00
parent 962f97b21c
commit 835f91e8f8
9 changed files with 450 additions and 418 deletions

View File

@ -22,6 +22,7 @@
//#include <BitVector.h> //#include <BitVector.h>
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#include <cstring>
#include "csn1.h" #include "csn1.h"
#include "gsm_rlcmac.h" #include "gsm_rlcmac.h"
using namespace std; using namespace std;
@ -76,39 +77,52 @@ void printSizeofRLCMAC()
void testRlcMacDownlink() void testRlcMacDownlink()
{ {
BitVector resultVector(23*8); struct bitvec *resultVector = bitvec_alloc(23);
resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
std::string testData[] = { std::string testData[] = {
"4e082500e3f1a81d080820800b2b2b2b2b2b2b2b2b2b2b", // Packet Downlink Assignment "4e082500e3f1a81d080820800b2b2b2b2b2b2b2b2b2b2b", // Packet Downlink Assignment
"48282407a6a074227201000b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Assignment "48282407a6a074227201000b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Assignment
"47240c00400000000000000079eb2ac9402b2b2b2b2b2b", // Packet Uplink Ack Nack "47240c00400000000000000079eb2ac9402b2b2b2b2b2b", // Packet Uplink Ack Nack
"47283c367513ba333004242b2b2b2b2b2b2b2b2b2b2b2b" // Packet Uplink Assignment "47283c367513ba333004242b2b2b2b2b2b2b2b2b2b2b2b" // Packet Uplink Assignment
"4913e00850884013a8048b2b2b2b2b2b2b2b2b2b2b2b2b"
"412430007fffffffffffffffefd19c7ba12b2b2b2b2b2b"
"41942b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"
}; };
int testDataSize = sizeof(testData)/sizeof(testData[0]); int testDataSize = sizeof(testData)/sizeof(testData[0]);
BitVector vector[testDataSize];
unsigned char origin[23];
unsigned char result[23];
cout << " DOWNLINK " << endl; cout << " DOWNLINK " << endl;
for (int i = 0; i < testDataSize; i++) for (int i = 0; i < testDataSize; i++)
{ {
vector[i].resize(23*8); bitvec *vector = bitvec_alloc(23);
vector[i].unhex(testData[i].c_str()); bitvec_unhex(vector, testData[i].c_str());
cout << "vector1 = ";
for (int i = 0; i < 23; i++)
{
cout << hex << (unsigned)*(vector->data + i);
}
cout << endl;
RlcMacDownlink_t * data = (RlcMacDownlink_t *)malloc(sizeof(RlcMacDownlink_t)); RlcMacDownlink_t * data = (RlcMacDownlink_t *)malloc(sizeof(RlcMacDownlink_t));
cout << "=========Start DECODE===========" << endl; cout << "=========Start DECODE===========" << endl;
decode_gsm_rlcmac_downlink(&vector[i], data); decode_gsm_rlcmac_downlink(vector, data);
cout << "+++++++++Finish DECODE++++++++++" << endl; cout << "+++++++++Finish DECODE++++++++++" << endl;
cout << "=========Start ENCODE=============" << endl; cout << "=========Start ENCODE=============" << endl;
encode_gsm_rlcmac_downlink(&resultVector, data); encode_gsm_rlcmac_downlink(resultVector, data);
cout << "+++++++++Finish ENCODE+++++++++++" << endl; cout << "+++++++++Finish ENCODE+++++++++++" << endl;
cout << "vector1 = " << vector[i] << endl; cout << "vector1 = ";
cout << "vector2 = " << resultVector << endl; for (int i = 0; i < 23; i++)
vector[i].pack(origin); {
resultVector.pack(result); cout << (unsigned)*(vector->data + i);
if (memcmp(origin, result, 23) == 0) }
cout << endl;
cout << "vector2 = ";
for (int i = 0; i < 23; i++)
{
cout << (unsigned)*(resultVector->data + i);
}
cout << endl;
if (memcmp(vector->data, resultVector->data, 23) == 0)
{ {
cout << "vector1 == vector2 : TRUE" << endl; cout << "vector1 == vector2 : TRUE" << endl;
} }
@ -116,7 +130,8 @@ void testRlcMacDownlink()
{ {
cout << "vector1 == vector2 : FALSE" << endl; cout << "vector1 == vector2 : FALSE" << endl;
} }
resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
bitvec_free(vector);
free(data); free(data);
} }
} }
@ -124,38 +139,50 @@ void testRlcMacDownlink()
void testRlcMacUplink() void testRlcMacUplink()
{ {
BitVector resultVector(23*8); struct bitvec *resultVector = bitvec_alloc(23);
resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
std::string testData[] = { std::string testData[] = {
"400e1e61d11f2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Dummy Control Block "400e1e61d11f2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Dummy Control Block
"400b8020000000000000002480e00b2b2b2b2b2b2b2b2b", // Packet Downlink Ack/Nack "400b8020000000000000002480e00b2b2b2b2b2b2b2b2b", // Packet Downlink Ack/Nack
"4016713dc094270ca2ae57ef909006aa0fc0001f80222b" // Packet Resource Request "4016713dc094270ca2ae57ef909006aa0fc0001f80222b" // Packet Resource Request
"400a9020000000000000003010012a0800132b2b2b2b2b"
}; };
int testDataSize = sizeof(testData)/sizeof(testData[0]); int testDataSize = sizeof(testData)/sizeof(testData[0]);
BitVector vector[testDataSize];
unsigned char origin[23];
unsigned char result[23];
cout << " UPLINK " << endl; cout << " UPLINK " << endl;
for (int i = 0; i < testDataSize; i++) for (int i = 0; i < testDataSize; i++)
{ {
vector[i].resize(23*8); bitvec *vector = bitvec_alloc(23);
vector[i].unhex(testData[i].c_str()); bitvec_unhex(vector, testData[i].c_str());
cout << "vector1 = ";
for (int i = 0; i < 23; i++)
{
cout << hex << (unsigned)*(vector->data + i);
}
cout << endl;
RlcMacUplink_t * data = (RlcMacUplink_t *)malloc(sizeof(RlcMacUplink_t)); RlcMacUplink_t * data = (RlcMacUplink_t *)malloc(sizeof(RlcMacUplink_t));
cout << "=========Start DECODE===========" << endl; cout << "=========Start DECODE===========" << endl;
decode_gsm_rlcmac_uplink(&vector[i], data); decode_gsm_rlcmac_uplink(vector, data);
cout << "+++++++++Finish DECODE++++++++++" << endl; cout << "+++++++++Finish DECODE++++++++++" << endl;
cout << "=========Start ENCODE=============" << endl; cout << "=========Start ENCODE=============" << endl;
encode_gsm_rlcmac_uplink(&resultVector, data); encode_gsm_rlcmac_uplink(resultVector, data);
cout << "+++++++++Finish ENCODE+++++++++++" << endl; cout << "+++++++++Finish ENCODE+++++++++++" << endl;
cout << "vector1 = " << vector[i] << endl; cout << "vector1 = ";
cout << "vector2 = " << resultVector << endl; for (int i = 0; i < 23; i++)
vector[i].pack(origin); {
resultVector.pack(result); cout << (unsigned)*(vector->data + i);
if (memcmp(origin, result, 23) == 0) }
cout << endl;
cout << "vector2 = ";
for (int i = 0; i < 23; i++)
{
cout << (unsigned)*(resultVector->data + i);
}
cout << endl;
if (memcmp(vector->data, resultVector->data, 23) == 0)
{ {
cout << "vector1 == vector2 : TRUE" << endl; cout << "vector1 == vector2 : TRUE" << endl;
} }
@ -163,7 +190,8 @@ void testRlcMacUplink()
{ {
cout << "vector1 == vector2 : FALSE" << endl; cout << "vector1 == vector2 : FALSE" << endl;
} }
resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
bitvec_free(vector);
free(data); free(data);
} }
} }

184
csn1.cpp
View File

@ -30,6 +30,8 @@
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#include <assert.h>
#include <string.h>
#include "csn1.h" #include "csn1.h"
@ -50,7 +52,7 @@ static const unsigned char ixBitsTab[] = {0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4,
/* Returns no_of_bits (up to 8) masked with 0x2B */ /* Returns no_of_bits (up to 8) masked with 0x2B */
static guint8 static guint8
get_masked_bits8( BitVector *vector, size_t& readIndex, gint bit_offset, const gint no_of_bits) get_masked_bits8( bitvec *vector, size_t& readIndex, gint bit_offset, const gint no_of_bits)
{ {
static const guint8 maskBits[] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}; static const guint8 maskBits[] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};
//gint byte_offset = bit_offset >> 3; /* divide by 8 */ //gint byte_offset = bit_offset >> 3; /* divide by 8 */
@ -60,15 +62,15 @@ get_masked_bits8( BitVector *vector, size_t& readIndex, gint bit_offset, const
readIndex -= relative_bit_offset; readIndex -= relative_bit_offset;
if (bit_shift >= 0) if (bit_shift >= 0)
{ {
result = (0x2B ^ ((guint8)vector->readField(readIndex, 8))) >> bit_shift; result = (0x2B ^ ((guint8)bitvec_read_field(vector, readIndex, 8))) >> bit_shift;
readIndex-= bit_shift; readIndex-= bit_shift;
result &= maskBits[no_of_bits]; result &= maskBits[no_of_bits];
} }
else else
{ {
guint8 hight_part = (0x2B ^ ((guint8)vector->readField(readIndex, 8))) & maskBits[8 - relative_bit_offset]; guint8 hight_part = (0x2B ^ ((guint8)bitvec_read_field(vector, readIndex, 8))) & maskBits[8 - relative_bit_offset];
hight_part = (guint8) (hight_part << (-bit_shift)); hight_part = (guint8) (hight_part << (-bit_shift));
result = (0x2B ^ ((guint8)vector->readField(readIndex, 8))) >> (8 + bit_shift); result = (0x2B ^ ((guint8)bitvec_read_field(vector, readIndex, 8))) >> (8 + bit_shift);
readIndex = readIndex - (8 - (-bit_shift)); readIndex = readIndex - (8 - (-bit_shift));
result |= hight_part; result |= hight_part;
} }
@ -164,9 +166,9 @@ static const char* CSN_DESCR_type[]=
*/ */
static gboolean static gboolean
existNextElement(BitVector *vector, size_t& readIndex, guint8 Tag) existNextElement(bitvec *vector, size_t& readIndex, guint8 Tag)
{ {
guint8 res = vector->readField(readIndex, 1); guint8 res = bitvec_read_field(vector, readIndex, 1);
//LOG(INFO) << "EXIST TAG = " << (unsigned)res; //LOG(INFO) << "EXIST TAG = " << (unsigned)res;
if (Tag == STANDARD_TAG) if (Tag == STANDARD_TAG)
{ {
@ -177,7 +179,7 @@ existNextElement(BitVector *vector, size_t& readIndex, guint8 Tag)
gint16 gint16
csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, size_t& readIndex, void* data) csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, size_t& readIndex, void* data)
{ {
gint remaining_bits_len = ar->remaining_bits_len; gint remaining_bits_len = ar->remaining_bits_len;
gint bit_offset = ar->bit_offset; gint bit_offset = ar->bit_offset;
@ -201,7 +203,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
if (remaining_bits_len > 0) if (remaining_bits_len > 0)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
*pui8 = vector->readField(readIndex, 1); *pui8 = bitvec_read_field(vector, readIndex, 1);
LOG(INFO) << pDescr->sz << " = " <<(unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " <<(unsigned)*pui8 << "\n";
/* end add the bit value to protocol tree */ /* end add the bit value to protocol tree */
} }
@ -230,21 +232,21 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
{ {
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
guint8 ui8 = vector->readField(readIndex, no_of_bits); guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
*pui8 = ui8; *pui8 = ui8;
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
guint16 ui16 = vector->readField(readIndex, no_of_bits); guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
*pui16 = ui16; *pui16 = ui16;
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";;
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
guint32 ui32 = vector->readField(readIndex, no_of_bits); guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
*pui32 = ui32; *pui32 = ui32;
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
@ -273,21 +275,21 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
{ {
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
guint8 ui8 = vector->readField(readIndex, no_of_bits); guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
*pui8 = ui8 + (guint8)pDescr->descr.value; *pui8 = ui8 + (guint8)pDescr->descr.value;
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
guint16 ui16 = vector->readField(readIndex, no_of_bits); guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
*pui16 = ui16 + (guint16)pDescr->descr.value; *pui16 = ui16 + (guint16)pDescr->descr.value;
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";;
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
guint32 ui32 = vector->readField(readIndex, no_of_bits); guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
*pui32 = ui32 + (guint16)pDescr->descr.value; *pui32 = ui32 + (guint16)pDescr->descr.value;
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
@ -356,7 +358,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
do do
{ {
*pui8 = vector->readField(readIndex, no_of_bits); *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
pui8++; pui8++;
bit_offset += no_of_bits; bit_offset += no_of_bits;
@ -439,7 +441,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
{ {
for(unsigned ib = 0; ib < 4; ib++) for(unsigned ib = 0; ib < 4; ib++)
{ {
guint8 ui8 = vector->readField(readIndex, 8); guint8 ui8 = bitvec_read_field(vector, readIndex, 8);
pui8 = pui8DATA(data, pDescr->offset+ib); pui8 = pui8DATA(data, pDescr->offset+ib);
*pui8 = ui8; *pui8 = ui8;
LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n";
@ -449,7 +451,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
{ {
for(unsigned ib = 0; ib < 8; ib++) for(unsigned ib = 0; ib < 8; ib++)
{ {
guint8 ui8 = vector->readField(readIndex, 8); guint8 ui8 = bitvec_read_field(vector, readIndex, 8);
pui8 = pui8DATA(data, pDescr->offset+ib); pui8 = pui8DATA(data, pDescr->offset+ib);
*pui8 = ui8; *pui8 = ui8;
LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n";
@ -502,7 +504,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
while (count > 0) while (count > 0)
{ {
guint8 no_of_bits = pChoice->bits; guint8 no_of_bits = pChoice->bits;
guint8 value = vector->readField(readIndex, no_of_bits); guint8 value = bitvec_read_field(vector, readIndex, no_of_bits);
if (value == pChoice->value) if (value == pChoice->value)
{ {
CSN_DESCR descr[2]; CSN_DESCR descr[2];
@ -549,7 +551,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
csnStream_t arT = *ar; csnStream_t arT = *ar;
gint16 Status = -1; gint16 Status = -1;
LOG(INFO) << pDescr->sz << " length = " << vector->readField(readIndex, 7) << "\n"; LOG(INFO) << pDescr->sz << " length = " << bitvec_read_field(vector, readIndex, 7) << "\n";
arT.direction = 1; arT.direction = 1;
bit_offset += 7; bit_offset += 7;
remaining_bits_len -= 7; remaining_bits_len -= 7;
@ -600,7 +602,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
} }
else else
{ {
index |= vector->readField(readIndex, 1); index |= bitvec_read_field(vector, readIndex, 1);
} }
remaining_bits_len--; remaining_bits_len--;
bit_offset++; bit_offset++;
@ -623,7 +625,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
*pui8 = 0x00; *pui8 = 0x00;
if (vector->readField(readIndex, 1) > 0) if (bitvec_read_field(vector, readIndex, 1) > 0)
{ {
*pui8 = 0x01; *pui8 = 0x01;
} }
@ -649,21 +651,21 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
guint8 ui8 = vector->readField(readIndex, no_of_bits); guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
*pui8 = ui8; *pui8 = ui8;
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
guint16 ui16 = vector->readField(readIndex, no_of_bits); guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
*pui16 = ui16; *pui16 = ui16;
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
guint32 ui32 = vector->readField(readIndex, no_of_bits); guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
*pui32 = ui32; *pui32 = ui32;
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
@ -691,21 +693,21 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
{ {
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
guint8 ui8 = vector->readField(readIndex, no_of_bits); guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
*pui8 = ui8 + (guint8)pDescr->descr.value; *pui8 = ui8 + (guint8)pDescr->descr.value;
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
guint16 ui16 = vector->readField(readIndex, no_of_bits); guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
*pui16 = ui16 + (guint16)pDescr->descr.value; *pui16 = ui16 + (guint16)pDescr->descr.value;
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
guint32 ui32 = vector->readField(readIndex, no_of_bits); guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
*pui32 = ui32 + (guint16)pDescr->descr.value; *pui32 = ui32 + (guint16)pDescr->descr.value;
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
@ -772,7 +774,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
while (nCount > 0) while (nCount > 0)
{ {
*pui8 = vector->readField(readIndex, no_of_bits); *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
pui8++; pui8++;
bit_offset += no_of_bits; bit_offset += no_of_bits;
@ -785,7 +787,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
while (nCount > 0) while (nCount > 0)
{ {
*pui16 = vector->readField(readIndex, no_of_bits); *pui16 = bitvec_read_field(vector, readIndex, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";
pui16++; pui16++;
bit_offset += no_of_bits; bit_offset += no_of_bits;
@ -861,14 +863,14 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
if (no_of_bits <= 32) if (no_of_bits <= 32)
{ {
guint32 ui32 = vector->readField(readIndex, no_of_bits); guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
*pui32 = ui32; *pui32 = ui32;
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
} }
else if (no_of_bits <= 64) else if (no_of_bits <= 64)
{ {
guint64 ui64 = vector->readField(readIndex, no_of_bits); guint64 ui64 = bitvec_read_field(vector, readIndex, no_of_bits);
pui64 = pui64DATA(data, pDescr->offset); pui64 = pui64DATA(data, pDescr->offset);
*pui64 = ui64; *pui64 = ui64;
LOG(INFO) << pDescr->sz << " = " << *pui64 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui64 << "\n";
@ -933,7 +935,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
} }
else else
{ {
fExist = vector->readField(readIndex, 1); fExist = bitvec_read_field(vector, readIndex, 1);
} }
*pui8 = fExist; *pui8 = fExist;
@ -978,7 +980,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
/* the "regular" M_NEXT_EXIST description element */ /* the "regular" M_NEXT_EXIST description element */
fExist = 0x00; fExist = 0x00;
if (vector->readField(readIndex, 1)) if (bitvec_read_field(vector, readIndex, 1))
{ {
fExist = 0x01; fExist = 0x01;
} }
@ -1071,7 +1073,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
if (nB1 > 0) if (nB1 > 0)
{ /* take care of the first byte - it will be right aligned */ { /* take care of the first byte - it will be right aligned */
*pui8 = vector->readField(readIndex, nB1); *pui8 = bitvec_read_field(vector, readIndex, nB1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= nB1; no_of_bits -= nB1;
@ -1081,7 +1083,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
/* remaining no_of_bits is a multiple of 8 or 0 */ /* remaining no_of_bits is a multiple of 8 or 0 */
while (no_of_bits > 0) while (no_of_bits > 0)
{ {
*pui8 = vector->readField(readIndex, 8); *pui8 = bitvec_read_field(vector, readIndex, 8);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= 8; no_of_bits -= 8;
@ -1126,14 +1128,14 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
while (no_of_bits > 0) while (no_of_bits > 0)
{ {
*pui8 = vector->readField(readIndex, 8); *pui8 = bitvec_read_field(vector, readIndex, 8);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= 8; no_of_bits -= 8;
} }
if (nB1 > 0) if (nB1 > 0)
{ {
*pui8 = vector->readField(readIndex, nB1); *pui8 = bitvec_read_field(vector, readIndex, nB1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= nB1; no_of_bits -= nB1;
@ -1172,7 +1174,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
while (count > 0) while (count > 0)
{ {
readIndex -= 8; readIndex -= 8;
*pui8 = vector->readField(readIndex, 8); *pui8 = bitvec_read_field(vector, readIndex, 8);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
pui8++; pui8++;
bit_offset += 8; bit_offset += 8;
@ -1205,7 +1207,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
remaining_bits_len--; remaining_bits_len--;
/* extract and store no_of_bits long element from bitstream */ /* extract and store no_of_bits long element from bitstream */
*pui8 = vector->readField(readIndex, no_of_bits); *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
pui8++; pui8++;
remaining_bits_len -= no_of_bits; remaining_bits_len -= no_of_bits;
@ -1219,7 +1221,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
bit_offset += no_of_bits; bit_offset += no_of_bits;
} }
LOG(INFO) << pDescr->sz << " = " << vector->readField(readIndex, 1) << "\n"; LOG(INFO) << pDescr->sz << " = " << bitvec_read_field(vector, readIndex, 1) << "\n";
/* existNextElement() returned FALSE, 1 bit consumed */ /* existNextElement() returned FALSE, 1 bit consumed */
bit_offset++; bit_offset++;
@ -1271,7 +1273,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
} }
} }
LOG(INFO) << pDescr->sz << " = " << vector->readField(readIndex, 1) << "\n"; LOG(INFO) << pDescr->sz << " = " << bitvec_read_field(vector, readIndex, 1) << "\n";
/* existNextElement() returned FALSE, 1 bit consumed */ /* existNextElement() returned FALSE, 1 bit consumed */
bit_offset++; bit_offset++;
@ -1352,7 +1354,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
if (no_of_bits <= 32) if (no_of_bits <= 32)
{ {
ui32 = vector->readField(readIndex, no_of_bits); ui32 = bitvec_read_field(vector, readIndex, no_of_bits);
} }
else else
{ {
@ -1404,7 +1406,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si
gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, size_t& writeIndex, void* data) gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, size_t& writeIndex, void* data)
{ {
gint remaining_bits_len = ar->remaining_bits_len; gint remaining_bits_len = ar->remaining_bits_len;
gint bit_offset = ar->bit_offset; gint bit_offset = ar->bit_offset;
@ -1429,7 +1431,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (remaining_bits_len > 0) if (remaining_bits_len > 0)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8, 1); bitvec_write_field(vector, writeIndex, *pui8, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
/* end add the bit value to protocol tree */ /* end add the bit value to protocol tree */
} }
@ -1459,19 +1461,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui16, no_of_bits); bitvec_write_field(vector, writeIndex, *pui16, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui32, no_of_bits); bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
} }
else else
@ -1499,19 +1501,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)(*pui8 - (guint8)pDescr->descr.value) << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)(*pui8 - (guint8)pDescr->descr.value) << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits); bitvec_write_field(vector, writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui16 - (guint16)pDescr->descr.value << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 - (guint16)pDescr->descr.value << "\n";
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits); bitvec_write_field(vector, writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui32 - (guint16)pDescr->descr.value << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 - (guint16)pDescr->descr.value << "\n";
} }
else else
@ -1540,12 +1542,12 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
// TODO : Change get_masked_bits8() // TODO : Change get_masked_bits8()
writeIndex -= no_of_bits; writeIndex -= no_of_bits;
guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits); guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits);
writeIndex -= no_of_bits; writeIndex -= no_of_bits;
vector->writeField(writeIndex, ui8, no_of_bits); bitvec_write_field(vector, writeIndex, ui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
@ -1583,7 +1585,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
do do
{ {
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
pui8++; pui8++;
bit_offset += no_of_bits; bit_offset += no_of_bits;
@ -1668,7 +1670,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
for(unsigned ib = 0; ib < 4; ib++) for(unsigned ib = 0; ib < 4; ib++)
{ {
pui8 = pui8DATA(data, pDescr->offset+ib); pui8 = pui8DATA(data, pDescr->offset+ib);
vector->writeField(writeIndex, *pui8, 8); bitvec_write_field(vector, writeIndex, *pui8, 8);
LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n";
} }
} }
@ -1677,7 +1679,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
for(unsigned ib = 0; ib < 8; ib++) for(unsigned ib = 0; ib < 8; ib++)
{ {
pui8 = pui8DATA(data, pDescr->offset+ib); pui8 = pui8DATA(data, pDescr->offset+ib);
vector->writeField(writeIndex, *pui8, 8); bitvec_write_field(vector, writeIndex, *pui8, 8);
LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz <<"[" << ib << "]= " << (unsigned)*pui8 << "\n";
} }
} }
@ -1732,7 +1734,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
guint8 no_of_bits = pChoice->bits; guint8 no_of_bits = pChoice->bits;
guint8 value = pChoice->value; guint8 value = pChoice->value;
LOG(INFO) << pChoice->descr.sz << " = " << (unsigned)value << "\n"; LOG(INFO) << pChoice->descr.sz << " = " << (unsigned)value << "\n";
vector->writeField(writeIndex, value, no_of_bits); bitvec_write_field(vector, writeIndex, value, no_of_bits);
CSN_DESCR descr[2]; CSN_DESCR descr[2];
gint16 Status; gint16 Status;
@ -1777,7 +1779,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
csnStreamInit(&arT, bit_offset, remaining_bits_len); csnStreamInit(&arT, bit_offset, remaining_bits_len);
Status = serialize(&arT, vector, writeIndex, pvDATA(data, pDescr->offset)); Status = serialize(&arT, vector, writeIndex, pvDATA(data, pDescr->offset));
vector->writeField(lengthIndex, writeIndex-lengthIndex-7, 7); bitvec_write_field(vector, lengthIndex, writeIndex-lengthIndex-7, 7);
LOG(INFO) << pDescr->sz << " length = " << writeIndex-lengthIndex << "\n"; LOG(INFO) << pDescr->sz << " length = " << writeIndex-lengthIndex << "\n";
if (Status >= 0) if (Status >= 0)
@ -1816,7 +1818,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
/* Assign UnionType */ /* Assign UnionType */
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
//read index from data and write to vector //read index from data and write to vector
vector->writeField(writeIndex, *pui8, Bits); bitvec_write_field(vector, writeIndex, *pui8, Bits);
//decode index //decode index
writeIndex -= Bits; writeIndex -= Bits;
@ -1831,7 +1833,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
} }
else else
{ {
index |= vector->readField(writeIndex, 1); index |= bitvec_read_field(vector, writeIndex, 1);
} }
remaining_bits_len--; remaining_bits_len--;
@ -1840,7 +1842,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
} }
writeIndex -= Bits; writeIndex -= Bits;
vector->writeField(writeIndex, index, Bits); bitvec_write_field(vector, writeIndex, index, Bits);
/* script index to continue on, limited in case we do not have a power of 2 */ /* script index to continue on, limited in case we do not have a power of 2 */
@ -1853,7 +1855,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
case CSN_BIT: case CSN_BIT:
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8, 1); bitvec_write_field(vector, writeIndex, *pui8, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
remaining_bits_len -= 1; remaining_bits_len -= 1;
bit_offset++; bit_offset++;
@ -1877,19 +1879,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui16, no_of_bits); bitvec_write_field(vector, writeIndex, *pui16, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui32, no_of_bits); bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
} }
else else
@ -1916,19 +1918,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)(*pui8 - (guint8)pDescr->descr.value) << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)(*pui8 - (guint8)pDescr->descr.value) << "\n";
} }
else if (no_of_bits <= 16) else if (no_of_bits <= 16)
{ {
pui16 = pui16DATA(data, pDescr->offset); pui16 = pui16DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits); bitvec_write_field(vector, writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui16 - (guint16)pDescr->descr.value << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui16 - (guint16)pDescr->descr.value << "\n";
} }
else if (no_of_bits <= 32) else if (no_of_bits <= 32)
{ {
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits); bitvec_write_field(vector, writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui32 - (guint16)pDescr->descr.value << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 - (guint16)pDescr->descr.value << "\n";
} }
else else
@ -1957,12 +1959,12 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 8) if (no_of_bits <= 8)
{ {
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
// TODO : Change get_masked_bits8() // TODO : Change get_masked_bits8()
writeIndex -= no_of_bits; writeIndex -= no_of_bits;
guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits); guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits);
writeIndex -= no_of_bits; writeIndex -= no_of_bits;
vector->writeField(writeIndex, ui8, no_of_bits); bitvec_write_field(vector, writeIndex, ui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
} }
@ -2000,7 +2002,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
do do
{ {
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
pui8++; pui8++;
bit_offset += no_of_bits; bit_offset += no_of_bits;
@ -2082,13 +2084,13 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (no_of_bits <= 32) if (no_of_bits <= 32)
{ {
pui32 = pui32DATA(data, pDescr->offset); pui32 = pui32DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui32, no_of_bits); bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n";
} }
else if (no_of_bits <= 64) else if (no_of_bits <= 64)
{ {
pui64 = pui64DATA(data, pDescr->offset); pui64 = pui64DATA(data, pDescr->offset);
vector->writeField(writeIndex, *pui64, no_of_bits); bitvec_write_field(vector, writeIndex, *pui64, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << *pui64 << "\n"; LOG(INFO) << pDescr->sz << " = " << *pui64 << "\n";
} }
else else
@ -2146,7 +2148,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
unsigned exist = 0; unsigned exist = 0;
pui8 = pui8DATA(data, pDescr->offset); pui8 = pui8DATA(data, pDescr->offset);
exist = *pui8; exist = *pui8;
vector->writeField(writeIndex, *pui8, 1); bitvec_write_field(vector, writeIndex, *pui8, 1);
writeIndex--; writeIndex--;
if (CSN_EXIST_LH == pDescr->type) if (CSN_EXIST_LH == pDescr->type)
{ {
@ -2154,10 +2156,10 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
} }
else else
{ {
fExist = vector->readField(writeIndex, 1); fExist = bitvec_read_field(vector, writeIndex, 1);
} }
writeIndex--; writeIndex--;
vector->writeField(writeIndex, fExist, 1); bitvec_write_field(vector, writeIndex, fExist, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)fExist << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)fExist << "\n";
pDescr++; pDescr++;
remaining_bits_len -= 1; remaining_bits_len -= 1;
@ -2193,7 +2195,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
break; break;
} }
vector->writeField(writeIndex, *pui8, 1); bitvec_write_field(vector, writeIndex, *pui8, 1);
fExist = *pui8; fExist = *pui8;
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n";
remaining_bits_len -= 1; remaining_bits_len -= 1;
@ -2233,11 +2235,11 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
} }
/* the "regular" M_NEXT_EXIST_LH description element */ /* the "regular" M_NEXT_EXIST_LH description element */
vector->writeField(writeIndex, *pui8, 1); bitvec_write_field(vector, writeIndex, *pui8, 1);
writeIndex--; writeIndex--;
fExist = get_masked_bits8(vector,writeIndex, bit_offset, 1); fExist = get_masked_bits8(vector,writeIndex, bit_offset, 1);
writeIndex--; writeIndex--;
vector->writeField(writeIndex, fExist, 1); bitvec_write_field(vector, writeIndex, fExist, 1);
pui8++; pui8++;
remaining_bits_len -= 1; remaining_bits_len -= 1;
@ -2286,7 +2288,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
if (nB1 > 0) if (nB1 > 0)
{ /* take care of the first byte - it will be right aligned */ { /* take care of the first byte - it will be right aligned */
vector->writeField(writeIndex, *pui8, nB1); bitvec_write_field(vector, writeIndex, *pui8, nB1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= nB1; no_of_bits -= nB1;
@ -2296,7 +2298,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
/* remaining no_of_bits is a multiple of 8 or 0 */ /* remaining no_of_bits is a multiple of 8 or 0 */
while (no_of_bits > 0) while (no_of_bits > 0)
{ {
vector->writeField(writeIndex, *pui8, 8); bitvec_write_field(vector, writeIndex, *pui8, 8);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= 8; no_of_bits -= 8;
@ -2342,14 +2344,14 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
while (no_of_bits > 0) while (no_of_bits > 0)
{ {
vector->writeField(writeIndex, *pui8, 8); bitvec_write_field(vector, writeIndex, *pui8, 8);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= 8; no_of_bits -= 8;
} }
if (nB1 > 0) if (nB1 > 0)
{ {
vector->writeField(writeIndex, *pui8, nB1); bitvec_write_field(vector, writeIndex, *pui8, nB1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
no_of_bits -= nB1; no_of_bits -= nB1;
@ -2388,7 +2390,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
while (count > 0) while (count > 0)
{ {
vector->writeField(writeIndex, *pui8, 8); bitvec_write_field(vector, writeIndex, *pui8, 8);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
bit_offset += 8; bit_offset += 8;
@ -2415,13 +2417,13 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
ElementCount = *pui8DATA(data, (gint16)pDescr->descr.value); ElementCount = *pui8DATA(data, (gint16)pDescr->descr.value);
while (ElementCount > 0) while (ElementCount > 0)
{ /* tag control shows existence of next list elements */ { /* tag control shows existence of next list elements */
vector->writeField(writeIndex, Tag, 1); bitvec_write_field(vector, writeIndex, Tag, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ;
bit_offset++; bit_offset++;
remaining_bits_len--; remaining_bits_len--;
/* extract and store no_of_bits long element from bitstream */ /* extract and store no_of_bits long element from bitstream */
vector->writeField(writeIndex, *pui8, no_of_bits); bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);
LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ;
pui8++; pui8++;
remaining_bits_len -= no_of_bits; remaining_bits_len -= no_of_bits;
@ -2435,7 +2437,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
bit_offset += no_of_bits; bit_offset += no_of_bits;
} }
vector->writeField(writeIndex, !Tag, 1); bitvec_write_field(vector, writeIndex, !Tag, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)(!Tag) << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)(!Tag) << "\n" ;
bit_offset++; bit_offset++;
@ -2456,7 +2458,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
while (ElementCount > 0) while (ElementCount > 0)
{ /* tag control shows existence of next list elements */ { /* tag control shows existence of next list elements */
vector->writeField(writeIndex, Tag, 1); bitvec_write_field(vector, writeIndex, Tag, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ;
bit_offset++; bit_offset++;
@ -2487,7 +2489,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
} }
} }
vector->writeField(writeIndex, !Tag, 1); bitvec_write_field(vector, writeIndex, !Tag, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)(!Tag) << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)(!Tag) << "\n" ;
bit_offset++; bit_offset++;
@ -2525,7 +2527,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
{ /* get data element */ { /* get data element */
if (ElementCount != ElementNum) if (ElementCount != ElementNum)
{ {
vector->writeField(writeIndex, Tag, 1); bitvec_write_field(vector, writeIndex, Tag, 1);
LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ; LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ;
bit_offset++; bit_offset++;
remaining_bits_len--; remaining_bits_len--;
@ -2552,7 +2554,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
} }
} }
vector->writeField(writeIndex, !Tag, 1); bitvec_write_field(vector, writeIndex, !Tag, 1);
bit_offset++; bit_offset++;
Tag = STANDARD_TAG; /* in case it was set to "reversed" */ Tag = STANDARD_TAG; /* in case it was set to "reversed" */
pDescr++; pDescr++;
@ -2562,7 +2564,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec
case CSN_FIXED: case CSN_FIXED:
{ /* Verify the fixed bits */ { /* Verify the fixed bits */
guint8 no_of_bits = (guint8) pDescr->i; guint8 no_of_bits = (guint8) pDescr->i;
vector->writeField(writeIndex, pDescr->offset, no_of_bits); bitvec_write_field(vector, writeIndex, pDescr->offset, no_of_bits);
LOG(INFO) << pDescr->sz<< " = " << pDescr->offset << "\n"; LOG(INFO) << pDescr->sz<< " = " << pDescr->offset << "\n";
remaining_bits_len -= no_of_bits; remaining_bits_len -= no_of_bits;
bit_offset += no_of_bits; bit_offset += no_of_bits;

8
csn1.h
View File

@ -25,7 +25,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <BitVector.h> #include <bitvector.h>
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#ifndef _PACKET_CSN1_H_ #ifndef _PACKET_CSN1_H_
@ -82,7 +82,7 @@ typedef struct
gint direction; /* 0 - decode; 1 - encode */ gint direction; /* 0 - decode; 1 - encode */
} csnStream_t; } csnStream_t;
typedef gint16 (*StreamSerializeFcn_t)(csnStream_t* ar, BitVector *vector, size_t& readIndex, void* data); typedef gint16 (*StreamSerializeFcn_t)(csnStream_t* ar, bitvec *vector, size_t& readIndex, void* data);
typedef enum typedef enum
{ {
CSN_END = 0, CSN_END = 0,
@ -223,9 +223,9 @@ void csnStreamInit(csnStream_t* ar,gint BitOffset,gint BitCount);
* RETURNS: int Number of bits left to be unpacked. Negative Error code if failed to unpack all bits * RETURNS: int Number of bits left to be unpacked. Negative Error code if failed to unpack all bits
******************************************************************************/ ******************************************************************************/
gint16 csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, size_t& readIndex, void* data); gint16 csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, size_t& readIndex, void* data);
gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, size_t& readIndex, void* data); gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, size_t& readIndex, void* data);
/* CSN struct macro's */ /* CSN struct macro's */
#define CSN_DESCR_BEGIN(_STRUCT)\ #define CSN_DESCR_BEGIN(_STRUCT)\

View File

@ -152,189 +152,189 @@ static void tbf_gsm_timer_start(struct gprs_rlcmac_tbf *tbf, unsigned int fT,
osmo_gsm_timer_schedule(&tbf->gsm_timer, frames); osmo_gsm_timer_schedule(&tbf->gsm_timer, frames);
} }
void write_packet_downlink_assignment(BitVector * dest, uint8_t tfi, uint32_t tlli) void write_packet_downlink_assignment(bitvec * dest, uint8_t tfi, uint32_t tlli)
{ {
// TODO We should use our implementation of encode RLC/MAC Control messages. // TODO We should use our implementation of encode RLC/MAC Control messages.
unsigned wp = 0; unsigned wp = 0;
dest->writeField(wp,0x1,2); // Payload Type bitvec_write_field(dest, wp,0x1,2); // Payload Type
dest->writeField(wp,0x0,2); // Uplink block with TDMA framenumber bitvec_write_field(dest, wp,0x0,2); // Uplink block with TDMA framenumber
dest->writeField(wp,0x1,1); // Suppl/Polling Bit bitvec_write_field(dest, wp,0x1,1); // Suppl/Polling Bit
dest->writeField(wp,0x1,3); // Uplink state flag bitvec_write_field(dest, wp,0x1,3); // Uplink state flag
dest->writeField(wp,0x2,6); // MESSAGE TYPE bitvec_write_field(dest, wp,0x2,6); // MESSAGE TYPE
dest->writeField(wp,0x0,2); // Page Mode bitvec_write_field(dest, wp,0x0,2); // Page Mode
dest->writeField(wp,0x0,1); // switch PERSIST_LEVEL: off bitvec_write_field(dest, wp,0x0,1); // switch PERSIST_LEVEL: off
dest->writeField(wp,0x2,2); // switch TLLI : on bitvec_write_field(dest, wp,0x2,2); // switch TLLI : on
dest->writeField(wp,tlli,32); // TLLI bitvec_write_field(dest, wp,tlli,32); // TLLI
dest->writeField(wp,0x0,1); // Message escape bitvec_write_field(dest, wp,0x0,1); // Message escape
dest->writeField(wp,0x0,2); // Medium Access Method: Dynamic Allocation bitvec_write_field(dest, wp,0x0,2); // Medium Access Method: Dynamic Allocation
dest->writeField(wp,0x0,1); // RLC acknowledged mode bitvec_write_field(dest, wp,0x0,1); // RLC acknowledged mode
dest->writeField(wp,0x0,1); // the network establishes no new downlink TBF for the mobile station bitvec_write_field(dest, wp,0x0,1); // the network establishes no new downlink TBF for the mobile station
dest->writeField(wp,0x1,8); // timeslot 7 bitvec_write_field(dest, wp,0x1,8); // timeslot 7
dest->writeField(wp,0x1,8); // TIMING_ADVANCE_INDEX bitvec_write_field(dest, wp,0x1,8); // TIMING_ADVANCE_INDEX
dest->writeField(wp,0x0,1); // switch TIMING_ADVANCE_VALUE = off bitvec_write_field(dest, wp,0x0,1); // switch TIMING_ADVANCE_VALUE = off
dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on
dest->writeField(wp,0xC,4); // TIMING_ADVANCE_INDEX bitvec_write_field(dest, wp,0xC,4); // TIMING_ADVANCE_INDEX
dest->writeField(wp,0x7,3); // TIMING_ADVANCE_TIMESLOT_NUMBER bitvec_write_field(dest, wp,0x7,3); // TIMING_ADVANCE_TIMESLOT_NUMBER
dest->writeField(wp,0x0,1); // switch POWER CONTROL = off bitvec_write_field(dest, wp,0x0,1); // switch POWER CONTROL = off
dest->writeField(wp,0x1,1); // Frequency Parameters information elements = present bitvec_write_field(dest, wp,0x1,1); // Frequency Parameters information elements = present
dest->writeField(wp,0x2,3); // Training Sequence Code (TSC) = 2 bitvec_write_field(dest, wp,0x2,3); // Training Sequence Code (TSC) = 2
dest->writeField(wp,0x1,2); // Indirect encoding struct = present bitvec_write_field(dest, wp,0x1,2); // Indirect encoding struct = present
dest->writeField(wp,0x0,6); // MAIO bitvec_write_field(dest, wp,0x0,6); // MAIO
dest->writeField(wp,0xE,4); // MA_Number bitvec_write_field(dest, wp,0xE,4); // MA_Number
dest->writeField(wp,0x8,4); // CHANGE_MARK_1 CHANGE_MARK_2 bitvec_write_field(dest, wp,0x8,4); // CHANGE_MARK_1 CHANGE_MARK_2
dest->writeField(wp,0x1,1); // switch TFI : on bitvec_write_field(dest, wp,0x1,1); // switch TFI : on
dest->writeField(wp,tfi,5);// TFI bitvec_write_field(dest, wp,tfi,5);// TFI
dest->writeField(wp,0x1,1); // Power Control Parameters IE = present bitvec_write_field(dest, wp,0x1,1); // Power Control Parameters IE = present
dest->writeField(wp,0x0,4); // ALPHA power control parameter bitvec_write_field(dest, wp,0x0,4); // ALPHA power control parameter
dest->writeField(wp,0x0,1); // switch GAMMA_TN0 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN0 = off
dest->writeField(wp,0x0,1); // switch GAMMA_TN1 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN1 = off
dest->writeField(wp,0x0,1); // switch GAMMA_TN2 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN2 = off
dest->writeField(wp,0x0,1); // switch GAMMA_TN3 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN3 = off
dest->writeField(wp,0x0,1); // switch GAMMA_TN4 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN4 = off
dest->writeField(wp,0x0,1); // switch GAMMA_TN5 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN5 = off
dest->writeField(wp,0x0,1); // switch GAMMA_TN6 = off bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN6 = off
dest->writeField(wp,0x1,1); // switch GAMMA_TN7 = on bitvec_write_field(dest, wp,0x1,1); // switch GAMMA_TN7 = on
dest->writeField(wp,0x0,5); // GAMMA_TN7 bitvec_write_field(dest, wp,0x0,5); // GAMMA_TN7
dest->writeField(wp,0x0,1); // TBF Starting TIME IE not present bitvec_write_field(dest, wp,0x0,1); // TBF Starting TIME IE not present
dest->writeField(wp,0x0,1); // Measurement Mapping struct not present bitvec_write_field(dest, wp,0x0,1); // Measurement Mapping struct not present
} }
void write_packet_uplink_assignment(BitVector * dest, uint8_t tfi, uint32_t tlli) void write_packet_uplink_assignment(bitvec * dest, uint8_t tfi, uint32_t tlli)
{ {
// TODO We should use our implementation of encode RLC/MAC Control messages. // TODO We should use our implementation of encode RLC/MAC Control messages.
unsigned wp = 0; unsigned wp = 0;
dest->writeField(wp,0x1,2); // Payload Type bitvec_write_field(dest, wp,0x1,2); // Payload Type
dest->writeField(wp,0x0,2); // Uplink block with TDMA framenumber bitvec_write_field(dest, wp,0x0,2); // Uplink block with TDMA framenumber
dest->writeField(wp,0x1,1); // Suppl/Polling Bit bitvec_write_field(dest, wp,0x1,1); // Suppl/Polling Bit
dest->writeField(wp,0x1,3); // Uplink state flag bitvec_write_field(dest, wp,0x1,3); // Uplink state flag
dest->writeField(wp,0xa,6); // MESSAGE TYPE bitvec_write_field(dest, wp,0xa,6); // MESSAGE TYPE
dest->writeField(wp,0x0,2); // Page Mode bitvec_write_field(dest, wp,0x0,2); // Page Mode
dest->writeField(wp,0x0,1); // switch PERSIST_LEVEL: off bitvec_write_field(dest, wp,0x0,1); // switch PERSIST_LEVEL: off
dest->writeField(wp,0x2,2); // switch TLLI : on bitvec_write_field(dest, wp,0x2,2); // switch TLLI : on
dest->writeField(wp,tlli,32); // TLLI bitvec_write_field(dest, wp,tlli,32); // TLLI
dest->writeField(wp,0x0,1); // Message escape bitvec_write_field(dest, wp,0x0,1); // Message escape
dest->writeField(wp,0x0,2); // CHANNEL_CODING_COMMAND bitvec_write_field(dest, wp,0x0,2); // CHANNEL_CODING_COMMAND
dest->writeField(wp,0x0,1); // TLLI_BLOCK_CHANNEL_CODING bitvec_write_field(dest, wp,0x0,1); // TLLI_BLOCK_CHANNEL_CODING
dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_VALUE = on bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_VALUE = on
dest->writeField(wp,0x0,6); // TIMING_ADVANCE_VALUE bitvec_write_field(dest, wp,0x0,6); // TIMING_ADVANCE_VALUE
dest->writeField(wp,0x0,1); // switch TIMING_ADVANCE_INDEX = off bitvec_write_field(dest, wp,0x0,1); // switch TIMING_ADVANCE_INDEX = off
dest->writeField(wp,0x0,1); // Frequency Parameters = off bitvec_write_field(dest, wp,0x0,1); // Frequency Parameters = off
dest->writeField(wp,0x1,2); // Dynamic Allocation = off bitvec_write_field(dest, wp,0x1,2); // Dynamic Allocation = off
dest->writeField(wp,0x0,1); // Dynamic Allocation bitvec_write_field(dest, wp,0x0,1); // Dynamic Allocation
dest->writeField(wp,0x0,1); // P0 = off bitvec_write_field(dest, wp,0x0,1); // P0 = off
dest->writeField(wp,0x1,1); // USF_GRANULARITY bitvec_write_field(dest, wp,0x1,1); // USF_GRANULARITY
dest->writeField(wp,0x1,1); // switch TFI : on bitvec_write_field(dest, wp,0x1,1); // switch TFI : on
dest->writeField(wp,tfi,5);// TFI bitvec_write_field(dest, wp,tfi,5);// TFI
dest->writeField(wp,0x0,1); // bitvec_write_field(dest, wp,0x0,1); //
dest->writeField(wp,0x0,1); // TBF Starting Time = off bitvec_write_field(dest, wp,0x0,1); // TBF Starting Time = off
dest->writeField(wp,0x0,1); // Timeslot Allocation bitvec_write_field(dest, wp,0x0,1); // Timeslot Allocation
dest->writeField(wp,0x0,5); // USF_TN 0 - 4 bitvec_write_field(dest, wp,0x0,5); // USF_TN 0 - 4
dest->writeField(wp,0x1,1); // USF_TN 5 bitvec_write_field(dest, wp,0x1,1); // USF_TN 5
dest->writeField(wp,0x1,3); // USF_TN 5 bitvec_write_field(dest, wp,0x1,3); // USF_TN 5
dest->writeField(wp,0x0,2); // USF_TN 6 - 7 bitvec_write_field(dest, wp,0x0,2); // USF_TN 6 - 7
// dest->writeField(wp,0x0,1); // Measurement Mapping struct not present // bitvec_write_field(dest, wp,0x0,1); // Measurement Mapping struct not present
} }
// GSM 04.08 9.1.18 Immediate assignment // GSM 04.08 9.1.18 Immediate assignment
int write_immediate_assignment(BitVector * dest, uint8_t downlink, uint8_t ra, uint32_t fn, int write_immediate_assignment(bitvec * dest, uint8_t downlink, uint8_t ra, uint32_t fn,
uint8_t ta, uint8_t tfi = 0, uint32_t tlli = 0) uint8_t ta, uint8_t tfi = 0, uint32_t tlli = 0)
{ {
unsigned wp = 0; unsigned wp = 0;
dest->writeField(wp,0x0,4); // Skip Indicator bitvec_write_field(dest, wp,0x0,4); // Skip Indicator
dest->writeField(wp,0x6,4); // Protocol Discriminator bitvec_write_field(dest, wp,0x6,4); // Protocol Discriminator
dest->writeField(wp,0x3F,8); // Immediate Assignment Message Type bitvec_write_field(dest, wp,0x3F,8); // Immediate Assignment Message Type
// 10.5.2.25b Dedicated mode or TBF // 10.5.2.25b Dedicated mode or TBF
dest->writeField(wp,0x0,1); // spare bitvec_write_field(dest, wp,0x0,1); // spare
dest->writeField(wp,0x0,1); // TMA : Two-message assignment: No meaning bitvec_write_field(dest, wp,0x0,1); // TMA : Two-message assignment: No meaning
dest->writeField(wp,downlink,1); // Downlink : Downlink assignment to mobile in packet idle mode bitvec_write_field(dest, wp,downlink,1); // Downlink : Downlink assignment to mobile in packet idle mode
dest->writeField(wp,0x1,1); // T/D : TBF or dedicated mode: this message assigns a Temporary Block Flow (TBF). bitvec_write_field(dest, wp,0x1,1); // T/D : TBF or dedicated mode: this message assigns a Temporary Block Flow (TBF).
dest->writeField(wp,0x0,4); // Page Mode bitvec_write_field(dest, wp,0x0,4); // Page Mode
// GSM 04.08 10.5.2.25a Packet Channel Description // GSM 04.08 10.5.2.25a Packet Channel Description
dest->writeField(wp,0x1,5); // Channel type bitvec_write_field(dest, wp,0x1,5); // Channel type
dest->writeField(wp,(l1fh->fl1h)->channel_info.tn,3); // TN bitvec_write_field(dest, wp,(l1fh->fl1h)->channel_info.tn,3); // TN
dest->writeField(wp,(l1fh->fl1h)->channel_info.tsc,3); // TSC bitvec_write_field(dest, wp,(l1fh->fl1h)->channel_info.tsc,3); // TSC
dest->writeField(wp,0x0,3); // non-hopping RF channel configuraion bitvec_write_field(dest, wp,0x0,3); // non-hopping RF channel configuraion
dest->writeField(wp,(l1fh->fl1h)->channel_info.arfcn,10); // ARFCN bitvec_write_field(dest, wp,(l1fh->fl1h)->channel_info.arfcn,10); // ARFCN
//10.5.2.30 Request Reference //10.5.2.30 Request Reference
dest->writeField(wp,ra,8); // RA bitvec_write_field(dest, wp,ra,8); // RA
dest->writeField(wp,(fn / (26 * 51)) % 32,5); // T1' bitvec_write_field(dest, wp,(fn / (26 * 51)) % 32,5); // T1'
dest->writeField(wp,fn % 51,6); // T3 bitvec_write_field(dest, wp,fn % 51,6); // T3
dest->writeField(wp,fn % 26,5); // T2 bitvec_write_field(dest, wp,fn % 26,5); // T2
// 10.5.2.40 Timing Advance // 10.5.2.40 Timing Advance
dest->writeField(wp,0x0,2); // spare bitvec_write_field(dest, wp,0x0,2); // spare
dest->writeField(wp,ta,6); // Timing Advance value bitvec_write_field(dest, wp,ta,6); // Timing Advance value
// No mobile allocation in non-hopping systems. // No mobile allocation in non-hopping systems.
// A zero-length LV. Just write L=0. // A zero-length LV. Just write L=0.
dest->writeField(wp,0,8); bitvec_write_field(dest, wp,0,8);
if (downlink) if (downlink)
{ {
// GSM 04.08 10.5.2.16 IA Rest Octets // GSM 04.08 10.5.2.16 IA Rest Octets
dest->writeField(wp, 3, 2); // "HH" bitvec_write_field(dest, wp, 3, 2); // "HH"
dest->writeField(wp, 1, 2); // "01" Packet Downlink Assignment bitvec_write_field(dest, wp, 1, 2); // "01" Packet Downlink Assignment
dest->writeField(wp,tlli,32); // TLLI bitvec_write_field(dest, wp,tlli,32); // TLLI
dest->writeField(wp,0x1,1); // switch TFI : on bitvec_write_field(dest, wp,0x1,1); // switch TFI : on
dest->writeField(wp,tfi,5); // TFI bitvec_write_field(dest, wp,tfi,5); // TFI
dest->writeField(wp,0x0,1); // RLC acknowledged mode bitvec_write_field(dest, wp,0x0,1); // RLC acknowledged mode
dest->writeField(wp,0x0,1); // ALPHA = present bitvec_write_field(dest, wp,0x0,1); // ALPHA = present
dest->writeField(wp,0x0,5); // GAMMA power control parameter bitvec_write_field(dest, wp,0x0,5); // GAMMA power control parameter
dest->writeField(wp,0x0,1); // Polling Bit bitvec_write_field(dest, wp,0x0,1); // Polling Bit
dest->writeField(wp,0x1,1); // TA_VALID ??? bitvec_write_field(dest, wp,0x1,1); // TA_VALID ???
dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on
dest->writeField(wp,0x0,4); // TIMING_ADVANCE_INDEX bitvec_write_field(dest, wp,0x0,4); // TIMING_ADVANCE_INDEX
dest->writeField(wp,0x0,1); // TBF Starting TIME present bitvec_write_field(dest, wp,0x0,1); // TBF Starting TIME present
dest->writeField(wp,0x0,1); // P0 not present bitvec_write_field(dest, wp,0x0,1); // P0 not present
dest->writeField(wp,0x1,1); // P0 not present bitvec_write_field(dest, wp,0x1,1); // P0 not present
dest->writeField(wp,0xb,4); bitvec_write_field(dest, wp,0xb,4);
} }
else else
{ {
// GMS 04.08 10.5.2.37b 10.5.2.16 // GMS 04.08 10.5.2.37b 10.5.2.16
dest->writeField(wp, 3, 2); // "HH" bitvec_write_field(dest, wp, 3, 2); // "HH"
dest->writeField(wp, 0, 2); // "0" Packet Uplink Assignment bitvec_write_field(dest, wp, 0, 2); // "0" Packet Uplink Assignment
dest->writeField(wp, 1, 1); // Block Allocation : Not Single Block Allocation bitvec_write_field(dest, wp, 1, 1); // Block Allocation : Not Single Block Allocation
dest->writeField(wp, tfi, 5); // TFI_ASSIGNMENT Temporary Flow Identity bitvec_write_field(dest, wp, tfi, 5); // TFI_ASSIGNMENT Temporary Flow Identity
dest->writeField(wp, 0, 1); // POLLING bitvec_write_field(dest, wp, 0, 1); // POLLING
dest->writeField(wp, 0, 1); // ALLOCATION_TYPE: dynamic bitvec_write_field(dest, wp, 0, 1); // ALLOCATION_TYPE: dynamic
dest->writeField(wp, 1, 3); // USF bitvec_write_field(dest, wp, 1, 3); // USF
dest->writeField(wp, 1, 1); // USF_GRANULARITY bitvec_write_field(dest, wp, 1, 1); // USF_GRANULARITY
dest->writeField(wp, 0 , 1); // "0" power control: Not Present bitvec_write_field(dest, wp, 0 , 1); // "0" power control: Not Present
dest->writeField(wp, 0, 2); // CHANNEL_CODING_COMMAND bitvec_write_field(dest, wp, 0, 2); // CHANNEL_CODING_COMMAND
dest->writeField(wp, 1, 1); // TLLI_BLOCK_CHANNEL_CODING bitvec_write_field(dest, wp, 1, 1); // TLLI_BLOCK_CHANNEL_CODING
dest->writeField(wp, 1 , 1); // "1" Alpha : Present bitvec_write_field(dest, wp, 1 , 1); // "1" Alpha : Present
dest->writeField(wp, 0, 4); // Alpha bitvec_write_field(dest, wp, 0, 4); // Alpha
dest->writeField(wp, 0, 5); // Gamma bitvec_write_field(dest, wp, 0, 5); // Gamma
dest->writeField(wp, 0, 1); // TIMING_ADVANCE_INDEX_FLAG bitvec_write_field(dest, wp, 0, 1); // TIMING_ADVANCE_INDEX_FLAG
dest->writeField(wp, 0, 1); // TBF_STARTING_TIME_FLAG bitvec_write_field(dest, wp, 0, 1); // TBF_STARTING_TIME_FLAG
} }
if (wp%8) if (wp%8)
@ -344,78 +344,79 @@ int write_immediate_assignment(BitVector * dest, uint8_t downlink, uint8_t ra, u
} }
void write_ia_rest_octets_downlink_assignment(BitVector * dest, uint8_t tfi, uint32_t tlli) void write_ia_rest_octets_downlink_assignment(bitvec * dest, uint8_t tfi, uint32_t tlli)
{ {
// GSM 04.08 10.5.2.16 // GSM 04.08 10.5.2.16
unsigned wp = 0; unsigned wp = 0;
dest->writeField(wp, 3, 2); // "HH" bitvec_write_field(dest, wp, 3, 2); // "HH"
dest->writeField(wp, 1, 2); // "01" Packet Downlink Assignment bitvec_write_field(dest, wp, 1, 2); // "01" Packet Downlink Assignment
dest->writeField(wp,tlli,32); // TLLI bitvec_write_field(dest, wp,tlli,32); // TLLI
dest->writeField(wp,0x1,1); // switch TFI : on bitvec_write_field(dest, wp,0x1,1); // switch TFI : on
dest->writeField(wp,tfi,5); // TFI bitvec_write_field(dest, wp,tfi,5); // TFI
dest->writeField(wp,0x0,1); // RLC acknowledged mode bitvec_write_field(dest, wp,0x0,1); // RLC acknowledged mode
dest->writeField(wp,0x0,1); // ALPHA = present bitvec_write_field(dest, wp,0x0,1); // ALPHA = present
dest->writeField(wp,0x0,5); // GAMMA power control parameter bitvec_write_field(dest, wp,0x0,5); // GAMMA power control parameter
dest->writeField(wp,0x0,1); // Polling Bit bitvec_write_field(dest, wp,0x0,1); // Polling Bit
dest->writeField(wp,0x1,1); // TA_VALID ??? bitvec_write_field(dest, wp,0x1,1); // TA_VALID ???
dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on
dest->writeField(wp,0x0,4); // TIMING_ADVANCE_INDEX bitvec_write_field(dest, wp,0x0,4); // TIMING_ADVANCE_INDEX
dest->writeField(wp,0x0,1); // TBF Starting TIME present bitvec_write_field(dest, wp,0x0,1); // TBF Starting TIME present
dest->writeField(wp,0x0,1); // P0 not present bitvec_write_field(dest, wp,0x0,1); // P0 not present
dest->writeField(wp,0x1,1); // P0 not present bitvec_write_field(dest, wp,0x1,1); // P0 not present
dest->writeField(wp,0xb,4); bitvec_write_field(dest, wp,0xb,4);
} }
void write_packet_uplink_ack(BitVector * dest, uint8_t tfi, uint32_t tlli, unsigned cv, unsigned bsn) void write_packet_uplink_ack(bitvec * dest, uint8_t tfi, uint32_t tlli, unsigned cv, unsigned bsn)
{ {
// TODO We should use our implementation of encode RLC/MAC Control messages. // TODO We should use our implementation of encode RLC/MAC Control messages.
unsigned wp = 0; unsigned wp = 0;
dest->writeField(wp,0x1,2); // payload bitvec_write_field(dest, wp,0x1,2); // payload
dest->writeField(wp,0x0,2); // Uplink block with TDMA framenumber bitvec_write_field(dest, wp,0x0,2); // Uplink block with TDMA framenumber
if (cv == 0) dest->writeField(wp,0x1,1); // Suppl/Polling Bit if (cv == 0) bitvec_write_field(dest, wp,0x1,1); // Suppl/Polling Bit
else dest->writeField(wp,0x0,1); //Suppl/Polling Bit else bitvec_write_field(dest, wp,0x0,1); //Suppl/Polling Bit
dest->writeField(wp,0x1,3); // Uplink state flag bitvec_write_field(dest, wp,0x1,3); // Uplink state flag
//dest->writeField(wp,0x0,1); // Reduced block sequence number //bitvec_write_field(dest, wp,0x0,1); // Reduced block sequence number
//dest->writeField(wp,BSN+6,5); // Radio transaction identifier //bitvec_write_field(dest, wp,BSN+6,5); // Radio transaction identifier
//dest->writeField(wp,0x1,1); // Final segment //bitvec_write_field(dest, wp,0x1,1); // Final segment
//dest->writeField(wp,0x1,1); // Address control //bitvec_write_field(dest, wp,0x1,1); // Address control
//dest->writeField(wp,0x0,2); // Power reduction: 0 //bitvec_write_field(dest, wp,0x0,2); // Power reduction: 0
//dest->writeField(wp,TFI,5); // Temporary flow identifier //bitvec_write_field(dest, wp,TFI,5); // Temporary flow identifier
//dest->writeField(wp,0x1,1); // Direction //bitvec_write_field(dest, wp,0x1,1); // Direction
dest->writeField(wp,0x09,6); // MESSAGE TYPE bitvec_write_field(dest, wp,0x09,6); // MESSAGE TYPE
dest->writeField(wp,0x0,2); // Page Mode bitvec_write_field(dest, wp,0x0,2); // Page Mode
dest->writeField(wp,0x0,2); bitvec_write_field(dest, wp,0x0,2);
dest->writeField(wp,tfi,5); // Uplink TFI bitvec_write_field(dest, wp,tfi,5); // Uplink TFI
dest->writeField(wp,0x0,1); bitvec_write_field(dest, wp,0x0,1);
dest->writeField(wp,0x0,2); // CS1 bitvec_write_field(dest, wp,0x0,2); // CS1
if (cv == 0) dest->writeField(wp,0x1,1); // FINAL_ACK_INDICATION if (cv == 0) bitvec_write_field(dest, wp,0x1,1); // FINAL_ACK_INDICATION
else dest->writeField(wp,0x0,1); // FINAL_ACK_INDICATION else bitvec_write_field(dest, wp,0x0,1); // FINAL_ACK_INDICATION
dest->writeField(wp,bsn + 1,7); // STARTING_SEQUENCE_NUMBER bitvec_write_field(dest, wp,bsn + 1,7); // STARTING_SEQUENCE_NUMBER
// RECEIVE_BLOCK_BITMAP // RECEIVE_BLOCK_BITMAP
for (unsigned i=0; i<8; i++) { for (unsigned i=0; i<8; i++) {
dest->writeField(wp,0xff,8); bitvec_write_field(dest, wp,0xff,8);
} }
dest->writeField(wp,0x1,1); // CONTENTION_RESOLUTION_TLLI = present bitvec_write_field(dest, wp,0x1,1); // CONTENTION_RESOLUTION_TLLI = present
dest->writeField(wp,tlli,8*4); bitvec_write_field(dest, wp,tlli,8*4);
dest->writeField(wp,0x00,4); //spare bitvec_write_field(dest, wp,0x00,4); //spare
} }
void gprs_rlcmac_tx_ul_ack(uint8_t tfi, uint32_t tlli, RlcMacUplinkDataBlock_t * ul_data_block) void gprs_rlcmac_tx_ul_ack(uint8_t tfi, uint32_t tlli, RlcMacUplinkDataBlock_t * ul_data_block)
{ {
BitVector packet_uplink_ack_vec(23*8); bitvec *packet_uplink_ack_vec = bitvec_alloc(23);
packet_uplink_ack_vec.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(packet_uplink_ack_vec, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
write_packet_uplink_ack(&packet_uplink_ack_vec, tfi, tlli, ul_data_block->CV, ul_data_block->BSN); write_packet_uplink_ack(packet_uplink_ack_vec, tfi, tlli, ul_data_block->CV, ul_data_block->BSN);
COUT("RLCMAC_CONTROL_BLOCK>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); COUT("RLCMAC_CONTROL_BLOCK>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
RlcMacDownlink_t * packet_uplink_ack = (RlcMacDownlink_t *)malloc(sizeof(RlcMacDownlink_t)); RlcMacDownlink_t * packet_uplink_ack = (RlcMacDownlink_t *)malloc(sizeof(RlcMacDownlink_t));
decode_gsm_rlcmac_downlink(&packet_uplink_ack_vec, packet_uplink_ack); decode_gsm_rlcmac_downlink(packet_uplink_ack_vec, packet_uplink_ack);
free(packet_uplink_ack); free(packet_uplink_ack);
COUT("RLCMAC_CONTROL_BLOCK_END------------------------------"); COUT("RLCMAC_CONTROL_BLOCK_END------------------------------");
pcu_l1if_tx(&packet_uplink_ack_vec, GsmL1_Sapi_Pacch); pcu_l1if_tx(packet_uplink_ack_vec, GsmL1_Sapi_Pacch);
bitvec_free(packet_uplink_ack_vec);
} }
void gprs_rlcmac_data_block_parse(gprs_rlcmac_tbf* tbf, RlcMacUplinkDataBlock_t * ul_data_block) void gprs_rlcmac_data_block_parse(gprs_rlcmac_tbf* tbf, RlcMacUplinkDataBlock_t * ul_data_block)
@ -451,7 +452,7 @@ void gprs_rlcmac_data_block_parse(gprs_rlcmac_tbf* tbf, RlcMacUplinkDataBlock_t
} }
/* Received Uplink RLC data block. */ /* Received Uplink RLC data block. */
int gprs_rlcmac_rcv_data_block(BitVector *rlc_block) int gprs_rlcmac_rcv_data_block(bitvec *rlc_block)
{ {
struct gprs_rlcmac_tbf *tbf; struct gprs_rlcmac_tbf *tbf;
@ -503,7 +504,7 @@ int gprs_rlcmac_rcv_data_block(BitVector *rlc_block)
} }
/* Received Uplink RLC control block. */ /* Received Uplink RLC control block. */
int gprs_rlcmac_rcv_control_block(BitVector *rlc_block) int gprs_rlcmac_rcv_control_block(bitvec *rlc_block)
{ {
//static unsigned shutUp = 0; //static unsigned shutUp = 0;
uint8_t tfi = 0; uint8_t tfi = 0;
@ -532,20 +533,21 @@ int gprs_rlcmac_rcv_control_block(BitVector *rlc_block)
return 0; return 0;
} }
COUT("SEND PacketUplinkAssignment>>>>>>>>>>>>>>>>>>"); COUT("SEND PacketUplinkAssignment>>>>>>>>>>>>>>>>>>");
BitVector packet_uplink_assignment(23*8); bitvec *packet_uplink_assignment = bitvec_alloc(23);
packet_uplink_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(packet_uplink_assignment, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
write_packet_uplink_assignment(&packet_uplink_assignment, tbf->tfi, tbf->tlli); write_packet_uplink_assignment(packet_uplink_assignment, tbf->tfi, tbf->tlli);
pcu_l1if_tx(&packet_uplink_assignment, GsmL1_Sapi_Pacch); pcu_l1if_tx(packet_uplink_assignment, GsmL1_Sapi_Pacch);
bitvec_free(packet_uplink_assignment);
break; break;
} }
free(ul_control_block); free(ul_control_block);
return 1; return 1;
} }
void gprs_rlcmac_rcv_block(BitVector *rlc_block) void gprs_rlcmac_rcv_block(bitvec *rlc_block)
{ {
unsigned readIndex = 0; unsigned readIndex = 0;
unsigned payload = rlc_block->readField(readIndex, 2); unsigned payload = bitvec_read_field(rlc_block, readIndex, 2);
switch (payload) { switch (payload) {
case GPRS_RLCMAC_DATA_BLOCK: case GPRS_RLCMAC_DATA_BLOCK:
@ -576,18 +578,19 @@ int gprs_rlcmac_rcv_rach(uint8_t ra, uint32_t Fn, uint16_t ta)
COUT("[UPLINK TBF : " << tfi << " ] : START"); COUT("[UPLINK TBF : " << tfi << " ] : START");
COUT("SEND Immidiate Assignment>>>>>>>>>>>>>>>>>>"); COUT("SEND Immidiate Assignment>>>>>>>>>>>>>>>>>>");
BitVector immediate_assignment(23*8); bitvec *immediate_assignment = bitvec_alloc(23);
immediate_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(immediate_assignment, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
int len = write_immediate_assignment(&immediate_assignment, 0, ra, Fn, ta, tbf->tfi); int len = write_immediate_assignment(immediate_assignment, 0, ra, Fn, ta, tbf->tfi);
pcu_l1if_tx(&immediate_assignment, GsmL1_Sapi_Agch, len); pcu_l1if_tx(immediate_assignment, GsmL1_Sapi_Agch, len);
bitvec_free(immediate_assignment);
} }
// Send RLC data to OpenBTS. // Send RLC data to OpenBTS.
void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t tfi, uint8_t *pdu, int start_index, int end_index, uint8_t bsn, uint8_t fbi) void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t tfi, uint8_t *pdu, int start_index, int end_index, uint8_t bsn, uint8_t fbi)
{ {
int spare_len = 0; int spare_len = 0;
BitVector data_block_vector(BLOCK_LEN*8); bitvec *data_block_vector = bitvec_alloc(BLOCK_LEN);
data_block_vector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(data_block_vector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
RlcMacDownlinkDataBlock_t * data_block = (RlcMacDownlinkDataBlock_t *)malloc(sizeof(RlcMacDownlinkDataBlock_t)); RlcMacDownlinkDataBlock_t * data_block = (RlcMacDownlinkDataBlock_t *)malloc(sizeof(RlcMacDownlinkDataBlock_t));
data_block->PAYLOAD_TYPE = 0; data_block->PAYLOAD_TYPE = 0;
data_block->RRBP = 0; data_block->RRBP = 0;
@ -616,9 +619,10 @@ void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t tfi, uint8_t *pdu, int
for(i = j; i < j + spare_len; i++) { for(i = j; i < j + spare_len; i++) {
data_block->RLC_DATA[i] = 0x2b; data_block->RLC_DATA[i] = 0x2b;
} }
encode_gsm_rlcmac_downlink_data(&data_block_vector, data_block); encode_gsm_rlcmac_downlink_data(data_block_vector, data_block);
free(data_block); free(data_block);
pcu_l1if_tx(&data_block_vector, GsmL1_Sapi_Pdtch); pcu_l1if_tx(data_block_vector, GsmL1_Sapi_Pdtch);
bitvec_free(data_block_vector);
} }
int gprs_rlcmac_segment_llc_pdu(struct gprs_rlcmac_tbf *tbf) int gprs_rlcmac_segment_llc_pdu(struct gprs_rlcmac_tbf *tbf)
@ -686,9 +690,10 @@ void gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf)
void gprs_rlcmac_downlink_assignment(gprs_rlcmac_tbf *tbf) void gprs_rlcmac_downlink_assignment(gprs_rlcmac_tbf *tbf)
{ {
COUT("SEND IA Rest Octets Downlink Assignment>>>>>>>>>>>>>>>>>>"); COUT("SEND IA Rest Octets Downlink Assignment>>>>>>>>>>>>>>>>>>");
BitVector immediate_assignment(23*8); bitvec *immediate_assignment = bitvec_alloc(23);
immediate_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); bitvec_unhex(immediate_assignment, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
int len = write_immediate_assignment(&immediate_assignment, 1, 125, get_current_fn(), (l1fh->fl1h)->channel_info.ta, tbf->tfi, tbf->tlli); int len = write_immediate_assignment(immediate_assignment, 1, 125, get_current_fn(), (l1fh->fl1h)->channel_info.ta, tbf->tfi, tbf->tlli);
pcu_l1if_tx(&immediate_assignment, GsmL1_Sapi_Agch, len); pcu_l1if_tx(immediate_assignment, GsmL1_Sapi_Agch, len);
bitvec_free(immediate_assignment);
tbf_gsm_timer_start(tbf, 0, 120); tbf_gsm_timer_start(tbf, 0, 120);
} }

View File

@ -20,7 +20,7 @@
#ifndef GPRS_RLCMAC_H #ifndef GPRS_RLCMAC_H
#define GPRS_RLCMAC_H #define GPRS_RLCMAC_H
#include <BitVector.h> #include <bitvector.h>
#include <gsm_rlcmac.h> #include <gsm_rlcmac.h>
#include <gsm_timer.h> #include <gsm_timer.h>
@ -83,11 +83,11 @@ void gprs_rlcmac_tx_ul_ack(uint8_t tfi, uint32_t tlli, RlcMacUplinkDataBlock_t *
void gprs_rlcmac_data_block_parse(gprs_rlcmac_tbf* tbf, RlcMacUplinkDataBlock_t * ul_data_block); void gprs_rlcmac_data_block_parse(gprs_rlcmac_tbf* tbf, RlcMacUplinkDataBlock_t * ul_data_block);
int gprs_rlcmac_rcv_data_block(BitVector *rlc_block); int gprs_rlcmac_rcv_data_block(bitvec *rlc_block);
int gprs_rlcmac_rcv_control_block(BitVector *rlc_block); int gprs_rlcmac_rcv_control_block(bitvec *rlc_block);
void gprs_rlcmac_rcv_block(BitVector *rlc_block); void gprs_rlcmac_rcv_block(bitvec *rlc_block);
int gprs_rlcmac_rcv_rach(uint8_t ra, uint32_t Fn, uint16_t ta); int gprs_rlcmac_rcv_rach(uint8_t ra, uint32_t Fn, uint16_t ta);

View File

@ -714,7 +714,7 @@ CSN_DESCR_BEGIN(Receive_N_PDU_Number_t)
M_UINT (Receive_N_PDU_Number_t, value, 8), M_UINT (Receive_N_PDU_Number_t, value, 8),
CSN_DESCR_END (Receive_N_PDU_Number_t) CSN_DESCR_END (Receive_N_PDU_Number_t)
gint16 Receive_N_PDU_Number_list_Dissector(csnStream_t* ar, BitVector *vector, size_t& readIndex, void* data) gint16 Receive_N_PDU_Number_list_Dissector(csnStream_t* ar, bitvec *vector, size_t& readIndex, void* data)
{ {
if (ar->direction == 0) if (ar->direction == 0)
{ {
@ -825,7 +825,7 @@ CSN_DESCR_BEGIN (Content_t)
M_UINT (Content_t, PS_HandoverCapability, 1), M_UINT (Content_t, PS_HandoverCapability, 1),
CSN_DESCR_END (Content_t) CSN_DESCR_END (Content_t)
gint16 Content_Dissector(csnStream_t* ar, BitVector *vector, size_t& readIndex, void* data) gint16 Content_Dissector(csnStream_t* ar, bitvec *vector, size_t& readIndex, void* data)
{ {
if (ar->direction == 0) if (ar->direction == 0)
{ {
@ -849,7 +849,7 @@ CSN_DESCR_BEGIN (Additional_access_technologies_t)
M_REC_TARRAY (Additional_access_technologies_t, Additional_access_technologies[0], Additional_access_technologies_struct_t, Count_additional_access_technologies), M_REC_TARRAY (Additional_access_technologies_t, Additional_access_technologies[0], Additional_access_technologies_struct_t, Count_additional_access_technologies),
CSN_DESCR_END (Additional_access_technologies_t) CSN_DESCR_END (Additional_access_technologies_t)
gint16 Additional_access_technologies_Dissector(csnStream_t* ar, BitVector* vector, size_t& readIndex, void* data) gint16 Additional_access_technologies_Dissector(csnStream_t* ar, bitvec* vector, size_t& readIndex, void* data)
{ {
if (ar->direction == 0) if (ar->direction == 0)
{ {
@ -4716,11 +4716,11 @@ CSN_DESCR_BEGIN (SI6_RestOctet_t)
M_UINT_LH (SI6_RestOctet_t, BandIndicator, 1), M_UINT_LH (SI6_RestOctet_t, BandIndicator, 1),
CSN_DESCR_END (SI6_RestOctet_t) CSN_DESCR_END (SI6_RestOctet_t)
void decode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data) void decode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data)
{ {
csnStream_t ar; csnStream_t ar;
size_t readIndex = 0; size_t readIndex = 0;
guint8 payload_type = vector->readField(readIndex, 2); guint8 payload_type = bitvec_read_field(vector, readIndex, 2);
if (payload_type == PAYLOAD_TYPE_DATA) if (payload_type == PAYLOAD_TYPE_DATA)
{ {
@ -4735,7 +4735,7 @@ void decode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data)
data->NrOfBits = (23 - 1) * 8; data->NrOfBits = (23 - 1) * 8;
csnStreamInit(&ar, 0, data->NrOfBits); csnStreamInit(&ar, 0, data->NrOfBits);
readIndex += 6; readIndex += 6;
data->u.MESSAGE_TYPE = vector->readField(readIndex, 6); data->u.MESSAGE_TYPE = bitvec_read_field(vector, readIndex, 6);
readIndex = 0; readIndex = 0;
switch (data->u.MESSAGE_TYPE) switch (data->u.MESSAGE_TYPE)
{ {
@ -4821,17 +4821,17 @@ void decode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data)
} }
} }
void decode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data) void decode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data)
{ {
csnStream_t ar; csnStream_t ar;
/* See RLC/MAC downlink control block structure in TS 44.060 / 10.3.1 */ /* See RLC/MAC downlink control block structure in TS 44.060 / 10.3.1 */
gint bit_offset = 0; gint bit_offset = 0;
gint bit_length; gint bit_length;
size_t readIndex = 0; size_t readIndex = 0;
data->PAYLOAD_TYPE = vector->readField(readIndex, 2); data->PAYLOAD_TYPE = bitvec_read_field(vector, readIndex, 2);
data->RRBP = vector->readField(readIndex, 2); data->RRBP = bitvec_read_field(vector, readIndex, 2);
data->SP = vector->readField(readIndex, 1); data->SP = bitvec_read_field(vector, readIndex, 1);
data->USF = vector->readField(readIndex, 3); data->USF = bitvec_read_field(vector, readIndex, 3);
if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA) if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA)
{ {
@ -4850,27 +4850,27 @@ void decode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data)
bit_offset = 8; bit_offset = 8;
if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_CTRL_OPT_OCTET) if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_CTRL_OPT_OCTET)
{ {
data->RBSN = vector->readField(readIndex, 1); data->RBSN = bitvec_read_field(vector, readIndex, 1);
data->RTI = vector->readField(readIndex, 5); data->RTI = bitvec_read_field(vector, readIndex, 5);
data->FS = vector->readField(readIndex, 1); data->FS = bitvec_read_field(vector, readIndex, 1);
data->AC = vector->readField(readIndex, 1); data->AC = bitvec_read_field(vector, readIndex, 1);
bit_offset += 8; bit_offset += 8;
if (data->AC == 1) if (data->AC == 1)
{ {
data->PR = vector->readField(readIndex, 2); data->PR = bitvec_read_field(vector, readIndex, 2);
data->TFI = vector->readField(readIndex, 5); data->TFI = bitvec_read_field(vector, readIndex, 5);
data->D = vector->readField(readIndex, 1); data->D = bitvec_read_field(vector, readIndex, 1);
bit_offset += 8; bit_offset += 8;
} }
if ((data->RBSN == 1) && (data->FS == 0)) if ((data->RBSN == 1) && (data->FS == 0))
{ {
data->RBSNe = vector->readField(readIndex, 3); data->RBSNe = bitvec_read_field(vector, readIndex, 3);
data->FSe = vector->readField(readIndex, 1); data->FSe = bitvec_read_field(vector, readIndex, 1);
data->spare = vector->readField(readIndex, 4); data->spare = bitvec_read_field(vector, readIndex, 4);
bit_offset += 8; bit_offset += 8;
} }
} }
data->u.MESSAGE_TYPE = vector->readField(readIndex, 6); data->u.MESSAGE_TYPE = bitvec_read_field(vector, readIndex, 6);
} }
/* Initialize the contexts */ /* Initialize the contexts */
@ -5013,7 +5013,7 @@ void decode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data)
} }
} }
void encode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data) void encode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data)
{ {
csnStream_t ar; csnStream_t ar;
size_t writeIndex = 0; size_t writeIndex = 0;
@ -5104,7 +5104,7 @@ void encode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data)
} }
} }
void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data) void encode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data)
{ {
csnStream_t ar; csnStream_t ar;
@ -5127,30 +5127,30 @@ void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data)
else else
{ {
/* First print the message type and create a tree item */ /* First print the message type and create a tree item */
vector->writeField(writeIndex, data->PAYLOAD_TYPE, 2); bitvec_write_field(vector, writeIndex, data->PAYLOAD_TYPE, 2);
vector->writeField(writeIndex, data->RRBP, 2); bitvec_write_field(vector, writeIndex, data->RRBP, 2);
vector->writeField(writeIndex, data->SP, 1); bitvec_write_field(vector, writeIndex, data->SP, 1);
vector->writeField(writeIndex, data->USF, 3); bitvec_write_field(vector, writeIndex, data->USF, 3);
bit_offset = 8; bit_offset = 8;
if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_CTRL_OPT_OCTET) if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_CTRL_OPT_OCTET)
{ {
vector->writeField(writeIndex, data->RBSN, 1); bitvec_write_field(vector, writeIndex, data->RBSN, 1);
vector->writeField(writeIndex, data->RTI, 5); bitvec_write_field(vector, writeIndex, data->RTI, 5);
vector->writeField(writeIndex, data->FS, 1); bitvec_write_field(vector, writeIndex, data->FS, 1);
vector->writeField(writeIndex, data->AC, 1); bitvec_write_field(vector, writeIndex, data->AC, 1);
bit_offset += 8; bit_offset += 8;
if (data->AC == 1) if (data->AC == 1)
{ {
vector->writeField(writeIndex, data->PR, 2); bitvec_write_field(vector, writeIndex, data->PR, 2);
vector->writeField(writeIndex, data->TFI, 5); bitvec_write_field(vector, writeIndex, data->TFI, 5);
vector->writeField(writeIndex, data->D, 1); bitvec_write_field(vector, writeIndex, data->D, 1);
bit_offset += 8; bit_offset += 8;
} }
if ((data->RBSN == 1) && (data->FS == 0)) if ((data->RBSN == 1) && (data->FS == 0))
{ {
vector->writeField(writeIndex, data->RBSNe, 3); bitvec_write_field(vector, writeIndex, data->RBSNe, 3);
vector->writeField(writeIndex, data->FSe, 1); bitvec_write_field(vector, writeIndex, data->FSe, 1);
vector->writeField(writeIndex, data->spare, 4); bitvec_write_field(vector, writeIndex, data->spare, 4);
bit_offset += 8; bit_offset += 8;
} }
} }
@ -5295,36 +5295,36 @@ void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data)
} }
} }
void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t * data) void decode_gsm_rlcmac_uplink_data(bitvec * vector, RlcMacUplinkDataBlock_t * data)
{ {
size_t readIndex = 0; size_t readIndex = 0;
//unsigned dataLen = 0; //unsigned dataLen = 0;
guint8 payload_type = vector->readField(readIndex, 2); guint8 payload_type = bitvec_read_field(vector, readIndex, 2);
if (payload_type == PAYLOAD_TYPE_DATA) if (payload_type == PAYLOAD_TYPE_DATA)
{ {
readIndex = 0; readIndex = 0;
// MAC header // MAC header
data->PAYLOAD_TYPE = vector->readField(readIndex, 2); data->PAYLOAD_TYPE = bitvec_read_field(vector, readIndex, 2);
data->CV = vector->readField(readIndex, 4); data->CV = bitvec_read_field(vector, readIndex, 4);
data->SI = vector->readField(readIndex, 1); data->SI = bitvec_read_field(vector, readIndex, 1);
data->R = vector->readField(readIndex, 1); data->R = bitvec_read_field(vector, readIndex, 1);
LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE); LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE);
LOG(INFO) << " CV = " << (unsigned)(data->CV); LOG(INFO) << " CV = " << (unsigned)(data->CV);
LOG(INFO) << " SI = " << (unsigned)(data->SI); LOG(INFO) << " SI = " << (unsigned)(data->SI);
LOG(INFO) << " R = " << (unsigned)(data->R); LOG(INFO) << " R = " << (unsigned)(data->R);
// Octet 1 // Octet 1
data->spare = vector->readField(readIndex, 1); data->spare = bitvec_read_field(vector, readIndex, 1);
data->PI = vector->readField(readIndex, 1); data->PI = bitvec_read_field(vector, readIndex, 1);
data->TFI = vector->readField(readIndex, 5); data->TFI = bitvec_read_field(vector, readIndex, 5);
data->TI = vector->readField(readIndex, 1); data->TI = bitvec_read_field(vector, readIndex, 1);
LOG(INFO) << " spare = " << (unsigned)(data->spare); LOG(INFO) << " spare = " << (unsigned)(data->spare);
LOG(INFO) << " PI = " << (unsigned)(data->PI); LOG(INFO) << " PI = " << (unsigned)(data->PI);
LOG(INFO) << " TFI = " << (unsigned)(data->TFI); LOG(INFO) << " TFI = " << (unsigned)(data->TFI);
LOG(INFO) << " TI = " << (unsigned)(data->TI); LOG(INFO) << " TI = " << (unsigned)(data->TI);
// Octet 2 // Octet 2
data->BSN = vector->readField(readIndex, 7); data->BSN = bitvec_read_field(vector, readIndex, 7);
data->E_1 = vector->readField(readIndex, 1); data->E_1 = bitvec_read_field(vector, readIndex, 1);
LOG(INFO) << " BSN = " << (unsigned)(data->BSN); LOG(INFO) << " BSN = " << (unsigned)(data->BSN);
LOG(INFO) << " E_1 = " << (unsigned)(data->E_1); LOG(INFO) << " E_1 = " << (unsigned)(data->E_1);
@ -5334,9 +5334,9 @@ void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t *
unsigned i = 0; unsigned i = 0;
do do
{ {
data->LENGTH_INDICATOR[i] = vector->readField(readIndex, 6); data->LENGTH_INDICATOR[i] = bitvec_read_field(vector, readIndex, 6);
data->M[i] = vector->readField(readIndex, 1); data->M[i] = bitvec_read_field(vector, readIndex, 1);
data->E[i] = vector->readField(readIndex, 1); data->E[i] = bitvec_read_field(vector, readIndex, 1);
LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]); LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]);
LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[i]); LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[i]);
LOG(INFO) << " E[" << i << "] = " << (unsigned)(data->E[i]); LOG(INFO) << " E[" << i << "] = " << (unsigned)(data->E[i]);
@ -5345,12 +5345,12 @@ void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t *
} }
if(data->TI == 1) // TLLI field is present if(data->TI == 1) // TLLI field is present
{ {
data->TLLI = vector->readField(readIndex, 32); data->TLLI = bitvec_read_field(vector, readIndex, 32);
LOG(INFO) << " TLLI = " << data->TLLI; LOG(INFO) << " TLLI = " << data->TLLI;
if (data->PI == 1) // PFI is present if TI field indicates presence of TLLI if (data->PI == 1) // PFI is present if TI field indicates presence of TLLI
{ {
data->PFI = vector->readField(readIndex, 7); data->PFI = bitvec_read_field(vector, readIndex, 7);
data->E_2 = vector->readField(readIndex, 1); data->E_2 = bitvec_read_field(vector, readIndex, 1);
LOG(INFO) << " PFI = " << (unsigned)(data->PFI); LOG(INFO) << " PFI = " << (unsigned)(data->PFI);
LOG(INFO) << " E_2 = " << (unsigned)(data->E_2); LOG(INFO) << " E_2 = " << (unsigned)(data->E_2);
} }
@ -5358,7 +5358,7 @@ void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t *
unsigned dataLen = 23 - readIndex/8; unsigned dataLen = 23 - readIndex/8;
for (unsigned i = 0; i < dataLen; i++) for (unsigned i = 0; i < dataLen; i++)
{ {
data->RLC_DATA[i] = vector->readField(readIndex, 8); data->RLC_DATA[i] = bitvec_read_field(vector, readIndex, 8);
LOG(INFO) << " DATA[" << i << "] = " << (unsigned)(data->RLC_DATA[i]); LOG(INFO) << " DATA[" << i << "] = " << (unsigned)(data->RLC_DATA[i]);
} }
LOG(INFO) << "\n"; LOG(INFO) << "\n";
@ -5370,31 +5370,31 @@ void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t *
} }
} }
void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock_t * data) void encode_gsm_rlcmac_downlink_data(bitvec * vector, RlcMacDownlinkDataBlock_t * data)
{ {
size_t writeIndex = 0; size_t writeIndex = 0;
if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA) if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA)
{ {
// MAC header // MAC header
vector->writeField(writeIndex, data->PAYLOAD_TYPE, 2); bitvec_write_field(vector, writeIndex, data->PAYLOAD_TYPE, 2);
vector->writeField(writeIndex, data->RRBP, 2); bitvec_write_field(vector, writeIndex, data->RRBP, 2);
vector->writeField(writeIndex, data->SP, 1); bitvec_write_field(vector, writeIndex, data->SP, 1);
vector->writeField(writeIndex, data->USF, 3); bitvec_write_field(vector, writeIndex, data->USF, 3);
LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE); LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE);
LOG(INFO) << " RRBP = " << (unsigned)(data->RRBP); LOG(INFO) << " RRBP = " << (unsigned)(data->RRBP);
LOG(INFO) << " SP = " << (unsigned)(data->SP); LOG(INFO) << " SP = " << (unsigned)(data->SP);
LOG(INFO) << " USF = " << (unsigned)(data->USF); LOG(INFO) << " USF = " << (unsigned)(data->USF);
// Octet 1 // Octet 1
vector->writeField(writeIndex, data->PR, 2); bitvec_write_field(vector, writeIndex, data->PR, 2);
vector->writeField(writeIndex, data->TFI, 5); bitvec_write_field(vector, writeIndex, data->TFI, 5);
vector->writeField(writeIndex, data->FBI, 1); bitvec_write_field(vector, writeIndex, data->FBI, 1);
LOG(INFO) << " PR = " << (unsigned)(data->PR); LOG(INFO) << " PR = " << (unsigned)(data->PR);
LOG(INFO) << " TFI = " << (unsigned)(data->TFI); LOG(INFO) << " TFI = " << (unsigned)(data->TFI);
LOG(INFO) << " FBI = " << (unsigned)(data->FBI); LOG(INFO) << " FBI = " << (unsigned)(data->FBI);
// Octet 2 // Octet 2
vector->writeField(writeIndex, data->BSN, 7); bitvec_write_field(vector, writeIndex, data->BSN, 7);
vector->writeField(writeIndex, data->E_1, 1); bitvec_write_field(vector, writeIndex, data->E_1, 1);
LOG(INFO) << " BSN = " << (unsigned)(data->BSN); LOG(INFO) << " BSN = " << (unsigned)(data->BSN);
LOG(INFO) << " E_1 = " << (unsigned)(data->E_1); LOG(INFO) << " E_1 = " << (unsigned)(data->E_1);
// Octet 3 (optional) // Octet 3 (optional)
@ -5403,9 +5403,9 @@ void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock
unsigned i = 0; unsigned i = 0;
do do
{ {
vector->writeField(writeIndex, data->LENGTH_INDICATOR[i], 6); bitvec_write_field(vector, writeIndex, data->LENGTH_INDICATOR[i], 6);
vector->writeField(writeIndex, data->M[i], 1); bitvec_write_field(vector, writeIndex, data->M[i], 1);
vector->writeField(writeIndex, data->E[i], 1); bitvec_write_field(vector, writeIndex, data->E[i], 1);
LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]); LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]);
LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[i]); LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[i]);
LOG(INFO) << " E[" << i << "] = " << (unsigned)(data->E[i]); LOG(INFO) << " E[" << i << "] = " << (unsigned)(data->E[i]);
@ -5416,7 +5416,7 @@ void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock
unsigned dataNumOctets = 23 - writeIndex/8; unsigned dataNumOctets = 23 - writeIndex/8;
for (unsigned i = 0; i < dataNumOctets; i++) for (unsigned i = 0; i < dataNumOctets; i++)
{ {
vector->writeField(writeIndex, data->RLC_DATA[i], 8); bitvec_write_field(vector, writeIndex, data->RLC_DATA[i], 8);
LOG(INFO) << " DATA[" << i << "] = " << (unsigned)(data->RLC_DATA[i]); LOG(INFO) << " DATA[" << i << "] = " << (unsigned)(data->RLC_DATA[i]);
} }
} }

View File

@ -5121,10 +5121,10 @@ typedef struct
} EnhancedMeasurementReport_t; } EnhancedMeasurementReport_t;
void decode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data); void decode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data);
void decode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data); void decode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data);
void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data); void encode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data);
void encode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data); void encode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data);
void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t * data); void decode_gsm_rlcmac_uplink_data(bitvec * vector, RlcMacUplinkDataBlock_t * data);
void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock_t * data); void encode_gsm_rlcmac_downlink_data(bitvec * vector, RlcMacDownlinkDataBlock_t * data);
#endif /* __PACKET_GSM_RLCMAC_H__ */ #endif /* __PACKET_GSM_RLCMAC_H__ */

View File

@ -53,23 +53,22 @@ struct msgb *l1p_msgb_alloc(void)
struct msgb *gen_dummy_msg(void) struct msgb *gen_dummy_msg(void)
{ {
int ofs = 0;
struct msgb *msg = l1p_msgb_alloc(); struct msgb *msg = l1p_msgb_alloc();
GsmL1_Prim_t *prim = msgb_l1prim(msg); GsmL1_Prim_t *prim = msgb_l1prim(msg);
// RLC/MAC filler with USF=1 // RLC/MAC filler with USF=1
BitVector filler("0100000110010100001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011"); bitvec *filler = bitvec_alloc(23);
bitvec_unhex(filler, "41942b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
prim->id = GsmL1_PrimId_PhDataReq; prim->id = GsmL1_PrimId_PhDataReq;
prim->u.phDataReq.sapi = GsmL1_Sapi_Pacch; prim->u.phDataReq.sapi = GsmL1_Sapi_Pacch;
filler.pack((unsigned char*)&(prim->u.phDataReq.msgUnitParam.u8Buffer[ofs])); bitvec_pack(filler, prim->u.phDataReq.msgUnitParam.u8Buffer);
ofs += filler.size() >> 3; prim->u.phDataReq.msgUnitParam.u8Size = filler->data_len;
prim->u.phDataReq.msgUnitParam.u8Size = ofs; bitvec_free(filler);
return msg; return msg;
} }
// Send RLC/MAC block to OpenBTS. // Send RLC/MAC block to OpenBTS.
void pcu_l1if_tx(BitVector * block, GsmL1_Sapi_t sapi, int len) void pcu_l1if_tx(bitvec * block, GsmL1_Sapi_t sapi, int len)
{ {
int ofs = 0;
struct msgb *msg = l1p_msgb_alloc(); struct msgb *msg = l1p_msgb_alloc();
struct osmo_wqueue * queue; struct osmo_wqueue * queue;
queue = &((l1fh->fl1h)->write_q); queue = &((l1fh->fl1h)->write_q);
@ -77,21 +76,19 @@ void pcu_l1if_tx(BitVector * block, GsmL1_Sapi_t sapi, int len)
prim->id = GsmL1_PrimId_PhDataReq; prim->id = GsmL1_PrimId_PhDataReq;
prim->u.phDataReq.sapi = sapi; prim->u.phDataReq.sapi = sapi;
block->pack((unsigned char*)&(prim->u.phDataReq.msgUnitParam.u8Buffer[ofs])); bitvec_pack(block, prim->u.phDataReq.msgUnitParam.u8Buffer);
ofs += block->size() >> 3;
prim->u.phDataReq.msgUnitParam.u8Size = len; prim->u.phDataReq.msgUnitParam.u8Size = len;
//COUT("Add Block to WRITE QUEUE: " << *block);
COUT("Add Block to WRITE QUEUE: " << *block);
osmo_wqueue_enqueue(queue, msg); osmo_wqueue_enqueue(queue, msg);
} }
int pcu_l1if_rx_pdch(GsmL1_PhDataInd_t *data_ind) int pcu_l1if_rx_pdch(GsmL1_PhDataInd_t *data_ind)
{ {
BitVector *block = new BitVector(23*8); bitvec *block = bitvec_alloc(data_ind->msgUnitParam.u8Size);
block->unpack((const unsigned char*)data_ind->msgUnitParam.u8Buffer); bitvec_unpack(block, data_ind->msgUnitParam.u8Buffer);
COUT("RX: " << *block); //COUT("RX: " << *block);
gprs_rlcmac_rcv_block(block); gprs_rlcmac_rcv_block(block);
bitvec_free(block);
} }
static int handle_ph_connect_ind(struct femtol1_hdl *fl1, GsmL1_PhConnectInd_t *connect_ind) static int handle_ph_connect_ind(struct femtol1_hdl *fl1, GsmL1_PhConnectInd_t *connect_ind)

View File

@ -21,7 +21,7 @@
#define PCU_L1_IF_H #define PCU_L1_IF_H
#include <BitVector.h> #include <bitvector.h>
#include <gsmL1prim.h> #include <gsmL1prim.h>
#include <sys/socket.h> #include <sys/socket.h>
extern "C" { extern "C" {
@ -70,7 +70,7 @@ extern struct l1fwd_hdl *l1fh;
int get_current_fn(); int get_current_fn();
void pcu_l1if_tx(BitVector * block, GsmL1_Sapi_t sapi, int len = 23); void pcu_l1if_tx(bitvec * block, GsmL1_Sapi_t sapi, int len = 23);
int pcu_l1if_handle_l1prim(struct femtol1_hdl *fl1h, struct msgb *msg); int pcu_l1if_handle_l1prim(struct femtol1_hdl *fl1h, struct msgb *msg);